From 192408591a018bd5cd90a20f76a273106b73192a Mon Sep 17 00:00:00 2001 From: Dominic Cocchiarella Date: Mon, 20 Apr 2026 21:37:04 -0700 Subject: [PATCH] prepare v2.2.0 release --- .../OperationsWorkbench/LIBRARY_FRICTION.md | 19 + Examples/OperationsWorkbench/README.md | 38 + Examples/OperationsWorkbench/index.html | 558 ++++ .../operationsWorkbenchApp.ts | 2343 +++++++++++++++++ Examples/index.html | 175 ++ Ity.ts | 807 +++++- MIGRATION.md | 84 +- README.md | 143 +- dist/ity.cjs.js | 723 ++++- dist/ity.cjs.js.map | 2 +- dist/ity.d.ts | 79 +- dist/ity.esm.js | 723 ++++- dist/ity.esm.js.map | 2 +- dist/ity.esm.mjs | 723 ++++- dist/ity.esm.mjs.map | 2 +- dist/ity.js | 723 ++++- dist/ity.js.map | 2 +- dist/ity.min.js | 2 +- dist/ity.min.js.map | 2 +- package-lock.json | 4 +- package.json | 8 +- scripts/examples-server.mjs | 58 + test/helpers.ts | 9 +- test/nodeEnvironment.test.ts | 2 +- test/operationsWorkbenchExample.test.ts | 256 ++ test/v2Async.test.ts | 240 ++ test/v2Component.test.ts | 26 + test/v2Dom.test.ts | 39 + test/v2Router.test.ts | 40 +- .../operationsWorkbenchApp.d.ts | 0 types/Ity.d.ts | 79 +- types/test/helpers.d.ts | 2 +- .../test/operationsWorkbenchExample.test.d.ts | 1 + 33 files changed, 7505 insertions(+), 409 deletions(-) create mode 100644 Examples/OperationsWorkbench/LIBRARY_FRICTION.md create mode 100644 Examples/OperationsWorkbench/README.md create mode 100644 Examples/OperationsWorkbench/index.html create mode 100644 Examples/OperationsWorkbench/operationsWorkbenchApp.ts create mode 100644 Examples/index.html create mode 100644 scripts/examples-server.mjs create mode 100644 test/operationsWorkbenchExample.test.ts create mode 100644 types/Examples/OperationsWorkbench/operationsWorkbenchApp.d.ts create mode 100644 types/test/operationsWorkbenchExample.test.d.ts diff --git a/Examples/OperationsWorkbench/LIBRARY_FRICTION.md b/Examples/OperationsWorkbench/LIBRARY_FRICTION.md new file mode 100644 index 0000000..0b1a7c5 --- /dev/null +++ b/Examples/OperationsWorkbench/LIBRARY_FRICTION.md @@ -0,0 +1,19 @@ +# Operations Workbench Library Friction + +This started as a running build log of rough edges that showed up while creating the deep V2 example. The original list below has now been addressed in Ity 2.2.0, and the notes are retained as a release checklist plus a record of what changed. + +## Fixed In 2.2.0 + +* Browser examples now have a first-class runner via `npm run examples:serve`, plus an [Examples/index.html](../index.html) launcher. +* Router base-path authoring no longer needs manual `href` joining. `router.href(path)` and `router.link(path)` cover that directly. +* Sanitization policy no longer has to be process-global. `createConfig()` enables per-app and per-render HTML policy. +* Complex forms no longer have to be entirely application code. `formState()` now covers field binding, normalization, dirty/touched state, validation, reset, and validated submits. +* Components now accept structured props through `props` and `ctx.prop(name)`. +* Shadow DOM links can use `router.link(path)` directly instead of relying on document-level interception alone. +* Direct DOM event wiring no longer needs manual promise swallowing in app code. `action.run()`, `action.with()`, `action.from()`, and `form.handleSubmit()` cover that case. +* Form submits now synchronize current control values before validation, which closed the last major drift case exposed by the workbench. + +## Residual Notes + +* Large screens still rely on application discipline around state partitioning and render ownership. The single top-level `render()` approach works, but Ity does not try to add keyed reconciliation or component-local diffing. +* Rich form workflows are much better with `formState()`, but schema-driven forms, async field validation, and nested field-array helpers are still intentionally out of scope for the core. diff --git a/Examples/OperationsWorkbench/README.md b/Examples/OperationsWorkbench/README.md new file mode 100644 index 0000000..920ae38 --- /dev/null +++ b/Examples/OperationsWorkbench/README.md @@ -0,0 +1,38 @@ +# Operations Workbench + +`Operations Workbench` is a full local-first Ity 2.2 example. It is intentionally larger than the other demos and exercises the V2 surface as an integrated application instead of isolated snippets. + +## What It Shows + +* `resource()` for cancellable async workspace loading from local storage. +* `action()` for task status changes, checklist toggles, deletes, and resets. +* `formState()` for task, note, settings, and import flows. +* `store()` for view state and persisted UI preferences. +* `Router` base-path handling plus `router.link()` across dashboard, task, notes, reports, and settings pages. +* `component()` props for reusable metric, task-card, and relative-time custom elements. +* `unsafeHTML()` plus `createConfig({ sanitizeHTML })` for bulletin and report preview rendering. +* `renderToString()` for a shareable status report view. + +## Run It Locally + +1. Install dependencies: `npm install` +2. Start the example server: `npm run examples:serve` +3. Open [../index.html](../index.html) or [index.html](./index.html) + +The app persists its workspace to `localStorage` under `ity-operations-workbench`. Use the Settings page to reset or import data. + +## Test It + +Run the example coverage with the normal test suite: + +```bash +npm test -- --runInBand +``` + +The dedicated example test file is [../../test/operationsWorkbenchExample.test.ts](../../test/operationsWorkbenchExample.test.ts). + +## Files + +* App source: [operationsWorkbenchApp.ts](./operationsWorkbenchApp.ts) +* Local runner: [index.html](./index.html) +* Library friction notes: [LIBRARY_FRICTION.md](./LIBRARY_FRICTION.md) diff --git a/Examples/OperationsWorkbench/index.html b/Examples/OperationsWorkbench/index.html new file mode 100644 index 0000000..96f43cc --- /dev/null +++ b/Examples/OperationsWorkbench/index.html @@ -0,0 +1,558 @@ + + + + + + Ity Example: Operations Workbench + + + +
+ + + + + + diff --git a/Examples/OperationsWorkbench/operationsWorkbenchApp.ts b/Examples/OperationsWorkbench/operationsWorkbenchApp.ts new file mode 100644 index 0000000..f5866df --- /dev/null +++ b/Examples/OperationsWorkbench/operationsWorkbenchApp.ts @@ -0,0 +1,2343 @@ +(function () { + type TaskStatus = 'planned' | 'active' | 'blocked' | 'done'; + type TaskPriority = 'low' | 'medium' | 'high' | 'critical'; + type NoticeTone = 'info' | 'success' | 'error'; + type AccentName = 'sunrise' | 'ocean' | 'fern'; + + interface StorageLike { + getItem(key: string): string | null; + setItem(key: string, value: string): void; + removeItem(key: string): void; + } + + interface Person { + id: string; + name: string; + role: string; + initials: string; + } + + interface ChecklistItem { + id: string; + label: string; + done: boolean; + } + + interface Task { + id: string; + title: string; + description: string; + status: TaskStatus; + priority: TaskPriority; + ownerId: string; + dueDate: string; + tags: string[]; + checklist: ChecklistItem[]; + createdAt: string; + updatedAt: string; + lastStatusAt: string; + } + + interface Note { + id: string; + title: string; + body: string; + relatedTaskIds: string[]; + createdAt: string; + updatedAt: string; + } + + interface ActivityEntry { + id: string; + kind: string; + message: string; + createdAt: string; + } + + interface WorkspaceMeta { + name: string; + version: number; + bulletinHtml: string; + updatedAt: string; + } + + interface WorkspaceSettings { + defaultOwnerId: string; + accent: AccentName; + reportTitle: string; + } + + interface WorkspaceData { + meta: WorkspaceMeta; + people: Person[]; + tasks: Task[]; + notes: Note[]; + activity: ActivityEntry[]; + settings: WorkspaceSettings; + } + + interface UIPreferences { + taskQuery: string; + statusFilter: string; + ownerFilter: string; + includeDone: boolean; + noteQuery: string; + } + + interface CreateAppOptions { + target?: string | Element; + base?: string; + storageKey?: string; + storage?: StorageLike; + initialData?: WorkspaceData; + latencyMs?: number; + time?: () => number; + sanitizer?: (value: string) => string; + } + + interface TaskFormInput { + id?: string; + title: string; + description: string; + ownerId: string; + priority: TaskPriority; + dueDate: string; + tags: string[]; + checklistText: string; + } + + interface NoteFormInput { + id?: string; + title: string; + body: string; + relatedTaskIds: string[]; + } + + interface SettingsInput { + name: string; + defaultOwnerId: string; + accent: AccentName; + reportTitle: string; + bulletinHtml: string; + } + + interface TaskDraft { + taskId: string; + title: string; + description: string; + ownerId: string; + priority: TaskPriority; + dueDate: string; + tags: string; + checklistText: string; + } + + interface NoteDraft { + noteId: string; + title: string; + body: string; + relatedTaskIds: string[]; + } + + interface SettingsDraft { + name: string; + defaultOwnerId: string; + accent: AccentName; + reportTitle: string; + bulletinHtml: string; + } + + interface MutationResult { + workspace: WorkspaceData; + notice: string; + navigateTo?: string; + } + + interface Repository { + loadWorkspace(signal?: AbortSignal): Promise; + saveTask(input: TaskFormInput): Promise; + cycleTaskStatus(taskId: string): Promise; + toggleChecklist(taskId: string, itemId: string): Promise; + deleteTask(taskId: string): Promise; + saveNote(input: NoteFormInput): Promise; + deleteNote(noteId: string): Promise; + saveSettings(input: SettingsInput): Promise; + importWorkspace(source: string): Promise; + resetWorkspace(): Promise; + readExport(): string; + } + + interface OperationsWorkbenchApp { + workspace: any; + ui: any; + router: any; + actions: Record; + repository: Repository; + dispose(): void; + } + + const TASK_STATUS_ORDER: TaskStatus[] = ['planned', 'active', 'blocked', 'done']; + const PRIORITY_ORDER: Record = { + critical: 0, + high: 1, + medium: 2, + low: 3 + }; + const ACCENTS: AccentName[] = ['sunrise', 'ocean', 'fern']; + const EMPTY_PREFERENCES: UIPreferences = { + taskQuery: '', + statusFilter: 'all', + ownerFilter: 'all', + includeDone: true, + noteQuery: '' + }; + const WORKBENCH_COMPONENTS_KEY = '__ITY_WORKBENCH_COMPONENTS__'; + + const browserWindow = (globalThis as any).window; + + function getNow(time?: () => number): number { + return typeof time === 'function' ? time() : Date.now(); + } + + function toIso(time?: () => number): string { + return new Date(getNow(time)).toISOString(); + } + + function addDays(days: number, time?: () => number): string { + const date = new Date(getNow(time)); + date.setHours(12, 0, 0, 0); + date.setDate(date.getDate() + days); + return date.toISOString().slice(0, 10); + } + + function clampText(value: unknown, fallback = ''): string { + const text = typeof value === 'string' ? value.trim() : ''; + return text || fallback; + } + + function isPlainObject(value: unknown): value is Record { + return !!value && typeof value === 'object' && !Array.isArray(value); + } + + function isValidDateOnly(value: string): boolean { + return /^\d{4}-\d{2}-\d{2}$/.test(value) && !Number.isNaN(new Date(`${value}T12:00:00Z`).getTime()); + } + + function isValidIso(value: string): boolean { + return !Number.isNaN(new Date(value).getTime()); + } + + function normalizeId(value: unknown, fallback: string): string { + const text = clampText(value, fallback) + .toLowerCase() + .replace(/[^a-z0-9-]+/g, '-') + .replace(/^-+|-+$/g, ''); + return text || fallback; + } + + function createId(prefix: string, time?: () => number): string { + const random = Math.random().toString(36).slice(2, 8); + return `${prefix}-${getNow(time).toString(36)}-${random}`; + } + + function splitLines(value: string): string[] { + return value + .split(/\r?\n/) + .map((line) => line.trim()) + .filter(Boolean); + } + + function parseTags(value: string): string[] { + return Array.from(new Set( + value + .split(',') + .map((tag) => tag.trim()) + .filter(Boolean) + )); + } + + function csv(value: string[] | undefined): string { + return (value || []).join(', '); + } + + function escapeHTML(value: string): string { + return value + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); + } + + function relativeTimeLabel(value: string, now: number): string { + if (!isValidDateOnly(value) && !isValidIso(value)) return 'no date'; + const target = isValidDateOnly(value) + ? new Date(`${value}T12:00:00Z`).getTime() + : new Date(value).getTime(); + const deltaDays = Math.round((target - now) / 86400000); + const formatterCtor = (globalThis as any).Intl?.RelativeTimeFormat; + if (formatterCtor) { + const formatter = new formatterCtor('en', { numeric: 'auto' }); + return formatter.format(deltaDays, 'day'); + } + if (deltaDays === 0) return 'today'; + if (deltaDays > 0) return `in ${deltaDays} day${deltaDays === 1 ? '' : 's'}`; + const distance = Math.abs(deltaDays); + return `${distance} day${distance === 1 ? '' : 's'} ago`; + } + + function formatLongDate(value: string): string { + if (!isValidDateOnly(value) && !isValidIso(value)) return 'Unknown date'; + const date = isValidDateOnly(value) ? new Date(`${value}T12:00:00Z`) : new Date(value); + return new Intl.DateTimeFormat('en', { + month: 'short', + day: 'numeric', + year: 'numeric' + }).format(date); + } + + function formatDateTime(value: string): string { + if (!isValidIso(value)) return 'Unknown time'; + return new Intl.DateTimeFormat('en', { + month: 'short', + day: 'numeric', + hour: 'numeric', + minute: '2-digit' + }).format(new Date(value)); + } + + function taskStatusLabel(status: TaskStatus): string { + return ({ + planned: 'Planned', + active: 'Active', + blocked: 'Blocked', + done: 'Done' + } as Record)[status]; + } + + function priorityLabel(priority: TaskPriority): string { + return ({ + critical: 'Critical', + high: 'High', + medium: 'Medium', + low: 'Low' + } as Record)[priority]; + } + + function taskProgress(task: Task): string { + if (!task.checklist.length) return 'No checklist'; + const complete = task.checklist.filter((item) => item.done).length; + return `${complete}/${task.checklist.length} complete`; + } + + function safeArray(value: unknown): T[] { + return Array.isArray(value) ? value as T[] : []; + } + + function cloneWorkspace(value: T): T { + return JSON.parse(JSON.stringify(value)); + } + + function sortTasks(tasks: Task[]): Task[] { + return tasks.slice().sort((left, right) => { + const priorityDelta = PRIORITY_ORDER[left.priority] - PRIORITY_ORDER[right.priority]; + if (priorityDelta !== 0) return priorityDelta; + if (left.status !== right.status) return TASK_STATUS_ORDER.indexOf(left.status) - TASK_STATUS_ORDER.indexOf(right.status); + if (left.dueDate !== right.dueDate) return left.dueDate.localeCompare(right.dueDate); + return right.updatedAt.localeCompare(left.updatedAt); + }); + } + + function sortNotes(notes: Note[]): Note[] { + return notes.slice().sort((left, right) => right.updatedAt.localeCompare(left.updatedAt)); + } + + function trimActivity(activity: ActivityEntry[]): ActivityEntry[] { + return activity.slice(0, 18); + } + + function createMemoryStorage(): StorageLike { + const cache: Record = {}; + return { + getItem(key: string): string | null { + return Object.prototype.hasOwnProperty.call(cache, key) ? cache[key] : null; + }, + setItem(key: string, value: string): void { + cache[key] = String(value); + }, + removeItem(key: string): void { + delete cache[key]; + } + }; + } + + function resolveStorage(candidate?: StorageLike): StorageLike { + if (candidate) return candidate; + try { + const storage = browserWindow?.localStorage; + if (storage) { + const probe = '__ity-workbench-probe__'; + storage.setItem(probe, '1'); + storage.removeItem(probe); + return storage; + } + } catch (_error) { + // Fall through to in-memory storage for restricted environments. + } + return createMemoryStorage(); + } + + function defaultWorkspace(time?: () => number): WorkspaceData { + const updatedAt = toIso(time); + return { + meta: { + name: 'Northstar Launch Control', + version: 1, + bulletinHtml: '

Launch window: Customer beta opens Thursday. Review the blocker queue before 3 PM and post a short decision log to notes.

Tip: Use the reports view before a stakeholder review so the export is already structured.

', + updatedAt + }, + people: [ + { id: 'ava', name: 'Ava Reynolds', role: 'Release Manager', initials: 'AR' }, + { id: 'milo', name: 'Milo Chen', role: 'Platform Lead', initials: 'MC' }, + { id: 'nina', name: 'Nina Patel', role: 'QA Lead', initials: 'NP' }, + { id: 'joel', name: 'Joel Kim', role: 'Support Ops', initials: 'JK' } + ], + tasks: sortTasks([ + { + id: 'task-flags', + title: 'Roll out feature flags to the beta cohort', + description: 'Stage the release, verify defaults by region, and confirm every gate can be disabled without a redeploy.', + status: 'active', + priority: 'critical', + ownerId: 'ava', + dueDate: addDays(1, time), + tags: ['release', 'feature-flags', 'beta'], + checklist: [ + { id: 'flags-audit', label: 'Audit current flag defaults', done: true }, + { id: 'flags-regions', label: 'Verify region overrides', done: false }, + { id: 'flags-fallback', label: 'Run rollback drill', done: false } + ], + createdAt: updatedAt, + updatedAt, + lastStatusAt: updatedAt + }, + { + id: 'task-qc', + title: 'Close the last QA signoff gaps', + description: 'Validate keyboard navigation, dark data fixtures, and the mobile attachment upload path.', + status: 'blocked', + priority: 'high', + ownerId: 'nina', + dueDate: addDays(2, time), + tags: ['qa', 'accessibility'], + checklist: [ + { id: 'qc-nav', label: 'Keyboard pass', done: true }, + { id: 'qc-mobile', label: 'Mobile upload pass', done: false } + ], + createdAt: updatedAt, + updatedAt, + lastStatusAt: updatedAt + }, + { + id: 'task-briefing', + title: 'Prepare the customer launch briefing', + description: 'Summarize scope, risks, open questions, and support-call staffing for launch day.', + status: 'planned', + priority: 'medium', + ownerId: 'joel', + dueDate: addDays(3, time), + tags: ['comms', 'support'], + checklist: [ + { id: 'briefing-outline', label: 'Draft agenda', done: true }, + { id: 'briefing-qna', label: 'Collect Q&A answers', done: false } + ], + createdAt: updatedAt, + updatedAt, + lastStatusAt: updatedAt + }, + { + id: 'task-metrics', + title: 'Snapshot baseline adoption metrics', + description: 'Capture current conversion, activation, and churn baseline numbers before enabling the beta cohort.', + status: 'done', + priority: 'low', + ownerId: 'milo', + dueDate: addDays(-1, time), + tags: ['analytics'], + checklist: [ + { id: 'metrics-export', label: 'Export dashboard baseline', done: true } + ], + createdAt: updatedAt, + updatedAt, + lastStatusAt: updatedAt + } + ]), + notes: sortNotes([ + { + id: 'note-standup', + title: 'Morning standup takeaways', + body: 'QA still needs one mobile pass. Support wants a rollback note in the customer-facing runbook. No launch-date change yet.', + relatedTaskIds: ['task-qc', 'task-briefing'], + createdAt: updatedAt, + updatedAt + }, + { + id: 'note-risk', + title: 'Risk register summary', + body: 'The primary risk is incomplete flag coverage for older accounts. Secondary risk is delayed customer comms if the support schedule shifts again.', + relatedTaskIds: ['task-flags'], + createdAt: updatedAt, + updatedAt + } + ]), + activity: trimActivity([ + { id: 'activity-1', kind: 'seed', message: 'Loaded the default launch workspace.', createdAt: updatedAt }, + { id: 'activity-2', kind: 'seed', message: 'Feature-flag rollout is already in progress.', createdAt: updatedAt } + ]), + settings: { + defaultOwnerId: 'ava', + accent: 'sunrise', + reportTitle: 'Northstar Beta Release Report' + } + }; + } + + function sanitizeHTML(value: string): string { + const doc = browserWindow?.document; + if (!doc) return String(value).replace(/[\s\S]*?<\/script>/gi, ''); + const template = doc.createElement('template'); + template.innerHTML = String(value); + const blocked = template.content.querySelectorAll('script, style, iframe, object, embed, link, meta'); + blocked.forEach((node: Element) => node.remove()); + template.content.querySelectorAll('*').forEach((node: Element) => { + Array.from(node.attributes).forEach((attribute: Attr) => { + const name = attribute.name.toLowerCase(); + const rawValue = attribute.value.trim(); + if (name.startsWith('on')) { + node.removeAttribute(attribute.name); + return; + } + if ((name === 'href' || name === 'src') && /^javascript:/i.test(rawValue)) { + node.removeAttribute(attribute.name); + return; + } + if (name === 'style') { + node.removeAttribute(attribute.name); + } + }); + }); + return template.innerHTML; + } + + function normalizePerson(value: unknown, fallbackId: string): Person | null { + if (!isPlainObject(value)) return null; + const name = clampText(value.name); + if (!name) return null; + const id = normalizeId(value.id, fallbackId); + const initials = clampText(value.initials, name.split(/\s+/).slice(0, 2).map((part) => part[0]).join('').toUpperCase()); + return { + id, + name, + role: clampText(value.role, 'Operator'), + initials + }; + } + + function normalizeChecklist(value: unknown, time?: () => number): ChecklistItem[] { + return safeArray>(value) + .map((item, index) => { + if (!isPlainObject(item)) return null; + const label = clampText(item.label); + if (!label) return null; + return { + id: normalizeId(item.id, `checklist-${index}-${createId('item', time)}`), + label, + done: Boolean(item.done) + }; + }) + .filter(Boolean) as ChecklistItem[]; + } + + function normalizeTask( + value: unknown, + defaultOwnerId: string, + ownerIds: Set, + time?: () => number + ): Task | null { + if (!isPlainObject(value)) return null; + const title = clampText(value.title); + if (!title) return null; + const createdAt = isValidIso(clampText(value.createdAt)) ? clampText(value.createdAt) : toIso(time); + const updatedAt = isValidIso(clampText(value.updatedAt)) ? clampText(value.updatedAt) : createdAt; + const lastStatusAt = isValidIso(clampText(value.lastStatusAt)) ? clampText(value.lastStatusAt) : updatedAt; + const ownerId = normalizeId(value.ownerId, defaultOwnerId); + const status = TASK_STATUS_ORDER.includes(value.status as TaskStatus) ? value.status as TaskStatus : 'planned'; + const priority = Object.prototype.hasOwnProperty.call(PRIORITY_ORDER, value.priority as TaskPriority) + ? value.priority as TaskPriority + : 'medium'; + const dueDate = isValidDateOnly(clampText(value.dueDate)) ? clampText(value.dueDate) : addDays(2, time); + return { + id: normalizeId(value.id, createId('task', time)), + title, + description: clampText(value.description, 'No description yet.'), + status, + priority, + ownerId: ownerIds.has(ownerId) ? ownerId : defaultOwnerId, + dueDate, + tags: safeArray(value.tags).map((tag) => clampText(tag)).filter(Boolean), + checklist: normalizeChecklist(value.checklist, time), + createdAt, + updatedAt, + lastStatusAt + }; + } + + function normalizeNote(value: unknown, taskIds: Set, time?: () => number): Note | null { + if (!isPlainObject(value)) return null; + const title = clampText(value.title); + const body = clampText(value.body); + if (!title || !body) return null; + const createdAt = isValidIso(clampText(value.createdAt)) ? clampText(value.createdAt) : toIso(time); + const updatedAt = isValidIso(clampText(value.updatedAt)) ? clampText(value.updatedAt) : createdAt; + return { + id: normalizeId(value.id, createId('note', time)), + title, + body, + relatedTaskIds: safeArray(value.relatedTaskIds) + .map((taskId) => normalizeId(taskId, '')) + .filter((taskId) => taskIds.has(taskId)), + createdAt, + updatedAt + }; + } + + function normalizeActivity(value: unknown, time?: () => number): ActivityEntry | null { + if (!isPlainObject(value)) return null; + const message = clampText(value.message); + if (!message) return null; + return { + id: normalizeId(value.id, createId('activity', time)), + kind: clampText(value.kind, 'event'), + message, + createdAt: isValidIso(clampText(value.createdAt)) ? clampText(value.createdAt) : toIso(time) + }; + } + + function normalizeSettings(value: unknown, people: Person[], time?: () => number): WorkspaceSettings { + const defaultOwnerId = people[0]?.id || 'owner'; + if (!isPlainObject(value)) { + return { + defaultOwnerId, + accent: 'sunrise', + reportTitle: 'Operations report' + }; + } + const ownerCandidate = normalizeId(value.defaultOwnerId, defaultOwnerId); + const accentCandidate = clampText(value.accent, 'sunrise') as AccentName; + const accent = ACCENTS.includes(accentCandidate) ? accentCandidate : 'sunrise'; + return { + defaultOwnerId: people.some((person) => person.id === ownerCandidate) ? ownerCandidate : defaultOwnerId, + accent, + reportTitle: clampText(value.reportTitle, 'Operations report') + }; + } + + function normalizeMeta(value: unknown, time?: () => number): WorkspaceMeta { + if (!isPlainObject(value)) { + return { + name: 'Operations Workbench', + version: 1, + bulletinHtml: '', + updatedAt: toIso(time) + }; + } + return { + name: clampText(value.name, 'Operations Workbench'), + version: typeof value.version === 'number' && Number.isFinite(value.version) ? Math.max(1, Math.floor(value.version)) : 1, + bulletinHtml: typeof value.bulletinHtml === 'string' ? value.bulletinHtml : '', + updatedAt: isValidIso(clampText(value.updatedAt)) ? clampText(value.updatedAt) : toIso(time) + }; + } + + function normalizeWorkspace(value: unknown, time?: () => number): WorkspaceData { + const fallback = defaultWorkspace(time); + if (!isPlainObject(value)) return fallback; + + const people = safeArray>(value.people) + .map((person, index) => normalizePerson(person, `person-${index + 1}`)) + .filter(Boolean) as Person[]; + const safePeople = people.length ? people : fallback.people; + const settings = normalizeSettings(value.settings, safePeople, time); + const ownerIds = new Set(safePeople.map((person) => person.id)); + + const tasks = safeArray>(value.tasks) + .map((task) => normalizeTask(task, settings.defaultOwnerId, ownerIds, time)) + .filter(Boolean) as Task[]; + const safeTasks = tasks.length ? sortTasks(tasks) : fallback.tasks; + const taskIds = new Set(safeTasks.map((task) => task.id)); + + const notes = safeArray>(value.notes) + .map((note) => normalizeNote(note, taskIds, time)) + .filter(Boolean) as Note[]; + const activity = safeArray>(value.activity) + .map((entry) => normalizeActivity(entry, time)) + .filter(Boolean) as ActivityEntry[]; + + return { + meta: normalizeMeta(value.meta, time), + people: safePeople, + tasks: safeTasks, + notes: notes.length ? sortNotes(notes) : fallback.notes, + activity: activity.length ? trimActivity(activity.sort((left, right) => right.createdAt.localeCompare(left.createdAt))) : fallback.activity, + settings + }; + } + + function parseChecklistText(value: string, previous: ChecklistItem[], time?: () => number): ChecklistItem[] { + const previousByKey = new Map(); + previous.forEach((item) => { + previousByKey.set(item.label.trim().toLowerCase(), item); + }); + return splitLines(value).map((line) => { + const existing = previousByKey.get(line.toLowerCase()); + return existing + ? { ...existing, label: line } + : { id: createId('check', time), label: line, done: false }; + }); + } + + function pushActivity(workspace: WorkspaceData, kind: string, message: string, time?: () => number): void { + workspace.activity = trimActivity([ + { + id: createId('activity', time), + kind, + message, + createdAt: toIso(time) + }, + ...workspace.activity + ]); + workspace.meta.updatedAt = toIso(time); + } + + function withDelay(ms: number, signal?: AbortSignal): Promise { + const duration = Math.max(0, ms); + return new Promise((resolve, reject) => { + if (signal?.aborted) { + reject(signal.reason || new Error('Aborted')); + return; + } + const timer = setTimeout(() => { + signal?.removeEventListener('abort', onAbort); + resolve(); + }, duration); + const onAbort = (): void => { + clearTimeout(timer); + signal?.removeEventListener('abort', onAbort); + reject(signal?.reason || new Error('Aborted')); + }; + signal?.addEventListener('abort', onAbort, { once: true }); + }); + } + + function createRepository(options: { + storage: StorageLike; + storageKey: string; + seed?: WorkspaceData; + latencyMs: number; + time?: () => number; + }): Repository { + const { storage, storageKey, latencyMs } = options; + const time = options.time; + + const readWorkspace = (): WorkspaceData => { + const raw = storage.getItem(storageKey); + if (!raw) { + const initial = normalizeWorkspace(options.seed || defaultWorkspace(time), time); + storage.setItem(storageKey, JSON.stringify(initial, null, 2)); + return cloneWorkspace(initial); + } + try { + return normalizeWorkspace(JSON.parse(raw), time); + } catch (_error) { + throw new Error('Stored workspace data is invalid. Reset the example data from Settings to recover.'); + } + }; + + const writeWorkspace = (workspace: WorkspaceData): WorkspaceData => { + const next = normalizeWorkspace(workspace, time); + storage.setItem(storageKey, JSON.stringify(next, null, 2)); + return cloneWorkspace(next); + }; + + const requireTask = (workspace: WorkspaceData, taskId: string): Task => { + const task = workspace.tasks.find((item) => item.id === taskId); + if (!task) throw new Error('That task no longer exists.'); + return task; + }; + + const requireNote = (workspace: WorkspaceData, noteId: string): Note => { + const note = workspace.notes.find((item) => item.id === noteId); + if (!note) throw new Error('That note no longer exists.'); + return note; + }; + + return { + async loadWorkspace(signal?: AbortSignal): Promise { + await withDelay(latencyMs, signal); + return cloneWorkspace(readWorkspace()); + }, + + async saveTask(input: TaskFormInput): Promise { + await withDelay(latencyMs); + const workspace = readWorkspace(); + const title = clampText(input.title); + if (!title) throw new Error('Task title is required.'); + if (!workspace.people.some((person) => person.id === input.ownerId)) { + throw new Error('Select a valid task owner.'); + } + if (!isValidDateOnly(input.dueDate)) { + throw new Error('Enter a valid due date.'); + } + + const index = input.id ? workspace.tasks.findIndex((task) => task.id === input.id) : -1; + const previous = index >= 0 ? workspace.tasks[index] : undefined; + const now = toIso(time); + const nextTask: Task = { + id: previous?.id || createId('task', time), + title, + description: clampText(input.description, 'No description yet.'), + status: previous?.status || 'planned', + priority: Object.prototype.hasOwnProperty.call(PRIORITY_ORDER, input.priority) ? input.priority : 'medium', + ownerId: input.ownerId, + dueDate: input.dueDate, + tags: input.tags, + checklist: parseChecklistText(input.checklistText, previous?.checklist || [], time), + createdAt: previous?.createdAt || now, + updatedAt: now, + lastStatusAt: previous?.lastStatusAt || now + }; + + if (previous) { + workspace.tasks.splice(index, 1, nextTask); + pushActivity(workspace, 'task-update', `Updated task: ${nextTask.title}`, time); + } else { + workspace.tasks.unshift(nextTask); + pushActivity(workspace, 'task-create', `Created task: ${nextTask.title}`, time); + } + + workspace.tasks = sortTasks(workspace.tasks); + const next = writeWorkspace(workspace); + return { + workspace: next, + notice: previous ? 'Task updated.' : 'Task created.', + navigateTo: `/tasks/${nextTask.id}` + }; + }, + + async cycleTaskStatus(taskId: string): Promise { + await withDelay(latencyMs); + const workspace = readWorkspace(); + const task = requireTask(workspace, taskId); + const currentIndex = TASK_STATUS_ORDER.indexOf(task.status); + task.status = TASK_STATUS_ORDER[(currentIndex + 1) % TASK_STATUS_ORDER.length]; + task.updatedAt = toIso(time); + task.lastStatusAt = task.updatedAt; + workspace.tasks = sortTasks(workspace.tasks); + pushActivity(workspace, 'task-status', `${task.title} moved to ${taskStatusLabel(task.status)}.`, time); + return { + workspace: writeWorkspace(workspace), + notice: `Task moved to ${taskStatusLabel(task.status)}.` + }; + }, + + async toggleChecklist(taskId: string, itemId: string): Promise { + await withDelay(latencyMs); + const workspace = readWorkspace(); + const task = requireTask(workspace, taskId); + const item = task.checklist.find((entry) => entry.id === itemId); + if (!item) throw new Error('That checklist item no longer exists.'); + item.done = !item.done; + task.updatedAt = toIso(time); + pushActivity(workspace, 'task-checklist', `${task.title}: ${item.done ? 'completed' : 're-opened'} "${item.label}".`, time); + return { + workspace: writeWorkspace(workspace), + notice: item.done ? 'Checklist item completed.' : 'Checklist item reopened.' + }; + }, + + async deleteTask(taskId: string): Promise { + await withDelay(latencyMs); + const workspace = readWorkspace(); + const task = requireTask(workspace, taskId); + workspace.tasks = workspace.tasks.filter((item) => item.id !== taskId); + workspace.notes = workspace.notes.map((note) => ({ + ...note, + relatedTaskIds: note.relatedTaskIds.filter((id) => id !== taskId) + })); + pushActivity(workspace, 'task-delete', `Deleted task: ${task.title}`, time); + return { + workspace: writeWorkspace(workspace), + notice: 'Task deleted.', + navigateTo: '/tasks' + }; + }, + + async saveNote(input: NoteFormInput): Promise { + await withDelay(latencyMs); + const workspace = readWorkspace(); + const title = clampText(input.title); + const body = clampText(input.body); + if (!title) throw new Error('Note title is required.'); + if (!body) throw new Error('Note body is required.'); + const validTaskIds = new Set(workspace.tasks.map((task) => task.id)); + const relatedTaskIds = input.relatedTaskIds.filter((taskId) => validTaskIds.has(taskId)); + const index = input.id ? workspace.notes.findIndex((note) => note.id === input.id) : -1; + const previous = index >= 0 ? workspace.notes[index] : undefined; + const now = toIso(time); + const nextNote: Note = { + id: previous?.id || createId('note', time), + title, + body, + relatedTaskIds, + createdAt: previous?.createdAt || now, + updatedAt: now + }; + if (previous) { + workspace.notes.splice(index, 1, nextNote); + pushActivity(workspace, 'note-update', `Updated note: ${nextNote.title}`, time); + } else { + workspace.notes.unshift(nextNote); + pushActivity(workspace, 'note-create', `Created note: ${nextNote.title}`, time); + } + workspace.notes = sortNotes(workspace.notes); + return { + workspace: writeWorkspace(workspace), + notice: previous ? 'Note updated.' : 'Note created.' + }; + }, + + async deleteNote(noteId: string): Promise { + await withDelay(latencyMs); + const workspace = readWorkspace(); + const note = requireNote(workspace, noteId); + workspace.notes = workspace.notes.filter((item) => item.id !== noteId); + pushActivity(workspace, 'note-delete', `Deleted note: ${note.title}`, time); + return { + workspace: writeWorkspace(workspace), + notice: 'Note deleted.' + }; + }, + + async saveSettings(input: SettingsInput): Promise { + await withDelay(latencyMs); + const workspace = readWorkspace(); + const name = clampText(input.name); + if (!name) throw new Error('Workspace name is required.'); + if (!workspace.people.some((person) => person.id === input.defaultOwnerId)) { + throw new Error('Select a valid default owner.'); + } + workspace.meta.name = name; + workspace.meta.bulletinHtml = input.bulletinHtml || ''; + workspace.settings.defaultOwnerId = input.defaultOwnerId; + workspace.settings.accent = ACCENTS.includes(input.accent) ? input.accent : 'sunrise'; + workspace.settings.reportTitle = clampText(input.reportTitle, 'Operations report'); + pushActivity(workspace, 'settings', 'Saved workspace settings.', time); + return { + workspace: writeWorkspace(workspace), + notice: 'Settings saved.' + }; + }, + + async importWorkspace(source: string): Promise { + await withDelay(latencyMs); + let parsed: unknown; + try { + parsed = JSON.parse(source); + } catch (_error) { + throw new Error('Import JSON is invalid.'); + } + const workspace = normalizeWorkspace(parsed, time); + pushActivity(workspace, 'import', 'Imported workspace data.', time); + return { + workspace: writeWorkspace(workspace), + notice: 'Workspace imported.' + }; + }, + + async resetWorkspace(): Promise { + await withDelay(latencyMs); + const workspace = defaultWorkspace(time); + pushActivity(workspace, 'reset', 'Reset the workspace back to the default data set.', time); + return { + workspace: writeWorkspace(workspace), + notice: 'Example data reset.' + }; + }, + + readExport(): string { + return JSON.stringify(readWorkspace(), null, 2); + } + }; + } + + function normalizeBasePath(value: string): string { + const normalized = (value || '/').replace(/\/index\.html$/, '').replace(/\/+$/, ''); + return normalized || ''; + } + + function inferBasePath(explicit?: string): string { + if (typeof explicit === 'string') return normalizeBasePath(explicit); + const pathname = browserWindow?.location?.pathname || '/Examples/OperationsWorkbench'; + return normalizeBasePath(pathname); + } + + function appHref(base: string, path: string): string { + const parsed = new URL(path || '/', 'http://ity.local'); + const routePath = parsed.pathname === '/index.html' ? '/' : parsed.pathname; + const normalizedBase = normalizeBasePath(base); + const nextPath = normalizedBase + ? `${normalizedBase}${routePath === '/' ? '' : routePath}` + : routePath; + return `${nextPath || '/'}${parsed.search}${parsed.hash}`; + } + + function loadPreferences(storage: StorageLike, storageKey: string): UIPreferences { + const raw = storage.getItem(`${storageKey}:prefs`); + if (!raw) return { ...EMPTY_PREFERENCES }; + try { + const parsed = JSON.parse(raw); + return { + taskQuery: clampText(parsed.taskQuery), + statusFilter: clampText(parsed.statusFilter, 'all'), + ownerFilter: clampText(parsed.ownerFilter, 'all'), + includeDone: parsed.includeDone !== false, + noteQuery: clampText(parsed.noteQuery) + }; + } catch (_error) { + return { ...EMPTY_PREFERENCES }; + } + } + + function savePreferences(storage: StorageLike, storageKey: string, value: UIPreferences): void { + storage.setItem(`${storageKey}:prefs`, JSON.stringify(value, null, 2)); + } + + function taskDraftFromTask(task: Task | null, workspaceData: WorkspaceData, time?: () => number): TaskDraft { + if (!task) { + return { + taskId: '', + title: '', + description: '', + ownerId: workspaceData.settings.defaultOwnerId, + priority: 'medium', + dueDate: addDays(2, time), + tags: '', + checklistText: '' + }; + } + return { + taskId: task.id, + title: task.title, + description: task.description, + ownerId: task.ownerId, + priority: task.priority, + dueDate: task.dueDate, + tags: csv(task.tags), + checklistText: task.checklist.map((item) => item.label).join('\n') + }; + } + + function noteDraftFromNote(note: Note | null): NoteDraft { + if (!note) { + return { + noteId: '', + title: '', + body: '', + relatedTaskIds: [] + }; + } + return { + noteId: note.id, + title: note.title, + body: note.body, + relatedTaskIds: note.relatedTaskIds.slice() + }; + } + + function settingsDraftFromWorkspace(workspaceData: WorkspaceData): SettingsDraft { + return { + name: workspaceData.meta.name, + defaultOwnerId: workspaceData.settings.defaultOwnerId, + accent: workspaceData.settings.accent, + reportTitle: workspaceData.settings.reportTitle, + bulletinHtml: workspaceData.meta.bulletinHtml + }; + } + + function taskIdFromPath(path: string | undefined): string { + const match = path?.match(/\/tasks\/([^/?#]+)/); + return match ? decodeURIComponent(match[1]) : ''; + } + + function draftKey(value: unknown): string { + try { + return JSON.stringify(value) || ''; + } catch (_error) { + return ''; + } + } + + function ensureWorkbenchComponents(Ity: any): void { + if (browserWindow?.[WORKBENCH_COMPONENTS_KEY]) return; + + Ity.component('ity-workbench-relative-time', { + attrs: ['datetime'], + shadow: true, + styles: ` + time { + color: #526274; + display: inline-block; + font-size: 0.9rem; + } + `, + setup(ctx: any) { + const datetime = ctx.attr('datetime'); + const now = Ity.signal(Date.now()); + let timer: any = null; + + ctx.onConnected(() => { + now.set(Date.now()); + timer = setInterval(() => now.set(Date.now()), 60000); + }); + ctx.onDisconnected(() => { + if (timer) clearInterval(timer); + timer = null; + }); + + return () => { + const value = datetime() || ''; + return Ity.html` + + `; + }; + } + }); + + Ity.component('ity-workbench-metric', { + attrs: ['label', 'value', 'hint', 'tone'], + shadow: true, + styles: ` + .metric { + background: linear-gradient(160deg, #ffffff, #f4f0e8); + border: 1px solid rgba(17, 24, 39, 0.08); + border-radius: 22px; + box-shadow: 0 18px 48px rgba(17, 24, 39, 0.08); + display: grid; + gap: 0.4rem; + min-height: 9rem; + padding: 1.15rem 1.2rem; + } + + .metric[data-tone="active"] { + background: linear-gradient(160deg, #fff4dc, #fff8ef); + } + + .metric[data-tone="blocked"] { + background: linear-gradient(160deg, #ffe9df, #fff7f2); + } + + .metric[data-tone="done"] { + background: linear-gradient(160deg, #e8fbef, #f6fffa); + } + + .label { + color: #526274; + font-size: 0.85rem; + letter-spacing: 0.08em; + text-transform: uppercase; + } + + .value { + color: #14213d; + font-family: "Avenir Next", "Segoe UI", sans-serif; + font-size: 2.3rem; + font-weight: 700; + line-height: 1; + } + + .hint { + color: #415366; + font-size: 0.95rem; + } + `, + setup(ctx: any) { + const label = ctx.attr('label'); + const value = ctx.attr('value'); + const hint = ctx.attr('hint'); + const tone = ctx.attr('tone'); + + return () => Ity.html` +
+
${label() || 'Metric'}
+
${value() || '0'}
+
${hint() || ''}
+
+ `; + } + }); + + Ity.component('ity-workbench-task-card', { + props: ['task', 'owner', 'openLink', 'onAdvance'], + shadow: true, + styles: ` + .card { + background: #ffffff; + border: 1px solid rgba(17, 24, 39, 0.08); + border-radius: 24px; + box-shadow: 0 16px 44px rgba(15, 23, 42, 0.08); + display: grid; + gap: 0.9rem; + padding: 1.15rem; + } + + .top, + .meta, + .actions { + align-items: center; + display: flex; + gap: 0.65rem; + justify-content: space-between; + } + + .chips { + display: flex; + flex-wrap: wrap; + gap: 0.45rem; + } + + .chip, + .status { + background: #f2f4f7; + border-radius: 999px; + color: #38495a; + display: inline-flex; + font-size: 0.78rem; + font-weight: 600; + padding: 0.35rem 0.7rem; + } + + .status[data-status="active"] { + background: #fff3c6; + color: #815400; + } + + .status[data-status="blocked"] { + background: #ffd8cf; + color: #8b2e16; + } + + .status[data-status="done"] { + background: #dff7e7; + color: #106b39; + } + + .eyebrow { + color: #526274; + font-size: 0.82rem; + margin: 0; + text-transform: uppercase; + letter-spacing: 0.08em; + } + + .title { + color: #14213d; + font-family: "Avenir Next", "Segoe UI", sans-serif; + font-size: 1.15rem; + font-weight: 700; + margin: 0; + } + + .description { + color: #425466; + margin: 0; + } + + a, + button { + align-items: center; + background: #14213d; + border: 0; + border-radius: 999px; + color: #ffffff; + cursor: pointer; + display: inline-flex; + font: inherit; + justify-content: center; + min-height: 2.4rem; + padding: 0.65rem 0.95rem; + text-decoration: none; + } + + a.secondary { + background: #eef2f7; + color: #14213d; + } + `, + setup(ctx: any) { + const task = ctx.prop('task'); + const owner = ctx.prop('owner'); + const openLink = ctx.prop('openLink'); + const onAdvance = ctx.prop('onAdvance'); + + return () => { + const taskValue = task(); + const ownerValue = owner(); + if (!taskValue) { + return Ity.html`

Task unavailable.

`; + } + return Ity.html` +
+
+

${priorityLabel(taskValue.priority)}

+ ${taskStatusLabel(taskValue.status)} +
+

${taskValue.title}

+

${taskValue.description}

+
+ ${ownerValue?.name || 'Unassigned'} + +
+
+ ${taskValue.tags.map((tag: string) => Ity.html`${tag}`)} +
+
+ ${taskProgress(taskValue)} + ${ownerValue?.name || 'Unassigned'} +
+
+ Open task + +
+
+ `; + }; + } + }); + + if (browserWindow) { + browserWindow[WORKBENCH_COMPONENTS_KEY] = true; + } + } + + function createOperationsWorkbenchApp(Ity: any, input: string | Element | CreateAppOptions = '#operationsWorkbenchApp'): OperationsWorkbenchApp { + ensureWorkbenchComponents(Ity); + + const options = (typeof input === 'string' || ((input as Element | undefined)?.nodeType)) + ? { target: input as string | Element } + : ((input as CreateAppOptions) || {}); + + const target = options.target || '#operationsWorkbenchApp'; + const base = inferBasePath(options.base); + const storageKey = options.storageKey || 'ity-operations-workbench'; + const storage = resolveStorage(options.storage); + const repository = createRepository({ + storage, + storageKey, + seed: options.initialData, + latencyMs: typeof options.latencyMs === 'number' ? options.latencyMs : 35, + time: options.time + }); + const htmlConfig = Ity.createConfig({ + sanitizeHTML: options.sanitizer || sanitizeHTML + }); + + const preferences = loadPreferences(storage, storageKey); + const ui = Ity.store({ + page: 'dashboard', + activeTaskId: '', + editingNoteId: '', + taskQuery: preferences.taskQuery, + statusFilter: preferences.statusFilter, + ownerFilter: preferences.ownerFilter, + includeDone: preferences.includeDone, + noteQuery: preferences.noteQuery, + noticeMessage: '', + noticeTone: 'info' as NoticeTone, + noticeToken: 0, + reportMode: 'preview' + }); + + const workspace = Ity.resource(async ({ signal }: { signal: AbortSignal }) => repository.loadWorkspace(signal), { + initialValue: undefined, + keepPrevious: true + }); + + const taskState = Ity.formState({ + taskId: '', + title: '', + description: '', + ownerId: '', + priority: 'medium' as TaskPriority, + dueDate: '', + tags: '', + checklistText: '' + }, { + validators: { + title(value: string) { + return value.trim() ? null : 'Task title is required.'; + }, + ownerId(value: string) { + return value ? null : 'Select an owner.'; + }, + dueDate(value: string) { + return isValidDateOnly(value) ? null : 'Enter a valid due date.'; + } + } + }); + + const noteState = Ity.formState({ + noteId: '', + title: '', + body: '', + relatedTaskIds: [] as string[] + }, { + validators: { + title(value: string) { + return value.trim() ? null : 'Note title is required.'; + }, + body(value: string) { + return value.trim() ? null : 'Note body is required.'; + } + } + }); + + const settingsState = Ity.formState({ + name: '', + defaultOwnerId: '', + accent: 'sunrise' as AccentName, + reportTitle: '', + bulletinHtml: '' + }, { + validators: { + name(value: string) { + return value.trim() ? null : 'Workspace name is required.'; + }, + defaultOwnerId(value: string) { + return value ? null : 'Select a default owner.'; + }, + reportTitle(value: string) { + return value.trim() ? null : 'Report title is required.'; + } + } + }); + + const importState = Ity.formState({ + importText: '' + }, { + validators: { + importText(value: string) { + return value.trim() ? null : 'Paste workspace JSON to import.'; + } + } + }); + + const setNotice = (message: string, tone: NoticeTone = 'info'): void => { + Ity.batch(() => { + ui.noticeMessage = message; + ui.noticeTone = tone; + ui.noticeToken = ui.noticeToken + 1; + }); + }; + + const messageFromError = (error: unknown): string => error instanceof Error ? error.message : 'Something went wrong.'; + const onMutationError = (error: unknown): void => setNotice(messageFromError(error), 'error'); + + const router = new Ity.Router({ + autoStart: false, + base, + transition: true, + notFound: () => { + ui.page = 'not-found'; + ui.activeTaskId = ''; + } + }); + + const activatePage = (page: string, activeTaskId = ''): (() => void) => { + ui.page = page; + ui.activeTaskId = activeTaskId; + return () => { + if (page.indexOf('task') === 0) ui.activeTaskId = ''; + }; + }; + + router.add('/', () => activatePage('dashboard')); + router.add('/index.html', () => activatePage('dashboard')); + router.add('/tasks', () => activatePage('tasks')); + router.add('/tasks/new', () => activatePage('task-create')); + router.add('/tasks/:id', (params: Record) => activatePage('task-detail', params.id)); + router.add('/notes', () => activatePage('notes')); + router.add('/reports', () => activatePage('reports')); + router.add('/settings', () => activatePage('settings')); + + const applyMutation = (result: MutationResult): MutationResult => { + Ity.batch(() => { + workspace.mutate(result.workspace); + setNotice(result.notice, 'success'); + }); + if (result.navigateTo) router.navigate(result.navigateTo); + return result; + }; + + const cycleTask = Ity.action(async (taskId: string) => applyMutation(await repository.cycleTaskStatus(taskId)), { + onError: onMutationError + }); + const toggleChecklist = Ity.action(async (taskId: string, itemId: string) => applyMutation(await repository.toggleChecklist(taskId, itemId)), { + onError: onMutationError + }); + const deleteTask = Ity.action(async (taskId: string) => applyMutation(await repository.deleteTask(taskId)), { + onError: onMutationError + }); + const deleteNote = Ity.action(async (noteId: string) => applyMutation(await repository.deleteNote(noteId)), { + onError: onMutationError + }); + const resetWorkspaceAction = Ity.action(async () => { + const result = applyMutation(await repository.resetWorkspace()); + taskState.reset(taskDraftFromTask(null, result.workspace, options.time)); + noteState.reset(noteDraftFromNote(null)); + settingsState.reset(settingsDraftFromWorkspace(result.workspace)); + importState.reset({ importText: '' }); + return result; + }, { + onError: onMutationError + }); + + const taskSubmit = taskState.submit(async (values: TaskDraft) => { + const result = applyMutation(await repository.saveTask({ + id: clampText(values.taskId), + title: values.title, + description: values.description, + ownerId: values.ownerId, + priority: values.priority, + dueDate: values.dueDate, + tags: parseTags(values.tags), + checklistText: values.checklistText + })); + const savedTask = result.workspace.tasks.find((task) => task.id === taskIdFromPath(result.navigateTo) || task.id === values.taskId) || null; + taskState.reset(taskDraftFromTask(savedTask, result.workspace, options.time)); + return result; + }, { + onError: onMutationError + }); + + const noteSubmit = noteState.submit(async (values: NoteDraft) => { + const result = applyMutation(await repository.saveNote({ + id: clampText(values.noteId), + title: values.title, + body: values.body, + relatedTaskIds: values.relatedTaskIds.slice() + })); + const savedNote = result.workspace.notes.find((note) => note.id === values.noteId || note.title === values.title) || null; + noteState.reset(noteDraftFromNote(savedNote)); + ui.editingNoteId = savedNote?.id || ''; + return result; + }, { + onError: onMutationError + }); + + const settingsSubmit = settingsState.submit(async (values: SettingsDraft) => { + const result = applyMutation(await repository.saveSettings({ + name: values.name, + defaultOwnerId: values.defaultOwnerId, + accent: values.accent, + reportTitle: values.reportTitle, + bulletinHtml: values.bulletinHtml + })); + settingsState.reset(settingsDraftFromWorkspace(result.workspace)); + return result; + }, { + onError: onMutationError + }); + + const importSubmit = importState.submit(async (values: { importText: string }) => { + const result = applyMutation(await repository.importWorkspace(values.importText)); + taskState.reset(taskDraftFromTask(null, result.workspace, options.time)); + noteState.reset(noteDraftFromNote(null)); + settingsState.reset(settingsDraftFromWorkspace(result.workspace)); + importState.reset({ importText: '' }); + ui.editingNoteId = ''; + return result; + }, { + onError: onMutationError + }); + + const dashboardTasks = Ity.computed(() => { + const data = workspace.data(); + if (!data) return []; + return sortTasks(data.tasks.filter((task: Task) => task.status !== 'done')).slice(0, 3); + }); + + const filteredTasks = Ity.computed(() => { + const data = workspace.data(); + if (!data) return []; + const query = ui.taskQuery.trim().toLowerCase(); + return sortTasks(data.tasks).filter((task: Task) => { + if (!ui.includeDone && task.status === 'done') return false; + if (ui.statusFilter !== 'all' && task.status !== ui.statusFilter) return false; + if (ui.ownerFilter !== 'all' && task.ownerId !== ui.ownerFilter) return false; + if (!query) return true; + const haystack = `${task.title} ${task.description} ${task.tags.join(' ')}`.toLowerCase(); + return haystack.includes(query); + }); + }); + + const selectedTask = Ity.computed(() => { + const data = workspace.data(); + if (!data || !ui.activeTaskId) return null; + return data.tasks.find((task: Task) => task.id === ui.activeTaskId) || null; + }); + + const filteredNotes = Ity.computed(() => { + const data = workspace.data(); + if (!data) return []; + const query = ui.noteQuery.trim().toLowerCase(); + return sortNotes(data.notes).filter((note: Note) => { + if (!query) return true; + return `${note.title} ${note.body}`.toLowerCase().includes(query); + }); + }); + + const selectedNote = Ity.computed(() => { + const data = workspace.data(); + if (!data || !ui.editingNoteId) return null; + return data.notes.find((note: Note) => note.id === ui.editingNoteId) || null; + }); + + const metrics = Ity.computed(() => { + const data = workspace.data(); + if (!data) return { total: 0, active: 0, blocked: 0, done: 0 }; + return { + total: data.tasks.length, + active: data.tasks.filter((task: Task) => task.status === 'active').length, + blocked: data.tasks.filter((task: Task) => task.status === 'blocked').length, + done: data.tasks.filter((task: Task) => task.status === 'done').length + }; + }); + + const reportMarkup = Ity.computed(() => { + const data = workspace.data(); + if (!data) return ''; + return Ity.renderToString(() => Ity.html` +
+
+

${data.meta.name}

+

${data.settings.reportTitle}

+

Generated ${formatDateTime(toIso(options.time))}

+
+
+

Summary

+
    +
  • Total tasks: ${String(metrics().total)}
  • +
  • Active tasks: ${String(metrics().active)}
  • +
  • Blocked tasks: ${String(metrics().blocked)}
  • +
  • Completed tasks: ${String(metrics().done)}
  • +
+
+
+

Operator Bulletin

+ ${Ity.unsafeHTML(data.meta.bulletinHtml || '

No bulletin set.

')} +
+
+

Task Ledger

+
    + ${sortTasks(data.tasks).map((task: Task) => Ity.html` +
  1. + ${task.title} · ${taskStatusLabel(task.status)} · ${priorityLabel(task.priority)} · Due ${task.dueDate} +
  2. + `)} +
+
+
+

Recent Notes

+
    + ${sortNotes(data.notes).slice(0, 5).map((note: Note) => Ity.html` +
  • ${note.title}: ${note.body}
  • + `)} +
+
+
+ `, { config: htmlConfig }); + }); + + const preferenceStop = ui.$subscribe((value: typeof ui) => { + savePreferences(storage, storageKey, { + taskQuery: value.taskQuery, + statusFilter: value.statusFilter, + ownerFilter: value.ownerFilter, + includeDone: value.includeDone, + noteQuery: value.noteQuery + }); + }, { immediate: true }); + + const noticeStop = Ity.effect((onCleanup: (cleanup: () => void) => void) => { + const token = ui.noticeToken; + if (!ui.noticeMessage) return; + const timer = setTimeout(() => { + if (ui.noticeToken === token) ui.noticeMessage = ''; + }, 3200); + onCleanup(() => clearTimeout(timer)); + }); + + const resolveOwner = (workspaceData: WorkspaceData, ownerId: string): Person | undefined => { + return workspaceData.people.find((person) => person.id === ownerId); + }; + + let lastTaskDraftContext = ''; + let lastTaskDraftValue = ''; + const taskDraftStop = Ity.effect(() => { + const data = workspace.data(); + const page = ui.page; + const task = selectedTask(); + const taskIsDirty = taskState.dirty(); + if (!data) return; + if (page === 'task-create') { + const nextDraft = taskDraftFromTask(null, data, options.time); + const nextContext = 'create'; + const nextValue = draftKey(nextDraft); + if (lastTaskDraftContext !== nextContext || lastTaskDraftValue !== nextValue) { + lastTaskDraftContext = nextContext; + lastTaskDraftValue = nextValue; + Ity.untrack(() => taskState.reset(nextDraft)); + taskSubmit.action.reset(); + } + return; + } + if (page === 'task-detail') { + const nextContext = `detail:${task?.id || 'missing'}`; + const nextDraft = taskDraftFromTask(task, data, options.time); + const nextValue = draftKey(nextDraft); + if ((lastTaskDraftContext !== nextContext || lastTaskDraftValue !== nextValue) && (!taskIsDirty || lastTaskDraftContext !== nextContext)) { + lastTaskDraftContext = nextContext; + lastTaskDraftValue = nextValue; + Ity.untrack(() => taskState.reset(nextDraft)); + taskSubmit.action.reset(); + } + return; + } + lastTaskDraftContext = ''; + lastTaskDraftValue = ''; + }); + + let lastNoteDraftContext = ''; + let lastNoteDraftValue = ''; + const noteDraftStop = Ity.effect(() => { + const data = workspace.data(); + const noteIsDirty = noteState.dirty(); + if (!data || ui.page !== 'notes') { + lastNoteDraftContext = ''; + lastNoteDraftValue = ''; + return; + } + const nextContext = ui.editingNoteId || 'new'; + const nextDraft = noteDraftFromNote(selectedNote()); + const nextValue = draftKey(nextDraft); + if ((lastNoteDraftContext !== nextContext || lastNoteDraftValue !== nextValue) && (!noteIsDirty || lastNoteDraftContext !== nextContext)) { + lastNoteDraftContext = nextContext; + lastNoteDraftValue = nextValue; + Ity.untrack(() => noteState.reset(nextDraft)); + noteSubmit.action.reset(); + } + }); + + let lastSettingsDraftValue = ''; + const settingsDraftStop = Ity.effect(() => { + const data = workspace.data(); + const settingsIsDirty = settingsState.dirty(); + if (!data) return; + const nextDraft = settingsDraftFromWorkspace(data); + const nextValue = draftKey(nextDraft); + if (nextValue !== lastSettingsDraftValue && !settingsIsDirty) { + lastSettingsDraftValue = nextValue; + Ity.untrack(() => settingsState.reset(nextDraft)); + } + }); + + const renderMetricCards = () => Ity.html` +
+ + + + +
+ `; + + const renderTaskCard = (task: Task, workspaceData: WorkspaceData) => Ity.html` + + `; + + const renderDashboard = (workspaceData: WorkspaceData) => Ity.html` +
+
+
+

Workspace

+

Launch snapshot

+
+ Open report +
+ ${renderMetricCards()} +
+ +
+
+
+
+

Bulletin

+

Operator briefing

+
+ Edit settings +
+
${Ity.unsafeHTML(workspaceData.meta.bulletinHtml || '

No bulletin set.

')}
+
+ +
+
+
+

Priority Queue

+

Closest launch work

+
+ See all tasks +
+
+ ${dashboardTasks().map((task: Task) => renderTaskCard(task, workspaceData))} +
+
+
+ +
+
+
+
+

Recent Notes

+

Team memory

+
+ Manage notes +
+
    + ${workspaceData.notes.slice(0, 3).map((note: Note) => Ity.html` +
  • +
    + ${note.title} +

    ${note.body}

    +
    + ${formatDateTime(note.updatedAt)} +
  • + `)} +
+
+ +
+
+
+

Activity

+

Change feed

+
+
+
    + ${workspaceData.activity.slice(0, 6).map((entry: ActivityEntry) => Ity.html` +
  • +
    + ${entry.message} +

    ${entry.kind}

    +
    + ${formatDateTime(entry.createdAt)} +
  • + `)} +
+
+
+ `; + + const renderTaskForm = (workspaceData: WorkspaceData, heading: string) => Ity.html` +
+
+
+

${heading === 'New task' ? 'Create' : 'Edit'}

+

${heading}

+
+
+
+ + + +
+ + + +
+ + +
+ + Back to task board +
+ ${(taskState.touched.title && taskState.errors.title) && Ity.html``} + ${(taskState.touched.dueDate && taskState.errors.dueDate) && Ity.html``} + ${taskSubmit.error() && Ity.html``} +
+
+ `; + + const renderTasksPage = (workspaceData: WorkspaceData) => Ity.html` +
+ +
+ ${filteredTasks().length + ? filteredTasks().map((task: Task) => renderTaskCard(task, workspaceData)) + : Ity.html`

No tasks match the current filters.

Change the filters or create a new task.

`} +
+
+ `; + + const renderTaskDetail = (workspaceData: WorkspaceData, task: Task | null) => { + if (!task) { + return Ity.html` +
+

Task not found

+

The URL points to a task that no longer exists in this local workspace.

+ Back to task board +
+ `; + } + const owner = resolveOwner(workspaceData, task.ownerId); + return Ity.html` +
+
+
+
+

Task detail

+

${task.title}

+
+
+ + +
+
+
+
Status
${taskStatusLabel(task.status)}
+
Priority
${priorityLabel(task.priority)}
+
Owner
${owner?.name || 'Unassigned'}
+
Due
${formatLongDate(task.dueDate)}
+
+

${task.description}

+
+
+
+

Execution

+

Checklist

+
+
+ ${task.checklist.length + ? task.checklist.map((item: ChecklistItem) => Ity.html` + + `) + : Ity.html`

No checklist items yet. Add them in the editor.

`} +
+
+ ${renderTaskForm(workspaceData, 'Update task')} +
+ `; + }; + + const renderNotesPage = (workspaceData: WorkspaceData) => { + const note = selectedNote(); + return Ity.html` +
+ +
+
+
+

Editor

+

${note ? 'Update note' : 'Capture a new note'}

+
+ ${note && Ity.html``} +
+
+ + + +
+ Related tasks +
+ ${workspaceData.tasks.map((task: Task) => Ity.html` + + `)} +
+
+
+ +
+ ${(noteState.touched.title && noteState.errors.title) && Ity.html``} + ${(noteState.touched.body && noteState.errors.body) && Ity.html``} + ${noteSubmit.error() && Ity.html``} +
+
+
+ `; + }; + + const renderReportsPage = () => Ity.html` +
+
+
+
+

Report Preview

+

Shareable status output

+
+
+ + +
+
+ ${ui.reportMode === 'preview' + ? Ity.html`
${Ity.unsafeHTML(reportMarkup())}
` + : Ity.html``} +
+
+ `; + + const renderSettingsPage = (workspaceData: WorkspaceData) => Ity.html` +
+
+
+
+

Settings

+

Workspace configuration

+
+
+
+ +
+ + + +
+ +
+

Sanitized bulletin preview

+
${Ity.unsafeHTML(settingsState.values.bulletinHtml || '

No bulletin set.

')}
+
+
+ + +
+ ${settingsSubmit.error() && Ity.html``} +
+
+
+
+
+

Data portability

+

Import or export the workspace

+
+
+ +
+ +
+ +
+ ${(importState.touched.importText && importState.errors.importText) && Ity.html``} + ${importSubmit.error() && Ity.html``} +
+
+
+ `; + + const renderNotFound = () => Ity.html` +
+

Route not found

+

The requested page is outside this example’s router map.

+ Go to dashboard +
+ `; + + const renderErrorState = () => Ity.html` +
+

Workspace load failed

+

${messageFromError(workspace.error())}

+
+ + +
+
+ `; + + const disposeRender = Ity.render(() => { + const data = workspace.data(); + const page = ui.page; + const current = router.current(); + const isBusy = workspace.loading() + || cycleTask.pending() + || toggleChecklist.pending() + || deleteTask.pending() + || deleteNote.pending() + || resetWorkspaceAction.pending() + || taskSubmit.pending() + || noteSubmit.pending() + || settingsSubmit.pending() + || importSubmit.pending(); + + return Ity.html` +
+
+
+

Major V2.2 Example

+

${data?.meta.name || 'Operations Workbench'}

+

Local-first release control built on signals, resources, typed form state, actions, Web Components, the router, and string rendering.

+
+
+ + ${workspace.loading() ? 'Refreshing…' : workspace.status() === 'error' ? 'Needs attention' : 'Synced locally'} + + +
+
+ + + + ${ui.noticeMessage && Ity.html` + + `} + +
+ ${workspace.error() && !data + ? renderErrorState() + : !data + ? Ity.html`

Loading workspace…

Bootstrapping the local-first data store and route state.

` + : page === 'dashboard' + ? renderDashboard(data) + : page === 'tasks' + ? renderTasksPage(data) + : page === 'task-create' + ? renderTaskForm(data, 'New task') + : page === 'task-detail' + ? renderTaskDetail(data, selectedTask()) + : page === 'notes' + ? renderNotesPage(data) + : page === 'reports' + ? renderReportsPage() + : page === 'settings' + ? renderSettingsPage(data) + : renderNotFound()} +
+
+ `; + }, target, { transition: true, config: htmlConfig }); + + router.start(); + + return { + workspace, + ui, + router, + repository, + actions: { + cycleTask, + toggleChecklist, + deleteTask, + deleteNote, + resetWorkspace: resetWorkspaceAction, + taskForm: taskSubmit, + noteForm: noteSubmit, + settingsForm: settingsSubmit, + importForm: importSubmit + }, + dispose(): void { + router.stop(); + disposeRender(); + preferenceStop(); + noticeStop(); + taskDraftStop(); + noteDraftStop(); + settingsDraftStop(); + } + }; + } + + if (browserWindow) { + browserWindow.ItyExamples ||= {}; + browserWindow.ItyExamples.createOperationsWorkbenchApp = createOperationsWorkbenchApp; + browserWindow.ItyExamples.createMemoryStorage = createMemoryStorage; + } +})(); diff --git a/Examples/index.html b/Examples/index.html new file mode 100644 index 0000000..10b009c --- /dev/null +++ b/Examples/index.html @@ -0,0 +1,175 @@ + + + + + + Ity Examples + + + +
+
+

Ity Examples

+

Small demos plus one serious app

+

Run npm run examples:serve from the repository root, then open the links below.

+

The Operations Workbench is the deep v2.2 example and exercises the modern library surface together.

+
+ +
+
+

Deep Example

+

Operations Workbench

+

Local-first dashboard with resources, actions, form state, router links, custom elements, sanitization, and string rendering.

+ Open Workbench +
+ +
+

Focused Demo

+

Calculator

+

Small signal-driven UI that shows the basic render loop and DOM bindings.

+ Open Calculator +
+ +
+

Focused Demo

+

Collection

+

Legacy MVC collection usage alongside the newer runtime.

+ Open Collection Demo +
+ +
+

Focused Demo

+

Router

+

Route registration, navigation, and progressive SPA behavior.

+ Open Router Demo +
+
+
+ + diff --git a/Ity.ts b/Ity.ts index 5eac013..041c410 100644 --- a/Ity.ts +++ b/Ity.ts @@ -1,4 +1,4 @@ -// Ity.ts 2.1.0 +// Ity.ts 2.2.0 // (c) 2026 Dominic Cocchiarella // Tiny dependency-free reactive app kernel with V1 MVC compatibility. declare var define: any; @@ -72,6 +72,7 @@ type HTMLSanitizer = (value: string) => string; interface UnsafeHTMLOptions { sanitize?: HTMLSanitizer; + config?: ItyConfig | null; } interface ItyConfig { @@ -81,6 +82,7 @@ interface ItyConfig { interface RenderOptions { reactive?: boolean; transition?: boolean; + config?: ItyConfig | null; } type StoreKey = string | symbol; @@ -128,6 +130,9 @@ interface ActionOptions { interface Action { (...args: TArgs): Promise; submit(...args: TArgs): Promise; + run(...args: TArgs): void; + with(...args: TArgs): (...eventArgs: unknown[]) => void; + from(mapper: (event: TEvent) => TArgs): (event: TEvent) => void; readonly data: Signal; readonly error: Signal; readonly pending: ReadonlySignal; @@ -143,6 +148,7 @@ interface FormController { readonly pending: ReadonlySignal; readonly status: ReadonlySignal; onSubmit(event: Event): Promise; + handleSubmit(event: Event): void; reset(): void; } @@ -150,11 +156,84 @@ interface FormOptions extends ActionOptions { resetOnSuccess?: boolean; } +type FormErrorMap> = Partial, string>>; + +interface FormBindOptions { + type?: "text" | "textarea" | "select" | "select-multiple" | "checkbox" | "radio" | "number"; + event?: string; + name?: string; + value?: unknown; + parse?: (value: unknown, event: Event) => T; + format?: (value: T) => unknown; +} + +interface FormStateOptions> { + validators?: Partial<{ [K in keyof TValues]: (value: TValues[K], values: TValues) => string | null | undefined }>; + validate?: (values: TValues) => FormErrorMap | void; +} + +interface FormField { + readonly value: Signal; + readonly error: ReadonlySignal; + readonly touched: ReadonlySignal; + readonly dirty: ReadonlySignal; + bind(options?: FormBindOptions): Record; + set(next: T | ((previous: T) => T)): T; + reset(): void; +} + +interface FormStateSubmitOptions extends ActionOptions { + resetOnSuccess?: boolean; +} + +interface FormStateController, TResult, E = unknown> { + readonly state: FormState; + readonly action: Action<[TValues, Event], TResult, E>; + readonly data: Signal; + readonly error: Signal; + readonly pending: ReadonlySignal; + readonly status: ReadonlySignal; + onSubmit(event: Event): Promise; + handleSubmit(event: Event): void; + reset(): void; +} + +interface FormState> { + readonly values: Store; + readonly initialValues: ReadonlySignal; + readonly errors: Store>; + readonly touched: Store, boolean>>>; + readonly dirty: ReadonlySignal; + readonly valid: ReadonlySignal; + field(name: K): FormField; + bind(name: K, options?: FormBindOptions): Record; + set(next: Partial | ((current: TValues) => Partial | void)): void; + reset(next?: Partial | TValues): void; + validate(names?: readonly (keyof TValues)[]): boolean; + markTouched(names?: readonly (keyof TValues)[]): void; + submit( + handler: (values: TValues, event: Event) => Promise | TResult, + options?: FormStateSubmitOptions + ): FormStateController; +} + +interface RenderToStringOptions { + config?: ItyConfig | null; +} + +interface RegisteredFormBinding { + domName: string; + type: NonNullable["type"]> | "text"; + value?: unknown; + parse?: (value: unknown, event: Event) => T; +} + const defaultEquals = Object.is; let activeObserver: ReactiveObserver | null = null; let batchDepth = 0; const pendingEffects = new Set(); let configuredSanitizeHTML: HTMLSanitizer | undefined; +const activeConfigStack: Array = []; function getWindow(): (Window & typeof globalThis) | undefined { return typeof window !== "undefined" ? window : undefined; @@ -165,6 +244,74 @@ function getDocument(): Document | undefined { return win?.document ?? (typeof document !== "undefined" ? document : undefined); } +function hasOwn(target: object, key: PropertyKey): boolean { + return Object.prototype.hasOwnProperty.call(target, key); +} + +function isPlainObject(value: unknown): value is Record { + if (!value || typeof value !== "object") return false; + const proto = Object.getPrototypeOf(value); + return proto === Object.prototype || proto === null; +} + +function cloneValue(value: T): T { + const cloneFn = (globalThis as any).structuredClone; + if (typeof cloneFn === "function") return cloneFn(value); + if (Array.isArray(value)) return value.map((item) => cloneValue(item)) as T; + if (isPlainObject(value)) { + const out: Record = {}; + for (const key of Reflect.ownKeys(value)) { + out[key as any] = cloneValue((value as any)[key]); + } + return out as T; + } + return value; +} + +function deepEqual(left: unknown, right: unknown): boolean { + if (Object.is(left, right)) return true; + if (Array.isArray(left) && Array.isArray(right)) { + if (left.length !== right.length) return false; + for (let i = 0; i < left.length; i += 1) { + if (!deepEqual(left[i], right[i])) return false; + } + return true; + } + if (isPlainObject(left) && isPlainObject(right)) { + const leftKeys = Reflect.ownKeys(left); + const rightKeys = Reflect.ownKeys(right); + if (leftKeys.length !== rightKeys.length) return false; + for (const key of leftKeys) { + if (!rightKeys.includes(key)) return false; + if (!deepEqual((left as any)[key], (right as any)[key])) return false; + } + return true; + } + return false; +} + +function currentConfig(): ItyConfig | null { + return activeConfigStack.length ? activeConfigStack[activeConfigStack.length - 1] : null; +} + +function withConfig(config: ItyConfig | null | undefined, callback: () => T): T { + activeConfigStack.push(config || null); + try { + return callback(); + } finally { + activeConfigStack.pop(); + } +} + +function resolveSanitizeHTML(options: UnsafeHTMLOptions = {}): HTMLSanitizer | undefined { + if (options.sanitize) return options.sanitize; + const scoped = options.config ?? currentConfig(); + if (scoped && hasOwn(scoped, "sanitizeHTML")) { + return scoped.sanitizeHTML || undefined; + } + return configuredSanitizeHTML; +} + function trackDependency(source: ReactiveSource): void { if (!activeObserver) return; source.observers.add(activeObserver); @@ -410,6 +557,12 @@ function configure(options: ItyConfig = {}): void { configuredSanitizeHTML = options.sanitizeHTML || undefined; } +function createConfig(options: ItyConfig = {}): ItyConfig { + const config: ItyConfig = {}; + if (hasOwn(options, "sanitizeHTML")) config.sanitizeHTML = options.sanitizeHTML ?? null; + return config; +} + function store>(initialValue: T): Store { const keys = new Set(Reflect.ownKeys(initialValue)); const signals = new Map>(); @@ -644,6 +797,9 @@ function action( const callable = ((...args: TArgs) => submit(...args)) as Action; const mutableCallable = callable as Action & { submit: (...args: TArgs) => Promise; + run: (...args: TArgs) => void; + with: (...args: TArgs) => (...eventArgs: unknown[]) => void; + from: (mapper: (event: TEvent) => TArgs) => (event: TEvent) => void; data: Signal; error: Signal; pending: ReadonlySignal; @@ -651,6 +807,19 @@ function action( status: ReadonlySignal; }; mutableCallable.submit = submit; + mutableCallable.run = (...args: TArgs) => { + submit(...args).catch(() => undefined); + }; + mutableCallable.with = (...args: TArgs) => { + return () => { + mutableCallable.run(...args); + }; + }; + mutableCallable.from = (mapper: (event: TEvent) => TArgs) => { + return (event: TEvent) => { + mutableCallable.run(...mapper(event)); + }; + }; mutableCallable.data = data; mutableCallable.error = error; mutableCallable.pending = pending; @@ -666,38 +835,48 @@ function action( return callable; } +function getFormElementCtor(node: Element | null): typeof HTMLFormElement | undefined { + const ownerWindow = node?.ownerDocument?.defaultView as (Window & typeof globalThis) | null | undefined; + return ownerWindow?.HTMLFormElement + || getWindow()?.HTMLFormElement + || (typeof HTMLFormElement !== "undefined" ? HTMLFormElement : undefined); +} + +function isFormElement(node: Element | null | undefined, fallbackNode?: Element | null): node is HTMLFormElement { + const FormElement = node ? getFormElementCtor(node) : getFormElementCtor(fallbackNode || null); + return Boolean(node && FormElement && node instanceof FormElement); +} + +function findFormElement(event: Event): HTMLFormElement { + const target = (event.currentTarget || event.target) as Element | null; + if (!getFormElementCtor(target)) throw new Error("Ity.form requires HTMLFormElement support"); + if (isFormElement(target, target)) return target; + const closest = target?.closest?.("form"); + if (isFormElement(closest, target)) return closest; + throw new Error("Ity.form onSubmit requires a form event target"); +} + +function createFormDataForElement(formElement: HTMLFormElement): FormData { + const ownerWindow = formElement.ownerDocument?.defaultView as (Window & typeof globalThis) | null | undefined; + const FormDataCtor = ownerWindow?.FormData + || getWindow()?.FormData + || (typeof FormData !== "undefined" ? FormData : undefined); + if (!FormDataCtor) throw new Error("Ity.form requires FormData support"); + return new FormDataCtor(formElement); +} + function form( handler: (data: FormData, event: Event) => Promise | TResult, options: FormOptions = {} ): FormController { const submitAction = action<[FormData, Event], TResult, E>(handler, options); - const findForm = (event: Event): HTMLFormElement => { - const target = (event.currentTarget || event.target) as Element | null; - const getFormElementCtor = (node: Element | null): typeof HTMLFormElement | undefined => { - const ownerWindow = node?.ownerDocument?.defaultView as (Window & typeof globalThis) | null | undefined; - return ownerWindow?.HTMLFormElement - || getWindow()?.HTMLFormElement - || (typeof HTMLFormElement !== "undefined" ? HTMLFormElement : undefined); - }; - const isFormElement = (node: Element | null | undefined): node is HTMLFormElement => { - const FormElement = node ? getFormElementCtor(node) : getFormElementCtor(target); - return Boolean(node && FormElement && node instanceof FormElement); - }; - if (!getFormElementCtor(target)) throw new Error("Ity.form requires HTMLFormElement support"); - if (isFormElement(target)) return target; - const closest = target?.closest?.("form"); - if (isFormElement(closest)) return closest; - throw new Error("Ity.form onSubmit requires a form event target"); - }; - - const createFormData = (formElement: HTMLFormElement): FormData => { - const ownerWindow = formElement.ownerDocument?.defaultView as (Window & typeof globalThis) | null | undefined; - const FormDataCtor = ownerWindow?.FormData - || getWindow()?.FormData - || (typeof FormData !== "undefined" ? FormData : undefined); - if (!FormDataCtor) throw new Error("Ity.form requires FormData support"); - return new FormDataCtor(formElement); + const onSubmit = async (event: Event): Promise => { + event.preventDefault(); + const formElement = findFormElement(event); + const result = await submitAction(createFormDataForElement(formElement), event); + if (options.resetOnSuccess) formElement.reset(); + return result; }; return { @@ -706,12 +885,9 @@ function form( error: submitAction.error, pending: submitAction.pending, status: submitAction.status, - async onSubmit(event: Event): Promise { - event.preventDefault(); - const formElement = findForm(event); - const result = await submitAction(createFormData(formElement), event); - if (options.resetOnSuccess) formElement.reset(); - return result; + onSubmit, + handleSubmit(event: Event): void { + onSubmit(event).catch(() => undefined); }, reset() { submitAction.reset(); @@ -719,6 +895,371 @@ function form( }; } +function replaceStoreSnapshot>(target: Store, nextValue: Partial): void { + const current = target.$snapshot() as Record; + batch(() => { + for (const key of Reflect.ownKeys(current)) { + if (!hasOwn(nextValue as object, key)) delete (target as any)[key]; + } + for (const key of Reflect.ownKeys(nextValue)) { + (target as any)[key] = (nextValue as any)[key]; + } + }); +} + +function formState>( + initialValue: TValues, + options: FormStateOptions = {} +): FormState { + const values = store(cloneValue(initialValue)); + const initialValues = signal(cloneValue(initialValue)); + const errors = store({} as FormErrorMap); + const touched = store({} as Partial, boolean>>); + const registeredBindings = new Map, Map>>(); + + const allFieldNames = (): Array> => { + const names = new Set(); + Reflect.ownKeys(initialValues.peek()).forEach((key) => names.add(String(key))); + Reflect.ownKeys(values.$snapshot()).forEach((key) => names.add(String(key))); + return Array.from(names) as Array>; + }; + + const computeErrors = (snapshot: TValues): FormErrorMap => { + const out: FormErrorMap = {}; + const validators = options.validators || {}; + for (const key of allFieldNames()) { + const validator = (validators as any)[key] as ((value: TValues[keyof TValues], values: TValues) => string | null | undefined) | undefined; + if (!validator) continue; + const message = validator((snapshot as any)[key], snapshot); + if (message) out[key] = message; + } + const formErrors = options.validate?.(snapshot); + if (formErrors) { + for (const key of Reflect.ownKeys(formErrors)) { + const message = (formErrors as any)[key]; + if (message) (out as any)[key] = message; + } + } + return out; + }; + + const syncErrors = (): boolean => { + const nextErrors = computeErrors(values.$snapshot()); + replaceStoreSnapshot(errors as any, nextErrors); + return Reflect.ownKeys(nextErrors).length === 0; + }; + + const markTouched = (names?: readonly (keyof TValues)[]): void => { + const keys = names?.length + ? names.map((name) => String(name)) + : allFieldNames(); + batch(() => { + for (const key of keys) { + (touched as any)[key] = true; + } + }); + }; + + const maybeValidateTouched = (): void => { + const touchedSnapshot = touched.$snapshot(); + if (Reflect.ownKeys(touchedSnapshot).some((key) => Boolean((touchedSnapshot as any)[key]))) { + syncErrors(); + } + }; + + const set = (next: Partial | ((current: TValues) => Partial | void)): void => { + values.$patch((current) => { + const patch = typeof next === "function" ? next(current) : next; + return patch || {}; + }); + maybeValidateTouched(); + }; + + const reset = (next?: Partial | TValues): void => { + const base = cloneValue(next + ? { ...initialValues.peek(), ...(next as any) } + : initialValues.peek()); + initialValues.set(cloneValue(base)); + replaceStoreSnapshot(values as any, base); + replaceStoreSnapshot(errors as any, {}); + replaceStoreSnapshot(touched as any, {}); + }; + + const createFieldSignal = (name: K): Signal => { + const signalLike = function (next?: TValues[K] | ((previous: TValues[K]) => TValues[K])): TValues[K] { + if (arguments.length === 0) return (values as any)[name]; + const previous = (values as any)[name]; + const resolved = typeof next === "function" + ? (next as (previous: TValues[K]) => TValues[K])(previous) + : next; + (values as any)[name] = resolved; + maybeValidateTouched(); + return resolved as TValues[K]; + } as Signal; + signalLike.get = () => (values as any)[name]; + signalLike.peek = () => untrack(() => (values as any)[name]); + signalLike.set = (next) => signalLike(next); + signalLike.update = (updater) => signalLike(updater); + signalLike.subscribe = (callback, subscribeOptions = {}) => { + let first = true; + let previous = signalLike.peek(); + return effect(() => { + const current = (values as any)[name]; + if (first) { + first = false; + previous = current; + if (subscribeOptions.immediate) callback(current, current); + return; + } + if (!Object.is(previous, current)) { + const prev = previous; + previous = current; + callback(current, prev); + } + }); + }; + Object.defineProperty(signalLike, "isSignal", { value: true }); + return signalLike; + }; + + const registerBinding = ( + name: K, + domName: string, + type: RegisteredFormBinding["type"], + bindOptions: FormBindOptions + ): void => { + const fieldName = String(name) as Extract; + const fieldBindings = registeredBindings.get(fieldName) || new Map>(); + const signature = `${domName}|${type}|${String(bindOptions.value)}`; + fieldBindings.set(signature, { + domName, + type, + value: bindOptions.value, + parse: bindOptions.parse + }); + registeredBindings.set(fieldName, fieldBindings as Map>); + }; + + const syncFromForm = (event: Event): void => { + const NO_FORM_VALUE = Symbol("ity.formState.noValue"); + let formElement: HTMLFormElement; + try { + formElement = findFormElement(event); + } catch (_error) { + return; + } + const formData = createFormDataForElement(formElement); + const controls = Array.from((formElement as any).elements || []) as Array<{ name?: string; value?: string; checked?: boolean }>; + const patch: Partial = {}; + + const resolveControlValue = ( + name: K, + bindings: RegisteredFormBinding[] + ): TValues[K] | typeof NO_FORM_VALUE => { + const primary = bindings[0]; + if (!primary) return NO_FORM_VALUE; + const domName = primary.domName; + const namedControls = controls.filter((control) => control && control.name === domName); + if (primary.parse && namedControls.length) { + const parseTarget = primary.type === "radio" + ? namedControls.find((control) => Boolean(control.checked)) || namedControls[0] + : namedControls[0]; + return primary.parse(parseTarget, event); + } + if (primary.type === "checkbox") { + const currentValue = (values as any)[name]; + if (Array.isArray(currentValue) || bindings.some((binding) => binding.value !== undefined) || namedControls.length > 1) { + const selected: unknown[] = []; + for (const control of namedControls) { + if (!control.checked) continue; + const matched = bindings.find((binding) => String(binding.value ?? control.value ?? "") === String(control.value ?? "")); + selected.push(matched?.value ?? control.value ?? ""); + } + return selected as TValues[K]; + } + return formData.has(domName) as TValues[K]; + } + if (primary.type === "radio") { + return (formData.get(domName) ?? (values as any)[name]) as TValues[K]; + } + if (primary.type === "select-multiple") { + const select = namedControls[0] as HTMLSelectElement | undefined; + if (select?.selectedOptions) { + return Array.from(select.selectedOptions).map((option) => option.value) as TValues[K]; + } + return formData.getAll(domName) as TValues[K]; + } + if (primary.type === "number") { + const raw = formData.get(domName); + return (raw === null || raw === "" ? undefined : Number(raw)) as TValues[K]; + } + const raw = formData.get(domName); + return (raw === null ? "" : raw) as TValues[K]; + }; + + for (const fieldName of allFieldNames()) { + const bindings = Array.from(registeredBindings.get(fieldName)?.values() || []) as RegisteredFormBinding]>[]; + const nextValue = resolveControlValue(fieldName, bindings as RegisteredFormBinding[]); + if (nextValue !== NO_FORM_VALUE) { + (patch as any)[fieldName] = nextValue; + } + } + + if (Reflect.ownKeys(patch).length) { + values.$patch(() => patch); + } + }; + + const bind = (name: K, bindOptions: FormBindOptions = {}): Record => { + const field = api.field(name); + const type = bindOptions.type || "text"; + const eventName = bindOptions.event + || (type === "checkbox" || type === "radio" || type === "select" || type === "select-multiple" ? "change" : "input"); + const domName = bindOptions.name || String(name); + registerBinding(name, domName, type, bindOptions); + const formattedValue = bindOptions.format ? bindOptions.format(field.value()) : field.value(); + const parseValue = (event: Event): TValues[K] => { + if (bindOptions.parse) { + return bindOptions.parse((event.currentTarget || event.target) as unknown, event); + } + const target = (event.currentTarget || event.target) as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | null; + if (!target) return field.value(); + if (type === "checkbox") { + if (Array.isArray(field.value())) { + const optionValue = bindOptions.value ?? target.value; + const current = field.value() as unknown[]; + return ((target as HTMLInputElement).checked + ? Array.from(new Set([...current, optionValue])) + : current.filter((item) => !Object.is(item, optionValue))) as TValues[K]; + } + return Boolean((target as HTMLInputElement).checked) as TValues[K]; + } + if (type === "radio") { + if (!(target as HTMLInputElement).checked) return field.value(); + return (bindOptions.value ?? (target as HTMLInputElement).value) as TValues[K]; + } + if (type === "select-multiple") { + return Array.from((target as HTMLSelectElement).selectedOptions).map((option) => option.value) as TValues[K]; + } + if (type === "number") { + const raw = target.value; + return (raw === "" ? (undefined as any) : Number(raw)) as TValues[K]; + } + return target.value as TValues[K]; + }; + + const binding: Record = { + name: domName, + [`@${eventName}`]: (event: Event) => { + field.set(parseValue(event)); + }, + "@blur": () => { + markTouched([name]); + syncErrors(); + } + }; + + if (type === "checkbox") { + if (Array.isArray(field.value())) { + const optionValue = bindOptions.value; + binding.value = optionValue === undefined ? "" : String(optionValue); + binding[".checked"] = computed(() => (field.value() as unknown[]).some((item) => Object.is(item, optionValue))); + } else { + binding[".checked"] = computed(() => Boolean(field.value())); + binding.checked = Boolean(field.value()); + } + return binding; + } + + if (type === "radio") { + const optionValue = bindOptions.value; + binding.value = optionValue === undefined ? "" : String(optionValue); + binding[".checked"] = computed(() => Object.is(field.value(), optionValue)); + return binding; + } + + if (type === "select-multiple") { + binding[".value"] = formattedValue as any; + return binding; + } + + const stringValue = formattedValue === undefined || formattedValue === null ? "" : String(formattedValue); + binding[".value"] = stringValue; + binding.value = stringValue; + return binding; + }; + + const api: FormState = { + values, + initialValues, + errors, + touched, + dirty: computed(() => !deepEqual(values.$snapshot(), initialValues())), + valid: computed(() => Reflect.ownKeys(errors.$snapshot()).length === 0), + field(name: K): FormField { + const valueSignal = createFieldSignal(name); + return { + value: valueSignal, + error: computed(() => (errors as any)[name] || null), + touched: computed(() => Boolean((touched as any)[name])), + dirty: computed(() => !deepEqual((values as any)[name], (initialValues() as any)[name])), + bind(optionsForField?: FormBindOptions): Record { + return bind(name, optionsForField); + }, + set(next) { + return valueSignal.set(next); + }, + reset() { + valueSignal.set((initialValues.peek() as any)[name]); + delete (errors as any)[name]; + delete (touched as any)[name]; + } + }; + }, + bind, + set, + reset, + validate(): boolean { + return syncErrors(); + }, + markTouched, + submit( + handler: (snapshot: TValues, event: Event) => Promise | TResult, + submitOptions: FormStateSubmitOptions = {} + ): FormStateController { + const submitAction = action<[TValues, Event], TResult, E>(handler, submitOptions); + const onSubmit = async (event: Event): Promise => { + event.preventDefault(); + syncFromForm(event); + markTouched(); + if (!syncErrors()) return undefined; + const result = await submitAction(cloneValue(values.$snapshot()), event); + if (submitOptions.resetOnSuccess) api.reset(); + return result; + }; + + return { + state: api, + action: submitAction, + data: submitAction.data, + error: submitAction.error, + pending: submitAction.pending, + status: submitAction.status, + onSubmit, + handleSubmit(event: Event): void { + onSubmit(event).catch(() => undefined); + }, + reset(): void { + submitAction.reset(); + api.reset(); + } + }; + } + }; + + return api; +} + function html(strings: TemplateStringsArray | readonly string[], ...values: unknown[]): TemplateResult { return { isTemplateResult: true, @@ -728,7 +1269,7 @@ function html(strings: TemplateStringsArray | readonly string[], ...values: unkn } function unsafeHTML(value: string, options: UnsafeHTMLOptions = {}): UnsafeHTML { - const sanitizer = options.sanitize || configuredSanitizeHTML; + const sanitizer = resolveSanitizeHTML(options); return { isUnsafeHTML: true, value: sanitizer ? sanitizer(String(value)) : String(value) @@ -793,6 +1334,13 @@ interface Binding { name?: string; } +function bindingFromName(rawName: string): Pick { + const first = rawName[0]; + const kind = first === "@" ? "event" : first === "." ? "prop" : first === "?" ? "bool" : "attr"; + const name = kind === "attr" ? rawName : rawName.slice(1); + return { kind, name }; +} + function materializeTemplate(result: TemplateResult, doc: Document = documentOrThrow()): DocumentFragment { const bindings: Binding[] = []; let source = ""; @@ -804,9 +1352,7 @@ function materializeTemplate(result: TemplateResult, doc: Document = documentOrT const rawName = attrMatch[1]; const before = part.slice(0, part.length - attrMatch[0].length); const marker = `data-ity-bind-${i}`; - const first = rawName[0]; - const kind = first === "@" ? "event" : first === "." ? "prop" : first === "?" ? "bool" : "attr"; - const name = kind === "attr" ? rawName : rawName.slice(1); + const { kind, name } = bindingFromName(rawName); bindings.push({ index: i, kind, name }); source += `${before}${marker}=""`; } else { @@ -860,6 +1406,15 @@ function applyBindings(root: DocumentFragment, bindings: Binding[], values: read function applyElementBinding(element: HTMLElement, binding: Binding, value: unknown): void { const name = binding.name || ""; + if (binding.kind === "attr" && name === "bind" && isPlainObject(value)) { + for (const key of Reflect.ownKeys(value)) { + const entryValue = normalizeValue((value as any)[key]); + const entry = bindingFromName(String(key)); + applyElementBinding(element, { index: binding.index, ...entry }, entryValue); + } + return; + } + if (binding.kind === "event") { if (typeof value === "function") { element.addEventListener(name, value as EventListener); @@ -870,6 +1425,13 @@ function applyElementBinding(element: HTMLElement, binding: Binding, value: unkn } if (binding.kind === "prop") { + if (name === "value" && Array.isArray(value) && element.tagName === "SELECT" && (element as HTMLSelectElement).multiple) { + const selectedValues = new Set(value.map((entry) => String(entry))); + Array.from((element as HTMLSelectElement).options).forEach((option) => { + option.selected = selectedValues.has(option.value); + }); + return; + } (element as any)[name] = value; return; } @@ -943,10 +1505,12 @@ function render( ): Cleanup { const mount = resolveTarget(target); const update = () => { - const value = typeof view === "function" && !isSignal(view) - ? (view as () => TemplateValue)() - : normalizeValue(view); - withViewTransition(() => replaceChildren(mount, valueToFragment(value)), options.transition); + withConfig(options.config, () => { + const value = typeof view === "function" && !isSignal(view) + ? (view as () => TemplateValue)() + : normalizeValue(view); + withViewTransition(() => replaceChildren(mount, valueToFragment(value)), options.transition); + }); }; if (options.reactive === false) { @@ -957,11 +1521,13 @@ function render( return effect(update); } -function renderToString(view: TemplateValue | (() => TemplateValue)): string { - const value = typeof view === "function" && !isSignal(view) - ? (view as () => TemplateValue)() - : normalizeValue(view); - return valueToString(value); +function renderToString(view: TemplateValue | (() => TemplateValue), options: RenderToStringOptions = {}): string { + return withConfig(options.config, () => { + const value = typeof view === "function" && !isSignal(view) + ? (view as () => TemplateValue)() + : normalizeValue(view); + return valueToString(value); + }); } function valueToString(value: unknown): string { @@ -987,15 +1553,37 @@ function templateToString(result: TemplateResult): string { if (attrMatch) { const rawName = attrMatch[1]; const before = part.slice(0, part.length - attrMatch[0].length); - const first = rawName[0]; - const kind = first === "@" ? "event" : first === "." ? "prop" : first === "?" ? "bool" : "attr"; - const name = kind === "attr" ? rawName : rawName.slice(1); + const { kind, name } = bindingFromName(rawName); + if (kind === "attr" && name === "bind" && isPlainObject(value)) { + const serialized: string[] = []; + for (const key of Reflect.ownKeys(value)) { + const entryValue = normalizeValue((value as any)[key]); + const entry = bindingFromName(String(key)); + const entryName = entry.name || ""; + if (entry.kind === "event" || entryValue === false || entryValue === null || entryValue === undefined) continue; + if (entry.kind === "bool") { + if (entryValue) serialized.push(entryName); + continue; + } + if (entry.kind === "prop") { + if (entryName === "value") { + serialized.push(`value="${escapeAttribute(String(entryValue))}"`); + } else if ((entryName === "checked" || entryName === "selected") && entryValue) { + serialized.push(entryName); + } + continue; + } + serialized.push(`${entryName}="${escapeAttribute(stringifyAttribute(entryName, entryValue))}"`); + } + source += serialized.length ? `${before}${serialized.join(" ")}` : before; + continue; + } if (kind === "event" || kind === "prop" || value === false || value === null || value === undefined) { source += before; } else if (kind === "bool") { source += value ? `${before}${name}` : before; } else { - source += `${before}${name}="${escapeAttribute(stringifyAttribute(name, value))}"`; + source += `${before}${name || ""}="${escapeAttribute(stringifyAttribute(name || "", value))}"`; } } else { source += part + valueToString(value); @@ -1035,6 +1623,7 @@ interface ComponentContext { host: HTMLElement; root: HTMLElement | ShadowRoot; attr(name: string): ReadonlySignal; + prop(name: string): ReadonlySignal; emit(name: string, detail?: T, options?: CustomEventInit): boolean; effect(callback: (onCleanup: (cleanup: Cleanup) => void) => void): EffectHandle; onConnected(callback: () => void): void; @@ -1047,8 +1636,10 @@ type ComponentSetup = (ctx: ComponentContext) => ComponentRender | void; interface ComponentOptions { attrs?: string[]; observedAttributes?: string[]; + props?: string[]; shadow?: boolean | ShadowRootMode | ShadowRootInit; styles?: string; + config?: ItyConfig | null; setup?: ComponentSetup; } @@ -1070,6 +1661,7 @@ function component( ? { ...maybeOptions, setup: setupOrOptions } : setupOrOptions; const attrs = definition.observedAttributes || definition.attrs || []; + const props = definition.props || []; class ItyElement extends win.HTMLElement { static get observedAttributes(): string[] { @@ -1077,6 +1669,7 @@ function component( } private attrSignals = new Map>(); + private propSignals = new Map>(); private connectedCallbacks: Cleanup[] = []; private disconnectedCallbacks: Cleanup[] = []; private effectRecords: Array<{ @@ -1093,6 +1686,7 @@ function component( connectedCallback(): void { this.ensureMount(); + for (const prop of props) this.upgradeProperty(prop); if (!this.initialized) { this.initialized = true; const ctx = this.createContext(); @@ -1152,7 +1746,10 @@ function component( private startRender(): void { if (this.renderCleanup || this.renderOutput === undefined) return; - this.renderCleanup = render(this.renderOutput, this.renderTarget!, { transition: false }); + this.renderCleanup = render(this.renderOutput, this.renderTarget!, { + transition: false, + config: definition.config + }); } private startEffects(): void { @@ -1170,11 +1767,26 @@ function component( return this.attrSignals.get(name)!; } + private ensurePropSignal(name: string): Signal { + if (!this.propSignals.has(name)) { + this.propSignals.set(name, signal(undefined as unknown) as Signal); + } + return this.propSignals.get(name)! as Signal; + } + + private upgradeProperty(name: string): void { + if (!hasOwn(this, name)) return; + const value = (this as any)[name]; + delete (this as any)[name]; + (this as any)[name] = value; + } + private createContext(): ComponentContext { return { host: this, root: this.mount!, attr: (name) => this.ensureAttrSignal(name), + prop: (name: string) => this.ensurePropSignal(name), emit: (name, detail, options = {}) => this.dispatchEvent(new CustomEvent(name, { bubbles: true, composed: true, @@ -1203,6 +1815,19 @@ function component( } } + for (const prop of props) { + Object.defineProperty(ItyElement.prototype, prop, { + configurable: true, + enumerable: true, + get(this: any) { + return this.ensurePropSignal(prop).peek(); + }, + set(this: any, value: unknown) { + this.ensurePropSignal(prop).set(typeof value === "function" ? (() => value) as any : value); + } + }); + } + win.customElements.define(name, ItyElement); return ItyElement; } @@ -1836,7 +2461,7 @@ class Router { constructor(options: RouterOptions = {}) { this.base = options.base || "/"; - this.linkSelector = options.linkSelector || "a[data-ity-link]"; + this.linkSelector = options.linkSelector || "a[href]"; this.transition = Boolean(options.transition); this.notFound = options.notFound; if (options.autoStart !== false) this.start(); @@ -1872,6 +2497,30 @@ class Router { withViewTransition(update, options.transition ?? this.transition); } + href(path: string): string { + return withBasePath(path, this.base); + } + + link(path: string, attrs: Record = {}): Record { + const previousClick = attrs["@click"] as ((event: Event) => void) | undefined; + const href = this.href(path); + return { + ...attrs, + href, + "@click": (event: Event) => { + previousClick?.(event); + const currentTarget = event.currentTarget as HTMLAnchorElement | null; + const anchor = currentTarget && typeof (currentTarget as any).matches === "function" && currentTarget.matches(this.linkSelector) + ? currentTarget + : null; + const url = this.resolveNavigationURL(event, anchor, href); + if (!url) return; + event.preventDefault(); + this.navigate(`${url.pathname}${url.search}${url.hash}`); + } + }; + } + start(): void { const win = getWindow(); const doc = getDocument(); @@ -1946,14 +2595,9 @@ class Router { } private handleLinkClick(event: Event): void { - const target = event.target as HTMLElement | null; - const anchor = target?.closest?.(this.linkSelector) as HTMLAnchorElement | null; - if (!anchor || anchor.target || anchor.hasAttribute("download")) return; - const win = getWindow(); - if (!win) return; - const url = new URL(anchor.href, win.location.href); - if (url.origin !== win.location.origin) return; - if (stripBasePath(url.pathname, this.base) === null) return; + const anchor = this.findAnchor(event); + const url = this.resolveNavigationURL(event, anchor); + if (!url) return; event.preventDefault(); this.navigate(`${url.pathname}${url.search}${url.hash}`); } @@ -1977,6 +2621,36 @@ class Router { this.routeCleanup = undefined; cleanup(); } + + private resolveNavigationURL(event: Event, anchor: HTMLAnchorElement | null, fallbackHref?: string): URL | null { + const mouseEvent = event as MouseEvent; + if (event.defaultPrevented) return null; + if (typeof mouseEvent.button === "number" && mouseEvent.button !== 0) return null; + if (mouseEvent.metaKey || mouseEvent.ctrlKey || mouseEvent.shiftKey || mouseEvent.altKey) return null; + if (anchor && ((anchor.target && anchor.target !== "_self") || anchor.hasAttribute("download"))) return null; + const win = getWindow(); + if (!win) return null; + const href = anchor?.getAttribute("href") ?? fallbackHref; + if (!href || /^(mailto|tel):/i.test(href)) return null; + const url = new URL(anchor?.href || href, win.location.href); + if (url.origin !== win.location.origin) return null; + if (stripBasePath(url.pathname, this.base) === null) return null; + return url; + } + + private findAnchor(event: Event): HTMLAnchorElement | null { + const win = getWindow(); + const fromPath = typeof (event as any).composedPath === "function" + ? ((event as any).composedPath() as EventTarget[]) + : []; + for (const entry of fromPath) { + if (!entry || !(entry as any).matches) continue; + const element = entry as HTMLElement; + if (element.matches(this.linkSelector)) return element as HTMLAnchorElement; + } + const target = event.target as HTMLElement | null; + return target?.closest?.(this.linkSelector) as HTMLAnchorElement | null; + } } function createRouteRecord(pattern: string, handler: RouteHandler): RouteRecord { @@ -2101,7 +2775,8 @@ function route(pattern: string, handler: RouteHandler): Router { } const Ity = { - version: "2.1.0", + version: "2.2.0", + createConfig, configure, signal, computed, @@ -2114,6 +2789,7 @@ const Ity = { resource, action, form, + formState, html, unsafeHTML, render, @@ -2157,10 +2833,12 @@ export { batch, component, configure, + createConfig, computed, effect, action, form, + formState, html, isSignal, onDOMReady, @@ -2181,12 +2859,19 @@ export type { ComponentContext, ComponentOptions, EffectHandle, + FormBindOptions, FormController, + FormField, FormOptions, + FormState, + FormStateController, + FormStateOptions, + FormStateSubmitOptions, HTMLSanitizer, ItyConfig, ReadonlySignal, RenderOptions, + RenderToStringOptions, Resource, ResourceContext, ResourceOptions, diff --git a/MIGRATION.md b/MIGRATION.md index bcbe67e..1773159 100644 --- a/MIGRATION.md +++ b/MIGRATION.md @@ -1,13 +1,13 @@ # Ity Migration Guide -This guide covers upgrading older Ity applications to Ity 2.1.0. +This guide covers upgrading older Ity applications to Ity 2.2.0. Ity 2 keeps the original goal of a tiny dependency-free browser app library, but the primary programming model is now reactive and platform-native. The V1 MVC classes still ship for compatibility, so migration can be incremental instead of a rewrite. ## Install ```bash -npm install ity@^2.1.0 +npm install ity@^2.2.0 ``` ```ts @@ -23,7 +23,7 @@ Browser builds remain available through `dist/ity.js` and `dist/ity.min.js`. - Dynamic template values are text-safe by default. HTML string parsing must be explicit through `unsafeHTML`. - Components are native custom elements through `component()`. - Routing is handled by `Router` and `route()`, with base-path support, route cleanup, same-origin link interception, and URLPattern fallback. -- Async UI state can use `resource`, `action`, and `form`. +- Async UI state can use `resource`, `action`, `form`, and `formState`. - V1 `Application`, `Model`, `Collection`, `View`, and `SelectorObject` remain available. ## V1 MVC To V2 Reactivity @@ -88,7 +88,7 @@ delete state.user; const snapshot = state.$snapshot(); ``` -In 2.1.0, `store` tracks structural changes. Effects and subscribers that read snapshots are notified when keys are added or deleted, not just when existing values change. +In 2.1+, `store` tracks structural changes. Effects and subscribers that read snapshots are notified when keys are added or deleted, not just when existing values change. ## Template Safety @@ -113,19 +113,24 @@ Ity.html`
${Ity.unsafeHTML(trustedHtml)}
`; If your app accepts rich text from users, configure a sanitizer at the trust boundary: ```ts -Ity.configure({ +const htmlPolicy = Ity.createConfig({ sanitizeHTML(value) { return DOMPurify.sanitize(value); } }); + +Ity.render(view, "#app", { config: htmlPolicy }); ``` -Per-call sanitizers override the global sanitizer: +Per-call sanitizers override any scoped or global sanitizer: ```ts Ity.unsafeHTML(value, { sanitize: customSanitize }); ``` +`Ity.configure({ sanitizeHTML })` still exists for process-wide setup, but +`createConfig()` is the better fit for multi-app pages, tests, and SSR. + Ity does not bundle a sanitizer because sanitizer policy is application-specific and many projects already standardize on one. ## Async Data @@ -182,6 +187,41 @@ Ity.render(() => Ity.html` `, "#app"); ``` +Use `formState` when the form needs field binding, validation, dirty tracking, +or named draft state: + +```ts +const draft = Ity.formState({ + title: "", + ownerId: "ava", + urgent: false +}, { + validators: { + title(value) { + return value.trim() ? null : "Title is required."; + } + } +}); + +const save = draft.submit(async (values) => { + return fetch("/tasks", { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify(values) + }); +}); + +Ity.render(() => Ity.html` +
+ + +
+`, "#app"); +``` + +`action.run()`, `action.with()`, `action.from()`, and `form.handleSubmit()` are +also new in 2.2.0 for direct DOM event wiring without unhandled rejections. + ## Router Migration V2 routing uses explicit route registration: @@ -200,13 +240,15 @@ router.add("/users/:id", (params, ctx) => { Route handlers may return a cleanup function. The cleanup runs before the next route, when the active route is removed, and when the router stops. -Links opt into client-side navigation with `data-ity-link`: +Links can now opt into router-managed navigation with `router.link()`: -```html -User 42 +```ts +Ity.html`User 42`; ``` -`Router` only intercepts same-origin URLs inside its configured base path. +Plain same-origin anchors inside the router base path are still intercepted at +the document level. `router.link()` is the better fit for templates, base-path +authoring, and shadow DOM. ## Components @@ -231,9 +273,22 @@ Ity.component("user-card", { Component render effects and `ctx.effect()` handlers are disposed when the element disconnects and restarted when it reconnects. This prevents stale subscriptions while preserving component state. +In 2.2.0, components can also declare structured props: + +```ts +Ity.component("user-card", { + props: ["user"], + shadow: true, + setup(ctx) { + const user = ctx.prop<{ name: string }>("user"); + return () => Ity.html`

${user()?.name || "Unknown"}

`; + } +}); +``` + ## Packaging Notes -Ity 2.1.0 publishes: +Ity 2.2.0 publishes: - ESM: `dist/ity.esm.mjs` and `dist/ity.esm.js`. - CommonJS: `dist/ity.cjs.js`. @@ -245,8 +300,9 @@ The package `exports` map supports ESM, CommonJS, browser-aware bundlers, and `i ## Recommended Upgrade Path -1. Upgrade to Ity 2.1.0 and run the existing test suite without changing application code. +1. Upgrade to Ity 2.2.0 and run the existing test suite without changing application code. 2. Replace manual HTML string rendering with `html` templates at active maintenance boundaries. 3. Introduce signals for new state and bridge old models through their `state` signals. -4. Move async screens to `resource`, submit handlers to `action`, and forms to `form`. -5. Convert route entry points to return cleanup functions, especially if they mount renders, subscribe to signals, or start network work. +4. Move async screens to `resource`, submit handlers to `action`, and complex forms to `formState`. +5. Convert route links to `router.link()` where base paths or shadow DOM are involved. +6. Convert route entry points to return cleanup functions, especially if they mount renders, subscribe to signals, or start network work. diff --git a/README.md b/README.md index 066fc4c..b68305f 100644 --- a/README.md +++ b/README.md @@ -24,24 +24,25 @@ still included as a compatibility layer. * V1-compatible `Model`, `Collection`, `View`, `Application`, and `SelectorObject`. -## What's New In 2.1.0 - -Ity 2.1.0 consolidates the next production layer on top of the V2 kernel: - -* `resource()` for cancellable async reads with loading, error, status, refresh, - abort, and optimistic mutation state. -* `action()` for async mutations with pending counts, success/error state, and a - callable submit API. -* `form()` for progressive form submission with `FormData`, reset-on-success, - and the same state model as actions. -* `configure({ sanitizeHTML })` and per-call `unsafeHTML(..., { sanitize })` - hooks for application-owned HTML sanitization. -* Structural store reactivity, so snapshot subscribers rerun when keys are added - or deleted. -* Router base-path handling and route/not-found cleanup semantics. -* Reconnect-safe component render effects and `ctx.effect()` lifecycles. -* Package export refinements for ESM, CommonJS, browser bundles, and - TypeScript declarations. +## What's New In 2.2.0 + +Ity 2.2.0 turns the V2 kernel into a more complete application layer: + +* `formState()` for field binding, dirty/touched tracking, validation, reset, + and validated submits. +* `createConfig()` plus scoped `render(..., { config })` and + `renderToString(..., { config })` so HTML sanitization can be app-local instead + of global-only. +* `action.run()`, `action.with()`, `action.from()`, and `form.handleSubmit()` + for safer direct DOM event wiring. +* `component()` props with `ctx.prop(name)` so custom elements can consume rich + structured inputs, not just attributes. +* `router.link(path)` as a full bindable link object with base-aware `href` and + click handling that also works inside shadow DOM. +* Form submits now synchronize the current form controls before validation, so + programmatic fills and restored browser values do not drift from form state. +* A first-class examples runner via `npm run examples:serve` and a new + [Examples/index.html](Examples/index.html) launcher. ## Installation @@ -56,6 +57,23 @@ import Ity, { signal, computed, html, render } from "ity"; The package ships ESM, CommonJS, browser IIFE, minified IIFE, source maps, and TypeScript declarations. +## Examples + +The repository includes small focused demos plus a deeper production-style app: + +* [Examples/index.html](Examples/index.html) +* [Examples/Calculator/index.html](Examples/Calculator/index.html) +* [Examples/Collection/index.html](Examples/Collection/index.html) +* [Examples/Router/index.html](Examples/Router/index.html) +* [Examples/OperationsWorkbench/index.html](Examples/OperationsWorkbench/index.html): a local-first operations application that exercises `resource`, `action`, `formState`, `store`, `Router`, `component`, `unsafeHTML`, and `renderToString` together. + +Run them locally with: + +```bash +npm install +npm run examples:serve +``` + ## Quick Start ```ts @@ -199,8 +217,8 @@ Ity.render(() => Ity.html` `, "#app"); ``` -Actions expose `data`, `error`, `pending`, `pendingCount`, `status`, `submit()`, -and `reset()`. +Actions expose `data`, `error`, `pending`, `pendingCount`, `status`, +`submit()`, `run()`, `with()`, `from()`, and `reset()`. ### `form` @@ -225,6 +243,51 @@ Ity.render(() => Ity.html` `, "#app"); ``` +For direct DOM event wiring that should stay inside the controller error model, +prefer `signup.handleSubmit` over `signup.onSubmit`. + +### `formState` + +`formState()` adds field-level state on top of native forms. + +```ts +const draft = Ity.formState({ + title: "", + ownerId: "ava", + urgent: false +}, { + validators: { + title(value) { + return value.trim() ? null : "Title is required."; + } + } +}); + +const saveDraft = draft.submit(async (values) => { + return fetch("/tasks", { + method: "POST", + headers: { "content-type": "application/json" }, + body: JSON.stringify(values) + }); +}); + +Ity.render(() => Ity.html` +
+ + + + ${draft.errors.title && Ity.html`

${draft.errors.title}

`} +
+`, "#app"); +``` + +`formState()` exposes `values`, `initialValues`, `errors`, `touched`, `dirty`, +`valid`, `field(name)`, `bind(name)`, `set()`, `reset()`, `validate()`, +`markTouched()`, and `submit()`. + ## HTML Templates `html` creates a template result. Use `render` to mount it. @@ -266,21 +329,26 @@ Only pass trusted content to `unsafeHTML`. If your application allows rich HTML from a less trusted source, wire in your sanitizer: ```ts -Ity.configure({ +const htmlPolicy = Ity.createConfig({ sanitizeHTML(value) { return DOMPurify.sanitize(value); } }); -Ity.html`
${Ity.unsafeHTML(userProvidedHtml)}
`; +Ity.render(() => Ity.html` +
${Ity.unsafeHTML(userProvidedHtml)}
+`, "#app", { config: htmlPolicy }); ``` -You can also sanitize one boundary without changing global configuration: +You can still sanitize one boundary without changing configuration: ```ts Ity.unsafeHTML(markdownHtml, { sanitize: sanitizeMarkdownOutput }); ``` +`Ity.configure({ sanitizeHTML })` still exists for process-wide setup, but +`createConfig()` is the better fit for multi-app pages, tests, and SSR. + Ity does not bundle a sanitizer. Sanitization policy depends on the content source and threat model, and most production apps already standardize that choice separately. @@ -347,10 +415,24 @@ Component context: * `ctx.host`: the custom element instance. * `ctx.root`: the shadow root or host render root. * `ctx.attr(name)`: a signal for an observed attribute. +* `ctx.prop(name)`: a signal for a declared component property. * `ctx.emit(name, detail, options)`: dispatch a composed bubbling custom event. * `ctx.effect(fn)`: an effect that is disposed on disconnect. * `ctx.onConnected(fn)` and `ctx.onDisconnected(fn)`: lifecycle hooks. +Structured props are declared with `props`: + +```ts +Ity.component("user-card", { + props: ["user"], + shadow: true, + setup(ctx) { + const user = ctx.prop<{ name: string }>("user"); + return () => Ity.html`

${user()?.name || "Unknown"}

`; + } +}); +``` + If a tag has already been defined, `component()` returns the existing constructor instead of throwing. @@ -376,14 +458,25 @@ The router: * Falls back to a small internal matcher for `:param` and `*` segments. * Parses query and hash params. * Exposes `router.current` as a signal. -* Handles same-origin links matching `a[data-ity-link]`. +* Intercepts same-origin in-base links from the document and composes bindable + links with `router.link(path)`. * Honors `base` for matching, navigation, link interception, and Navigation API events. * Intercepts same-origin Navigation API events when the API is available. * Supports `navigate(path, { replace, transition })`. +* Supports `href(path)` and `link(path, attrs)` helpers for template authoring. * Supports `start()` and `stop()`. * Runs cleanup functions returned from route and `notFound` handlers. +`router.link()` is the preferred way to author links in templates and custom +elements: + +```ts +const router = new Ity.Router({ base: "/app" }); + +Ity.html`User 42`; +``` + Route cleanup is useful when a route mounts a render effect, starts a subscription, or owns async work: @@ -493,7 +586,7 @@ dist-bundle tests, and `npm pack --dry-run` on Node 20 and Node 22. ## Migration -See [MIGRATION.md](./MIGRATION.md) for the full V1-to-V2 and 2.1.0 migration +See [MIGRATION.md](./MIGRATION.md) for the full V1-to-V2 and 2.2.0 migration guide. ## Browser Support diff --git a/dist/ity.cjs.js b/dist/ity.cjs.js index c5aad24..851877b 100644 --- a/dist/ity.cjs.js +++ b/dist/ity.cjs.js @@ -7,6 +7,7 @@ let activeObserver = null; let batchDepth = 0; const pendingEffects = new Set(); let configuredSanitizeHTML; +const activeConfigStack = []; function getWindow() { return typeof window !== "undefined" ? window : undefined; } @@ -15,6 +16,79 @@ function getDocument() { const win = getWindow(); return (_a = win === null || win === void 0 ? void 0 : win.document) !== null && _a !== void 0 ? _a : (typeof document !== "undefined" ? document : undefined); } +function hasOwn(target, key) { + return Object.prototype.hasOwnProperty.call(target, key); +} +function isPlainObject(value) { + if (!value || typeof value !== "object") + return false; + const proto = Object.getPrototypeOf(value); + return proto === Object.prototype || proto === null; +} +function cloneValue(value) { + const cloneFn = globalThis.structuredClone; + if (typeof cloneFn === "function") + return cloneFn(value); + if (Array.isArray(value)) + return value.map((item) => cloneValue(item)); + if (isPlainObject(value)) { + const out = {}; + for (const key of Reflect.ownKeys(value)) { + out[key] = cloneValue(value[key]); + } + return out; + } + return value; +} +function deepEqual(left, right) { + if (Object.is(left, right)) + return true; + if (Array.isArray(left) && Array.isArray(right)) { + if (left.length !== right.length) + return false; + for (let i = 0; i < left.length; i += 1) { + if (!deepEqual(left[i], right[i])) + return false; + } + return true; + } + if (isPlainObject(left) && isPlainObject(right)) { + const leftKeys = Reflect.ownKeys(left); + const rightKeys = Reflect.ownKeys(right); + if (leftKeys.length !== rightKeys.length) + return false; + for (const key of leftKeys) { + if (!rightKeys.includes(key)) + return false; + if (!deepEqual(left[key], right[key])) + return false; + } + return true; + } + return false; +} +function currentConfig() { + return activeConfigStack.length ? activeConfigStack[activeConfigStack.length - 1] : null; +} +function withConfig(config, callback) { + activeConfigStack.push(config || null); + try { + return callback(); + } + finally { + activeConfigStack.pop(); + } +} +function resolveSanitizeHTML(options = {}) { + var _a; + if (options.sanitize) + return options.sanitize; + const scoped = (_a = options.config) !== null && _a !== void 0 ? _a : currentConfig(); + if (scoped && hasOwn(scoped, "sanitizeHTML")) { + return scoped.sanitizeHTML || undefined; + } + return configuredSanitizeHTML; +} function trackDependency(source) { if (!activeObserver) return; @@ -244,6 +318,13 @@ function resolveSignal(value) { function configure(options = {}) { configuredSanitizeHTML = options.sanitizeHTML || undefined; } +function createConfig(options = {}) { + var _a; + const config = {}; + if (hasOwn(options, "sanitizeHTML")) + config.sanitizeHTML = (_a = options.sanitizeHTML) !== null && _a !== void 0 ? _a : null; + return config; +} function store(initialValue) { const keys = new Set(Reflect.ownKeys(initialValue)); const signals = new Map(); @@ -476,6 +557,19 @@ function action(handler, options = {}) { const callable = ((...args) => submit(...args)); const mutableCallable = callable; mutableCallable.submit = submit; + mutableCallable.run = (...args) => { + submit(...args).catch(() => undefined); + }; + mutableCallable.with = (...args) => { + return () => { + mutableCallable.run(...args); + }; + }; + mutableCallable.from = (mapper) => { + return (event) => { + mutableCallable.run(...mapper(event)); + }; + }; mutableCallable.data = data; mutableCallable.error = error; mutableCallable.pending = pending; @@ -490,40 +584,48 @@ function action(handler, options = {}) { }; return callable; } +function getFormElementCtor(node) { + var _a, _b; + const ownerWindow = (_a = node === null || node === void 0 ? void 0 : node.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView; + return (ownerWindow === null || ownerWindow === void 0 ? void 0 : ownerWindow.HTMLFormElement) + || ((_b = getWindow()) === null || _b === void 0 ? void 0 : _b.HTMLFormElement) + || (typeof HTMLFormElement !== "undefined" ? HTMLFormElement : undefined); +} +function isFormElement(node, fallbackNode) { + const FormElement = node ? getFormElementCtor(node) : getFormElementCtor(fallbackNode || null); + return Boolean(node && FormElement && node instanceof FormElement); +} +function findFormElement(event) { + var _a; + const target = (event.currentTarget || event.target); + if (!getFormElementCtor(target)) + throw new Error("Ity.form requires HTMLFormElement support"); + if (isFormElement(target, target)) + return target; + const closest = (_a = target === null || target === void 0 ? void 0 : target.closest) === null || _a === void 0 ? void 0 : _a.call(target, "form"); + if (isFormElement(closest, target)) + return closest; + throw new Error("Ity.form onSubmit requires a form event target"); +} +function createFormDataForElement(formElement) { + var _a, _b; + const ownerWindow = (_a = formElement.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView; + const FormDataCtor = (ownerWindow === null || ownerWindow === void 0 ? void 0 : ownerWindow.FormData) + || ((_b = getWindow()) === null || _b === void 0 ? void 0 : _b.FormData) + || (typeof FormData !== "undefined" ? FormData : undefined); + if (!FormDataCtor) + throw new Error("Ity.form requires FormData support"); + return new FormDataCtor(formElement); +} function form(handler, options = {}) { const submitAction = action(handler, options); - const findForm = (event) => { - var _a; - const target = (event.currentTarget || event.target); - const getFormElementCtor = (node) => { - var _a, _b; - const ownerWindow = (_a = node === null || node === void 0 ? void 0 : node.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView; - return (ownerWindow === null || ownerWindow === void 0 ? void 0 : ownerWindow.HTMLFormElement) - || ((_b = getWindow()) === null || _b === void 0 ? void 0 : _b.HTMLFormElement) - || (typeof HTMLFormElement !== "undefined" ? HTMLFormElement : undefined); - }; - const isFormElement = (node) => { - const FormElement = node ? getFormElementCtor(node) : getFormElementCtor(target); - return Boolean(node && FormElement && node instanceof FormElement); - }; - if (!getFormElementCtor(target)) - throw new Error("Ity.form requires HTMLFormElement support"); - if (isFormElement(target)) - return target; - const closest = (_a = target === null || target === void 0 ? void 0 : target.closest) === null || _a === void 0 ? void 0 : _a.call(target, "form"); - if (isFormElement(closest)) - return closest; - throw new Error("Ity.form onSubmit requires a form event target"); - }; - const createFormData = (formElement) => { - var _a, _b; - const ownerWindow = (_a = formElement.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView; - const FormDataCtor = (ownerWindow === null || ownerWindow === void 0 ? void 0 : ownerWindow.FormData) - || ((_b = getWindow()) === null || _b === void 0 ? void 0 : _b.FormData) - || (typeof FormData !== "undefined" ? FormData : undefined); - if (!FormDataCtor) - throw new Error("Ity.form requires FormData support"); - return new FormDataCtor(formElement); + const onSubmit = async (event) => { + event.preventDefault(); + const formElement = findFormElement(event); + const result = await submitAction(createFormDataForElement(formElement), event); + if (options.resetOnSuccess) + formElement.reset(); + return result; }; return { action: submitAction, @@ -531,19 +633,360 @@ function form(handler, options = {}) { error: submitAction.error, pending: submitAction.pending, status: submitAction.status, - async onSubmit(event) { - event.preventDefault(); - const formElement = findForm(event); - const result = await submitAction(createFormData(formElement), event); - if (options.resetOnSuccess) - formElement.reset(); - return result; + onSubmit, + handleSubmit(event) { + onSubmit(event).catch(() => undefined); }, reset() { submitAction.reset(); } }; } +function replaceStoreSnapshot(target, nextValue) { + const current = target.$snapshot(); + batch(() => { + for (const key of Reflect.ownKeys(current)) { + if (!hasOwn(nextValue, key)) + delete target[key]; + } + for (const key of Reflect.ownKeys(nextValue)) { + target[key] = nextValue[key]; + } + }); +} +function formState(initialValue, options = {}) { + const values = store(cloneValue(initialValue)); + const initialValues = signal(cloneValue(initialValue)); + const errors = store({}); + const touched = store({}); + const registeredBindings = new Map(); + const allFieldNames = () => { + const names = new Set(); + Reflect.ownKeys(initialValues.peek()).forEach((key) => names.add(String(key))); + Reflect.ownKeys(values.$snapshot()).forEach((key) => names.add(String(key))); + return Array.from(names); + }; + const computeErrors = (snapshot) => { + var _a; + const out = {}; + const validators = options.validators || {}; + for (const key of allFieldNames()) { + const validator = validators[key]; + if (!validator) + continue; + const message = validator(snapshot[key], snapshot); + if (message) + out[key] = message; + } + const formErrors = (_a = options.validate) === null || _a === void 0 ? void 0 : _a.call(options, snapshot); + if (formErrors) { + for (const key of Reflect.ownKeys(formErrors)) { + const message = formErrors[key]; + if (message) + out[key] = message; + } + } + return out; + }; + const syncErrors = () => { + const nextErrors = computeErrors(values.$snapshot()); + replaceStoreSnapshot(errors, nextErrors); + return Reflect.ownKeys(nextErrors).length === 0; + }; + const markTouched = (names) => { + const keys = (names === null || names === void 0 ? void 0 : names.length) + ? names.map((name) => String(name)) + : allFieldNames(); + batch(() => { + for (const key of keys) { + touched[key] = true; + } + }); + }; + const maybeValidateTouched = () => { + const touchedSnapshot = touched.$snapshot(); + if (Reflect.ownKeys(touchedSnapshot).some((key) => Boolean(touchedSnapshot[key]))) { + syncErrors(); + } + }; + const set = (next) => { + values.$patch((current) => { + const patch = typeof next === "function" ? next(current) : next; + return patch || {}; + }); + maybeValidateTouched(); + }; + const reset = (next) => { + const base = cloneValue(next + ? { ...initialValues.peek(), ...next } + : initialValues.peek()); + initialValues.set(cloneValue(base)); + replaceStoreSnapshot(values, base); + replaceStoreSnapshot(errors, {}); + replaceStoreSnapshot(touched, {}); + }; + const createFieldSignal = (name) => { + const signalLike = function (next) { + if (arguments.length === 0) + return values[name]; + const previous = values[name]; + const resolved = typeof next === "function" + ? next(previous) + : next; + values[name] = resolved; + maybeValidateTouched(); + return resolved; + }; + signalLike.get = () => values[name]; + signalLike.peek = () => untrack(() => values[name]); + signalLike.set = (next) => signalLike(next); + signalLike.update = (updater) => signalLike(updater); + signalLike.subscribe = (callback, subscribeOptions = {}) => { + let first = true; + let previous = signalLike.peek(); + return effect(() => { + const current = values[name]; + if (first) { + first = false; + previous = current; + if (subscribeOptions.immediate) + callback(current, current); + return; + } + if (!Object.is(previous, current)) { + const prev = previous; + previous = current; + callback(current, prev); + } + }); + }; + Object.defineProperty(signalLike, "isSignal", { value: true }); + return signalLike; + }; + const registerBinding = (name, domName, type, bindOptions) => { + const fieldName = String(name); + const fieldBindings = registeredBindings.get(fieldName) || new Map(); + const signature = `${domName}|${type}|${String(bindOptions.value)}`; + fieldBindings.set(signature, { + domName, + type, + value: bindOptions.value, + parse: bindOptions.parse + }); + registeredBindings.set(fieldName, fieldBindings); + }; + const syncFromForm = (event) => { + var _a; + const NO_FORM_VALUE = Symbol("ity.formState.noValue"); + let formElement; + try { + formElement = findFormElement(event); + } + catch (_error) { + return; + } + const formData = createFormDataForElement(formElement); + const controls = Array.from(formElement.elements || []); + const patch = {}; + const resolveControlValue = (name, bindings) => { + var _a, _b, _c; + const primary = bindings[0]; + if (!primary) + return NO_FORM_VALUE; + const domName = primary.domName; + const namedControls = controls.filter((control) => control && control.name === domName); + if (primary.parse && namedControls.length) { + const parseTarget = primary.type === "radio" + ? namedControls.find((control) => Boolean(control.checked)) || namedControls[0] + : namedControls[0]; + return primary.parse(parseTarget, event); + } + if (primary.type === "checkbox") { + const currentValue = values[name]; + if (Array.isArray(currentValue) || bindings.some((binding) => binding.value !== undefined) || namedControls.length > 1) { + const selected = []; + for (const control of namedControls) { + if (!control.checked) + continue; + const matched = bindings.find((binding) => { var _a, _b, _c; return String((_b = (_a = binding.value) !== null && _a !== void 0 ? _a : control.value) !== null && _b !== void 0 ? _b : "") === String((_c = control.value) !== null && _c !== void 0 ? _c : ""); }); + selected.push((_b = (_a = matched === null || matched === void 0 ? void 0 : matched.value) !== null && _a !== void 0 ? _a : control.value) !== null && _b !== void 0 ? _b : ""); + } + return selected; + } + return formData.has(domName); + } + if (primary.type === "radio") { + return ((_c = formData.get(domName)) !== null && _c !== void 0 ? _c : values[name]); + } + if (primary.type === "select-multiple") { + const select = namedControls[0]; + if (select === null || select === void 0 ? void 0 : select.selectedOptions) { + return Array.from(select.selectedOptions).map((option) => option.value); + } + return formData.getAll(domName); + } + if (primary.type === "number") { + const raw = formData.get(domName); + return (raw === null || raw === "" ? undefined : Number(raw)); + } + const raw = formData.get(domName); + return (raw === null ? "" : raw); + }; + for (const fieldName of allFieldNames()) { + const bindings = Array.from(((_a = registeredBindings.get(fieldName)) === null || _a === void 0 ? void 0 : _a.values()) || []); + const nextValue = resolveControlValue(fieldName, bindings); + if (nextValue !== NO_FORM_VALUE) { + patch[fieldName] = nextValue; + } + } + if (Reflect.ownKeys(patch).length) { + values.$patch(() => patch); + } + }; + const bind = (name, bindOptions = {}) => { + const field = api.field(name); + const type = bindOptions.type || "text"; + const eventName = bindOptions.event + || (type === "checkbox" || type === "radio" || type === "select" || type === "select-multiple" ? "change" : "input"); + const domName = bindOptions.name || String(name); + registerBinding(name, domName, type, bindOptions); + const formattedValue = bindOptions.format ? bindOptions.format(field.value()) : field.value(); + const parseValue = (event) => { + var _a, _b; + if (bindOptions.parse) { + return bindOptions.parse((event.currentTarget || event.target), event); + } + const target = (event.currentTarget || event.target); + if (!target) + return field.value(); + if (type === "checkbox") { + if (Array.isArray(field.value())) { + const optionValue = (_a = bindOptions.value) !== null && _a !== void 0 ? _a : target.value; + const current = field.value(); + return (target.checked + ? Array.from(new Set([...current, optionValue])) + : current.filter((item) => !Object.is(item, optionValue))); + } + return Boolean(target.checked); + } + if (type === "radio") { + if (!target.checked) + return field.value(); + return ((_b = bindOptions.value) !== null && _b !== void 0 ? _b : target.value); + } + if (type === "select-multiple") { + return Array.from(target.selectedOptions).map((option) => option.value); + } + if (type === "number") { + const raw = target.value; + return (raw === "" ? undefined : Number(raw)); + } + return target.value; + }; + const binding = { + name: domName, + [`@${eventName}`]: (event) => { + field.set(parseValue(event)); + }, + "@blur": () => { + markTouched([name]); + syncErrors(); + } + }; + if (type === "checkbox") { + if (Array.isArray(field.value())) { + const optionValue = bindOptions.value; + binding.value = optionValue === undefined ? "" : String(optionValue); + binding[".checked"] = computed(() => field.value().some((item) => Object.is(item, optionValue))); + } + else { + binding[".checked"] = computed(() => Boolean(field.value())); + binding.checked = Boolean(field.value()); + } + return binding; + } + if (type === "radio") { + const optionValue = bindOptions.value; + binding.value = optionValue === undefined ? "" : String(optionValue); + binding[".checked"] = computed(() => Object.is(field.value(), optionValue)); + return binding; + } + if (type === "select-multiple") { + binding[".value"] = formattedValue; + return binding; + } + const stringValue = formattedValue === undefined || formattedValue === null ? "" : String(formattedValue); + binding[".value"] = stringValue; + binding.value = stringValue; + return binding; + }; + const api = { + values, + initialValues, + errors, + touched, + dirty: computed(() => !deepEqual(values.$snapshot(), initialValues())), + valid: computed(() => Reflect.ownKeys(errors.$snapshot()).length === 0), + field(name) { + const valueSignal = createFieldSignal(name); + return { + value: valueSignal, + error: computed(() => errors[name] || null), + touched: computed(() => Boolean(touched[name])), + dirty: computed(() => !deepEqual(values[name], initialValues()[name])), + bind(optionsForField) { + return bind(name, optionsForField); + }, + set(next) { + return valueSignal.set(next); + }, + reset() { + valueSignal.set(initialValues.peek()[name]); + delete errors[name]; + delete touched[name]; + } + }; + }, + bind, + set, + reset, + validate() { + return syncErrors(); + }, + markTouched, + submit(handler, submitOptions = {}) { + const submitAction = action(handler, submitOptions); + const onSubmit = async (event) => { + event.preventDefault(); + syncFromForm(event); + markTouched(); + if (!syncErrors()) + return undefined; + const result = await submitAction(cloneValue(values.$snapshot()), event); + if (submitOptions.resetOnSuccess) + api.reset(); + return result; + }; + return { + state: api, + action: submitAction, + data: submitAction.data, + error: submitAction.error, + pending: submitAction.pending, + status: submitAction.status, + onSubmit, + handleSubmit(event) { + onSubmit(event).catch(() => undefined); + }, + reset() { + submitAction.reset(); + api.reset(); + } + }; + } + }; + return api; +} function html(strings, ...values) { return { isTemplateResult: true, @@ -552,7 +995,7 @@ function html(strings, ...values) { }; } function unsafeHTML(value, options = {}) { - const sanitizer = options.sanitize || configuredSanitizeHTML; + const sanitizer = resolveSanitizeHTML(options); return { isUnsafeHTML: true, value: sanitizer ? sanitizer(String(value)) : String(value) @@ -606,6 +1049,12 @@ function appendValue(parent, value, doc) { } parent.appendChild(doc.createTextNode(String(value))); } +function bindingFromName(rawName) { + const first = rawName[0]; + const kind = first === "@" ? "event" : first === "." ? "prop" : first === "?" ? "bool" : "attr"; + const name = kind === "attr" ? rawName : rawName.slice(1); + return { kind, name }; +} function materializeTemplate(result, doc = documentOrThrow()) { var _a, _b; const bindings = []; @@ -617,9 +1066,7 @@ function materializeTemplate(result, doc = documentOrThrow()) { const rawName = attrMatch[1]; const before = part.slice(0, part.length - attrMatch[0].length); const marker = `data-ity-bind-${i}`; - const first = rawName[0]; - const kind = first === "@" ? "event" : first === "." ? "prop" : first === "?" ? "bool" : "attr"; - const name = kind === "attr" ? rawName : rawName.slice(1); + const { kind, name } = bindingFromName(rawName); bindings.push({ index: i, kind, name }); source += `${before}${marker}=""`; } @@ -669,6 +1116,14 @@ function applyBindings(root, bindings, values, doc) { } function applyElementBinding(element, binding, value) { const name = binding.name || ""; + if (binding.kind === "attr" && name === "bind" && isPlainObject(value)) { + for (const key of Reflect.ownKeys(value)) { + const entryValue = normalizeValue(value[key]); + const entry = bindingFromName(String(key)); + applyElementBinding(element, { index: binding.index, ...entry }, entryValue); + } + return; + } if (binding.kind === "event") { if (typeof value === "function") { element.addEventListener(name, value); @@ -679,6 +1134,13 @@ function applyElementBinding(element, binding, value) { return; } if (binding.kind === "prop") { + if (name === "value" && Array.isArray(value) && element.tagName === "SELECT" && element.multiple) { + const selectedValues = new Set(value.map((entry) => String(entry))); + Array.from(element.options).forEach((option) => { + option.selected = selectedValues.has(option.value); + }); + return; + } element[name] = value; return; } @@ -742,10 +1204,12 @@ function withViewTransition(update, enabled) { function render(view, target, options = {}) { const mount = resolveTarget(target); const update = () => { - const value = typeof view === "function" && !isSignal(view) - ? view() - : normalizeValue(view); - withViewTransition(() => replaceChildren(mount, valueToFragment(value)), options.transition); + withConfig(options.config, () => { + const value = typeof view === "function" && !isSignal(view) + ? view() + : normalizeValue(view); + withViewTransition(() => replaceChildren(mount, valueToFragment(value)), options.transition); + }); }; if (options.reactive === false) { update(); @@ -753,11 +1217,13 @@ function render(view, target, options = {}) { } return effect(update); } -function renderToString(view) { - const value = typeof view === "function" && !isSignal(view) - ? view() - : normalizeValue(view); - return valueToString(value); +function renderToString(view, options = {}) { + return withConfig(options.config, () => { + const value = typeof view === "function" && !isSignal(view) + ? view() + : normalizeValue(view); + return valueToString(value); + }); } function valueToString(value) { value = normalizeValue(value); @@ -787,9 +1253,34 @@ function templateToString(result) { if (attrMatch) { const rawName = attrMatch[1]; const before = part.slice(0, part.length - attrMatch[0].length); - const first = rawName[0]; - const kind = first === "@" ? "event" : first === "." ? "prop" : first === "?" ? "bool" : "attr"; - const name = kind === "attr" ? rawName : rawName.slice(1); + const { kind, name } = bindingFromName(rawName); + if (kind === "attr" && name === "bind" && isPlainObject(value)) { + const serialized = []; + for (const key of Reflect.ownKeys(value)) { + const entryValue = normalizeValue(value[key]); + const entry = bindingFromName(String(key)); + const entryName = entry.name || ""; + if (entry.kind === "event" || entryValue === false || entryValue === null || entryValue === undefined) + continue; + if (entry.kind === "bool") { + if (entryValue) + serialized.push(entryName); + continue; + } + if (entry.kind === "prop") { + if (entryName === "value") { + serialized.push(`value="${escapeAttribute(String(entryValue))}"`); + } + else if ((entryName === "checked" || entryName === "selected") && entryValue) { + serialized.push(entryName); + } + continue; + } + serialized.push(`${entryName}="${escapeAttribute(stringifyAttribute(entryName, entryValue))}"`); + } + source += serialized.length ? `${before}${serialized.join(" ")}` : before; + continue; + } if (kind === "event" || kind === "prop" || value === false || value === null || value === undefined) { source += before; } @@ -797,7 +1288,7 @@ function templateToString(result) { source += value ? `${before}${name}` : before; } else { - source += `${before}${name}="${escapeAttribute(stringifyAttribute(name, value))}"`; + source += `${before}${name || ""}="${escapeAttribute(stringifyAttribute(name || "", value))}"`; } } else { @@ -843,10 +1334,12 @@ function component(name, setupOrOptions, maybeOptions = {}) { ? { ...maybeOptions, setup: setupOrOptions } : setupOrOptions; const attrs = definition.observedAttributes || definition.attrs || []; + const props = definition.props || []; class ItyElement extends win.HTMLElement { constructor() { super(...arguments); this.attrSignals = new Map(); + this.propSignals = new Map(); this.connectedCallbacks = []; this.disconnectedCallbacks = []; this.effectRecords = []; @@ -859,6 +1352,8 @@ function component(name, setupOrOptions, maybeOptions = {}) { connectedCallback() { var _a; this.ensureMount(); + for (const prop of props) + this.upgradeProperty(prop); if (!this.initialized) { this.initialized = true; const ctx = this.createContext(); @@ -920,7 +1415,10 @@ function component(name, setupOrOptions, maybeOptions = {}) { startRender() { if (this.renderCleanup || this.renderOutput === undefined) return; - this.renderCleanup = render(this.renderOutput, this.renderTarget, { transition: false }); + this.renderCleanup = render(this.renderOutput, this.renderTarget, { + transition: false, + config: definition.config + }); } startEffects() { for (const record of this.effectRecords) { @@ -935,11 +1433,25 @@ function component(name, setupOrOptions, maybeOptions = {}) { } return this.attrSignals.get(name); } + ensurePropSignal(name) { + if (!this.propSignals.has(name)) { + this.propSignals.set(name, signal(undefined)); + } + return this.propSignals.get(name); + } + upgradeProperty(name) { + if (!hasOwn(this, name)) + return; + const value = this[name]; + delete this[name]; + this[name] = value; + } createContext() { return { host: this, root: this.mount, attr: (name) => this.ensureAttrSignal(name), + prop: (name) => this.ensurePropSignal(name), emit: (name, detail, options = {}) => this.dispatchEvent(new CustomEvent(name, { bubbles: true, composed: true, @@ -969,6 +1481,18 @@ function component(name, setupOrOptions, maybeOptions = {}) { }; } } + for (const prop of props) { + Object.defineProperty(ItyElement.prototype, prop, { + configurable: true, + enumerable: true, + get() { + return this.ensurePropSignal(prop).peek(); + }, + set(value) { + this.ensurePropSignal(prop).set(typeof value === "function" ? (() => value) : value); + } + }); + } win.customElements.define(name, ItyElement); return ItyElement; } @@ -1514,7 +2038,7 @@ class Router { this.navigationListener = (event) => this.handleNavigationEvent(event); this.current = signal(null); this.base = options.base || "/"; - this.linkSelector = options.linkSelector || "a[data-ity-link]"; + this.linkSelector = options.linkSelector || "a[href]"; this.transition = Boolean(options.transition); this.notFound = options.notFound; if (options.autoStart !== false) @@ -1549,6 +2073,29 @@ class Router { }; withViewTransition(update, (_a = options.transition) !== null && _a !== void 0 ? _a : this.transition); } + href(path) { + return withBasePath(path, this.base); + } + link(path, attrs = {}) { + const previousClick = attrs["@click"]; + const href = this.href(path); + return { + ...attrs, + href, + "@click": (event) => { + previousClick === null || previousClick === void 0 ? void 0 : previousClick(event); + const currentTarget = event.currentTarget; + const anchor = currentTarget && typeof currentTarget.matches === "function" && currentTarget.matches(this.linkSelector) + ? currentTarget + : null; + const url = this.resolveNavigationURL(event, anchor, href); + if (!url) + return; + event.preventDefault(); + this.navigate(`${url.pathname}${url.search}${url.hash}`); + } + }; + } start() { var _a, _b; const win = getWindow(); @@ -1628,18 +2175,9 @@ class Router { return null; } handleLinkClick(event) { - var _a; - const target = event.target; - const anchor = (_a = target === null || target === void 0 ? void 0 : target.closest) === null || _a === void 0 ? void 0 : _a.call(target, this.linkSelector); - if (!anchor || anchor.target || anchor.hasAttribute("download")) - return; - const win = getWindow(); - if (!win) - return; - const url = new URL(anchor.href, win.location.href); - if (url.origin !== win.location.origin) - return; - if (stripBasePath(url.pathname, this.base) === null) + const anchor = this.findAnchor(event); + const url = this.resolveNavigationURL(event, anchor); + if (!url) return; event.preventDefault(); this.navigate(`${url.pathname}${url.search}${url.hash}`); @@ -1667,6 +2205,45 @@ class Router { this.routeCleanup = undefined; cleanup(); } + resolveNavigationURL(event, anchor, fallbackHref) { + var _a; + const mouseEvent = event; + if (event.defaultPrevented) + return null; + if (typeof mouseEvent.button === "number" && mouseEvent.button !== 0) + return null; + if (mouseEvent.metaKey || mouseEvent.ctrlKey || mouseEvent.shiftKey || mouseEvent.altKey) + return null; + if (anchor && ((anchor.target && anchor.target !== "_self") || anchor.hasAttribute("download"))) + return null; + const win = getWindow(); + if (!win) + return null; + const href = (_a = anchor === null || anchor === void 0 ? void 0 : anchor.getAttribute("href")) !== null && _a !== void 0 ? _a : fallbackHref; + if (!href || /^(mailto|tel):/i.test(href)) + return null; + const url = new URL((anchor === null || anchor === void 0 ? void 0 : anchor.href) || href, win.location.href); + if (url.origin !== win.location.origin) + return null; + if (stripBasePath(url.pathname, this.base) === null) + return null; + return url; + } + findAnchor(event) { + var _a; + const fromPath = typeof event.composedPath === "function" + ? event.composedPath() + : []; + for (const entry of fromPath) { + if (!entry || !entry.matches) + continue; + const element = entry; + if (element.matches(this.linkSelector)) + return element; + } + const target = event.target; + return (_a = target === null || target === void 0 ? void 0 : target.closest) === null || _a === void 0 ? void 0 : _a.call(target, this.linkSelector); + } } function createRouteRecord(pattern, handler) { const win = getWindow(); @@ -1784,7 +2361,8 @@ function route(pattern, handler) { return router; } const Ity = { - version: "2.1.0", + version: "2.2.0", + createConfig, configure, signal, computed, @@ -1797,6 +2375,7 @@ const Ity = { resource, action, form, + formState, html, unsafeHTML, render, @@ -1840,9 +2419,11 @@ exports.batch = batch; exports.component = component; exports.computed = computed; exports.configure = configure; +exports.createConfig = createConfig; exports.default = Ity; exports.effect = effect; exports.form = form; +exports.formState = formState; exports.html = html; exports.isSignal = isSignal; exports.onDOMReady = onDOMReady; diff --git a/dist/ity.cjs.js.map b/dist/ity.cjs.js.map index b9a244d..31f219e 100644 --- a/dist/ity.cjs.js.map +++ b/dist/ity.cjs.js.map @@ -1 +1 @@ -{"version":3,"file":"ity.cjs.js","sources":["../Ity.ts"],"sourcesContent":["// Ity.ts 2.1.0\n// (c) 2026 Dominic Cocchiarella\n// Tiny dependency-free reactive app kernel with V1 MVC compatibility.\ndeclare var define: any;\ndeclare var module: any;\n\ntype Cleanup = () => void;\ntype Equality = (prev: T, next: T) => boolean;\ntype Subscriber = (value: T, previous: T) => void;\ntype MaybeSignal = T | ReadonlySignal;\ntype TemplateValue =\n | TemplateResult\n | UnsafeHTML\n | Node\n | string\n | number\n | boolean\n | null\n | undefined\n | TemplateValue[]\n | ReadonlySignal;\n\ninterface ReadonlySignal {\n (): T;\n get(): T;\n peek(): T;\n subscribe(callback: Subscriber, options?: { immediate?: boolean }): Cleanup;\n readonly isSignal: true;\n}\n\ninterface Signal extends ReadonlySignal {\n (next: T | ((previous: T) => T)): T;\n set(next: T | ((previous: T) => T)): T;\n update(updater: (previous: T) => T): T;\n}\n\ninterface ReactiveSource {\n observers: Set;\n}\n\ninterface ReactiveObserver {\n deps: Set;\n markDirty(): void;\n}\n\ninterface ComputedOptions {\n equals?: Equality;\n}\n\ninterface SignalOptions {\n equals?: Equality;\n name?: string;\n}\n\ninterface EffectHandle {\n (): void;\n dispose(): void;\n}\n\ninterface TemplateResult {\n readonly isTemplateResult: true;\n readonly strings: readonly string[];\n readonly values: readonly unknown[];\n}\n\ninterface UnsafeHTML {\n readonly isUnsafeHTML: true;\n readonly value: string;\n}\n\ntype HTMLSanitizer = (value: string) => string;\n\ninterface UnsafeHTMLOptions {\n sanitize?: HTMLSanitizer;\n}\n\ninterface ItyConfig {\n sanitizeHTML?: HTMLSanitizer | null;\n}\n\ninterface RenderOptions {\n reactive?: boolean;\n transition?: boolean;\n}\n\ntype StoreKey = string | symbol;\n\ninterface StoreApi> {\n $patch(patch: Partial | ((current: T) => Partial | void)): void;\n $snapshot(): T;\n $subscribe(callback: (value: T) => void, options?: { immediate?: boolean }): Cleanup;\n}\n\ntype Store> = T & StoreApi;\n\ntype AsyncStatus = \"idle\" | \"loading\" | \"success\" | \"error\";\n\ninterface ResourceContext {\n signal: AbortSignal;\n previous: T | undefined;\n refreshId: number;\n}\n\ninterface ResourceOptions {\n initialValue?: T;\n immediate?: boolean;\n keepPrevious?: boolean;\n onSuccess?: (value: T) => void;\n onError?: (error: E) => void;\n}\n\ninterface Resource {\n readonly data: Signal;\n readonly error: Signal;\n readonly loading: ReadonlySignal;\n readonly status: ReadonlySignal;\n readonly promise: Promise | null;\n refresh(): Promise;\n mutate(value: T | undefined): void;\n abort(reason?: unknown): void;\n}\n\ninterface ActionOptions {\n onSuccess?: (value: TResult) => void;\n onError?: (error: E) => void;\n}\n\ninterface Action {\n (...args: TArgs): Promise;\n submit(...args: TArgs): Promise;\n readonly data: Signal;\n readonly error: Signal;\n readonly pending: ReadonlySignal;\n readonly pendingCount: ReadonlySignal;\n readonly status: ReadonlySignal;\n reset(): void;\n}\n\ninterface FormController {\n readonly action: Action<[FormData, Event], TResult, E>;\n readonly data: Signal;\n readonly error: Signal;\n readonly pending: ReadonlySignal;\n readonly status: ReadonlySignal;\n onSubmit(event: Event): Promise;\n reset(): void;\n}\n\ninterface FormOptions extends ActionOptions {\n resetOnSuccess?: boolean;\n}\n\nconst defaultEquals = Object.is;\nlet activeObserver: ReactiveObserver | null = null;\nlet batchDepth = 0;\nconst pendingEffects = new Set();\nlet configuredSanitizeHTML: HTMLSanitizer | undefined;\n\nfunction getWindow(): (Window & typeof globalThis) | undefined {\n return typeof window !== \"undefined\" ? window : undefined;\n}\n\nfunction getDocument(): Document | undefined {\n const win = getWindow();\n return win?.document ?? (typeof document !== \"undefined\" ? document : undefined);\n}\n\nfunction trackDependency(source: ReactiveSource): void {\n if (!activeObserver) return;\n source.observers.add(activeObserver);\n activeObserver.deps.add(source);\n}\n\nfunction cleanupDependencies(observer: ReactiveObserver): void {\n for (const dep of observer.deps) {\n dep.observers.delete(observer);\n }\n observer.deps.clear();\n}\n\nfunction notifyObservers(source: ReactiveSource): void {\n for (const observer of Array.from(source.observers)) {\n observer.markDirty();\n }\n}\n\nfunction flushEffects(): void {\n if (batchDepth > 0) return;\n while (pendingEffects.size) {\n const effects = Array.from(pendingEffects);\n pendingEffects.clear();\n for (const effect of effects) {\n effect.run();\n }\n }\n}\n\nfunction queueEffect(effect: ReactiveEffect): void {\n pendingEffects.add(effect);\n flushEffects();\n}\n\nclass SignalNode implements ReactiveSource {\n observers = new Set();\n private subscribers = new Set>();\n private value: T;\n private equals: Equality;\n\n constructor(value: T, options: SignalOptions = {}) {\n this.value = value;\n this.equals = options.equals || defaultEquals;\n }\n\n read(track = true): T {\n if (track) trackDependency(this);\n return this.value;\n }\n\n write(next: T | ((previous: T) => T)): T {\n const previous = this.value;\n const resolved = typeof next === \"function\"\n ? (next as (previous: T) => T)(previous)\n : next;\n if (this.equals(previous, resolved)) return previous;\n this.value = resolved;\n notifyObservers(this);\n for (const subscriber of Array.from(this.subscribers)) {\n subscriber(resolved, previous);\n }\n flushEffects();\n return resolved;\n }\n\n subscribe(callback: Subscriber, options: { immediate?: boolean } = {}): Cleanup {\n this.subscribers.add(callback);\n if (options.immediate) callback(this.value, this.value);\n return () => {\n this.subscribers.delete(callback);\n };\n }\n}\n\nclass ComputedNode implements ReactiveSource, ReactiveObserver {\n observers = new Set();\n deps = new Set();\n private subscribers = new Set>();\n private dirty = true;\n private initialized = false;\n private value!: T;\n private equals: Equality;\n\n constructor(private readonly getter: () => T, options: ComputedOptions = {}) {\n this.equals = options.equals || defaultEquals;\n }\n\n read(track = true): T {\n if (track) trackDependency(this);\n if (this.dirty) this.evaluate();\n return this.value;\n }\n\n markDirty(): void {\n if (this.dirty) return;\n const previous = this.value;\n this.dirty = true;\n notifyObservers(this);\n if (this.subscribers.size) {\n const next = this.read(false);\n if (!this.equals(previous, next)) {\n for (const subscriber of Array.from(this.subscribers)) {\n subscriber(next, previous);\n }\n }\n }\n }\n\n subscribe(callback: Subscriber, options: { immediate?: boolean } = {}): Cleanup {\n this.subscribers.add(callback);\n if (options.immediate) {\n const current = this.read(false);\n callback(current, current);\n }\n return () => {\n this.subscribers.delete(callback);\n };\n }\n\n private evaluate(): void {\n cleanupDependencies(this);\n const previousObserver = activeObserver;\n activeObserver = this;\n try {\n this.value = this.getter();\n this.dirty = false;\n this.initialized = true;\n } finally {\n activeObserver = previousObserver;\n }\n }\n}\n\nclass ReactiveEffect implements ReactiveObserver {\n deps = new Set();\n private disposed = false;\n private cleanup?: Cleanup;\n\n constructor(private readonly callback: (onCleanup: (cleanup: Cleanup) => void) => void) {\n this.run();\n }\n\n markDirty(): void {\n if (!this.disposed) queueEffect(this);\n }\n\n run(): void {\n if (this.disposed) return;\n cleanupDependencies(this);\n if (this.cleanup) {\n const cleanup = this.cleanup;\n this.cleanup = undefined;\n cleanup();\n }\n const previousObserver = activeObserver;\n activeObserver = this;\n try {\n this.callback((cleanup) => {\n this.cleanup = cleanup;\n });\n } finally {\n activeObserver = previousObserver;\n }\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n cleanupDependencies(this);\n if (this.cleanup) {\n const cleanup = this.cleanup;\n this.cleanup = undefined;\n cleanup();\n }\n pendingEffects.delete(this);\n }\n}\n\nfunction signal(initialValue: T, options: SignalOptions = {}): Signal {\n const node = new SignalNode(initialValue, options);\n const readWrite = function (next?: T | ((previous: T) => T)): T {\n if (arguments.length === 0) return node.read(true);\n return node.write(next as T | ((previous: T) => T));\n } as Signal;\n readWrite.get = () => node.read(true);\n readWrite.peek = () => node.read(false);\n readWrite.set = (next) => node.write(next);\n readWrite.update = (updater) => node.write(updater);\n readWrite.subscribe = (callback, subscribeOptions) => node.subscribe(callback, subscribeOptions);\n Object.defineProperty(readWrite, \"isSignal\", { value: true });\n return readWrite;\n}\n\nfunction computed(getter: () => T, options: ComputedOptions = {}): ReadonlySignal {\n const node = new ComputedNode(getter, options);\n const read = function (): T {\n return node.read(true);\n } as ReadonlySignal;\n read.get = () => node.read(true);\n read.peek = () => node.read(false);\n read.subscribe = (callback, subscribeOptions) => node.subscribe(callback, subscribeOptions);\n Object.defineProperty(read, \"isSignal\", { value: true });\n return read;\n}\n\nfunction effect(callback: (onCleanup: (cleanup: Cleanup) => void) => void): EffectHandle {\n const runner = new ReactiveEffect(callback);\n const dispose = (() => runner.dispose()) as EffectHandle;\n dispose.dispose = dispose;\n return dispose;\n}\n\nfunction batch(callback: () => T): T {\n batchDepth += 1;\n try {\n return callback();\n } finally {\n batchDepth -= 1;\n flushEffects();\n }\n}\n\nfunction untrack(callback: () => T): T {\n const previousObserver = activeObserver;\n activeObserver = null;\n try {\n return callback();\n } finally {\n activeObserver = previousObserver;\n }\n}\n\nfunction isSignal(value: unknown): value is ReadonlySignal {\n return typeof value === \"function\" && (value as any).isSignal === true;\n}\n\nfunction resolveSignal(value: MaybeSignal): T {\n return isSignal(value) ? value() : value;\n}\n\nfunction configure(options: ItyConfig = {}): void {\n configuredSanitizeHTML = options.sanitizeHTML || undefined;\n}\n\nfunction store>(initialValue: T): Store {\n const keys = new Set(Reflect.ownKeys(initialValue));\n const signals = new Map>();\n const structure = signal(0);\n\n const ensureSignal = (key: StoreKey): Signal => {\n if (!signals.has(key)) {\n signals.set(key, signal((initialValue as any)[key]));\n }\n return signals.get(key)!;\n };\n\n const bumpStructure = (): void => {\n structure.update((version) => version + 1);\n };\n\n const setKey = (key: StoreKey, value: any): void => {\n const hadKey = keys.has(key);\n if (!hadKey) keys.add(key);\n ensureSignal(key).set(value);\n if (!hadKey) bumpStructure();\n };\n\n const snapshot = (): T => {\n structure();\n const out: any = {};\n for (const key of keys) {\n out[key] = ensureSignal(key)();\n }\n return out as T;\n };\n\n const api: StoreApi = {\n $patch(patch) {\n const current = snapshot();\n const next = typeof patch === \"function\" ? patch(current) : patch;\n if (!next) return;\n batch(() => {\n for (const key of Reflect.ownKeys(next)) {\n setKey(key, (next as any)[key]);\n }\n });\n },\n $snapshot: snapshot,\n $subscribe(callback, options = {}) {\n let first = true;\n return effect(() => {\n const value = snapshot();\n if (first && !options.immediate) {\n first = false;\n return;\n }\n first = false;\n callback(value);\n });\n }\n };\n\n return new Proxy(api as Store, {\n get(target, key, receiver) {\n if (key in target) return Reflect.get(target, key, receiver);\n return ensureSignal(key)();\n },\n set(_target, key, value) {\n batch(() => {\n setKey(key, value);\n });\n return true;\n },\n deleteProperty(_target, key) {\n if (!keys.has(key)) return true;\n keys.delete(key);\n batch(() => {\n ensureSignal(key).set(undefined);\n bumpStructure();\n });\n return true;\n },\n ownKeys(target) {\n structure();\n return Array.from(new Set([...Reflect.ownKeys(target), ...keys]));\n },\n getOwnPropertyDescriptor(target, key) {\n structure();\n if (Object.prototype.hasOwnProperty.call(target, key)) {\n return { ...Reflect.getOwnPropertyDescriptor(target, key)!, enumerable: false };\n }\n if (!keys.has(key)) return undefined;\n return { enumerable: true, configurable: true };\n },\n has(target, key) {\n structure();\n return key in target || keys.has(key);\n }\n });\n}\n\nfunction resource(\n loader: (context: ResourceContext) => Promise | T,\n options: ResourceOptions = {}\n): Resource {\n const data = signal(options.initialValue);\n const error = signal(null);\n const pending = signal(false);\n const statusValue = signal(options.initialValue === undefined ? \"idle\" : \"success\");\n const loading = computed(() => pending());\n const status = computed(() => statusValue());\n const keepPrevious = options.keepPrevious !== false;\n let controller: AbortController | null = null;\n let refreshId = 0;\n let currentPromise: Promise | null = null;\n\n const api: Resource = {\n data,\n error,\n loading,\n status,\n get promise() {\n return currentPromise;\n },\n refresh() {\n refreshId += 1;\n const id = refreshId;\n if (controller) controller.abort();\n controller = new AbortController();\n const signal = controller.signal;\n const previous = data.peek();\n pending.set(true);\n statusValue.set(\"loading\");\n error.set(null);\n if (!keepPrevious) data.set(undefined);\n\n currentPromise = Promise.resolve()\n .then(() => loader({ signal, previous, refreshId: id }))\n .then((value) => {\n if (id !== refreshId || signal.aborted) return data.peek();\n data.set(value);\n error.set(null);\n statusValue.set(\"success\");\n options.onSuccess?.(value);\n return value;\n })\n .catch((err) => {\n if (id !== refreshId) return data.peek();\n error.set(err as E);\n statusValue.set(\"error\");\n options.onError?.(err as E);\n return data.peek();\n })\n .finally(() => {\n if (id === refreshId) {\n pending.set(false);\n controller = null;\n }\n });\n\n return currentPromise;\n },\n mutate(value) {\n refreshId += 1;\n if (controller) controller.abort();\n controller = null;\n currentPromise = null;\n data.set(value);\n error.set(null);\n pending.set(false);\n statusValue.set(value === undefined ? \"idle\" : \"success\");\n },\n abort(reason?: unknown) {\n if (!controller) return;\n refreshId += 1;\n controller.abort(reason);\n controller = null;\n currentPromise = null;\n pending.set(false);\n statusValue.set(data.peek() === undefined ? \"idle\" : \"success\");\n }\n };\n\n if (options.immediate !== false) {\n api.refresh();\n }\n\n return api;\n}\n\nfunction action(\n handler: (...args: TArgs) => Promise | TResult,\n options: ActionOptions = {}\n): Action {\n const data = signal(undefined);\n const error = signal(null);\n const count = signal(0);\n const statusValue = signal(\"idle\");\n const pending = computed(() => count() > 0);\n const pendingCount = computed(() => count());\n const status = computed(() => statusValue());\n let generation = 0;\n\n const submit = (...args: TArgs): Promise => {\n const runGeneration = generation;\n count.update((value) => value + 1);\n statusValue.set(\"loading\");\n error.set(null);\n\n return Promise.resolve()\n .then(() => handler(...args))\n .then((value) => {\n if (runGeneration === generation) {\n data.set(value);\n error.set(null);\n options.onSuccess?.(value);\n if (count.peek() <= 1) statusValue.set(\"success\");\n }\n return value;\n })\n .catch((err) => {\n if (runGeneration === generation) {\n error.set(err as E);\n options.onError?.(err as E);\n if (count.peek() <= 1) statusValue.set(\"error\");\n }\n throw err;\n })\n .finally(() => {\n if (runGeneration !== generation) return;\n count.update((value) => Math.max(0, value - 1));\n if (count.peek() > 0) statusValue.set(\"loading\");\n });\n };\n\n const callable = ((...args: TArgs) => submit(...args)) as Action;\n const mutableCallable = callable as Action & {\n submit: (...args: TArgs) => Promise;\n data: Signal;\n error: Signal;\n pending: ReadonlySignal;\n pendingCount: ReadonlySignal;\n status: ReadonlySignal;\n };\n mutableCallable.submit = submit;\n mutableCallable.data = data;\n mutableCallable.error = error;\n mutableCallable.pending = pending;\n mutableCallable.pendingCount = pendingCount;\n mutableCallable.status = status;\n callable.reset = () => {\n generation += 1;\n data.set(undefined);\n error.set(null);\n count.set(0);\n statusValue.set(\"idle\");\n };\n return callable;\n}\n\nfunction form(\n handler: (data: FormData, event: Event) => Promise | TResult,\n options: FormOptions = {}\n): FormController {\n const submitAction = action<[FormData, Event], TResult, E>(handler, options);\n\n const findForm = (event: Event): HTMLFormElement => {\n const target = (event.currentTarget || event.target) as Element | null;\n const getFormElementCtor = (node: Element | null): typeof HTMLFormElement | undefined => {\n const ownerWindow = node?.ownerDocument?.defaultView as (Window & typeof globalThis) | null | undefined;\n return ownerWindow?.HTMLFormElement\n || getWindow()?.HTMLFormElement\n || (typeof HTMLFormElement !== \"undefined\" ? HTMLFormElement : undefined);\n };\n const isFormElement = (node: Element | null | undefined): node is HTMLFormElement => {\n const FormElement = node ? getFormElementCtor(node) : getFormElementCtor(target);\n return Boolean(node && FormElement && node instanceof FormElement);\n };\n if (!getFormElementCtor(target)) throw new Error(\"Ity.form requires HTMLFormElement support\");\n if (isFormElement(target)) return target;\n const closest = target?.closest?.(\"form\");\n if (isFormElement(closest)) return closest;\n throw new Error(\"Ity.form onSubmit requires a form event target\");\n };\n\n const createFormData = (formElement: HTMLFormElement): FormData => {\n const ownerWindow = formElement.ownerDocument?.defaultView as (Window & typeof globalThis) | null | undefined;\n const FormDataCtor = ownerWindow?.FormData\n || getWindow()?.FormData\n || (typeof FormData !== \"undefined\" ? FormData : undefined);\n if (!FormDataCtor) throw new Error(\"Ity.form requires FormData support\");\n return new FormDataCtor(formElement);\n };\n\n return {\n action: submitAction,\n data: submitAction.data,\n error: submitAction.error,\n pending: submitAction.pending,\n status: submitAction.status,\n async onSubmit(event: Event): Promise {\n event.preventDefault();\n const formElement = findForm(event);\n const result = await submitAction(createFormData(formElement), event);\n if (options.resetOnSuccess) formElement.reset();\n return result;\n },\n reset() {\n submitAction.reset();\n }\n };\n}\n\nfunction html(strings: TemplateStringsArray | readonly string[], ...values: unknown[]): TemplateResult {\n return {\n isTemplateResult: true,\n strings: Array.from(strings),\n values\n };\n}\n\nfunction unsafeHTML(value: string, options: UnsafeHTMLOptions = {}): UnsafeHTML {\n const sanitizer = options.sanitize || configuredSanitizeHTML;\n return {\n isUnsafeHTML: true,\n value: sanitizer ? sanitizer(String(value)) : String(value)\n };\n}\n\nfunction isTemplateResult(value: unknown): value is TemplateResult {\n return !!value && typeof value === \"object\" && (value as TemplateResult).isTemplateResult === true;\n}\n\nfunction isUnsafeHTML(value: unknown): value is UnsafeHTML {\n return !!value && typeof value === \"object\" && (value as UnsafeHTML).isUnsafeHTML === true;\n}\n\nfunction isNodeLike(value: unknown): value is Node {\n return !!value && typeof value === \"object\" && typeof (value as Node).nodeType === \"number\";\n}\n\nfunction documentOrThrow(): Document {\n const doc = getDocument();\n if (!doc) throw new Error(\"Ity DOM rendering requires a document\");\n return doc;\n}\n\nfunction normalizeValue(value: unknown): unknown {\n return isSignal(value) ? value() : value;\n}\n\nfunction valueToFragment(value: unknown, doc: Document = documentOrThrow()): DocumentFragment {\n const fragment = doc.createDocumentFragment();\n appendValue(fragment, normalizeValue(value), doc);\n return fragment;\n}\n\nfunction appendValue(parent: Node, value: unknown, doc: Document): void {\n value = normalizeValue(value);\n if (value === null || value === undefined || value === false) return;\n if (Array.isArray(value)) {\n for (const item of value) appendValue(parent, item, doc);\n return;\n }\n if (isTemplateResult(value)) {\n parent.appendChild(materializeTemplate(value, doc));\n return;\n }\n if (isUnsafeHTML(value)) {\n const template = doc.createElement(\"template\");\n template.innerHTML = value.value;\n parent.appendChild(template.content.cloneNode(true));\n return;\n }\n if (isNodeLike(value)) {\n parent.appendChild(value);\n return;\n }\n parent.appendChild(doc.createTextNode(String(value)));\n}\n\ninterface Binding {\n index: number;\n kind: \"node\" | \"event\" | \"attr\" | \"prop\" | \"bool\";\n name?: string;\n}\n\nfunction materializeTemplate(result: TemplateResult, doc: Document = documentOrThrow()): DocumentFragment {\n const bindings: Binding[] = [];\n let source = \"\";\n\n for (let i = 0; i < result.values.length; i += 1) {\n const part = result.strings[i] ?? \"\";\n const attrMatch = part.match(/([@.?]?[\\w:-]+)\\s*=\\s*$/);\n if (attrMatch) {\n const rawName = attrMatch[1];\n const before = part.slice(0, part.length - attrMatch[0].length);\n const marker = `data-ity-bind-${i}`;\n const first = rawName[0];\n const kind = first === \"@\" ? \"event\" : first === \".\" ? \"prop\" : first === \"?\" ? \"bool\" : \"attr\";\n const name = kind === \"attr\" ? rawName : rawName.slice(1);\n bindings.push({ index: i, kind, name });\n source += `${before}${marker}=\"\"`;\n } else {\n bindings.push({ index: i, kind: \"node\" });\n source += `${part}`;\n }\n }\n source += result.strings[result.strings.length - 1] ?? \"\";\n\n const template = doc.createElement(\"template\");\n template.innerHTML = source;\n const fragment = template.content.cloneNode(true) as DocumentFragment;\n applyBindings(fragment, bindings, result.values, doc);\n return fragment;\n}\n\nfunction applyBindings(root: DocumentFragment, bindings: Binding[], values: readonly unknown[], doc: Document): void {\n const comments = new Map();\n const walker = doc.createTreeWalker(root, 128);\n let current = walker.nextNode();\n while (current) {\n const comment = current as Comment;\n const match = comment.data.match(/^ity:(\\d+)$/);\n if (match) {\n const index = Number(match[1]);\n const list = comments.get(index) || [];\n list.push(comment);\n comments.set(index, list);\n }\n current = walker.nextNode();\n }\n\n for (const binding of bindings) {\n const value = normalizeValue(values[binding.index]);\n if (binding.kind === \"node\") {\n const markers = comments.get(binding.index) || [];\n for (const marker of markers) {\n marker.replaceWith(valueToFragment(value, doc));\n }\n continue;\n }\n\n const attrName = `data-ity-bind-${binding.index}`;\n const elements = Array.from(root.querySelectorAll(`[${attrName}]`)) as HTMLElement[];\n for (const element of elements) {\n element.removeAttribute(attrName);\n applyElementBinding(element, binding, value);\n }\n }\n}\n\nfunction applyElementBinding(element: HTMLElement, binding: Binding, value: unknown): void {\n const name = binding.name || \"\";\n if (binding.kind === \"event\") {\n if (typeof value === \"function\") {\n element.addEventListener(name, value as EventListener);\n } else if (Array.isArray(value) && typeof value[0] === \"function\") {\n element.addEventListener(name, value[0] as EventListener, value[1] as AddEventListenerOptions);\n }\n return;\n }\n\n if (binding.kind === \"prop\") {\n (element as any)[name] = value;\n return;\n }\n\n if (binding.kind === \"bool\") {\n element.toggleAttribute(name, Boolean(value));\n return;\n }\n\n if (value === false || value === null || value === undefined) {\n element.removeAttribute(name);\n return;\n }\n\n if (name === \"class\" && Array.isArray(value)) {\n element.setAttribute(\"class\", value.filter(Boolean).join(\" \"));\n return;\n }\n\n if (name === \"class\" && typeof value === \"object\") {\n const classes = Object.keys(value as Record).filter((key) => Boolean((value as any)[key]));\n element.setAttribute(\"class\", classes.join(\" \"));\n return;\n }\n\n if (name === \"style\" && typeof value === \"object\" && value !== null) {\n Object.assign((element as HTMLElement).style, value);\n return;\n }\n\n element.setAttribute(name, value === true ? \"\" : String(value));\n}\n\nfunction resolveTarget(target: string | Element | DocumentFragment | SelectorObject): Element | DocumentFragment {\n if (typeof target === \"string\") {\n const found = documentOrThrow().querySelector(target);\n if (!found) throw new Error(`Render target not found: ${target}`);\n return found;\n }\n if ((target as SelectorObject)?.isSelectorObject) {\n const first = (target as SelectorObject).first()[0];\n if (!first) throw new Error(\"Cannot render into an empty SelectorObject\");\n return first;\n }\n return target as Element | DocumentFragment;\n}\n\nfunction replaceChildren(target: Element | DocumentFragment, fragment: DocumentFragment): void {\n const maybeTarget = target as any;\n if (typeof maybeTarget.replaceChildren === \"function\") {\n maybeTarget.replaceChildren(fragment);\n return;\n }\n while (target.firstChild) target.removeChild(target.firstChild);\n target.appendChild(fragment);\n}\n\nfunction withViewTransition(update: () => void, enabled: boolean | undefined): void {\n const doc = getDocument() as any;\n if (enabled && doc && typeof doc.startViewTransition === \"function\") {\n doc.startViewTransition(update);\n } else {\n update();\n }\n}\n\nfunction render(\n view: TemplateValue | (() => TemplateValue),\n target: string | Element | DocumentFragment | SelectorObject,\n options: RenderOptions = {}\n): Cleanup {\n const mount = resolveTarget(target);\n const update = () => {\n const value = typeof view === \"function\" && !isSignal(view)\n ? (view as () => TemplateValue)()\n : normalizeValue(view);\n withViewTransition(() => replaceChildren(mount, valueToFragment(value)), options.transition);\n };\n\n if (options.reactive === false) {\n update();\n return () => undefined;\n }\n\n return effect(update);\n}\n\nfunction renderToString(view: TemplateValue | (() => TemplateValue)): string {\n const value = typeof view === \"function\" && !isSignal(view)\n ? (view as () => TemplateValue)()\n : normalizeValue(view);\n return valueToString(value);\n}\n\nfunction valueToString(value: unknown): string {\n value = normalizeValue(value);\n if (value === null || value === undefined || value === false) return \"\";\n if (Array.isArray(value)) return value.map(valueToString).join(\"\");\n if (isTemplateResult(value)) return templateToString(value);\n if (isUnsafeHTML(value)) return value.value;\n if (isNodeLike(value)) {\n const node = value as any;\n if (typeof node.outerHTML === \"string\") return node.outerHTML;\n return escapeHTML(node.textContent || \"\");\n }\n return escapeHTML(String(value));\n}\n\nfunction templateToString(result: TemplateResult): string {\n let source = \"\";\n for (let i = 0; i < result.values.length; i += 1) {\n const part = result.strings[i] ?? \"\";\n const attrMatch = part.match(/([@.?]?[\\w:-]+)\\s*=\\s*$/);\n const value = normalizeValue(result.values[i]);\n if (attrMatch) {\n const rawName = attrMatch[1];\n const before = part.slice(0, part.length - attrMatch[0].length);\n const first = rawName[0];\n const kind = first === \"@\" ? \"event\" : first === \".\" ? \"prop\" : first === \"?\" ? \"bool\" : \"attr\";\n const name = kind === \"attr\" ? rawName : rawName.slice(1);\n if (kind === \"event\" || kind === \"prop\" || value === false || value === null || value === undefined) {\n source += before;\n } else if (kind === \"bool\") {\n source += value ? `${before}${name}` : before;\n } else {\n source += `${before}${name}=\"${escapeAttribute(stringifyAttribute(name, value))}\"`;\n }\n } else {\n source += part + valueToString(value);\n }\n }\n source += result.strings[result.strings.length - 1] ?? \"\";\n return source;\n}\n\nfunction stringifyAttribute(name: string, value: unknown): string {\n if (name === \"class\" && Array.isArray(value)) return value.filter(Boolean).join(\" \");\n if (name === \"class\" && typeof value === \"object\" && value !== null) {\n return Object.keys(value as Record).filter((key) => Boolean((value as any)[key])).join(\" \");\n }\n if (name === \"style\" && typeof value === \"object\" && value !== null) {\n return Object.keys(value as Record)\n .map((key) => `${key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`)}:${(value as any)[key]}`)\n .join(\";\");\n }\n return value === true ? \"\" : String(value);\n}\n\nfunction escapeHTML(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(//g, \">\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeHTML(value)\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\ninterface ComponentContext {\n host: HTMLElement;\n root: HTMLElement | ShadowRoot;\n attr(name: string): ReadonlySignal;\n emit(name: string, detail?: T, options?: CustomEventInit): boolean;\n effect(callback: (onCleanup: (cleanup: Cleanup) => void) => void): EffectHandle;\n onConnected(callback: () => void): void;\n onDisconnected(callback: () => void): void;\n}\n\ntype ComponentRender = TemplateValue | (() => TemplateValue);\ntype ComponentSetup = (ctx: ComponentContext) => ComponentRender | void;\n\ninterface ComponentOptions {\n attrs?: string[];\n observedAttributes?: string[];\n shadow?: boolean | ShadowRootMode | ShadowRootInit;\n styles?: string;\n setup?: ComponentSetup;\n}\n\nfunction component(\n name: string,\n setupOrOptions: ComponentSetup | ComponentOptions,\n maybeOptions: Omit = {}\n): CustomElementConstructor {\n const win = getWindow();\n if (!win?.customElements || !win.HTMLElement) {\n throw new Error(\"Ity.component requires Custom Elements support\");\n }\n\n if (win.customElements.get(name)) {\n return win.customElements.get(name)!;\n }\n\n const definition: ComponentOptions = typeof setupOrOptions === \"function\"\n ? { ...maybeOptions, setup: setupOrOptions }\n : setupOrOptions;\n const attrs = definition.observedAttributes || definition.attrs || [];\n\n class ItyElement extends win.HTMLElement {\n static get observedAttributes(): string[] {\n return attrs;\n }\n\n private attrSignals = new Map>();\n private connectedCallbacks: Cleanup[] = [];\n private disconnectedCallbacks: Cleanup[] = [];\n private effectRecords: Array<{\n callback: (onCleanup: (cleanup: Cleanup) => void) => void;\n handle?: EffectHandle;\n disposed: boolean;\n }> = [];\n private renderCleanup?: Cleanup;\n private mount?: HTMLElement | ShadowRoot;\n private renderTarget?: HTMLElement | ShadowRoot;\n private renderOutput?: ComponentRender;\n private initialized = false;\n private connected = false;\n\n connectedCallback(): void {\n this.ensureMount();\n if (!this.initialized) {\n this.initialized = true;\n const ctx = this.createContext();\n const output = definition.setup?.(ctx);\n if (output !== undefined) {\n this.renderOutput = output as ComponentRender;\n }\n }\n this.connected = true;\n this.startRender();\n this.startEffects();\n for (const callback of this.connectedCallbacks) callback();\n }\n\n disconnectedCallback(): void {\n this.connected = false;\n if (this.renderCleanup) {\n this.renderCleanup();\n this.renderCleanup = undefined;\n }\n for (const record of this.effectRecords) {\n record.handle?.dispose();\n record.handle = undefined;\n }\n for (const callback of this.disconnectedCallbacks) callback();\n }\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\n this.ensureAttrSignal(name).set(newValue);\n }\n\n private ensureMount(): void {\n if (this.mount && this.renderTarget) return;\n const shadow = definition.shadow;\n if (shadow === false) {\n this.mount = this;\n } else {\n const init: ShadowRootInit = typeof shadow === \"object\"\n ? shadow\n : { mode: shadow === \"closed\" ? \"closed\" : \"open\" };\n this.mount = this.shadowRoot || this.attachShadow(init);\n }\n\n if (definition.styles) {\n const doc = this.ownerDocument;\n const style = doc.createElement(\"style\");\n style.textContent = definition.styles;\n const container = doc.createElement(\"span\");\n container.setAttribute(\"data-ity-component-root\", \"\");\n this.mount.appendChild(style);\n this.mount.appendChild(container);\n this.renderTarget = container;\n } else {\n this.renderTarget = this.mount;\n }\n }\n\n private startRender(): void {\n if (this.renderCleanup || this.renderOutput === undefined) return;\n this.renderCleanup = render(this.renderOutput, this.renderTarget!, { transition: false });\n }\n\n private startEffects(): void {\n for (const record of this.effectRecords) {\n if (!record.disposed && !record.handle) {\n record.handle = effect(record.callback);\n }\n }\n }\n\n private ensureAttrSignal(name: string): Signal {\n if (!this.attrSignals.has(name)) {\n this.attrSignals.set(name, signal(this.getAttribute(name)));\n }\n return this.attrSignals.get(name)!;\n }\n\n private createContext(): ComponentContext {\n return {\n host: this,\n root: this.mount!,\n attr: (name) => this.ensureAttrSignal(name),\n emit: (name, detail, options = {}) => this.dispatchEvent(new CustomEvent(name, {\n bubbles: true,\n composed: true,\n ...options,\n detail\n })),\n effect: (callback) => {\n const record = { callback, disposed: false, handle: undefined as EffectHandle | undefined };\n this.effectRecords.push(record);\n if (this.connected) record.handle = effect(callback);\n const dispose = (() => {\n record.disposed = true;\n record.handle?.dispose();\n record.handle = undefined;\n }) as EffectHandle;\n dispose.dispose = dispose;\n return dispose;\n },\n onConnected: (callback) => {\n this.connectedCallbacks.push(callback);\n },\n onDisconnected: (callback) => {\n this.disconnectedCallbacks.push(callback);\n }\n };\n }\n }\n\n win.customElements.define(name, ItyElement);\n return ItyElement;\n}\n\ninterface EventRecord {\n callback: (data?: unknown) => void;\n ctx: any;\n}\n\nclass Evented {\n private _events: Record = {};\n\n on(evtName: string, callback: (data?: unknown) => void, context: any = this): void {\n (this._events[evtName] ||= []).push({ callback, ctx: context });\n }\n\n off(evtName?: string, callback?: (data?: unknown) => void, context?: any): void {\n if (!evtName) {\n this._events = {};\n return;\n }\n const events = this._events[evtName];\n if (!events) return;\n if (!callback) {\n delete this._events[evtName];\n return;\n }\n for (let i = events.length - 1; i >= 0; i -= 1) {\n const event = events[i];\n if (event.callback === callback && (context === undefined || event.ctx === context)) {\n events.splice(i, 1);\n }\n }\n if (events.length === 0) delete this._events[evtName];\n }\n\n trigger(evtName: string, data?: unknown): void {\n const events = this._events[evtName];\n if (!events) return;\n for (const event of events.slice()) {\n event.callback.call(event.ctx, data);\n }\n }\n}\n\nconst regexps = {\n nospaces: /^\\S*$/\n} as const;\n\nclass SelectorObject {\n [index: number]: HTMLElement;\n public readonly isSelectorObject = true;\n private nodes: HTMLElement[] = [];\n\n constructor(nodeList: ArrayLike = []) {\n this.nodes = Array.from(nodeList as HTMLElement[]);\n this.reindex();\n }\n\n get length(): number {\n return this.nodes.length;\n }\n\n [Symbol.iterator](): Iterator {\n return this.nodes[Symbol.iterator]();\n }\n\n toArray(): HTMLElement[] {\n return this.nodes.slice();\n }\n\n find(selector: string): SelectorObject {\n const nodeList: HTMLElement[] = [];\n for (const node of this.nodes) {\n const list = node.querySelectorAll(selector);\n for (const thisNode of Array.from(list)) {\n const elm = thisNode as HTMLElement;\n if (nodeList.indexOf(elm) < 0) nodeList.push(elm);\n }\n }\n return new SelectorObject(nodeList);\n }\n\n filter(selector: string): SelectorObject {\n return new SelectorObject(this.nodes.filter((node) => node.matches(selector)));\n }\n\n first(): SelectorObject {\n return new SelectorObject(this.nodes[0] ? [this.nodes[0]] : []);\n }\n\n last(): SelectorObject {\n return new SelectorObject(this.nodes.length ? [this.nodes[this.nodes.length - 1]] : []);\n }\n\n parent(): SelectorObject {\n const nodeList: HTMLElement[] = [];\n for (const node of this.nodes) {\n const parent = node.parentElement;\n if (parent && nodeList.indexOf(parent) < 0) nodeList.push(parent);\n }\n return new SelectorObject(nodeList);\n }\n\n children(selector?: string): SelectorObject {\n const nodeList: HTMLElement[] = [];\n for (const node of this.nodes) {\n for (const child of Array.from(node.children) as HTMLElement[]) {\n if (nodeList.indexOf(child) < 0 && (!selector || child.matches(selector))) {\n nodeList.push(child);\n }\n }\n }\n return new SelectorObject(nodeList);\n }\n\n remove(): SelectorObject {\n for (const node of this.nodes) node.remove();\n return new SelectorObject([]);\n }\n\n addClass(...classes: string[]): this {\n for (const node of this.nodes) node.classList.add(...classes);\n return this;\n }\n\n removeClass(value: string): this {\n if (value && regexps.nospaces.test(value)) {\n for (const node of this.nodes) node.classList.remove(value);\n }\n return this;\n }\n\n toggleClass(value: string): this {\n if (value && regexps.nospaces.test(value)) {\n for (const node of this.nodes) node.classList.toggle(value);\n }\n return this;\n }\n\n hasClass(value: string): boolean {\n return Boolean(value && regexps.nospaces.test(value) && this.nodes.some((node) => node.classList.contains(value)));\n }\n\n attr(name: string, value?: string | number | boolean | null): string | null | this {\n if (arguments.length === 1) return this.nodes[0]?.getAttribute(name) ?? null;\n for (const node of this.nodes) {\n if (value === null || value === false || value === undefined) node.removeAttribute(name);\n else node.setAttribute(name, value === true ? \"\" : String(value));\n }\n return this;\n }\n\n text(value?: string | number | boolean): string | this {\n if (arguments.length === 0) return this.nodes.map((node) => node.textContent || \"\").join(\"\");\n for (const node of this.nodes) node.textContent = String(value);\n return this;\n }\n\n on(eventName: string, listener: EventListener, options?: AddEventListenerOptions): this {\n for (const node of this.nodes) node.addEventListener(eventName, listener, options);\n return this;\n }\n\n off(eventName: string, listener: EventListener, options?: EventListenerOptions): this {\n for (const node of this.nodes) node.removeEventListener(eventName, listener, options);\n return this;\n }\n\n before(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"beforebegin\");\n }\n\n after(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"afterend\");\n }\n\n append(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"beforeend\");\n }\n\n prepend(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"afterbegin\");\n }\n\n html(content?: string | SelectorObject | HTMLElement | TemplateResult): this | string {\n if (arguments.length === 0) return this.nodes[0]?.innerHTML ?? \"\";\n return this._html(content!, \"replace\");\n }\n\n empty(): this {\n for (const node of this.nodes) node.textContent = \"\";\n return this;\n }\n\n private _html(content: string | SelectorObject | HTMLElement | TemplateResult, position: InsertPosition | \"replace\"): this {\n const doc = getDocument();\n for (const node of this.nodes) {\n if ((content as SelectorObject)?.isSelectorObject) {\n const htmls = Array.from(content as SelectorObject).map((selNode) => selNode.outerHTML).join(\"\");\n if (position === \"replace\") node.innerHTML = htmls;\n else node.insertAdjacentHTML(position as InsertPosition, htmls);\n } else if (isTemplateResult(content) && doc) {\n const fragment = materializeTemplate(content, doc);\n if (position === \"replace\") replaceChildren(node, fragment);\n else node.insertAdjacentElement(position as InsertPosition, fragmentToElement(fragment, doc));\n } else if (isNodeLike(content)) {\n const cloned = content.cloneNode(true) as HTMLElement;\n if (position === \"replace\") replaceChildren(node, valueToFragment(cloned, doc || node.ownerDocument));\n else node.insertAdjacentElement(position as InsertPosition, cloned);\n } else {\n const htmlContent = String(content);\n if (position === \"replace\") node.innerHTML = htmlContent;\n else node.insertAdjacentHTML(position as InsertPosition, htmlContent);\n }\n }\n return this;\n }\n\n private reindex(): void {\n for (const key of Object.keys(this)) {\n if (/^\\d+$/.test(key)) delete (this as any)[key];\n }\n this.nodes.forEach((node, index) => {\n (this as any)[index] = node;\n });\n }\n}\n\nfunction fragmentToElement(fragment: DocumentFragment, doc: Document): HTMLElement {\n const span = doc.createElement(\"span\");\n span.appendChild(fragment);\n return span;\n}\n\nfunction onDOMReady(fn: (...args: any[]) => void, args: unknown[] = [], context: any = Ity): void {\n const doc = getDocument();\n const func = () => fn.apply(context, args);\n if (!doc || doc.readyState !== \"loading\") func();\n else doc.addEventListener(\"DOMContentLoaded\", func, { once: true });\n}\n\ninterface AjaxOptions {\n url?: string;\n type?: string;\n data?: unknown;\n success?: (resp: any) => void;\n error?: (status?: number, error?: unknown) => void;\n}\n\nclass Model = Record> extends Evented {\n public id!: string;\n public data!: T;\n public url!: string;\n public readonly state: Signal;\n\n constructor(opts: Partial> = {}) {\n super();\n Object.assign(this, opts);\n this.id ||= `m${Math.floor(Math.random() * 100000) + 1}`;\n this.data ||= {} as T;\n this.url ||= \"\";\n this.state = signal(this.data);\n this._init(opts);\n }\n\n onDOMReady = onDOMReady;\n\n protected _init(opts?: Partial>): void {\n this.initialize(opts);\n }\n\n protected _ajax(opts: AjaxOptions = {}): void {\n const request = new XMLHttpRequest();\n const method = opts.type || \"GET\";\n const url = opts.url || this.url;\n const success = opts.success || function (this: Model, resp: any) {\n this.data = resp;\n this.state.set(resp);\n };\n const error = opts.error || function () { };\n request.open(method, url, true);\n request.onload = () => {\n if (request.status >= 200 && request.status < 400) {\n try {\n const response = request.responseText ? JSON.parse(request.responseText) : null;\n success.call(this, response);\n } catch (err) {\n error.call(this, request.status, err);\n }\n } else {\n error.call(this, request.status);\n }\n };\n request.onerror = () => error.call(this);\n request.send(opts.data === undefined ? undefined : JSON.stringify(opts.data));\n }\n\n initialize(options?: Partial>): void { }\n\n get(attr?: keyof T): any {\n const current = this.data;\n if (!attr) return current;\n return current ? (current as any)[attr as string] : undefined;\n }\n\n set(attr: keyof T | Partial, value?: any): void {\n const current = this.state.peek() || {} as T;\n const next = typeof attr === \"string\"\n ? { ...(current as any), [attr]: value } as T\n : attr as T;\n this.data = next;\n this.state.set(next);\n this.trigger(\"change\", this.data);\n }\n\n unSet(attr: keyof T): void {\n const current = this.state.peek();\n if (!current || !Object.prototype.hasOwnProperty.call(current, attr)) return;\n const next = { ...(current as any) };\n delete next[attr as string];\n this.data = next as T;\n this.state.set(this.data);\n this.trigger(\"change\", this.data);\n }\n\n clear(): void {\n this.data = {} as T;\n this.state.set(this.data);\n this.trigger(\"change\", this.data);\n }\n\n subscribe(callback: Subscriber, options?: { immediate?: boolean }): Cleanup {\n return this.state.subscribe(callback, options);\n }\n\n sync(opts?: AjaxOptions): void {\n this._ajax(opts);\n }\n\n toJSON(): T {\n return this.get();\n }\n}\n\ninterface ViewEvents {\n [selector: string]: Record;\n}\n\ninterface ViewOptions {\n el?: string | SelectorObject | NodeList | HTMLElement;\n app?: Application;\n name?: string;\n events?: ViewEvents;\n [key: string]: any;\n}\n\nclass View extends Evented {\n public id!: string;\n public el!: SelectorObject;\n public app?: Application;\n public name?: string;\n public events!: ViewEvents;\n private renderCleanup?: Cleanup;\n private delegatedListeners: Cleanup[] = [];\n\n constructor(opts: ViewOptions = {}) {\n super();\n Object.assign(this, opts);\n this.id ||= `v${Math.floor(Math.random() * 100000) + 1}`;\n if (this.app) this.app.addView(this);\n this.events ||= {};\n onDOMReady(this._init, [opts], this);\n }\n\n private _setElement(elSelector: ViewOptions[\"el\"]): void {\n const win = getWindow();\n if ((elSelector as SelectorObject)?.isSelectorObject) {\n this.el = elSelector as SelectorObject;\n } else if (win?.NodeList && elSelector instanceof win.NodeList) {\n this.el = new SelectorObject(elSelector as any);\n } else if (typeof elSelector === \"string\") {\n this.el = new SelectorObject(documentOrThrow().querySelectorAll(elSelector) as any);\n } else if (win?.HTMLElement && elSelector instanceof win.HTMLElement) {\n this.el = new SelectorObject([elSelector]);\n } else {\n throw new Error(\"el selector must be of type String, NodeList, HTMLElement or Ity.SelectorObject\");\n }\n }\n\n private _bindDOMEvents(evtObj: ViewEvents): void {\n if (!this.el || !this.el.isSelectorObject) return;\n const captureEvents = [\"focus\", \"blur\"];\n for (const selector in evtObj) {\n for (const evt in evtObj[selector]) {\n const callback = (this as any)[evtObj[selector][evt]];\n if (typeof callback !== \"function\") {\n throw new Error(`View event handler not found: ${evtObj[selector][evt]}`);\n }\n const capture = captureEvents.includes(evt);\n this._delegateEvent(selector, evt, callback, capture);\n }\n }\n }\n\n private _delegateEvent(selector: string, evtName: string, callback: (e: Event) => void, capture = false): void {\n for (const root of this.el) {\n const listener = (event: Event) => {\n let node: HTMLElement | null = event.target as HTMLElement;\n while (node) {\n if ((node as any).matches && (node as any).matches(selector)) {\n (event as any).delegateTarget = node;\n callback.call(this, event);\n break;\n }\n if (node === root) break;\n node = node.parentElement;\n }\n };\n root.addEventListener(evtName, listener, capture);\n this.delegatedListeners.push(() => root.removeEventListener(evtName, listener, capture));\n }\n }\n\n private _init(opts: ViewOptions): void {\n if (this.el) this._setElement(this.el as any);\n if (opts.el && !this.el) this._setElement(opts.el);\n this._bindDOMEvents(this.events);\n this.initialize(opts);\n }\n\n initialize(opts?: ViewOptions): void { }\n\n getName(): string | undefined {\n return this.name;\n }\n\n get(attr: keyof this): any {\n return (this as any)[attr];\n }\n\n set(attr: keyof this, value: any): void {\n (this as any)[attr] = value;\n }\n\n renderWith(view: TemplateValue | (() => TemplateValue), options?: RenderOptions): Cleanup {\n if (this.renderCleanup) this.renderCleanup();\n this.renderCleanup = render(view, this.el, options);\n return this.renderCleanup;\n }\n\n remove(): void {\n if (this.renderCleanup) this.renderCleanup();\n for (const cleanup of this.delegatedListeners.splice(0)) cleanup();\n this.el.remove();\n if (this.app) this.app.removeView(this.id);\n }\n\n select(selector: string, ctx: HTMLElement | HTMLDocument | SelectorObject = this.el): SelectorObject {\n const win = getWindow();\n if ((win?.HTMLElement && ctx instanceof win.HTMLElement) || (win?.HTMLDocument && ctx instanceof win.HTMLDocument)) {\n return new SelectorObject(ctx.querySelectorAll(selector) as any);\n }\n if ((ctx as any).isSelectorObject) return (ctx as SelectorObject).find(selector);\n throw new Error(\"Context passed to .select() must be an HTMLElement or an Ity.SelectorObject\");\n }\n}\n\nclass Application {\n public views: View[] = [];\n\n getView(id: string): View | undefined {\n return this.views.find((view) => view.id === id);\n }\n\n addView(view: View): void {\n if (view instanceof View && !this.views.includes(view)) this.views.push(view);\n }\n\n removeView(id: string): void {\n this.views = this.views.filter((view) => view.id !== id);\n }\n\n trigger(evtName: string, data?: unknown): void {\n for (const view of this.views.slice()) view.trigger(evtName, data);\n }\n}\n\nclass Collection {\n public models: M[] = [];\n public url!: string;\n public readonly state: Signal;\n private ModelClass: new () => M;\n\n constructor(models: M[] = [], ModelClass: new () => M = Model as any) {\n this.ModelClass = ModelClass;\n this.url = \"\";\n this.state = signal(this.models);\n models.forEach((model) => this.add(model));\n }\n\n get(id: string): M | undefined {\n return this.models.find((model) => model.id === id);\n }\n\n add(model: M): void {\n if (!(model instanceof Model)) return;\n this.models = [...this.models, model];\n this.state.set(this.models);\n }\n\n remove(id: string | M): void {\n const model = typeof id === \"string\" ? this.get(id) : id;\n if (!model) return;\n this.models = this.models.filter((item) => item !== model);\n this.state.set(this.models);\n }\n\n at(index: number): M | undefined {\n return this.models[index];\n }\n\n get length(): number {\n return this.models.length;\n }\n\n clear(): void {\n this.models = [];\n this.state.set(this.models);\n }\n\n find(predicate: (m: M) => boolean): M | undefined {\n return this.models.find(predicate);\n }\n\n filter(predicate: (m: M) => boolean): M[] {\n return this.models.filter(predicate);\n }\n\n map(mapper: (m: M, index: number) => T): T[] {\n return this.models.map(mapper);\n }\n\n toJSON(): any[] {\n return this.models.map((model) => model.get());\n }\n\n subscribe(callback: Subscriber, options?: { immediate?: boolean }): Cleanup {\n return this.state.subscribe(callback, options);\n }\n\n protected _ajax(opts: AjaxOptions = {}): void {\n const request = new XMLHttpRequest();\n const method = opts.type || \"GET\";\n const url = opts.url || this.url;\n const success = opts.success || function () { };\n const error = opts.error || function () { };\n request.open(method, url, true);\n request.onload = () => {\n if (request.status >= 200 && request.status < 400) {\n try {\n success.call(this, request.responseText ? JSON.parse(request.responseText) : null);\n } catch (err) {\n error.call(this, request.status, err);\n }\n } else {\n error.call(this, request.status);\n }\n };\n request.onerror = () => error.call(this);\n request.send(opts.data === undefined ? undefined : JSON.stringify(opts.data));\n }\n\n fetch(opts: AjaxOptions & { modelClass?: new () => M } = {}): void {\n const userSuccess = opts.success;\n opts.success = function (this: Collection, resp: any[]) {\n const ctor = (opts.modelClass || this.ModelClass) as new () => M;\n this.clear();\n for (const data of resp || []) {\n const model = new ctor();\n (model as any).set(data);\n this.add(model);\n }\n if (userSuccess) userSuccess.call(this, resp);\n };\n this._ajax(opts);\n }\n\n trigger(evtName: string, data?: unknown): void {\n for (const model of this.models.slice()) model.trigger(evtName, data);\n }\n}\n\ninterface RouteContext {\n path: string;\n url: URL;\n params: Record;\n query: Record;\n hash: Record;\n}\n\ntype RouteHandler = (params: Record, context: RouteContext) => void | Cleanup;\n\ninterface RouteRecord {\n pattern: string;\n handler: RouteHandler;\n exec(url: URL): Record | null;\n}\n\ninterface RouterOptions {\n base?: string;\n autoStart?: boolean;\n linkSelector?: string;\n transition?: boolean;\n notFound?: RouteHandler;\n}\n\nclass Router {\n private routes: RouteRecord[] = [];\n private started = false;\n private readonly listener = () => this.check();\n private readonly clickListener = (event: Event) => this.handleLinkClick(event);\n private readonly navigationListener = (event: any) => this.handleNavigationEvent(event);\n private routeCleanup?: Cleanup;\n private activeRoute?: RouteRecord;\n public readonly current: Signal = signal(null);\n public notFound?: RouteHandler;\n public base: string;\n public linkSelector: string;\n public transition: boolean;\n\n constructor(options: RouterOptions = {}) {\n this.base = options.base || \"/\";\n this.linkSelector = options.linkSelector || \"a[data-ity-link]\";\n this.transition = Boolean(options.transition);\n this.notFound = options.notFound;\n if (options.autoStart !== false) this.start();\n }\n\n add(pattern: string, handler: RouteHandler): this {\n this.routes.push(createRouteRecord(pattern, handler));\n return this;\n }\n\n addRoute(pattern: string, handler: RouteHandler): void {\n this.add(pattern, handler);\n }\n\n removeRoute(pattern: string): this {\n if (this.activeRoute?.pattern === pattern) {\n this.disposeRoute();\n this.activeRoute = undefined;\n this.current.set(null);\n }\n this.routes = this.routes.filter((route) => route.pattern !== pattern);\n return this;\n }\n\n navigate(path: string, options: { replace?: boolean; transition?: boolean } = {}): void {\n const win = getWindow();\n if (!win) return;\n const update = () => {\n const method = options.replace ? \"replaceState\" : \"pushState\";\n win.history[method](null, \"\", withBasePath(path, this.base));\n this.check();\n };\n withViewTransition(update, options.transition ?? this.transition);\n }\n\n start(): void {\n const win = getWindow();\n const doc = getDocument();\n if (!win || this.started) {\n if (win) this.check();\n return;\n }\n win.addEventListener(\"popstate\", this.listener);\n doc?.addEventListener(\"click\", this.clickListener);\n (win as any).navigation?.addEventListener?.(\"navigate\", this.navigationListener);\n this.started = true;\n this.check();\n }\n\n stop(): void {\n const win = getWindow();\n const doc = getDocument();\n if (win && this.started) {\n win.removeEventListener(\"popstate\", this.listener);\n doc?.removeEventListener(\"click\", this.clickListener);\n (win as any).navigation?.removeEventListener?.(\"navigate\", this.navigationListener);\n }\n this.started = false;\n this.disposeRoute();\n }\n\n check(): RouteContext | null {\n const win = getWindow();\n if (!win) return null;\n const url = new URL(win.location.href);\n const routePath = stripBasePath(url.pathname, this.base);\n if (routePath === null) {\n this.disposeRoute();\n this.activeRoute = undefined;\n this.current.set(null);\n return null;\n }\n const routeUrl = new URL(url.href);\n routeUrl.pathname = routePath || \"/\";\n for (const route of this.routes) {\n const routeParams = route.exec(routeUrl);\n if (!routeParams) continue;\n const query = searchParamsToObject(url.search);\n const hash = searchParamsToObject(url.hash);\n const params = { ...routeParams, ...query, ...hash };\n const context: RouteContext = {\n path: routePath || \"/\",\n url,\n params,\n query,\n hash\n };\n this.disposeRoute();\n this.activeRoute = route;\n this.current.set(context);\n const cleanup = route.handler(params, context);\n if (typeof cleanup === \"function\") this.routeCleanup = cleanup;\n return context;\n }\n this.disposeRoute();\n this.activeRoute = undefined;\n this.current.set(null);\n const cleanup = this.notFound?.({}, {\n path: routePath || \"/\",\n url,\n params: {},\n query: searchParamsToObject(url.search),\n hash: searchParamsToObject(url.hash)\n });\n if (typeof cleanup === \"function\") this.routeCleanup = cleanup;\n return null;\n }\n\n private handleLinkClick(event: Event): void {\n const target = event.target as HTMLElement | null;\n const anchor = target?.closest?.(this.linkSelector) as HTMLAnchorElement | null;\n if (!anchor || anchor.target || anchor.hasAttribute(\"download\")) return;\n const win = getWindow();\n if (!win) return;\n const url = new URL(anchor.href, win.location.href);\n if (url.origin !== win.location.origin) return;\n if (stripBasePath(url.pathname, this.base) === null) return;\n event.preventDefault();\n this.navigate(`${url.pathname}${url.search}${url.hash}`);\n }\n\n private handleNavigationEvent(event: any): void {\n const win = getWindow();\n if (!win || !event?.canIntercept || !event.destination?.url || typeof event.intercept !== \"function\") return;\n const url = new URL(event.destination.url, win.location.href);\n if (url.origin !== win.location.origin) return;\n if (stripBasePath(url.pathname, this.base) === null) return;\n event.intercept({\n handler: () => {\n this.check();\n }\n });\n }\n\n private disposeRoute(): void {\n if (!this.routeCleanup) return;\n const cleanup = this.routeCleanup;\n this.routeCleanup = undefined;\n cleanup();\n }\n}\n\nfunction createRouteRecord(pattern: string, handler: RouteHandler): RouteRecord {\n const win = getWindow();\n const URLPatternCtor = (win as any)?.URLPattern || (globalThis as any).URLPattern;\n if (typeof URLPatternCtor === \"function\") {\n try {\n const nativePattern = new URLPatternCtor({ pathname: pattern });\n return {\n pattern,\n handler,\n exec(url) {\n const match = nativePattern.exec(url.href);\n return match ? decodeParams(match.pathname.groups || {}) : null;\n }\n };\n } catch (_err) {\n // Fall through to the regex matcher for non-URLPattern syntax.\n }\n }\n\n const { re, keys } = compilePathPattern(pattern);\n return {\n pattern,\n handler,\n exec(url) {\n const match = re.exec(normalizePath(url.pathname));\n if (!match) return null;\n const params: Record = {};\n keys.forEach((key, index) => {\n params[key] = decodeURIComponent(match[index + 1] || \"\");\n });\n return params;\n }\n };\n}\n\nfunction normalizeBase(base: string): string {\n const normalized = normalizePath(base || \"/\");\n return normalized === \"\" ? \"\" : normalized;\n}\n\nfunction withBasePath(path: string, base: string): string {\n const normalizedBase = normalizeBase(base);\n const parsed = new URL(path || \"/\", \"http://ity.local\");\n let pathname = normalizePath(parsed.pathname) || \"/\";\n if (normalizedBase && pathname !== normalizedBase && !pathname.startsWith(`${normalizedBase}/`)) {\n pathname = `${normalizedBase}${pathname === \"/\" ? \"\" : pathname}`;\n }\n return `${pathname}${parsed.search}${parsed.hash}`;\n}\n\nfunction stripBasePath(pathname: string, base: string): string | null {\n const normalizedBase = normalizeBase(base);\n const normalizedPath = normalizePath(pathname) || \"/\";\n if (!normalizedBase) return normalizedPath;\n if (normalizedPath === normalizedBase) return \"/\";\n if (normalizedPath.startsWith(`${normalizedBase}/`)) {\n return normalizePath(normalizedPath.slice(normalizedBase.length)) || \"/\";\n }\n return null;\n}\n\nfunction compilePathPattern(pattern: string): { re: RegExp; keys: string[] } {\n const keys: string[] = [];\n const normalized = normalizePath(pattern);\n if (normalized === \"\") return { re: /^\\/?$/, keys };\n const segments = normalized.split(\"/\").filter(Boolean);\n const source = segments.map((segment) => {\n if (segment === \"*\") {\n keys.push(\"wildcard\");\n return \"(.*)\";\n }\n if (segment.startsWith(\":\")) {\n keys.push(segment.slice(1));\n return \"([^/]+)\";\n }\n return escapeRegExp(segment);\n }).join(\"/\");\n return { re: new RegExp(`^/${source}/?$`), keys };\n}\n\nfunction normalizePath(path: string): string {\n const normalized = path.replace(/[?#].*$/, \"\").replace(/\\/+$/, \"\");\n return normalized === \"\" ? \"\" : normalized.startsWith(\"/\") ? normalized : `/${normalized}`;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction searchParamsToObject(value: string): Record {\n const out: Record = {};\n const clean = value.replace(/^[?#]/, \"\");\n if (!clean) return out;\n const params = new URLSearchParams(clean);\n params.forEach((paramValue, key) => {\n out[key] = paramValue;\n });\n return out;\n}\n\nfunction decodeParams(value: Record): Record {\n const out: Record = {};\n for (const key of Object.keys(value)) {\n out[key] = decodeURIComponent(value[key]);\n }\n return out;\n}\n\nconst defaultRouter = signal(null);\n\nfunction route(pattern: string, handler: RouteHandler): Router {\n let router = defaultRouter.peek();\n if (!router) {\n router = new Router({ autoStart: false });\n defaultRouter.set(router);\n }\n router.add(pattern, handler);\n router.start();\n return router;\n}\n\nconst Ity = {\n version: \"2.1.0\",\n configure,\n signal,\n computed,\n effect,\n batch,\n untrack,\n isSignal,\n resolveSignal,\n store,\n resource,\n action,\n form,\n html,\n unsafeHTML,\n render,\n renderToString,\n component,\n route,\n Router,\n SelectorObject,\n onDOMReady,\n Model,\n View,\n Application,\n Collection\n};\n\nfunction createAmdExport(): typeof Ity {\n const win = getWindow();\n if (win) (win as any).Ity = Ity;\n return Ity;\n}\n\n/* c8 ignore next 3 */\nif (typeof define === \"function\" && (define as any).amd) {\n (define as any)(createAmdExport);\n} else if (typeof module === \"object\" && typeof module.exports !== \"undefined\") {\n module.exports = Ity;\n}\n\nconst win = getWindow();\nif (win) {\n (win as any).Ity = Ity;\n}\n\nexport {\n Application,\n Collection,\n Model,\n Router,\n SelectorObject,\n View,\n batch,\n component,\n configure,\n computed,\n effect,\n action,\n form,\n html,\n isSignal,\n onDOMReady,\n render,\n renderToString,\n resource,\n resolveSignal,\n route,\n signal,\n store,\n unsafeHTML,\n untrack\n};\nexport type {\n Action,\n ActionOptions,\n AsyncStatus,\n ComponentContext,\n ComponentOptions,\n EffectHandle,\n FormController,\n FormOptions,\n HTMLSanitizer,\n ItyConfig,\n ReadonlySignal,\n RenderOptions,\n Resource,\n ResourceContext,\n ResourceOptions,\n RouteContext,\n RouteHandler,\n Signal,\n Store,\n TemplateResult,\n UnsafeHTMLOptions\n};\nexport default Ity;\n"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"ity.cjs.js","sources":["../Ity.ts"],"sourcesContent":["// Ity.ts 2.2.0\n// (c) 2026 Dominic Cocchiarella\n// Tiny dependency-free reactive app kernel with V1 MVC compatibility.\ndeclare var define: any;\ndeclare var module: any;\n\ntype Cleanup = () => void;\ntype Equality = (prev: T, next: T) => boolean;\ntype Subscriber = (value: T, previous: T) => void;\ntype MaybeSignal = T | ReadonlySignal;\ntype TemplateValue =\n | TemplateResult\n | UnsafeHTML\n | Node\n | string\n | number\n | boolean\n | null\n | undefined\n | TemplateValue[]\n | ReadonlySignal;\n\ninterface ReadonlySignal {\n (): T;\n get(): T;\n peek(): T;\n subscribe(callback: Subscriber, options?: { immediate?: boolean }): Cleanup;\n readonly isSignal: true;\n}\n\ninterface Signal extends ReadonlySignal {\n (next: T | ((previous: T) => T)): T;\n set(next: T | ((previous: T) => T)): T;\n update(updater: (previous: T) => T): T;\n}\n\ninterface ReactiveSource {\n observers: Set;\n}\n\ninterface ReactiveObserver {\n deps: Set;\n markDirty(): void;\n}\n\ninterface ComputedOptions {\n equals?: Equality;\n}\n\ninterface SignalOptions {\n equals?: Equality;\n name?: string;\n}\n\ninterface EffectHandle {\n (): void;\n dispose(): void;\n}\n\ninterface TemplateResult {\n readonly isTemplateResult: true;\n readonly strings: readonly string[];\n readonly values: readonly unknown[];\n}\n\ninterface UnsafeHTML {\n readonly isUnsafeHTML: true;\n readonly value: string;\n}\n\ntype HTMLSanitizer = (value: string) => string;\n\ninterface UnsafeHTMLOptions {\n sanitize?: HTMLSanitizer;\n config?: ItyConfig | null;\n}\n\ninterface ItyConfig {\n sanitizeHTML?: HTMLSanitizer | null;\n}\n\ninterface RenderOptions {\n reactive?: boolean;\n transition?: boolean;\n config?: ItyConfig | null;\n}\n\ntype StoreKey = string | symbol;\n\ninterface StoreApi> {\n $patch(patch: Partial | ((current: T) => Partial | void)): void;\n $snapshot(): T;\n $subscribe(callback: (value: T) => void, options?: { immediate?: boolean }): Cleanup;\n}\n\ntype Store> = T & StoreApi;\n\ntype AsyncStatus = \"idle\" | \"loading\" | \"success\" | \"error\";\n\ninterface ResourceContext {\n signal: AbortSignal;\n previous: T | undefined;\n refreshId: number;\n}\n\ninterface ResourceOptions {\n initialValue?: T;\n immediate?: boolean;\n keepPrevious?: boolean;\n onSuccess?: (value: T) => void;\n onError?: (error: E) => void;\n}\n\ninterface Resource {\n readonly data: Signal;\n readonly error: Signal;\n readonly loading: ReadonlySignal;\n readonly status: ReadonlySignal;\n readonly promise: Promise | null;\n refresh(): Promise;\n mutate(value: T | undefined): void;\n abort(reason?: unknown): void;\n}\n\ninterface ActionOptions {\n onSuccess?: (value: TResult) => void;\n onError?: (error: E) => void;\n}\n\ninterface Action {\n (...args: TArgs): Promise;\n submit(...args: TArgs): Promise;\n run(...args: TArgs): void;\n with(...args: TArgs): (...eventArgs: unknown[]) => void;\n from(mapper: (event: TEvent) => TArgs): (event: TEvent) => void;\n readonly data: Signal;\n readonly error: Signal;\n readonly pending: ReadonlySignal;\n readonly pendingCount: ReadonlySignal;\n readonly status: ReadonlySignal;\n reset(): void;\n}\n\ninterface FormController {\n readonly action: Action<[FormData, Event], TResult, E>;\n readonly data: Signal;\n readonly error: Signal;\n readonly pending: ReadonlySignal;\n readonly status: ReadonlySignal;\n onSubmit(event: Event): Promise;\n handleSubmit(event: Event): void;\n reset(): void;\n}\n\ninterface FormOptions extends ActionOptions {\n resetOnSuccess?: boolean;\n}\n\ntype FormErrorMap> = Partial, string>>;\n\ninterface FormBindOptions {\n type?: \"text\" | \"textarea\" | \"select\" | \"select-multiple\" | \"checkbox\" | \"radio\" | \"number\";\n event?: string;\n name?: string;\n value?: unknown;\n parse?: (value: unknown, event: Event) => T;\n format?: (value: T) => unknown;\n}\n\ninterface FormStateOptions> {\n validators?: Partial<{ [K in keyof TValues]: (value: TValues[K], values: TValues) => string | null | undefined }>;\n validate?: (values: TValues) => FormErrorMap | void;\n}\n\ninterface FormField {\n readonly value: Signal;\n readonly error: ReadonlySignal;\n readonly touched: ReadonlySignal;\n readonly dirty: ReadonlySignal;\n bind(options?: FormBindOptions): Record;\n set(next: T | ((previous: T) => T)): T;\n reset(): void;\n}\n\ninterface FormStateSubmitOptions extends ActionOptions {\n resetOnSuccess?: boolean;\n}\n\ninterface FormStateController, TResult, E = unknown> {\n readonly state: FormState;\n readonly action: Action<[TValues, Event], TResult, E>;\n readonly data: Signal;\n readonly error: Signal;\n readonly pending: ReadonlySignal;\n readonly status: ReadonlySignal;\n onSubmit(event: Event): Promise;\n handleSubmit(event: Event): void;\n reset(): void;\n}\n\ninterface FormState> {\n readonly values: Store;\n readonly initialValues: ReadonlySignal;\n readonly errors: Store>;\n readonly touched: Store, boolean>>>;\n readonly dirty: ReadonlySignal;\n readonly valid: ReadonlySignal;\n field(name: K): FormField;\n bind(name: K, options?: FormBindOptions): Record;\n set(next: Partial | ((current: TValues) => Partial | void)): void;\n reset(next?: Partial | TValues): void;\n validate(names?: readonly (keyof TValues)[]): boolean;\n markTouched(names?: readonly (keyof TValues)[]): void;\n submit(\n handler: (values: TValues, event: Event) => Promise | TResult,\n options?: FormStateSubmitOptions\n ): FormStateController;\n}\n\ninterface RenderToStringOptions {\n config?: ItyConfig | null;\n}\n\ninterface RegisteredFormBinding {\n domName: string;\n type: NonNullable[\"type\"]> | \"text\";\n value?: unknown;\n parse?: (value: unknown, event: Event) => T;\n}\n\nconst defaultEquals = Object.is;\nlet activeObserver: ReactiveObserver | null = null;\nlet batchDepth = 0;\nconst pendingEffects = new Set();\nlet configuredSanitizeHTML: HTMLSanitizer | undefined;\nconst activeConfigStack: Array = [];\n\nfunction getWindow(): (Window & typeof globalThis) | undefined {\n return typeof window !== \"undefined\" ? window : undefined;\n}\n\nfunction getDocument(): Document | undefined {\n const win = getWindow();\n return win?.document ?? (typeof document !== \"undefined\" ? document : undefined);\n}\n\nfunction hasOwn(target: object, key: PropertyKey): boolean {\n return Object.prototype.hasOwnProperty.call(target, key);\n}\n\nfunction isPlainObject(value: unknown): value is Record {\n if (!value || typeof value !== \"object\") return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\nfunction cloneValue(value: T): T {\n const cloneFn = (globalThis as any).structuredClone;\n if (typeof cloneFn === \"function\") return cloneFn(value);\n if (Array.isArray(value)) return value.map((item) => cloneValue(item)) as T;\n if (isPlainObject(value)) {\n const out: Record = {};\n for (const key of Reflect.ownKeys(value)) {\n out[key as any] = cloneValue((value as any)[key]);\n }\n return out as T;\n }\n return value;\n}\n\nfunction deepEqual(left: unknown, right: unknown): boolean {\n if (Object.is(left, right)) return true;\n if (Array.isArray(left) && Array.isArray(right)) {\n if (left.length !== right.length) return false;\n for (let i = 0; i < left.length; i += 1) {\n if (!deepEqual(left[i], right[i])) return false;\n }\n return true;\n }\n if (isPlainObject(left) && isPlainObject(right)) {\n const leftKeys = Reflect.ownKeys(left);\n const rightKeys = Reflect.ownKeys(right);\n if (leftKeys.length !== rightKeys.length) return false;\n for (const key of leftKeys) {\n if (!rightKeys.includes(key)) return false;\n if (!deepEqual((left as any)[key], (right as any)[key])) return false;\n }\n return true;\n }\n return false;\n}\n\nfunction currentConfig(): ItyConfig | null {\n return activeConfigStack.length ? activeConfigStack[activeConfigStack.length - 1] : null;\n}\n\nfunction withConfig(config: ItyConfig | null | undefined, callback: () => T): T {\n activeConfigStack.push(config || null);\n try {\n return callback();\n } finally {\n activeConfigStack.pop();\n }\n}\n\nfunction resolveSanitizeHTML(options: UnsafeHTMLOptions = {}): HTMLSanitizer | undefined {\n if (options.sanitize) return options.sanitize;\n const scoped = options.config ?? currentConfig();\n if (scoped && hasOwn(scoped, \"sanitizeHTML\")) {\n return scoped.sanitizeHTML || undefined;\n }\n return configuredSanitizeHTML;\n}\n\nfunction trackDependency(source: ReactiveSource): void {\n if (!activeObserver) return;\n source.observers.add(activeObserver);\n activeObserver.deps.add(source);\n}\n\nfunction cleanupDependencies(observer: ReactiveObserver): void {\n for (const dep of observer.deps) {\n dep.observers.delete(observer);\n }\n observer.deps.clear();\n}\n\nfunction notifyObservers(source: ReactiveSource): void {\n for (const observer of Array.from(source.observers)) {\n observer.markDirty();\n }\n}\n\nfunction flushEffects(): void {\n if (batchDepth > 0) return;\n while (pendingEffects.size) {\n const effects = Array.from(pendingEffects);\n pendingEffects.clear();\n for (const effect of effects) {\n effect.run();\n }\n }\n}\n\nfunction queueEffect(effect: ReactiveEffect): void {\n pendingEffects.add(effect);\n flushEffects();\n}\n\nclass SignalNode implements ReactiveSource {\n observers = new Set();\n private subscribers = new Set>();\n private value: T;\n private equals: Equality;\n\n constructor(value: T, options: SignalOptions = {}) {\n this.value = value;\n this.equals = options.equals || defaultEquals;\n }\n\n read(track = true): T {\n if (track) trackDependency(this);\n return this.value;\n }\n\n write(next: T | ((previous: T) => T)): T {\n const previous = this.value;\n const resolved = typeof next === \"function\"\n ? (next as (previous: T) => T)(previous)\n : next;\n if (this.equals(previous, resolved)) return previous;\n this.value = resolved;\n notifyObservers(this);\n for (const subscriber of Array.from(this.subscribers)) {\n subscriber(resolved, previous);\n }\n flushEffects();\n return resolved;\n }\n\n subscribe(callback: Subscriber, options: { immediate?: boolean } = {}): Cleanup {\n this.subscribers.add(callback);\n if (options.immediate) callback(this.value, this.value);\n return () => {\n this.subscribers.delete(callback);\n };\n }\n}\n\nclass ComputedNode implements ReactiveSource, ReactiveObserver {\n observers = new Set();\n deps = new Set();\n private subscribers = new Set>();\n private dirty = true;\n private initialized = false;\n private value!: T;\n private equals: Equality;\n\n constructor(private readonly getter: () => T, options: ComputedOptions = {}) {\n this.equals = options.equals || defaultEquals;\n }\n\n read(track = true): T {\n if (track) trackDependency(this);\n if (this.dirty) this.evaluate();\n return this.value;\n }\n\n markDirty(): void {\n if (this.dirty) return;\n const previous = this.value;\n this.dirty = true;\n notifyObservers(this);\n if (this.subscribers.size) {\n const next = this.read(false);\n if (!this.equals(previous, next)) {\n for (const subscriber of Array.from(this.subscribers)) {\n subscriber(next, previous);\n }\n }\n }\n }\n\n subscribe(callback: Subscriber, options: { immediate?: boolean } = {}): Cleanup {\n this.subscribers.add(callback);\n if (options.immediate) {\n const current = this.read(false);\n callback(current, current);\n }\n return () => {\n this.subscribers.delete(callback);\n };\n }\n\n private evaluate(): void {\n cleanupDependencies(this);\n const previousObserver = activeObserver;\n activeObserver = this;\n try {\n this.value = this.getter();\n this.dirty = false;\n this.initialized = true;\n } finally {\n activeObserver = previousObserver;\n }\n }\n}\n\nclass ReactiveEffect implements ReactiveObserver {\n deps = new Set();\n private disposed = false;\n private cleanup?: Cleanup;\n\n constructor(private readonly callback: (onCleanup: (cleanup: Cleanup) => void) => void) {\n this.run();\n }\n\n markDirty(): void {\n if (!this.disposed) queueEffect(this);\n }\n\n run(): void {\n if (this.disposed) return;\n cleanupDependencies(this);\n if (this.cleanup) {\n const cleanup = this.cleanup;\n this.cleanup = undefined;\n cleanup();\n }\n const previousObserver = activeObserver;\n activeObserver = this;\n try {\n this.callback((cleanup) => {\n this.cleanup = cleanup;\n });\n } finally {\n activeObserver = previousObserver;\n }\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n cleanupDependencies(this);\n if (this.cleanup) {\n const cleanup = this.cleanup;\n this.cleanup = undefined;\n cleanup();\n }\n pendingEffects.delete(this);\n }\n}\n\nfunction signal(initialValue: T, options: SignalOptions = {}): Signal {\n const node = new SignalNode(initialValue, options);\n const readWrite = function (next?: T | ((previous: T) => T)): T {\n if (arguments.length === 0) return node.read(true);\n return node.write(next as T | ((previous: T) => T));\n } as Signal;\n readWrite.get = () => node.read(true);\n readWrite.peek = () => node.read(false);\n readWrite.set = (next) => node.write(next);\n readWrite.update = (updater) => node.write(updater);\n readWrite.subscribe = (callback, subscribeOptions) => node.subscribe(callback, subscribeOptions);\n Object.defineProperty(readWrite, \"isSignal\", { value: true });\n return readWrite;\n}\n\nfunction computed(getter: () => T, options: ComputedOptions = {}): ReadonlySignal {\n const node = new ComputedNode(getter, options);\n const read = function (): T {\n return node.read(true);\n } as ReadonlySignal;\n read.get = () => node.read(true);\n read.peek = () => node.read(false);\n read.subscribe = (callback, subscribeOptions) => node.subscribe(callback, subscribeOptions);\n Object.defineProperty(read, \"isSignal\", { value: true });\n return read;\n}\n\nfunction effect(callback: (onCleanup: (cleanup: Cleanup) => void) => void): EffectHandle {\n const runner = new ReactiveEffect(callback);\n const dispose = (() => runner.dispose()) as EffectHandle;\n dispose.dispose = dispose;\n return dispose;\n}\n\nfunction batch(callback: () => T): T {\n batchDepth += 1;\n try {\n return callback();\n } finally {\n batchDepth -= 1;\n flushEffects();\n }\n}\n\nfunction untrack(callback: () => T): T {\n const previousObserver = activeObserver;\n activeObserver = null;\n try {\n return callback();\n } finally {\n activeObserver = previousObserver;\n }\n}\n\nfunction isSignal(value: unknown): value is ReadonlySignal {\n return typeof value === \"function\" && (value as any).isSignal === true;\n}\n\nfunction resolveSignal(value: MaybeSignal): T {\n return isSignal(value) ? value() : value;\n}\n\nfunction configure(options: ItyConfig = {}): void {\n configuredSanitizeHTML = options.sanitizeHTML || undefined;\n}\n\nfunction createConfig(options: ItyConfig = {}): ItyConfig {\n const config: ItyConfig = {};\n if (hasOwn(options, \"sanitizeHTML\")) config.sanitizeHTML = options.sanitizeHTML ?? null;\n return config;\n}\n\nfunction store>(initialValue: T): Store {\n const keys = new Set(Reflect.ownKeys(initialValue));\n const signals = new Map>();\n const structure = signal(0);\n\n const ensureSignal = (key: StoreKey): Signal => {\n if (!signals.has(key)) {\n signals.set(key, signal((initialValue as any)[key]));\n }\n return signals.get(key)!;\n };\n\n const bumpStructure = (): void => {\n structure.update((version) => version + 1);\n };\n\n const setKey = (key: StoreKey, value: any): void => {\n const hadKey = keys.has(key);\n if (!hadKey) keys.add(key);\n ensureSignal(key).set(value);\n if (!hadKey) bumpStructure();\n };\n\n const snapshot = (): T => {\n structure();\n const out: any = {};\n for (const key of keys) {\n out[key] = ensureSignal(key)();\n }\n return out as T;\n };\n\n const api: StoreApi = {\n $patch(patch) {\n const current = snapshot();\n const next = typeof patch === \"function\" ? patch(current) : patch;\n if (!next) return;\n batch(() => {\n for (const key of Reflect.ownKeys(next)) {\n setKey(key, (next as any)[key]);\n }\n });\n },\n $snapshot: snapshot,\n $subscribe(callback, options = {}) {\n let first = true;\n return effect(() => {\n const value = snapshot();\n if (first && !options.immediate) {\n first = false;\n return;\n }\n first = false;\n callback(value);\n });\n }\n };\n\n return new Proxy(api as Store, {\n get(target, key, receiver) {\n if (key in target) return Reflect.get(target, key, receiver);\n return ensureSignal(key)();\n },\n set(_target, key, value) {\n batch(() => {\n setKey(key, value);\n });\n return true;\n },\n deleteProperty(_target, key) {\n if (!keys.has(key)) return true;\n keys.delete(key);\n batch(() => {\n ensureSignal(key).set(undefined);\n bumpStructure();\n });\n return true;\n },\n ownKeys(target) {\n structure();\n return Array.from(new Set([...Reflect.ownKeys(target), ...keys]));\n },\n getOwnPropertyDescriptor(target, key) {\n structure();\n if (Object.prototype.hasOwnProperty.call(target, key)) {\n return { ...Reflect.getOwnPropertyDescriptor(target, key)!, enumerable: false };\n }\n if (!keys.has(key)) return undefined;\n return { enumerable: true, configurable: true };\n },\n has(target, key) {\n structure();\n return key in target || keys.has(key);\n }\n });\n}\n\nfunction resource(\n loader: (context: ResourceContext) => Promise | T,\n options: ResourceOptions = {}\n): Resource {\n const data = signal(options.initialValue);\n const error = signal(null);\n const pending = signal(false);\n const statusValue = signal(options.initialValue === undefined ? \"idle\" : \"success\");\n const loading = computed(() => pending());\n const status = computed(() => statusValue());\n const keepPrevious = options.keepPrevious !== false;\n let controller: AbortController | null = null;\n let refreshId = 0;\n let currentPromise: Promise | null = null;\n\n const api: Resource = {\n data,\n error,\n loading,\n status,\n get promise() {\n return currentPromise;\n },\n refresh() {\n refreshId += 1;\n const id = refreshId;\n if (controller) controller.abort();\n controller = new AbortController();\n const signal = controller.signal;\n const previous = data.peek();\n pending.set(true);\n statusValue.set(\"loading\");\n error.set(null);\n if (!keepPrevious) data.set(undefined);\n\n currentPromise = Promise.resolve()\n .then(() => loader({ signal, previous, refreshId: id }))\n .then((value) => {\n if (id !== refreshId || signal.aborted) return data.peek();\n data.set(value);\n error.set(null);\n statusValue.set(\"success\");\n options.onSuccess?.(value);\n return value;\n })\n .catch((err) => {\n if (id !== refreshId) return data.peek();\n error.set(err as E);\n statusValue.set(\"error\");\n options.onError?.(err as E);\n return data.peek();\n })\n .finally(() => {\n if (id === refreshId) {\n pending.set(false);\n controller = null;\n }\n });\n\n return currentPromise;\n },\n mutate(value) {\n refreshId += 1;\n if (controller) controller.abort();\n controller = null;\n currentPromise = null;\n data.set(value);\n error.set(null);\n pending.set(false);\n statusValue.set(value === undefined ? \"idle\" : \"success\");\n },\n abort(reason?: unknown) {\n if (!controller) return;\n refreshId += 1;\n controller.abort(reason);\n controller = null;\n currentPromise = null;\n pending.set(false);\n statusValue.set(data.peek() === undefined ? \"idle\" : \"success\");\n }\n };\n\n if (options.immediate !== false) {\n api.refresh();\n }\n\n return api;\n}\n\nfunction action(\n handler: (...args: TArgs) => Promise | TResult,\n options: ActionOptions = {}\n): Action {\n const data = signal(undefined);\n const error = signal(null);\n const count = signal(0);\n const statusValue = signal(\"idle\");\n const pending = computed(() => count() > 0);\n const pendingCount = computed(() => count());\n const status = computed(() => statusValue());\n let generation = 0;\n\n const submit = (...args: TArgs): Promise => {\n const runGeneration = generation;\n count.update((value) => value + 1);\n statusValue.set(\"loading\");\n error.set(null);\n\n return Promise.resolve()\n .then(() => handler(...args))\n .then((value) => {\n if (runGeneration === generation) {\n data.set(value);\n error.set(null);\n options.onSuccess?.(value);\n if (count.peek() <= 1) statusValue.set(\"success\");\n }\n return value;\n })\n .catch((err) => {\n if (runGeneration === generation) {\n error.set(err as E);\n options.onError?.(err as E);\n if (count.peek() <= 1) statusValue.set(\"error\");\n }\n throw err;\n })\n .finally(() => {\n if (runGeneration !== generation) return;\n count.update((value) => Math.max(0, value - 1));\n if (count.peek() > 0) statusValue.set(\"loading\");\n });\n };\n\n const callable = ((...args: TArgs) => submit(...args)) as Action;\n const mutableCallable = callable as Action & {\n submit: (...args: TArgs) => Promise;\n run: (...args: TArgs) => void;\n with: (...args: TArgs) => (...eventArgs: unknown[]) => void;\n from: (mapper: (event: TEvent) => TArgs) => (event: TEvent) => void;\n data: Signal;\n error: Signal;\n pending: ReadonlySignal;\n pendingCount: ReadonlySignal;\n status: ReadonlySignal;\n };\n mutableCallable.submit = submit;\n mutableCallable.run = (...args: TArgs) => {\n submit(...args).catch(() => undefined);\n };\n mutableCallable.with = (...args: TArgs) => {\n return () => {\n mutableCallable.run(...args);\n };\n };\n mutableCallable.from = (mapper: (event: TEvent) => TArgs) => {\n return (event: TEvent) => {\n mutableCallable.run(...mapper(event));\n };\n };\n mutableCallable.data = data;\n mutableCallable.error = error;\n mutableCallable.pending = pending;\n mutableCallable.pendingCount = pendingCount;\n mutableCallable.status = status;\n callable.reset = () => {\n generation += 1;\n data.set(undefined);\n error.set(null);\n count.set(0);\n statusValue.set(\"idle\");\n };\n return callable;\n}\n\nfunction getFormElementCtor(node: Element | null): typeof HTMLFormElement | undefined {\n const ownerWindow = node?.ownerDocument?.defaultView as (Window & typeof globalThis) | null | undefined;\n return ownerWindow?.HTMLFormElement\n || getWindow()?.HTMLFormElement\n || (typeof HTMLFormElement !== \"undefined\" ? HTMLFormElement : undefined);\n}\n\nfunction isFormElement(node: Element | null | undefined, fallbackNode?: Element | null): node is HTMLFormElement {\n const FormElement = node ? getFormElementCtor(node) : getFormElementCtor(fallbackNode || null);\n return Boolean(node && FormElement && node instanceof FormElement);\n}\n\nfunction findFormElement(event: Event): HTMLFormElement {\n const target = (event.currentTarget || event.target) as Element | null;\n if (!getFormElementCtor(target)) throw new Error(\"Ity.form requires HTMLFormElement support\");\n if (isFormElement(target, target)) return target;\n const closest = target?.closest?.(\"form\");\n if (isFormElement(closest, target)) return closest;\n throw new Error(\"Ity.form onSubmit requires a form event target\");\n}\n\nfunction createFormDataForElement(formElement: HTMLFormElement): FormData {\n const ownerWindow = formElement.ownerDocument?.defaultView as (Window & typeof globalThis) | null | undefined;\n const FormDataCtor = ownerWindow?.FormData\n || getWindow()?.FormData\n || (typeof FormData !== \"undefined\" ? FormData : undefined);\n if (!FormDataCtor) throw new Error(\"Ity.form requires FormData support\");\n return new FormDataCtor(formElement);\n}\n\nfunction form(\n handler: (data: FormData, event: Event) => Promise | TResult,\n options: FormOptions = {}\n): FormController {\n const submitAction = action<[FormData, Event], TResult, E>(handler, options);\n\n const onSubmit = async (event: Event): Promise => {\n event.preventDefault();\n const formElement = findFormElement(event);\n const result = await submitAction(createFormDataForElement(formElement), event);\n if (options.resetOnSuccess) formElement.reset();\n return result;\n };\n\n return {\n action: submitAction,\n data: submitAction.data,\n error: submitAction.error,\n pending: submitAction.pending,\n status: submitAction.status,\n onSubmit,\n handleSubmit(event: Event): void {\n onSubmit(event).catch(() => undefined);\n },\n reset() {\n submitAction.reset();\n }\n };\n}\n\nfunction replaceStoreSnapshot>(target: Store, nextValue: Partial): void {\n const current = target.$snapshot() as Record;\n batch(() => {\n for (const key of Reflect.ownKeys(current)) {\n if (!hasOwn(nextValue as object, key)) delete (target as any)[key];\n }\n for (const key of Reflect.ownKeys(nextValue)) {\n (target as any)[key] = (nextValue as any)[key];\n }\n });\n}\n\nfunction formState>(\n initialValue: TValues,\n options: FormStateOptions = {}\n): FormState {\n const values = store(cloneValue(initialValue));\n const initialValues = signal(cloneValue(initialValue));\n const errors = store({} as FormErrorMap);\n const touched = store({} as Partial, boolean>>);\n const registeredBindings = new Map, Map>>();\n\n const allFieldNames = (): Array> => {\n const names = new Set();\n Reflect.ownKeys(initialValues.peek()).forEach((key) => names.add(String(key)));\n Reflect.ownKeys(values.$snapshot()).forEach((key) => names.add(String(key)));\n return Array.from(names) as Array>;\n };\n\n const computeErrors = (snapshot: TValues): FormErrorMap => {\n const out: FormErrorMap = {};\n const validators = options.validators || {};\n for (const key of allFieldNames()) {\n const validator = (validators as any)[key] as ((value: TValues[keyof TValues], values: TValues) => string | null | undefined) | undefined;\n if (!validator) continue;\n const message = validator((snapshot as any)[key], snapshot);\n if (message) out[key] = message;\n }\n const formErrors = options.validate?.(snapshot);\n if (formErrors) {\n for (const key of Reflect.ownKeys(formErrors)) {\n const message = (formErrors as any)[key];\n if (message) (out as any)[key] = message;\n }\n }\n return out;\n };\n\n const syncErrors = (): boolean => {\n const nextErrors = computeErrors(values.$snapshot());\n replaceStoreSnapshot(errors as any, nextErrors);\n return Reflect.ownKeys(nextErrors).length === 0;\n };\n\n const markTouched = (names?: readonly (keyof TValues)[]): void => {\n const keys = names?.length\n ? names.map((name) => String(name))\n : allFieldNames();\n batch(() => {\n for (const key of keys) {\n (touched as any)[key] = true;\n }\n });\n };\n\n const maybeValidateTouched = (): void => {\n const touchedSnapshot = touched.$snapshot();\n if (Reflect.ownKeys(touchedSnapshot).some((key) => Boolean((touchedSnapshot as any)[key]))) {\n syncErrors();\n }\n };\n\n const set = (next: Partial | ((current: TValues) => Partial | void)): void => {\n values.$patch((current) => {\n const patch = typeof next === \"function\" ? next(current) : next;\n return patch || {};\n });\n maybeValidateTouched();\n };\n\n const reset = (next?: Partial | TValues): void => {\n const base = cloneValue(next\n ? { ...initialValues.peek(), ...(next as any) }\n : initialValues.peek());\n initialValues.set(cloneValue(base));\n replaceStoreSnapshot(values as any, base);\n replaceStoreSnapshot(errors as any, {});\n replaceStoreSnapshot(touched as any, {});\n };\n\n const createFieldSignal = (name: K): Signal => {\n const signalLike = function (next?: TValues[K] | ((previous: TValues[K]) => TValues[K])): TValues[K] {\n if (arguments.length === 0) return (values as any)[name];\n const previous = (values as any)[name];\n const resolved = typeof next === \"function\"\n ? (next as (previous: TValues[K]) => TValues[K])(previous)\n : next;\n (values as any)[name] = resolved;\n maybeValidateTouched();\n return resolved as TValues[K];\n } as Signal;\n signalLike.get = () => (values as any)[name];\n signalLike.peek = () => untrack(() => (values as any)[name]);\n signalLike.set = (next) => signalLike(next);\n signalLike.update = (updater) => signalLike(updater);\n signalLike.subscribe = (callback, subscribeOptions = {}) => {\n let first = true;\n let previous = signalLike.peek();\n return effect(() => {\n const current = (values as any)[name];\n if (first) {\n first = false;\n previous = current;\n if (subscribeOptions.immediate) callback(current, current);\n return;\n }\n if (!Object.is(previous, current)) {\n const prev = previous;\n previous = current;\n callback(current, prev);\n }\n });\n };\n Object.defineProperty(signalLike, \"isSignal\", { value: true });\n return signalLike;\n };\n\n const registerBinding = (\n name: K,\n domName: string,\n type: RegisteredFormBinding[\"type\"],\n bindOptions: FormBindOptions\n ): void => {\n const fieldName = String(name) as Extract;\n const fieldBindings = registeredBindings.get(fieldName) || new Map>();\n const signature = `${domName}|${type}|${String(bindOptions.value)}`;\n fieldBindings.set(signature, {\n domName,\n type,\n value: bindOptions.value,\n parse: bindOptions.parse\n });\n registeredBindings.set(fieldName, fieldBindings as Map>);\n };\n\n const syncFromForm = (event: Event): void => {\n const NO_FORM_VALUE = Symbol(\"ity.formState.noValue\");\n let formElement: HTMLFormElement;\n try {\n formElement = findFormElement(event);\n } catch (_error) {\n return;\n }\n const formData = createFormDataForElement(formElement);\n const controls = Array.from((formElement as any).elements || []) as Array<{ name?: string; value?: string; checked?: boolean }>;\n const patch: Partial = {};\n\n const resolveControlValue = (\n name: K,\n bindings: RegisteredFormBinding[]\n ): TValues[K] | typeof NO_FORM_VALUE => {\n const primary = bindings[0];\n if (!primary) return NO_FORM_VALUE;\n const domName = primary.domName;\n const namedControls = controls.filter((control) => control && control.name === domName);\n if (primary.parse && namedControls.length) {\n const parseTarget = primary.type === \"radio\"\n ? namedControls.find((control) => Boolean(control.checked)) || namedControls[0]\n : namedControls[0];\n return primary.parse(parseTarget, event);\n }\n if (primary.type === \"checkbox\") {\n const currentValue = (values as any)[name];\n if (Array.isArray(currentValue) || bindings.some((binding) => binding.value !== undefined) || namedControls.length > 1) {\n const selected: unknown[] = [];\n for (const control of namedControls) {\n if (!control.checked) continue;\n const matched = bindings.find((binding) => String(binding.value ?? control.value ?? \"\") === String(control.value ?? \"\"));\n selected.push(matched?.value ?? control.value ?? \"\");\n }\n return selected as TValues[K];\n }\n return formData.has(domName) as TValues[K];\n }\n if (primary.type === \"radio\") {\n return (formData.get(domName) ?? (values as any)[name]) as TValues[K];\n }\n if (primary.type === \"select-multiple\") {\n const select = namedControls[0] as HTMLSelectElement | undefined;\n if (select?.selectedOptions) {\n return Array.from(select.selectedOptions).map((option) => option.value) as TValues[K];\n }\n return formData.getAll(domName) as TValues[K];\n }\n if (primary.type === \"number\") {\n const raw = formData.get(domName);\n return (raw === null || raw === \"\" ? undefined : Number(raw)) as TValues[K];\n }\n const raw = formData.get(domName);\n return (raw === null ? \"\" : raw) as TValues[K];\n };\n\n for (const fieldName of allFieldNames()) {\n const bindings = Array.from(registeredBindings.get(fieldName)?.values() || []) as RegisteredFormBinding]>[];\n const nextValue = resolveControlValue(fieldName, bindings as RegisteredFormBinding[]);\n if (nextValue !== NO_FORM_VALUE) {\n (patch as any)[fieldName] = nextValue;\n }\n }\n\n if (Reflect.ownKeys(patch).length) {\n values.$patch(() => patch);\n }\n };\n\n const bind = (name: K, bindOptions: FormBindOptions = {}): Record => {\n const field = api.field(name);\n const type = bindOptions.type || \"text\";\n const eventName = bindOptions.event\n || (type === \"checkbox\" || type === \"radio\" || type === \"select\" || type === \"select-multiple\" ? \"change\" : \"input\");\n const domName = bindOptions.name || String(name);\n registerBinding(name, domName, type, bindOptions);\n const formattedValue = bindOptions.format ? bindOptions.format(field.value()) : field.value();\n const parseValue = (event: Event): TValues[K] => {\n if (bindOptions.parse) {\n return bindOptions.parse((event.currentTarget || event.target) as unknown, event);\n }\n const target = (event.currentTarget || event.target) as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | null;\n if (!target) return field.value();\n if (type === \"checkbox\") {\n if (Array.isArray(field.value())) {\n const optionValue = bindOptions.value ?? target.value;\n const current = field.value() as unknown[];\n return ((target as HTMLInputElement).checked\n ? Array.from(new Set([...current, optionValue]))\n : current.filter((item) => !Object.is(item, optionValue))) as TValues[K];\n }\n return Boolean((target as HTMLInputElement).checked) as TValues[K];\n }\n if (type === \"radio\") {\n if (!(target as HTMLInputElement).checked) return field.value();\n return (bindOptions.value ?? (target as HTMLInputElement).value) as TValues[K];\n }\n if (type === \"select-multiple\") {\n return Array.from((target as HTMLSelectElement).selectedOptions).map((option) => option.value) as TValues[K];\n }\n if (type === \"number\") {\n const raw = target.value;\n return (raw === \"\" ? (undefined as any) : Number(raw)) as TValues[K];\n }\n return target.value as TValues[K];\n };\n\n const binding: Record = {\n name: domName,\n [`@${eventName}`]: (event: Event) => {\n field.set(parseValue(event));\n },\n \"@blur\": () => {\n markTouched([name]);\n syncErrors();\n }\n };\n\n if (type === \"checkbox\") {\n if (Array.isArray(field.value())) {\n const optionValue = bindOptions.value;\n binding.value = optionValue === undefined ? \"\" : String(optionValue);\n binding[\".checked\"] = computed(() => (field.value() as unknown[]).some((item) => Object.is(item, optionValue)));\n } else {\n binding[\".checked\"] = computed(() => Boolean(field.value()));\n binding.checked = Boolean(field.value());\n }\n return binding;\n }\n\n if (type === \"radio\") {\n const optionValue = bindOptions.value;\n binding.value = optionValue === undefined ? \"\" : String(optionValue);\n binding[\".checked\"] = computed(() => Object.is(field.value(), optionValue));\n return binding;\n }\n\n if (type === \"select-multiple\") {\n binding[\".value\"] = formattedValue as any;\n return binding;\n }\n\n const stringValue = formattedValue === undefined || formattedValue === null ? \"\" : String(formattedValue);\n binding[\".value\"] = stringValue;\n binding.value = stringValue;\n return binding;\n };\n\n const api: FormState = {\n values,\n initialValues,\n errors,\n touched,\n dirty: computed(() => !deepEqual(values.$snapshot(), initialValues())),\n valid: computed(() => Reflect.ownKeys(errors.$snapshot()).length === 0),\n field(name: K): FormField {\n const valueSignal = createFieldSignal(name);\n return {\n value: valueSignal,\n error: computed(() => (errors as any)[name] || null),\n touched: computed(() => Boolean((touched as any)[name])),\n dirty: computed(() => !deepEqual((values as any)[name], (initialValues() as any)[name])),\n bind(optionsForField?: FormBindOptions): Record {\n return bind(name, optionsForField);\n },\n set(next) {\n return valueSignal.set(next);\n },\n reset() {\n valueSignal.set((initialValues.peek() as any)[name]);\n delete (errors as any)[name];\n delete (touched as any)[name];\n }\n };\n },\n bind,\n set,\n reset,\n validate(): boolean {\n return syncErrors();\n },\n markTouched,\n submit(\n handler: (snapshot: TValues, event: Event) => Promise | TResult,\n submitOptions: FormStateSubmitOptions = {}\n ): FormStateController {\n const submitAction = action<[TValues, Event], TResult, E>(handler, submitOptions);\n const onSubmit = async (event: Event): Promise => {\n event.preventDefault();\n syncFromForm(event);\n markTouched();\n if (!syncErrors()) return undefined;\n const result = await submitAction(cloneValue(values.$snapshot()), event);\n if (submitOptions.resetOnSuccess) api.reset();\n return result;\n };\n\n return {\n state: api,\n action: submitAction,\n data: submitAction.data,\n error: submitAction.error,\n pending: submitAction.pending,\n status: submitAction.status,\n onSubmit,\n handleSubmit(event: Event): void {\n onSubmit(event).catch(() => undefined);\n },\n reset(): void {\n submitAction.reset();\n api.reset();\n }\n };\n }\n };\n\n return api;\n}\n\nfunction html(strings: TemplateStringsArray | readonly string[], ...values: unknown[]): TemplateResult {\n return {\n isTemplateResult: true,\n strings: Array.from(strings),\n values\n };\n}\n\nfunction unsafeHTML(value: string, options: UnsafeHTMLOptions = {}): UnsafeHTML {\n const sanitizer = resolveSanitizeHTML(options);\n return {\n isUnsafeHTML: true,\n value: sanitizer ? sanitizer(String(value)) : String(value)\n };\n}\n\nfunction isTemplateResult(value: unknown): value is TemplateResult {\n return !!value && typeof value === \"object\" && (value as TemplateResult).isTemplateResult === true;\n}\n\nfunction isUnsafeHTML(value: unknown): value is UnsafeHTML {\n return !!value && typeof value === \"object\" && (value as UnsafeHTML).isUnsafeHTML === true;\n}\n\nfunction isNodeLike(value: unknown): value is Node {\n return !!value && typeof value === \"object\" && typeof (value as Node).nodeType === \"number\";\n}\n\nfunction documentOrThrow(): Document {\n const doc = getDocument();\n if (!doc) throw new Error(\"Ity DOM rendering requires a document\");\n return doc;\n}\n\nfunction normalizeValue(value: unknown): unknown {\n return isSignal(value) ? value() : value;\n}\n\nfunction valueToFragment(value: unknown, doc: Document = documentOrThrow()): DocumentFragment {\n const fragment = doc.createDocumentFragment();\n appendValue(fragment, normalizeValue(value), doc);\n return fragment;\n}\n\nfunction appendValue(parent: Node, value: unknown, doc: Document): void {\n value = normalizeValue(value);\n if (value === null || value === undefined || value === false) return;\n if (Array.isArray(value)) {\n for (const item of value) appendValue(parent, item, doc);\n return;\n }\n if (isTemplateResult(value)) {\n parent.appendChild(materializeTemplate(value, doc));\n return;\n }\n if (isUnsafeHTML(value)) {\n const template = doc.createElement(\"template\");\n template.innerHTML = value.value;\n parent.appendChild(template.content.cloneNode(true));\n return;\n }\n if (isNodeLike(value)) {\n parent.appendChild(value);\n return;\n }\n parent.appendChild(doc.createTextNode(String(value)));\n}\n\ninterface Binding {\n index: number;\n kind: \"node\" | \"event\" | \"attr\" | \"prop\" | \"bool\";\n name?: string;\n}\n\nfunction bindingFromName(rawName: string): Pick {\n const first = rawName[0];\n const kind = first === \"@\" ? \"event\" : first === \".\" ? \"prop\" : first === \"?\" ? \"bool\" : \"attr\";\n const name = kind === \"attr\" ? rawName : rawName.slice(1);\n return { kind, name };\n}\n\nfunction materializeTemplate(result: TemplateResult, doc: Document = documentOrThrow()): DocumentFragment {\n const bindings: Binding[] = [];\n let source = \"\";\n\n for (let i = 0; i < result.values.length; i += 1) {\n const part = result.strings[i] ?? \"\";\n const attrMatch = part.match(/([@.?]?[\\w:-]+)\\s*=\\s*$/);\n if (attrMatch) {\n const rawName = attrMatch[1];\n const before = part.slice(0, part.length - attrMatch[0].length);\n const marker = `data-ity-bind-${i}`;\n const { kind, name } = bindingFromName(rawName);\n bindings.push({ index: i, kind, name });\n source += `${before}${marker}=\"\"`;\n } else {\n bindings.push({ index: i, kind: \"node\" });\n source += `${part}`;\n }\n }\n source += result.strings[result.strings.length - 1] ?? \"\";\n\n const template = doc.createElement(\"template\");\n template.innerHTML = source;\n const fragment = template.content.cloneNode(true) as DocumentFragment;\n applyBindings(fragment, bindings, result.values, doc);\n return fragment;\n}\n\nfunction applyBindings(root: DocumentFragment, bindings: Binding[], values: readonly unknown[], doc: Document): void {\n const comments = new Map();\n const walker = doc.createTreeWalker(root, 128);\n let current = walker.nextNode();\n while (current) {\n const comment = current as Comment;\n const match = comment.data.match(/^ity:(\\d+)$/);\n if (match) {\n const index = Number(match[1]);\n const list = comments.get(index) || [];\n list.push(comment);\n comments.set(index, list);\n }\n current = walker.nextNode();\n }\n\n for (const binding of bindings) {\n const value = normalizeValue(values[binding.index]);\n if (binding.kind === \"node\") {\n const markers = comments.get(binding.index) || [];\n for (const marker of markers) {\n marker.replaceWith(valueToFragment(value, doc));\n }\n continue;\n }\n\n const attrName = `data-ity-bind-${binding.index}`;\n const elements = Array.from(root.querySelectorAll(`[${attrName}]`)) as HTMLElement[];\n for (const element of elements) {\n element.removeAttribute(attrName);\n applyElementBinding(element, binding, value);\n }\n }\n}\n\nfunction applyElementBinding(element: HTMLElement, binding: Binding, value: unknown): void {\n const name = binding.name || \"\";\n if (binding.kind === \"attr\" && name === \"bind\" && isPlainObject(value)) {\n for (const key of Reflect.ownKeys(value)) {\n const entryValue = normalizeValue((value as any)[key]);\n const entry = bindingFromName(String(key));\n applyElementBinding(element, { index: binding.index, ...entry }, entryValue);\n }\n return;\n }\n\n if (binding.kind === \"event\") {\n if (typeof value === \"function\") {\n element.addEventListener(name, value as EventListener);\n } else if (Array.isArray(value) && typeof value[0] === \"function\") {\n element.addEventListener(name, value[0] as EventListener, value[1] as AddEventListenerOptions);\n }\n return;\n }\n\n if (binding.kind === \"prop\") {\n if (name === \"value\" && Array.isArray(value) && element.tagName === \"SELECT\" && (element as HTMLSelectElement).multiple) {\n const selectedValues = new Set(value.map((entry) => String(entry)));\n Array.from((element as HTMLSelectElement).options).forEach((option) => {\n option.selected = selectedValues.has(option.value);\n });\n return;\n }\n (element as any)[name] = value;\n return;\n }\n\n if (binding.kind === \"bool\") {\n element.toggleAttribute(name, Boolean(value));\n return;\n }\n\n if (value === false || value === null || value === undefined) {\n element.removeAttribute(name);\n return;\n }\n\n if (name === \"class\" && Array.isArray(value)) {\n element.setAttribute(\"class\", value.filter(Boolean).join(\" \"));\n return;\n }\n\n if (name === \"class\" && typeof value === \"object\") {\n const classes = Object.keys(value as Record).filter((key) => Boolean((value as any)[key]));\n element.setAttribute(\"class\", classes.join(\" \"));\n return;\n }\n\n if (name === \"style\" && typeof value === \"object\" && value !== null) {\n Object.assign((element as HTMLElement).style, value);\n return;\n }\n\n element.setAttribute(name, value === true ? \"\" : String(value));\n}\n\nfunction resolveTarget(target: string | Element | DocumentFragment | SelectorObject): Element | DocumentFragment {\n if (typeof target === \"string\") {\n const found = documentOrThrow().querySelector(target);\n if (!found) throw new Error(`Render target not found: ${target}`);\n return found;\n }\n if ((target as SelectorObject)?.isSelectorObject) {\n const first = (target as SelectorObject).first()[0];\n if (!first) throw new Error(\"Cannot render into an empty SelectorObject\");\n return first;\n }\n return target as Element | DocumentFragment;\n}\n\nfunction replaceChildren(target: Element | DocumentFragment, fragment: DocumentFragment): void {\n const maybeTarget = target as any;\n if (typeof maybeTarget.replaceChildren === \"function\") {\n maybeTarget.replaceChildren(fragment);\n return;\n }\n while (target.firstChild) target.removeChild(target.firstChild);\n target.appendChild(fragment);\n}\n\nfunction withViewTransition(update: () => void, enabled: boolean | undefined): void {\n const doc = getDocument() as any;\n if (enabled && doc && typeof doc.startViewTransition === \"function\") {\n doc.startViewTransition(update);\n } else {\n update();\n }\n}\n\nfunction render(\n view: TemplateValue | (() => TemplateValue),\n target: string | Element | DocumentFragment | SelectorObject,\n options: RenderOptions = {}\n): Cleanup {\n const mount = resolveTarget(target);\n const update = () => {\n withConfig(options.config, () => {\n const value = typeof view === \"function\" && !isSignal(view)\n ? (view as () => TemplateValue)()\n : normalizeValue(view);\n withViewTransition(() => replaceChildren(mount, valueToFragment(value)), options.transition);\n });\n };\n\n if (options.reactive === false) {\n update();\n return () => undefined;\n }\n\n return effect(update);\n}\n\nfunction renderToString(view: TemplateValue | (() => TemplateValue), options: RenderToStringOptions = {}): string {\n return withConfig(options.config, () => {\n const value = typeof view === \"function\" && !isSignal(view)\n ? (view as () => TemplateValue)()\n : normalizeValue(view);\n return valueToString(value);\n });\n}\n\nfunction valueToString(value: unknown): string {\n value = normalizeValue(value);\n if (value === null || value === undefined || value === false) return \"\";\n if (Array.isArray(value)) return value.map(valueToString).join(\"\");\n if (isTemplateResult(value)) return templateToString(value);\n if (isUnsafeHTML(value)) return value.value;\n if (isNodeLike(value)) {\n const node = value as any;\n if (typeof node.outerHTML === \"string\") return node.outerHTML;\n return escapeHTML(node.textContent || \"\");\n }\n return escapeHTML(String(value));\n}\n\nfunction templateToString(result: TemplateResult): string {\n let source = \"\";\n for (let i = 0; i < result.values.length; i += 1) {\n const part = result.strings[i] ?? \"\";\n const attrMatch = part.match(/([@.?]?[\\w:-]+)\\s*=\\s*$/);\n const value = normalizeValue(result.values[i]);\n if (attrMatch) {\n const rawName = attrMatch[1];\n const before = part.slice(0, part.length - attrMatch[0].length);\n const { kind, name } = bindingFromName(rawName);\n if (kind === \"attr\" && name === \"bind\" && isPlainObject(value)) {\n const serialized: string[] = [];\n for (const key of Reflect.ownKeys(value)) {\n const entryValue = normalizeValue((value as any)[key]);\n const entry = bindingFromName(String(key));\n const entryName = entry.name || \"\";\n if (entry.kind === \"event\" || entryValue === false || entryValue === null || entryValue === undefined) continue;\n if (entry.kind === \"bool\") {\n if (entryValue) serialized.push(entryName);\n continue;\n }\n if (entry.kind === \"prop\") {\n if (entryName === \"value\") {\n serialized.push(`value=\"${escapeAttribute(String(entryValue))}\"`);\n } else if ((entryName === \"checked\" || entryName === \"selected\") && entryValue) {\n serialized.push(entryName);\n }\n continue;\n }\n serialized.push(`${entryName}=\"${escapeAttribute(stringifyAttribute(entryName, entryValue))}\"`);\n }\n source += serialized.length ? `${before}${serialized.join(\" \")}` : before;\n continue;\n }\n if (kind === \"event\" || kind === \"prop\" || value === false || value === null || value === undefined) {\n source += before;\n } else if (kind === \"bool\") {\n source += value ? `${before}${name}` : before;\n } else {\n source += `${before}${name || \"\"}=\"${escapeAttribute(stringifyAttribute(name || \"\", value))}\"`;\n }\n } else {\n source += part + valueToString(value);\n }\n }\n source += result.strings[result.strings.length - 1] ?? \"\";\n return source;\n}\n\nfunction stringifyAttribute(name: string, value: unknown): string {\n if (name === \"class\" && Array.isArray(value)) return value.filter(Boolean).join(\" \");\n if (name === \"class\" && typeof value === \"object\" && value !== null) {\n return Object.keys(value as Record).filter((key) => Boolean((value as any)[key])).join(\" \");\n }\n if (name === \"style\" && typeof value === \"object\" && value !== null) {\n return Object.keys(value as Record)\n .map((key) => `${key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`)}:${(value as any)[key]}`)\n .join(\";\");\n }\n return value === true ? \"\" : String(value);\n}\n\nfunction escapeHTML(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(//g, \">\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeHTML(value)\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\ninterface ComponentContext {\n host: HTMLElement;\n root: HTMLElement | ShadowRoot;\n attr(name: string): ReadonlySignal;\n prop(name: string): ReadonlySignal;\n emit(name: string, detail?: T, options?: CustomEventInit): boolean;\n effect(callback: (onCleanup: (cleanup: Cleanup) => void) => void): EffectHandle;\n onConnected(callback: () => void): void;\n onDisconnected(callback: () => void): void;\n}\n\ntype ComponentRender = TemplateValue | (() => TemplateValue);\ntype ComponentSetup = (ctx: ComponentContext) => ComponentRender | void;\n\ninterface ComponentOptions {\n attrs?: string[];\n observedAttributes?: string[];\n props?: string[];\n shadow?: boolean | ShadowRootMode | ShadowRootInit;\n styles?: string;\n config?: ItyConfig | null;\n setup?: ComponentSetup;\n}\n\nfunction component(\n name: string,\n setupOrOptions: ComponentSetup | ComponentOptions,\n maybeOptions: Omit = {}\n): CustomElementConstructor {\n const win = getWindow();\n if (!win?.customElements || !win.HTMLElement) {\n throw new Error(\"Ity.component requires Custom Elements support\");\n }\n\n if (win.customElements.get(name)) {\n return win.customElements.get(name)!;\n }\n\n const definition: ComponentOptions = typeof setupOrOptions === \"function\"\n ? { ...maybeOptions, setup: setupOrOptions }\n : setupOrOptions;\n const attrs = definition.observedAttributes || definition.attrs || [];\n const props = definition.props || [];\n\n class ItyElement extends win.HTMLElement {\n static get observedAttributes(): string[] {\n return attrs;\n }\n\n private attrSignals = new Map>();\n private propSignals = new Map>();\n private connectedCallbacks: Cleanup[] = [];\n private disconnectedCallbacks: Cleanup[] = [];\n private effectRecords: Array<{\n callback: (onCleanup: (cleanup: Cleanup) => void) => void;\n handle?: EffectHandle;\n disposed: boolean;\n }> = [];\n private renderCleanup?: Cleanup;\n private mount?: HTMLElement | ShadowRoot;\n private renderTarget?: HTMLElement | ShadowRoot;\n private renderOutput?: ComponentRender;\n private initialized = false;\n private connected = false;\n\n connectedCallback(): void {\n this.ensureMount();\n for (const prop of props) this.upgradeProperty(prop);\n if (!this.initialized) {\n this.initialized = true;\n const ctx = this.createContext();\n const output = definition.setup?.(ctx);\n if (output !== undefined) {\n this.renderOutput = output as ComponentRender;\n }\n }\n this.connected = true;\n this.startRender();\n this.startEffects();\n for (const callback of this.connectedCallbacks) callback();\n }\n\n disconnectedCallback(): void {\n this.connected = false;\n if (this.renderCleanup) {\n this.renderCleanup();\n this.renderCleanup = undefined;\n }\n for (const record of this.effectRecords) {\n record.handle?.dispose();\n record.handle = undefined;\n }\n for (const callback of this.disconnectedCallbacks) callback();\n }\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\n this.ensureAttrSignal(name).set(newValue);\n }\n\n private ensureMount(): void {\n if (this.mount && this.renderTarget) return;\n const shadow = definition.shadow;\n if (shadow === false) {\n this.mount = this;\n } else {\n const init: ShadowRootInit = typeof shadow === \"object\"\n ? shadow\n : { mode: shadow === \"closed\" ? \"closed\" : \"open\" };\n this.mount = this.shadowRoot || this.attachShadow(init);\n }\n\n if (definition.styles) {\n const doc = this.ownerDocument;\n const style = doc.createElement(\"style\");\n style.textContent = definition.styles;\n const container = doc.createElement(\"span\");\n container.setAttribute(\"data-ity-component-root\", \"\");\n this.mount.appendChild(style);\n this.mount.appendChild(container);\n this.renderTarget = container;\n } else {\n this.renderTarget = this.mount;\n }\n }\n\n private startRender(): void {\n if (this.renderCleanup || this.renderOutput === undefined) return;\n this.renderCleanup = render(this.renderOutput, this.renderTarget!, {\n transition: false,\n config: definition.config\n });\n }\n\n private startEffects(): void {\n for (const record of this.effectRecords) {\n if (!record.disposed && !record.handle) {\n record.handle = effect(record.callback);\n }\n }\n }\n\n private ensureAttrSignal(name: string): Signal {\n if (!this.attrSignals.has(name)) {\n this.attrSignals.set(name, signal(this.getAttribute(name)));\n }\n return this.attrSignals.get(name)!;\n }\n\n private ensurePropSignal(name: string): Signal {\n if (!this.propSignals.has(name)) {\n this.propSignals.set(name, signal(undefined as unknown) as Signal);\n }\n return this.propSignals.get(name)! as Signal;\n }\n\n private upgradeProperty(name: string): void {\n if (!hasOwn(this, name)) return;\n const value = (this as any)[name];\n delete (this as any)[name];\n (this as any)[name] = value;\n }\n\n private createContext(): ComponentContext {\n return {\n host: this,\n root: this.mount!,\n attr: (name) => this.ensureAttrSignal(name),\n prop: (name: string) => this.ensurePropSignal(name),\n emit: (name, detail, options = {}) => this.dispatchEvent(new CustomEvent(name, {\n bubbles: true,\n composed: true,\n ...options,\n detail\n })),\n effect: (callback) => {\n const record = { callback, disposed: false, handle: undefined as EffectHandle | undefined };\n this.effectRecords.push(record);\n if (this.connected) record.handle = effect(callback);\n const dispose = (() => {\n record.disposed = true;\n record.handle?.dispose();\n record.handle = undefined;\n }) as EffectHandle;\n dispose.dispose = dispose;\n return dispose;\n },\n onConnected: (callback) => {\n this.connectedCallbacks.push(callback);\n },\n onDisconnected: (callback) => {\n this.disconnectedCallbacks.push(callback);\n }\n };\n }\n }\n\n for (const prop of props) {\n Object.defineProperty(ItyElement.prototype, prop, {\n configurable: true,\n enumerable: true,\n get(this: any) {\n return this.ensurePropSignal(prop).peek();\n },\n set(this: any, value: unknown) {\n this.ensurePropSignal(prop).set(typeof value === \"function\" ? (() => value) as any : value);\n }\n });\n }\n\n win.customElements.define(name, ItyElement);\n return ItyElement;\n}\n\ninterface EventRecord {\n callback: (data?: unknown) => void;\n ctx: any;\n}\n\nclass Evented {\n private _events: Record = {};\n\n on(evtName: string, callback: (data?: unknown) => void, context: any = this): void {\n (this._events[evtName] ||= []).push({ callback, ctx: context });\n }\n\n off(evtName?: string, callback?: (data?: unknown) => void, context?: any): void {\n if (!evtName) {\n this._events = {};\n return;\n }\n const events = this._events[evtName];\n if (!events) return;\n if (!callback) {\n delete this._events[evtName];\n return;\n }\n for (let i = events.length - 1; i >= 0; i -= 1) {\n const event = events[i];\n if (event.callback === callback && (context === undefined || event.ctx === context)) {\n events.splice(i, 1);\n }\n }\n if (events.length === 0) delete this._events[evtName];\n }\n\n trigger(evtName: string, data?: unknown): void {\n const events = this._events[evtName];\n if (!events) return;\n for (const event of events.slice()) {\n event.callback.call(event.ctx, data);\n }\n }\n}\n\nconst regexps = {\n nospaces: /^\\S*$/\n} as const;\n\nclass SelectorObject {\n [index: number]: HTMLElement;\n public readonly isSelectorObject = true;\n private nodes: HTMLElement[] = [];\n\n constructor(nodeList: ArrayLike = []) {\n this.nodes = Array.from(nodeList as HTMLElement[]);\n this.reindex();\n }\n\n get length(): number {\n return this.nodes.length;\n }\n\n [Symbol.iterator](): Iterator {\n return this.nodes[Symbol.iterator]();\n }\n\n toArray(): HTMLElement[] {\n return this.nodes.slice();\n }\n\n find(selector: string): SelectorObject {\n const nodeList: HTMLElement[] = [];\n for (const node of this.nodes) {\n const list = node.querySelectorAll(selector);\n for (const thisNode of Array.from(list)) {\n const elm = thisNode as HTMLElement;\n if (nodeList.indexOf(elm) < 0) nodeList.push(elm);\n }\n }\n return new SelectorObject(nodeList);\n }\n\n filter(selector: string): SelectorObject {\n return new SelectorObject(this.nodes.filter((node) => node.matches(selector)));\n }\n\n first(): SelectorObject {\n return new SelectorObject(this.nodes[0] ? [this.nodes[0]] : []);\n }\n\n last(): SelectorObject {\n return new SelectorObject(this.nodes.length ? [this.nodes[this.nodes.length - 1]] : []);\n }\n\n parent(): SelectorObject {\n const nodeList: HTMLElement[] = [];\n for (const node of this.nodes) {\n const parent = node.parentElement;\n if (parent && nodeList.indexOf(parent) < 0) nodeList.push(parent);\n }\n return new SelectorObject(nodeList);\n }\n\n children(selector?: string): SelectorObject {\n const nodeList: HTMLElement[] = [];\n for (const node of this.nodes) {\n for (const child of Array.from(node.children) as HTMLElement[]) {\n if (nodeList.indexOf(child) < 0 && (!selector || child.matches(selector))) {\n nodeList.push(child);\n }\n }\n }\n return new SelectorObject(nodeList);\n }\n\n remove(): SelectorObject {\n for (const node of this.nodes) node.remove();\n return new SelectorObject([]);\n }\n\n addClass(...classes: string[]): this {\n for (const node of this.nodes) node.classList.add(...classes);\n return this;\n }\n\n removeClass(value: string): this {\n if (value && regexps.nospaces.test(value)) {\n for (const node of this.nodes) node.classList.remove(value);\n }\n return this;\n }\n\n toggleClass(value: string): this {\n if (value && regexps.nospaces.test(value)) {\n for (const node of this.nodes) node.classList.toggle(value);\n }\n return this;\n }\n\n hasClass(value: string): boolean {\n return Boolean(value && regexps.nospaces.test(value) && this.nodes.some((node) => node.classList.contains(value)));\n }\n\n attr(name: string, value?: string | number | boolean | null): string | null | this {\n if (arguments.length === 1) return this.nodes[0]?.getAttribute(name) ?? null;\n for (const node of this.nodes) {\n if (value === null || value === false || value === undefined) node.removeAttribute(name);\n else node.setAttribute(name, value === true ? \"\" : String(value));\n }\n return this;\n }\n\n text(value?: string | number | boolean): string | this {\n if (arguments.length === 0) return this.nodes.map((node) => node.textContent || \"\").join(\"\");\n for (const node of this.nodes) node.textContent = String(value);\n return this;\n }\n\n on(eventName: string, listener: EventListener, options?: AddEventListenerOptions): this {\n for (const node of this.nodes) node.addEventListener(eventName, listener, options);\n return this;\n }\n\n off(eventName: string, listener: EventListener, options?: EventListenerOptions): this {\n for (const node of this.nodes) node.removeEventListener(eventName, listener, options);\n return this;\n }\n\n before(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"beforebegin\");\n }\n\n after(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"afterend\");\n }\n\n append(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"beforeend\");\n }\n\n prepend(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"afterbegin\");\n }\n\n html(content?: string | SelectorObject | HTMLElement | TemplateResult): this | string {\n if (arguments.length === 0) return this.nodes[0]?.innerHTML ?? \"\";\n return this._html(content!, \"replace\");\n }\n\n empty(): this {\n for (const node of this.nodes) node.textContent = \"\";\n return this;\n }\n\n private _html(content: string | SelectorObject | HTMLElement | TemplateResult, position: InsertPosition | \"replace\"): this {\n const doc = getDocument();\n for (const node of this.nodes) {\n if ((content as SelectorObject)?.isSelectorObject) {\n const htmls = Array.from(content as SelectorObject).map((selNode) => selNode.outerHTML).join(\"\");\n if (position === \"replace\") node.innerHTML = htmls;\n else node.insertAdjacentHTML(position as InsertPosition, htmls);\n } else if (isTemplateResult(content) && doc) {\n const fragment = materializeTemplate(content, doc);\n if (position === \"replace\") replaceChildren(node, fragment);\n else node.insertAdjacentElement(position as InsertPosition, fragmentToElement(fragment, doc));\n } else if (isNodeLike(content)) {\n const cloned = content.cloneNode(true) as HTMLElement;\n if (position === \"replace\") replaceChildren(node, valueToFragment(cloned, doc || node.ownerDocument));\n else node.insertAdjacentElement(position as InsertPosition, cloned);\n } else {\n const htmlContent = String(content);\n if (position === \"replace\") node.innerHTML = htmlContent;\n else node.insertAdjacentHTML(position as InsertPosition, htmlContent);\n }\n }\n return this;\n }\n\n private reindex(): void {\n for (const key of Object.keys(this)) {\n if (/^\\d+$/.test(key)) delete (this as any)[key];\n }\n this.nodes.forEach((node, index) => {\n (this as any)[index] = node;\n });\n }\n}\n\nfunction fragmentToElement(fragment: DocumentFragment, doc: Document): HTMLElement {\n const span = doc.createElement(\"span\");\n span.appendChild(fragment);\n return span;\n}\n\nfunction onDOMReady(fn: (...args: any[]) => void, args: unknown[] = [], context: any = Ity): void {\n const doc = getDocument();\n const func = () => fn.apply(context, args);\n if (!doc || doc.readyState !== \"loading\") func();\n else doc.addEventListener(\"DOMContentLoaded\", func, { once: true });\n}\n\ninterface AjaxOptions {\n url?: string;\n type?: string;\n data?: unknown;\n success?: (resp: any) => void;\n error?: (status?: number, error?: unknown) => void;\n}\n\nclass Model = Record> extends Evented {\n public id!: string;\n public data!: T;\n public url!: string;\n public readonly state: Signal;\n\n constructor(opts: Partial> = {}) {\n super();\n Object.assign(this, opts);\n this.id ||= `m${Math.floor(Math.random() * 100000) + 1}`;\n this.data ||= {} as T;\n this.url ||= \"\";\n this.state = signal(this.data);\n this._init(opts);\n }\n\n onDOMReady = onDOMReady;\n\n protected _init(opts?: Partial>): void {\n this.initialize(opts);\n }\n\n protected _ajax(opts: AjaxOptions = {}): void {\n const request = new XMLHttpRequest();\n const method = opts.type || \"GET\";\n const url = opts.url || this.url;\n const success = opts.success || function (this: Model, resp: any) {\n this.data = resp;\n this.state.set(resp);\n };\n const error = opts.error || function () { };\n request.open(method, url, true);\n request.onload = () => {\n if (request.status >= 200 && request.status < 400) {\n try {\n const response = request.responseText ? JSON.parse(request.responseText) : null;\n success.call(this, response);\n } catch (err) {\n error.call(this, request.status, err);\n }\n } else {\n error.call(this, request.status);\n }\n };\n request.onerror = () => error.call(this);\n request.send(opts.data === undefined ? undefined : JSON.stringify(opts.data));\n }\n\n initialize(options?: Partial>): void { }\n\n get(attr?: keyof T): any {\n const current = this.data;\n if (!attr) return current;\n return current ? (current as any)[attr as string] : undefined;\n }\n\n set(attr: keyof T | Partial, value?: any): void {\n const current = this.state.peek() || {} as T;\n const next = typeof attr === \"string\"\n ? { ...(current as any), [attr]: value } as T\n : attr as T;\n this.data = next;\n this.state.set(next);\n this.trigger(\"change\", this.data);\n }\n\n unSet(attr: keyof T): void {\n const current = this.state.peek();\n if (!current || !Object.prototype.hasOwnProperty.call(current, attr)) return;\n const next = { ...(current as any) };\n delete next[attr as string];\n this.data = next as T;\n this.state.set(this.data);\n this.trigger(\"change\", this.data);\n }\n\n clear(): void {\n this.data = {} as T;\n this.state.set(this.data);\n this.trigger(\"change\", this.data);\n }\n\n subscribe(callback: Subscriber, options?: { immediate?: boolean }): Cleanup {\n return this.state.subscribe(callback, options);\n }\n\n sync(opts?: AjaxOptions): void {\n this._ajax(opts);\n }\n\n toJSON(): T {\n return this.get();\n }\n}\n\ninterface ViewEvents {\n [selector: string]: Record;\n}\n\ninterface ViewOptions {\n el?: string | SelectorObject | NodeList | HTMLElement;\n app?: Application;\n name?: string;\n events?: ViewEvents;\n [key: string]: any;\n}\n\nclass View extends Evented {\n public id!: string;\n public el!: SelectorObject;\n public app?: Application;\n public name?: string;\n public events!: ViewEvents;\n private renderCleanup?: Cleanup;\n private delegatedListeners: Cleanup[] = [];\n\n constructor(opts: ViewOptions = {}) {\n super();\n Object.assign(this, opts);\n this.id ||= `v${Math.floor(Math.random() * 100000) + 1}`;\n if (this.app) this.app.addView(this);\n this.events ||= {};\n onDOMReady(this._init, [opts], this);\n }\n\n private _setElement(elSelector: ViewOptions[\"el\"]): void {\n const win = getWindow();\n if ((elSelector as SelectorObject)?.isSelectorObject) {\n this.el = elSelector as SelectorObject;\n } else if (win?.NodeList && elSelector instanceof win.NodeList) {\n this.el = new SelectorObject(elSelector as any);\n } else if (typeof elSelector === \"string\") {\n this.el = new SelectorObject(documentOrThrow().querySelectorAll(elSelector) as any);\n } else if (win?.HTMLElement && elSelector instanceof win.HTMLElement) {\n this.el = new SelectorObject([elSelector]);\n } else {\n throw new Error(\"el selector must be of type String, NodeList, HTMLElement or Ity.SelectorObject\");\n }\n }\n\n private _bindDOMEvents(evtObj: ViewEvents): void {\n if (!this.el || !this.el.isSelectorObject) return;\n const captureEvents = [\"focus\", \"blur\"];\n for (const selector in evtObj) {\n for (const evt in evtObj[selector]) {\n const callback = (this as any)[evtObj[selector][evt]];\n if (typeof callback !== \"function\") {\n throw new Error(`View event handler not found: ${evtObj[selector][evt]}`);\n }\n const capture = captureEvents.includes(evt);\n this._delegateEvent(selector, evt, callback, capture);\n }\n }\n }\n\n private _delegateEvent(selector: string, evtName: string, callback: (e: Event) => void, capture = false): void {\n for (const root of this.el) {\n const listener = (event: Event) => {\n let node: HTMLElement | null = event.target as HTMLElement;\n while (node) {\n if ((node as any).matches && (node as any).matches(selector)) {\n (event as any).delegateTarget = node;\n callback.call(this, event);\n break;\n }\n if (node === root) break;\n node = node.parentElement;\n }\n };\n root.addEventListener(evtName, listener, capture);\n this.delegatedListeners.push(() => root.removeEventListener(evtName, listener, capture));\n }\n }\n\n private _init(opts: ViewOptions): void {\n if (this.el) this._setElement(this.el as any);\n if (opts.el && !this.el) this._setElement(opts.el);\n this._bindDOMEvents(this.events);\n this.initialize(opts);\n }\n\n initialize(opts?: ViewOptions): void { }\n\n getName(): string | undefined {\n return this.name;\n }\n\n get(attr: keyof this): any {\n return (this as any)[attr];\n }\n\n set(attr: keyof this, value: any): void {\n (this as any)[attr] = value;\n }\n\n renderWith(view: TemplateValue | (() => TemplateValue), options?: RenderOptions): Cleanup {\n if (this.renderCleanup) this.renderCleanup();\n this.renderCleanup = render(view, this.el, options);\n return this.renderCleanup;\n }\n\n remove(): void {\n if (this.renderCleanup) this.renderCleanup();\n for (const cleanup of this.delegatedListeners.splice(0)) cleanup();\n this.el.remove();\n if (this.app) this.app.removeView(this.id);\n }\n\n select(selector: string, ctx: HTMLElement | HTMLDocument | SelectorObject = this.el): SelectorObject {\n const win = getWindow();\n if ((win?.HTMLElement && ctx instanceof win.HTMLElement) || (win?.HTMLDocument && ctx instanceof win.HTMLDocument)) {\n return new SelectorObject(ctx.querySelectorAll(selector) as any);\n }\n if ((ctx as any).isSelectorObject) return (ctx as SelectorObject).find(selector);\n throw new Error(\"Context passed to .select() must be an HTMLElement or an Ity.SelectorObject\");\n }\n}\n\nclass Application {\n public views: View[] = [];\n\n getView(id: string): View | undefined {\n return this.views.find((view) => view.id === id);\n }\n\n addView(view: View): void {\n if (view instanceof View && !this.views.includes(view)) this.views.push(view);\n }\n\n removeView(id: string): void {\n this.views = this.views.filter((view) => view.id !== id);\n }\n\n trigger(evtName: string, data?: unknown): void {\n for (const view of this.views.slice()) view.trigger(evtName, data);\n }\n}\n\nclass Collection {\n public models: M[] = [];\n public url!: string;\n public readonly state: Signal;\n private ModelClass: new () => M;\n\n constructor(models: M[] = [], ModelClass: new () => M = Model as any) {\n this.ModelClass = ModelClass;\n this.url = \"\";\n this.state = signal(this.models);\n models.forEach((model) => this.add(model));\n }\n\n get(id: string): M | undefined {\n return this.models.find((model) => model.id === id);\n }\n\n add(model: M): void {\n if (!(model instanceof Model)) return;\n this.models = [...this.models, model];\n this.state.set(this.models);\n }\n\n remove(id: string | M): void {\n const model = typeof id === \"string\" ? this.get(id) : id;\n if (!model) return;\n this.models = this.models.filter((item) => item !== model);\n this.state.set(this.models);\n }\n\n at(index: number): M | undefined {\n return this.models[index];\n }\n\n get length(): number {\n return this.models.length;\n }\n\n clear(): void {\n this.models = [];\n this.state.set(this.models);\n }\n\n find(predicate: (m: M) => boolean): M | undefined {\n return this.models.find(predicate);\n }\n\n filter(predicate: (m: M) => boolean): M[] {\n return this.models.filter(predicate);\n }\n\n map(mapper: (m: M, index: number) => T): T[] {\n return this.models.map(mapper);\n }\n\n toJSON(): any[] {\n return this.models.map((model) => model.get());\n }\n\n subscribe(callback: Subscriber, options?: { immediate?: boolean }): Cleanup {\n return this.state.subscribe(callback, options);\n }\n\n protected _ajax(opts: AjaxOptions = {}): void {\n const request = new XMLHttpRequest();\n const method = opts.type || \"GET\";\n const url = opts.url || this.url;\n const success = opts.success || function () { };\n const error = opts.error || function () { };\n request.open(method, url, true);\n request.onload = () => {\n if (request.status >= 200 && request.status < 400) {\n try {\n success.call(this, request.responseText ? JSON.parse(request.responseText) : null);\n } catch (err) {\n error.call(this, request.status, err);\n }\n } else {\n error.call(this, request.status);\n }\n };\n request.onerror = () => error.call(this);\n request.send(opts.data === undefined ? undefined : JSON.stringify(opts.data));\n }\n\n fetch(opts: AjaxOptions & { modelClass?: new () => M } = {}): void {\n const userSuccess = opts.success;\n opts.success = function (this: Collection, resp: any[]) {\n const ctor = (opts.modelClass || this.ModelClass) as new () => M;\n this.clear();\n for (const data of resp || []) {\n const model = new ctor();\n (model as any).set(data);\n this.add(model);\n }\n if (userSuccess) userSuccess.call(this, resp);\n };\n this._ajax(opts);\n }\n\n trigger(evtName: string, data?: unknown): void {\n for (const model of this.models.slice()) model.trigger(evtName, data);\n }\n}\n\ninterface RouteContext {\n path: string;\n url: URL;\n params: Record;\n query: Record;\n hash: Record;\n}\n\ntype RouteHandler = (params: Record, context: RouteContext) => void | Cleanup;\n\ninterface RouteRecord {\n pattern: string;\n handler: RouteHandler;\n exec(url: URL): Record | null;\n}\n\ninterface RouterOptions {\n base?: string;\n autoStart?: boolean;\n linkSelector?: string;\n transition?: boolean;\n notFound?: RouteHandler;\n}\n\nclass Router {\n private routes: RouteRecord[] = [];\n private started = false;\n private readonly listener = () => this.check();\n private readonly clickListener = (event: Event) => this.handleLinkClick(event);\n private readonly navigationListener = (event: any) => this.handleNavigationEvent(event);\n private routeCleanup?: Cleanup;\n private activeRoute?: RouteRecord;\n public readonly current: Signal = signal(null);\n public notFound?: RouteHandler;\n public base: string;\n public linkSelector: string;\n public transition: boolean;\n\n constructor(options: RouterOptions = {}) {\n this.base = options.base || \"/\";\n this.linkSelector = options.linkSelector || \"a[href]\";\n this.transition = Boolean(options.transition);\n this.notFound = options.notFound;\n if (options.autoStart !== false) this.start();\n }\n\n add(pattern: string, handler: RouteHandler): this {\n this.routes.push(createRouteRecord(pattern, handler));\n return this;\n }\n\n addRoute(pattern: string, handler: RouteHandler): void {\n this.add(pattern, handler);\n }\n\n removeRoute(pattern: string): this {\n if (this.activeRoute?.pattern === pattern) {\n this.disposeRoute();\n this.activeRoute = undefined;\n this.current.set(null);\n }\n this.routes = this.routes.filter((route) => route.pattern !== pattern);\n return this;\n }\n\n navigate(path: string, options: { replace?: boolean; transition?: boolean } = {}): void {\n const win = getWindow();\n if (!win) return;\n const update = () => {\n const method = options.replace ? \"replaceState\" : \"pushState\";\n win.history[method](null, \"\", withBasePath(path, this.base));\n this.check();\n };\n withViewTransition(update, options.transition ?? this.transition);\n }\n\n href(path: string): string {\n return withBasePath(path, this.base);\n }\n\n link(path: string, attrs: Record = {}): Record {\n const previousClick = attrs[\"@click\"] as ((event: Event) => void) | undefined;\n const href = this.href(path);\n return {\n ...attrs,\n href,\n \"@click\": (event: Event) => {\n previousClick?.(event);\n const currentTarget = event.currentTarget as HTMLAnchorElement | null;\n const anchor = currentTarget && typeof (currentTarget as any).matches === \"function\" && currentTarget.matches(this.linkSelector)\n ? currentTarget\n : null;\n const url = this.resolveNavigationURL(event, anchor, href);\n if (!url) return;\n event.preventDefault();\n this.navigate(`${url.pathname}${url.search}${url.hash}`);\n }\n };\n }\n\n start(): void {\n const win = getWindow();\n const doc = getDocument();\n if (!win || this.started) {\n if (win) this.check();\n return;\n }\n win.addEventListener(\"popstate\", this.listener);\n doc?.addEventListener(\"click\", this.clickListener);\n (win as any).navigation?.addEventListener?.(\"navigate\", this.navigationListener);\n this.started = true;\n this.check();\n }\n\n stop(): void {\n const win = getWindow();\n const doc = getDocument();\n if (win && this.started) {\n win.removeEventListener(\"popstate\", this.listener);\n doc?.removeEventListener(\"click\", this.clickListener);\n (win as any).navigation?.removeEventListener?.(\"navigate\", this.navigationListener);\n }\n this.started = false;\n this.disposeRoute();\n }\n\n check(): RouteContext | null {\n const win = getWindow();\n if (!win) return null;\n const url = new URL(win.location.href);\n const routePath = stripBasePath(url.pathname, this.base);\n if (routePath === null) {\n this.disposeRoute();\n this.activeRoute = undefined;\n this.current.set(null);\n return null;\n }\n const routeUrl = new URL(url.href);\n routeUrl.pathname = routePath || \"/\";\n for (const route of this.routes) {\n const routeParams = route.exec(routeUrl);\n if (!routeParams) continue;\n const query = searchParamsToObject(url.search);\n const hash = searchParamsToObject(url.hash);\n const params = { ...routeParams, ...query, ...hash };\n const context: RouteContext = {\n path: routePath || \"/\",\n url,\n params,\n query,\n hash\n };\n this.disposeRoute();\n this.activeRoute = route;\n this.current.set(context);\n const cleanup = route.handler(params, context);\n if (typeof cleanup === \"function\") this.routeCleanup = cleanup;\n return context;\n }\n this.disposeRoute();\n this.activeRoute = undefined;\n this.current.set(null);\n const cleanup = this.notFound?.({}, {\n path: routePath || \"/\",\n url,\n params: {},\n query: searchParamsToObject(url.search),\n hash: searchParamsToObject(url.hash)\n });\n if (typeof cleanup === \"function\") this.routeCleanup = cleanup;\n return null;\n }\n\n private handleLinkClick(event: Event): void {\n const anchor = this.findAnchor(event);\n const url = this.resolveNavigationURL(event, anchor);\n if (!url) return;\n event.preventDefault();\n this.navigate(`${url.pathname}${url.search}${url.hash}`);\n }\n\n private handleNavigationEvent(event: any): void {\n const win = getWindow();\n if (!win || !event?.canIntercept || !event.destination?.url || typeof event.intercept !== \"function\") return;\n const url = new URL(event.destination.url, win.location.href);\n if (url.origin !== win.location.origin) return;\n if (stripBasePath(url.pathname, this.base) === null) return;\n event.intercept({\n handler: () => {\n this.check();\n }\n });\n }\n\n private disposeRoute(): void {\n if (!this.routeCleanup) return;\n const cleanup = this.routeCleanup;\n this.routeCleanup = undefined;\n cleanup();\n }\n\n private resolveNavigationURL(event: Event, anchor: HTMLAnchorElement | null, fallbackHref?: string): URL | null {\n const mouseEvent = event as MouseEvent;\n if (event.defaultPrevented) return null;\n if (typeof mouseEvent.button === \"number\" && mouseEvent.button !== 0) return null;\n if (mouseEvent.metaKey || mouseEvent.ctrlKey || mouseEvent.shiftKey || mouseEvent.altKey) return null;\n if (anchor && ((anchor.target && anchor.target !== \"_self\") || anchor.hasAttribute(\"download\"))) return null;\n const win = getWindow();\n if (!win) return null;\n const href = anchor?.getAttribute(\"href\") ?? fallbackHref;\n if (!href || /^(mailto|tel):/i.test(href)) return null;\n const url = new URL(anchor?.href || href, win.location.href);\n if (url.origin !== win.location.origin) return null;\n if (stripBasePath(url.pathname, this.base) === null) return null;\n return url;\n }\n\n private findAnchor(event: Event): HTMLAnchorElement | null {\n const win = getWindow();\n const fromPath = typeof (event as any).composedPath === \"function\"\n ? ((event as any).composedPath() as EventTarget[])\n : [];\n for (const entry of fromPath) {\n if (!entry || !(entry as any).matches) continue;\n const element = entry as HTMLElement;\n if (element.matches(this.linkSelector)) return element as HTMLAnchorElement;\n }\n const target = event.target as HTMLElement | null;\n return target?.closest?.(this.linkSelector) as HTMLAnchorElement | null;\n }\n}\n\nfunction createRouteRecord(pattern: string, handler: RouteHandler): RouteRecord {\n const win = getWindow();\n const URLPatternCtor = (win as any)?.URLPattern || (globalThis as any).URLPattern;\n if (typeof URLPatternCtor === \"function\") {\n try {\n const nativePattern = new URLPatternCtor({ pathname: pattern });\n return {\n pattern,\n handler,\n exec(url) {\n const match = nativePattern.exec(url.href);\n return match ? decodeParams(match.pathname.groups || {}) : null;\n }\n };\n } catch (_err) {\n // Fall through to the regex matcher for non-URLPattern syntax.\n }\n }\n\n const { re, keys } = compilePathPattern(pattern);\n return {\n pattern,\n handler,\n exec(url) {\n const match = re.exec(normalizePath(url.pathname));\n if (!match) return null;\n const params: Record = {};\n keys.forEach((key, index) => {\n params[key] = decodeURIComponent(match[index + 1] || \"\");\n });\n return params;\n }\n };\n}\n\nfunction normalizeBase(base: string): string {\n const normalized = normalizePath(base || \"/\");\n return normalized === \"\" ? \"\" : normalized;\n}\n\nfunction withBasePath(path: string, base: string): string {\n const normalizedBase = normalizeBase(base);\n const parsed = new URL(path || \"/\", \"http://ity.local\");\n let pathname = normalizePath(parsed.pathname) || \"/\";\n if (normalizedBase && pathname !== normalizedBase && !pathname.startsWith(`${normalizedBase}/`)) {\n pathname = `${normalizedBase}${pathname === \"/\" ? \"\" : pathname}`;\n }\n return `${pathname}${parsed.search}${parsed.hash}`;\n}\n\nfunction stripBasePath(pathname: string, base: string): string | null {\n const normalizedBase = normalizeBase(base);\n const normalizedPath = normalizePath(pathname) || \"/\";\n if (!normalizedBase) return normalizedPath;\n if (normalizedPath === normalizedBase) return \"/\";\n if (normalizedPath.startsWith(`${normalizedBase}/`)) {\n return normalizePath(normalizedPath.slice(normalizedBase.length)) || \"/\";\n }\n return null;\n}\n\nfunction compilePathPattern(pattern: string): { re: RegExp; keys: string[] } {\n const keys: string[] = [];\n const normalized = normalizePath(pattern);\n if (normalized === \"\") return { re: /^\\/?$/, keys };\n const segments = normalized.split(\"/\").filter(Boolean);\n const source = segments.map((segment) => {\n if (segment === \"*\") {\n keys.push(\"wildcard\");\n return \"(.*)\";\n }\n if (segment.startsWith(\":\")) {\n keys.push(segment.slice(1));\n return \"([^/]+)\";\n }\n return escapeRegExp(segment);\n }).join(\"/\");\n return { re: new RegExp(`^/${source}/?$`), keys };\n}\n\nfunction normalizePath(path: string): string {\n const normalized = path.replace(/[?#].*$/, \"\").replace(/\\/+$/, \"\");\n return normalized === \"\" ? \"\" : normalized.startsWith(\"/\") ? normalized : `/${normalized}`;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction searchParamsToObject(value: string): Record {\n const out: Record = {};\n const clean = value.replace(/^[?#]/, \"\");\n if (!clean) return out;\n const params = new URLSearchParams(clean);\n params.forEach((paramValue, key) => {\n out[key] = paramValue;\n });\n return out;\n}\n\nfunction decodeParams(value: Record): Record {\n const out: Record = {};\n for (const key of Object.keys(value)) {\n out[key] = decodeURIComponent(value[key]);\n }\n return out;\n}\n\nconst defaultRouter = signal(null);\n\nfunction route(pattern: string, handler: RouteHandler): Router {\n let router = defaultRouter.peek();\n if (!router) {\n router = new Router({ autoStart: false });\n defaultRouter.set(router);\n }\n router.add(pattern, handler);\n router.start();\n return router;\n}\n\nconst Ity = {\n version: \"2.2.0\",\n createConfig,\n configure,\n signal,\n computed,\n effect,\n batch,\n untrack,\n isSignal,\n resolveSignal,\n store,\n resource,\n action,\n form,\n formState,\n html,\n unsafeHTML,\n render,\n renderToString,\n component,\n route,\n Router,\n SelectorObject,\n onDOMReady,\n Model,\n View,\n Application,\n Collection\n};\n\nfunction createAmdExport(): typeof Ity {\n const win = getWindow();\n if (win) (win as any).Ity = Ity;\n return Ity;\n}\n\n/* c8 ignore next 3 */\nif (typeof define === \"function\" && (define as any).amd) {\n (define as any)(createAmdExport);\n} else if (typeof module === \"object\" && typeof module.exports !== \"undefined\") {\n module.exports = Ity;\n}\n\nconst win = getWindow();\nif (win) {\n (win as any).Ity = Ity;\n}\n\nexport {\n Application,\n Collection,\n Model,\n Router,\n SelectorObject,\n View,\n batch,\n component,\n configure,\n createConfig,\n computed,\n effect,\n action,\n form,\n formState,\n html,\n isSignal,\n onDOMReady,\n render,\n renderToString,\n resource,\n resolveSignal,\n route,\n signal,\n store,\n unsafeHTML,\n untrack\n};\nexport type {\n Action,\n ActionOptions,\n AsyncStatus,\n ComponentContext,\n ComponentOptions,\n EffectHandle,\n FormBindOptions,\n FormController,\n FormField,\n FormOptions,\n FormState,\n FormStateController,\n FormStateOptions,\n FormStateSubmitOptions,\n HTMLSanitizer,\n ItyConfig,\n ReadonlySignal,\n RenderOptions,\n RenderToStringOptions,\n Resource,\n ResourceContext,\n ResourceOptions,\n RouteContext,\n RouteHandler,\n Signal,\n Store,\n TemplateResult,\n UnsafeHTMLOptions\n};\nexport default Ity;\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/ity.d.ts b/dist/ity.d.ts index 411e75d..d932095 100644 --- a/dist/ity.d.ts +++ b/dist/ity.d.ts @@ -40,6 +40,7 @@ interface UnsafeHTML { type HTMLSanitizer = (value: string) => string; interface UnsafeHTMLOptions { sanitize?: HTMLSanitizer; + config?: ItyConfig | null; } interface ItyConfig { sanitizeHTML?: HTMLSanitizer | null; @@ -47,6 +48,7 @@ interface ItyConfig { interface RenderOptions { reactive?: boolean; transition?: boolean; + config?: ItyConfig | null; } type StoreKey = string | symbol; interface StoreApi> { @@ -87,6 +89,9 @@ interface ActionOptions { interface Action { (...args: TArgs): Promise; submit(...args: TArgs): Promise; + run(...args: TArgs): void; + with(...args: TArgs): (...eventArgs: unknown[]) => void; + from(mapper: (event: TEvent) => TArgs): (event: TEvent) => void; readonly data: Signal; readonly error: Signal; readonly pending: ReadonlySignal; @@ -101,11 +106,68 @@ interface FormController { readonly pending: ReadonlySignal; readonly status: ReadonlySignal; onSubmit(event: Event): Promise; + handleSubmit(event: Event): void; reset(): void; } interface FormOptions extends ActionOptions { resetOnSuccess?: boolean; } +type FormErrorMap> = Partial, string>>; +interface FormBindOptions { + type?: "text" | "textarea" | "select" | "select-multiple" | "checkbox" | "radio" | "number"; + event?: string; + name?: string; + value?: unknown; + parse?: (value: unknown, event: Event) => T; + format?: (value: T) => unknown; +} +interface FormStateOptions> { + validators?: Partial<{ + [K in keyof TValues]: (value: TValues[K], values: TValues) => string | null | undefined; + }>; + validate?: (values: TValues) => FormErrorMap | void; +} +interface FormField { + readonly value: Signal; + readonly error: ReadonlySignal; + readonly touched: ReadonlySignal; + readonly dirty: ReadonlySignal; + bind(options?: FormBindOptions): Record; + set(next: T | ((previous: T) => T)): T; + reset(): void; +} +interface FormStateSubmitOptions extends ActionOptions { + resetOnSuccess?: boolean; +} +interface FormStateController, TResult, E = unknown> { + readonly state: FormState; + readonly action: Action<[TValues, Event], TResult, E>; + readonly data: Signal; + readonly error: Signal; + readonly pending: ReadonlySignal; + readonly status: ReadonlySignal; + onSubmit(event: Event): Promise; + handleSubmit(event: Event): void; + reset(): void; +} +interface FormState> { + readonly values: Store; + readonly initialValues: ReadonlySignal; + readonly errors: Store>; + readonly touched: Store, boolean>>>; + readonly dirty: ReadonlySignal; + readonly valid: ReadonlySignal; + field(name: K): FormField; + bind(name: K, options?: FormBindOptions): Record; + set(next: Partial | ((current: TValues) => Partial | void)): void; + reset(next?: Partial | TValues): void; + validate(names?: readonly (keyof TValues)[]): boolean; + markTouched(names?: readonly (keyof TValues)[]): void; + submit(handler: (values: TValues, event: Event) => Promise | TResult, options?: FormStateSubmitOptions): FormStateController; +} +interface RenderToStringOptions { + config?: ItyConfig | null; +} declare function signal(initialValue: T, options?: SignalOptions): Signal; declare function computed(getter: () => T, options?: ComputedOptions): ReadonlySignal; declare function effect(callback: (onCleanup: (cleanup: Cleanup) => void) => void): EffectHandle; @@ -114,18 +176,21 @@ declare function untrack(callback: () => T): T; declare function isSignal(value: unknown): value is ReadonlySignal; declare function resolveSignal(value: MaybeSignal): T; declare function configure(options?: ItyConfig): void; +declare function createConfig(options?: ItyConfig): ItyConfig; declare function store>(initialValue: T): Store; declare function resource(loader: (context: ResourceContext) => Promise | T, options?: ResourceOptions): Resource; declare function action(handler: (...args: TArgs) => Promise | TResult, options?: ActionOptions): Action; declare function form(handler: (data: FormData, event: Event) => Promise | TResult, options?: FormOptions): FormController; +declare function formState>(initialValue: TValues, options?: FormStateOptions): FormState; declare function html(strings: TemplateStringsArray | readonly string[], ...values: unknown[]): TemplateResult; declare function unsafeHTML(value: string, options?: UnsafeHTMLOptions): UnsafeHTML; declare function render(view: TemplateValue | (() => TemplateValue), target: string | Element | DocumentFragment | SelectorObject, options?: RenderOptions): Cleanup; -declare function renderToString(view: TemplateValue | (() => TemplateValue)): string; +declare function renderToString(view: TemplateValue | (() => TemplateValue), options?: RenderToStringOptions): string; interface ComponentContext { host: HTMLElement; root: HTMLElement | ShadowRoot; attr(name: string): ReadonlySignal; + prop(name: string): ReadonlySignal; emit(name: string, detail?: T, options?: CustomEventInit): boolean; effect(callback: (onCleanup: (cleanup: Cleanup) => void) => void): EffectHandle; onConnected(callback: () => void): void; @@ -136,8 +201,10 @@ type ComponentSetup = (ctx: ComponentContext) => ComponentRender | void; interface ComponentOptions { attrs?: string[]; observedAttributes?: string[]; + props?: string[]; shadow?: boolean | ShadowRootMode | ShadowRootInit; styles?: string; + config?: ItyConfig | null; setup?: ComponentSetup; } declare function component(name: string, setupOrOptions: ComponentSetup | ComponentOptions, maybeOptions?: Omit): CustomElementConstructor; @@ -306,16 +373,21 @@ declare class Router { replace?: boolean; transition?: boolean; }): void; + href(path: string): string; + link(path: string, attrs?: Record): Record; start(): void; stop(): void; check(): RouteContext | null; private handleLinkClick; private handleNavigationEvent; private disposeRoute; + private resolveNavigationURL; + private findAnchor; } declare function route(pattern: string, handler: RouteHandler): Router; declare const Ity: { version: string; + createConfig: typeof createConfig; configure: typeof configure; signal: typeof signal; computed: typeof computed; @@ -328,6 +400,7 @@ declare const Ity: { resource: typeof resource; action: typeof action; form: typeof form; + formState: typeof formState; html: typeof html; unsafeHTML: typeof unsafeHTML; render: typeof render; @@ -343,5 +416,5 @@ declare const Ity: { Collection: typeof Collection; }; -export { Application, Collection, Model, Router, SelectorObject, View, action, batch, component, computed, configure, Ity as default, effect, form, html, isSignal, onDOMReady, render, renderToString, resolveSignal, resource, route, signal, store, unsafeHTML, untrack }; -export type { Action, ActionOptions, AsyncStatus, ComponentContext, ComponentOptions, EffectHandle, FormController, FormOptions, HTMLSanitizer, ItyConfig, ReadonlySignal, RenderOptions, Resource, ResourceContext, ResourceOptions, RouteContext, RouteHandler, Signal, Store, TemplateResult, UnsafeHTMLOptions }; +export { Application, Collection, Model, Router, SelectorObject, View, action, batch, component, computed, configure, createConfig, Ity as default, effect, form, formState, html, isSignal, onDOMReady, render, renderToString, resolveSignal, resource, route, signal, store, unsafeHTML, untrack }; +export type { Action, ActionOptions, AsyncStatus, ComponentContext, ComponentOptions, EffectHandle, FormBindOptions, FormController, FormField, FormOptions, FormState, FormStateController, FormStateOptions, FormStateSubmitOptions, HTMLSanitizer, ItyConfig, ReadonlySignal, RenderOptions, RenderToStringOptions, Resource, ResourceContext, ResourceOptions, RouteContext, RouteHandler, Signal, Store, TemplateResult, UnsafeHTMLOptions }; diff --git a/dist/ity.esm.js b/dist/ity.esm.js index d37bf39..0c5a999 100644 --- a/dist/ity.esm.js +++ b/dist/ity.esm.js @@ -3,6 +3,7 @@ let activeObserver = null; let batchDepth = 0; const pendingEffects = new Set(); let configuredSanitizeHTML; +const activeConfigStack = []; function getWindow() { return typeof window !== "undefined" ? window : undefined; } @@ -11,6 +12,79 @@ function getDocument() { const win = getWindow(); return (_a = win === null || win === void 0 ? void 0 : win.document) !== null && _a !== void 0 ? _a : (typeof document !== "undefined" ? document : undefined); } +function hasOwn(target, key) { + return Object.prototype.hasOwnProperty.call(target, key); +} +function isPlainObject(value) { + if (!value || typeof value !== "object") + return false; + const proto = Object.getPrototypeOf(value); + return proto === Object.prototype || proto === null; +} +function cloneValue(value) { + const cloneFn = globalThis.structuredClone; + if (typeof cloneFn === "function") + return cloneFn(value); + if (Array.isArray(value)) + return value.map((item) => cloneValue(item)); + if (isPlainObject(value)) { + const out = {}; + for (const key of Reflect.ownKeys(value)) { + out[key] = cloneValue(value[key]); + } + return out; + } + return value; +} +function deepEqual(left, right) { + if (Object.is(left, right)) + return true; + if (Array.isArray(left) && Array.isArray(right)) { + if (left.length !== right.length) + return false; + for (let i = 0; i < left.length; i += 1) { + if (!deepEqual(left[i], right[i])) + return false; + } + return true; + } + if (isPlainObject(left) && isPlainObject(right)) { + const leftKeys = Reflect.ownKeys(left); + const rightKeys = Reflect.ownKeys(right); + if (leftKeys.length !== rightKeys.length) + return false; + for (const key of leftKeys) { + if (!rightKeys.includes(key)) + return false; + if (!deepEqual(left[key], right[key])) + return false; + } + return true; + } + return false; +} +function currentConfig() { + return activeConfigStack.length ? activeConfigStack[activeConfigStack.length - 1] : null; +} +function withConfig(config, callback) { + activeConfigStack.push(config || null); + try { + return callback(); + } + finally { + activeConfigStack.pop(); + } +} +function resolveSanitizeHTML(options = {}) { + var _a; + if (options.sanitize) + return options.sanitize; + const scoped = (_a = options.config) !== null && _a !== void 0 ? _a : currentConfig(); + if (scoped && hasOwn(scoped, "sanitizeHTML")) { + return scoped.sanitizeHTML || undefined; + } + return configuredSanitizeHTML; +} function trackDependency(source) { if (!activeObserver) return; @@ -240,6 +314,13 @@ function resolveSignal(value) { function configure(options = {}) { configuredSanitizeHTML = options.sanitizeHTML || undefined; } +function createConfig(options = {}) { + var _a; + const config = {}; + if (hasOwn(options, "sanitizeHTML")) + config.sanitizeHTML = (_a = options.sanitizeHTML) !== null && _a !== void 0 ? _a : null; + return config; +} function store(initialValue) { const keys = new Set(Reflect.ownKeys(initialValue)); const signals = new Map(); @@ -472,6 +553,19 @@ function action(handler, options = {}) { const callable = ((...args) => submit(...args)); const mutableCallable = callable; mutableCallable.submit = submit; + mutableCallable.run = (...args) => { + submit(...args).catch(() => undefined); + }; + mutableCallable.with = (...args) => { + return () => { + mutableCallable.run(...args); + }; + }; + mutableCallable.from = (mapper) => { + return (event) => { + mutableCallable.run(...mapper(event)); + }; + }; mutableCallable.data = data; mutableCallable.error = error; mutableCallable.pending = pending; @@ -486,40 +580,48 @@ function action(handler, options = {}) { }; return callable; } +function getFormElementCtor(node) { + var _a, _b; + const ownerWindow = (_a = node === null || node === void 0 ? void 0 : node.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView; + return (ownerWindow === null || ownerWindow === void 0 ? void 0 : ownerWindow.HTMLFormElement) + || ((_b = getWindow()) === null || _b === void 0 ? void 0 : _b.HTMLFormElement) + || (typeof HTMLFormElement !== "undefined" ? HTMLFormElement : undefined); +} +function isFormElement(node, fallbackNode) { + const FormElement = node ? getFormElementCtor(node) : getFormElementCtor(fallbackNode || null); + return Boolean(node && FormElement && node instanceof FormElement); +} +function findFormElement(event) { + var _a; + const target = (event.currentTarget || event.target); + if (!getFormElementCtor(target)) + throw new Error("Ity.form requires HTMLFormElement support"); + if (isFormElement(target, target)) + return target; + const closest = (_a = target === null || target === void 0 ? void 0 : target.closest) === null || _a === void 0 ? void 0 : _a.call(target, "form"); + if (isFormElement(closest, target)) + return closest; + throw new Error("Ity.form onSubmit requires a form event target"); +} +function createFormDataForElement(formElement) { + var _a, _b; + const ownerWindow = (_a = formElement.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView; + const FormDataCtor = (ownerWindow === null || ownerWindow === void 0 ? void 0 : ownerWindow.FormData) + || ((_b = getWindow()) === null || _b === void 0 ? void 0 : _b.FormData) + || (typeof FormData !== "undefined" ? FormData : undefined); + if (!FormDataCtor) + throw new Error("Ity.form requires FormData support"); + return new FormDataCtor(formElement); +} function form(handler, options = {}) { const submitAction = action(handler, options); - const findForm = (event) => { - var _a; - const target = (event.currentTarget || event.target); - const getFormElementCtor = (node) => { - var _a, _b; - const ownerWindow = (_a = node === null || node === void 0 ? void 0 : node.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView; - return (ownerWindow === null || ownerWindow === void 0 ? void 0 : ownerWindow.HTMLFormElement) - || ((_b = getWindow()) === null || _b === void 0 ? void 0 : _b.HTMLFormElement) - || (typeof HTMLFormElement !== "undefined" ? HTMLFormElement : undefined); - }; - const isFormElement = (node) => { - const FormElement = node ? getFormElementCtor(node) : getFormElementCtor(target); - return Boolean(node && FormElement && node instanceof FormElement); - }; - if (!getFormElementCtor(target)) - throw new Error("Ity.form requires HTMLFormElement support"); - if (isFormElement(target)) - return target; - const closest = (_a = target === null || target === void 0 ? void 0 : target.closest) === null || _a === void 0 ? void 0 : _a.call(target, "form"); - if (isFormElement(closest)) - return closest; - throw new Error("Ity.form onSubmit requires a form event target"); - }; - const createFormData = (formElement) => { - var _a, _b; - const ownerWindow = (_a = formElement.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView; - const FormDataCtor = (ownerWindow === null || ownerWindow === void 0 ? void 0 : ownerWindow.FormData) - || ((_b = getWindow()) === null || _b === void 0 ? void 0 : _b.FormData) - || (typeof FormData !== "undefined" ? FormData : undefined); - if (!FormDataCtor) - throw new Error("Ity.form requires FormData support"); - return new FormDataCtor(formElement); + const onSubmit = async (event) => { + event.preventDefault(); + const formElement = findFormElement(event); + const result = await submitAction(createFormDataForElement(formElement), event); + if (options.resetOnSuccess) + formElement.reset(); + return result; }; return { action: submitAction, @@ -527,19 +629,360 @@ function form(handler, options = {}) { error: submitAction.error, pending: submitAction.pending, status: submitAction.status, - async onSubmit(event) { - event.preventDefault(); - const formElement = findForm(event); - const result = await submitAction(createFormData(formElement), event); - if (options.resetOnSuccess) - formElement.reset(); - return result; + onSubmit, + handleSubmit(event) { + onSubmit(event).catch(() => undefined); }, reset() { submitAction.reset(); } }; } +function replaceStoreSnapshot(target, nextValue) { + const current = target.$snapshot(); + batch(() => { + for (const key of Reflect.ownKeys(current)) { + if (!hasOwn(nextValue, key)) + delete target[key]; + } + for (const key of Reflect.ownKeys(nextValue)) { + target[key] = nextValue[key]; + } + }); +} +function formState(initialValue, options = {}) { + const values = store(cloneValue(initialValue)); + const initialValues = signal(cloneValue(initialValue)); + const errors = store({}); + const touched = store({}); + const registeredBindings = new Map(); + const allFieldNames = () => { + const names = new Set(); + Reflect.ownKeys(initialValues.peek()).forEach((key) => names.add(String(key))); + Reflect.ownKeys(values.$snapshot()).forEach((key) => names.add(String(key))); + return Array.from(names); + }; + const computeErrors = (snapshot) => { + var _a; + const out = {}; + const validators = options.validators || {}; + for (const key of allFieldNames()) { + const validator = validators[key]; + if (!validator) + continue; + const message = validator(snapshot[key], snapshot); + if (message) + out[key] = message; + } + const formErrors = (_a = options.validate) === null || _a === void 0 ? void 0 : _a.call(options, snapshot); + if (formErrors) { + for (const key of Reflect.ownKeys(formErrors)) { + const message = formErrors[key]; + if (message) + out[key] = message; + } + } + return out; + }; + const syncErrors = () => { + const nextErrors = computeErrors(values.$snapshot()); + replaceStoreSnapshot(errors, nextErrors); + return Reflect.ownKeys(nextErrors).length === 0; + }; + const markTouched = (names) => { + const keys = (names === null || names === void 0 ? void 0 : names.length) + ? names.map((name) => String(name)) + : allFieldNames(); + batch(() => { + for (const key of keys) { + touched[key] = true; + } + }); + }; + const maybeValidateTouched = () => { + const touchedSnapshot = touched.$snapshot(); + if (Reflect.ownKeys(touchedSnapshot).some((key) => Boolean(touchedSnapshot[key]))) { + syncErrors(); + } + }; + const set = (next) => { + values.$patch((current) => { + const patch = typeof next === "function" ? next(current) : next; + return patch || {}; + }); + maybeValidateTouched(); + }; + const reset = (next) => { + const base = cloneValue(next + ? { ...initialValues.peek(), ...next } + : initialValues.peek()); + initialValues.set(cloneValue(base)); + replaceStoreSnapshot(values, base); + replaceStoreSnapshot(errors, {}); + replaceStoreSnapshot(touched, {}); + }; + const createFieldSignal = (name) => { + const signalLike = function (next) { + if (arguments.length === 0) + return values[name]; + const previous = values[name]; + const resolved = typeof next === "function" + ? next(previous) + : next; + values[name] = resolved; + maybeValidateTouched(); + return resolved; + }; + signalLike.get = () => values[name]; + signalLike.peek = () => untrack(() => values[name]); + signalLike.set = (next) => signalLike(next); + signalLike.update = (updater) => signalLike(updater); + signalLike.subscribe = (callback, subscribeOptions = {}) => { + let first = true; + let previous = signalLike.peek(); + return effect(() => { + const current = values[name]; + if (first) { + first = false; + previous = current; + if (subscribeOptions.immediate) + callback(current, current); + return; + } + if (!Object.is(previous, current)) { + const prev = previous; + previous = current; + callback(current, prev); + } + }); + }; + Object.defineProperty(signalLike, "isSignal", { value: true }); + return signalLike; + }; + const registerBinding = (name, domName, type, bindOptions) => { + const fieldName = String(name); + const fieldBindings = registeredBindings.get(fieldName) || new Map(); + const signature = `${domName}|${type}|${String(bindOptions.value)}`; + fieldBindings.set(signature, { + domName, + type, + value: bindOptions.value, + parse: bindOptions.parse + }); + registeredBindings.set(fieldName, fieldBindings); + }; + const syncFromForm = (event) => { + var _a; + const NO_FORM_VALUE = Symbol("ity.formState.noValue"); + let formElement; + try { + formElement = findFormElement(event); + } + catch (_error) { + return; + } + const formData = createFormDataForElement(formElement); + const controls = Array.from(formElement.elements || []); + const patch = {}; + const resolveControlValue = (name, bindings) => { + var _a, _b, _c; + const primary = bindings[0]; + if (!primary) + return NO_FORM_VALUE; + const domName = primary.domName; + const namedControls = controls.filter((control) => control && control.name === domName); + if (primary.parse && namedControls.length) { + const parseTarget = primary.type === "radio" + ? namedControls.find((control) => Boolean(control.checked)) || namedControls[0] + : namedControls[0]; + return primary.parse(parseTarget, event); + } + if (primary.type === "checkbox") { + const currentValue = values[name]; + if (Array.isArray(currentValue) || bindings.some((binding) => binding.value !== undefined) || namedControls.length > 1) { + const selected = []; + for (const control of namedControls) { + if (!control.checked) + continue; + const matched = bindings.find((binding) => { var _a, _b, _c; return String((_b = (_a = binding.value) !== null && _a !== void 0 ? _a : control.value) !== null && _b !== void 0 ? _b : "") === String((_c = control.value) !== null && _c !== void 0 ? _c : ""); }); + selected.push((_b = (_a = matched === null || matched === void 0 ? void 0 : matched.value) !== null && _a !== void 0 ? _a : control.value) !== null && _b !== void 0 ? _b : ""); + } + return selected; + } + return formData.has(domName); + } + if (primary.type === "radio") { + return ((_c = formData.get(domName)) !== null && _c !== void 0 ? _c : values[name]); + } + if (primary.type === "select-multiple") { + const select = namedControls[0]; + if (select === null || select === void 0 ? void 0 : select.selectedOptions) { + return Array.from(select.selectedOptions).map((option) => option.value); + } + return formData.getAll(domName); + } + if (primary.type === "number") { + const raw = formData.get(domName); + return (raw === null || raw === "" ? undefined : Number(raw)); + } + const raw = formData.get(domName); + return (raw === null ? "" : raw); + }; + for (const fieldName of allFieldNames()) { + const bindings = Array.from(((_a = registeredBindings.get(fieldName)) === null || _a === void 0 ? void 0 : _a.values()) || []); + const nextValue = resolveControlValue(fieldName, bindings); + if (nextValue !== NO_FORM_VALUE) { + patch[fieldName] = nextValue; + } + } + if (Reflect.ownKeys(patch).length) { + values.$patch(() => patch); + } + }; + const bind = (name, bindOptions = {}) => { + const field = api.field(name); + const type = bindOptions.type || "text"; + const eventName = bindOptions.event + || (type === "checkbox" || type === "radio" || type === "select" || type === "select-multiple" ? "change" : "input"); + const domName = bindOptions.name || String(name); + registerBinding(name, domName, type, bindOptions); + const formattedValue = bindOptions.format ? bindOptions.format(field.value()) : field.value(); + const parseValue = (event) => { + var _a, _b; + if (bindOptions.parse) { + return bindOptions.parse((event.currentTarget || event.target), event); + } + const target = (event.currentTarget || event.target); + if (!target) + return field.value(); + if (type === "checkbox") { + if (Array.isArray(field.value())) { + const optionValue = (_a = bindOptions.value) !== null && _a !== void 0 ? _a : target.value; + const current = field.value(); + return (target.checked + ? Array.from(new Set([...current, optionValue])) + : current.filter((item) => !Object.is(item, optionValue))); + } + return Boolean(target.checked); + } + if (type === "radio") { + if (!target.checked) + return field.value(); + return ((_b = bindOptions.value) !== null && _b !== void 0 ? _b : target.value); + } + if (type === "select-multiple") { + return Array.from(target.selectedOptions).map((option) => option.value); + } + if (type === "number") { + const raw = target.value; + return (raw === "" ? undefined : Number(raw)); + } + return target.value; + }; + const binding = { + name: domName, + [`@${eventName}`]: (event) => { + field.set(parseValue(event)); + }, + "@blur": () => { + markTouched([name]); + syncErrors(); + } + }; + if (type === "checkbox") { + if (Array.isArray(field.value())) { + const optionValue = bindOptions.value; + binding.value = optionValue === undefined ? "" : String(optionValue); + binding[".checked"] = computed(() => field.value().some((item) => Object.is(item, optionValue))); + } + else { + binding[".checked"] = computed(() => Boolean(field.value())); + binding.checked = Boolean(field.value()); + } + return binding; + } + if (type === "radio") { + const optionValue = bindOptions.value; + binding.value = optionValue === undefined ? "" : String(optionValue); + binding[".checked"] = computed(() => Object.is(field.value(), optionValue)); + return binding; + } + if (type === "select-multiple") { + binding[".value"] = formattedValue; + return binding; + } + const stringValue = formattedValue === undefined || formattedValue === null ? "" : String(formattedValue); + binding[".value"] = stringValue; + binding.value = stringValue; + return binding; + }; + const api = { + values, + initialValues, + errors, + touched, + dirty: computed(() => !deepEqual(values.$snapshot(), initialValues())), + valid: computed(() => Reflect.ownKeys(errors.$snapshot()).length === 0), + field(name) { + const valueSignal = createFieldSignal(name); + return { + value: valueSignal, + error: computed(() => errors[name] || null), + touched: computed(() => Boolean(touched[name])), + dirty: computed(() => !deepEqual(values[name], initialValues()[name])), + bind(optionsForField) { + return bind(name, optionsForField); + }, + set(next) { + return valueSignal.set(next); + }, + reset() { + valueSignal.set(initialValues.peek()[name]); + delete errors[name]; + delete touched[name]; + } + }; + }, + bind, + set, + reset, + validate() { + return syncErrors(); + }, + markTouched, + submit(handler, submitOptions = {}) { + const submitAction = action(handler, submitOptions); + const onSubmit = async (event) => { + event.preventDefault(); + syncFromForm(event); + markTouched(); + if (!syncErrors()) + return undefined; + const result = await submitAction(cloneValue(values.$snapshot()), event); + if (submitOptions.resetOnSuccess) + api.reset(); + return result; + }; + return { + state: api, + action: submitAction, + data: submitAction.data, + error: submitAction.error, + pending: submitAction.pending, + status: submitAction.status, + onSubmit, + handleSubmit(event) { + onSubmit(event).catch(() => undefined); + }, + reset() { + submitAction.reset(); + api.reset(); + } + }; + } + }; + return api; +} function html(strings, ...values) { return { isTemplateResult: true, @@ -548,7 +991,7 @@ function html(strings, ...values) { }; } function unsafeHTML(value, options = {}) { - const sanitizer = options.sanitize || configuredSanitizeHTML; + const sanitizer = resolveSanitizeHTML(options); return { isUnsafeHTML: true, value: sanitizer ? sanitizer(String(value)) : String(value) @@ -602,6 +1045,12 @@ function appendValue(parent, value, doc) { } parent.appendChild(doc.createTextNode(String(value))); } +function bindingFromName(rawName) { + const first = rawName[0]; + const kind = first === "@" ? "event" : first === "." ? "prop" : first === "?" ? "bool" : "attr"; + const name = kind === "attr" ? rawName : rawName.slice(1); + return { kind, name }; +} function materializeTemplate(result, doc = documentOrThrow()) { var _a, _b; const bindings = []; @@ -613,9 +1062,7 @@ function materializeTemplate(result, doc = documentOrThrow()) { const rawName = attrMatch[1]; const before = part.slice(0, part.length - attrMatch[0].length); const marker = `data-ity-bind-${i}`; - const first = rawName[0]; - const kind = first === "@" ? "event" : first === "." ? "prop" : first === "?" ? "bool" : "attr"; - const name = kind === "attr" ? rawName : rawName.slice(1); + const { kind, name } = bindingFromName(rawName); bindings.push({ index: i, kind, name }); source += `${before}${marker}=""`; } @@ -665,6 +1112,14 @@ function applyBindings(root, bindings, values, doc) { } function applyElementBinding(element, binding, value) { const name = binding.name || ""; + if (binding.kind === "attr" && name === "bind" && isPlainObject(value)) { + for (const key of Reflect.ownKeys(value)) { + const entryValue = normalizeValue(value[key]); + const entry = bindingFromName(String(key)); + applyElementBinding(element, { index: binding.index, ...entry }, entryValue); + } + return; + } if (binding.kind === "event") { if (typeof value === "function") { element.addEventListener(name, value); @@ -675,6 +1130,13 @@ function applyElementBinding(element, binding, value) { return; } if (binding.kind === "prop") { + if (name === "value" && Array.isArray(value) && element.tagName === "SELECT" && element.multiple) { + const selectedValues = new Set(value.map((entry) => String(entry))); + Array.from(element.options).forEach((option) => { + option.selected = selectedValues.has(option.value); + }); + return; + } element[name] = value; return; } @@ -738,10 +1200,12 @@ function withViewTransition(update, enabled) { function render(view, target, options = {}) { const mount = resolveTarget(target); const update = () => { - const value = typeof view === "function" && !isSignal(view) - ? view() - : normalizeValue(view); - withViewTransition(() => replaceChildren(mount, valueToFragment(value)), options.transition); + withConfig(options.config, () => { + const value = typeof view === "function" && !isSignal(view) + ? view() + : normalizeValue(view); + withViewTransition(() => replaceChildren(mount, valueToFragment(value)), options.transition); + }); }; if (options.reactive === false) { update(); @@ -749,11 +1213,13 @@ function render(view, target, options = {}) { } return effect(update); } -function renderToString(view) { - const value = typeof view === "function" && !isSignal(view) - ? view() - : normalizeValue(view); - return valueToString(value); +function renderToString(view, options = {}) { + return withConfig(options.config, () => { + const value = typeof view === "function" && !isSignal(view) + ? view() + : normalizeValue(view); + return valueToString(value); + }); } function valueToString(value) { value = normalizeValue(value); @@ -783,9 +1249,34 @@ function templateToString(result) { if (attrMatch) { const rawName = attrMatch[1]; const before = part.slice(0, part.length - attrMatch[0].length); - const first = rawName[0]; - const kind = first === "@" ? "event" : first === "." ? "prop" : first === "?" ? "bool" : "attr"; - const name = kind === "attr" ? rawName : rawName.slice(1); + const { kind, name } = bindingFromName(rawName); + if (kind === "attr" && name === "bind" && isPlainObject(value)) { + const serialized = []; + for (const key of Reflect.ownKeys(value)) { + const entryValue = normalizeValue(value[key]); + const entry = bindingFromName(String(key)); + const entryName = entry.name || ""; + if (entry.kind === "event" || entryValue === false || entryValue === null || entryValue === undefined) + continue; + if (entry.kind === "bool") { + if (entryValue) + serialized.push(entryName); + continue; + } + if (entry.kind === "prop") { + if (entryName === "value") { + serialized.push(`value="${escapeAttribute(String(entryValue))}"`); + } + else if ((entryName === "checked" || entryName === "selected") && entryValue) { + serialized.push(entryName); + } + continue; + } + serialized.push(`${entryName}="${escapeAttribute(stringifyAttribute(entryName, entryValue))}"`); + } + source += serialized.length ? `${before}${serialized.join(" ")}` : before; + continue; + } if (kind === "event" || kind === "prop" || value === false || value === null || value === undefined) { source += before; } @@ -793,7 +1284,7 @@ function templateToString(result) { source += value ? `${before}${name}` : before; } else { - source += `${before}${name}="${escapeAttribute(stringifyAttribute(name, value))}"`; + source += `${before}${name || ""}="${escapeAttribute(stringifyAttribute(name || "", value))}"`; } } else { @@ -839,10 +1330,12 @@ function component(name, setupOrOptions, maybeOptions = {}) { ? { ...maybeOptions, setup: setupOrOptions } : setupOrOptions; const attrs = definition.observedAttributes || definition.attrs || []; + const props = definition.props || []; class ItyElement extends win.HTMLElement { constructor() { super(...arguments); this.attrSignals = new Map(); + this.propSignals = new Map(); this.connectedCallbacks = []; this.disconnectedCallbacks = []; this.effectRecords = []; @@ -855,6 +1348,8 @@ function component(name, setupOrOptions, maybeOptions = {}) { connectedCallback() { var _a; this.ensureMount(); + for (const prop of props) + this.upgradeProperty(prop); if (!this.initialized) { this.initialized = true; const ctx = this.createContext(); @@ -916,7 +1411,10 @@ function component(name, setupOrOptions, maybeOptions = {}) { startRender() { if (this.renderCleanup || this.renderOutput === undefined) return; - this.renderCleanup = render(this.renderOutput, this.renderTarget, { transition: false }); + this.renderCleanup = render(this.renderOutput, this.renderTarget, { + transition: false, + config: definition.config + }); } startEffects() { for (const record of this.effectRecords) { @@ -931,11 +1429,25 @@ function component(name, setupOrOptions, maybeOptions = {}) { } return this.attrSignals.get(name); } + ensurePropSignal(name) { + if (!this.propSignals.has(name)) { + this.propSignals.set(name, signal(undefined)); + } + return this.propSignals.get(name); + } + upgradeProperty(name) { + if (!hasOwn(this, name)) + return; + const value = this[name]; + delete this[name]; + this[name] = value; + } createContext() { return { host: this, root: this.mount, attr: (name) => this.ensureAttrSignal(name), + prop: (name) => this.ensurePropSignal(name), emit: (name, detail, options = {}) => this.dispatchEvent(new CustomEvent(name, { bubbles: true, composed: true, @@ -965,6 +1477,18 @@ function component(name, setupOrOptions, maybeOptions = {}) { }; } } + for (const prop of props) { + Object.defineProperty(ItyElement.prototype, prop, { + configurable: true, + enumerable: true, + get() { + return this.ensurePropSignal(prop).peek(); + }, + set(value) { + this.ensurePropSignal(prop).set(typeof value === "function" ? (() => value) : value); + } + }); + } win.customElements.define(name, ItyElement); return ItyElement; } @@ -1510,7 +2034,7 @@ class Router { this.navigationListener = (event) => this.handleNavigationEvent(event); this.current = signal(null); this.base = options.base || "/"; - this.linkSelector = options.linkSelector || "a[data-ity-link]"; + this.linkSelector = options.linkSelector || "a[href]"; this.transition = Boolean(options.transition); this.notFound = options.notFound; if (options.autoStart !== false) @@ -1545,6 +2069,29 @@ class Router { }; withViewTransition(update, (_a = options.transition) !== null && _a !== void 0 ? _a : this.transition); } + href(path) { + return withBasePath(path, this.base); + } + link(path, attrs = {}) { + const previousClick = attrs["@click"]; + const href = this.href(path); + return { + ...attrs, + href, + "@click": (event) => { + previousClick === null || previousClick === void 0 ? void 0 : previousClick(event); + const currentTarget = event.currentTarget; + const anchor = currentTarget && typeof currentTarget.matches === "function" && currentTarget.matches(this.linkSelector) + ? currentTarget + : null; + const url = this.resolveNavigationURL(event, anchor, href); + if (!url) + return; + event.preventDefault(); + this.navigate(`${url.pathname}${url.search}${url.hash}`); + } + }; + } start() { var _a, _b; const win = getWindow(); @@ -1624,18 +2171,9 @@ class Router { return null; } handleLinkClick(event) { - var _a; - const target = event.target; - const anchor = (_a = target === null || target === void 0 ? void 0 : target.closest) === null || _a === void 0 ? void 0 : _a.call(target, this.linkSelector); - if (!anchor || anchor.target || anchor.hasAttribute("download")) - return; - const win = getWindow(); - if (!win) - return; - const url = new URL(anchor.href, win.location.href); - if (url.origin !== win.location.origin) - return; - if (stripBasePath(url.pathname, this.base) === null) + const anchor = this.findAnchor(event); + const url = this.resolveNavigationURL(event, anchor); + if (!url) return; event.preventDefault(); this.navigate(`${url.pathname}${url.search}${url.hash}`); @@ -1663,6 +2201,45 @@ class Router { this.routeCleanup = undefined; cleanup(); } + resolveNavigationURL(event, anchor, fallbackHref) { + var _a; + const mouseEvent = event; + if (event.defaultPrevented) + return null; + if (typeof mouseEvent.button === "number" && mouseEvent.button !== 0) + return null; + if (mouseEvent.metaKey || mouseEvent.ctrlKey || mouseEvent.shiftKey || mouseEvent.altKey) + return null; + if (anchor && ((anchor.target && anchor.target !== "_self") || anchor.hasAttribute("download"))) + return null; + const win = getWindow(); + if (!win) + return null; + const href = (_a = anchor === null || anchor === void 0 ? void 0 : anchor.getAttribute("href")) !== null && _a !== void 0 ? _a : fallbackHref; + if (!href || /^(mailto|tel):/i.test(href)) + return null; + const url = new URL((anchor === null || anchor === void 0 ? void 0 : anchor.href) || href, win.location.href); + if (url.origin !== win.location.origin) + return null; + if (stripBasePath(url.pathname, this.base) === null) + return null; + return url; + } + findAnchor(event) { + var _a; + const fromPath = typeof event.composedPath === "function" + ? event.composedPath() + : []; + for (const entry of fromPath) { + if (!entry || !entry.matches) + continue; + const element = entry; + if (element.matches(this.linkSelector)) + return element; + } + const target = event.target; + return (_a = target === null || target === void 0 ? void 0 : target.closest) === null || _a === void 0 ? void 0 : _a.call(target, this.linkSelector); + } } function createRouteRecord(pattern, handler) { const win = getWindow(); @@ -1780,7 +2357,8 @@ function route(pattern, handler) { return router; } const Ity = { - version: "2.1.0", + version: "2.2.0", + createConfig, configure, signal, computed, @@ -1793,6 +2371,7 @@ const Ity = { resource, action, form, + formState, html, unsafeHTML, render, @@ -1825,5 +2404,5 @@ if (win) { win.Ity = Ity; } -export { Application, Collection, Model, Router, SelectorObject, View, action, batch, component, computed, configure, Ity as default, effect, form, html, isSignal, onDOMReady, render, renderToString, resolveSignal, resource, route, signal, store, unsafeHTML, untrack }; +export { Application, Collection, Model, Router, SelectorObject, View, action, batch, component, computed, configure, createConfig, Ity as default, effect, form, formState, html, isSignal, onDOMReady, render, renderToString, resolveSignal, resource, route, signal, store, unsafeHTML, untrack }; //# sourceMappingURL=ity.esm.js.map diff --git a/dist/ity.esm.js.map b/dist/ity.esm.js.map index 0ebdf91..71126cf 100644 --- a/dist/ity.esm.js.map +++ b/dist/ity.esm.js.map @@ -1 +1 @@ -{"version":3,"file":"ity.esm.js","sources":["../Ity.ts"],"sourcesContent":["// Ity.ts 2.1.0\n// (c) 2026 Dominic Cocchiarella\n// Tiny dependency-free reactive app kernel with V1 MVC compatibility.\ndeclare var define: any;\ndeclare var module: any;\n\ntype Cleanup = () => void;\ntype Equality = (prev: T, next: T) => boolean;\ntype Subscriber = (value: T, previous: T) => void;\ntype MaybeSignal = T | ReadonlySignal;\ntype TemplateValue =\n | TemplateResult\n | UnsafeHTML\n | Node\n | string\n | number\n | boolean\n | null\n | undefined\n | TemplateValue[]\n | ReadonlySignal;\n\ninterface ReadonlySignal {\n (): T;\n get(): T;\n peek(): T;\n subscribe(callback: Subscriber, options?: { immediate?: boolean }): Cleanup;\n readonly isSignal: true;\n}\n\ninterface Signal extends ReadonlySignal {\n (next: T | ((previous: T) => T)): T;\n set(next: T | ((previous: T) => T)): T;\n update(updater: (previous: T) => T): T;\n}\n\ninterface ReactiveSource {\n observers: Set;\n}\n\ninterface ReactiveObserver {\n deps: Set;\n markDirty(): void;\n}\n\ninterface ComputedOptions {\n equals?: Equality;\n}\n\ninterface SignalOptions {\n equals?: Equality;\n name?: string;\n}\n\ninterface EffectHandle {\n (): void;\n dispose(): void;\n}\n\ninterface TemplateResult {\n readonly isTemplateResult: true;\n readonly strings: readonly string[];\n readonly values: readonly unknown[];\n}\n\ninterface UnsafeHTML {\n readonly isUnsafeHTML: true;\n readonly value: string;\n}\n\ntype HTMLSanitizer = (value: string) => string;\n\ninterface UnsafeHTMLOptions {\n sanitize?: HTMLSanitizer;\n}\n\ninterface ItyConfig {\n sanitizeHTML?: HTMLSanitizer | null;\n}\n\ninterface RenderOptions {\n reactive?: boolean;\n transition?: boolean;\n}\n\ntype StoreKey = string | symbol;\n\ninterface StoreApi> {\n $patch(patch: Partial | ((current: T) => Partial | void)): void;\n $snapshot(): T;\n $subscribe(callback: (value: T) => void, options?: { immediate?: boolean }): Cleanup;\n}\n\ntype Store> = T & StoreApi;\n\ntype AsyncStatus = \"idle\" | \"loading\" | \"success\" | \"error\";\n\ninterface ResourceContext {\n signal: AbortSignal;\n previous: T | undefined;\n refreshId: number;\n}\n\ninterface ResourceOptions {\n initialValue?: T;\n immediate?: boolean;\n keepPrevious?: boolean;\n onSuccess?: (value: T) => void;\n onError?: (error: E) => void;\n}\n\ninterface Resource {\n readonly data: Signal;\n readonly error: Signal;\n readonly loading: ReadonlySignal;\n readonly status: ReadonlySignal;\n readonly promise: Promise | null;\n refresh(): Promise;\n mutate(value: T | undefined): void;\n abort(reason?: unknown): void;\n}\n\ninterface ActionOptions {\n onSuccess?: (value: TResult) => void;\n onError?: (error: E) => void;\n}\n\ninterface Action {\n (...args: TArgs): Promise;\n submit(...args: TArgs): Promise;\n readonly data: Signal;\n readonly error: Signal;\n readonly pending: ReadonlySignal;\n readonly pendingCount: ReadonlySignal;\n readonly status: ReadonlySignal;\n reset(): void;\n}\n\ninterface FormController {\n readonly action: Action<[FormData, Event], TResult, E>;\n readonly data: Signal;\n readonly error: Signal;\n readonly pending: ReadonlySignal;\n readonly status: ReadonlySignal;\n onSubmit(event: Event): Promise;\n reset(): void;\n}\n\ninterface FormOptions extends ActionOptions {\n resetOnSuccess?: boolean;\n}\n\nconst defaultEquals = Object.is;\nlet activeObserver: ReactiveObserver | null = null;\nlet batchDepth = 0;\nconst pendingEffects = new Set();\nlet configuredSanitizeHTML: HTMLSanitizer | undefined;\n\nfunction getWindow(): (Window & typeof globalThis) | undefined {\n return typeof window !== \"undefined\" ? window : undefined;\n}\n\nfunction getDocument(): Document | undefined {\n const win = getWindow();\n return win?.document ?? (typeof document !== \"undefined\" ? document : undefined);\n}\n\nfunction trackDependency(source: ReactiveSource): void {\n if (!activeObserver) return;\n source.observers.add(activeObserver);\n activeObserver.deps.add(source);\n}\n\nfunction cleanupDependencies(observer: ReactiveObserver): void {\n for (const dep of observer.deps) {\n dep.observers.delete(observer);\n }\n observer.deps.clear();\n}\n\nfunction notifyObservers(source: ReactiveSource): void {\n for (const observer of Array.from(source.observers)) {\n observer.markDirty();\n }\n}\n\nfunction flushEffects(): void {\n if (batchDepth > 0) return;\n while (pendingEffects.size) {\n const effects = Array.from(pendingEffects);\n pendingEffects.clear();\n for (const effect of effects) {\n effect.run();\n }\n }\n}\n\nfunction queueEffect(effect: ReactiveEffect): void {\n pendingEffects.add(effect);\n flushEffects();\n}\n\nclass SignalNode implements ReactiveSource {\n observers = new Set();\n private subscribers = new Set>();\n private value: T;\n private equals: Equality;\n\n constructor(value: T, options: SignalOptions = {}) {\n this.value = value;\n this.equals = options.equals || defaultEquals;\n }\n\n read(track = true): T {\n if (track) trackDependency(this);\n return this.value;\n }\n\n write(next: T | ((previous: T) => T)): T {\n const previous = this.value;\n const resolved = typeof next === \"function\"\n ? (next as (previous: T) => T)(previous)\n : next;\n if (this.equals(previous, resolved)) return previous;\n this.value = resolved;\n notifyObservers(this);\n for (const subscriber of Array.from(this.subscribers)) {\n subscriber(resolved, previous);\n }\n flushEffects();\n return resolved;\n }\n\n subscribe(callback: Subscriber, options: { immediate?: boolean } = {}): Cleanup {\n this.subscribers.add(callback);\n if (options.immediate) callback(this.value, this.value);\n return () => {\n this.subscribers.delete(callback);\n };\n }\n}\n\nclass ComputedNode implements ReactiveSource, ReactiveObserver {\n observers = new Set();\n deps = new Set();\n private subscribers = new Set>();\n private dirty = true;\n private initialized = false;\n private value!: T;\n private equals: Equality;\n\n constructor(private readonly getter: () => T, options: ComputedOptions = {}) {\n this.equals = options.equals || defaultEquals;\n }\n\n read(track = true): T {\n if (track) trackDependency(this);\n if (this.dirty) this.evaluate();\n return this.value;\n }\n\n markDirty(): void {\n if (this.dirty) return;\n const previous = this.value;\n this.dirty = true;\n notifyObservers(this);\n if (this.subscribers.size) {\n const next = this.read(false);\n if (!this.equals(previous, next)) {\n for (const subscriber of Array.from(this.subscribers)) {\n subscriber(next, previous);\n }\n }\n }\n }\n\n subscribe(callback: Subscriber, options: { immediate?: boolean } = {}): Cleanup {\n this.subscribers.add(callback);\n if (options.immediate) {\n const current = this.read(false);\n callback(current, current);\n }\n return () => {\n this.subscribers.delete(callback);\n };\n }\n\n private evaluate(): void {\n cleanupDependencies(this);\n const previousObserver = activeObserver;\n activeObserver = this;\n try {\n this.value = this.getter();\n this.dirty = false;\n this.initialized = true;\n } finally {\n activeObserver = previousObserver;\n }\n }\n}\n\nclass ReactiveEffect implements ReactiveObserver {\n deps = new Set();\n private disposed = false;\n private cleanup?: Cleanup;\n\n constructor(private readonly callback: (onCleanup: (cleanup: Cleanup) => void) => void) {\n this.run();\n }\n\n markDirty(): void {\n if (!this.disposed) queueEffect(this);\n }\n\n run(): void {\n if (this.disposed) return;\n cleanupDependencies(this);\n if (this.cleanup) {\n const cleanup = this.cleanup;\n this.cleanup = undefined;\n cleanup();\n }\n const previousObserver = activeObserver;\n activeObserver = this;\n try {\n this.callback((cleanup) => {\n this.cleanup = cleanup;\n });\n } finally {\n activeObserver = previousObserver;\n }\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n cleanupDependencies(this);\n if (this.cleanup) {\n const cleanup = this.cleanup;\n this.cleanup = undefined;\n cleanup();\n }\n pendingEffects.delete(this);\n }\n}\n\nfunction signal(initialValue: T, options: SignalOptions = {}): Signal {\n const node = new SignalNode(initialValue, options);\n const readWrite = function (next?: T | ((previous: T) => T)): T {\n if (arguments.length === 0) return node.read(true);\n return node.write(next as T | ((previous: T) => T));\n } as Signal;\n readWrite.get = () => node.read(true);\n readWrite.peek = () => node.read(false);\n readWrite.set = (next) => node.write(next);\n readWrite.update = (updater) => node.write(updater);\n readWrite.subscribe = (callback, subscribeOptions) => node.subscribe(callback, subscribeOptions);\n Object.defineProperty(readWrite, \"isSignal\", { value: true });\n return readWrite;\n}\n\nfunction computed(getter: () => T, options: ComputedOptions = {}): ReadonlySignal {\n const node = new ComputedNode(getter, options);\n const read = function (): T {\n return node.read(true);\n } as ReadonlySignal;\n read.get = () => node.read(true);\n read.peek = () => node.read(false);\n read.subscribe = (callback, subscribeOptions) => node.subscribe(callback, subscribeOptions);\n Object.defineProperty(read, \"isSignal\", { value: true });\n return read;\n}\n\nfunction effect(callback: (onCleanup: (cleanup: Cleanup) => void) => void): EffectHandle {\n const runner = new ReactiveEffect(callback);\n const dispose = (() => runner.dispose()) as EffectHandle;\n dispose.dispose = dispose;\n return dispose;\n}\n\nfunction batch(callback: () => T): T {\n batchDepth += 1;\n try {\n return callback();\n } finally {\n batchDepth -= 1;\n flushEffects();\n }\n}\n\nfunction untrack(callback: () => T): T {\n const previousObserver = activeObserver;\n activeObserver = null;\n try {\n return callback();\n } finally {\n activeObserver = previousObserver;\n }\n}\n\nfunction isSignal(value: unknown): value is ReadonlySignal {\n return typeof value === \"function\" && (value as any).isSignal === true;\n}\n\nfunction resolveSignal(value: MaybeSignal): T {\n return isSignal(value) ? value() : value;\n}\n\nfunction configure(options: ItyConfig = {}): void {\n configuredSanitizeHTML = options.sanitizeHTML || undefined;\n}\n\nfunction store>(initialValue: T): Store {\n const keys = new Set(Reflect.ownKeys(initialValue));\n const signals = new Map>();\n const structure = signal(0);\n\n const ensureSignal = (key: StoreKey): Signal => {\n if (!signals.has(key)) {\n signals.set(key, signal((initialValue as any)[key]));\n }\n return signals.get(key)!;\n };\n\n const bumpStructure = (): void => {\n structure.update((version) => version + 1);\n };\n\n const setKey = (key: StoreKey, value: any): void => {\n const hadKey = keys.has(key);\n if (!hadKey) keys.add(key);\n ensureSignal(key).set(value);\n if (!hadKey) bumpStructure();\n };\n\n const snapshot = (): T => {\n structure();\n const out: any = {};\n for (const key of keys) {\n out[key] = ensureSignal(key)();\n }\n return out as T;\n };\n\n const api: StoreApi = {\n $patch(patch) {\n const current = snapshot();\n const next = typeof patch === \"function\" ? patch(current) : patch;\n if (!next) return;\n batch(() => {\n for (const key of Reflect.ownKeys(next)) {\n setKey(key, (next as any)[key]);\n }\n });\n },\n $snapshot: snapshot,\n $subscribe(callback, options = {}) {\n let first = true;\n return effect(() => {\n const value = snapshot();\n if (first && !options.immediate) {\n first = false;\n return;\n }\n first = false;\n callback(value);\n });\n }\n };\n\n return new Proxy(api as Store, {\n get(target, key, receiver) {\n if (key in target) return Reflect.get(target, key, receiver);\n return ensureSignal(key)();\n },\n set(_target, key, value) {\n batch(() => {\n setKey(key, value);\n });\n return true;\n },\n deleteProperty(_target, key) {\n if (!keys.has(key)) return true;\n keys.delete(key);\n batch(() => {\n ensureSignal(key).set(undefined);\n bumpStructure();\n });\n return true;\n },\n ownKeys(target) {\n structure();\n return Array.from(new Set([...Reflect.ownKeys(target), ...keys]));\n },\n getOwnPropertyDescriptor(target, key) {\n structure();\n if (Object.prototype.hasOwnProperty.call(target, key)) {\n return { ...Reflect.getOwnPropertyDescriptor(target, key)!, enumerable: false };\n }\n if (!keys.has(key)) return undefined;\n return { enumerable: true, configurable: true };\n },\n has(target, key) {\n structure();\n return key in target || keys.has(key);\n }\n });\n}\n\nfunction resource(\n loader: (context: ResourceContext) => Promise | T,\n options: ResourceOptions = {}\n): Resource {\n const data = signal(options.initialValue);\n const error = signal(null);\n const pending = signal(false);\n const statusValue = signal(options.initialValue === undefined ? \"idle\" : \"success\");\n const loading = computed(() => pending());\n const status = computed(() => statusValue());\n const keepPrevious = options.keepPrevious !== false;\n let controller: AbortController | null = null;\n let refreshId = 0;\n let currentPromise: Promise | null = null;\n\n const api: Resource = {\n data,\n error,\n loading,\n status,\n get promise() {\n return currentPromise;\n },\n refresh() {\n refreshId += 1;\n const id = refreshId;\n if (controller) controller.abort();\n controller = new AbortController();\n const signal = controller.signal;\n const previous = data.peek();\n pending.set(true);\n statusValue.set(\"loading\");\n error.set(null);\n if (!keepPrevious) data.set(undefined);\n\n currentPromise = Promise.resolve()\n .then(() => loader({ signal, previous, refreshId: id }))\n .then((value) => {\n if (id !== refreshId || signal.aborted) return data.peek();\n data.set(value);\n error.set(null);\n statusValue.set(\"success\");\n options.onSuccess?.(value);\n return value;\n })\n .catch((err) => {\n if (id !== refreshId) return data.peek();\n error.set(err as E);\n statusValue.set(\"error\");\n options.onError?.(err as E);\n return data.peek();\n })\n .finally(() => {\n if (id === refreshId) {\n pending.set(false);\n controller = null;\n }\n });\n\n return currentPromise;\n },\n mutate(value) {\n refreshId += 1;\n if (controller) controller.abort();\n controller = null;\n currentPromise = null;\n data.set(value);\n error.set(null);\n pending.set(false);\n statusValue.set(value === undefined ? \"idle\" : \"success\");\n },\n abort(reason?: unknown) {\n if (!controller) return;\n refreshId += 1;\n controller.abort(reason);\n controller = null;\n currentPromise = null;\n pending.set(false);\n statusValue.set(data.peek() === undefined ? \"idle\" : \"success\");\n }\n };\n\n if (options.immediate !== false) {\n api.refresh();\n }\n\n return api;\n}\n\nfunction action(\n handler: (...args: TArgs) => Promise | TResult,\n options: ActionOptions = {}\n): Action {\n const data = signal(undefined);\n const error = signal(null);\n const count = signal(0);\n const statusValue = signal(\"idle\");\n const pending = computed(() => count() > 0);\n const pendingCount = computed(() => count());\n const status = computed(() => statusValue());\n let generation = 0;\n\n const submit = (...args: TArgs): Promise => {\n const runGeneration = generation;\n count.update((value) => value + 1);\n statusValue.set(\"loading\");\n error.set(null);\n\n return Promise.resolve()\n .then(() => handler(...args))\n .then((value) => {\n if (runGeneration === generation) {\n data.set(value);\n error.set(null);\n options.onSuccess?.(value);\n if (count.peek() <= 1) statusValue.set(\"success\");\n }\n return value;\n })\n .catch((err) => {\n if (runGeneration === generation) {\n error.set(err as E);\n options.onError?.(err as E);\n if (count.peek() <= 1) statusValue.set(\"error\");\n }\n throw err;\n })\n .finally(() => {\n if (runGeneration !== generation) return;\n count.update((value) => Math.max(0, value - 1));\n if (count.peek() > 0) statusValue.set(\"loading\");\n });\n };\n\n const callable = ((...args: TArgs) => submit(...args)) as Action;\n const mutableCallable = callable as Action & {\n submit: (...args: TArgs) => Promise;\n data: Signal;\n error: Signal;\n pending: ReadonlySignal;\n pendingCount: ReadonlySignal;\n status: ReadonlySignal;\n };\n mutableCallable.submit = submit;\n mutableCallable.data = data;\n mutableCallable.error = error;\n mutableCallable.pending = pending;\n mutableCallable.pendingCount = pendingCount;\n mutableCallable.status = status;\n callable.reset = () => {\n generation += 1;\n data.set(undefined);\n error.set(null);\n count.set(0);\n statusValue.set(\"idle\");\n };\n return callable;\n}\n\nfunction form(\n handler: (data: FormData, event: Event) => Promise | TResult,\n options: FormOptions = {}\n): FormController {\n const submitAction = action<[FormData, Event], TResult, E>(handler, options);\n\n const findForm = (event: Event): HTMLFormElement => {\n const target = (event.currentTarget || event.target) as Element | null;\n const getFormElementCtor = (node: Element | null): typeof HTMLFormElement | undefined => {\n const ownerWindow = node?.ownerDocument?.defaultView as (Window & typeof globalThis) | null | undefined;\n return ownerWindow?.HTMLFormElement\n || getWindow()?.HTMLFormElement\n || (typeof HTMLFormElement !== \"undefined\" ? HTMLFormElement : undefined);\n };\n const isFormElement = (node: Element | null | undefined): node is HTMLFormElement => {\n const FormElement = node ? getFormElementCtor(node) : getFormElementCtor(target);\n return Boolean(node && FormElement && node instanceof FormElement);\n };\n if (!getFormElementCtor(target)) throw new Error(\"Ity.form requires HTMLFormElement support\");\n if (isFormElement(target)) return target;\n const closest = target?.closest?.(\"form\");\n if (isFormElement(closest)) return closest;\n throw new Error(\"Ity.form onSubmit requires a form event target\");\n };\n\n const createFormData = (formElement: HTMLFormElement): FormData => {\n const ownerWindow = formElement.ownerDocument?.defaultView as (Window & typeof globalThis) | null | undefined;\n const FormDataCtor = ownerWindow?.FormData\n || getWindow()?.FormData\n || (typeof FormData !== \"undefined\" ? FormData : undefined);\n if (!FormDataCtor) throw new Error(\"Ity.form requires FormData support\");\n return new FormDataCtor(formElement);\n };\n\n return {\n action: submitAction,\n data: submitAction.data,\n error: submitAction.error,\n pending: submitAction.pending,\n status: submitAction.status,\n async onSubmit(event: Event): Promise {\n event.preventDefault();\n const formElement = findForm(event);\n const result = await submitAction(createFormData(formElement), event);\n if (options.resetOnSuccess) formElement.reset();\n return result;\n },\n reset() {\n submitAction.reset();\n }\n };\n}\n\nfunction html(strings: TemplateStringsArray | readonly string[], ...values: unknown[]): TemplateResult {\n return {\n isTemplateResult: true,\n strings: Array.from(strings),\n values\n };\n}\n\nfunction unsafeHTML(value: string, options: UnsafeHTMLOptions = {}): UnsafeHTML {\n const sanitizer = options.sanitize || configuredSanitizeHTML;\n return {\n isUnsafeHTML: true,\n value: sanitizer ? sanitizer(String(value)) : String(value)\n };\n}\n\nfunction isTemplateResult(value: unknown): value is TemplateResult {\n return !!value && typeof value === \"object\" && (value as TemplateResult).isTemplateResult === true;\n}\n\nfunction isUnsafeHTML(value: unknown): value is UnsafeHTML {\n return !!value && typeof value === \"object\" && (value as UnsafeHTML).isUnsafeHTML === true;\n}\n\nfunction isNodeLike(value: unknown): value is Node {\n return !!value && typeof value === \"object\" && typeof (value as Node).nodeType === \"number\";\n}\n\nfunction documentOrThrow(): Document {\n const doc = getDocument();\n if (!doc) throw new Error(\"Ity DOM rendering requires a document\");\n return doc;\n}\n\nfunction normalizeValue(value: unknown): unknown {\n return isSignal(value) ? value() : value;\n}\n\nfunction valueToFragment(value: unknown, doc: Document = documentOrThrow()): DocumentFragment {\n const fragment = doc.createDocumentFragment();\n appendValue(fragment, normalizeValue(value), doc);\n return fragment;\n}\n\nfunction appendValue(parent: Node, value: unknown, doc: Document): void {\n value = normalizeValue(value);\n if (value === null || value === undefined || value === false) return;\n if (Array.isArray(value)) {\n for (const item of value) appendValue(parent, item, doc);\n return;\n }\n if (isTemplateResult(value)) {\n parent.appendChild(materializeTemplate(value, doc));\n return;\n }\n if (isUnsafeHTML(value)) {\n const template = doc.createElement(\"template\");\n template.innerHTML = value.value;\n parent.appendChild(template.content.cloneNode(true));\n return;\n }\n if (isNodeLike(value)) {\n parent.appendChild(value);\n return;\n }\n parent.appendChild(doc.createTextNode(String(value)));\n}\n\ninterface Binding {\n index: number;\n kind: \"node\" | \"event\" | \"attr\" | \"prop\" | \"bool\";\n name?: string;\n}\n\nfunction materializeTemplate(result: TemplateResult, doc: Document = documentOrThrow()): DocumentFragment {\n const bindings: Binding[] = [];\n let source = \"\";\n\n for (let i = 0; i < result.values.length; i += 1) {\n const part = result.strings[i] ?? \"\";\n const attrMatch = part.match(/([@.?]?[\\w:-]+)\\s*=\\s*$/);\n if (attrMatch) {\n const rawName = attrMatch[1];\n const before = part.slice(0, part.length - attrMatch[0].length);\n const marker = `data-ity-bind-${i}`;\n const first = rawName[0];\n const kind = first === \"@\" ? \"event\" : first === \".\" ? \"prop\" : first === \"?\" ? \"bool\" : \"attr\";\n const name = kind === \"attr\" ? rawName : rawName.slice(1);\n bindings.push({ index: i, kind, name });\n source += `${before}${marker}=\"\"`;\n } else {\n bindings.push({ index: i, kind: \"node\" });\n source += `${part}`;\n }\n }\n source += result.strings[result.strings.length - 1] ?? \"\";\n\n const template = doc.createElement(\"template\");\n template.innerHTML = source;\n const fragment = template.content.cloneNode(true) as DocumentFragment;\n applyBindings(fragment, bindings, result.values, doc);\n return fragment;\n}\n\nfunction applyBindings(root: DocumentFragment, bindings: Binding[], values: readonly unknown[], doc: Document): void {\n const comments = new Map();\n const walker = doc.createTreeWalker(root, 128);\n let current = walker.nextNode();\n while (current) {\n const comment = current as Comment;\n const match = comment.data.match(/^ity:(\\d+)$/);\n if (match) {\n const index = Number(match[1]);\n const list = comments.get(index) || [];\n list.push(comment);\n comments.set(index, list);\n }\n current = walker.nextNode();\n }\n\n for (const binding of bindings) {\n const value = normalizeValue(values[binding.index]);\n if (binding.kind === \"node\") {\n const markers = comments.get(binding.index) || [];\n for (const marker of markers) {\n marker.replaceWith(valueToFragment(value, doc));\n }\n continue;\n }\n\n const attrName = `data-ity-bind-${binding.index}`;\n const elements = Array.from(root.querySelectorAll(`[${attrName}]`)) as HTMLElement[];\n for (const element of elements) {\n element.removeAttribute(attrName);\n applyElementBinding(element, binding, value);\n }\n }\n}\n\nfunction applyElementBinding(element: HTMLElement, binding: Binding, value: unknown): void {\n const name = binding.name || \"\";\n if (binding.kind === \"event\") {\n if (typeof value === \"function\") {\n element.addEventListener(name, value as EventListener);\n } else if (Array.isArray(value) && typeof value[0] === \"function\") {\n element.addEventListener(name, value[0] as EventListener, value[1] as AddEventListenerOptions);\n }\n return;\n }\n\n if (binding.kind === \"prop\") {\n (element as any)[name] = value;\n return;\n }\n\n if (binding.kind === \"bool\") {\n element.toggleAttribute(name, Boolean(value));\n return;\n }\n\n if (value === false || value === null || value === undefined) {\n element.removeAttribute(name);\n return;\n }\n\n if (name === \"class\" && Array.isArray(value)) {\n element.setAttribute(\"class\", value.filter(Boolean).join(\" \"));\n return;\n }\n\n if (name === \"class\" && typeof value === \"object\") {\n const classes = Object.keys(value as Record).filter((key) => Boolean((value as any)[key]));\n element.setAttribute(\"class\", classes.join(\" \"));\n return;\n }\n\n if (name === \"style\" && typeof value === \"object\" && value !== null) {\n Object.assign((element as HTMLElement).style, value);\n return;\n }\n\n element.setAttribute(name, value === true ? \"\" : String(value));\n}\n\nfunction resolveTarget(target: string | Element | DocumentFragment | SelectorObject): Element | DocumentFragment {\n if (typeof target === \"string\") {\n const found = documentOrThrow().querySelector(target);\n if (!found) throw new Error(`Render target not found: ${target}`);\n return found;\n }\n if ((target as SelectorObject)?.isSelectorObject) {\n const first = (target as SelectorObject).first()[0];\n if (!first) throw new Error(\"Cannot render into an empty SelectorObject\");\n return first;\n }\n return target as Element | DocumentFragment;\n}\n\nfunction replaceChildren(target: Element | DocumentFragment, fragment: DocumentFragment): void {\n const maybeTarget = target as any;\n if (typeof maybeTarget.replaceChildren === \"function\") {\n maybeTarget.replaceChildren(fragment);\n return;\n }\n while (target.firstChild) target.removeChild(target.firstChild);\n target.appendChild(fragment);\n}\n\nfunction withViewTransition(update: () => void, enabled: boolean | undefined): void {\n const doc = getDocument() as any;\n if (enabled && doc && typeof doc.startViewTransition === \"function\") {\n doc.startViewTransition(update);\n } else {\n update();\n }\n}\n\nfunction render(\n view: TemplateValue | (() => TemplateValue),\n target: string | Element | DocumentFragment | SelectorObject,\n options: RenderOptions = {}\n): Cleanup {\n const mount = resolveTarget(target);\n const update = () => {\n const value = typeof view === \"function\" && !isSignal(view)\n ? (view as () => TemplateValue)()\n : normalizeValue(view);\n withViewTransition(() => replaceChildren(mount, valueToFragment(value)), options.transition);\n };\n\n if (options.reactive === false) {\n update();\n return () => undefined;\n }\n\n return effect(update);\n}\n\nfunction renderToString(view: TemplateValue | (() => TemplateValue)): string {\n const value = typeof view === \"function\" && !isSignal(view)\n ? (view as () => TemplateValue)()\n : normalizeValue(view);\n return valueToString(value);\n}\n\nfunction valueToString(value: unknown): string {\n value = normalizeValue(value);\n if (value === null || value === undefined || value === false) return \"\";\n if (Array.isArray(value)) return value.map(valueToString).join(\"\");\n if (isTemplateResult(value)) return templateToString(value);\n if (isUnsafeHTML(value)) return value.value;\n if (isNodeLike(value)) {\n const node = value as any;\n if (typeof node.outerHTML === \"string\") return node.outerHTML;\n return escapeHTML(node.textContent || \"\");\n }\n return escapeHTML(String(value));\n}\n\nfunction templateToString(result: TemplateResult): string {\n let source = \"\";\n for (let i = 0; i < result.values.length; i += 1) {\n const part = result.strings[i] ?? \"\";\n const attrMatch = part.match(/([@.?]?[\\w:-]+)\\s*=\\s*$/);\n const value = normalizeValue(result.values[i]);\n if (attrMatch) {\n const rawName = attrMatch[1];\n const before = part.slice(0, part.length - attrMatch[0].length);\n const first = rawName[0];\n const kind = first === \"@\" ? \"event\" : first === \".\" ? \"prop\" : first === \"?\" ? \"bool\" : \"attr\";\n const name = kind === \"attr\" ? rawName : rawName.slice(1);\n if (kind === \"event\" || kind === \"prop\" || value === false || value === null || value === undefined) {\n source += before;\n } else if (kind === \"bool\") {\n source += value ? `${before}${name}` : before;\n } else {\n source += `${before}${name}=\"${escapeAttribute(stringifyAttribute(name, value))}\"`;\n }\n } else {\n source += part + valueToString(value);\n }\n }\n source += result.strings[result.strings.length - 1] ?? \"\";\n return source;\n}\n\nfunction stringifyAttribute(name: string, value: unknown): string {\n if (name === \"class\" && Array.isArray(value)) return value.filter(Boolean).join(\" \");\n if (name === \"class\" && typeof value === \"object\" && value !== null) {\n return Object.keys(value as Record).filter((key) => Boolean((value as any)[key])).join(\" \");\n }\n if (name === \"style\" && typeof value === \"object\" && value !== null) {\n return Object.keys(value as Record)\n .map((key) => `${key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`)}:${(value as any)[key]}`)\n .join(\";\");\n }\n return value === true ? \"\" : String(value);\n}\n\nfunction escapeHTML(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(//g, \">\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeHTML(value)\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\ninterface ComponentContext {\n host: HTMLElement;\n root: HTMLElement | ShadowRoot;\n attr(name: string): ReadonlySignal;\n emit(name: string, detail?: T, options?: CustomEventInit): boolean;\n effect(callback: (onCleanup: (cleanup: Cleanup) => void) => void): EffectHandle;\n onConnected(callback: () => void): void;\n onDisconnected(callback: () => void): void;\n}\n\ntype ComponentRender = TemplateValue | (() => TemplateValue);\ntype ComponentSetup = (ctx: ComponentContext) => ComponentRender | void;\n\ninterface ComponentOptions {\n attrs?: string[];\n observedAttributes?: string[];\n shadow?: boolean | ShadowRootMode | ShadowRootInit;\n styles?: string;\n setup?: ComponentSetup;\n}\n\nfunction component(\n name: string,\n setupOrOptions: ComponentSetup | ComponentOptions,\n maybeOptions: Omit = {}\n): CustomElementConstructor {\n const win = getWindow();\n if (!win?.customElements || !win.HTMLElement) {\n throw new Error(\"Ity.component requires Custom Elements support\");\n }\n\n if (win.customElements.get(name)) {\n return win.customElements.get(name)!;\n }\n\n const definition: ComponentOptions = typeof setupOrOptions === \"function\"\n ? { ...maybeOptions, setup: setupOrOptions }\n : setupOrOptions;\n const attrs = definition.observedAttributes || definition.attrs || [];\n\n class ItyElement extends win.HTMLElement {\n static get observedAttributes(): string[] {\n return attrs;\n }\n\n private attrSignals = new Map>();\n private connectedCallbacks: Cleanup[] = [];\n private disconnectedCallbacks: Cleanup[] = [];\n private effectRecords: Array<{\n callback: (onCleanup: (cleanup: Cleanup) => void) => void;\n handle?: EffectHandle;\n disposed: boolean;\n }> = [];\n private renderCleanup?: Cleanup;\n private mount?: HTMLElement | ShadowRoot;\n private renderTarget?: HTMLElement | ShadowRoot;\n private renderOutput?: ComponentRender;\n private initialized = false;\n private connected = false;\n\n connectedCallback(): void {\n this.ensureMount();\n if (!this.initialized) {\n this.initialized = true;\n const ctx = this.createContext();\n const output = definition.setup?.(ctx);\n if (output !== undefined) {\n this.renderOutput = output as ComponentRender;\n }\n }\n this.connected = true;\n this.startRender();\n this.startEffects();\n for (const callback of this.connectedCallbacks) callback();\n }\n\n disconnectedCallback(): void {\n this.connected = false;\n if (this.renderCleanup) {\n this.renderCleanup();\n this.renderCleanup = undefined;\n }\n for (const record of this.effectRecords) {\n record.handle?.dispose();\n record.handle = undefined;\n }\n for (const callback of this.disconnectedCallbacks) callback();\n }\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\n this.ensureAttrSignal(name).set(newValue);\n }\n\n private ensureMount(): void {\n if (this.mount && this.renderTarget) return;\n const shadow = definition.shadow;\n if (shadow === false) {\n this.mount = this;\n } else {\n const init: ShadowRootInit = typeof shadow === \"object\"\n ? shadow\n : { mode: shadow === \"closed\" ? \"closed\" : \"open\" };\n this.mount = this.shadowRoot || this.attachShadow(init);\n }\n\n if (definition.styles) {\n const doc = this.ownerDocument;\n const style = doc.createElement(\"style\");\n style.textContent = definition.styles;\n const container = doc.createElement(\"span\");\n container.setAttribute(\"data-ity-component-root\", \"\");\n this.mount.appendChild(style);\n this.mount.appendChild(container);\n this.renderTarget = container;\n } else {\n this.renderTarget = this.mount;\n }\n }\n\n private startRender(): void {\n if (this.renderCleanup || this.renderOutput === undefined) return;\n this.renderCleanup = render(this.renderOutput, this.renderTarget!, { transition: false });\n }\n\n private startEffects(): void {\n for (const record of this.effectRecords) {\n if (!record.disposed && !record.handle) {\n record.handle = effect(record.callback);\n }\n }\n }\n\n private ensureAttrSignal(name: string): Signal {\n if (!this.attrSignals.has(name)) {\n this.attrSignals.set(name, signal(this.getAttribute(name)));\n }\n return this.attrSignals.get(name)!;\n }\n\n private createContext(): ComponentContext {\n return {\n host: this,\n root: this.mount!,\n attr: (name) => this.ensureAttrSignal(name),\n emit: (name, detail, options = {}) => this.dispatchEvent(new CustomEvent(name, {\n bubbles: true,\n composed: true,\n ...options,\n detail\n })),\n effect: (callback) => {\n const record = { callback, disposed: false, handle: undefined as EffectHandle | undefined };\n this.effectRecords.push(record);\n if (this.connected) record.handle = effect(callback);\n const dispose = (() => {\n record.disposed = true;\n record.handle?.dispose();\n record.handle = undefined;\n }) as EffectHandle;\n dispose.dispose = dispose;\n return dispose;\n },\n onConnected: (callback) => {\n this.connectedCallbacks.push(callback);\n },\n onDisconnected: (callback) => {\n this.disconnectedCallbacks.push(callback);\n }\n };\n }\n }\n\n win.customElements.define(name, ItyElement);\n return ItyElement;\n}\n\ninterface EventRecord {\n callback: (data?: unknown) => void;\n ctx: any;\n}\n\nclass Evented {\n private _events: Record = {};\n\n on(evtName: string, callback: (data?: unknown) => void, context: any = this): void {\n (this._events[evtName] ||= []).push({ callback, ctx: context });\n }\n\n off(evtName?: string, callback?: (data?: unknown) => void, context?: any): void {\n if (!evtName) {\n this._events = {};\n return;\n }\n const events = this._events[evtName];\n if (!events) return;\n if (!callback) {\n delete this._events[evtName];\n return;\n }\n for (let i = events.length - 1; i >= 0; i -= 1) {\n const event = events[i];\n if (event.callback === callback && (context === undefined || event.ctx === context)) {\n events.splice(i, 1);\n }\n }\n if (events.length === 0) delete this._events[evtName];\n }\n\n trigger(evtName: string, data?: unknown): void {\n const events = this._events[evtName];\n if (!events) return;\n for (const event of events.slice()) {\n event.callback.call(event.ctx, data);\n }\n }\n}\n\nconst regexps = {\n nospaces: /^\\S*$/\n} as const;\n\nclass SelectorObject {\n [index: number]: HTMLElement;\n public readonly isSelectorObject = true;\n private nodes: HTMLElement[] = [];\n\n constructor(nodeList: ArrayLike = []) {\n this.nodes = Array.from(nodeList as HTMLElement[]);\n this.reindex();\n }\n\n get length(): number {\n return this.nodes.length;\n }\n\n [Symbol.iterator](): Iterator {\n return this.nodes[Symbol.iterator]();\n }\n\n toArray(): HTMLElement[] {\n return this.nodes.slice();\n }\n\n find(selector: string): SelectorObject {\n const nodeList: HTMLElement[] = [];\n for (const node of this.nodes) {\n const list = node.querySelectorAll(selector);\n for (const thisNode of Array.from(list)) {\n const elm = thisNode as HTMLElement;\n if (nodeList.indexOf(elm) < 0) nodeList.push(elm);\n }\n }\n return new SelectorObject(nodeList);\n }\n\n filter(selector: string): SelectorObject {\n return new SelectorObject(this.nodes.filter((node) => node.matches(selector)));\n }\n\n first(): SelectorObject {\n return new SelectorObject(this.nodes[0] ? [this.nodes[0]] : []);\n }\n\n last(): SelectorObject {\n return new SelectorObject(this.nodes.length ? [this.nodes[this.nodes.length - 1]] : []);\n }\n\n parent(): SelectorObject {\n const nodeList: HTMLElement[] = [];\n for (const node of this.nodes) {\n const parent = node.parentElement;\n if (parent && nodeList.indexOf(parent) < 0) nodeList.push(parent);\n }\n return new SelectorObject(nodeList);\n }\n\n children(selector?: string): SelectorObject {\n const nodeList: HTMLElement[] = [];\n for (const node of this.nodes) {\n for (const child of Array.from(node.children) as HTMLElement[]) {\n if (nodeList.indexOf(child) < 0 && (!selector || child.matches(selector))) {\n nodeList.push(child);\n }\n }\n }\n return new SelectorObject(nodeList);\n }\n\n remove(): SelectorObject {\n for (const node of this.nodes) node.remove();\n return new SelectorObject([]);\n }\n\n addClass(...classes: string[]): this {\n for (const node of this.nodes) node.classList.add(...classes);\n return this;\n }\n\n removeClass(value: string): this {\n if (value && regexps.nospaces.test(value)) {\n for (const node of this.nodes) node.classList.remove(value);\n }\n return this;\n }\n\n toggleClass(value: string): this {\n if (value && regexps.nospaces.test(value)) {\n for (const node of this.nodes) node.classList.toggle(value);\n }\n return this;\n }\n\n hasClass(value: string): boolean {\n return Boolean(value && regexps.nospaces.test(value) && this.nodes.some((node) => node.classList.contains(value)));\n }\n\n attr(name: string, value?: string | number | boolean | null): string | null | this {\n if (arguments.length === 1) return this.nodes[0]?.getAttribute(name) ?? null;\n for (const node of this.nodes) {\n if (value === null || value === false || value === undefined) node.removeAttribute(name);\n else node.setAttribute(name, value === true ? \"\" : String(value));\n }\n return this;\n }\n\n text(value?: string | number | boolean): string | this {\n if (arguments.length === 0) return this.nodes.map((node) => node.textContent || \"\").join(\"\");\n for (const node of this.nodes) node.textContent = String(value);\n return this;\n }\n\n on(eventName: string, listener: EventListener, options?: AddEventListenerOptions): this {\n for (const node of this.nodes) node.addEventListener(eventName, listener, options);\n return this;\n }\n\n off(eventName: string, listener: EventListener, options?: EventListenerOptions): this {\n for (const node of this.nodes) node.removeEventListener(eventName, listener, options);\n return this;\n }\n\n before(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"beforebegin\");\n }\n\n after(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"afterend\");\n }\n\n append(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"beforeend\");\n }\n\n prepend(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"afterbegin\");\n }\n\n html(content?: string | SelectorObject | HTMLElement | TemplateResult): this | string {\n if (arguments.length === 0) return this.nodes[0]?.innerHTML ?? \"\";\n return this._html(content!, \"replace\");\n }\n\n empty(): this {\n for (const node of this.nodes) node.textContent = \"\";\n return this;\n }\n\n private _html(content: string | SelectorObject | HTMLElement | TemplateResult, position: InsertPosition | \"replace\"): this {\n const doc = getDocument();\n for (const node of this.nodes) {\n if ((content as SelectorObject)?.isSelectorObject) {\n const htmls = Array.from(content as SelectorObject).map((selNode) => selNode.outerHTML).join(\"\");\n if (position === \"replace\") node.innerHTML = htmls;\n else node.insertAdjacentHTML(position as InsertPosition, htmls);\n } else if (isTemplateResult(content) && doc) {\n const fragment = materializeTemplate(content, doc);\n if (position === \"replace\") replaceChildren(node, fragment);\n else node.insertAdjacentElement(position as InsertPosition, fragmentToElement(fragment, doc));\n } else if (isNodeLike(content)) {\n const cloned = content.cloneNode(true) as HTMLElement;\n if (position === \"replace\") replaceChildren(node, valueToFragment(cloned, doc || node.ownerDocument));\n else node.insertAdjacentElement(position as InsertPosition, cloned);\n } else {\n const htmlContent = String(content);\n if (position === \"replace\") node.innerHTML = htmlContent;\n else node.insertAdjacentHTML(position as InsertPosition, htmlContent);\n }\n }\n return this;\n }\n\n private reindex(): void {\n for (const key of Object.keys(this)) {\n if (/^\\d+$/.test(key)) delete (this as any)[key];\n }\n this.nodes.forEach((node, index) => {\n (this as any)[index] = node;\n });\n }\n}\n\nfunction fragmentToElement(fragment: DocumentFragment, doc: Document): HTMLElement {\n const span = doc.createElement(\"span\");\n span.appendChild(fragment);\n return span;\n}\n\nfunction onDOMReady(fn: (...args: any[]) => void, args: unknown[] = [], context: any = Ity): void {\n const doc = getDocument();\n const func = () => fn.apply(context, args);\n if (!doc || doc.readyState !== \"loading\") func();\n else doc.addEventListener(\"DOMContentLoaded\", func, { once: true });\n}\n\ninterface AjaxOptions {\n url?: string;\n type?: string;\n data?: unknown;\n success?: (resp: any) => void;\n error?: (status?: number, error?: unknown) => void;\n}\n\nclass Model = Record> extends Evented {\n public id!: string;\n public data!: T;\n public url!: string;\n public readonly state: Signal;\n\n constructor(opts: Partial> = {}) {\n super();\n Object.assign(this, opts);\n this.id ||= `m${Math.floor(Math.random() * 100000) + 1}`;\n this.data ||= {} as T;\n this.url ||= \"\";\n this.state = signal(this.data);\n this._init(opts);\n }\n\n onDOMReady = onDOMReady;\n\n protected _init(opts?: Partial>): void {\n this.initialize(opts);\n }\n\n protected _ajax(opts: AjaxOptions = {}): void {\n const request = new XMLHttpRequest();\n const method = opts.type || \"GET\";\n const url = opts.url || this.url;\n const success = opts.success || function (this: Model, resp: any) {\n this.data = resp;\n this.state.set(resp);\n };\n const error = opts.error || function () { };\n request.open(method, url, true);\n request.onload = () => {\n if (request.status >= 200 && request.status < 400) {\n try {\n const response = request.responseText ? JSON.parse(request.responseText) : null;\n success.call(this, response);\n } catch (err) {\n error.call(this, request.status, err);\n }\n } else {\n error.call(this, request.status);\n }\n };\n request.onerror = () => error.call(this);\n request.send(opts.data === undefined ? undefined : JSON.stringify(opts.data));\n }\n\n initialize(options?: Partial>): void { }\n\n get(attr?: keyof T): any {\n const current = this.data;\n if (!attr) return current;\n return current ? (current as any)[attr as string] : undefined;\n }\n\n set(attr: keyof T | Partial, value?: any): void {\n const current = this.state.peek() || {} as T;\n const next = typeof attr === \"string\"\n ? { ...(current as any), [attr]: value } as T\n : attr as T;\n this.data = next;\n this.state.set(next);\n this.trigger(\"change\", this.data);\n }\n\n unSet(attr: keyof T): void {\n const current = this.state.peek();\n if (!current || !Object.prototype.hasOwnProperty.call(current, attr)) return;\n const next = { ...(current as any) };\n delete next[attr as string];\n this.data = next as T;\n this.state.set(this.data);\n this.trigger(\"change\", this.data);\n }\n\n clear(): void {\n this.data = {} as T;\n this.state.set(this.data);\n this.trigger(\"change\", this.data);\n }\n\n subscribe(callback: Subscriber, options?: { immediate?: boolean }): Cleanup {\n return this.state.subscribe(callback, options);\n }\n\n sync(opts?: AjaxOptions): void {\n this._ajax(opts);\n }\n\n toJSON(): T {\n return this.get();\n }\n}\n\ninterface ViewEvents {\n [selector: string]: Record;\n}\n\ninterface ViewOptions {\n el?: string | SelectorObject | NodeList | HTMLElement;\n app?: Application;\n name?: string;\n events?: ViewEvents;\n [key: string]: any;\n}\n\nclass View extends Evented {\n public id!: string;\n public el!: SelectorObject;\n public app?: Application;\n public name?: string;\n public events!: ViewEvents;\n private renderCleanup?: Cleanup;\n private delegatedListeners: Cleanup[] = [];\n\n constructor(opts: ViewOptions = {}) {\n super();\n Object.assign(this, opts);\n this.id ||= `v${Math.floor(Math.random() * 100000) + 1}`;\n if (this.app) this.app.addView(this);\n this.events ||= {};\n onDOMReady(this._init, [opts], this);\n }\n\n private _setElement(elSelector: ViewOptions[\"el\"]): void {\n const win = getWindow();\n if ((elSelector as SelectorObject)?.isSelectorObject) {\n this.el = elSelector as SelectorObject;\n } else if (win?.NodeList && elSelector instanceof win.NodeList) {\n this.el = new SelectorObject(elSelector as any);\n } else if (typeof elSelector === \"string\") {\n this.el = new SelectorObject(documentOrThrow().querySelectorAll(elSelector) as any);\n } else if (win?.HTMLElement && elSelector instanceof win.HTMLElement) {\n this.el = new SelectorObject([elSelector]);\n } else {\n throw new Error(\"el selector must be of type String, NodeList, HTMLElement or Ity.SelectorObject\");\n }\n }\n\n private _bindDOMEvents(evtObj: ViewEvents): void {\n if (!this.el || !this.el.isSelectorObject) return;\n const captureEvents = [\"focus\", \"blur\"];\n for (const selector in evtObj) {\n for (const evt in evtObj[selector]) {\n const callback = (this as any)[evtObj[selector][evt]];\n if (typeof callback !== \"function\") {\n throw new Error(`View event handler not found: ${evtObj[selector][evt]}`);\n }\n const capture = captureEvents.includes(evt);\n this._delegateEvent(selector, evt, callback, capture);\n }\n }\n }\n\n private _delegateEvent(selector: string, evtName: string, callback: (e: Event) => void, capture = false): void {\n for (const root of this.el) {\n const listener = (event: Event) => {\n let node: HTMLElement | null = event.target as HTMLElement;\n while (node) {\n if ((node as any).matches && (node as any).matches(selector)) {\n (event as any).delegateTarget = node;\n callback.call(this, event);\n break;\n }\n if (node === root) break;\n node = node.parentElement;\n }\n };\n root.addEventListener(evtName, listener, capture);\n this.delegatedListeners.push(() => root.removeEventListener(evtName, listener, capture));\n }\n }\n\n private _init(opts: ViewOptions): void {\n if (this.el) this._setElement(this.el as any);\n if (opts.el && !this.el) this._setElement(opts.el);\n this._bindDOMEvents(this.events);\n this.initialize(opts);\n }\n\n initialize(opts?: ViewOptions): void { }\n\n getName(): string | undefined {\n return this.name;\n }\n\n get(attr: keyof this): any {\n return (this as any)[attr];\n }\n\n set(attr: keyof this, value: any): void {\n (this as any)[attr] = value;\n }\n\n renderWith(view: TemplateValue | (() => TemplateValue), options?: RenderOptions): Cleanup {\n if (this.renderCleanup) this.renderCleanup();\n this.renderCleanup = render(view, this.el, options);\n return this.renderCleanup;\n }\n\n remove(): void {\n if (this.renderCleanup) this.renderCleanup();\n for (const cleanup of this.delegatedListeners.splice(0)) cleanup();\n this.el.remove();\n if (this.app) this.app.removeView(this.id);\n }\n\n select(selector: string, ctx: HTMLElement | HTMLDocument | SelectorObject = this.el): SelectorObject {\n const win = getWindow();\n if ((win?.HTMLElement && ctx instanceof win.HTMLElement) || (win?.HTMLDocument && ctx instanceof win.HTMLDocument)) {\n return new SelectorObject(ctx.querySelectorAll(selector) as any);\n }\n if ((ctx as any).isSelectorObject) return (ctx as SelectorObject).find(selector);\n throw new Error(\"Context passed to .select() must be an HTMLElement or an Ity.SelectorObject\");\n }\n}\n\nclass Application {\n public views: View[] = [];\n\n getView(id: string): View | undefined {\n return this.views.find((view) => view.id === id);\n }\n\n addView(view: View): void {\n if (view instanceof View && !this.views.includes(view)) this.views.push(view);\n }\n\n removeView(id: string): void {\n this.views = this.views.filter((view) => view.id !== id);\n }\n\n trigger(evtName: string, data?: unknown): void {\n for (const view of this.views.slice()) view.trigger(evtName, data);\n }\n}\n\nclass Collection {\n public models: M[] = [];\n public url!: string;\n public readonly state: Signal;\n private ModelClass: new () => M;\n\n constructor(models: M[] = [], ModelClass: new () => M = Model as any) {\n this.ModelClass = ModelClass;\n this.url = \"\";\n this.state = signal(this.models);\n models.forEach((model) => this.add(model));\n }\n\n get(id: string): M | undefined {\n return this.models.find((model) => model.id === id);\n }\n\n add(model: M): void {\n if (!(model instanceof Model)) return;\n this.models = [...this.models, model];\n this.state.set(this.models);\n }\n\n remove(id: string | M): void {\n const model = typeof id === \"string\" ? this.get(id) : id;\n if (!model) return;\n this.models = this.models.filter((item) => item !== model);\n this.state.set(this.models);\n }\n\n at(index: number): M | undefined {\n return this.models[index];\n }\n\n get length(): number {\n return this.models.length;\n }\n\n clear(): void {\n this.models = [];\n this.state.set(this.models);\n }\n\n find(predicate: (m: M) => boolean): M | undefined {\n return this.models.find(predicate);\n }\n\n filter(predicate: (m: M) => boolean): M[] {\n return this.models.filter(predicate);\n }\n\n map(mapper: (m: M, index: number) => T): T[] {\n return this.models.map(mapper);\n }\n\n toJSON(): any[] {\n return this.models.map((model) => model.get());\n }\n\n subscribe(callback: Subscriber, options?: { immediate?: boolean }): Cleanup {\n return this.state.subscribe(callback, options);\n }\n\n protected _ajax(opts: AjaxOptions = {}): void {\n const request = new XMLHttpRequest();\n const method = opts.type || \"GET\";\n const url = opts.url || this.url;\n const success = opts.success || function () { };\n const error = opts.error || function () { };\n request.open(method, url, true);\n request.onload = () => {\n if (request.status >= 200 && request.status < 400) {\n try {\n success.call(this, request.responseText ? JSON.parse(request.responseText) : null);\n } catch (err) {\n error.call(this, request.status, err);\n }\n } else {\n error.call(this, request.status);\n }\n };\n request.onerror = () => error.call(this);\n request.send(opts.data === undefined ? undefined : JSON.stringify(opts.data));\n }\n\n fetch(opts: AjaxOptions & { modelClass?: new () => M } = {}): void {\n const userSuccess = opts.success;\n opts.success = function (this: Collection, resp: any[]) {\n const ctor = (opts.modelClass || this.ModelClass) as new () => M;\n this.clear();\n for (const data of resp || []) {\n const model = new ctor();\n (model as any).set(data);\n this.add(model);\n }\n if (userSuccess) userSuccess.call(this, resp);\n };\n this._ajax(opts);\n }\n\n trigger(evtName: string, data?: unknown): void {\n for (const model of this.models.slice()) model.trigger(evtName, data);\n }\n}\n\ninterface RouteContext {\n path: string;\n url: URL;\n params: Record;\n query: Record;\n hash: Record;\n}\n\ntype RouteHandler = (params: Record, context: RouteContext) => void | Cleanup;\n\ninterface RouteRecord {\n pattern: string;\n handler: RouteHandler;\n exec(url: URL): Record | null;\n}\n\ninterface RouterOptions {\n base?: string;\n autoStart?: boolean;\n linkSelector?: string;\n transition?: boolean;\n notFound?: RouteHandler;\n}\n\nclass Router {\n private routes: RouteRecord[] = [];\n private started = false;\n private readonly listener = () => this.check();\n private readonly clickListener = (event: Event) => this.handleLinkClick(event);\n private readonly navigationListener = (event: any) => this.handleNavigationEvent(event);\n private routeCleanup?: Cleanup;\n private activeRoute?: RouteRecord;\n public readonly current: Signal = signal(null);\n public notFound?: RouteHandler;\n public base: string;\n public linkSelector: string;\n public transition: boolean;\n\n constructor(options: RouterOptions = {}) {\n this.base = options.base || \"/\";\n this.linkSelector = options.linkSelector || \"a[data-ity-link]\";\n this.transition = Boolean(options.transition);\n this.notFound = options.notFound;\n if (options.autoStart !== false) this.start();\n }\n\n add(pattern: string, handler: RouteHandler): this {\n this.routes.push(createRouteRecord(pattern, handler));\n return this;\n }\n\n addRoute(pattern: string, handler: RouteHandler): void {\n this.add(pattern, handler);\n }\n\n removeRoute(pattern: string): this {\n if (this.activeRoute?.pattern === pattern) {\n this.disposeRoute();\n this.activeRoute = undefined;\n this.current.set(null);\n }\n this.routes = this.routes.filter((route) => route.pattern !== pattern);\n return this;\n }\n\n navigate(path: string, options: { replace?: boolean; transition?: boolean } = {}): void {\n const win = getWindow();\n if (!win) return;\n const update = () => {\n const method = options.replace ? \"replaceState\" : \"pushState\";\n win.history[method](null, \"\", withBasePath(path, this.base));\n this.check();\n };\n withViewTransition(update, options.transition ?? this.transition);\n }\n\n start(): void {\n const win = getWindow();\n const doc = getDocument();\n if (!win || this.started) {\n if (win) this.check();\n return;\n }\n win.addEventListener(\"popstate\", this.listener);\n doc?.addEventListener(\"click\", this.clickListener);\n (win as any).navigation?.addEventListener?.(\"navigate\", this.navigationListener);\n this.started = true;\n this.check();\n }\n\n stop(): void {\n const win = getWindow();\n const doc = getDocument();\n if (win && this.started) {\n win.removeEventListener(\"popstate\", this.listener);\n doc?.removeEventListener(\"click\", this.clickListener);\n (win as any).navigation?.removeEventListener?.(\"navigate\", this.navigationListener);\n }\n this.started = false;\n this.disposeRoute();\n }\n\n check(): RouteContext | null {\n const win = getWindow();\n if (!win) return null;\n const url = new URL(win.location.href);\n const routePath = stripBasePath(url.pathname, this.base);\n if (routePath === null) {\n this.disposeRoute();\n this.activeRoute = undefined;\n this.current.set(null);\n return null;\n }\n const routeUrl = new URL(url.href);\n routeUrl.pathname = routePath || \"/\";\n for (const route of this.routes) {\n const routeParams = route.exec(routeUrl);\n if (!routeParams) continue;\n const query = searchParamsToObject(url.search);\n const hash = searchParamsToObject(url.hash);\n const params = { ...routeParams, ...query, ...hash };\n const context: RouteContext = {\n path: routePath || \"/\",\n url,\n params,\n query,\n hash\n };\n this.disposeRoute();\n this.activeRoute = route;\n this.current.set(context);\n const cleanup = route.handler(params, context);\n if (typeof cleanup === \"function\") this.routeCleanup = cleanup;\n return context;\n }\n this.disposeRoute();\n this.activeRoute = undefined;\n this.current.set(null);\n const cleanup = this.notFound?.({}, {\n path: routePath || \"/\",\n url,\n params: {},\n query: searchParamsToObject(url.search),\n hash: searchParamsToObject(url.hash)\n });\n if (typeof cleanup === \"function\") this.routeCleanup = cleanup;\n return null;\n }\n\n private handleLinkClick(event: Event): void {\n const target = event.target as HTMLElement | null;\n const anchor = target?.closest?.(this.linkSelector) as HTMLAnchorElement | null;\n if (!anchor || anchor.target || anchor.hasAttribute(\"download\")) return;\n const win = getWindow();\n if (!win) return;\n const url = new URL(anchor.href, win.location.href);\n if (url.origin !== win.location.origin) return;\n if (stripBasePath(url.pathname, this.base) === null) return;\n event.preventDefault();\n this.navigate(`${url.pathname}${url.search}${url.hash}`);\n }\n\n private handleNavigationEvent(event: any): void {\n const win = getWindow();\n if (!win || !event?.canIntercept || !event.destination?.url || typeof event.intercept !== \"function\") return;\n const url = new URL(event.destination.url, win.location.href);\n if (url.origin !== win.location.origin) return;\n if (stripBasePath(url.pathname, this.base) === null) return;\n event.intercept({\n handler: () => {\n this.check();\n }\n });\n }\n\n private disposeRoute(): void {\n if (!this.routeCleanup) return;\n const cleanup = this.routeCleanup;\n this.routeCleanup = undefined;\n cleanup();\n }\n}\n\nfunction createRouteRecord(pattern: string, handler: RouteHandler): RouteRecord {\n const win = getWindow();\n const URLPatternCtor = (win as any)?.URLPattern || (globalThis as any).URLPattern;\n if (typeof URLPatternCtor === \"function\") {\n try {\n const nativePattern = new URLPatternCtor({ pathname: pattern });\n return {\n pattern,\n handler,\n exec(url) {\n const match = nativePattern.exec(url.href);\n return match ? decodeParams(match.pathname.groups || {}) : null;\n }\n };\n } catch (_err) {\n // Fall through to the regex matcher for non-URLPattern syntax.\n }\n }\n\n const { re, keys } = compilePathPattern(pattern);\n return {\n pattern,\n handler,\n exec(url) {\n const match = re.exec(normalizePath(url.pathname));\n if (!match) return null;\n const params: Record = {};\n keys.forEach((key, index) => {\n params[key] = decodeURIComponent(match[index + 1] || \"\");\n });\n return params;\n }\n };\n}\n\nfunction normalizeBase(base: string): string {\n const normalized = normalizePath(base || \"/\");\n return normalized === \"\" ? \"\" : normalized;\n}\n\nfunction withBasePath(path: string, base: string): string {\n const normalizedBase = normalizeBase(base);\n const parsed = new URL(path || \"/\", \"http://ity.local\");\n let pathname = normalizePath(parsed.pathname) || \"/\";\n if (normalizedBase && pathname !== normalizedBase && !pathname.startsWith(`${normalizedBase}/`)) {\n pathname = `${normalizedBase}${pathname === \"/\" ? \"\" : pathname}`;\n }\n return `${pathname}${parsed.search}${parsed.hash}`;\n}\n\nfunction stripBasePath(pathname: string, base: string): string | null {\n const normalizedBase = normalizeBase(base);\n const normalizedPath = normalizePath(pathname) || \"/\";\n if (!normalizedBase) return normalizedPath;\n if (normalizedPath === normalizedBase) return \"/\";\n if (normalizedPath.startsWith(`${normalizedBase}/`)) {\n return normalizePath(normalizedPath.slice(normalizedBase.length)) || \"/\";\n }\n return null;\n}\n\nfunction compilePathPattern(pattern: string): { re: RegExp; keys: string[] } {\n const keys: string[] = [];\n const normalized = normalizePath(pattern);\n if (normalized === \"\") return { re: /^\\/?$/, keys };\n const segments = normalized.split(\"/\").filter(Boolean);\n const source = segments.map((segment) => {\n if (segment === \"*\") {\n keys.push(\"wildcard\");\n return \"(.*)\";\n }\n if (segment.startsWith(\":\")) {\n keys.push(segment.slice(1));\n return \"([^/]+)\";\n }\n return escapeRegExp(segment);\n }).join(\"/\");\n return { re: new RegExp(`^/${source}/?$`), keys };\n}\n\nfunction normalizePath(path: string): string {\n const normalized = path.replace(/[?#].*$/, \"\").replace(/\\/+$/, \"\");\n return normalized === \"\" ? \"\" : normalized.startsWith(\"/\") ? normalized : `/${normalized}`;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction searchParamsToObject(value: string): Record {\n const out: Record = {};\n const clean = value.replace(/^[?#]/, \"\");\n if (!clean) return out;\n const params = new URLSearchParams(clean);\n params.forEach((paramValue, key) => {\n out[key] = paramValue;\n });\n return out;\n}\n\nfunction decodeParams(value: Record): Record {\n const out: Record = {};\n for (const key of Object.keys(value)) {\n out[key] = decodeURIComponent(value[key]);\n }\n return out;\n}\n\nconst defaultRouter = signal(null);\n\nfunction route(pattern: string, handler: RouteHandler): Router {\n let router = defaultRouter.peek();\n if (!router) {\n router = new Router({ autoStart: false });\n defaultRouter.set(router);\n }\n router.add(pattern, handler);\n router.start();\n return router;\n}\n\nconst Ity = {\n version: \"2.1.0\",\n configure,\n signal,\n computed,\n effect,\n batch,\n untrack,\n isSignal,\n resolveSignal,\n store,\n resource,\n action,\n form,\n html,\n unsafeHTML,\n render,\n renderToString,\n component,\n route,\n Router,\n SelectorObject,\n onDOMReady,\n Model,\n View,\n Application,\n Collection\n};\n\nfunction createAmdExport(): typeof Ity {\n const win = getWindow();\n if (win) (win as any).Ity = Ity;\n return Ity;\n}\n\n/* c8 ignore next 3 */\nif (typeof define === \"function\" && (define as any).amd) {\n (define as any)(createAmdExport);\n} else if (typeof module === \"object\" && typeof module.exports !== \"undefined\") {\n module.exports = Ity;\n}\n\nconst win = getWindow();\nif (win) {\n (win as any).Ity = Ity;\n}\n\nexport {\n Application,\n Collection,\n Model,\n Router,\n SelectorObject,\n View,\n batch,\n component,\n configure,\n computed,\n effect,\n action,\n form,\n html,\n isSignal,\n onDOMReady,\n render,\n renderToString,\n resource,\n resolveSignal,\n route,\n signal,\n store,\n unsafeHTML,\n untrack\n};\nexport type {\n Action,\n ActionOptions,\n AsyncStatus,\n ComponentContext,\n ComponentOptions,\n EffectHandle,\n FormController,\n FormOptions,\n HTMLSanitizer,\n ItyConfig,\n ReadonlySignal,\n RenderOptions,\n Resource,\n ResourceContext,\n ResourceOptions,\n RouteContext,\n RouteHandler,\n Signal,\n Store,\n TemplateResult,\n UnsafeHTMLOptions\n};\nexport default Ity;\n"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"ity.esm.js","sources":["../Ity.ts"],"sourcesContent":["// Ity.ts 2.2.0\n// (c) 2026 Dominic Cocchiarella\n// Tiny dependency-free reactive app kernel with V1 MVC compatibility.\ndeclare var define: any;\ndeclare var module: any;\n\ntype Cleanup = () => void;\ntype Equality = (prev: T, next: T) => boolean;\ntype Subscriber = (value: T, previous: T) => void;\ntype MaybeSignal = T | ReadonlySignal;\ntype TemplateValue =\n | TemplateResult\n | UnsafeHTML\n | Node\n | string\n | number\n | boolean\n | null\n | undefined\n | TemplateValue[]\n | ReadonlySignal;\n\ninterface ReadonlySignal {\n (): T;\n get(): T;\n peek(): T;\n subscribe(callback: Subscriber, options?: { immediate?: boolean }): Cleanup;\n readonly isSignal: true;\n}\n\ninterface Signal extends ReadonlySignal {\n (next: T | ((previous: T) => T)): T;\n set(next: T | ((previous: T) => T)): T;\n update(updater: (previous: T) => T): T;\n}\n\ninterface ReactiveSource {\n observers: Set;\n}\n\ninterface ReactiveObserver {\n deps: Set;\n markDirty(): void;\n}\n\ninterface ComputedOptions {\n equals?: Equality;\n}\n\ninterface SignalOptions {\n equals?: Equality;\n name?: string;\n}\n\ninterface EffectHandle {\n (): void;\n dispose(): void;\n}\n\ninterface TemplateResult {\n readonly isTemplateResult: true;\n readonly strings: readonly string[];\n readonly values: readonly unknown[];\n}\n\ninterface UnsafeHTML {\n readonly isUnsafeHTML: true;\n readonly value: string;\n}\n\ntype HTMLSanitizer = (value: string) => string;\n\ninterface UnsafeHTMLOptions {\n sanitize?: HTMLSanitizer;\n config?: ItyConfig | null;\n}\n\ninterface ItyConfig {\n sanitizeHTML?: HTMLSanitizer | null;\n}\n\ninterface RenderOptions {\n reactive?: boolean;\n transition?: boolean;\n config?: ItyConfig | null;\n}\n\ntype StoreKey = string | symbol;\n\ninterface StoreApi> {\n $patch(patch: Partial | ((current: T) => Partial | void)): void;\n $snapshot(): T;\n $subscribe(callback: (value: T) => void, options?: { immediate?: boolean }): Cleanup;\n}\n\ntype Store> = T & StoreApi;\n\ntype AsyncStatus = \"idle\" | \"loading\" | \"success\" | \"error\";\n\ninterface ResourceContext {\n signal: AbortSignal;\n previous: T | undefined;\n refreshId: number;\n}\n\ninterface ResourceOptions {\n initialValue?: T;\n immediate?: boolean;\n keepPrevious?: boolean;\n onSuccess?: (value: T) => void;\n onError?: (error: E) => void;\n}\n\ninterface Resource {\n readonly data: Signal;\n readonly error: Signal;\n readonly loading: ReadonlySignal;\n readonly status: ReadonlySignal;\n readonly promise: Promise | null;\n refresh(): Promise;\n mutate(value: T | undefined): void;\n abort(reason?: unknown): void;\n}\n\ninterface ActionOptions {\n onSuccess?: (value: TResult) => void;\n onError?: (error: E) => void;\n}\n\ninterface Action {\n (...args: TArgs): Promise;\n submit(...args: TArgs): Promise;\n run(...args: TArgs): void;\n with(...args: TArgs): (...eventArgs: unknown[]) => void;\n from(mapper: (event: TEvent) => TArgs): (event: TEvent) => void;\n readonly data: Signal;\n readonly error: Signal;\n readonly pending: ReadonlySignal;\n readonly pendingCount: ReadonlySignal;\n readonly status: ReadonlySignal;\n reset(): void;\n}\n\ninterface FormController {\n readonly action: Action<[FormData, Event], TResult, E>;\n readonly data: Signal;\n readonly error: Signal;\n readonly pending: ReadonlySignal;\n readonly status: ReadonlySignal;\n onSubmit(event: Event): Promise;\n handleSubmit(event: Event): void;\n reset(): void;\n}\n\ninterface FormOptions extends ActionOptions {\n resetOnSuccess?: boolean;\n}\n\ntype FormErrorMap> = Partial, string>>;\n\ninterface FormBindOptions {\n type?: \"text\" | \"textarea\" | \"select\" | \"select-multiple\" | \"checkbox\" | \"radio\" | \"number\";\n event?: string;\n name?: string;\n value?: unknown;\n parse?: (value: unknown, event: Event) => T;\n format?: (value: T) => unknown;\n}\n\ninterface FormStateOptions> {\n validators?: Partial<{ [K in keyof TValues]: (value: TValues[K], values: TValues) => string | null | undefined }>;\n validate?: (values: TValues) => FormErrorMap | void;\n}\n\ninterface FormField {\n readonly value: Signal;\n readonly error: ReadonlySignal;\n readonly touched: ReadonlySignal;\n readonly dirty: ReadonlySignal;\n bind(options?: FormBindOptions): Record;\n set(next: T | ((previous: T) => T)): T;\n reset(): void;\n}\n\ninterface FormStateSubmitOptions extends ActionOptions {\n resetOnSuccess?: boolean;\n}\n\ninterface FormStateController, TResult, E = unknown> {\n readonly state: FormState;\n readonly action: Action<[TValues, Event], TResult, E>;\n readonly data: Signal;\n readonly error: Signal;\n readonly pending: ReadonlySignal;\n readonly status: ReadonlySignal;\n onSubmit(event: Event): Promise;\n handleSubmit(event: Event): void;\n reset(): void;\n}\n\ninterface FormState> {\n readonly values: Store;\n readonly initialValues: ReadonlySignal;\n readonly errors: Store>;\n readonly touched: Store, boolean>>>;\n readonly dirty: ReadonlySignal;\n readonly valid: ReadonlySignal;\n field(name: K): FormField;\n bind(name: K, options?: FormBindOptions): Record;\n set(next: Partial | ((current: TValues) => Partial | void)): void;\n reset(next?: Partial | TValues): void;\n validate(names?: readonly (keyof TValues)[]): boolean;\n markTouched(names?: readonly (keyof TValues)[]): void;\n submit(\n handler: (values: TValues, event: Event) => Promise | TResult,\n options?: FormStateSubmitOptions\n ): FormStateController;\n}\n\ninterface RenderToStringOptions {\n config?: ItyConfig | null;\n}\n\ninterface RegisteredFormBinding {\n domName: string;\n type: NonNullable[\"type\"]> | \"text\";\n value?: unknown;\n parse?: (value: unknown, event: Event) => T;\n}\n\nconst defaultEquals = Object.is;\nlet activeObserver: ReactiveObserver | null = null;\nlet batchDepth = 0;\nconst pendingEffects = new Set();\nlet configuredSanitizeHTML: HTMLSanitizer | undefined;\nconst activeConfigStack: Array = [];\n\nfunction getWindow(): (Window & typeof globalThis) | undefined {\n return typeof window !== \"undefined\" ? window : undefined;\n}\n\nfunction getDocument(): Document | undefined {\n const win = getWindow();\n return win?.document ?? (typeof document !== \"undefined\" ? document : undefined);\n}\n\nfunction hasOwn(target: object, key: PropertyKey): boolean {\n return Object.prototype.hasOwnProperty.call(target, key);\n}\n\nfunction isPlainObject(value: unknown): value is Record {\n if (!value || typeof value !== \"object\") return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\nfunction cloneValue(value: T): T {\n const cloneFn = (globalThis as any).structuredClone;\n if (typeof cloneFn === \"function\") return cloneFn(value);\n if (Array.isArray(value)) return value.map((item) => cloneValue(item)) as T;\n if (isPlainObject(value)) {\n const out: Record = {};\n for (const key of Reflect.ownKeys(value)) {\n out[key as any] = cloneValue((value as any)[key]);\n }\n return out as T;\n }\n return value;\n}\n\nfunction deepEqual(left: unknown, right: unknown): boolean {\n if (Object.is(left, right)) return true;\n if (Array.isArray(left) && Array.isArray(right)) {\n if (left.length !== right.length) return false;\n for (let i = 0; i < left.length; i += 1) {\n if (!deepEqual(left[i], right[i])) return false;\n }\n return true;\n }\n if (isPlainObject(left) && isPlainObject(right)) {\n const leftKeys = Reflect.ownKeys(left);\n const rightKeys = Reflect.ownKeys(right);\n if (leftKeys.length !== rightKeys.length) return false;\n for (const key of leftKeys) {\n if (!rightKeys.includes(key)) return false;\n if (!deepEqual((left as any)[key], (right as any)[key])) return false;\n }\n return true;\n }\n return false;\n}\n\nfunction currentConfig(): ItyConfig | null {\n return activeConfigStack.length ? activeConfigStack[activeConfigStack.length - 1] : null;\n}\n\nfunction withConfig(config: ItyConfig | null | undefined, callback: () => T): T {\n activeConfigStack.push(config || null);\n try {\n return callback();\n } finally {\n activeConfigStack.pop();\n }\n}\n\nfunction resolveSanitizeHTML(options: UnsafeHTMLOptions = {}): HTMLSanitizer | undefined {\n if (options.sanitize) return options.sanitize;\n const scoped = options.config ?? currentConfig();\n if (scoped && hasOwn(scoped, \"sanitizeHTML\")) {\n return scoped.sanitizeHTML || undefined;\n }\n return configuredSanitizeHTML;\n}\n\nfunction trackDependency(source: ReactiveSource): void {\n if (!activeObserver) return;\n source.observers.add(activeObserver);\n activeObserver.deps.add(source);\n}\n\nfunction cleanupDependencies(observer: ReactiveObserver): void {\n for (const dep of observer.deps) {\n dep.observers.delete(observer);\n }\n observer.deps.clear();\n}\n\nfunction notifyObservers(source: ReactiveSource): void {\n for (const observer of Array.from(source.observers)) {\n observer.markDirty();\n }\n}\n\nfunction flushEffects(): void {\n if (batchDepth > 0) return;\n while (pendingEffects.size) {\n const effects = Array.from(pendingEffects);\n pendingEffects.clear();\n for (const effect of effects) {\n effect.run();\n }\n }\n}\n\nfunction queueEffect(effect: ReactiveEffect): void {\n pendingEffects.add(effect);\n flushEffects();\n}\n\nclass SignalNode implements ReactiveSource {\n observers = new Set();\n private subscribers = new Set>();\n private value: T;\n private equals: Equality;\n\n constructor(value: T, options: SignalOptions = {}) {\n this.value = value;\n this.equals = options.equals || defaultEquals;\n }\n\n read(track = true): T {\n if (track) trackDependency(this);\n return this.value;\n }\n\n write(next: T | ((previous: T) => T)): T {\n const previous = this.value;\n const resolved = typeof next === \"function\"\n ? (next as (previous: T) => T)(previous)\n : next;\n if (this.equals(previous, resolved)) return previous;\n this.value = resolved;\n notifyObservers(this);\n for (const subscriber of Array.from(this.subscribers)) {\n subscriber(resolved, previous);\n }\n flushEffects();\n return resolved;\n }\n\n subscribe(callback: Subscriber, options: { immediate?: boolean } = {}): Cleanup {\n this.subscribers.add(callback);\n if (options.immediate) callback(this.value, this.value);\n return () => {\n this.subscribers.delete(callback);\n };\n }\n}\n\nclass ComputedNode implements ReactiveSource, ReactiveObserver {\n observers = new Set();\n deps = new Set();\n private subscribers = new Set>();\n private dirty = true;\n private initialized = false;\n private value!: T;\n private equals: Equality;\n\n constructor(private readonly getter: () => T, options: ComputedOptions = {}) {\n this.equals = options.equals || defaultEquals;\n }\n\n read(track = true): T {\n if (track) trackDependency(this);\n if (this.dirty) this.evaluate();\n return this.value;\n }\n\n markDirty(): void {\n if (this.dirty) return;\n const previous = this.value;\n this.dirty = true;\n notifyObservers(this);\n if (this.subscribers.size) {\n const next = this.read(false);\n if (!this.equals(previous, next)) {\n for (const subscriber of Array.from(this.subscribers)) {\n subscriber(next, previous);\n }\n }\n }\n }\n\n subscribe(callback: Subscriber, options: { immediate?: boolean } = {}): Cleanup {\n this.subscribers.add(callback);\n if (options.immediate) {\n const current = this.read(false);\n callback(current, current);\n }\n return () => {\n this.subscribers.delete(callback);\n };\n }\n\n private evaluate(): void {\n cleanupDependencies(this);\n const previousObserver = activeObserver;\n activeObserver = this;\n try {\n this.value = this.getter();\n this.dirty = false;\n this.initialized = true;\n } finally {\n activeObserver = previousObserver;\n }\n }\n}\n\nclass ReactiveEffect implements ReactiveObserver {\n deps = new Set();\n private disposed = false;\n private cleanup?: Cleanup;\n\n constructor(private readonly callback: (onCleanup: (cleanup: Cleanup) => void) => void) {\n this.run();\n }\n\n markDirty(): void {\n if (!this.disposed) queueEffect(this);\n }\n\n run(): void {\n if (this.disposed) return;\n cleanupDependencies(this);\n if (this.cleanup) {\n const cleanup = this.cleanup;\n this.cleanup = undefined;\n cleanup();\n }\n const previousObserver = activeObserver;\n activeObserver = this;\n try {\n this.callback((cleanup) => {\n this.cleanup = cleanup;\n });\n } finally {\n activeObserver = previousObserver;\n }\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n cleanupDependencies(this);\n if (this.cleanup) {\n const cleanup = this.cleanup;\n this.cleanup = undefined;\n cleanup();\n }\n pendingEffects.delete(this);\n }\n}\n\nfunction signal(initialValue: T, options: SignalOptions = {}): Signal {\n const node = new SignalNode(initialValue, options);\n const readWrite = function (next?: T | ((previous: T) => T)): T {\n if (arguments.length === 0) return node.read(true);\n return node.write(next as T | ((previous: T) => T));\n } as Signal;\n readWrite.get = () => node.read(true);\n readWrite.peek = () => node.read(false);\n readWrite.set = (next) => node.write(next);\n readWrite.update = (updater) => node.write(updater);\n readWrite.subscribe = (callback, subscribeOptions) => node.subscribe(callback, subscribeOptions);\n Object.defineProperty(readWrite, \"isSignal\", { value: true });\n return readWrite;\n}\n\nfunction computed(getter: () => T, options: ComputedOptions = {}): ReadonlySignal {\n const node = new ComputedNode(getter, options);\n const read = function (): T {\n return node.read(true);\n } as ReadonlySignal;\n read.get = () => node.read(true);\n read.peek = () => node.read(false);\n read.subscribe = (callback, subscribeOptions) => node.subscribe(callback, subscribeOptions);\n Object.defineProperty(read, \"isSignal\", { value: true });\n return read;\n}\n\nfunction effect(callback: (onCleanup: (cleanup: Cleanup) => void) => void): EffectHandle {\n const runner = new ReactiveEffect(callback);\n const dispose = (() => runner.dispose()) as EffectHandle;\n dispose.dispose = dispose;\n return dispose;\n}\n\nfunction batch(callback: () => T): T {\n batchDepth += 1;\n try {\n return callback();\n } finally {\n batchDepth -= 1;\n flushEffects();\n }\n}\n\nfunction untrack(callback: () => T): T {\n const previousObserver = activeObserver;\n activeObserver = null;\n try {\n return callback();\n } finally {\n activeObserver = previousObserver;\n }\n}\n\nfunction isSignal(value: unknown): value is ReadonlySignal {\n return typeof value === \"function\" && (value as any).isSignal === true;\n}\n\nfunction resolveSignal(value: MaybeSignal): T {\n return isSignal(value) ? value() : value;\n}\n\nfunction configure(options: ItyConfig = {}): void {\n configuredSanitizeHTML = options.sanitizeHTML || undefined;\n}\n\nfunction createConfig(options: ItyConfig = {}): ItyConfig {\n const config: ItyConfig = {};\n if (hasOwn(options, \"sanitizeHTML\")) config.sanitizeHTML = options.sanitizeHTML ?? null;\n return config;\n}\n\nfunction store>(initialValue: T): Store {\n const keys = new Set(Reflect.ownKeys(initialValue));\n const signals = new Map>();\n const structure = signal(0);\n\n const ensureSignal = (key: StoreKey): Signal => {\n if (!signals.has(key)) {\n signals.set(key, signal((initialValue as any)[key]));\n }\n return signals.get(key)!;\n };\n\n const bumpStructure = (): void => {\n structure.update((version) => version + 1);\n };\n\n const setKey = (key: StoreKey, value: any): void => {\n const hadKey = keys.has(key);\n if (!hadKey) keys.add(key);\n ensureSignal(key).set(value);\n if (!hadKey) bumpStructure();\n };\n\n const snapshot = (): T => {\n structure();\n const out: any = {};\n for (const key of keys) {\n out[key] = ensureSignal(key)();\n }\n return out as T;\n };\n\n const api: StoreApi = {\n $patch(patch) {\n const current = snapshot();\n const next = typeof patch === \"function\" ? patch(current) : patch;\n if (!next) return;\n batch(() => {\n for (const key of Reflect.ownKeys(next)) {\n setKey(key, (next as any)[key]);\n }\n });\n },\n $snapshot: snapshot,\n $subscribe(callback, options = {}) {\n let first = true;\n return effect(() => {\n const value = snapshot();\n if (first && !options.immediate) {\n first = false;\n return;\n }\n first = false;\n callback(value);\n });\n }\n };\n\n return new Proxy(api as Store, {\n get(target, key, receiver) {\n if (key in target) return Reflect.get(target, key, receiver);\n return ensureSignal(key)();\n },\n set(_target, key, value) {\n batch(() => {\n setKey(key, value);\n });\n return true;\n },\n deleteProperty(_target, key) {\n if (!keys.has(key)) return true;\n keys.delete(key);\n batch(() => {\n ensureSignal(key).set(undefined);\n bumpStructure();\n });\n return true;\n },\n ownKeys(target) {\n structure();\n return Array.from(new Set([...Reflect.ownKeys(target), ...keys]));\n },\n getOwnPropertyDescriptor(target, key) {\n structure();\n if (Object.prototype.hasOwnProperty.call(target, key)) {\n return { ...Reflect.getOwnPropertyDescriptor(target, key)!, enumerable: false };\n }\n if (!keys.has(key)) return undefined;\n return { enumerable: true, configurable: true };\n },\n has(target, key) {\n structure();\n return key in target || keys.has(key);\n }\n });\n}\n\nfunction resource(\n loader: (context: ResourceContext) => Promise | T,\n options: ResourceOptions = {}\n): Resource {\n const data = signal(options.initialValue);\n const error = signal(null);\n const pending = signal(false);\n const statusValue = signal(options.initialValue === undefined ? \"idle\" : \"success\");\n const loading = computed(() => pending());\n const status = computed(() => statusValue());\n const keepPrevious = options.keepPrevious !== false;\n let controller: AbortController | null = null;\n let refreshId = 0;\n let currentPromise: Promise | null = null;\n\n const api: Resource = {\n data,\n error,\n loading,\n status,\n get promise() {\n return currentPromise;\n },\n refresh() {\n refreshId += 1;\n const id = refreshId;\n if (controller) controller.abort();\n controller = new AbortController();\n const signal = controller.signal;\n const previous = data.peek();\n pending.set(true);\n statusValue.set(\"loading\");\n error.set(null);\n if (!keepPrevious) data.set(undefined);\n\n currentPromise = Promise.resolve()\n .then(() => loader({ signal, previous, refreshId: id }))\n .then((value) => {\n if (id !== refreshId || signal.aborted) return data.peek();\n data.set(value);\n error.set(null);\n statusValue.set(\"success\");\n options.onSuccess?.(value);\n return value;\n })\n .catch((err) => {\n if (id !== refreshId) return data.peek();\n error.set(err as E);\n statusValue.set(\"error\");\n options.onError?.(err as E);\n return data.peek();\n })\n .finally(() => {\n if (id === refreshId) {\n pending.set(false);\n controller = null;\n }\n });\n\n return currentPromise;\n },\n mutate(value) {\n refreshId += 1;\n if (controller) controller.abort();\n controller = null;\n currentPromise = null;\n data.set(value);\n error.set(null);\n pending.set(false);\n statusValue.set(value === undefined ? \"idle\" : \"success\");\n },\n abort(reason?: unknown) {\n if (!controller) return;\n refreshId += 1;\n controller.abort(reason);\n controller = null;\n currentPromise = null;\n pending.set(false);\n statusValue.set(data.peek() === undefined ? \"idle\" : \"success\");\n }\n };\n\n if (options.immediate !== false) {\n api.refresh();\n }\n\n return api;\n}\n\nfunction action(\n handler: (...args: TArgs) => Promise | TResult,\n options: ActionOptions = {}\n): Action {\n const data = signal(undefined);\n const error = signal(null);\n const count = signal(0);\n const statusValue = signal(\"idle\");\n const pending = computed(() => count() > 0);\n const pendingCount = computed(() => count());\n const status = computed(() => statusValue());\n let generation = 0;\n\n const submit = (...args: TArgs): Promise => {\n const runGeneration = generation;\n count.update((value) => value + 1);\n statusValue.set(\"loading\");\n error.set(null);\n\n return Promise.resolve()\n .then(() => handler(...args))\n .then((value) => {\n if (runGeneration === generation) {\n data.set(value);\n error.set(null);\n options.onSuccess?.(value);\n if (count.peek() <= 1) statusValue.set(\"success\");\n }\n return value;\n })\n .catch((err) => {\n if (runGeneration === generation) {\n error.set(err as E);\n options.onError?.(err as E);\n if (count.peek() <= 1) statusValue.set(\"error\");\n }\n throw err;\n })\n .finally(() => {\n if (runGeneration !== generation) return;\n count.update((value) => Math.max(0, value - 1));\n if (count.peek() > 0) statusValue.set(\"loading\");\n });\n };\n\n const callable = ((...args: TArgs) => submit(...args)) as Action;\n const mutableCallable = callable as Action & {\n submit: (...args: TArgs) => Promise;\n run: (...args: TArgs) => void;\n with: (...args: TArgs) => (...eventArgs: unknown[]) => void;\n from: (mapper: (event: TEvent) => TArgs) => (event: TEvent) => void;\n data: Signal;\n error: Signal;\n pending: ReadonlySignal;\n pendingCount: ReadonlySignal;\n status: ReadonlySignal;\n };\n mutableCallable.submit = submit;\n mutableCallable.run = (...args: TArgs) => {\n submit(...args).catch(() => undefined);\n };\n mutableCallable.with = (...args: TArgs) => {\n return () => {\n mutableCallable.run(...args);\n };\n };\n mutableCallable.from = (mapper: (event: TEvent) => TArgs) => {\n return (event: TEvent) => {\n mutableCallable.run(...mapper(event));\n };\n };\n mutableCallable.data = data;\n mutableCallable.error = error;\n mutableCallable.pending = pending;\n mutableCallable.pendingCount = pendingCount;\n mutableCallable.status = status;\n callable.reset = () => {\n generation += 1;\n data.set(undefined);\n error.set(null);\n count.set(0);\n statusValue.set(\"idle\");\n };\n return callable;\n}\n\nfunction getFormElementCtor(node: Element | null): typeof HTMLFormElement | undefined {\n const ownerWindow = node?.ownerDocument?.defaultView as (Window & typeof globalThis) | null | undefined;\n return ownerWindow?.HTMLFormElement\n || getWindow()?.HTMLFormElement\n || (typeof HTMLFormElement !== \"undefined\" ? HTMLFormElement : undefined);\n}\n\nfunction isFormElement(node: Element | null | undefined, fallbackNode?: Element | null): node is HTMLFormElement {\n const FormElement = node ? getFormElementCtor(node) : getFormElementCtor(fallbackNode || null);\n return Boolean(node && FormElement && node instanceof FormElement);\n}\n\nfunction findFormElement(event: Event): HTMLFormElement {\n const target = (event.currentTarget || event.target) as Element | null;\n if (!getFormElementCtor(target)) throw new Error(\"Ity.form requires HTMLFormElement support\");\n if (isFormElement(target, target)) return target;\n const closest = target?.closest?.(\"form\");\n if (isFormElement(closest, target)) return closest;\n throw new Error(\"Ity.form onSubmit requires a form event target\");\n}\n\nfunction createFormDataForElement(formElement: HTMLFormElement): FormData {\n const ownerWindow = formElement.ownerDocument?.defaultView as (Window & typeof globalThis) | null | undefined;\n const FormDataCtor = ownerWindow?.FormData\n || getWindow()?.FormData\n || (typeof FormData !== \"undefined\" ? FormData : undefined);\n if (!FormDataCtor) throw new Error(\"Ity.form requires FormData support\");\n return new FormDataCtor(formElement);\n}\n\nfunction form(\n handler: (data: FormData, event: Event) => Promise | TResult,\n options: FormOptions = {}\n): FormController {\n const submitAction = action<[FormData, Event], TResult, E>(handler, options);\n\n const onSubmit = async (event: Event): Promise => {\n event.preventDefault();\n const formElement = findFormElement(event);\n const result = await submitAction(createFormDataForElement(formElement), event);\n if (options.resetOnSuccess) formElement.reset();\n return result;\n };\n\n return {\n action: submitAction,\n data: submitAction.data,\n error: submitAction.error,\n pending: submitAction.pending,\n status: submitAction.status,\n onSubmit,\n handleSubmit(event: Event): void {\n onSubmit(event).catch(() => undefined);\n },\n reset() {\n submitAction.reset();\n }\n };\n}\n\nfunction replaceStoreSnapshot>(target: Store, nextValue: Partial): void {\n const current = target.$snapshot() as Record;\n batch(() => {\n for (const key of Reflect.ownKeys(current)) {\n if (!hasOwn(nextValue as object, key)) delete (target as any)[key];\n }\n for (const key of Reflect.ownKeys(nextValue)) {\n (target as any)[key] = (nextValue as any)[key];\n }\n });\n}\n\nfunction formState>(\n initialValue: TValues,\n options: FormStateOptions = {}\n): FormState {\n const values = store(cloneValue(initialValue));\n const initialValues = signal(cloneValue(initialValue));\n const errors = store({} as FormErrorMap);\n const touched = store({} as Partial, boolean>>);\n const registeredBindings = new Map, Map>>();\n\n const allFieldNames = (): Array> => {\n const names = new Set();\n Reflect.ownKeys(initialValues.peek()).forEach((key) => names.add(String(key)));\n Reflect.ownKeys(values.$snapshot()).forEach((key) => names.add(String(key)));\n return Array.from(names) as Array>;\n };\n\n const computeErrors = (snapshot: TValues): FormErrorMap => {\n const out: FormErrorMap = {};\n const validators = options.validators || {};\n for (const key of allFieldNames()) {\n const validator = (validators as any)[key] as ((value: TValues[keyof TValues], values: TValues) => string | null | undefined) | undefined;\n if (!validator) continue;\n const message = validator((snapshot as any)[key], snapshot);\n if (message) out[key] = message;\n }\n const formErrors = options.validate?.(snapshot);\n if (formErrors) {\n for (const key of Reflect.ownKeys(formErrors)) {\n const message = (formErrors as any)[key];\n if (message) (out as any)[key] = message;\n }\n }\n return out;\n };\n\n const syncErrors = (): boolean => {\n const nextErrors = computeErrors(values.$snapshot());\n replaceStoreSnapshot(errors as any, nextErrors);\n return Reflect.ownKeys(nextErrors).length === 0;\n };\n\n const markTouched = (names?: readonly (keyof TValues)[]): void => {\n const keys = names?.length\n ? names.map((name) => String(name))\n : allFieldNames();\n batch(() => {\n for (const key of keys) {\n (touched as any)[key] = true;\n }\n });\n };\n\n const maybeValidateTouched = (): void => {\n const touchedSnapshot = touched.$snapshot();\n if (Reflect.ownKeys(touchedSnapshot).some((key) => Boolean((touchedSnapshot as any)[key]))) {\n syncErrors();\n }\n };\n\n const set = (next: Partial | ((current: TValues) => Partial | void)): void => {\n values.$patch((current) => {\n const patch = typeof next === \"function\" ? next(current) : next;\n return patch || {};\n });\n maybeValidateTouched();\n };\n\n const reset = (next?: Partial | TValues): void => {\n const base = cloneValue(next\n ? { ...initialValues.peek(), ...(next as any) }\n : initialValues.peek());\n initialValues.set(cloneValue(base));\n replaceStoreSnapshot(values as any, base);\n replaceStoreSnapshot(errors as any, {});\n replaceStoreSnapshot(touched as any, {});\n };\n\n const createFieldSignal = (name: K): Signal => {\n const signalLike = function (next?: TValues[K] | ((previous: TValues[K]) => TValues[K])): TValues[K] {\n if (arguments.length === 0) return (values as any)[name];\n const previous = (values as any)[name];\n const resolved = typeof next === \"function\"\n ? (next as (previous: TValues[K]) => TValues[K])(previous)\n : next;\n (values as any)[name] = resolved;\n maybeValidateTouched();\n return resolved as TValues[K];\n } as Signal;\n signalLike.get = () => (values as any)[name];\n signalLike.peek = () => untrack(() => (values as any)[name]);\n signalLike.set = (next) => signalLike(next);\n signalLike.update = (updater) => signalLike(updater);\n signalLike.subscribe = (callback, subscribeOptions = {}) => {\n let first = true;\n let previous = signalLike.peek();\n return effect(() => {\n const current = (values as any)[name];\n if (first) {\n first = false;\n previous = current;\n if (subscribeOptions.immediate) callback(current, current);\n return;\n }\n if (!Object.is(previous, current)) {\n const prev = previous;\n previous = current;\n callback(current, prev);\n }\n });\n };\n Object.defineProperty(signalLike, \"isSignal\", { value: true });\n return signalLike;\n };\n\n const registerBinding = (\n name: K,\n domName: string,\n type: RegisteredFormBinding[\"type\"],\n bindOptions: FormBindOptions\n ): void => {\n const fieldName = String(name) as Extract;\n const fieldBindings = registeredBindings.get(fieldName) || new Map>();\n const signature = `${domName}|${type}|${String(bindOptions.value)}`;\n fieldBindings.set(signature, {\n domName,\n type,\n value: bindOptions.value,\n parse: bindOptions.parse\n });\n registeredBindings.set(fieldName, fieldBindings as Map>);\n };\n\n const syncFromForm = (event: Event): void => {\n const NO_FORM_VALUE = Symbol(\"ity.formState.noValue\");\n let formElement: HTMLFormElement;\n try {\n formElement = findFormElement(event);\n } catch (_error) {\n return;\n }\n const formData = createFormDataForElement(formElement);\n const controls = Array.from((formElement as any).elements || []) as Array<{ name?: string; value?: string; checked?: boolean }>;\n const patch: Partial = {};\n\n const resolveControlValue = (\n name: K,\n bindings: RegisteredFormBinding[]\n ): TValues[K] | typeof NO_FORM_VALUE => {\n const primary = bindings[0];\n if (!primary) return NO_FORM_VALUE;\n const domName = primary.domName;\n const namedControls = controls.filter((control) => control && control.name === domName);\n if (primary.parse && namedControls.length) {\n const parseTarget = primary.type === \"radio\"\n ? namedControls.find((control) => Boolean(control.checked)) || namedControls[0]\n : namedControls[0];\n return primary.parse(parseTarget, event);\n }\n if (primary.type === \"checkbox\") {\n const currentValue = (values as any)[name];\n if (Array.isArray(currentValue) || bindings.some((binding) => binding.value !== undefined) || namedControls.length > 1) {\n const selected: unknown[] = [];\n for (const control of namedControls) {\n if (!control.checked) continue;\n const matched = bindings.find((binding) => String(binding.value ?? control.value ?? \"\") === String(control.value ?? \"\"));\n selected.push(matched?.value ?? control.value ?? \"\");\n }\n return selected as TValues[K];\n }\n return formData.has(domName) as TValues[K];\n }\n if (primary.type === \"radio\") {\n return (formData.get(domName) ?? (values as any)[name]) as TValues[K];\n }\n if (primary.type === \"select-multiple\") {\n const select = namedControls[0] as HTMLSelectElement | undefined;\n if (select?.selectedOptions) {\n return Array.from(select.selectedOptions).map((option) => option.value) as TValues[K];\n }\n return formData.getAll(domName) as TValues[K];\n }\n if (primary.type === \"number\") {\n const raw = formData.get(domName);\n return (raw === null || raw === \"\" ? undefined : Number(raw)) as TValues[K];\n }\n const raw = formData.get(domName);\n return (raw === null ? \"\" : raw) as TValues[K];\n };\n\n for (const fieldName of allFieldNames()) {\n const bindings = Array.from(registeredBindings.get(fieldName)?.values() || []) as RegisteredFormBinding]>[];\n const nextValue = resolveControlValue(fieldName, bindings as RegisteredFormBinding[]);\n if (nextValue !== NO_FORM_VALUE) {\n (patch as any)[fieldName] = nextValue;\n }\n }\n\n if (Reflect.ownKeys(patch).length) {\n values.$patch(() => patch);\n }\n };\n\n const bind = (name: K, bindOptions: FormBindOptions = {}): Record => {\n const field = api.field(name);\n const type = bindOptions.type || \"text\";\n const eventName = bindOptions.event\n || (type === \"checkbox\" || type === \"radio\" || type === \"select\" || type === \"select-multiple\" ? \"change\" : \"input\");\n const domName = bindOptions.name || String(name);\n registerBinding(name, domName, type, bindOptions);\n const formattedValue = bindOptions.format ? bindOptions.format(field.value()) : field.value();\n const parseValue = (event: Event): TValues[K] => {\n if (bindOptions.parse) {\n return bindOptions.parse((event.currentTarget || event.target) as unknown, event);\n }\n const target = (event.currentTarget || event.target) as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | null;\n if (!target) return field.value();\n if (type === \"checkbox\") {\n if (Array.isArray(field.value())) {\n const optionValue = bindOptions.value ?? target.value;\n const current = field.value() as unknown[];\n return ((target as HTMLInputElement).checked\n ? Array.from(new Set([...current, optionValue]))\n : current.filter((item) => !Object.is(item, optionValue))) as TValues[K];\n }\n return Boolean((target as HTMLInputElement).checked) as TValues[K];\n }\n if (type === \"radio\") {\n if (!(target as HTMLInputElement).checked) return field.value();\n return (bindOptions.value ?? (target as HTMLInputElement).value) as TValues[K];\n }\n if (type === \"select-multiple\") {\n return Array.from((target as HTMLSelectElement).selectedOptions).map((option) => option.value) as TValues[K];\n }\n if (type === \"number\") {\n const raw = target.value;\n return (raw === \"\" ? (undefined as any) : Number(raw)) as TValues[K];\n }\n return target.value as TValues[K];\n };\n\n const binding: Record = {\n name: domName,\n [`@${eventName}`]: (event: Event) => {\n field.set(parseValue(event));\n },\n \"@blur\": () => {\n markTouched([name]);\n syncErrors();\n }\n };\n\n if (type === \"checkbox\") {\n if (Array.isArray(field.value())) {\n const optionValue = bindOptions.value;\n binding.value = optionValue === undefined ? \"\" : String(optionValue);\n binding[\".checked\"] = computed(() => (field.value() as unknown[]).some((item) => Object.is(item, optionValue)));\n } else {\n binding[\".checked\"] = computed(() => Boolean(field.value()));\n binding.checked = Boolean(field.value());\n }\n return binding;\n }\n\n if (type === \"radio\") {\n const optionValue = bindOptions.value;\n binding.value = optionValue === undefined ? \"\" : String(optionValue);\n binding[\".checked\"] = computed(() => Object.is(field.value(), optionValue));\n return binding;\n }\n\n if (type === \"select-multiple\") {\n binding[\".value\"] = formattedValue as any;\n return binding;\n }\n\n const stringValue = formattedValue === undefined || formattedValue === null ? \"\" : String(formattedValue);\n binding[\".value\"] = stringValue;\n binding.value = stringValue;\n return binding;\n };\n\n const api: FormState = {\n values,\n initialValues,\n errors,\n touched,\n dirty: computed(() => !deepEqual(values.$snapshot(), initialValues())),\n valid: computed(() => Reflect.ownKeys(errors.$snapshot()).length === 0),\n field(name: K): FormField {\n const valueSignal = createFieldSignal(name);\n return {\n value: valueSignal,\n error: computed(() => (errors as any)[name] || null),\n touched: computed(() => Boolean((touched as any)[name])),\n dirty: computed(() => !deepEqual((values as any)[name], (initialValues() as any)[name])),\n bind(optionsForField?: FormBindOptions): Record {\n return bind(name, optionsForField);\n },\n set(next) {\n return valueSignal.set(next);\n },\n reset() {\n valueSignal.set((initialValues.peek() as any)[name]);\n delete (errors as any)[name];\n delete (touched as any)[name];\n }\n };\n },\n bind,\n set,\n reset,\n validate(): boolean {\n return syncErrors();\n },\n markTouched,\n submit(\n handler: (snapshot: TValues, event: Event) => Promise | TResult,\n submitOptions: FormStateSubmitOptions = {}\n ): FormStateController {\n const submitAction = action<[TValues, Event], TResult, E>(handler, submitOptions);\n const onSubmit = async (event: Event): Promise => {\n event.preventDefault();\n syncFromForm(event);\n markTouched();\n if (!syncErrors()) return undefined;\n const result = await submitAction(cloneValue(values.$snapshot()), event);\n if (submitOptions.resetOnSuccess) api.reset();\n return result;\n };\n\n return {\n state: api,\n action: submitAction,\n data: submitAction.data,\n error: submitAction.error,\n pending: submitAction.pending,\n status: submitAction.status,\n onSubmit,\n handleSubmit(event: Event): void {\n onSubmit(event).catch(() => undefined);\n },\n reset(): void {\n submitAction.reset();\n api.reset();\n }\n };\n }\n };\n\n return api;\n}\n\nfunction html(strings: TemplateStringsArray | readonly string[], ...values: unknown[]): TemplateResult {\n return {\n isTemplateResult: true,\n strings: Array.from(strings),\n values\n };\n}\n\nfunction unsafeHTML(value: string, options: UnsafeHTMLOptions = {}): UnsafeHTML {\n const sanitizer = resolveSanitizeHTML(options);\n return {\n isUnsafeHTML: true,\n value: sanitizer ? sanitizer(String(value)) : String(value)\n };\n}\n\nfunction isTemplateResult(value: unknown): value is TemplateResult {\n return !!value && typeof value === \"object\" && (value as TemplateResult).isTemplateResult === true;\n}\n\nfunction isUnsafeHTML(value: unknown): value is UnsafeHTML {\n return !!value && typeof value === \"object\" && (value as UnsafeHTML).isUnsafeHTML === true;\n}\n\nfunction isNodeLike(value: unknown): value is Node {\n return !!value && typeof value === \"object\" && typeof (value as Node).nodeType === \"number\";\n}\n\nfunction documentOrThrow(): Document {\n const doc = getDocument();\n if (!doc) throw new Error(\"Ity DOM rendering requires a document\");\n return doc;\n}\n\nfunction normalizeValue(value: unknown): unknown {\n return isSignal(value) ? value() : value;\n}\n\nfunction valueToFragment(value: unknown, doc: Document = documentOrThrow()): DocumentFragment {\n const fragment = doc.createDocumentFragment();\n appendValue(fragment, normalizeValue(value), doc);\n return fragment;\n}\n\nfunction appendValue(parent: Node, value: unknown, doc: Document): void {\n value = normalizeValue(value);\n if (value === null || value === undefined || value === false) return;\n if (Array.isArray(value)) {\n for (const item of value) appendValue(parent, item, doc);\n return;\n }\n if (isTemplateResult(value)) {\n parent.appendChild(materializeTemplate(value, doc));\n return;\n }\n if (isUnsafeHTML(value)) {\n const template = doc.createElement(\"template\");\n template.innerHTML = value.value;\n parent.appendChild(template.content.cloneNode(true));\n return;\n }\n if (isNodeLike(value)) {\n parent.appendChild(value);\n return;\n }\n parent.appendChild(doc.createTextNode(String(value)));\n}\n\ninterface Binding {\n index: number;\n kind: \"node\" | \"event\" | \"attr\" | \"prop\" | \"bool\";\n name?: string;\n}\n\nfunction bindingFromName(rawName: string): Pick {\n const first = rawName[0];\n const kind = first === \"@\" ? \"event\" : first === \".\" ? \"prop\" : first === \"?\" ? \"bool\" : \"attr\";\n const name = kind === \"attr\" ? rawName : rawName.slice(1);\n return { kind, name };\n}\n\nfunction materializeTemplate(result: TemplateResult, doc: Document = documentOrThrow()): DocumentFragment {\n const bindings: Binding[] = [];\n let source = \"\";\n\n for (let i = 0; i < result.values.length; i += 1) {\n const part = result.strings[i] ?? \"\";\n const attrMatch = part.match(/([@.?]?[\\w:-]+)\\s*=\\s*$/);\n if (attrMatch) {\n const rawName = attrMatch[1];\n const before = part.slice(0, part.length - attrMatch[0].length);\n const marker = `data-ity-bind-${i}`;\n const { kind, name } = bindingFromName(rawName);\n bindings.push({ index: i, kind, name });\n source += `${before}${marker}=\"\"`;\n } else {\n bindings.push({ index: i, kind: \"node\" });\n source += `${part}`;\n }\n }\n source += result.strings[result.strings.length - 1] ?? \"\";\n\n const template = doc.createElement(\"template\");\n template.innerHTML = source;\n const fragment = template.content.cloneNode(true) as DocumentFragment;\n applyBindings(fragment, bindings, result.values, doc);\n return fragment;\n}\n\nfunction applyBindings(root: DocumentFragment, bindings: Binding[], values: readonly unknown[], doc: Document): void {\n const comments = new Map();\n const walker = doc.createTreeWalker(root, 128);\n let current = walker.nextNode();\n while (current) {\n const comment = current as Comment;\n const match = comment.data.match(/^ity:(\\d+)$/);\n if (match) {\n const index = Number(match[1]);\n const list = comments.get(index) || [];\n list.push(comment);\n comments.set(index, list);\n }\n current = walker.nextNode();\n }\n\n for (const binding of bindings) {\n const value = normalizeValue(values[binding.index]);\n if (binding.kind === \"node\") {\n const markers = comments.get(binding.index) || [];\n for (const marker of markers) {\n marker.replaceWith(valueToFragment(value, doc));\n }\n continue;\n }\n\n const attrName = `data-ity-bind-${binding.index}`;\n const elements = Array.from(root.querySelectorAll(`[${attrName}]`)) as HTMLElement[];\n for (const element of elements) {\n element.removeAttribute(attrName);\n applyElementBinding(element, binding, value);\n }\n }\n}\n\nfunction applyElementBinding(element: HTMLElement, binding: Binding, value: unknown): void {\n const name = binding.name || \"\";\n if (binding.kind === \"attr\" && name === \"bind\" && isPlainObject(value)) {\n for (const key of Reflect.ownKeys(value)) {\n const entryValue = normalizeValue((value as any)[key]);\n const entry = bindingFromName(String(key));\n applyElementBinding(element, { index: binding.index, ...entry }, entryValue);\n }\n return;\n }\n\n if (binding.kind === \"event\") {\n if (typeof value === \"function\") {\n element.addEventListener(name, value as EventListener);\n } else if (Array.isArray(value) && typeof value[0] === \"function\") {\n element.addEventListener(name, value[0] as EventListener, value[1] as AddEventListenerOptions);\n }\n return;\n }\n\n if (binding.kind === \"prop\") {\n if (name === \"value\" && Array.isArray(value) && element.tagName === \"SELECT\" && (element as HTMLSelectElement).multiple) {\n const selectedValues = new Set(value.map((entry) => String(entry)));\n Array.from((element as HTMLSelectElement).options).forEach((option) => {\n option.selected = selectedValues.has(option.value);\n });\n return;\n }\n (element as any)[name] = value;\n return;\n }\n\n if (binding.kind === \"bool\") {\n element.toggleAttribute(name, Boolean(value));\n return;\n }\n\n if (value === false || value === null || value === undefined) {\n element.removeAttribute(name);\n return;\n }\n\n if (name === \"class\" && Array.isArray(value)) {\n element.setAttribute(\"class\", value.filter(Boolean).join(\" \"));\n return;\n }\n\n if (name === \"class\" && typeof value === \"object\") {\n const classes = Object.keys(value as Record).filter((key) => Boolean((value as any)[key]));\n element.setAttribute(\"class\", classes.join(\" \"));\n return;\n }\n\n if (name === \"style\" && typeof value === \"object\" && value !== null) {\n Object.assign((element as HTMLElement).style, value);\n return;\n }\n\n element.setAttribute(name, value === true ? \"\" : String(value));\n}\n\nfunction resolveTarget(target: string | Element | DocumentFragment | SelectorObject): Element | DocumentFragment {\n if (typeof target === \"string\") {\n const found = documentOrThrow().querySelector(target);\n if (!found) throw new Error(`Render target not found: ${target}`);\n return found;\n }\n if ((target as SelectorObject)?.isSelectorObject) {\n const first = (target as SelectorObject).first()[0];\n if (!first) throw new Error(\"Cannot render into an empty SelectorObject\");\n return first;\n }\n return target as Element | DocumentFragment;\n}\n\nfunction replaceChildren(target: Element | DocumentFragment, fragment: DocumentFragment): void {\n const maybeTarget = target as any;\n if (typeof maybeTarget.replaceChildren === \"function\") {\n maybeTarget.replaceChildren(fragment);\n return;\n }\n while (target.firstChild) target.removeChild(target.firstChild);\n target.appendChild(fragment);\n}\n\nfunction withViewTransition(update: () => void, enabled: boolean | undefined): void {\n const doc = getDocument() as any;\n if (enabled && doc && typeof doc.startViewTransition === \"function\") {\n doc.startViewTransition(update);\n } else {\n update();\n }\n}\n\nfunction render(\n view: TemplateValue | (() => TemplateValue),\n target: string | Element | DocumentFragment | SelectorObject,\n options: RenderOptions = {}\n): Cleanup {\n const mount = resolveTarget(target);\n const update = () => {\n withConfig(options.config, () => {\n const value = typeof view === \"function\" && !isSignal(view)\n ? (view as () => TemplateValue)()\n : normalizeValue(view);\n withViewTransition(() => replaceChildren(mount, valueToFragment(value)), options.transition);\n });\n };\n\n if (options.reactive === false) {\n update();\n return () => undefined;\n }\n\n return effect(update);\n}\n\nfunction renderToString(view: TemplateValue | (() => TemplateValue), options: RenderToStringOptions = {}): string {\n return withConfig(options.config, () => {\n const value = typeof view === \"function\" && !isSignal(view)\n ? (view as () => TemplateValue)()\n : normalizeValue(view);\n return valueToString(value);\n });\n}\n\nfunction valueToString(value: unknown): string {\n value = normalizeValue(value);\n if (value === null || value === undefined || value === false) return \"\";\n if (Array.isArray(value)) return value.map(valueToString).join(\"\");\n if (isTemplateResult(value)) return templateToString(value);\n if (isUnsafeHTML(value)) return value.value;\n if (isNodeLike(value)) {\n const node = value as any;\n if (typeof node.outerHTML === \"string\") return node.outerHTML;\n return escapeHTML(node.textContent || \"\");\n }\n return escapeHTML(String(value));\n}\n\nfunction templateToString(result: TemplateResult): string {\n let source = \"\";\n for (let i = 0; i < result.values.length; i += 1) {\n const part = result.strings[i] ?? \"\";\n const attrMatch = part.match(/([@.?]?[\\w:-]+)\\s*=\\s*$/);\n const value = normalizeValue(result.values[i]);\n if (attrMatch) {\n const rawName = attrMatch[1];\n const before = part.slice(0, part.length - attrMatch[0].length);\n const { kind, name } = bindingFromName(rawName);\n if (kind === \"attr\" && name === \"bind\" && isPlainObject(value)) {\n const serialized: string[] = [];\n for (const key of Reflect.ownKeys(value)) {\n const entryValue = normalizeValue((value as any)[key]);\n const entry = bindingFromName(String(key));\n const entryName = entry.name || \"\";\n if (entry.kind === \"event\" || entryValue === false || entryValue === null || entryValue === undefined) continue;\n if (entry.kind === \"bool\") {\n if (entryValue) serialized.push(entryName);\n continue;\n }\n if (entry.kind === \"prop\") {\n if (entryName === \"value\") {\n serialized.push(`value=\"${escapeAttribute(String(entryValue))}\"`);\n } else if ((entryName === \"checked\" || entryName === \"selected\") && entryValue) {\n serialized.push(entryName);\n }\n continue;\n }\n serialized.push(`${entryName}=\"${escapeAttribute(stringifyAttribute(entryName, entryValue))}\"`);\n }\n source += serialized.length ? `${before}${serialized.join(\" \")}` : before;\n continue;\n }\n if (kind === \"event\" || kind === \"prop\" || value === false || value === null || value === undefined) {\n source += before;\n } else if (kind === \"bool\") {\n source += value ? `${before}${name}` : before;\n } else {\n source += `${before}${name || \"\"}=\"${escapeAttribute(stringifyAttribute(name || \"\", value))}\"`;\n }\n } else {\n source += part + valueToString(value);\n }\n }\n source += result.strings[result.strings.length - 1] ?? \"\";\n return source;\n}\n\nfunction stringifyAttribute(name: string, value: unknown): string {\n if (name === \"class\" && Array.isArray(value)) return value.filter(Boolean).join(\" \");\n if (name === \"class\" && typeof value === \"object\" && value !== null) {\n return Object.keys(value as Record).filter((key) => Boolean((value as any)[key])).join(\" \");\n }\n if (name === \"style\" && typeof value === \"object\" && value !== null) {\n return Object.keys(value as Record)\n .map((key) => `${key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`)}:${(value as any)[key]}`)\n .join(\";\");\n }\n return value === true ? \"\" : String(value);\n}\n\nfunction escapeHTML(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(//g, \">\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeHTML(value)\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\ninterface ComponentContext {\n host: HTMLElement;\n root: HTMLElement | ShadowRoot;\n attr(name: string): ReadonlySignal;\n prop(name: string): ReadonlySignal;\n emit(name: string, detail?: T, options?: CustomEventInit): boolean;\n effect(callback: (onCleanup: (cleanup: Cleanup) => void) => void): EffectHandle;\n onConnected(callback: () => void): void;\n onDisconnected(callback: () => void): void;\n}\n\ntype ComponentRender = TemplateValue | (() => TemplateValue);\ntype ComponentSetup = (ctx: ComponentContext) => ComponentRender | void;\n\ninterface ComponentOptions {\n attrs?: string[];\n observedAttributes?: string[];\n props?: string[];\n shadow?: boolean | ShadowRootMode | ShadowRootInit;\n styles?: string;\n config?: ItyConfig | null;\n setup?: ComponentSetup;\n}\n\nfunction component(\n name: string,\n setupOrOptions: ComponentSetup | ComponentOptions,\n maybeOptions: Omit = {}\n): CustomElementConstructor {\n const win = getWindow();\n if (!win?.customElements || !win.HTMLElement) {\n throw new Error(\"Ity.component requires Custom Elements support\");\n }\n\n if (win.customElements.get(name)) {\n return win.customElements.get(name)!;\n }\n\n const definition: ComponentOptions = typeof setupOrOptions === \"function\"\n ? { ...maybeOptions, setup: setupOrOptions }\n : setupOrOptions;\n const attrs = definition.observedAttributes || definition.attrs || [];\n const props = definition.props || [];\n\n class ItyElement extends win.HTMLElement {\n static get observedAttributes(): string[] {\n return attrs;\n }\n\n private attrSignals = new Map>();\n private propSignals = new Map>();\n private connectedCallbacks: Cleanup[] = [];\n private disconnectedCallbacks: Cleanup[] = [];\n private effectRecords: Array<{\n callback: (onCleanup: (cleanup: Cleanup) => void) => void;\n handle?: EffectHandle;\n disposed: boolean;\n }> = [];\n private renderCleanup?: Cleanup;\n private mount?: HTMLElement | ShadowRoot;\n private renderTarget?: HTMLElement | ShadowRoot;\n private renderOutput?: ComponentRender;\n private initialized = false;\n private connected = false;\n\n connectedCallback(): void {\n this.ensureMount();\n for (const prop of props) this.upgradeProperty(prop);\n if (!this.initialized) {\n this.initialized = true;\n const ctx = this.createContext();\n const output = definition.setup?.(ctx);\n if (output !== undefined) {\n this.renderOutput = output as ComponentRender;\n }\n }\n this.connected = true;\n this.startRender();\n this.startEffects();\n for (const callback of this.connectedCallbacks) callback();\n }\n\n disconnectedCallback(): void {\n this.connected = false;\n if (this.renderCleanup) {\n this.renderCleanup();\n this.renderCleanup = undefined;\n }\n for (const record of this.effectRecords) {\n record.handle?.dispose();\n record.handle = undefined;\n }\n for (const callback of this.disconnectedCallbacks) callback();\n }\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\n this.ensureAttrSignal(name).set(newValue);\n }\n\n private ensureMount(): void {\n if (this.mount && this.renderTarget) return;\n const shadow = definition.shadow;\n if (shadow === false) {\n this.mount = this;\n } else {\n const init: ShadowRootInit = typeof shadow === \"object\"\n ? shadow\n : { mode: shadow === \"closed\" ? \"closed\" : \"open\" };\n this.mount = this.shadowRoot || this.attachShadow(init);\n }\n\n if (definition.styles) {\n const doc = this.ownerDocument;\n const style = doc.createElement(\"style\");\n style.textContent = definition.styles;\n const container = doc.createElement(\"span\");\n container.setAttribute(\"data-ity-component-root\", \"\");\n this.mount.appendChild(style);\n this.mount.appendChild(container);\n this.renderTarget = container;\n } else {\n this.renderTarget = this.mount;\n }\n }\n\n private startRender(): void {\n if (this.renderCleanup || this.renderOutput === undefined) return;\n this.renderCleanup = render(this.renderOutput, this.renderTarget!, {\n transition: false,\n config: definition.config\n });\n }\n\n private startEffects(): void {\n for (const record of this.effectRecords) {\n if (!record.disposed && !record.handle) {\n record.handle = effect(record.callback);\n }\n }\n }\n\n private ensureAttrSignal(name: string): Signal {\n if (!this.attrSignals.has(name)) {\n this.attrSignals.set(name, signal(this.getAttribute(name)));\n }\n return this.attrSignals.get(name)!;\n }\n\n private ensurePropSignal(name: string): Signal {\n if (!this.propSignals.has(name)) {\n this.propSignals.set(name, signal(undefined as unknown) as Signal);\n }\n return this.propSignals.get(name)! as Signal;\n }\n\n private upgradeProperty(name: string): void {\n if (!hasOwn(this, name)) return;\n const value = (this as any)[name];\n delete (this as any)[name];\n (this as any)[name] = value;\n }\n\n private createContext(): ComponentContext {\n return {\n host: this,\n root: this.mount!,\n attr: (name) => this.ensureAttrSignal(name),\n prop: (name: string) => this.ensurePropSignal(name),\n emit: (name, detail, options = {}) => this.dispatchEvent(new CustomEvent(name, {\n bubbles: true,\n composed: true,\n ...options,\n detail\n })),\n effect: (callback) => {\n const record = { callback, disposed: false, handle: undefined as EffectHandle | undefined };\n this.effectRecords.push(record);\n if (this.connected) record.handle = effect(callback);\n const dispose = (() => {\n record.disposed = true;\n record.handle?.dispose();\n record.handle = undefined;\n }) as EffectHandle;\n dispose.dispose = dispose;\n return dispose;\n },\n onConnected: (callback) => {\n this.connectedCallbacks.push(callback);\n },\n onDisconnected: (callback) => {\n this.disconnectedCallbacks.push(callback);\n }\n };\n }\n }\n\n for (const prop of props) {\n Object.defineProperty(ItyElement.prototype, prop, {\n configurable: true,\n enumerable: true,\n get(this: any) {\n return this.ensurePropSignal(prop).peek();\n },\n set(this: any, value: unknown) {\n this.ensurePropSignal(prop).set(typeof value === \"function\" ? (() => value) as any : value);\n }\n });\n }\n\n win.customElements.define(name, ItyElement);\n return ItyElement;\n}\n\ninterface EventRecord {\n callback: (data?: unknown) => void;\n ctx: any;\n}\n\nclass Evented {\n private _events: Record = {};\n\n on(evtName: string, callback: (data?: unknown) => void, context: any = this): void {\n (this._events[evtName] ||= []).push({ callback, ctx: context });\n }\n\n off(evtName?: string, callback?: (data?: unknown) => void, context?: any): void {\n if (!evtName) {\n this._events = {};\n return;\n }\n const events = this._events[evtName];\n if (!events) return;\n if (!callback) {\n delete this._events[evtName];\n return;\n }\n for (let i = events.length - 1; i >= 0; i -= 1) {\n const event = events[i];\n if (event.callback === callback && (context === undefined || event.ctx === context)) {\n events.splice(i, 1);\n }\n }\n if (events.length === 0) delete this._events[evtName];\n }\n\n trigger(evtName: string, data?: unknown): void {\n const events = this._events[evtName];\n if (!events) return;\n for (const event of events.slice()) {\n event.callback.call(event.ctx, data);\n }\n }\n}\n\nconst regexps = {\n nospaces: /^\\S*$/\n} as const;\n\nclass SelectorObject {\n [index: number]: HTMLElement;\n public readonly isSelectorObject = true;\n private nodes: HTMLElement[] = [];\n\n constructor(nodeList: ArrayLike = []) {\n this.nodes = Array.from(nodeList as HTMLElement[]);\n this.reindex();\n }\n\n get length(): number {\n return this.nodes.length;\n }\n\n [Symbol.iterator](): Iterator {\n return this.nodes[Symbol.iterator]();\n }\n\n toArray(): HTMLElement[] {\n return this.nodes.slice();\n }\n\n find(selector: string): SelectorObject {\n const nodeList: HTMLElement[] = [];\n for (const node of this.nodes) {\n const list = node.querySelectorAll(selector);\n for (const thisNode of Array.from(list)) {\n const elm = thisNode as HTMLElement;\n if (nodeList.indexOf(elm) < 0) nodeList.push(elm);\n }\n }\n return new SelectorObject(nodeList);\n }\n\n filter(selector: string): SelectorObject {\n return new SelectorObject(this.nodes.filter((node) => node.matches(selector)));\n }\n\n first(): SelectorObject {\n return new SelectorObject(this.nodes[0] ? [this.nodes[0]] : []);\n }\n\n last(): SelectorObject {\n return new SelectorObject(this.nodes.length ? [this.nodes[this.nodes.length - 1]] : []);\n }\n\n parent(): SelectorObject {\n const nodeList: HTMLElement[] = [];\n for (const node of this.nodes) {\n const parent = node.parentElement;\n if (parent && nodeList.indexOf(parent) < 0) nodeList.push(parent);\n }\n return new SelectorObject(nodeList);\n }\n\n children(selector?: string): SelectorObject {\n const nodeList: HTMLElement[] = [];\n for (const node of this.nodes) {\n for (const child of Array.from(node.children) as HTMLElement[]) {\n if (nodeList.indexOf(child) < 0 && (!selector || child.matches(selector))) {\n nodeList.push(child);\n }\n }\n }\n return new SelectorObject(nodeList);\n }\n\n remove(): SelectorObject {\n for (const node of this.nodes) node.remove();\n return new SelectorObject([]);\n }\n\n addClass(...classes: string[]): this {\n for (const node of this.nodes) node.classList.add(...classes);\n return this;\n }\n\n removeClass(value: string): this {\n if (value && regexps.nospaces.test(value)) {\n for (const node of this.nodes) node.classList.remove(value);\n }\n return this;\n }\n\n toggleClass(value: string): this {\n if (value && regexps.nospaces.test(value)) {\n for (const node of this.nodes) node.classList.toggle(value);\n }\n return this;\n }\n\n hasClass(value: string): boolean {\n return Boolean(value && regexps.nospaces.test(value) && this.nodes.some((node) => node.classList.contains(value)));\n }\n\n attr(name: string, value?: string | number | boolean | null): string | null | this {\n if (arguments.length === 1) return this.nodes[0]?.getAttribute(name) ?? null;\n for (const node of this.nodes) {\n if (value === null || value === false || value === undefined) node.removeAttribute(name);\n else node.setAttribute(name, value === true ? \"\" : String(value));\n }\n return this;\n }\n\n text(value?: string | number | boolean): string | this {\n if (arguments.length === 0) return this.nodes.map((node) => node.textContent || \"\").join(\"\");\n for (const node of this.nodes) node.textContent = String(value);\n return this;\n }\n\n on(eventName: string, listener: EventListener, options?: AddEventListenerOptions): this {\n for (const node of this.nodes) node.addEventListener(eventName, listener, options);\n return this;\n }\n\n off(eventName: string, listener: EventListener, options?: EventListenerOptions): this {\n for (const node of this.nodes) node.removeEventListener(eventName, listener, options);\n return this;\n }\n\n before(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"beforebegin\");\n }\n\n after(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"afterend\");\n }\n\n append(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"beforeend\");\n }\n\n prepend(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"afterbegin\");\n }\n\n html(content?: string | SelectorObject | HTMLElement | TemplateResult): this | string {\n if (arguments.length === 0) return this.nodes[0]?.innerHTML ?? \"\";\n return this._html(content!, \"replace\");\n }\n\n empty(): this {\n for (const node of this.nodes) node.textContent = \"\";\n return this;\n }\n\n private _html(content: string | SelectorObject | HTMLElement | TemplateResult, position: InsertPosition | \"replace\"): this {\n const doc = getDocument();\n for (const node of this.nodes) {\n if ((content as SelectorObject)?.isSelectorObject) {\n const htmls = Array.from(content as SelectorObject).map((selNode) => selNode.outerHTML).join(\"\");\n if (position === \"replace\") node.innerHTML = htmls;\n else node.insertAdjacentHTML(position as InsertPosition, htmls);\n } else if (isTemplateResult(content) && doc) {\n const fragment = materializeTemplate(content, doc);\n if (position === \"replace\") replaceChildren(node, fragment);\n else node.insertAdjacentElement(position as InsertPosition, fragmentToElement(fragment, doc));\n } else if (isNodeLike(content)) {\n const cloned = content.cloneNode(true) as HTMLElement;\n if (position === \"replace\") replaceChildren(node, valueToFragment(cloned, doc || node.ownerDocument));\n else node.insertAdjacentElement(position as InsertPosition, cloned);\n } else {\n const htmlContent = String(content);\n if (position === \"replace\") node.innerHTML = htmlContent;\n else node.insertAdjacentHTML(position as InsertPosition, htmlContent);\n }\n }\n return this;\n }\n\n private reindex(): void {\n for (const key of Object.keys(this)) {\n if (/^\\d+$/.test(key)) delete (this as any)[key];\n }\n this.nodes.forEach((node, index) => {\n (this as any)[index] = node;\n });\n }\n}\n\nfunction fragmentToElement(fragment: DocumentFragment, doc: Document): HTMLElement {\n const span = doc.createElement(\"span\");\n span.appendChild(fragment);\n return span;\n}\n\nfunction onDOMReady(fn: (...args: any[]) => void, args: unknown[] = [], context: any = Ity): void {\n const doc = getDocument();\n const func = () => fn.apply(context, args);\n if (!doc || doc.readyState !== \"loading\") func();\n else doc.addEventListener(\"DOMContentLoaded\", func, { once: true });\n}\n\ninterface AjaxOptions {\n url?: string;\n type?: string;\n data?: unknown;\n success?: (resp: any) => void;\n error?: (status?: number, error?: unknown) => void;\n}\n\nclass Model = Record> extends Evented {\n public id!: string;\n public data!: T;\n public url!: string;\n public readonly state: Signal;\n\n constructor(opts: Partial> = {}) {\n super();\n Object.assign(this, opts);\n this.id ||= `m${Math.floor(Math.random() * 100000) + 1}`;\n this.data ||= {} as T;\n this.url ||= \"\";\n this.state = signal(this.data);\n this._init(opts);\n }\n\n onDOMReady = onDOMReady;\n\n protected _init(opts?: Partial>): void {\n this.initialize(opts);\n }\n\n protected _ajax(opts: AjaxOptions = {}): void {\n const request = new XMLHttpRequest();\n const method = opts.type || \"GET\";\n const url = opts.url || this.url;\n const success = opts.success || function (this: Model, resp: any) {\n this.data = resp;\n this.state.set(resp);\n };\n const error = opts.error || function () { };\n request.open(method, url, true);\n request.onload = () => {\n if (request.status >= 200 && request.status < 400) {\n try {\n const response = request.responseText ? JSON.parse(request.responseText) : null;\n success.call(this, response);\n } catch (err) {\n error.call(this, request.status, err);\n }\n } else {\n error.call(this, request.status);\n }\n };\n request.onerror = () => error.call(this);\n request.send(opts.data === undefined ? undefined : JSON.stringify(opts.data));\n }\n\n initialize(options?: Partial>): void { }\n\n get(attr?: keyof T): any {\n const current = this.data;\n if (!attr) return current;\n return current ? (current as any)[attr as string] : undefined;\n }\n\n set(attr: keyof T | Partial, value?: any): void {\n const current = this.state.peek() || {} as T;\n const next = typeof attr === \"string\"\n ? { ...(current as any), [attr]: value } as T\n : attr as T;\n this.data = next;\n this.state.set(next);\n this.trigger(\"change\", this.data);\n }\n\n unSet(attr: keyof T): void {\n const current = this.state.peek();\n if (!current || !Object.prototype.hasOwnProperty.call(current, attr)) return;\n const next = { ...(current as any) };\n delete next[attr as string];\n this.data = next as T;\n this.state.set(this.data);\n this.trigger(\"change\", this.data);\n }\n\n clear(): void {\n this.data = {} as T;\n this.state.set(this.data);\n this.trigger(\"change\", this.data);\n }\n\n subscribe(callback: Subscriber, options?: { immediate?: boolean }): Cleanup {\n return this.state.subscribe(callback, options);\n }\n\n sync(opts?: AjaxOptions): void {\n this._ajax(opts);\n }\n\n toJSON(): T {\n return this.get();\n }\n}\n\ninterface ViewEvents {\n [selector: string]: Record;\n}\n\ninterface ViewOptions {\n el?: string | SelectorObject | NodeList | HTMLElement;\n app?: Application;\n name?: string;\n events?: ViewEvents;\n [key: string]: any;\n}\n\nclass View extends Evented {\n public id!: string;\n public el!: SelectorObject;\n public app?: Application;\n public name?: string;\n public events!: ViewEvents;\n private renderCleanup?: Cleanup;\n private delegatedListeners: Cleanup[] = [];\n\n constructor(opts: ViewOptions = {}) {\n super();\n Object.assign(this, opts);\n this.id ||= `v${Math.floor(Math.random() * 100000) + 1}`;\n if (this.app) this.app.addView(this);\n this.events ||= {};\n onDOMReady(this._init, [opts], this);\n }\n\n private _setElement(elSelector: ViewOptions[\"el\"]): void {\n const win = getWindow();\n if ((elSelector as SelectorObject)?.isSelectorObject) {\n this.el = elSelector as SelectorObject;\n } else if (win?.NodeList && elSelector instanceof win.NodeList) {\n this.el = new SelectorObject(elSelector as any);\n } else if (typeof elSelector === \"string\") {\n this.el = new SelectorObject(documentOrThrow().querySelectorAll(elSelector) as any);\n } else if (win?.HTMLElement && elSelector instanceof win.HTMLElement) {\n this.el = new SelectorObject([elSelector]);\n } else {\n throw new Error(\"el selector must be of type String, NodeList, HTMLElement or Ity.SelectorObject\");\n }\n }\n\n private _bindDOMEvents(evtObj: ViewEvents): void {\n if (!this.el || !this.el.isSelectorObject) return;\n const captureEvents = [\"focus\", \"blur\"];\n for (const selector in evtObj) {\n for (const evt in evtObj[selector]) {\n const callback = (this as any)[evtObj[selector][evt]];\n if (typeof callback !== \"function\") {\n throw new Error(`View event handler not found: ${evtObj[selector][evt]}`);\n }\n const capture = captureEvents.includes(evt);\n this._delegateEvent(selector, evt, callback, capture);\n }\n }\n }\n\n private _delegateEvent(selector: string, evtName: string, callback: (e: Event) => void, capture = false): void {\n for (const root of this.el) {\n const listener = (event: Event) => {\n let node: HTMLElement | null = event.target as HTMLElement;\n while (node) {\n if ((node as any).matches && (node as any).matches(selector)) {\n (event as any).delegateTarget = node;\n callback.call(this, event);\n break;\n }\n if (node === root) break;\n node = node.parentElement;\n }\n };\n root.addEventListener(evtName, listener, capture);\n this.delegatedListeners.push(() => root.removeEventListener(evtName, listener, capture));\n }\n }\n\n private _init(opts: ViewOptions): void {\n if (this.el) this._setElement(this.el as any);\n if (opts.el && !this.el) this._setElement(opts.el);\n this._bindDOMEvents(this.events);\n this.initialize(opts);\n }\n\n initialize(opts?: ViewOptions): void { }\n\n getName(): string | undefined {\n return this.name;\n }\n\n get(attr: keyof this): any {\n return (this as any)[attr];\n }\n\n set(attr: keyof this, value: any): void {\n (this as any)[attr] = value;\n }\n\n renderWith(view: TemplateValue | (() => TemplateValue), options?: RenderOptions): Cleanup {\n if (this.renderCleanup) this.renderCleanup();\n this.renderCleanup = render(view, this.el, options);\n return this.renderCleanup;\n }\n\n remove(): void {\n if (this.renderCleanup) this.renderCleanup();\n for (const cleanup of this.delegatedListeners.splice(0)) cleanup();\n this.el.remove();\n if (this.app) this.app.removeView(this.id);\n }\n\n select(selector: string, ctx: HTMLElement | HTMLDocument | SelectorObject = this.el): SelectorObject {\n const win = getWindow();\n if ((win?.HTMLElement && ctx instanceof win.HTMLElement) || (win?.HTMLDocument && ctx instanceof win.HTMLDocument)) {\n return new SelectorObject(ctx.querySelectorAll(selector) as any);\n }\n if ((ctx as any).isSelectorObject) return (ctx as SelectorObject).find(selector);\n throw new Error(\"Context passed to .select() must be an HTMLElement or an Ity.SelectorObject\");\n }\n}\n\nclass Application {\n public views: View[] = [];\n\n getView(id: string): View | undefined {\n return this.views.find((view) => view.id === id);\n }\n\n addView(view: View): void {\n if (view instanceof View && !this.views.includes(view)) this.views.push(view);\n }\n\n removeView(id: string): void {\n this.views = this.views.filter((view) => view.id !== id);\n }\n\n trigger(evtName: string, data?: unknown): void {\n for (const view of this.views.slice()) view.trigger(evtName, data);\n }\n}\n\nclass Collection {\n public models: M[] = [];\n public url!: string;\n public readonly state: Signal;\n private ModelClass: new () => M;\n\n constructor(models: M[] = [], ModelClass: new () => M = Model as any) {\n this.ModelClass = ModelClass;\n this.url = \"\";\n this.state = signal(this.models);\n models.forEach((model) => this.add(model));\n }\n\n get(id: string): M | undefined {\n return this.models.find((model) => model.id === id);\n }\n\n add(model: M): void {\n if (!(model instanceof Model)) return;\n this.models = [...this.models, model];\n this.state.set(this.models);\n }\n\n remove(id: string | M): void {\n const model = typeof id === \"string\" ? this.get(id) : id;\n if (!model) return;\n this.models = this.models.filter((item) => item !== model);\n this.state.set(this.models);\n }\n\n at(index: number): M | undefined {\n return this.models[index];\n }\n\n get length(): number {\n return this.models.length;\n }\n\n clear(): void {\n this.models = [];\n this.state.set(this.models);\n }\n\n find(predicate: (m: M) => boolean): M | undefined {\n return this.models.find(predicate);\n }\n\n filter(predicate: (m: M) => boolean): M[] {\n return this.models.filter(predicate);\n }\n\n map(mapper: (m: M, index: number) => T): T[] {\n return this.models.map(mapper);\n }\n\n toJSON(): any[] {\n return this.models.map((model) => model.get());\n }\n\n subscribe(callback: Subscriber, options?: { immediate?: boolean }): Cleanup {\n return this.state.subscribe(callback, options);\n }\n\n protected _ajax(opts: AjaxOptions = {}): void {\n const request = new XMLHttpRequest();\n const method = opts.type || \"GET\";\n const url = opts.url || this.url;\n const success = opts.success || function () { };\n const error = opts.error || function () { };\n request.open(method, url, true);\n request.onload = () => {\n if (request.status >= 200 && request.status < 400) {\n try {\n success.call(this, request.responseText ? JSON.parse(request.responseText) : null);\n } catch (err) {\n error.call(this, request.status, err);\n }\n } else {\n error.call(this, request.status);\n }\n };\n request.onerror = () => error.call(this);\n request.send(opts.data === undefined ? undefined : JSON.stringify(opts.data));\n }\n\n fetch(opts: AjaxOptions & { modelClass?: new () => M } = {}): void {\n const userSuccess = opts.success;\n opts.success = function (this: Collection, resp: any[]) {\n const ctor = (opts.modelClass || this.ModelClass) as new () => M;\n this.clear();\n for (const data of resp || []) {\n const model = new ctor();\n (model as any).set(data);\n this.add(model);\n }\n if (userSuccess) userSuccess.call(this, resp);\n };\n this._ajax(opts);\n }\n\n trigger(evtName: string, data?: unknown): void {\n for (const model of this.models.slice()) model.trigger(evtName, data);\n }\n}\n\ninterface RouteContext {\n path: string;\n url: URL;\n params: Record;\n query: Record;\n hash: Record;\n}\n\ntype RouteHandler = (params: Record, context: RouteContext) => void | Cleanup;\n\ninterface RouteRecord {\n pattern: string;\n handler: RouteHandler;\n exec(url: URL): Record | null;\n}\n\ninterface RouterOptions {\n base?: string;\n autoStart?: boolean;\n linkSelector?: string;\n transition?: boolean;\n notFound?: RouteHandler;\n}\n\nclass Router {\n private routes: RouteRecord[] = [];\n private started = false;\n private readonly listener = () => this.check();\n private readonly clickListener = (event: Event) => this.handleLinkClick(event);\n private readonly navigationListener = (event: any) => this.handleNavigationEvent(event);\n private routeCleanup?: Cleanup;\n private activeRoute?: RouteRecord;\n public readonly current: Signal = signal(null);\n public notFound?: RouteHandler;\n public base: string;\n public linkSelector: string;\n public transition: boolean;\n\n constructor(options: RouterOptions = {}) {\n this.base = options.base || \"/\";\n this.linkSelector = options.linkSelector || \"a[href]\";\n this.transition = Boolean(options.transition);\n this.notFound = options.notFound;\n if (options.autoStart !== false) this.start();\n }\n\n add(pattern: string, handler: RouteHandler): this {\n this.routes.push(createRouteRecord(pattern, handler));\n return this;\n }\n\n addRoute(pattern: string, handler: RouteHandler): void {\n this.add(pattern, handler);\n }\n\n removeRoute(pattern: string): this {\n if (this.activeRoute?.pattern === pattern) {\n this.disposeRoute();\n this.activeRoute = undefined;\n this.current.set(null);\n }\n this.routes = this.routes.filter((route) => route.pattern !== pattern);\n return this;\n }\n\n navigate(path: string, options: { replace?: boolean; transition?: boolean } = {}): void {\n const win = getWindow();\n if (!win) return;\n const update = () => {\n const method = options.replace ? \"replaceState\" : \"pushState\";\n win.history[method](null, \"\", withBasePath(path, this.base));\n this.check();\n };\n withViewTransition(update, options.transition ?? this.transition);\n }\n\n href(path: string): string {\n return withBasePath(path, this.base);\n }\n\n link(path: string, attrs: Record = {}): Record {\n const previousClick = attrs[\"@click\"] as ((event: Event) => void) | undefined;\n const href = this.href(path);\n return {\n ...attrs,\n href,\n \"@click\": (event: Event) => {\n previousClick?.(event);\n const currentTarget = event.currentTarget as HTMLAnchorElement | null;\n const anchor = currentTarget && typeof (currentTarget as any).matches === \"function\" && currentTarget.matches(this.linkSelector)\n ? currentTarget\n : null;\n const url = this.resolveNavigationURL(event, anchor, href);\n if (!url) return;\n event.preventDefault();\n this.navigate(`${url.pathname}${url.search}${url.hash}`);\n }\n };\n }\n\n start(): void {\n const win = getWindow();\n const doc = getDocument();\n if (!win || this.started) {\n if (win) this.check();\n return;\n }\n win.addEventListener(\"popstate\", this.listener);\n doc?.addEventListener(\"click\", this.clickListener);\n (win as any).navigation?.addEventListener?.(\"navigate\", this.navigationListener);\n this.started = true;\n this.check();\n }\n\n stop(): void {\n const win = getWindow();\n const doc = getDocument();\n if (win && this.started) {\n win.removeEventListener(\"popstate\", this.listener);\n doc?.removeEventListener(\"click\", this.clickListener);\n (win as any).navigation?.removeEventListener?.(\"navigate\", this.navigationListener);\n }\n this.started = false;\n this.disposeRoute();\n }\n\n check(): RouteContext | null {\n const win = getWindow();\n if (!win) return null;\n const url = new URL(win.location.href);\n const routePath = stripBasePath(url.pathname, this.base);\n if (routePath === null) {\n this.disposeRoute();\n this.activeRoute = undefined;\n this.current.set(null);\n return null;\n }\n const routeUrl = new URL(url.href);\n routeUrl.pathname = routePath || \"/\";\n for (const route of this.routes) {\n const routeParams = route.exec(routeUrl);\n if (!routeParams) continue;\n const query = searchParamsToObject(url.search);\n const hash = searchParamsToObject(url.hash);\n const params = { ...routeParams, ...query, ...hash };\n const context: RouteContext = {\n path: routePath || \"/\",\n url,\n params,\n query,\n hash\n };\n this.disposeRoute();\n this.activeRoute = route;\n this.current.set(context);\n const cleanup = route.handler(params, context);\n if (typeof cleanup === \"function\") this.routeCleanup = cleanup;\n return context;\n }\n this.disposeRoute();\n this.activeRoute = undefined;\n this.current.set(null);\n const cleanup = this.notFound?.({}, {\n path: routePath || \"/\",\n url,\n params: {},\n query: searchParamsToObject(url.search),\n hash: searchParamsToObject(url.hash)\n });\n if (typeof cleanup === \"function\") this.routeCleanup = cleanup;\n return null;\n }\n\n private handleLinkClick(event: Event): void {\n const anchor = this.findAnchor(event);\n const url = this.resolveNavigationURL(event, anchor);\n if (!url) return;\n event.preventDefault();\n this.navigate(`${url.pathname}${url.search}${url.hash}`);\n }\n\n private handleNavigationEvent(event: any): void {\n const win = getWindow();\n if (!win || !event?.canIntercept || !event.destination?.url || typeof event.intercept !== \"function\") return;\n const url = new URL(event.destination.url, win.location.href);\n if (url.origin !== win.location.origin) return;\n if (stripBasePath(url.pathname, this.base) === null) return;\n event.intercept({\n handler: () => {\n this.check();\n }\n });\n }\n\n private disposeRoute(): void {\n if (!this.routeCleanup) return;\n const cleanup = this.routeCleanup;\n this.routeCleanup = undefined;\n cleanup();\n }\n\n private resolveNavigationURL(event: Event, anchor: HTMLAnchorElement | null, fallbackHref?: string): URL | null {\n const mouseEvent = event as MouseEvent;\n if (event.defaultPrevented) return null;\n if (typeof mouseEvent.button === \"number\" && mouseEvent.button !== 0) return null;\n if (mouseEvent.metaKey || mouseEvent.ctrlKey || mouseEvent.shiftKey || mouseEvent.altKey) return null;\n if (anchor && ((anchor.target && anchor.target !== \"_self\") || anchor.hasAttribute(\"download\"))) return null;\n const win = getWindow();\n if (!win) return null;\n const href = anchor?.getAttribute(\"href\") ?? fallbackHref;\n if (!href || /^(mailto|tel):/i.test(href)) return null;\n const url = new URL(anchor?.href || href, win.location.href);\n if (url.origin !== win.location.origin) return null;\n if (stripBasePath(url.pathname, this.base) === null) return null;\n return url;\n }\n\n private findAnchor(event: Event): HTMLAnchorElement | null {\n const win = getWindow();\n const fromPath = typeof (event as any).composedPath === \"function\"\n ? ((event as any).composedPath() as EventTarget[])\n : [];\n for (const entry of fromPath) {\n if (!entry || !(entry as any).matches) continue;\n const element = entry as HTMLElement;\n if (element.matches(this.linkSelector)) return element as HTMLAnchorElement;\n }\n const target = event.target as HTMLElement | null;\n return target?.closest?.(this.linkSelector) as HTMLAnchorElement | null;\n }\n}\n\nfunction createRouteRecord(pattern: string, handler: RouteHandler): RouteRecord {\n const win = getWindow();\n const URLPatternCtor = (win as any)?.URLPattern || (globalThis as any).URLPattern;\n if (typeof URLPatternCtor === \"function\") {\n try {\n const nativePattern = new URLPatternCtor({ pathname: pattern });\n return {\n pattern,\n handler,\n exec(url) {\n const match = nativePattern.exec(url.href);\n return match ? decodeParams(match.pathname.groups || {}) : null;\n }\n };\n } catch (_err) {\n // Fall through to the regex matcher for non-URLPattern syntax.\n }\n }\n\n const { re, keys } = compilePathPattern(pattern);\n return {\n pattern,\n handler,\n exec(url) {\n const match = re.exec(normalizePath(url.pathname));\n if (!match) return null;\n const params: Record = {};\n keys.forEach((key, index) => {\n params[key] = decodeURIComponent(match[index + 1] || \"\");\n });\n return params;\n }\n };\n}\n\nfunction normalizeBase(base: string): string {\n const normalized = normalizePath(base || \"/\");\n return normalized === \"\" ? \"\" : normalized;\n}\n\nfunction withBasePath(path: string, base: string): string {\n const normalizedBase = normalizeBase(base);\n const parsed = new URL(path || \"/\", \"http://ity.local\");\n let pathname = normalizePath(parsed.pathname) || \"/\";\n if (normalizedBase && pathname !== normalizedBase && !pathname.startsWith(`${normalizedBase}/`)) {\n pathname = `${normalizedBase}${pathname === \"/\" ? \"\" : pathname}`;\n }\n return `${pathname}${parsed.search}${parsed.hash}`;\n}\n\nfunction stripBasePath(pathname: string, base: string): string | null {\n const normalizedBase = normalizeBase(base);\n const normalizedPath = normalizePath(pathname) || \"/\";\n if (!normalizedBase) return normalizedPath;\n if (normalizedPath === normalizedBase) return \"/\";\n if (normalizedPath.startsWith(`${normalizedBase}/`)) {\n return normalizePath(normalizedPath.slice(normalizedBase.length)) || \"/\";\n }\n return null;\n}\n\nfunction compilePathPattern(pattern: string): { re: RegExp; keys: string[] } {\n const keys: string[] = [];\n const normalized = normalizePath(pattern);\n if (normalized === \"\") return { re: /^\\/?$/, keys };\n const segments = normalized.split(\"/\").filter(Boolean);\n const source = segments.map((segment) => {\n if (segment === \"*\") {\n keys.push(\"wildcard\");\n return \"(.*)\";\n }\n if (segment.startsWith(\":\")) {\n keys.push(segment.slice(1));\n return \"([^/]+)\";\n }\n return escapeRegExp(segment);\n }).join(\"/\");\n return { re: new RegExp(`^/${source}/?$`), keys };\n}\n\nfunction normalizePath(path: string): string {\n const normalized = path.replace(/[?#].*$/, \"\").replace(/\\/+$/, \"\");\n return normalized === \"\" ? \"\" : normalized.startsWith(\"/\") ? normalized : `/${normalized}`;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction searchParamsToObject(value: string): Record {\n const out: Record = {};\n const clean = value.replace(/^[?#]/, \"\");\n if (!clean) return out;\n const params = new URLSearchParams(clean);\n params.forEach((paramValue, key) => {\n out[key] = paramValue;\n });\n return out;\n}\n\nfunction decodeParams(value: Record): Record {\n const out: Record = {};\n for (const key of Object.keys(value)) {\n out[key] = decodeURIComponent(value[key]);\n }\n return out;\n}\n\nconst defaultRouter = signal(null);\n\nfunction route(pattern: string, handler: RouteHandler): Router {\n let router = defaultRouter.peek();\n if (!router) {\n router = new Router({ autoStart: false });\n defaultRouter.set(router);\n }\n router.add(pattern, handler);\n router.start();\n return router;\n}\n\nconst Ity = {\n version: \"2.2.0\",\n createConfig,\n configure,\n signal,\n computed,\n effect,\n batch,\n untrack,\n isSignal,\n resolveSignal,\n store,\n resource,\n action,\n form,\n formState,\n html,\n unsafeHTML,\n render,\n renderToString,\n component,\n route,\n Router,\n SelectorObject,\n onDOMReady,\n Model,\n View,\n Application,\n Collection\n};\n\nfunction createAmdExport(): typeof Ity {\n const win = getWindow();\n if (win) (win as any).Ity = Ity;\n return Ity;\n}\n\n/* c8 ignore next 3 */\nif (typeof define === \"function\" && (define as any).amd) {\n (define as any)(createAmdExport);\n} else if (typeof module === \"object\" && typeof module.exports !== \"undefined\") {\n module.exports = Ity;\n}\n\nconst win = getWindow();\nif (win) {\n (win as any).Ity = Ity;\n}\n\nexport {\n Application,\n Collection,\n Model,\n Router,\n SelectorObject,\n View,\n batch,\n component,\n configure,\n createConfig,\n computed,\n effect,\n action,\n form,\n formState,\n html,\n isSignal,\n onDOMReady,\n render,\n renderToString,\n resource,\n resolveSignal,\n route,\n signal,\n store,\n unsafeHTML,\n untrack\n};\nexport type {\n Action,\n ActionOptions,\n AsyncStatus,\n ComponentContext,\n ComponentOptions,\n EffectHandle,\n FormBindOptions,\n FormController,\n FormField,\n FormOptions,\n FormState,\n FormStateController,\n FormStateOptions,\n FormStateSubmitOptions,\n HTMLSanitizer,\n ItyConfig,\n ReadonlySignal,\n RenderOptions,\n RenderToStringOptions,\n Resource,\n ResourceContext,\n ResourceOptions,\n RouteContext,\n RouteHandler,\n Signal,\n Store,\n TemplateResult,\n UnsafeHTMLOptions\n};\nexport default Ity;\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/ity.esm.mjs b/dist/ity.esm.mjs index 27b074d..1e689da 100644 --- a/dist/ity.esm.mjs +++ b/dist/ity.esm.mjs @@ -3,6 +3,7 @@ let activeObserver = null; let batchDepth = 0; const pendingEffects = new Set(); let configuredSanitizeHTML; +const activeConfigStack = []; function getWindow() { return typeof window !== "undefined" ? window : undefined; } @@ -11,6 +12,79 @@ function getDocument() { const win = getWindow(); return (_a = win === null || win === void 0 ? void 0 : win.document) !== null && _a !== void 0 ? _a : (typeof document !== "undefined" ? document : undefined); } +function hasOwn(target, key) { + return Object.prototype.hasOwnProperty.call(target, key); +} +function isPlainObject(value) { + if (!value || typeof value !== "object") + return false; + const proto = Object.getPrototypeOf(value); + return proto === Object.prototype || proto === null; +} +function cloneValue(value) { + const cloneFn = globalThis.structuredClone; + if (typeof cloneFn === "function") + return cloneFn(value); + if (Array.isArray(value)) + return value.map((item) => cloneValue(item)); + if (isPlainObject(value)) { + const out = {}; + for (const key of Reflect.ownKeys(value)) { + out[key] = cloneValue(value[key]); + } + return out; + } + return value; +} +function deepEqual(left, right) { + if (Object.is(left, right)) + return true; + if (Array.isArray(left) && Array.isArray(right)) { + if (left.length !== right.length) + return false; + for (let i = 0; i < left.length; i += 1) { + if (!deepEqual(left[i], right[i])) + return false; + } + return true; + } + if (isPlainObject(left) && isPlainObject(right)) { + const leftKeys = Reflect.ownKeys(left); + const rightKeys = Reflect.ownKeys(right); + if (leftKeys.length !== rightKeys.length) + return false; + for (const key of leftKeys) { + if (!rightKeys.includes(key)) + return false; + if (!deepEqual(left[key], right[key])) + return false; + } + return true; + } + return false; +} +function currentConfig() { + return activeConfigStack.length ? activeConfigStack[activeConfigStack.length - 1] : null; +} +function withConfig(config, callback) { + activeConfigStack.push(config || null); + try { + return callback(); + } + finally { + activeConfigStack.pop(); + } +} +function resolveSanitizeHTML(options = {}) { + var _a; + if (options.sanitize) + return options.sanitize; + const scoped = (_a = options.config) !== null && _a !== void 0 ? _a : currentConfig(); + if (scoped && hasOwn(scoped, "sanitizeHTML")) { + return scoped.sanitizeHTML || undefined; + } + return configuredSanitizeHTML; +} function trackDependency(source) { if (!activeObserver) return; @@ -240,6 +314,13 @@ function resolveSignal(value) { function configure(options = {}) { configuredSanitizeHTML = options.sanitizeHTML || undefined; } +function createConfig(options = {}) { + var _a; + const config = {}; + if (hasOwn(options, "sanitizeHTML")) + config.sanitizeHTML = (_a = options.sanitizeHTML) !== null && _a !== void 0 ? _a : null; + return config; +} function store(initialValue) { const keys = new Set(Reflect.ownKeys(initialValue)); const signals = new Map(); @@ -472,6 +553,19 @@ function action(handler, options = {}) { const callable = ((...args) => submit(...args)); const mutableCallable = callable; mutableCallable.submit = submit; + mutableCallable.run = (...args) => { + submit(...args).catch(() => undefined); + }; + mutableCallable.with = (...args) => { + return () => { + mutableCallable.run(...args); + }; + }; + mutableCallable.from = (mapper) => { + return (event) => { + mutableCallable.run(...mapper(event)); + }; + }; mutableCallable.data = data; mutableCallable.error = error; mutableCallable.pending = pending; @@ -486,40 +580,48 @@ function action(handler, options = {}) { }; return callable; } +function getFormElementCtor(node) { + var _a, _b; + const ownerWindow = (_a = node === null || node === void 0 ? void 0 : node.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView; + return (ownerWindow === null || ownerWindow === void 0 ? void 0 : ownerWindow.HTMLFormElement) + || ((_b = getWindow()) === null || _b === void 0 ? void 0 : _b.HTMLFormElement) + || (typeof HTMLFormElement !== "undefined" ? HTMLFormElement : undefined); +} +function isFormElement(node, fallbackNode) { + const FormElement = node ? getFormElementCtor(node) : getFormElementCtor(fallbackNode || null); + return Boolean(node && FormElement && node instanceof FormElement); +} +function findFormElement(event) { + var _a; + const target = (event.currentTarget || event.target); + if (!getFormElementCtor(target)) + throw new Error("Ity.form requires HTMLFormElement support"); + if (isFormElement(target, target)) + return target; + const closest = (_a = target === null || target === void 0 ? void 0 : target.closest) === null || _a === void 0 ? void 0 : _a.call(target, "form"); + if (isFormElement(closest, target)) + return closest; + throw new Error("Ity.form onSubmit requires a form event target"); +} +function createFormDataForElement(formElement) { + var _a, _b; + const ownerWindow = (_a = formElement.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView; + const FormDataCtor = (ownerWindow === null || ownerWindow === void 0 ? void 0 : ownerWindow.FormData) + || ((_b = getWindow()) === null || _b === void 0 ? void 0 : _b.FormData) + || (typeof FormData !== "undefined" ? FormData : undefined); + if (!FormDataCtor) + throw new Error("Ity.form requires FormData support"); + return new FormDataCtor(formElement); +} function form(handler, options = {}) { const submitAction = action(handler, options); - const findForm = (event) => { - var _a; - const target = (event.currentTarget || event.target); - const getFormElementCtor = (node) => { - var _a, _b; - const ownerWindow = (_a = node === null || node === void 0 ? void 0 : node.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView; - return (ownerWindow === null || ownerWindow === void 0 ? void 0 : ownerWindow.HTMLFormElement) - || ((_b = getWindow()) === null || _b === void 0 ? void 0 : _b.HTMLFormElement) - || (typeof HTMLFormElement !== "undefined" ? HTMLFormElement : undefined); - }; - const isFormElement = (node) => { - const FormElement = node ? getFormElementCtor(node) : getFormElementCtor(target); - return Boolean(node && FormElement && node instanceof FormElement); - }; - if (!getFormElementCtor(target)) - throw new Error("Ity.form requires HTMLFormElement support"); - if (isFormElement(target)) - return target; - const closest = (_a = target === null || target === void 0 ? void 0 : target.closest) === null || _a === void 0 ? void 0 : _a.call(target, "form"); - if (isFormElement(closest)) - return closest; - throw new Error("Ity.form onSubmit requires a form event target"); - }; - const createFormData = (formElement) => { - var _a, _b; - const ownerWindow = (_a = formElement.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView; - const FormDataCtor = (ownerWindow === null || ownerWindow === void 0 ? void 0 : ownerWindow.FormData) - || ((_b = getWindow()) === null || _b === void 0 ? void 0 : _b.FormData) - || (typeof FormData !== "undefined" ? FormData : undefined); - if (!FormDataCtor) - throw new Error("Ity.form requires FormData support"); - return new FormDataCtor(formElement); + const onSubmit = async (event) => { + event.preventDefault(); + const formElement = findFormElement(event); + const result = await submitAction(createFormDataForElement(formElement), event); + if (options.resetOnSuccess) + formElement.reset(); + return result; }; return { action: submitAction, @@ -527,19 +629,360 @@ function form(handler, options = {}) { error: submitAction.error, pending: submitAction.pending, status: submitAction.status, - async onSubmit(event) { - event.preventDefault(); - const formElement = findForm(event); - const result = await submitAction(createFormData(formElement), event); - if (options.resetOnSuccess) - formElement.reset(); - return result; + onSubmit, + handleSubmit(event) { + onSubmit(event).catch(() => undefined); }, reset() { submitAction.reset(); } }; } +function replaceStoreSnapshot(target, nextValue) { + const current = target.$snapshot(); + batch(() => { + for (const key of Reflect.ownKeys(current)) { + if (!hasOwn(nextValue, key)) + delete target[key]; + } + for (const key of Reflect.ownKeys(nextValue)) { + target[key] = nextValue[key]; + } + }); +} +function formState(initialValue, options = {}) { + const values = store(cloneValue(initialValue)); + const initialValues = signal(cloneValue(initialValue)); + const errors = store({}); + const touched = store({}); + const registeredBindings = new Map(); + const allFieldNames = () => { + const names = new Set(); + Reflect.ownKeys(initialValues.peek()).forEach((key) => names.add(String(key))); + Reflect.ownKeys(values.$snapshot()).forEach((key) => names.add(String(key))); + return Array.from(names); + }; + const computeErrors = (snapshot) => { + var _a; + const out = {}; + const validators = options.validators || {}; + for (const key of allFieldNames()) { + const validator = validators[key]; + if (!validator) + continue; + const message = validator(snapshot[key], snapshot); + if (message) + out[key] = message; + } + const formErrors = (_a = options.validate) === null || _a === void 0 ? void 0 : _a.call(options, snapshot); + if (formErrors) { + for (const key of Reflect.ownKeys(formErrors)) { + const message = formErrors[key]; + if (message) + out[key] = message; + } + } + return out; + }; + const syncErrors = () => { + const nextErrors = computeErrors(values.$snapshot()); + replaceStoreSnapshot(errors, nextErrors); + return Reflect.ownKeys(nextErrors).length === 0; + }; + const markTouched = (names) => { + const keys = (names === null || names === void 0 ? void 0 : names.length) + ? names.map((name) => String(name)) + : allFieldNames(); + batch(() => { + for (const key of keys) { + touched[key] = true; + } + }); + }; + const maybeValidateTouched = () => { + const touchedSnapshot = touched.$snapshot(); + if (Reflect.ownKeys(touchedSnapshot).some((key) => Boolean(touchedSnapshot[key]))) { + syncErrors(); + } + }; + const set = (next) => { + values.$patch((current) => { + const patch = typeof next === "function" ? next(current) : next; + return patch || {}; + }); + maybeValidateTouched(); + }; + const reset = (next) => { + const base = cloneValue(next + ? { ...initialValues.peek(), ...next } + : initialValues.peek()); + initialValues.set(cloneValue(base)); + replaceStoreSnapshot(values, base); + replaceStoreSnapshot(errors, {}); + replaceStoreSnapshot(touched, {}); + }; + const createFieldSignal = (name) => { + const signalLike = function (next) { + if (arguments.length === 0) + return values[name]; + const previous = values[name]; + const resolved = typeof next === "function" + ? next(previous) + : next; + values[name] = resolved; + maybeValidateTouched(); + return resolved; + }; + signalLike.get = () => values[name]; + signalLike.peek = () => untrack(() => values[name]); + signalLike.set = (next) => signalLike(next); + signalLike.update = (updater) => signalLike(updater); + signalLike.subscribe = (callback, subscribeOptions = {}) => { + let first = true; + let previous = signalLike.peek(); + return effect(() => { + const current = values[name]; + if (first) { + first = false; + previous = current; + if (subscribeOptions.immediate) + callback(current, current); + return; + } + if (!Object.is(previous, current)) { + const prev = previous; + previous = current; + callback(current, prev); + } + }); + }; + Object.defineProperty(signalLike, "isSignal", { value: true }); + return signalLike; + }; + const registerBinding = (name, domName, type, bindOptions) => { + const fieldName = String(name); + const fieldBindings = registeredBindings.get(fieldName) || new Map(); + const signature = `${domName}|${type}|${String(bindOptions.value)}`; + fieldBindings.set(signature, { + domName, + type, + value: bindOptions.value, + parse: bindOptions.parse + }); + registeredBindings.set(fieldName, fieldBindings); + }; + const syncFromForm = (event) => { + var _a; + const NO_FORM_VALUE = Symbol("ity.formState.noValue"); + let formElement; + try { + formElement = findFormElement(event); + } + catch (_error) { + return; + } + const formData = createFormDataForElement(formElement); + const controls = Array.from(formElement.elements || []); + const patch = {}; + const resolveControlValue = (name, bindings) => { + var _a, _b, _c; + const primary = bindings[0]; + if (!primary) + return NO_FORM_VALUE; + const domName = primary.domName; + const namedControls = controls.filter((control) => control && control.name === domName); + if (primary.parse && namedControls.length) { + const parseTarget = primary.type === "radio" + ? namedControls.find((control) => Boolean(control.checked)) || namedControls[0] + : namedControls[0]; + return primary.parse(parseTarget, event); + } + if (primary.type === "checkbox") { + const currentValue = values[name]; + if (Array.isArray(currentValue) || bindings.some((binding) => binding.value !== undefined) || namedControls.length > 1) { + const selected = []; + for (const control of namedControls) { + if (!control.checked) + continue; + const matched = bindings.find((binding) => { var _a, _b, _c; return String((_b = (_a = binding.value) !== null && _a !== void 0 ? _a : control.value) !== null && _b !== void 0 ? _b : "") === String((_c = control.value) !== null && _c !== void 0 ? _c : ""); }); + selected.push((_b = (_a = matched === null || matched === void 0 ? void 0 : matched.value) !== null && _a !== void 0 ? _a : control.value) !== null && _b !== void 0 ? _b : ""); + } + return selected; + } + return formData.has(domName); + } + if (primary.type === "radio") { + return ((_c = formData.get(domName)) !== null && _c !== void 0 ? _c : values[name]); + } + if (primary.type === "select-multiple") { + const select = namedControls[0]; + if (select === null || select === void 0 ? void 0 : select.selectedOptions) { + return Array.from(select.selectedOptions).map((option) => option.value); + } + return formData.getAll(domName); + } + if (primary.type === "number") { + const raw = formData.get(domName); + return (raw === null || raw === "" ? undefined : Number(raw)); + } + const raw = formData.get(domName); + return (raw === null ? "" : raw); + }; + for (const fieldName of allFieldNames()) { + const bindings = Array.from(((_a = registeredBindings.get(fieldName)) === null || _a === void 0 ? void 0 : _a.values()) || []); + const nextValue = resolveControlValue(fieldName, bindings); + if (nextValue !== NO_FORM_VALUE) { + patch[fieldName] = nextValue; + } + } + if (Reflect.ownKeys(patch).length) { + values.$patch(() => patch); + } + }; + const bind = (name, bindOptions = {}) => { + const field = api.field(name); + const type = bindOptions.type || "text"; + const eventName = bindOptions.event + || (type === "checkbox" || type === "radio" || type === "select" || type === "select-multiple" ? "change" : "input"); + const domName = bindOptions.name || String(name); + registerBinding(name, domName, type, bindOptions); + const formattedValue = bindOptions.format ? bindOptions.format(field.value()) : field.value(); + const parseValue = (event) => { + var _a, _b; + if (bindOptions.parse) { + return bindOptions.parse((event.currentTarget || event.target), event); + } + const target = (event.currentTarget || event.target); + if (!target) + return field.value(); + if (type === "checkbox") { + if (Array.isArray(field.value())) { + const optionValue = (_a = bindOptions.value) !== null && _a !== void 0 ? _a : target.value; + const current = field.value(); + return (target.checked + ? Array.from(new Set([...current, optionValue])) + : current.filter((item) => !Object.is(item, optionValue))); + } + return Boolean(target.checked); + } + if (type === "radio") { + if (!target.checked) + return field.value(); + return ((_b = bindOptions.value) !== null && _b !== void 0 ? _b : target.value); + } + if (type === "select-multiple") { + return Array.from(target.selectedOptions).map((option) => option.value); + } + if (type === "number") { + const raw = target.value; + return (raw === "" ? undefined : Number(raw)); + } + return target.value; + }; + const binding = { + name: domName, + [`@${eventName}`]: (event) => { + field.set(parseValue(event)); + }, + "@blur": () => { + markTouched([name]); + syncErrors(); + } + }; + if (type === "checkbox") { + if (Array.isArray(field.value())) { + const optionValue = bindOptions.value; + binding.value = optionValue === undefined ? "" : String(optionValue); + binding[".checked"] = computed(() => field.value().some((item) => Object.is(item, optionValue))); + } + else { + binding[".checked"] = computed(() => Boolean(field.value())); + binding.checked = Boolean(field.value()); + } + return binding; + } + if (type === "radio") { + const optionValue = bindOptions.value; + binding.value = optionValue === undefined ? "" : String(optionValue); + binding[".checked"] = computed(() => Object.is(field.value(), optionValue)); + return binding; + } + if (type === "select-multiple") { + binding[".value"] = formattedValue; + return binding; + } + const stringValue = formattedValue === undefined || formattedValue === null ? "" : String(formattedValue); + binding[".value"] = stringValue; + binding.value = stringValue; + return binding; + }; + const api = { + values, + initialValues, + errors, + touched, + dirty: computed(() => !deepEqual(values.$snapshot(), initialValues())), + valid: computed(() => Reflect.ownKeys(errors.$snapshot()).length === 0), + field(name) { + const valueSignal = createFieldSignal(name); + return { + value: valueSignal, + error: computed(() => errors[name] || null), + touched: computed(() => Boolean(touched[name])), + dirty: computed(() => !deepEqual(values[name], initialValues()[name])), + bind(optionsForField) { + return bind(name, optionsForField); + }, + set(next) { + return valueSignal.set(next); + }, + reset() { + valueSignal.set(initialValues.peek()[name]); + delete errors[name]; + delete touched[name]; + } + }; + }, + bind, + set, + reset, + validate() { + return syncErrors(); + }, + markTouched, + submit(handler, submitOptions = {}) { + const submitAction = action(handler, submitOptions); + const onSubmit = async (event) => { + event.preventDefault(); + syncFromForm(event); + markTouched(); + if (!syncErrors()) + return undefined; + const result = await submitAction(cloneValue(values.$snapshot()), event); + if (submitOptions.resetOnSuccess) + api.reset(); + return result; + }; + return { + state: api, + action: submitAction, + data: submitAction.data, + error: submitAction.error, + pending: submitAction.pending, + status: submitAction.status, + onSubmit, + handleSubmit(event) { + onSubmit(event).catch(() => undefined); + }, + reset() { + submitAction.reset(); + api.reset(); + } + }; + } + }; + return api; +} function html(strings, ...values) { return { isTemplateResult: true, @@ -548,7 +991,7 @@ function html(strings, ...values) { }; } function unsafeHTML(value, options = {}) { - const sanitizer = options.sanitize || configuredSanitizeHTML; + const sanitizer = resolveSanitizeHTML(options); return { isUnsafeHTML: true, value: sanitizer ? sanitizer(String(value)) : String(value) @@ -602,6 +1045,12 @@ function appendValue(parent, value, doc) { } parent.appendChild(doc.createTextNode(String(value))); } +function bindingFromName(rawName) { + const first = rawName[0]; + const kind = first === "@" ? "event" : first === "." ? "prop" : first === "?" ? "bool" : "attr"; + const name = kind === "attr" ? rawName : rawName.slice(1); + return { kind, name }; +} function materializeTemplate(result, doc = documentOrThrow()) { var _a, _b; const bindings = []; @@ -613,9 +1062,7 @@ function materializeTemplate(result, doc = documentOrThrow()) { const rawName = attrMatch[1]; const before = part.slice(0, part.length - attrMatch[0].length); const marker = `data-ity-bind-${i}`; - const first = rawName[0]; - const kind = first === "@" ? "event" : first === "." ? "prop" : first === "?" ? "bool" : "attr"; - const name = kind === "attr" ? rawName : rawName.slice(1); + const { kind, name } = bindingFromName(rawName); bindings.push({ index: i, kind, name }); source += `${before}${marker}=""`; } @@ -665,6 +1112,14 @@ function applyBindings(root, bindings, values, doc) { } function applyElementBinding(element, binding, value) { const name = binding.name || ""; + if (binding.kind === "attr" && name === "bind" && isPlainObject(value)) { + for (const key of Reflect.ownKeys(value)) { + const entryValue = normalizeValue(value[key]); + const entry = bindingFromName(String(key)); + applyElementBinding(element, { index: binding.index, ...entry }, entryValue); + } + return; + } if (binding.kind === "event") { if (typeof value === "function") { element.addEventListener(name, value); @@ -675,6 +1130,13 @@ function applyElementBinding(element, binding, value) { return; } if (binding.kind === "prop") { + if (name === "value" && Array.isArray(value) && element.tagName === "SELECT" && element.multiple) { + const selectedValues = new Set(value.map((entry) => String(entry))); + Array.from(element.options).forEach((option) => { + option.selected = selectedValues.has(option.value); + }); + return; + } element[name] = value; return; } @@ -738,10 +1200,12 @@ function withViewTransition(update, enabled) { function render(view, target, options = {}) { const mount = resolveTarget(target); const update = () => { - const value = typeof view === "function" && !isSignal(view) - ? view() - : normalizeValue(view); - withViewTransition(() => replaceChildren(mount, valueToFragment(value)), options.transition); + withConfig(options.config, () => { + const value = typeof view === "function" && !isSignal(view) + ? view() + : normalizeValue(view); + withViewTransition(() => replaceChildren(mount, valueToFragment(value)), options.transition); + }); }; if (options.reactive === false) { update(); @@ -749,11 +1213,13 @@ function render(view, target, options = {}) { } return effect(update); } -function renderToString(view) { - const value = typeof view === "function" && !isSignal(view) - ? view() - : normalizeValue(view); - return valueToString(value); +function renderToString(view, options = {}) { + return withConfig(options.config, () => { + const value = typeof view === "function" && !isSignal(view) + ? view() + : normalizeValue(view); + return valueToString(value); + }); } function valueToString(value) { value = normalizeValue(value); @@ -783,9 +1249,34 @@ function templateToString(result) { if (attrMatch) { const rawName = attrMatch[1]; const before = part.slice(0, part.length - attrMatch[0].length); - const first = rawName[0]; - const kind = first === "@" ? "event" : first === "." ? "prop" : first === "?" ? "bool" : "attr"; - const name = kind === "attr" ? rawName : rawName.slice(1); + const { kind, name } = bindingFromName(rawName); + if (kind === "attr" && name === "bind" && isPlainObject(value)) { + const serialized = []; + for (const key of Reflect.ownKeys(value)) { + const entryValue = normalizeValue(value[key]); + const entry = bindingFromName(String(key)); + const entryName = entry.name || ""; + if (entry.kind === "event" || entryValue === false || entryValue === null || entryValue === undefined) + continue; + if (entry.kind === "bool") { + if (entryValue) + serialized.push(entryName); + continue; + } + if (entry.kind === "prop") { + if (entryName === "value") { + serialized.push(`value="${escapeAttribute(String(entryValue))}"`); + } + else if ((entryName === "checked" || entryName === "selected") && entryValue) { + serialized.push(entryName); + } + continue; + } + serialized.push(`${entryName}="${escapeAttribute(stringifyAttribute(entryName, entryValue))}"`); + } + source += serialized.length ? `${before}${serialized.join(" ")}` : before; + continue; + } if (kind === "event" || kind === "prop" || value === false || value === null || value === undefined) { source += before; } @@ -793,7 +1284,7 @@ function templateToString(result) { source += value ? `${before}${name}` : before; } else { - source += `${before}${name}="${escapeAttribute(stringifyAttribute(name, value))}"`; + source += `${before}${name || ""}="${escapeAttribute(stringifyAttribute(name || "", value))}"`; } } else { @@ -839,10 +1330,12 @@ function component(name, setupOrOptions, maybeOptions = {}) { ? { ...maybeOptions, setup: setupOrOptions } : setupOrOptions; const attrs = definition.observedAttributes || definition.attrs || []; + const props = definition.props || []; class ItyElement extends win.HTMLElement { constructor() { super(...arguments); this.attrSignals = new Map(); + this.propSignals = new Map(); this.connectedCallbacks = []; this.disconnectedCallbacks = []; this.effectRecords = []; @@ -855,6 +1348,8 @@ function component(name, setupOrOptions, maybeOptions = {}) { connectedCallback() { var _a; this.ensureMount(); + for (const prop of props) + this.upgradeProperty(prop); if (!this.initialized) { this.initialized = true; const ctx = this.createContext(); @@ -916,7 +1411,10 @@ function component(name, setupOrOptions, maybeOptions = {}) { startRender() { if (this.renderCleanup || this.renderOutput === undefined) return; - this.renderCleanup = render(this.renderOutput, this.renderTarget, { transition: false }); + this.renderCleanup = render(this.renderOutput, this.renderTarget, { + transition: false, + config: definition.config + }); } startEffects() { for (const record of this.effectRecords) { @@ -931,11 +1429,25 @@ function component(name, setupOrOptions, maybeOptions = {}) { } return this.attrSignals.get(name); } + ensurePropSignal(name) { + if (!this.propSignals.has(name)) { + this.propSignals.set(name, signal(undefined)); + } + return this.propSignals.get(name); + } + upgradeProperty(name) { + if (!hasOwn(this, name)) + return; + const value = this[name]; + delete this[name]; + this[name] = value; + } createContext() { return { host: this, root: this.mount, attr: (name) => this.ensureAttrSignal(name), + prop: (name) => this.ensurePropSignal(name), emit: (name, detail, options = {}) => this.dispatchEvent(new CustomEvent(name, { bubbles: true, composed: true, @@ -965,6 +1477,18 @@ function component(name, setupOrOptions, maybeOptions = {}) { }; } } + for (const prop of props) { + Object.defineProperty(ItyElement.prototype, prop, { + configurable: true, + enumerable: true, + get() { + return this.ensurePropSignal(prop).peek(); + }, + set(value) { + this.ensurePropSignal(prop).set(typeof value === "function" ? (() => value) : value); + } + }); + } win.customElements.define(name, ItyElement); return ItyElement; } @@ -1510,7 +2034,7 @@ class Router { this.navigationListener = (event) => this.handleNavigationEvent(event); this.current = signal(null); this.base = options.base || "/"; - this.linkSelector = options.linkSelector || "a[data-ity-link]"; + this.linkSelector = options.linkSelector || "a[href]"; this.transition = Boolean(options.transition); this.notFound = options.notFound; if (options.autoStart !== false) @@ -1545,6 +2069,29 @@ class Router { }; withViewTransition(update, (_a = options.transition) !== null && _a !== void 0 ? _a : this.transition); } + href(path) { + return withBasePath(path, this.base); + } + link(path, attrs = {}) { + const previousClick = attrs["@click"]; + const href = this.href(path); + return { + ...attrs, + href, + "@click": (event) => { + previousClick === null || previousClick === void 0 ? void 0 : previousClick(event); + const currentTarget = event.currentTarget; + const anchor = currentTarget && typeof currentTarget.matches === "function" && currentTarget.matches(this.linkSelector) + ? currentTarget + : null; + const url = this.resolveNavigationURL(event, anchor, href); + if (!url) + return; + event.preventDefault(); + this.navigate(`${url.pathname}${url.search}${url.hash}`); + } + }; + } start() { var _a, _b; const win = getWindow(); @@ -1624,18 +2171,9 @@ class Router { return null; } handleLinkClick(event) { - var _a; - const target = event.target; - const anchor = (_a = target === null || target === void 0 ? void 0 : target.closest) === null || _a === void 0 ? void 0 : _a.call(target, this.linkSelector); - if (!anchor || anchor.target || anchor.hasAttribute("download")) - return; - const win = getWindow(); - if (!win) - return; - const url = new URL(anchor.href, win.location.href); - if (url.origin !== win.location.origin) - return; - if (stripBasePath(url.pathname, this.base) === null) + const anchor = this.findAnchor(event); + const url = this.resolveNavigationURL(event, anchor); + if (!url) return; event.preventDefault(); this.navigate(`${url.pathname}${url.search}${url.hash}`); @@ -1663,6 +2201,45 @@ class Router { this.routeCleanup = undefined; cleanup(); } + resolveNavigationURL(event, anchor, fallbackHref) { + var _a; + const mouseEvent = event; + if (event.defaultPrevented) + return null; + if (typeof mouseEvent.button === "number" && mouseEvent.button !== 0) + return null; + if (mouseEvent.metaKey || mouseEvent.ctrlKey || mouseEvent.shiftKey || mouseEvent.altKey) + return null; + if (anchor && ((anchor.target && anchor.target !== "_self") || anchor.hasAttribute("download"))) + return null; + const win = getWindow(); + if (!win) + return null; + const href = (_a = anchor === null || anchor === void 0 ? void 0 : anchor.getAttribute("href")) !== null && _a !== void 0 ? _a : fallbackHref; + if (!href || /^(mailto|tel):/i.test(href)) + return null; + const url = new URL((anchor === null || anchor === void 0 ? void 0 : anchor.href) || href, win.location.href); + if (url.origin !== win.location.origin) + return null; + if (stripBasePath(url.pathname, this.base) === null) + return null; + return url; + } + findAnchor(event) { + var _a; + const fromPath = typeof event.composedPath === "function" + ? event.composedPath() + : []; + for (const entry of fromPath) { + if (!entry || !entry.matches) + continue; + const element = entry; + if (element.matches(this.linkSelector)) + return element; + } + const target = event.target; + return (_a = target === null || target === void 0 ? void 0 : target.closest) === null || _a === void 0 ? void 0 : _a.call(target, this.linkSelector); + } } function createRouteRecord(pattern, handler) { const win = getWindow(); @@ -1780,7 +2357,8 @@ function route(pattern, handler) { return router; } const Ity = { - version: "2.1.0", + version: "2.2.0", + createConfig, configure, signal, computed, @@ -1793,6 +2371,7 @@ const Ity = { resource, action, form, + formState, html, unsafeHTML, render, @@ -1825,5 +2404,5 @@ if (win) { win.Ity = Ity; } -export { Application, Collection, Model, Router, SelectorObject, View, action, batch, component, computed, configure, Ity as default, effect, form, html, isSignal, onDOMReady, render, renderToString, resolveSignal, resource, route, signal, store, unsafeHTML, untrack }; +export { Application, Collection, Model, Router, SelectorObject, View, action, batch, component, computed, configure, createConfig, Ity as default, effect, form, formState, html, isSignal, onDOMReady, render, renderToString, resolveSignal, resource, route, signal, store, unsafeHTML, untrack }; //# sourceMappingURL=ity.esm.mjs.map diff --git a/dist/ity.esm.mjs.map b/dist/ity.esm.mjs.map index f6d199e..0608142 100644 --- a/dist/ity.esm.mjs.map +++ b/dist/ity.esm.mjs.map @@ -1 +1 @@ -{"version":3,"file":"ity.esm.mjs","sources":["../Ity.ts"],"sourcesContent":["// Ity.ts 2.1.0\n// (c) 2026 Dominic Cocchiarella\n// Tiny dependency-free reactive app kernel with V1 MVC compatibility.\ndeclare var define: any;\ndeclare var module: any;\n\ntype Cleanup = () => void;\ntype Equality = (prev: T, next: T) => boolean;\ntype Subscriber = (value: T, previous: T) => void;\ntype MaybeSignal = T | ReadonlySignal;\ntype TemplateValue =\n | TemplateResult\n | UnsafeHTML\n | Node\n | string\n | number\n | boolean\n | null\n | undefined\n | TemplateValue[]\n | ReadonlySignal;\n\ninterface ReadonlySignal {\n (): T;\n get(): T;\n peek(): T;\n subscribe(callback: Subscriber, options?: { immediate?: boolean }): Cleanup;\n readonly isSignal: true;\n}\n\ninterface Signal extends ReadonlySignal {\n (next: T | ((previous: T) => T)): T;\n set(next: T | ((previous: T) => T)): T;\n update(updater: (previous: T) => T): T;\n}\n\ninterface ReactiveSource {\n observers: Set;\n}\n\ninterface ReactiveObserver {\n deps: Set;\n markDirty(): void;\n}\n\ninterface ComputedOptions {\n equals?: Equality;\n}\n\ninterface SignalOptions {\n equals?: Equality;\n name?: string;\n}\n\ninterface EffectHandle {\n (): void;\n dispose(): void;\n}\n\ninterface TemplateResult {\n readonly isTemplateResult: true;\n readonly strings: readonly string[];\n readonly values: readonly unknown[];\n}\n\ninterface UnsafeHTML {\n readonly isUnsafeHTML: true;\n readonly value: string;\n}\n\ntype HTMLSanitizer = (value: string) => string;\n\ninterface UnsafeHTMLOptions {\n sanitize?: HTMLSanitizer;\n}\n\ninterface ItyConfig {\n sanitizeHTML?: HTMLSanitizer | null;\n}\n\ninterface RenderOptions {\n reactive?: boolean;\n transition?: boolean;\n}\n\ntype StoreKey = string | symbol;\n\ninterface StoreApi> {\n $patch(patch: Partial | ((current: T) => Partial | void)): void;\n $snapshot(): T;\n $subscribe(callback: (value: T) => void, options?: { immediate?: boolean }): Cleanup;\n}\n\ntype Store> = T & StoreApi;\n\ntype AsyncStatus = \"idle\" | \"loading\" | \"success\" | \"error\";\n\ninterface ResourceContext {\n signal: AbortSignal;\n previous: T | undefined;\n refreshId: number;\n}\n\ninterface ResourceOptions {\n initialValue?: T;\n immediate?: boolean;\n keepPrevious?: boolean;\n onSuccess?: (value: T) => void;\n onError?: (error: E) => void;\n}\n\ninterface Resource {\n readonly data: Signal;\n readonly error: Signal;\n readonly loading: ReadonlySignal;\n readonly status: ReadonlySignal;\n readonly promise: Promise | null;\n refresh(): Promise;\n mutate(value: T | undefined): void;\n abort(reason?: unknown): void;\n}\n\ninterface ActionOptions {\n onSuccess?: (value: TResult) => void;\n onError?: (error: E) => void;\n}\n\ninterface Action {\n (...args: TArgs): Promise;\n submit(...args: TArgs): Promise;\n readonly data: Signal;\n readonly error: Signal;\n readonly pending: ReadonlySignal;\n readonly pendingCount: ReadonlySignal;\n readonly status: ReadonlySignal;\n reset(): void;\n}\n\ninterface FormController {\n readonly action: Action<[FormData, Event], TResult, E>;\n readonly data: Signal;\n readonly error: Signal;\n readonly pending: ReadonlySignal;\n readonly status: ReadonlySignal;\n onSubmit(event: Event): Promise;\n reset(): void;\n}\n\ninterface FormOptions extends ActionOptions {\n resetOnSuccess?: boolean;\n}\n\nconst defaultEquals = Object.is;\nlet activeObserver: ReactiveObserver | null = null;\nlet batchDepth = 0;\nconst pendingEffects = new Set();\nlet configuredSanitizeHTML: HTMLSanitizer | undefined;\n\nfunction getWindow(): (Window & typeof globalThis) | undefined {\n return typeof window !== \"undefined\" ? window : undefined;\n}\n\nfunction getDocument(): Document | undefined {\n const win = getWindow();\n return win?.document ?? (typeof document !== \"undefined\" ? document : undefined);\n}\n\nfunction trackDependency(source: ReactiveSource): void {\n if (!activeObserver) return;\n source.observers.add(activeObserver);\n activeObserver.deps.add(source);\n}\n\nfunction cleanupDependencies(observer: ReactiveObserver): void {\n for (const dep of observer.deps) {\n dep.observers.delete(observer);\n }\n observer.deps.clear();\n}\n\nfunction notifyObservers(source: ReactiveSource): void {\n for (const observer of Array.from(source.observers)) {\n observer.markDirty();\n }\n}\n\nfunction flushEffects(): void {\n if (batchDepth > 0) return;\n while (pendingEffects.size) {\n const effects = Array.from(pendingEffects);\n pendingEffects.clear();\n for (const effect of effects) {\n effect.run();\n }\n }\n}\n\nfunction queueEffect(effect: ReactiveEffect): void {\n pendingEffects.add(effect);\n flushEffects();\n}\n\nclass SignalNode implements ReactiveSource {\n observers = new Set();\n private subscribers = new Set>();\n private value: T;\n private equals: Equality;\n\n constructor(value: T, options: SignalOptions = {}) {\n this.value = value;\n this.equals = options.equals || defaultEquals;\n }\n\n read(track = true): T {\n if (track) trackDependency(this);\n return this.value;\n }\n\n write(next: T | ((previous: T) => T)): T {\n const previous = this.value;\n const resolved = typeof next === \"function\"\n ? (next as (previous: T) => T)(previous)\n : next;\n if (this.equals(previous, resolved)) return previous;\n this.value = resolved;\n notifyObservers(this);\n for (const subscriber of Array.from(this.subscribers)) {\n subscriber(resolved, previous);\n }\n flushEffects();\n return resolved;\n }\n\n subscribe(callback: Subscriber, options: { immediate?: boolean } = {}): Cleanup {\n this.subscribers.add(callback);\n if (options.immediate) callback(this.value, this.value);\n return () => {\n this.subscribers.delete(callback);\n };\n }\n}\n\nclass ComputedNode implements ReactiveSource, ReactiveObserver {\n observers = new Set();\n deps = new Set();\n private subscribers = new Set>();\n private dirty = true;\n private initialized = false;\n private value!: T;\n private equals: Equality;\n\n constructor(private readonly getter: () => T, options: ComputedOptions = {}) {\n this.equals = options.equals || defaultEquals;\n }\n\n read(track = true): T {\n if (track) trackDependency(this);\n if (this.dirty) this.evaluate();\n return this.value;\n }\n\n markDirty(): void {\n if (this.dirty) return;\n const previous = this.value;\n this.dirty = true;\n notifyObservers(this);\n if (this.subscribers.size) {\n const next = this.read(false);\n if (!this.equals(previous, next)) {\n for (const subscriber of Array.from(this.subscribers)) {\n subscriber(next, previous);\n }\n }\n }\n }\n\n subscribe(callback: Subscriber, options: { immediate?: boolean } = {}): Cleanup {\n this.subscribers.add(callback);\n if (options.immediate) {\n const current = this.read(false);\n callback(current, current);\n }\n return () => {\n this.subscribers.delete(callback);\n };\n }\n\n private evaluate(): void {\n cleanupDependencies(this);\n const previousObserver = activeObserver;\n activeObserver = this;\n try {\n this.value = this.getter();\n this.dirty = false;\n this.initialized = true;\n } finally {\n activeObserver = previousObserver;\n }\n }\n}\n\nclass ReactiveEffect implements ReactiveObserver {\n deps = new Set();\n private disposed = false;\n private cleanup?: Cleanup;\n\n constructor(private readonly callback: (onCleanup: (cleanup: Cleanup) => void) => void) {\n this.run();\n }\n\n markDirty(): void {\n if (!this.disposed) queueEffect(this);\n }\n\n run(): void {\n if (this.disposed) return;\n cleanupDependencies(this);\n if (this.cleanup) {\n const cleanup = this.cleanup;\n this.cleanup = undefined;\n cleanup();\n }\n const previousObserver = activeObserver;\n activeObserver = this;\n try {\n this.callback((cleanup) => {\n this.cleanup = cleanup;\n });\n } finally {\n activeObserver = previousObserver;\n }\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n cleanupDependencies(this);\n if (this.cleanup) {\n const cleanup = this.cleanup;\n this.cleanup = undefined;\n cleanup();\n }\n pendingEffects.delete(this);\n }\n}\n\nfunction signal(initialValue: T, options: SignalOptions = {}): Signal {\n const node = new SignalNode(initialValue, options);\n const readWrite = function (next?: T | ((previous: T) => T)): T {\n if (arguments.length === 0) return node.read(true);\n return node.write(next as T | ((previous: T) => T));\n } as Signal;\n readWrite.get = () => node.read(true);\n readWrite.peek = () => node.read(false);\n readWrite.set = (next) => node.write(next);\n readWrite.update = (updater) => node.write(updater);\n readWrite.subscribe = (callback, subscribeOptions) => node.subscribe(callback, subscribeOptions);\n Object.defineProperty(readWrite, \"isSignal\", { value: true });\n return readWrite;\n}\n\nfunction computed(getter: () => T, options: ComputedOptions = {}): ReadonlySignal {\n const node = new ComputedNode(getter, options);\n const read = function (): T {\n return node.read(true);\n } as ReadonlySignal;\n read.get = () => node.read(true);\n read.peek = () => node.read(false);\n read.subscribe = (callback, subscribeOptions) => node.subscribe(callback, subscribeOptions);\n Object.defineProperty(read, \"isSignal\", { value: true });\n return read;\n}\n\nfunction effect(callback: (onCleanup: (cleanup: Cleanup) => void) => void): EffectHandle {\n const runner = new ReactiveEffect(callback);\n const dispose = (() => runner.dispose()) as EffectHandle;\n dispose.dispose = dispose;\n return dispose;\n}\n\nfunction batch(callback: () => T): T {\n batchDepth += 1;\n try {\n return callback();\n } finally {\n batchDepth -= 1;\n flushEffects();\n }\n}\n\nfunction untrack(callback: () => T): T {\n const previousObserver = activeObserver;\n activeObserver = null;\n try {\n return callback();\n } finally {\n activeObserver = previousObserver;\n }\n}\n\nfunction isSignal(value: unknown): value is ReadonlySignal {\n return typeof value === \"function\" && (value as any).isSignal === true;\n}\n\nfunction resolveSignal(value: MaybeSignal): T {\n return isSignal(value) ? value() : value;\n}\n\nfunction configure(options: ItyConfig = {}): void {\n configuredSanitizeHTML = options.sanitizeHTML || undefined;\n}\n\nfunction store>(initialValue: T): Store {\n const keys = new Set(Reflect.ownKeys(initialValue));\n const signals = new Map>();\n const structure = signal(0);\n\n const ensureSignal = (key: StoreKey): Signal => {\n if (!signals.has(key)) {\n signals.set(key, signal((initialValue as any)[key]));\n }\n return signals.get(key)!;\n };\n\n const bumpStructure = (): void => {\n structure.update((version) => version + 1);\n };\n\n const setKey = (key: StoreKey, value: any): void => {\n const hadKey = keys.has(key);\n if (!hadKey) keys.add(key);\n ensureSignal(key).set(value);\n if (!hadKey) bumpStructure();\n };\n\n const snapshot = (): T => {\n structure();\n const out: any = {};\n for (const key of keys) {\n out[key] = ensureSignal(key)();\n }\n return out as T;\n };\n\n const api: StoreApi = {\n $patch(patch) {\n const current = snapshot();\n const next = typeof patch === \"function\" ? patch(current) : patch;\n if (!next) return;\n batch(() => {\n for (const key of Reflect.ownKeys(next)) {\n setKey(key, (next as any)[key]);\n }\n });\n },\n $snapshot: snapshot,\n $subscribe(callback, options = {}) {\n let first = true;\n return effect(() => {\n const value = snapshot();\n if (first && !options.immediate) {\n first = false;\n return;\n }\n first = false;\n callback(value);\n });\n }\n };\n\n return new Proxy(api as Store, {\n get(target, key, receiver) {\n if (key in target) return Reflect.get(target, key, receiver);\n return ensureSignal(key)();\n },\n set(_target, key, value) {\n batch(() => {\n setKey(key, value);\n });\n return true;\n },\n deleteProperty(_target, key) {\n if (!keys.has(key)) return true;\n keys.delete(key);\n batch(() => {\n ensureSignal(key).set(undefined);\n bumpStructure();\n });\n return true;\n },\n ownKeys(target) {\n structure();\n return Array.from(new Set([...Reflect.ownKeys(target), ...keys]));\n },\n getOwnPropertyDescriptor(target, key) {\n structure();\n if (Object.prototype.hasOwnProperty.call(target, key)) {\n return { ...Reflect.getOwnPropertyDescriptor(target, key)!, enumerable: false };\n }\n if (!keys.has(key)) return undefined;\n return { enumerable: true, configurable: true };\n },\n has(target, key) {\n structure();\n return key in target || keys.has(key);\n }\n });\n}\n\nfunction resource(\n loader: (context: ResourceContext) => Promise | T,\n options: ResourceOptions = {}\n): Resource {\n const data = signal(options.initialValue);\n const error = signal(null);\n const pending = signal(false);\n const statusValue = signal(options.initialValue === undefined ? \"idle\" : \"success\");\n const loading = computed(() => pending());\n const status = computed(() => statusValue());\n const keepPrevious = options.keepPrevious !== false;\n let controller: AbortController | null = null;\n let refreshId = 0;\n let currentPromise: Promise | null = null;\n\n const api: Resource = {\n data,\n error,\n loading,\n status,\n get promise() {\n return currentPromise;\n },\n refresh() {\n refreshId += 1;\n const id = refreshId;\n if (controller) controller.abort();\n controller = new AbortController();\n const signal = controller.signal;\n const previous = data.peek();\n pending.set(true);\n statusValue.set(\"loading\");\n error.set(null);\n if (!keepPrevious) data.set(undefined);\n\n currentPromise = Promise.resolve()\n .then(() => loader({ signal, previous, refreshId: id }))\n .then((value) => {\n if (id !== refreshId || signal.aborted) return data.peek();\n data.set(value);\n error.set(null);\n statusValue.set(\"success\");\n options.onSuccess?.(value);\n return value;\n })\n .catch((err) => {\n if (id !== refreshId) return data.peek();\n error.set(err as E);\n statusValue.set(\"error\");\n options.onError?.(err as E);\n return data.peek();\n })\n .finally(() => {\n if (id === refreshId) {\n pending.set(false);\n controller = null;\n }\n });\n\n return currentPromise;\n },\n mutate(value) {\n refreshId += 1;\n if (controller) controller.abort();\n controller = null;\n currentPromise = null;\n data.set(value);\n error.set(null);\n pending.set(false);\n statusValue.set(value === undefined ? \"idle\" : \"success\");\n },\n abort(reason?: unknown) {\n if (!controller) return;\n refreshId += 1;\n controller.abort(reason);\n controller = null;\n currentPromise = null;\n pending.set(false);\n statusValue.set(data.peek() === undefined ? \"idle\" : \"success\");\n }\n };\n\n if (options.immediate !== false) {\n api.refresh();\n }\n\n return api;\n}\n\nfunction action(\n handler: (...args: TArgs) => Promise | TResult,\n options: ActionOptions = {}\n): Action {\n const data = signal(undefined);\n const error = signal(null);\n const count = signal(0);\n const statusValue = signal(\"idle\");\n const pending = computed(() => count() > 0);\n const pendingCount = computed(() => count());\n const status = computed(() => statusValue());\n let generation = 0;\n\n const submit = (...args: TArgs): Promise => {\n const runGeneration = generation;\n count.update((value) => value + 1);\n statusValue.set(\"loading\");\n error.set(null);\n\n return Promise.resolve()\n .then(() => handler(...args))\n .then((value) => {\n if (runGeneration === generation) {\n data.set(value);\n error.set(null);\n options.onSuccess?.(value);\n if (count.peek() <= 1) statusValue.set(\"success\");\n }\n return value;\n })\n .catch((err) => {\n if (runGeneration === generation) {\n error.set(err as E);\n options.onError?.(err as E);\n if (count.peek() <= 1) statusValue.set(\"error\");\n }\n throw err;\n })\n .finally(() => {\n if (runGeneration !== generation) return;\n count.update((value) => Math.max(0, value - 1));\n if (count.peek() > 0) statusValue.set(\"loading\");\n });\n };\n\n const callable = ((...args: TArgs) => submit(...args)) as Action;\n const mutableCallable = callable as Action & {\n submit: (...args: TArgs) => Promise;\n data: Signal;\n error: Signal;\n pending: ReadonlySignal;\n pendingCount: ReadonlySignal;\n status: ReadonlySignal;\n };\n mutableCallable.submit = submit;\n mutableCallable.data = data;\n mutableCallable.error = error;\n mutableCallable.pending = pending;\n mutableCallable.pendingCount = pendingCount;\n mutableCallable.status = status;\n callable.reset = () => {\n generation += 1;\n data.set(undefined);\n error.set(null);\n count.set(0);\n statusValue.set(\"idle\");\n };\n return callable;\n}\n\nfunction form(\n handler: (data: FormData, event: Event) => Promise | TResult,\n options: FormOptions = {}\n): FormController {\n const submitAction = action<[FormData, Event], TResult, E>(handler, options);\n\n const findForm = (event: Event): HTMLFormElement => {\n const target = (event.currentTarget || event.target) as Element | null;\n const getFormElementCtor = (node: Element | null): typeof HTMLFormElement | undefined => {\n const ownerWindow = node?.ownerDocument?.defaultView as (Window & typeof globalThis) | null | undefined;\n return ownerWindow?.HTMLFormElement\n || getWindow()?.HTMLFormElement\n || (typeof HTMLFormElement !== \"undefined\" ? HTMLFormElement : undefined);\n };\n const isFormElement = (node: Element | null | undefined): node is HTMLFormElement => {\n const FormElement = node ? getFormElementCtor(node) : getFormElementCtor(target);\n return Boolean(node && FormElement && node instanceof FormElement);\n };\n if (!getFormElementCtor(target)) throw new Error(\"Ity.form requires HTMLFormElement support\");\n if (isFormElement(target)) return target;\n const closest = target?.closest?.(\"form\");\n if (isFormElement(closest)) return closest;\n throw new Error(\"Ity.form onSubmit requires a form event target\");\n };\n\n const createFormData = (formElement: HTMLFormElement): FormData => {\n const ownerWindow = formElement.ownerDocument?.defaultView as (Window & typeof globalThis) | null | undefined;\n const FormDataCtor = ownerWindow?.FormData\n || getWindow()?.FormData\n || (typeof FormData !== \"undefined\" ? FormData : undefined);\n if (!FormDataCtor) throw new Error(\"Ity.form requires FormData support\");\n return new FormDataCtor(formElement);\n };\n\n return {\n action: submitAction,\n data: submitAction.data,\n error: submitAction.error,\n pending: submitAction.pending,\n status: submitAction.status,\n async onSubmit(event: Event): Promise {\n event.preventDefault();\n const formElement = findForm(event);\n const result = await submitAction(createFormData(formElement), event);\n if (options.resetOnSuccess) formElement.reset();\n return result;\n },\n reset() {\n submitAction.reset();\n }\n };\n}\n\nfunction html(strings: TemplateStringsArray | readonly string[], ...values: unknown[]): TemplateResult {\n return {\n isTemplateResult: true,\n strings: Array.from(strings),\n values\n };\n}\n\nfunction unsafeHTML(value: string, options: UnsafeHTMLOptions = {}): UnsafeHTML {\n const sanitizer = options.sanitize || configuredSanitizeHTML;\n return {\n isUnsafeHTML: true,\n value: sanitizer ? sanitizer(String(value)) : String(value)\n };\n}\n\nfunction isTemplateResult(value: unknown): value is TemplateResult {\n return !!value && typeof value === \"object\" && (value as TemplateResult).isTemplateResult === true;\n}\n\nfunction isUnsafeHTML(value: unknown): value is UnsafeHTML {\n return !!value && typeof value === \"object\" && (value as UnsafeHTML).isUnsafeHTML === true;\n}\n\nfunction isNodeLike(value: unknown): value is Node {\n return !!value && typeof value === \"object\" && typeof (value as Node).nodeType === \"number\";\n}\n\nfunction documentOrThrow(): Document {\n const doc = getDocument();\n if (!doc) throw new Error(\"Ity DOM rendering requires a document\");\n return doc;\n}\n\nfunction normalizeValue(value: unknown): unknown {\n return isSignal(value) ? value() : value;\n}\n\nfunction valueToFragment(value: unknown, doc: Document = documentOrThrow()): DocumentFragment {\n const fragment = doc.createDocumentFragment();\n appendValue(fragment, normalizeValue(value), doc);\n return fragment;\n}\n\nfunction appendValue(parent: Node, value: unknown, doc: Document): void {\n value = normalizeValue(value);\n if (value === null || value === undefined || value === false) return;\n if (Array.isArray(value)) {\n for (const item of value) appendValue(parent, item, doc);\n return;\n }\n if (isTemplateResult(value)) {\n parent.appendChild(materializeTemplate(value, doc));\n return;\n }\n if (isUnsafeHTML(value)) {\n const template = doc.createElement(\"template\");\n template.innerHTML = value.value;\n parent.appendChild(template.content.cloneNode(true));\n return;\n }\n if (isNodeLike(value)) {\n parent.appendChild(value);\n return;\n }\n parent.appendChild(doc.createTextNode(String(value)));\n}\n\ninterface Binding {\n index: number;\n kind: \"node\" | \"event\" | \"attr\" | \"prop\" | \"bool\";\n name?: string;\n}\n\nfunction materializeTemplate(result: TemplateResult, doc: Document = documentOrThrow()): DocumentFragment {\n const bindings: Binding[] = [];\n let source = \"\";\n\n for (let i = 0; i < result.values.length; i += 1) {\n const part = result.strings[i] ?? \"\";\n const attrMatch = part.match(/([@.?]?[\\w:-]+)\\s*=\\s*$/);\n if (attrMatch) {\n const rawName = attrMatch[1];\n const before = part.slice(0, part.length - attrMatch[0].length);\n const marker = `data-ity-bind-${i}`;\n const first = rawName[0];\n const kind = first === \"@\" ? \"event\" : first === \".\" ? \"prop\" : first === \"?\" ? \"bool\" : \"attr\";\n const name = kind === \"attr\" ? rawName : rawName.slice(1);\n bindings.push({ index: i, kind, name });\n source += `${before}${marker}=\"\"`;\n } else {\n bindings.push({ index: i, kind: \"node\" });\n source += `${part}`;\n }\n }\n source += result.strings[result.strings.length - 1] ?? \"\";\n\n const template = doc.createElement(\"template\");\n template.innerHTML = source;\n const fragment = template.content.cloneNode(true) as DocumentFragment;\n applyBindings(fragment, bindings, result.values, doc);\n return fragment;\n}\n\nfunction applyBindings(root: DocumentFragment, bindings: Binding[], values: readonly unknown[], doc: Document): void {\n const comments = new Map();\n const walker = doc.createTreeWalker(root, 128);\n let current = walker.nextNode();\n while (current) {\n const comment = current as Comment;\n const match = comment.data.match(/^ity:(\\d+)$/);\n if (match) {\n const index = Number(match[1]);\n const list = comments.get(index) || [];\n list.push(comment);\n comments.set(index, list);\n }\n current = walker.nextNode();\n }\n\n for (const binding of bindings) {\n const value = normalizeValue(values[binding.index]);\n if (binding.kind === \"node\") {\n const markers = comments.get(binding.index) || [];\n for (const marker of markers) {\n marker.replaceWith(valueToFragment(value, doc));\n }\n continue;\n }\n\n const attrName = `data-ity-bind-${binding.index}`;\n const elements = Array.from(root.querySelectorAll(`[${attrName}]`)) as HTMLElement[];\n for (const element of elements) {\n element.removeAttribute(attrName);\n applyElementBinding(element, binding, value);\n }\n }\n}\n\nfunction applyElementBinding(element: HTMLElement, binding: Binding, value: unknown): void {\n const name = binding.name || \"\";\n if (binding.kind === \"event\") {\n if (typeof value === \"function\") {\n element.addEventListener(name, value as EventListener);\n } else if (Array.isArray(value) && typeof value[0] === \"function\") {\n element.addEventListener(name, value[0] as EventListener, value[1] as AddEventListenerOptions);\n }\n return;\n }\n\n if (binding.kind === \"prop\") {\n (element as any)[name] = value;\n return;\n }\n\n if (binding.kind === \"bool\") {\n element.toggleAttribute(name, Boolean(value));\n return;\n }\n\n if (value === false || value === null || value === undefined) {\n element.removeAttribute(name);\n return;\n }\n\n if (name === \"class\" && Array.isArray(value)) {\n element.setAttribute(\"class\", value.filter(Boolean).join(\" \"));\n return;\n }\n\n if (name === \"class\" && typeof value === \"object\") {\n const classes = Object.keys(value as Record).filter((key) => Boolean((value as any)[key]));\n element.setAttribute(\"class\", classes.join(\" \"));\n return;\n }\n\n if (name === \"style\" && typeof value === \"object\" && value !== null) {\n Object.assign((element as HTMLElement).style, value);\n return;\n }\n\n element.setAttribute(name, value === true ? \"\" : String(value));\n}\n\nfunction resolveTarget(target: string | Element | DocumentFragment | SelectorObject): Element | DocumentFragment {\n if (typeof target === \"string\") {\n const found = documentOrThrow().querySelector(target);\n if (!found) throw new Error(`Render target not found: ${target}`);\n return found;\n }\n if ((target as SelectorObject)?.isSelectorObject) {\n const first = (target as SelectorObject).first()[0];\n if (!first) throw new Error(\"Cannot render into an empty SelectorObject\");\n return first;\n }\n return target as Element | DocumentFragment;\n}\n\nfunction replaceChildren(target: Element | DocumentFragment, fragment: DocumentFragment): void {\n const maybeTarget = target as any;\n if (typeof maybeTarget.replaceChildren === \"function\") {\n maybeTarget.replaceChildren(fragment);\n return;\n }\n while (target.firstChild) target.removeChild(target.firstChild);\n target.appendChild(fragment);\n}\n\nfunction withViewTransition(update: () => void, enabled: boolean | undefined): void {\n const doc = getDocument() as any;\n if (enabled && doc && typeof doc.startViewTransition === \"function\") {\n doc.startViewTransition(update);\n } else {\n update();\n }\n}\n\nfunction render(\n view: TemplateValue | (() => TemplateValue),\n target: string | Element | DocumentFragment | SelectorObject,\n options: RenderOptions = {}\n): Cleanup {\n const mount = resolveTarget(target);\n const update = () => {\n const value = typeof view === \"function\" && !isSignal(view)\n ? (view as () => TemplateValue)()\n : normalizeValue(view);\n withViewTransition(() => replaceChildren(mount, valueToFragment(value)), options.transition);\n };\n\n if (options.reactive === false) {\n update();\n return () => undefined;\n }\n\n return effect(update);\n}\n\nfunction renderToString(view: TemplateValue | (() => TemplateValue)): string {\n const value = typeof view === \"function\" && !isSignal(view)\n ? (view as () => TemplateValue)()\n : normalizeValue(view);\n return valueToString(value);\n}\n\nfunction valueToString(value: unknown): string {\n value = normalizeValue(value);\n if (value === null || value === undefined || value === false) return \"\";\n if (Array.isArray(value)) return value.map(valueToString).join(\"\");\n if (isTemplateResult(value)) return templateToString(value);\n if (isUnsafeHTML(value)) return value.value;\n if (isNodeLike(value)) {\n const node = value as any;\n if (typeof node.outerHTML === \"string\") return node.outerHTML;\n return escapeHTML(node.textContent || \"\");\n }\n return escapeHTML(String(value));\n}\n\nfunction templateToString(result: TemplateResult): string {\n let source = \"\";\n for (let i = 0; i < result.values.length; i += 1) {\n const part = result.strings[i] ?? \"\";\n const attrMatch = part.match(/([@.?]?[\\w:-]+)\\s*=\\s*$/);\n const value = normalizeValue(result.values[i]);\n if (attrMatch) {\n const rawName = attrMatch[1];\n const before = part.slice(0, part.length - attrMatch[0].length);\n const first = rawName[0];\n const kind = first === \"@\" ? \"event\" : first === \".\" ? \"prop\" : first === \"?\" ? \"bool\" : \"attr\";\n const name = kind === \"attr\" ? rawName : rawName.slice(1);\n if (kind === \"event\" || kind === \"prop\" || value === false || value === null || value === undefined) {\n source += before;\n } else if (kind === \"bool\") {\n source += value ? `${before}${name}` : before;\n } else {\n source += `${before}${name}=\"${escapeAttribute(stringifyAttribute(name, value))}\"`;\n }\n } else {\n source += part + valueToString(value);\n }\n }\n source += result.strings[result.strings.length - 1] ?? \"\";\n return source;\n}\n\nfunction stringifyAttribute(name: string, value: unknown): string {\n if (name === \"class\" && Array.isArray(value)) return value.filter(Boolean).join(\" \");\n if (name === \"class\" && typeof value === \"object\" && value !== null) {\n return Object.keys(value as Record).filter((key) => Boolean((value as any)[key])).join(\" \");\n }\n if (name === \"style\" && typeof value === \"object\" && value !== null) {\n return Object.keys(value as Record)\n .map((key) => `${key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`)}:${(value as any)[key]}`)\n .join(\";\");\n }\n return value === true ? \"\" : String(value);\n}\n\nfunction escapeHTML(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(//g, \">\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeHTML(value)\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\ninterface ComponentContext {\n host: HTMLElement;\n root: HTMLElement | ShadowRoot;\n attr(name: string): ReadonlySignal;\n emit(name: string, detail?: T, options?: CustomEventInit): boolean;\n effect(callback: (onCleanup: (cleanup: Cleanup) => void) => void): EffectHandle;\n onConnected(callback: () => void): void;\n onDisconnected(callback: () => void): void;\n}\n\ntype ComponentRender = TemplateValue | (() => TemplateValue);\ntype ComponentSetup = (ctx: ComponentContext) => ComponentRender | void;\n\ninterface ComponentOptions {\n attrs?: string[];\n observedAttributes?: string[];\n shadow?: boolean | ShadowRootMode | ShadowRootInit;\n styles?: string;\n setup?: ComponentSetup;\n}\n\nfunction component(\n name: string,\n setupOrOptions: ComponentSetup | ComponentOptions,\n maybeOptions: Omit = {}\n): CustomElementConstructor {\n const win = getWindow();\n if (!win?.customElements || !win.HTMLElement) {\n throw new Error(\"Ity.component requires Custom Elements support\");\n }\n\n if (win.customElements.get(name)) {\n return win.customElements.get(name)!;\n }\n\n const definition: ComponentOptions = typeof setupOrOptions === \"function\"\n ? { ...maybeOptions, setup: setupOrOptions }\n : setupOrOptions;\n const attrs = definition.observedAttributes || definition.attrs || [];\n\n class ItyElement extends win.HTMLElement {\n static get observedAttributes(): string[] {\n return attrs;\n }\n\n private attrSignals = new Map>();\n private connectedCallbacks: Cleanup[] = [];\n private disconnectedCallbacks: Cleanup[] = [];\n private effectRecords: Array<{\n callback: (onCleanup: (cleanup: Cleanup) => void) => void;\n handle?: EffectHandle;\n disposed: boolean;\n }> = [];\n private renderCleanup?: Cleanup;\n private mount?: HTMLElement | ShadowRoot;\n private renderTarget?: HTMLElement | ShadowRoot;\n private renderOutput?: ComponentRender;\n private initialized = false;\n private connected = false;\n\n connectedCallback(): void {\n this.ensureMount();\n if (!this.initialized) {\n this.initialized = true;\n const ctx = this.createContext();\n const output = definition.setup?.(ctx);\n if (output !== undefined) {\n this.renderOutput = output as ComponentRender;\n }\n }\n this.connected = true;\n this.startRender();\n this.startEffects();\n for (const callback of this.connectedCallbacks) callback();\n }\n\n disconnectedCallback(): void {\n this.connected = false;\n if (this.renderCleanup) {\n this.renderCleanup();\n this.renderCleanup = undefined;\n }\n for (const record of this.effectRecords) {\n record.handle?.dispose();\n record.handle = undefined;\n }\n for (const callback of this.disconnectedCallbacks) callback();\n }\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\n this.ensureAttrSignal(name).set(newValue);\n }\n\n private ensureMount(): void {\n if (this.mount && this.renderTarget) return;\n const shadow = definition.shadow;\n if (shadow === false) {\n this.mount = this;\n } else {\n const init: ShadowRootInit = typeof shadow === \"object\"\n ? shadow\n : { mode: shadow === \"closed\" ? \"closed\" : \"open\" };\n this.mount = this.shadowRoot || this.attachShadow(init);\n }\n\n if (definition.styles) {\n const doc = this.ownerDocument;\n const style = doc.createElement(\"style\");\n style.textContent = definition.styles;\n const container = doc.createElement(\"span\");\n container.setAttribute(\"data-ity-component-root\", \"\");\n this.mount.appendChild(style);\n this.mount.appendChild(container);\n this.renderTarget = container;\n } else {\n this.renderTarget = this.mount;\n }\n }\n\n private startRender(): void {\n if (this.renderCleanup || this.renderOutput === undefined) return;\n this.renderCleanup = render(this.renderOutput, this.renderTarget!, { transition: false });\n }\n\n private startEffects(): void {\n for (const record of this.effectRecords) {\n if (!record.disposed && !record.handle) {\n record.handle = effect(record.callback);\n }\n }\n }\n\n private ensureAttrSignal(name: string): Signal {\n if (!this.attrSignals.has(name)) {\n this.attrSignals.set(name, signal(this.getAttribute(name)));\n }\n return this.attrSignals.get(name)!;\n }\n\n private createContext(): ComponentContext {\n return {\n host: this,\n root: this.mount!,\n attr: (name) => this.ensureAttrSignal(name),\n emit: (name, detail, options = {}) => this.dispatchEvent(new CustomEvent(name, {\n bubbles: true,\n composed: true,\n ...options,\n detail\n })),\n effect: (callback) => {\n const record = { callback, disposed: false, handle: undefined as EffectHandle | undefined };\n this.effectRecords.push(record);\n if (this.connected) record.handle = effect(callback);\n const dispose = (() => {\n record.disposed = true;\n record.handle?.dispose();\n record.handle = undefined;\n }) as EffectHandle;\n dispose.dispose = dispose;\n return dispose;\n },\n onConnected: (callback) => {\n this.connectedCallbacks.push(callback);\n },\n onDisconnected: (callback) => {\n this.disconnectedCallbacks.push(callback);\n }\n };\n }\n }\n\n win.customElements.define(name, ItyElement);\n return ItyElement;\n}\n\ninterface EventRecord {\n callback: (data?: unknown) => void;\n ctx: any;\n}\n\nclass Evented {\n private _events: Record = {};\n\n on(evtName: string, callback: (data?: unknown) => void, context: any = this): void {\n (this._events[evtName] ||= []).push({ callback, ctx: context });\n }\n\n off(evtName?: string, callback?: (data?: unknown) => void, context?: any): void {\n if (!evtName) {\n this._events = {};\n return;\n }\n const events = this._events[evtName];\n if (!events) return;\n if (!callback) {\n delete this._events[evtName];\n return;\n }\n for (let i = events.length - 1; i >= 0; i -= 1) {\n const event = events[i];\n if (event.callback === callback && (context === undefined || event.ctx === context)) {\n events.splice(i, 1);\n }\n }\n if (events.length === 0) delete this._events[evtName];\n }\n\n trigger(evtName: string, data?: unknown): void {\n const events = this._events[evtName];\n if (!events) return;\n for (const event of events.slice()) {\n event.callback.call(event.ctx, data);\n }\n }\n}\n\nconst regexps = {\n nospaces: /^\\S*$/\n} as const;\n\nclass SelectorObject {\n [index: number]: HTMLElement;\n public readonly isSelectorObject = true;\n private nodes: HTMLElement[] = [];\n\n constructor(nodeList: ArrayLike = []) {\n this.nodes = Array.from(nodeList as HTMLElement[]);\n this.reindex();\n }\n\n get length(): number {\n return this.nodes.length;\n }\n\n [Symbol.iterator](): Iterator {\n return this.nodes[Symbol.iterator]();\n }\n\n toArray(): HTMLElement[] {\n return this.nodes.slice();\n }\n\n find(selector: string): SelectorObject {\n const nodeList: HTMLElement[] = [];\n for (const node of this.nodes) {\n const list = node.querySelectorAll(selector);\n for (const thisNode of Array.from(list)) {\n const elm = thisNode as HTMLElement;\n if (nodeList.indexOf(elm) < 0) nodeList.push(elm);\n }\n }\n return new SelectorObject(nodeList);\n }\n\n filter(selector: string): SelectorObject {\n return new SelectorObject(this.nodes.filter((node) => node.matches(selector)));\n }\n\n first(): SelectorObject {\n return new SelectorObject(this.nodes[0] ? [this.nodes[0]] : []);\n }\n\n last(): SelectorObject {\n return new SelectorObject(this.nodes.length ? [this.nodes[this.nodes.length - 1]] : []);\n }\n\n parent(): SelectorObject {\n const nodeList: HTMLElement[] = [];\n for (const node of this.nodes) {\n const parent = node.parentElement;\n if (parent && nodeList.indexOf(parent) < 0) nodeList.push(parent);\n }\n return new SelectorObject(nodeList);\n }\n\n children(selector?: string): SelectorObject {\n const nodeList: HTMLElement[] = [];\n for (const node of this.nodes) {\n for (const child of Array.from(node.children) as HTMLElement[]) {\n if (nodeList.indexOf(child) < 0 && (!selector || child.matches(selector))) {\n nodeList.push(child);\n }\n }\n }\n return new SelectorObject(nodeList);\n }\n\n remove(): SelectorObject {\n for (const node of this.nodes) node.remove();\n return new SelectorObject([]);\n }\n\n addClass(...classes: string[]): this {\n for (const node of this.nodes) node.classList.add(...classes);\n return this;\n }\n\n removeClass(value: string): this {\n if (value && regexps.nospaces.test(value)) {\n for (const node of this.nodes) node.classList.remove(value);\n }\n return this;\n }\n\n toggleClass(value: string): this {\n if (value && regexps.nospaces.test(value)) {\n for (const node of this.nodes) node.classList.toggle(value);\n }\n return this;\n }\n\n hasClass(value: string): boolean {\n return Boolean(value && regexps.nospaces.test(value) && this.nodes.some((node) => node.classList.contains(value)));\n }\n\n attr(name: string, value?: string | number | boolean | null): string | null | this {\n if (arguments.length === 1) return this.nodes[0]?.getAttribute(name) ?? null;\n for (const node of this.nodes) {\n if (value === null || value === false || value === undefined) node.removeAttribute(name);\n else node.setAttribute(name, value === true ? \"\" : String(value));\n }\n return this;\n }\n\n text(value?: string | number | boolean): string | this {\n if (arguments.length === 0) return this.nodes.map((node) => node.textContent || \"\").join(\"\");\n for (const node of this.nodes) node.textContent = String(value);\n return this;\n }\n\n on(eventName: string, listener: EventListener, options?: AddEventListenerOptions): this {\n for (const node of this.nodes) node.addEventListener(eventName, listener, options);\n return this;\n }\n\n off(eventName: string, listener: EventListener, options?: EventListenerOptions): this {\n for (const node of this.nodes) node.removeEventListener(eventName, listener, options);\n return this;\n }\n\n before(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"beforebegin\");\n }\n\n after(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"afterend\");\n }\n\n append(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"beforeend\");\n }\n\n prepend(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"afterbegin\");\n }\n\n html(content?: string | SelectorObject | HTMLElement | TemplateResult): this | string {\n if (arguments.length === 0) return this.nodes[0]?.innerHTML ?? \"\";\n return this._html(content!, \"replace\");\n }\n\n empty(): this {\n for (const node of this.nodes) node.textContent = \"\";\n return this;\n }\n\n private _html(content: string | SelectorObject | HTMLElement | TemplateResult, position: InsertPosition | \"replace\"): this {\n const doc = getDocument();\n for (const node of this.nodes) {\n if ((content as SelectorObject)?.isSelectorObject) {\n const htmls = Array.from(content as SelectorObject).map((selNode) => selNode.outerHTML).join(\"\");\n if (position === \"replace\") node.innerHTML = htmls;\n else node.insertAdjacentHTML(position as InsertPosition, htmls);\n } else if (isTemplateResult(content) && doc) {\n const fragment = materializeTemplate(content, doc);\n if (position === \"replace\") replaceChildren(node, fragment);\n else node.insertAdjacentElement(position as InsertPosition, fragmentToElement(fragment, doc));\n } else if (isNodeLike(content)) {\n const cloned = content.cloneNode(true) as HTMLElement;\n if (position === \"replace\") replaceChildren(node, valueToFragment(cloned, doc || node.ownerDocument));\n else node.insertAdjacentElement(position as InsertPosition, cloned);\n } else {\n const htmlContent = String(content);\n if (position === \"replace\") node.innerHTML = htmlContent;\n else node.insertAdjacentHTML(position as InsertPosition, htmlContent);\n }\n }\n return this;\n }\n\n private reindex(): void {\n for (const key of Object.keys(this)) {\n if (/^\\d+$/.test(key)) delete (this as any)[key];\n }\n this.nodes.forEach((node, index) => {\n (this as any)[index] = node;\n });\n }\n}\n\nfunction fragmentToElement(fragment: DocumentFragment, doc: Document): HTMLElement {\n const span = doc.createElement(\"span\");\n span.appendChild(fragment);\n return span;\n}\n\nfunction onDOMReady(fn: (...args: any[]) => void, args: unknown[] = [], context: any = Ity): void {\n const doc = getDocument();\n const func = () => fn.apply(context, args);\n if (!doc || doc.readyState !== \"loading\") func();\n else doc.addEventListener(\"DOMContentLoaded\", func, { once: true });\n}\n\ninterface AjaxOptions {\n url?: string;\n type?: string;\n data?: unknown;\n success?: (resp: any) => void;\n error?: (status?: number, error?: unknown) => void;\n}\n\nclass Model = Record> extends Evented {\n public id!: string;\n public data!: T;\n public url!: string;\n public readonly state: Signal;\n\n constructor(opts: Partial> = {}) {\n super();\n Object.assign(this, opts);\n this.id ||= `m${Math.floor(Math.random() * 100000) + 1}`;\n this.data ||= {} as T;\n this.url ||= \"\";\n this.state = signal(this.data);\n this._init(opts);\n }\n\n onDOMReady = onDOMReady;\n\n protected _init(opts?: Partial>): void {\n this.initialize(opts);\n }\n\n protected _ajax(opts: AjaxOptions = {}): void {\n const request = new XMLHttpRequest();\n const method = opts.type || \"GET\";\n const url = opts.url || this.url;\n const success = opts.success || function (this: Model, resp: any) {\n this.data = resp;\n this.state.set(resp);\n };\n const error = opts.error || function () { };\n request.open(method, url, true);\n request.onload = () => {\n if (request.status >= 200 && request.status < 400) {\n try {\n const response = request.responseText ? JSON.parse(request.responseText) : null;\n success.call(this, response);\n } catch (err) {\n error.call(this, request.status, err);\n }\n } else {\n error.call(this, request.status);\n }\n };\n request.onerror = () => error.call(this);\n request.send(opts.data === undefined ? undefined : JSON.stringify(opts.data));\n }\n\n initialize(options?: Partial>): void { }\n\n get(attr?: keyof T): any {\n const current = this.data;\n if (!attr) return current;\n return current ? (current as any)[attr as string] : undefined;\n }\n\n set(attr: keyof T | Partial, value?: any): void {\n const current = this.state.peek() || {} as T;\n const next = typeof attr === \"string\"\n ? { ...(current as any), [attr]: value } as T\n : attr as T;\n this.data = next;\n this.state.set(next);\n this.trigger(\"change\", this.data);\n }\n\n unSet(attr: keyof T): void {\n const current = this.state.peek();\n if (!current || !Object.prototype.hasOwnProperty.call(current, attr)) return;\n const next = { ...(current as any) };\n delete next[attr as string];\n this.data = next as T;\n this.state.set(this.data);\n this.trigger(\"change\", this.data);\n }\n\n clear(): void {\n this.data = {} as T;\n this.state.set(this.data);\n this.trigger(\"change\", this.data);\n }\n\n subscribe(callback: Subscriber, options?: { immediate?: boolean }): Cleanup {\n return this.state.subscribe(callback, options);\n }\n\n sync(opts?: AjaxOptions): void {\n this._ajax(opts);\n }\n\n toJSON(): T {\n return this.get();\n }\n}\n\ninterface ViewEvents {\n [selector: string]: Record;\n}\n\ninterface ViewOptions {\n el?: string | SelectorObject | NodeList | HTMLElement;\n app?: Application;\n name?: string;\n events?: ViewEvents;\n [key: string]: any;\n}\n\nclass View extends Evented {\n public id!: string;\n public el!: SelectorObject;\n public app?: Application;\n public name?: string;\n public events!: ViewEvents;\n private renderCleanup?: Cleanup;\n private delegatedListeners: Cleanup[] = [];\n\n constructor(opts: ViewOptions = {}) {\n super();\n Object.assign(this, opts);\n this.id ||= `v${Math.floor(Math.random() * 100000) + 1}`;\n if (this.app) this.app.addView(this);\n this.events ||= {};\n onDOMReady(this._init, [opts], this);\n }\n\n private _setElement(elSelector: ViewOptions[\"el\"]): void {\n const win = getWindow();\n if ((elSelector as SelectorObject)?.isSelectorObject) {\n this.el = elSelector as SelectorObject;\n } else if (win?.NodeList && elSelector instanceof win.NodeList) {\n this.el = new SelectorObject(elSelector as any);\n } else if (typeof elSelector === \"string\") {\n this.el = new SelectorObject(documentOrThrow().querySelectorAll(elSelector) as any);\n } else if (win?.HTMLElement && elSelector instanceof win.HTMLElement) {\n this.el = new SelectorObject([elSelector]);\n } else {\n throw new Error(\"el selector must be of type String, NodeList, HTMLElement or Ity.SelectorObject\");\n }\n }\n\n private _bindDOMEvents(evtObj: ViewEvents): void {\n if (!this.el || !this.el.isSelectorObject) return;\n const captureEvents = [\"focus\", \"blur\"];\n for (const selector in evtObj) {\n for (const evt in evtObj[selector]) {\n const callback = (this as any)[evtObj[selector][evt]];\n if (typeof callback !== \"function\") {\n throw new Error(`View event handler not found: ${evtObj[selector][evt]}`);\n }\n const capture = captureEvents.includes(evt);\n this._delegateEvent(selector, evt, callback, capture);\n }\n }\n }\n\n private _delegateEvent(selector: string, evtName: string, callback: (e: Event) => void, capture = false): void {\n for (const root of this.el) {\n const listener = (event: Event) => {\n let node: HTMLElement | null = event.target as HTMLElement;\n while (node) {\n if ((node as any).matches && (node as any).matches(selector)) {\n (event as any).delegateTarget = node;\n callback.call(this, event);\n break;\n }\n if (node === root) break;\n node = node.parentElement;\n }\n };\n root.addEventListener(evtName, listener, capture);\n this.delegatedListeners.push(() => root.removeEventListener(evtName, listener, capture));\n }\n }\n\n private _init(opts: ViewOptions): void {\n if (this.el) this._setElement(this.el as any);\n if (opts.el && !this.el) this._setElement(opts.el);\n this._bindDOMEvents(this.events);\n this.initialize(opts);\n }\n\n initialize(opts?: ViewOptions): void { }\n\n getName(): string | undefined {\n return this.name;\n }\n\n get(attr: keyof this): any {\n return (this as any)[attr];\n }\n\n set(attr: keyof this, value: any): void {\n (this as any)[attr] = value;\n }\n\n renderWith(view: TemplateValue | (() => TemplateValue), options?: RenderOptions): Cleanup {\n if (this.renderCleanup) this.renderCleanup();\n this.renderCleanup = render(view, this.el, options);\n return this.renderCleanup;\n }\n\n remove(): void {\n if (this.renderCleanup) this.renderCleanup();\n for (const cleanup of this.delegatedListeners.splice(0)) cleanup();\n this.el.remove();\n if (this.app) this.app.removeView(this.id);\n }\n\n select(selector: string, ctx: HTMLElement | HTMLDocument | SelectorObject = this.el): SelectorObject {\n const win = getWindow();\n if ((win?.HTMLElement && ctx instanceof win.HTMLElement) || (win?.HTMLDocument && ctx instanceof win.HTMLDocument)) {\n return new SelectorObject(ctx.querySelectorAll(selector) as any);\n }\n if ((ctx as any).isSelectorObject) return (ctx as SelectorObject).find(selector);\n throw new Error(\"Context passed to .select() must be an HTMLElement or an Ity.SelectorObject\");\n }\n}\n\nclass Application {\n public views: View[] = [];\n\n getView(id: string): View | undefined {\n return this.views.find((view) => view.id === id);\n }\n\n addView(view: View): void {\n if (view instanceof View && !this.views.includes(view)) this.views.push(view);\n }\n\n removeView(id: string): void {\n this.views = this.views.filter((view) => view.id !== id);\n }\n\n trigger(evtName: string, data?: unknown): void {\n for (const view of this.views.slice()) view.trigger(evtName, data);\n }\n}\n\nclass Collection {\n public models: M[] = [];\n public url!: string;\n public readonly state: Signal;\n private ModelClass: new () => M;\n\n constructor(models: M[] = [], ModelClass: new () => M = Model as any) {\n this.ModelClass = ModelClass;\n this.url = \"\";\n this.state = signal(this.models);\n models.forEach((model) => this.add(model));\n }\n\n get(id: string): M | undefined {\n return this.models.find((model) => model.id === id);\n }\n\n add(model: M): void {\n if (!(model instanceof Model)) return;\n this.models = [...this.models, model];\n this.state.set(this.models);\n }\n\n remove(id: string | M): void {\n const model = typeof id === \"string\" ? this.get(id) : id;\n if (!model) return;\n this.models = this.models.filter((item) => item !== model);\n this.state.set(this.models);\n }\n\n at(index: number): M | undefined {\n return this.models[index];\n }\n\n get length(): number {\n return this.models.length;\n }\n\n clear(): void {\n this.models = [];\n this.state.set(this.models);\n }\n\n find(predicate: (m: M) => boolean): M | undefined {\n return this.models.find(predicate);\n }\n\n filter(predicate: (m: M) => boolean): M[] {\n return this.models.filter(predicate);\n }\n\n map(mapper: (m: M, index: number) => T): T[] {\n return this.models.map(mapper);\n }\n\n toJSON(): any[] {\n return this.models.map((model) => model.get());\n }\n\n subscribe(callback: Subscriber, options?: { immediate?: boolean }): Cleanup {\n return this.state.subscribe(callback, options);\n }\n\n protected _ajax(opts: AjaxOptions = {}): void {\n const request = new XMLHttpRequest();\n const method = opts.type || \"GET\";\n const url = opts.url || this.url;\n const success = opts.success || function () { };\n const error = opts.error || function () { };\n request.open(method, url, true);\n request.onload = () => {\n if (request.status >= 200 && request.status < 400) {\n try {\n success.call(this, request.responseText ? JSON.parse(request.responseText) : null);\n } catch (err) {\n error.call(this, request.status, err);\n }\n } else {\n error.call(this, request.status);\n }\n };\n request.onerror = () => error.call(this);\n request.send(opts.data === undefined ? undefined : JSON.stringify(opts.data));\n }\n\n fetch(opts: AjaxOptions & { modelClass?: new () => M } = {}): void {\n const userSuccess = opts.success;\n opts.success = function (this: Collection, resp: any[]) {\n const ctor = (opts.modelClass || this.ModelClass) as new () => M;\n this.clear();\n for (const data of resp || []) {\n const model = new ctor();\n (model as any).set(data);\n this.add(model);\n }\n if (userSuccess) userSuccess.call(this, resp);\n };\n this._ajax(opts);\n }\n\n trigger(evtName: string, data?: unknown): void {\n for (const model of this.models.slice()) model.trigger(evtName, data);\n }\n}\n\ninterface RouteContext {\n path: string;\n url: URL;\n params: Record;\n query: Record;\n hash: Record;\n}\n\ntype RouteHandler = (params: Record, context: RouteContext) => void | Cleanup;\n\ninterface RouteRecord {\n pattern: string;\n handler: RouteHandler;\n exec(url: URL): Record | null;\n}\n\ninterface RouterOptions {\n base?: string;\n autoStart?: boolean;\n linkSelector?: string;\n transition?: boolean;\n notFound?: RouteHandler;\n}\n\nclass Router {\n private routes: RouteRecord[] = [];\n private started = false;\n private readonly listener = () => this.check();\n private readonly clickListener = (event: Event) => this.handleLinkClick(event);\n private readonly navigationListener = (event: any) => this.handleNavigationEvent(event);\n private routeCleanup?: Cleanup;\n private activeRoute?: RouteRecord;\n public readonly current: Signal = signal(null);\n public notFound?: RouteHandler;\n public base: string;\n public linkSelector: string;\n public transition: boolean;\n\n constructor(options: RouterOptions = {}) {\n this.base = options.base || \"/\";\n this.linkSelector = options.linkSelector || \"a[data-ity-link]\";\n this.transition = Boolean(options.transition);\n this.notFound = options.notFound;\n if (options.autoStart !== false) this.start();\n }\n\n add(pattern: string, handler: RouteHandler): this {\n this.routes.push(createRouteRecord(pattern, handler));\n return this;\n }\n\n addRoute(pattern: string, handler: RouteHandler): void {\n this.add(pattern, handler);\n }\n\n removeRoute(pattern: string): this {\n if (this.activeRoute?.pattern === pattern) {\n this.disposeRoute();\n this.activeRoute = undefined;\n this.current.set(null);\n }\n this.routes = this.routes.filter((route) => route.pattern !== pattern);\n return this;\n }\n\n navigate(path: string, options: { replace?: boolean; transition?: boolean } = {}): void {\n const win = getWindow();\n if (!win) return;\n const update = () => {\n const method = options.replace ? \"replaceState\" : \"pushState\";\n win.history[method](null, \"\", withBasePath(path, this.base));\n this.check();\n };\n withViewTransition(update, options.transition ?? this.transition);\n }\n\n start(): void {\n const win = getWindow();\n const doc = getDocument();\n if (!win || this.started) {\n if (win) this.check();\n return;\n }\n win.addEventListener(\"popstate\", this.listener);\n doc?.addEventListener(\"click\", this.clickListener);\n (win as any).navigation?.addEventListener?.(\"navigate\", this.navigationListener);\n this.started = true;\n this.check();\n }\n\n stop(): void {\n const win = getWindow();\n const doc = getDocument();\n if (win && this.started) {\n win.removeEventListener(\"popstate\", this.listener);\n doc?.removeEventListener(\"click\", this.clickListener);\n (win as any).navigation?.removeEventListener?.(\"navigate\", this.navigationListener);\n }\n this.started = false;\n this.disposeRoute();\n }\n\n check(): RouteContext | null {\n const win = getWindow();\n if (!win) return null;\n const url = new URL(win.location.href);\n const routePath = stripBasePath(url.pathname, this.base);\n if (routePath === null) {\n this.disposeRoute();\n this.activeRoute = undefined;\n this.current.set(null);\n return null;\n }\n const routeUrl = new URL(url.href);\n routeUrl.pathname = routePath || \"/\";\n for (const route of this.routes) {\n const routeParams = route.exec(routeUrl);\n if (!routeParams) continue;\n const query = searchParamsToObject(url.search);\n const hash = searchParamsToObject(url.hash);\n const params = { ...routeParams, ...query, ...hash };\n const context: RouteContext = {\n path: routePath || \"/\",\n url,\n params,\n query,\n hash\n };\n this.disposeRoute();\n this.activeRoute = route;\n this.current.set(context);\n const cleanup = route.handler(params, context);\n if (typeof cleanup === \"function\") this.routeCleanup = cleanup;\n return context;\n }\n this.disposeRoute();\n this.activeRoute = undefined;\n this.current.set(null);\n const cleanup = this.notFound?.({}, {\n path: routePath || \"/\",\n url,\n params: {},\n query: searchParamsToObject(url.search),\n hash: searchParamsToObject(url.hash)\n });\n if (typeof cleanup === \"function\") this.routeCleanup = cleanup;\n return null;\n }\n\n private handleLinkClick(event: Event): void {\n const target = event.target as HTMLElement | null;\n const anchor = target?.closest?.(this.linkSelector) as HTMLAnchorElement | null;\n if (!anchor || anchor.target || anchor.hasAttribute(\"download\")) return;\n const win = getWindow();\n if (!win) return;\n const url = new URL(anchor.href, win.location.href);\n if (url.origin !== win.location.origin) return;\n if (stripBasePath(url.pathname, this.base) === null) return;\n event.preventDefault();\n this.navigate(`${url.pathname}${url.search}${url.hash}`);\n }\n\n private handleNavigationEvent(event: any): void {\n const win = getWindow();\n if (!win || !event?.canIntercept || !event.destination?.url || typeof event.intercept !== \"function\") return;\n const url = new URL(event.destination.url, win.location.href);\n if (url.origin !== win.location.origin) return;\n if (stripBasePath(url.pathname, this.base) === null) return;\n event.intercept({\n handler: () => {\n this.check();\n }\n });\n }\n\n private disposeRoute(): void {\n if (!this.routeCleanup) return;\n const cleanup = this.routeCleanup;\n this.routeCleanup = undefined;\n cleanup();\n }\n}\n\nfunction createRouteRecord(pattern: string, handler: RouteHandler): RouteRecord {\n const win = getWindow();\n const URLPatternCtor = (win as any)?.URLPattern || (globalThis as any).URLPattern;\n if (typeof URLPatternCtor === \"function\") {\n try {\n const nativePattern = new URLPatternCtor({ pathname: pattern });\n return {\n pattern,\n handler,\n exec(url) {\n const match = nativePattern.exec(url.href);\n return match ? decodeParams(match.pathname.groups || {}) : null;\n }\n };\n } catch (_err) {\n // Fall through to the regex matcher for non-URLPattern syntax.\n }\n }\n\n const { re, keys } = compilePathPattern(pattern);\n return {\n pattern,\n handler,\n exec(url) {\n const match = re.exec(normalizePath(url.pathname));\n if (!match) return null;\n const params: Record = {};\n keys.forEach((key, index) => {\n params[key] = decodeURIComponent(match[index + 1] || \"\");\n });\n return params;\n }\n };\n}\n\nfunction normalizeBase(base: string): string {\n const normalized = normalizePath(base || \"/\");\n return normalized === \"\" ? \"\" : normalized;\n}\n\nfunction withBasePath(path: string, base: string): string {\n const normalizedBase = normalizeBase(base);\n const parsed = new URL(path || \"/\", \"http://ity.local\");\n let pathname = normalizePath(parsed.pathname) || \"/\";\n if (normalizedBase && pathname !== normalizedBase && !pathname.startsWith(`${normalizedBase}/`)) {\n pathname = `${normalizedBase}${pathname === \"/\" ? \"\" : pathname}`;\n }\n return `${pathname}${parsed.search}${parsed.hash}`;\n}\n\nfunction stripBasePath(pathname: string, base: string): string | null {\n const normalizedBase = normalizeBase(base);\n const normalizedPath = normalizePath(pathname) || \"/\";\n if (!normalizedBase) return normalizedPath;\n if (normalizedPath === normalizedBase) return \"/\";\n if (normalizedPath.startsWith(`${normalizedBase}/`)) {\n return normalizePath(normalizedPath.slice(normalizedBase.length)) || \"/\";\n }\n return null;\n}\n\nfunction compilePathPattern(pattern: string): { re: RegExp; keys: string[] } {\n const keys: string[] = [];\n const normalized = normalizePath(pattern);\n if (normalized === \"\") return { re: /^\\/?$/, keys };\n const segments = normalized.split(\"/\").filter(Boolean);\n const source = segments.map((segment) => {\n if (segment === \"*\") {\n keys.push(\"wildcard\");\n return \"(.*)\";\n }\n if (segment.startsWith(\":\")) {\n keys.push(segment.slice(1));\n return \"([^/]+)\";\n }\n return escapeRegExp(segment);\n }).join(\"/\");\n return { re: new RegExp(`^/${source}/?$`), keys };\n}\n\nfunction normalizePath(path: string): string {\n const normalized = path.replace(/[?#].*$/, \"\").replace(/\\/+$/, \"\");\n return normalized === \"\" ? \"\" : normalized.startsWith(\"/\") ? normalized : `/${normalized}`;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction searchParamsToObject(value: string): Record {\n const out: Record = {};\n const clean = value.replace(/^[?#]/, \"\");\n if (!clean) return out;\n const params = new URLSearchParams(clean);\n params.forEach((paramValue, key) => {\n out[key] = paramValue;\n });\n return out;\n}\n\nfunction decodeParams(value: Record): Record {\n const out: Record = {};\n for (const key of Object.keys(value)) {\n out[key] = decodeURIComponent(value[key]);\n }\n return out;\n}\n\nconst defaultRouter = signal(null);\n\nfunction route(pattern: string, handler: RouteHandler): Router {\n let router = defaultRouter.peek();\n if (!router) {\n router = new Router({ autoStart: false });\n defaultRouter.set(router);\n }\n router.add(pattern, handler);\n router.start();\n return router;\n}\n\nconst Ity = {\n version: \"2.1.0\",\n configure,\n signal,\n computed,\n effect,\n batch,\n untrack,\n isSignal,\n resolveSignal,\n store,\n resource,\n action,\n form,\n html,\n unsafeHTML,\n render,\n renderToString,\n component,\n route,\n Router,\n SelectorObject,\n onDOMReady,\n Model,\n View,\n Application,\n Collection\n};\n\nfunction createAmdExport(): typeof Ity {\n const win = getWindow();\n if (win) (win as any).Ity = Ity;\n return Ity;\n}\n\n/* c8 ignore next 3 */\nif (typeof define === \"function\" && (define as any).amd) {\n (define as any)(createAmdExport);\n} else if (typeof module === \"object\" && typeof module.exports !== \"undefined\") {\n module.exports = Ity;\n}\n\nconst win = getWindow();\nif (win) {\n (win as any).Ity = Ity;\n}\n\nexport {\n Application,\n Collection,\n Model,\n Router,\n SelectorObject,\n View,\n batch,\n component,\n configure,\n computed,\n effect,\n action,\n form,\n html,\n isSignal,\n onDOMReady,\n render,\n renderToString,\n resource,\n resolveSignal,\n route,\n signal,\n store,\n unsafeHTML,\n untrack\n};\nexport type {\n Action,\n ActionOptions,\n AsyncStatus,\n ComponentContext,\n ComponentOptions,\n EffectHandle,\n FormController,\n FormOptions,\n HTMLSanitizer,\n ItyConfig,\n ReadonlySignal,\n RenderOptions,\n Resource,\n ResourceContext,\n ResourceOptions,\n RouteContext,\n RouteHandler,\n Signal,\n Store,\n TemplateResult,\n UnsafeHTMLOptions\n};\nexport default Ity;\n"],"names":[],"mappings":"AAwJA,MAAM,aAAa,GAAG,MAAM,CAAC,EAAE;AAC/B,IAAI,cAAc,GAA4B,IAAI;AAClD,IAAI,UAAU,GAAG,CAAC;AAClB,MAAM,cAAc,GAAG,IAAI,GAAG,EAAkB;AAChD,IAAI,sBAAiD;AAErD,SAAS,SAAS,GAAA;AAChB,IAAA,OAAO,OAAO,MAAM,KAAK,WAAW,GAAG,MAAM,GAAG,SAAS;AAC3D;AAEA,SAAS,WAAW,GAAA;;AAClB,IAAA,MAAM,GAAG,GAAG,SAAS,EAAE;IACvB,OAAO,CAAA,EAAA,GAAA,GAAG,KAAH,IAAA,IAAA,GAAG,uBAAH,GAAG,CAAE,QAAQ,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,IAAK,OAAO,QAAQ,KAAK,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAClF;AAEA,SAAS,eAAe,CAAC,MAAsB,EAAA;AAC7C,IAAA,IAAI,CAAC,cAAc;QAAE;AACrB,IAAA,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,cAAc,CAAC;AACpC,IAAA,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC;AACjC;AAEA,SAAS,mBAAmB,CAAC,QAA0B,EAAA;AACrD,IAAA,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE;AAC/B,QAAA,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;;AAEhC,IAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE;AACvB;AAEA,SAAS,eAAe,CAAC,MAAsB,EAAA;AAC7C,IAAA,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE;QACnD,QAAQ,CAAC,SAAS,EAAE;;AAExB;AAEA,SAAS,YAAY,GAAA;IACnB,IAAI,UAAU,GAAG,CAAC;QAAE;AACpB,IAAA,OAAO,cAAc,CAAC,IAAI,EAAE;QAC1B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC;QAC1C,cAAc,CAAC,KAAK,EAAE;AACtB,QAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;YAC5B,MAAM,CAAC,GAAG,EAAE;;;AAGlB;AAEA,SAAS,WAAW,CAAC,MAAsB,EAAA;AACzC,IAAA,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC;AAC1B,IAAA,YAAY,EAAE;AAChB;AAEA,MAAM,UAAU,CAAA;IAMd,WAAY,CAAA,KAAQ,EAAE,OAAA,GAA4B,EAAE,EAAA;AALpD,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,GAAG,EAAoB;AAC/B,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,GAAG,EAAiB;AAK5C,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;QAClB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa;;IAG/C,IAAI,CAAC,KAAK,GAAG,IAAI,EAAA;AACf,QAAA,IAAI,KAAK;YAAE,eAAe,CAAC,IAAI,CAAC;QAChC,OAAO,IAAI,CAAC,KAAK;;AAGnB,IAAA,KAAK,CAAC,IAA8B,EAAA;AAClC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK;AAC3B,QAAA,MAAM,QAAQ,GAAG,OAAO,IAAI,KAAK;AAC/B,cAAG,IAA2B,CAAC,QAAQ;cACrC,IAAI;AACR,QAAA,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC;AAAE,YAAA,OAAO,QAAQ;AACpD,QAAA,IAAI,CAAC,KAAK,GAAG,QAAQ;QACrB,eAAe,CAAC,IAAI,CAAC;AACrB,QAAA,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;AACrD,YAAA,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC;;AAEhC,QAAA,YAAY,EAAE;AACd,QAAA,OAAO,QAAQ;;AAGjB,IAAA,SAAS,CAAC,QAAuB,EAAE,OAAA,GAAmC,EAAE,EAAA;AACtE,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC9B,IAAI,OAAO,CAAC,SAAS;YAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;AACvD,QAAA,OAAO,MAAK;AACV,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;AACnC,SAAC;;AAEJ;AAED,MAAM,YAAY,CAAA;IAShB,WAA6B,CAAA,MAAe,EAAE,OAAA,GAA8B,EAAE,EAAA;QAAjD,IAAM,CAAA,MAAA,GAAN,MAAM;AARnC,QAAA,IAAA,CAAA,SAAS,GAAG,IAAI,GAAG,EAAoB;AACvC,QAAA,IAAA,CAAA,IAAI,GAAG,IAAI,GAAG,EAAkB;AACxB,QAAA,IAAA,CAAA,WAAW,GAAG,IAAI,GAAG,EAAiB;QACtC,IAAK,CAAA,KAAA,GAAG,IAAI;QACZ,IAAW,CAAA,WAAA,GAAG,KAAK;QAKzB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa;;IAG/C,IAAI,CAAC,KAAK,GAAG,IAAI,EAAA;AACf,QAAA,IAAI,KAAK;YAAE,eAAe,CAAC,IAAI,CAAC;QAChC,IAAI,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,QAAQ,EAAE;QAC/B,OAAO,IAAI,CAAC,KAAK;;IAGnB,SAAS,GAAA;QACP,IAAI,IAAI,CAAC,KAAK;YAAE;AAChB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK;AAC3B,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI;QACjB,eAAe,CAAC,IAAI,CAAC;AACrB,QAAA,IAAI,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE;AAChC,gBAAA,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;AACrD,oBAAA,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC;;;;;AAMlC,IAAA,SAAS,CAAC,QAAuB,EAAE,OAAA,GAAmC,EAAE,EAAA;AACtE,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC;AAC9B,QAAA,IAAI,OAAO,CAAC,SAAS,EAAE;YACrB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;AAChC,YAAA,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;;AAE5B,QAAA,OAAO,MAAK;AACV,YAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC;AACnC,SAAC;;IAGK,QAAQ,GAAA;QACd,mBAAmB,CAAC,IAAI,CAAC;QACzB,MAAM,gBAAgB,GAAG,cAAc;QACvC,cAAc,GAAG,IAAI;AACrB,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE;AAC1B,YAAA,IAAI,CAAC,KAAK,GAAG,KAAK;AAClB,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;;gBACf;YACR,cAAc,GAAG,gBAAgB;;;AAGtC;AAED,MAAM,cAAc,CAAA;AAKlB,IAAA,WAAA,CAA6B,QAAyD,EAAA;QAAzD,IAAQ,CAAA,QAAA,GAAR,QAAQ;AAJrC,QAAA,IAAA,CAAA,IAAI,GAAG,IAAI,GAAG,EAAkB;QACxB,IAAQ,CAAA,QAAA,GAAG,KAAK;QAItB,IAAI,CAAC,GAAG,EAAE;;IAGZ,SAAS,GAAA;QACP,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,WAAW,CAAC,IAAI,CAAC;;IAGvC,GAAG,GAAA;QACD,IAAI,IAAI,CAAC,QAAQ;YAAE;QACnB,mBAAmB,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO;AAC5B,YAAA,IAAI,CAAC,OAAO,GAAG,SAAS;AACxB,YAAA,OAAO,EAAE;;QAEX,MAAM,gBAAgB,GAAG,cAAc;QACvC,cAAc,GAAG,IAAI;AACrB,QAAA,IAAI;AACF,YAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,KAAI;AACxB,gBAAA,IAAI,CAAC,OAAO,GAAG,OAAO;AACxB,aAAC,CAAC;;gBACM;YACR,cAAc,GAAG,gBAAgB;;;IAIrC,OAAO,GAAA;QACL,IAAI,IAAI,CAAC,QAAQ;YAAE;AACnB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;QACpB,mBAAmB,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO;AAC5B,YAAA,IAAI,CAAC,OAAO,GAAG,SAAS;AACxB,YAAA,OAAO,EAAE;;AAEX,QAAA,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC;;AAE9B;AAED,SAAS,MAAM,CAAI,YAAe,EAAE,UAA4B,EAAE,EAAA;IAChE,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,YAAY,EAAE,OAAO,CAAC;IAClD,MAAM,SAAS,GAAG,UAAU,IAA+B,EAAA;AACzD,QAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AAClD,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAgC,CAAC;AACrD,KAAc;AACd,IAAA,SAAS,CAAC,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACrC,IAAA,SAAS,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;AACvC,IAAA,SAAS,CAAC,GAAG,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;AAC1C,IAAA,SAAS,CAAC,MAAM,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;AACnD,IAAA,SAAS,CAAC,SAAS,GAAG,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,gBAAgB,CAAC;AAChG,IAAA,MAAM,CAAC,cAAc,CAAC,SAAS,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAC7D,IAAA,OAAO,SAAS;AAClB;AAEA,SAAS,QAAQ,CAAI,MAAe,EAAE,UAA8B,EAAE,EAAA;IACpE,MAAM,IAAI,GAAG,IAAI,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC;AAC9C,IAAA,MAAM,IAAI,GAAG,YAAA;AACX,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACxB,KAAsB;AACtB,IAAA,IAAI,CAAC,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AAChC,IAAA,IAAI,CAAC,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;AAClC,IAAA,IAAI,CAAC,SAAS,GAAG,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,gBAAgB,CAAC;AAC3F,IAAA,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACxD,IAAA,OAAO,IAAI;AACb;AAEA,SAAS,MAAM,CAAC,QAAyD,EAAA;AACvE,IAAA,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,QAAQ,CAAC;IAC3C,MAAM,OAAO,IAAI,MAAM,MAAM,CAAC,OAAO,EAAE,CAAiB;AACxD,IAAA,OAAO,CAAC,OAAO,GAAG,OAAO;AACzB,IAAA,OAAO,OAAO;AAChB;AAEA,SAAS,KAAK,CAAI,QAAiB,EAAA;IACjC,UAAU,IAAI,CAAC;AACf,IAAA,IAAI;QACF,OAAO,QAAQ,EAAE;;YACT;QACR,UAAU,IAAI,CAAC;AACf,QAAA,YAAY,EAAE;;AAElB;AAEA,SAAS,OAAO,CAAI,QAAiB,EAAA;IACnC,MAAM,gBAAgB,GAAG,cAAc;IACvC,cAAc,GAAG,IAAI;AACrB,IAAA,IAAI;QACF,OAAO,QAAQ,EAAE;;YACT;QACR,cAAc,GAAG,gBAAgB;;AAErC;AAEA,SAAS,QAAQ,CAAc,KAAc,EAAA;IAC3C,OAAO,OAAO,KAAK,KAAK,UAAU,IAAK,KAAa,CAAC,QAAQ,KAAK,IAAI;AACxE;AAEA,SAAS,aAAa,CAAI,KAAqB,EAAA;AAC7C,IAAA,OAAO,QAAQ,CAAI,KAAK,CAAC,GAAG,KAAK,EAAE,GAAG,KAAK;AAC7C;AAEA,SAAS,SAAS,CAAC,OAAA,GAAqB,EAAE,EAAA;AACxC,IAAA,sBAAsB,GAAG,OAAO,CAAC,YAAY,IAAI,SAAS;AAC5D;AAEA,SAAS,KAAK,CAAkC,YAAe,EAAA;AAC7D,IAAA,MAAM,IAAI,GAAG,IAAI,GAAG,CAAW,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;AAC7D,IAAA,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyB;AAChD,IAAA,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC;AAE3B,IAAA,MAAM,YAAY,GAAG,CAAC,GAAa,KAAiB;QAClD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE;AACrB,YAAA,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAE,YAAoB,CAAC,GAAG,CAAC,CAAC,CAAC;;AAEtD,QAAA,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAE;AAC1B,KAAC;IAED,MAAM,aAAa,GAAG,MAAW;AAC/B,QAAA,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,KAAK,OAAO,GAAG,CAAC,CAAC;AAC5C,KAAC;AAED,IAAA,MAAM,MAAM,GAAG,CAAC,GAAa,EAAE,KAAU,KAAU;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAC5B,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;QAC1B,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC;AAC5B,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,aAAa,EAAE;AAC9B,KAAC;IAED,MAAM,QAAQ,GAAG,MAAQ;AACvB,QAAA,SAAS,EAAE;QACX,MAAM,GAAG,GAAQ,EAAE;AACnB,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;YACtB,GAAG,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,EAAE;;AAEhC,QAAA,OAAO,GAAQ;AACjB,KAAC;AAED,IAAA,MAAM,GAAG,GAAgB;AACvB,QAAA,MAAM,CAAC,KAAK,EAAA;AACV,YAAA,MAAM,OAAO,GAAG,QAAQ,EAAE;AAC1B,YAAA,MAAM,IAAI,GAAG,OAAO,KAAK,KAAK,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,KAAK;AACjE,YAAA,IAAI,CAAC,IAAI;gBAAE;YACX,KAAK,CAAC,MAAK;gBACT,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;oBACvC,MAAM,CAAC,GAAG,EAAG,IAAY,CAAC,GAAG,CAAC,CAAC;;AAEnC,aAAC,CAAC;SACH;AACD,QAAA,SAAS,EAAE,QAAQ;AACnB,QAAA,UAAU,CAAC,QAAQ,EAAE,OAAO,GAAG,EAAE,EAAA;YAC/B,IAAI,KAAK,GAAG,IAAI;YAChB,OAAO,MAAM,CAAC,MAAK;AACjB,gBAAA,MAAM,KAAK,GAAG,QAAQ,EAAE;AACxB,gBAAA,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;oBAC/B,KAAK,GAAG,KAAK;oBACb;;gBAEF,KAAK,GAAG,KAAK;gBACb,QAAQ,CAAC,KAAK,CAAC;AACjB,aAAC,CAAC;;KAEL;AAED,IAAA,OAAO,IAAI,KAAK,CAAC,GAAe,EAAE;AAChC,QAAA,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAA;YACvB,IAAI,GAAG,IAAI,MAAM;gBAAE,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC;AAC5D,YAAA,OAAO,YAAY,CAAC,GAAG,CAAC,EAAE;SAC3B;AACD,QAAA,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAA;YACrB,KAAK,CAAC,MAAK;AACT,gBAAA,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC;AACpB,aAAC,CAAC;AACF,YAAA,OAAO,IAAI;SACZ;QACD,cAAc,CAAC,OAAO,EAAE,GAAG,EAAA;AACzB,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAAE,gBAAA,OAAO,IAAI;AAC/B,YAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;YAChB,KAAK,CAAC,MAAK;gBACT,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC;AAChC,gBAAA,aAAa,EAAE;AACjB,aAAC,CAAC;AACF,YAAA,OAAO,IAAI;SACZ;AACD,QAAA,OAAO,CAAC,MAAM,EAAA;AACZ,YAAA,SAAS,EAAE;YACX,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC;SAClE;QACD,wBAAwB,CAAC,MAAM,EAAE,GAAG,EAAA;AAClC,YAAA,SAAS,EAAE;AACX,YAAA,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;AACrD,gBAAA,OAAO,EAAE,GAAG,OAAO,CAAC,wBAAwB,CAAC,MAAM,EAAE,GAAG,CAAE,EAAE,UAAU,EAAE,KAAK,EAAE;;AAEjF,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAAE,gBAAA,OAAO,SAAS;YACpC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE;SAChD;QACD,GAAG,CAAC,MAAM,EAAE,GAAG,EAAA;AACb,YAAA,SAAS,EAAE;YACX,OAAO,GAAG,IAAI,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;;AAExC,KAAA,CAAC;AACJ;AAEA,SAAS,QAAQ,CACf,MAAuD,EACvD,UAAiC,EAAE,EAAA;IAEnC,MAAM,IAAI,GAAG,MAAM,CAAgB,OAAO,CAAC,YAAY,CAAC;AACxD,IAAA,MAAM,KAAK,GAAG,MAAM,CAAW,IAAI,CAAC;AACpC,IAAA,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC;AAC7B,IAAA,MAAM,WAAW,GAAG,MAAM,CAAc,OAAO,CAAC,YAAY,KAAK,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;IAChG,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,OAAO,EAAE,CAAC;IACzC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,WAAW,EAAE,CAAC;AAC5C,IAAA,MAAM,YAAY,GAAG,OAAO,CAAC,YAAY,KAAK,KAAK;IACnD,IAAI,UAAU,GAA2B,IAAI;IAC7C,IAAI,SAAS,GAAG,CAAC;IACjB,IAAI,cAAc,GAAkC,IAAI;AAExD,IAAA,MAAM,GAAG,GAAmB;QAC1B,IAAI;QACJ,KAAK;QACL,OAAO;QACP,MAAM;AACN,QAAA,IAAI,OAAO,GAAA;AACT,YAAA,OAAO,cAAc;SACtB;QACD,OAAO,GAAA;YACL,SAAS,IAAI,CAAC;YACd,MAAM,EAAE,GAAG,SAAS;AACpB,YAAA,IAAI,UAAU;gBAAE,UAAU,CAAC,KAAK,EAAE;AAClC,YAAA,UAAU,GAAG,IAAI,eAAe,EAAE;AAClC,YAAA,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM;AAChC,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE;AAC5B,YAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACjB,YAAA,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC;AAC1B,YAAA,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACf,YAAA,IAAI,CAAC,YAAY;AAAE,gBAAA,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;AAEtC,YAAA,cAAc,GAAG,OAAO,CAAC,OAAO;AAC7B,iBAAA,IAAI,CAAC,MAAM,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;AACtD,iBAAA,IAAI,CAAC,CAAC,KAAK,KAAI;;AACd,gBAAA,IAAI,EAAE,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO;AAAE,oBAAA,OAAO,IAAI,CAAC,IAAI,EAAE;AAC1D,gBAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AACf,gBAAA,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACf,gBAAA,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC;AAC1B,gBAAA,CAAA,EAAA,GAAA,OAAO,CAAC,SAAS,MAAG,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,OAAA,EAAA,KAAK,CAAC;AAC1B,gBAAA,OAAO,KAAK;AACd,aAAC;AACA,iBAAA,KAAK,CAAC,CAAC,GAAG,KAAI;;gBACb,IAAI,EAAE,KAAK,SAAS;AAAE,oBAAA,OAAO,IAAI,CAAC,IAAI,EAAE;AACxC,gBAAA,KAAK,CAAC,GAAG,CAAC,GAAQ,CAAC;AACnB,gBAAA,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC;AACxB,gBAAA,CAAA,EAAA,GAAA,OAAO,CAAC,OAAO,MAAG,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,OAAA,EAAA,GAAQ,CAAC;AAC3B,gBAAA,OAAO,IAAI,CAAC,IAAI,EAAE;AACpB,aAAC;iBACA,OAAO,CAAC,MAAK;AACZ,gBAAA,IAAI,EAAE,KAAK,SAAS,EAAE;AACpB,oBAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;oBAClB,UAAU,GAAG,IAAI;;AAErB,aAAC,CAAC;AAEJ,YAAA,OAAO,cAAc;SACtB;AACD,QAAA,MAAM,CAAC,KAAK,EAAA;YACV,SAAS,IAAI,CAAC;AACd,YAAA,IAAI,UAAU;gBAAE,UAAU,CAAC,KAAK,EAAE;YAClC,UAAU,GAAG,IAAI;YACjB,cAAc,GAAG,IAAI;AACrB,YAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AACf,YAAA,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACf,YAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AAClB,YAAA,WAAW,CAAC,GAAG,CAAC,KAAK,KAAK,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;SAC1D;AACD,QAAA,KAAK,CAAC,MAAgB,EAAA;AACpB,YAAA,IAAI,CAAC,UAAU;gBAAE;YACjB,SAAS,IAAI,CAAC;AACd,YAAA,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC;YACxB,UAAU,GAAG,IAAI;YACjB,cAAc,GAAG,IAAI;AACrB,YAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AAClB,YAAA,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;;KAElE;AAED,IAAA,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK,EAAE;QAC/B,GAAG,CAAC,OAAO,EAAE;;AAGf,IAAA,OAAO,GAAG;AACZ;AAEA,SAAS,MAAM,CACb,OAAuD,EACvD,UAAqC,EAAE,EAAA;AAEvC,IAAA,MAAM,IAAI,GAAG,MAAM,CAAsB,SAAS,CAAC;AACnD,IAAA,MAAM,KAAK,GAAG,MAAM,CAAW,IAAI,CAAC;AACpC,IAAA,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC;AACvB,IAAA,MAAM,WAAW,GAAG,MAAM,CAAc,MAAM,CAAC;AAC/C,IAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,KAAK,EAAE,GAAG,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,QAAQ,CAAC,MAAM,KAAK,EAAE,CAAC;IAC5C,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,WAAW,EAAE,CAAC;IAC5C,IAAI,UAAU,GAAG,CAAC;AAElB,IAAA,MAAM,MAAM,GAAG,CAAC,GAAG,IAAW,KAAsB;QAClD,MAAM,aAAa,GAAG,UAAU;AAChC,QAAA,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,GAAG,CAAC,CAAC;AAClC,QAAA,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC;AAC1B,QAAA,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;QAEf,OAAO,OAAO,CAAC,OAAO;aACnB,IAAI,CAAC,MAAM,OAAO,CAAC,GAAG,IAAI,CAAC;AAC3B,aAAA,IAAI,CAAC,CAAC,KAAK,KAAI;;AACd,YAAA,IAAI,aAAa,KAAK,UAAU,EAAE;AAChC,gBAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;AACf,gBAAA,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACf,gBAAA,CAAA,EAAA,GAAA,OAAO,CAAC,SAAS,MAAG,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,OAAA,EAAA,KAAK,CAAC;AAC1B,gBAAA,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC;AAAE,oBAAA,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC;;AAEnD,YAAA,OAAO,KAAK;AACd,SAAC;AACA,aAAA,KAAK,CAAC,CAAC,GAAG,KAAI;;AACb,YAAA,IAAI,aAAa,KAAK,UAAU,EAAE;AAChC,gBAAA,KAAK,CAAC,GAAG,CAAC,GAAQ,CAAC;AACnB,gBAAA,CAAA,EAAA,GAAA,OAAO,CAAC,OAAO,MAAG,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,OAAA,EAAA,GAAQ,CAAC;AAC3B,gBAAA,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC;AAAE,oBAAA,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC;;AAEjD,YAAA,MAAM,GAAG;AACX,SAAC;aACA,OAAO,CAAC,MAAK;YACZ,IAAI,aAAa,KAAK,UAAU;gBAAE;AAClC,YAAA,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;AAC/C,YAAA,IAAI,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC;AAAE,gBAAA,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC;AAClD,SAAC,CAAC;AACN,KAAC;AAED,IAAA,MAAM,QAAQ,IAAI,CAAC,GAAG,IAAW,KAAK,MAAM,CAAC,GAAG,IAAI,CAAC,CAA8B;IACnF,MAAM,eAAe,GAAG,QAOvB;AACD,IAAA,eAAe,CAAC,MAAM,GAAG,MAAM;AAC/B,IAAA,eAAe,CAAC,IAAI,GAAG,IAAI;AAC3B,IAAA,eAAe,CAAC,KAAK,GAAG,KAAK;AAC7B,IAAA,eAAe,CAAC,OAAO,GAAG,OAAO;AACjC,IAAA,eAAe,CAAC,YAAY,GAAG,YAAY;AAC3C,IAAA,eAAe,CAAC,MAAM,GAAG,MAAM;AAC/B,IAAA,QAAQ,CAAC,KAAK,GAAG,MAAK;QACpB,UAAU,IAAI,CAAC;AACf,QAAA,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC;AACnB,QAAA,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACf,QAAA,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AACZ,QAAA,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC;AACzB,KAAC;AACD,IAAA,OAAO,QAAQ;AACjB;AAEA,SAAS,IAAI,CACX,OAAqE,EACrE,UAAmC,EAAE,EAAA;IAErC,MAAM,YAAY,GAAG,MAAM,CAAgC,OAAO,EAAE,OAAO,CAAC;AAE5E,IAAA,MAAM,QAAQ,GAAG,CAAC,KAAY,KAAqB;;QACjD,MAAM,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,KAAK,CAAC,MAAM,CAAmB;AACtE,QAAA,MAAM,kBAAkB,GAAG,CAAC,IAAoB,KAAwC;;AACtF,YAAA,MAAM,WAAW,GAAG,CAAA,EAAA,GAAA,IAAI,KAAJ,IAAA,IAAA,IAAI,KAAJ,MAAA,GAAA,MAAA,GAAA,IAAI,CAAE,aAAa,MAAE,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,WAA8D;AACvG,YAAA,OAAO,CAAA,WAAW,KAAA,IAAA,IAAX,WAAW,KAAX,MAAA,GAAA,MAAA,GAAA,WAAW,CAAE,eAAe;AAC9B,oBAAA,CAAA,EAAA,GAAA,SAAS,EAAE,MAAE,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,eAAe;AAC5B,oBAAC,OAAO,eAAe,KAAK,WAAW,GAAG,eAAe,GAAG,SAAS,CAAC;AAC7E,SAAC;AACD,QAAA,MAAM,aAAa,GAAG,CAAC,IAAgC,KAA6B;AAClF,YAAA,MAAM,WAAW,GAAG,IAAI,GAAG,kBAAkB,CAAC,IAAI,CAAC,GAAG,kBAAkB,CAAC,MAAM,CAAC;YAChF,OAAO,OAAO,CAAC,IAAI,IAAI,WAAW,IAAI,IAAI,YAAY,WAAW,CAAC;AACpE,SAAC;AACD,QAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC;QAC7F,IAAI,aAAa,CAAC,MAAM,CAAC;AAAE,YAAA,OAAO,MAAM;AACxC,QAAA,MAAM,OAAO,GAAG,CAAA,EAAA,GAAA,MAAM,KAAN,IAAA,IAAA,MAAM,KAAN,MAAA,GAAA,MAAA,GAAA,MAAM,CAAE,OAAO,MAAG,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,MAAA,EAAA,MAAM,CAAC;QACzC,IAAI,aAAa,CAAC,OAAO,CAAC;AAAE,YAAA,OAAO,OAAO;AAC1C,QAAA,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC;AACnE,KAAC;AAED,IAAA,MAAM,cAAc,GAAG,CAAC,WAA4B,KAAc;;QAChE,MAAM,WAAW,GAAG,CAAA,EAAA,GAAA,WAAW,CAAC,aAAa,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,WAA8D;QAC7G,MAAM,YAAY,GAAG,CAAA,WAAW,aAAX,WAAW,KAAA,MAAA,GAAA,MAAA,GAAX,WAAW,CAAE,QAAQ;AACrC,gBAAA,CAAA,EAAA,GAAA,SAAS,EAAE,MAAE,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,QAAQ;AACrB,gBAAC,OAAO,QAAQ,KAAK,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAC7D,QAAA,IAAI,CAAC,YAAY;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC;AACxE,QAAA,OAAO,IAAI,YAAY,CAAC,WAAW,CAAC;AACtC,KAAC;IAED,OAAO;AACL,QAAA,MAAM,EAAE,YAAY;QACpB,IAAI,EAAE,YAAY,CAAC,IAAI;QACvB,KAAK,EAAE,YAAY,CAAC,KAAK;QACzB,OAAO,EAAE,YAAY,CAAC,OAAO;QAC7B,MAAM,EAAE,YAAY,CAAC,MAAM;QAC3B,MAAM,QAAQ,CAAC,KAAY,EAAA;YACzB,KAAK,CAAC,cAAc,EAAE;AACtB,YAAA,MAAM,WAAW,GAAG,QAAQ,CAAC,KAAK,CAAC;AACnC,YAAA,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,cAAc,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC;YACrE,IAAI,OAAO,CAAC,cAAc;gBAAE,WAAW,CAAC,KAAK,EAAE;AAC/C,YAAA,OAAO,MAAM;SACd;QACD,KAAK,GAAA;YACH,YAAY,CAAC,KAAK,EAAE;;KAEvB;AACH;AAEA,SAAS,IAAI,CAAC,OAAiD,EAAE,GAAG,MAAiB,EAAA;IACnF,OAAO;AACL,QAAA,gBAAgB,EAAE,IAAI;AACtB,QAAA,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;QAC5B;KACD;AACH;AAEA,SAAS,UAAU,CAAC,KAAa,EAAE,UAA6B,EAAE,EAAA;AAChE,IAAA,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,IAAI,sBAAsB;IAC5D,OAAO;AACL,QAAA,YAAY,EAAE,IAAI;AAClB,QAAA,KAAK,EAAE,SAAS,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK;KAC3D;AACH;AAEA,SAAS,gBAAgB,CAAC,KAAc,EAAA;AACtC,IAAA,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAK,KAAwB,CAAC,gBAAgB,KAAK,IAAI;AACpG;AAEA,SAAS,YAAY,CAAC,KAAc,EAAA;AAClC,IAAA,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAK,KAAoB,CAAC,YAAY,KAAK,IAAI;AAC5F;AAEA,SAAS,UAAU,CAAC,KAAc,EAAA;AAChC,IAAA,OAAO,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAQ,KAAc,CAAC,QAAQ,KAAK,QAAQ;AAC7F;AAEA,SAAS,eAAe,GAAA;AACtB,IAAA,MAAM,GAAG,GAAG,WAAW,EAAE;AACzB,IAAA,IAAI,CAAC,GAAG;AAAE,QAAA,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC;AAClE,IAAA,OAAO,GAAG;AACZ;AAEA,SAAS,cAAc,CAAC,KAAc,EAAA;AACpC,IAAA,OAAO,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,EAAE,GAAG,KAAK;AAC1C;AAEA,SAAS,eAAe,CAAC,KAAc,EAAE,GAAA,GAAgB,eAAe,EAAE,EAAA;AACxE,IAAA,MAAM,QAAQ,GAAG,GAAG,CAAC,sBAAsB,EAAE;IAC7C,WAAW,CAAC,QAAQ,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC;AACjD,IAAA,OAAO,QAAQ;AACjB;AAEA,SAAS,WAAW,CAAC,MAAY,EAAE,KAAc,EAAE,GAAa,EAAA;AAC9D,IAAA,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC;IAC7B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,KAAK;QAAE;AAC9D,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;QACxB,KAAK,MAAM,IAAI,IAAI,KAAK;AAAE,YAAA,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC;QACxD;;AAEF,IAAA,IAAI,gBAAgB,CAAC,KAAK,CAAC,EAAE;QAC3B,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACnD;;AAEF,IAAA,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE;QACvB,MAAM,QAAQ,GAAG,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC;AAC9C,QAAA,QAAQ,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK;AAChC,QAAA,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACpD;;AAEF,IAAA,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE;AACrB,QAAA,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC;QACzB;;AAEF,IAAA,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AACvD;AAQA,SAAS,mBAAmB,CAAC,MAAsB,EAAE,GAAA,GAAgB,eAAe,EAAE,EAAA;;IACpF,MAAM,QAAQ,GAAc,EAAE;IAC9B,IAAI,MAAM,GAAG,EAAE;AAEf,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;QAChD,MAAM,IAAI,GAAG,CAAA,EAAA,GAAA,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAI,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAA,EAAE;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC;QACvD,IAAI,SAAS,EAAE;AACb,YAAA,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC;AAC5B,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AAC/D,YAAA,MAAM,MAAM,GAAG,CAAiB,cAAA,EAAA,CAAC,EAAE;AACnC,YAAA,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC;AACxB,YAAA,MAAM,IAAI,GAAG,KAAK,KAAK,GAAG,GAAG,OAAO,GAAG,KAAK,KAAK,GAAG,GAAG,MAAM,GAAG,KAAK,KAAK,GAAG,GAAG,MAAM,GAAG,MAAM;AAC/F,YAAA,MAAM,IAAI,GAAG,IAAI,KAAK,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;AACzD,YAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACvC,YAAA,MAAM,IAAI,CAAG,EAAA,MAAM,CAAG,EAAA,MAAM,KAAK;;aAC5B;AACL,YAAA,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AACzC,YAAA,MAAM,IAAI,CAAG,EAAA,IAAI,CAAW,QAAA,EAAA,CAAC,KAAK;;;AAGtC,IAAA,MAAM,IAAI,CAAA,EAAA,GAAA,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,EAAE;IAEzD,MAAM,QAAQ,GAAG,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC;AAC9C,IAAA,QAAQ,CAAC,SAAS,GAAG,MAAM;IAC3B,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAqB;IACrE,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;AACrD,IAAA,OAAO,QAAQ;AACjB;AAEA,SAAS,aAAa,CAAC,IAAsB,EAAE,QAAmB,EAAE,MAA0B,EAAE,GAAa,EAAA;AAC3G,IAAA,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAqB;IAC7C,MAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,GAAG,CAAC;AAC9C,IAAA,IAAI,OAAO,GAAG,MAAM,CAAC,QAAQ,EAAE;IAC/B,OAAO,OAAO,EAAE;QACd,MAAM,OAAO,GAAG,OAAkB;QAClC,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;QAC/C,IAAI,KAAK,EAAE;YACT,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC9B,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE;AACtC,YAAA,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;AAClB,YAAA,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC;;AAE3B,QAAA,OAAO,GAAG,MAAM,CAAC,QAAQ,EAAE;;AAG7B,IAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;QAC9B,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACnD,QAAA,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE;AAC3B,YAAA,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE;AACjD,YAAA,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;gBAC5B,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;;YAEjD;;AAGF,QAAA,MAAM,QAAQ,GAAG,CAAA,cAAA,EAAiB,OAAO,CAAC,KAAK,EAAE;AACjD,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAI,CAAA,EAAA,QAAQ,CAAG,CAAA,CAAA,CAAC,CAAkB;AACpF,QAAA,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;AAC9B,YAAA,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC;AACjC,YAAA,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC;;;AAGlD;AAEA,SAAS,mBAAmB,CAAC,OAAoB,EAAE,OAAgB,EAAE,KAAc,EAAA;AACjF,IAAA,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE;AAC/B,IAAA,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO,EAAE;AAC5B,QAAA,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE;AAC/B,YAAA,OAAO,CAAC,gBAAgB,CAAC,IAAI,EAAE,KAAsB,CAAC;;AACjD,aAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE;AACjE,YAAA,OAAO,CAAC,gBAAgB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAkB,EAAE,KAAK,CAAC,CAAC,CAA4B,CAAC;;QAEhG;;AAGF,IAAA,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE;AAC1B,QAAA,OAAe,CAAC,IAAI,CAAC,GAAG,KAAK;QAC9B;;AAGF,IAAA,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE;QAC3B,OAAO,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7C;;AAGF,IAAA,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;AAC5D,QAAA,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC;QAC7B;;IAGF,IAAI,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;AAC5C,QAAA,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9D;;IAGF,IAAI,IAAI,KAAK,OAAO,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QACjD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAgC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,OAAO,CAAE,KAAa,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3G,QAAA,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChD;;AAGF,IAAA,IAAI,IAAI,KAAK,OAAO,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE;QACnE,MAAM,CAAC,MAAM,CAAE,OAAuB,CAAC,KAAK,EAAE,KAAK,CAAC;QACpD;;IAGF,OAAO,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AACjE;AAEA,SAAS,aAAa,CAAC,MAA4D,EAAA;AACjF,IAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;QAC9B,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC;AACrD,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,4BAA4B,MAAM,CAAA,CAAE,CAAC;AACjE,QAAA,OAAO,KAAK;;IAEd,IAAK,MAAyB,aAAzB,MAAM,KAAA,MAAA,GAAA,MAAA,GAAN,MAAM,CAAqB,gBAAgB,EAAE;QAChD,MAAM,KAAK,GAAI,MAAyB,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AACnD,QAAA,IAAI,CAAC,KAAK;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC;AACzE,QAAA,OAAO,KAAK;;AAEd,IAAA,OAAO,MAAoC;AAC7C;AAEA,SAAS,eAAe,CAAC,MAAkC,EAAE,QAA0B,EAAA;IACrF,MAAM,WAAW,GAAG,MAAa;AACjC,IAAA,IAAI,OAAO,WAAW,CAAC,eAAe,KAAK,UAAU,EAAE;AACrD,QAAA,WAAW,CAAC,eAAe,CAAC,QAAQ,CAAC;QACrC;;IAEF,OAAO,MAAM,CAAC,UAAU;AAAE,QAAA,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,UAAU,CAAC;AAC/D,IAAA,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC;AAC9B;AAEA,SAAS,kBAAkB,CAAC,MAAkB,EAAE,OAA4B,EAAA;AAC1E,IAAA,MAAM,GAAG,GAAG,WAAW,EAAS;IAChC,IAAI,OAAO,IAAI,GAAG,IAAI,OAAO,GAAG,CAAC,mBAAmB,KAAK,UAAU,EAAE;AACnE,QAAA,GAAG,CAAC,mBAAmB,CAAC,MAAM,CAAC;;SAC1B;AACL,QAAA,MAAM,EAAE;;AAEZ;AAEA,SAAS,MAAM,CACb,IAA2C,EAC3C,MAA4D,EAC5D,UAAyB,EAAE,EAAA;AAE3B,IAAA,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC;IACnC,MAAM,MAAM,GAAG,MAAK;QAClB,MAAM,KAAK,GAAG,OAAO,IAAI,KAAK,UAAU,IAAI,CAAC,QAAQ,CAAC,IAAI;cACrD,IAA4B;AAC/B,cAAE,cAAc,CAAC,IAAI,CAAC;AACxB,QAAA,kBAAkB,CAAC,MAAM,eAAe,CAAC,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC;AAC9F,KAAC;AAED,IAAA,IAAI,OAAO,CAAC,QAAQ,KAAK,KAAK,EAAE;AAC9B,QAAA,MAAM,EAAE;AACR,QAAA,OAAO,MAAM,SAAS;;AAGxB,IAAA,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB;AAEA,SAAS,cAAc,CAAC,IAA2C,EAAA;IACjE,MAAM,KAAK,GAAG,OAAO,IAAI,KAAK,UAAU,IAAI,CAAC,QAAQ,CAAC,IAAI;UACrD,IAA4B;AAC/B,UAAE,cAAc,CAAC,IAAI,CAAC;AACxB,IAAA,OAAO,aAAa,CAAC,KAAK,CAAC;AAC7B;AAEA,SAAS,aAAa,CAAC,KAAc,EAAA;AACnC,IAAA,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC;IAC7B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,KAAK;AAAE,QAAA,OAAO,EAAE;AACvE,IAAA,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;IAClE,IAAI,gBAAgB,CAAC,KAAK,CAAC;AAAE,QAAA,OAAO,gBAAgB,CAAC,KAAK,CAAC;IAC3D,IAAI,YAAY,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,KAAK;AAC3C,IAAA,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE;QACrB,MAAM,IAAI,GAAG,KAAY;AACzB,QAAA,IAAI,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC,SAAS;QAC7D,OAAO,UAAU,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;;AAE3C,IAAA,OAAO,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAClC;AAEA,SAAS,gBAAgB,CAAC,MAAsB,EAAA;;IAC9C,IAAI,MAAM,GAAG,EAAE;AACf,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;QAChD,MAAM,IAAI,GAAG,CAAA,EAAA,GAAA,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAI,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAA,EAAE;QACpC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC;QACvD,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,SAAS,EAAE;AACb,YAAA,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC;AAC5B,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AAC/D,YAAA,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC;AACxB,YAAA,MAAM,IAAI,GAAG,KAAK,KAAK,GAAG,GAAG,OAAO,GAAG,KAAK,KAAK,GAAG,GAAG,MAAM,GAAG,KAAK,KAAK,GAAG,GAAG,MAAM,GAAG,MAAM;AAC/F,YAAA,MAAM,IAAI,GAAG,IAAI,KAAK,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;YACzD,IAAI,IAAI,KAAK,OAAO,IAAI,IAAI,KAAK,MAAM,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;gBACnG,MAAM,IAAI,MAAM;;AACX,iBAAA,IAAI,IAAI,KAAK,MAAM,EAAE;AAC1B,gBAAA,MAAM,IAAI,KAAK,GAAG,CAAG,EAAA,MAAM,CAAG,EAAA,IAAI,CAAE,CAAA,GAAG,MAAM;;iBACxC;AACL,gBAAA,MAAM,IAAI,CAAG,EAAA,MAAM,CAAG,EAAA,IAAI,KAAK,eAAe,CAAC,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,GAAG;;;aAE/E;AACL,YAAA,MAAM,IAAI,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC;;;AAGzC,IAAA,MAAM,IAAI,CAAA,EAAA,GAAA,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,EAAE;AACzD,IAAA,OAAO,MAAM;AACf;AAEA,SAAS,kBAAkB,CAAC,IAAY,EAAE,KAAc,EAAA;IACtD,IAAI,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AACpF,IAAA,IAAI,IAAI,KAAK,OAAO,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE;QACnE,OAAO,MAAM,CAAC,IAAI,CAAC,KAAgC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,OAAO,CAAE,KAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;;AAE9G,IAAA,IAAI,IAAI,KAAK,OAAO,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE;AACnE,QAAA,OAAO,MAAM,CAAC,IAAI,CAAC,KAAgC;AAChD,aAAA,GAAG,CAAC,CAAC,GAAG,KAAK,CAAG,EAAA,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAA,CAAA,EAAI,CAAC,CAAC,WAAW,EAAE,CAAA,CAAE,CAAC,CAAA,CAAA,EAAK,KAAa,CAAC,GAAG,CAAC,EAAE;aAC5F,IAAI,CAAC,GAAG,CAAC;;AAEd,IAAA,OAAO,KAAK,KAAK,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;AAC5C;AAEA,SAAS,UAAU,CAAC,KAAa,EAAA;AAC/B,IAAA,OAAO;AACJ,SAAA,OAAO,CAAC,IAAI,EAAE,OAAO;AACrB,SAAA,OAAO,CAAC,IAAI,EAAE,MAAM;AACpB,SAAA,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;AAC1B;AAEA,SAAS,eAAe,CAAC,KAAa,EAAA;IACpC,OAAO,UAAU,CAAC,KAAK;AACpB,SAAA,OAAO,CAAC,IAAI,EAAE,QAAQ;AACtB,SAAA,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;AAC3B;AAuBA,SAAS,SAAS,CAChB,IAAY,EACZ,cAAiD,EACjD,eAAgD,EAAE,EAAA;AAElD,IAAA,MAAM,GAAG,GAAG,SAAS,EAAE;AACvB,IAAA,IAAI,EAAC,GAAG,KAAH,IAAA,IAAA,GAAG,uBAAH,GAAG,CAAE,cAAc,CAAA,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE;AAC5C,QAAA,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC;;IAGnE,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;QAChC,OAAO,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAE;;AAGtC,IAAA,MAAM,UAAU,GAAqB,OAAO,cAAc,KAAK;UAC3D,EAAE,GAAG,YAAY,EAAE,KAAK,EAAE,cAAc;UACxC,cAAc;IAClB,MAAM,KAAK,GAAG,UAAU,CAAC,kBAAkB,IAAI,UAAU,CAAC,KAAK,IAAI,EAAE;AAErE,IAAA,MAAM,UAAW,SAAQ,GAAG,CAAC,WAAW,CAAA;AAAxC,QAAA,WAAA,GAAA;;AAKU,YAAA,IAAA,CAAA,WAAW,GAAG,IAAI,GAAG,EAAiC;YACtD,IAAkB,CAAA,kBAAA,GAAc,EAAE;YAClC,IAAqB,CAAA,qBAAA,GAAc,EAAE;YACrC,IAAa,CAAA,aAAA,GAIhB,EAAE;YAKC,IAAW,CAAA,WAAA,GAAG,KAAK;YACnB,IAAS,CAAA,SAAA,GAAG,KAAK;;AAjBzB,QAAA,WAAW,kBAAkB,GAAA;AAC3B,YAAA,OAAO,KAAK;;QAkBd,iBAAiB,GAAA;;YACf,IAAI,CAAC,WAAW,EAAE;AAClB,YAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;AACrB,gBAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE;gBAChC,MAAM,MAAM,GAAG,CAAA,EAAA,GAAA,UAAU,CAAC,KAAK,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,UAAA,EAAG,GAAG,CAAC;AACtC,gBAAA,IAAI,MAAM,KAAK,SAAS,EAAE;AACxB,oBAAA,IAAI,CAAC,YAAY,GAAG,MAAyB;;;AAGjD,YAAA,IAAI,CAAC,SAAS,GAAG,IAAI;YACrB,IAAI,CAAC,WAAW,EAAE;YAClB,IAAI,CAAC,YAAY,EAAE;AACnB,YAAA,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,kBAAkB;AAAE,gBAAA,QAAQ,EAAE;;QAG5D,oBAAoB,GAAA;;AAClB,YAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,YAAA,IAAI,IAAI,CAAC,aAAa,EAAE;gBACtB,IAAI,CAAC,aAAa,EAAE;AACpB,gBAAA,IAAI,CAAC,aAAa,GAAG,SAAS;;AAEhC,YAAA,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,aAAa,EAAE;AACvC,gBAAA,CAAA,EAAA,GAAA,MAAM,CAAC,MAAM,MAAE,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,OAAO,EAAE;AACxB,gBAAA,MAAM,CAAC,MAAM,GAAG,SAAS;;AAE3B,YAAA,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,qBAAqB;AAAE,gBAAA,QAAQ,EAAE;;AAG/D,QAAA,wBAAwB,CAAC,IAAY,EAAE,SAAwB,EAAE,QAAuB,EAAA;YACtF,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;;QAGnC,WAAW,GAAA;AACjB,YAAA,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,YAAY;gBAAE;AACrC,YAAA,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM;AAChC,YAAA,IAAI,MAAM,KAAK,KAAK,EAAE;AACpB,gBAAA,IAAI,CAAC,KAAK,GAAG,IAAI;;iBACZ;AACL,gBAAA,MAAM,IAAI,GAAmB,OAAO,MAAM,KAAK;AAC7C,sBAAE;AACF,sBAAE,EAAE,IAAI,EAAE,MAAM,KAAK,QAAQ,GAAG,QAAQ,GAAG,MAAM,EAAE;AACrD,gBAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;;AAGzD,YAAA,IAAI,UAAU,CAAC,MAAM,EAAE;AACrB,gBAAA,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa;gBAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,OAAO,CAAC;AACxC,gBAAA,KAAK,CAAC,WAAW,GAAG,UAAU,CAAC,MAAM;gBACrC,MAAM,SAAS,GAAG,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC;AAC3C,gBAAA,SAAS,CAAC,YAAY,CAAC,yBAAyB,EAAE,EAAE,CAAC;AACrD,gBAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC;AAC7B,gBAAA,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC;AACjC,gBAAA,IAAI,CAAC,YAAY,GAAG,SAAS;;iBACxB;AACL,gBAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK;;;QAI1B,WAAW,GAAA;YACjB,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,YAAY,KAAK,SAAS;gBAAE;AAC3D,YAAA,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,YAAa,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;;QAGnF,YAAY,GAAA;AAClB,YAAA,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,aAAa,EAAE;gBACvC,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;oBACtC,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;;;;AAKrC,QAAA,gBAAgB,CAAC,IAAY,EAAA;YACnC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;AAC/B,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;;YAE7D,OAAO,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAE;;QAG5B,aAAa,GAAA;YACnB,OAAO;AACL,gBAAA,IAAI,EAAE,IAAI;gBACV,IAAI,EAAE,IAAI,CAAC,KAAM;gBACjB,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;gBAC3C,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAG,EAAE,KAAK,IAAI,CAAC,aAAa,CAAC,IAAI,WAAW,CAAC,IAAI,EAAE;AAC7E,oBAAA,OAAO,EAAE,IAAI;AACb,oBAAA,QAAQ,EAAE,IAAI;AACd,oBAAA,GAAG,OAAO;oBACV;AACD,iBAAA,CAAC,CAAC;AACH,gBAAA,MAAM,EAAE,CAAC,QAAQ,KAAI;AACnB,oBAAA,MAAM,MAAM,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,SAAqC,EAAE;AAC3F,oBAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC;oBAC/B,IAAI,IAAI,CAAC,SAAS;AAAE,wBAAA,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC;AACpD,oBAAA,MAAM,OAAO,IAAI,MAAK;;AACpB,wBAAA,MAAM,CAAC,QAAQ,GAAG,IAAI;AACtB,wBAAA,CAAA,EAAA,GAAA,MAAM,CAAC,MAAM,MAAE,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,OAAO,EAAE;AACxB,wBAAA,MAAM,CAAC,MAAM,GAAG,SAAS;AAC3B,qBAAC,CAAiB;AAClB,oBAAA,OAAO,CAAC,OAAO,GAAG,OAAO;AACzB,oBAAA,OAAO,OAAO;iBACf;AACD,gBAAA,WAAW,EAAE,CAAC,QAAQ,KAAI;AACxB,oBAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC;iBACvC;AACD,gBAAA,cAAc,EAAE,CAAC,QAAQ,KAAI;AAC3B,oBAAA,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC;;aAE5C;;AAEJ;IAED,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC;AAC3C,IAAA,OAAO,UAAU;AACnB;AAOA,MAAM,OAAO,CAAA;AAAb,IAAA,WAAA,GAAA;QACU,IAAO,CAAA,OAAA,GAAkC,EAAE;;AAEnD,IAAA,EAAE,CAAC,OAAe,EAAE,QAAkC,EAAE,UAAe,IAAI,EAAA;;QACzE,CAAC,CAAA,EAAA,GAAA,IAAI,CAAC,OAAO,EAAC,OAAO,CAAP,KAAA,EAAA,CAAA,OAAO,IAAM,EAAE,CAAA,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;;AAGjE,IAAA,GAAG,CAAC,OAAgB,EAAE,QAAmC,EAAE,OAAa,EAAA;QACtE,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,IAAI,CAAC,OAAO,GAAG,EAAE;YACjB;;QAEF,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;AACpC,QAAA,IAAI,CAAC,MAAM;YAAE;QACb,IAAI,CAAC,QAAQ,EAAE;AACb,YAAA,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YAC5B;;AAEF,QAAA,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE;AAC9C,YAAA,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC;AACvB,YAAA,IAAI,KAAK,CAAC,QAAQ,KAAK,QAAQ,KAAK,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO,CAAC,EAAE;AACnF,gBAAA,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;;;AAGvB,QAAA,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;;IAGvD,OAAO,CAAC,OAAe,EAAE,IAAc,EAAA;QACrC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;AACpC,QAAA,IAAI,CAAC,MAAM;YAAE;QACb,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,KAAK,EAAE,EAAE;YAClC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC;;;AAGzC;AAED,MAAM,OAAO,GAAG;AACd,IAAA,QAAQ,EAAE;CACF;AAEV,MAAM,cAAc,CAAA;AAKlB,IAAA,WAAA,CAAY,WAAmC,EAAE,EAAA;QAHjC,IAAgB,CAAA,gBAAA,GAAG,IAAI;QAC/B,IAAK,CAAA,KAAA,GAAkB,EAAE;QAG/B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,QAAyB,CAAC;QAClD,IAAI,CAAC,OAAO,EAAE;;AAGhB,IAAA,IAAI,MAAM,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM;;IAG1B,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAA;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;;IAGtC,OAAO,GAAA;AACL,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;;AAG3B,IAAA,IAAI,CAAC,QAAgB,EAAA;QACnB,MAAM,QAAQ,GAAkB,EAAE;AAClC,QAAA,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;YAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;YAC5C,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACvC,MAAM,GAAG,GAAG,QAAuB;AACnC,gBAAA,IAAI,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;AAAE,oBAAA,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;;;AAGrD,QAAA,OAAO,IAAI,cAAc,CAAC,QAAQ,CAAC;;AAGrC,IAAA,MAAM,CAAC,QAAgB,EAAA;QACrB,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;;IAGhF,KAAK,GAAA;QACH,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;;IAGjE,IAAI,GAAA;AACF,QAAA,OAAO,IAAI,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;;IAGzF,MAAM,GAAA;QACJ,MAAM,QAAQ,GAAkB,EAAE;AAClC,QAAA,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;AAC7B,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa;YACjC,IAAI,MAAM,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;AAAE,gBAAA,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;;AAEnE,QAAA,OAAO,IAAI,cAAc,CAAC,QAAQ,CAAC;;AAGrC,IAAA,QAAQ,CAAC,QAAiB,EAAA;QACxB,MAAM,QAAQ,GAAkB,EAAE;AAClC,QAAA,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;AAC7B,YAAA,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAkB,EAAE;gBAC9D,IAAI,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,EAAE;AACzE,oBAAA,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;;;;AAI1B,QAAA,OAAO,IAAI,cAAc,CAAC,QAAQ,CAAC;;IAGrC,MAAM,GAAA;AACJ,QAAA,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,MAAM,EAAE;AAC5C,QAAA,OAAO,IAAI,cAAc,CAAC,EAAE,CAAC;;IAG/B,QAAQ,CAAC,GAAG,OAAiB,EAAA;AAC3B,QAAA,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;AAC7D,QAAA,OAAO,IAAI;;AAGb,IAAA,WAAW,CAAC,KAAa,EAAA;QACvB,IAAI,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;AACzC,YAAA,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK;AAAE,gBAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;;AAE7D,QAAA,OAAO,IAAI;;AAGb,IAAA,WAAW,CAAC,KAAa,EAAA;QACvB,IAAI,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;AACzC,YAAA,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK;AAAE,gBAAA,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;;AAE7D,QAAA,OAAO,IAAI;;AAGb,IAAA,QAAQ,CAAC,KAAa,EAAA;AACpB,QAAA,OAAO,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;;IAGpH,IAAI,CAAC,IAAY,EAAE,KAAwC,EAAA;;AACzD,QAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,YAAY,CAAC,IAAI,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,IAAI;AAC5E,QAAA,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;YAC7B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,SAAS;AAAE,gBAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;;gBACnF,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,KAAK,IAAI,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;;AAEnE,QAAA,OAAO,IAAI;;AAGb,IAAA,IAAI,CAAC,KAAiC,EAAA;AACpC,QAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;AAC5F,QAAA,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK;AAAE,YAAA,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC;AAC/D,QAAA,OAAO,IAAI;;AAGb,IAAA,EAAE,CAAC,SAAiB,EAAE,QAAuB,EAAE,OAAiC,EAAA;AAC9E,QAAA,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC;AAClF,QAAA,OAAO,IAAI;;AAGb,IAAA,GAAG,CAAC,SAAiB,EAAE,QAAuB,EAAE,OAA8B,EAAA;AAC5E,QAAA,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC;AACrF,QAAA,OAAO,IAAI;;AAGb,IAAA,MAAM,CAAC,OAA+D,EAAA;QACpE,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,aAAa,CAAC;;AAG3C,IAAA,KAAK,CAAC,OAA+D,EAAA;QACnE,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,UAAU,CAAC;;AAGxC,IAAA,MAAM,CAAC,OAA+D,EAAA;QACpE,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,WAAW,CAAC;;AAGzC,IAAA,OAAO,CAAC,OAA+D,EAAA;QACrE,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,YAAY,CAAC;;AAG1C,IAAA,IAAI,CAAC,OAAgE,EAAA;;AACnE,QAAA,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;AAAE,YAAA,OAAO,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAE,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,SAAS,MAAI,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAA,EAAE;QACjE,OAAO,IAAI,CAAC,KAAK,CAAC,OAAQ,EAAE,SAAS,CAAC;;IAGxC,KAAK,GAAA;AACH,QAAA,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK;AAAE,YAAA,IAAI,CAAC,WAAW,GAAG,EAAE;AACpD,QAAA,OAAO,IAAI;;IAGL,KAAK,CAAC,OAA+D,EAAE,QAAoC,EAAA;AACjH,QAAA,MAAM,GAAG,GAAG,WAAW,EAAE;AACzB,QAAA,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;YAC7B,IAAK,OAA0B,aAA1B,OAAO,KAAA,MAAA,GAAA,MAAA,GAAP,OAAO,CAAqB,gBAAgB,EAAE;gBACjD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,OAAyB,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChG,IAAI,QAAQ,KAAK,SAAS;AAAE,oBAAA,IAAI,CAAC,SAAS,GAAG,KAAK;;AAC7C,oBAAA,IAAI,CAAC,kBAAkB,CAAC,QAA0B,EAAE,KAAK,CAAC;;AAC1D,iBAAA,IAAI,gBAAgB,CAAC,OAAO,CAAC,IAAI,GAAG,EAAE;gBAC3C,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,EAAE,GAAG,CAAC;gBAClD,IAAI,QAAQ,KAAK,SAAS;AAAE,oBAAA,eAAe,CAAC,IAAI,EAAE,QAAQ,CAAC;;AACtD,oBAAA,IAAI,CAAC,qBAAqB,CAAC,QAA0B,EAAE,iBAAiB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;;AACxF,iBAAA,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE;gBAC9B,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAgB;gBACrD,IAAI,QAAQ,KAAK,SAAS;AAAE,oBAAA,eAAe,CAAC,IAAI,EAAE,eAAe,CAAC,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC,aAAa,CAAC,CAAC;;AAChG,oBAAA,IAAI,CAAC,qBAAqB,CAAC,QAA0B,EAAE,MAAM,CAAC;;iBAC9D;AACL,gBAAA,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC;gBACnC,IAAI,QAAQ,KAAK,SAAS;AAAE,oBAAA,IAAI,CAAC,SAAS,GAAG,WAAW;;AACnD,oBAAA,IAAI,CAAC,kBAAkB,CAAC,QAA0B,EAAE,WAAW,CAAC;;;AAGzE,QAAA,OAAO,IAAI;;IAGL,OAAO,GAAA;QACb,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;AACnC,YAAA,IAAI,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC;AAAE,gBAAA,OAAQ,IAAY,CAAC,GAAG,CAAC;;QAElD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,KAAI;AAChC,YAAA,IAAY,CAAC,KAAK,CAAC,GAAG,IAAI;AAC7B,SAAC,CAAC;;AAEL;AAED,SAAS,iBAAiB,CAAC,QAA0B,EAAE,GAAa,EAAA;IAClE,MAAM,IAAI,GAAG,GAAG,CAAC,aAAa,CAAC,MAAM,CAAC;AACtC,IAAA,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;AAC1B,IAAA,OAAO,IAAI;AACb;AAEA,SAAS,UAAU,CAAC,EAA4B,EAAE,OAAkB,EAAE,EAAE,UAAe,GAAG,EAAA;AACxF,IAAA,MAAM,GAAG,GAAG,WAAW,EAAE;AACzB,IAAA,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC;AAC1C,IAAA,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS;AAAE,QAAA,IAAI,EAAE;;AAC3C,QAAA,GAAG,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACrE;AAUA,MAAM,KAAmE,SAAQ,OAAO,CAAA;AAMtF,IAAA,WAAA,CAAY,OAA0B,EAAE,EAAA;AACtC,QAAA,KAAK,EAAE;QAST,IAAU,CAAA,UAAA,GAAG,UAAU;AARrB,QAAA,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;QACzB,IAAI,CAAC,EAAE,KAAP,IAAI,CAAC,EAAE,GAAK,CAAI,CAAA,EAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA,CAAE,CAAC;QACzD,IAAI,CAAC,IAAI,KAAT,IAAI,CAAC,IAAI,GAAK,EAAO,CAAC;QACtB,IAAI,CAAC,GAAG,KAAR,IAAI,CAAC,GAAG,GAAK,EAAE,CAAC;QAChB,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;AAC9B,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;;AAKR,IAAA,KAAK,CAAC,IAAwB,EAAA;AACtC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;;IAGb,KAAK,CAAC,OAAoB,EAAE,EAAA;AACpC,QAAA,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE;AACpC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,IAAI,KAAK;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG;AAChC,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,UAA0B,IAAS,EAAA;AACjE,YAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,YAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,SAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,YAAA,GAAe;QAC3C,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;AAC/B,QAAA,OAAO,CAAC,MAAM,GAAG,MAAK;AACpB,YAAA,IAAI,OAAO,CAAC,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE;AACjD,gBAAA,IAAI;oBACF,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI;AAC/E,oBAAA,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC;;gBAC5B,OAAO,GAAG,EAAE;oBACZ,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;;;iBAElC;gBACL,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC;;AAEpC,SAAC;AACD,QAAA,OAAO,CAAC,OAAO,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;IAG/E,UAAU,CAAC,OAA2B,EAAA;AAEtC,IAAA,GAAG,CAAC,IAAc,EAAA;AAChB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI;AACzB,QAAA,IAAI,CAAC,IAAI;AAAE,YAAA,OAAO,OAAO;AACzB,QAAA,OAAO,OAAO,GAAI,OAAe,CAAC,IAAc,CAAC,GAAG,SAAS;;IAG/D,GAAG,CAAC,IAA0B,EAAE,KAAW,EAAA;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAO;AAC5C,QAAA,MAAM,IAAI,GAAG,OAAO,IAAI,KAAK;cACzB,EAAE,GAAI,OAAe,EAAE,CAAC,IAAI,GAAG,KAAK;cACpC,IAAS;AACb,QAAA,IAAI,CAAC,IAAI,GAAG,IAAI;AAChB,QAAA,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;QACpB,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC;;AAGnC,IAAA,KAAK,CAAC,IAAa,EAAA;QACjB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;AACjC,QAAA,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC;YAAE;AACtE,QAAA,MAAM,IAAI,GAAG,EAAE,GAAI,OAAe,EAAE;AACpC,QAAA,OAAO,IAAI,CAAC,IAAc,CAAC;AAC3B,QAAA,IAAI,CAAC,IAAI,GAAG,IAAS;QACrB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC;;IAGnC,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,IAAI,GAAG,EAAO;QACnB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC;;IAGnC,SAAS,CAAC,QAAuB,EAAE,OAAiC,EAAA;QAClE,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC;;AAGhD,IAAA,IAAI,CAAC,IAAkB,EAAA;AACrB,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;;IAGlB,MAAM,GAAA;AACJ,QAAA,OAAO,IAAI,CAAC,GAAG,EAAE;;AAEpB;AAcD,MAAM,IAAK,SAAQ,OAAO,CAAA;AASxB,IAAA,WAAA,CAAY,OAAoB,EAAE,EAAA;AAChC,QAAA,KAAK,EAAE;QAHD,IAAkB,CAAA,kBAAA,GAAc,EAAE;AAIxC,QAAA,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;QACzB,IAAI,CAAC,EAAE,KAAP,IAAI,CAAC,EAAE,GAAK,CAAI,CAAA,EAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAA,CAAE,CAAC;QACzD,IAAI,IAAI,CAAC,GAAG;AAAE,YAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;QACpC,IAAI,CAAC,MAAM,KAAX,IAAI,CAAC,MAAM,GAAK,EAAE,CAAC;QACnB,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;;AAG9B,IAAA,WAAW,CAAC,UAA6B,EAAA;AAC/C,QAAA,MAAM,GAAG,GAAG,SAAS,EAAE;QACvB,IAAK,UAA6B,aAA7B,UAAU,KAAA,MAAA,GAAA,MAAA,GAAV,UAAU,CAAqB,gBAAgB,EAAE;AACpD,YAAA,IAAI,CAAC,EAAE,GAAG,UAA4B;;AACjC,aAAA,IAAI,CAAA,GAAG,KAAH,IAAA,IAAA,GAAG,uBAAH,GAAG,CAAE,QAAQ,KAAI,UAAU,YAAY,GAAG,CAAC,QAAQ,EAAE;YAC9D,IAAI,CAAC,EAAE,GAAG,IAAI,cAAc,CAAC,UAAiB,CAAC;;AAC1C,aAAA,IAAI,OAAO,UAAU,KAAK,QAAQ,EAAE;AACzC,YAAA,IAAI,CAAC,EAAE,GAAG,IAAI,cAAc,CAAC,eAAe,EAAE,CAAC,gBAAgB,CAAC,UAAU,CAAQ,CAAC;;AAC9E,aAAA,IAAI,CAAA,GAAG,KAAH,IAAA,IAAA,GAAG,uBAAH,GAAG,CAAE,WAAW,KAAI,UAAU,YAAY,GAAG,CAAC,WAAW,EAAE;YACpE,IAAI,CAAC,EAAE,GAAG,IAAI,cAAc,CAAC,CAAC,UAAU,CAAC,CAAC;;aACrC;AACL,YAAA,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC;;;AAI9F,IAAA,cAAc,CAAC,MAAkB,EAAA;QACvC,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,gBAAgB;YAAE;AAC3C,QAAA,MAAM,aAAa,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC;AACvC,QAAA,KAAK,MAAM,QAAQ,IAAI,MAAM,EAAE;YAC7B,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE;AAClC,gBAAA,MAAM,QAAQ,GAAI,IAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC;AACrD,gBAAA,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;AAClC,oBAAA,MAAM,IAAI,KAAK,CAAC,CAAA,8BAAA,EAAiC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAA,CAAE,CAAC;;gBAE3E,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAC3C,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC;;;;IAKnD,cAAc,CAAC,QAAgB,EAAE,OAAe,EAAE,QAA4B,EAAE,OAAO,GAAG,KAAK,EAAA;AACrG,QAAA,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,EAAE,EAAE;AAC1B,YAAA,MAAM,QAAQ,GAAG,CAAC,KAAY,KAAI;AAChC,gBAAA,IAAI,IAAI,GAAuB,KAAK,CAAC,MAAqB;gBAC1D,OAAO,IAAI,EAAE;oBACX,IAAK,IAAY,CAAC,OAAO,IAAK,IAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;AAC3D,wBAAA,KAAa,CAAC,cAAc,GAAG,IAAI;AACpC,wBAAA,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC;wBAC1B;;oBAEF,IAAI,IAAI,KAAK,IAAI;wBAAE;AACnB,oBAAA,IAAI,GAAG,IAAI,CAAC,aAAa;;AAE7B,aAAC;YACD,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC;AACjD,YAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;;;AAIpF,IAAA,KAAK,CAAC,IAAiB,EAAA;QAC7B,IAAI,IAAI,CAAC,EAAE;AAAE,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAS,CAAC;AAC7C,QAAA,IAAI,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE;AAAE,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;AAClD,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC;AAChC,QAAA,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;;IAGvB,UAAU,CAAC,IAAkB,EAAA;IAE7B,OAAO,GAAA;QACL,OAAO,IAAI,CAAC,IAAI;;AAGlB,IAAA,GAAG,CAAC,IAAgB,EAAA;AAClB,QAAA,OAAQ,IAAY,CAAC,IAAI,CAAC;;IAG5B,GAAG,CAAC,IAAgB,EAAE,KAAU,EAAA;AAC7B,QAAA,IAAY,CAAC,IAAI,CAAC,GAAG,KAAK;;IAG7B,UAAU,CAAC,IAA2C,EAAE,OAAuB,EAAA;QAC7E,IAAI,IAAI,CAAC,aAAa;YAAE,IAAI,CAAC,aAAa,EAAE;AAC5C,QAAA,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC;QACnD,OAAO,IAAI,CAAC,aAAa;;IAG3B,MAAM,GAAA;QACJ,IAAI,IAAI,CAAC,aAAa;YAAE,IAAI,CAAC,aAAa,EAAE;QAC5C,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;AAAE,YAAA,OAAO,EAAE;AAClE,QAAA,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE;QAChB,IAAI,IAAI,CAAC,GAAG;YAAE,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;;AAG5C,IAAA,MAAM,CAAC,QAAgB,EAAE,GAAmD,GAAA,IAAI,CAAC,EAAE,EAAA;AACjF,QAAA,MAAM,GAAG,GAAG,SAAS,EAAE;AACvB,QAAA,IAAI,CAAC,CAAA,GAAG,KAAA,IAAA,IAAH,GAAG,KAAH,MAAA,GAAA,MAAA,GAAA,GAAG,CAAE,WAAW,KAAI,GAAG,YAAY,GAAG,CAAC,WAAW,MAAM,CAAA,GAAG,KAAA,IAAA,IAAH,GAAG,KAAA,MAAA,GAAA,MAAA,GAAH,GAAG,CAAE,YAAY,KAAI,GAAG,YAAY,GAAG,CAAC,YAAY,CAAC,EAAE;YAClH,OAAO,IAAI,cAAc,CAAC,GAAG,CAAC,gBAAgB,CAAC,QAAQ,CAAQ,CAAC;;QAElE,IAAK,GAAW,CAAC,gBAAgB;AAAE,YAAA,OAAQ,GAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC;AAChF,QAAA,MAAM,IAAI,KAAK,CAAC,6EAA6E,CAAC;;AAEjG;AAED,MAAM,WAAW,CAAA;AAAjB,IAAA,WAAA,GAAA;QACS,IAAK,CAAA,KAAA,GAAW,EAAE;;AAEzB,IAAA,OAAO,CAAC,EAAU,EAAA;AAChB,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC;;AAGlD,IAAA,OAAO,CAAC,IAAU,EAAA;AAChB,QAAA,IAAI,IAAI,YAAY,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;AAAE,YAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;;AAG/E,IAAA,UAAU,CAAC,EAAU,EAAA;QACnB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC;;IAG1D,OAAO,CAAC,OAAe,EAAE,IAAc,EAAA;QACrC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;AAAE,YAAA,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;;AAErE;AAED,MAAM,UAAU,CAAA;AAMd,IAAA,WAAA,CAAY,MAAc,GAAA,EAAE,EAAE,UAAA,GAA0B,KAAY,EAAA;QAL7D,IAAM,CAAA,MAAA,GAAQ,EAAE;AAMrB,QAAA,IAAI,CAAC,UAAU,GAAG,UAAU;AAC5B,QAAA,IAAI,CAAC,GAAG,GAAG,EAAE;QACb,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;AAChC,QAAA,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;;AAG5C,IAAA,GAAG,CAAC,EAAU,EAAA;AACZ,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC;;AAGrD,IAAA,GAAG,CAAC,KAAQ,EAAA;AACV,QAAA,IAAI,EAAE,KAAK,YAAY,KAAK,CAAC;YAAE;QAC/B,IAAI,CAAC,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;QACrC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;;AAG7B,IAAA,MAAM,CAAC,EAAc,EAAA;AACnB,QAAA,MAAM,KAAK,GAAG,OAAO,EAAE,KAAK,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE;AACxD,QAAA,IAAI,CAAC,KAAK;YAAE;AACZ,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,KAAK,KAAK,CAAC;QAC1D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;;AAG7B,IAAA,EAAE,CAAC,KAAa,EAAA;AACd,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;;AAG3B,IAAA,IAAI,MAAM,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM;;IAG3B,KAAK,GAAA;AACH,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE;QAChB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;;AAG7B,IAAA,IAAI,CAAC,SAA4B,EAAA;QAC/B,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;;AAGpC,IAAA,MAAM,CAAC,SAA4B,EAAA;QACjC,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;;AAGtC,IAAA,GAAG,CAAI,MAAkC,EAAA;QACvC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;;IAGhC,MAAM,GAAA;AACJ,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,GAAG,EAAE,CAAC;;IAGhD,SAAS,CAAC,QAAyB,EAAE,OAAiC,EAAA;QACpE,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,EAAE,OAAO,CAAC;;IAGtC,KAAK,CAAC,OAAoB,EAAE,EAAA;AACpC,QAAA,MAAM,OAAO,GAAG,IAAI,cAAc,EAAE;AACpC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,IAAI,KAAK;QACjC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,YAAA,GAAe;QAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,YAAA,GAAe;QAC3C,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;AAC/B,QAAA,OAAO,CAAC,MAAM,GAAG,MAAK;AACpB,YAAA,IAAI,OAAO,CAAC,MAAM,IAAI,GAAG,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE;AACjD,gBAAA,IAAI;oBACF,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;;gBAClF,OAAO,GAAG,EAAE;oBACZ,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC;;;iBAElC;gBACL,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC;;AAEpC,SAAC;AACD,QAAA,OAAO,CAAC,OAAO,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;QACxC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,GAAG,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;IAG/E,KAAK,CAAC,OAAmD,EAAE,EAAA;AACzD,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO;AAChC,QAAA,IAAI,CAAC,OAAO,GAAG,UAA+B,IAAW,EAAA;YACvD,MAAM,IAAI,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAgB;YAChE,IAAI,CAAC,KAAK,EAAE;AACZ,YAAA,KAAK,MAAM,IAAI,IAAI,IAAI,IAAI,EAAE,EAAE;AAC7B,gBAAA,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE;AACvB,gBAAA,KAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AACxB,gBAAA,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;;AAEjB,YAAA,IAAI,WAAW;AAAE,gBAAA,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC;AAC/C,SAAC;AACD,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;;IAGlB,OAAO,CAAC,OAAe,EAAE,IAAc,EAAA;QACrC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;AAAE,YAAA,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;;AAExE;AA0BD,MAAM,MAAM,CAAA;AAcV,IAAA,WAAA,CAAY,UAAyB,EAAE,EAAA;QAb/B,IAAM,CAAA,MAAA,GAAkB,EAAE;QAC1B,IAAO,CAAA,OAAA,GAAG,KAAK;QACN,IAAQ,CAAA,QAAA,GAAG,MAAM,IAAI,CAAC,KAAK,EAAE;AAC7B,QAAA,IAAA,CAAA,aAAa,GAAG,CAAC,KAAY,KAAK,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;AAC7D,QAAA,IAAA,CAAA,kBAAkB,GAAG,CAAC,KAAU,KAAK,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC;AAGvE,QAAA,IAAA,CAAA,OAAO,GAAgC,MAAM,CAAsB,IAAI,CAAC;QAOtF,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,GAAG;QAC/B,IAAI,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,IAAI,kBAAkB;QAC9D,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;AAC7C,QAAA,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ;AAChC,QAAA,IAAI,OAAO,CAAC,SAAS,KAAK,KAAK;YAAE,IAAI,CAAC,KAAK,EAAE;;IAG/C,GAAG,CAAC,OAAe,EAAE,OAAqB,EAAA;AACxC,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AACrD,QAAA,OAAO,IAAI;;IAGb,QAAQ,CAAC,OAAe,EAAE,OAAqB,EAAA;AAC7C,QAAA,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC;;AAG5B,IAAA,WAAW,CAAC,OAAe,EAAA;;QACzB,IAAI,CAAA,CAAA,EAAA,GAAA,IAAI,CAAC,WAAW,0CAAE,OAAO,MAAK,OAAO,EAAE;YACzC,IAAI,CAAC,YAAY,EAAE;AACnB,YAAA,IAAI,CAAC,WAAW,GAAG,SAAS;AAC5B,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;;QAExB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,OAAO,KAAK,OAAO,CAAC;AACtE,QAAA,OAAO,IAAI;;AAGb,IAAA,QAAQ,CAAC,IAAY,EAAE,OAAA,GAAuD,EAAE,EAAA;;AAC9E,QAAA,MAAM,GAAG,GAAG,SAAS,EAAE;AACvB,QAAA,IAAI,CAAC,GAAG;YAAE;QACV,MAAM,MAAM,GAAG,MAAK;AAClB,YAAA,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,cAAc,GAAG,WAAW;AAC7D,YAAA,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5D,IAAI,CAAC,KAAK,EAAE;AACd,SAAC;AACD,QAAA,kBAAkB,CAAC,MAAM,EAAE,CAAA,EAAA,GAAA,OAAO,CAAC,UAAU,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,IAAI,CAAC,UAAU,CAAC;;IAGnE,KAAK,GAAA;;AACH,QAAA,MAAM,GAAG,GAAG,SAAS,EAAE;AACvB,QAAA,MAAM,GAAG,GAAG,WAAW,EAAE;AACzB,QAAA,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE;AACxB,YAAA,IAAI,GAAG;gBAAE,IAAI,CAAC,KAAK,EAAE;YACrB;;QAEF,GAAG,CAAC,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC;AAC/C,QAAA,GAAG,KAAH,IAAA,IAAA,GAAG,KAAH,MAAA,GAAA,MAAA,GAAA,GAAG,CAAE,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC;AAClD,QAAA,CAAA,EAAA,GAAA,CAAC,EAAA,GAAA,GAAW,CAAC,UAAU,MAAE,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,gBAAgB,MAAG,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,UAAU,EAAE,IAAI,CAAC,kBAAkB,CAAC;AAChF,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;QACnB,IAAI,CAAC,KAAK,EAAE;;IAGd,IAAI,GAAA;;AACF,QAAA,MAAM,GAAG,GAAG,SAAS,EAAE;AACvB,QAAA,MAAM,GAAG,GAAG,WAAW,EAAE;AACzB,QAAA,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE;YACvB,GAAG,CAAC,mBAAmB,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC;AAClD,YAAA,GAAG,KAAH,IAAA,IAAA,GAAG,KAAH,MAAA,GAAA,MAAA,GAAA,GAAG,CAAE,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,aAAa,CAAC;AACrD,YAAA,CAAA,EAAA,GAAA,CAAC,EAAA,GAAA,GAAW,CAAC,UAAU,MAAE,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,mBAAmB,MAAG,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,EAAA,EAAA,UAAU,EAAE,IAAI,CAAC,kBAAkB,CAAC;;AAErF,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;QACpB,IAAI,CAAC,YAAY,EAAE;;IAGrB,KAAK,GAAA;;AACH,QAAA,MAAM,GAAG,GAAG,SAAS,EAAE;AACvB,QAAA,IAAI,CAAC,GAAG;AAAE,YAAA,OAAO,IAAI;QACrB,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;AACtC,QAAA,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC;AACxD,QAAA,IAAI,SAAS,KAAK,IAAI,EAAE;YACtB,IAAI,CAAC,YAAY,EAAE;AACnB,YAAA,IAAI,CAAC,WAAW,GAAG,SAAS;AAC5B,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACtB,YAAA,OAAO,IAAI;;QAEb,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;AAClC,QAAA,QAAQ,CAAC,QAAQ,GAAG,SAAS,IAAI,GAAG;AACpC,QAAA,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE;YAC/B,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;AACxC,YAAA,IAAI,CAAC,WAAW;gBAAE;YAClB,MAAM,KAAK,GAAG,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC;YAC9C,MAAM,IAAI,GAAG,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3C,YAAA,MAAM,MAAM,GAAG,EAAE,GAAG,WAAW,EAAE,GAAG,KAAK,EAAE,GAAG,IAAI,EAAE;AACpD,YAAA,MAAM,OAAO,GAAiB;gBAC5B,IAAI,EAAE,SAAS,IAAI,GAAG;gBACtB,GAAG;gBACH,MAAM;gBACN,KAAK;gBACL;aACD;YACD,IAAI,CAAC,YAAY,EAAE;AACnB,YAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AACxB,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;YACzB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;YAC9C,IAAI,OAAO,OAAO,KAAK,UAAU;AAAE,gBAAA,IAAI,CAAC,YAAY,GAAG,OAAO;AAC9D,YAAA,OAAO,OAAO;;QAEhB,IAAI,CAAC,YAAY,EAAE;AACnB,QAAA,IAAI,CAAC,WAAW,GAAG,SAAS;AAC5B,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QACtB,MAAM,OAAO,GAAG,CAAA,EAAA,GAAA,IAAI,CAAC,QAAQ,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,IAAA,EAAG,EAAE,EAAE;YAClC,IAAI,EAAE,SAAS,IAAI,GAAG;YACtB,GAAG;AACH,YAAA,MAAM,EAAE,EAAE;AACV,YAAA,KAAK,EAAE,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC;AACvC,YAAA,IAAI,EAAE,oBAAoB,CAAC,GAAG,CAAC,IAAI;AACpC,SAAA,CAAC;QACF,IAAI,OAAO,OAAO,KAAK,UAAU;AAAE,YAAA,IAAI,CAAC,YAAY,GAAG,OAAO;AAC9D,QAAA,OAAO,IAAI;;AAGL,IAAA,eAAe,CAAC,KAAY,EAAA;;AAClC,QAAA,MAAM,MAAM,GAAG,KAAK,CAAC,MAA4B;AACjD,QAAA,MAAM,MAAM,GAAG,CAAA,EAAA,GAAA,MAAM,aAAN,MAAM,KAAA,MAAA,GAAA,MAAA,GAAN,MAAM,CAAE,OAAO,MAAG,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,IAAA,CAAA,MAAA,EAAA,IAAI,CAAC,YAAY,CAA6B;AAC/E,QAAA,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC;YAAE;AACjE,QAAA,MAAM,GAAG,GAAG,SAAS,EAAE;AACvB,QAAA,IAAI,CAAC,GAAG;YAAE;AACV,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;QACnD,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,MAAM;YAAE;QACxC,IAAI,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI;YAAE;QACrD,KAAK,CAAC,cAAc,EAAE;AACtB,QAAA,IAAI,CAAC,QAAQ,CAAC,CAAG,EAAA,GAAG,CAAC,QAAQ,CAAA,EAAG,GAAG,CAAC,MAAM,CAAG,EAAA,GAAG,CAAC,IAAI,CAAA,CAAE,CAAC;;AAGlD,IAAA,qBAAqB,CAAC,KAAU,EAAA;;AACtC,QAAA,MAAM,GAAG,GAAG,SAAS,EAAE;AACvB,QAAA,IAAI,CAAC,GAAG,IAAI,EAAC,KAAK,KAAL,IAAA,IAAA,KAAK,KAAL,MAAA,GAAA,MAAA,GAAA,KAAK,CAAE,YAAY,CAAA,IAAI,EAAC,CAAA,EAAA,GAAA,KAAK,CAAC,WAAW,MAAE,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAA,GAAG,CAAA,IAAI,OAAO,KAAK,CAAC,SAAS,KAAK,UAAU;YAAE;AACtG,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC7D,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,MAAM;YAAE;QACxC,IAAI,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI;YAAE;QACrD,KAAK,CAAC,SAAS,CAAC;YACd,OAAO,EAAE,MAAK;gBACZ,IAAI,CAAC,KAAK,EAAE;;AAEf,SAAA,CAAC;;IAGI,YAAY,GAAA;QAClB,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE;AACxB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY;AACjC,QAAA,IAAI,CAAC,YAAY,GAAG,SAAS;AAC7B,QAAA,OAAO,EAAE;;AAEZ;AAED,SAAS,iBAAiB,CAAC,OAAe,EAAE,OAAqB,EAAA;AAC/D,IAAA,MAAM,GAAG,GAAG,SAAS,EAAE;AACvB,IAAA,MAAM,cAAc,GAAG,CAAC,GAAW,aAAX,GAAG,KAAA,MAAA,GAAA,MAAA,GAAH,GAAG,CAAU,UAAU,KAAK,UAAkB,CAAC,UAAU;AACjF,IAAA,IAAI,OAAO,cAAc,KAAK,UAAU,EAAE;AACxC,QAAA,IAAI;YACF,MAAM,aAAa,GAAG,IAAI,cAAc,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;YAC/D,OAAO;gBACL,OAAO;gBACP,OAAO;AACP,gBAAA,IAAI,CAAC,GAAG,EAAA;oBACN,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;AAC1C,oBAAA,OAAO,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,IAAI,EAAE,CAAC,GAAG,IAAI;;aAElE;;QACD,OAAO,IAAI,EAAE;;;;IAKjB,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,kBAAkB,CAAC,OAAO,CAAC;IAChD,OAAO;QACL,OAAO;QACP,OAAO;AACP,QAAA,IAAI,CAAC,GAAG,EAAA;AACN,YAAA,MAAM,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAClD,YAAA,IAAI,CAAC,KAAK;AAAE,gBAAA,OAAO,IAAI;YACvB,MAAM,MAAM,GAA2B,EAAE;YACzC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,KAAK,KAAI;AAC1B,gBAAA,MAAM,CAAC,GAAG,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC1D,aAAC,CAAC;AACF,YAAA,OAAO,MAAM;;KAEhB;AACH;AAEA,SAAS,aAAa,CAAC,IAAY,EAAA;IACjC,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,IAAI,GAAG,CAAC;IAC7C,OAAO,UAAU,KAAK,EAAE,GAAG,EAAE,GAAG,UAAU;AAC5C;AAEA,SAAS,YAAY,CAAC,IAAY,EAAE,IAAY,EAAA;AAC9C,IAAA,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC;IAC1C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,kBAAkB,CAAC;IACvD,IAAI,QAAQ,GAAG,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG;AACpD,IAAA,IAAI,cAAc,IAAI,QAAQ,KAAK,cAAc,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAG,EAAA,cAAc,CAAG,CAAA,CAAA,CAAC,EAAE;AAC/F,QAAA,QAAQ,GAAG,CAAG,EAAA,cAAc,CAAG,EAAA,QAAQ,KAAK,GAAG,GAAG,EAAE,GAAG,QAAQ,EAAE;;IAEnE,OAAO,CAAA,EAAG,QAAQ,CAAA,EAAG,MAAM,CAAC,MAAM,CAAA,EAAG,MAAM,CAAC,IAAI,CAAA,CAAE;AACpD;AAEA,SAAS,aAAa,CAAC,QAAgB,EAAE,IAAY,EAAA;AACnD,IAAA,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC;IAC1C,MAAM,cAAc,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,GAAG;AACrD,IAAA,IAAI,CAAC,cAAc;AAAE,QAAA,OAAO,cAAc;IAC1C,IAAI,cAAc,KAAK,cAAc;AAAE,QAAA,OAAO,GAAG;IACjD,IAAI,cAAc,CAAC,UAAU,CAAC,GAAG,cAAc,CAAA,CAAA,CAAG,CAAC,EAAE;AACnD,QAAA,OAAO,aAAa,CAAC,cAAc,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG;;AAE1E,IAAA,OAAO,IAAI;AACb;AAEA,SAAS,kBAAkB,CAAC,OAAe,EAAA;IACzC,MAAM,IAAI,GAAa,EAAE;AACzB,IAAA,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,CAAC;IACzC,IAAI,UAAU,KAAK,EAAE;AAAE,QAAA,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;AACnD,IAAA,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;IACtD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,KAAI;AACtC,QAAA,IAAI,OAAO,KAAK,GAAG,EAAE;AACnB,YAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;AACrB,YAAA,OAAO,MAAM;;AAEf,QAAA,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;YAC3B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC3B,YAAA,OAAO,SAAS;;AAElB,QAAA,OAAO,YAAY,CAAC,OAAO,CAAC;AAC9B,KAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;AACZ,IAAA,OAAO,EAAE,EAAE,EAAE,IAAI,MAAM,CAAC,CAAK,EAAA,EAAA,MAAM,CAAK,GAAA,CAAA,CAAC,EAAE,IAAI,EAAE;AACnD;AAEA,SAAS,aAAa,CAAC,IAAY,EAAA;AACjC,IAAA,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IAClE,OAAO,UAAU,KAAK,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,UAAU,GAAG,CAAA,CAAA,EAAI,UAAU,CAAA,CAAE;AAC5F;AAEA,SAAS,YAAY,CAAC,KAAa,EAAA;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC;AACrD;AAEA,SAAS,oBAAoB,CAAC,KAAa,EAAA;IACzC,MAAM,GAAG,GAA2B,EAAE;IACtC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;AACxC,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,GAAG;AACtB,IAAA,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC;IACzC,MAAM,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,GAAG,KAAI;AACjC,QAAA,GAAG,CAAC,GAAG,CAAC,GAAG,UAAU;AACvB,KAAC,CAAC;AACF,IAAA,OAAO,GAAG;AACZ;AAEA,SAAS,YAAY,CAAC,KAA6B,EAAA;IACjD,MAAM,GAAG,GAA2B,EAAE;IACtC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;QACpC,GAAG,CAAC,GAAG,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;;AAE3C,IAAA,OAAO,GAAG;AACZ;AAEA,MAAM,aAAa,GAAG,MAAM,CAAgB,IAAI,CAAC;AAEjD,SAAS,KAAK,CAAC,OAAe,EAAE,OAAqB,EAAA;AACnD,IAAA,IAAI,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE;IACjC,IAAI,CAAC,MAAM,EAAE;QACX,MAAM,GAAG,IAAI,MAAM,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACzC,QAAA,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;;AAE3B,IAAA,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC;IAC5B,MAAM,CAAC,KAAK,EAAE;AACd,IAAA,OAAO,MAAM;AACf;AAEA,MAAM,GAAG,GAAG;AACV,IAAA,OAAO,EAAE,OAAO;IAChB,SAAS;IACT,MAAM;IACN,QAAQ;IACR,MAAM;IACN,KAAK;IACL,OAAO;IACP,QAAQ;IACR,aAAa;IACb,KAAK;IACL,QAAQ;IACR,MAAM;IACN,IAAI;IACJ,IAAI;IACJ,UAAU;IACV,MAAM;IACN,cAAc;IACd,SAAS;IACT,KAAK;IACL,MAAM;IACN,cAAc;IACd,UAAU;IACV,KAAK;IACL,IAAI;IACJ,WAAW;IACX;;AAGF,SAAS,eAAe,GAAA;AACtB,IAAA,MAAM,GAAG,GAAG,SAAS,EAAE;AACvB,IAAA,IAAI,GAAG;AAAG,QAAA,GAAW,CAAC,GAAG,GAAG,GAAG;AAC/B,IAAA,OAAO,GAAG;AACZ;AAEA;AACA,IAAI,OAAO,MAAM,KAAK,UAAU,IAAK,MAAc,CAAC,GAAG,EAAE;IACtD,MAAc,CAAC,eAAe,CAAC;AAClC;AAAO,KAAA,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,WAAW,EAAE;AAC9E,IAAA,MAAM,CAAC,OAAO,GAAG,GAAG;AACtB;AAEA,MAAM,GAAG,GAAG,SAAS,EAAE;AACvB,IAAI,GAAG,EAAE;AACN,IAAA,GAAW,CAAC,GAAG,GAAG,GAAG;AACxB;;;;"} \ No newline at end of file +{"version":3,"file":"ity.esm.mjs","sources":["../Ity.ts"],"sourcesContent":["// Ity.ts 2.2.0\n// (c) 2026 Dominic Cocchiarella\n// Tiny dependency-free reactive app kernel with V1 MVC compatibility.\ndeclare var define: any;\ndeclare var module: any;\n\ntype Cleanup = () => void;\ntype Equality = (prev: T, next: T) => boolean;\ntype Subscriber = (value: T, previous: T) => void;\ntype MaybeSignal = T | ReadonlySignal;\ntype TemplateValue =\n | TemplateResult\n | UnsafeHTML\n | Node\n | string\n | number\n | boolean\n | null\n | undefined\n | TemplateValue[]\n | ReadonlySignal;\n\ninterface ReadonlySignal {\n (): T;\n get(): T;\n peek(): T;\n subscribe(callback: Subscriber, options?: { immediate?: boolean }): Cleanup;\n readonly isSignal: true;\n}\n\ninterface Signal extends ReadonlySignal {\n (next: T | ((previous: T) => T)): T;\n set(next: T | ((previous: T) => T)): T;\n update(updater: (previous: T) => T): T;\n}\n\ninterface ReactiveSource {\n observers: Set;\n}\n\ninterface ReactiveObserver {\n deps: Set;\n markDirty(): void;\n}\n\ninterface ComputedOptions {\n equals?: Equality;\n}\n\ninterface SignalOptions {\n equals?: Equality;\n name?: string;\n}\n\ninterface EffectHandle {\n (): void;\n dispose(): void;\n}\n\ninterface TemplateResult {\n readonly isTemplateResult: true;\n readonly strings: readonly string[];\n readonly values: readonly unknown[];\n}\n\ninterface UnsafeHTML {\n readonly isUnsafeHTML: true;\n readonly value: string;\n}\n\ntype HTMLSanitizer = (value: string) => string;\n\ninterface UnsafeHTMLOptions {\n sanitize?: HTMLSanitizer;\n config?: ItyConfig | null;\n}\n\ninterface ItyConfig {\n sanitizeHTML?: HTMLSanitizer | null;\n}\n\ninterface RenderOptions {\n reactive?: boolean;\n transition?: boolean;\n config?: ItyConfig | null;\n}\n\ntype StoreKey = string | symbol;\n\ninterface StoreApi> {\n $patch(patch: Partial | ((current: T) => Partial | void)): void;\n $snapshot(): T;\n $subscribe(callback: (value: T) => void, options?: { immediate?: boolean }): Cleanup;\n}\n\ntype Store> = T & StoreApi;\n\ntype AsyncStatus = \"idle\" | \"loading\" | \"success\" | \"error\";\n\ninterface ResourceContext {\n signal: AbortSignal;\n previous: T | undefined;\n refreshId: number;\n}\n\ninterface ResourceOptions {\n initialValue?: T;\n immediate?: boolean;\n keepPrevious?: boolean;\n onSuccess?: (value: T) => void;\n onError?: (error: E) => void;\n}\n\ninterface Resource {\n readonly data: Signal;\n readonly error: Signal;\n readonly loading: ReadonlySignal;\n readonly status: ReadonlySignal;\n readonly promise: Promise | null;\n refresh(): Promise;\n mutate(value: T | undefined): void;\n abort(reason?: unknown): void;\n}\n\ninterface ActionOptions {\n onSuccess?: (value: TResult) => void;\n onError?: (error: E) => void;\n}\n\ninterface Action {\n (...args: TArgs): Promise;\n submit(...args: TArgs): Promise;\n run(...args: TArgs): void;\n with(...args: TArgs): (...eventArgs: unknown[]) => void;\n from(mapper: (event: TEvent) => TArgs): (event: TEvent) => void;\n readonly data: Signal;\n readonly error: Signal;\n readonly pending: ReadonlySignal;\n readonly pendingCount: ReadonlySignal;\n readonly status: ReadonlySignal;\n reset(): void;\n}\n\ninterface FormController {\n readonly action: Action<[FormData, Event], TResult, E>;\n readonly data: Signal;\n readonly error: Signal;\n readonly pending: ReadonlySignal;\n readonly status: ReadonlySignal;\n onSubmit(event: Event): Promise;\n handleSubmit(event: Event): void;\n reset(): void;\n}\n\ninterface FormOptions extends ActionOptions {\n resetOnSuccess?: boolean;\n}\n\ntype FormErrorMap> = Partial, string>>;\n\ninterface FormBindOptions {\n type?: \"text\" | \"textarea\" | \"select\" | \"select-multiple\" | \"checkbox\" | \"radio\" | \"number\";\n event?: string;\n name?: string;\n value?: unknown;\n parse?: (value: unknown, event: Event) => T;\n format?: (value: T) => unknown;\n}\n\ninterface FormStateOptions> {\n validators?: Partial<{ [K in keyof TValues]: (value: TValues[K], values: TValues) => string | null | undefined }>;\n validate?: (values: TValues) => FormErrorMap | void;\n}\n\ninterface FormField {\n readonly value: Signal;\n readonly error: ReadonlySignal;\n readonly touched: ReadonlySignal;\n readonly dirty: ReadonlySignal;\n bind(options?: FormBindOptions): Record;\n set(next: T | ((previous: T) => T)): T;\n reset(): void;\n}\n\ninterface FormStateSubmitOptions extends ActionOptions {\n resetOnSuccess?: boolean;\n}\n\ninterface FormStateController, TResult, E = unknown> {\n readonly state: FormState;\n readonly action: Action<[TValues, Event], TResult, E>;\n readonly data: Signal;\n readonly error: Signal;\n readonly pending: ReadonlySignal;\n readonly status: ReadonlySignal;\n onSubmit(event: Event): Promise;\n handleSubmit(event: Event): void;\n reset(): void;\n}\n\ninterface FormState> {\n readonly values: Store;\n readonly initialValues: ReadonlySignal;\n readonly errors: Store>;\n readonly touched: Store, boolean>>>;\n readonly dirty: ReadonlySignal;\n readonly valid: ReadonlySignal;\n field(name: K): FormField;\n bind(name: K, options?: FormBindOptions): Record;\n set(next: Partial | ((current: TValues) => Partial | void)): void;\n reset(next?: Partial | TValues): void;\n validate(names?: readonly (keyof TValues)[]): boolean;\n markTouched(names?: readonly (keyof TValues)[]): void;\n submit(\n handler: (values: TValues, event: Event) => Promise | TResult,\n options?: FormStateSubmitOptions\n ): FormStateController;\n}\n\ninterface RenderToStringOptions {\n config?: ItyConfig | null;\n}\n\ninterface RegisteredFormBinding {\n domName: string;\n type: NonNullable[\"type\"]> | \"text\";\n value?: unknown;\n parse?: (value: unknown, event: Event) => T;\n}\n\nconst defaultEquals = Object.is;\nlet activeObserver: ReactiveObserver | null = null;\nlet batchDepth = 0;\nconst pendingEffects = new Set();\nlet configuredSanitizeHTML: HTMLSanitizer | undefined;\nconst activeConfigStack: Array = [];\n\nfunction getWindow(): (Window & typeof globalThis) | undefined {\n return typeof window !== \"undefined\" ? window : undefined;\n}\n\nfunction getDocument(): Document | undefined {\n const win = getWindow();\n return win?.document ?? (typeof document !== \"undefined\" ? document : undefined);\n}\n\nfunction hasOwn(target: object, key: PropertyKey): boolean {\n return Object.prototype.hasOwnProperty.call(target, key);\n}\n\nfunction isPlainObject(value: unknown): value is Record {\n if (!value || typeof value !== \"object\") return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\nfunction cloneValue(value: T): T {\n const cloneFn = (globalThis as any).structuredClone;\n if (typeof cloneFn === \"function\") return cloneFn(value);\n if (Array.isArray(value)) return value.map((item) => cloneValue(item)) as T;\n if (isPlainObject(value)) {\n const out: Record = {};\n for (const key of Reflect.ownKeys(value)) {\n out[key as any] = cloneValue((value as any)[key]);\n }\n return out as T;\n }\n return value;\n}\n\nfunction deepEqual(left: unknown, right: unknown): boolean {\n if (Object.is(left, right)) return true;\n if (Array.isArray(left) && Array.isArray(right)) {\n if (left.length !== right.length) return false;\n for (let i = 0; i < left.length; i += 1) {\n if (!deepEqual(left[i], right[i])) return false;\n }\n return true;\n }\n if (isPlainObject(left) && isPlainObject(right)) {\n const leftKeys = Reflect.ownKeys(left);\n const rightKeys = Reflect.ownKeys(right);\n if (leftKeys.length !== rightKeys.length) return false;\n for (const key of leftKeys) {\n if (!rightKeys.includes(key)) return false;\n if (!deepEqual((left as any)[key], (right as any)[key])) return false;\n }\n return true;\n }\n return false;\n}\n\nfunction currentConfig(): ItyConfig | null {\n return activeConfigStack.length ? activeConfigStack[activeConfigStack.length - 1] : null;\n}\n\nfunction withConfig(config: ItyConfig | null | undefined, callback: () => T): T {\n activeConfigStack.push(config || null);\n try {\n return callback();\n } finally {\n activeConfigStack.pop();\n }\n}\n\nfunction resolveSanitizeHTML(options: UnsafeHTMLOptions = {}): HTMLSanitizer | undefined {\n if (options.sanitize) return options.sanitize;\n const scoped = options.config ?? currentConfig();\n if (scoped && hasOwn(scoped, \"sanitizeHTML\")) {\n return scoped.sanitizeHTML || undefined;\n }\n return configuredSanitizeHTML;\n}\n\nfunction trackDependency(source: ReactiveSource): void {\n if (!activeObserver) return;\n source.observers.add(activeObserver);\n activeObserver.deps.add(source);\n}\n\nfunction cleanupDependencies(observer: ReactiveObserver): void {\n for (const dep of observer.deps) {\n dep.observers.delete(observer);\n }\n observer.deps.clear();\n}\n\nfunction notifyObservers(source: ReactiveSource): void {\n for (const observer of Array.from(source.observers)) {\n observer.markDirty();\n }\n}\n\nfunction flushEffects(): void {\n if (batchDepth > 0) return;\n while (pendingEffects.size) {\n const effects = Array.from(pendingEffects);\n pendingEffects.clear();\n for (const effect of effects) {\n effect.run();\n }\n }\n}\n\nfunction queueEffect(effect: ReactiveEffect): void {\n pendingEffects.add(effect);\n flushEffects();\n}\n\nclass SignalNode implements ReactiveSource {\n observers = new Set();\n private subscribers = new Set>();\n private value: T;\n private equals: Equality;\n\n constructor(value: T, options: SignalOptions = {}) {\n this.value = value;\n this.equals = options.equals || defaultEquals;\n }\n\n read(track = true): T {\n if (track) trackDependency(this);\n return this.value;\n }\n\n write(next: T | ((previous: T) => T)): T {\n const previous = this.value;\n const resolved = typeof next === \"function\"\n ? (next as (previous: T) => T)(previous)\n : next;\n if (this.equals(previous, resolved)) return previous;\n this.value = resolved;\n notifyObservers(this);\n for (const subscriber of Array.from(this.subscribers)) {\n subscriber(resolved, previous);\n }\n flushEffects();\n return resolved;\n }\n\n subscribe(callback: Subscriber, options: { immediate?: boolean } = {}): Cleanup {\n this.subscribers.add(callback);\n if (options.immediate) callback(this.value, this.value);\n return () => {\n this.subscribers.delete(callback);\n };\n }\n}\n\nclass ComputedNode implements ReactiveSource, ReactiveObserver {\n observers = new Set();\n deps = new Set();\n private subscribers = new Set>();\n private dirty = true;\n private initialized = false;\n private value!: T;\n private equals: Equality;\n\n constructor(private readonly getter: () => T, options: ComputedOptions = {}) {\n this.equals = options.equals || defaultEquals;\n }\n\n read(track = true): T {\n if (track) trackDependency(this);\n if (this.dirty) this.evaluate();\n return this.value;\n }\n\n markDirty(): void {\n if (this.dirty) return;\n const previous = this.value;\n this.dirty = true;\n notifyObservers(this);\n if (this.subscribers.size) {\n const next = this.read(false);\n if (!this.equals(previous, next)) {\n for (const subscriber of Array.from(this.subscribers)) {\n subscriber(next, previous);\n }\n }\n }\n }\n\n subscribe(callback: Subscriber, options: { immediate?: boolean } = {}): Cleanup {\n this.subscribers.add(callback);\n if (options.immediate) {\n const current = this.read(false);\n callback(current, current);\n }\n return () => {\n this.subscribers.delete(callback);\n };\n }\n\n private evaluate(): void {\n cleanupDependencies(this);\n const previousObserver = activeObserver;\n activeObserver = this;\n try {\n this.value = this.getter();\n this.dirty = false;\n this.initialized = true;\n } finally {\n activeObserver = previousObserver;\n }\n }\n}\n\nclass ReactiveEffect implements ReactiveObserver {\n deps = new Set();\n private disposed = false;\n private cleanup?: Cleanup;\n\n constructor(private readonly callback: (onCleanup: (cleanup: Cleanup) => void) => void) {\n this.run();\n }\n\n markDirty(): void {\n if (!this.disposed) queueEffect(this);\n }\n\n run(): void {\n if (this.disposed) return;\n cleanupDependencies(this);\n if (this.cleanup) {\n const cleanup = this.cleanup;\n this.cleanup = undefined;\n cleanup();\n }\n const previousObserver = activeObserver;\n activeObserver = this;\n try {\n this.callback((cleanup) => {\n this.cleanup = cleanup;\n });\n } finally {\n activeObserver = previousObserver;\n }\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n cleanupDependencies(this);\n if (this.cleanup) {\n const cleanup = this.cleanup;\n this.cleanup = undefined;\n cleanup();\n }\n pendingEffects.delete(this);\n }\n}\n\nfunction signal(initialValue: T, options: SignalOptions = {}): Signal {\n const node = new SignalNode(initialValue, options);\n const readWrite = function (next?: T | ((previous: T) => T)): T {\n if (arguments.length === 0) return node.read(true);\n return node.write(next as T | ((previous: T) => T));\n } as Signal;\n readWrite.get = () => node.read(true);\n readWrite.peek = () => node.read(false);\n readWrite.set = (next) => node.write(next);\n readWrite.update = (updater) => node.write(updater);\n readWrite.subscribe = (callback, subscribeOptions) => node.subscribe(callback, subscribeOptions);\n Object.defineProperty(readWrite, \"isSignal\", { value: true });\n return readWrite;\n}\n\nfunction computed(getter: () => T, options: ComputedOptions = {}): ReadonlySignal {\n const node = new ComputedNode(getter, options);\n const read = function (): T {\n return node.read(true);\n } as ReadonlySignal;\n read.get = () => node.read(true);\n read.peek = () => node.read(false);\n read.subscribe = (callback, subscribeOptions) => node.subscribe(callback, subscribeOptions);\n Object.defineProperty(read, \"isSignal\", { value: true });\n return read;\n}\n\nfunction effect(callback: (onCleanup: (cleanup: Cleanup) => void) => void): EffectHandle {\n const runner = new ReactiveEffect(callback);\n const dispose = (() => runner.dispose()) as EffectHandle;\n dispose.dispose = dispose;\n return dispose;\n}\n\nfunction batch(callback: () => T): T {\n batchDepth += 1;\n try {\n return callback();\n } finally {\n batchDepth -= 1;\n flushEffects();\n }\n}\n\nfunction untrack(callback: () => T): T {\n const previousObserver = activeObserver;\n activeObserver = null;\n try {\n return callback();\n } finally {\n activeObserver = previousObserver;\n }\n}\n\nfunction isSignal(value: unknown): value is ReadonlySignal {\n return typeof value === \"function\" && (value as any).isSignal === true;\n}\n\nfunction resolveSignal(value: MaybeSignal): T {\n return isSignal(value) ? value() : value;\n}\n\nfunction configure(options: ItyConfig = {}): void {\n configuredSanitizeHTML = options.sanitizeHTML || undefined;\n}\n\nfunction createConfig(options: ItyConfig = {}): ItyConfig {\n const config: ItyConfig = {};\n if (hasOwn(options, \"sanitizeHTML\")) config.sanitizeHTML = options.sanitizeHTML ?? null;\n return config;\n}\n\nfunction store>(initialValue: T): Store {\n const keys = new Set(Reflect.ownKeys(initialValue));\n const signals = new Map>();\n const structure = signal(0);\n\n const ensureSignal = (key: StoreKey): Signal => {\n if (!signals.has(key)) {\n signals.set(key, signal((initialValue as any)[key]));\n }\n return signals.get(key)!;\n };\n\n const bumpStructure = (): void => {\n structure.update((version) => version + 1);\n };\n\n const setKey = (key: StoreKey, value: any): void => {\n const hadKey = keys.has(key);\n if (!hadKey) keys.add(key);\n ensureSignal(key).set(value);\n if (!hadKey) bumpStructure();\n };\n\n const snapshot = (): T => {\n structure();\n const out: any = {};\n for (const key of keys) {\n out[key] = ensureSignal(key)();\n }\n return out as T;\n };\n\n const api: StoreApi = {\n $patch(patch) {\n const current = snapshot();\n const next = typeof patch === \"function\" ? patch(current) : patch;\n if (!next) return;\n batch(() => {\n for (const key of Reflect.ownKeys(next)) {\n setKey(key, (next as any)[key]);\n }\n });\n },\n $snapshot: snapshot,\n $subscribe(callback, options = {}) {\n let first = true;\n return effect(() => {\n const value = snapshot();\n if (first && !options.immediate) {\n first = false;\n return;\n }\n first = false;\n callback(value);\n });\n }\n };\n\n return new Proxy(api as Store, {\n get(target, key, receiver) {\n if (key in target) return Reflect.get(target, key, receiver);\n return ensureSignal(key)();\n },\n set(_target, key, value) {\n batch(() => {\n setKey(key, value);\n });\n return true;\n },\n deleteProperty(_target, key) {\n if (!keys.has(key)) return true;\n keys.delete(key);\n batch(() => {\n ensureSignal(key).set(undefined);\n bumpStructure();\n });\n return true;\n },\n ownKeys(target) {\n structure();\n return Array.from(new Set([...Reflect.ownKeys(target), ...keys]));\n },\n getOwnPropertyDescriptor(target, key) {\n structure();\n if (Object.prototype.hasOwnProperty.call(target, key)) {\n return { ...Reflect.getOwnPropertyDescriptor(target, key)!, enumerable: false };\n }\n if (!keys.has(key)) return undefined;\n return { enumerable: true, configurable: true };\n },\n has(target, key) {\n structure();\n return key in target || keys.has(key);\n }\n });\n}\n\nfunction resource(\n loader: (context: ResourceContext) => Promise | T,\n options: ResourceOptions = {}\n): Resource {\n const data = signal(options.initialValue);\n const error = signal(null);\n const pending = signal(false);\n const statusValue = signal(options.initialValue === undefined ? \"idle\" : \"success\");\n const loading = computed(() => pending());\n const status = computed(() => statusValue());\n const keepPrevious = options.keepPrevious !== false;\n let controller: AbortController | null = null;\n let refreshId = 0;\n let currentPromise: Promise | null = null;\n\n const api: Resource = {\n data,\n error,\n loading,\n status,\n get promise() {\n return currentPromise;\n },\n refresh() {\n refreshId += 1;\n const id = refreshId;\n if (controller) controller.abort();\n controller = new AbortController();\n const signal = controller.signal;\n const previous = data.peek();\n pending.set(true);\n statusValue.set(\"loading\");\n error.set(null);\n if (!keepPrevious) data.set(undefined);\n\n currentPromise = Promise.resolve()\n .then(() => loader({ signal, previous, refreshId: id }))\n .then((value) => {\n if (id !== refreshId || signal.aborted) return data.peek();\n data.set(value);\n error.set(null);\n statusValue.set(\"success\");\n options.onSuccess?.(value);\n return value;\n })\n .catch((err) => {\n if (id !== refreshId) return data.peek();\n error.set(err as E);\n statusValue.set(\"error\");\n options.onError?.(err as E);\n return data.peek();\n })\n .finally(() => {\n if (id === refreshId) {\n pending.set(false);\n controller = null;\n }\n });\n\n return currentPromise;\n },\n mutate(value) {\n refreshId += 1;\n if (controller) controller.abort();\n controller = null;\n currentPromise = null;\n data.set(value);\n error.set(null);\n pending.set(false);\n statusValue.set(value === undefined ? \"idle\" : \"success\");\n },\n abort(reason?: unknown) {\n if (!controller) return;\n refreshId += 1;\n controller.abort(reason);\n controller = null;\n currentPromise = null;\n pending.set(false);\n statusValue.set(data.peek() === undefined ? \"idle\" : \"success\");\n }\n };\n\n if (options.immediate !== false) {\n api.refresh();\n }\n\n return api;\n}\n\nfunction action(\n handler: (...args: TArgs) => Promise | TResult,\n options: ActionOptions = {}\n): Action {\n const data = signal(undefined);\n const error = signal(null);\n const count = signal(0);\n const statusValue = signal(\"idle\");\n const pending = computed(() => count() > 0);\n const pendingCount = computed(() => count());\n const status = computed(() => statusValue());\n let generation = 0;\n\n const submit = (...args: TArgs): Promise => {\n const runGeneration = generation;\n count.update((value) => value + 1);\n statusValue.set(\"loading\");\n error.set(null);\n\n return Promise.resolve()\n .then(() => handler(...args))\n .then((value) => {\n if (runGeneration === generation) {\n data.set(value);\n error.set(null);\n options.onSuccess?.(value);\n if (count.peek() <= 1) statusValue.set(\"success\");\n }\n return value;\n })\n .catch((err) => {\n if (runGeneration === generation) {\n error.set(err as E);\n options.onError?.(err as E);\n if (count.peek() <= 1) statusValue.set(\"error\");\n }\n throw err;\n })\n .finally(() => {\n if (runGeneration !== generation) return;\n count.update((value) => Math.max(0, value - 1));\n if (count.peek() > 0) statusValue.set(\"loading\");\n });\n };\n\n const callable = ((...args: TArgs) => submit(...args)) as Action;\n const mutableCallable = callable as Action & {\n submit: (...args: TArgs) => Promise;\n run: (...args: TArgs) => void;\n with: (...args: TArgs) => (...eventArgs: unknown[]) => void;\n from: (mapper: (event: TEvent) => TArgs) => (event: TEvent) => void;\n data: Signal;\n error: Signal;\n pending: ReadonlySignal;\n pendingCount: ReadonlySignal;\n status: ReadonlySignal;\n };\n mutableCallable.submit = submit;\n mutableCallable.run = (...args: TArgs) => {\n submit(...args).catch(() => undefined);\n };\n mutableCallable.with = (...args: TArgs) => {\n return () => {\n mutableCallable.run(...args);\n };\n };\n mutableCallable.from = (mapper: (event: TEvent) => TArgs) => {\n return (event: TEvent) => {\n mutableCallable.run(...mapper(event));\n };\n };\n mutableCallable.data = data;\n mutableCallable.error = error;\n mutableCallable.pending = pending;\n mutableCallable.pendingCount = pendingCount;\n mutableCallable.status = status;\n callable.reset = () => {\n generation += 1;\n data.set(undefined);\n error.set(null);\n count.set(0);\n statusValue.set(\"idle\");\n };\n return callable;\n}\n\nfunction getFormElementCtor(node: Element | null): typeof HTMLFormElement | undefined {\n const ownerWindow = node?.ownerDocument?.defaultView as (Window & typeof globalThis) | null | undefined;\n return ownerWindow?.HTMLFormElement\n || getWindow()?.HTMLFormElement\n || (typeof HTMLFormElement !== \"undefined\" ? HTMLFormElement : undefined);\n}\n\nfunction isFormElement(node: Element | null | undefined, fallbackNode?: Element | null): node is HTMLFormElement {\n const FormElement = node ? getFormElementCtor(node) : getFormElementCtor(fallbackNode || null);\n return Boolean(node && FormElement && node instanceof FormElement);\n}\n\nfunction findFormElement(event: Event): HTMLFormElement {\n const target = (event.currentTarget || event.target) as Element | null;\n if (!getFormElementCtor(target)) throw new Error(\"Ity.form requires HTMLFormElement support\");\n if (isFormElement(target, target)) return target;\n const closest = target?.closest?.(\"form\");\n if (isFormElement(closest, target)) return closest;\n throw new Error(\"Ity.form onSubmit requires a form event target\");\n}\n\nfunction createFormDataForElement(formElement: HTMLFormElement): FormData {\n const ownerWindow = formElement.ownerDocument?.defaultView as (Window & typeof globalThis) | null | undefined;\n const FormDataCtor = ownerWindow?.FormData\n || getWindow()?.FormData\n || (typeof FormData !== \"undefined\" ? FormData : undefined);\n if (!FormDataCtor) throw new Error(\"Ity.form requires FormData support\");\n return new FormDataCtor(formElement);\n}\n\nfunction form(\n handler: (data: FormData, event: Event) => Promise | TResult,\n options: FormOptions = {}\n): FormController {\n const submitAction = action<[FormData, Event], TResult, E>(handler, options);\n\n const onSubmit = async (event: Event): Promise => {\n event.preventDefault();\n const formElement = findFormElement(event);\n const result = await submitAction(createFormDataForElement(formElement), event);\n if (options.resetOnSuccess) formElement.reset();\n return result;\n };\n\n return {\n action: submitAction,\n data: submitAction.data,\n error: submitAction.error,\n pending: submitAction.pending,\n status: submitAction.status,\n onSubmit,\n handleSubmit(event: Event): void {\n onSubmit(event).catch(() => undefined);\n },\n reset() {\n submitAction.reset();\n }\n };\n}\n\nfunction replaceStoreSnapshot>(target: Store, nextValue: Partial): void {\n const current = target.$snapshot() as Record;\n batch(() => {\n for (const key of Reflect.ownKeys(current)) {\n if (!hasOwn(nextValue as object, key)) delete (target as any)[key];\n }\n for (const key of Reflect.ownKeys(nextValue)) {\n (target as any)[key] = (nextValue as any)[key];\n }\n });\n}\n\nfunction formState>(\n initialValue: TValues,\n options: FormStateOptions = {}\n): FormState {\n const values = store(cloneValue(initialValue));\n const initialValues = signal(cloneValue(initialValue));\n const errors = store({} as FormErrorMap);\n const touched = store({} as Partial, boolean>>);\n const registeredBindings = new Map, Map>>();\n\n const allFieldNames = (): Array> => {\n const names = new Set();\n Reflect.ownKeys(initialValues.peek()).forEach((key) => names.add(String(key)));\n Reflect.ownKeys(values.$snapshot()).forEach((key) => names.add(String(key)));\n return Array.from(names) as Array>;\n };\n\n const computeErrors = (snapshot: TValues): FormErrorMap => {\n const out: FormErrorMap = {};\n const validators = options.validators || {};\n for (const key of allFieldNames()) {\n const validator = (validators as any)[key] as ((value: TValues[keyof TValues], values: TValues) => string | null | undefined) | undefined;\n if (!validator) continue;\n const message = validator((snapshot as any)[key], snapshot);\n if (message) out[key] = message;\n }\n const formErrors = options.validate?.(snapshot);\n if (formErrors) {\n for (const key of Reflect.ownKeys(formErrors)) {\n const message = (formErrors as any)[key];\n if (message) (out as any)[key] = message;\n }\n }\n return out;\n };\n\n const syncErrors = (): boolean => {\n const nextErrors = computeErrors(values.$snapshot());\n replaceStoreSnapshot(errors as any, nextErrors);\n return Reflect.ownKeys(nextErrors).length === 0;\n };\n\n const markTouched = (names?: readonly (keyof TValues)[]): void => {\n const keys = names?.length\n ? names.map((name) => String(name))\n : allFieldNames();\n batch(() => {\n for (const key of keys) {\n (touched as any)[key] = true;\n }\n });\n };\n\n const maybeValidateTouched = (): void => {\n const touchedSnapshot = touched.$snapshot();\n if (Reflect.ownKeys(touchedSnapshot).some((key) => Boolean((touchedSnapshot as any)[key]))) {\n syncErrors();\n }\n };\n\n const set = (next: Partial | ((current: TValues) => Partial | void)): void => {\n values.$patch((current) => {\n const patch = typeof next === \"function\" ? next(current) : next;\n return patch || {};\n });\n maybeValidateTouched();\n };\n\n const reset = (next?: Partial | TValues): void => {\n const base = cloneValue(next\n ? { ...initialValues.peek(), ...(next as any) }\n : initialValues.peek());\n initialValues.set(cloneValue(base));\n replaceStoreSnapshot(values as any, base);\n replaceStoreSnapshot(errors as any, {});\n replaceStoreSnapshot(touched as any, {});\n };\n\n const createFieldSignal = (name: K): Signal => {\n const signalLike = function (next?: TValues[K] | ((previous: TValues[K]) => TValues[K])): TValues[K] {\n if (arguments.length === 0) return (values as any)[name];\n const previous = (values as any)[name];\n const resolved = typeof next === \"function\"\n ? (next as (previous: TValues[K]) => TValues[K])(previous)\n : next;\n (values as any)[name] = resolved;\n maybeValidateTouched();\n return resolved as TValues[K];\n } as Signal;\n signalLike.get = () => (values as any)[name];\n signalLike.peek = () => untrack(() => (values as any)[name]);\n signalLike.set = (next) => signalLike(next);\n signalLike.update = (updater) => signalLike(updater);\n signalLike.subscribe = (callback, subscribeOptions = {}) => {\n let first = true;\n let previous = signalLike.peek();\n return effect(() => {\n const current = (values as any)[name];\n if (first) {\n first = false;\n previous = current;\n if (subscribeOptions.immediate) callback(current, current);\n return;\n }\n if (!Object.is(previous, current)) {\n const prev = previous;\n previous = current;\n callback(current, prev);\n }\n });\n };\n Object.defineProperty(signalLike, \"isSignal\", { value: true });\n return signalLike;\n };\n\n const registerBinding = (\n name: K,\n domName: string,\n type: RegisteredFormBinding[\"type\"],\n bindOptions: FormBindOptions\n ): void => {\n const fieldName = String(name) as Extract;\n const fieldBindings = registeredBindings.get(fieldName) || new Map>();\n const signature = `${domName}|${type}|${String(bindOptions.value)}`;\n fieldBindings.set(signature, {\n domName,\n type,\n value: bindOptions.value,\n parse: bindOptions.parse\n });\n registeredBindings.set(fieldName, fieldBindings as Map>);\n };\n\n const syncFromForm = (event: Event): void => {\n const NO_FORM_VALUE = Symbol(\"ity.formState.noValue\");\n let formElement: HTMLFormElement;\n try {\n formElement = findFormElement(event);\n } catch (_error) {\n return;\n }\n const formData = createFormDataForElement(formElement);\n const controls = Array.from((formElement as any).elements || []) as Array<{ name?: string; value?: string; checked?: boolean }>;\n const patch: Partial = {};\n\n const resolveControlValue = (\n name: K,\n bindings: RegisteredFormBinding[]\n ): TValues[K] | typeof NO_FORM_VALUE => {\n const primary = bindings[0];\n if (!primary) return NO_FORM_VALUE;\n const domName = primary.domName;\n const namedControls = controls.filter((control) => control && control.name === domName);\n if (primary.parse && namedControls.length) {\n const parseTarget = primary.type === \"radio\"\n ? namedControls.find((control) => Boolean(control.checked)) || namedControls[0]\n : namedControls[0];\n return primary.parse(parseTarget, event);\n }\n if (primary.type === \"checkbox\") {\n const currentValue = (values as any)[name];\n if (Array.isArray(currentValue) || bindings.some((binding) => binding.value !== undefined) || namedControls.length > 1) {\n const selected: unknown[] = [];\n for (const control of namedControls) {\n if (!control.checked) continue;\n const matched = bindings.find((binding) => String(binding.value ?? control.value ?? \"\") === String(control.value ?? \"\"));\n selected.push(matched?.value ?? control.value ?? \"\");\n }\n return selected as TValues[K];\n }\n return formData.has(domName) as TValues[K];\n }\n if (primary.type === \"radio\") {\n return (formData.get(domName) ?? (values as any)[name]) as TValues[K];\n }\n if (primary.type === \"select-multiple\") {\n const select = namedControls[0] as HTMLSelectElement | undefined;\n if (select?.selectedOptions) {\n return Array.from(select.selectedOptions).map((option) => option.value) as TValues[K];\n }\n return formData.getAll(domName) as TValues[K];\n }\n if (primary.type === \"number\") {\n const raw = formData.get(domName);\n return (raw === null || raw === \"\" ? undefined : Number(raw)) as TValues[K];\n }\n const raw = formData.get(domName);\n return (raw === null ? \"\" : raw) as TValues[K];\n };\n\n for (const fieldName of allFieldNames()) {\n const bindings = Array.from(registeredBindings.get(fieldName)?.values() || []) as RegisteredFormBinding]>[];\n const nextValue = resolveControlValue(fieldName, bindings as RegisteredFormBinding[]);\n if (nextValue !== NO_FORM_VALUE) {\n (patch as any)[fieldName] = nextValue;\n }\n }\n\n if (Reflect.ownKeys(patch).length) {\n values.$patch(() => patch);\n }\n };\n\n const bind = (name: K, bindOptions: FormBindOptions = {}): Record => {\n const field = api.field(name);\n const type = bindOptions.type || \"text\";\n const eventName = bindOptions.event\n || (type === \"checkbox\" || type === \"radio\" || type === \"select\" || type === \"select-multiple\" ? \"change\" : \"input\");\n const domName = bindOptions.name || String(name);\n registerBinding(name, domName, type, bindOptions);\n const formattedValue = bindOptions.format ? bindOptions.format(field.value()) : field.value();\n const parseValue = (event: Event): TValues[K] => {\n if (bindOptions.parse) {\n return bindOptions.parse((event.currentTarget || event.target) as unknown, event);\n }\n const target = (event.currentTarget || event.target) as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | null;\n if (!target) return field.value();\n if (type === \"checkbox\") {\n if (Array.isArray(field.value())) {\n const optionValue = bindOptions.value ?? target.value;\n const current = field.value() as unknown[];\n return ((target as HTMLInputElement).checked\n ? Array.from(new Set([...current, optionValue]))\n : current.filter((item) => !Object.is(item, optionValue))) as TValues[K];\n }\n return Boolean((target as HTMLInputElement).checked) as TValues[K];\n }\n if (type === \"radio\") {\n if (!(target as HTMLInputElement).checked) return field.value();\n return (bindOptions.value ?? (target as HTMLInputElement).value) as TValues[K];\n }\n if (type === \"select-multiple\") {\n return Array.from((target as HTMLSelectElement).selectedOptions).map((option) => option.value) as TValues[K];\n }\n if (type === \"number\") {\n const raw = target.value;\n return (raw === \"\" ? (undefined as any) : Number(raw)) as TValues[K];\n }\n return target.value as TValues[K];\n };\n\n const binding: Record = {\n name: domName,\n [`@${eventName}`]: (event: Event) => {\n field.set(parseValue(event));\n },\n \"@blur\": () => {\n markTouched([name]);\n syncErrors();\n }\n };\n\n if (type === \"checkbox\") {\n if (Array.isArray(field.value())) {\n const optionValue = bindOptions.value;\n binding.value = optionValue === undefined ? \"\" : String(optionValue);\n binding[\".checked\"] = computed(() => (field.value() as unknown[]).some((item) => Object.is(item, optionValue)));\n } else {\n binding[\".checked\"] = computed(() => Boolean(field.value()));\n binding.checked = Boolean(field.value());\n }\n return binding;\n }\n\n if (type === \"radio\") {\n const optionValue = bindOptions.value;\n binding.value = optionValue === undefined ? \"\" : String(optionValue);\n binding[\".checked\"] = computed(() => Object.is(field.value(), optionValue));\n return binding;\n }\n\n if (type === \"select-multiple\") {\n binding[\".value\"] = formattedValue as any;\n return binding;\n }\n\n const stringValue = formattedValue === undefined || formattedValue === null ? \"\" : String(formattedValue);\n binding[\".value\"] = stringValue;\n binding.value = stringValue;\n return binding;\n };\n\n const api: FormState = {\n values,\n initialValues,\n errors,\n touched,\n dirty: computed(() => !deepEqual(values.$snapshot(), initialValues())),\n valid: computed(() => Reflect.ownKeys(errors.$snapshot()).length === 0),\n field(name: K): FormField {\n const valueSignal = createFieldSignal(name);\n return {\n value: valueSignal,\n error: computed(() => (errors as any)[name] || null),\n touched: computed(() => Boolean((touched as any)[name])),\n dirty: computed(() => !deepEqual((values as any)[name], (initialValues() as any)[name])),\n bind(optionsForField?: FormBindOptions): Record {\n return bind(name, optionsForField);\n },\n set(next) {\n return valueSignal.set(next);\n },\n reset() {\n valueSignal.set((initialValues.peek() as any)[name]);\n delete (errors as any)[name];\n delete (touched as any)[name];\n }\n };\n },\n bind,\n set,\n reset,\n validate(): boolean {\n return syncErrors();\n },\n markTouched,\n submit(\n handler: (snapshot: TValues, event: Event) => Promise | TResult,\n submitOptions: FormStateSubmitOptions = {}\n ): FormStateController {\n const submitAction = action<[TValues, Event], TResult, E>(handler, submitOptions);\n const onSubmit = async (event: Event): Promise => {\n event.preventDefault();\n syncFromForm(event);\n markTouched();\n if (!syncErrors()) return undefined;\n const result = await submitAction(cloneValue(values.$snapshot()), event);\n if (submitOptions.resetOnSuccess) api.reset();\n return result;\n };\n\n return {\n state: api,\n action: submitAction,\n data: submitAction.data,\n error: submitAction.error,\n pending: submitAction.pending,\n status: submitAction.status,\n onSubmit,\n handleSubmit(event: Event): void {\n onSubmit(event).catch(() => undefined);\n },\n reset(): void {\n submitAction.reset();\n api.reset();\n }\n };\n }\n };\n\n return api;\n}\n\nfunction html(strings: TemplateStringsArray | readonly string[], ...values: unknown[]): TemplateResult {\n return {\n isTemplateResult: true,\n strings: Array.from(strings),\n values\n };\n}\n\nfunction unsafeHTML(value: string, options: UnsafeHTMLOptions = {}): UnsafeHTML {\n const sanitizer = resolveSanitizeHTML(options);\n return {\n isUnsafeHTML: true,\n value: sanitizer ? sanitizer(String(value)) : String(value)\n };\n}\n\nfunction isTemplateResult(value: unknown): value is TemplateResult {\n return !!value && typeof value === \"object\" && (value as TemplateResult).isTemplateResult === true;\n}\n\nfunction isUnsafeHTML(value: unknown): value is UnsafeHTML {\n return !!value && typeof value === \"object\" && (value as UnsafeHTML).isUnsafeHTML === true;\n}\n\nfunction isNodeLike(value: unknown): value is Node {\n return !!value && typeof value === \"object\" && typeof (value as Node).nodeType === \"number\";\n}\n\nfunction documentOrThrow(): Document {\n const doc = getDocument();\n if (!doc) throw new Error(\"Ity DOM rendering requires a document\");\n return doc;\n}\n\nfunction normalizeValue(value: unknown): unknown {\n return isSignal(value) ? value() : value;\n}\n\nfunction valueToFragment(value: unknown, doc: Document = documentOrThrow()): DocumentFragment {\n const fragment = doc.createDocumentFragment();\n appendValue(fragment, normalizeValue(value), doc);\n return fragment;\n}\n\nfunction appendValue(parent: Node, value: unknown, doc: Document): void {\n value = normalizeValue(value);\n if (value === null || value === undefined || value === false) return;\n if (Array.isArray(value)) {\n for (const item of value) appendValue(parent, item, doc);\n return;\n }\n if (isTemplateResult(value)) {\n parent.appendChild(materializeTemplate(value, doc));\n return;\n }\n if (isUnsafeHTML(value)) {\n const template = doc.createElement(\"template\");\n template.innerHTML = value.value;\n parent.appendChild(template.content.cloneNode(true));\n return;\n }\n if (isNodeLike(value)) {\n parent.appendChild(value);\n return;\n }\n parent.appendChild(doc.createTextNode(String(value)));\n}\n\ninterface Binding {\n index: number;\n kind: \"node\" | \"event\" | \"attr\" | \"prop\" | \"bool\";\n name?: string;\n}\n\nfunction bindingFromName(rawName: string): Pick {\n const first = rawName[0];\n const kind = first === \"@\" ? \"event\" : first === \".\" ? \"prop\" : first === \"?\" ? \"bool\" : \"attr\";\n const name = kind === \"attr\" ? rawName : rawName.slice(1);\n return { kind, name };\n}\n\nfunction materializeTemplate(result: TemplateResult, doc: Document = documentOrThrow()): DocumentFragment {\n const bindings: Binding[] = [];\n let source = \"\";\n\n for (let i = 0; i < result.values.length; i += 1) {\n const part = result.strings[i] ?? \"\";\n const attrMatch = part.match(/([@.?]?[\\w:-]+)\\s*=\\s*$/);\n if (attrMatch) {\n const rawName = attrMatch[1];\n const before = part.slice(0, part.length - attrMatch[0].length);\n const marker = `data-ity-bind-${i}`;\n const { kind, name } = bindingFromName(rawName);\n bindings.push({ index: i, kind, name });\n source += `${before}${marker}=\"\"`;\n } else {\n bindings.push({ index: i, kind: \"node\" });\n source += `${part}`;\n }\n }\n source += result.strings[result.strings.length - 1] ?? \"\";\n\n const template = doc.createElement(\"template\");\n template.innerHTML = source;\n const fragment = template.content.cloneNode(true) as DocumentFragment;\n applyBindings(fragment, bindings, result.values, doc);\n return fragment;\n}\n\nfunction applyBindings(root: DocumentFragment, bindings: Binding[], values: readonly unknown[], doc: Document): void {\n const comments = new Map();\n const walker = doc.createTreeWalker(root, 128);\n let current = walker.nextNode();\n while (current) {\n const comment = current as Comment;\n const match = comment.data.match(/^ity:(\\d+)$/);\n if (match) {\n const index = Number(match[1]);\n const list = comments.get(index) || [];\n list.push(comment);\n comments.set(index, list);\n }\n current = walker.nextNode();\n }\n\n for (const binding of bindings) {\n const value = normalizeValue(values[binding.index]);\n if (binding.kind === \"node\") {\n const markers = comments.get(binding.index) || [];\n for (const marker of markers) {\n marker.replaceWith(valueToFragment(value, doc));\n }\n continue;\n }\n\n const attrName = `data-ity-bind-${binding.index}`;\n const elements = Array.from(root.querySelectorAll(`[${attrName}]`)) as HTMLElement[];\n for (const element of elements) {\n element.removeAttribute(attrName);\n applyElementBinding(element, binding, value);\n }\n }\n}\n\nfunction applyElementBinding(element: HTMLElement, binding: Binding, value: unknown): void {\n const name = binding.name || \"\";\n if (binding.kind === \"attr\" && name === \"bind\" && isPlainObject(value)) {\n for (const key of Reflect.ownKeys(value)) {\n const entryValue = normalizeValue((value as any)[key]);\n const entry = bindingFromName(String(key));\n applyElementBinding(element, { index: binding.index, ...entry }, entryValue);\n }\n return;\n }\n\n if (binding.kind === \"event\") {\n if (typeof value === \"function\") {\n element.addEventListener(name, value as EventListener);\n } else if (Array.isArray(value) && typeof value[0] === \"function\") {\n element.addEventListener(name, value[0] as EventListener, value[1] as AddEventListenerOptions);\n }\n return;\n }\n\n if (binding.kind === \"prop\") {\n if (name === \"value\" && Array.isArray(value) && element.tagName === \"SELECT\" && (element as HTMLSelectElement).multiple) {\n const selectedValues = new Set(value.map((entry) => String(entry)));\n Array.from((element as HTMLSelectElement).options).forEach((option) => {\n option.selected = selectedValues.has(option.value);\n });\n return;\n }\n (element as any)[name] = value;\n return;\n }\n\n if (binding.kind === \"bool\") {\n element.toggleAttribute(name, Boolean(value));\n return;\n }\n\n if (value === false || value === null || value === undefined) {\n element.removeAttribute(name);\n return;\n }\n\n if (name === \"class\" && Array.isArray(value)) {\n element.setAttribute(\"class\", value.filter(Boolean).join(\" \"));\n return;\n }\n\n if (name === \"class\" && typeof value === \"object\") {\n const classes = Object.keys(value as Record).filter((key) => Boolean((value as any)[key]));\n element.setAttribute(\"class\", classes.join(\" \"));\n return;\n }\n\n if (name === \"style\" && typeof value === \"object\" && value !== null) {\n Object.assign((element as HTMLElement).style, value);\n return;\n }\n\n element.setAttribute(name, value === true ? \"\" : String(value));\n}\n\nfunction resolveTarget(target: string | Element | DocumentFragment | SelectorObject): Element | DocumentFragment {\n if (typeof target === \"string\") {\n const found = documentOrThrow().querySelector(target);\n if (!found) throw new Error(`Render target not found: ${target}`);\n return found;\n }\n if ((target as SelectorObject)?.isSelectorObject) {\n const first = (target as SelectorObject).first()[0];\n if (!first) throw new Error(\"Cannot render into an empty SelectorObject\");\n return first;\n }\n return target as Element | DocumentFragment;\n}\n\nfunction replaceChildren(target: Element | DocumentFragment, fragment: DocumentFragment): void {\n const maybeTarget = target as any;\n if (typeof maybeTarget.replaceChildren === \"function\") {\n maybeTarget.replaceChildren(fragment);\n return;\n }\n while (target.firstChild) target.removeChild(target.firstChild);\n target.appendChild(fragment);\n}\n\nfunction withViewTransition(update: () => void, enabled: boolean | undefined): void {\n const doc = getDocument() as any;\n if (enabled && doc && typeof doc.startViewTransition === \"function\") {\n doc.startViewTransition(update);\n } else {\n update();\n }\n}\n\nfunction render(\n view: TemplateValue | (() => TemplateValue),\n target: string | Element | DocumentFragment | SelectorObject,\n options: RenderOptions = {}\n): Cleanup {\n const mount = resolveTarget(target);\n const update = () => {\n withConfig(options.config, () => {\n const value = typeof view === \"function\" && !isSignal(view)\n ? (view as () => TemplateValue)()\n : normalizeValue(view);\n withViewTransition(() => replaceChildren(mount, valueToFragment(value)), options.transition);\n });\n };\n\n if (options.reactive === false) {\n update();\n return () => undefined;\n }\n\n return effect(update);\n}\n\nfunction renderToString(view: TemplateValue | (() => TemplateValue), options: RenderToStringOptions = {}): string {\n return withConfig(options.config, () => {\n const value = typeof view === \"function\" && !isSignal(view)\n ? (view as () => TemplateValue)()\n : normalizeValue(view);\n return valueToString(value);\n });\n}\n\nfunction valueToString(value: unknown): string {\n value = normalizeValue(value);\n if (value === null || value === undefined || value === false) return \"\";\n if (Array.isArray(value)) return value.map(valueToString).join(\"\");\n if (isTemplateResult(value)) return templateToString(value);\n if (isUnsafeHTML(value)) return value.value;\n if (isNodeLike(value)) {\n const node = value as any;\n if (typeof node.outerHTML === \"string\") return node.outerHTML;\n return escapeHTML(node.textContent || \"\");\n }\n return escapeHTML(String(value));\n}\n\nfunction templateToString(result: TemplateResult): string {\n let source = \"\";\n for (let i = 0; i < result.values.length; i += 1) {\n const part = result.strings[i] ?? \"\";\n const attrMatch = part.match(/([@.?]?[\\w:-]+)\\s*=\\s*$/);\n const value = normalizeValue(result.values[i]);\n if (attrMatch) {\n const rawName = attrMatch[1];\n const before = part.slice(0, part.length - attrMatch[0].length);\n const { kind, name } = bindingFromName(rawName);\n if (kind === \"attr\" && name === \"bind\" && isPlainObject(value)) {\n const serialized: string[] = [];\n for (const key of Reflect.ownKeys(value)) {\n const entryValue = normalizeValue((value as any)[key]);\n const entry = bindingFromName(String(key));\n const entryName = entry.name || \"\";\n if (entry.kind === \"event\" || entryValue === false || entryValue === null || entryValue === undefined) continue;\n if (entry.kind === \"bool\") {\n if (entryValue) serialized.push(entryName);\n continue;\n }\n if (entry.kind === \"prop\") {\n if (entryName === \"value\") {\n serialized.push(`value=\"${escapeAttribute(String(entryValue))}\"`);\n } else if ((entryName === \"checked\" || entryName === \"selected\") && entryValue) {\n serialized.push(entryName);\n }\n continue;\n }\n serialized.push(`${entryName}=\"${escapeAttribute(stringifyAttribute(entryName, entryValue))}\"`);\n }\n source += serialized.length ? `${before}${serialized.join(\" \")}` : before;\n continue;\n }\n if (kind === \"event\" || kind === \"prop\" || value === false || value === null || value === undefined) {\n source += before;\n } else if (kind === \"bool\") {\n source += value ? `${before}${name}` : before;\n } else {\n source += `${before}${name || \"\"}=\"${escapeAttribute(stringifyAttribute(name || \"\", value))}\"`;\n }\n } else {\n source += part + valueToString(value);\n }\n }\n source += result.strings[result.strings.length - 1] ?? \"\";\n return source;\n}\n\nfunction stringifyAttribute(name: string, value: unknown): string {\n if (name === \"class\" && Array.isArray(value)) return value.filter(Boolean).join(\" \");\n if (name === \"class\" && typeof value === \"object\" && value !== null) {\n return Object.keys(value as Record).filter((key) => Boolean((value as any)[key])).join(\" \");\n }\n if (name === \"style\" && typeof value === \"object\" && value !== null) {\n return Object.keys(value as Record)\n .map((key) => `${key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`)}:${(value as any)[key]}`)\n .join(\";\");\n }\n return value === true ? \"\" : String(value);\n}\n\nfunction escapeHTML(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(//g, \">\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeHTML(value)\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\ninterface ComponentContext {\n host: HTMLElement;\n root: HTMLElement | ShadowRoot;\n attr(name: string): ReadonlySignal;\n prop(name: string): ReadonlySignal;\n emit(name: string, detail?: T, options?: CustomEventInit): boolean;\n effect(callback: (onCleanup: (cleanup: Cleanup) => void) => void): EffectHandle;\n onConnected(callback: () => void): void;\n onDisconnected(callback: () => void): void;\n}\n\ntype ComponentRender = TemplateValue | (() => TemplateValue);\ntype ComponentSetup = (ctx: ComponentContext) => ComponentRender | void;\n\ninterface ComponentOptions {\n attrs?: string[];\n observedAttributes?: string[];\n props?: string[];\n shadow?: boolean | ShadowRootMode | ShadowRootInit;\n styles?: string;\n config?: ItyConfig | null;\n setup?: ComponentSetup;\n}\n\nfunction component(\n name: string,\n setupOrOptions: ComponentSetup | ComponentOptions,\n maybeOptions: Omit = {}\n): CustomElementConstructor {\n const win = getWindow();\n if (!win?.customElements || !win.HTMLElement) {\n throw new Error(\"Ity.component requires Custom Elements support\");\n }\n\n if (win.customElements.get(name)) {\n return win.customElements.get(name)!;\n }\n\n const definition: ComponentOptions = typeof setupOrOptions === \"function\"\n ? { ...maybeOptions, setup: setupOrOptions }\n : setupOrOptions;\n const attrs = definition.observedAttributes || definition.attrs || [];\n const props = definition.props || [];\n\n class ItyElement extends win.HTMLElement {\n static get observedAttributes(): string[] {\n return attrs;\n }\n\n private attrSignals = new Map>();\n private propSignals = new Map>();\n private connectedCallbacks: Cleanup[] = [];\n private disconnectedCallbacks: Cleanup[] = [];\n private effectRecords: Array<{\n callback: (onCleanup: (cleanup: Cleanup) => void) => void;\n handle?: EffectHandle;\n disposed: boolean;\n }> = [];\n private renderCleanup?: Cleanup;\n private mount?: HTMLElement | ShadowRoot;\n private renderTarget?: HTMLElement | ShadowRoot;\n private renderOutput?: ComponentRender;\n private initialized = false;\n private connected = false;\n\n connectedCallback(): void {\n this.ensureMount();\n for (const prop of props) this.upgradeProperty(prop);\n if (!this.initialized) {\n this.initialized = true;\n const ctx = this.createContext();\n const output = definition.setup?.(ctx);\n if (output !== undefined) {\n this.renderOutput = output as ComponentRender;\n }\n }\n this.connected = true;\n this.startRender();\n this.startEffects();\n for (const callback of this.connectedCallbacks) callback();\n }\n\n disconnectedCallback(): void {\n this.connected = false;\n if (this.renderCleanup) {\n this.renderCleanup();\n this.renderCleanup = undefined;\n }\n for (const record of this.effectRecords) {\n record.handle?.dispose();\n record.handle = undefined;\n }\n for (const callback of this.disconnectedCallbacks) callback();\n }\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\n this.ensureAttrSignal(name).set(newValue);\n }\n\n private ensureMount(): void {\n if (this.mount && this.renderTarget) return;\n const shadow = definition.shadow;\n if (shadow === false) {\n this.mount = this;\n } else {\n const init: ShadowRootInit = typeof shadow === \"object\"\n ? shadow\n : { mode: shadow === \"closed\" ? \"closed\" : \"open\" };\n this.mount = this.shadowRoot || this.attachShadow(init);\n }\n\n if (definition.styles) {\n const doc = this.ownerDocument;\n const style = doc.createElement(\"style\");\n style.textContent = definition.styles;\n const container = doc.createElement(\"span\");\n container.setAttribute(\"data-ity-component-root\", \"\");\n this.mount.appendChild(style);\n this.mount.appendChild(container);\n this.renderTarget = container;\n } else {\n this.renderTarget = this.mount;\n }\n }\n\n private startRender(): void {\n if (this.renderCleanup || this.renderOutput === undefined) return;\n this.renderCleanup = render(this.renderOutput, this.renderTarget!, {\n transition: false,\n config: definition.config\n });\n }\n\n private startEffects(): void {\n for (const record of this.effectRecords) {\n if (!record.disposed && !record.handle) {\n record.handle = effect(record.callback);\n }\n }\n }\n\n private ensureAttrSignal(name: string): Signal {\n if (!this.attrSignals.has(name)) {\n this.attrSignals.set(name, signal(this.getAttribute(name)));\n }\n return this.attrSignals.get(name)!;\n }\n\n private ensurePropSignal(name: string): Signal {\n if (!this.propSignals.has(name)) {\n this.propSignals.set(name, signal(undefined as unknown) as Signal);\n }\n return this.propSignals.get(name)! as Signal;\n }\n\n private upgradeProperty(name: string): void {\n if (!hasOwn(this, name)) return;\n const value = (this as any)[name];\n delete (this as any)[name];\n (this as any)[name] = value;\n }\n\n private createContext(): ComponentContext {\n return {\n host: this,\n root: this.mount!,\n attr: (name) => this.ensureAttrSignal(name),\n prop: (name: string) => this.ensurePropSignal(name),\n emit: (name, detail, options = {}) => this.dispatchEvent(new CustomEvent(name, {\n bubbles: true,\n composed: true,\n ...options,\n detail\n })),\n effect: (callback) => {\n const record = { callback, disposed: false, handle: undefined as EffectHandle | undefined };\n this.effectRecords.push(record);\n if (this.connected) record.handle = effect(callback);\n const dispose = (() => {\n record.disposed = true;\n record.handle?.dispose();\n record.handle = undefined;\n }) as EffectHandle;\n dispose.dispose = dispose;\n return dispose;\n },\n onConnected: (callback) => {\n this.connectedCallbacks.push(callback);\n },\n onDisconnected: (callback) => {\n this.disconnectedCallbacks.push(callback);\n }\n };\n }\n }\n\n for (const prop of props) {\n Object.defineProperty(ItyElement.prototype, prop, {\n configurable: true,\n enumerable: true,\n get(this: any) {\n return this.ensurePropSignal(prop).peek();\n },\n set(this: any, value: unknown) {\n this.ensurePropSignal(prop).set(typeof value === \"function\" ? (() => value) as any : value);\n }\n });\n }\n\n win.customElements.define(name, ItyElement);\n return ItyElement;\n}\n\ninterface EventRecord {\n callback: (data?: unknown) => void;\n ctx: any;\n}\n\nclass Evented {\n private _events: Record = {};\n\n on(evtName: string, callback: (data?: unknown) => void, context: any = this): void {\n (this._events[evtName] ||= []).push({ callback, ctx: context });\n }\n\n off(evtName?: string, callback?: (data?: unknown) => void, context?: any): void {\n if (!evtName) {\n this._events = {};\n return;\n }\n const events = this._events[evtName];\n if (!events) return;\n if (!callback) {\n delete this._events[evtName];\n return;\n }\n for (let i = events.length - 1; i >= 0; i -= 1) {\n const event = events[i];\n if (event.callback === callback && (context === undefined || event.ctx === context)) {\n events.splice(i, 1);\n }\n }\n if (events.length === 0) delete this._events[evtName];\n }\n\n trigger(evtName: string, data?: unknown): void {\n const events = this._events[evtName];\n if (!events) return;\n for (const event of events.slice()) {\n event.callback.call(event.ctx, data);\n }\n }\n}\n\nconst regexps = {\n nospaces: /^\\S*$/\n} as const;\n\nclass SelectorObject {\n [index: number]: HTMLElement;\n public readonly isSelectorObject = true;\n private nodes: HTMLElement[] = [];\n\n constructor(nodeList: ArrayLike = []) {\n this.nodes = Array.from(nodeList as HTMLElement[]);\n this.reindex();\n }\n\n get length(): number {\n return this.nodes.length;\n }\n\n [Symbol.iterator](): Iterator {\n return this.nodes[Symbol.iterator]();\n }\n\n toArray(): HTMLElement[] {\n return this.nodes.slice();\n }\n\n find(selector: string): SelectorObject {\n const nodeList: HTMLElement[] = [];\n for (const node of this.nodes) {\n const list = node.querySelectorAll(selector);\n for (const thisNode of Array.from(list)) {\n const elm = thisNode as HTMLElement;\n if (nodeList.indexOf(elm) < 0) nodeList.push(elm);\n }\n }\n return new SelectorObject(nodeList);\n }\n\n filter(selector: string): SelectorObject {\n return new SelectorObject(this.nodes.filter((node) => node.matches(selector)));\n }\n\n first(): SelectorObject {\n return new SelectorObject(this.nodes[0] ? [this.nodes[0]] : []);\n }\n\n last(): SelectorObject {\n return new SelectorObject(this.nodes.length ? [this.nodes[this.nodes.length - 1]] : []);\n }\n\n parent(): SelectorObject {\n const nodeList: HTMLElement[] = [];\n for (const node of this.nodes) {\n const parent = node.parentElement;\n if (parent && nodeList.indexOf(parent) < 0) nodeList.push(parent);\n }\n return new SelectorObject(nodeList);\n }\n\n children(selector?: string): SelectorObject {\n const nodeList: HTMLElement[] = [];\n for (const node of this.nodes) {\n for (const child of Array.from(node.children) as HTMLElement[]) {\n if (nodeList.indexOf(child) < 0 && (!selector || child.matches(selector))) {\n nodeList.push(child);\n }\n }\n }\n return new SelectorObject(nodeList);\n }\n\n remove(): SelectorObject {\n for (const node of this.nodes) node.remove();\n return new SelectorObject([]);\n }\n\n addClass(...classes: string[]): this {\n for (const node of this.nodes) node.classList.add(...classes);\n return this;\n }\n\n removeClass(value: string): this {\n if (value && regexps.nospaces.test(value)) {\n for (const node of this.nodes) node.classList.remove(value);\n }\n return this;\n }\n\n toggleClass(value: string): this {\n if (value && regexps.nospaces.test(value)) {\n for (const node of this.nodes) node.classList.toggle(value);\n }\n return this;\n }\n\n hasClass(value: string): boolean {\n return Boolean(value && regexps.nospaces.test(value) && this.nodes.some((node) => node.classList.contains(value)));\n }\n\n attr(name: string, value?: string | number | boolean | null): string | null | this {\n if (arguments.length === 1) return this.nodes[0]?.getAttribute(name) ?? null;\n for (const node of this.nodes) {\n if (value === null || value === false || value === undefined) node.removeAttribute(name);\n else node.setAttribute(name, value === true ? \"\" : String(value));\n }\n return this;\n }\n\n text(value?: string | number | boolean): string | this {\n if (arguments.length === 0) return this.nodes.map((node) => node.textContent || \"\").join(\"\");\n for (const node of this.nodes) node.textContent = String(value);\n return this;\n }\n\n on(eventName: string, listener: EventListener, options?: AddEventListenerOptions): this {\n for (const node of this.nodes) node.addEventListener(eventName, listener, options);\n return this;\n }\n\n off(eventName: string, listener: EventListener, options?: EventListenerOptions): this {\n for (const node of this.nodes) node.removeEventListener(eventName, listener, options);\n return this;\n }\n\n before(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"beforebegin\");\n }\n\n after(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"afterend\");\n }\n\n append(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"beforeend\");\n }\n\n prepend(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"afterbegin\");\n }\n\n html(content?: string | SelectorObject | HTMLElement | TemplateResult): this | string {\n if (arguments.length === 0) return this.nodes[0]?.innerHTML ?? \"\";\n return this._html(content!, \"replace\");\n }\n\n empty(): this {\n for (const node of this.nodes) node.textContent = \"\";\n return this;\n }\n\n private _html(content: string | SelectorObject | HTMLElement | TemplateResult, position: InsertPosition | \"replace\"): this {\n const doc = getDocument();\n for (const node of this.nodes) {\n if ((content as SelectorObject)?.isSelectorObject) {\n const htmls = Array.from(content as SelectorObject).map((selNode) => selNode.outerHTML).join(\"\");\n if (position === \"replace\") node.innerHTML = htmls;\n else node.insertAdjacentHTML(position as InsertPosition, htmls);\n } else if (isTemplateResult(content) && doc) {\n const fragment = materializeTemplate(content, doc);\n if (position === \"replace\") replaceChildren(node, fragment);\n else node.insertAdjacentElement(position as InsertPosition, fragmentToElement(fragment, doc));\n } else if (isNodeLike(content)) {\n const cloned = content.cloneNode(true) as HTMLElement;\n if (position === \"replace\") replaceChildren(node, valueToFragment(cloned, doc || node.ownerDocument));\n else node.insertAdjacentElement(position as InsertPosition, cloned);\n } else {\n const htmlContent = String(content);\n if (position === \"replace\") node.innerHTML = htmlContent;\n else node.insertAdjacentHTML(position as InsertPosition, htmlContent);\n }\n }\n return this;\n }\n\n private reindex(): void {\n for (const key of Object.keys(this)) {\n if (/^\\d+$/.test(key)) delete (this as any)[key];\n }\n this.nodes.forEach((node, index) => {\n (this as any)[index] = node;\n });\n }\n}\n\nfunction fragmentToElement(fragment: DocumentFragment, doc: Document): HTMLElement {\n const span = doc.createElement(\"span\");\n span.appendChild(fragment);\n return span;\n}\n\nfunction onDOMReady(fn: (...args: any[]) => void, args: unknown[] = [], context: any = Ity): void {\n const doc = getDocument();\n const func = () => fn.apply(context, args);\n if (!doc || doc.readyState !== \"loading\") func();\n else doc.addEventListener(\"DOMContentLoaded\", func, { once: true });\n}\n\ninterface AjaxOptions {\n url?: string;\n type?: string;\n data?: unknown;\n success?: (resp: any) => void;\n error?: (status?: number, error?: unknown) => void;\n}\n\nclass Model = Record> extends Evented {\n public id!: string;\n public data!: T;\n public url!: string;\n public readonly state: Signal;\n\n constructor(opts: Partial> = {}) {\n super();\n Object.assign(this, opts);\n this.id ||= `m${Math.floor(Math.random() * 100000) + 1}`;\n this.data ||= {} as T;\n this.url ||= \"\";\n this.state = signal(this.data);\n this._init(opts);\n }\n\n onDOMReady = onDOMReady;\n\n protected _init(opts?: Partial>): void {\n this.initialize(opts);\n }\n\n protected _ajax(opts: AjaxOptions = {}): void {\n const request = new XMLHttpRequest();\n const method = opts.type || \"GET\";\n const url = opts.url || this.url;\n const success = opts.success || function (this: Model, resp: any) {\n this.data = resp;\n this.state.set(resp);\n };\n const error = opts.error || function () { };\n request.open(method, url, true);\n request.onload = () => {\n if (request.status >= 200 && request.status < 400) {\n try {\n const response = request.responseText ? JSON.parse(request.responseText) : null;\n success.call(this, response);\n } catch (err) {\n error.call(this, request.status, err);\n }\n } else {\n error.call(this, request.status);\n }\n };\n request.onerror = () => error.call(this);\n request.send(opts.data === undefined ? undefined : JSON.stringify(opts.data));\n }\n\n initialize(options?: Partial>): void { }\n\n get(attr?: keyof T): any {\n const current = this.data;\n if (!attr) return current;\n return current ? (current as any)[attr as string] : undefined;\n }\n\n set(attr: keyof T | Partial, value?: any): void {\n const current = this.state.peek() || {} as T;\n const next = typeof attr === \"string\"\n ? { ...(current as any), [attr]: value } as T\n : attr as T;\n this.data = next;\n this.state.set(next);\n this.trigger(\"change\", this.data);\n }\n\n unSet(attr: keyof T): void {\n const current = this.state.peek();\n if (!current || !Object.prototype.hasOwnProperty.call(current, attr)) return;\n const next = { ...(current as any) };\n delete next[attr as string];\n this.data = next as T;\n this.state.set(this.data);\n this.trigger(\"change\", this.data);\n }\n\n clear(): void {\n this.data = {} as T;\n this.state.set(this.data);\n this.trigger(\"change\", this.data);\n }\n\n subscribe(callback: Subscriber, options?: { immediate?: boolean }): Cleanup {\n return this.state.subscribe(callback, options);\n }\n\n sync(opts?: AjaxOptions): void {\n this._ajax(opts);\n }\n\n toJSON(): T {\n return this.get();\n }\n}\n\ninterface ViewEvents {\n [selector: string]: Record;\n}\n\ninterface ViewOptions {\n el?: string | SelectorObject | NodeList | HTMLElement;\n app?: Application;\n name?: string;\n events?: ViewEvents;\n [key: string]: any;\n}\n\nclass View extends Evented {\n public id!: string;\n public el!: SelectorObject;\n public app?: Application;\n public name?: string;\n public events!: ViewEvents;\n private renderCleanup?: Cleanup;\n private delegatedListeners: Cleanup[] = [];\n\n constructor(opts: ViewOptions = {}) {\n super();\n Object.assign(this, opts);\n this.id ||= `v${Math.floor(Math.random() * 100000) + 1}`;\n if (this.app) this.app.addView(this);\n this.events ||= {};\n onDOMReady(this._init, [opts], this);\n }\n\n private _setElement(elSelector: ViewOptions[\"el\"]): void {\n const win = getWindow();\n if ((elSelector as SelectorObject)?.isSelectorObject) {\n this.el = elSelector as SelectorObject;\n } else if (win?.NodeList && elSelector instanceof win.NodeList) {\n this.el = new SelectorObject(elSelector as any);\n } else if (typeof elSelector === \"string\") {\n this.el = new SelectorObject(documentOrThrow().querySelectorAll(elSelector) as any);\n } else if (win?.HTMLElement && elSelector instanceof win.HTMLElement) {\n this.el = new SelectorObject([elSelector]);\n } else {\n throw new Error(\"el selector must be of type String, NodeList, HTMLElement or Ity.SelectorObject\");\n }\n }\n\n private _bindDOMEvents(evtObj: ViewEvents): void {\n if (!this.el || !this.el.isSelectorObject) return;\n const captureEvents = [\"focus\", \"blur\"];\n for (const selector in evtObj) {\n for (const evt in evtObj[selector]) {\n const callback = (this as any)[evtObj[selector][evt]];\n if (typeof callback !== \"function\") {\n throw new Error(`View event handler not found: ${evtObj[selector][evt]}`);\n }\n const capture = captureEvents.includes(evt);\n this._delegateEvent(selector, evt, callback, capture);\n }\n }\n }\n\n private _delegateEvent(selector: string, evtName: string, callback: (e: Event) => void, capture = false): void {\n for (const root of this.el) {\n const listener = (event: Event) => {\n let node: HTMLElement | null = event.target as HTMLElement;\n while (node) {\n if ((node as any).matches && (node as any).matches(selector)) {\n (event as any).delegateTarget = node;\n callback.call(this, event);\n break;\n }\n if (node === root) break;\n node = node.parentElement;\n }\n };\n root.addEventListener(evtName, listener, capture);\n this.delegatedListeners.push(() => root.removeEventListener(evtName, listener, capture));\n }\n }\n\n private _init(opts: ViewOptions): void {\n if (this.el) this._setElement(this.el as any);\n if (opts.el && !this.el) this._setElement(opts.el);\n this._bindDOMEvents(this.events);\n this.initialize(opts);\n }\n\n initialize(opts?: ViewOptions): void { }\n\n getName(): string | undefined {\n return this.name;\n }\n\n get(attr: keyof this): any {\n return (this as any)[attr];\n }\n\n set(attr: keyof this, value: any): void {\n (this as any)[attr] = value;\n }\n\n renderWith(view: TemplateValue | (() => TemplateValue), options?: RenderOptions): Cleanup {\n if (this.renderCleanup) this.renderCleanup();\n this.renderCleanup = render(view, this.el, options);\n return this.renderCleanup;\n }\n\n remove(): void {\n if (this.renderCleanup) this.renderCleanup();\n for (const cleanup of this.delegatedListeners.splice(0)) cleanup();\n this.el.remove();\n if (this.app) this.app.removeView(this.id);\n }\n\n select(selector: string, ctx: HTMLElement | HTMLDocument | SelectorObject = this.el): SelectorObject {\n const win = getWindow();\n if ((win?.HTMLElement && ctx instanceof win.HTMLElement) || (win?.HTMLDocument && ctx instanceof win.HTMLDocument)) {\n return new SelectorObject(ctx.querySelectorAll(selector) as any);\n }\n if ((ctx as any).isSelectorObject) return (ctx as SelectorObject).find(selector);\n throw new Error(\"Context passed to .select() must be an HTMLElement or an Ity.SelectorObject\");\n }\n}\n\nclass Application {\n public views: View[] = [];\n\n getView(id: string): View | undefined {\n return this.views.find((view) => view.id === id);\n }\n\n addView(view: View): void {\n if (view instanceof View && !this.views.includes(view)) this.views.push(view);\n }\n\n removeView(id: string): void {\n this.views = this.views.filter((view) => view.id !== id);\n }\n\n trigger(evtName: string, data?: unknown): void {\n for (const view of this.views.slice()) view.trigger(evtName, data);\n }\n}\n\nclass Collection {\n public models: M[] = [];\n public url!: string;\n public readonly state: Signal;\n private ModelClass: new () => M;\n\n constructor(models: M[] = [], ModelClass: new () => M = Model as any) {\n this.ModelClass = ModelClass;\n this.url = \"\";\n this.state = signal(this.models);\n models.forEach((model) => this.add(model));\n }\n\n get(id: string): M | undefined {\n return this.models.find((model) => model.id === id);\n }\n\n add(model: M): void {\n if (!(model instanceof Model)) return;\n this.models = [...this.models, model];\n this.state.set(this.models);\n }\n\n remove(id: string | M): void {\n const model = typeof id === \"string\" ? this.get(id) : id;\n if (!model) return;\n this.models = this.models.filter((item) => item !== model);\n this.state.set(this.models);\n }\n\n at(index: number): M | undefined {\n return this.models[index];\n }\n\n get length(): number {\n return this.models.length;\n }\n\n clear(): void {\n this.models = [];\n this.state.set(this.models);\n }\n\n find(predicate: (m: M) => boolean): M | undefined {\n return this.models.find(predicate);\n }\n\n filter(predicate: (m: M) => boolean): M[] {\n return this.models.filter(predicate);\n }\n\n map(mapper: (m: M, index: number) => T): T[] {\n return this.models.map(mapper);\n }\n\n toJSON(): any[] {\n return this.models.map((model) => model.get());\n }\n\n subscribe(callback: Subscriber, options?: { immediate?: boolean }): Cleanup {\n return this.state.subscribe(callback, options);\n }\n\n protected _ajax(opts: AjaxOptions = {}): void {\n const request = new XMLHttpRequest();\n const method = opts.type || \"GET\";\n const url = opts.url || this.url;\n const success = opts.success || function () { };\n const error = opts.error || function () { };\n request.open(method, url, true);\n request.onload = () => {\n if (request.status >= 200 && request.status < 400) {\n try {\n success.call(this, request.responseText ? JSON.parse(request.responseText) : null);\n } catch (err) {\n error.call(this, request.status, err);\n }\n } else {\n error.call(this, request.status);\n }\n };\n request.onerror = () => error.call(this);\n request.send(opts.data === undefined ? undefined : JSON.stringify(opts.data));\n }\n\n fetch(opts: AjaxOptions & { modelClass?: new () => M } = {}): void {\n const userSuccess = opts.success;\n opts.success = function (this: Collection, resp: any[]) {\n const ctor = (opts.modelClass || this.ModelClass) as new () => M;\n this.clear();\n for (const data of resp || []) {\n const model = new ctor();\n (model as any).set(data);\n this.add(model);\n }\n if (userSuccess) userSuccess.call(this, resp);\n };\n this._ajax(opts);\n }\n\n trigger(evtName: string, data?: unknown): void {\n for (const model of this.models.slice()) model.trigger(evtName, data);\n }\n}\n\ninterface RouteContext {\n path: string;\n url: URL;\n params: Record;\n query: Record;\n hash: Record;\n}\n\ntype RouteHandler = (params: Record, context: RouteContext) => void | Cleanup;\n\ninterface RouteRecord {\n pattern: string;\n handler: RouteHandler;\n exec(url: URL): Record | null;\n}\n\ninterface RouterOptions {\n base?: string;\n autoStart?: boolean;\n linkSelector?: string;\n transition?: boolean;\n notFound?: RouteHandler;\n}\n\nclass Router {\n private routes: RouteRecord[] = [];\n private started = false;\n private readonly listener = () => this.check();\n private readonly clickListener = (event: Event) => this.handleLinkClick(event);\n private readonly navigationListener = (event: any) => this.handleNavigationEvent(event);\n private routeCleanup?: Cleanup;\n private activeRoute?: RouteRecord;\n public readonly current: Signal = signal(null);\n public notFound?: RouteHandler;\n public base: string;\n public linkSelector: string;\n public transition: boolean;\n\n constructor(options: RouterOptions = {}) {\n this.base = options.base || \"/\";\n this.linkSelector = options.linkSelector || \"a[href]\";\n this.transition = Boolean(options.transition);\n this.notFound = options.notFound;\n if (options.autoStart !== false) this.start();\n }\n\n add(pattern: string, handler: RouteHandler): this {\n this.routes.push(createRouteRecord(pattern, handler));\n return this;\n }\n\n addRoute(pattern: string, handler: RouteHandler): void {\n this.add(pattern, handler);\n }\n\n removeRoute(pattern: string): this {\n if (this.activeRoute?.pattern === pattern) {\n this.disposeRoute();\n this.activeRoute = undefined;\n this.current.set(null);\n }\n this.routes = this.routes.filter((route) => route.pattern !== pattern);\n return this;\n }\n\n navigate(path: string, options: { replace?: boolean; transition?: boolean } = {}): void {\n const win = getWindow();\n if (!win) return;\n const update = () => {\n const method = options.replace ? \"replaceState\" : \"pushState\";\n win.history[method](null, \"\", withBasePath(path, this.base));\n this.check();\n };\n withViewTransition(update, options.transition ?? this.transition);\n }\n\n href(path: string): string {\n return withBasePath(path, this.base);\n }\n\n link(path: string, attrs: Record = {}): Record {\n const previousClick = attrs[\"@click\"] as ((event: Event) => void) | undefined;\n const href = this.href(path);\n return {\n ...attrs,\n href,\n \"@click\": (event: Event) => {\n previousClick?.(event);\n const currentTarget = event.currentTarget as HTMLAnchorElement | null;\n const anchor = currentTarget && typeof (currentTarget as any).matches === \"function\" && currentTarget.matches(this.linkSelector)\n ? currentTarget\n : null;\n const url = this.resolveNavigationURL(event, anchor, href);\n if (!url) return;\n event.preventDefault();\n this.navigate(`${url.pathname}${url.search}${url.hash}`);\n }\n };\n }\n\n start(): void {\n const win = getWindow();\n const doc = getDocument();\n if (!win || this.started) {\n if (win) this.check();\n return;\n }\n win.addEventListener(\"popstate\", this.listener);\n doc?.addEventListener(\"click\", this.clickListener);\n (win as any).navigation?.addEventListener?.(\"navigate\", this.navigationListener);\n this.started = true;\n this.check();\n }\n\n stop(): void {\n const win = getWindow();\n const doc = getDocument();\n if (win && this.started) {\n win.removeEventListener(\"popstate\", this.listener);\n doc?.removeEventListener(\"click\", this.clickListener);\n (win as any).navigation?.removeEventListener?.(\"navigate\", this.navigationListener);\n }\n this.started = false;\n this.disposeRoute();\n }\n\n check(): RouteContext | null {\n const win = getWindow();\n if (!win) return null;\n const url = new URL(win.location.href);\n const routePath = stripBasePath(url.pathname, this.base);\n if (routePath === null) {\n this.disposeRoute();\n this.activeRoute = undefined;\n this.current.set(null);\n return null;\n }\n const routeUrl = new URL(url.href);\n routeUrl.pathname = routePath || \"/\";\n for (const route of this.routes) {\n const routeParams = route.exec(routeUrl);\n if (!routeParams) continue;\n const query = searchParamsToObject(url.search);\n const hash = searchParamsToObject(url.hash);\n const params = { ...routeParams, ...query, ...hash };\n const context: RouteContext = {\n path: routePath || \"/\",\n url,\n params,\n query,\n hash\n };\n this.disposeRoute();\n this.activeRoute = route;\n this.current.set(context);\n const cleanup = route.handler(params, context);\n if (typeof cleanup === \"function\") this.routeCleanup = cleanup;\n return context;\n }\n this.disposeRoute();\n this.activeRoute = undefined;\n this.current.set(null);\n const cleanup = this.notFound?.({}, {\n path: routePath || \"/\",\n url,\n params: {},\n query: searchParamsToObject(url.search),\n hash: searchParamsToObject(url.hash)\n });\n if (typeof cleanup === \"function\") this.routeCleanup = cleanup;\n return null;\n }\n\n private handleLinkClick(event: Event): void {\n const anchor = this.findAnchor(event);\n const url = this.resolveNavigationURL(event, anchor);\n if (!url) return;\n event.preventDefault();\n this.navigate(`${url.pathname}${url.search}${url.hash}`);\n }\n\n private handleNavigationEvent(event: any): void {\n const win = getWindow();\n if (!win || !event?.canIntercept || !event.destination?.url || typeof event.intercept !== \"function\") return;\n const url = new URL(event.destination.url, win.location.href);\n if (url.origin !== win.location.origin) return;\n if (stripBasePath(url.pathname, this.base) === null) return;\n event.intercept({\n handler: () => {\n this.check();\n }\n });\n }\n\n private disposeRoute(): void {\n if (!this.routeCleanup) return;\n const cleanup = this.routeCleanup;\n this.routeCleanup = undefined;\n cleanup();\n }\n\n private resolveNavigationURL(event: Event, anchor: HTMLAnchorElement | null, fallbackHref?: string): URL | null {\n const mouseEvent = event as MouseEvent;\n if (event.defaultPrevented) return null;\n if (typeof mouseEvent.button === \"number\" && mouseEvent.button !== 0) return null;\n if (mouseEvent.metaKey || mouseEvent.ctrlKey || mouseEvent.shiftKey || mouseEvent.altKey) return null;\n if (anchor && ((anchor.target && anchor.target !== \"_self\") || anchor.hasAttribute(\"download\"))) return null;\n const win = getWindow();\n if (!win) return null;\n const href = anchor?.getAttribute(\"href\") ?? fallbackHref;\n if (!href || /^(mailto|tel):/i.test(href)) return null;\n const url = new URL(anchor?.href || href, win.location.href);\n if (url.origin !== win.location.origin) return null;\n if (stripBasePath(url.pathname, this.base) === null) return null;\n return url;\n }\n\n private findAnchor(event: Event): HTMLAnchorElement | null {\n const win = getWindow();\n const fromPath = typeof (event as any).composedPath === \"function\"\n ? ((event as any).composedPath() as EventTarget[])\n : [];\n for (const entry of fromPath) {\n if (!entry || !(entry as any).matches) continue;\n const element = entry as HTMLElement;\n if (element.matches(this.linkSelector)) return element as HTMLAnchorElement;\n }\n const target = event.target as HTMLElement | null;\n return target?.closest?.(this.linkSelector) as HTMLAnchorElement | null;\n }\n}\n\nfunction createRouteRecord(pattern: string, handler: RouteHandler): RouteRecord {\n const win = getWindow();\n const URLPatternCtor = (win as any)?.URLPattern || (globalThis as any).URLPattern;\n if (typeof URLPatternCtor === \"function\") {\n try {\n const nativePattern = new URLPatternCtor({ pathname: pattern });\n return {\n pattern,\n handler,\n exec(url) {\n const match = nativePattern.exec(url.href);\n return match ? decodeParams(match.pathname.groups || {}) : null;\n }\n };\n } catch (_err) {\n // Fall through to the regex matcher for non-URLPattern syntax.\n }\n }\n\n const { re, keys } = compilePathPattern(pattern);\n return {\n pattern,\n handler,\n exec(url) {\n const match = re.exec(normalizePath(url.pathname));\n if (!match) return null;\n const params: Record = {};\n keys.forEach((key, index) => {\n params[key] = decodeURIComponent(match[index + 1] || \"\");\n });\n return params;\n }\n };\n}\n\nfunction normalizeBase(base: string): string {\n const normalized = normalizePath(base || \"/\");\n return normalized === \"\" ? \"\" : normalized;\n}\n\nfunction withBasePath(path: string, base: string): string {\n const normalizedBase = normalizeBase(base);\n const parsed = new URL(path || \"/\", \"http://ity.local\");\n let pathname = normalizePath(parsed.pathname) || \"/\";\n if (normalizedBase && pathname !== normalizedBase && !pathname.startsWith(`${normalizedBase}/`)) {\n pathname = `${normalizedBase}${pathname === \"/\" ? \"\" : pathname}`;\n }\n return `${pathname}${parsed.search}${parsed.hash}`;\n}\n\nfunction stripBasePath(pathname: string, base: string): string | null {\n const normalizedBase = normalizeBase(base);\n const normalizedPath = normalizePath(pathname) || \"/\";\n if (!normalizedBase) return normalizedPath;\n if (normalizedPath === normalizedBase) return \"/\";\n if (normalizedPath.startsWith(`${normalizedBase}/`)) {\n return normalizePath(normalizedPath.slice(normalizedBase.length)) || \"/\";\n }\n return null;\n}\n\nfunction compilePathPattern(pattern: string): { re: RegExp; keys: string[] } {\n const keys: string[] = [];\n const normalized = normalizePath(pattern);\n if (normalized === \"\") return { re: /^\\/?$/, keys };\n const segments = normalized.split(\"/\").filter(Boolean);\n const source = segments.map((segment) => {\n if (segment === \"*\") {\n keys.push(\"wildcard\");\n return \"(.*)\";\n }\n if (segment.startsWith(\":\")) {\n keys.push(segment.slice(1));\n return \"([^/]+)\";\n }\n return escapeRegExp(segment);\n }).join(\"/\");\n return { re: new RegExp(`^/${source}/?$`), keys };\n}\n\nfunction normalizePath(path: string): string {\n const normalized = path.replace(/[?#].*$/, \"\").replace(/\\/+$/, \"\");\n return normalized === \"\" ? \"\" : normalized.startsWith(\"/\") ? normalized : `/${normalized}`;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction searchParamsToObject(value: string): Record {\n const out: Record = {};\n const clean = value.replace(/^[?#]/, \"\");\n if (!clean) return out;\n const params = new URLSearchParams(clean);\n params.forEach((paramValue, key) => {\n out[key] = paramValue;\n });\n return out;\n}\n\nfunction decodeParams(value: Record): Record {\n const out: Record = {};\n for (const key of Object.keys(value)) {\n out[key] = decodeURIComponent(value[key]);\n }\n return out;\n}\n\nconst defaultRouter = signal(null);\n\nfunction route(pattern: string, handler: RouteHandler): Router {\n let router = defaultRouter.peek();\n if (!router) {\n router = new Router({ autoStart: false });\n defaultRouter.set(router);\n }\n router.add(pattern, handler);\n router.start();\n return router;\n}\n\nconst Ity = {\n version: \"2.2.0\",\n createConfig,\n configure,\n signal,\n computed,\n effect,\n batch,\n untrack,\n isSignal,\n resolveSignal,\n store,\n resource,\n action,\n form,\n formState,\n html,\n unsafeHTML,\n render,\n renderToString,\n component,\n route,\n Router,\n SelectorObject,\n onDOMReady,\n Model,\n View,\n Application,\n Collection\n};\n\nfunction createAmdExport(): typeof Ity {\n const win = getWindow();\n if (win) (win as any).Ity = Ity;\n return Ity;\n}\n\n/* c8 ignore next 3 */\nif (typeof define === \"function\" && (define as any).amd) {\n (define as any)(createAmdExport);\n} else if (typeof module === \"object\" && typeof module.exports !== \"undefined\") {\n module.exports = Ity;\n}\n\nconst win = getWindow();\nif (win) {\n (win as any).Ity = Ity;\n}\n\nexport {\n Application,\n Collection,\n Model,\n Router,\n SelectorObject,\n View,\n batch,\n component,\n configure,\n createConfig,\n computed,\n effect,\n action,\n form,\n formState,\n html,\n isSignal,\n onDOMReady,\n render,\n renderToString,\n resource,\n resolveSignal,\n route,\n signal,\n store,\n unsafeHTML,\n untrack\n};\nexport type {\n Action,\n ActionOptions,\n AsyncStatus,\n ComponentContext,\n ComponentOptions,\n EffectHandle,\n FormBindOptions,\n FormController,\n FormField,\n FormOptions,\n FormState,\n FormStateController,\n FormStateOptions,\n FormStateSubmitOptions,\n HTMLSanitizer,\n ItyConfig,\n ReadonlySignal,\n RenderOptions,\n RenderToStringOptions,\n Resource,\n ResourceContext,\n ResourceOptions,\n RouteContext,\n RouteHandler,\n Signal,\n Store,\n TemplateResult,\n UnsafeHTMLOptions\n};\nexport default Ity;\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/ity.js b/dist/ity.js index b63738e..b6caa99 100644 --- a/dist/ity.js +++ b/dist/ity.js @@ -6,6 +6,7 @@ var Ity = (function (exports) { let batchDepth = 0; const pendingEffects = new Set(); let configuredSanitizeHTML; + const activeConfigStack = []; function getWindow() { return typeof window !== "undefined" ? window : undefined; } @@ -14,6 +15,79 @@ var Ity = (function (exports) { const win = getWindow(); return (_a = win === null || win === void 0 ? void 0 : win.document) !== null && _a !== void 0 ? _a : (typeof document !== "undefined" ? document : undefined); } + function hasOwn(target, key) { + return Object.prototype.hasOwnProperty.call(target, key); + } + function isPlainObject(value) { + if (!value || typeof value !== "object") + return false; + const proto = Object.getPrototypeOf(value); + return proto === Object.prototype || proto === null; + } + function cloneValue(value) { + const cloneFn = globalThis.structuredClone; + if (typeof cloneFn === "function") + return cloneFn(value); + if (Array.isArray(value)) + return value.map((item) => cloneValue(item)); + if (isPlainObject(value)) { + const out = {}; + for (const key of Reflect.ownKeys(value)) { + out[key] = cloneValue(value[key]); + } + return out; + } + return value; + } + function deepEqual(left, right) { + if (Object.is(left, right)) + return true; + if (Array.isArray(left) && Array.isArray(right)) { + if (left.length !== right.length) + return false; + for (let i = 0; i < left.length; i += 1) { + if (!deepEqual(left[i], right[i])) + return false; + } + return true; + } + if (isPlainObject(left) && isPlainObject(right)) { + const leftKeys = Reflect.ownKeys(left); + const rightKeys = Reflect.ownKeys(right); + if (leftKeys.length !== rightKeys.length) + return false; + for (const key of leftKeys) { + if (!rightKeys.includes(key)) + return false; + if (!deepEqual(left[key], right[key])) + return false; + } + return true; + } + return false; + } + function currentConfig() { + return activeConfigStack.length ? activeConfigStack[activeConfigStack.length - 1] : null; + } + function withConfig(config, callback) { + activeConfigStack.push(config || null); + try { + return callback(); + } + finally { + activeConfigStack.pop(); + } + } + function resolveSanitizeHTML(options = {}) { + var _a; + if (options.sanitize) + return options.sanitize; + const scoped = (_a = options.config) !== null && _a !== void 0 ? _a : currentConfig(); + if (scoped && hasOwn(scoped, "sanitizeHTML")) { + return scoped.sanitizeHTML || undefined; + } + return configuredSanitizeHTML; + } function trackDependency(source) { if (!activeObserver) return; @@ -243,6 +317,13 @@ var Ity = (function (exports) { function configure(options = {}) { configuredSanitizeHTML = options.sanitizeHTML || undefined; } + function createConfig(options = {}) { + var _a; + const config = {}; + if (hasOwn(options, "sanitizeHTML")) + config.sanitizeHTML = (_a = options.sanitizeHTML) !== null && _a !== void 0 ? _a : null; + return config; + } function store(initialValue) { const keys = new Set(Reflect.ownKeys(initialValue)); const signals = new Map(); @@ -475,6 +556,19 @@ var Ity = (function (exports) { const callable = ((...args) => submit(...args)); const mutableCallable = callable; mutableCallable.submit = submit; + mutableCallable.run = (...args) => { + submit(...args).catch(() => undefined); + }; + mutableCallable.with = (...args) => { + return () => { + mutableCallable.run(...args); + }; + }; + mutableCallable.from = (mapper) => { + return (event) => { + mutableCallable.run(...mapper(event)); + }; + }; mutableCallable.data = data; mutableCallable.error = error; mutableCallable.pending = pending; @@ -489,40 +583,48 @@ var Ity = (function (exports) { }; return callable; } + function getFormElementCtor(node) { + var _a, _b; + const ownerWindow = (_a = node === null || node === void 0 ? void 0 : node.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView; + return (ownerWindow === null || ownerWindow === void 0 ? void 0 : ownerWindow.HTMLFormElement) + || ((_b = getWindow()) === null || _b === void 0 ? void 0 : _b.HTMLFormElement) + || (typeof HTMLFormElement !== "undefined" ? HTMLFormElement : undefined); + } + function isFormElement(node, fallbackNode) { + const FormElement = node ? getFormElementCtor(node) : getFormElementCtor(fallbackNode || null); + return Boolean(node && FormElement && node instanceof FormElement); + } + function findFormElement(event) { + var _a; + const target = (event.currentTarget || event.target); + if (!getFormElementCtor(target)) + throw new Error("Ity.form requires HTMLFormElement support"); + if (isFormElement(target, target)) + return target; + const closest = (_a = target === null || target === void 0 ? void 0 : target.closest) === null || _a === void 0 ? void 0 : _a.call(target, "form"); + if (isFormElement(closest, target)) + return closest; + throw new Error("Ity.form onSubmit requires a form event target"); + } + function createFormDataForElement(formElement) { + var _a, _b; + const ownerWindow = (_a = formElement.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView; + const FormDataCtor = (ownerWindow === null || ownerWindow === void 0 ? void 0 : ownerWindow.FormData) + || ((_b = getWindow()) === null || _b === void 0 ? void 0 : _b.FormData) + || (typeof FormData !== "undefined" ? FormData : undefined); + if (!FormDataCtor) + throw new Error("Ity.form requires FormData support"); + return new FormDataCtor(formElement); + } function form(handler, options = {}) { const submitAction = action(handler, options); - const findForm = (event) => { - var _a; - const target = (event.currentTarget || event.target); - const getFormElementCtor = (node) => { - var _a, _b; - const ownerWindow = (_a = node === null || node === void 0 ? void 0 : node.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView; - return (ownerWindow === null || ownerWindow === void 0 ? void 0 : ownerWindow.HTMLFormElement) - || ((_b = getWindow()) === null || _b === void 0 ? void 0 : _b.HTMLFormElement) - || (typeof HTMLFormElement !== "undefined" ? HTMLFormElement : undefined); - }; - const isFormElement = (node) => { - const FormElement = node ? getFormElementCtor(node) : getFormElementCtor(target); - return Boolean(node && FormElement && node instanceof FormElement); - }; - if (!getFormElementCtor(target)) - throw new Error("Ity.form requires HTMLFormElement support"); - if (isFormElement(target)) - return target; - const closest = (_a = target === null || target === void 0 ? void 0 : target.closest) === null || _a === void 0 ? void 0 : _a.call(target, "form"); - if (isFormElement(closest)) - return closest; - throw new Error("Ity.form onSubmit requires a form event target"); - }; - const createFormData = (formElement) => { - var _a, _b; - const ownerWindow = (_a = formElement.ownerDocument) === null || _a === void 0 ? void 0 : _a.defaultView; - const FormDataCtor = (ownerWindow === null || ownerWindow === void 0 ? void 0 : ownerWindow.FormData) - || ((_b = getWindow()) === null || _b === void 0 ? void 0 : _b.FormData) - || (typeof FormData !== "undefined" ? FormData : undefined); - if (!FormDataCtor) - throw new Error("Ity.form requires FormData support"); - return new FormDataCtor(formElement); + const onSubmit = async (event) => { + event.preventDefault(); + const formElement = findFormElement(event); + const result = await submitAction(createFormDataForElement(formElement), event); + if (options.resetOnSuccess) + formElement.reset(); + return result; }; return { action: submitAction, @@ -530,19 +632,360 @@ var Ity = (function (exports) { error: submitAction.error, pending: submitAction.pending, status: submitAction.status, - async onSubmit(event) { - event.preventDefault(); - const formElement = findForm(event); - const result = await submitAction(createFormData(formElement), event); - if (options.resetOnSuccess) - formElement.reset(); - return result; + onSubmit, + handleSubmit(event) { + onSubmit(event).catch(() => undefined); }, reset() { submitAction.reset(); } }; } + function replaceStoreSnapshot(target, nextValue) { + const current = target.$snapshot(); + batch(() => { + for (const key of Reflect.ownKeys(current)) { + if (!hasOwn(nextValue, key)) + delete target[key]; + } + for (const key of Reflect.ownKeys(nextValue)) { + target[key] = nextValue[key]; + } + }); + } + function formState(initialValue, options = {}) { + const values = store(cloneValue(initialValue)); + const initialValues = signal(cloneValue(initialValue)); + const errors = store({}); + const touched = store({}); + const registeredBindings = new Map(); + const allFieldNames = () => { + const names = new Set(); + Reflect.ownKeys(initialValues.peek()).forEach((key) => names.add(String(key))); + Reflect.ownKeys(values.$snapshot()).forEach((key) => names.add(String(key))); + return Array.from(names); + }; + const computeErrors = (snapshot) => { + var _a; + const out = {}; + const validators = options.validators || {}; + for (const key of allFieldNames()) { + const validator = validators[key]; + if (!validator) + continue; + const message = validator(snapshot[key], snapshot); + if (message) + out[key] = message; + } + const formErrors = (_a = options.validate) === null || _a === void 0 ? void 0 : _a.call(options, snapshot); + if (formErrors) { + for (const key of Reflect.ownKeys(formErrors)) { + const message = formErrors[key]; + if (message) + out[key] = message; + } + } + return out; + }; + const syncErrors = () => { + const nextErrors = computeErrors(values.$snapshot()); + replaceStoreSnapshot(errors, nextErrors); + return Reflect.ownKeys(nextErrors).length === 0; + }; + const markTouched = (names) => { + const keys = (names === null || names === void 0 ? void 0 : names.length) + ? names.map((name) => String(name)) + : allFieldNames(); + batch(() => { + for (const key of keys) { + touched[key] = true; + } + }); + }; + const maybeValidateTouched = () => { + const touchedSnapshot = touched.$snapshot(); + if (Reflect.ownKeys(touchedSnapshot).some((key) => Boolean(touchedSnapshot[key]))) { + syncErrors(); + } + }; + const set = (next) => { + values.$patch((current) => { + const patch = typeof next === "function" ? next(current) : next; + return patch || {}; + }); + maybeValidateTouched(); + }; + const reset = (next) => { + const base = cloneValue(next + ? { ...initialValues.peek(), ...next } + : initialValues.peek()); + initialValues.set(cloneValue(base)); + replaceStoreSnapshot(values, base); + replaceStoreSnapshot(errors, {}); + replaceStoreSnapshot(touched, {}); + }; + const createFieldSignal = (name) => { + const signalLike = function (next) { + if (arguments.length === 0) + return values[name]; + const previous = values[name]; + const resolved = typeof next === "function" + ? next(previous) + : next; + values[name] = resolved; + maybeValidateTouched(); + return resolved; + }; + signalLike.get = () => values[name]; + signalLike.peek = () => untrack(() => values[name]); + signalLike.set = (next) => signalLike(next); + signalLike.update = (updater) => signalLike(updater); + signalLike.subscribe = (callback, subscribeOptions = {}) => { + let first = true; + let previous = signalLike.peek(); + return effect(() => { + const current = values[name]; + if (first) { + first = false; + previous = current; + if (subscribeOptions.immediate) + callback(current, current); + return; + } + if (!Object.is(previous, current)) { + const prev = previous; + previous = current; + callback(current, prev); + } + }); + }; + Object.defineProperty(signalLike, "isSignal", { value: true }); + return signalLike; + }; + const registerBinding = (name, domName, type, bindOptions) => { + const fieldName = String(name); + const fieldBindings = registeredBindings.get(fieldName) || new Map(); + const signature = `${domName}|${type}|${String(bindOptions.value)}`; + fieldBindings.set(signature, { + domName, + type, + value: bindOptions.value, + parse: bindOptions.parse + }); + registeredBindings.set(fieldName, fieldBindings); + }; + const syncFromForm = (event) => { + var _a; + const NO_FORM_VALUE = Symbol("ity.formState.noValue"); + let formElement; + try { + formElement = findFormElement(event); + } + catch (_error) { + return; + } + const formData = createFormDataForElement(formElement); + const controls = Array.from(formElement.elements || []); + const patch = {}; + const resolveControlValue = (name, bindings) => { + var _a, _b, _c; + const primary = bindings[0]; + if (!primary) + return NO_FORM_VALUE; + const domName = primary.domName; + const namedControls = controls.filter((control) => control && control.name === domName); + if (primary.parse && namedControls.length) { + const parseTarget = primary.type === "radio" + ? namedControls.find((control) => Boolean(control.checked)) || namedControls[0] + : namedControls[0]; + return primary.parse(parseTarget, event); + } + if (primary.type === "checkbox") { + const currentValue = values[name]; + if (Array.isArray(currentValue) || bindings.some((binding) => binding.value !== undefined) || namedControls.length > 1) { + const selected = []; + for (const control of namedControls) { + if (!control.checked) + continue; + const matched = bindings.find((binding) => { var _a, _b, _c; return String((_b = (_a = binding.value) !== null && _a !== void 0 ? _a : control.value) !== null && _b !== void 0 ? _b : "") === String((_c = control.value) !== null && _c !== void 0 ? _c : ""); }); + selected.push((_b = (_a = matched === null || matched === void 0 ? void 0 : matched.value) !== null && _a !== void 0 ? _a : control.value) !== null && _b !== void 0 ? _b : ""); + } + return selected; + } + return formData.has(domName); + } + if (primary.type === "radio") { + return ((_c = formData.get(domName)) !== null && _c !== void 0 ? _c : values[name]); + } + if (primary.type === "select-multiple") { + const select = namedControls[0]; + if (select === null || select === void 0 ? void 0 : select.selectedOptions) { + return Array.from(select.selectedOptions).map((option) => option.value); + } + return formData.getAll(domName); + } + if (primary.type === "number") { + const raw = formData.get(domName); + return (raw === null || raw === "" ? undefined : Number(raw)); + } + const raw = formData.get(domName); + return (raw === null ? "" : raw); + }; + for (const fieldName of allFieldNames()) { + const bindings = Array.from(((_a = registeredBindings.get(fieldName)) === null || _a === void 0 ? void 0 : _a.values()) || []); + const nextValue = resolveControlValue(fieldName, bindings); + if (nextValue !== NO_FORM_VALUE) { + patch[fieldName] = nextValue; + } + } + if (Reflect.ownKeys(patch).length) { + values.$patch(() => patch); + } + }; + const bind = (name, bindOptions = {}) => { + const field = api.field(name); + const type = bindOptions.type || "text"; + const eventName = bindOptions.event + || (type === "checkbox" || type === "radio" || type === "select" || type === "select-multiple" ? "change" : "input"); + const domName = bindOptions.name || String(name); + registerBinding(name, domName, type, bindOptions); + const formattedValue = bindOptions.format ? bindOptions.format(field.value()) : field.value(); + const parseValue = (event) => { + var _a, _b; + if (bindOptions.parse) { + return bindOptions.parse((event.currentTarget || event.target), event); + } + const target = (event.currentTarget || event.target); + if (!target) + return field.value(); + if (type === "checkbox") { + if (Array.isArray(field.value())) { + const optionValue = (_a = bindOptions.value) !== null && _a !== void 0 ? _a : target.value; + const current = field.value(); + return (target.checked + ? Array.from(new Set([...current, optionValue])) + : current.filter((item) => !Object.is(item, optionValue))); + } + return Boolean(target.checked); + } + if (type === "radio") { + if (!target.checked) + return field.value(); + return ((_b = bindOptions.value) !== null && _b !== void 0 ? _b : target.value); + } + if (type === "select-multiple") { + return Array.from(target.selectedOptions).map((option) => option.value); + } + if (type === "number") { + const raw = target.value; + return (raw === "" ? undefined : Number(raw)); + } + return target.value; + }; + const binding = { + name: domName, + [`@${eventName}`]: (event) => { + field.set(parseValue(event)); + }, + "@blur": () => { + markTouched([name]); + syncErrors(); + } + }; + if (type === "checkbox") { + if (Array.isArray(field.value())) { + const optionValue = bindOptions.value; + binding.value = optionValue === undefined ? "" : String(optionValue); + binding[".checked"] = computed(() => field.value().some((item) => Object.is(item, optionValue))); + } + else { + binding[".checked"] = computed(() => Boolean(field.value())); + binding.checked = Boolean(field.value()); + } + return binding; + } + if (type === "radio") { + const optionValue = bindOptions.value; + binding.value = optionValue === undefined ? "" : String(optionValue); + binding[".checked"] = computed(() => Object.is(field.value(), optionValue)); + return binding; + } + if (type === "select-multiple") { + binding[".value"] = formattedValue; + return binding; + } + const stringValue = formattedValue === undefined || formattedValue === null ? "" : String(formattedValue); + binding[".value"] = stringValue; + binding.value = stringValue; + return binding; + }; + const api = { + values, + initialValues, + errors, + touched, + dirty: computed(() => !deepEqual(values.$snapshot(), initialValues())), + valid: computed(() => Reflect.ownKeys(errors.$snapshot()).length === 0), + field(name) { + const valueSignal = createFieldSignal(name); + return { + value: valueSignal, + error: computed(() => errors[name] || null), + touched: computed(() => Boolean(touched[name])), + dirty: computed(() => !deepEqual(values[name], initialValues()[name])), + bind(optionsForField) { + return bind(name, optionsForField); + }, + set(next) { + return valueSignal.set(next); + }, + reset() { + valueSignal.set(initialValues.peek()[name]); + delete errors[name]; + delete touched[name]; + } + }; + }, + bind, + set, + reset, + validate() { + return syncErrors(); + }, + markTouched, + submit(handler, submitOptions = {}) { + const submitAction = action(handler, submitOptions); + const onSubmit = async (event) => { + event.preventDefault(); + syncFromForm(event); + markTouched(); + if (!syncErrors()) + return undefined; + const result = await submitAction(cloneValue(values.$snapshot()), event); + if (submitOptions.resetOnSuccess) + api.reset(); + return result; + }; + return { + state: api, + action: submitAction, + data: submitAction.data, + error: submitAction.error, + pending: submitAction.pending, + status: submitAction.status, + onSubmit, + handleSubmit(event) { + onSubmit(event).catch(() => undefined); + }, + reset() { + submitAction.reset(); + api.reset(); + } + }; + } + }; + return api; + } function html(strings, ...values) { return { isTemplateResult: true, @@ -551,7 +994,7 @@ var Ity = (function (exports) { }; } function unsafeHTML(value, options = {}) { - const sanitizer = options.sanitize || configuredSanitizeHTML; + const sanitizer = resolveSanitizeHTML(options); return { isUnsafeHTML: true, value: sanitizer ? sanitizer(String(value)) : String(value) @@ -605,6 +1048,12 @@ var Ity = (function (exports) { } parent.appendChild(doc.createTextNode(String(value))); } + function bindingFromName(rawName) { + const first = rawName[0]; + const kind = first === "@" ? "event" : first === "." ? "prop" : first === "?" ? "bool" : "attr"; + const name = kind === "attr" ? rawName : rawName.slice(1); + return { kind, name }; + } function materializeTemplate(result, doc = documentOrThrow()) { var _a, _b; const bindings = []; @@ -616,9 +1065,7 @@ var Ity = (function (exports) { const rawName = attrMatch[1]; const before = part.slice(0, part.length - attrMatch[0].length); const marker = `data-ity-bind-${i}`; - const first = rawName[0]; - const kind = first === "@" ? "event" : first === "." ? "prop" : first === "?" ? "bool" : "attr"; - const name = kind === "attr" ? rawName : rawName.slice(1); + const { kind, name } = bindingFromName(rawName); bindings.push({ index: i, kind, name }); source += `${before}${marker}=""`; } @@ -668,6 +1115,14 @@ var Ity = (function (exports) { } function applyElementBinding(element, binding, value) { const name = binding.name || ""; + if (binding.kind === "attr" && name === "bind" && isPlainObject(value)) { + for (const key of Reflect.ownKeys(value)) { + const entryValue = normalizeValue(value[key]); + const entry = bindingFromName(String(key)); + applyElementBinding(element, { index: binding.index, ...entry }, entryValue); + } + return; + } if (binding.kind === "event") { if (typeof value === "function") { element.addEventListener(name, value); @@ -678,6 +1133,13 @@ var Ity = (function (exports) { return; } if (binding.kind === "prop") { + if (name === "value" && Array.isArray(value) && element.tagName === "SELECT" && element.multiple) { + const selectedValues = new Set(value.map((entry) => String(entry))); + Array.from(element.options).forEach((option) => { + option.selected = selectedValues.has(option.value); + }); + return; + } element[name] = value; return; } @@ -741,10 +1203,12 @@ var Ity = (function (exports) { function render(view, target, options = {}) { const mount = resolveTarget(target); const update = () => { - const value = typeof view === "function" && !isSignal(view) - ? view() - : normalizeValue(view); - withViewTransition(() => replaceChildren(mount, valueToFragment(value)), options.transition); + withConfig(options.config, () => { + const value = typeof view === "function" && !isSignal(view) + ? view() + : normalizeValue(view); + withViewTransition(() => replaceChildren(mount, valueToFragment(value)), options.transition); + }); }; if (options.reactive === false) { update(); @@ -752,11 +1216,13 @@ var Ity = (function (exports) { } return effect(update); } - function renderToString(view) { - const value = typeof view === "function" && !isSignal(view) - ? view() - : normalizeValue(view); - return valueToString(value); + function renderToString(view, options = {}) { + return withConfig(options.config, () => { + const value = typeof view === "function" && !isSignal(view) + ? view() + : normalizeValue(view); + return valueToString(value); + }); } function valueToString(value) { value = normalizeValue(value); @@ -786,9 +1252,34 @@ var Ity = (function (exports) { if (attrMatch) { const rawName = attrMatch[1]; const before = part.slice(0, part.length - attrMatch[0].length); - const first = rawName[0]; - const kind = first === "@" ? "event" : first === "." ? "prop" : first === "?" ? "bool" : "attr"; - const name = kind === "attr" ? rawName : rawName.slice(1); + const { kind, name } = bindingFromName(rawName); + if (kind === "attr" && name === "bind" && isPlainObject(value)) { + const serialized = []; + for (const key of Reflect.ownKeys(value)) { + const entryValue = normalizeValue(value[key]); + const entry = bindingFromName(String(key)); + const entryName = entry.name || ""; + if (entry.kind === "event" || entryValue === false || entryValue === null || entryValue === undefined) + continue; + if (entry.kind === "bool") { + if (entryValue) + serialized.push(entryName); + continue; + } + if (entry.kind === "prop") { + if (entryName === "value") { + serialized.push(`value="${escapeAttribute(String(entryValue))}"`); + } + else if ((entryName === "checked" || entryName === "selected") && entryValue) { + serialized.push(entryName); + } + continue; + } + serialized.push(`${entryName}="${escapeAttribute(stringifyAttribute(entryName, entryValue))}"`); + } + source += serialized.length ? `${before}${serialized.join(" ")}` : before; + continue; + } if (kind === "event" || kind === "prop" || value === false || value === null || value === undefined) { source += before; } @@ -796,7 +1287,7 @@ var Ity = (function (exports) { source += value ? `${before}${name}` : before; } else { - source += `${before}${name}="${escapeAttribute(stringifyAttribute(name, value))}"`; + source += `${before}${name || ""}="${escapeAttribute(stringifyAttribute(name || "", value))}"`; } } else { @@ -842,10 +1333,12 @@ var Ity = (function (exports) { ? { ...maybeOptions, setup: setupOrOptions } : setupOrOptions; const attrs = definition.observedAttributes || definition.attrs || []; + const props = definition.props || []; class ItyElement extends win.HTMLElement { constructor() { super(...arguments); this.attrSignals = new Map(); + this.propSignals = new Map(); this.connectedCallbacks = []; this.disconnectedCallbacks = []; this.effectRecords = []; @@ -858,6 +1351,8 @@ var Ity = (function (exports) { connectedCallback() { var _a; this.ensureMount(); + for (const prop of props) + this.upgradeProperty(prop); if (!this.initialized) { this.initialized = true; const ctx = this.createContext(); @@ -919,7 +1414,10 @@ var Ity = (function (exports) { startRender() { if (this.renderCleanup || this.renderOutput === undefined) return; - this.renderCleanup = render(this.renderOutput, this.renderTarget, { transition: false }); + this.renderCleanup = render(this.renderOutput, this.renderTarget, { + transition: false, + config: definition.config + }); } startEffects() { for (const record of this.effectRecords) { @@ -934,11 +1432,25 @@ var Ity = (function (exports) { } return this.attrSignals.get(name); } + ensurePropSignal(name) { + if (!this.propSignals.has(name)) { + this.propSignals.set(name, signal(undefined)); + } + return this.propSignals.get(name); + } + upgradeProperty(name) { + if (!hasOwn(this, name)) + return; + const value = this[name]; + delete this[name]; + this[name] = value; + } createContext() { return { host: this, root: this.mount, attr: (name) => this.ensureAttrSignal(name), + prop: (name) => this.ensurePropSignal(name), emit: (name, detail, options = {}) => this.dispatchEvent(new CustomEvent(name, { bubbles: true, composed: true, @@ -968,6 +1480,18 @@ var Ity = (function (exports) { }; } } + for (const prop of props) { + Object.defineProperty(ItyElement.prototype, prop, { + configurable: true, + enumerable: true, + get() { + return this.ensurePropSignal(prop).peek(); + }, + set(value) { + this.ensurePropSignal(prop).set(typeof value === "function" ? (() => value) : value); + } + }); + } win.customElements.define(name, ItyElement); return ItyElement; } @@ -1513,7 +2037,7 @@ var Ity = (function (exports) { this.navigationListener = (event) => this.handleNavigationEvent(event); this.current = signal(null); this.base = options.base || "/"; - this.linkSelector = options.linkSelector || "a[data-ity-link]"; + this.linkSelector = options.linkSelector || "a[href]"; this.transition = Boolean(options.transition); this.notFound = options.notFound; if (options.autoStart !== false) @@ -1548,6 +2072,29 @@ var Ity = (function (exports) { }; withViewTransition(update, (_a = options.transition) !== null && _a !== void 0 ? _a : this.transition); } + href(path) { + return withBasePath(path, this.base); + } + link(path, attrs = {}) { + const previousClick = attrs["@click"]; + const href = this.href(path); + return { + ...attrs, + href, + "@click": (event) => { + previousClick === null || previousClick === void 0 ? void 0 : previousClick(event); + const currentTarget = event.currentTarget; + const anchor = currentTarget && typeof currentTarget.matches === "function" && currentTarget.matches(this.linkSelector) + ? currentTarget + : null; + const url = this.resolveNavigationURL(event, anchor, href); + if (!url) + return; + event.preventDefault(); + this.navigate(`${url.pathname}${url.search}${url.hash}`); + } + }; + } start() { var _a, _b; const win = getWindow(); @@ -1627,18 +2174,9 @@ var Ity = (function (exports) { return null; } handleLinkClick(event) { - var _a; - const target = event.target; - const anchor = (_a = target === null || target === void 0 ? void 0 : target.closest) === null || _a === void 0 ? void 0 : _a.call(target, this.linkSelector); - if (!anchor || anchor.target || anchor.hasAttribute("download")) - return; - const win = getWindow(); - if (!win) - return; - const url = new URL(anchor.href, win.location.href); - if (url.origin !== win.location.origin) - return; - if (stripBasePath(url.pathname, this.base) === null) + const anchor = this.findAnchor(event); + const url = this.resolveNavigationURL(event, anchor); + if (!url) return; event.preventDefault(); this.navigate(`${url.pathname}${url.search}${url.hash}`); @@ -1666,6 +2204,45 @@ var Ity = (function (exports) { this.routeCleanup = undefined; cleanup(); } + resolveNavigationURL(event, anchor, fallbackHref) { + var _a; + const mouseEvent = event; + if (event.defaultPrevented) + return null; + if (typeof mouseEvent.button === "number" && mouseEvent.button !== 0) + return null; + if (mouseEvent.metaKey || mouseEvent.ctrlKey || mouseEvent.shiftKey || mouseEvent.altKey) + return null; + if (anchor && ((anchor.target && anchor.target !== "_self") || anchor.hasAttribute("download"))) + return null; + const win = getWindow(); + if (!win) + return null; + const href = (_a = anchor === null || anchor === void 0 ? void 0 : anchor.getAttribute("href")) !== null && _a !== void 0 ? _a : fallbackHref; + if (!href || /^(mailto|tel):/i.test(href)) + return null; + const url = new URL((anchor === null || anchor === void 0 ? void 0 : anchor.href) || href, win.location.href); + if (url.origin !== win.location.origin) + return null; + if (stripBasePath(url.pathname, this.base) === null) + return null; + return url; + } + findAnchor(event) { + var _a; + const fromPath = typeof event.composedPath === "function" + ? event.composedPath() + : []; + for (const entry of fromPath) { + if (!entry || !entry.matches) + continue; + const element = entry; + if (element.matches(this.linkSelector)) + return element; + } + const target = event.target; + return (_a = target === null || target === void 0 ? void 0 : target.closest) === null || _a === void 0 ? void 0 : _a.call(target, this.linkSelector); + } } function createRouteRecord(pattern, handler) { const win = getWindow(); @@ -1783,7 +2360,8 @@ var Ity = (function (exports) { return router; } const Ity = { - version: "2.1.0", + version: "2.2.0", + createConfig, configure, signal, computed, @@ -1796,6 +2374,7 @@ var Ity = (function (exports) { resource, action, form, + formState, html, unsafeHTML, render, @@ -1839,9 +2418,11 @@ var Ity = (function (exports) { exports.component = component; exports.computed = computed; exports.configure = configure; + exports.createConfig = createConfig; exports.default = Ity; exports.effect = effect; exports.form = form; + exports.formState = formState; exports.html = html; exports.isSignal = isSignal; exports.onDOMReady = onDOMReady; diff --git a/dist/ity.js.map b/dist/ity.js.map index f56f2c9..0c249c0 100644 --- a/dist/ity.js.map +++ b/dist/ity.js.map @@ -1 +1 @@ -{"version":3,"file":"ity.js","sources":["../Ity.ts"],"sourcesContent":["// Ity.ts 2.1.0\n// (c) 2026 Dominic Cocchiarella\n// Tiny dependency-free reactive app kernel with V1 MVC compatibility.\ndeclare var define: any;\ndeclare var module: any;\n\ntype Cleanup = () => void;\ntype Equality = (prev: T, next: T) => boolean;\ntype Subscriber = (value: T, previous: T) => void;\ntype MaybeSignal = T | ReadonlySignal;\ntype TemplateValue =\n | TemplateResult\n | UnsafeHTML\n | Node\n | string\n | number\n | boolean\n | null\n | undefined\n | TemplateValue[]\n | ReadonlySignal;\n\ninterface ReadonlySignal {\n (): T;\n get(): T;\n peek(): T;\n subscribe(callback: Subscriber, options?: { immediate?: boolean }): Cleanup;\n readonly isSignal: true;\n}\n\ninterface Signal extends ReadonlySignal {\n (next: T | ((previous: T) => T)): T;\n set(next: T | ((previous: T) => T)): T;\n update(updater: (previous: T) => T): T;\n}\n\ninterface ReactiveSource {\n observers: Set;\n}\n\ninterface ReactiveObserver {\n deps: Set;\n markDirty(): void;\n}\n\ninterface ComputedOptions {\n equals?: Equality;\n}\n\ninterface SignalOptions {\n equals?: Equality;\n name?: string;\n}\n\ninterface EffectHandle {\n (): void;\n dispose(): void;\n}\n\ninterface TemplateResult {\n readonly isTemplateResult: true;\n readonly strings: readonly string[];\n readonly values: readonly unknown[];\n}\n\ninterface UnsafeHTML {\n readonly isUnsafeHTML: true;\n readonly value: string;\n}\n\ntype HTMLSanitizer = (value: string) => string;\n\ninterface UnsafeHTMLOptions {\n sanitize?: HTMLSanitizer;\n}\n\ninterface ItyConfig {\n sanitizeHTML?: HTMLSanitizer | null;\n}\n\ninterface RenderOptions {\n reactive?: boolean;\n transition?: boolean;\n}\n\ntype StoreKey = string | symbol;\n\ninterface StoreApi> {\n $patch(patch: Partial | ((current: T) => Partial | void)): void;\n $snapshot(): T;\n $subscribe(callback: (value: T) => void, options?: { immediate?: boolean }): Cleanup;\n}\n\ntype Store> = T & StoreApi;\n\ntype AsyncStatus = \"idle\" | \"loading\" | \"success\" | \"error\";\n\ninterface ResourceContext {\n signal: AbortSignal;\n previous: T | undefined;\n refreshId: number;\n}\n\ninterface ResourceOptions {\n initialValue?: T;\n immediate?: boolean;\n keepPrevious?: boolean;\n onSuccess?: (value: T) => void;\n onError?: (error: E) => void;\n}\n\ninterface Resource {\n readonly data: Signal;\n readonly error: Signal;\n readonly loading: ReadonlySignal;\n readonly status: ReadonlySignal;\n readonly promise: Promise | null;\n refresh(): Promise;\n mutate(value: T | undefined): void;\n abort(reason?: unknown): void;\n}\n\ninterface ActionOptions {\n onSuccess?: (value: TResult) => void;\n onError?: (error: E) => void;\n}\n\ninterface Action {\n (...args: TArgs): Promise;\n submit(...args: TArgs): Promise;\n readonly data: Signal;\n readonly error: Signal;\n readonly pending: ReadonlySignal;\n readonly pendingCount: ReadonlySignal;\n readonly status: ReadonlySignal;\n reset(): void;\n}\n\ninterface FormController {\n readonly action: Action<[FormData, Event], TResult, E>;\n readonly data: Signal;\n readonly error: Signal;\n readonly pending: ReadonlySignal;\n readonly status: ReadonlySignal;\n onSubmit(event: Event): Promise;\n reset(): void;\n}\n\ninterface FormOptions extends ActionOptions {\n resetOnSuccess?: boolean;\n}\n\nconst defaultEquals = Object.is;\nlet activeObserver: ReactiveObserver | null = null;\nlet batchDepth = 0;\nconst pendingEffects = new Set();\nlet configuredSanitizeHTML: HTMLSanitizer | undefined;\n\nfunction getWindow(): (Window & typeof globalThis) | undefined {\n return typeof window !== \"undefined\" ? window : undefined;\n}\n\nfunction getDocument(): Document | undefined {\n const win = getWindow();\n return win?.document ?? (typeof document !== \"undefined\" ? document : undefined);\n}\n\nfunction trackDependency(source: ReactiveSource): void {\n if (!activeObserver) return;\n source.observers.add(activeObserver);\n activeObserver.deps.add(source);\n}\n\nfunction cleanupDependencies(observer: ReactiveObserver): void {\n for (const dep of observer.deps) {\n dep.observers.delete(observer);\n }\n observer.deps.clear();\n}\n\nfunction notifyObservers(source: ReactiveSource): void {\n for (const observer of Array.from(source.observers)) {\n observer.markDirty();\n }\n}\n\nfunction flushEffects(): void {\n if (batchDepth > 0) return;\n while (pendingEffects.size) {\n const effects = Array.from(pendingEffects);\n pendingEffects.clear();\n for (const effect of effects) {\n effect.run();\n }\n }\n}\n\nfunction queueEffect(effect: ReactiveEffect): void {\n pendingEffects.add(effect);\n flushEffects();\n}\n\nclass SignalNode implements ReactiveSource {\n observers = new Set();\n private subscribers = new Set>();\n private value: T;\n private equals: Equality;\n\n constructor(value: T, options: SignalOptions = {}) {\n this.value = value;\n this.equals = options.equals || defaultEquals;\n }\n\n read(track = true): T {\n if (track) trackDependency(this);\n return this.value;\n }\n\n write(next: T | ((previous: T) => T)): T {\n const previous = this.value;\n const resolved = typeof next === \"function\"\n ? (next as (previous: T) => T)(previous)\n : next;\n if (this.equals(previous, resolved)) return previous;\n this.value = resolved;\n notifyObservers(this);\n for (const subscriber of Array.from(this.subscribers)) {\n subscriber(resolved, previous);\n }\n flushEffects();\n return resolved;\n }\n\n subscribe(callback: Subscriber, options: { immediate?: boolean } = {}): Cleanup {\n this.subscribers.add(callback);\n if (options.immediate) callback(this.value, this.value);\n return () => {\n this.subscribers.delete(callback);\n };\n }\n}\n\nclass ComputedNode implements ReactiveSource, ReactiveObserver {\n observers = new Set();\n deps = new Set();\n private subscribers = new Set>();\n private dirty = true;\n private initialized = false;\n private value!: T;\n private equals: Equality;\n\n constructor(private readonly getter: () => T, options: ComputedOptions = {}) {\n this.equals = options.equals || defaultEquals;\n }\n\n read(track = true): T {\n if (track) trackDependency(this);\n if (this.dirty) this.evaluate();\n return this.value;\n }\n\n markDirty(): void {\n if (this.dirty) return;\n const previous = this.value;\n this.dirty = true;\n notifyObservers(this);\n if (this.subscribers.size) {\n const next = this.read(false);\n if (!this.equals(previous, next)) {\n for (const subscriber of Array.from(this.subscribers)) {\n subscriber(next, previous);\n }\n }\n }\n }\n\n subscribe(callback: Subscriber, options: { immediate?: boolean } = {}): Cleanup {\n this.subscribers.add(callback);\n if (options.immediate) {\n const current = this.read(false);\n callback(current, current);\n }\n return () => {\n this.subscribers.delete(callback);\n };\n }\n\n private evaluate(): void {\n cleanupDependencies(this);\n const previousObserver = activeObserver;\n activeObserver = this;\n try {\n this.value = this.getter();\n this.dirty = false;\n this.initialized = true;\n } finally {\n activeObserver = previousObserver;\n }\n }\n}\n\nclass ReactiveEffect implements ReactiveObserver {\n deps = new Set();\n private disposed = false;\n private cleanup?: Cleanup;\n\n constructor(private readonly callback: (onCleanup: (cleanup: Cleanup) => void) => void) {\n this.run();\n }\n\n markDirty(): void {\n if (!this.disposed) queueEffect(this);\n }\n\n run(): void {\n if (this.disposed) return;\n cleanupDependencies(this);\n if (this.cleanup) {\n const cleanup = this.cleanup;\n this.cleanup = undefined;\n cleanup();\n }\n const previousObserver = activeObserver;\n activeObserver = this;\n try {\n this.callback((cleanup) => {\n this.cleanup = cleanup;\n });\n } finally {\n activeObserver = previousObserver;\n }\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n cleanupDependencies(this);\n if (this.cleanup) {\n const cleanup = this.cleanup;\n this.cleanup = undefined;\n cleanup();\n }\n pendingEffects.delete(this);\n }\n}\n\nfunction signal(initialValue: T, options: SignalOptions = {}): Signal {\n const node = new SignalNode(initialValue, options);\n const readWrite = function (next?: T | ((previous: T) => T)): T {\n if (arguments.length === 0) return node.read(true);\n return node.write(next as T | ((previous: T) => T));\n } as Signal;\n readWrite.get = () => node.read(true);\n readWrite.peek = () => node.read(false);\n readWrite.set = (next) => node.write(next);\n readWrite.update = (updater) => node.write(updater);\n readWrite.subscribe = (callback, subscribeOptions) => node.subscribe(callback, subscribeOptions);\n Object.defineProperty(readWrite, \"isSignal\", { value: true });\n return readWrite;\n}\n\nfunction computed(getter: () => T, options: ComputedOptions = {}): ReadonlySignal {\n const node = new ComputedNode(getter, options);\n const read = function (): T {\n return node.read(true);\n } as ReadonlySignal;\n read.get = () => node.read(true);\n read.peek = () => node.read(false);\n read.subscribe = (callback, subscribeOptions) => node.subscribe(callback, subscribeOptions);\n Object.defineProperty(read, \"isSignal\", { value: true });\n return read;\n}\n\nfunction effect(callback: (onCleanup: (cleanup: Cleanup) => void) => void): EffectHandle {\n const runner = new ReactiveEffect(callback);\n const dispose = (() => runner.dispose()) as EffectHandle;\n dispose.dispose = dispose;\n return dispose;\n}\n\nfunction batch(callback: () => T): T {\n batchDepth += 1;\n try {\n return callback();\n } finally {\n batchDepth -= 1;\n flushEffects();\n }\n}\n\nfunction untrack(callback: () => T): T {\n const previousObserver = activeObserver;\n activeObserver = null;\n try {\n return callback();\n } finally {\n activeObserver = previousObserver;\n }\n}\n\nfunction isSignal(value: unknown): value is ReadonlySignal {\n return typeof value === \"function\" && (value as any).isSignal === true;\n}\n\nfunction resolveSignal(value: MaybeSignal): T {\n return isSignal(value) ? value() : value;\n}\n\nfunction configure(options: ItyConfig = {}): void {\n configuredSanitizeHTML = options.sanitizeHTML || undefined;\n}\n\nfunction store>(initialValue: T): Store {\n const keys = new Set(Reflect.ownKeys(initialValue));\n const signals = new Map>();\n const structure = signal(0);\n\n const ensureSignal = (key: StoreKey): Signal => {\n if (!signals.has(key)) {\n signals.set(key, signal((initialValue as any)[key]));\n }\n return signals.get(key)!;\n };\n\n const bumpStructure = (): void => {\n structure.update((version) => version + 1);\n };\n\n const setKey = (key: StoreKey, value: any): void => {\n const hadKey = keys.has(key);\n if (!hadKey) keys.add(key);\n ensureSignal(key).set(value);\n if (!hadKey) bumpStructure();\n };\n\n const snapshot = (): T => {\n structure();\n const out: any = {};\n for (const key of keys) {\n out[key] = ensureSignal(key)();\n }\n return out as T;\n };\n\n const api: StoreApi = {\n $patch(patch) {\n const current = snapshot();\n const next = typeof patch === \"function\" ? patch(current) : patch;\n if (!next) return;\n batch(() => {\n for (const key of Reflect.ownKeys(next)) {\n setKey(key, (next as any)[key]);\n }\n });\n },\n $snapshot: snapshot,\n $subscribe(callback, options = {}) {\n let first = true;\n return effect(() => {\n const value = snapshot();\n if (first && !options.immediate) {\n first = false;\n return;\n }\n first = false;\n callback(value);\n });\n }\n };\n\n return new Proxy(api as Store, {\n get(target, key, receiver) {\n if (key in target) return Reflect.get(target, key, receiver);\n return ensureSignal(key)();\n },\n set(_target, key, value) {\n batch(() => {\n setKey(key, value);\n });\n return true;\n },\n deleteProperty(_target, key) {\n if (!keys.has(key)) return true;\n keys.delete(key);\n batch(() => {\n ensureSignal(key).set(undefined);\n bumpStructure();\n });\n return true;\n },\n ownKeys(target) {\n structure();\n return Array.from(new Set([...Reflect.ownKeys(target), ...keys]));\n },\n getOwnPropertyDescriptor(target, key) {\n structure();\n if (Object.prototype.hasOwnProperty.call(target, key)) {\n return { ...Reflect.getOwnPropertyDescriptor(target, key)!, enumerable: false };\n }\n if (!keys.has(key)) return undefined;\n return { enumerable: true, configurable: true };\n },\n has(target, key) {\n structure();\n return key in target || keys.has(key);\n }\n });\n}\n\nfunction resource(\n loader: (context: ResourceContext) => Promise | T,\n options: ResourceOptions = {}\n): Resource {\n const data = signal(options.initialValue);\n const error = signal(null);\n const pending = signal(false);\n const statusValue = signal(options.initialValue === undefined ? \"idle\" : \"success\");\n const loading = computed(() => pending());\n const status = computed(() => statusValue());\n const keepPrevious = options.keepPrevious !== false;\n let controller: AbortController | null = null;\n let refreshId = 0;\n let currentPromise: Promise | null = null;\n\n const api: Resource = {\n data,\n error,\n loading,\n status,\n get promise() {\n return currentPromise;\n },\n refresh() {\n refreshId += 1;\n const id = refreshId;\n if (controller) controller.abort();\n controller = new AbortController();\n const signal = controller.signal;\n const previous = data.peek();\n pending.set(true);\n statusValue.set(\"loading\");\n error.set(null);\n if (!keepPrevious) data.set(undefined);\n\n currentPromise = Promise.resolve()\n .then(() => loader({ signal, previous, refreshId: id }))\n .then((value) => {\n if (id !== refreshId || signal.aborted) return data.peek();\n data.set(value);\n error.set(null);\n statusValue.set(\"success\");\n options.onSuccess?.(value);\n return value;\n })\n .catch((err) => {\n if (id !== refreshId) return data.peek();\n error.set(err as E);\n statusValue.set(\"error\");\n options.onError?.(err as E);\n return data.peek();\n })\n .finally(() => {\n if (id === refreshId) {\n pending.set(false);\n controller = null;\n }\n });\n\n return currentPromise;\n },\n mutate(value) {\n refreshId += 1;\n if (controller) controller.abort();\n controller = null;\n currentPromise = null;\n data.set(value);\n error.set(null);\n pending.set(false);\n statusValue.set(value === undefined ? \"idle\" : \"success\");\n },\n abort(reason?: unknown) {\n if (!controller) return;\n refreshId += 1;\n controller.abort(reason);\n controller = null;\n currentPromise = null;\n pending.set(false);\n statusValue.set(data.peek() === undefined ? \"idle\" : \"success\");\n }\n };\n\n if (options.immediate !== false) {\n api.refresh();\n }\n\n return api;\n}\n\nfunction action(\n handler: (...args: TArgs) => Promise | TResult,\n options: ActionOptions = {}\n): Action {\n const data = signal(undefined);\n const error = signal(null);\n const count = signal(0);\n const statusValue = signal(\"idle\");\n const pending = computed(() => count() > 0);\n const pendingCount = computed(() => count());\n const status = computed(() => statusValue());\n let generation = 0;\n\n const submit = (...args: TArgs): Promise => {\n const runGeneration = generation;\n count.update((value) => value + 1);\n statusValue.set(\"loading\");\n error.set(null);\n\n return Promise.resolve()\n .then(() => handler(...args))\n .then((value) => {\n if (runGeneration === generation) {\n data.set(value);\n error.set(null);\n options.onSuccess?.(value);\n if (count.peek() <= 1) statusValue.set(\"success\");\n }\n return value;\n })\n .catch((err) => {\n if (runGeneration === generation) {\n error.set(err as E);\n options.onError?.(err as E);\n if (count.peek() <= 1) statusValue.set(\"error\");\n }\n throw err;\n })\n .finally(() => {\n if (runGeneration !== generation) return;\n count.update((value) => Math.max(0, value - 1));\n if (count.peek() > 0) statusValue.set(\"loading\");\n });\n };\n\n const callable = ((...args: TArgs) => submit(...args)) as Action;\n const mutableCallable = callable as Action & {\n submit: (...args: TArgs) => Promise;\n data: Signal;\n error: Signal;\n pending: ReadonlySignal;\n pendingCount: ReadonlySignal;\n status: ReadonlySignal;\n };\n mutableCallable.submit = submit;\n mutableCallable.data = data;\n mutableCallable.error = error;\n mutableCallable.pending = pending;\n mutableCallable.pendingCount = pendingCount;\n mutableCallable.status = status;\n callable.reset = () => {\n generation += 1;\n data.set(undefined);\n error.set(null);\n count.set(0);\n statusValue.set(\"idle\");\n };\n return callable;\n}\n\nfunction form(\n handler: (data: FormData, event: Event) => Promise | TResult,\n options: FormOptions = {}\n): FormController {\n const submitAction = action<[FormData, Event], TResult, E>(handler, options);\n\n const findForm = (event: Event): HTMLFormElement => {\n const target = (event.currentTarget || event.target) as Element | null;\n const getFormElementCtor = (node: Element | null): typeof HTMLFormElement | undefined => {\n const ownerWindow = node?.ownerDocument?.defaultView as (Window & typeof globalThis) | null | undefined;\n return ownerWindow?.HTMLFormElement\n || getWindow()?.HTMLFormElement\n || (typeof HTMLFormElement !== \"undefined\" ? HTMLFormElement : undefined);\n };\n const isFormElement = (node: Element | null | undefined): node is HTMLFormElement => {\n const FormElement = node ? getFormElementCtor(node) : getFormElementCtor(target);\n return Boolean(node && FormElement && node instanceof FormElement);\n };\n if (!getFormElementCtor(target)) throw new Error(\"Ity.form requires HTMLFormElement support\");\n if (isFormElement(target)) return target;\n const closest = target?.closest?.(\"form\");\n if (isFormElement(closest)) return closest;\n throw new Error(\"Ity.form onSubmit requires a form event target\");\n };\n\n const createFormData = (formElement: HTMLFormElement): FormData => {\n const ownerWindow = formElement.ownerDocument?.defaultView as (Window & typeof globalThis) | null | undefined;\n const FormDataCtor = ownerWindow?.FormData\n || getWindow()?.FormData\n || (typeof FormData !== \"undefined\" ? FormData : undefined);\n if (!FormDataCtor) throw new Error(\"Ity.form requires FormData support\");\n return new FormDataCtor(formElement);\n };\n\n return {\n action: submitAction,\n data: submitAction.data,\n error: submitAction.error,\n pending: submitAction.pending,\n status: submitAction.status,\n async onSubmit(event: Event): Promise {\n event.preventDefault();\n const formElement = findForm(event);\n const result = await submitAction(createFormData(formElement), event);\n if (options.resetOnSuccess) formElement.reset();\n return result;\n },\n reset() {\n submitAction.reset();\n }\n };\n}\n\nfunction html(strings: TemplateStringsArray | readonly string[], ...values: unknown[]): TemplateResult {\n return {\n isTemplateResult: true,\n strings: Array.from(strings),\n values\n };\n}\n\nfunction unsafeHTML(value: string, options: UnsafeHTMLOptions = {}): UnsafeHTML {\n const sanitizer = options.sanitize || configuredSanitizeHTML;\n return {\n isUnsafeHTML: true,\n value: sanitizer ? sanitizer(String(value)) : String(value)\n };\n}\n\nfunction isTemplateResult(value: unknown): value is TemplateResult {\n return !!value && typeof value === \"object\" && (value as TemplateResult).isTemplateResult === true;\n}\n\nfunction isUnsafeHTML(value: unknown): value is UnsafeHTML {\n return !!value && typeof value === \"object\" && (value as UnsafeHTML).isUnsafeHTML === true;\n}\n\nfunction isNodeLike(value: unknown): value is Node {\n return !!value && typeof value === \"object\" && typeof (value as Node).nodeType === \"number\";\n}\n\nfunction documentOrThrow(): Document {\n const doc = getDocument();\n if (!doc) throw new Error(\"Ity DOM rendering requires a document\");\n return doc;\n}\n\nfunction normalizeValue(value: unknown): unknown {\n return isSignal(value) ? value() : value;\n}\n\nfunction valueToFragment(value: unknown, doc: Document = documentOrThrow()): DocumentFragment {\n const fragment = doc.createDocumentFragment();\n appendValue(fragment, normalizeValue(value), doc);\n return fragment;\n}\n\nfunction appendValue(parent: Node, value: unknown, doc: Document): void {\n value = normalizeValue(value);\n if (value === null || value === undefined || value === false) return;\n if (Array.isArray(value)) {\n for (const item of value) appendValue(parent, item, doc);\n return;\n }\n if (isTemplateResult(value)) {\n parent.appendChild(materializeTemplate(value, doc));\n return;\n }\n if (isUnsafeHTML(value)) {\n const template = doc.createElement(\"template\");\n template.innerHTML = value.value;\n parent.appendChild(template.content.cloneNode(true));\n return;\n }\n if (isNodeLike(value)) {\n parent.appendChild(value);\n return;\n }\n parent.appendChild(doc.createTextNode(String(value)));\n}\n\ninterface Binding {\n index: number;\n kind: \"node\" | \"event\" | \"attr\" | \"prop\" | \"bool\";\n name?: string;\n}\n\nfunction materializeTemplate(result: TemplateResult, doc: Document = documentOrThrow()): DocumentFragment {\n const bindings: Binding[] = [];\n let source = \"\";\n\n for (let i = 0; i < result.values.length; i += 1) {\n const part = result.strings[i] ?? \"\";\n const attrMatch = part.match(/([@.?]?[\\w:-]+)\\s*=\\s*$/);\n if (attrMatch) {\n const rawName = attrMatch[1];\n const before = part.slice(0, part.length - attrMatch[0].length);\n const marker = `data-ity-bind-${i}`;\n const first = rawName[0];\n const kind = first === \"@\" ? \"event\" : first === \".\" ? \"prop\" : first === \"?\" ? \"bool\" : \"attr\";\n const name = kind === \"attr\" ? rawName : rawName.slice(1);\n bindings.push({ index: i, kind, name });\n source += `${before}${marker}=\"\"`;\n } else {\n bindings.push({ index: i, kind: \"node\" });\n source += `${part}`;\n }\n }\n source += result.strings[result.strings.length - 1] ?? \"\";\n\n const template = doc.createElement(\"template\");\n template.innerHTML = source;\n const fragment = template.content.cloneNode(true) as DocumentFragment;\n applyBindings(fragment, bindings, result.values, doc);\n return fragment;\n}\n\nfunction applyBindings(root: DocumentFragment, bindings: Binding[], values: readonly unknown[], doc: Document): void {\n const comments = new Map();\n const walker = doc.createTreeWalker(root, 128);\n let current = walker.nextNode();\n while (current) {\n const comment = current as Comment;\n const match = comment.data.match(/^ity:(\\d+)$/);\n if (match) {\n const index = Number(match[1]);\n const list = comments.get(index) || [];\n list.push(comment);\n comments.set(index, list);\n }\n current = walker.nextNode();\n }\n\n for (const binding of bindings) {\n const value = normalizeValue(values[binding.index]);\n if (binding.kind === \"node\") {\n const markers = comments.get(binding.index) || [];\n for (const marker of markers) {\n marker.replaceWith(valueToFragment(value, doc));\n }\n continue;\n }\n\n const attrName = `data-ity-bind-${binding.index}`;\n const elements = Array.from(root.querySelectorAll(`[${attrName}]`)) as HTMLElement[];\n for (const element of elements) {\n element.removeAttribute(attrName);\n applyElementBinding(element, binding, value);\n }\n }\n}\n\nfunction applyElementBinding(element: HTMLElement, binding: Binding, value: unknown): void {\n const name = binding.name || \"\";\n if (binding.kind === \"event\") {\n if (typeof value === \"function\") {\n element.addEventListener(name, value as EventListener);\n } else if (Array.isArray(value) && typeof value[0] === \"function\") {\n element.addEventListener(name, value[0] as EventListener, value[1] as AddEventListenerOptions);\n }\n return;\n }\n\n if (binding.kind === \"prop\") {\n (element as any)[name] = value;\n return;\n }\n\n if (binding.kind === \"bool\") {\n element.toggleAttribute(name, Boolean(value));\n return;\n }\n\n if (value === false || value === null || value === undefined) {\n element.removeAttribute(name);\n return;\n }\n\n if (name === \"class\" && Array.isArray(value)) {\n element.setAttribute(\"class\", value.filter(Boolean).join(\" \"));\n return;\n }\n\n if (name === \"class\" && typeof value === \"object\") {\n const classes = Object.keys(value as Record).filter((key) => Boolean((value as any)[key]));\n element.setAttribute(\"class\", classes.join(\" \"));\n return;\n }\n\n if (name === \"style\" && typeof value === \"object\" && value !== null) {\n Object.assign((element as HTMLElement).style, value);\n return;\n }\n\n element.setAttribute(name, value === true ? \"\" : String(value));\n}\n\nfunction resolveTarget(target: string | Element | DocumentFragment | SelectorObject): Element | DocumentFragment {\n if (typeof target === \"string\") {\n const found = documentOrThrow().querySelector(target);\n if (!found) throw new Error(`Render target not found: ${target}`);\n return found;\n }\n if ((target as SelectorObject)?.isSelectorObject) {\n const first = (target as SelectorObject).first()[0];\n if (!first) throw new Error(\"Cannot render into an empty SelectorObject\");\n return first;\n }\n return target as Element | DocumentFragment;\n}\n\nfunction replaceChildren(target: Element | DocumentFragment, fragment: DocumentFragment): void {\n const maybeTarget = target as any;\n if (typeof maybeTarget.replaceChildren === \"function\") {\n maybeTarget.replaceChildren(fragment);\n return;\n }\n while (target.firstChild) target.removeChild(target.firstChild);\n target.appendChild(fragment);\n}\n\nfunction withViewTransition(update: () => void, enabled: boolean | undefined): void {\n const doc = getDocument() as any;\n if (enabled && doc && typeof doc.startViewTransition === \"function\") {\n doc.startViewTransition(update);\n } else {\n update();\n }\n}\n\nfunction render(\n view: TemplateValue | (() => TemplateValue),\n target: string | Element | DocumentFragment | SelectorObject,\n options: RenderOptions = {}\n): Cleanup {\n const mount = resolveTarget(target);\n const update = () => {\n const value = typeof view === \"function\" && !isSignal(view)\n ? (view as () => TemplateValue)()\n : normalizeValue(view);\n withViewTransition(() => replaceChildren(mount, valueToFragment(value)), options.transition);\n };\n\n if (options.reactive === false) {\n update();\n return () => undefined;\n }\n\n return effect(update);\n}\n\nfunction renderToString(view: TemplateValue | (() => TemplateValue)): string {\n const value = typeof view === \"function\" && !isSignal(view)\n ? (view as () => TemplateValue)()\n : normalizeValue(view);\n return valueToString(value);\n}\n\nfunction valueToString(value: unknown): string {\n value = normalizeValue(value);\n if (value === null || value === undefined || value === false) return \"\";\n if (Array.isArray(value)) return value.map(valueToString).join(\"\");\n if (isTemplateResult(value)) return templateToString(value);\n if (isUnsafeHTML(value)) return value.value;\n if (isNodeLike(value)) {\n const node = value as any;\n if (typeof node.outerHTML === \"string\") return node.outerHTML;\n return escapeHTML(node.textContent || \"\");\n }\n return escapeHTML(String(value));\n}\n\nfunction templateToString(result: TemplateResult): string {\n let source = \"\";\n for (let i = 0; i < result.values.length; i += 1) {\n const part = result.strings[i] ?? \"\";\n const attrMatch = part.match(/([@.?]?[\\w:-]+)\\s*=\\s*$/);\n const value = normalizeValue(result.values[i]);\n if (attrMatch) {\n const rawName = attrMatch[1];\n const before = part.slice(0, part.length - attrMatch[0].length);\n const first = rawName[0];\n const kind = first === \"@\" ? \"event\" : first === \".\" ? \"prop\" : first === \"?\" ? \"bool\" : \"attr\";\n const name = kind === \"attr\" ? rawName : rawName.slice(1);\n if (kind === \"event\" || kind === \"prop\" || value === false || value === null || value === undefined) {\n source += before;\n } else if (kind === \"bool\") {\n source += value ? `${before}${name}` : before;\n } else {\n source += `${before}${name}=\"${escapeAttribute(stringifyAttribute(name, value))}\"`;\n }\n } else {\n source += part + valueToString(value);\n }\n }\n source += result.strings[result.strings.length - 1] ?? \"\";\n return source;\n}\n\nfunction stringifyAttribute(name: string, value: unknown): string {\n if (name === \"class\" && Array.isArray(value)) return value.filter(Boolean).join(\" \");\n if (name === \"class\" && typeof value === \"object\" && value !== null) {\n return Object.keys(value as Record).filter((key) => Boolean((value as any)[key])).join(\" \");\n }\n if (name === \"style\" && typeof value === \"object\" && value !== null) {\n return Object.keys(value as Record)\n .map((key) => `${key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`)}:${(value as any)[key]}`)\n .join(\";\");\n }\n return value === true ? \"\" : String(value);\n}\n\nfunction escapeHTML(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(//g, \">\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeHTML(value)\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\ninterface ComponentContext {\n host: HTMLElement;\n root: HTMLElement | ShadowRoot;\n attr(name: string): ReadonlySignal;\n emit(name: string, detail?: T, options?: CustomEventInit): boolean;\n effect(callback: (onCleanup: (cleanup: Cleanup) => void) => void): EffectHandle;\n onConnected(callback: () => void): void;\n onDisconnected(callback: () => void): void;\n}\n\ntype ComponentRender = TemplateValue | (() => TemplateValue);\ntype ComponentSetup = (ctx: ComponentContext) => ComponentRender | void;\n\ninterface ComponentOptions {\n attrs?: string[];\n observedAttributes?: string[];\n shadow?: boolean | ShadowRootMode | ShadowRootInit;\n styles?: string;\n setup?: ComponentSetup;\n}\n\nfunction component(\n name: string,\n setupOrOptions: ComponentSetup | ComponentOptions,\n maybeOptions: Omit = {}\n): CustomElementConstructor {\n const win = getWindow();\n if (!win?.customElements || !win.HTMLElement) {\n throw new Error(\"Ity.component requires Custom Elements support\");\n }\n\n if (win.customElements.get(name)) {\n return win.customElements.get(name)!;\n }\n\n const definition: ComponentOptions = typeof setupOrOptions === \"function\"\n ? { ...maybeOptions, setup: setupOrOptions }\n : setupOrOptions;\n const attrs = definition.observedAttributes || definition.attrs || [];\n\n class ItyElement extends win.HTMLElement {\n static get observedAttributes(): string[] {\n return attrs;\n }\n\n private attrSignals = new Map>();\n private connectedCallbacks: Cleanup[] = [];\n private disconnectedCallbacks: Cleanup[] = [];\n private effectRecords: Array<{\n callback: (onCleanup: (cleanup: Cleanup) => void) => void;\n handle?: EffectHandle;\n disposed: boolean;\n }> = [];\n private renderCleanup?: Cleanup;\n private mount?: HTMLElement | ShadowRoot;\n private renderTarget?: HTMLElement | ShadowRoot;\n private renderOutput?: ComponentRender;\n private initialized = false;\n private connected = false;\n\n connectedCallback(): void {\n this.ensureMount();\n if (!this.initialized) {\n this.initialized = true;\n const ctx = this.createContext();\n const output = definition.setup?.(ctx);\n if (output !== undefined) {\n this.renderOutput = output as ComponentRender;\n }\n }\n this.connected = true;\n this.startRender();\n this.startEffects();\n for (const callback of this.connectedCallbacks) callback();\n }\n\n disconnectedCallback(): void {\n this.connected = false;\n if (this.renderCleanup) {\n this.renderCleanup();\n this.renderCleanup = undefined;\n }\n for (const record of this.effectRecords) {\n record.handle?.dispose();\n record.handle = undefined;\n }\n for (const callback of this.disconnectedCallbacks) callback();\n }\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\n this.ensureAttrSignal(name).set(newValue);\n }\n\n private ensureMount(): void {\n if (this.mount && this.renderTarget) return;\n const shadow = definition.shadow;\n if (shadow === false) {\n this.mount = this;\n } else {\n const init: ShadowRootInit = typeof shadow === \"object\"\n ? shadow\n : { mode: shadow === \"closed\" ? \"closed\" : \"open\" };\n this.mount = this.shadowRoot || this.attachShadow(init);\n }\n\n if (definition.styles) {\n const doc = this.ownerDocument;\n const style = doc.createElement(\"style\");\n style.textContent = definition.styles;\n const container = doc.createElement(\"span\");\n container.setAttribute(\"data-ity-component-root\", \"\");\n this.mount.appendChild(style);\n this.mount.appendChild(container);\n this.renderTarget = container;\n } else {\n this.renderTarget = this.mount;\n }\n }\n\n private startRender(): void {\n if (this.renderCleanup || this.renderOutput === undefined) return;\n this.renderCleanup = render(this.renderOutput, this.renderTarget!, { transition: false });\n }\n\n private startEffects(): void {\n for (const record of this.effectRecords) {\n if (!record.disposed && !record.handle) {\n record.handle = effect(record.callback);\n }\n }\n }\n\n private ensureAttrSignal(name: string): Signal {\n if (!this.attrSignals.has(name)) {\n this.attrSignals.set(name, signal(this.getAttribute(name)));\n }\n return this.attrSignals.get(name)!;\n }\n\n private createContext(): ComponentContext {\n return {\n host: this,\n root: this.mount!,\n attr: (name) => this.ensureAttrSignal(name),\n emit: (name, detail, options = {}) => this.dispatchEvent(new CustomEvent(name, {\n bubbles: true,\n composed: true,\n ...options,\n detail\n })),\n effect: (callback) => {\n const record = { callback, disposed: false, handle: undefined as EffectHandle | undefined };\n this.effectRecords.push(record);\n if (this.connected) record.handle = effect(callback);\n const dispose = (() => {\n record.disposed = true;\n record.handle?.dispose();\n record.handle = undefined;\n }) as EffectHandle;\n dispose.dispose = dispose;\n return dispose;\n },\n onConnected: (callback) => {\n this.connectedCallbacks.push(callback);\n },\n onDisconnected: (callback) => {\n this.disconnectedCallbacks.push(callback);\n }\n };\n }\n }\n\n win.customElements.define(name, ItyElement);\n return ItyElement;\n}\n\ninterface EventRecord {\n callback: (data?: unknown) => void;\n ctx: any;\n}\n\nclass Evented {\n private _events: Record = {};\n\n on(evtName: string, callback: (data?: unknown) => void, context: any = this): void {\n (this._events[evtName] ||= []).push({ callback, ctx: context });\n }\n\n off(evtName?: string, callback?: (data?: unknown) => void, context?: any): void {\n if (!evtName) {\n this._events = {};\n return;\n }\n const events = this._events[evtName];\n if (!events) return;\n if (!callback) {\n delete this._events[evtName];\n return;\n }\n for (let i = events.length - 1; i >= 0; i -= 1) {\n const event = events[i];\n if (event.callback === callback && (context === undefined || event.ctx === context)) {\n events.splice(i, 1);\n }\n }\n if (events.length === 0) delete this._events[evtName];\n }\n\n trigger(evtName: string, data?: unknown): void {\n const events = this._events[evtName];\n if (!events) return;\n for (const event of events.slice()) {\n event.callback.call(event.ctx, data);\n }\n }\n}\n\nconst regexps = {\n nospaces: /^\\S*$/\n} as const;\n\nclass SelectorObject {\n [index: number]: HTMLElement;\n public readonly isSelectorObject = true;\n private nodes: HTMLElement[] = [];\n\n constructor(nodeList: ArrayLike = []) {\n this.nodes = Array.from(nodeList as HTMLElement[]);\n this.reindex();\n }\n\n get length(): number {\n return this.nodes.length;\n }\n\n [Symbol.iterator](): Iterator {\n return this.nodes[Symbol.iterator]();\n }\n\n toArray(): HTMLElement[] {\n return this.nodes.slice();\n }\n\n find(selector: string): SelectorObject {\n const nodeList: HTMLElement[] = [];\n for (const node of this.nodes) {\n const list = node.querySelectorAll(selector);\n for (const thisNode of Array.from(list)) {\n const elm = thisNode as HTMLElement;\n if (nodeList.indexOf(elm) < 0) nodeList.push(elm);\n }\n }\n return new SelectorObject(nodeList);\n }\n\n filter(selector: string): SelectorObject {\n return new SelectorObject(this.nodes.filter((node) => node.matches(selector)));\n }\n\n first(): SelectorObject {\n return new SelectorObject(this.nodes[0] ? [this.nodes[0]] : []);\n }\n\n last(): SelectorObject {\n return new SelectorObject(this.nodes.length ? [this.nodes[this.nodes.length - 1]] : []);\n }\n\n parent(): SelectorObject {\n const nodeList: HTMLElement[] = [];\n for (const node of this.nodes) {\n const parent = node.parentElement;\n if (parent && nodeList.indexOf(parent) < 0) nodeList.push(parent);\n }\n return new SelectorObject(nodeList);\n }\n\n children(selector?: string): SelectorObject {\n const nodeList: HTMLElement[] = [];\n for (const node of this.nodes) {\n for (const child of Array.from(node.children) as HTMLElement[]) {\n if (nodeList.indexOf(child) < 0 && (!selector || child.matches(selector))) {\n nodeList.push(child);\n }\n }\n }\n return new SelectorObject(nodeList);\n }\n\n remove(): SelectorObject {\n for (const node of this.nodes) node.remove();\n return new SelectorObject([]);\n }\n\n addClass(...classes: string[]): this {\n for (const node of this.nodes) node.classList.add(...classes);\n return this;\n }\n\n removeClass(value: string): this {\n if (value && regexps.nospaces.test(value)) {\n for (const node of this.nodes) node.classList.remove(value);\n }\n return this;\n }\n\n toggleClass(value: string): this {\n if (value && regexps.nospaces.test(value)) {\n for (const node of this.nodes) node.classList.toggle(value);\n }\n return this;\n }\n\n hasClass(value: string): boolean {\n return Boolean(value && regexps.nospaces.test(value) && this.nodes.some((node) => node.classList.contains(value)));\n }\n\n attr(name: string, value?: string | number | boolean | null): string | null | this {\n if (arguments.length === 1) return this.nodes[0]?.getAttribute(name) ?? null;\n for (const node of this.nodes) {\n if (value === null || value === false || value === undefined) node.removeAttribute(name);\n else node.setAttribute(name, value === true ? \"\" : String(value));\n }\n return this;\n }\n\n text(value?: string | number | boolean): string | this {\n if (arguments.length === 0) return this.nodes.map((node) => node.textContent || \"\").join(\"\");\n for (const node of this.nodes) node.textContent = String(value);\n return this;\n }\n\n on(eventName: string, listener: EventListener, options?: AddEventListenerOptions): this {\n for (const node of this.nodes) node.addEventListener(eventName, listener, options);\n return this;\n }\n\n off(eventName: string, listener: EventListener, options?: EventListenerOptions): this {\n for (const node of this.nodes) node.removeEventListener(eventName, listener, options);\n return this;\n }\n\n before(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"beforebegin\");\n }\n\n after(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"afterend\");\n }\n\n append(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"beforeend\");\n }\n\n prepend(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"afterbegin\");\n }\n\n html(content?: string | SelectorObject | HTMLElement | TemplateResult): this | string {\n if (arguments.length === 0) return this.nodes[0]?.innerHTML ?? \"\";\n return this._html(content!, \"replace\");\n }\n\n empty(): this {\n for (const node of this.nodes) node.textContent = \"\";\n return this;\n }\n\n private _html(content: string | SelectorObject | HTMLElement | TemplateResult, position: InsertPosition | \"replace\"): this {\n const doc = getDocument();\n for (const node of this.nodes) {\n if ((content as SelectorObject)?.isSelectorObject) {\n const htmls = Array.from(content as SelectorObject).map((selNode) => selNode.outerHTML).join(\"\");\n if (position === \"replace\") node.innerHTML = htmls;\n else node.insertAdjacentHTML(position as InsertPosition, htmls);\n } else if (isTemplateResult(content) && doc) {\n const fragment = materializeTemplate(content, doc);\n if (position === \"replace\") replaceChildren(node, fragment);\n else node.insertAdjacentElement(position as InsertPosition, fragmentToElement(fragment, doc));\n } else if (isNodeLike(content)) {\n const cloned = content.cloneNode(true) as HTMLElement;\n if (position === \"replace\") replaceChildren(node, valueToFragment(cloned, doc || node.ownerDocument));\n else node.insertAdjacentElement(position as InsertPosition, cloned);\n } else {\n const htmlContent = String(content);\n if (position === \"replace\") node.innerHTML = htmlContent;\n else node.insertAdjacentHTML(position as InsertPosition, htmlContent);\n }\n }\n return this;\n }\n\n private reindex(): void {\n for (const key of Object.keys(this)) {\n if (/^\\d+$/.test(key)) delete (this as any)[key];\n }\n this.nodes.forEach((node, index) => {\n (this as any)[index] = node;\n });\n }\n}\n\nfunction fragmentToElement(fragment: DocumentFragment, doc: Document): HTMLElement {\n const span = doc.createElement(\"span\");\n span.appendChild(fragment);\n return span;\n}\n\nfunction onDOMReady(fn: (...args: any[]) => void, args: unknown[] = [], context: any = Ity): void {\n const doc = getDocument();\n const func = () => fn.apply(context, args);\n if (!doc || doc.readyState !== \"loading\") func();\n else doc.addEventListener(\"DOMContentLoaded\", func, { once: true });\n}\n\ninterface AjaxOptions {\n url?: string;\n type?: string;\n data?: unknown;\n success?: (resp: any) => void;\n error?: (status?: number, error?: unknown) => void;\n}\n\nclass Model = Record> extends Evented {\n public id!: string;\n public data!: T;\n public url!: string;\n public readonly state: Signal;\n\n constructor(opts: Partial> = {}) {\n super();\n Object.assign(this, opts);\n this.id ||= `m${Math.floor(Math.random() * 100000) + 1}`;\n this.data ||= {} as T;\n this.url ||= \"\";\n this.state = signal(this.data);\n this._init(opts);\n }\n\n onDOMReady = onDOMReady;\n\n protected _init(opts?: Partial>): void {\n this.initialize(opts);\n }\n\n protected _ajax(opts: AjaxOptions = {}): void {\n const request = new XMLHttpRequest();\n const method = opts.type || \"GET\";\n const url = opts.url || this.url;\n const success = opts.success || function (this: Model, resp: any) {\n this.data = resp;\n this.state.set(resp);\n };\n const error = opts.error || function () { };\n request.open(method, url, true);\n request.onload = () => {\n if (request.status >= 200 && request.status < 400) {\n try {\n const response = request.responseText ? JSON.parse(request.responseText) : null;\n success.call(this, response);\n } catch (err) {\n error.call(this, request.status, err);\n }\n } else {\n error.call(this, request.status);\n }\n };\n request.onerror = () => error.call(this);\n request.send(opts.data === undefined ? undefined : JSON.stringify(opts.data));\n }\n\n initialize(options?: Partial>): void { }\n\n get(attr?: keyof T): any {\n const current = this.data;\n if (!attr) return current;\n return current ? (current as any)[attr as string] : undefined;\n }\n\n set(attr: keyof T | Partial, value?: any): void {\n const current = this.state.peek() || {} as T;\n const next = typeof attr === \"string\"\n ? { ...(current as any), [attr]: value } as T\n : attr as T;\n this.data = next;\n this.state.set(next);\n this.trigger(\"change\", this.data);\n }\n\n unSet(attr: keyof T): void {\n const current = this.state.peek();\n if (!current || !Object.prototype.hasOwnProperty.call(current, attr)) return;\n const next = { ...(current as any) };\n delete next[attr as string];\n this.data = next as T;\n this.state.set(this.data);\n this.trigger(\"change\", this.data);\n }\n\n clear(): void {\n this.data = {} as T;\n this.state.set(this.data);\n this.trigger(\"change\", this.data);\n }\n\n subscribe(callback: Subscriber, options?: { immediate?: boolean }): Cleanup {\n return this.state.subscribe(callback, options);\n }\n\n sync(opts?: AjaxOptions): void {\n this._ajax(opts);\n }\n\n toJSON(): T {\n return this.get();\n }\n}\n\ninterface ViewEvents {\n [selector: string]: Record;\n}\n\ninterface ViewOptions {\n el?: string | SelectorObject | NodeList | HTMLElement;\n app?: Application;\n name?: string;\n events?: ViewEvents;\n [key: string]: any;\n}\n\nclass View extends Evented {\n public id!: string;\n public el!: SelectorObject;\n public app?: Application;\n public name?: string;\n public events!: ViewEvents;\n private renderCleanup?: Cleanup;\n private delegatedListeners: Cleanup[] = [];\n\n constructor(opts: ViewOptions = {}) {\n super();\n Object.assign(this, opts);\n this.id ||= `v${Math.floor(Math.random() * 100000) + 1}`;\n if (this.app) this.app.addView(this);\n this.events ||= {};\n onDOMReady(this._init, [opts], this);\n }\n\n private _setElement(elSelector: ViewOptions[\"el\"]): void {\n const win = getWindow();\n if ((elSelector as SelectorObject)?.isSelectorObject) {\n this.el = elSelector as SelectorObject;\n } else if (win?.NodeList && elSelector instanceof win.NodeList) {\n this.el = new SelectorObject(elSelector as any);\n } else if (typeof elSelector === \"string\") {\n this.el = new SelectorObject(documentOrThrow().querySelectorAll(elSelector) as any);\n } else if (win?.HTMLElement && elSelector instanceof win.HTMLElement) {\n this.el = new SelectorObject([elSelector]);\n } else {\n throw new Error(\"el selector must be of type String, NodeList, HTMLElement or Ity.SelectorObject\");\n }\n }\n\n private _bindDOMEvents(evtObj: ViewEvents): void {\n if (!this.el || !this.el.isSelectorObject) return;\n const captureEvents = [\"focus\", \"blur\"];\n for (const selector in evtObj) {\n for (const evt in evtObj[selector]) {\n const callback = (this as any)[evtObj[selector][evt]];\n if (typeof callback !== \"function\") {\n throw new Error(`View event handler not found: ${evtObj[selector][evt]}`);\n }\n const capture = captureEvents.includes(evt);\n this._delegateEvent(selector, evt, callback, capture);\n }\n }\n }\n\n private _delegateEvent(selector: string, evtName: string, callback: (e: Event) => void, capture = false): void {\n for (const root of this.el) {\n const listener = (event: Event) => {\n let node: HTMLElement | null = event.target as HTMLElement;\n while (node) {\n if ((node as any).matches && (node as any).matches(selector)) {\n (event as any).delegateTarget = node;\n callback.call(this, event);\n break;\n }\n if (node === root) break;\n node = node.parentElement;\n }\n };\n root.addEventListener(evtName, listener, capture);\n this.delegatedListeners.push(() => root.removeEventListener(evtName, listener, capture));\n }\n }\n\n private _init(opts: ViewOptions): void {\n if (this.el) this._setElement(this.el as any);\n if (opts.el && !this.el) this._setElement(opts.el);\n this._bindDOMEvents(this.events);\n this.initialize(opts);\n }\n\n initialize(opts?: ViewOptions): void { }\n\n getName(): string | undefined {\n return this.name;\n }\n\n get(attr: keyof this): any {\n return (this as any)[attr];\n }\n\n set(attr: keyof this, value: any): void {\n (this as any)[attr] = value;\n }\n\n renderWith(view: TemplateValue | (() => TemplateValue), options?: RenderOptions): Cleanup {\n if (this.renderCleanup) this.renderCleanup();\n this.renderCleanup = render(view, this.el, options);\n return this.renderCleanup;\n }\n\n remove(): void {\n if (this.renderCleanup) this.renderCleanup();\n for (const cleanup of this.delegatedListeners.splice(0)) cleanup();\n this.el.remove();\n if (this.app) this.app.removeView(this.id);\n }\n\n select(selector: string, ctx: HTMLElement | HTMLDocument | SelectorObject = this.el): SelectorObject {\n const win = getWindow();\n if ((win?.HTMLElement && ctx instanceof win.HTMLElement) || (win?.HTMLDocument && ctx instanceof win.HTMLDocument)) {\n return new SelectorObject(ctx.querySelectorAll(selector) as any);\n }\n if ((ctx as any).isSelectorObject) return (ctx as SelectorObject).find(selector);\n throw new Error(\"Context passed to .select() must be an HTMLElement or an Ity.SelectorObject\");\n }\n}\n\nclass Application {\n public views: View[] = [];\n\n getView(id: string): View | undefined {\n return this.views.find((view) => view.id === id);\n }\n\n addView(view: View): void {\n if (view instanceof View && !this.views.includes(view)) this.views.push(view);\n }\n\n removeView(id: string): void {\n this.views = this.views.filter((view) => view.id !== id);\n }\n\n trigger(evtName: string, data?: unknown): void {\n for (const view of this.views.slice()) view.trigger(evtName, data);\n }\n}\n\nclass Collection {\n public models: M[] = [];\n public url!: string;\n public readonly state: Signal;\n private ModelClass: new () => M;\n\n constructor(models: M[] = [], ModelClass: new () => M = Model as any) {\n this.ModelClass = ModelClass;\n this.url = \"\";\n this.state = signal(this.models);\n models.forEach((model) => this.add(model));\n }\n\n get(id: string): M | undefined {\n return this.models.find((model) => model.id === id);\n }\n\n add(model: M): void {\n if (!(model instanceof Model)) return;\n this.models = [...this.models, model];\n this.state.set(this.models);\n }\n\n remove(id: string | M): void {\n const model = typeof id === \"string\" ? this.get(id) : id;\n if (!model) return;\n this.models = this.models.filter((item) => item !== model);\n this.state.set(this.models);\n }\n\n at(index: number): M | undefined {\n return this.models[index];\n }\n\n get length(): number {\n return this.models.length;\n }\n\n clear(): void {\n this.models = [];\n this.state.set(this.models);\n }\n\n find(predicate: (m: M) => boolean): M | undefined {\n return this.models.find(predicate);\n }\n\n filter(predicate: (m: M) => boolean): M[] {\n return this.models.filter(predicate);\n }\n\n map(mapper: (m: M, index: number) => T): T[] {\n return this.models.map(mapper);\n }\n\n toJSON(): any[] {\n return this.models.map((model) => model.get());\n }\n\n subscribe(callback: Subscriber, options?: { immediate?: boolean }): Cleanup {\n return this.state.subscribe(callback, options);\n }\n\n protected _ajax(opts: AjaxOptions = {}): void {\n const request = new XMLHttpRequest();\n const method = opts.type || \"GET\";\n const url = opts.url || this.url;\n const success = opts.success || function () { };\n const error = opts.error || function () { };\n request.open(method, url, true);\n request.onload = () => {\n if (request.status >= 200 && request.status < 400) {\n try {\n success.call(this, request.responseText ? JSON.parse(request.responseText) : null);\n } catch (err) {\n error.call(this, request.status, err);\n }\n } else {\n error.call(this, request.status);\n }\n };\n request.onerror = () => error.call(this);\n request.send(opts.data === undefined ? undefined : JSON.stringify(opts.data));\n }\n\n fetch(opts: AjaxOptions & { modelClass?: new () => M } = {}): void {\n const userSuccess = opts.success;\n opts.success = function (this: Collection, resp: any[]) {\n const ctor = (opts.modelClass || this.ModelClass) as new () => M;\n this.clear();\n for (const data of resp || []) {\n const model = new ctor();\n (model as any).set(data);\n this.add(model);\n }\n if (userSuccess) userSuccess.call(this, resp);\n };\n this._ajax(opts);\n }\n\n trigger(evtName: string, data?: unknown): void {\n for (const model of this.models.slice()) model.trigger(evtName, data);\n }\n}\n\ninterface RouteContext {\n path: string;\n url: URL;\n params: Record;\n query: Record;\n hash: Record;\n}\n\ntype RouteHandler = (params: Record, context: RouteContext) => void | Cleanup;\n\ninterface RouteRecord {\n pattern: string;\n handler: RouteHandler;\n exec(url: URL): Record | null;\n}\n\ninterface RouterOptions {\n base?: string;\n autoStart?: boolean;\n linkSelector?: string;\n transition?: boolean;\n notFound?: RouteHandler;\n}\n\nclass Router {\n private routes: RouteRecord[] = [];\n private started = false;\n private readonly listener = () => this.check();\n private readonly clickListener = (event: Event) => this.handleLinkClick(event);\n private readonly navigationListener = (event: any) => this.handleNavigationEvent(event);\n private routeCleanup?: Cleanup;\n private activeRoute?: RouteRecord;\n public readonly current: Signal = signal(null);\n public notFound?: RouteHandler;\n public base: string;\n public linkSelector: string;\n public transition: boolean;\n\n constructor(options: RouterOptions = {}) {\n this.base = options.base || \"/\";\n this.linkSelector = options.linkSelector || \"a[data-ity-link]\";\n this.transition = Boolean(options.transition);\n this.notFound = options.notFound;\n if (options.autoStart !== false) this.start();\n }\n\n add(pattern: string, handler: RouteHandler): this {\n this.routes.push(createRouteRecord(pattern, handler));\n return this;\n }\n\n addRoute(pattern: string, handler: RouteHandler): void {\n this.add(pattern, handler);\n }\n\n removeRoute(pattern: string): this {\n if (this.activeRoute?.pattern === pattern) {\n this.disposeRoute();\n this.activeRoute = undefined;\n this.current.set(null);\n }\n this.routes = this.routes.filter((route) => route.pattern !== pattern);\n return this;\n }\n\n navigate(path: string, options: { replace?: boolean; transition?: boolean } = {}): void {\n const win = getWindow();\n if (!win) return;\n const update = () => {\n const method = options.replace ? \"replaceState\" : \"pushState\";\n win.history[method](null, \"\", withBasePath(path, this.base));\n this.check();\n };\n withViewTransition(update, options.transition ?? this.transition);\n }\n\n start(): void {\n const win = getWindow();\n const doc = getDocument();\n if (!win || this.started) {\n if (win) this.check();\n return;\n }\n win.addEventListener(\"popstate\", this.listener);\n doc?.addEventListener(\"click\", this.clickListener);\n (win as any).navigation?.addEventListener?.(\"navigate\", this.navigationListener);\n this.started = true;\n this.check();\n }\n\n stop(): void {\n const win = getWindow();\n const doc = getDocument();\n if (win && this.started) {\n win.removeEventListener(\"popstate\", this.listener);\n doc?.removeEventListener(\"click\", this.clickListener);\n (win as any).navigation?.removeEventListener?.(\"navigate\", this.navigationListener);\n }\n this.started = false;\n this.disposeRoute();\n }\n\n check(): RouteContext | null {\n const win = getWindow();\n if (!win) return null;\n const url = new URL(win.location.href);\n const routePath = stripBasePath(url.pathname, this.base);\n if (routePath === null) {\n this.disposeRoute();\n this.activeRoute = undefined;\n this.current.set(null);\n return null;\n }\n const routeUrl = new URL(url.href);\n routeUrl.pathname = routePath || \"/\";\n for (const route of this.routes) {\n const routeParams = route.exec(routeUrl);\n if (!routeParams) continue;\n const query = searchParamsToObject(url.search);\n const hash = searchParamsToObject(url.hash);\n const params = { ...routeParams, ...query, ...hash };\n const context: RouteContext = {\n path: routePath || \"/\",\n url,\n params,\n query,\n hash\n };\n this.disposeRoute();\n this.activeRoute = route;\n this.current.set(context);\n const cleanup = route.handler(params, context);\n if (typeof cleanup === \"function\") this.routeCleanup = cleanup;\n return context;\n }\n this.disposeRoute();\n this.activeRoute = undefined;\n this.current.set(null);\n const cleanup = this.notFound?.({}, {\n path: routePath || \"/\",\n url,\n params: {},\n query: searchParamsToObject(url.search),\n hash: searchParamsToObject(url.hash)\n });\n if (typeof cleanup === \"function\") this.routeCleanup = cleanup;\n return null;\n }\n\n private handleLinkClick(event: Event): void {\n const target = event.target as HTMLElement | null;\n const anchor = target?.closest?.(this.linkSelector) as HTMLAnchorElement | null;\n if (!anchor || anchor.target || anchor.hasAttribute(\"download\")) return;\n const win = getWindow();\n if (!win) return;\n const url = new URL(anchor.href, win.location.href);\n if (url.origin !== win.location.origin) return;\n if (stripBasePath(url.pathname, this.base) === null) return;\n event.preventDefault();\n this.navigate(`${url.pathname}${url.search}${url.hash}`);\n }\n\n private handleNavigationEvent(event: any): void {\n const win = getWindow();\n if (!win || !event?.canIntercept || !event.destination?.url || typeof event.intercept !== \"function\") return;\n const url = new URL(event.destination.url, win.location.href);\n if (url.origin !== win.location.origin) return;\n if (stripBasePath(url.pathname, this.base) === null) return;\n event.intercept({\n handler: () => {\n this.check();\n }\n });\n }\n\n private disposeRoute(): void {\n if (!this.routeCleanup) return;\n const cleanup = this.routeCleanup;\n this.routeCleanup = undefined;\n cleanup();\n }\n}\n\nfunction createRouteRecord(pattern: string, handler: RouteHandler): RouteRecord {\n const win = getWindow();\n const URLPatternCtor = (win as any)?.URLPattern || (globalThis as any).URLPattern;\n if (typeof URLPatternCtor === \"function\") {\n try {\n const nativePattern = new URLPatternCtor({ pathname: pattern });\n return {\n pattern,\n handler,\n exec(url) {\n const match = nativePattern.exec(url.href);\n return match ? decodeParams(match.pathname.groups || {}) : null;\n }\n };\n } catch (_err) {\n // Fall through to the regex matcher for non-URLPattern syntax.\n }\n }\n\n const { re, keys } = compilePathPattern(pattern);\n return {\n pattern,\n handler,\n exec(url) {\n const match = re.exec(normalizePath(url.pathname));\n if (!match) return null;\n const params: Record = {};\n keys.forEach((key, index) => {\n params[key] = decodeURIComponent(match[index + 1] || \"\");\n });\n return params;\n }\n };\n}\n\nfunction normalizeBase(base: string): string {\n const normalized = normalizePath(base || \"/\");\n return normalized === \"\" ? \"\" : normalized;\n}\n\nfunction withBasePath(path: string, base: string): string {\n const normalizedBase = normalizeBase(base);\n const parsed = new URL(path || \"/\", \"http://ity.local\");\n let pathname = normalizePath(parsed.pathname) || \"/\";\n if (normalizedBase && pathname !== normalizedBase && !pathname.startsWith(`${normalizedBase}/`)) {\n pathname = `${normalizedBase}${pathname === \"/\" ? \"\" : pathname}`;\n }\n return `${pathname}${parsed.search}${parsed.hash}`;\n}\n\nfunction stripBasePath(pathname: string, base: string): string | null {\n const normalizedBase = normalizeBase(base);\n const normalizedPath = normalizePath(pathname) || \"/\";\n if (!normalizedBase) return normalizedPath;\n if (normalizedPath === normalizedBase) return \"/\";\n if (normalizedPath.startsWith(`${normalizedBase}/`)) {\n return normalizePath(normalizedPath.slice(normalizedBase.length)) || \"/\";\n }\n return null;\n}\n\nfunction compilePathPattern(pattern: string): { re: RegExp; keys: string[] } {\n const keys: string[] = [];\n const normalized = normalizePath(pattern);\n if (normalized === \"\") return { re: /^\\/?$/, keys };\n const segments = normalized.split(\"/\").filter(Boolean);\n const source = segments.map((segment) => {\n if (segment === \"*\") {\n keys.push(\"wildcard\");\n return \"(.*)\";\n }\n if (segment.startsWith(\":\")) {\n keys.push(segment.slice(1));\n return \"([^/]+)\";\n }\n return escapeRegExp(segment);\n }).join(\"/\");\n return { re: new RegExp(`^/${source}/?$`), keys };\n}\n\nfunction normalizePath(path: string): string {\n const normalized = path.replace(/[?#].*$/, \"\").replace(/\\/+$/, \"\");\n return normalized === \"\" ? \"\" : normalized.startsWith(\"/\") ? normalized : `/${normalized}`;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction searchParamsToObject(value: string): Record {\n const out: Record = {};\n const clean = value.replace(/^[?#]/, \"\");\n if (!clean) return out;\n const params = new URLSearchParams(clean);\n params.forEach((paramValue, key) => {\n out[key] = paramValue;\n });\n return out;\n}\n\nfunction decodeParams(value: Record): Record {\n const out: Record = {};\n for (const key of Object.keys(value)) {\n out[key] = decodeURIComponent(value[key]);\n }\n return out;\n}\n\nconst defaultRouter = signal(null);\n\nfunction route(pattern: string, handler: RouteHandler): Router {\n let router = defaultRouter.peek();\n if (!router) {\n router = new Router({ autoStart: false });\n defaultRouter.set(router);\n }\n router.add(pattern, handler);\n router.start();\n return router;\n}\n\nconst Ity = {\n version: \"2.1.0\",\n configure,\n signal,\n computed,\n effect,\n batch,\n untrack,\n isSignal,\n resolveSignal,\n store,\n resource,\n action,\n form,\n html,\n unsafeHTML,\n render,\n renderToString,\n component,\n route,\n Router,\n SelectorObject,\n onDOMReady,\n Model,\n View,\n Application,\n Collection\n};\n\nfunction createAmdExport(): typeof Ity {\n const win = getWindow();\n if (win) (win as any).Ity = Ity;\n return Ity;\n}\n\n/* c8 ignore next 3 */\nif (typeof define === \"function\" && (define as any).amd) {\n (define as any)(createAmdExport);\n} else if (typeof module === \"object\" && typeof module.exports !== \"undefined\") {\n module.exports = Ity;\n}\n\nconst win = getWindow();\nif (win) {\n (win as any).Ity = Ity;\n}\n\nexport {\n Application,\n Collection,\n Model,\n Router,\n SelectorObject,\n View,\n batch,\n component,\n configure,\n computed,\n effect,\n action,\n form,\n html,\n isSignal,\n onDOMReady,\n render,\n renderToString,\n resource,\n resolveSignal,\n route,\n signal,\n store,\n unsafeHTML,\n untrack\n};\nexport type {\n Action,\n ActionOptions,\n AsyncStatus,\n ComponentContext,\n ComponentOptions,\n EffectHandle,\n FormController,\n FormOptions,\n HTMLSanitizer,\n ItyConfig,\n ReadonlySignal,\n RenderOptions,\n Resource,\n ResourceContext,\n ResourceOptions,\n RouteContext,\n RouteHandler,\n Signal,\n Store,\n TemplateResult,\n UnsafeHTMLOptions\n};\nexport default Ity;\n"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"ity.js","sources":["../Ity.ts"],"sourcesContent":["// Ity.ts 2.2.0\n// (c) 2026 Dominic Cocchiarella\n// Tiny dependency-free reactive app kernel with V1 MVC compatibility.\ndeclare var define: any;\ndeclare var module: any;\n\ntype Cleanup = () => void;\ntype Equality = (prev: T, next: T) => boolean;\ntype Subscriber = (value: T, previous: T) => void;\ntype MaybeSignal = T | ReadonlySignal;\ntype TemplateValue =\n | TemplateResult\n | UnsafeHTML\n | Node\n | string\n | number\n | boolean\n | null\n | undefined\n | TemplateValue[]\n | ReadonlySignal;\n\ninterface ReadonlySignal {\n (): T;\n get(): T;\n peek(): T;\n subscribe(callback: Subscriber, options?: { immediate?: boolean }): Cleanup;\n readonly isSignal: true;\n}\n\ninterface Signal extends ReadonlySignal {\n (next: T | ((previous: T) => T)): T;\n set(next: T | ((previous: T) => T)): T;\n update(updater: (previous: T) => T): T;\n}\n\ninterface ReactiveSource {\n observers: Set;\n}\n\ninterface ReactiveObserver {\n deps: Set;\n markDirty(): void;\n}\n\ninterface ComputedOptions {\n equals?: Equality;\n}\n\ninterface SignalOptions {\n equals?: Equality;\n name?: string;\n}\n\ninterface EffectHandle {\n (): void;\n dispose(): void;\n}\n\ninterface TemplateResult {\n readonly isTemplateResult: true;\n readonly strings: readonly string[];\n readonly values: readonly unknown[];\n}\n\ninterface UnsafeHTML {\n readonly isUnsafeHTML: true;\n readonly value: string;\n}\n\ntype HTMLSanitizer = (value: string) => string;\n\ninterface UnsafeHTMLOptions {\n sanitize?: HTMLSanitizer;\n config?: ItyConfig | null;\n}\n\ninterface ItyConfig {\n sanitizeHTML?: HTMLSanitizer | null;\n}\n\ninterface RenderOptions {\n reactive?: boolean;\n transition?: boolean;\n config?: ItyConfig | null;\n}\n\ntype StoreKey = string | symbol;\n\ninterface StoreApi> {\n $patch(patch: Partial | ((current: T) => Partial | void)): void;\n $snapshot(): T;\n $subscribe(callback: (value: T) => void, options?: { immediate?: boolean }): Cleanup;\n}\n\ntype Store> = T & StoreApi;\n\ntype AsyncStatus = \"idle\" | \"loading\" | \"success\" | \"error\";\n\ninterface ResourceContext {\n signal: AbortSignal;\n previous: T | undefined;\n refreshId: number;\n}\n\ninterface ResourceOptions {\n initialValue?: T;\n immediate?: boolean;\n keepPrevious?: boolean;\n onSuccess?: (value: T) => void;\n onError?: (error: E) => void;\n}\n\ninterface Resource {\n readonly data: Signal;\n readonly error: Signal;\n readonly loading: ReadonlySignal;\n readonly status: ReadonlySignal;\n readonly promise: Promise | null;\n refresh(): Promise;\n mutate(value: T | undefined): void;\n abort(reason?: unknown): void;\n}\n\ninterface ActionOptions {\n onSuccess?: (value: TResult) => void;\n onError?: (error: E) => void;\n}\n\ninterface Action {\n (...args: TArgs): Promise;\n submit(...args: TArgs): Promise;\n run(...args: TArgs): void;\n with(...args: TArgs): (...eventArgs: unknown[]) => void;\n from(mapper: (event: TEvent) => TArgs): (event: TEvent) => void;\n readonly data: Signal;\n readonly error: Signal;\n readonly pending: ReadonlySignal;\n readonly pendingCount: ReadonlySignal;\n readonly status: ReadonlySignal;\n reset(): void;\n}\n\ninterface FormController {\n readonly action: Action<[FormData, Event], TResult, E>;\n readonly data: Signal;\n readonly error: Signal;\n readonly pending: ReadonlySignal;\n readonly status: ReadonlySignal;\n onSubmit(event: Event): Promise;\n handleSubmit(event: Event): void;\n reset(): void;\n}\n\ninterface FormOptions extends ActionOptions {\n resetOnSuccess?: boolean;\n}\n\ntype FormErrorMap> = Partial, string>>;\n\ninterface FormBindOptions {\n type?: \"text\" | \"textarea\" | \"select\" | \"select-multiple\" | \"checkbox\" | \"radio\" | \"number\";\n event?: string;\n name?: string;\n value?: unknown;\n parse?: (value: unknown, event: Event) => T;\n format?: (value: T) => unknown;\n}\n\ninterface FormStateOptions> {\n validators?: Partial<{ [K in keyof TValues]: (value: TValues[K], values: TValues) => string | null | undefined }>;\n validate?: (values: TValues) => FormErrorMap | void;\n}\n\ninterface FormField {\n readonly value: Signal;\n readonly error: ReadonlySignal;\n readonly touched: ReadonlySignal;\n readonly dirty: ReadonlySignal;\n bind(options?: FormBindOptions): Record;\n set(next: T | ((previous: T) => T)): T;\n reset(): void;\n}\n\ninterface FormStateSubmitOptions extends ActionOptions {\n resetOnSuccess?: boolean;\n}\n\ninterface FormStateController, TResult, E = unknown> {\n readonly state: FormState;\n readonly action: Action<[TValues, Event], TResult, E>;\n readonly data: Signal;\n readonly error: Signal;\n readonly pending: ReadonlySignal;\n readonly status: ReadonlySignal;\n onSubmit(event: Event): Promise;\n handleSubmit(event: Event): void;\n reset(): void;\n}\n\ninterface FormState> {\n readonly values: Store;\n readonly initialValues: ReadonlySignal;\n readonly errors: Store>;\n readonly touched: Store, boolean>>>;\n readonly dirty: ReadonlySignal;\n readonly valid: ReadonlySignal;\n field(name: K): FormField;\n bind(name: K, options?: FormBindOptions): Record;\n set(next: Partial | ((current: TValues) => Partial | void)): void;\n reset(next?: Partial | TValues): void;\n validate(names?: readonly (keyof TValues)[]): boolean;\n markTouched(names?: readonly (keyof TValues)[]): void;\n submit(\n handler: (values: TValues, event: Event) => Promise | TResult,\n options?: FormStateSubmitOptions\n ): FormStateController;\n}\n\ninterface RenderToStringOptions {\n config?: ItyConfig | null;\n}\n\ninterface RegisteredFormBinding {\n domName: string;\n type: NonNullable[\"type\"]> | \"text\";\n value?: unknown;\n parse?: (value: unknown, event: Event) => T;\n}\n\nconst defaultEquals = Object.is;\nlet activeObserver: ReactiveObserver | null = null;\nlet batchDepth = 0;\nconst pendingEffects = new Set();\nlet configuredSanitizeHTML: HTMLSanitizer | undefined;\nconst activeConfigStack: Array = [];\n\nfunction getWindow(): (Window & typeof globalThis) | undefined {\n return typeof window !== \"undefined\" ? window : undefined;\n}\n\nfunction getDocument(): Document | undefined {\n const win = getWindow();\n return win?.document ?? (typeof document !== \"undefined\" ? document : undefined);\n}\n\nfunction hasOwn(target: object, key: PropertyKey): boolean {\n return Object.prototype.hasOwnProperty.call(target, key);\n}\n\nfunction isPlainObject(value: unknown): value is Record {\n if (!value || typeof value !== \"object\") return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\nfunction cloneValue(value: T): T {\n const cloneFn = (globalThis as any).structuredClone;\n if (typeof cloneFn === \"function\") return cloneFn(value);\n if (Array.isArray(value)) return value.map((item) => cloneValue(item)) as T;\n if (isPlainObject(value)) {\n const out: Record = {};\n for (const key of Reflect.ownKeys(value)) {\n out[key as any] = cloneValue((value as any)[key]);\n }\n return out as T;\n }\n return value;\n}\n\nfunction deepEqual(left: unknown, right: unknown): boolean {\n if (Object.is(left, right)) return true;\n if (Array.isArray(left) && Array.isArray(right)) {\n if (left.length !== right.length) return false;\n for (let i = 0; i < left.length; i += 1) {\n if (!deepEqual(left[i], right[i])) return false;\n }\n return true;\n }\n if (isPlainObject(left) && isPlainObject(right)) {\n const leftKeys = Reflect.ownKeys(left);\n const rightKeys = Reflect.ownKeys(right);\n if (leftKeys.length !== rightKeys.length) return false;\n for (const key of leftKeys) {\n if (!rightKeys.includes(key)) return false;\n if (!deepEqual((left as any)[key], (right as any)[key])) return false;\n }\n return true;\n }\n return false;\n}\n\nfunction currentConfig(): ItyConfig | null {\n return activeConfigStack.length ? activeConfigStack[activeConfigStack.length - 1] : null;\n}\n\nfunction withConfig(config: ItyConfig | null | undefined, callback: () => T): T {\n activeConfigStack.push(config || null);\n try {\n return callback();\n } finally {\n activeConfigStack.pop();\n }\n}\n\nfunction resolveSanitizeHTML(options: UnsafeHTMLOptions = {}): HTMLSanitizer | undefined {\n if (options.sanitize) return options.sanitize;\n const scoped = options.config ?? currentConfig();\n if (scoped && hasOwn(scoped, \"sanitizeHTML\")) {\n return scoped.sanitizeHTML || undefined;\n }\n return configuredSanitizeHTML;\n}\n\nfunction trackDependency(source: ReactiveSource): void {\n if (!activeObserver) return;\n source.observers.add(activeObserver);\n activeObserver.deps.add(source);\n}\n\nfunction cleanupDependencies(observer: ReactiveObserver): void {\n for (const dep of observer.deps) {\n dep.observers.delete(observer);\n }\n observer.deps.clear();\n}\n\nfunction notifyObservers(source: ReactiveSource): void {\n for (const observer of Array.from(source.observers)) {\n observer.markDirty();\n }\n}\n\nfunction flushEffects(): void {\n if (batchDepth > 0) return;\n while (pendingEffects.size) {\n const effects = Array.from(pendingEffects);\n pendingEffects.clear();\n for (const effect of effects) {\n effect.run();\n }\n }\n}\n\nfunction queueEffect(effect: ReactiveEffect): void {\n pendingEffects.add(effect);\n flushEffects();\n}\n\nclass SignalNode implements ReactiveSource {\n observers = new Set();\n private subscribers = new Set>();\n private value: T;\n private equals: Equality;\n\n constructor(value: T, options: SignalOptions = {}) {\n this.value = value;\n this.equals = options.equals || defaultEquals;\n }\n\n read(track = true): T {\n if (track) trackDependency(this);\n return this.value;\n }\n\n write(next: T | ((previous: T) => T)): T {\n const previous = this.value;\n const resolved = typeof next === \"function\"\n ? (next as (previous: T) => T)(previous)\n : next;\n if (this.equals(previous, resolved)) return previous;\n this.value = resolved;\n notifyObservers(this);\n for (const subscriber of Array.from(this.subscribers)) {\n subscriber(resolved, previous);\n }\n flushEffects();\n return resolved;\n }\n\n subscribe(callback: Subscriber, options: { immediate?: boolean } = {}): Cleanup {\n this.subscribers.add(callback);\n if (options.immediate) callback(this.value, this.value);\n return () => {\n this.subscribers.delete(callback);\n };\n }\n}\n\nclass ComputedNode implements ReactiveSource, ReactiveObserver {\n observers = new Set();\n deps = new Set();\n private subscribers = new Set>();\n private dirty = true;\n private initialized = false;\n private value!: T;\n private equals: Equality;\n\n constructor(private readonly getter: () => T, options: ComputedOptions = {}) {\n this.equals = options.equals || defaultEquals;\n }\n\n read(track = true): T {\n if (track) trackDependency(this);\n if (this.dirty) this.evaluate();\n return this.value;\n }\n\n markDirty(): void {\n if (this.dirty) return;\n const previous = this.value;\n this.dirty = true;\n notifyObservers(this);\n if (this.subscribers.size) {\n const next = this.read(false);\n if (!this.equals(previous, next)) {\n for (const subscriber of Array.from(this.subscribers)) {\n subscriber(next, previous);\n }\n }\n }\n }\n\n subscribe(callback: Subscriber, options: { immediate?: boolean } = {}): Cleanup {\n this.subscribers.add(callback);\n if (options.immediate) {\n const current = this.read(false);\n callback(current, current);\n }\n return () => {\n this.subscribers.delete(callback);\n };\n }\n\n private evaluate(): void {\n cleanupDependencies(this);\n const previousObserver = activeObserver;\n activeObserver = this;\n try {\n this.value = this.getter();\n this.dirty = false;\n this.initialized = true;\n } finally {\n activeObserver = previousObserver;\n }\n }\n}\n\nclass ReactiveEffect implements ReactiveObserver {\n deps = new Set();\n private disposed = false;\n private cleanup?: Cleanup;\n\n constructor(private readonly callback: (onCleanup: (cleanup: Cleanup) => void) => void) {\n this.run();\n }\n\n markDirty(): void {\n if (!this.disposed) queueEffect(this);\n }\n\n run(): void {\n if (this.disposed) return;\n cleanupDependencies(this);\n if (this.cleanup) {\n const cleanup = this.cleanup;\n this.cleanup = undefined;\n cleanup();\n }\n const previousObserver = activeObserver;\n activeObserver = this;\n try {\n this.callback((cleanup) => {\n this.cleanup = cleanup;\n });\n } finally {\n activeObserver = previousObserver;\n }\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n cleanupDependencies(this);\n if (this.cleanup) {\n const cleanup = this.cleanup;\n this.cleanup = undefined;\n cleanup();\n }\n pendingEffects.delete(this);\n }\n}\n\nfunction signal(initialValue: T, options: SignalOptions = {}): Signal {\n const node = new SignalNode(initialValue, options);\n const readWrite = function (next?: T | ((previous: T) => T)): T {\n if (arguments.length === 0) return node.read(true);\n return node.write(next as T | ((previous: T) => T));\n } as Signal;\n readWrite.get = () => node.read(true);\n readWrite.peek = () => node.read(false);\n readWrite.set = (next) => node.write(next);\n readWrite.update = (updater) => node.write(updater);\n readWrite.subscribe = (callback, subscribeOptions) => node.subscribe(callback, subscribeOptions);\n Object.defineProperty(readWrite, \"isSignal\", { value: true });\n return readWrite;\n}\n\nfunction computed(getter: () => T, options: ComputedOptions = {}): ReadonlySignal {\n const node = new ComputedNode(getter, options);\n const read = function (): T {\n return node.read(true);\n } as ReadonlySignal;\n read.get = () => node.read(true);\n read.peek = () => node.read(false);\n read.subscribe = (callback, subscribeOptions) => node.subscribe(callback, subscribeOptions);\n Object.defineProperty(read, \"isSignal\", { value: true });\n return read;\n}\n\nfunction effect(callback: (onCleanup: (cleanup: Cleanup) => void) => void): EffectHandle {\n const runner = new ReactiveEffect(callback);\n const dispose = (() => runner.dispose()) as EffectHandle;\n dispose.dispose = dispose;\n return dispose;\n}\n\nfunction batch(callback: () => T): T {\n batchDepth += 1;\n try {\n return callback();\n } finally {\n batchDepth -= 1;\n flushEffects();\n }\n}\n\nfunction untrack(callback: () => T): T {\n const previousObserver = activeObserver;\n activeObserver = null;\n try {\n return callback();\n } finally {\n activeObserver = previousObserver;\n }\n}\n\nfunction isSignal(value: unknown): value is ReadonlySignal {\n return typeof value === \"function\" && (value as any).isSignal === true;\n}\n\nfunction resolveSignal(value: MaybeSignal): T {\n return isSignal(value) ? value() : value;\n}\n\nfunction configure(options: ItyConfig = {}): void {\n configuredSanitizeHTML = options.sanitizeHTML || undefined;\n}\n\nfunction createConfig(options: ItyConfig = {}): ItyConfig {\n const config: ItyConfig = {};\n if (hasOwn(options, \"sanitizeHTML\")) config.sanitizeHTML = options.sanitizeHTML ?? null;\n return config;\n}\n\nfunction store>(initialValue: T): Store {\n const keys = new Set(Reflect.ownKeys(initialValue));\n const signals = new Map>();\n const structure = signal(0);\n\n const ensureSignal = (key: StoreKey): Signal => {\n if (!signals.has(key)) {\n signals.set(key, signal((initialValue as any)[key]));\n }\n return signals.get(key)!;\n };\n\n const bumpStructure = (): void => {\n structure.update((version) => version + 1);\n };\n\n const setKey = (key: StoreKey, value: any): void => {\n const hadKey = keys.has(key);\n if (!hadKey) keys.add(key);\n ensureSignal(key).set(value);\n if (!hadKey) bumpStructure();\n };\n\n const snapshot = (): T => {\n structure();\n const out: any = {};\n for (const key of keys) {\n out[key] = ensureSignal(key)();\n }\n return out as T;\n };\n\n const api: StoreApi = {\n $patch(patch) {\n const current = snapshot();\n const next = typeof patch === \"function\" ? patch(current) : patch;\n if (!next) return;\n batch(() => {\n for (const key of Reflect.ownKeys(next)) {\n setKey(key, (next as any)[key]);\n }\n });\n },\n $snapshot: snapshot,\n $subscribe(callback, options = {}) {\n let first = true;\n return effect(() => {\n const value = snapshot();\n if (first && !options.immediate) {\n first = false;\n return;\n }\n first = false;\n callback(value);\n });\n }\n };\n\n return new Proxy(api as Store, {\n get(target, key, receiver) {\n if (key in target) return Reflect.get(target, key, receiver);\n return ensureSignal(key)();\n },\n set(_target, key, value) {\n batch(() => {\n setKey(key, value);\n });\n return true;\n },\n deleteProperty(_target, key) {\n if (!keys.has(key)) return true;\n keys.delete(key);\n batch(() => {\n ensureSignal(key).set(undefined);\n bumpStructure();\n });\n return true;\n },\n ownKeys(target) {\n structure();\n return Array.from(new Set([...Reflect.ownKeys(target), ...keys]));\n },\n getOwnPropertyDescriptor(target, key) {\n structure();\n if (Object.prototype.hasOwnProperty.call(target, key)) {\n return { ...Reflect.getOwnPropertyDescriptor(target, key)!, enumerable: false };\n }\n if (!keys.has(key)) return undefined;\n return { enumerable: true, configurable: true };\n },\n has(target, key) {\n structure();\n return key in target || keys.has(key);\n }\n });\n}\n\nfunction resource(\n loader: (context: ResourceContext) => Promise | T,\n options: ResourceOptions = {}\n): Resource {\n const data = signal(options.initialValue);\n const error = signal(null);\n const pending = signal(false);\n const statusValue = signal(options.initialValue === undefined ? \"idle\" : \"success\");\n const loading = computed(() => pending());\n const status = computed(() => statusValue());\n const keepPrevious = options.keepPrevious !== false;\n let controller: AbortController | null = null;\n let refreshId = 0;\n let currentPromise: Promise | null = null;\n\n const api: Resource = {\n data,\n error,\n loading,\n status,\n get promise() {\n return currentPromise;\n },\n refresh() {\n refreshId += 1;\n const id = refreshId;\n if (controller) controller.abort();\n controller = new AbortController();\n const signal = controller.signal;\n const previous = data.peek();\n pending.set(true);\n statusValue.set(\"loading\");\n error.set(null);\n if (!keepPrevious) data.set(undefined);\n\n currentPromise = Promise.resolve()\n .then(() => loader({ signal, previous, refreshId: id }))\n .then((value) => {\n if (id !== refreshId || signal.aborted) return data.peek();\n data.set(value);\n error.set(null);\n statusValue.set(\"success\");\n options.onSuccess?.(value);\n return value;\n })\n .catch((err) => {\n if (id !== refreshId) return data.peek();\n error.set(err as E);\n statusValue.set(\"error\");\n options.onError?.(err as E);\n return data.peek();\n })\n .finally(() => {\n if (id === refreshId) {\n pending.set(false);\n controller = null;\n }\n });\n\n return currentPromise;\n },\n mutate(value) {\n refreshId += 1;\n if (controller) controller.abort();\n controller = null;\n currentPromise = null;\n data.set(value);\n error.set(null);\n pending.set(false);\n statusValue.set(value === undefined ? \"idle\" : \"success\");\n },\n abort(reason?: unknown) {\n if (!controller) return;\n refreshId += 1;\n controller.abort(reason);\n controller = null;\n currentPromise = null;\n pending.set(false);\n statusValue.set(data.peek() === undefined ? \"idle\" : \"success\");\n }\n };\n\n if (options.immediate !== false) {\n api.refresh();\n }\n\n return api;\n}\n\nfunction action(\n handler: (...args: TArgs) => Promise | TResult,\n options: ActionOptions = {}\n): Action {\n const data = signal(undefined);\n const error = signal(null);\n const count = signal(0);\n const statusValue = signal(\"idle\");\n const pending = computed(() => count() > 0);\n const pendingCount = computed(() => count());\n const status = computed(() => statusValue());\n let generation = 0;\n\n const submit = (...args: TArgs): Promise => {\n const runGeneration = generation;\n count.update((value) => value + 1);\n statusValue.set(\"loading\");\n error.set(null);\n\n return Promise.resolve()\n .then(() => handler(...args))\n .then((value) => {\n if (runGeneration === generation) {\n data.set(value);\n error.set(null);\n options.onSuccess?.(value);\n if (count.peek() <= 1) statusValue.set(\"success\");\n }\n return value;\n })\n .catch((err) => {\n if (runGeneration === generation) {\n error.set(err as E);\n options.onError?.(err as E);\n if (count.peek() <= 1) statusValue.set(\"error\");\n }\n throw err;\n })\n .finally(() => {\n if (runGeneration !== generation) return;\n count.update((value) => Math.max(0, value - 1));\n if (count.peek() > 0) statusValue.set(\"loading\");\n });\n };\n\n const callable = ((...args: TArgs) => submit(...args)) as Action;\n const mutableCallable = callable as Action & {\n submit: (...args: TArgs) => Promise;\n run: (...args: TArgs) => void;\n with: (...args: TArgs) => (...eventArgs: unknown[]) => void;\n from: (mapper: (event: TEvent) => TArgs) => (event: TEvent) => void;\n data: Signal;\n error: Signal;\n pending: ReadonlySignal;\n pendingCount: ReadonlySignal;\n status: ReadonlySignal;\n };\n mutableCallable.submit = submit;\n mutableCallable.run = (...args: TArgs) => {\n submit(...args).catch(() => undefined);\n };\n mutableCallable.with = (...args: TArgs) => {\n return () => {\n mutableCallable.run(...args);\n };\n };\n mutableCallable.from = (mapper: (event: TEvent) => TArgs) => {\n return (event: TEvent) => {\n mutableCallable.run(...mapper(event));\n };\n };\n mutableCallable.data = data;\n mutableCallable.error = error;\n mutableCallable.pending = pending;\n mutableCallable.pendingCount = pendingCount;\n mutableCallable.status = status;\n callable.reset = () => {\n generation += 1;\n data.set(undefined);\n error.set(null);\n count.set(0);\n statusValue.set(\"idle\");\n };\n return callable;\n}\n\nfunction getFormElementCtor(node: Element | null): typeof HTMLFormElement | undefined {\n const ownerWindow = node?.ownerDocument?.defaultView as (Window & typeof globalThis) | null | undefined;\n return ownerWindow?.HTMLFormElement\n || getWindow()?.HTMLFormElement\n || (typeof HTMLFormElement !== \"undefined\" ? HTMLFormElement : undefined);\n}\n\nfunction isFormElement(node: Element | null | undefined, fallbackNode?: Element | null): node is HTMLFormElement {\n const FormElement = node ? getFormElementCtor(node) : getFormElementCtor(fallbackNode || null);\n return Boolean(node && FormElement && node instanceof FormElement);\n}\n\nfunction findFormElement(event: Event): HTMLFormElement {\n const target = (event.currentTarget || event.target) as Element | null;\n if (!getFormElementCtor(target)) throw new Error(\"Ity.form requires HTMLFormElement support\");\n if (isFormElement(target, target)) return target;\n const closest = target?.closest?.(\"form\");\n if (isFormElement(closest, target)) return closest;\n throw new Error(\"Ity.form onSubmit requires a form event target\");\n}\n\nfunction createFormDataForElement(formElement: HTMLFormElement): FormData {\n const ownerWindow = formElement.ownerDocument?.defaultView as (Window & typeof globalThis) | null | undefined;\n const FormDataCtor = ownerWindow?.FormData\n || getWindow()?.FormData\n || (typeof FormData !== \"undefined\" ? FormData : undefined);\n if (!FormDataCtor) throw new Error(\"Ity.form requires FormData support\");\n return new FormDataCtor(formElement);\n}\n\nfunction form(\n handler: (data: FormData, event: Event) => Promise | TResult,\n options: FormOptions = {}\n): FormController {\n const submitAction = action<[FormData, Event], TResult, E>(handler, options);\n\n const onSubmit = async (event: Event): Promise => {\n event.preventDefault();\n const formElement = findFormElement(event);\n const result = await submitAction(createFormDataForElement(formElement), event);\n if (options.resetOnSuccess) formElement.reset();\n return result;\n };\n\n return {\n action: submitAction,\n data: submitAction.data,\n error: submitAction.error,\n pending: submitAction.pending,\n status: submitAction.status,\n onSubmit,\n handleSubmit(event: Event): void {\n onSubmit(event).catch(() => undefined);\n },\n reset() {\n submitAction.reset();\n }\n };\n}\n\nfunction replaceStoreSnapshot>(target: Store, nextValue: Partial): void {\n const current = target.$snapshot() as Record;\n batch(() => {\n for (const key of Reflect.ownKeys(current)) {\n if (!hasOwn(nextValue as object, key)) delete (target as any)[key];\n }\n for (const key of Reflect.ownKeys(nextValue)) {\n (target as any)[key] = (nextValue as any)[key];\n }\n });\n}\n\nfunction formState>(\n initialValue: TValues,\n options: FormStateOptions = {}\n): FormState {\n const values = store(cloneValue(initialValue));\n const initialValues = signal(cloneValue(initialValue));\n const errors = store({} as FormErrorMap);\n const touched = store({} as Partial, boolean>>);\n const registeredBindings = new Map, Map>>();\n\n const allFieldNames = (): Array> => {\n const names = new Set();\n Reflect.ownKeys(initialValues.peek()).forEach((key) => names.add(String(key)));\n Reflect.ownKeys(values.$snapshot()).forEach((key) => names.add(String(key)));\n return Array.from(names) as Array>;\n };\n\n const computeErrors = (snapshot: TValues): FormErrorMap => {\n const out: FormErrorMap = {};\n const validators = options.validators || {};\n for (const key of allFieldNames()) {\n const validator = (validators as any)[key] as ((value: TValues[keyof TValues], values: TValues) => string | null | undefined) | undefined;\n if (!validator) continue;\n const message = validator((snapshot as any)[key], snapshot);\n if (message) out[key] = message;\n }\n const formErrors = options.validate?.(snapshot);\n if (formErrors) {\n for (const key of Reflect.ownKeys(formErrors)) {\n const message = (formErrors as any)[key];\n if (message) (out as any)[key] = message;\n }\n }\n return out;\n };\n\n const syncErrors = (): boolean => {\n const nextErrors = computeErrors(values.$snapshot());\n replaceStoreSnapshot(errors as any, nextErrors);\n return Reflect.ownKeys(nextErrors).length === 0;\n };\n\n const markTouched = (names?: readonly (keyof TValues)[]): void => {\n const keys = names?.length\n ? names.map((name) => String(name))\n : allFieldNames();\n batch(() => {\n for (const key of keys) {\n (touched as any)[key] = true;\n }\n });\n };\n\n const maybeValidateTouched = (): void => {\n const touchedSnapshot = touched.$snapshot();\n if (Reflect.ownKeys(touchedSnapshot).some((key) => Boolean((touchedSnapshot as any)[key]))) {\n syncErrors();\n }\n };\n\n const set = (next: Partial | ((current: TValues) => Partial | void)): void => {\n values.$patch((current) => {\n const patch = typeof next === \"function\" ? next(current) : next;\n return patch || {};\n });\n maybeValidateTouched();\n };\n\n const reset = (next?: Partial | TValues): void => {\n const base = cloneValue(next\n ? { ...initialValues.peek(), ...(next as any) }\n : initialValues.peek());\n initialValues.set(cloneValue(base));\n replaceStoreSnapshot(values as any, base);\n replaceStoreSnapshot(errors as any, {});\n replaceStoreSnapshot(touched as any, {});\n };\n\n const createFieldSignal = (name: K): Signal => {\n const signalLike = function (next?: TValues[K] | ((previous: TValues[K]) => TValues[K])): TValues[K] {\n if (arguments.length === 0) return (values as any)[name];\n const previous = (values as any)[name];\n const resolved = typeof next === \"function\"\n ? (next as (previous: TValues[K]) => TValues[K])(previous)\n : next;\n (values as any)[name] = resolved;\n maybeValidateTouched();\n return resolved as TValues[K];\n } as Signal;\n signalLike.get = () => (values as any)[name];\n signalLike.peek = () => untrack(() => (values as any)[name]);\n signalLike.set = (next) => signalLike(next);\n signalLike.update = (updater) => signalLike(updater);\n signalLike.subscribe = (callback, subscribeOptions = {}) => {\n let first = true;\n let previous = signalLike.peek();\n return effect(() => {\n const current = (values as any)[name];\n if (first) {\n first = false;\n previous = current;\n if (subscribeOptions.immediate) callback(current, current);\n return;\n }\n if (!Object.is(previous, current)) {\n const prev = previous;\n previous = current;\n callback(current, prev);\n }\n });\n };\n Object.defineProperty(signalLike, \"isSignal\", { value: true });\n return signalLike;\n };\n\n const registerBinding = (\n name: K,\n domName: string,\n type: RegisteredFormBinding[\"type\"],\n bindOptions: FormBindOptions\n ): void => {\n const fieldName = String(name) as Extract;\n const fieldBindings = registeredBindings.get(fieldName) || new Map>();\n const signature = `${domName}|${type}|${String(bindOptions.value)}`;\n fieldBindings.set(signature, {\n domName,\n type,\n value: bindOptions.value,\n parse: bindOptions.parse\n });\n registeredBindings.set(fieldName, fieldBindings as Map>);\n };\n\n const syncFromForm = (event: Event): void => {\n const NO_FORM_VALUE = Symbol(\"ity.formState.noValue\");\n let formElement: HTMLFormElement;\n try {\n formElement = findFormElement(event);\n } catch (_error) {\n return;\n }\n const formData = createFormDataForElement(formElement);\n const controls = Array.from((formElement as any).elements || []) as Array<{ name?: string; value?: string; checked?: boolean }>;\n const patch: Partial = {};\n\n const resolveControlValue = (\n name: K,\n bindings: RegisteredFormBinding[]\n ): TValues[K] | typeof NO_FORM_VALUE => {\n const primary = bindings[0];\n if (!primary) return NO_FORM_VALUE;\n const domName = primary.domName;\n const namedControls = controls.filter((control) => control && control.name === domName);\n if (primary.parse && namedControls.length) {\n const parseTarget = primary.type === \"radio\"\n ? namedControls.find((control) => Boolean(control.checked)) || namedControls[0]\n : namedControls[0];\n return primary.parse(parseTarget, event);\n }\n if (primary.type === \"checkbox\") {\n const currentValue = (values as any)[name];\n if (Array.isArray(currentValue) || bindings.some((binding) => binding.value !== undefined) || namedControls.length > 1) {\n const selected: unknown[] = [];\n for (const control of namedControls) {\n if (!control.checked) continue;\n const matched = bindings.find((binding) => String(binding.value ?? control.value ?? \"\") === String(control.value ?? \"\"));\n selected.push(matched?.value ?? control.value ?? \"\");\n }\n return selected as TValues[K];\n }\n return formData.has(domName) as TValues[K];\n }\n if (primary.type === \"radio\") {\n return (formData.get(domName) ?? (values as any)[name]) as TValues[K];\n }\n if (primary.type === \"select-multiple\") {\n const select = namedControls[0] as HTMLSelectElement | undefined;\n if (select?.selectedOptions) {\n return Array.from(select.selectedOptions).map((option) => option.value) as TValues[K];\n }\n return formData.getAll(domName) as TValues[K];\n }\n if (primary.type === \"number\") {\n const raw = formData.get(domName);\n return (raw === null || raw === \"\" ? undefined : Number(raw)) as TValues[K];\n }\n const raw = formData.get(domName);\n return (raw === null ? \"\" : raw) as TValues[K];\n };\n\n for (const fieldName of allFieldNames()) {\n const bindings = Array.from(registeredBindings.get(fieldName)?.values() || []) as RegisteredFormBinding]>[];\n const nextValue = resolveControlValue(fieldName, bindings as RegisteredFormBinding[]);\n if (nextValue !== NO_FORM_VALUE) {\n (patch as any)[fieldName] = nextValue;\n }\n }\n\n if (Reflect.ownKeys(patch).length) {\n values.$patch(() => patch);\n }\n };\n\n const bind = (name: K, bindOptions: FormBindOptions = {}): Record => {\n const field = api.field(name);\n const type = bindOptions.type || \"text\";\n const eventName = bindOptions.event\n || (type === \"checkbox\" || type === \"radio\" || type === \"select\" || type === \"select-multiple\" ? \"change\" : \"input\");\n const domName = bindOptions.name || String(name);\n registerBinding(name, domName, type, bindOptions);\n const formattedValue = bindOptions.format ? bindOptions.format(field.value()) : field.value();\n const parseValue = (event: Event): TValues[K] => {\n if (bindOptions.parse) {\n return bindOptions.parse((event.currentTarget || event.target) as unknown, event);\n }\n const target = (event.currentTarget || event.target) as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | null;\n if (!target) return field.value();\n if (type === \"checkbox\") {\n if (Array.isArray(field.value())) {\n const optionValue = bindOptions.value ?? target.value;\n const current = field.value() as unknown[];\n return ((target as HTMLInputElement).checked\n ? Array.from(new Set([...current, optionValue]))\n : current.filter((item) => !Object.is(item, optionValue))) as TValues[K];\n }\n return Boolean((target as HTMLInputElement).checked) as TValues[K];\n }\n if (type === \"radio\") {\n if (!(target as HTMLInputElement).checked) return field.value();\n return (bindOptions.value ?? (target as HTMLInputElement).value) as TValues[K];\n }\n if (type === \"select-multiple\") {\n return Array.from((target as HTMLSelectElement).selectedOptions).map((option) => option.value) as TValues[K];\n }\n if (type === \"number\") {\n const raw = target.value;\n return (raw === \"\" ? (undefined as any) : Number(raw)) as TValues[K];\n }\n return target.value as TValues[K];\n };\n\n const binding: Record = {\n name: domName,\n [`@${eventName}`]: (event: Event) => {\n field.set(parseValue(event));\n },\n \"@blur\": () => {\n markTouched([name]);\n syncErrors();\n }\n };\n\n if (type === \"checkbox\") {\n if (Array.isArray(field.value())) {\n const optionValue = bindOptions.value;\n binding.value = optionValue === undefined ? \"\" : String(optionValue);\n binding[\".checked\"] = computed(() => (field.value() as unknown[]).some((item) => Object.is(item, optionValue)));\n } else {\n binding[\".checked\"] = computed(() => Boolean(field.value()));\n binding.checked = Boolean(field.value());\n }\n return binding;\n }\n\n if (type === \"radio\") {\n const optionValue = bindOptions.value;\n binding.value = optionValue === undefined ? \"\" : String(optionValue);\n binding[\".checked\"] = computed(() => Object.is(field.value(), optionValue));\n return binding;\n }\n\n if (type === \"select-multiple\") {\n binding[\".value\"] = formattedValue as any;\n return binding;\n }\n\n const stringValue = formattedValue === undefined || formattedValue === null ? \"\" : String(formattedValue);\n binding[\".value\"] = stringValue;\n binding.value = stringValue;\n return binding;\n };\n\n const api: FormState = {\n values,\n initialValues,\n errors,\n touched,\n dirty: computed(() => !deepEqual(values.$snapshot(), initialValues())),\n valid: computed(() => Reflect.ownKeys(errors.$snapshot()).length === 0),\n field(name: K): FormField {\n const valueSignal = createFieldSignal(name);\n return {\n value: valueSignal,\n error: computed(() => (errors as any)[name] || null),\n touched: computed(() => Boolean((touched as any)[name])),\n dirty: computed(() => !deepEqual((values as any)[name], (initialValues() as any)[name])),\n bind(optionsForField?: FormBindOptions): Record {\n return bind(name, optionsForField);\n },\n set(next) {\n return valueSignal.set(next);\n },\n reset() {\n valueSignal.set((initialValues.peek() as any)[name]);\n delete (errors as any)[name];\n delete (touched as any)[name];\n }\n };\n },\n bind,\n set,\n reset,\n validate(): boolean {\n return syncErrors();\n },\n markTouched,\n submit(\n handler: (snapshot: TValues, event: Event) => Promise | TResult,\n submitOptions: FormStateSubmitOptions = {}\n ): FormStateController {\n const submitAction = action<[TValues, Event], TResult, E>(handler, submitOptions);\n const onSubmit = async (event: Event): Promise => {\n event.preventDefault();\n syncFromForm(event);\n markTouched();\n if (!syncErrors()) return undefined;\n const result = await submitAction(cloneValue(values.$snapshot()), event);\n if (submitOptions.resetOnSuccess) api.reset();\n return result;\n };\n\n return {\n state: api,\n action: submitAction,\n data: submitAction.data,\n error: submitAction.error,\n pending: submitAction.pending,\n status: submitAction.status,\n onSubmit,\n handleSubmit(event: Event): void {\n onSubmit(event).catch(() => undefined);\n },\n reset(): void {\n submitAction.reset();\n api.reset();\n }\n };\n }\n };\n\n return api;\n}\n\nfunction html(strings: TemplateStringsArray | readonly string[], ...values: unknown[]): TemplateResult {\n return {\n isTemplateResult: true,\n strings: Array.from(strings),\n values\n };\n}\n\nfunction unsafeHTML(value: string, options: UnsafeHTMLOptions = {}): UnsafeHTML {\n const sanitizer = resolveSanitizeHTML(options);\n return {\n isUnsafeHTML: true,\n value: sanitizer ? sanitizer(String(value)) : String(value)\n };\n}\n\nfunction isTemplateResult(value: unknown): value is TemplateResult {\n return !!value && typeof value === \"object\" && (value as TemplateResult).isTemplateResult === true;\n}\n\nfunction isUnsafeHTML(value: unknown): value is UnsafeHTML {\n return !!value && typeof value === \"object\" && (value as UnsafeHTML).isUnsafeHTML === true;\n}\n\nfunction isNodeLike(value: unknown): value is Node {\n return !!value && typeof value === \"object\" && typeof (value as Node).nodeType === \"number\";\n}\n\nfunction documentOrThrow(): Document {\n const doc = getDocument();\n if (!doc) throw new Error(\"Ity DOM rendering requires a document\");\n return doc;\n}\n\nfunction normalizeValue(value: unknown): unknown {\n return isSignal(value) ? value() : value;\n}\n\nfunction valueToFragment(value: unknown, doc: Document = documentOrThrow()): DocumentFragment {\n const fragment = doc.createDocumentFragment();\n appendValue(fragment, normalizeValue(value), doc);\n return fragment;\n}\n\nfunction appendValue(parent: Node, value: unknown, doc: Document): void {\n value = normalizeValue(value);\n if (value === null || value === undefined || value === false) return;\n if (Array.isArray(value)) {\n for (const item of value) appendValue(parent, item, doc);\n return;\n }\n if (isTemplateResult(value)) {\n parent.appendChild(materializeTemplate(value, doc));\n return;\n }\n if (isUnsafeHTML(value)) {\n const template = doc.createElement(\"template\");\n template.innerHTML = value.value;\n parent.appendChild(template.content.cloneNode(true));\n return;\n }\n if (isNodeLike(value)) {\n parent.appendChild(value);\n return;\n }\n parent.appendChild(doc.createTextNode(String(value)));\n}\n\ninterface Binding {\n index: number;\n kind: \"node\" | \"event\" | \"attr\" | \"prop\" | \"bool\";\n name?: string;\n}\n\nfunction bindingFromName(rawName: string): Pick {\n const first = rawName[0];\n const kind = first === \"@\" ? \"event\" : first === \".\" ? \"prop\" : first === \"?\" ? \"bool\" : \"attr\";\n const name = kind === \"attr\" ? rawName : rawName.slice(1);\n return { kind, name };\n}\n\nfunction materializeTemplate(result: TemplateResult, doc: Document = documentOrThrow()): DocumentFragment {\n const bindings: Binding[] = [];\n let source = \"\";\n\n for (let i = 0; i < result.values.length; i += 1) {\n const part = result.strings[i] ?? \"\";\n const attrMatch = part.match(/([@.?]?[\\w:-]+)\\s*=\\s*$/);\n if (attrMatch) {\n const rawName = attrMatch[1];\n const before = part.slice(0, part.length - attrMatch[0].length);\n const marker = `data-ity-bind-${i}`;\n const { kind, name } = bindingFromName(rawName);\n bindings.push({ index: i, kind, name });\n source += `${before}${marker}=\"\"`;\n } else {\n bindings.push({ index: i, kind: \"node\" });\n source += `${part}`;\n }\n }\n source += result.strings[result.strings.length - 1] ?? \"\";\n\n const template = doc.createElement(\"template\");\n template.innerHTML = source;\n const fragment = template.content.cloneNode(true) as DocumentFragment;\n applyBindings(fragment, bindings, result.values, doc);\n return fragment;\n}\n\nfunction applyBindings(root: DocumentFragment, bindings: Binding[], values: readonly unknown[], doc: Document): void {\n const comments = new Map();\n const walker = doc.createTreeWalker(root, 128);\n let current = walker.nextNode();\n while (current) {\n const comment = current as Comment;\n const match = comment.data.match(/^ity:(\\d+)$/);\n if (match) {\n const index = Number(match[1]);\n const list = comments.get(index) || [];\n list.push(comment);\n comments.set(index, list);\n }\n current = walker.nextNode();\n }\n\n for (const binding of bindings) {\n const value = normalizeValue(values[binding.index]);\n if (binding.kind === \"node\") {\n const markers = comments.get(binding.index) || [];\n for (const marker of markers) {\n marker.replaceWith(valueToFragment(value, doc));\n }\n continue;\n }\n\n const attrName = `data-ity-bind-${binding.index}`;\n const elements = Array.from(root.querySelectorAll(`[${attrName}]`)) as HTMLElement[];\n for (const element of elements) {\n element.removeAttribute(attrName);\n applyElementBinding(element, binding, value);\n }\n }\n}\n\nfunction applyElementBinding(element: HTMLElement, binding: Binding, value: unknown): void {\n const name = binding.name || \"\";\n if (binding.kind === \"attr\" && name === \"bind\" && isPlainObject(value)) {\n for (const key of Reflect.ownKeys(value)) {\n const entryValue = normalizeValue((value as any)[key]);\n const entry = bindingFromName(String(key));\n applyElementBinding(element, { index: binding.index, ...entry }, entryValue);\n }\n return;\n }\n\n if (binding.kind === \"event\") {\n if (typeof value === \"function\") {\n element.addEventListener(name, value as EventListener);\n } else if (Array.isArray(value) && typeof value[0] === \"function\") {\n element.addEventListener(name, value[0] as EventListener, value[1] as AddEventListenerOptions);\n }\n return;\n }\n\n if (binding.kind === \"prop\") {\n if (name === \"value\" && Array.isArray(value) && element.tagName === \"SELECT\" && (element as HTMLSelectElement).multiple) {\n const selectedValues = new Set(value.map((entry) => String(entry)));\n Array.from((element as HTMLSelectElement).options).forEach((option) => {\n option.selected = selectedValues.has(option.value);\n });\n return;\n }\n (element as any)[name] = value;\n return;\n }\n\n if (binding.kind === \"bool\") {\n element.toggleAttribute(name, Boolean(value));\n return;\n }\n\n if (value === false || value === null || value === undefined) {\n element.removeAttribute(name);\n return;\n }\n\n if (name === \"class\" && Array.isArray(value)) {\n element.setAttribute(\"class\", value.filter(Boolean).join(\" \"));\n return;\n }\n\n if (name === \"class\" && typeof value === \"object\") {\n const classes = Object.keys(value as Record).filter((key) => Boolean((value as any)[key]));\n element.setAttribute(\"class\", classes.join(\" \"));\n return;\n }\n\n if (name === \"style\" && typeof value === \"object\" && value !== null) {\n Object.assign((element as HTMLElement).style, value);\n return;\n }\n\n element.setAttribute(name, value === true ? \"\" : String(value));\n}\n\nfunction resolveTarget(target: string | Element | DocumentFragment | SelectorObject): Element | DocumentFragment {\n if (typeof target === \"string\") {\n const found = documentOrThrow().querySelector(target);\n if (!found) throw new Error(`Render target not found: ${target}`);\n return found;\n }\n if ((target as SelectorObject)?.isSelectorObject) {\n const first = (target as SelectorObject).first()[0];\n if (!first) throw new Error(\"Cannot render into an empty SelectorObject\");\n return first;\n }\n return target as Element | DocumentFragment;\n}\n\nfunction replaceChildren(target: Element | DocumentFragment, fragment: DocumentFragment): void {\n const maybeTarget = target as any;\n if (typeof maybeTarget.replaceChildren === \"function\") {\n maybeTarget.replaceChildren(fragment);\n return;\n }\n while (target.firstChild) target.removeChild(target.firstChild);\n target.appendChild(fragment);\n}\n\nfunction withViewTransition(update: () => void, enabled: boolean | undefined): void {\n const doc = getDocument() as any;\n if (enabled && doc && typeof doc.startViewTransition === \"function\") {\n doc.startViewTransition(update);\n } else {\n update();\n }\n}\n\nfunction render(\n view: TemplateValue | (() => TemplateValue),\n target: string | Element | DocumentFragment | SelectorObject,\n options: RenderOptions = {}\n): Cleanup {\n const mount = resolveTarget(target);\n const update = () => {\n withConfig(options.config, () => {\n const value = typeof view === \"function\" && !isSignal(view)\n ? (view as () => TemplateValue)()\n : normalizeValue(view);\n withViewTransition(() => replaceChildren(mount, valueToFragment(value)), options.transition);\n });\n };\n\n if (options.reactive === false) {\n update();\n return () => undefined;\n }\n\n return effect(update);\n}\n\nfunction renderToString(view: TemplateValue | (() => TemplateValue), options: RenderToStringOptions = {}): string {\n return withConfig(options.config, () => {\n const value = typeof view === \"function\" && !isSignal(view)\n ? (view as () => TemplateValue)()\n : normalizeValue(view);\n return valueToString(value);\n });\n}\n\nfunction valueToString(value: unknown): string {\n value = normalizeValue(value);\n if (value === null || value === undefined || value === false) return \"\";\n if (Array.isArray(value)) return value.map(valueToString).join(\"\");\n if (isTemplateResult(value)) return templateToString(value);\n if (isUnsafeHTML(value)) return value.value;\n if (isNodeLike(value)) {\n const node = value as any;\n if (typeof node.outerHTML === \"string\") return node.outerHTML;\n return escapeHTML(node.textContent || \"\");\n }\n return escapeHTML(String(value));\n}\n\nfunction templateToString(result: TemplateResult): string {\n let source = \"\";\n for (let i = 0; i < result.values.length; i += 1) {\n const part = result.strings[i] ?? \"\";\n const attrMatch = part.match(/([@.?]?[\\w:-]+)\\s*=\\s*$/);\n const value = normalizeValue(result.values[i]);\n if (attrMatch) {\n const rawName = attrMatch[1];\n const before = part.slice(0, part.length - attrMatch[0].length);\n const { kind, name } = bindingFromName(rawName);\n if (kind === \"attr\" && name === \"bind\" && isPlainObject(value)) {\n const serialized: string[] = [];\n for (const key of Reflect.ownKeys(value)) {\n const entryValue = normalizeValue((value as any)[key]);\n const entry = bindingFromName(String(key));\n const entryName = entry.name || \"\";\n if (entry.kind === \"event\" || entryValue === false || entryValue === null || entryValue === undefined) continue;\n if (entry.kind === \"bool\") {\n if (entryValue) serialized.push(entryName);\n continue;\n }\n if (entry.kind === \"prop\") {\n if (entryName === \"value\") {\n serialized.push(`value=\"${escapeAttribute(String(entryValue))}\"`);\n } else if ((entryName === \"checked\" || entryName === \"selected\") && entryValue) {\n serialized.push(entryName);\n }\n continue;\n }\n serialized.push(`${entryName}=\"${escapeAttribute(stringifyAttribute(entryName, entryValue))}\"`);\n }\n source += serialized.length ? `${before}${serialized.join(\" \")}` : before;\n continue;\n }\n if (kind === \"event\" || kind === \"prop\" || value === false || value === null || value === undefined) {\n source += before;\n } else if (kind === \"bool\") {\n source += value ? `${before}${name}` : before;\n } else {\n source += `${before}${name || \"\"}=\"${escapeAttribute(stringifyAttribute(name || \"\", value))}\"`;\n }\n } else {\n source += part + valueToString(value);\n }\n }\n source += result.strings[result.strings.length - 1] ?? \"\";\n return source;\n}\n\nfunction stringifyAttribute(name: string, value: unknown): string {\n if (name === \"class\" && Array.isArray(value)) return value.filter(Boolean).join(\" \");\n if (name === \"class\" && typeof value === \"object\" && value !== null) {\n return Object.keys(value as Record).filter((key) => Boolean((value as any)[key])).join(\" \");\n }\n if (name === \"style\" && typeof value === \"object\" && value !== null) {\n return Object.keys(value as Record)\n .map((key) => `${key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`)}:${(value as any)[key]}`)\n .join(\";\");\n }\n return value === true ? \"\" : String(value);\n}\n\nfunction escapeHTML(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(//g, \">\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeHTML(value)\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\ninterface ComponentContext {\n host: HTMLElement;\n root: HTMLElement | ShadowRoot;\n attr(name: string): ReadonlySignal;\n prop(name: string): ReadonlySignal;\n emit(name: string, detail?: T, options?: CustomEventInit): boolean;\n effect(callback: (onCleanup: (cleanup: Cleanup) => void) => void): EffectHandle;\n onConnected(callback: () => void): void;\n onDisconnected(callback: () => void): void;\n}\n\ntype ComponentRender = TemplateValue | (() => TemplateValue);\ntype ComponentSetup = (ctx: ComponentContext) => ComponentRender | void;\n\ninterface ComponentOptions {\n attrs?: string[];\n observedAttributes?: string[];\n props?: string[];\n shadow?: boolean | ShadowRootMode | ShadowRootInit;\n styles?: string;\n config?: ItyConfig | null;\n setup?: ComponentSetup;\n}\n\nfunction component(\n name: string,\n setupOrOptions: ComponentSetup | ComponentOptions,\n maybeOptions: Omit = {}\n): CustomElementConstructor {\n const win = getWindow();\n if (!win?.customElements || !win.HTMLElement) {\n throw new Error(\"Ity.component requires Custom Elements support\");\n }\n\n if (win.customElements.get(name)) {\n return win.customElements.get(name)!;\n }\n\n const definition: ComponentOptions = typeof setupOrOptions === \"function\"\n ? { ...maybeOptions, setup: setupOrOptions }\n : setupOrOptions;\n const attrs = definition.observedAttributes || definition.attrs || [];\n const props = definition.props || [];\n\n class ItyElement extends win.HTMLElement {\n static get observedAttributes(): string[] {\n return attrs;\n }\n\n private attrSignals = new Map>();\n private propSignals = new Map>();\n private connectedCallbacks: Cleanup[] = [];\n private disconnectedCallbacks: Cleanup[] = [];\n private effectRecords: Array<{\n callback: (onCleanup: (cleanup: Cleanup) => void) => void;\n handle?: EffectHandle;\n disposed: boolean;\n }> = [];\n private renderCleanup?: Cleanup;\n private mount?: HTMLElement | ShadowRoot;\n private renderTarget?: HTMLElement | ShadowRoot;\n private renderOutput?: ComponentRender;\n private initialized = false;\n private connected = false;\n\n connectedCallback(): void {\n this.ensureMount();\n for (const prop of props) this.upgradeProperty(prop);\n if (!this.initialized) {\n this.initialized = true;\n const ctx = this.createContext();\n const output = definition.setup?.(ctx);\n if (output !== undefined) {\n this.renderOutput = output as ComponentRender;\n }\n }\n this.connected = true;\n this.startRender();\n this.startEffects();\n for (const callback of this.connectedCallbacks) callback();\n }\n\n disconnectedCallback(): void {\n this.connected = false;\n if (this.renderCleanup) {\n this.renderCleanup();\n this.renderCleanup = undefined;\n }\n for (const record of this.effectRecords) {\n record.handle?.dispose();\n record.handle = undefined;\n }\n for (const callback of this.disconnectedCallbacks) callback();\n }\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\n this.ensureAttrSignal(name).set(newValue);\n }\n\n private ensureMount(): void {\n if (this.mount && this.renderTarget) return;\n const shadow = definition.shadow;\n if (shadow === false) {\n this.mount = this;\n } else {\n const init: ShadowRootInit = typeof shadow === \"object\"\n ? shadow\n : { mode: shadow === \"closed\" ? \"closed\" : \"open\" };\n this.mount = this.shadowRoot || this.attachShadow(init);\n }\n\n if (definition.styles) {\n const doc = this.ownerDocument;\n const style = doc.createElement(\"style\");\n style.textContent = definition.styles;\n const container = doc.createElement(\"span\");\n container.setAttribute(\"data-ity-component-root\", \"\");\n this.mount.appendChild(style);\n this.mount.appendChild(container);\n this.renderTarget = container;\n } else {\n this.renderTarget = this.mount;\n }\n }\n\n private startRender(): void {\n if (this.renderCleanup || this.renderOutput === undefined) return;\n this.renderCleanup = render(this.renderOutput, this.renderTarget!, {\n transition: false,\n config: definition.config\n });\n }\n\n private startEffects(): void {\n for (const record of this.effectRecords) {\n if (!record.disposed && !record.handle) {\n record.handle = effect(record.callback);\n }\n }\n }\n\n private ensureAttrSignal(name: string): Signal {\n if (!this.attrSignals.has(name)) {\n this.attrSignals.set(name, signal(this.getAttribute(name)));\n }\n return this.attrSignals.get(name)!;\n }\n\n private ensurePropSignal(name: string): Signal {\n if (!this.propSignals.has(name)) {\n this.propSignals.set(name, signal(undefined as unknown) as Signal);\n }\n return this.propSignals.get(name)! as Signal;\n }\n\n private upgradeProperty(name: string): void {\n if (!hasOwn(this, name)) return;\n const value = (this as any)[name];\n delete (this as any)[name];\n (this as any)[name] = value;\n }\n\n private createContext(): ComponentContext {\n return {\n host: this,\n root: this.mount!,\n attr: (name) => this.ensureAttrSignal(name),\n prop: (name: string) => this.ensurePropSignal(name),\n emit: (name, detail, options = {}) => this.dispatchEvent(new CustomEvent(name, {\n bubbles: true,\n composed: true,\n ...options,\n detail\n })),\n effect: (callback) => {\n const record = { callback, disposed: false, handle: undefined as EffectHandle | undefined };\n this.effectRecords.push(record);\n if (this.connected) record.handle = effect(callback);\n const dispose = (() => {\n record.disposed = true;\n record.handle?.dispose();\n record.handle = undefined;\n }) as EffectHandle;\n dispose.dispose = dispose;\n return dispose;\n },\n onConnected: (callback) => {\n this.connectedCallbacks.push(callback);\n },\n onDisconnected: (callback) => {\n this.disconnectedCallbacks.push(callback);\n }\n };\n }\n }\n\n for (const prop of props) {\n Object.defineProperty(ItyElement.prototype, prop, {\n configurable: true,\n enumerable: true,\n get(this: any) {\n return this.ensurePropSignal(prop).peek();\n },\n set(this: any, value: unknown) {\n this.ensurePropSignal(prop).set(typeof value === \"function\" ? (() => value) as any : value);\n }\n });\n }\n\n win.customElements.define(name, ItyElement);\n return ItyElement;\n}\n\ninterface EventRecord {\n callback: (data?: unknown) => void;\n ctx: any;\n}\n\nclass Evented {\n private _events: Record = {};\n\n on(evtName: string, callback: (data?: unknown) => void, context: any = this): void {\n (this._events[evtName] ||= []).push({ callback, ctx: context });\n }\n\n off(evtName?: string, callback?: (data?: unknown) => void, context?: any): void {\n if (!evtName) {\n this._events = {};\n return;\n }\n const events = this._events[evtName];\n if (!events) return;\n if (!callback) {\n delete this._events[evtName];\n return;\n }\n for (let i = events.length - 1; i >= 0; i -= 1) {\n const event = events[i];\n if (event.callback === callback && (context === undefined || event.ctx === context)) {\n events.splice(i, 1);\n }\n }\n if (events.length === 0) delete this._events[evtName];\n }\n\n trigger(evtName: string, data?: unknown): void {\n const events = this._events[evtName];\n if (!events) return;\n for (const event of events.slice()) {\n event.callback.call(event.ctx, data);\n }\n }\n}\n\nconst regexps = {\n nospaces: /^\\S*$/\n} as const;\n\nclass SelectorObject {\n [index: number]: HTMLElement;\n public readonly isSelectorObject = true;\n private nodes: HTMLElement[] = [];\n\n constructor(nodeList: ArrayLike = []) {\n this.nodes = Array.from(nodeList as HTMLElement[]);\n this.reindex();\n }\n\n get length(): number {\n return this.nodes.length;\n }\n\n [Symbol.iterator](): Iterator {\n return this.nodes[Symbol.iterator]();\n }\n\n toArray(): HTMLElement[] {\n return this.nodes.slice();\n }\n\n find(selector: string): SelectorObject {\n const nodeList: HTMLElement[] = [];\n for (const node of this.nodes) {\n const list = node.querySelectorAll(selector);\n for (const thisNode of Array.from(list)) {\n const elm = thisNode as HTMLElement;\n if (nodeList.indexOf(elm) < 0) nodeList.push(elm);\n }\n }\n return new SelectorObject(nodeList);\n }\n\n filter(selector: string): SelectorObject {\n return new SelectorObject(this.nodes.filter((node) => node.matches(selector)));\n }\n\n first(): SelectorObject {\n return new SelectorObject(this.nodes[0] ? [this.nodes[0]] : []);\n }\n\n last(): SelectorObject {\n return new SelectorObject(this.nodes.length ? [this.nodes[this.nodes.length - 1]] : []);\n }\n\n parent(): SelectorObject {\n const nodeList: HTMLElement[] = [];\n for (const node of this.nodes) {\n const parent = node.parentElement;\n if (parent && nodeList.indexOf(parent) < 0) nodeList.push(parent);\n }\n return new SelectorObject(nodeList);\n }\n\n children(selector?: string): SelectorObject {\n const nodeList: HTMLElement[] = [];\n for (const node of this.nodes) {\n for (const child of Array.from(node.children) as HTMLElement[]) {\n if (nodeList.indexOf(child) < 0 && (!selector || child.matches(selector))) {\n nodeList.push(child);\n }\n }\n }\n return new SelectorObject(nodeList);\n }\n\n remove(): SelectorObject {\n for (const node of this.nodes) node.remove();\n return new SelectorObject([]);\n }\n\n addClass(...classes: string[]): this {\n for (const node of this.nodes) node.classList.add(...classes);\n return this;\n }\n\n removeClass(value: string): this {\n if (value && regexps.nospaces.test(value)) {\n for (const node of this.nodes) node.classList.remove(value);\n }\n return this;\n }\n\n toggleClass(value: string): this {\n if (value && regexps.nospaces.test(value)) {\n for (const node of this.nodes) node.classList.toggle(value);\n }\n return this;\n }\n\n hasClass(value: string): boolean {\n return Boolean(value && regexps.nospaces.test(value) && this.nodes.some((node) => node.classList.contains(value)));\n }\n\n attr(name: string, value?: string | number | boolean | null): string | null | this {\n if (arguments.length === 1) return this.nodes[0]?.getAttribute(name) ?? null;\n for (const node of this.nodes) {\n if (value === null || value === false || value === undefined) node.removeAttribute(name);\n else node.setAttribute(name, value === true ? \"\" : String(value));\n }\n return this;\n }\n\n text(value?: string | number | boolean): string | this {\n if (arguments.length === 0) return this.nodes.map((node) => node.textContent || \"\").join(\"\");\n for (const node of this.nodes) node.textContent = String(value);\n return this;\n }\n\n on(eventName: string, listener: EventListener, options?: AddEventListenerOptions): this {\n for (const node of this.nodes) node.addEventListener(eventName, listener, options);\n return this;\n }\n\n off(eventName: string, listener: EventListener, options?: EventListenerOptions): this {\n for (const node of this.nodes) node.removeEventListener(eventName, listener, options);\n return this;\n }\n\n before(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"beforebegin\");\n }\n\n after(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"afterend\");\n }\n\n append(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"beforeend\");\n }\n\n prepend(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"afterbegin\");\n }\n\n html(content?: string | SelectorObject | HTMLElement | TemplateResult): this | string {\n if (arguments.length === 0) return this.nodes[0]?.innerHTML ?? \"\";\n return this._html(content!, \"replace\");\n }\n\n empty(): this {\n for (const node of this.nodes) node.textContent = \"\";\n return this;\n }\n\n private _html(content: string | SelectorObject | HTMLElement | TemplateResult, position: InsertPosition | \"replace\"): this {\n const doc = getDocument();\n for (const node of this.nodes) {\n if ((content as SelectorObject)?.isSelectorObject) {\n const htmls = Array.from(content as SelectorObject).map((selNode) => selNode.outerHTML).join(\"\");\n if (position === \"replace\") node.innerHTML = htmls;\n else node.insertAdjacentHTML(position as InsertPosition, htmls);\n } else if (isTemplateResult(content) && doc) {\n const fragment = materializeTemplate(content, doc);\n if (position === \"replace\") replaceChildren(node, fragment);\n else node.insertAdjacentElement(position as InsertPosition, fragmentToElement(fragment, doc));\n } else if (isNodeLike(content)) {\n const cloned = content.cloneNode(true) as HTMLElement;\n if (position === \"replace\") replaceChildren(node, valueToFragment(cloned, doc || node.ownerDocument));\n else node.insertAdjacentElement(position as InsertPosition, cloned);\n } else {\n const htmlContent = String(content);\n if (position === \"replace\") node.innerHTML = htmlContent;\n else node.insertAdjacentHTML(position as InsertPosition, htmlContent);\n }\n }\n return this;\n }\n\n private reindex(): void {\n for (const key of Object.keys(this)) {\n if (/^\\d+$/.test(key)) delete (this as any)[key];\n }\n this.nodes.forEach((node, index) => {\n (this as any)[index] = node;\n });\n }\n}\n\nfunction fragmentToElement(fragment: DocumentFragment, doc: Document): HTMLElement {\n const span = doc.createElement(\"span\");\n span.appendChild(fragment);\n return span;\n}\n\nfunction onDOMReady(fn: (...args: any[]) => void, args: unknown[] = [], context: any = Ity): void {\n const doc = getDocument();\n const func = () => fn.apply(context, args);\n if (!doc || doc.readyState !== \"loading\") func();\n else doc.addEventListener(\"DOMContentLoaded\", func, { once: true });\n}\n\ninterface AjaxOptions {\n url?: string;\n type?: string;\n data?: unknown;\n success?: (resp: any) => void;\n error?: (status?: number, error?: unknown) => void;\n}\n\nclass Model = Record> extends Evented {\n public id!: string;\n public data!: T;\n public url!: string;\n public readonly state: Signal;\n\n constructor(opts: Partial> = {}) {\n super();\n Object.assign(this, opts);\n this.id ||= `m${Math.floor(Math.random() * 100000) + 1}`;\n this.data ||= {} as T;\n this.url ||= \"\";\n this.state = signal(this.data);\n this._init(opts);\n }\n\n onDOMReady = onDOMReady;\n\n protected _init(opts?: Partial>): void {\n this.initialize(opts);\n }\n\n protected _ajax(opts: AjaxOptions = {}): void {\n const request = new XMLHttpRequest();\n const method = opts.type || \"GET\";\n const url = opts.url || this.url;\n const success = opts.success || function (this: Model, resp: any) {\n this.data = resp;\n this.state.set(resp);\n };\n const error = opts.error || function () { };\n request.open(method, url, true);\n request.onload = () => {\n if (request.status >= 200 && request.status < 400) {\n try {\n const response = request.responseText ? JSON.parse(request.responseText) : null;\n success.call(this, response);\n } catch (err) {\n error.call(this, request.status, err);\n }\n } else {\n error.call(this, request.status);\n }\n };\n request.onerror = () => error.call(this);\n request.send(opts.data === undefined ? undefined : JSON.stringify(opts.data));\n }\n\n initialize(options?: Partial>): void { }\n\n get(attr?: keyof T): any {\n const current = this.data;\n if (!attr) return current;\n return current ? (current as any)[attr as string] : undefined;\n }\n\n set(attr: keyof T | Partial, value?: any): void {\n const current = this.state.peek() || {} as T;\n const next = typeof attr === \"string\"\n ? { ...(current as any), [attr]: value } as T\n : attr as T;\n this.data = next;\n this.state.set(next);\n this.trigger(\"change\", this.data);\n }\n\n unSet(attr: keyof T): void {\n const current = this.state.peek();\n if (!current || !Object.prototype.hasOwnProperty.call(current, attr)) return;\n const next = { ...(current as any) };\n delete next[attr as string];\n this.data = next as T;\n this.state.set(this.data);\n this.trigger(\"change\", this.data);\n }\n\n clear(): void {\n this.data = {} as T;\n this.state.set(this.data);\n this.trigger(\"change\", this.data);\n }\n\n subscribe(callback: Subscriber, options?: { immediate?: boolean }): Cleanup {\n return this.state.subscribe(callback, options);\n }\n\n sync(opts?: AjaxOptions): void {\n this._ajax(opts);\n }\n\n toJSON(): T {\n return this.get();\n }\n}\n\ninterface ViewEvents {\n [selector: string]: Record;\n}\n\ninterface ViewOptions {\n el?: string | SelectorObject | NodeList | HTMLElement;\n app?: Application;\n name?: string;\n events?: ViewEvents;\n [key: string]: any;\n}\n\nclass View extends Evented {\n public id!: string;\n public el!: SelectorObject;\n public app?: Application;\n public name?: string;\n public events!: ViewEvents;\n private renderCleanup?: Cleanup;\n private delegatedListeners: Cleanup[] = [];\n\n constructor(opts: ViewOptions = {}) {\n super();\n Object.assign(this, opts);\n this.id ||= `v${Math.floor(Math.random() * 100000) + 1}`;\n if (this.app) this.app.addView(this);\n this.events ||= {};\n onDOMReady(this._init, [opts], this);\n }\n\n private _setElement(elSelector: ViewOptions[\"el\"]): void {\n const win = getWindow();\n if ((elSelector as SelectorObject)?.isSelectorObject) {\n this.el = elSelector as SelectorObject;\n } else if (win?.NodeList && elSelector instanceof win.NodeList) {\n this.el = new SelectorObject(elSelector as any);\n } else if (typeof elSelector === \"string\") {\n this.el = new SelectorObject(documentOrThrow().querySelectorAll(elSelector) as any);\n } else if (win?.HTMLElement && elSelector instanceof win.HTMLElement) {\n this.el = new SelectorObject([elSelector]);\n } else {\n throw new Error(\"el selector must be of type String, NodeList, HTMLElement or Ity.SelectorObject\");\n }\n }\n\n private _bindDOMEvents(evtObj: ViewEvents): void {\n if (!this.el || !this.el.isSelectorObject) return;\n const captureEvents = [\"focus\", \"blur\"];\n for (const selector in evtObj) {\n for (const evt in evtObj[selector]) {\n const callback = (this as any)[evtObj[selector][evt]];\n if (typeof callback !== \"function\") {\n throw new Error(`View event handler not found: ${evtObj[selector][evt]}`);\n }\n const capture = captureEvents.includes(evt);\n this._delegateEvent(selector, evt, callback, capture);\n }\n }\n }\n\n private _delegateEvent(selector: string, evtName: string, callback: (e: Event) => void, capture = false): void {\n for (const root of this.el) {\n const listener = (event: Event) => {\n let node: HTMLElement | null = event.target as HTMLElement;\n while (node) {\n if ((node as any).matches && (node as any).matches(selector)) {\n (event as any).delegateTarget = node;\n callback.call(this, event);\n break;\n }\n if (node === root) break;\n node = node.parentElement;\n }\n };\n root.addEventListener(evtName, listener, capture);\n this.delegatedListeners.push(() => root.removeEventListener(evtName, listener, capture));\n }\n }\n\n private _init(opts: ViewOptions): void {\n if (this.el) this._setElement(this.el as any);\n if (opts.el && !this.el) this._setElement(opts.el);\n this._bindDOMEvents(this.events);\n this.initialize(opts);\n }\n\n initialize(opts?: ViewOptions): void { }\n\n getName(): string | undefined {\n return this.name;\n }\n\n get(attr: keyof this): any {\n return (this as any)[attr];\n }\n\n set(attr: keyof this, value: any): void {\n (this as any)[attr] = value;\n }\n\n renderWith(view: TemplateValue | (() => TemplateValue), options?: RenderOptions): Cleanup {\n if (this.renderCleanup) this.renderCleanup();\n this.renderCleanup = render(view, this.el, options);\n return this.renderCleanup;\n }\n\n remove(): void {\n if (this.renderCleanup) this.renderCleanup();\n for (const cleanup of this.delegatedListeners.splice(0)) cleanup();\n this.el.remove();\n if (this.app) this.app.removeView(this.id);\n }\n\n select(selector: string, ctx: HTMLElement | HTMLDocument | SelectorObject = this.el): SelectorObject {\n const win = getWindow();\n if ((win?.HTMLElement && ctx instanceof win.HTMLElement) || (win?.HTMLDocument && ctx instanceof win.HTMLDocument)) {\n return new SelectorObject(ctx.querySelectorAll(selector) as any);\n }\n if ((ctx as any).isSelectorObject) return (ctx as SelectorObject).find(selector);\n throw new Error(\"Context passed to .select() must be an HTMLElement or an Ity.SelectorObject\");\n }\n}\n\nclass Application {\n public views: View[] = [];\n\n getView(id: string): View | undefined {\n return this.views.find((view) => view.id === id);\n }\n\n addView(view: View): void {\n if (view instanceof View && !this.views.includes(view)) this.views.push(view);\n }\n\n removeView(id: string): void {\n this.views = this.views.filter((view) => view.id !== id);\n }\n\n trigger(evtName: string, data?: unknown): void {\n for (const view of this.views.slice()) view.trigger(evtName, data);\n }\n}\n\nclass Collection {\n public models: M[] = [];\n public url!: string;\n public readonly state: Signal;\n private ModelClass: new () => M;\n\n constructor(models: M[] = [], ModelClass: new () => M = Model as any) {\n this.ModelClass = ModelClass;\n this.url = \"\";\n this.state = signal(this.models);\n models.forEach((model) => this.add(model));\n }\n\n get(id: string): M | undefined {\n return this.models.find((model) => model.id === id);\n }\n\n add(model: M): void {\n if (!(model instanceof Model)) return;\n this.models = [...this.models, model];\n this.state.set(this.models);\n }\n\n remove(id: string | M): void {\n const model = typeof id === \"string\" ? this.get(id) : id;\n if (!model) return;\n this.models = this.models.filter((item) => item !== model);\n this.state.set(this.models);\n }\n\n at(index: number): M | undefined {\n return this.models[index];\n }\n\n get length(): number {\n return this.models.length;\n }\n\n clear(): void {\n this.models = [];\n this.state.set(this.models);\n }\n\n find(predicate: (m: M) => boolean): M | undefined {\n return this.models.find(predicate);\n }\n\n filter(predicate: (m: M) => boolean): M[] {\n return this.models.filter(predicate);\n }\n\n map(mapper: (m: M, index: number) => T): T[] {\n return this.models.map(mapper);\n }\n\n toJSON(): any[] {\n return this.models.map((model) => model.get());\n }\n\n subscribe(callback: Subscriber, options?: { immediate?: boolean }): Cleanup {\n return this.state.subscribe(callback, options);\n }\n\n protected _ajax(opts: AjaxOptions = {}): void {\n const request = new XMLHttpRequest();\n const method = opts.type || \"GET\";\n const url = opts.url || this.url;\n const success = opts.success || function () { };\n const error = opts.error || function () { };\n request.open(method, url, true);\n request.onload = () => {\n if (request.status >= 200 && request.status < 400) {\n try {\n success.call(this, request.responseText ? JSON.parse(request.responseText) : null);\n } catch (err) {\n error.call(this, request.status, err);\n }\n } else {\n error.call(this, request.status);\n }\n };\n request.onerror = () => error.call(this);\n request.send(opts.data === undefined ? undefined : JSON.stringify(opts.data));\n }\n\n fetch(opts: AjaxOptions & { modelClass?: new () => M } = {}): void {\n const userSuccess = opts.success;\n opts.success = function (this: Collection, resp: any[]) {\n const ctor = (opts.modelClass || this.ModelClass) as new () => M;\n this.clear();\n for (const data of resp || []) {\n const model = new ctor();\n (model as any).set(data);\n this.add(model);\n }\n if (userSuccess) userSuccess.call(this, resp);\n };\n this._ajax(opts);\n }\n\n trigger(evtName: string, data?: unknown): void {\n for (const model of this.models.slice()) model.trigger(evtName, data);\n }\n}\n\ninterface RouteContext {\n path: string;\n url: URL;\n params: Record;\n query: Record;\n hash: Record;\n}\n\ntype RouteHandler = (params: Record, context: RouteContext) => void | Cleanup;\n\ninterface RouteRecord {\n pattern: string;\n handler: RouteHandler;\n exec(url: URL): Record | null;\n}\n\ninterface RouterOptions {\n base?: string;\n autoStart?: boolean;\n linkSelector?: string;\n transition?: boolean;\n notFound?: RouteHandler;\n}\n\nclass Router {\n private routes: RouteRecord[] = [];\n private started = false;\n private readonly listener = () => this.check();\n private readonly clickListener = (event: Event) => this.handleLinkClick(event);\n private readonly navigationListener = (event: any) => this.handleNavigationEvent(event);\n private routeCleanup?: Cleanup;\n private activeRoute?: RouteRecord;\n public readonly current: Signal = signal(null);\n public notFound?: RouteHandler;\n public base: string;\n public linkSelector: string;\n public transition: boolean;\n\n constructor(options: RouterOptions = {}) {\n this.base = options.base || \"/\";\n this.linkSelector = options.linkSelector || \"a[href]\";\n this.transition = Boolean(options.transition);\n this.notFound = options.notFound;\n if (options.autoStart !== false) this.start();\n }\n\n add(pattern: string, handler: RouteHandler): this {\n this.routes.push(createRouteRecord(pattern, handler));\n return this;\n }\n\n addRoute(pattern: string, handler: RouteHandler): void {\n this.add(pattern, handler);\n }\n\n removeRoute(pattern: string): this {\n if (this.activeRoute?.pattern === pattern) {\n this.disposeRoute();\n this.activeRoute = undefined;\n this.current.set(null);\n }\n this.routes = this.routes.filter((route) => route.pattern !== pattern);\n return this;\n }\n\n navigate(path: string, options: { replace?: boolean; transition?: boolean } = {}): void {\n const win = getWindow();\n if (!win) return;\n const update = () => {\n const method = options.replace ? \"replaceState\" : \"pushState\";\n win.history[method](null, \"\", withBasePath(path, this.base));\n this.check();\n };\n withViewTransition(update, options.transition ?? this.transition);\n }\n\n href(path: string): string {\n return withBasePath(path, this.base);\n }\n\n link(path: string, attrs: Record = {}): Record {\n const previousClick = attrs[\"@click\"] as ((event: Event) => void) | undefined;\n const href = this.href(path);\n return {\n ...attrs,\n href,\n \"@click\": (event: Event) => {\n previousClick?.(event);\n const currentTarget = event.currentTarget as HTMLAnchorElement | null;\n const anchor = currentTarget && typeof (currentTarget as any).matches === \"function\" && currentTarget.matches(this.linkSelector)\n ? currentTarget\n : null;\n const url = this.resolveNavigationURL(event, anchor, href);\n if (!url) return;\n event.preventDefault();\n this.navigate(`${url.pathname}${url.search}${url.hash}`);\n }\n };\n }\n\n start(): void {\n const win = getWindow();\n const doc = getDocument();\n if (!win || this.started) {\n if (win) this.check();\n return;\n }\n win.addEventListener(\"popstate\", this.listener);\n doc?.addEventListener(\"click\", this.clickListener);\n (win as any).navigation?.addEventListener?.(\"navigate\", this.navigationListener);\n this.started = true;\n this.check();\n }\n\n stop(): void {\n const win = getWindow();\n const doc = getDocument();\n if (win && this.started) {\n win.removeEventListener(\"popstate\", this.listener);\n doc?.removeEventListener(\"click\", this.clickListener);\n (win as any).navigation?.removeEventListener?.(\"navigate\", this.navigationListener);\n }\n this.started = false;\n this.disposeRoute();\n }\n\n check(): RouteContext | null {\n const win = getWindow();\n if (!win) return null;\n const url = new URL(win.location.href);\n const routePath = stripBasePath(url.pathname, this.base);\n if (routePath === null) {\n this.disposeRoute();\n this.activeRoute = undefined;\n this.current.set(null);\n return null;\n }\n const routeUrl = new URL(url.href);\n routeUrl.pathname = routePath || \"/\";\n for (const route of this.routes) {\n const routeParams = route.exec(routeUrl);\n if (!routeParams) continue;\n const query = searchParamsToObject(url.search);\n const hash = searchParamsToObject(url.hash);\n const params = { ...routeParams, ...query, ...hash };\n const context: RouteContext = {\n path: routePath || \"/\",\n url,\n params,\n query,\n hash\n };\n this.disposeRoute();\n this.activeRoute = route;\n this.current.set(context);\n const cleanup = route.handler(params, context);\n if (typeof cleanup === \"function\") this.routeCleanup = cleanup;\n return context;\n }\n this.disposeRoute();\n this.activeRoute = undefined;\n this.current.set(null);\n const cleanup = this.notFound?.({}, {\n path: routePath || \"/\",\n url,\n params: {},\n query: searchParamsToObject(url.search),\n hash: searchParamsToObject(url.hash)\n });\n if (typeof cleanup === \"function\") this.routeCleanup = cleanup;\n return null;\n }\n\n private handleLinkClick(event: Event): void {\n const anchor = this.findAnchor(event);\n const url = this.resolveNavigationURL(event, anchor);\n if (!url) return;\n event.preventDefault();\n this.navigate(`${url.pathname}${url.search}${url.hash}`);\n }\n\n private handleNavigationEvent(event: any): void {\n const win = getWindow();\n if (!win || !event?.canIntercept || !event.destination?.url || typeof event.intercept !== \"function\") return;\n const url = new URL(event.destination.url, win.location.href);\n if (url.origin !== win.location.origin) return;\n if (stripBasePath(url.pathname, this.base) === null) return;\n event.intercept({\n handler: () => {\n this.check();\n }\n });\n }\n\n private disposeRoute(): void {\n if (!this.routeCleanup) return;\n const cleanup = this.routeCleanup;\n this.routeCleanup = undefined;\n cleanup();\n }\n\n private resolveNavigationURL(event: Event, anchor: HTMLAnchorElement | null, fallbackHref?: string): URL | null {\n const mouseEvent = event as MouseEvent;\n if (event.defaultPrevented) return null;\n if (typeof mouseEvent.button === \"number\" && mouseEvent.button !== 0) return null;\n if (mouseEvent.metaKey || mouseEvent.ctrlKey || mouseEvent.shiftKey || mouseEvent.altKey) return null;\n if (anchor && ((anchor.target && anchor.target !== \"_self\") || anchor.hasAttribute(\"download\"))) return null;\n const win = getWindow();\n if (!win) return null;\n const href = anchor?.getAttribute(\"href\") ?? fallbackHref;\n if (!href || /^(mailto|tel):/i.test(href)) return null;\n const url = new URL(anchor?.href || href, win.location.href);\n if (url.origin !== win.location.origin) return null;\n if (stripBasePath(url.pathname, this.base) === null) return null;\n return url;\n }\n\n private findAnchor(event: Event): HTMLAnchorElement | null {\n const win = getWindow();\n const fromPath = typeof (event as any).composedPath === \"function\"\n ? ((event as any).composedPath() as EventTarget[])\n : [];\n for (const entry of fromPath) {\n if (!entry || !(entry as any).matches) continue;\n const element = entry as HTMLElement;\n if (element.matches(this.linkSelector)) return element as HTMLAnchorElement;\n }\n const target = event.target as HTMLElement | null;\n return target?.closest?.(this.linkSelector) as HTMLAnchorElement | null;\n }\n}\n\nfunction createRouteRecord(pattern: string, handler: RouteHandler): RouteRecord {\n const win = getWindow();\n const URLPatternCtor = (win as any)?.URLPattern || (globalThis as any).URLPattern;\n if (typeof URLPatternCtor === \"function\") {\n try {\n const nativePattern = new URLPatternCtor({ pathname: pattern });\n return {\n pattern,\n handler,\n exec(url) {\n const match = nativePattern.exec(url.href);\n return match ? decodeParams(match.pathname.groups || {}) : null;\n }\n };\n } catch (_err) {\n // Fall through to the regex matcher for non-URLPattern syntax.\n }\n }\n\n const { re, keys } = compilePathPattern(pattern);\n return {\n pattern,\n handler,\n exec(url) {\n const match = re.exec(normalizePath(url.pathname));\n if (!match) return null;\n const params: Record = {};\n keys.forEach((key, index) => {\n params[key] = decodeURIComponent(match[index + 1] || \"\");\n });\n return params;\n }\n };\n}\n\nfunction normalizeBase(base: string): string {\n const normalized = normalizePath(base || \"/\");\n return normalized === \"\" ? \"\" : normalized;\n}\n\nfunction withBasePath(path: string, base: string): string {\n const normalizedBase = normalizeBase(base);\n const parsed = new URL(path || \"/\", \"http://ity.local\");\n let pathname = normalizePath(parsed.pathname) || \"/\";\n if (normalizedBase && pathname !== normalizedBase && !pathname.startsWith(`${normalizedBase}/`)) {\n pathname = `${normalizedBase}${pathname === \"/\" ? \"\" : pathname}`;\n }\n return `${pathname}${parsed.search}${parsed.hash}`;\n}\n\nfunction stripBasePath(pathname: string, base: string): string | null {\n const normalizedBase = normalizeBase(base);\n const normalizedPath = normalizePath(pathname) || \"/\";\n if (!normalizedBase) return normalizedPath;\n if (normalizedPath === normalizedBase) return \"/\";\n if (normalizedPath.startsWith(`${normalizedBase}/`)) {\n return normalizePath(normalizedPath.slice(normalizedBase.length)) || \"/\";\n }\n return null;\n}\n\nfunction compilePathPattern(pattern: string): { re: RegExp; keys: string[] } {\n const keys: string[] = [];\n const normalized = normalizePath(pattern);\n if (normalized === \"\") return { re: /^\\/?$/, keys };\n const segments = normalized.split(\"/\").filter(Boolean);\n const source = segments.map((segment) => {\n if (segment === \"*\") {\n keys.push(\"wildcard\");\n return \"(.*)\";\n }\n if (segment.startsWith(\":\")) {\n keys.push(segment.slice(1));\n return \"([^/]+)\";\n }\n return escapeRegExp(segment);\n }).join(\"/\");\n return { re: new RegExp(`^/${source}/?$`), keys };\n}\n\nfunction normalizePath(path: string): string {\n const normalized = path.replace(/[?#].*$/, \"\").replace(/\\/+$/, \"\");\n return normalized === \"\" ? \"\" : normalized.startsWith(\"/\") ? normalized : `/${normalized}`;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction searchParamsToObject(value: string): Record {\n const out: Record = {};\n const clean = value.replace(/^[?#]/, \"\");\n if (!clean) return out;\n const params = new URLSearchParams(clean);\n params.forEach((paramValue, key) => {\n out[key] = paramValue;\n });\n return out;\n}\n\nfunction decodeParams(value: Record): Record {\n const out: Record = {};\n for (const key of Object.keys(value)) {\n out[key] = decodeURIComponent(value[key]);\n }\n return out;\n}\n\nconst defaultRouter = signal(null);\n\nfunction route(pattern: string, handler: RouteHandler): Router {\n let router = defaultRouter.peek();\n if (!router) {\n router = new Router({ autoStart: false });\n defaultRouter.set(router);\n }\n router.add(pattern, handler);\n router.start();\n return router;\n}\n\nconst Ity = {\n version: \"2.2.0\",\n createConfig,\n configure,\n signal,\n computed,\n effect,\n batch,\n untrack,\n isSignal,\n resolveSignal,\n store,\n resource,\n action,\n form,\n formState,\n html,\n unsafeHTML,\n render,\n renderToString,\n component,\n route,\n Router,\n SelectorObject,\n onDOMReady,\n Model,\n View,\n Application,\n Collection\n};\n\nfunction createAmdExport(): typeof Ity {\n const win = getWindow();\n if (win) (win as any).Ity = Ity;\n return Ity;\n}\n\n/* c8 ignore next 3 */\nif (typeof define === \"function\" && (define as any).amd) {\n (define as any)(createAmdExport);\n} else if (typeof module === \"object\" && typeof module.exports !== \"undefined\") {\n module.exports = Ity;\n}\n\nconst win = getWindow();\nif (win) {\n (win as any).Ity = Ity;\n}\n\nexport {\n Application,\n Collection,\n Model,\n Router,\n SelectorObject,\n View,\n batch,\n component,\n configure,\n createConfig,\n computed,\n effect,\n action,\n form,\n formState,\n html,\n isSignal,\n onDOMReady,\n render,\n renderToString,\n resource,\n resolveSignal,\n route,\n signal,\n store,\n unsafeHTML,\n untrack\n};\nexport type {\n Action,\n ActionOptions,\n AsyncStatus,\n ComponentContext,\n ComponentOptions,\n EffectHandle,\n FormBindOptions,\n FormController,\n FormField,\n FormOptions,\n FormState,\n FormStateController,\n FormStateOptions,\n FormStateSubmitOptions,\n HTMLSanitizer,\n ItyConfig,\n ReadonlySignal,\n RenderOptions,\n RenderToStringOptions,\n Resource,\n ResourceContext,\n ResourceOptions,\n RouteContext,\n RouteHandler,\n Signal,\n Store,\n TemplateResult,\n UnsafeHTMLOptions\n};\nexport default Ity;\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/ity.min.js b/dist/ity.min.js index 50d07b5..56fd363 100644 --- a/dist/ity.min.js +++ b/dist/ity.min.js @@ -1,2 +1,2 @@ -var Ity=function(t){"use strict";const e=Object.is;let n=null,s=0;const i=new Set;let r;function o(){return"undefined"!=typeof window?window:void 0}function l(){var t;const e=o();return null!==(t=null==e?void 0:e.document)&&void 0!==t?t:"undefined"!=typeof document?document:void 0}function a(t){n&&(t.observers.add(n),n.deps.add(t))}function c(t){for(const e of t.deps)e.observers.delete(t);t.deps.clear()}function u(t){for(const e of Array.from(t.observers))e.markDirty()}function h(){if(!(s>0))for(;i.size;){const t=Array.from(i);i.clear();for(const e of t)e.run()}}class d{constructor(t,n={}){this.observers=new Set,this.subscribers=new Set,this.value=t,this.equals=n.equals||e}read(t=!0){return t&&a(this),this.value}write(t){const e=this.value,n="function"==typeof t?t(e):t;if(this.equals(e,n))return e;this.value=n,u(this);for(const t of Array.from(this.subscribers))t(n,e);return h(),n}subscribe(t,e={}){return this.subscribers.add(t),e.immediate&&t(this.value,this.value),()=>{this.subscribers.delete(t)}}}class f{constructor(t,n={}){this.getter=t,this.observers=new Set,this.deps=new Set,this.subscribers=new Set,this.dirty=!0,this.initialized=!1,this.equals=n.equals||e}read(t=!0){return t&&a(this),this.dirty&&this.evaluate(),this.value}markDirty(){if(this.dirty)return;const t=this.value;if(this.dirty=!0,u(this),this.subscribers.size){const e=this.read(!1);if(!this.equals(t,e))for(const n of Array.from(this.subscribers))n(e,t)}}subscribe(t,e={}){if(this.subscribers.add(t),e.immediate){const e=this.read(!1);t(e,e)}return()=>{this.subscribers.delete(t)}}evaluate(){c(this);const t=n;n=this;try{this.value=this.getter(),this.dirty=!1,this.initialized=!0}finally{n=t}}}class p{constructor(t){this.callback=t,this.deps=new Set,this.disposed=!1,this.run()}markDirty(){this.disposed||function(t){i.add(t),h()}(this)}run(){if(this.disposed)return;if(c(this),this.cleanup){const t=this.cleanup;this.cleanup=void 0,t()}const t=n;n=this;try{this.callback((t=>{this.cleanup=t}))}finally{n=t}}dispose(){if(!this.disposed){if(this.disposed=!0,c(this),this.cleanup){const t=this.cleanup;this.cleanup=void 0,t()}i.delete(this)}}}function v(t,e={}){const n=new d(t,e),s=function(t){return 0===arguments.length?n.read(!0):n.write(t)};return s.get=()=>n.read(!0),s.peek=()=>n.read(!1),s.set=t=>n.write(t),s.update=t=>n.write(t),s.subscribe=(t,e)=>n.subscribe(t,e),Object.defineProperty(s,"isSignal",{value:!0}),s}function m(t,e={}){const n=new f(t,e),s=function(){return n.read(!0)};return s.get=()=>n.read(!0),s.peek=()=>n.read(!1),s.subscribe=(t,e)=>n.subscribe(t,e),Object.defineProperty(s,"isSignal",{value:!0}),s}function g(t){const e=new p(t),n=()=>e.dispose();return n.dispose=n,n}function b(t){s+=1;try{return t()}finally{s-=1,h()}}function y(t){const e=n;n=null;try{return t()}finally{n=e}}function w(t){return"function"==typeof t&&!0===t.isSignal}function S(t){return w(t)?t():t}function L(t={}){r=t.sanitizeHTML||void 0}function E(t){const e=new Set(Reflect.ownKeys(t)),n=new Map,s=v(0),i=e=>(n.has(e)||n.set(e,v(t[e])),n.get(e)),r=()=>{s.update((t=>t+1))},o=(t,n)=>{const s=e.has(t);s||e.add(t),i(t).set(n),s||r()},l=()=>{s();const t={};for(const n of e)t[n]=i(n)();return t};return new Proxy({$patch(t){const e=l(),n="function"==typeof t?t(e):t;n&&b((()=>{for(const t of Reflect.ownKeys(n))o(t,n[t])}))},$snapshot:l,$subscribe(t,e={}){let n=!0;return g((()=>{const s=l();!n||e.immediate?(n=!1,t(s)):n=!1}))}},{get:(t,e,n)=>e in t?Reflect.get(t,e,n):i(e)(),set:(t,e,n)=>(b((()=>{o(e,n)})),!0),deleteProperty:(t,n)=>!e.has(n)||(e.delete(n),b((()=>{i(n).set(void 0),r()})),!0),ownKeys:t=>(s(),Array.from(new Set([...Reflect.ownKeys(t),...e]))),getOwnPropertyDescriptor:(t,n)=>(s(),Object.prototype.hasOwnProperty.call(t,n)?{...Reflect.getOwnPropertyDescriptor(t,n),enumerable:!1}:e.has(n)?{enumerable:!0,configurable:!0}:void 0),has:(t,n)=>(s(),n in t||e.has(n))})}function k(t,e={}){const n=v(e.initialValue),s=v(null),i=v(!1),r=v(void 0===e.initialValue?"idle":"success"),o=m((()=>i())),l=m((()=>r())),a=!1!==e.keepPrevious;let c=null,u=0,h=null;const d={data:n,error:s,loading:o,status:l,get promise(){return h},refresh(){u+=1;const o=u;c&&c.abort(),c=new AbortController;const l=c.signal,d=n.peek();return i.set(!0),r.set("loading"),s.set(null),a||n.set(void 0),h=Promise.resolve().then((()=>t({signal:l,previous:d,refreshId:o}))).then((t=>{var i;return o!==u||l.aborted?n.peek():(n.set(t),s.set(null),r.set("success"),null===(i=e.onSuccess)||void 0===i||i.call(e,t),t)})).catch((t=>{var i;return o!==u||(s.set(t),r.set("error"),null===(i=e.onError)||void 0===i||i.call(e,t)),n.peek()})).finally((()=>{o===u&&(i.set(!1),c=null)})),h},mutate(t){u+=1,c&&c.abort(),c=null,h=null,n.set(t),s.set(null),i.set(!1),r.set(void 0===t?"idle":"success")},abort(t){c&&(u+=1,c.abort(t),c=null,h=null,i.set(!1),r.set(void 0===n.peek()?"idle":"success"))}};return!1!==e.immediate&&d.refresh(),d}function C(t,e={}){const n=v(void 0),s=v(null),i=v(0),r=v("idle"),o=m((()=>i()>0)),l=m((()=>i())),a=m((()=>r()));let c=0;const u=(...o)=>{const l=c;return i.update((t=>t+1)),r.set("loading"),s.set(null),Promise.resolve().then((()=>t(...o))).then((t=>{var o;return l===c&&(n.set(t),s.set(null),null===(o=e.onSuccess)||void 0===o||o.call(e,t),i.peek()<=1&&r.set("success")),t})).catch((t=>{var n;throw l===c&&(s.set(t),null===(n=e.onError)||void 0===n||n.call(e,t),i.peek()<=1&&r.set("error")),t})).finally((()=>{l===c&&(i.update((t=>Math.max(0,t-1))),i.peek()>0&&r.set("loading"))}))},h=(...t)=>u(...t),d=h;return d.submit=u,d.data=n,d.error=s,d.pending=o,d.pendingCount=l,d.status=a,h.reset=()=>{c+=1,n.set(void 0),s.set(null),i.set(0),r.set("idle")},h}function M(t,e={}){const n=C(t,e);return{action:n,data:n.data,error:n.error,pending:n.pending,status:n.status,async onSubmit(t){t.preventDefault();const s=(t=>{var e;const n=t.currentTarget||t.target,s=t=>{var e,n;const s=null===(e=null==t?void 0:t.ownerDocument)||void 0===e?void 0:e.defaultView;return(null==s?void 0:s.HTMLFormElement)||(null===(n=o())||void 0===n?void 0:n.HTMLFormElement)||("undefined"!=typeof HTMLFormElement?HTMLFormElement:void 0)},i=t=>{const e=s(t||n);return Boolean(t&&e&&t instanceof e)};if(!s(n))throw new Error("Ity.form requires HTMLFormElement support");if(i(n))return n;const r=null===(e=null==n?void 0:n.closest)||void 0===e?void 0:e.call(n,"form");if(i(r))return r;throw new Error("Ity.form onSubmit requires a form event target")})(t),i=await n((t=>{var e,n;const s=null===(e=t.ownerDocument)||void 0===e?void 0:e.defaultView,i=(null==s?void 0:s.FormData)||(null===(n=o())||void 0===n?void 0:n.FormData)||("undefined"!=typeof FormData?FormData:void 0);if(!i)throw new Error("Ity.form requires FormData support");return new i(t)})(s),t);return e.resetOnSuccess&&s.reset(),i},reset(){n.reset()}}}function T(t,...e){return{isTemplateResult:!0,strings:Array.from(t),values:e}}function j(t,e={}){const n=e.sanitize||r;return{isUnsafeHTML:!0,value:n?n(String(t)):String(t)}}function A(t){return!!t&&"object"==typeof t&&!0===t.isTemplateResult}function O(t){return!!t&&"object"==typeof t&&!0===t.isUnsafeHTML}function x(t){return!!t&&"object"==typeof t&&"number"==typeof t.nodeType}function R(){const t=l();if(!t)throw new Error("Ity DOM rendering requires a document");return t}function $(t){return w(t)?t():t}function H(t,e=R()){const n=e.createDocumentFragment();return _(n,$(t),e),n}function _(t,e,n){if(null!=(e=$(e))&&!1!==e)if(Array.isArray(e))for(const s of e)_(t,s,n);else if(A(e))t.appendChild(D(e,n));else{if(O(e)){const s=n.createElement("template");return s.innerHTML=e.value,void t.appendChild(s.content.cloneNode(!0))}x(e)?t.appendChild(e):t.appendChild(n.createTextNode(String(e)))}}function D(t,e=R()){var n,s;const i=[];let r="";for(let e=0;eBoolean(n[t])));t.setAttribute("class",e.join(" "))}else t.removeAttribute(s);else t.toggleAttribute(s,Boolean(n));else t[s]=n;else"function"==typeof n?t.addEventListener(s,n):Array.isArray(n)&&"function"==typeof n[0]&&t.addEventListener(s,n[0],n[1])}function N(t,e){const n=t;if("function"!=typeof n.replaceChildren){for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(e)}else n.replaceChildren(e)}function P(t,e){const n=l();e&&n&&"function"==typeof n.startViewTransition?n.startViewTransition(t):t()}function F(t,e,n={}){const s=function(t){if("string"==typeof t){const e=R().querySelector(t);if(!e)throw new Error(`Render target not found: ${t}`);return e}if(null==t?void 0:t.isSelectorObject){const e=t.first()[0];if(!e)throw new Error("Cannot render into an empty SelectorObject");return e}return t}(e),i=()=>{const e="function"!=typeof t||w(t)?$(t):t();P((()=>N(s,H(e))),n.transition)};return!1===n.reactive?(i(),()=>{}):g(i)}function I(t){return V("function"!=typeof t||w(t)?$(t):t())}function V(t){if(null==(t=$(t))||!1===t)return"";if(Array.isArray(t))return t.map(V).join("");if(A(t))return function(t){var e,n;let s="";for(let n=0;nBoolean(e[t]))).join(" "):"style"===t&&"object"==typeof e&&null!==e?Object.keys(e).map((t=>`${t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}:${e[t]}`)).join(";"):!0===e?"":String(e)}function U(t){return t.replace(/&/g,"&").replace(//g,">")}function B(t){return U(t).replace(/"/g,""").replace(/'/g,"'")}function W(t,e,n={}){const s=o();if(!(null==s?void 0:s.customElements)||!s.HTMLElement)throw new Error("Ity.component requires Custom Elements support");if(s.customElements.get(t))return s.customElements.get(t);const i="function"==typeof e?{...n,setup:e}:e,r=i.observedAttributes||i.attrs||[];class l extends s.HTMLElement{constructor(){super(...arguments),this.attrSignals=new Map,this.connectedCallbacks=[],this.disconnectedCallbacks=[],this.effectRecords=[],this.initialized=!1,this.connected=!1}static get observedAttributes(){return r}connectedCallback(){var t;if(this.ensureMount(),!this.initialized){this.initialized=!0;const e=this.createContext(),n=null===(t=i.setup)||void 0===t?void 0:t.call(i,e);void 0!==n&&(this.renderOutput=n)}this.connected=!0,this.startRender(),this.startEffects();for(const t of this.connectedCallbacks)t()}disconnectedCallback(){var t;this.connected=!1,this.renderCleanup&&(this.renderCleanup(),this.renderCleanup=void 0);for(const e of this.effectRecords)null===(t=e.handle)||void 0===t||t.dispose(),e.handle=void 0;for(const t of this.disconnectedCallbacks)t()}attributeChangedCallback(t,e,n){this.ensureAttrSignal(t).set(n)}ensureMount(){if(this.mount&&this.renderTarget)return;const t=i.shadow;if(!1===t)this.mount=this;else{const e="object"==typeof t?t:{mode:"closed"===t?"closed":"open"};this.mount=this.shadowRoot||this.attachShadow(e)}if(i.styles){const t=this.ownerDocument,e=t.createElement("style");e.textContent=i.styles;const n=t.createElement("span");n.setAttribute("data-ity-component-root",""),this.mount.appendChild(e),this.mount.appendChild(n),this.renderTarget=n}else this.renderTarget=this.mount}startRender(){this.renderCleanup||void 0===this.renderOutput||(this.renderCleanup=F(this.renderOutput,this.renderTarget,{transition:!1}))}startEffects(){for(const t of this.effectRecords)t.disposed||t.handle||(t.handle=g(t.callback))}ensureAttrSignal(t){return this.attrSignals.has(t)||this.attrSignals.set(t,v(this.getAttribute(t))),this.attrSignals.get(t)}createContext(){return{host:this,root:this.mount,attr:t=>this.ensureAttrSignal(t),emit:(t,e,n={})=>this.dispatchEvent(new CustomEvent(t,{bubbles:!0,composed:!0,...n,detail:e})),effect:t=>{const e={callback:t,disposed:!1,handle:void 0};this.effectRecords.push(e),this.connected&&(e.handle=g(t));const n=()=>{var t;e.disposed=!0,null===(t=e.handle)||void 0===t||t.dispose(),e.handle=void 0};return n.dispose=n,n},onConnected:t=>{this.connectedCallbacks.push(t)},onDisconnected:t=>{this.disconnectedCallbacks.push(t)}}}}return s.customElements.define(t,l),l}class J{constructor(){this._events={}}on(t,e,n=this){var s;((s=this._events)[t]||(s[t]=[])).push({callback:e,ctx:n})}off(t,e,n){if(!t)return void(this._events={});const s=this._events[t];if(s)if(e){for(let t=s.length-1;t>=0;t-=1){const i=s[t];i.callback!==e||void 0!==n&&i.ctx!==n||s.splice(t,1)}0===s.length&&delete this._events[t]}else delete this._events[t]}trigger(t,e){const n=this._events[t];if(n)for(const t of n.slice())t.callback.call(t.ctx,e)}}const K={nospaces:/^\S*$/};class G{constructor(t=[]){this.isSelectorObject=!0,this.nodes=[],this.nodes=Array.from(t),this.reindex()}get length(){return this.nodes.length}[Symbol.iterator](){return this.nodes[Symbol.iterator]()}toArray(){return this.nodes.slice()}find(t){const e=[];for(const n of this.nodes){const s=n.querySelectorAll(t);for(const t of Array.from(s)){const n=t;e.indexOf(n)<0&&e.push(n)}}return new G(e)}filter(t){return new G(this.nodes.filter((e=>e.matches(t))))}first(){return new G(this.nodes[0]?[this.nodes[0]]:[])}last(){return new G(this.nodes.length?[this.nodes[this.nodes.length-1]]:[])}parent(){const t=[];for(const e of this.nodes){const n=e.parentElement;n&&t.indexOf(n)<0&&t.push(n)}return new G(t)}children(t){const e=[];for(const n of this.nodes)for(const s of Array.from(n.children))e.indexOf(s)<0&&(!t||s.matches(t))&&e.push(s);return new G(e)}remove(){for(const t of this.nodes)t.remove();return new G([])}addClass(...t){for(const e of this.nodes)e.classList.add(...t);return this}removeClass(t){if(t&&K.nospaces.test(t))for(const e of this.nodes)e.classList.remove(t);return this}toggleClass(t){if(t&&K.nospaces.test(t))for(const e of this.nodes)e.classList.toggle(t);return this}hasClass(t){return Boolean(t&&K.nospaces.test(t)&&this.nodes.some((e=>e.classList.contains(t))))}attr(t,e){var n,s;if(1===arguments.length)return null!==(s=null===(n=this.nodes[0])||void 0===n?void 0:n.getAttribute(t))&&void 0!==s?s:null;for(const n of this.nodes)null===e||!1===e||void 0===e?n.removeAttribute(t):n.setAttribute(t,!0===e?"":String(e));return this}text(t){if(0===arguments.length)return this.nodes.map((t=>t.textContent||"")).join("");for(const e of this.nodes)e.textContent=String(t);return this}on(t,e,n){for(const s of this.nodes)s.addEventListener(t,e,n);return this}off(t,e,n){for(const s of this.nodes)s.removeEventListener(t,e,n);return this}before(t){return this._html(t,"beforebegin")}after(t){return this._html(t,"afterend")}append(t){return this._html(t,"beforeend")}prepend(t){return this._html(t,"afterbegin")}html(t){var e,n;return 0===arguments.length?null!==(n=null===(e=this.nodes[0])||void 0===e?void 0:e.innerHTML)&&void 0!==n?n:"":this._html(t,"replace")}empty(){for(const t of this.nodes)t.textContent="";return this}_html(t,e){const n=l();for(const s of this.nodes)if(null==t?void 0:t.isSelectorObject){const n=Array.from(t).map((t=>t.outerHTML)).join("");"replace"===e?s.innerHTML=n:s.insertAdjacentHTML(e,n)}else if(A(t)&&n){const i=D(t,n);"replace"===e?N(s,i):s.insertAdjacentElement(e,X(i,n))}else if(x(t)){const i=t.cloneNode(!0);"replace"===e?N(s,H(i,n||s.ownerDocument)):s.insertAdjacentElement(e,i)}else{const n=String(t);"replace"===e?s.innerHTML=n:s.insertAdjacentHTML(e,n)}return this}reindex(){for(const t of Object.keys(this))/^\d+$/.test(t)&&delete this[t];this.nodes.forEach(((t,e)=>{this[e]=t}))}}function X(t,e){const n=e.createElement("span");return n.appendChild(t),n}function Z(t,e=[],n=ct){const s=l(),i=()=>t.apply(n,e);s&&"loading"===s.readyState?s.addEventListener("DOMContentLoaded",i,{once:!0}):i()}class Q extends J{constructor(t={}){super(),this.onDOMReady=Z,Object.assign(this,t),this.id||(this.id=`m${Math.floor(1e5*Math.random())+1}`),this.data||(this.data={}),this.url||(this.url=""),this.state=v(this.data),this._init(t)}_init(t){this.initialize(t)}_ajax(t={}){const e=new XMLHttpRequest,n=t.type||"GET",s=t.url||this.url,i=t.success||function(t){this.data=t,this.state.set(t)},r=t.error||function(){};e.open(n,s,!0),e.onload=()=>{if(e.status>=200&&e.status<400)try{const t=e.responseText?JSON.parse(e.responseText):null;i.call(this,t)}catch(t){r.call(this,e.status,t)}else r.call(this,e.status)},e.onerror=()=>r.call(this),e.send(void 0===t.data?void 0:JSON.stringify(t.data))}initialize(t){}get(t){const e=this.data;return t?e?e[t]:void 0:e}set(t,e){const n=this.state.peek()||{},s="string"==typeof t?{...n,[t]:e}:t;this.data=s,this.state.set(s),this.trigger("change",this.data)}unSet(t){const e=this.state.peek();if(!e||!Object.prototype.hasOwnProperty.call(e,t))return;const n={...e};delete n[t],this.data=n,this.state.set(this.data),this.trigger("change",this.data)}clear(){this.data={},this.state.set(this.data),this.trigger("change",this.data)}subscribe(t,e){return this.state.subscribe(t,e)}sync(t){this._ajax(t)}toJSON(){return this.get()}}class Y extends J{constructor(t={}){super(),this.delegatedListeners=[],Object.assign(this,t),this.id||(this.id=`v${Math.floor(1e5*Math.random())+1}`),this.app&&this.app.addView(this),this.events||(this.events={}),Z(this._init,[t],this)}_setElement(t){const e=o();if(null==t?void 0:t.isSelectorObject)this.el=t;else if((null==e?void 0:e.NodeList)&&t instanceof e.NodeList)this.el=new G(t);else if("string"==typeof t)this.el=new G(R().querySelectorAll(t));else{if(!((null==e?void 0:e.HTMLElement)&&t instanceof e.HTMLElement))throw new Error("el selector must be of type String, NodeList, HTMLElement or Ity.SelectorObject");this.el=new G([t])}}_bindDOMEvents(t){if(!this.el||!this.el.isSelectorObject)return;const e=["focus","blur"];for(const n in t)for(const s in t[n]){const i=this[t[n][s]];if("function"!=typeof i)throw new Error(`View event handler not found: ${t[n][s]}`);const r=e.includes(s);this._delegateEvent(n,s,i,r)}}_delegateEvent(t,e,n,s=!1){for(const i of this.el){const r=e=>{let s=e.target;for(;s;){if(s.matches&&s.matches(t)){e.delegateTarget=s,n.call(this,e);break}if(s===i)break;s=s.parentElement}};i.addEventListener(e,r,s),this.delegatedListeners.push((()=>i.removeEventListener(e,r,s)))}}_init(t){this.el&&this._setElement(this.el),t.el&&!this.el&&this._setElement(t.el),this._bindDOMEvents(this.events),this.initialize(t)}initialize(t){}getName(){return this.name}get(t){return this[t]}set(t,e){this[t]=e}renderWith(t,e){return this.renderCleanup&&this.renderCleanup(),this.renderCleanup=F(t,this.el,e),this.renderCleanup}remove(){this.renderCleanup&&this.renderCleanup();for(const t of this.delegatedListeners.splice(0))t();this.el.remove(),this.app&&this.app.removeView(this.id)}select(t,e=this.el){const n=o();if((null==n?void 0:n.HTMLElement)&&e instanceof n.HTMLElement||(null==n?void 0:n.HTMLDocument)&&e instanceof n.HTMLDocument)return new G(e.querySelectorAll(t));if(e.isSelectorObject)return e.find(t);throw new Error("Context passed to .select() must be an HTMLElement or an Ity.SelectorObject")}}class tt{constructor(){this.views=[]}getView(t){return this.views.find((e=>e.id===t))}addView(t){t instanceof Y&&!this.views.includes(t)&&this.views.push(t)}removeView(t){this.views=this.views.filter((e=>e.id!==t))}trigger(t,e){for(const n of this.views.slice())n.trigger(t,e)}}class et{constructor(t=[],e=Q){this.models=[],this.ModelClass=e,this.url="",this.state=v(this.models),t.forEach((t=>this.add(t)))}get(t){return this.models.find((e=>e.id===t))}add(t){t instanceof Q&&(this.models=[...this.models,t],this.state.set(this.models))}remove(t){const e="string"==typeof t?this.get(t):t;e&&(this.models=this.models.filter((t=>t!==e)),this.state.set(this.models))}at(t){return this.models[t]}get length(){return this.models.length}clear(){this.models=[],this.state.set(this.models)}find(t){return this.models.find(t)}filter(t){return this.models.filter(t)}map(t){return this.models.map(t)}toJSON(){return this.models.map((t=>t.get()))}subscribe(t,e){return this.state.subscribe(t,e)}_ajax(t={}){const e=new XMLHttpRequest,n=t.type||"GET",s=t.url||this.url,i=t.success||function(){},r=t.error||function(){};e.open(n,s,!0),e.onload=()=>{if(e.status>=200&&e.status<400)try{i.call(this,e.responseText?JSON.parse(e.responseText):null)}catch(t){r.call(this,e.status,t)}else r.call(this,e.status)},e.onerror=()=>r.call(this),e.send(void 0===t.data?void 0:JSON.stringify(t.data))}fetch(t={}){const e=t.success;t.success=function(n){const s=t.modelClass||this.ModelClass;this.clear();for(const t of n||[]){const e=new s;e.set(t),this.add(e)}e&&e.call(this,n)},this._ajax(t)}trigger(t,e){for(const n of this.models.slice())n.trigger(t,e)}}class nt{constructor(t={}){this.routes=[],this.started=!1,this.listener=()=>this.check(),this.clickListener=t=>this.handleLinkClick(t),this.navigationListener=t=>this.handleNavigationEvent(t),this.current=v(null),this.base=t.base||"/",this.linkSelector=t.linkSelector||"a[data-ity-link]",this.transition=Boolean(t.transition),this.notFound=t.notFound,!1!==t.autoStart&&this.start()}add(t,e){return this.routes.push(function(t,e){const n=o(),s=(null==n?void 0:n.URLPattern)||globalThis.URLPattern;if("function"==typeof s)try{const n=new s({pathname:t});return{pattern:t,handler:e,exec(t){const e=n.exec(t.href);return e?function(t){const e={};for(const n of Object.keys(t))e[n]=decodeURIComponent(t[n]);return e}(e.pathname.groups||{}):null}}}catch(t){}const{re:i,keys:r}=function(t){const e=[],n=rt(t);if(""===n)return{re:/^\/?$/,keys:e};const s=n.split("/").filter(Boolean).map((t=>"*"===t?(e.push("wildcard"),"(.*)"):t.startsWith(":")?(e.push(t.slice(1)),"([^/]+)"):t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"))).join("/");return{re:new RegExp(`^/${s}/?$`),keys:e}}(t);return{pattern:t,handler:e,exec(t){const e=i.exec(rt(t.pathname));if(!e)return null;const n={};return r.forEach(((t,s)=>{n[t]=decodeURIComponent(e[s+1]||"")})),n}}}(t,e)),this}addRoute(t,e){this.add(t,e)}removeRoute(t){var e;return(null===(e=this.activeRoute)||void 0===e?void 0:e.pattern)===t&&(this.disposeRoute(),this.activeRoute=void 0,this.current.set(null)),this.routes=this.routes.filter((e=>e.pattern!==t)),this}navigate(t,e={}){var n;const s=o();if(!s)return;P((()=>{const n=e.replace?"replaceState":"pushState";s.history[n](null,"",function(t,e){const n=st(e),s=new URL(t||"/","http://ity.local");let i=rt(s.pathname)||"/";n&&i!==n&&!i.startsWith(`${n}/`)&&(i=`${n}${"/"===i?"":i}`);return`${i}${s.search}${s.hash}`}(t,this.base)),this.check()}),null!==(n=e.transition)&&void 0!==n?n:this.transition)}start(){var t,e;const n=o(),s=l();n&&!this.started?(n.addEventListener("popstate",this.listener),null==s||s.addEventListener("click",this.clickListener),null===(e=null===(t=n.navigation)||void 0===t?void 0:t.addEventListener)||void 0===e||e.call(t,"navigate",this.navigationListener),this.started=!0,this.check()):n&&this.check()}stop(){var t,e;const n=o(),s=l();n&&this.started&&(n.removeEventListener("popstate",this.listener),null==s||s.removeEventListener("click",this.clickListener),null===(e=null===(t=n.navigation)||void 0===t?void 0:t.removeEventListener)||void 0===e||e.call(t,"navigate",this.navigationListener)),this.started=!1,this.disposeRoute()}check(){var t;const e=o();if(!e)return null;const n=new URL(e.location.href),s=it(n.pathname,this.base);if(null===s)return this.disposeRoute(),this.activeRoute=void 0,this.current.set(null),null;const i=new URL(n.href);i.pathname=s||"/";for(const t of this.routes){const e=t.exec(i);if(!e)continue;const r=ot(n.search),o=ot(n.hash),l={...e,...r,...o},a={path:s||"/",url:n,params:l,query:r,hash:o};this.disposeRoute(),this.activeRoute=t,this.current.set(a);const c=t.handler(l,a);return"function"==typeof c&&(this.routeCleanup=c),a}this.disposeRoute(),this.activeRoute=void 0,this.current.set(null);const r=null===(t=this.notFound)||void 0===t?void 0:t.call(this,{},{path:s||"/",url:n,params:{},query:ot(n.search),hash:ot(n.hash)});return"function"==typeof r&&(this.routeCleanup=r),null}handleLinkClick(t){var e;const n=t.target,s=null===(e=null==n?void 0:n.closest)||void 0===e?void 0:e.call(n,this.linkSelector);if(!s||s.target||s.hasAttribute("download"))return;const i=o();if(!i)return;const r=new URL(s.href,i.location.href);r.origin===i.location.origin&&null!==it(r.pathname,this.base)&&(t.preventDefault(),this.navigate(`${r.pathname}${r.search}${r.hash}`))}handleNavigationEvent(t){var e;const n=o();if(!n||!(null==t?void 0:t.canIntercept)||!(null===(e=t.destination)||void 0===e?void 0:e.url)||"function"!=typeof t.intercept)return;const s=new URL(t.destination.url,n.location.href);s.origin===n.location.origin&&null!==it(s.pathname,this.base)&&t.intercept({handler:()=>{this.check()}})}disposeRoute(){if(!this.routeCleanup)return;const t=this.routeCleanup;this.routeCleanup=void 0,t()}}function st(t){const e=rt(t||"/");return""===e?"":e}function it(t,e){const n=st(e),s=rt(t)||"/";return n?s===n?"/":s.startsWith(`${n}/`)?rt(s.slice(n.length))||"/":null:s}function rt(t){const e=t.replace(/[?#].*$/,"").replace(/\/+$/,"");return""===e?"":e.startsWith("/")?e:`/${e}`}function ot(t){const e={},n=t.replace(/^[?#]/,"");if(!n)return e;return new URLSearchParams(n).forEach(((t,n)=>{e[n]=t})),e}const lt=v(null);function at(t,e){let n=lt.peek();return n||(n=new nt({autoStart:!1}),lt.set(n)),n.add(t,e),n.start(),n}const ct={version:"2.1.0",configure:L,signal:v,computed:m,effect:g,batch:b,untrack:y,isSignal:w,resolveSignal:S,store:E,resource:k,action:C,form:M,html:T,unsafeHTML:j,render:F,renderToString:I,component:W,route:at,Router:nt,SelectorObject:G,onDOMReady:Z,Model:Q,View:Y,Application:tt,Collection:et};"function"==typeof define&&define.amd?define((function(){const t=o();return t&&(t.Ity=ct),ct})):"object"==typeof module&&void 0!==module.exports&&(module.exports=ct);const ut=o();return ut&&(ut.Ity=ct),t.Application=tt,t.Collection=et,t.Model=Q,t.Router=nt,t.SelectorObject=G,t.View=Y,t.action=C,t.batch=b,t.component=W,t.computed=m,t.configure=L,t.default=ct,t.effect=g,t.form=M,t.html=T,t.isSignal=w,t.onDOMReady=Z,t.render=F,t.renderToString=I,t.resolveSignal=S,t.resource=k,t.route=at,t.signal=v,t.store=E,t.unsafeHTML=j,t.untrack=y,Object.defineProperty(t,"__esModule",{value:!0}),t}({}); +var Ity=function(t){"use strict";const e=Object.is;let n=null,s=0;const r=new Set;let i;const o=[];function l(){return"undefined"!=typeof window?window:void 0}function a(){var t;const e=l();return null!==(t=null==e?void 0:e.document)&&void 0!==t?t:"undefined"!=typeof document?document:void 0}function c(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function u(t){if(!t||"object"!=typeof t)return!1;const e=Object.getPrototypeOf(t);return e===Object.prototype||null===e}function h(t){const e=globalThis.structuredClone;if("function"==typeof e)return e(t);if(Array.isArray(t))return t.map((t=>h(t)));if(u(t)){const e={};for(const n of Reflect.ownKeys(t))e[n]=h(t[n]);return e}return t}function d(t,e){if(Object.is(t,e))return!0;if(Array.isArray(t)&&Array.isArray(e)){if(t.length!==e.length)return!1;for(let n=0;n0))for(;r.size;){const t=Array.from(r);r.clear();for(const e of t)e.run()}}class b{constructor(t,n={}){this.observers=new Set,this.subscribers=new Set,this.value=t,this.equals=n.equals||e}read(t=!0){return t&&v(this),this.value}write(t){const e=this.value,n="function"==typeof t?t(e):t;if(this.equals(e,n))return e;this.value=n,g(this);for(const t of Array.from(this.subscribers))t(n,e);return y(),n}subscribe(t,e={}){return this.subscribers.add(t),e.immediate&&t(this.value,this.value),()=>{this.subscribers.delete(t)}}}class w{constructor(t,n={}){this.getter=t,this.observers=new Set,this.deps=new Set,this.subscribers=new Set,this.dirty=!0,this.initialized=!1,this.equals=n.equals||e}read(t=!0){return t&&v(this),this.dirty&&this.evaluate(),this.value}markDirty(){if(this.dirty)return;const t=this.value;if(this.dirty=!0,g(this),this.subscribers.size){const e=this.read(!1);if(!this.equals(t,e))for(const n of Array.from(this.subscribers))n(e,t)}}subscribe(t,e={}){if(this.subscribers.add(t),e.immediate){const e=this.read(!1);t(e,e)}return()=>{this.subscribers.delete(t)}}evaluate(){m(this);const t=n;n=this;try{this.value=this.getter(),this.dirty=!1,this.initialized=!0}finally{n=t}}}class S{constructor(t){this.callback=t,this.deps=new Set,this.disposed=!1,this.run()}markDirty(){this.disposed||function(t){r.add(t),y()}(this)}run(){if(this.disposed)return;if(m(this),this.cleanup){const t=this.cleanup;this.cleanup=void 0,t()}const t=n;n=this;try{this.callback((t=>{this.cleanup=t}))}finally{n=t}}dispose(){if(!this.disposed){if(this.disposed=!0,m(this),this.cleanup){const t=this.cleanup;this.cleanup=void 0,t()}r.delete(this)}}}function k(t,e={}){const n=new b(t,e),s=function(t){return 0===arguments.length?n.read(!0):n.write(t)};return s.get=()=>n.read(!0),s.peek=()=>n.read(!1),s.set=t=>n.write(t),s.update=t=>n.write(t),s.subscribe=(t,e)=>n.subscribe(t,e),Object.defineProperty(s,"isSignal",{value:!0}),s}function L(t,e={}){const n=new w(t,e),s=function(){return n.read(!0)};return s.get=()=>n.read(!0),s.peek=()=>n.read(!1),s.subscribe=(t,e)=>n.subscribe(t,e),Object.defineProperty(s,"isSignal",{value:!0}),s}function E(t){const e=new S(t),n=()=>e.dispose();return n.dispose=n,n}function A(t){s+=1;try{return t()}finally{s-=1,y()}}function C(t){const e=n;n=null;try{return t()}finally{n=e}}function $(t){return"function"==typeof t&&!0===t.isSignal}function O(t){return $(t)?t():t}function j(t={}){i=t.sanitizeHTML||void 0}function R(t={}){var e;const n={};return c(t,"sanitizeHTML")&&(n.sanitizeHTML=null!==(e=t.sanitizeHTML)&&void 0!==e?e:null),n}function T(t){const e=new Set(Reflect.ownKeys(t)),n=new Map,s=k(0),r=e=>(n.has(e)||n.set(e,k(t[e])),n.get(e)),i=()=>{s.update((t=>t+1))},o=(t,n)=>{const s=e.has(t);s||e.add(t),r(t).set(n),s||i()},l=()=>{s();const t={};for(const n of e)t[n]=r(n)();return t};return new Proxy({$patch(t){const e=l(),n="function"==typeof t?t(e):t;n&&A((()=>{for(const t of Reflect.ownKeys(n))o(t,n[t])}))},$snapshot:l,$subscribe(t,e={}){let n=!0;return E((()=>{const s=l();!n||e.immediate?(n=!1,t(s)):n=!1}))}},{get:(t,e,n)=>e in t?Reflect.get(t,e,n):r(e)(),set:(t,e,n)=>(A((()=>{o(e,n)})),!0),deleteProperty:(t,n)=>!e.has(n)||(e.delete(n),A((()=>{r(n).set(void 0),i()})),!0),ownKeys:t=>(s(),Array.from(new Set([...Reflect.ownKeys(t),...e]))),getOwnPropertyDescriptor:(t,n)=>(s(),Object.prototype.hasOwnProperty.call(t,n)?{...Reflect.getOwnPropertyDescriptor(t,n),enumerable:!1}:e.has(n)?{enumerable:!0,configurable:!0}:void 0),has:(t,n)=>(s(),n in t||e.has(n))})}function M(t,e={}){const n=k(e.initialValue),s=k(null),r=k(!1),i=k(void 0===e.initialValue?"idle":"success"),o=L((()=>r())),l=L((()=>i())),a=!1!==e.keepPrevious;let c=null,u=0,h=null;const d={data:n,error:s,loading:o,status:l,get promise(){return h},refresh(){u+=1;const o=u;c&&c.abort(),c=new AbortController;const l=c.signal,d=n.peek();return r.set(!0),i.set("loading"),s.set(null),a||n.set(void 0),h=Promise.resolve().then((()=>t({signal:l,previous:d,refreshId:o}))).then((t=>{var r;return o!==u||l.aborted?n.peek():(n.set(t),s.set(null),i.set("success"),null===(r=e.onSuccess)||void 0===r||r.call(e,t),t)})).catch((t=>{var r;return o!==u||(s.set(t),i.set("error"),null===(r=e.onError)||void 0===r||r.call(e,t)),n.peek()})).finally((()=>{o===u&&(r.set(!1),c=null)})),h},mutate(t){u+=1,c&&c.abort(),c=null,h=null,n.set(t),s.set(null),r.set(!1),i.set(void 0===t?"idle":"success")},abort(t){c&&(u+=1,c.abort(t),c=null,h=null,r.set(!1),i.set(void 0===n.peek()?"idle":"success"))}};return!1!==e.immediate&&d.refresh(),d}function x(t,e={}){const n=k(void 0),s=k(null),r=k(0),i=k("idle"),o=L((()=>r()>0)),l=L((()=>r())),a=L((()=>i()));let c=0;const u=(...o)=>{const l=c;return r.update((t=>t+1)),i.set("loading"),s.set(null),Promise.resolve().then((()=>t(...o))).then((t=>{var o;return l===c&&(n.set(t),s.set(null),null===(o=e.onSuccess)||void 0===o||o.call(e,t),r.peek()<=1&&i.set("success")),t})).catch((t=>{var n;throw l===c&&(s.set(t),null===(n=e.onError)||void 0===n||n.call(e,t),r.peek()<=1&&i.set("error")),t})).finally((()=>{l===c&&(r.update((t=>Math.max(0,t-1))),r.peek()>0&&i.set("loading"))}))},h=(...t)=>u(...t),d=h;return d.submit=u,d.run=(...t)=>{u(...t).catch((()=>{}))},d.with=(...t)=>()=>{d.run(...t)},d.from=t=>e=>{d.run(...t(e))},d.data=n,d.error=s,d.pending=o,d.pendingCount=l,d.status=a,h.reset=()=>{c+=1,n.set(void 0),s.set(null),r.set(0),i.set("idle")},h}function H(t){var e,n;const s=null===(e=null==t?void 0:t.ownerDocument)||void 0===e?void 0:e.defaultView;return(null==s?void 0:s.HTMLFormElement)||(null===(n=l())||void 0===n?void 0:n.HTMLFormElement)||("undefined"!=typeof HTMLFormElement?HTMLFormElement:void 0)}function _(t,e){const n=H(t||(e||null));return Boolean(t&&n&&t instanceof n)}function D(t){var e;const n=t.currentTarget||t.target;if(!H(n))throw new Error("Ity.form requires HTMLFormElement support");if(_(n,n))return n;const s=null===(e=null==n?void 0:n.closest)||void 0===e?void 0:e.call(n,"form");if(_(s,n))return s;throw new Error("Ity.form onSubmit requires a form event target")}function P(t){var e,n;const s=null===(e=t.ownerDocument)||void 0===e?void 0:e.defaultView,r=(null==s?void 0:s.FormData)||(null===(n=l())||void 0===n?void 0:n.FormData)||("undefined"!=typeof FormData?FormData:void 0);if(!r)throw new Error("Ity.form requires FormData support");return new r(t)}function N(t,e={}){const n=x(t,e),s=async t=>{t.preventDefault();const s=D(t),r=await n(P(s),t);return e.resetOnSuccess&&s.reset(),r};return{action:n,data:n.data,error:n.error,pending:n.pending,status:n.status,onSubmit:s,handleSubmit(t){s(t).catch((()=>{}))},reset(){n.reset()}}}function K(t,e){const n=t.$snapshot();A((()=>{for(const s of Reflect.ownKeys(n))c(e,s)||delete t[s];for(const n of Reflect.ownKeys(e))t[n]=e[n]}))}function q(t,e={}){const n=T(h(t)),s=k(h(t)),r=T({}),i=T({}),o=new Map,l=()=>{const t=new Set;return Reflect.ownKeys(s.peek()).forEach((e=>t.add(String(e)))),Reflect.ownKeys(n.$snapshot()).forEach((e=>t.add(String(e)))),Array.from(t)},a=()=>{const t=(t=>{var n;const s={},r=e.validators||{};for(const e of l()){const n=r[e];if(!n)continue;const i=n(t[e],t);i&&(s[e]=i)}const i=null===(n=e.validate)||void 0===n?void 0:n.call(e,t);if(i)for(const t of Reflect.ownKeys(i)){const e=i[t];e&&(s[t]=e)}return s})(n.$snapshot());return K(r,t),0===Reflect.ownKeys(t).length},c=t=>{const e=(null==t?void 0:t.length)?t.map((t=>String(t))):l();A((()=>{for(const t of e)i[t]=!0}))},u=()=>{const t=i.$snapshot();Reflect.ownKeys(t).some((e=>Boolean(t[e])))&&a()},f=(t,e={})=>{const n=p.field(t),s=e.type||"text",r=e.event||("checkbox"===s||"radio"===s||"select"===s||"select-multiple"===s?"change":"input"),i=e.name||String(t);((t,e,n,s)=>{const r=String(t),i=o.get(r)||new Map,l=`${e}|${n}|${String(s.value)}`;i.set(l,{domName:e,type:n,value:s.value,parse:s.parse}),o.set(r,i)})(t,i,s,e);const l=e.format?e.format(n.value()):n.value(),u={name:i,[`@${r}`]:t=>{n.set((t=>{var r,i;if(e.parse)return e.parse(t.currentTarget||t.target,t);const o=t.currentTarget||t.target;if(!o)return n.value();if("checkbox"===s){if(Array.isArray(n.value())){const t=null!==(r=e.value)&&void 0!==r?r:o.value,s=n.value();return o.checked?Array.from(new Set([...s,t])):s.filter((e=>!Object.is(e,t)))}return Boolean(o.checked)}if("radio"===s)return o.checked?null!==(i=e.value)&&void 0!==i?i:o.value:n.value();if("select-multiple"===s)return Array.from(o.selectedOptions).map((t=>t.value));if("number"===s){const t=o.value;return""===t?void 0:Number(t)}return o.value})(t))},"@blur":()=>{c([t]),a()}};if("checkbox"===s){if(Array.isArray(n.value())){const t=e.value;u.value=void 0===t?"":String(t),u[".checked"]=L((()=>n.value().some((e=>Object.is(e,t)))))}else u[".checked"]=L((()=>Boolean(n.value()))),u.checked=Boolean(n.value());return u}if("radio"===s){const t=e.value;return u.value=void 0===t?"":String(t),u[".checked"]=L((()=>Object.is(n.value(),t))),u}if("select-multiple"===s)return u[".value"]=l,u;const h=null==l?"":String(l);return u[".value"]=h,u.value=h,u},p={values:n,initialValues:s,errors:r,touched:i,dirty:L((()=>!d(n.$snapshot(),s()))),valid:L((()=>0===Reflect.ownKeys(r.$snapshot()).length)),field(t){const e=(t=>{const e=function(e){if(0===arguments.length)return n[t];const s=n[t],r="function"==typeof e?e(s):e;return n[t]=r,u(),r};return e.get=()=>n[t],e.peek=()=>C((()=>n[t])),e.set=t=>e(t),e.update=t=>e(t),e.subscribe=(s,r={})=>{let i=!0,o=e.peek();return E((()=>{const e=n[t];if(i)return i=!1,o=e,void(r.immediate&&s(e,e));if(!Object.is(o,e)){const t=o;o=e,s(e,t)}}))},Object.defineProperty(e,"isSignal",{value:!0}),e})(t);return{value:e,error:L((()=>r[t]||null)),touched:L((()=>Boolean(i[t]))),dirty:L((()=>!d(n[t],s()[t]))),bind:e=>f(t,e),set:t=>e.set(t),reset(){e.set(s.peek()[t]),delete r[t],delete i[t]}}},bind:f,set:t=>{n.$patch((e=>("function"==typeof t?t(e):t)||{})),u()},reset:t=>{const e=h(t?{...s.peek(),...t}:s.peek());s.set(h(e)),K(n,e),K(r,{}),K(i,{})},validate:()=>a(),markTouched:c,submit(t,e={}){const s=x(t,e),r=async t=>{if(t.preventDefault(),(t=>{var e;const s=Symbol("ity.formState.noValue");let r;try{r=D(t)}catch(t){return}const i=P(r),a=Array.from(r.elements||[]),c={},u=(e,r)=>{var o,l,c;const u=r[0];if(!u)return s;const h=u.domName,d=a.filter((t=>t&&t.name===h));if(u.parse&&d.length){const e="radio"===u.type&&d.find((t=>Boolean(t.checked)))||d[0];return u.parse(e,t)}if("checkbox"===u.type){const t=n[e];if(Array.isArray(t)||r.some((t=>void 0!==t.value))||d.length>1){const t=[];for(const e of d){if(!e.checked)continue;const n=r.find((t=>{var n,s,r;return String(null!==(s=null!==(n=t.value)&&void 0!==n?n:e.value)&&void 0!==s?s:"")===String(null!==(r=e.value)&&void 0!==r?r:"")}));t.push(null!==(l=null!==(o=null==n?void 0:n.value)&&void 0!==o?o:e.value)&&void 0!==l?l:"")}return t}return i.has(h)}if("radio"===u.type)return null!==(c=i.get(h))&&void 0!==c?c:n[e];if("select-multiple"===u.type){const t=d[0];return(null==t?void 0:t.selectedOptions)?Array.from(t.selectedOptions).map((t=>t.value)):i.getAll(h)}if("number"===u.type){const t=i.get(h);return null===t||""===t?void 0:Number(t)}const f=i.get(h);return null===f?"":f};for(const t of l()){const n=u(t,Array.from((null===(e=o.get(t))||void 0===e?void 0:e.values())||[]));n!==s&&(c[t]=n)}Reflect.ownKeys(c).length&&n.$patch((()=>c))})(t),c(),!a())return;const r=await s(h(n.$snapshot()),t);return e.resetOnSuccess&&p.reset(),r};return{state:p,action:s,data:s.data,error:s.error,pending:s.pending,status:s.status,onSubmit:r,handleSubmit(t){r(t).catch((()=>{}))},reset(){s.reset(),p.reset()}}}};return p}function z(t,...e){return{isTemplateResult:!0,strings:Array.from(t),values:e}}function V(t,e={}){const n=p(e);return{isUnsafeHTML:!0,value:n?n(String(t)):String(t)}}function B(t){return!!t&&"object"==typeof t&&!0===t.isTemplateResult}function U(t){return!!t&&"object"==typeof t&&!0===t.isUnsafeHTML}function F(t){return!!t&&"object"==typeof t&&"number"==typeof t.nodeType}function I(){const t=a();if(!t)throw new Error("Ity DOM rendering requires a document");return t}function W(t){return $(t)?t():t}function J(t,e=I()){const n=e.createDocumentFragment();return G(n,W(t),e),n}function G(t,e,n){if(null!=(e=W(e))&&!1!==e)if(Array.isArray(e))for(const s of e)G(t,s,n);else if(B(e))t.appendChild(Z(e,n));else{if(U(e)){const s=n.createElement("template");return s.innerHTML=e.value,void t.appendChild(s.content.cloneNode(!0))}F(e)?t.appendChild(e):t.appendChild(n.createTextNode(String(e)))}}function X(t){const e=t[0],n="@"===e?"event":"."===e?"prop":"?"===e?"bool":"attr";return{kind:n,name:"attr"===n?t:t.slice(1)}}function Z(t,e=I()){var n,s;const r=[];let i="";for(let e=0;eBoolean(n[t])));t.setAttribute("class",e.join(" "))}else t.removeAttribute(s);else t.toggleAttribute(s,Boolean(n));else{if("value"===s&&Array.isArray(n)&&"SELECT"===t.tagName&&t.multiple){const e=new Set(n.map((t=>String(t))));return void Array.from(t.options).forEach((t=>{t.selected=e.has(t.value)}))}t[s]=n}else"function"==typeof n?t.addEventListener(s,n):Array.isArray(n)&&"function"==typeof n[0]&&t.addEventListener(s,n[0],n[1])}function Y(t,e){const n=t;if("function"!=typeof n.replaceChildren){for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(e)}else n.replaceChildren(e)}function tt(t,e){const n=a();e&&n&&"function"==typeof n.startViewTransition?n.startViewTransition(t):t()}function et(t,e,n={}){const s=function(t){if("string"==typeof t){const e=I().querySelector(t);if(!e)throw new Error(`Render target not found: ${t}`);return e}if(null==t?void 0:t.isSelectorObject){const e=t.first()[0];if(!e)throw new Error("Cannot render into an empty SelectorObject");return e}return t}(e),r=()=>{f(n.config,(()=>{const e="function"!=typeof t||$(t)?W(t):t();tt((()=>Y(s,J(e))),n.transition)}))};return!1===n.reactive?(r(),()=>{}):E(r)}function nt(t,e={}){return f(e.config,(()=>st("function"!=typeof t||$(t)?W(t):t())))}function st(t){if(null==(t=W(t))||!1===t)return"";if(Array.isArray(t))return t.map(st).join("");if(B(t))return function(t){var e,n;let s="";for(let n=0;nBoolean(e[t]))).join(" "):"style"===t&&"object"==typeof e&&null!==e?Object.keys(e).map((t=>`${t.replace(/[A-Z]/g,(t=>`-${t.toLowerCase()}`))}:${e[t]}`)).join(";"):!0===e?"":String(e)}function it(t){return t.replace(/&/g,"&").replace(//g,">")}function ot(t){return it(t).replace(/"/g,""").replace(/'/g,"'")}function lt(t,e,n={}){const s=l();if(!(null==s?void 0:s.customElements)||!s.HTMLElement)throw new Error("Ity.component requires Custom Elements support");if(s.customElements.get(t))return s.customElements.get(t);const r="function"==typeof e?{...n,setup:e}:e,i=r.observedAttributes||r.attrs||[],o=r.props||[];class a extends s.HTMLElement{constructor(){super(...arguments),this.attrSignals=new Map,this.propSignals=new Map,this.connectedCallbacks=[],this.disconnectedCallbacks=[],this.effectRecords=[],this.initialized=!1,this.connected=!1}static get observedAttributes(){return i}connectedCallback(){var t;this.ensureMount();for(const t of o)this.upgradeProperty(t);if(!this.initialized){this.initialized=!0;const e=this.createContext(),n=null===(t=r.setup)||void 0===t?void 0:t.call(r,e);void 0!==n&&(this.renderOutput=n)}this.connected=!0,this.startRender(),this.startEffects();for(const t of this.connectedCallbacks)t()}disconnectedCallback(){var t;this.connected=!1,this.renderCleanup&&(this.renderCleanup(),this.renderCleanup=void 0);for(const e of this.effectRecords)null===(t=e.handle)||void 0===t||t.dispose(),e.handle=void 0;for(const t of this.disconnectedCallbacks)t()}attributeChangedCallback(t,e,n){this.ensureAttrSignal(t).set(n)}ensureMount(){if(this.mount&&this.renderTarget)return;const t=r.shadow;if(!1===t)this.mount=this;else{const e="object"==typeof t?t:{mode:"closed"===t?"closed":"open"};this.mount=this.shadowRoot||this.attachShadow(e)}if(r.styles){const t=this.ownerDocument,e=t.createElement("style");e.textContent=r.styles;const n=t.createElement("span");n.setAttribute("data-ity-component-root",""),this.mount.appendChild(e),this.mount.appendChild(n),this.renderTarget=n}else this.renderTarget=this.mount}startRender(){this.renderCleanup||void 0===this.renderOutput||(this.renderCleanup=et(this.renderOutput,this.renderTarget,{transition:!1,config:r.config}))}startEffects(){for(const t of this.effectRecords)t.disposed||t.handle||(t.handle=E(t.callback))}ensureAttrSignal(t){return this.attrSignals.has(t)||this.attrSignals.set(t,k(this.getAttribute(t))),this.attrSignals.get(t)}ensurePropSignal(t){return this.propSignals.has(t)||this.propSignals.set(t,k(void 0)),this.propSignals.get(t)}upgradeProperty(t){if(!c(this,t))return;const e=this[t];delete this[t],this[t]=e}createContext(){return{host:this,root:this.mount,attr:t=>this.ensureAttrSignal(t),prop:t=>this.ensurePropSignal(t),emit:(t,e,n={})=>this.dispatchEvent(new CustomEvent(t,{bubbles:!0,composed:!0,...n,detail:e})),effect:t=>{const e={callback:t,disposed:!1,handle:void 0};this.effectRecords.push(e),this.connected&&(e.handle=E(t));const n=()=>{var t;e.disposed=!0,null===(t=e.handle)||void 0===t||t.dispose(),e.handle=void 0};return n.dispose=n,n},onConnected:t=>{this.connectedCallbacks.push(t)},onDisconnected:t=>{this.disconnectedCallbacks.push(t)}}}}for(const t of o)Object.defineProperty(a.prototype,t,{configurable:!0,enumerable:!0,get(){return this.ensurePropSignal(t).peek()},set(e){this.ensurePropSignal(t).set("function"==typeof e?()=>e:e)}});return s.customElements.define(t,a),a}class at{constructor(){this._events={}}on(t,e,n=this){var s;((s=this._events)[t]||(s[t]=[])).push({callback:e,ctx:n})}off(t,e,n){if(!t)return void(this._events={});const s=this._events[t];if(s)if(e){for(let t=s.length-1;t>=0;t-=1){const r=s[t];r.callback!==e||void 0!==n&&r.ctx!==n||s.splice(t,1)}0===s.length&&delete this._events[t]}else delete this._events[t]}trigger(t,e){const n=this._events[t];if(n)for(const t of n.slice())t.callback.call(t.ctx,e)}}const ct={nospaces:/^\S*$/};class ut{constructor(t=[]){this.isSelectorObject=!0,this.nodes=[],this.nodes=Array.from(t),this.reindex()}get length(){return this.nodes.length}[Symbol.iterator](){return this.nodes[Symbol.iterator]()}toArray(){return this.nodes.slice()}find(t){const e=[];for(const n of this.nodes){const s=n.querySelectorAll(t);for(const t of Array.from(s)){const n=t;e.indexOf(n)<0&&e.push(n)}}return new ut(e)}filter(t){return new ut(this.nodes.filter((e=>e.matches(t))))}first(){return new ut(this.nodes[0]?[this.nodes[0]]:[])}last(){return new ut(this.nodes.length?[this.nodes[this.nodes.length-1]]:[])}parent(){const t=[];for(const e of this.nodes){const n=e.parentElement;n&&t.indexOf(n)<0&&t.push(n)}return new ut(t)}children(t){const e=[];for(const n of this.nodes)for(const s of Array.from(n.children))e.indexOf(s)<0&&(!t||s.matches(t))&&e.push(s);return new ut(e)}remove(){for(const t of this.nodes)t.remove();return new ut([])}addClass(...t){for(const e of this.nodes)e.classList.add(...t);return this}removeClass(t){if(t&&ct.nospaces.test(t))for(const e of this.nodes)e.classList.remove(t);return this}toggleClass(t){if(t&&ct.nospaces.test(t))for(const e of this.nodes)e.classList.toggle(t);return this}hasClass(t){return Boolean(t&&ct.nospaces.test(t)&&this.nodes.some((e=>e.classList.contains(t))))}attr(t,e){var n,s;if(1===arguments.length)return null!==(s=null===(n=this.nodes[0])||void 0===n?void 0:n.getAttribute(t))&&void 0!==s?s:null;for(const n of this.nodes)null===e||!1===e||void 0===e?n.removeAttribute(t):n.setAttribute(t,!0===e?"":String(e));return this}text(t){if(0===arguments.length)return this.nodes.map((t=>t.textContent||"")).join("");for(const e of this.nodes)e.textContent=String(t);return this}on(t,e,n){for(const s of this.nodes)s.addEventListener(t,e,n);return this}off(t,e,n){for(const s of this.nodes)s.removeEventListener(t,e,n);return this}before(t){return this._html(t,"beforebegin")}after(t){return this._html(t,"afterend")}append(t){return this._html(t,"beforeend")}prepend(t){return this._html(t,"afterbegin")}html(t){var e,n;return 0===arguments.length?null!==(n=null===(e=this.nodes[0])||void 0===e?void 0:e.innerHTML)&&void 0!==n?n:"":this._html(t,"replace")}empty(){for(const t of this.nodes)t.textContent="";return this}_html(t,e){const n=a();for(const s of this.nodes)if(null==t?void 0:t.isSelectorObject){const n=Array.from(t).map((t=>t.outerHTML)).join("");"replace"===e?s.innerHTML=n:s.insertAdjacentHTML(e,n)}else if(B(t)&&n){const r=Z(t,n);"replace"===e?Y(s,r):s.insertAdjacentElement(e,ht(r,n))}else if(F(t)){const r=t.cloneNode(!0);"replace"===e?Y(s,J(r,n||s.ownerDocument)):s.insertAdjacentElement(e,r)}else{const n=String(t);"replace"===e?s.innerHTML=n:s.insertAdjacentHTML(e,n)}return this}reindex(){for(const t of Object.keys(this))/^\d+$/.test(t)&&delete this[t];this.nodes.forEach(((t,e)=>{this[e]=t}))}}function ht(t,e){const n=e.createElement("span");return n.appendChild(t),n}function dt(t,e=[],n=At){const s=a(),r=()=>t.apply(n,e);s&&"loading"===s.readyState?s.addEventListener("DOMContentLoaded",r,{once:!0}):r()}class ft extends at{constructor(t={}){super(),this.onDOMReady=dt,Object.assign(this,t),this.id||(this.id=`m${Math.floor(1e5*Math.random())+1}`),this.data||(this.data={}),this.url||(this.url=""),this.state=k(this.data),this._init(t)}_init(t){this.initialize(t)}_ajax(t={}){const e=new XMLHttpRequest,n=t.type||"GET",s=t.url||this.url,r=t.success||function(t){this.data=t,this.state.set(t)},i=t.error||function(){};e.open(n,s,!0),e.onload=()=>{if(e.status>=200&&e.status<400)try{const t=e.responseText?JSON.parse(e.responseText):null;r.call(this,t)}catch(t){i.call(this,e.status,t)}else i.call(this,e.status)},e.onerror=()=>i.call(this),e.send(void 0===t.data?void 0:JSON.stringify(t.data))}initialize(t){}get(t){const e=this.data;return t?e?e[t]:void 0:e}set(t,e){const n=this.state.peek()||{},s="string"==typeof t?{...n,[t]:e}:t;this.data=s,this.state.set(s),this.trigger("change",this.data)}unSet(t){const e=this.state.peek();if(!e||!Object.prototype.hasOwnProperty.call(e,t))return;const n={...e};delete n[t],this.data=n,this.state.set(this.data),this.trigger("change",this.data)}clear(){this.data={},this.state.set(this.data),this.trigger("change",this.data)}subscribe(t,e){return this.state.subscribe(t,e)}sync(t){this._ajax(t)}toJSON(){return this.get()}}class pt extends at{constructor(t={}){super(),this.delegatedListeners=[],Object.assign(this,t),this.id||(this.id=`v${Math.floor(1e5*Math.random())+1}`),this.app&&this.app.addView(this),this.events||(this.events={}),dt(this._init,[t],this)}_setElement(t){const e=l();if(null==t?void 0:t.isSelectorObject)this.el=t;else if((null==e?void 0:e.NodeList)&&t instanceof e.NodeList)this.el=new ut(t);else if("string"==typeof t)this.el=new ut(I().querySelectorAll(t));else{if(!((null==e?void 0:e.HTMLElement)&&t instanceof e.HTMLElement))throw new Error("el selector must be of type String, NodeList, HTMLElement or Ity.SelectorObject");this.el=new ut([t])}}_bindDOMEvents(t){if(!this.el||!this.el.isSelectorObject)return;const e=["focus","blur"];for(const n in t)for(const s in t[n]){const r=this[t[n][s]];if("function"!=typeof r)throw new Error(`View event handler not found: ${t[n][s]}`);const i=e.includes(s);this._delegateEvent(n,s,r,i)}}_delegateEvent(t,e,n,s=!1){for(const r of this.el){const i=e=>{let s=e.target;for(;s;){if(s.matches&&s.matches(t)){e.delegateTarget=s,n.call(this,e);break}if(s===r)break;s=s.parentElement}};r.addEventListener(e,i,s),this.delegatedListeners.push((()=>r.removeEventListener(e,i,s)))}}_init(t){this.el&&this._setElement(this.el),t.el&&!this.el&&this._setElement(t.el),this._bindDOMEvents(this.events),this.initialize(t)}initialize(t){}getName(){return this.name}get(t){return this[t]}set(t,e){this[t]=e}renderWith(t,e){return this.renderCleanup&&this.renderCleanup(),this.renderCleanup=et(t,this.el,e),this.renderCleanup}remove(){this.renderCleanup&&this.renderCleanup();for(const t of this.delegatedListeners.splice(0))t();this.el.remove(),this.app&&this.app.removeView(this.id)}select(t,e=this.el){const n=l();if((null==n?void 0:n.HTMLElement)&&e instanceof n.HTMLElement||(null==n?void 0:n.HTMLDocument)&&e instanceof n.HTMLDocument)return new ut(e.querySelectorAll(t));if(e.isSelectorObject)return e.find(t);throw new Error("Context passed to .select() must be an HTMLElement or an Ity.SelectorObject")}}class vt{constructor(){this.views=[]}getView(t){return this.views.find((e=>e.id===t))}addView(t){t instanceof pt&&!this.views.includes(t)&&this.views.push(t)}removeView(t){this.views=this.views.filter((e=>e.id!==t))}trigger(t,e){for(const n of this.views.slice())n.trigger(t,e)}}class mt{constructor(t=[],e=ft){this.models=[],this.ModelClass=e,this.url="",this.state=k(this.models),t.forEach((t=>this.add(t)))}get(t){return this.models.find((e=>e.id===t))}add(t){t instanceof ft&&(this.models=[...this.models,t],this.state.set(this.models))}remove(t){const e="string"==typeof t?this.get(t):t;e&&(this.models=this.models.filter((t=>t!==e)),this.state.set(this.models))}at(t){return this.models[t]}get length(){return this.models.length}clear(){this.models=[],this.state.set(this.models)}find(t){return this.models.find(t)}filter(t){return this.models.filter(t)}map(t){return this.models.map(t)}toJSON(){return this.models.map((t=>t.get()))}subscribe(t,e){return this.state.subscribe(t,e)}_ajax(t={}){const e=new XMLHttpRequest,n=t.type||"GET",s=t.url||this.url,r=t.success||function(){},i=t.error||function(){};e.open(n,s,!0),e.onload=()=>{if(e.status>=200&&e.status<400)try{r.call(this,e.responseText?JSON.parse(e.responseText):null)}catch(t){i.call(this,e.status,t)}else i.call(this,e.status)},e.onerror=()=>i.call(this),e.send(void 0===t.data?void 0:JSON.stringify(t.data))}fetch(t={}){const e=t.success;t.success=function(n){const s=t.modelClass||this.ModelClass;this.clear();for(const t of n||[]){const e=new s;e.set(t),this.add(e)}e&&e.call(this,n)},this._ajax(t)}trigger(t,e){for(const n of this.models.slice())n.trigger(t,e)}}class gt{constructor(t={}){this.routes=[],this.started=!1,this.listener=()=>this.check(),this.clickListener=t=>this.handleLinkClick(t),this.navigationListener=t=>this.handleNavigationEvent(t),this.current=k(null),this.base=t.base||"/",this.linkSelector=t.linkSelector||"a[href]",this.transition=Boolean(t.transition),this.notFound=t.notFound,!1!==t.autoStart&&this.start()}add(t,e){return this.routes.push(function(t,e){const n=l(),s=(null==n?void 0:n.URLPattern)||globalThis.URLPattern;if("function"==typeof s)try{const n=new s({pathname:t});return{pattern:t,handler:e,exec(t){const e=n.exec(t.href);return e?function(t){const e={};for(const n of Object.keys(t))e[n]=decodeURIComponent(t[n]);return e}(e.pathname.groups||{}):null}}}catch(t){}const{re:r,keys:i}=function(t){const e=[],n=St(t);if(""===n)return{re:/^\/?$/,keys:e};const s=n.split("/").filter(Boolean).map((t=>"*"===t?(e.push("wildcard"),"(.*)"):t.startsWith(":")?(e.push(t.slice(1)),"([^/]+)"):t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"))).join("/");return{re:new RegExp(`^/${s}/?$`),keys:e}}(t);return{pattern:t,handler:e,exec(t){const e=r.exec(St(t.pathname));if(!e)return null;const n={};return i.forEach(((t,s)=>{n[t]=decodeURIComponent(e[s+1]||"")})),n}}}(t,e)),this}addRoute(t,e){this.add(t,e)}removeRoute(t){var e;return(null===(e=this.activeRoute)||void 0===e?void 0:e.pattern)===t&&(this.disposeRoute(),this.activeRoute=void 0,this.current.set(null)),this.routes=this.routes.filter((e=>e.pattern!==t)),this}navigate(t,e={}){var n;const s=l();if(!s)return;tt((()=>{const n=e.replace?"replaceState":"pushState";s.history[n](null,"",bt(t,this.base)),this.check()}),null!==(n=e.transition)&&void 0!==n?n:this.transition)}href(t){return bt(t,this.base)}link(t,e={}){const n=e["@click"],s=this.href(t);return{...e,href:s,"@click":t=>{null==n||n(t);const e=t.currentTarget,r=e&&"function"==typeof e.matches&&e.matches(this.linkSelector)?e:null,i=this.resolveNavigationURL(t,r,s);i&&(t.preventDefault(),this.navigate(`${i.pathname}${i.search}${i.hash}`))}}}start(){var t,e;const n=l(),s=a();n&&!this.started?(n.addEventListener("popstate",this.listener),null==s||s.addEventListener("click",this.clickListener),null===(e=null===(t=n.navigation)||void 0===t?void 0:t.addEventListener)||void 0===e||e.call(t,"navigate",this.navigationListener),this.started=!0,this.check()):n&&this.check()}stop(){var t,e;const n=l(),s=a();n&&this.started&&(n.removeEventListener("popstate",this.listener),null==s||s.removeEventListener("click",this.clickListener),null===(e=null===(t=n.navigation)||void 0===t?void 0:t.removeEventListener)||void 0===e||e.call(t,"navigate",this.navigationListener)),this.started=!1,this.disposeRoute()}check(){var t;const e=l();if(!e)return null;const n=new URL(e.location.href),s=wt(n.pathname,this.base);if(null===s)return this.disposeRoute(),this.activeRoute=void 0,this.current.set(null),null;const r=new URL(n.href);r.pathname=s||"/";for(const t of this.routes){const e=t.exec(r);if(!e)continue;const i=kt(n.search),o=kt(n.hash),l={...e,...i,...o},a={path:s||"/",url:n,params:l,query:i,hash:o};this.disposeRoute(),this.activeRoute=t,this.current.set(a);const c=t.handler(l,a);return"function"==typeof c&&(this.routeCleanup=c),a}this.disposeRoute(),this.activeRoute=void 0,this.current.set(null);const i=null===(t=this.notFound)||void 0===t?void 0:t.call(this,{},{path:s||"/",url:n,params:{},query:kt(n.search),hash:kt(n.hash)});return"function"==typeof i&&(this.routeCleanup=i),null}handleLinkClick(t){const e=this.findAnchor(t),n=this.resolveNavigationURL(t,e);n&&(t.preventDefault(),this.navigate(`${n.pathname}${n.search}${n.hash}`))}handleNavigationEvent(t){var e;const n=l();if(!n||!(null==t?void 0:t.canIntercept)||!(null===(e=t.destination)||void 0===e?void 0:e.url)||"function"!=typeof t.intercept)return;const s=new URL(t.destination.url,n.location.href);s.origin===n.location.origin&&null!==wt(s.pathname,this.base)&&t.intercept({handler:()=>{this.check()}})}disposeRoute(){if(!this.routeCleanup)return;const t=this.routeCleanup;this.routeCleanup=void 0,t()}resolveNavigationURL(t,e,n){var s;const r=t;if(t.defaultPrevented)return null;if("number"==typeof r.button&&0!==r.button)return null;if(r.metaKey||r.ctrlKey||r.shiftKey||r.altKey)return null;if(e&&(e.target&&"_self"!==e.target||e.hasAttribute("download")))return null;const i=l();if(!i)return null;const o=null!==(s=null==e?void 0:e.getAttribute("href"))&&void 0!==s?s:n;if(!o||/^(mailto|tel):/i.test(o))return null;const a=new URL((null==e?void 0:e.href)||o,i.location.href);return a.origin!==i.location.origin||null===wt(a.pathname,this.base)?null:a}findAnchor(t){var e;const n="function"==typeof t.composedPath?t.composedPath():[];for(const t of n){if(!t||!t.matches)continue;const e=t;if(e.matches(this.linkSelector))return e}const s=t.target;return null===(e=null==s?void 0:s.closest)||void 0===e?void 0:e.call(s,this.linkSelector)}}function yt(t){const e=St(t||"/");return""===e?"":e}function bt(t,e){const n=yt(e),s=new URL(t||"/","http://ity.local");let r=St(s.pathname)||"/";return n&&r!==n&&!r.startsWith(`${n}/`)&&(r=`${n}${"/"===r?"":r}`),`${r}${s.search}${s.hash}`}function wt(t,e){const n=yt(e),s=St(t)||"/";return n?s===n?"/":s.startsWith(`${n}/`)?St(s.slice(n.length))||"/":null:s}function St(t){const e=t.replace(/[?#].*$/,"").replace(/\/+$/,"");return""===e?"":e.startsWith("/")?e:`/${e}`}function kt(t){const e={},n=t.replace(/^[?#]/,"");if(!n)return e;return new URLSearchParams(n).forEach(((t,n)=>{e[n]=t})),e}const Lt=k(null);function Et(t,e){let n=Lt.peek();return n||(n=new gt({autoStart:!1}),Lt.set(n)),n.add(t,e),n.start(),n}const At={version:"2.2.0",createConfig:R,configure:j,signal:k,computed:L,effect:E,batch:A,untrack:C,isSignal:$,resolveSignal:O,store:T,resource:M,action:x,form:N,formState:q,html:z,unsafeHTML:V,render:et,renderToString:nt,component:lt,route:Et,Router:gt,SelectorObject:ut,onDOMReady:dt,Model:ft,View:pt,Application:vt,Collection:mt};"function"==typeof define&&define.amd?define((function(){const t=l();return t&&(t.Ity=At),At})):"object"==typeof module&&void 0!==module.exports&&(module.exports=At);const Ct=l();return Ct&&(Ct.Ity=At),t.Application=vt,t.Collection=mt,t.Model=ft,t.Router=gt,t.SelectorObject=ut,t.View=pt,t.action=x,t.batch=A,t.component=lt,t.computed=L,t.configure=j,t.createConfig=R,t.default=At,t.effect=E,t.form=N,t.formState=q,t.html=z,t.isSignal=$,t.onDOMReady=dt,t.render=et,t.renderToString=nt,t.resolveSignal=O,t.resource=M,t.route=Et,t.signal=k,t.store=T,t.unsafeHTML=V,t.untrack=C,Object.defineProperty(t,"__esModule",{value:!0}),t}({}); //# sourceMappingURL=ity.min.js.map diff --git a/dist/ity.min.js.map b/dist/ity.min.js.map index 4979a4a..d6eba17 100644 --- a/dist/ity.min.js.map +++ b/dist/ity.min.js.map @@ -1 +1 @@ -{"version":3,"file":"ity.min.js","sources":["../Ity.ts"],"sourcesContent":["// Ity.ts 2.1.0\n// (c) 2026 Dominic Cocchiarella\n// Tiny dependency-free reactive app kernel with V1 MVC compatibility.\ndeclare var define: any;\ndeclare var module: any;\n\ntype Cleanup = () => void;\ntype Equality = (prev: T, next: T) => boolean;\ntype Subscriber = (value: T, previous: T) => void;\ntype MaybeSignal = T | ReadonlySignal;\ntype TemplateValue =\n | TemplateResult\n | UnsafeHTML\n | Node\n | string\n | number\n | boolean\n | null\n | undefined\n | TemplateValue[]\n | ReadonlySignal;\n\ninterface ReadonlySignal {\n (): T;\n get(): T;\n peek(): T;\n subscribe(callback: Subscriber, options?: { immediate?: boolean }): Cleanup;\n readonly isSignal: true;\n}\n\ninterface Signal extends ReadonlySignal {\n (next: T | ((previous: T) => T)): T;\n set(next: T | ((previous: T) => T)): T;\n update(updater: (previous: T) => T): T;\n}\n\ninterface ReactiveSource {\n observers: Set;\n}\n\ninterface ReactiveObserver {\n deps: Set;\n markDirty(): void;\n}\n\ninterface ComputedOptions {\n equals?: Equality;\n}\n\ninterface SignalOptions {\n equals?: Equality;\n name?: string;\n}\n\ninterface EffectHandle {\n (): void;\n dispose(): void;\n}\n\ninterface TemplateResult {\n readonly isTemplateResult: true;\n readonly strings: readonly string[];\n readonly values: readonly unknown[];\n}\n\ninterface UnsafeHTML {\n readonly isUnsafeHTML: true;\n readonly value: string;\n}\n\ntype HTMLSanitizer = (value: string) => string;\n\ninterface UnsafeHTMLOptions {\n sanitize?: HTMLSanitizer;\n}\n\ninterface ItyConfig {\n sanitizeHTML?: HTMLSanitizer | null;\n}\n\ninterface RenderOptions {\n reactive?: boolean;\n transition?: boolean;\n}\n\ntype StoreKey = string | symbol;\n\ninterface StoreApi> {\n $patch(patch: Partial | ((current: T) => Partial | void)): void;\n $snapshot(): T;\n $subscribe(callback: (value: T) => void, options?: { immediate?: boolean }): Cleanup;\n}\n\ntype Store> = T & StoreApi;\n\ntype AsyncStatus = \"idle\" | \"loading\" | \"success\" | \"error\";\n\ninterface ResourceContext {\n signal: AbortSignal;\n previous: T | undefined;\n refreshId: number;\n}\n\ninterface ResourceOptions {\n initialValue?: T;\n immediate?: boolean;\n keepPrevious?: boolean;\n onSuccess?: (value: T) => void;\n onError?: (error: E) => void;\n}\n\ninterface Resource {\n readonly data: Signal;\n readonly error: Signal;\n readonly loading: ReadonlySignal;\n readonly status: ReadonlySignal;\n readonly promise: Promise | null;\n refresh(): Promise;\n mutate(value: T | undefined): void;\n abort(reason?: unknown): void;\n}\n\ninterface ActionOptions {\n onSuccess?: (value: TResult) => void;\n onError?: (error: E) => void;\n}\n\ninterface Action {\n (...args: TArgs): Promise;\n submit(...args: TArgs): Promise;\n readonly data: Signal;\n readonly error: Signal;\n readonly pending: ReadonlySignal;\n readonly pendingCount: ReadonlySignal;\n readonly status: ReadonlySignal;\n reset(): void;\n}\n\ninterface FormController {\n readonly action: Action<[FormData, Event], TResult, E>;\n readonly data: Signal;\n readonly error: Signal;\n readonly pending: ReadonlySignal;\n readonly status: ReadonlySignal;\n onSubmit(event: Event): Promise;\n reset(): void;\n}\n\ninterface FormOptions extends ActionOptions {\n resetOnSuccess?: boolean;\n}\n\nconst defaultEquals = Object.is;\nlet activeObserver: ReactiveObserver | null = null;\nlet batchDepth = 0;\nconst pendingEffects = new Set();\nlet configuredSanitizeHTML: HTMLSanitizer | undefined;\n\nfunction getWindow(): (Window & typeof globalThis) | undefined {\n return typeof window !== \"undefined\" ? window : undefined;\n}\n\nfunction getDocument(): Document | undefined {\n const win = getWindow();\n return win?.document ?? (typeof document !== \"undefined\" ? document : undefined);\n}\n\nfunction trackDependency(source: ReactiveSource): void {\n if (!activeObserver) return;\n source.observers.add(activeObserver);\n activeObserver.deps.add(source);\n}\n\nfunction cleanupDependencies(observer: ReactiveObserver): void {\n for (const dep of observer.deps) {\n dep.observers.delete(observer);\n }\n observer.deps.clear();\n}\n\nfunction notifyObservers(source: ReactiveSource): void {\n for (const observer of Array.from(source.observers)) {\n observer.markDirty();\n }\n}\n\nfunction flushEffects(): void {\n if (batchDepth > 0) return;\n while (pendingEffects.size) {\n const effects = Array.from(pendingEffects);\n pendingEffects.clear();\n for (const effect of effects) {\n effect.run();\n }\n }\n}\n\nfunction queueEffect(effect: ReactiveEffect): void {\n pendingEffects.add(effect);\n flushEffects();\n}\n\nclass SignalNode implements ReactiveSource {\n observers = new Set();\n private subscribers = new Set>();\n private value: T;\n private equals: Equality;\n\n constructor(value: T, options: SignalOptions = {}) {\n this.value = value;\n this.equals = options.equals || defaultEquals;\n }\n\n read(track = true): T {\n if (track) trackDependency(this);\n return this.value;\n }\n\n write(next: T | ((previous: T) => T)): T {\n const previous = this.value;\n const resolved = typeof next === \"function\"\n ? (next as (previous: T) => T)(previous)\n : next;\n if (this.equals(previous, resolved)) return previous;\n this.value = resolved;\n notifyObservers(this);\n for (const subscriber of Array.from(this.subscribers)) {\n subscriber(resolved, previous);\n }\n flushEffects();\n return resolved;\n }\n\n subscribe(callback: Subscriber, options: { immediate?: boolean } = {}): Cleanup {\n this.subscribers.add(callback);\n if (options.immediate) callback(this.value, this.value);\n return () => {\n this.subscribers.delete(callback);\n };\n }\n}\n\nclass ComputedNode implements ReactiveSource, ReactiveObserver {\n observers = new Set();\n deps = new Set();\n private subscribers = new Set>();\n private dirty = true;\n private initialized = false;\n private value!: T;\n private equals: Equality;\n\n constructor(private readonly getter: () => T, options: ComputedOptions = {}) {\n this.equals = options.equals || defaultEquals;\n }\n\n read(track = true): T {\n if (track) trackDependency(this);\n if (this.dirty) this.evaluate();\n return this.value;\n }\n\n markDirty(): void {\n if (this.dirty) return;\n const previous = this.value;\n this.dirty = true;\n notifyObservers(this);\n if (this.subscribers.size) {\n const next = this.read(false);\n if (!this.equals(previous, next)) {\n for (const subscriber of Array.from(this.subscribers)) {\n subscriber(next, previous);\n }\n }\n }\n }\n\n subscribe(callback: Subscriber, options: { immediate?: boolean } = {}): Cleanup {\n this.subscribers.add(callback);\n if (options.immediate) {\n const current = this.read(false);\n callback(current, current);\n }\n return () => {\n this.subscribers.delete(callback);\n };\n }\n\n private evaluate(): void {\n cleanupDependencies(this);\n const previousObserver = activeObserver;\n activeObserver = this;\n try {\n this.value = this.getter();\n this.dirty = false;\n this.initialized = true;\n } finally {\n activeObserver = previousObserver;\n }\n }\n}\n\nclass ReactiveEffect implements ReactiveObserver {\n deps = new Set();\n private disposed = false;\n private cleanup?: Cleanup;\n\n constructor(private readonly callback: (onCleanup: (cleanup: Cleanup) => void) => void) {\n this.run();\n }\n\n markDirty(): void {\n if (!this.disposed) queueEffect(this);\n }\n\n run(): void {\n if (this.disposed) return;\n cleanupDependencies(this);\n if (this.cleanup) {\n const cleanup = this.cleanup;\n this.cleanup = undefined;\n cleanup();\n }\n const previousObserver = activeObserver;\n activeObserver = this;\n try {\n this.callback((cleanup) => {\n this.cleanup = cleanup;\n });\n } finally {\n activeObserver = previousObserver;\n }\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n cleanupDependencies(this);\n if (this.cleanup) {\n const cleanup = this.cleanup;\n this.cleanup = undefined;\n cleanup();\n }\n pendingEffects.delete(this);\n }\n}\n\nfunction signal(initialValue: T, options: SignalOptions = {}): Signal {\n const node = new SignalNode(initialValue, options);\n const readWrite = function (next?: T | ((previous: T) => T)): T {\n if (arguments.length === 0) return node.read(true);\n return node.write(next as T | ((previous: T) => T));\n } as Signal;\n readWrite.get = () => node.read(true);\n readWrite.peek = () => node.read(false);\n readWrite.set = (next) => node.write(next);\n readWrite.update = (updater) => node.write(updater);\n readWrite.subscribe = (callback, subscribeOptions) => node.subscribe(callback, subscribeOptions);\n Object.defineProperty(readWrite, \"isSignal\", { value: true });\n return readWrite;\n}\n\nfunction computed(getter: () => T, options: ComputedOptions = {}): ReadonlySignal {\n const node = new ComputedNode(getter, options);\n const read = function (): T {\n return node.read(true);\n } as ReadonlySignal;\n read.get = () => node.read(true);\n read.peek = () => node.read(false);\n read.subscribe = (callback, subscribeOptions) => node.subscribe(callback, subscribeOptions);\n Object.defineProperty(read, \"isSignal\", { value: true });\n return read;\n}\n\nfunction effect(callback: (onCleanup: (cleanup: Cleanup) => void) => void): EffectHandle {\n const runner = new ReactiveEffect(callback);\n const dispose = (() => runner.dispose()) as EffectHandle;\n dispose.dispose = dispose;\n return dispose;\n}\n\nfunction batch(callback: () => T): T {\n batchDepth += 1;\n try {\n return callback();\n } finally {\n batchDepth -= 1;\n flushEffects();\n }\n}\n\nfunction untrack(callback: () => T): T {\n const previousObserver = activeObserver;\n activeObserver = null;\n try {\n return callback();\n } finally {\n activeObserver = previousObserver;\n }\n}\n\nfunction isSignal(value: unknown): value is ReadonlySignal {\n return typeof value === \"function\" && (value as any).isSignal === true;\n}\n\nfunction resolveSignal(value: MaybeSignal): T {\n return isSignal(value) ? value() : value;\n}\n\nfunction configure(options: ItyConfig = {}): void {\n configuredSanitizeHTML = options.sanitizeHTML || undefined;\n}\n\nfunction store>(initialValue: T): Store {\n const keys = new Set(Reflect.ownKeys(initialValue));\n const signals = new Map>();\n const structure = signal(0);\n\n const ensureSignal = (key: StoreKey): Signal => {\n if (!signals.has(key)) {\n signals.set(key, signal((initialValue as any)[key]));\n }\n return signals.get(key)!;\n };\n\n const bumpStructure = (): void => {\n structure.update((version) => version + 1);\n };\n\n const setKey = (key: StoreKey, value: any): void => {\n const hadKey = keys.has(key);\n if (!hadKey) keys.add(key);\n ensureSignal(key).set(value);\n if (!hadKey) bumpStructure();\n };\n\n const snapshot = (): T => {\n structure();\n const out: any = {};\n for (const key of keys) {\n out[key] = ensureSignal(key)();\n }\n return out as T;\n };\n\n const api: StoreApi = {\n $patch(patch) {\n const current = snapshot();\n const next = typeof patch === \"function\" ? patch(current) : patch;\n if (!next) return;\n batch(() => {\n for (const key of Reflect.ownKeys(next)) {\n setKey(key, (next as any)[key]);\n }\n });\n },\n $snapshot: snapshot,\n $subscribe(callback, options = {}) {\n let first = true;\n return effect(() => {\n const value = snapshot();\n if (first && !options.immediate) {\n first = false;\n return;\n }\n first = false;\n callback(value);\n });\n }\n };\n\n return new Proxy(api as Store, {\n get(target, key, receiver) {\n if (key in target) return Reflect.get(target, key, receiver);\n return ensureSignal(key)();\n },\n set(_target, key, value) {\n batch(() => {\n setKey(key, value);\n });\n return true;\n },\n deleteProperty(_target, key) {\n if (!keys.has(key)) return true;\n keys.delete(key);\n batch(() => {\n ensureSignal(key).set(undefined);\n bumpStructure();\n });\n return true;\n },\n ownKeys(target) {\n structure();\n return Array.from(new Set([...Reflect.ownKeys(target), ...keys]));\n },\n getOwnPropertyDescriptor(target, key) {\n structure();\n if (Object.prototype.hasOwnProperty.call(target, key)) {\n return { ...Reflect.getOwnPropertyDescriptor(target, key)!, enumerable: false };\n }\n if (!keys.has(key)) return undefined;\n return { enumerable: true, configurable: true };\n },\n has(target, key) {\n structure();\n return key in target || keys.has(key);\n }\n });\n}\n\nfunction resource(\n loader: (context: ResourceContext) => Promise | T,\n options: ResourceOptions = {}\n): Resource {\n const data = signal(options.initialValue);\n const error = signal(null);\n const pending = signal(false);\n const statusValue = signal(options.initialValue === undefined ? \"idle\" : \"success\");\n const loading = computed(() => pending());\n const status = computed(() => statusValue());\n const keepPrevious = options.keepPrevious !== false;\n let controller: AbortController | null = null;\n let refreshId = 0;\n let currentPromise: Promise | null = null;\n\n const api: Resource = {\n data,\n error,\n loading,\n status,\n get promise() {\n return currentPromise;\n },\n refresh() {\n refreshId += 1;\n const id = refreshId;\n if (controller) controller.abort();\n controller = new AbortController();\n const signal = controller.signal;\n const previous = data.peek();\n pending.set(true);\n statusValue.set(\"loading\");\n error.set(null);\n if (!keepPrevious) data.set(undefined);\n\n currentPromise = Promise.resolve()\n .then(() => loader({ signal, previous, refreshId: id }))\n .then((value) => {\n if (id !== refreshId || signal.aborted) return data.peek();\n data.set(value);\n error.set(null);\n statusValue.set(\"success\");\n options.onSuccess?.(value);\n return value;\n })\n .catch((err) => {\n if (id !== refreshId) return data.peek();\n error.set(err as E);\n statusValue.set(\"error\");\n options.onError?.(err as E);\n return data.peek();\n })\n .finally(() => {\n if (id === refreshId) {\n pending.set(false);\n controller = null;\n }\n });\n\n return currentPromise;\n },\n mutate(value) {\n refreshId += 1;\n if (controller) controller.abort();\n controller = null;\n currentPromise = null;\n data.set(value);\n error.set(null);\n pending.set(false);\n statusValue.set(value === undefined ? \"idle\" : \"success\");\n },\n abort(reason?: unknown) {\n if (!controller) return;\n refreshId += 1;\n controller.abort(reason);\n controller = null;\n currentPromise = null;\n pending.set(false);\n statusValue.set(data.peek() === undefined ? \"idle\" : \"success\");\n }\n };\n\n if (options.immediate !== false) {\n api.refresh();\n }\n\n return api;\n}\n\nfunction action(\n handler: (...args: TArgs) => Promise | TResult,\n options: ActionOptions = {}\n): Action {\n const data = signal(undefined);\n const error = signal(null);\n const count = signal(0);\n const statusValue = signal(\"idle\");\n const pending = computed(() => count() > 0);\n const pendingCount = computed(() => count());\n const status = computed(() => statusValue());\n let generation = 0;\n\n const submit = (...args: TArgs): Promise => {\n const runGeneration = generation;\n count.update((value) => value + 1);\n statusValue.set(\"loading\");\n error.set(null);\n\n return Promise.resolve()\n .then(() => handler(...args))\n .then((value) => {\n if (runGeneration === generation) {\n data.set(value);\n error.set(null);\n options.onSuccess?.(value);\n if (count.peek() <= 1) statusValue.set(\"success\");\n }\n return value;\n })\n .catch((err) => {\n if (runGeneration === generation) {\n error.set(err as E);\n options.onError?.(err as E);\n if (count.peek() <= 1) statusValue.set(\"error\");\n }\n throw err;\n })\n .finally(() => {\n if (runGeneration !== generation) return;\n count.update((value) => Math.max(0, value - 1));\n if (count.peek() > 0) statusValue.set(\"loading\");\n });\n };\n\n const callable = ((...args: TArgs) => submit(...args)) as Action;\n const mutableCallable = callable as Action & {\n submit: (...args: TArgs) => Promise;\n data: Signal;\n error: Signal;\n pending: ReadonlySignal;\n pendingCount: ReadonlySignal;\n status: ReadonlySignal;\n };\n mutableCallable.submit = submit;\n mutableCallable.data = data;\n mutableCallable.error = error;\n mutableCallable.pending = pending;\n mutableCallable.pendingCount = pendingCount;\n mutableCallable.status = status;\n callable.reset = () => {\n generation += 1;\n data.set(undefined);\n error.set(null);\n count.set(0);\n statusValue.set(\"idle\");\n };\n return callable;\n}\n\nfunction form(\n handler: (data: FormData, event: Event) => Promise | TResult,\n options: FormOptions = {}\n): FormController {\n const submitAction = action<[FormData, Event], TResult, E>(handler, options);\n\n const findForm = (event: Event): HTMLFormElement => {\n const target = (event.currentTarget || event.target) as Element | null;\n const getFormElementCtor = (node: Element | null): typeof HTMLFormElement | undefined => {\n const ownerWindow = node?.ownerDocument?.defaultView as (Window & typeof globalThis) | null | undefined;\n return ownerWindow?.HTMLFormElement\n || getWindow()?.HTMLFormElement\n || (typeof HTMLFormElement !== \"undefined\" ? HTMLFormElement : undefined);\n };\n const isFormElement = (node: Element | null | undefined): node is HTMLFormElement => {\n const FormElement = node ? getFormElementCtor(node) : getFormElementCtor(target);\n return Boolean(node && FormElement && node instanceof FormElement);\n };\n if (!getFormElementCtor(target)) throw new Error(\"Ity.form requires HTMLFormElement support\");\n if (isFormElement(target)) return target;\n const closest = target?.closest?.(\"form\");\n if (isFormElement(closest)) return closest;\n throw new Error(\"Ity.form onSubmit requires a form event target\");\n };\n\n const createFormData = (formElement: HTMLFormElement): FormData => {\n const ownerWindow = formElement.ownerDocument?.defaultView as (Window & typeof globalThis) | null | undefined;\n const FormDataCtor = ownerWindow?.FormData\n || getWindow()?.FormData\n || (typeof FormData !== \"undefined\" ? FormData : undefined);\n if (!FormDataCtor) throw new Error(\"Ity.form requires FormData support\");\n return new FormDataCtor(formElement);\n };\n\n return {\n action: submitAction,\n data: submitAction.data,\n error: submitAction.error,\n pending: submitAction.pending,\n status: submitAction.status,\n async onSubmit(event: Event): Promise {\n event.preventDefault();\n const formElement = findForm(event);\n const result = await submitAction(createFormData(formElement), event);\n if (options.resetOnSuccess) formElement.reset();\n return result;\n },\n reset() {\n submitAction.reset();\n }\n };\n}\n\nfunction html(strings: TemplateStringsArray | readonly string[], ...values: unknown[]): TemplateResult {\n return {\n isTemplateResult: true,\n strings: Array.from(strings),\n values\n };\n}\n\nfunction unsafeHTML(value: string, options: UnsafeHTMLOptions = {}): UnsafeHTML {\n const sanitizer = options.sanitize || configuredSanitizeHTML;\n return {\n isUnsafeHTML: true,\n value: sanitizer ? sanitizer(String(value)) : String(value)\n };\n}\n\nfunction isTemplateResult(value: unknown): value is TemplateResult {\n return !!value && typeof value === \"object\" && (value as TemplateResult).isTemplateResult === true;\n}\n\nfunction isUnsafeHTML(value: unknown): value is UnsafeHTML {\n return !!value && typeof value === \"object\" && (value as UnsafeHTML).isUnsafeHTML === true;\n}\n\nfunction isNodeLike(value: unknown): value is Node {\n return !!value && typeof value === \"object\" && typeof (value as Node).nodeType === \"number\";\n}\n\nfunction documentOrThrow(): Document {\n const doc = getDocument();\n if (!doc) throw new Error(\"Ity DOM rendering requires a document\");\n return doc;\n}\n\nfunction normalizeValue(value: unknown): unknown {\n return isSignal(value) ? value() : value;\n}\n\nfunction valueToFragment(value: unknown, doc: Document = documentOrThrow()): DocumentFragment {\n const fragment = doc.createDocumentFragment();\n appendValue(fragment, normalizeValue(value), doc);\n return fragment;\n}\n\nfunction appendValue(parent: Node, value: unknown, doc: Document): void {\n value = normalizeValue(value);\n if (value === null || value === undefined || value === false) return;\n if (Array.isArray(value)) {\n for (const item of value) appendValue(parent, item, doc);\n return;\n }\n if (isTemplateResult(value)) {\n parent.appendChild(materializeTemplate(value, doc));\n return;\n }\n if (isUnsafeHTML(value)) {\n const template = doc.createElement(\"template\");\n template.innerHTML = value.value;\n parent.appendChild(template.content.cloneNode(true));\n return;\n }\n if (isNodeLike(value)) {\n parent.appendChild(value);\n return;\n }\n parent.appendChild(doc.createTextNode(String(value)));\n}\n\ninterface Binding {\n index: number;\n kind: \"node\" | \"event\" | \"attr\" | \"prop\" | \"bool\";\n name?: string;\n}\n\nfunction materializeTemplate(result: TemplateResult, doc: Document = documentOrThrow()): DocumentFragment {\n const bindings: Binding[] = [];\n let source = \"\";\n\n for (let i = 0; i < result.values.length; i += 1) {\n const part = result.strings[i] ?? \"\";\n const attrMatch = part.match(/([@.?]?[\\w:-]+)\\s*=\\s*$/);\n if (attrMatch) {\n const rawName = attrMatch[1];\n const before = part.slice(0, part.length - attrMatch[0].length);\n const marker = `data-ity-bind-${i}`;\n const first = rawName[0];\n const kind = first === \"@\" ? \"event\" : first === \".\" ? \"prop\" : first === \"?\" ? \"bool\" : \"attr\";\n const name = kind === \"attr\" ? rawName : rawName.slice(1);\n bindings.push({ index: i, kind, name });\n source += `${before}${marker}=\"\"`;\n } else {\n bindings.push({ index: i, kind: \"node\" });\n source += `${part}`;\n }\n }\n source += result.strings[result.strings.length - 1] ?? \"\";\n\n const template = doc.createElement(\"template\");\n template.innerHTML = source;\n const fragment = template.content.cloneNode(true) as DocumentFragment;\n applyBindings(fragment, bindings, result.values, doc);\n return fragment;\n}\n\nfunction applyBindings(root: DocumentFragment, bindings: Binding[], values: readonly unknown[], doc: Document): void {\n const comments = new Map();\n const walker = doc.createTreeWalker(root, 128);\n let current = walker.nextNode();\n while (current) {\n const comment = current as Comment;\n const match = comment.data.match(/^ity:(\\d+)$/);\n if (match) {\n const index = Number(match[1]);\n const list = comments.get(index) || [];\n list.push(comment);\n comments.set(index, list);\n }\n current = walker.nextNode();\n }\n\n for (const binding of bindings) {\n const value = normalizeValue(values[binding.index]);\n if (binding.kind === \"node\") {\n const markers = comments.get(binding.index) || [];\n for (const marker of markers) {\n marker.replaceWith(valueToFragment(value, doc));\n }\n continue;\n }\n\n const attrName = `data-ity-bind-${binding.index}`;\n const elements = Array.from(root.querySelectorAll(`[${attrName}]`)) as HTMLElement[];\n for (const element of elements) {\n element.removeAttribute(attrName);\n applyElementBinding(element, binding, value);\n }\n }\n}\n\nfunction applyElementBinding(element: HTMLElement, binding: Binding, value: unknown): void {\n const name = binding.name || \"\";\n if (binding.kind === \"event\") {\n if (typeof value === \"function\") {\n element.addEventListener(name, value as EventListener);\n } else if (Array.isArray(value) && typeof value[0] === \"function\") {\n element.addEventListener(name, value[0] as EventListener, value[1] as AddEventListenerOptions);\n }\n return;\n }\n\n if (binding.kind === \"prop\") {\n (element as any)[name] = value;\n return;\n }\n\n if (binding.kind === \"bool\") {\n element.toggleAttribute(name, Boolean(value));\n return;\n }\n\n if (value === false || value === null || value === undefined) {\n element.removeAttribute(name);\n return;\n }\n\n if (name === \"class\" && Array.isArray(value)) {\n element.setAttribute(\"class\", value.filter(Boolean).join(\" \"));\n return;\n }\n\n if (name === \"class\" && typeof value === \"object\") {\n const classes = Object.keys(value as Record).filter((key) => Boolean((value as any)[key]));\n element.setAttribute(\"class\", classes.join(\" \"));\n return;\n }\n\n if (name === \"style\" && typeof value === \"object\" && value !== null) {\n Object.assign((element as HTMLElement).style, value);\n return;\n }\n\n element.setAttribute(name, value === true ? \"\" : String(value));\n}\n\nfunction resolveTarget(target: string | Element | DocumentFragment | SelectorObject): Element | DocumentFragment {\n if (typeof target === \"string\") {\n const found = documentOrThrow().querySelector(target);\n if (!found) throw new Error(`Render target not found: ${target}`);\n return found;\n }\n if ((target as SelectorObject)?.isSelectorObject) {\n const first = (target as SelectorObject).first()[0];\n if (!first) throw new Error(\"Cannot render into an empty SelectorObject\");\n return first;\n }\n return target as Element | DocumentFragment;\n}\n\nfunction replaceChildren(target: Element | DocumentFragment, fragment: DocumentFragment): void {\n const maybeTarget = target as any;\n if (typeof maybeTarget.replaceChildren === \"function\") {\n maybeTarget.replaceChildren(fragment);\n return;\n }\n while (target.firstChild) target.removeChild(target.firstChild);\n target.appendChild(fragment);\n}\n\nfunction withViewTransition(update: () => void, enabled: boolean | undefined): void {\n const doc = getDocument() as any;\n if (enabled && doc && typeof doc.startViewTransition === \"function\") {\n doc.startViewTransition(update);\n } else {\n update();\n }\n}\n\nfunction render(\n view: TemplateValue | (() => TemplateValue),\n target: string | Element | DocumentFragment | SelectorObject,\n options: RenderOptions = {}\n): Cleanup {\n const mount = resolveTarget(target);\n const update = () => {\n const value = typeof view === \"function\" && !isSignal(view)\n ? (view as () => TemplateValue)()\n : normalizeValue(view);\n withViewTransition(() => replaceChildren(mount, valueToFragment(value)), options.transition);\n };\n\n if (options.reactive === false) {\n update();\n return () => undefined;\n }\n\n return effect(update);\n}\n\nfunction renderToString(view: TemplateValue | (() => TemplateValue)): string {\n const value = typeof view === \"function\" && !isSignal(view)\n ? (view as () => TemplateValue)()\n : normalizeValue(view);\n return valueToString(value);\n}\n\nfunction valueToString(value: unknown): string {\n value = normalizeValue(value);\n if (value === null || value === undefined || value === false) return \"\";\n if (Array.isArray(value)) return value.map(valueToString).join(\"\");\n if (isTemplateResult(value)) return templateToString(value);\n if (isUnsafeHTML(value)) return value.value;\n if (isNodeLike(value)) {\n const node = value as any;\n if (typeof node.outerHTML === \"string\") return node.outerHTML;\n return escapeHTML(node.textContent || \"\");\n }\n return escapeHTML(String(value));\n}\n\nfunction templateToString(result: TemplateResult): string {\n let source = \"\";\n for (let i = 0; i < result.values.length; i += 1) {\n const part = result.strings[i] ?? \"\";\n const attrMatch = part.match(/([@.?]?[\\w:-]+)\\s*=\\s*$/);\n const value = normalizeValue(result.values[i]);\n if (attrMatch) {\n const rawName = attrMatch[1];\n const before = part.slice(0, part.length - attrMatch[0].length);\n const first = rawName[0];\n const kind = first === \"@\" ? \"event\" : first === \".\" ? \"prop\" : first === \"?\" ? \"bool\" : \"attr\";\n const name = kind === \"attr\" ? rawName : rawName.slice(1);\n if (kind === \"event\" || kind === \"prop\" || value === false || value === null || value === undefined) {\n source += before;\n } else if (kind === \"bool\") {\n source += value ? `${before}${name}` : before;\n } else {\n source += `${before}${name}=\"${escapeAttribute(stringifyAttribute(name, value))}\"`;\n }\n } else {\n source += part + valueToString(value);\n }\n }\n source += result.strings[result.strings.length - 1] ?? \"\";\n return source;\n}\n\nfunction stringifyAttribute(name: string, value: unknown): string {\n if (name === \"class\" && Array.isArray(value)) return value.filter(Boolean).join(\" \");\n if (name === \"class\" && typeof value === \"object\" && value !== null) {\n return Object.keys(value as Record).filter((key) => Boolean((value as any)[key])).join(\" \");\n }\n if (name === \"style\" && typeof value === \"object\" && value !== null) {\n return Object.keys(value as Record)\n .map((key) => `${key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`)}:${(value as any)[key]}`)\n .join(\";\");\n }\n return value === true ? \"\" : String(value);\n}\n\nfunction escapeHTML(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(//g, \">\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeHTML(value)\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\ninterface ComponentContext {\n host: HTMLElement;\n root: HTMLElement | ShadowRoot;\n attr(name: string): ReadonlySignal;\n emit(name: string, detail?: T, options?: CustomEventInit): boolean;\n effect(callback: (onCleanup: (cleanup: Cleanup) => void) => void): EffectHandle;\n onConnected(callback: () => void): void;\n onDisconnected(callback: () => void): void;\n}\n\ntype ComponentRender = TemplateValue | (() => TemplateValue);\ntype ComponentSetup = (ctx: ComponentContext) => ComponentRender | void;\n\ninterface ComponentOptions {\n attrs?: string[];\n observedAttributes?: string[];\n shadow?: boolean | ShadowRootMode | ShadowRootInit;\n styles?: string;\n setup?: ComponentSetup;\n}\n\nfunction component(\n name: string,\n setupOrOptions: ComponentSetup | ComponentOptions,\n maybeOptions: Omit = {}\n): CustomElementConstructor {\n const win = getWindow();\n if (!win?.customElements || !win.HTMLElement) {\n throw new Error(\"Ity.component requires Custom Elements support\");\n }\n\n if (win.customElements.get(name)) {\n return win.customElements.get(name)!;\n }\n\n const definition: ComponentOptions = typeof setupOrOptions === \"function\"\n ? { ...maybeOptions, setup: setupOrOptions }\n : setupOrOptions;\n const attrs = definition.observedAttributes || definition.attrs || [];\n\n class ItyElement extends win.HTMLElement {\n static get observedAttributes(): string[] {\n return attrs;\n }\n\n private attrSignals = new Map>();\n private connectedCallbacks: Cleanup[] = [];\n private disconnectedCallbacks: Cleanup[] = [];\n private effectRecords: Array<{\n callback: (onCleanup: (cleanup: Cleanup) => void) => void;\n handle?: EffectHandle;\n disposed: boolean;\n }> = [];\n private renderCleanup?: Cleanup;\n private mount?: HTMLElement | ShadowRoot;\n private renderTarget?: HTMLElement | ShadowRoot;\n private renderOutput?: ComponentRender;\n private initialized = false;\n private connected = false;\n\n connectedCallback(): void {\n this.ensureMount();\n if (!this.initialized) {\n this.initialized = true;\n const ctx = this.createContext();\n const output = definition.setup?.(ctx);\n if (output !== undefined) {\n this.renderOutput = output as ComponentRender;\n }\n }\n this.connected = true;\n this.startRender();\n this.startEffects();\n for (const callback of this.connectedCallbacks) callback();\n }\n\n disconnectedCallback(): void {\n this.connected = false;\n if (this.renderCleanup) {\n this.renderCleanup();\n this.renderCleanup = undefined;\n }\n for (const record of this.effectRecords) {\n record.handle?.dispose();\n record.handle = undefined;\n }\n for (const callback of this.disconnectedCallbacks) callback();\n }\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\n this.ensureAttrSignal(name).set(newValue);\n }\n\n private ensureMount(): void {\n if (this.mount && this.renderTarget) return;\n const shadow = definition.shadow;\n if (shadow === false) {\n this.mount = this;\n } else {\n const init: ShadowRootInit = typeof shadow === \"object\"\n ? shadow\n : { mode: shadow === \"closed\" ? \"closed\" : \"open\" };\n this.mount = this.shadowRoot || this.attachShadow(init);\n }\n\n if (definition.styles) {\n const doc = this.ownerDocument;\n const style = doc.createElement(\"style\");\n style.textContent = definition.styles;\n const container = doc.createElement(\"span\");\n container.setAttribute(\"data-ity-component-root\", \"\");\n this.mount.appendChild(style);\n this.mount.appendChild(container);\n this.renderTarget = container;\n } else {\n this.renderTarget = this.mount;\n }\n }\n\n private startRender(): void {\n if (this.renderCleanup || this.renderOutput === undefined) return;\n this.renderCleanup = render(this.renderOutput, this.renderTarget!, { transition: false });\n }\n\n private startEffects(): void {\n for (const record of this.effectRecords) {\n if (!record.disposed && !record.handle) {\n record.handle = effect(record.callback);\n }\n }\n }\n\n private ensureAttrSignal(name: string): Signal {\n if (!this.attrSignals.has(name)) {\n this.attrSignals.set(name, signal(this.getAttribute(name)));\n }\n return this.attrSignals.get(name)!;\n }\n\n private createContext(): ComponentContext {\n return {\n host: this,\n root: this.mount!,\n attr: (name) => this.ensureAttrSignal(name),\n emit: (name, detail, options = {}) => this.dispatchEvent(new CustomEvent(name, {\n bubbles: true,\n composed: true,\n ...options,\n detail\n })),\n effect: (callback) => {\n const record = { callback, disposed: false, handle: undefined as EffectHandle | undefined };\n this.effectRecords.push(record);\n if (this.connected) record.handle = effect(callback);\n const dispose = (() => {\n record.disposed = true;\n record.handle?.dispose();\n record.handle = undefined;\n }) as EffectHandle;\n dispose.dispose = dispose;\n return dispose;\n },\n onConnected: (callback) => {\n this.connectedCallbacks.push(callback);\n },\n onDisconnected: (callback) => {\n this.disconnectedCallbacks.push(callback);\n }\n };\n }\n }\n\n win.customElements.define(name, ItyElement);\n return ItyElement;\n}\n\ninterface EventRecord {\n callback: (data?: unknown) => void;\n ctx: any;\n}\n\nclass Evented {\n private _events: Record = {};\n\n on(evtName: string, callback: (data?: unknown) => void, context: any = this): void {\n (this._events[evtName] ||= []).push({ callback, ctx: context });\n }\n\n off(evtName?: string, callback?: (data?: unknown) => void, context?: any): void {\n if (!evtName) {\n this._events = {};\n return;\n }\n const events = this._events[evtName];\n if (!events) return;\n if (!callback) {\n delete this._events[evtName];\n return;\n }\n for (let i = events.length - 1; i >= 0; i -= 1) {\n const event = events[i];\n if (event.callback === callback && (context === undefined || event.ctx === context)) {\n events.splice(i, 1);\n }\n }\n if (events.length === 0) delete this._events[evtName];\n }\n\n trigger(evtName: string, data?: unknown): void {\n const events = this._events[evtName];\n if (!events) return;\n for (const event of events.slice()) {\n event.callback.call(event.ctx, data);\n }\n }\n}\n\nconst regexps = {\n nospaces: /^\\S*$/\n} as const;\n\nclass SelectorObject {\n [index: number]: HTMLElement;\n public readonly isSelectorObject = true;\n private nodes: HTMLElement[] = [];\n\n constructor(nodeList: ArrayLike = []) {\n this.nodes = Array.from(nodeList as HTMLElement[]);\n this.reindex();\n }\n\n get length(): number {\n return this.nodes.length;\n }\n\n [Symbol.iterator](): Iterator {\n return this.nodes[Symbol.iterator]();\n }\n\n toArray(): HTMLElement[] {\n return this.nodes.slice();\n }\n\n find(selector: string): SelectorObject {\n const nodeList: HTMLElement[] = [];\n for (const node of this.nodes) {\n const list = node.querySelectorAll(selector);\n for (const thisNode of Array.from(list)) {\n const elm = thisNode as HTMLElement;\n if (nodeList.indexOf(elm) < 0) nodeList.push(elm);\n }\n }\n return new SelectorObject(nodeList);\n }\n\n filter(selector: string): SelectorObject {\n return new SelectorObject(this.nodes.filter((node) => node.matches(selector)));\n }\n\n first(): SelectorObject {\n return new SelectorObject(this.nodes[0] ? [this.nodes[0]] : []);\n }\n\n last(): SelectorObject {\n return new SelectorObject(this.nodes.length ? [this.nodes[this.nodes.length - 1]] : []);\n }\n\n parent(): SelectorObject {\n const nodeList: HTMLElement[] = [];\n for (const node of this.nodes) {\n const parent = node.parentElement;\n if (parent && nodeList.indexOf(parent) < 0) nodeList.push(parent);\n }\n return new SelectorObject(nodeList);\n }\n\n children(selector?: string): SelectorObject {\n const nodeList: HTMLElement[] = [];\n for (const node of this.nodes) {\n for (const child of Array.from(node.children) as HTMLElement[]) {\n if (nodeList.indexOf(child) < 0 && (!selector || child.matches(selector))) {\n nodeList.push(child);\n }\n }\n }\n return new SelectorObject(nodeList);\n }\n\n remove(): SelectorObject {\n for (const node of this.nodes) node.remove();\n return new SelectorObject([]);\n }\n\n addClass(...classes: string[]): this {\n for (const node of this.nodes) node.classList.add(...classes);\n return this;\n }\n\n removeClass(value: string): this {\n if (value && regexps.nospaces.test(value)) {\n for (const node of this.nodes) node.classList.remove(value);\n }\n return this;\n }\n\n toggleClass(value: string): this {\n if (value && regexps.nospaces.test(value)) {\n for (const node of this.nodes) node.classList.toggle(value);\n }\n return this;\n }\n\n hasClass(value: string): boolean {\n return Boolean(value && regexps.nospaces.test(value) && this.nodes.some((node) => node.classList.contains(value)));\n }\n\n attr(name: string, value?: string | number | boolean | null): string | null | this {\n if (arguments.length === 1) return this.nodes[0]?.getAttribute(name) ?? null;\n for (const node of this.nodes) {\n if (value === null || value === false || value === undefined) node.removeAttribute(name);\n else node.setAttribute(name, value === true ? \"\" : String(value));\n }\n return this;\n }\n\n text(value?: string | number | boolean): string | this {\n if (arguments.length === 0) return this.nodes.map((node) => node.textContent || \"\").join(\"\");\n for (const node of this.nodes) node.textContent = String(value);\n return this;\n }\n\n on(eventName: string, listener: EventListener, options?: AddEventListenerOptions): this {\n for (const node of this.nodes) node.addEventListener(eventName, listener, options);\n return this;\n }\n\n off(eventName: string, listener: EventListener, options?: EventListenerOptions): this {\n for (const node of this.nodes) node.removeEventListener(eventName, listener, options);\n return this;\n }\n\n before(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"beforebegin\");\n }\n\n after(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"afterend\");\n }\n\n append(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"beforeend\");\n }\n\n prepend(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"afterbegin\");\n }\n\n html(content?: string | SelectorObject | HTMLElement | TemplateResult): this | string {\n if (arguments.length === 0) return this.nodes[0]?.innerHTML ?? \"\";\n return this._html(content!, \"replace\");\n }\n\n empty(): this {\n for (const node of this.nodes) node.textContent = \"\";\n return this;\n }\n\n private _html(content: string | SelectorObject | HTMLElement | TemplateResult, position: InsertPosition | \"replace\"): this {\n const doc = getDocument();\n for (const node of this.nodes) {\n if ((content as SelectorObject)?.isSelectorObject) {\n const htmls = Array.from(content as SelectorObject).map((selNode) => selNode.outerHTML).join(\"\");\n if (position === \"replace\") node.innerHTML = htmls;\n else node.insertAdjacentHTML(position as InsertPosition, htmls);\n } else if (isTemplateResult(content) && doc) {\n const fragment = materializeTemplate(content, doc);\n if (position === \"replace\") replaceChildren(node, fragment);\n else node.insertAdjacentElement(position as InsertPosition, fragmentToElement(fragment, doc));\n } else if (isNodeLike(content)) {\n const cloned = content.cloneNode(true) as HTMLElement;\n if (position === \"replace\") replaceChildren(node, valueToFragment(cloned, doc || node.ownerDocument));\n else node.insertAdjacentElement(position as InsertPosition, cloned);\n } else {\n const htmlContent = String(content);\n if (position === \"replace\") node.innerHTML = htmlContent;\n else node.insertAdjacentHTML(position as InsertPosition, htmlContent);\n }\n }\n return this;\n }\n\n private reindex(): void {\n for (const key of Object.keys(this)) {\n if (/^\\d+$/.test(key)) delete (this as any)[key];\n }\n this.nodes.forEach((node, index) => {\n (this as any)[index] = node;\n });\n }\n}\n\nfunction fragmentToElement(fragment: DocumentFragment, doc: Document): HTMLElement {\n const span = doc.createElement(\"span\");\n span.appendChild(fragment);\n return span;\n}\n\nfunction onDOMReady(fn: (...args: any[]) => void, args: unknown[] = [], context: any = Ity): void {\n const doc = getDocument();\n const func = () => fn.apply(context, args);\n if (!doc || doc.readyState !== \"loading\") func();\n else doc.addEventListener(\"DOMContentLoaded\", func, { once: true });\n}\n\ninterface AjaxOptions {\n url?: string;\n type?: string;\n data?: unknown;\n success?: (resp: any) => void;\n error?: (status?: number, error?: unknown) => void;\n}\n\nclass Model = Record> extends Evented {\n public id!: string;\n public data!: T;\n public url!: string;\n public readonly state: Signal;\n\n constructor(opts: Partial> = {}) {\n super();\n Object.assign(this, opts);\n this.id ||= `m${Math.floor(Math.random() * 100000) + 1}`;\n this.data ||= {} as T;\n this.url ||= \"\";\n this.state = signal(this.data);\n this._init(opts);\n }\n\n onDOMReady = onDOMReady;\n\n protected _init(opts?: Partial>): void {\n this.initialize(opts);\n }\n\n protected _ajax(opts: AjaxOptions = {}): void {\n const request = new XMLHttpRequest();\n const method = opts.type || \"GET\";\n const url = opts.url || this.url;\n const success = opts.success || function (this: Model, resp: any) {\n this.data = resp;\n this.state.set(resp);\n };\n const error = opts.error || function () { };\n request.open(method, url, true);\n request.onload = () => {\n if (request.status >= 200 && request.status < 400) {\n try {\n const response = request.responseText ? JSON.parse(request.responseText) : null;\n success.call(this, response);\n } catch (err) {\n error.call(this, request.status, err);\n }\n } else {\n error.call(this, request.status);\n }\n };\n request.onerror = () => error.call(this);\n request.send(opts.data === undefined ? undefined : JSON.stringify(opts.data));\n }\n\n initialize(options?: Partial>): void { }\n\n get(attr?: keyof T): any {\n const current = this.data;\n if (!attr) return current;\n return current ? (current as any)[attr as string] : undefined;\n }\n\n set(attr: keyof T | Partial, value?: any): void {\n const current = this.state.peek() || {} as T;\n const next = typeof attr === \"string\"\n ? { ...(current as any), [attr]: value } as T\n : attr as T;\n this.data = next;\n this.state.set(next);\n this.trigger(\"change\", this.data);\n }\n\n unSet(attr: keyof T): void {\n const current = this.state.peek();\n if (!current || !Object.prototype.hasOwnProperty.call(current, attr)) return;\n const next = { ...(current as any) };\n delete next[attr as string];\n this.data = next as T;\n this.state.set(this.data);\n this.trigger(\"change\", this.data);\n }\n\n clear(): void {\n this.data = {} as T;\n this.state.set(this.data);\n this.trigger(\"change\", this.data);\n }\n\n subscribe(callback: Subscriber, options?: { immediate?: boolean }): Cleanup {\n return this.state.subscribe(callback, options);\n }\n\n sync(opts?: AjaxOptions): void {\n this._ajax(opts);\n }\n\n toJSON(): T {\n return this.get();\n }\n}\n\ninterface ViewEvents {\n [selector: string]: Record;\n}\n\ninterface ViewOptions {\n el?: string | SelectorObject | NodeList | HTMLElement;\n app?: Application;\n name?: string;\n events?: ViewEvents;\n [key: string]: any;\n}\n\nclass View extends Evented {\n public id!: string;\n public el!: SelectorObject;\n public app?: Application;\n public name?: string;\n public events!: ViewEvents;\n private renderCleanup?: Cleanup;\n private delegatedListeners: Cleanup[] = [];\n\n constructor(opts: ViewOptions = {}) {\n super();\n Object.assign(this, opts);\n this.id ||= `v${Math.floor(Math.random() * 100000) + 1}`;\n if (this.app) this.app.addView(this);\n this.events ||= {};\n onDOMReady(this._init, [opts], this);\n }\n\n private _setElement(elSelector: ViewOptions[\"el\"]): void {\n const win = getWindow();\n if ((elSelector as SelectorObject)?.isSelectorObject) {\n this.el = elSelector as SelectorObject;\n } else if (win?.NodeList && elSelector instanceof win.NodeList) {\n this.el = new SelectorObject(elSelector as any);\n } else if (typeof elSelector === \"string\") {\n this.el = new SelectorObject(documentOrThrow().querySelectorAll(elSelector) as any);\n } else if (win?.HTMLElement && elSelector instanceof win.HTMLElement) {\n this.el = new SelectorObject([elSelector]);\n } else {\n throw new Error(\"el selector must be of type String, NodeList, HTMLElement or Ity.SelectorObject\");\n }\n }\n\n private _bindDOMEvents(evtObj: ViewEvents): void {\n if (!this.el || !this.el.isSelectorObject) return;\n const captureEvents = [\"focus\", \"blur\"];\n for (const selector in evtObj) {\n for (const evt in evtObj[selector]) {\n const callback = (this as any)[evtObj[selector][evt]];\n if (typeof callback !== \"function\") {\n throw new Error(`View event handler not found: ${evtObj[selector][evt]}`);\n }\n const capture = captureEvents.includes(evt);\n this._delegateEvent(selector, evt, callback, capture);\n }\n }\n }\n\n private _delegateEvent(selector: string, evtName: string, callback: (e: Event) => void, capture = false): void {\n for (const root of this.el) {\n const listener = (event: Event) => {\n let node: HTMLElement | null = event.target as HTMLElement;\n while (node) {\n if ((node as any).matches && (node as any).matches(selector)) {\n (event as any).delegateTarget = node;\n callback.call(this, event);\n break;\n }\n if (node === root) break;\n node = node.parentElement;\n }\n };\n root.addEventListener(evtName, listener, capture);\n this.delegatedListeners.push(() => root.removeEventListener(evtName, listener, capture));\n }\n }\n\n private _init(opts: ViewOptions): void {\n if (this.el) this._setElement(this.el as any);\n if (opts.el && !this.el) this._setElement(opts.el);\n this._bindDOMEvents(this.events);\n this.initialize(opts);\n }\n\n initialize(opts?: ViewOptions): void { }\n\n getName(): string | undefined {\n return this.name;\n }\n\n get(attr: keyof this): any {\n return (this as any)[attr];\n }\n\n set(attr: keyof this, value: any): void {\n (this as any)[attr] = value;\n }\n\n renderWith(view: TemplateValue | (() => TemplateValue), options?: RenderOptions): Cleanup {\n if (this.renderCleanup) this.renderCleanup();\n this.renderCleanup = render(view, this.el, options);\n return this.renderCleanup;\n }\n\n remove(): void {\n if (this.renderCleanup) this.renderCleanup();\n for (const cleanup of this.delegatedListeners.splice(0)) cleanup();\n this.el.remove();\n if (this.app) this.app.removeView(this.id);\n }\n\n select(selector: string, ctx: HTMLElement | HTMLDocument | SelectorObject = this.el): SelectorObject {\n const win = getWindow();\n if ((win?.HTMLElement && ctx instanceof win.HTMLElement) || (win?.HTMLDocument && ctx instanceof win.HTMLDocument)) {\n return new SelectorObject(ctx.querySelectorAll(selector) as any);\n }\n if ((ctx as any).isSelectorObject) return (ctx as SelectorObject).find(selector);\n throw new Error(\"Context passed to .select() must be an HTMLElement or an Ity.SelectorObject\");\n }\n}\n\nclass Application {\n public views: View[] = [];\n\n getView(id: string): View | undefined {\n return this.views.find((view) => view.id === id);\n }\n\n addView(view: View): void {\n if (view instanceof View && !this.views.includes(view)) this.views.push(view);\n }\n\n removeView(id: string): void {\n this.views = this.views.filter((view) => view.id !== id);\n }\n\n trigger(evtName: string, data?: unknown): void {\n for (const view of this.views.slice()) view.trigger(evtName, data);\n }\n}\n\nclass Collection {\n public models: M[] = [];\n public url!: string;\n public readonly state: Signal;\n private ModelClass: new () => M;\n\n constructor(models: M[] = [], ModelClass: new () => M = Model as any) {\n this.ModelClass = ModelClass;\n this.url = \"\";\n this.state = signal(this.models);\n models.forEach((model) => this.add(model));\n }\n\n get(id: string): M | undefined {\n return this.models.find((model) => model.id === id);\n }\n\n add(model: M): void {\n if (!(model instanceof Model)) return;\n this.models = [...this.models, model];\n this.state.set(this.models);\n }\n\n remove(id: string | M): void {\n const model = typeof id === \"string\" ? this.get(id) : id;\n if (!model) return;\n this.models = this.models.filter((item) => item !== model);\n this.state.set(this.models);\n }\n\n at(index: number): M | undefined {\n return this.models[index];\n }\n\n get length(): number {\n return this.models.length;\n }\n\n clear(): void {\n this.models = [];\n this.state.set(this.models);\n }\n\n find(predicate: (m: M) => boolean): M | undefined {\n return this.models.find(predicate);\n }\n\n filter(predicate: (m: M) => boolean): M[] {\n return this.models.filter(predicate);\n }\n\n map(mapper: (m: M, index: number) => T): T[] {\n return this.models.map(mapper);\n }\n\n toJSON(): any[] {\n return this.models.map((model) => model.get());\n }\n\n subscribe(callback: Subscriber, options?: { immediate?: boolean }): Cleanup {\n return this.state.subscribe(callback, options);\n }\n\n protected _ajax(opts: AjaxOptions = {}): void {\n const request = new XMLHttpRequest();\n const method = opts.type || \"GET\";\n const url = opts.url || this.url;\n const success = opts.success || function () { };\n const error = opts.error || function () { };\n request.open(method, url, true);\n request.onload = () => {\n if (request.status >= 200 && request.status < 400) {\n try {\n success.call(this, request.responseText ? JSON.parse(request.responseText) : null);\n } catch (err) {\n error.call(this, request.status, err);\n }\n } else {\n error.call(this, request.status);\n }\n };\n request.onerror = () => error.call(this);\n request.send(opts.data === undefined ? undefined : JSON.stringify(opts.data));\n }\n\n fetch(opts: AjaxOptions & { modelClass?: new () => M } = {}): void {\n const userSuccess = opts.success;\n opts.success = function (this: Collection, resp: any[]) {\n const ctor = (opts.modelClass || this.ModelClass) as new () => M;\n this.clear();\n for (const data of resp || []) {\n const model = new ctor();\n (model as any).set(data);\n this.add(model);\n }\n if (userSuccess) userSuccess.call(this, resp);\n };\n this._ajax(opts);\n }\n\n trigger(evtName: string, data?: unknown): void {\n for (const model of this.models.slice()) model.trigger(evtName, data);\n }\n}\n\ninterface RouteContext {\n path: string;\n url: URL;\n params: Record;\n query: Record;\n hash: Record;\n}\n\ntype RouteHandler = (params: Record, context: RouteContext) => void | Cleanup;\n\ninterface RouteRecord {\n pattern: string;\n handler: RouteHandler;\n exec(url: URL): Record | null;\n}\n\ninterface RouterOptions {\n base?: string;\n autoStart?: boolean;\n linkSelector?: string;\n transition?: boolean;\n notFound?: RouteHandler;\n}\n\nclass Router {\n private routes: RouteRecord[] = [];\n private started = false;\n private readonly listener = () => this.check();\n private readonly clickListener = (event: Event) => this.handleLinkClick(event);\n private readonly navigationListener = (event: any) => this.handleNavigationEvent(event);\n private routeCleanup?: Cleanup;\n private activeRoute?: RouteRecord;\n public readonly current: Signal = signal(null);\n public notFound?: RouteHandler;\n public base: string;\n public linkSelector: string;\n public transition: boolean;\n\n constructor(options: RouterOptions = {}) {\n this.base = options.base || \"/\";\n this.linkSelector = options.linkSelector || \"a[data-ity-link]\";\n this.transition = Boolean(options.transition);\n this.notFound = options.notFound;\n if (options.autoStart !== false) this.start();\n }\n\n add(pattern: string, handler: RouteHandler): this {\n this.routes.push(createRouteRecord(pattern, handler));\n return this;\n }\n\n addRoute(pattern: string, handler: RouteHandler): void {\n this.add(pattern, handler);\n }\n\n removeRoute(pattern: string): this {\n if (this.activeRoute?.pattern === pattern) {\n this.disposeRoute();\n this.activeRoute = undefined;\n this.current.set(null);\n }\n this.routes = this.routes.filter((route) => route.pattern !== pattern);\n return this;\n }\n\n navigate(path: string, options: { replace?: boolean; transition?: boolean } = {}): void {\n const win = getWindow();\n if (!win) return;\n const update = () => {\n const method = options.replace ? \"replaceState\" : \"pushState\";\n win.history[method](null, \"\", withBasePath(path, this.base));\n this.check();\n };\n withViewTransition(update, options.transition ?? this.transition);\n }\n\n start(): void {\n const win = getWindow();\n const doc = getDocument();\n if (!win || this.started) {\n if (win) this.check();\n return;\n }\n win.addEventListener(\"popstate\", this.listener);\n doc?.addEventListener(\"click\", this.clickListener);\n (win as any).navigation?.addEventListener?.(\"navigate\", this.navigationListener);\n this.started = true;\n this.check();\n }\n\n stop(): void {\n const win = getWindow();\n const doc = getDocument();\n if (win && this.started) {\n win.removeEventListener(\"popstate\", this.listener);\n doc?.removeEventListener(\"click\", this.clickListener);\n (win as any).navigation?.removeEventListener?.(\"navigate\", this.navigationListener);\n }\n this.started = false;\n this.disposeRoute();\n }\n\n check(): RouteContext | null {\n const win = getWindow();\n if (!win) return null;\n const url = new URL(win.location.href);\n const routePath = stripBasePath(url.pathname, this.base);\n if (routePath === null) {\n this.disposeRoute();\n this.activeRoute = undefined;\n this.current.set(null);\n return null;\n }\n const routeUrl = new URL(url.href);\n routeUrl.pathname = routePath || \"/\";\n for (const route of this.routes) {\n const routeParams = route.exec(routeUrl);\n if (!routeParams) continue;\n const query = searchParamsToObject(url.search);\n const hash = searchParamsToObject(url.hash);\n const params = { ...routeParams, ...query, ...hash };\n const context: RouteContext = {\n path: routePath || \"/\",\n url,\n params,\n query,\n hash\n };\n this.disposeRoute();\n this.activeRoute = route;\n this.current.set(context);\n const cleanup = route.handler(params, context);\n if (typeof cleanup === \"function\") this.routeCleanup = cleanup;\n return context;\n }\n this.disposeRoute();\n this.activeRoute = undefined;\n this.current.set(null);\n const cleanup = this.notFound?.({}, {\n path: routePath || \"/\",\n url,\n params: {},\n query: searchParamsToObject(url.search),\n hash: searchParamsToObject(url.hash)\n });\n if (typeof cleanup === \"function\") this.routeCleanup = cleanup;\n return null;\n }\n\n private handleLinkClick(event: Event): void {\n const target = event.target as HTMLElement | null;\n const anchor = target?.closest?.(this.linkSelector) as HTMLAnchorElement | null;\n if (!anchor || anchor.target || anchor.hasAttribute(\"download\")) return;\n const win = getWindow();\n if (!win) return;\n const url = new URL(anchor.href, win.location.href);\n if (url.origin !== win.location.origin) return;\n if (stripBasePath(url.pathname, this.base) === null) return;\n event.preventDefault();\n this.navigate(`${url.pathname}${url.search}${url.hash}`);\n }\n\n private handleNavigationEvent(event: any): void {\n const win = getWindow();\n if (!win || !event?.canIntercept || !event.destination?.url || typeof event.intercept !== \"function\") return;\n const url = new URL(event.destination.url, win.location.href);\n if (url.origin !== win.location.origin) return;\n if (stripBasePath(url.pathname, this.base) === null) return;\n event.intercept({\n handler: () => {\n this.check();\n }\n });\n }\n\n private disposeRoute(): void {\n if (!this.routeCleanup) return;\n const cleanup = this.routeCleanup;\n this.routeCleanup = undefined;\n cleanup();\n }\n}\n\nfunction createRouteRecord(pattern: string, handler: RouteHandler): RouteRecord {\n const win = getWindow();\n const URLPatternCtor = (win as any)?.URLPattern || (globalThis as any).URLPattern;\n if (typeof URLPatternCtor === \"function\") {\n try {\n const nativePattern = new URLPatternCtor({ pathname: pattern });\n return {\n pattern,\n handler,\n exec(url) {\n const match = nativePattern.exec(url.href);\n return match ? decodeParams(match.pathname.groups || {}) : null;\n }\n };\n } catch (_err) {\n // Fall through to the regex matcher for non-URLPattern syntax.\n }\n }\n\n const { re, keys } = compilePathPattern(pattern);\n return {\n pattern,\n handler,\n exec(url) {\n const match = re.exec(normalizePath(url.pathname));\n if (!match) return null;\n const params: Record = {};\n keys.forEach((key, index) => {\n params[key] = decodeURIComponent(match[index + 1] || \"\");\n });\n return params;\n }\n };\n}\n\nfunction normalizeBase(base: string): string {\n const normalized = normalizePath(base || \"/\");\n return normalized === \"\" ? \"\" : normalized;\n}\n\nfunction withBasePath(path: string, base: string): string {\n const normalizedBase = normalizeBase(base);\n const parsed = new URL(path || \"/\", \"http://ity.local\");\n let pathname = normalizePath(parsed.pathname) || \"/\";\n if (normalizedBase && pathname !== normalizedBase && !pathname.startsWith(`${normalizedBase}/`)) {\n pathname = `${normalizedBase}${pathname === \"/\" ? \"\" : pathname}`;\n }\n return `${pathname}${parsed.search}${parsed.hash}`;\n}\n\nfunction stripBasePath(pathname: string, base: string): string | null {\n const normalizedBase = normalizeBase(base);\n const normalizedPath = normalizePath(pathname) || \"/\";\n if (!normalizedBase) return normalizedPath;\n if (normalizedPath === normalizedBase) return \"/\";\n if (normalizedPath.startsWith(`${normalizedBase}/`)) {\n return normalizePath(normalizedPath.slice(normalizedBase.length)) || \"/\";\n }\n return null;\n}\n\nfunction compilePathPattern(pattern: string): { re: RegExp; keys: string[] } {\n const keys: string[] = [];\n const normalized = normalizePath(pattern);\n if (normalized === \"\") return { re: /^\\/?$/, keys };\n const segments = normalized.split(\"/\").filter(Boolean);\n const source = segments.map((segment) => {\n if (segment === \"*\") {\n keys.push(\"wildcard\");\n return \"(.*)\";\n }\n if (segment.startsWith(\":\")) {\n keys.push(segment.slice(1));\n return \"([^/]+)\";\n }\n return escapeRegExp(segment);\n }).join(\"/\");\n return { re: new RegExp(`^/${source}/?$`), keys };\n}\n\nfunction normalizePath(path: string): string {\n const normalized = path.replace(/[?#].*$/, \"\").replace(/\\/+$/, \"\");\n return normalized === \"\" ? \"\" : normalized.startsWith(\"/\") ? normalized : `/${normalized}`;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction searchParamsToObject(value: string): Record {\n const out: Record = {};\n const clean = value.replace(/^[?#]/, \"\");\n if (!clean) return out;\n const params = new URLSearchParams(clean);\n params.forEach((paramValue, key) => {\n out[key] = paramValue;\n });\n return out;\n}\n\nfunction decodeParams(value: Record): Record {\n const out: Record = {};\n for (const key of Object.keys(value)) {\n out[key] = decodeURIComponent(value[key]);\n }\n return out;\n}\n\nconst defaultRouter = signal(null);\n\nfunction route(pattern: string, handler: RouteHandler): Router {\n let router = defaultRouter.peek();\n if (!router) {\n router = new Router({ autoStart: false });\n defaultRouter.set(router);\n }\n router.add(pattern, handler);\n router.start();\n return router;\n}\n\nconst Ity = {\n version: \"2.1.0\",\n configure,\n signal,\n computed,\n effect,\n batch,\n untrack,\n isSignal,\n resolveSignal,\n store,\n resource,\n action,\n form,\n html,\n unsafeHTML,\n render,\n renderToString,\n component,\n route,\n Router,\n SelectorObject,\n onDOMReady,\n Model,\n View,\n Application,\n Collection\n};\n\nfunction createAmdExport(): typeof Ity {\n const win = getWindow();\n if (win) (win as any).Ity = Ity;\n return Ity;\n}\n\n/* c8 ignore next 3 */\nif (typeof define === \"function\" && (define as any).amd) {\n (define as any)(createAmdExport);\n} else if (typeof module === \"object\" && typeof module.exports !== \"undefined\") {\n module.exports = Ity;\n}\n\nconst win = getWindow();\nif (win) {\n (win as any).Ity = Ity;\n}\n\nexport {\n Application,\n Collection,\n Model,\n Router,\n SelectorObject,\n View,\n batch,\n component,\n configure,\n computed,\n effect,\n action,\n form,\n html,\n isSignal,\n onDOMReady,\n render,\n renderToString,\n resource,\n resolveSignal,\n route,\n signal,\n store,\n unsafeHTML,\n untrack\n};\nexport type {\n Action,\n ActionOptions,\n AsyncStatus,\n ComponentContext,\n ComponentOptions,\n EffectHandle,\n FormController,\n FormOptions,\n HTMLSanitizer,\n ItyConfig,\n ReadonlySignal,\n RenderOptions,\n Resource,\n ResourceContext,\n ResourceOptions,\n RouteContext,\n RouteHandler,\n Signal,\n Store,\n TemplateResult,\n UnsafeHTMLOptions\n};\nexport default Ity;\n"],"names":["defaultEquals","Object","is","activeObserver","batchDepth","pendingEffects","Set","configuredSanitizeHTML","getWindow","window","undefined","getDocument","win","_a","document","trackDependency","source","observers","add","deps","cleanupDependencies","observer","dep","delete","clear","notifyObservers","Array","from","markDirty","flushEffects","size","effects","effect","run","SignalNode","constructor","value","options","this","subscribers","equals","read","track","write","next","previous","resolved","subscriber","subscribe","callback","immediate","ComputedNode","getter","dirty","initialized","evaluate","current","previousObserver","ReactiveEffect","disposed","queueEffect","cleanup","dispose","signal","initialValue","node","readWrite","arguments","length","get","peek","set","update","updater","subscribeOptions","defineProperty","computed","runner","batch","untrack","isSignal","resolveSignal","configure","sanitizeHTML","store","keys","Reflect","ownKeys","signals","Map","structure","ensureSignal","key","has","bumpStructure","version","setKey","hadKey","snapshot","out","Proxy","$patch","patch","$snapshot","$subscribe","first","target","receiver","_target","deleteProperty","getOwnPropertyDescriptor","prototype","hasOwnProperty","call","enumerable","configurable","resource","loader","data","error","pending","statusValue","loading","status","keepPrevious","controller","refreshId","currentPromise","api","promise","refresh","id","abort","AbortController","Promise","resolve","then","aborted","onSuccess","catch","err","onError","finally","mutate","reason","action","handler","count","pendingCount","generation","submit","args","runGeneration","Math","max","callable","mutableCallable","reset","form","submitAction","onSubmit","event","preventDefault","formElement","currentTarget","getFormElementCtor","ownerWindow","ownerDocument","defaultView","HTMLFormElement","_b","isFormElement","FormElement","Boolean","Error","closest","findForm","result","FormDataCtor","FormData","createFormData","resetOnSuccess","html","strings","values","isTemplateResult","unsafeHTML","sanitizer","sanitize","isUnsafeHTML","String","isNodeLike","nodeType","documentOrThrow","doc","normalizeValue","valueToFragment","fragment","createDocumentFragment","appendValue","parent","isArray","item","appendChild","materializeTemplate","template","createElement","innerHTML","content","cloneNode","createTextNode","bindings","i","part","attrMatch","match","rawName","before","slice","marker","kind","name","push","index","root","comments","walker","createTreeWalker","nextNode","comment","Number","list","binding","markers","replaceWith","attrName","elements","querySelectorAll","element","removeAttribute","applyElementBinding","applyBindings","setAttribute","filter","join","assign","style","classes","toggleAttribute","addEventListener","replaceChildren","maybeTarget","firstChild","removeChild","withViewTransition","enabled","startViewTransition","render","view","mount","found","querySelector","isSelectorObject","resolveTarget","transition","reactive","renderToString","valueToString","map","escapeAttribute","stringifyAttribute","templateToString","outerHTML","escapeHTML","textContent","replace","m","toLowerCase","component","setupOrOptions","maybeOptions","customElements","HTMLElement","definition","setup","attrs","observedAttributes","ItyElement","attrSignals","connectedCallbacks","disconnectedCallbacks","effectRecords","connected","connectedCallback","ensureMount","ctx","createContext","output","renderOutput","startRender","startEffects","disconnectedCallback","renderCleanup","record","handle","attributeChangedCallback","_oldValue","newValue","ensureAttrSignal","renderTarget","shadow","init","mode","shadowRoot","attachShadow","styles","container","getAttribute","host","attr","emit","detail","dispatchEvent","CustomEvent","bubbles","composed","onConnected","onDisconnected","define","Evented","_events","on","evtName","context","off","events","splice","trigger","regexps","nospaces","SelectorObject","nodeList","nodes","reindex","Symbol","iterator","toArray","find","selector","thisNode","elm","indexOf","matches","last","parentElement","children","child","remove","addClass","classList","removeClass","test","toggleClass","toggle","hasClass","some","contains","text","eventName","listener","removeEventListener","_html","after","append","prepend","empty","position","htmls","selNode","insertAdjacentHTML","insertAdjacentElement","fragmentToElement","cloned","htmlContent","forEach","span","onDOMReady","fn","Ity","func","apply","readyState","once","Model","opts","super","floor","random","url","state","_init","initialize","_ajax","request","XMLHttpRequest","method","type","success","resp","open","onload","response","responseText","JSON","parse","onerror","send","stringify","unSet","sync","toJSON","View","delegatedListeners","app","addView","_setElement","elSelector","el","NodeList","_bindDOMEvents","evtObj","captureEvents","evt","capture","includes","_delegateEvent","delegateTarget","getName","renderWith","removeView","select","HTMLDocument","Application","views","getView","Collection","models","ModelClass","model","at","predicate","mapper","fetch","userSuccess","ctor","modelClass","Router","routes","started","check","clickListener","handleLinkClick","navigationListener","handleNavigationEvent","base","linkSelector","notFound","autoStart","start","pattern","URLPatternCtor","URLPattern","globalThis","nativePattern","pathname","exec","href","decodeURIComponent","decodeParams","groups","_err","re","normalized","normalizePath","split","segment","startsWith","RegExp","compilePathPattern","params","createRouteRecord","addRoute","removeRoute","activeRoute","disposeRoute","route","navigate","path","history","normalizedBase","normalizeBase","parsed","URL","search","hash","withBasePath","navigation","stop","location","routePath","stripBasePath","routeUrl","routeParams","query","searchParamsToObject","routeCleanup","anchor","hasAttribute","origin","canIntercept","destination","intercept","normalizedPath","clean","URLSearchParams","paramValue","defaultRouter","router","amd","module","exports"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"ity.min.js","sources":["../Ity.ts"],"sourcesContent":["// Ity.ts 2.2.0\n// (c) 2026 Dominic Cocchiarella\n// Tiny dependency-free reactive app kernel with V1 MVC compatibility.\ndeclare var define: any;\ndeclare var module: any;\n\ntype Cleanup = () => void;\ntype Equality = (prev: T, next: T) => boolean;\ntype Subscriber = (value: T, previous: T) => void;\ntype MaybeSignal = T | ReadonlySignal;\ntype TemplateValue =\n | TemplateResult\n | UnsafeHTML\n | Node\n | string\n | number\n | boolean\n | null\n | undefined\n | TemplateValue[]\n | ReadonlySignal;\n\ninterface ReadonlySignal {\n (): T;\n get(): T;\n peek(): T;\n subscribe(callback: Subscriber, options?: { immediate?: boolean }): Cleanup;\n readonly isSignal: true;\n}\n\ninterface Signal extends ReadonlySignal {\n (next: T | ((previous: T) => T)): T;\n set(next: T | ((previous: T) => T)): T;\n update(updater: (previous: T) => T): T;\n}\n\ninterface ReactiveSource {\n observers: Set;\n}\n\ninterface ReactiveObserver {\n deps: Set;\n markDirty(): void;\n}\n\ninterface ComputedOptions {\n equals?: Equality;\n}\n\ninterface SignalOptions {\n equals?: Equality;\n name?: string;\n}\n\ninterface EffectHandle {\n (): void;\n dispose(): void;\n}\n\ninterface TemplateResult {\n readonly isTemplateResult: true;\n readonly strings: readonly string[];\n readonly values: readonly unknown[];\n}\n\ninterface UnsafeHTML {\n readonly isUnsafeHTML: true;\n readonly value: string;\n}\n\ntype HTMLSanitizer = (value: string) => string;\n\ninterface UnsafeHTMLOptions {\n sanitize?: HTMLSanitizer;\n config?: ItyConfig | null;\n}\n\ninterface ItyConfig {\n sanitizeHTML?: HTMLSanitizer | null;\n}\n\ninterface RenderOptions {\n reactive?: boolean;\n transition?: boolean;\n config?: ItyConfig | null;\n}\n\ntype StoreKey = string | symbol;\n\ninterface StoreApi> {\n $patch(patch: Partial | ((current: T) => Partial | void)): void;\n $snapshot(): T;\n $subscribe(callback: (value: T) => void, options?: { immediate?: boolean }): Cleanup;\n}\n\ntype Store> = T & StoreApi;\n\ntype AsyncStatus = \"idle\" | \"loading\" | \"success\" | \"error\";\n\ninterface ResourceContext {\n signal: AbortSignal;\n previous: T | undefined;\n refreshId: number;\n}\n\ninterface ResourceOptions {\n initialValue?: T;\n immediate?: boolean;\n keepPrevious?: boolean;\n onSuccess?: (value: T) => void;\n onError?: (error: E) => void;\n}\n\ninterface Resource {\n readonly data: Signal;\n readonly error: Signal;\n readonly loading: ReadonlySignal;\n readonly status: ReadonlySignal;\n readonly promise: Promise | null;\n refresh(): Promise;\n mutate(value: T | undefined): void;\n abort(reason?: unknown): void;\n}\n\ninterface ActionOptions {\n onSuccess?: (value: TResult) => void;\n onError?: (error: E) => void;\n}\n\ninterface Action {\n (...args: TArgs): Promise;\n submit(...args: TArgs): Promise;\n run(...args: TArgs): void;\n with(...args: TArgs): (...eventArgs: unknown[]) => void;\n from(mapper: (event: TEvent) => TArgs): (event: TEvent) => void;\n readonly data: Signal;\n readonly error: Signal;\n readonly pending: ReadonlySignal;\n readonly pendingCount: ReadonlySignal;\n readonly status: ReadonlySignal;\n reset(): void;\n}\n\ninterface FormController {\n readonly action: Action<[FormData, Event], TResult, E>;\n readonly data: Signal;\n readonly error: Signal;\n readonly pending: ReadonlySignal;\n readonly status: ReadonlySignal;\n onSubmit(event: Event): Promise;\n handleSubmit(event: Event): void;\n reset(): void;\n}\n\ninterface FormOptions extends ActionOptions {\n resetOnSuccess?: boolean;\n}\n\ntype FormErrorMap> = Partial, string>>;\n\ninterface FormBindOptions {\n type?: \"text\" | \"textarea\" | \"select\" | \"select-multiple\" | \"checkbox\" | \"radio\" | \"number\";\n event?: string;\n name?: string;\n value?: unknown;\n parse?: (value: unknown, event: Event) => T;\n format?: (value: T) => unknown;\n}\n\ninterface FormStateOptions> {\n validators?: Partial<{ [K in keyof TValues]: (value: TValues[K], values: TValues) => string | null | undefined }>;\n validate?: (values: TValues) => FormErrorMap | void;\n}\n\ninterface FormField {\n readonly value: Signal;\n readonly error: ReadonlySignal;\n readonly touched: ReadonlySignal;\n readonly dirty: ReadonlySignal;\n bind(options?: FormBindOptions): Record;\n set(next: T | ((previous: T) => T)): T;\n reset(): void;\n}\n\ninterface FormStateSubmitOptions extends ActionOptions {\n resetOnSuccess?: boolean;\n}\n\ninterface FormStateController, TResult, E = unknown> {\n readonly state: FormState;\n readonly action: Action<[TValues, Event], TResult, E>;\n readonly data: Signal;\n readonly error: Signal;\n readonly pending: ReadonlySignal;\n readonly status: ReadonlySignal;\n onSubmit(event: Event): Promise;\n handleSubmit(event: Event): void;\n reset(): void;\n}\n\ninterface FormState> {\n readonly values: Store;\n readonly initialValues: ReadonlySignal;\n readonly errors: Store>;\n readonly touched: Store, boolean>>>;\n readonly dirty: ReadonlySignal;\n readonly valid: ReadonlySignal;\n field(name: K): FormField;\n bind(name: K, options?: FormBindOptions): Record;\n set(next: Partial | ((current: TValues) => Partial | void)): void;\n reset(next?: Partial | TValues): void;\n validate(names?: readonly (keyof TValues)[]): boolean;\n markTouched(names?: readonly (keyof TValues)[]): void;\n submit(\n handler: (values: TValues, event: Event) => Promise | TResult,\n options?: FormStateSubmitOptions\n ): FormStateController;\n}\n\ninterface RenderToStringOptions {\n config?: ItyConfig | null;\n}\n\ninterface RegisteredFormBinding {\n domName: string;\n type: NonNullable[\"type\"]> | \"text\";\n value?: unknown;\n parse?: (value: unknown, event: Event) => T;\n}\n\nconst defaultEquals = Object.is;\nlet activeObserver: ReactiveObserver | null = null;\nlet batchDepth = 0;\nconst pendingEffects = new Set();\nlet configuredSanitizeHTML: HTMLSanitizer | undefined;\nconst activeConfigStack: Array = [];\n\nfunction getWindow(): (Window & typeof globalThis) | undefined {\n return typeof window !== \"undefined\" ? window : undefined;\n}\n\nfunction getDocument(): Document | undefined {\n const win = getWindow();\n return win?.document ?? (typeof document !== \"undefined\" ? document : undefined);\n}\n\nfunction hasOwn(target: object, key: PropertyKey): boolean {\n return Object.prototype.hasOwnProperty.call(target, key);\n}\n\nfunction isPlainObject(value: unknown): value is Record {\n if (!value || typeof value !== \"object\") return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\nfunction cloneValue(value: T): T {\n const cloneFn = (globalThis as any).structuredClone;\n if (typeof cloneFn === \"function\") return cloneFn(value);\n if (Array.isArray(value)) return value.map((item) => cloneValue(item)) as T;\n if (isPlainObject(value)) {\n const out: Record = {};\n for (const key of Reflect.ownKeys(value)) {\n out[key as any] = cloneValue((value as any)[key]);\n }\n return out as T;\n }\n return value;\n}\n\nfunction deepEqual(left: unknown, right: unknown): boolean {\n if (Object.is(left, right)) return true;\n if (Array.isArray(left) && Array.isArray(right)) {\n if (left.length !== right.length) return false;\n for (let i = 0; i < left.length; i += 1) {\n if (!deepEqual(left[i], right[i])) return false;\n }\n return true;\n }\n if (isPlainObject(left) && isPlainObject(right)) {\n const leftKeys = Reflect.ownKeys(left);\n const rightKeys = Reflect.ownKeys(right);\n if (leftKeys.length !== rightKeys.length) return false;\n for (const key of leftKeys) {\n if (!rightKeys.includes(key)) return false;\n if (!deepEqual((left as any)[key], (right as any)[key])) return false;\n }\n return true;\n }\n return false;\n}\n\nfunction currentConfig(): ItyConfig | null {\n return activeConfigStack.length ? activeConfigStack[activeConfigStack.length - 1] : null;\n}\n\nfunction withConfig(config: ItyConfig | null | undefined, callback: () => T): T {\n activeConfigStack.push(config || null);\n try {\n return callback();\n } finally {\n activeConfigStack.pop();\n }\n}\n\nfunction resolveSanitizeHTML(options: UnsafeHTMLOptions = {}): HTMLSanitizer | undefined {\n if (options.sanitize) return options.sanitize;\n const scoped = options.config ?? currentConfig();\n if (scoped && hasOwn(scoped, \"sanitizeHTML\")) {\n return scoped.sanitizeHTML || undefined;\n }\n return configuredSanitizeHTML;\n}\n\nfunction trackDependency(source: ReactiveSource): void {\n if (!activeObserver) return;\n source.observers.add(activeObserver);\n activeObserver.deps.add(source);\n}\n\nfunction cleanupDependencies(observer: ReactiveObserver): void {\n for (const dep of observer.deps) {\n dep.observers.delete(observer);\n }\n observer.deps.clear();\n}\n\nfunction notifyObservers(source: ReactiveSource): void {\n for (const observer of Array.from(source.observers)) {\n observer.markDirty();\n }\n}\n\nfunction flushEffects(): void {\n if (batchDepth > 0) return;\n while (pendingEffects.size) {\n const effects = Array.from(pendingEffects);\n pendingEffects.clear();\n for (const effect of effects) {\n effect.run();\n }\n }\n}\n\nfunction queueEffect(effect: ReactiveEffect): void {\n pendingEffects.add(effect);\n flushEffects();\n}\n\nclass SignalNode implements ReactiveSource {\n observers = new Set();\n private subscribers = new Set>();\n private value: T;\n private equals: Equality;\n\n constructor(value: T, options: SignalOptions = {}) {\n this.value = value;\n this.equals = options.equals || defaultEquals;\n }\n\n read(track = true): T {\n if (track) trackDependency(this);\n return this.value;\n }\n\n write(next: T | ((previous: T) => T)): T {\n const previous = this.value;\n const resolved = typeof next === \"function\"\n ? (next as (previous: T) => T)(previous)\n : next;\n if (this.equals(previous, resolved)) return previous;\n this.value = resolved;\n notifyObservers(this);\n for (const subscriber of Array.from(this.subscribers)) {\n subscriber(resolved, previous);\n }\n flushEffects();\n return resolved;\n }\n\n subscribe(callback: Subscriber, options: { immediate?: boolean } = {}): Cleanup {\n this.subscribers.add(callback);\n if (options.immediate) callback(this.value, this.value);\n return () => {\n this.subscribers.delete(callback);\n };\n }\n}\n\nclass ComputedNode implements ReactiveSource, ReactiveObserver {\n observers = new Set();\n deps = new Set();\n private subscribers = new Set>();\n private dirty = true;\n private initialized = false;\n private value!: T;\n private equals: Equality;\n\n constructor(private readonly getter: () => T, options: ComputedOptions = {}) {\n this.equals = options.equals || defaultEquals;\n }\n\n read(track = true): T {\n if (track) trackDependency(this);\n if (this.dirty) this.evaluate();\n return this.value;\n }\n\n markDirty(): void {\n if (this.dirty) return;\n const previous = this.value;\n this.dirty = true;\n notifyObservers(this);\n if (this.subscribers.size) {\n const next = this.read(false);\n if (!this.equals(previous, next)) {\n for (const subscriber of Array.from(this.subscribers)) {\n subscriber(next, previous);\n }\n }\n }\n }\n\n subscribe(callback: Subscriber, options: { immediate?: boolean } = {}): Cleanup {\n this.subscribers.add(callback);\n if (options.immediate) {\n const current = this.read(false);\n callback(current, current);\n }\n return () => {\n this.subscribers.delete(callback);\n };\n }\n\n private evaluate(): void {\n cleanupDependencies(this);\n const previousObserver = activeObserver;\n activeObserver = this;\n try {\n this.value = this.getter();\n this.dirty = false;\n this.initialized = true;\n } finally {\n activeObserver = previousObserver;\n }\n }\n}\n\nclass ReactiveEffect implements ReactiveObserver {\n deps = new Set();\n private disposed = false;\n private cleanup?: Cleanup;\n\n constructor(private readonly callback: (onCleanup: (cleanup: Cleanup) => void) => void) {\n this.run();\n }\n\n markDirty(): void {\n if (!this.disposed) queueEffect(this);\n }\n\n run(): void {\n if (this.disposed) return;\n cleanupDependencies(this);\n if (this.cleanup) {\n const cleanup = this.cleanup;\n this.cleanup = undefined;\n cleanup();\n }\n const previousObserver = activeObserver;\n activeObserver = this;\n try {\n this.callback((cleanup) => {\n this.cleanup = cleanup;\n });\n } finally {\n activeObserver = previousObserver;\n }\n }\n\n dispose(): void {\n if (this.disposed) return;\n this.disposed = true;\n cleanupDependencies(this);\n if (this.cleanup) {\n const cleanup = this.cleanup;\n this.cleanup = undefined;\n cleanup();\n }\n pendingEffects.delete(this);\n }\n}\n\nfunction signal(initialValue: T, options: SignalOptions = {}): Signal {\n const node = new SignalNode(initialValue, options);\n const readWrite = function (next?: T | ((previous: T) => T)): T {\n if (arguments.length === 0) return node.read(true);\n return node.write(next as T | ((previous: T) => T));\n } as Signal;\n readWrite.get = () => node.read(true);\n readWrite.peek = () => node.read(false);\n readWrite.set = (next) => node.write(next);\n readWrite.update = (updater) => node.write(updater);\n readWrite.subscribe = (callback, subscribeOptions) => node.subscribe(callback, subscribeOptions);\n Object.defineProperty(readWrite, \"isSignal\", { value: true });\n return readWrite;\n}\n\nfunction computed(getter: () => T, options: ComputedOptions = {}): ReadonlySignal {\n const node = new ComputedNode(getter, options);\n const read = function (): T {\n return node.read(true);\n } as ReadonlySignal;\n read.get = () => node.read(true);\n read.peek = () => node.read(false);\n read.subscribe = (callback, subscribeOptions) => node.subscribe(callback, subscribeOptions);\n Object.defineProperty(read, \"isSignal\", { value: true });\n return read;\n}\n\nfunction effect(callback: (onCleanup: (cleanup: Cleanup) => void) => void): EffectHandle {\n const runner = new ReactiveEffect(callback);\n const dispose = (() => runner.dispose()) as EffectHandle;\n dispose.dispose = dispose;\n return dispose;\n}\n\nfunction batch(callback: () => T): T {\n batchDepth += 1;\n try {\n return callback();\n } finally {\n batchDepth -= 1;\n flushEffects();\n }\n}\n\nfunction untrack(callback: () => T): T {\n const previousObserver = activeObserver;\n activeObserver = null;\n try {\n return callback();\n } finally {\n activeObserver = previousObserver;\n }\n}\n\nfunction isSignal(value: unknown): value is ReadonlySignal {\n return typeof value === \"function\" && (value as any).isSignal === true;\n}\n\nfunction resolveSignal(value: MaybeSignal): T {\n return isSignal(value) ? value() : value;\n}\n\nfunction configure(options: ItyConfig = {}): void {\n configuredSanitizeHTML = options.sanitizeHTML || undefined;\n}\n\nfunction createConfig(options: ItyConfig = {}): ItyConfig {\n const config: ItyConfig = {};\n if (hasOwn(options, \"sanitizeHTML\")) config.sanitizeHTML = options.sanitizeHTML ?? null;\n return config;\n}\n\nfunction store>(initialValue: T): Store {\n const keys = new Set(Reflect.ownKeys(initialValue));\n const signals = new Map>();\n const structure = signal(0);\n\n const ensureSignal = (key: StoreKey): Signal => {\n if (!signals.has(key)) {\n signals.set(key, signal((initialValue as any)[key]));\n }\n return signals.get(key)!;\n };\n\n const bumpStructure = (): void => {\n structure.update((version) => version + 1);\n };\n\n const setKey = (key: StoreKey, value: any): void => {\n const hadKey = keys.has(key);\n if (!hadKey) keys.add(key);\n ensureSignal(key).set(value);\n if (!hadKey) bumpStructure();\n };\n\n const snapshot = (): T => {\n structure();\n const out: any = {};\n for (const key of keys) {\n out[key] = ensureSignal(key)();\n }\n return out as T;\n };\n\n const api: StoreApi = {\n $patch(patch) {\n const current = snapshot();\n const next = typeof patch === \"function\" ? patch(current) : patch;\n if (!next) return;\n batch(() => {\n for (const key of Reflect.ownKeys(next)) {\n setKey(key, (next as any)[key]);\n }\n });\n },\n $snapshot: snapshot,\n $subscribe(callback, options = {}) {\n let first = true;\n return effect(() => {\n const value = snapshot();\n if (first && !options.immediate) {\n first = false;\n return;\n }\n first = false;\n callback(value);\n });\n }\n };\n\n return new Proxy(api as Store, {\n get(target, key, receiver) {\n if (key in target) return Reflect.get(target, key, receiver);\n return ensureSignal(key)();\n },\n set(_target, key, value) {\n batch(() => {\n setKey(key, value);\n });\n return true;\n },\n deleteProperty(_target, key) {\n if (!keys.has(key)) return true;\n keys.delete(key);\n batch(() => {\n ensureSignal(key).set(undefined);\n bumpStructure();\n });\n return true;\n },\n ownKeys(target) {\n structure();\n return Array.from(new Set([...Reflect.ownKeys(target), ...keys]));\n },\n getOwnPropertyDescriptor(target, key) {\n structure();\n if (Object.prototype.hasOwnProperty.call(target, key)) {\n return { ...Reflect.getOwnPropertyDescriptor(target, key)!, enumerable: false };\n }\n if (!keys.has(key)) return undefined;\n return { enumerable: true, configurable: true };\n },\n has(target, key) {\n structure();\n return key in target || keys.has(key);\n }\n });\n}\n\nfunction resource(\n loader: (context: ResourceContext) => Promise | T,\n options: ResourceOptions = {}\n): Resource {\n const data = signal(options.initialValue);\n const error = signal(null);\n const pending = signal(false);\n const statusValue = signal(options.initialValue === undefined ? \"idle\" : \"success\");\n const loading = computed(() => pending());\n const status = computed(() => statusValue());\n const keepPrevious = options.keepPrevious !== false;\n let controller: AbortController | null = null;\n let refreshId = 0;\n let currentPromise: Promise | null = null;\n\n const api: Resource = {\n data,\n error,\n loading,\n status,\n get promise() {\n return currentPromise;\n },\n refresh() {\n refreshId += 1;\n const id = refreshId;\n if (controller) controller.abort();\n controller = new AbortController();\n const signal = controller.signal;\n const previous = data.peek();\n pending.set(true);\n statusValue.set(\"loading\");\n error.set(null);\n if (!keepPrevious) data.set(undefined);\n\n currentPromise = Promise.resolve()\n .then(() => loader({ signal, previous, refreshId: id }))\n .then((value) => {\n if (id !== refreshId || signal.aborted) return data.peek();\n data.set(value);\n error.set(null);\n statusValue.set(\"success\");\n options.onSuccess?.(value);\n return value;\n })\n .catch((err) => {\n if (id !== refreshId) return data.peek();\n error.set(err as E);\n statusValue.set(\"error\");\n options.onError?.(err as E);\n return data.peek();\n })\n .finally(() => {\n if (id === refreshId) {\n pending.set(false);\n controller = null;\n }\n });\n\n return currentPromise;\n },\n mutate(value) {\n refreshId += 1;\n if (controller) controller.abort();\n controller = null;\n currentPromise = null;\n data.set(value);\n error.set(null);\n pending.set(false);\n statusValue.set(value === undefined ? \"idle\" : \"success\");\n },\n abort(reason?: unknown) {\n if (!controller) return;\n refreshId += 1;\n controller.abort(reason);\n controller = null;\n currentPromise = null;\n pending.set(false);\n statusValue.set(data.peek() === undefined ? \"idle\" : \"success\");\n }\n };\n\n if (options.immediate !== false) {\n api.refresh();\n }\n\n return api;\n}\n\nfunction action(\n handler: (...args: TArgs) => Promise | TResult,\n options: ActionOptions = {}\n): Action {\n const data = signal(undefined);\n const error = signal(null);\n const count = signal(0);\n const statusValue = signal(\"idle\");\n const pending = computed(() => count() > 0);\n const pendingCount = computed(() => count());\n const status = computed(() => statusValue());\n let generation = 0;\n\n const submit = (...args: TArgs): Promise => {\n const runGeneration = generation;\n count.update((value) => value + 1);\n statusValue.set(\"loading\");\n error.set(null);\n\n return Promise.resolve()\n .then(() => handler(...args))\n .then((value) => {\n if (runGeneration === generation) {\n data.set(value);\n error.set(null);\n options.onSuccess?.(value);\n if (count.peek() <= 1) statusValue.set(\"success\");\n }\n return value;\n })\n .catch((err) => {\n if (runGeneration === generation) {\n error.set(err as E);\n options.onError?.(err as E);\n if (count.peek() <= 1) statusValue.set(\"error\");\n }\n throw err;\n })\n .finally(() => {\n if (runGeneration !== generation) return;\n count.update((value) => Math.max(0, value - 1));\n if (count.peek() > 0) statusValue.set(\"loading\");\n });\n };\n\n const callable = ((...args: TArgs) => submit(...args)) as Action;\n const mutableCallable = callable as Action & {\n submit: (...args: TArgs) => Promise;\n run: (...args: TArgs) => void;\n with: (...args: TArgs) => (...eventArgs: unknown[]) => void;\n from: (mapper: (event: TEvent) => TArgs) => (event: TEvent) => void;\n data: Signal;\n error: Signal;\n pending: ReadonlySignal;\n pendingCount: ReadonlySignal;\n status: ReadonlySignal;\n };\n mutableCallable.submit = submit;\n mutableCallable.run = (...args: TArgs) => {\n submit(...args).catch(() => undefined);\n };\n mutableCallable.with = (...args: TArgs) => {\n return () => {\n mutableCallable.run(...args);\n };\n };\n mutableCallable.from = (mapper: (event: TEvent) => TArgs) => {\n return (event: TEvent) => {\n mutableCallable.run(...mapper(event));\n };\n };\n mutableCallable.data = data;\n mutableCallable.error = error;\n mutableCallable.pending = pending;\n mutableCallable.pendingCount = pendingCount;\n mutableCallable.status = status;\n callable.reset = () => {\n generation += 1;\n data.set(undefined);\n error.set(null);\n count.set(0);\n statusValue.set(\"idle\");\n };\n return callable;\n}\n\nfunction getFormElementCtor(node: Element | null): typeof HTMLFormElement | undefined {\n const ownerWindow = node?.ownerDocument?.defaultView as (Window & typeof globalThis) | null | undefined;\n return ownerWindow?.HTMLFormElement\n || getWindow()?.HTMLFormElement\n || (typeof HTMLFormElement !== \"undefined\" ? HTMLFormElement : undefined);\n}\n\nfunction isFormElement(node: Element | null | undefined, fallbackNode?: Element | null): node is HTMLFormElement {\n const FormElement = node ? getFormElementCtor(node) : getFormElementCtor(fallbackNode || null);\n return Boolean(node && FormElement && node instanceof FormElement);\n}\n\nfunction findFormElement(event: Event): HTMLFormElement {\n const target = (event.currentTarget || event.target) as Element | null;\n if (!getFormElementCtor(target)) throw new Error(\"Ity.form requires HTMLFormElement support\");\n if (isFormElement(target, target)) return target;\n const closest = target?.closest?.(\"form\");\n if (isFormElement(closest, target)) return closest;\n throw new Error(\"Ity.form onSubmit requires a form event target\");\n}\n\nfunction createFormDataForElement(formElement: HTMLFormElement): FormData {\n const ownerWindow = formElement.ownerDocument?.defaultView as (Window & typeof globalThis) | null | undefined;\n const FormDataCtor = ownerWindow?.FormData\n || getWindow()?.FormData\n || (typeof FormData !== \"undefined\" ? FormData : undefined);\n if (!FormDataCtor) throw new Error(\"Ity.form requires FormData support\");\n return new FormDataCtor(formElement);\n}\n\nfunction form(\n handler: (data: FormData, event: Event) => Promise | TResult,\n options: FormOptions = {}\n): FormController {\n const submitAction = action<[FormData, Event], TResult, E>(handler, options);\n\n const onSubmit = async (event: Event): Promise => {\n event.preventDefault();\n const formElement = findFormElement(event);\n const result = await submitAction(createFormDataForElement(formElement), event);\n if (options.resetOnSuccess) formElement.reset();\n return result;\n };\n\n return {\n action: submitAction,\n data: submitAction.data,\n error: submitAction.error,\n pending: submitAction.pending,\n status: submitAction.status,\n onSubmit,\n handleSubmit(event: Event): void {\n onSubmit(event).catch(() => undefined);\n },\n reset() {\n submitAction.reset();\n }\n };\n}\n\nfunction replaceStoreSnapshot>(target: Store, nextValue: Partial): void {\n const current = target.$snapshot() as Record;\n batch(() => {\n for (const key of Reflect.ownKeys(current)) {\n if (!hasOwn(nextValue as object, key)) delete (target as any)[key];\n }\n for (const key of Reflect.ownKeys(nextValue)) {\n (target as any)[key] = (nextValue as any)[key];\n }\n });\n}\n\nfunction formState>(\n initialValue: TValues,\n options: FormStateOptions = {}\n): FormState {\n const values = store(cloneValue(initialValue));\n const initialValues = signal(cloneValue(initialValue));\n const errors = store({} as FormErrorMap);\n const touched = store({} as Partial, boolean>>);\n const registeredBindings = new Map, Map>>();\n\n const allFieldNames = (): Array> => {\n const names = new Set();\n Reflect.ownKeys(initialValues.peek()).forEach((key) => names.add(String(key)));\n Reflect.ownKeys(values.$snapshot()).forEach((key) => names.add(String(key)));\n return Array.from(names) as Array>;\n };\n\n const computeErrors = (snapshot: TValues): FormErrorMap => {\n const out: FormErrorMap = {};\n const validators = options.validators || {};\n for (const key of allFieldNames()) {\n const validator = (validators as any)[key] as ((value: TValues[keyof TValues], values: TValues) => string | null | undefined) | undefined;\n if (!validator) continue;\n const message = validator((snapshot as any)[key], snapshot);\n if (message) out[key] = message;\n }\n const formErrors = options.validate?.(snapshot);\n if (formErrors) {\n for (const key of Reflect.ownKeys(formErrors)) {\n const message = (formErrors as any)[key];\n if (message) (out as any)[key] = message;\n }\n }\n return out;\n };\n\n const syncErrors = (): boolean => {\n const nextErrors = computeErrors(values.$snapshot());\n replaceStoreSnapshot(errors as any, nextErrors);\n return Reflect.ownKeys(nextErrors).length === 0;\n };\n\n const markTouched = (names?: readonly (keyof TValues)[]): void => {\n const keys = names?.length\n ? names.map((name) => String(name))\n : allFieldNames();\n batch(() => {\n for (const key of keys) {\n (touched as any)[key] = true;\n }\n });\n };\n\n const maybeValidateTouched = (): void => {\n const touchedSnapshot = touched.$snapshot();\n if (Reflect.ownKeys(touchedSnapshot).some((key) => Boolean((touchedSnapshot as any)[key]))) {\n syncErrors();\n }\n };\n\n const set = (next: Partial | ((current: TValues) => Partial | void)): void => {\n values.$patch((current) => {\n const patch = typeof next === \"function\" ? next(current) : next;\n return patch || {};\n });\n maybeValidateTouched();\n };\n\n const reset = (next?: Partial | TValues): void => {\n const base = cloneValue(next\n ? { ...initialValues.peek(), ...(next as any) }\n : initialValues.peek());\n initialValues.set(cloneValue(base));\n replaceStoreSnapshot(values as any, base);\n replaceStoreSnapshot(errors as any, {});\n replaceStoreSnapshot(touched as any, {});\n };\n\n const createFieldSignal = (name: K): Signal => {\n const signalLike = function (next?: TValues[K] | ((previous: TValues[K]) => TValues[K])): TValues[K] {\n if (arguments.length === 0) return (values as any)[name];\n const previous = (values as any)[name];\n const resolved = typeof next === \"function\"\n ? (next as (previous: TValues[K]) => TValues[K])(previous)\n : next;\n (values as any)[name] = resolved;\n maybeValidateTouched();\n return resolved as TValues[K];\n } as Signal;\n signalLike.get = () => (values as any)[name];\n signalLike.peek = () => untrack(() => (values as any)[name]);\n signalLike.set = (next) => signalLike(next);\n signalLike.update = (updater) => signalLike(updater);\n signalLike.subscribe = (callback, subscribeOptions = {}) => {\n let first = true;\n let previous = signalLike.peek();\n return effect(() => {\n const current = (values as any)[name];\n if (first) {\n first = false;\n previous = current;\n if (subscribeOptions.immediate) callback(current, current);\n return;\n }\n if (!Object.is(previous, current)) {\n const prev = previous;\n previous = current;\n callback(current, prev);\n }\n });\n };\n Object.defineProperty(signalLike, \"isSignal\", { value: true });\n return signalLike;\n };\n\n const registerBinding = (\n name: K,\n domName: string,\n type: RegisteredFormBinding[\"type\"],\n bindOptions: FormBindOptions\n ): void => {\n const fieldName = String(name) as Extract;\n const fieldBindings = registeredBindings.get(fieldName) || new Map>();\n const signature = `${domName}|${type}|${String(bindOptions.value)}`;\n fieldBindings.set(signature, {\n domName,\n type,\n value: bindOptions.value,\n parse: bindOptions.parse\n });\n registeredBindings.set(fieldName, fieldBindings as Map>);\n };\n\n const syncFromForm = (event: Event): void => {\n const NO_FORM_VALUE = Symbol(\"ity.formState.noValue\");\n let formElement: HTMLFormElement;\n try {\n formElement = findFormElement(event);\n } catch (_error) {\n return;\n }\n const formData = createFormDataForElement(formElement);\n const controls = Array.from((formElement as any).elements || []) as Array<{ name?: string; value?: string; checked?: boolean }>;\n const patch: Partial = {};\n\n const resolveControlValue = (\n name: K,\n bindings: RegisteredFormBinding[]\n ): TValues[K] | typeof NO_FORM_VALUE => {\n const primary = bindings[0];\n if (!primary) return NO_FORM_VALUE;\n const domName = primary.domName;\n const namedControls = controls.filter((control) => control && control.name === domName);\n if (primary.parse && namedControls.length) {\n const parseTarget = primary.type === \"radio\"\n ? namedControls.find((control) => Boolean(control.checked)) || namedControls[0]\n : namedControls[0];\n return primary.parse(parseTarget, event);\n }\n if (primary.type === \"checkbox\") {\n const currentValue = (values as any)[name];\n if (Array.isArray(currentValue) || bindings.some((binding) => binding.value !== undefined) || namedControls.length > 1) {\n const selected: unknown[] = [];\n for (const control of namedControls) {\n if (!control.checked) continue;\n const matched = bindings.find((binding) => String(binding.value ?? control.value ?? \"\") === String(control.value ?? \"\"));\n selected.push(matched?.value ?? control.value ?? \"\");\n }\n return selected as TValues[K];\n }\n return formData.has(domName) as TValues[K];\n }\n if (primary.type === \"radio\") {\n return (formData.get(domName) ?? (values as any)[name]) as TValues[K];\n }\n if (primary.type === \"select-multiple\") {\n const select = namedControls[0] as HTMLSelectElement | undefined;\n if (select?.selectedOptions) {\n return Array.from(select.selectedOptions).map((option) => option.value) as TValues[K];\n }\n return formData.getAll(domName) as TValues[K];\n }\n if (primary.type === \"number\") {\n const raw = formData.get(domName);\n return (raw === null || raw === \"\" ? undefined : Number(raw)) as TValues[K];\n }\n const raw = formData.get(domName);\n return (raw === null ? \"\" : raw) as TValues[K];\n };\n\n for (const fieldName of allFieldNames()) {\n const bindings = Array.from(registeredBindings.get(fieldName)?.values() || []) as RegisteredFormBinding]>[];\n const nextValue = resolveControlValue(fieldName, bindings as RegisteredFormBinding[]);\n if (nextValue !== NO_FORM_VALUE) {\n (patch as any)[fieldName] = nextValue;\n }\n }\n\n if (Reflect.ownKeys(patch).length) {\n values.$patch(() => patch);\n }\n };\n\n const bind = (name: K, bindOptions: FormBindOptions = {}): Record => {\n const field = api.field(name);\n const type = bindOptions.type || \"text\";\n const eventName = bindOptions.event\n || (type === \"checkbox\" || type === \"radio\" || type === \"select\" || type === \"select-multiple\" ? \"change\" : \"input\");\n const domName = bindOptions.name || String(name);\n registerBinding(name, domName, type, bindOptions);\n const formattedValue = bindOptions.format ? bindOptions.format(field.value()) : field.value();\n const parseValue = (event: Event): TValues[K] => {\n if (bindOptions.parse) {\n return bindOptions.parse((event.currentTarget || event.target) as unknown, event);\n }\n const target = (event.currentTarget || event.target) as HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement | null;\n if (!target) return field.value();\n if (type === \"checkbox\") {\n if (Array.isArray(field.value())) {\n const optionValue = bindOptions.value ?? target.value;\n const current = field.value() as unknown[];\n return ((target as HTMLInputElement).checked\n ? Array.from(new Set([...current, optionValue]))\n : current.filter((item) => !Object.is(item, optionValue))) as TValues[K];\n }\n return Boolean((target as HTMLInputElement).checked) as TValues[K];\n }\n if (type === \"radio\") {\n if (!(target as HTMLInputElement).checked) return field.value();\n return (bindOptions.value ?? (target as HTMLInputElement).value) as TValues[K];\n }\n if (type === \"select-multiple\") {\n return Array.from((target as HTMLSelectElement).selectedOptions).map((option) => option.value) as TValues[K];\n }\n if (type === \"number\") {\n const raw = target.value;\n return (raw === \"\" ? (undefined as any) : Number(raw)) as TValues[K];\n }\n return target.value as TValues[K];\n };\n\n const binding: Record = {\n name: domName,\n [`@${eventName}`]: (event: Event) => {\n field.set(parseValue(event));\n },\n \"@blur\": () => {\n markTouched([name]);\n syncErrors();\n }\n };\n\n if (type === \"checkbox\") {\n if (Array.isArray(field.value())) {\n const optionValue = bindOptions.value;\n binding.value = optionValue === undefined ? \"\" : String(optionValue);\n binding[\".checked\"] = computed(() => (field.value() as unknown[]).some((item) => Object.is(item, optionValue)));\n } else {\n binding[\".checked\"] = computed(() => Boolean(field.value()));\n binding.checked = Boolean(field.value());\n }\n return binding;\n }\n\n if (type === \"radio\") {\n const optionValue = bindOptions.value;\n binding.value = optionValue === undefined ? \"\" : String(optionValue);\n binding[\".checked\"] = computed(() => Object.is(field.value(), optionValue));\n return binding;\n }\n\n if (type === \"select-multiple\") {\n binding[\".value\"] = formattedValue as any;\n return binding;\n }\n\n const stringValue = formattedValue === undefined || formattedValue === null ? \"\" : String(formattedValue);\n binding[\".value\"] = stringValue;\n binding.value = stringValue;\n return binding;\n };\n\n const api: FormState = {\n values,\n initialValues,\n errors,\n touched,\n dirty: computed(() => !deepEqual(values.$snapshot(), initialValues())),\n valid: computed(() => Reflect.ownKeys(errors.$snapshot()).length === 0),\n field(name: K): FormField {\n const valueSignal = createFieldSignal(name);\n return {\n value: valueSignal,\n error: computed(() => (errors as any)[name] || null),\n touched: computed(() => Boolean((touched as any)[name])),\n dirty: computed(() => !deepEqual((values as any)[name], (initialValues() as any)[name])),\n bind(optionsForField?: FormBindOptions): Record {\n return bind(name, optionsForField);\n },\n set(next) {\n return valueSignal.set(next);\n },\n reset() {\n valueSignal.set((initialValues.peek() as any)[name]);\n delete (errors as any)[name];\n delete (touched as any)[name];\n }\n };\n },\n bind,\n set,\n reset,\n validate(): boolean {\n return syncErrors();\n },\n markTouched,\n submit(\n handler: (snapshot: TValues, event: Event) => Promise | TResult,\n submitOptions: FormStateSubmitOptions = {}\n ): FormStateController {\n const submitAction = action<[TValues, Event], TResult, E>(handler, submitOptions);\n const onSubmit = async (event: Event): Promise => {\n event.preventDefault();\n syncFromForm(event);\n markTouched();\n if (!syncErrors()) return undefined;\n const result = await submitAction(cloneValue(values.$snapshot()), event);\n if (submitOptions.resetOnSuccess) api.reset();\n return result;\n };\n\n return {\n state: api,\n action: submitAction,\n data: submitAction.data,\n error: submitAction.error,\n pending: submitAction.pending,\n status: submitAction.status,\n onSubmit,\n handleSubmit(event: Event): void {\n onSubmit(event).catch(() => undefined);\n },\n reset(): void {\n submitAction.reset();\n api.reset();\n }\n };\n }\n };\n\n return api;\n}\n\nfunction html(strings: TemplateStringsArray | readonly string[], ...values: unknown[]): TemplateResult {\n return {\n isTemplateResult: true,\n strings: Array.from(strings),\n values\n };\n}\n\nfunction unsafeHTML(value: string, options: UnsafeHTMLOptions = {}): UnsafeHTML {\n const sanitizer = resolveSanitizeHTML(options);\n return {\n isUnsafeHTML: true,\n value: sanitizer ? sanitizer(String(value)) : String(value)\n };\n}\n\nfunction isTemplateResult(value: unknown): value is TemplateResult {\n return !!value && typeof value === \"object\" && (value as TemplateResult).isTemplateResult === true;\n}\n\nfunction isUnsafeHTML(value: unknown): value is UnsafeHTML {\n return !!value && typeof value === \"object\" && (value as UnsafeHTML).isUnsafeHTML === true;\n}\n\nfunction isNodeLike(value: unknown): value is Node {\n return !!value && typeof value === \"object\" && typeof (value as Node).nodeType === \"number\";\n}\n\nfunction documentOrThrow(): Document {\n const doc = getDocument();\n if (!doc) throw new Error(\"Ity DOM rendering requires a document\");\n return doc;\n}\n\nfunction normalizeValue(value: unknown): unknown {\n return isSignal(value) ? value() : value;\n}\n\nfunction valueToFragment(value: unknown, doc: Document = documentOrThrow()): DocumentFragment {\n const fragment = doc.createDocumentFragment();\n appendValue(fragment, normalizeValue(value), doc);\n return fragment;\n}\n\nfunction appendValue(parent: Node, value: unknown, doc: Document): void {\n value = normalizeValue(value);\n if (value === null || value === undefined || value === false) return;\n if (Array.isArray(value)) {\n for (const item of value) appendValue(parent, item, doc);\n return;\n }\n if (isTemplateResult(value)) {\n parent.appendChild(materializeTemplate(value, doc));\n return;\n }\n if (isUnsafeHTML(value)) {\n const template = doc.createElement(\"template\");\n template.innerHTML = value.value;\n parent.appendChild(template.content.cloneNode(true));\n return;\n }\n if (isNodeLike(value)) {\n parent.appendChild(value);\n return;\n }\n parent.appendChild(doc.createTextNode(String(value)));\n}\n\ninterface Binding {\n index: number;\n kind: \"node\" | \"event\" | \"attr\" | \"prop\" | \"bool\";\n name?: string;\n}\n\nfunction bindingFromName(rawName: string): Pick {\n const first = rawName[0];\n const kind = first === \"@\" ? \"event\" : first === \".\" ? \"prop\" : first === \"?\" ? \"bool\" : \"attr\";\n const name = kind === \"attr\" ? rawName : rawName.slice(1);\n return { kind, name };\n}\n\nfunction materializeTemplate(result: TemplateResult, doc: Document = documentOrThrow()): DocumentFragment {\n const bindings: Binding[] = [];\n let source = \"\";\n\n for (let i = 0; i < result.values.length; i += 1) {\n const part = result.strings[i] ?? \"\";\n const attrMatch = part.match(/([@.?]?[\\w:-]+)\\s*=\\s*$/);\n if (attrMatch) {\n const rawName = attrMatch[1];\n const before = part.slice(0, part.length - attrMatch[0].length);\n const marker = `data-ity-bind-${i}`;\n const { kind, name } = bindingFromName(rawName);\n bindings.push({ index: i, kind, name });\n source += `${before}${marker}=\"\"`;\n } else {\n bindings.push({ index: i, kind: \"node\" });\n source += `${part}`;\n }\n }\n source += result.strings[result.strings.length - 1] ?? \"\";\n\n const template = doc.createElement(\"template\");\n template.innerHTML = source;\n const fragment = template.content.cloneNode(true) as DocumentFragment;\n applyBindings(fragment, bindings, result.values, doc);\n return fragment;\n}\n\nfunction applyBindings(root: DocumentFragment, bindings: Binding[], values: readonly unknown[], doc: Document): void {\n const comments = new Map();\n const walker = doc.createTreeWalker(root, 128);\n let current = walker.nextNode();\n while (current) {\n const comment = current as Comment;\n const match = comment.data.match(/^ity:(\\d+)$/);\n if (match) {\n const index = Number(match[1]);\n const list = comments.get(index) || [];\n list.push(comment);\n comments.set(index, list);\n }\n current = walker.nextNode();\n }\n\n for (const binding of bindings) {\n const value = normalizeValue(values[binding.index]);\n if (binding.kind === \"node\") {\n const markers = comments.get(binding.index) || [];\n for (const marker of markers) {\n marker.replaceWith(valueToFragment(value, doc));\n }\n continue;\n }\n\n const attrName = `data-ity-bind-${binding.index}`;\n const elements = Array.from(root.querySelectorAll(`[${attrName}]`)) as HTMLElement[];\n for (const element of elements) {\n element.removeAttribute(attrName);\n applyElementBinding(element, binding, value);\n }\n }\n}\n\nfunction applyElementBinding(element: HTMLElement, binding: Binding, value: unknown): void {\n const name = binding.name || \"\";\n if (binding.kind === \"attr\" && name === \"bind\" && isPlainObject(value)) {\n for (const key of Reflect.ownKeys(value)) {\n const entryValue = normalizeValue((value as any)[key]);\n const entry = bindingFromName(String(key));\n applyElementBinding(element, { index: binding.index, ...entry }, entryValue);\n }\n return;\n }\n\n if (binding.kind === \"event\") {\n if (typeof value === \"function\") {\n element.addEventListener(name, value as EventListener);\n } else if (Array.isArray(value) && typeof value[0] === \"function\") {\n element.addEventListener(name, value[0] as EventListener, value[1] as AddEventListenerOptions);\n }\n return;\n }\n\n if (binding.kind === \"prop\") {\n if (name === \"value\" && Array.isArray(value) && element.tagName === \"SELECT\" && (element as HTMLSelectElement).multiple) {\n const selectedValues = new Set(value.map((entry) => String(entry)));\n Array.from((element as HTMLSelectElement).options).forEach((option) => {\n option.selected = selectedValues.has(option.value);\n });\n return;\n }\n (element as any)[name] = value;\n return;\n }\n\n if (binding.kind === \"bool\") {\n element.toggleAttribute(name, Boolean(value));\n return;\n }\n\n if (value === false || value === null || value === undefined) {\n element.removeAttribute(name);\n return;\n }\n\n if (name === \"class\" && Array.isArray(value)) {\n element.setAttribute(\"class\", value.filter(Boolean).join(\" \"));\n return;\n }\n\n if (name === \"class\" && typeof value === \"object\") {\n const classes = Object.keys(value as Record).filter((key) => Boolean((value as any)[key]));\n element.setAttribute(\"class\", classes.join(\" \"));\n return;\n }\n\n if (name === \"style\" && typeof value === \"object\" && value !== null) {\n Object.assign((element as HTMLElement).style, value);\n return;\n }\n\n element.setAttribute(name, value === true ? \"\" : String(value));\n}\n\nfunction resolveTarget(target: string | Element | DocumentFragment | SelectorObject): Element | DocumentFragment {\n if (typeof target === \"string\") {\n const found = documentOrThrow().querySelector(target);\n if (!found) throw new Error(`Render target not found: ${target}`);\n return found;\n }\n if ((target as SelectorObject)?.isSelectorObject) {\n const first = (target as SelectorObject).first()[0];\n if (!first) throw new Error(\"Cannot render into an empty SelectorObject\");\n return first;\n }\n return target as Element | DocumentFragment;\n}\n\nfunction replaceChildren(target: Element | DocumentFragment, fragment: DocumentFragment): void {\n const maybeTarget = target as any;\n if (typeof maybeTarget.replaceChildren === \"function\") {\n maybeTarget.replaceChildren(fragment);\n return;\n }\n while (target.firstChild) target.removeChild(target.firstChild);\n target.appendChild(fragment);\n}\n\nfunction withViewTransition(update: () => void, enabled: boolean | undefined): void {\n const doc = getDocument() as any;\n if (enabled && doc && typeof doc.startViewTransition === \"function\") {\n doc.startViewTransition(update);\n } else {\n update();\n }\n}\n\nfunction render(\n view: TemplateValue | (() => TemplateValue),\n target: string | Element | DocumentFragment | SelectorObject,\n options: RenderOptions = {}\n): Cleanup {\n const mount = resolveTarget(target);\n const update = () => {\n withConfig(options.config, () => {\n const value = typeof view === \"function\" && !isSignal(view)\n ? (view as () => TemplateValue)()\n : normalizeValue(view);\n withViewTransition(() => replaceChildren(mount, valueToFragment(value)), options.transition);\n });\n };\n\n if (options.reactive === false) {\n update();\n return () => undefined;\n }\n\n return effect(update);\n}\n\nfunction renderToString(view: TemplateValue | (() => TemplateValue), options: RenderToStringOptions = {}): string {\n return withConfig(options.config, () => {\n const value = typeof view === \"function\" && !isSignal(view)\n ? (view as () => TemplateValue)()\n : normalizeValue(view);\n return valueToString(value);\n });\n}\n\nfunction valueToString(value: unknown): string {\n value = normalizeValue(value);\n if (value === null || value === undefined || value === false) return \"\";\n if (Array.isArray(value)) return value.map(valueToString).join(\"\");\n if (isTemplateResult(value)) return templateToString(value);\n if (isUnsafeHTML(value)) return value.value;\n if (isNodeLike(value)) {\n const node = value as any;\n if (typeof node.outerHTML === \"string\") return node.outerHTML;\n return escapeHTML(node.textContent || \"\");\n }\n return escapeHTML(String(value));\n}\n\nfunction templateToString(result: TemplateResult): string {\n let source = \"\";\n for (let i = 0; i < result.values.length; i += 1) {\n const part = result.strings[i] ?? \"\";\n const attrMatch = part.match(/([@.?]?[\\w:-]+)\\s*=\\s*$/);\n const value = normalizeValue(result.values[i]);\n if (attrMatch) {\n const rawName = attrMatch[1];\n const before = part.slice(0, part.length - attrMatch[0].length);\n const { kind, name } = bindingFromName(rawName);\n if (kind === \"attr\" && name === \"bind\" && isPlainObject(value)) {\n const serialized: string[] = [];\n for (const key of Reflect.ownKeys(value)) {\n const entryValue = normalizeValue((value as any)[key]);\n const entry = bindingFromName(String(key));\n const entryName = entry.name || \"\";\n if (entry.kind === \"event\" || entryValue === false || entryValue === null || entryValue === undefined) continue;\n if (entry.kind === \"bool\") {\n if (entryValue) serialized.push(entryName);\n continue;\n }\n if (entry.kind === \"prop\") {\n if (entryName === \"value\") {\n serialized.push(`value=\"${escapeAttribute(String(entryValue))}\"`);\n } else if ((entryName === \"checked\" || entryName === \"selected\") && entryValue) {\n serialized.push(entryName);\n }\n continue;\n }\n serialized.push(`${entryName}=\"${escapeAttribute(stringifyAttribute(entryName, entryValue))}\"`);\n }\n source += serialized.length ? `${before}${serialized.join(\" \")}` : before;\n continue;\n }\n if (kind === \"event\" || kind === \"prop\" || value === false || value === null || value === undefined) {\n source += before;\n } else if (kind === \"bool\") {\n source += value ? `${before}${name}` : before;\n } else {\n source += `${before}${name || \"\"}=\"${escapeAttribute(stringifyAttribute(name || \"\", value))}\"`;\n }\n } else {\n source += part + valueToString(value);\n }\n }\n source += result.strings[result.strings.length - 1] ?? \"\";\n return source;\n}\n\nfunction stringifyAttribute(name: string, value: unknown): string {\n if (name === \"class\" && Array.isArray(value)) return value.filter(Boolean).join(\" \");\n if (name === \"class\" && typeof value === \"object\" && value !== null) {\n return Object.keys(value as Record).filter((key) => Boolean((value as any)[key])).join(\" \");\n }\n if (name === \"style\" && typeof value === \"object\" && value !== null) {\n return Object.keys(value as Record)\n .map((key) => `${key.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`)}:${(value as any)[key]}`)\n .join(\";\");\n }\n return value === true ? \"\" : String(value);\n}\n\nfunction escapeHTML(value: string): string {\n return value\n .replace(/&/g, \"&\")\n .replace(//g, \">\");\n}\n\nfunction escapeAttribute(value: string): string {\n return escapeHTML(value)\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n}\n\ninterface ComponentContext {\n host: HTMLElement;\n root: HTMLElement | ShadowRoot;\n attr(name: string): ReadonlySignal;\n prop(name: string): ReadonlySignal;\n emit(name: string, detail?: T, options?: CustomEventInit): boolean;\n effect(callback: (onCleanup: (cleanup: Cleanup) => void) => void): EffectHandle;\n onConnected(callback: () => void): void;\n onDisconnected(callback: () => void): void;\n}\n\ntype ComponentRender = TemplateValue | (() => TemplateValue);\ntype ComponentSetup = (ctx: ComponentContext) => ComponentRender | void;\n\ninterface ComponentOptions {\n attrs?: string[];\n observedAttributes?: string[];\n props?: string[];\n shadow?: boolean | ShadowRootMode | ShadowRootInit;\n styles?: string;\n config?: ItyConfig | null;\n setup?: ComponentSetup;\n}\n\nfunction component(\n name: string,\n setupOrOptions: ComponentSetup | ComponentOptions,\n maybeOptions: Omit = {}\n): CustomElementConstructor {\n const win = getWindow();\n if (!win?.customElements || !win.HTMLElement) {\n throw new Error(\"Ity.component requires Custom Elements support\");\n }\n\n if (win.customElements.get(name)) {\n return win.customElements.get(name)!;\n }\n\n const definition: ComponentOptions = typeof setupOrOptions === \"function\"\n ? { ...maybeOptions, setup: setupOrOptions }\n : setupOrOptions;\n const attrs = definition.observedAttributes || definition.attrs || [];\n const props = definition.props || [];\n\n class ItyElement extends win.HTMLElement {\n static get observedAttributes(): string[] {\n return attrs;\n }\n\n private attrSignals = new Map>();\n private propSignals = new Map>();\n private connectedCallbacks: Cleanup[] = [];\n private disconnectedCallbacks: Cleanup[] = [];\n private effectRecords: Array<{\n callback: (onCleanup: (cleanup: Cleanup) => void) => void;\n handle?: EffectHandle;\n disposed: boolean;\n }> = [];\n private renderCleanup?: Cleanup;\n private mount?: HTMLElement | ShadowRoot;\n private renderTarget?: HTMLElement | ShadowRoot;\n private renderOutput?: ComponentRender;\n private initialized = false;\n private connected = false;\n\n connectedCallback(): void {\n this.ensureMount();\n for (const prop of props) this.upgradeProperty(prop);\n if (!this.initialized) {\n this.initialized = true;\n const ctx = this.createContext();\n const output = definition.setup?.(ctx);\n if (output !== undefined) {\n this.renderOutput = output as ComponentRender;\n }\n }\n this.connected = true;\n this.startRender();\n this.startEffects();\n for (const callback of this.connectedCallbacks) callback();\n }\n\n disconnectedCallback(): void {\n this.connected = false;\n if (this.renderCleanup) {\n this.renderCleanup();\n this.renderCleanup = undefined;\n }\n for (const record of this.effectRecords) {\n record.handle?.dispose();\n record.handle = undefined;\n }\n for (const callback of this.disconnectedCallbacks) callback();\n }\n\n attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null): void {\n this.ensureAttrSignal(name).set(newValue);\n }\n\n private ensureMount(): void {\n if (this.mount && this.renderTarget) return;\n const shadow = definition.shadow;\n if (shadow === false) {\n this.mount = this;\n } else {\n const init: ShadowRootInit = typeof shadow === \"object\"\n ? shadow\n : { mode: shadow === \"closed\" ? \"closed\" : \"open\" };\n this.mount = this.shadowRoot || this.attachShadow(init);\n }\n\n if (definition.styles) {\n const doc = this.ownerDocument;\n const style = doc.createElement(\"style\");\n style.textContent = definition.styles;\n const container = doc.createElement(\"span\");\n container.setAttribute(\"data-ity-component-root\", \"\");\n this.mount.appendChild(style);\n this.mount.appendChild(container);\n this.renderTarget = container;\n } else {\n this.renderTarget = this.mount;\n }\n }\n\n private startRender(): void {\n if (this.renderCleanup || this.renderOutput === undefined) return;\n this.renderCleanup = render(this.renderOutput, this.renderTarget!, {\n transition: false,\n config: definition.config\n });\n }\n\n private startEffects(): void {\n for (const record of this.effectRecords) {\n if (!record.disposed && !record.handle) {\n record.handle = effect(record.callback);\n }\n }\n }\n\n private ensureAttrSignal(name: string): Signal {\n if (!this.attrSignals.has(name)) {\n this.attrSignals.set(name, signal(this.getAttribute(name)));\n }\n return this.attrSignals.get(name)!;\n }\n\n private ensurePropSignal(name: string): Signal {\n if (!this.propSignals.has(name)) {\n this.propSignals.set(name, signal(undefined as unknown) as Signal);\n }\n return this.propSignals.get(name)! as Signal;\n }\n\n private upgradeProperty(name: string): void {\n if (!hasOwn(this, name)) return;\n const value = (this as any)[name];\n delete (this as any)[name];\n (this as any)[name] = value;\n }\n\n private createContext(): ComponentContext {\n return {\n host: this,\n root: this.mount!,\n attr: (name) => this.ensureAttrSignal(name),\n prop: (name: string) => this.ensurePropSignal(name),\n emit: (name, detail, options = {}) => this.dispatchEvent(new CustomEvent(name, {\n bubbles: true,\n composed: true,\n ...options,\n detail\n })),\n effect: (callback) => {\n const record = { callback, disposed: false, handle: undefined as EffectHandle | undefined };\n this.effectRecords.push(record);\n if (this.connected) record.handle = effect(callback);\n const dispose = (() => {\n record.disposed = true;\n record.handle?.dispose();\n record.handle = undefined;\n }) as EffectHandle;\n dispose.dispose = dispose;\n return dispose;\n },\n onConnected: (callback) => {\n this.connectedCallbacks.push(callback);\n },\n onDisconnected: (callback) => {\n this.disconnectedCallbacks.push(callback);\n }\n };\n }\n }\n\n for (const prop of props) {\n Object.defineProperty(ItyElement.prototype, prop, {\n configurable: true,\n enumerable: true,\n get(this: any) {\n return this.ensurePropSignal(prop).peek();\n },\n set(this: any, value: unknown) {\n this.ensurePropSignal(prop).set(typeof value === \"function\" ? (() => value) as any : value);\n }\n });\n }\n\n win.customElements.define(name, ItyElement);\n return ItyElement;\n}\n\ninterface EventRecord {\n callback: (data?: unknown) => void;\n ctx: any;\n}\n\nclass Evented {\n private _events: Record = {};\n\n on(evtName: string, callback: (data?: unknown) => void, context: any = this): void {\n (this._events[evtName] ||= []).push({ callback, ctx: context });\n }\n\n off(evtName?: string, callback?: (data?: unknown) => void, context?: any): void {\n if (!evtName) {\n this._events = {};\n return;\n }\n const events = this._events[evtName];\n if (!events) return;\n if (!callback) {\n delete this._events[evtName];\n return;\n }\n for (let i = events.length - 1; i >= 0; i -= 1) {\n const event = events[i];\n if (event.callback === callback && (context === undefined || event.ctx === context)) {\n events.splice(i, 1);\n }\n }\n if (events.length === 0) delete this._events[evtName];\n }\n\n trigger(evtName: string, data?: unknown): void {\n const events = this._events[evtName];\n if (!events) return;\n for (const event of events.slice()) {\n event.callback.call(event.ctx, data);\n }\n }\n}\n\nconst regexps = {\n nospaces: /^\\S*$/\n} as const;\n\nclass SelectorObject {\n [index: number]: HTMLElement;\n public readonly isSelectorObject = true;\n private nodes: HTMLElement[] = [];\n\n constructor(nodeList: ArrayLike = []) {\n this.nodes = Array.from(nodeList as HTMLElement[]);\n this.reindex();\n }\n\n get length(): number {\n return this.nodes.length;\n }\n\n [Symbol.iterator](): Iterator {\n return this.nodes[Symbol.iterator]();\n }\n\n toArray(): HTMLElement[] {\n return this.nodes.slice();\n }\n\n find(selector: string): SelectorObject {\n const nodeList: HTMLElement[] = [];\n for (const node of this.nodes) {\n const list = node.querySelectorAll(selector);\n for (const thisNode of Array.from(list)) {\n const elm = thisNode as HTMLElement;\n if (nodeList.indexOf(elm) < 0) nodeList.push(elm);\n }\n }\n return new SelectorObject(nodeList);\n }\n\n filter(selector: string): SelectorObject {\n return new SelectorObject(this.nodes.filter((node) => node.matches(selector)));\n }\n\n first(): SelectorObject {\n return new SelectorObject(this.nodes[0] ? [this.nodes[0]] : []);\n }\n\n last(): SelectorObject {\n return new SelectorObject(this.nodes.length ? [this.nodes[this.nodes.length - 1]] : []);\n }\n\n parent(): SelectorObject {\n const nodeList: HTMLElement[] = [];\n for (const node of this.nodes) {\n const parent = node.parentElement;\n if (parent && nodeList.indexOf(parent) < 0) nodeList.push(parent);\n }\n return new SelectorObject(nodeList);\n }\n\n children(selector?: string): SelectorObject {\n const nodeList: HTMLElement[] = [];\n for (const node of this.nodes) {\n for (const child of Array.from(node.children) as HTMLElement[]) {\n if (nodeList.indexOf(child) < 0 && (!selector || child.matches(selector))) {\n nodeList.push(child);\n }\n }\n }\n return new SelectorObject(nodeList);\n }\n\n remove(): SelectorObject {\n for (const node of this.nodes) node.remove();\n return new SelectorObject([]);\n }\n\n addClass(...classes: string[]): this {\n for (const node of this.nodes) node.classList.add(...classes);\n return this;\n }\n\n removeClass(value: string): this {\n if (value && regexps.nospaces.test(value)) {\n for (const node of this.nodes) node.classList.remove(value);\n }\n return this;\n }\n\n toggleClass(value: string): this {\n if (value && regexps.nospaces.test(value)) {\n for (const node of this.nodes) node.classList.toggle(value);\n }\n return this;\n }\n\n hasClass(value: string): boolean {\n return Boolean(value && regexps.nospaces.test(value) && this.nodes.some((node) => node.classList.contains(value)));\n }\n\n attr(name: string, value?: string | number | boolean | null): string | null | this {\n if (arguments.length === 1) return this.nodes[0]?.getAttribute(name) ?? null;\n for (const node of this.nodes) {\n if (value === null || value === false || value === undefined) node.removeAttribute(name);\n else node.setAttribute(name, value === true ? \"\" : String(value));\n }\n return this;\n }\n\n text(value?: string | number | boolean): string | this {\n if (arguments.length === 0) return this.nodes.map((node) => node.textContent || \"\").join(\"\");\n for (const node of this.nodes) node.textContent = String(value);\n return this;\n }\n\n on(eventName: string, listener: EventListener, options?: AddEventListenerOptions): this {\n for (const node of this.nodes) node.addEventListener(eventName, listener, options);\n return this;\n }\n\n off(eventName: string, listener: EventListener, options?: EventListenerOptions): this {\n for (const node of this.nodes) node.removeEventListener(eventName, listener, options);\n return this;\n }\n\n before(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"beforebegin\");\n }\n\n after(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"afterend\");\n }\n\n append(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"beforeend\");\n }\n\n prepend(content: string | SelectorObject | HTMLElement | TemplateResult): this {\n return this._html(content, \"afterbegin\");\n }\n\n html(content?: string | SelectorObject | HTMLElement | TemplateResult): this | string {\n if (arguments.length === 0) return this.nodes[0]?.innerHTML ?? \"\";\n return this._html(content!, \"replace\");\n }\n\n empty(): this {\n for (const node of this.nodes) node.textContent = \"\";\n return this;\n }\n\n private _html(content: string | SelectorObject | HTMLElement | TemplateResult, position: InsertPosition | \"replace\"): this {\n const doc = getDocument();\n for (const node of this.nodes) {\n if ((content as SelectorObject)?.isSelectorObject) {\n const htmls = Array.from(content as SelectorObject).map((selNode) => selNode.outerHTML).join(\"\");\n if (position === \"replace\") node.innerHTML = htmls;\n else node.insertAdjacentHTML(position as InsertPosition, htmls);\n } else if (isTemplateResult(content) && doc) {\n const fragment = materializeTemplate(content, doc);\n if (position === \"replace\") replaceChildren(node, fragment);\n else node.insertAdjacentElement(position as InsertPosition, fragmentToElement(fragment, doc));\n } else if (isNodeLike(content)) {\n const cloned = content.cloneNode(true) as HTMLElement;\n if (position === \"replace\") replaceChildren(node, valueToFragment(cloned, doc || node.ownerDocument));\n else node.insertAdjacentElement(position as InsertPosition, cloned);\n } else {\n const htmlContent = String(content);\n if (position === \"replace\") node.innerHTML = htmlContent;\n else node.insertAdjacentHTML(position as InsertPosition, htmlContent);\n }\n }\n return this;\n }\n\n private reindex(): void {\n for (const key of Object.keys(this)) {\n if (/^\\d+$/.test(key)) delete (this as any)[key];\n }\n this.nodes.forEach((node, index) => {\n (this as any)[index] = node;\n });\n }\n}\n\nfunction fragmentToElement(fragment: DocumentFragment, doc: Document): HTMLElement {\n const span = doc.createElement(\"span\");\n span.appendChild(fragment);\n return span;\n}\n\nfunction onDOMReady(fn: (...args: any[]) => void, args: unknown[] = [], context: any = Ity): void {\n const doc = getDocument();\n const func = () => fn.apply(context, args);\n if (!doc || doc.readyState !== \"loading\") func();\n else doc.addEventListener(\"DOMContentLoaded\", func, { once: true });\n}\n\ninterface AjaxOptions {\n url?: string;\n type?: string;\n data?: unknown;\n success?: (resp: any) => void;\n error?: (status?: number, error?: unknown) => void;\n}\n\nclass Model = Record> extends Evented {\n public id!: string;\n public data!: T;\n public url!: string;\n public readonly state: Signal;\n\n constructor(opts: Partial> = {}) {\n super();\n Object.assign(this, opts);\n this.id ||= `m${Math.floor(Math.random() * 100000) + 1}`;\n this.data ||= {} as T;\n this.url ||= \"\";\n this.state = signal(this.data);\n this._init(opts);\n }\n\n onDOMReady = onDOMReady;\n\n protected _init(opts?: Partial>): void {\n this.initialize(opts);\n }\n\n protected _ajax(opts: AjaxOptions = {}): void {\n const request = new XMLHttpRequest();\n const method = opts.type || \"GET\";\n const url = opts.url || this.url;\n const success = opts.success || function (this: Model, resp: any) {\n this.data = resp;\n this.state.set(resp);\n };\n const error = opts.error || function () { };\n request.open(method, url, true);\n request.onload = () => {\n if (request.status >= 200 && request.status < 400) {\n try {\n const response = request.responseText ? JSON.parse(request.responseText) : null;\n success.call(this, response);\n } catch (err) {\n error.call(this, request.status, err);\n }\n } else {\n error.call(this, request.status);\n }\n };\n request.onerror = () => error.call(this);\n request.send(opts.data === undefined ? undefined : JSON.stringify(opts.data));\n }\n\n initialize(options?: Partial>): void { }\n\n get(attr?: keyof T): any {\n const current = this.data;\n if (!attr) return current;\n return current ? (current as any)[attr as string] : undefined;\n }\n\n set(attr: keyof T | Partial, value?: any): void {\n const current = this.state.peek() || {} as T;\n const next = typeof attr === \"string\"\n ? { ...(current as any), [attr]: value } as T\n : attr as T;\n this.data = next;\n this.state.set(next);\n this.trigger(\"change\", this.data);\n }\n\n unSet(attr: keyof T): void {\n const current = this.state.peek();\n if (!current || !Object.prototype.hasOwnProperty.call(current, attr)) return;\n const next = { ...(current as any) };\n delete next[attr as string];\n this.data = next as T;\n this.state.set(this.data);\n this.trigger(\"change\", this.data);\n }\n\n clear(): void {\n this.data = {} as T;\n this.state.set(this.data);\n this.trigger(\"change\", this.data);\n }\n\n subscribe(callback: Subscriber, options?: { immediate?: boolean }): Cleanup {\n return this.state.subscribe(callback, options);\n }\n\n sync(opts?: AjaxOptions): void {\n this._ajax(opts);\n }\n\n toJSON(): T {\n return this.get();\n }\n}\n\ninterface ViewEvents {\n [selector: string]: Record;\n}\n\ninterface ViewOptions {\n el?: string | SelectorObject | NodeList | HTMLElement;\n app?: Application;\n name?: string;\n events?: ViewEvents;\n [key: string]: any;\n}\n\nclass View extends Evented {\n public id!: string;\n public el!: SelectorObject;\n public app?: Application;\n public name?: string;\n public events!: ViewEvents;\n private renderCleanup?: Cleanup;\n private delegatedListeners: Cleanup[] = [];\n\n constructor(opts: ViewOptions = {}) {\n super();\n Object.assign(this, opts);\n this.id ||= `v${Math.floor(Math.random() * 100000) + 1}`;\n if (this.app) this.app.addView(this);\n this.events ||= {};\n onDOMReady(this._init, [opts], this);\n }\n\n private _setElement(elSelector: ViewOptions[\"el\"]): void {\n const win = getWindow();\n if ((elSelector as SelectorObject)?.isSelectorObject) {\n this.el = elSelector as SelectorObject;\n } else if (win?.NodeList && elSelector instanceof win.NodeList) {\n this.el = new SelectorObject(elSelector as any);\n } else if (typeof elSelector === \"string\") {\n this.el = new SelectorObject(documentOrThrow().querySelectorAll(elSelector) as any);\n } else if (win?.HTMLElement && elSelector instanceof win.HTMLElement) {\n this.el = new SelectorObject([elSelector]);\n } else {\n throw new Error(\"el selector must be of type String, NodeList, HTMLElement or Ity.SelectorObject\");\n }\n }\n\n private _bindDOMEvents(evtObj: ViewEvents): void {\n if (!this.el || !this.el.isSelectorObject) return;\n const captureEvents = [\"focus\", \"blur\"];\n for (const selector in evtObj) {\n for (const evt in evtObj[selector]) {\n const callback = (this as any)[evtObj[selector][evt]];\n if (typeof callback !== \"function\") {\n throw new Error(`View event handler not found: ${evtObj[selector][evt]}`);\n }\n const capture = captureEvents.includes(evt);\n this._delegateEvent(selector, evt, callback, capture);\n }\n }\n }\n\n private _delegateEvent(selector: string, evtName: string, callback: (e: Event) => void, capture = false): void {\n for (const root of this.el) {\n const listener = (event: Event) => {\n let node: HTMLElement | null = event.target as HTMLElement;\n while (node) {\n if ((node as any).matches && (node as any).matches(selector)) {\n (event as any).delegateTarget = node;\n callback.call(this, event);\n break;\n }\n if (node === root) break;\n node = node.parentElement;\n }\n };\n root.addEventListener(evtName, listener, capture);\n this.delegatedListeners.push(() => root.removeEventListener(evtName, listener, capture));\n }\n }\n\n private _init(opts: ViewOptions): void {\n if (this.el) this._setElement(this.el as any);\n if (opts.el && !this.el) this._setElement(opts.el);\n this._bindDOMEvents(this.events);\n this.initialize(opts);\n }\n\n initialize(opts?: ViewOptions): void { }\n\n getName(): string | undefined {\n return this.name;\n }\n\n get(attr: keyof this): any {\n return (this as any)[attr];\n }\n\n set(attr: keyof this, value: any): void {\n (this as any)[attr] = value;\n }\n\n renderWith(view: TemplateValue | (() => TemplateValue), options?: RenderOptions): Cleanup {\n if (this.renderCleanup) this.renderCleanup();\n this.renderCleanup = render(view, this.el, options);\n return this.renderCleanup;\n }\n\n remove(): void {\n if (this.renderCleanup) this.renderCleanup();\n for (const cleanup of this.delegatedListeners.splice(0)) cleanup();\n this.el.remove();\n if (this.app) this.app.removeView(this.id);\n }\n\n select(selector: string, ctx: HTMLElement | HTMLDocument | SelectorObject = this.el): SelectorObject {\n const win = getWindow();\n if ((win?.HTMLElement && ctx instanceof win.HTMLElement) || (win?.HTMLDocument && ctx instanceof win.HTMLDocument)) {\n return new SelectorObject(ctx.querySelectorAll(selector) as any);\n }\n if ((ctx as any).isSelectorObject) return (ctx as SelectorObject).find(selector);\n throw new Error(\"Context passed to .select() must be an HTMLElement or an Ity.SelectorObject\");\n }\n}\n\nclass Application {\n public views: View[] = [];\n\n getView(id: string): View | undefined {\n return this.views.find((view) => view.id === id);\n }\n\n addView(view: View): void {\n if (view instanceof View && !this.views.includes(view)) this.views.push(view);\n }\n\n removeView(id: string): void {\n this.views = this.views.filter((view) => view.id !== id);\n }\n\n trigger(evtName: string, data?: unknown): void {\n for (const view of this.views.slice()) view.trigger(evtName, data);\n }\n}\n\nclass Collection {\n public models: M[] = [];\n public url!: string;\n public readonly state: Signal;\n private ModelClass: new () => M;\n\n constructor(models: M[] = [], ModelClass: new () => M = Model as any) {\n this.ModelClass = ModelClass;\n this.url = \"\";\n this.state = signal(this.models);\n models.forEach((model) => this.add(model));\n }\n\n get(id: string): M | undefined {\n return this.models.find((model) => model.id === id);\n }\n\n add(model: M): void {\n if (!(model instanceof Model)) return;\n this.models = [...this.models, model];\n this.state.set(this.models);\n }\n\n remove(id: string | M): void {\n const model = typeof id === \"string\" ? this.get(id) : id;\n if (!model) return;\n this.models = this.models.filter((item) => item !== model);\n this.state.set(this.models);\n }\n\n at(index: number): M | undefined {\n return this.models[index];\n }\n\n get length(): number {\n return this.models.length;\n }\n\n clear(): void {\n this.models = [];\n this.state.set(this.models);\n }\n\n find(predicate: (m: M) => boolean): M | undefined {\n return this.models.find(predicate);\n }\n\n filter(predicate: (m: M) => boolean): M[] {\n return this.models.filter(predicate);\n }\n\n map(mapper: (m: M, index: number) => T): T[] {\n return this.models.map(mapper);\n }\n\n toJSON(): any[] {\n return this.models.map((model) => model.get());\n }\n\n subscribe(callback: Subscriber, options?: { immediate?: boolean }): Cleanup {\n return this.state.subscribe(callback, options);\n }\n\n protected _ajax(opts: AjaxOptions = {}): void {\n const request = new XMLHttpRequest();\n const method = opts.type || \"GET\";\n const url = opts.url || this.url;\n const success = opts.success || function () { };\n const error = opts.error || function () { };\n request.open(method, url, true);\n request.onload = () => {\n if (request.status >= 200 && request.status < 400) {\n try {\n success.call(this, request.responseText ? JSON.parse(request.responseText) : null);\n } catch (err) {\n error.call(this, request.status, err);\n }\n } else {\n error.call(this, request.status);\n }\n };\n request.onerror = () => error.call(this);\n request.send(opts.data === undefined ? undefined : JSON.stringify(opts.data));\n }\n\n fetch(opts: AjaxOptions & { modelClass?: new () => M } = {}): void {\n const userSuccess = opts.success;\n opts.success = function (this: Collection, resp: any[]) {\n const ctor = (opts.modelClass || this.ModelClass) as new () => M;\n this.clear();\n for (const data of resp || []) {\n const model = new ctor();\n (model as any).set(data);\n this.add(model);\n }\n if (userSuccess) userSuccess.call(this, resp);\n };\n this._ajax(opts);\n }\n\n trigger(evtName: string, data?: unknown): void {\n for (const model of this.models.slice()) model.trigger(evtName, data);\n }\n}\n\ninterface RouteContext {\n path: string;\n url: URL;\n params: Record;\n query: Record;\n hash: Record;\n}\n\ntype RouteHandler = (params: Record, context: RouteContext) => void | Cleanup;\n\ninterface RouteRecord {\n pattern: string;\n handler: RouteHandler;\n exec(url: URL): Record | null;\n}\n\ninterface RouterOptions {\n base?: string;\n autoStart?: boolean;\n linkSelector?: string;\n transition?: boolean;\n notFound?: RouteHandler;\n}\n\nclass Router {\n private routes: RouteRecord[] = [];\n private started = false;\n private readonly listener = () => this.check();\n private readonly clickListener = (event: Event) => this.handleLinkClick(event);\n private readonly navigationListener = (event: any) => this.handleNavigationEvent(event);\n private routeCleanup?: Cleanup;\n private activeRoute?: RouteRecord;\n public readonly current: Signal = signal(null);\n public notFound?: RouteHandler;\n public base: string;\n public linkSelector: string;\n public transition: boolean;\n\n constructor(options: RouterOptions = {}) {\n this.base = options.base || \"/\";\n this.linkSelector = options.linkSelector || \"a[href]\";\n this.transition = Boolean(options.transition);\n this.notFound = options.notFound;\n if (options.autoStart !== false) this.start();\n }\n\n add(pattern: string, handler: RouteHandler): this {\n this.routes.push(createRouteRecord(pattern, handler));\n return this;\n }\n\n addRoute(pattern: string, handler: RouteHandler): void {\n this.add(pattern, handler);\n }\n\n removeRoute(pattern: string): this {\n if (this.activeRoute?.pattern === pattern) {\n this.disposeRoute();\n this.activeRoute = undefined;\n this.current.set(null);\n }\n this.routes = this.routes.filter((route) => route.pattern !== pattern);\n return this;\n }\n\n navigate(path: string, options: { replace?: boolean; transition?: boolean } = {}): void {\n const win = getWindow();\n if (!win) return;\n const update = () => {\n const method = options.replace ? \"replaceState\" : \"pushState\";\n win.history[method](null, \"\", withBasePath(path, this.base));\n this.check();\n };\n withViewTransition(update, options.transition ?? this.transition);\n }\n\n href(path: string): string {\n return withBasePath(path, this.base);\n }\n\n link(path: string, attrs: Record = {}): Record {\n const previousClick = attrs[\"@click\"] as ((event: Event) => void) | undefined;\n const href = this.href(path);\n return {\n ...attrs,\n href,\n \"@click\": (event: Event) => {\n previousClick?.(event);\n const currentTarget = event.currentTarget as HTMLAnchorElement | null;\n const anchor = currentTarget && typeof (currentTarget as any).matches === \"function\" && currentTarget.matches(this.linkSelector)\n ? currentTarget\n : null;\n const url = this.resolveNavigationURL(event, anchor, href);\n if (!url) return;\n event.preventDefault();\n this.navigate(`${url.pathname}${url.search}${url.hash}`);\n }\n };\n }\n\n start(): void {\n const win = getWindow();\n const doc = getDocument();\n if (!win || this.started) {\n if (win) this.check();\n return;\n }\n win.addEventListener(\"popstate\", this.listener);\n doc?.addEventListener(\"click\", this.clickListener);\n (win as any).navigation?.addEventListener?.(\"navigate\", this.navigationListener);\n this.started = true;\n this.check();\n }\n\n stop(): void {\n const win = getWindow();\n const doc = getDocument();\n if (win && this.started) {\n win.removeEventListener(\"popstate\", this.listener);\n doc?.removeEventListener(\"click\", this.clickListener);\n (win as any).navigation?.removeEventListener?.(\"navigate\", this.navigationListener);\n }\n this.started = false;\n this.disposeRoute();\n }\n\n check(): RouteContext | null {\n const win = getWindow();\n if (!win) return null;\n const url = new URL(win.location.href);\n const routePath = stripBasePath(url.pathname, this.base);\n if (routePath === null) {\n this.disposeRoute();\n this.activeRoute = undefined;\n this.current.set(null);\n return null;\n }\n const routeUrl = new URL(url.href);\n routeUrl.pathname = routePath || \"/\";\n for (const route of this.routes) {\n const routeParams = route.exec(routeUrl);\n if (!routeParams) continue;\n const query = searchParamsToObject(url.search);\n const hash = searchParamsToObject(url.hash);\n const params = { ...routeParams, ...query, ...hash };\n const context: RouteContext = {\n path: routePath || \"/\",\n url,\n params,\n query,\n hash\n };\n this.disposeRoute();\n this.activeRoute = route;\n this.current.set(context);\n const cleanup = route.handler(params, context);\n if (typeof cleanup === \"function\") this.routeCleanup = cleanup;\n return context;\n }\n this.disposeRoute();\n this.activeRoute = undefined;\n this.current.set(null);\n const cleanup = this.notFound?.({}, {\n path: routePath || \"/\",\n url,\n params: {},\n query: searchParamsToObject(url.search),\n hash: searchParamsToObject(url.hash)\n });\n if (typeof cleanup === \"function\") this.routeCleanup = cleanup;\n return null;\n }\n\n private handleLinkClick(event: Event): void {\n const anchor = this.findAnchor(event);\n const url = this.resolveNavigationURL(event, anchor);\n if (!url) return;\n event.preventDefault();\n this.navigate(`${url.pathname}${url.search}${url.hash}`);\n }\n\n private handleNavigationEvent(event: any): void {\n const win = getWindow();\n if (!win || !event?.canIntercept || !event.destination?.url || typeof event.intercept !== \"function\") return;\n const url = new URL(event.destination.url, win.location.href);\n if (url.origin !== win.location.origin) return;\n if (stripBasePath(url.pathname, this.base) === null) return;\n event.intercept({\n handler: () => {\n this.check();\n }\n });\n }\n\n private disposeRoute(): void {\n if (!this.routeCleanup) return;\n const cleanup = this.routeCleanup;\n this.routeCleanup = undefined;\n cleanup();\n }\n\n private resolveNavigationURL(event: Event, anchor: HTMLAnchorElement | null, fallbackHref?: string): URL | null {\n const mouseEvent = event as MouseEvent;\n if (event.defaultPrevented) return null;\n if (typeof mouseEvent.button === \"number\" && mouseEvent.button !== 0) return null;\n if (mouseEvent.metaKey || mouseEvent.ctrlKey || mouseEvent.shiftKey || mouseEvent.altKey) return null;\n if (anchor && ((anchor.target && anchor.target !== \"_self\") || anchor.hasAttribute(\"download\"))) return null;\n const win = getWindow();\n if (!win) return null;\n const href = anchor?.getAttribute(\"href\") ?? fallbackHref;\n if (!href || /^(mailto|tel):/i.test(href)) return null;\n const url = new URL(anchor?.href || href, win.location.href);\n if (url.origin !== win.location.origin) return null;\n if (stripBasePath(url.pathname, this.base) === null) return null;\n return url;\n }\n\n private findAnchor(event: Event): HTMLAnchorElement | null {\n const win = getWindow();\n const fromPath = typeof (event as any).composedPath === \"function\"\n ? ((event as any).composedPath() as EventTarget[])\n : [];\n for (const entry of fromPath) {\n if (!entry || !(entry as any).matches) continue;\n const element = entry as HTMLElement;\n if (element.matches(this.linkSelector)) return element as HTMLAnchorElement;\n }\n const target = event.target as HTMLElement | null;\n return target?.closest?.(this.linkSelector) as HTMLAnchorElement | null;\n }\n}\n\nfunction createRouteRecord(pattern: string, handler: RouteHandler): RouteRecord {\n const win = getWindow();\n const URLPatternCtor = (win as any)?.URLPattern || (globalThis as any).URLPattern;\n if (typeof URLPatternCtor === \"function\") {\n try {\n const nativePattern = new URLPatternCtor({ pathname: pattern });\n return {\n pattern,\n handler,\n exec(url) {\n const match = nativePattern.exec(url.href);\n return match ? decodeParams(match.pathname.groups || {}) : null;\n }\n };\n } catch (_err) {\n // Fall through to the regex matcher for non-URLPattern syntax.\n }\n }\n\n const { re, keys } = compilePathPattern(pattern);\n return {\n pattern,\n handler,\n exec(url) {\n const match = re.exec(normalizePath(url.pathname));\n if (!match) return null;\n const params: Record = {};\n keys.forEach((key, index) => {\n params[key] = decodeURIComponent(match[index + 1] || \"\");\n });\n return params;\n }\n };\n}\n\nfunction normalizeBase(base: string): string {\n const normalized = normalizePath(base || \"/\");\n return normalized === \"\" ? \"\" : normalized;\n}\n\nfunction withBasePath(path: string, base: string): string {\n const normalizedBase = normalizeBase(base);\n const parsed = new URL(path || \"/\", \"http://ity.local\");\n let pathname = normalizePath(parsed.pathname) || \"/\";\n if (normalizedBase && pathname !== normalizedBase && !pathname.startsWith(`${normalizedBase}/`)) {\n pathname = `${normalizedBase}${pathname === \"/\" ? \"\" : pathname}`;\n }\n return `${pathname}${parsed.search}${parsed.hash}`;\n}\n\nfunction stripBasePath(pathname: string, base: string): string | null {\n const normalizedBase = normalizeBase(base);\n const normalizedPath = normalizePath(pathname) || \"/\";\n if (!normalizedBase) return normalizedPath;\n if (normalizedPath === normalizedBase) return \"/\";\n if (normalizedPath.startsWith(`${normalizedBase}/`)) {\n return normalizePath(normalizedPath.slice(normalizedBase.length)) || \"/\";\n }\n return null;\n}\n\nfunction compilePathPattern(pattern: string): { re: RegExp; keys: string[] } {\n const keys: string[] = [];\n const normalized = normalizePath(pattern);\n if (normalized === \"\") return { re: /^\\/?$/, keys };\n const segments = normalized.split(\"/\").filter(Boolean);\n const source = segments.map((segment) => {\n if (segment === \"*\") {\n keys.push(\"wildcard\");\n return \"(.*)\";\n }\n if (segment.startsWith(\":\")) {\n keys.push(segment.slice(1));\n return \"([^/]+)\";\n }\n return escapeRegExp(segment);\n }).join(\"/\");\n return { re: new RegExp(`^/${source}/?$`), keys };\n}\n\nfunction normalizePath(path: string): string {\n const normalized = path.replace(/[?#].*$/, \"\").replace(/\\/+$/, \"\");\n return normalized === \"\" ? \"\" : normalized.startsWith(\"/\") ? normalized : `/${normalized}`;\n}\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\nfunction searchParamsToObject(value: string): Record {\n const out: Record = {};\n const clean = value.replace(/^[?#]/, \"\");\n if (!clean) return out;\n const params = new URLSearchParams(clean);\n params.forEach((paramValue, key) => {\n out[key] = paramValue;\n });\n return out;\n}\n\nfunction decodeParams(value: Record): Record {\n const out: Record = {};\n for (const key of Object.keys(value)) {\n out[key] = decodeURIComponent(value[key]);\n }\n return out;\n}\n\nconst defaultRouter = signal(null);\n\nfunction route(pattern: string, handler: RouteHandler): Router {\n let router = defaultRouter.peek();\n if (!router) {\n router = new Router({ autoStart: false });\n defaultRouter.set(router);\n }\n router.add(pattern, handler);\n router.start();\n return router;\n}\n\nconst Ity = {\n version: \"2.2.0\",\n createConfig,\n configure,\n signal,\n computed,\n effect,\n batch,\n untrack,\n isSignal,\n resolveSignal,\n store,\n resource,\n action,\n form,\n formState,\n html,\n unsafeHTML,\n render,\n renderToString,\n component,\n route,\n Router,\n SelectorObject,\n onDOMReady,\n Model,\n View,\n Application,\n Collection\n};\n\nfunction createAmdExport(): typeof Ity {\n const win = getWindow();\n if (win) (win as any).Ity = Ity;\n return Ity;\n}\n\n/* c8 ignore next 3 */\nif (typeof define === \"function\" && (define as any).amd) {\n (define as any)(createAmdExport);\n} else if (typeof module === \"object\" && typeof module.exports !== \"undefined\") {\n module.exports = Ity;\n}\n\nconst win = getWindow();\nif (win) {\n (win as any).Ity = Ity;\n}\n\nexport {\n Application,\n Collection,\n Model,\n Router,\n SelectorObject,\n View,\n batch,\n component,\n configure,\n createConfig,\n computed,\n effect,\n action,\n form,\n formState,\n html,\n isSignal,\n onDOMReady,\n render,\n renderToString,\n resource,\n resolveSignal,\n route,\n signal,\n store,\n unsafeHTML,\n untrack\n};\nexport type {\n Action,\n ActionOptions,\n AsyncStatus,\n ComponentContext,\n ComponentOptions,\n EffectHandle,\n FormBindOptions,\n FormController,\n FormField,\n FormOptions,\n FormState,\n FormStateController,\n FormStateOptions,\n FormStateSubmitOptions,\n HTMLSanitizer,\n ItyConfig,\n ReadonlySignal,\n RenderOptions,\n RenderToStringOptions,\n Resource,\n ResourceContext,\n ResourceOptions,\n RouteContext,\n RouteHandler,\n Signal,\n Store,\n TemplateResult,\n UnsafeHTMLOptions\n};\nexport default Ity;\n"],"names":["defaultEquals","Object","is","activeObserver","batchDepth","pendingEffects","Set","configuredSanitizeHTML","activeConfigStack","getWindow","window","undefined","getDocument","win","_a","document","hasOwn","target","key","prototype","hasOwnProperty","call","isPlainObject","value","proto","getPrototypeOf","cloneValue","cloneFn","globalThis","structuredClone","Array","isArray","map","item","out","Reflect","ownKeys","deepEqual","left","right","length","i","leftKeys","rightKeys","includes","withConfig","config","callback","push","pop","resolveSanitizeHTML","options","sanitize","scoped","sanitizeHTML","trackDependency","source","observers","add","deps","cleanupDependencies","observer","dep","delete","clear","notifyObservers","from","markDirty","flushEffects","size","effects","effect","run","SignalNode","constructor","this","subscribers","equals","read","track","write","next","previous","resolved","subscriber","subscribe","immediate","ComputedNode","getter","dirty","initialized","evaluate","current","previousObserver","ReactiveEffect","disposed","queueEffect","cleanup","dispose","signal","initialValue","node","readWrite","arguments","get","peek","set","update","updater","subscribeOptions","defineProperty","computed","runner","batch","untrack","isSignal","resolveSignal","configure","createConfig","store","keys","signals","Map","structure","ensureSignal","has","bumpStructure","version","setKey","hadKey","snapshot","Proxy","$patch","patch","$snapshot","$subscribe","first","receiver","_target","deleteProperty","getOwnPropertyDescriptor","enumerable","configurable","resource","loader","data","error","pending","statusValue","loading","status","keepPrevious","controller","refreshId","currentPromise","api","promise","refresh","id","abort","AbortController","Promise","resolve","then","aborted","onSuccess","catch","err","onError","finally","mutate","reason","action","handler","count","pendingCount","generation","submit","args","runGeneration","Math","max","callable","mutableCallable","with","mapper","event","reset","getFormElementCtor","ownerWindow","ownerDocument","defaultView","HTMLFormElement","_b","isFormElement","fallbackNode","FormElement","Boolean","findFormElement","currentTarget","Error","closest","createFormDataForElement","formElement","FormDataCtor","FormData","form","submitAction","onSubmit","async","preventDefault","result","resetOnSuccess","handleSubmit","replaceStoreSnapshot","nextValue","formState","values","initialValues","errors","touched","registeredBindings","allFieldNames","names","forEach","String","syncErrors","nextErrors","validators","validator","message","formErrors","validate","computeErrors","markTouched","name","maybeValidateTouched","touchedSnapshot","some","bind","bindOptions","field","type","eventName","domName","fieldName","fieldBindings","signature","parse","registerBinding","formattedValue","format","binding","optionValue","checked","filter","selectedOptions","option","raw","Number","parseValue","stringValue","valid","valueSignal","signalLike","prev","createFieldSignal","optionsForField","base","submitOptions","NO_FORM_VALUE","Symbol","_error","formData","controls","elements","resolveControlValue","bindings","primary","namedControls","control","parseTarget","find","currentValue","selected","matched","_c","select","getAll","syncFromForm","state","html","strings","isTemplateResult","unsafeHTML","sanitizer","isUnsafeHTML","isNodeLike","nodeType","documentOrThrow","doc","normalizeValue","valueToFragment","fragment","createDocumentFragment","appendValue","parent","appendChild","materializeTemplate","template","createElement","innerHTML","content","cloneNode","createTextNode","bindingFromName","rawName","kind","slice","part","attrMatch","match","before","marker","index","root","comments","walker","createTreeWalker","nextNode","comment","list","markers","replaceWith","attrName","querySelectorAll","element","removeAttribute","applyElementBinding","applyBindings","entryValue","entry","setAttribute","join","assign","style","classes","toggleAttribute","tagName","multiple","selectedValues","addEventListener","replaceChildren","maybeTarget","firstChild","removeChild","withViewTransition","enabled","startViewTransition","render","view","mount","found","querySelector","isSelectorObject","resolveTarget","transition","reactive","renderToString","valueToString","serialized","entryName","escapeAttribute","stringifyAttribute","templateToString","outerHTML","escapeHTML","textContent","replace","m","toLowerCase","component","setupOrOptions","maybeOptions","customElements","HTMLElement","definition","setup","attrs","observedAttributes","props","ItyElement","attrSignals","propSignals","connectedCallbacks","disconnectedCallbacks","effectRecords","connected","connectedCallback","ensureMount","prop","upgradeProperty","ctx","createContext","output","renderOutput","startRender","startEffects","disconnectedCallback","renderCleanup","record","handle","attributeChangedCallback","_oldValue","newValue","ensureAttrSignal","renderTarget","shadow","init","mode","shadowRoot","attachShadow","styles","container","getAttribute","ensurePropSignal","host","attr","emit","detail","dispatchEvent","CustomEvent","bubbles","composed","onConnected","onDisconnected","define","Evented","_events","on","evtName","context","off","events","splice","trigger","regexps","nospaces","SelectorObject","nodeList","nodes","reindex","iterator","toArray","selector","thisNode","elm","indexOf","matches","last","parentElement","children","child","remove","addClass","classList","removeClass","test","toggleClass","toggle","hasClass","contains","text","listener","removeEventListener","_html","after","append","prepend","empty","position","htmls","selNode","insertAdjacentHTML","insertAdjacentElement","fragmentToElement","cloned","htmlContent","span","onDOMReady","fn","Ity","func","apply","readyState","once","Model","opts","super","floor","random","url","_init","initialize","_ajax","request","XMLHttpRequest","method","success","resp","open","onload","response","responseText","JSON","onerror","send","stringify","unSet","sync","toJSON","View","delegatedListeners","app","addView","_setElement","elSelector","el","NodeList","_bindDOMEvents","evtObj","captureEvents","evt","capture","_delegateEvent","delegateTarget","getName","renderWith","removeView","HTMLDocument","Application","views","getView","Collection","models","ModelClass","model","at","predicate","fetch","userSuccess","ctor","modelClass","Router","routes","started","check","clickListener","handleLinkClick","navigationListener","handleNavigationEvent","linkSelector","notFound","autoStart","start","pattern","URLPatternCtor","URLPattern","nativePattern","pathname","exec","href","decodeURIComponent","decodeParams","groups","_err","re","normalized","normalizePath","split","segment","startsWith","RegExp","compilePathPattern","params","createRouteRecord","addRoute","removeRoute","activeRoute","disposeRoute","route","navigate","path","history","withBasePath","link","previousClick","anchor","resolveNavigationURL","search","hash","navigation","stop","URL","location","routePath","stripBasePath","routeUrl","routeParams","query","searchParamsToObject","routeCleanup","findAnchor","canIntercept","destination","intercept","origin","fallbackHref","mouseEvent","defaultPrevented","button","metaKey","ctrlKey","shiftKey","altKey","hasAttribute","fromPath","composedPath","normalizeBase","normalizedBase","parsed","normalizedPath","clean","URLSearchParams","paramValue","defaultRouter","router","amd","module","exports"],"mappings":"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"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index caaa3d8..bdeaeff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ity", - "version": "2.1.0", + "version": "2.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ity", - "version": "2.1.0", + "version": "2.2.0", "license": "MIT", "devDependencies": { "@rollup/plugin-terser": "^0.4.4", diff --git a/package.json b/package.json index b56c7f2..0530735 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ity", - "version": "2.1.0", + "version": "2.2.0", "description": "A tiny dependency-free reactive app kernel with MVC compatibility", "main": "dist/ity.cjs.js", "module": "dist/ity.esm.mjs", @@ -36,7 +36,9 @@ "pretest": "tsc -p tsconfig.json && cp build/Ity.js Ity.js", "precoverage": "tsc -p tsconfig.json && cp build/Ity.js Ity.js", "coverage": "jest --coverage", - "build": "tsc -p tsconfig.json && rollup -c", + "build": "tsc -p tsconfig.json && cp build/Ity.js Ity.js && rollup -c", + "examples:serve": "npm run build && node scripts/examples-server.mjs", + "examples:workbench": "npm run examples:serve", "test:dist": "ITY_FILE=../../dist/ity.min.js npm test -- --coverage=false" }, "devDependencies": { @@ -52,7 +54,7 @@ }, "repository": { "type": "git", - "url": "https://github.com/dcocchia/Ity.git" + "url": "git+https://github.com/dcocchia/Ity.git" }, "keywords": [ "ity", diff --git a/scripts/examples-server.mjs b/scripts/examples-server.mjs new file mode 100644 index 0000000..220496d --- /dev/null +++ b/scripts/examples-server.mjs @@ -0,0 +1,58 @@ +#!/usr/bin/env node + +import { createReadStream, existsSync, statSync } from 'node:fs'; +import { createServer } from 'node:http'; +import { extname, join, normalize, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +const root = resolve(fileURLToPath(new URL('..', import.meta.url))); +const args = process.argv.slice(2); +const portArgIndex = args.findIndex((arg) => arg === '--port'); +const portValue = portArgIndex >= 0 ? args[portArgIndex + 1] : process.env.PORT; +const port = Number(portValue || 4173); +const defaultEntry = '/Examples/index.html'; + +const contentTypes = { + '.css': 'text/css; charset=utf-8', + '.html': 'text/html; charset=utf-8', + '.js': 'application/javascript; charset=utf-8', + '.json': 'application/json; charset=utf-8', + '.map': 'application/json; charset=utf-8', + '.mjs': 'application/javascript; charset=utf-8', + '.svg': 'image/svg+xml', + '.txt': 'text/plain; charset=utf-8' +}; + +function resolvePathname(pathname) { + const clean = pathname === '/' ? defaultEntry : pathname; + const candidate = resolve(root, `.${normalize(clean)}`); + if (!candidate.startsWith(root)) return null; + if (!existsSync(candidate)) return null; + if (statSync(candidate).isDirectory()) { + const indexPath = join(candidate, 'index.html'); + if (!existsSync(indexPath)) return null; + return indexPath; + } + return candidate; +} + +const server = createServer((req, res) => { + const requestUrl = new URL(req.url || '/', 'http://127.0.0.1'); + const filePath = resolvePathname(requestUrl.pathname); + if (!filePath) { + res.writeHead(404, { 'content-type': 'text/plain; charset=utf-8' }); + res.end('Not found'); + return; + } + + const contentType = contentTypes[extname(filePath)] || 'application/octet-stream'; + res.writeHead(200, { 'content-type': contentType, 'cache-control': 'no-store' }); + createReadStream(filePath).pipe(res); +}); + +server.listen(port, () => { + const base = `http://127.0.0.1:${port}`; + console.log(`Ity examples server running at ${base}`); + console.log(`Examples index: ${base}/Examples/`); + console.log(`Operations Workbench: ${base}/Examples/OperationsWorkbench/`); +}); diff --git a/test/helpers.ts b/test/helpers.ts index 40c6fe5..08cacf4 100644 --- a/test/helpers.ts +++ b/test/helpers.ts @@ -12,7 +12,7 @@ if (!global.TextDecoder) { } ({ JSDOM } = require('jsdom')); -export function setupDOM(html: string = '
') { +export function setupDOM(html: string = '
', url: string = 'https://example.com/') { const usingJest = !!process.env.JEST_WORKER_ID; let dom: any; let prevWindow: any; @@ -28,8 +28,13 @@ export function setupDOM(html: string = '
') global.document.open(); global.document.write(html); global.document.close(); + if (url) { + const nextUrl = new URL(url, global.window.location.href); + const safeUrl = `${nextUrl.pathname}${nextUrl.search}${nextUrl.hash}`; + global.window.history.replaceState(null, '', safeUrl); + } } else { - dom = new JSDOM(html); + dom = new JSDOM(html, { url }); prevWindow = global.window; prevDocument = global.document; prevNodeList = global.NodeList; diff --git a/test/nodeEnvironment.test.ts b/test/nodeEnvironment.test.ts index 68deddd..828f51c 100644 --- a/test/nodeEnvironment.test.ts +++ b/test/nodeEnvironment.test.ts @@ -16,7 +16,7 @@ describe('Node environment bootstrap', function () { const ity = require('../../Ity.js'); assert.strictEqual(typeof global.window, 'undefined'); assert.ok(ity); - assert.strictEqual(ity.version, '2.1.0'); + assert.strictEqual(ity.version, '2.2.0'); const router = new ity.Router({ autoStart: false }); (router as any).handleLinkClick({ target: { diff --git a/test/operationsWorkbenchExample.test.ts b/test/operationsWorkbenchExample.test.ts new file mode 100644 index 0000000..6b18327 --- /dev/null +++ b/test/operationsWorkbenchExample.test.ts @@ -0,0 +1,256 @@ +// @ts-nocheck +export {}; +declare var require: any; +declare function describe(desc: string, fn: () => void): void; +declare function it(desc: string, fn: () => any): void; +const assert = require('assert'); +const { setupDOM } = require('./helpers'); + +function loadWorkbenchExample(): any { + const modulePath = '../Examples/OperationsWorkbench/operationsWorkbenchApp.js'; + delete require.cache[require.resolve(modulePath)]; + require(modulePath); + return window.ItyExamples.createOperationsWorkbenchApp; +} + +function createStorage(): any { + loadWorkbenchExample(); + return window.ItyExamples.createMemoryStorage(); +} + +async function flush(): Promise { + await Promise.resolve(); + await new Promise((resolve) => setTimeout(resolve, 0)); + await Promise.resolve(); +} + +async function waitForWorkspace(app: any): Promise { + if (app.workspace.promise) await app.workspace.promise; + await flush(); +} + +function submit(form: Element): void { + form.dispatchEvent(new window.Event('submit', { bubbles: true, cancelable: true })); +} + +describe('Operations Workbench example', function () { + it('boots from an index.html base path and sanitizes the operator bulletin', async function () { + const cleanup = setupDOM('
'); + window.history.pushState(null, '', '/Examples/OperationsWorkbench/index.html'); + const createOperationsWorkbenchApp = loadWorkbenchExample(); + const app = createOperationsWorkbenchApp(window.Ity, { + target: '#operationsWorkbenchApp', + base: '/Examples/OperationsWorkbench', + storage: createStorage(), + storageKey: 'ops-workbench-test-1', + latencyMs: 0, + initialData: { + meta: { + name: 'Sanitizer Demo', + version: 1, + bulletinHtml: '

Unsafe link

', + updatedAt: new Date().toISOString() + }, + people: [{ id: 'ava', name: 'Ava Reynolds', role: 'Lead', initials: 'AR' }], + tasks: [], + notes: [], + activity: [], + settings: { defaultOwnerId: 'ava', accent: 'sunrise', reportTitle: 'Report' } + } + }); + + await waitForWorkspace(app); + + const bulletin = document.querySelector('.owbRichText') as HTMLElement; + assert.strictEqual(app.router.current().path, '/index.html'); + assert.match(document.querySelector('.owbShellHeader h1')?.textContent || '', /Sanitizer Demo/); + assert.ok(!/script/i.test(bulletin.innerHTML)); + assert.ok(!/onclick=/i.test(bulletin.innerHTML)); + assert.ok(!/javascript:/i.test(bulletin.innerHTML)); + + app.dispose(); + cleanup(); + }); + + it('creates a new task and navigates straight into the detail route', async function () { + const cleanup = setupDOM('
'); + window.history.pushState(null, '', '/lab/workbench/tasks/new'); + const createOperationsWorkbenchApp = loadWorkbenchExample(); + const app = createOperationsWorkbenchApp(window.Ity, { + target: '#operationsWorkbenchApp', + base: '/lab/workbench', + storage: createStorage(), + storageKey: 'ops-workbench-test-2', + latencyMs: 0 + }); + + await waitForWorkspace(app); + + (document.querySelector('input[name="title"]') as HTMLInputElement).value = 'Coordinate the launch dry run'; + (document.querySelector('textarea[name="description"]') as HTMLTextAreaElement).value = 'Walk the team through the final handoff and rollback decision tree.'; + (document.querySelector('select[name="ownerId"]') as HTMLSelectElement).value = 'milo'; + (document.querySelector('select[name="priority"]') as HTMLSelectElement).value = 'high'; + (document.querySelector('input[name="dueDate"]') as HTMLInputElement).value = '2026-04-24'; + (document.querySelector('input[name="tags"]') as HTMLInputElement).value = 'launch, rehearsal'; + (document.querySelector('textarea[name="checklist"]') as HTMLTextAreaElement).value = 'Book the room\nConfirm rollback captain'; + + submit(document.querySelector('.owbForm') as Element); + await flush(); + await flush(); + + const createdTask = app.workspace.data().tasks.find((task: any) => task.title === 'Coordinate the launch dry run'); + assert.ok(createdTask, 'expected created task to exist'); + assert.strictEqual(app.router.current().path, `/tasks/${createdTask.id}`); + assert.match(document.querySelector('.owbSectionHeading h2')?.textContent || '', /Coordinate the launch dry run/); + assert.strictEqual(createdTask.checklist.length, 2); + + app.dispose(); + cleanup(); + }); + + it('updates detail state through checklist toggles and status actions', async function () { + const cleanup = setupDOM('
'); + window.history.pushState(null, '', '/lab/workbench/tasks/task-flags'); + const createOperationsWorkbenchApp = loadWorkbenchExample(); + const app = createOperationsWorkbenchApp(window.Ity, { + target: '#operationsWorkbenchApp', + base: '/lab/workbench', + storage: createStorage(), + storageKey: 'ops-workbench-test-3', + latencyMs: 0 + }); + + await waitForWorkspace(app); + + const secondChecklist = document.querySelectorAll('.owbChecklistItem input')[1] as HTMLInputElement; + secondChecklist.click(); + await flush(); + await flush(); + + let task = app.workspace.data().tasks.find((entry: any) => entry.id === 'task-flags'); + assert.strictEqual(task.checklist[1].done, true); + + (document.querySelector('.owbInlineActions .owbGhostButton') as HTMLElement).click(); + await flush(); + await flush(); + + task = app.workspace.data().tasks.find((entry: any) => entry.id === 'task-flags'); + assert.strictEqual(task.status, 'blocked'); + assert.match(document.querySelector('.owbStatRow dd')?.textContent || '', /Blocked/); + + app.dispose(); + cleanup(); + }); + + it('filters tasks, opens a component card route, and renders the string report preview', async function () { + const cleanup = setupDOM('
'); + window.history.pushState(null, '', '/lab/workbench/tasks'); + const createOperationsWorkbenchApp = loadWorkbenchExample(); + const app = createOperationsWorkbenchApp(window.Ity, { + target: '#operationsWorkbenchApp', + base: '/lab/workbench', + storage: createStorage(), + storageKey: 'ops-workbench-test-4', + latencyMs: 0 + }); + + await waitForWorkspace(app); + + const search = document.querySelector('.owbFilterInput') as HTMLInputElement; + search.value = 'briefing'; + search.dispatchEvent(new window.Event('input', { bubbles: true })); + await flush(); + + const cards = Array.from(document.querySelectorAll('ity-workbench-task-card')); + assert.strictEqual(cards.length, 1); + + const openButton = (cards[0] as any).shadowRoot.querySelector('.owbTaskCard__open') as HTMLElement; + openButton.click(); + await flush(); + + assert.strictEqual(app.router.current().path, '/tasks/task-briefing'); + + app.router.navigate('/reports'); + await flush(); + + assert.match(document.querySelector('.owbReportPreview')?.textContent || '', /Northstar Beta Release Report/); + assert.match(document.querySelector('.owbReportPreview')?.textContent || '', /Roll out feature flags/); + + app.dispose(); + cleanup(); + }); + + it('shows import validation errors, accepts valid imports, and can recover from corrupted stored data', async function () { + const storage = createStorage(); + const cleanup = setupDOM('
'); + window.history.pushState(null, '', '/lab/workbench/settings'); + const createOperationsWorkbenchApp = loadWorkbenchExample(); + const app = createOperationsWorkbenchApp(window.Ity, { + target: '#operationsWorkbenchApp', + base: '/lab/workbench', + storage, + storageKey: 'ops-workbench-test-5', + latencyMs: 0 + }); + + await waitForWorkspace(app); + + const importField = document.querySelector('textarea[name="importText"]') as HTMLTextAreaElement; + importField.value = '{bad json'; + importField.dispatchEvent(new window.Event('input', { bubbles: true })); + submit(importField.closest('form') as Element); + await flush(); + await flush(); + + assert.match(document.querySelector('.owbInlineError[role="alert"]')?.textContent || '', /Import JSON is invalid/); + + importField.value = JSON.stringify({ + meta: { + name: 'Imported Workspace', + version: 1, + bulletinHtml: '

Imported bulletin

', + updatedAt: new Date().toISOString() + }, + people: [{ id: 'ava', name: 'Ava Reynolds', role: 'Lead', initials: 'AR' }], + tasks: [], + notes: [], + activity: [], + settings: { defaultOwnerId: 'ava', accent: 'ocean', reportTitle: 'Imported report' } + }); + importField.dispatchEvent(new window.Event('input', { bubbles: true })); + submit(importField.closest('form') as Element); + await flush(); + await flush(); + + assert.strictEqual(app.workspace.data().meta.name, 'Imported Workspace'); + app.dispose(); + cleanup(); + + const brokenStorage = createStorage(); + brokenStorage.setItem('ops-workbench-broken', '{not json'); + const cleanupBroken = setupDOM('
'); + window.history.pushState(null, '', '/lab/workbench/'); + const brokenApp = createOperationsWorkbenchApp(window.Ity, { + target: '#operationsWorkbenchApp', + base: '/lab/workbench', + storage: brokenStorage, + storageKey: 'ops-workbench-broken', + latencyMs: 0 + }); + + await flush(); + await flush(); + + assert.match(document.body.textContent || '', /Workspace load failed/); + + (document.querySelector('.owbDangerButton') as HTMLElement).click(); + await flush(); + await flush(); + + assert.ok(brokenApp.workspace.data(), 'expected reset to repopulate the workspace'); + assert.match(document.body.textContent || '', /Northstar Launch Control/); + + brokenApp.dispose(); + cleanupBroken(); + }); +}); diff --git a/test/v2Async.test.ts b/test/v2Async.test.ts index 1b01c66..2807935 100644 --- a/test/v2Async.test.ts +++ b/test/v2Async.test.ts @@ -7,6 +7,12 @@ const assert = require('assert'); const { setupDOM } = require('./helpers'); const { JSDOM } = require('jsdom'); +async function flush(): Promise { + await Promise.resolve(); + await new Promise((resolve) => setTimeout(resolve, 0)); + await Promise.resolve(); +} + describe('V2 async primitives', function () { it('resource loads immediately, refreshes, mutates and tracks status', async function () { const cleanup = setupDOM(); @@ -193,6 +199,32 @@ describe('V2 async primitives', function () { cleanup(); }); + it('action exposes run, with and from helpers for DOM event usage', async function () { + const cleanup = setupDOM('
'); + const calls: string[] = []; + const save = window.Ity.action(async (value: string) => { + calls.push(value); + if (value === 'bad') throw new Error('nope'); + return value.toUpperCase(); + }); + + window.Ity.render(() => window.Ity.html` + + + + `, '#root'); + + (document.getElementById('with') as HTMLElement).click(); + (document.getElementById('from') as HTMLElement).click(); + (document.getElementById('run') as HTMLElement).click(); + await flush(); + + assert.deepStrictEqual(calls, ['ada', 'grace', 'bad']); + assert.strictEqual(save.data(), 'GRACE'); + assert.strictEqual(save.error().message, 'nope'); + cleanup(); + }); + it('form creates FormData from submit events and can reset successful forms', async function () { const cleanup = setupDOM('
'); const form = document.getElementById('f') as HTMLFormElement; @@ -218,6 +250,22 @@ describe('V2 async primitives', function () { cleanup(); }); + it('form handleSubmit swallows rejections while preserving controller error state', async function () { + const cleanup = setupDOM('
'); + const submit = window.Ity.form(async () => { + throw new Error('bad submit'); + }); + const event = new window.Event('submit', { bubbles: true, cancelable: true }); + Object.defineProperty(event, 'currentTarget', { configurable: true, value: document.getElementById('f') }); + + submit.handleSubmit(event); + await flush(); + + assert.strictEqual(submit.status(), 'error'); + assert.strictEqual(submit.error().message, 'bad submit'); + cleanup(); + }); + it('form supports form elements from another DOM realm', async function () { const cleanup = setupDOM(); const dom = new JSDOM('
'); @@ -255,4 +303,196 @@ describe('V2 async primitives', function () { cleanup(); } }); + + it('formState binds fields, tracks dirty/touched/errors, and submits validated snapshots', async function () { + const cleanup = setupDOM('
'); + const state = window.Ity.formState({ + title: '', + owner: 'ava', + related: [] as string[], + urgent: false + }, { + validators: { + title(value: string) { + return value.trim() ? null : 'Title is required.'; + } + } + }); + const submit = state.submit(async (values: any) => values, { resetOnSuccess: true }); + + window.Ity.render(() => window.Ity.html` +
+ + + + + + +
+ `, '#root'); + + submit.handleSubmit(new window.Event('submit', { bubbles: true, cancelable: true })); + await Promise.resolve(); + assert.strictEqual((document.getElementById('title') as HTMLInputElement).name, 'taskTitle'); + assert.strictEqual(state.touched.title, true); + assert.strictEqual(state.errors.title, 'Title is required.'); + + const title = document.getElementById('title') as HTMLInputElement; + title.value = 'Launch dry run'; + title.dispatchEvent(new window.Event('input', { bubbles: true })); + title.dispatchEvent(new window.Event('blur', { bubbles: true })); + (document.getElementById('owner') as HTMLSelectElement).value = 'milo'; + document.getElementById('owner')?.dispatchEvent(new window.Event('change', { bubbles: true })); + (document.getElementById('urgent') as HTMLInputElement).click(); + (document.querySelectorAll('.related')[0] as HTMLInputElement).click(); + (document.querySelectorAll('.related')[1] as HTMLInputElement).click(); + await flush(); + + assert.strictEqual(state.values.title, 'Launch dry run'); + assert.strictEqual(state.values.owner, 'milo'); + assert.strictEqual(state.values.urgent, true); + assert.deepStrictEqual(state.values.related, ['task-1', 'task-2']); + assert.strictEqual(state.dirty(), true); + assert.strictEqual(state.errors.title, undefined); + + (document.querySelectorAll('.related')[0] as HTMLInputElement).click(); + await flush(); + assert.deepStrictEqual(state.values.related, ['task-2']); + (document.querySelectorAll('.related')[0] as HTMLInputElement).click(); + await flush(); + + const form = document.getElementById('task-form') as HTMLFormElement; + form.dispatchEvent(new window.Event('submit', { bubbles: true, cancelable: true })); + await flush(); + + assert.deepStrictEqual(submit.data(), { + title: 'Launch dry run', + owner: 'milo', + related: ['task-1', 'task-2'], + urgent: true + }); + assert.strictEqual(state.dirty(), false); + assert.strictEqual((document.getElementById('title') as HTMLInputElement).value, ''); + cleanup(); + }); + + it('formState synchronizes current form control values on submit', async function () { + const cleanup = setupDOM('
'); + const state = window.Ity.formState({ + title: '', + owner: 'ava', + urgent: false + }); + const submit = state.submit(async (values: any) => values); + + window.Ity.render(() => window.Ity.html` +
+ + + +
+ `, '#root'); + + (document.getElementById('sync-title') as HTMLInputElement).value = 'Programmatic submit'; + (document.getElementById('sync-owner') as HTMLSelectElement).value = 'milo'; + (document.getElementById('sync-urgent') as HTMLInputElement).checked = true; + (document.getElementById('sync-form') as HTMLFormElement).dispatchEvent(new window.Event('submit', { bubbles: true, cancelable: true })); + await flush(); + + assert.deepStrictEqual(submit.data(), { + title: 'Programmatic submit', + owner: 'milo', + urgent: true + }); + cleanup(); + }); + + it('formState exposes field helpers, validation state, and specialized bindings', async function () { + const cleanup = setupDOM('
'); + const state = window.Ity.formState({ + count: 1, + mode: 'ship', + tags: ['a'] as string[], + custom: '' + }, { + validate(values: any) { + return values.count < 0 ? { count: 'Count must be positive.' } : undefined; + } + }); + const countField = state.field('count'); + const observed: any[] = []; + const stop = countField.value.subscribe((current: any, previous: any) => { + observed.push([previous, current]); + }, { immediate: true }); + const submit = state.submit(async (values: any) => values); + + window.Ity.render(() => window.Ity.html` +
+ + + + + target.value.toUpperCase() })}> +
+ `, '#root'); + + assert.strictEqual(countField.value.get(), 1); + assert.strictEqual(countField.value.peek(), 1); + assert.deepStrictEqual(observed, [[1, 1]]); + countField.value.update((value: number) => value + 1); + assert.strictEqual(countField.value(), 2); + assert.deepStrictEqual(observed, [[1, 1], [1, 2]]); + + (document.getElementById('count') as HTMLInputElement).value = '7'; + (document.querySelectorAll('.mode')[1] as HTMLInputElement).click(); + const tagSelect = document.getElementById('tags') as HTMLSelectElement; + tagSelect.options[0].selected = true; + tagSelect.options[1].selected = true; + tagSelect.dispatchEvent(new window.Event('change', { bubbles: true })); + assert.strictEqual(countField.dirty(), true); + + countField.reset(); + assert.strictEqual(countField.value(), 1); + assert.strictEqual(state.validate(), true); + state.set((current: any) => ({ count: current.count + 2 })); + assert.strictEqual(state.values.count, 3); + + (document.getElementById('count') as HTMLInputElement).value = '9'; + (document.getElementById('custom') as HTMLInputElement).value = 'parsed later'; + (document.getElementById('special-form') as HTMLFormElement).dispatchEvent(new window.Event('submit', { bubbles: true, cancelable: true })); + await flush(); + + assert.deepStrictEqual(submit.data(), { + count: 9, + mode: 'hold', + tags: ['a', 'b'], + custom: 'PARSED LATER' + }); + assert.strictEqual(state.valid(), true); + assert.strictEqual(countField.error(), null); + assert.strictEqual(countField.touched(), true); + submit.reset(); + assert.strictEqual(submit.data(), undefined); + assert.strictEqual(state.values.count, 1); + stop(); + cleanup(); + }); }); diff --git a/test/v2Component.test.ts b/test/v2Component.test.ts index 0c522e1..eed3582 100644 --- a/test/v2Component.test.ts +++ b/test/v2Component.test.ts @@ -168,4 +168,30 @@ describe('V2 components', function () { assert.strictEqual(first, second); cleanup(); }); + + it('supports declared property signals for structured component inputs', function () { + const cleanup = setupDOM('
'); + const tag = 'ity-v2-props-a'; + + window.Ity.component(tag, { + props: ['task'], + shadow: true, + setup(ctx: any) { + const taskValue = ctx.prop('task'); + return () => window.Ity.html`

${taskValue().title} · ${taskValue().status}

`; + } + }); + + const el: any = document.createElement(tag); + el.task = { title: 'Launch dry run', status: 'planned' }; + document.getElementById('root').appendChild(el); + + assert.deepStrictEqual(el.task, { title: 'Launch dry run', status: 'planned' }); + assert.strictEqual(el.shadowRoot?.textContent?.trim(), 'Launch dry run · planned'); + + el.task = { title: 'Launch dry run', status: 'active' }; + assert.deepStrictEqual(el.task, { title: 'Launch dry run', status: 'active' }); + assert.strictEqual(el.shadowRoot?.textContent?.trim(), 'Launch dry run · active'); + cleanup(); + }); }); diff --git a/test/v2Dom.test.ts b/test/v2Dom.test.ts index 290335f..e9a24c5 100644 --- a/test/v2Dom.test.ts +++ b/test/v2Dom.test.ts @@ -107,6 +107,45 @@ describe('V2 DOM templates and rendering', function () { cleanup(); }); + it('supports scoped render configs and bind attribute maps', function () { + const cleanup = setupDOM('
'); + const config = window.Ity.createConfig({ + sanitizeHTML(value: string) { + return value.replace(//gi, ''); + } + }); + const clicks = window.Ity.signal(0); + + window.Ity.render(() => window.Ity.html` + +
${window.Ity.unsafeHTML('ok')}
+ `, '#root', { reactive: false, config }); + + assert.strictEqual(document.querySelector('button')?.className, 'cta'); + assert.strictEqual(document.querySelector('script'), null); + (document.querySelector('button') as HTMLButtonElement).click(); + assert.strictEqual(clicks(), 1); + + const scopedMarkup = window.Ity.renderToString(() => window.Ity.html` + + ${window.Ity.unsafeHTML('safe')} + `, { config }); + + assert(scopedMarkup.includes('name="title"')); + assert(scopedMarkup.includes('value="Draft"')); + assert(scopedMarkup.includes('disabled')); + assert(!scopedMarkup.includes('')} + `); + assert(globalMarkup.includes('')); + cleanup(); + }); + it('can render once without reactivity and render into a SelectorObject', function () { const cleanup = setupDOM('
'); const count = window.Ity.signal(1); diff --git a/test/v2Router.test.ts b/test/v2Router.test.ts index 6192fca..122e42a 100644 --- a/test/v2Router.test.ts +++ b/test/v2Router.test.ts @@ -53,8 +53,8 @@ describe('V2 router', function () { cleanup(); }); - it('delegates same-origin link clicks', function () { - const cleanup = setupDOM('Click'); + it('delegates same-origin link clicks without requiring a custom data attribute', function () { + const cleanup = setupDOM('Click'); const router = new window.Ity.Router({ autoStart: false }); let hit = false; router.add('/clicked', () => { @@ -70,6 +70,42 @@ describe('V2 router', function () { cleanup(); }); + it('builds base-aware href values and intercepts links coming from shadow DOM', function () { + const cleanup = setupDOM('
'); + const tag = 'ity-v2-router-link-a'; + const router = new window.Ity.Router({ autoStart: false, base: '/app' }); + let hit = false; + + window.Ity.component(tag, { + props: ['link'], + shadow: true, + setup(ctx: any) { + const link = ctx.prop('link'); + return () => window.Ity.html`Inside`; + } + }); + + router.add('/tasks/:id', () => { + hit = true; + }); + router.start(); + window.Ity.render(() => window.Ity.html` + + `, '#root'); + + const anchor = document.querySelector(tag)?.shadowRoot?.querySelector('.inside') as HTMLAnchorElement; + assert.strictEqual(anchor.getAttribute('href'), '/app/tasks/42'); + anchor.click(); + + assert.strictEqual(hit, true); + assert.strictEqual(window.location.pathname, '/app/tasks/42'); + const reportLink = router.link('/reports'); + assert.strictEqual(reportLink.href, '/app/reports'); + assert.strictEqual(typeof reportLink['@click'], 'function'); + router.stop(); + cleanup(); + }); + it('supports wildcard routes and the convenience route helper', function () { const cleanup = setupDOM(); const router = new window.Ity.Router({ autoStart: false }); diff --git a/types/Examples/OperationsWorkbench/operationsWorkbenchApp.d.ts b/types/Examples/OperationsWorkbench/operationsWorkbenchApp.d.ts new file mode 100644 index 0000000..e69de29 diff --git a/types/Ity.d.ts b/types/Ity.d.ts index aee02fa..9f47070 100644 --- a/types/Ity.d.ts +++ b/types/Ity.d.ts @@ -40,6 +40,7 @@ interface UnsafeHTML { type HTMLSanitizer = (value: string) => string; interface UnsafeHTMLOptions { sanitize?: HTMLSanitizer; + config?: ItyConfig | null; } interface ItyConfig { sanitizeHTML?: HTMLSanitizer | null; @@ -47,6 +48,7 @@ interface ItyConfig { interface RenderOptions { reactive?: boolean; transition?: boolean; + config?: ItyConfig | null; } type StoreKey = string | symbol; interface StoreApi> { @@ -87,6 +89,9 @@ interface ActionOptions { interface Action { (...args: TArgs): Promise; submit(...args: TArgs): Promise; + run(...args: TArgs): void; + with(...args: TArgs): (...eventArgs: unknown[]) => void; + from(mapper: (event: TEvent) => TArgs): (event: TEvent) => void; readonly data: Signal; readonly error: Signal; readonly pending: ReadonlySignal; @@ -101,11 +106,68 @@ interface FormController { readonly pending: ReadonlySignal; readonly status: ReadonlySignal; onSubmit(event: Event): Promise; + handleSubmit(event: Event): void; reset(): void; } interface FormOptions extends ActionOptions { resetOnSuccess?: boolean; } +type FormErrorMap> = Partial, string>>; +interface FormBindOptions { + type?: "text" | "textarea" | "select" | "select-multiple" | "checkbox" | "radio" | "number"; + event?: string; + name?: string; + value?: unknown; + parse?: (value: unknown, event: Event) => T; + format?: (value: T) => unknown; +} +interface FormStateOptions> { + validators?: Partial<{ + [K in keyof TValues]: (value: TValues[K], values: TValues) => string | null | undefined; + }>; + validate?: (values: TValues) => FormErrorMap | void; +} +interface FormField { + readonly value: Signal; + readonly error: ReadonlySignal; + readonly touched: ReadonlySignal; + readonly dirty: ReadonlySignal; + bind(options?: FormBindOptions): Record; + set(next: T | ((previous: T) => T)): T; + reset(): void; +} +interface FormStateSubmitOptions extends ActionOptions { + resetOnSuccess?: boolean; +} +interface FormStateController, TResult, E = unknown> { + readonly state: FormState; + readonly action: Action<[TValues, Event], TResult, E>; + readonly data: Signal; + readonly error: Signal; + readonly pending: ReadonlySignal; + readonly status: ReadonlySignal; + onSubmit(event: Event): Promise; + handleSubmit(event: Event): void; + reset(): void; +} +interface FormState> { + readonly values: Store; + readonly initialValues: ReadonlySignal; + readonly errors: Store>; + readonly touched: Store, boolean>>>; + readonly dirty: ReadonlySignal; + readonly valid: ReadonlySignal; + field(name: K): FormField; + bind(name: K, options?: FormBindOptions): Record; + set(next: Partial | ((current: TValues) => Partial | void)): void; + reset(next?: Partial | TValues): void; + validate(names?: readonly (keyof TValues)[]): boolean; + markTouched(names?: readonly (keyof TValues)[]): void; + submit(handler: (values: TValues, event: Event) => Promise | TResult, options?: FormStateSubmitOptions): FormStateController; +} +interface RenderToStringOptions { + config?: ItyConfig | null; +} declare function signal(initialValue: T, options?: SignalOptions): Signal; declare function computed(getter: () => T, options?: ComputedOptions): ReadonlySignal; declare function effect(callback: (onCleanup: (cleanup: Cleanup) => void) => void): EffectHandle; @@ -114,18 +176,21 @@ declare function untrack(callback: () => T): T; declare function isSignal(value: unknown): value is ReadonlySignal; declare function resolveSignal(value: MaybeSignal): T; declare function configure(options?: ItyConfig): void; +declare function createConfig(options?: ItyConfig): ItyConfig; declare function store>(initialValue: T): Store; declare function resource(loader: (context: ResourceContext) => Promise | T, options?: ResourceOptions): Resource; declare function action(handler: (...args: TArgs) => Promise | TResult, options?: ActionOptions): Action; declare function form(handler: (data: FormData, event: Event) => Promise | TResult, options?: FormOptions): FormController; +declare function formState>(initialValue: TValues, options?: FormStateOptions): FormState; declare function html(strings: TemplateStringsArray | readonly string[], ...values: unknown[]): TemplateResult; declare function unsafeHTML(value: string, options?: UnsafeHTMLOptions): UnsafeHTML; declare function render(view: TemplateValue | (() => TemplateValue), target: string | Element | DocumentFragment | SelectorObject, options?: RenderOptions): Cleanup; -declare function renderToString(view: TemplateValue | (() => TemplateValue)): string; +declare function renderToString(view: TemplateValue | (() => TemplateValue), options?: RenderToStringOptions): string; interface ComponentContext { host: HTMLElement; root: HTMLElement | ShadowRoot; attr(name: string): ReadonlySignal; + prop(name: string): ReadonlySignal; emit(name: string, detail?: T, options?: CustomEventInit): boolean; effect(callback: (onCleanup: (cleanup: Cleanup) => void) => void): EffectHandle; onConnected(callback: () => void): void; @@ -136,8 +201,10 @@ type ComponentSetup = (ctx: ComponentContext) => ComponentRender | void; interface ComponentOptions { attrs?: string[]; observedAttributes?: string[]; + props?: string[]; shadow?: boolean | ShadowRootMode | ShadowRootInit; styles?: string; + config?: ItyConfig | null; setup?: ComponentSetup; } declare function component(name: string, setupOrOptions: ComponentSetup | ComponentOptions, maybeOptions?: Omit): CustomElementConstructor; @@ -306,16 +373,21 @@ declare class Router { replace?: boolean; transition?: boolean; }): void; + href(path: string): string; + link(path: string, attrs?: Record): Record; start(): void; stop(): void; check(): RouteContext | null; private handleLinkClick; private handleNavigationEvent; private disposeRoute; + private resolveNavigationURL; + private findAnchor; } declare function route(pattern: string, handler: RouteHandler): Router; declare const Ity: { version: string; + createConfig: typeof createConfig; configure: typeof configure; signal: typeof signal; computed: typeof computed; @@ -328,6 +400,7 @@ declare const Ity: { resource: typeof resource; action: typeof action; form: typeof form; + formState: typeof formState; html: typeof html; unsafeHTML: typeof unsafeHTML; render: typeof render; @@ -342,6 +415,6 @@ declare const Ity: { Application: typeof Application; Collection: typeof Collection; }; -export { Application, Collection, Model, Router, SelectorObject, View, batch, component, configure, computed, effect, action, form, html, isSignal, onDOMReady, render, renderToString, resource, resolveSignal, route, signal, store, unsafeHTML, untrack }; -export type { Action, ActionOptions, AsyncStatus, ComponentContext, ComponentOptions, EffectHandle, FormController, FormOptions, HTMLSanitizer, ItyConfig, ReadonlySignal, RenderOptions, Resource, ResourceContext, ResourceOptions, RouteContext, RouteHandler, Signal, Store, TemplateResult, UnsafeHTMLOptions }; +export { Application, Collection, Model, Router, SelectorObject, View, batch, component, configure, createConfig, computed, effect, action, form, formState, html, isSignal, onDOMReady, render, renderToString, resource, resolveSignal, route, signal, store, unsafeHTML, untrack }; +export type { Action, ActionOptions, AsyncStatus, ComponentContext, ComponentOptions, EffectHandle, FormBindOptions, FormController, FormField, FormOptions, FormState, FormStateController, FormStateOptions, FormStateSubmitOptions, HTMLSanitizer, ItyConfig, ReadonlySignal, RenderOptions, RenderToStringOptions, Resource, ResourceContext, ResourceOptions, RouteContext, RouteHandler, Signal, Store, TemplateResult, UnsafeHTMLOptions }; export default Ity; diff --git a/types/test/helpers.d.ts b/types/test/helpers.d.ts index 5133b6b..b4fc0b9 100644 --- a/types/test/helpers.d.ts +++ b/types/test/helpers.d.ts @@ -1,2 +1,2 @@ export {}; -export declare function setupDOM(html?: string): () => void; +export declare function setupDOM(html?: string, url?: string): () => void; diff --git a/types/test/operationsWorkbenchExample.test.d.ts b/types/test/operationsWorkbenchExample.test.d.ts new file mode 100644 index 0000000..cb0ff5c --- /dev/null +++ b/types/test/operationsWorkbenchExample.test.d.ts @@ -0,0 +1 @@ +export {};