From 15cdc326861f62e479fb50ba02061dbc1613a43f Mon Sep 17 00:00:00 2001 From: Pascal Baljet Date: Tue, 4 Nov 2025 14:27:56 +0100 Subject: [PATCH 01/50] Vue integration --- packages/core/package.json | 5 +- packages/react/package.json | 5 +- packages/react/test-app/package.json | 10 +- packages/svelte/package.json | 5 +- packages/svelte/test-app/package.json | 10 +- packages/vue3/package.json | 7 +- packages/vue3/src/useForm.ts | 184 ++- .../FormHelper/Precognition/AllErrors.vue | 43 + .../FormHelper/Precognition/ArrayErrors.vue | 32 + .../Precognition/BeforeValidation.vue | 57 + .../FormHelper/Precognition/Callbacks.vue | 56 + .../Pages/FormHelper/Precognition/Cancel.vue | 29 + .../Pages/FormHelper/Precognition/Default.vue | 32 + .../Pages/FormHelper/Precognition/Files.vue | 46 + .../Pages/FormHelper/Precognition/Headers.vue | 32 + .../Pages/FormHelper/Precognition/Methods.vue | 53 + .../FormHelper/Precognition/Transform.vue | 24 + packages/vue3/test-app/package.json | 8 +- playgrounds/react/package.json | 6 +- playgrounds/svelte4/package.json | 6 +- playgrounds/svelte5/package.json | 8 +- playgrounds/vue3/package.json | 6 +- pnpm-lock.yaml | 1236 +++++++++-------- tests/app/server.js | 152 ++ tests/precognition.spec.ts | 538 +++++++ tests/support.ts | 12 + 26 files changed, 1952 insertions(+), 650 deletions(-) create mode 100644 packages/vue3/test-app/Pages/FormHelper/Precognition/AllErrors.vue create mode 100644 packages/vue3/test-app/Pages/FormHelper/Precognition/ArrayErrors.vue create mode 100644 packages/vue3/test-app/Pages/FormHelper/Precognition/BeforeValidation.vue create mode 100644 packages/vue3/test-app/Pages/FormHelper/Precognition/Callbacks.vue create mode 100644 packages/vue3/test-app/Pages/FormHelper/Precognition/Cancel.vue create mode 100644 packages/vue3/test-app/Pages/FormHelper/Precognition/Default.vue create mode 100644 packages/vue3/test-app/Pages/FormHelper/Precognition/Files.vue create mode 100644 packages/vue3/test-app/Pages/FormHelper/Precognition/Headers.vue create mode 100644 packages/vue3/test-app/Pages/FormHelper/Precognition/Methods.vue create mode 100644 packages/vue3/test-app/Pages/FormHelper/Precognition/Transform.vue create mode 100644 tests/precognition.spec.ts diff --git a/packages/core/package.json b/packages/core/package.json index f300ead79..7687349be 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -54,7 +54,8 @@ }, "dependencies": { "@types/lodash-es": "^4.17.12", - "axios": "^1.12.2", + "axios": "^1.13.1", + "laravel-precognition": "^0.7.3", "lodash-es": "^4.17.21", "qs": "^6.14.0" }, @@ -64,7 +65,7 @@ "@types/nprogress": "^0.2.3", "@types/qs": "^6.14.0", "es-check": "^9.4.4", - "esbuild": "^0.25.11", + "esbuild": "^0.25.12", "esbuild-node-externals": "^1.18.0", "typescript": "^5.9.3" } diff --git a/packages/react/package.json b/packages/react/package.json index 429bd7a95..9dd25a3d1 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -54,9 +54,9 @@ "devDependencies": { "@types/react": "^19.2.2", "@types/react-dom": "^19.2.2", - "axios": "^1.12.2", + "axios": "^1.13.1", "es-check": "^9.4.4", - "esbuild": "^0.25.11", + "esbuild": "^0.25.12", "esbuild-node-externals": "^1.18.0", "react": "^19.2.0", "typescript": "^5.9.3" @@ -67,6 +67,7 @@ "dependencies": { "@inertiajs/core": "workspace:*", "@types/lodash-es": "^4.17.12", + "laravel-precognition": "^0.7.3", "lodash-es": "^4.17.21" } } diff --git a/packages/react/test-app/package.json b/packages/react/test-app/package.json index 383696be6..9db5c8677 100755 --- a/packages/react/test-app/package.json +++ b/packages/react/test-app/package.json @@ -7,18 +7,18 @@ "type-check": "tsc --noEmit" }, "devDependencies": { - "@eslint/js": "^9.38.0", - "@types/node": "^24.9.1", + "@eslint/js": "^9.39.1", + "@types/node": "^24.10.0", "@types/react": "^19.2.2", "@types/react-dom": "^19.2.2", - "eslint": "^9.38.0", + "eslint": "^9.39.1", "eslint-config-prettier": "^10.1.8", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^5.2.0", - "globals": "^16.4.0", + "globals": "^16.5.0", "nodemon": "^3.1.10", "typescript": "^5.9.3", - "typescript-eslint": "^8.46.2", + "typescript-eslint": "^8.46.3", "vite": "^6.4.1" }, "dependencies": { diff --git a/packages/svelte/package.json b/packages/svelte/package.json index 36ff1d4f1..38577451c 100644 --- a/packages/svelte/package.json +++ b/packages/svelte/package.json @@ -45,10 +45,10 @@ }, "devDependencies": { "@sveltejs/adapter-auto": "^3.3.1", - "@sveltejs/kit": "^2.47.2", + "@sveltejs/kit": "^2.48.4", "@sveltejs/package": "^2.5.4", "@sveltejs/vite-plugin-svelte": "^3.1.2", - "axios": "^1.12.2", + "axios": "^1.13.1", "es-check": "^9.4.4", "publint": "^0.2.12", "svelte": "^4.2.20", @@ -63,6 +63,7 @@ "dependencies": { "@inertiajs/core": "workspace:*", "@types/lodash-es": "^4.17.12", + "laravel-precognition": "^0.7.3", "lodash-es": "^4.17.21" } } diff --git a/packages/svelte/test-app/package.json b/packages/svelte/test-app/package.json index 1c20d49a0..29ab0a80e 100644 --- a/packages/svelte/test-app/package.json +++ b/packages/svelte/test-app/package.json @@ -7,18 +7,18 @@ "type-check": "svelte-check --tsconfig ./tsconfig.json" }, "devDependencies": { - "@eslint/js": "^9.38.0", + "@eslint/js": "^9.39.1", "@sveltejs/eslint-config": "^8.3.4", "@sveltejs/vite-plugin-svelte": "^3.1.2", "@tsconfig/svelte": "^5.0.5", - "eslint": "^9.38.0", - "eslint-plugin-svelte": "^3.12.5", - "globals": "^16.4.0", + "eslint": "^9.39.1", + "eslint-plugin-svelte": "^3.13.0", + "globals": "^16.5.0", "nodemon": "^3.1.10", "svelte": "^4.2.20", "svelte-check": "^4.3.3", "typescript": "^5.9.3", - "typescript-eslint": "^8.46.2", + "typescript-eslint": "^8.46.3", "vite": "^5.4.21" }, "dependencies": { diff --git a/packages/vue3/package.json b/packages/vue3/package.json index c740a95c1..8b368a2e4 100644 --- a/packages/vue3/package.json +++ b/packages/vue3/package.json @@ -51,10 +51,10 @@ "es2020-check": "pnpm build:with-deps && es-check es2020 \"dist/index.esm.js\" --checkFeatures --module --noCache --verbose" }, "devDependencies": { - "@types/node": "^22.18.12", - "axios": "^1.12.2", + "@types/node": "^22.19.0", + "axios": "^1.13.1", "es-check": "^9.4.4", - "esbuild": "^0.25.11", + "esbuild": "^0.25.12", "esbuild-node-externals": "^1.18.0", "typescript": "^5.9.3", "vue": "^3.5.22" @@ -65,6 +65,7 @@ "dependencies": { "@inertiajs/core": "workspace:*", "@types/lodash-es": "^4.17.12", + "laravel-precognition": "^0.7.3", "lodash-es": "^4.17.21" } } diff --git a/packages/vue3/src/useForm.ts b/packages/vue3/src/useForm.ts index aa241b30e..088ca8eba 100644 --- a/packages/vue3/src/useForm.ts +++ b/packages/vue3/src/useForm.ts @@ -5,6 +5,7 @@ import { FormDataKeys, FormDataType, FormDataValues, + isUrlMethodPair, Method, Progress, RequestPayload, @@ -12,12 +13,20 @@ import { UrlMethodPair, VisitOptions, } from '@inertiajs/core' +import { + createValidator, + NamedInputEvent, + resolveName, + toSimpleValidationErrors, + ValidationConfig, + Validator, +} from 'laravel-precognition' import { cloneDeep, get, has, isEqual, set } from 'lodash-es' import { reactive, watch } from 'vue' import { config } from '.' type FormOptions = Omit -type SubmitArgs = [Method, string, FormOptions?] | [UrlMethodPair, FormOptions?] +type SubmitArgs = [Method, string, FormOptions?] | [UrlMethodPair, FormOptions?] | [FormOptions?] type TransformCallback = (data: TForm) => object export interface InertiaFormProps { @@ -45,9 +54,28 @@ export interface InertiaFormProps { patch(url: string, options?: FormOptions): void delete(url: string, options?: FormOptions): void cancel(): void + withPrecognition( + method: Method | UrlMethodPair | (() => Method), + url?: string | (() => string), + ): InertiaPrecognitiveForm +} + +export interface InertiaFormValidationProps { + validator: () => Validator + validating: boolean + valid(field: string): boolean + invalid(field: string): boolean + touched(field?: string): boolean + setValidationTimeout(duration: number): this + validateFiles(): this + withoutFileValidation(): this + validate(field?: string | NamedInputEvent | ValidationConfig, config?: ValidationConfig): this + touch(...fields: string[]): this + withFullErrors(): this } export type InertiaForm = TForm & InertiaFormProps +export type InertiaPrecognitiveForm = InertiaForm & InertiaFormValidationProps export default function useForm>(data: TForm | (() => TForm)): InertiaForm export default function useForm>( @@ -68,6 +96,39 @@ export default function useForm>( let recentlySuccessfulTimeoutId: ReturnType let transform: TransformCallback = (data) => data + let precognitionUrl: string | (() => string) | null = null + let precognitionMethod: Method | (() => Method) | null = null + let validator: Validator | null = null + + const parseSubmitArgs = (args: SubmitArgs): [Method, string, FormOptions] => { + let method: Method = typeof precognitionMethod === 'function' ? precognitionMethod() : precognitionMethod! + let url: string = typeof precognitionUrl === 'function' ? precognitionUrl() : precognitionUrl! + let options: FormOptions = {} + + if (args.length === 0) { + // No arguments passed, use precognition values + return [method, url, options] + } + + if (args.length === 3) { + // All arguments passed + return [args[0], args[1], args[2] ?? {}] + } + + if (isUrlMethodPair(args[0])) { + // Wayfinder + optional options + return [args[0].method, args[0].url, (args[1] ?? {}) as FormOptions] + } + + if (typeof args[0] === 'object') { + // Only options passed, use precognition values + return [method, url, args[0]] + } + + // Method + URL + return [args[0] as Method, args[1] as string, {}] + } + // Track if defaults was called manually during onSuccess to avoid // overriding user's custom defaults with automatic behavior. let defaultsCalledInOnSuccess = false @@ -81,6 +142,104 @@ export default function useForm>( progress: null, wasSuccessful: false, recentlySuccessful: false, + withPrecognition(method: Method | UrlMethodPair | (() => Method), url?: string | (() => string)) { + if (isUrlMethodPair(method)) { + precognitionMethod = method.method + precognitionUrl = method.url + } else { + precognitionMethod = method + precognitionUrl = url! + } + + let simpleValidationErrors = true + + validator = createValidator((client) => { + const method = typeof precognitionMethod === 'function' ? precognitionMethod() : precognitionMethod! + const url = typeof precognitionUrl === 'function' ? precognitionUrl() : precognitionUrl! + + const transformedData = transform(this.data()) as Record + + return client[method](url, transformedData) + }, defaults) + .on('validatingChanged', () => { + this.validating = validator!.validating() + }) + .on('validatedChanged', () => { + this.__valid = validator!.valid() + }) + .on('touchedChanged', () => { + this.__touched = validator!.touched() + }) + .on('errorsChanged', () => { + this.errors = {} + + this.setError(simpleValidationErrors ? toSimpleValidationErrors(validator!.errors()) : validator!.errors()) + + this.__valid = validator!.valid() + }) + + Object.assign(this, { + __touched: [], + __valid: [], + validator: () => validator!, + validating: false, + setValidationTimeout: (duration: number) => { + validator!.setTimeout(duration) + + return this + }, + validateFiles: () => { + validator!.validateFiles() + + return this + }, + withFullErrors: () => { + simpleValidationErrors = false + + return this + }, + withoutFileValidation: () => { + // @ts-expect-error - Not released yet... + validator!.withoutFileValidation() + + return this + }, + valid: (field: string) => this.__valid.includes(field), + invalid: (field: string) => this.errors[field] !== undefined, + validate: (field?: string | NamedInputEvent | ValidationConfig, config?: ValidationConfig) => { + if (typeof field === 'object' && !('target' in field)) { + config = field + field = undefined + } + + if (typeof field === 'undefined') { + validator!.validate(config) + } else { + field = resolveName(field) + + const transformedData = transform(this.data()) as Record + + validator!.validate(field, get(transformedData, field), config) + } + + return this + }, + touch: (...fields: string[]) => { + validator!.touch(fields) + + return this + }, + touched: (field?: string): boolean => { + if (typeof field === 'string') { + return this.__touched.includes(field) + } + + return this.__touched.length > 0 + }, + }) + + return this + }, data() { return (Object.keys(defaults) as Array>).reduce((carry, key) => { return set(carry, key, get(this, key)) @@ -125,13 +284,20 @@ export default function useForm>( }) } + validator?.reset(...fields) + return this }, setError(fieldOrFields: FormDataKeys | FormDataErrors, maybeValue?: ErrorValue) { - Object.assign(this.errors, typeof fieldOrFields === 'string' ? { [fieldOrFields]: maybeValue } : fieldOrFields) + const errors = typeof fieldOrFields === 'string' ? { [fieldOrFields]: maybeValue } : fieldOrFields + + Object.assign(this.errors, errors) this.hasErrors = Object.keys(this.errors).length > 0 + // @ts-expect-error - validator may be null + validator?.setErrors(errors) + return this }, clearErrors(...fields: string[]) { @@ -145,6 +311,14 @@ export default function useForm>( this.hasErrors = Object.keys(this.errors).length > 0 + if (validator) { + if (fields.length === 0) { + validator.setErrors({}) + } else { + fields.forEach(validator.forgetError) + } + } + return this }, resetAndClearErrors(...fields: string[]) { @@ -153,11 +327,7 @@ export default function useForm>( return this }, submit(...args: SubmitArgs) { - const objectPassed = args[0] !== null && typeof args[0] === 'object' - - const method = objectPassed ? args[0].method : (args[0] as Method) - const url = objectPassed ? args[0].url : (args[1] as string) - const options = (objectPassed ? args[1] : args[2]) ?? {} + const [method, url, options] = parseSubmitArgs(args) defaultsCalledInOnSuccess = false diff --git a/packages/vue3/test-app/Pages/FormHelper/Precognition/AllErrors.vue b/packages/vue3/test-app/Pages/FormHelper/Precognition/AllErrors.vue new file mode 100644 index 000000000..94aeb9271 --- /dev/null +++ b/packages/vue3/test-app/Pages/FormHelper/Precognition/AllErrors.vue @@ -0,0 +1,43 @@ + + + diff --git a/packages/vue3/test-app/Pages/FormHelper/Precognition/ArrayErrors.vue b/packages/vue3/test-app/Pages/FormHelper/Precognition/ArrayErrors.vue new file mode 100644 index 000000000..cf9a40ccf --- /dev/null +++ b/packages/vue3/test-app/Pages/FormHelper/Precognition/ArrayErrors.vue @@ -0,0 +1,32 @@ + + + diff --git a/packages/vue3/test-app/Pages/FormHelper/Precognition/BeforeValidation.vue b/packages/vue3/test-app/Pages/FormHelper/Precognition/BeforeValidation.vue new file mode 100644 index 000000000..e891221b0 --- /dev/null +++ b/packages/vue3/test-app/Pages/FormHelper/Precognition/BeforeValidation.vue @@ -0,0 +1,57 @@ + + + diff --git a/packages/vue3/test-app/Pages/FormHelper/Precognition/Callbacks.vue b/packages/vue3/test-app/Pages/FormHelper/Precognition/Callbacks.vue new file mode 100644 index 000000000..b9aa16d80 --- /dev/null +++ b/packages/vue3/test-app/Pages/FormHelper/Precognition/Callbacks.vue @@ -0,0 +1,56 @@ + + + diff --git a/packages/vue3/test-app/Pages/FormHelper/Precognition/Cancel.vue b/packages/vue3/test-app/Pages/FormHelper/Precognition/Cancel.vue new file mode 100644 index 000000000..f8bf59d97 --- /dev/null +++ b/packages/vue3/test-app/Pages/FormHelper/Precognition/Cancel.vue @@ -0,0 +1,29 @@ + + + diff --git a/packages/vue3/test-app/Pages/FormHelper/Precognition/Default.vue b/packages/vue3/test-app/Pages/FormHelper/Precognition/Default.vue new file mode 100644 index 000000000..58201ac95 --- /dev/null +++ b/packages/vue3/test-app/Pages/FormHelper/Precognition/Default.vue @@ -0,0 +1,32 @@ + + + diff --git a/packages/vue3/test-app/Pages/FormHelper/Precognition/Files.vue b/packages/vue3/test-app/Pages/FormHelper/Precognition/Files.vue new file mode 100644 index 000000000..9883699cd --- /dev/null +++ b/packages/vue3/test-app/Pages/FormHelper/Precognition/Files.vue @@ -0,0 +1,46 @@ + + + diff --git a/packages/vue3/test-app/Pages/FormHelper/Precognition/Headers.vue b/packages/vue3/test-app/Pages/FormHelper/Precognition/Headers.vue new file mode 100644 index 000000000..9967ee9b6 --- /dev/null +++ b/packages/vue3/test-app/Pages/FormHelper/Precognition/Headers.vue @@ -0,0 +1,32 @@ + + + diff --git a/packages/vue3/test-app/Pages/FormHelper/Precognition/Methods.vue b/packages/vue3/test-app/Pages/FormHelper/Precognition/Methods.vue new file mode 100644 index 000000000..77f5480b3 --- /dev/null +++ b/packages/vue3/test-app/Pages/FormHelper/Precognition/Methods.vue @@ -0,0 +1,53 @@ + + + diff --git a/packages/vue3/test-app/Pages/FormHelper/Precognition/Transform.vue b/packages/vue3/test-app/Pages/FormHelper/Precognition/Transform.vue new file mode 100644 index 000000000..91d0b6ea7 --- /dev/null +++ b/packages/vue3/test-app/Pages/FormHelper/Precognition/Transform.vue @@ -0,0 +1,24 @@ + + + diff --git a/packages/vue3/test-app/package.json b/packages/vue3/test-app/package.json index 2750f85a8..56b8d5bef 100755 --- a/packages/vue3/test-app/package.json +++ b/packages/vue3/test-app/package.json @@ -7,16 +7,16 @@ "type-check": "vue-tsc --noEmit" }, "devDependencies": { - "@eslint/js": "^9.38.0", + "@eslint/js": "^9.39.1", "@vitejs/plugin-vue": "^5.2.4", "@vue/eslint-config-typescript": "^14.6.0", - "eslint": "^9.38.0", + "eslint": "^9.39.1", "eslint-config-prettier": "^10.1.8", "eslint-plugin-vue": "^10.5.1", - "globals": "^16.4.0", + "globals": "^16.5.0", "nodemon": "^3.1.10", "typescript": "^5.9.3", - "typescript-eslint": "^8.46.2", + "typescript-eslint": "^8.46.3", "vite": "^6.4.1", "vue": "^3.5.22", "vue-tsc": "^2.2.12" diff --git a/playgrounds/react/package.json b/playgrounds/react/package.json index 8efae28f1..ffa86dc14 100644 --- a/playgrounds/react/package.json +++ b/playgrounds/react/package.json @@ -11,18 +11,18 @@ "@inertiajs/react": "workspace:*", "@laravel/stream-react": "^0.3.9", "@tailwindcss/typography": "^0.5.19", - "@tailwindcss/vite": "^4.1.15", + "@tailwindcss/vite": "^4.1.16", "@types/react": "^19.2.2", "@types/react-dom": "^19.2.2", "@vitejs/plugin-react": "^4.7.0", "autosize": "^6.0.1", - "axios": "^1.12.2", + "axios": "^1.13.1", "laravel-vite-plugin": "^1.3.0", "lodash": "^4.17.21", "marked": "^16.4.1", "react": "^19.2.0", "react-dom": "^19.2.0", - "tailwindcss": "^4.1.15", + "tailwindcss": "^4.1.16", "typescript": "^4.9.5", "vite": "^6.4.1" } diff --git a/playgrounds/svelte4/package.json b/playgrounds/svelte4/package.json index dfd2bbe84..a3c0f51d2 100644 --- a/playgrounds/svelte4/package.json +++ b/playgrounds/svelte4/package.json @@ -12,14 +12,14 @@ "@inertiajs/core": "workspace:*", "@inertiajs/svelte": "workspace:*", "@sveltejs/vite-plugin-svelte": "^3.1.2", - "@tailwindcss/vite": "^4.1.15", + "@tailwindcss/vite": "^4.1.16", "@tsconfig/svelte": "^5.0.5", - "axios": "^1.12.2", + "axios": "^1.13.1", "laravel-vite-plugin": "^1.3.0", "lodash": "^4.17.21", "svelte": "^4.2.20", "svelte-check": "^4.3.3", - "tailwindcss": "^4.1.15", + "tailwindcss": "^4.1.16", "typescript": "^5.9.3", "vite": "^5.4.21" } diff --git a/playgrounds/svelte5/package.json b/playgrounds/svelte5/package.json index 43c6dc760..61ff816e3 100644 --- a/playgrounds/svelte5/package.json +++ b/playgrounds/svelte5/package.json @@ -12,14 +12,14 @@ "@inertiajs/core": "workspace:*", "@inertiajs/svelte": "workspace:*", "@sveltejs/vite-plugin-svelte": "^5.1.1", - "@tailwindcss/vite": "^4.1.15", + "@tailwindcss/vite": "^4.1.16", "@tsconfig/svelte": "^5.0.5", - "axios": "^1.12.2", + "axios": "^1.13.1", "laravel-vite-plugin": "^1.3.0", "lodash": "^4.17.21", - "svelte": "^5.41.1", + "svelte": "^5.43.3", "svelte-check": "^4.3.3", - "tailwindcss": "^4.1.15", + "tailwindcss": "^4.1.16", "typescript": "^5.9.3", "vite": "^6.4.1" } diff --git a/playgrounds/vue3/package.json b/playgrounds/vue3/package.json index ced3a6aa9..611843520 100644 --- a/playgrounds/vue3/package.json +++ b/playgrounds/vue3/package.json @@ -10,15 +10,15 @@ "@inertiajs/vue3": "workspace:*", "@laravel/stream-vue": "^0.3.9", "@tailwindcss/typography": "^0.5.19", - "@tailwindcss/vite": "^4.1.15", + "@tailwindcss/vite": "^4.1.16", "@vitejs/plugin-vue": "^5.2.4", "@vue/server-renderer": "^3.5.22", "autosize": "^6.0.1", - "axios": "^1.12.2", + "axios": "^1.13.1", "laravel-vite-plugin": "^1.3.0", "lodash": "^4.17.21", "marked": "^16.4.1", - "tailwindcss": "^4.1.15", + "tailwindcss": "^4.1.16", "typescript": "^5.9.3", "vite": "^6.4.1", "vue": "^3.5.22", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3945c6520..940c9fe8d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,10 +19,10 @@ importers: version: 4.3.0(prettier@3.6.2)(typescript@5.9.3)(vue-tsc@2.2.12(typescript@5.9.3)) prettier-plugin-svelte: specifier: ^3.4.0 - version: 3.4.0(prettier@3.6.2)(svelte@5.41.1) + version: 3.4.0(prettier@3.6.2)(svelte@5.43.3) prettier-plugin-tailwindcss: specifier: ^0.6.14 - version: 0.6.14(prettier-plugin-organize-imports@4.3.0(prettier@3.6.2)(typescript@5.9.3)(vue-tsc@2.2.12(typescript@5.9.3)))(prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.41.1))(prettier@3.6.2) + version: 0.6.14(prettier-plugin-organize-imports@4.3.0(prettier@3.6.2)(typescript@5.9.3)(vue-tsc@2.2.12(typescript@5.9.3)))(prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.43.3))(prettier@3.6.2) optionalDependencies: '@rollup/rollup-linux-x64-gnu': specifier: ^4.52.5 @@ -34,8 +34,11 @@ importers: specifier: ^4.17.12 version: 4.17.12 axios: - specifier: ^1.12.2 - version: 1.12.2 + specifier: ^1.13.1 + version: 1.13.1 + laravel-precognition: + specifier: ^0.7.3 + version: 0.7.3 lodash-es: specifier: ^4.17.21 version: 4.17.21 @@ -59,11 +62,11 @@ importers: specifier: ^9.4.4 version: 9.4.4 esbuild: - specifier: ^0.25.11 - version: 0.25.11 + specifier: ^0.25.12 + version: 0.25.12 esbuild-node-externals: specifier: ^1.18.0 - version: 1.18.0(esbuild@0.25.11) + version: 1.18.0(esbuild@0.25.12) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -76,6 +79,9 @@ importers: '@types/lodash-es': specifier: ^4.17.12 version: 4.17.12 + laravel-precognition: + specifier: ^0.7.3 + version: 0.7.3 lodash-es: specifier: ^4.17.21 version: 4.17.21 @@ -87,17 +93,17 @@ importers: specifier: ^19.2.2 version: 19.2.2(@types/react@19.2.2) axios: - specifier: ^1.12.2 - version: 1.12.2 + specifier: ^1.13.1 + version: 1.13.1 es-check: specifier: ^9.4.4 version: 9.4.4 esbuild: - specifier: ^0.25.11 - version: 0.25.11 + specifier: ^0.25.12 + version: 0.25.12 esbuild-node-externals: specifier: ^1.18.0 - version: 1.18.0(esbuild@0.25.11) + version: 1.18.0(esbuild@0.25.12) react: specifier: ^19.2.0 version: 19.2.0 @@ -115,7 +121,7 @@ importers: version: link:.. '@vitejs/plugin-react': specifier: ^4.7.0 - version: 4.7.0(vite@6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)) + version: 4.7.0(vite@6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)) react: specifier: ^19.2.0 version: 19.2.0 @@ -124,11 +130,11 @@ importers: version: 19.2.0(react@19.2.0) devDependencies: '@eslint/js': - specifier: ^9.38.0 - version: 9.38.0 + specifier: ^9.39.1 + version: 9.39.1 '@types/node': - specifier: ^24.9.1 - version: 24.9.1 + specifier: ^24.10.0 + version: 24.10.0 '@types/react': specifier: ^19.2.2 version: 19.2.2 @@ -136,20 +142,20 @@ importers: specifier: ^19.2.2 version: 19.2.2(@types/react@19.2.2) eslint: - specifier: ^9.38.0 - version: 9.38.0(jiti@2.6.1) + specifier: ^9.39.1 + version: 9.39.1(jiti@2.6.1) eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@9.38.0(jiti@2.6.1)) + version: 10.1.8(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@9.38.0(jiti@2.6.1)) + version: 7.37.5(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.38.0(jiti@2.6.1)) + version: 5.2.0(eslint@9.39.1(jiti@2.6.1)) globals: - specifier: ^16.4.0 - version: 16.4.0 + specifier: ^16.5.0 + version: 16.5.0 nodemon: specifier: ^3.1.10 version: 3.1.10 @@ -157,11 +163,11 @@ importers: specifier: ^5.9.3 version: 5.9.3 typescript-eslint: - specifier: ^8.46.2 - version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + specifier: ^8.46.3 + version: 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) vite: specifier: ^6.4.1 - version: 6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0) + version: 6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0) packages/svelte: dependencies: @@ -171,25 +177,28 @@ importers: '@types/lodash-es': specifier: ^4.17.12 version: 4.17.12 + laravel-precognition: + specifier: ^0.7.3 + version: 0.7.3 lodash-es: specifier: ^4.17.21 version: 4.17.21 devDependencies: '@sveltejs/adapter-auto': specifier: ^3.3.1 - version: 3.3.1(@sveltejs/kit@2.47.2(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0)))(svelte@4.2.20)(vite@5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0))) + version: 3.3.1(@sveltejs/kit@2.48.4(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0)))(svelte@4.2.20)(vite@5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0))) '@sveltejs/kit': - specifier: ^2.47.2 - version: 2.47.2(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0)))(svelte@4.2.20)(vite@5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0)) + specifier: ^2.48.4 + version: 2.48.4(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0)))(svelte@4.2.20)(vite@5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0)) '@sveltejs/package': specifier: ^2.5.4 version: 2.5.4(svelte@4.2.20)(typescript@5.9.3) '@sveltejs/vite-plugin-svelte': specifier: ^3.1.2 - version: 3.1.2(svelte@4.2.20)(vite@5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0)) + version: 3.1.2(svelte@4.2.20)(vite@5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0)) axios: - specifier: ^1.12.2 - version: 1.12.2 + specifier: ^1.13.1 + version: 1.13.1 es-check: specifier: ^9.4.4 version: 9.4.4 @@ -210,7 +219,7 @@ importers: version: 5.9.3 vite: specifier: ^5.4.21 - version: 5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0) + version: 5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0) packages/svelte/test-app: dependencies: @@ -222,26 +231,26 @@ importers: version: link:.. devDependencies: '@eslint/js': - specifier: ^9.38.0 - version: 9.38.0 + specifier: ^9.39.1 + version: 9.39.1 '@sveltejs/eslint-config': specifier: ^8.3.4 - version: 8.3.4(@stylistic/eslint-plugin-js@4.4.1(eslint@9.38.0(jiti@2.6.1)))(eslint-config-prettier@10.1.8(eslint@9.38.0(jiti@2.6.1)))(eslint-plugin-n@17.23.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-plugin-svelte@3.12.5(eslint@9.38.0(jiti@2.6.1))(svelte@4.2.20))(eslint@9.38.0(jiti@2.6.1))(typescript-eslint@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(typescript@5.9.3) + version: 8.3.4(@stylistic/eslint-plugin-js@4.4.1(eslint@9.39.1(jiti@2.6.1)))(eslint-config-prettier@10.1.8(eslint@9.39.1(jiti@2.6.1)))(eslint-plugin-n@17.23.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-plugin-svelte@3.13.0(eslint@9.39.1(jiti@2.6.1))(svelte@4.2.20))(eslint@9.39.1(jiti@2.6.1))(typescript-eslint@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(typescript@5.9.3) '@sveltejs/vite-plugin-svelte': specifier: ^3.1.2 - version: 3.1.2(svelte@4.2.20)(vite@5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0)) + version: 3.1.2(svelte@4.2.20)(vite@5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0)) '@tsconfig/svelte': specifier: ^5.0.5 version: 5.0.5 eslint: - specifier: ^9.38.0 - version: 9.38.0(jiti@2.6.1) + specifier: ^9.39.1 + version: 9.39.1(jiti@2.6.1) eslint-plugin-svelte: - specifier: ^3.12.5 - version: 3.12.5(eslint@9.38.0(jiti@2.6.1))(svelte@4.2.20) + specifier: ^3.13.0 + version: 3.13.0(eslint@9.39.1(jiti@2.6.1))(svelte@4.2.20) globals: - specifier: ^16.4.0 - version: 16.4.0 + specifier: ^16.5.0 + version: 16.5.0 nodemon: specifier: ^3.1.10 version: 3.1.10 @@ -255,11 +264,11 @@ importers: specifier: ^5.9.3 version: 5.9.3 typescript-eslint: - specifier: ^8.46.2 - version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + specifier: ^8.46.3 + version: 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) vite: specifier: ^5.4.21 - version: 5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0) + version: 5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0) packages/vue3: dependencies: @@ -269,25 +278,28 @@ importers: '@types/lodash-es': specifier: ^4.17.12 version: 4.17.12 + laravel-precognition: + specifier: ^0.7.3 + version: 0.7.3 lodash-es: specifier: ^4.17.21 version: 4.17.21 devDependencies: '@types/node': - specifier: ^22.18.12 - version: 22.18.12 + specifier: ^22.19.0 + version: 22.19.0 axios: - specifier: ^1.12.2 - version: 1.12.2 + specifier: ^1.13.1 + version: 1.13.1 es-check: specifier: ^9.4.4 version: 9.4.4 esbuild: - specifier: ^0.25.11 - version: 0.25.11 + specifier: ^0.25.12 + version: 0.25.12 esbuild-node-externals: specifier: ^1.18.0 - version: 1.18.0(esbuild@0.25.11) + version: 1.18.0(esbuild@0.25.12) typescript: specifier: ^5.9.3 version: 5.9.3 @@ -305,26 +317,26 @@ importers: version: link:.. devDependencies: '@eslint/js': - specifier: ^9.38.0 - version: 9.38.0 + specifier: ^9.39.1 + version: 9.39.1 '@vitejs/plugin-vue': specifier: ^5.2.4 - version: 5.2.4(vite@6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0))(vue@3.5.22(typescript@5.9.3)) + version: 5.2.4(vite@6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0))(vue@3.5.22(typescript@5.9.3)) '@vue/eslint-config-typescript': specifier: ^14.6.0 - version: 14.6.0(eslint-plugin-vue@10.5.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.38.0(jiti@2.6.1))))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + version: 14.6.0(eslint-plugin-vue@10.5.1(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.1(jiti@2.6.1))))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: - specifier: ^9.38.0 - version: 9.38.0(jiti@2.6.1) + specifier: ^9.39.1 + version: 9.39.1(jiti@2.6.1) eslint-config-prettier: specifier: ^10.1.8 - version: 10.1.8(eslint@9.38.0(jiti@2.6.1)) + version: 10.1.8(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-vue: specifier: ^10.5.1 - version: 10.5.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.38.0(jiti@2.6.1))) + version: 10.5.1(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.1(jiti@2.6.1))) globals: - specifier: ^16.4.0 - version: 16.4.0 + specifier: ^16.5.0 + version: 16.5.0 nodemon: specifier: ^3.1.10 version: 3.1.10 @@ -332,11 +344,11 @@ importers: specifier: ^5.9.3 version: 5.9.3 typescript-eslint: - specifier: ^8.46.2 - version: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + specifier: ^8.46.3 + version: 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) vite: specifier: ^6.4.1 - version: 6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0) + version: 6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0) vue: specifier: ^3.5.22 version: 3.5.22(typescript@5.9.3) @@ -357,10 +369,10 @@ importers: version: 0.3.9(react@19.2.0) '@tailwindcss/typography': specifier: ^0.5.19 - version: 0.5.19(tailwindcss@4.1.15) + version: 0.5.19(tailwindcss@4.1.16) '@tailwindcss/vite': - specifier: ^4.1.15 - version: 4.1.15(vite@6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)) + specifier: ^4.1.16 + version: 4.1.16(vite@6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)) '@types/react': specifier: ^19.2.2 version: 19.2.2 @@ -369,16 +381,16 @@ importers: version: 19.2.2(@types/react@19.2.2) '@vitejs/plugin-react': specifier: ^4.7.0 - version: 4.7.0(vite@6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)) + version: 4.7.0(vite@6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)) autosize: specifier: ^6.0.1 version: 6.0.1 axios: - specifier: ^1.12.2 - version: 1.12.2 + specifier: ^1.13.1 + version: 1.13.1 laravel-vite-plugin: specifier: ^1.3.0 - version: 1.3.0(vite@6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)) + version: 1.3.0(vite@6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)) lodash: specifier: ^4.17.21 version: 4.17.21 @@ -392,14 +404,14 @@ importers: specifier: ^19.2.0 version: 19.2.0(react@19.2.0) tailwindcss: - specifier: ^4.1.15 - version: 4.1.15 + specifier: ^4.1.16 + version: 4.1.16 typescript: specifier: ^4.9.5 version: 4.9.5 vite: specifier: ^6.4.1 - version: 6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0) + version: 6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0) playgrounds/svelte4: devDependencies: @@ -411,19 +423,19 @@ importers: version: link:../../packages/svelte '@sveltejs/vite-plugin-svelte': specifier: ^3.1.2 - version: 3.1.2(svelte@4.2.20)(vite@5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0)) + version: 3.1.2(svelte@4.2.20)(vite@5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0)) '@tailwindcss/vite': - specifier: ^4.1.15 - version: 4.1.15(vite@5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0)) + specifier: ^4.1.16 + version: 4.1.16(vite@5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0)) '@tsconfig/svelte': specifier: ^5.0.5 version: 5.0.5 axios: - specifier: ^1.12.2 - version: 1.12.2 + specifier: ^1.13.1 + version: 1.13.1 laravel-vite-plugin: specifier: ^1.3.0 - version: 1.3.0(vite@5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0)) + version: 1.3.0(vite@5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0)) lodash: specifier: ^4.17.21 version: 4.17.21 @@ -434,14 +446,14 @@ importers: specifier: ^4.3.3 version: 4.3.3(picomatch@4.0.3)(svelte@4.2.20)(typescript@5.9.3) tailwindcss: - specifier: ^4.1.15 - version: 4.1.15 + specifier: ^4.1.16 + version: 4.1.16 typescript: specifier: ^5.9.3 version: 5.9.3 vite: specifier: ^5.4.21 - version: 5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0) + version: 5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0) playgrounds/svelte5: devDependencies: @@ -453,37 +465,37 @@ importers: version: link:../../packages/svelte '@sveltejs/vite-plugin-svelte': specifier: ^5.1.1 - version: 5.1.1(svelte@5.41.1)(vite@6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)) + version: 5.1.1(svelte@5.43.3)(vite@6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)) '@tailwindcss/vite': - specifier: ^4.1.15 - version: 4.1.15(vite@6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)) + specifier: ^4.1.16 + version: 4.1.16(vite@6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)) '@tsconfig/svelte': specifier: ^5.0.5 version: 5.0.5 axios: - specifier: ^1.12.2 - version: 1.12.2 + specifier: ^1.13.1 + version: 1.13.1 laravel-vite-plugin: specifier: ^1.3.0 - version: 1.3.0(vite@6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)) + version: 1.3.0(vite@6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)) lodash: specifier: ^4.17.21 version: 4.17.21 svelte: - specifier: ^5.41.1 - version: 5.41.1 + specifier: ^5.43.3 + version: 5.43.3 svelte-check: specifier: ^4.3.3 - version: 4.3.3(picomatch@4.0.3)(svelte@5.41.1)(typescript@5.9.3) + version: 4.3.3(picomatch@4.0.3)(svelte@5.43.3)(typescript@5.9.3) tailwindcss: - specifier: ^4.1.15 - version: 4.1.15 + specifier: ^4.1.16 + version: 4.1.16 typescript: specifier: ^5.9.3 version: 5.9.3 vite: specifier: ^6.4.1 - version: 6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0) + version: 6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0) playgrounds/vue3: devDependencies: @@ -498,13 +510,13 @@ importers: version: 0.3.9(vue@3.5.22(typescript@5.9.3)) '@tailwindcss/typography': specifier: ^0.5.19 - version: 0.5.19(tailwindcss@4.1.15) + version: 0.5.19(tailwindcss@4.1.16) '@tailwindcss/vite': - specifier: ^4.1.15 - version: 4.1.15(vite@6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)) + specifier: ^4.1.16 + version: 4.1.16(vite@6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)) '@vitejs/plugin-vue': specifier: ^5.2.4 - version: 5.2.4(vite@6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0))(vue@3.5.22(typescript@5.9.3)) + version: 5.2.4(vite@6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0))(vue@3.5.22(typescript@5.9.3)) '@vue/server-renderer': specifier: ^3.5.22 version: 3.5.22(vue@3.5.22(typescript@5.9.3)) @@ -512,11 +524,11 @@ importers: specifier: ^6.0.1 version: 6.0.1 axios: - specifier: ^1.12.2 - version: 1.12.2 + specifier: ^1.13.1 + version: 1.13.1 laravel-vite-plugin: specifier: ^1.3.0 - version: 1.3.0(vite@6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)) + version: 1.3.0(vite@6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)) lodash: specifier: ^4.17.21 version: 4.17.21 @@ -524,14 +536,14 @@ importers: specifier: ^16.4.1 version: 16.4.1 tailwindcss: - specifier: ^4.1.15 - version: 4.1.15 + specifier: ^4.1.16 + version: 4.1.16 typescript: specifier: ^5.9.3 version: 5.9.3 vite: specifier: ^6.4.1 - version: 6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0) + version: 6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0) vue: specifier: ^3.5.22 version: 3.5.22(typescript@5.9.3) @@ -573,16 +585,16 @@ packages: resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.28.4': - resolution: {integrity: sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==} + '@babel/compat-data@7.28.5': + resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} engines: {node: '>=6.9.0'} - '@babel/core@7.28.4': - resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} + '@babel/core@7.28.5': + resolution: {integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==} engines: {node: '>=6.9.0'} - '@babel/generator@7.28.3': - resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} + '@babel/generator@7.28.5': + resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} engines: {node: '>=6.9.0'} '@babel/helper-compilation-targets@7.27.2': @@ -611,8 +623,8 @@ packages: resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} engines: {node: '>=6.9.0'} '@babel/helper-validator-option@7.27.1': @@ -627,8 +639,8 @@ packages: resolution: {integrity: sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==} engines: {node: '>=6.9.0'} - '@babel/parser@7.28.4': - resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} + '@babel/parser@7.28.5': + resolution: {integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==} engines: {node: '>=6.0.0'} hasBin: true @@ -648,12 +660,12 @@ packages: resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} - '@babel/traverse@7.28.4': - resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} + '@babel/traverse@7.28.5': + resolution: {integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.4': - resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + '@babel/types@7.28.5': + resolution: {integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==} engines: {node: '>=6.9.0'} '@colors/colors@1.6.0': @@ -669,8 +681,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.25.11': - resolution: {integrity: sha512-Xt1dOL13m8u0WE8iplx9Ibbm+hFAO0GsU2P34UNoDGvZYkY8ifSiy6Zuc1lYxfG7svWE2fzqCUmFp5HCn51gJg==} + '@esbuild/aix-ppc64@0.25.12': + resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -681,8 +693,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.25.11': - resolution: {integrity: sha512-9slpyFBc4FPPz48+f6jyiXOx/Y4v34TUeDDXJpZqAWQn/08lKGeD8aDp9TMn9jDz2CiEuHwfhRmGBvpnd/PWIQ==} + '@esbuild/android-arm64@0.25.12': + resolution: {integrity: sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -693,8 +705,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.25.11': - resolution: {integrity: sha512-uoa7dU+Dt3HYsethkJ1k6Z9YdcHjTrSb5NUy66ZfZaSV8hEYGD5ZHbEMXnqLFlbBflLsl89Zke7CAdDJ4JI+Gg==} + '@esbuild/android-arm@0.25.12': + resolution: {integrity: sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -705,8 +717,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.25.11': - resolution: {integrity: sha512-Sgiab4xBjPU1QoPEIqS3Xx+R2lezu0LKIEcYe6pftr56PqPygbB7+szVnzoShbx64MUupqoE0KyRlN7gezbl8g==} + '@esbuild/android-x64@0.25.12': + resolution: {integrity: sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -717,8 +729,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.25.11': - resolution: {integrity: sha512-VekY0PBCukppoQrycFxUqkCojnTQhdec0vevUL/EDOCnXd9LKWqD/bHwMPzigIJXPhC59Vd1WFIL57SKs2mg4w==} + '@esbuild/darwin-arm64@0.25.12': + resolution: {integrity: sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -729,8 +741,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.25.11': - resolution: {integrity: sha512-+hfp3yfBalNEpTGp9loYgbknjR695HkqtY3d3/JjSRUyPg/xd6q+mQqIb5qdywnDxRZykIHs3axEqU6l1+oWEQ==} + '@esbuild/darwin-x64@0.25.12': + resolution: {integrity: sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -741,8 +753,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.25.11': - resolution: {integrity: sha512-CmKjrnayyTJF2eVuO//uSjl/K3KsMIeYeyN7FyDBjsR3lnSJHaXlVoAK8DZa7lXWChbuOk7NjAc7ygAwrnPBhA==} + '@esbuild/freebsd-arm64@0.25.12': + resolution: {integrity: sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -753,8 +765,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.11': - resolution: {integrity: sha512-Dyq+5oscTJvMaYPvW3x3FLpi2+gSZTCE/1ffdwuM6G1ARang/mb3jvjxs0mw6n3Lsw84ocfo9CrNMqc5lTfGOw==} + '@esbuild/freebsd-x64@0.25.12': + resolution: {integrity: sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -765,8 +777,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.25.11': - resolution: {integrity: sha512-Qr8AzcplUhGvdyUF08A1kHU3Vr2O88xxP0Tm8GcdVOUm25XYcMPp2YqSVHbLuXzYQMf9Bh/iKx7YPqECs6ffLA==} + '@esbuild/linux-arm64@0.25.12': + resolution: {integrity: sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -777,8 +789,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.25.11': - resolution: {integrity: sha512-TBMv6B4kCfrGJ8cUPo7vd6NECZH/8hPpBHHlYI3qzoYFvWu2AdTvZNuU/7hsbKWqu/COU7NIK12dHAAqBLLXgw==} + '@esbuild/linux-arm@0.25.12': + resolution: {integrity: sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -789,8 +801,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.25.11': - resolution: {integrity: sha512-TmnJg8BMGPehs5JKrCLqyWTVAvielc615jbkOirATQvWWB1NMXY77oLMzsUjRLa0+ngecEmDGqt5jiDC6bfvOw==} + '@esbuild/linux-ia32@0.25.12': + resolution: {integrity: sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -801,8 +813,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.11': - resolution: {integrity: sha512-DIGXL2+gvDaXlaq8xruNXUJdT5tF+SBbJQKbWy/0J7OhU8gOHOzKmGIlfTTl6nHaCOoipxQbuJi7O++ldrxgMw==} + '@esbuild/linux-loong64@0.25.12': + resolution: {integrity: sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -813,8 +825,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.25.11': - resolution: {integrity: sha512-Osx1nALUJu4pU43o9OyjSCXokFkFbyzjXb6VhGIJZQ5JZi8ylCQ9/LFagolPsHtgw6himDSyb5ETSfmp4rpiKQ==} + '@esbuild/linux-mips64el@0.25.12': + resolution: {integrity: sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -825,8 +837,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.25.11': - resolution: {integrity: sha512-nbLFgsQQEsBa8XSgSTSlrnBSrpoWh7ioFDUmwo158gIm5NNP+17IYmNWzaIzWmgCxq56vfr34xGkOcZ7jX6CPw==} + '@esbuild/linux-ppc64@0.25.12': + resolution: {integrity: sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -837,8 +849,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.25.11': - resolution: {integrity: sha512-HfyAmqZi9uBAbgKYP1yGuI7tSREXwIb438q0nqvlpxAOs3XnZ8RsisRfmVsgV486NdjD7Mw2UrFSw51lzUk1ww==} + '@esbuild/linux-riscv64@0.25.12': + resolution: {integrity: sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -849,8 +861,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.25.11': - resolution: {integrity: sha512-HjLqVgSSYnVXRisyfmzsH6mXqyvj0SA7pG5g+9W7ESgwA70AXYNpfKBqh1KbTxmQVaYxpzA/SvlB9oclGPbApw==} + '@esbuild/linux-s390x@0.25.12': + resolution: {integrity: sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -861,14 +873,14 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.25.11': - resolution: {integrity: sha512-HSFAT4+WYjIhrHxKBwGmOOSpphjYkcswF449j6EjsjbinTZbp8PJtjsVK1XFJStdzXdy/jaddAep2FGY+wyFAQ==} + '@esbuild/linux-x64@0.25.12': + resolution: {integrity: sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.11': - resolution: {integrity: sha512-hr9Oxj1Fa4r04dNpWr3P8QKVVsjQhqrMSUzZzf+LZcYjZNqhA3IAfPQdEh1FLVUJSiu6sgAwp3OmwBfbFgG2Xg==} + '@esbuild/netbsd-arm64@0.25.12': + resolution: {integrity: sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] @@ -879,14 +891,14 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.11': - resolution: {integrity: sha512-u7tKA+qbzBydyj0vgpu+5h5AeudxOAGncb8N6C9Kh1N4n7wU1Xw1JDApsRjpShRpXRQlJLb9wY28ELpwdPcZ7A==} + '@esbuild/netbsd-x64@0.25.12': + resolution: {integrity: sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.25.11': - resolution: {integrity: sha512-Qq6YHhayieor3DxFOoYM1q0q1uMFYb7cSpLD2qzDSvK1NAvqFi8Xgivv0cFC6J+hWVw2teCYltyy9/m/14ryHg==} + '@esbuild/openbsd-arm64@0.25.12': + resolution: {integrity: sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -897,14 +909,14 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.11': - resolution: {integrity: sha512-CN+7c++kkbrckTOz5hrehxWN7uIhFFlmS/hqziSFVWpAzpWrQoAG4chH+nN3Be+Kzv/uuo7zhX716x3Sn2Jduw==} + '@esbuild/openbsd-x64@0.25.12': + resolution: {integrity: sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.11': - resolution: {integrity: sha512-rOREuNIQgaiR+9QuNkbkxubbp8MSO9rONmwP5nKncnWJ9v5jQ4JxFnLu4zDSRPf3x4u+2VN4pM4RdyIzDty/wQ==} + '@esbuild/openharmony-arm64@0.25.12': + resolution: {integrity: sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==} engines: {node: '>=18'} cpu: [arm64] os: [openharmony] @@ -915,8 +927,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.25.11': - resolution: {integrity: sha512-nq2xdYaWxyg9DcIyXkZhcYulC6pQ2FuCgem3LI92IwMgIZ69KHeY8T4Y88pcwoLIjbed8n36CyKoYRDygNSGhA==} + '@esbuild/sunos-x64@0.25.12': + resolution: {integrity: sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -927,8 +939,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.25.11': - resolution: {integrity: sha512-3XxECOWJq1qMZ3MN8srCJ/QfoLpL+VaxD/WfNRm1O3B4+AZ/BnLVgFbUV3eiRYDMXetciH16dwPbbHqwe1uU0Q==} + '@esbuild/win32-arm64@0.25.12': + resolution: {integrity: sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -939,8 +951,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.25.11': - resolution: {integrity: sha512-3ukss6gb9XZ8TlRyJlgLn17ecsK4NSQTmdIXRASVsiS2sQ6zPPZklNJT5GR5tE/MUarymmy8kCEf5xPCNCqVOA==} + '@esbuild/win32-ia32@0.25.12': + resolution: {integrity: sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -951,8 +963,8 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.25.11': - resolution: {integrity: sha512-D7Hpz6A2L4hzsRpPaCYkQnGOotdUpDzSGRIv9I+1ITdHROSFUWW95ZPZWQmGka1Fg7W3zFJowyn9WGwMJ0+KPA==} + '@esbuild/win32-x64@0.25.12': + resolution: {integrity: sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -963,20 +975,20 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.12.1': - resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} + '@eslint-community/regexpp@4.12.2': + resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/config-array@0.21.1': resolution: {integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/config-helpers@0.4.1': - resolution: {integrity: sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==} + '@eslint/config-helpers@0.4.2': + resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.16.0': - resolution: {integrity: sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==} + '@eslint/core@0.17.0': + resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/eslintrc@0.4.3': @@ -987,16 +999,16 @@ packages: resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.38.0': - resolution: {integrity: sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==} + '@eslint/js@9.39.1': + resolution: {integrity: sha512-S26Stp4zCy88tH94QbBv3XCuzRQiZ9yXofEILmglYTh/Ug/a9/umqvgFtYBAo3Lp0nsI/5/qH1CCrbdK3AP1Tw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.7': resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.4.0': - resolution: {integrity: sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==} + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@humanfs/core@0.19.1': @@ -1219,8 +1231,8 @@ packages: typescript: '>= 5' typescript-eslint: '>= 8' - '@sveltejs/kit@2.47.2': - resolution: {integrity: sha512-mbUomaJTiADTrq6GT4ZvQ7v1rs0S+wXGMzrjFwjARAKMEF8FpOUmz2uEJ4M9WMJMQOXCMHpKFzJfdjo9O7M22A==} + '@sveltejs/kit@2.48.4': + resolution: {integrity: sha512-TGFX1pZUt9qqY20Cv5NyYvy0iLWHf2jXi8s+eCGsig7jQMdwZWKUFMR6TbvFNhfDSUpc1sH/Y5EHv20g3HHA3g==} engines: {node: '>=18.13'} hasBin: true peerDependencies: @@ -1269,65 +1281,65 @@ packages: svelte: ^5.0.0 vite: ^6.0.0 - '@tailwindcss/node@4.1.15': - resolution: {integrity: sha512-HF4+7QxATZWY3Jr8OlZrBSXmwT3Watj0OogeDvdUY/ByXJHQ+LBtqA2brDb3sBxYslIFx6UP94BJ4X6a4L9Bmw==} + '@tailwindcss/node@4.1.16': + resolution: {integrity: sha512-BX5iaSsloNuvKNHRN3k2RcCuTEgASTo77mofW0vmeHkfrDWaoFAFvNHpEgtu0eqyypcyiBkDWzSMxJhp3AUVcw==} - '@tailwindcss/oxide-android-arm64@4.1.15': - resolution: {integrity: sha512-TkUkUgAw8At4cBjCeVCRMc/guVLKOU1D+sBPrHt5uVcGhlbVKxrCaCW9OKUIBv1oWkjh4GbunD/u/Mf0ql6kEA==} + '@tailwindcss/oxide-android-arm64@4.1.16': + resolution: {integrity: sha512-8+ctzkjHgwDJ5caq9IqRSgsP70xhdhJvm+oueS/yhD5ixLhqTw9fSL1OurzMUhBwE5zK26FXLCz2f/RtkISqHA==} engines: {node: '>= 10'} cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.1.15': - resolution: {integrity: sha512-xt5XEJpn2piMSfvd1UFN6jrWXyaKCwikP4Pidcf+yfHTSzSpYhG3dcMktjNkQO3JiLCp+0bG0HoWGvz97K162w==} + '@tailwindcss/oxide-darwin-arm64@4.1.16': + resolution: {integrity: sha512-C3oZy5042v2FOALBZtY0JTDnGNdS6w7DxL/odvSny17ORUnaRKhyTse8xYi3yKGyfnTUOdavRCdmc8QqJYwFKA==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.1.15': - resolution: {integrity: sha512-TnWaxP6Bx2CojZEXAV2M01Yl13nYPpp0EtGpUrY+LMciKfIXiLL2r/SiSRpagE5Fp2gX+rflp/Os1VJDAyqymg==} + '@tailwindcss/oxide-darwin-x64@4.1.16': + resolution: {integrity: sha512-vjrl/1Ub9+JwU6BP0emgipGjowzYZMjbWCDqwA2Z4vCa+HBSpP4v6U2ddejcHsolsYxwL5r4bPNoamlV0xDdLg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.1.15': - resolution: {integrity: sha512-quISQDWqiB6Cqhjc3iWptXVZHNVENsWoI77L1qgGEHNIdLDLFnw3/AfY7DidAiiCIkGX/MjIdB3bbBZR/G2aJg==} + '@tailwindcss/oxide-freebsd-x64@4.1.16': + resolution: {integrity: sha512-TSMpPYpQLm+aR1wW5rKuUuEruc/oOX3C7H0BTnPDn7W/eMw8W+MRMpiypKMkXZfwH8wqPIRKppuZoedTtNj2tg==} engines: {node: '>= 10'} cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.15': - resolution: {integrity: sha512-ObG76+vPlab65xzVUQbExmDU9FIeYLQ5k2LrQdR2Ud6hboR+ZobXpDoKEYXf/uOezOfIYmy2Ta3w0ejkTg9yxg==} + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.16': + resolution: {integrity: sha512-p0GGfRg/w0sdsFKBjMYvvKIiKy/LNWLWgV/plR4lUgrsxFAoQBFrXkZ4C0w8IOXfslB9vHK/JGASWD2IefIpvw==} engines: {node: '>= 10'} cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.1.15': - resolution: {integrity: sha512-4WbBacRmk43pkb8/xts3wnOZMDKsPFyEH/oisCm2q3aLZND25ufvJKcDUpAu0cS+CBOL05dYa8D4U5OWECuH/Q==} + '@tailwindcss/oxide-linux-arm64-gnu@4.1.16': + resolution: {integrity: sha512-DoixyMmTNO19rwRPdqviTrG1rYzpxgyYJl8RgQvdAQUzxC1ToLRqtNJpU/ATURSKgIg6uerPw2feW0aS8SNr/w==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-arm64-musl@4.1.15': - resolution: {integrity: sha512-AbvmEiteEj1nf42nE8skdHv73NoR+EwXVSgPY6l39X12Ex8pzOwwfi3Kc8GAmjsnsaDEbk+aj9NyL3UeyHcTLg==} + '@tailwindcss/oxide-linux-arm64-musl@4.1.16': + resolution: {integrity: sha512-H81UXMa9hJhWhaAUca6bU2wm5RRFpuHImrwXBUvPbYb+3jo32I9VIwpOX6hms0fPmA6f2pGVlybO6qU8pF4fzQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-x64-gnu@4.1.15': - resolution: {integrity: sha512-+rzMVlvVgrXtFiS+ES78yWgKqpThgV19ISKD58Ck+YO5pO5KjyxLt7AWKsWMbY0R9yBDC82w6QVGz837AKQcHg==} + '@tailwindcss/oxide-linux-x64-gnu@4.1.16': + resolution: {integrity: sha512-ZGHQxDtFC2/ruo7t99Qo2TTIvOERULPl5l0K1g0oK6b5PGqjYMga+FcY1wIUnrUxY56h28FxybtDEla+ICOyew==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-linux-x64-musl@4.1.15': - resolution: {integrity: sha512-fPdEy7a8eQN9qOIK3Em9D3TO1z41JScJn8yxl/76mp4sAXFDfV4YXxsiptJcOwy6bGR+70ZSwFIZhTXzQeqwQg==} + '@tailwindcss/oxide-linux-x64-musl@4.1.16': + resolution: {integrity: sha512-Oi1tAaa0rcKf1Og9MzKeINZzMLPbhxvm7rno5/zuP1WYmpiG0bEHq4AcRUiG2165/WUzvxkW4XDYCscZWbTLZw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@tailwindcss/oxide-wasm32-wasi@4.1.15': - resolution: {integrity: sha512-sJ4yd6iXXdlgIMfIBXuVGp/NvmviEoMVWMOAGxtxhzLPp9LOj5k0pMEMZdjeMCl4C6Up+RM8T3Zgk+BMQ0bGcQ==} + '@tailwindcss/oxide-wasm32-wasi@4.1.16': + resolution: {integrity: sha512-B01u/b8LteGRwucIBmCQ07FVXLzImWESAIMcUU6nvFt/tYsQ6IHz8DmZ5KtvmwxD+iTYBtM1xwoGXswnlu9v0Q==} engines: {node: '>=14.0.0'} cpu: [wasm32] bundledDependencies: @@ -1338,20 +1350,20 @@ packages: - '@emnapi/wasi-threads' - tslib - '@tailwindcss/oxide-win32-arm64-msvc@4.1.15': - resolution: {integrity: sha512-sJGE5faXnNQ1iXeqmRin7Ds/ru2fgCiaQZQQz3ZGIDtvbkeV85rAZ0QJFMDg0FrqsffZG96H1U9AQlNBRLsHVg==} + '@tailwindcss/oxide-win32-arm64-msvc@4.1.16': + resolution: {integrity: sha512-zX+Q8sSkGj6HKRTMJXuPvOcP8XfYON24zJBRPlszcH1Np7xuHXhWn8qfFjIujVzvH3BHU+16jBXwgpl20i+v9A==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.1.15': - resolution: {integrity: sha512-NLeHE7jUV6HcFKS504bpOohyi01zPXi2PXmjFfkzTph8xRxDdxkRsXm/xDO5uV5K3brrE1cCwbUYmFUSHR3u1w==} + '@tailwindcss/oxide-win32-x64-msvc@4.1.16': + resolution: {integrity: sha512-m5dDFJUEejbFqP+UXVstd4W/wnxA4F61q8SoL+mqTypId2T2ZpuxosNSgowiCnLp2+Z+rivdU0AqpfgiD7yCBg==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.1.15': - resolution: {integrity: sha512-krhX+UOOgnsUuks2SR7hFafXmLQrKxB4YyRTERuCE59JlYL+FawgaAlSkOYmDRJdf1Q+IFNDMl9iRnBW7QBDfQ==} + '@tailwindcss/oxide@4.1.16': + resolution: {integrity: sha512-2OSv52FRuhdlgyOQqgtQHuCgXnS8nFSYRp2tJ+4WZXKgTxqPy7SMSls8c3mPT5pkZ17SBToGM5LHEJBO7miEdg==} engines: {node: '>= 10'} '@tailwindcss/typography@0.5.19': @@ -1359,8 +1371,8 @@ packages: peerDependencies: tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' - '@tailwindcss/vite@4.1.15': - resolution: {integrity: sha512-B6s60MZRTUil+xKoZoGe6i0Iar5VuW+pmcGlda2FX+guDuQ1G1sjiIy1W0frneVpeL/ZjZ4KEgWZHNrIm++2qA==} + '@tailwindcss/vite@4.1.16': + resolution: {integrity: sha512-bbguNBcDxsRmi9nnlWJxhfDWamY3lmcyACHcdO1crxfzuLpOhHLLtEIN/nCbbAtj5rchUgQD17QVAKi1f7IsKg==} peerDependencies: vite: ^5.2.0 || ^6 || ^7 @@ -1407,11 +1419,11 @@ packages: '@types/node@18.19.130': resolution: {integrity: sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==} - '@types/node@22.18.12': - resolution: {integrity: sha512-BICHQ67iqxQGFSzfCFTT7MRQ5XcBjG5aeKh5Ok38UBbPe5fxTyE+aHFxwVrGyr8GNlqFMLKD1D3P2K/1ks8tog==} + '@types/node@22.19.0': + resolution: {integrity: sha512-xpr/lmLPQEj+TUnHmR+Ab91/glhJvsqcjB+yY0Ix9GO70H6Lb4FHH5GeqdOE5btAx7eIMwuHkp4H2MSkLcqWbA==} - '@types/node@24.9.1': - resolution: {integrity: sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==} + '@types/node@24.10.0': + resolution: {integrity: sha512-qzQZRBqkFsYyaSWXuEHc2WR9c0a0CXwiE5FWUvn7ZM+vdy1uZLfCunD38UzhuB7YN/J11ndbDBcTmOdxJo9Q7A==} '@types/nprogress@0.2.3': resolution: {integrity: sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==} @@ -1430,63 +1442,63 @@ packages: '@types/triple-beam@1.3.5': resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==} - '@typescript-eslint/eslint-plugin@8.46.2': - resolution: {integrity: sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==} + '@typescript-eslint/eslint-plugin@8.46.3': + resolution: {integrity: sha512-sbaQ27XBUopBkRiuY/P9sWGOWUW4rl8fDoHIUmLpZd8uldsTyB4/Zg6bWTegPoTLnKj9Hqgn3QD6cjPNB32Odw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.46.2 + '@typescript-eslint/parser': ^8.46.3 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.46.2': - resolution: {integrity: sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==} + '@typescript-eslint/parser@8.46.3': + resolution: {integrity: sha512-6m1I5RmHBGTnUGS113G04DMu3CpSdxCAU/UvtjNWL4Nuf3MW9tQhiJqRlHzChIkhy6kZSAQmc+I1bcGjE3yNKg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.46.2': - resolution: {integrity: sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==} + '@typescript-eslint/project-service@8.46.3': + resolution: {integrity: sha512-Fz8yFXsp2wDFeUElO88S9n4w1I4CWDTXDqDr9gYvZgUpwXQqmZBr9+NTTql5R3J7+hrJZPdpiWaB9VNhAKYLuQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.46.2': - resolution: {integrity: sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==} + '@typescript-eslint/scope-manager@8.46.3': + resolution: {integrity: sha512-FCi7Y1zgrmxp3DfWfr+3m9ansUUFoy8dkEdeQSgA9gbm8DaHYvZCdkFRQrtKiedFf3Ha6VmoqoAaP68+i+22kg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.46.2': - resolution: {integrity: sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==} + '@typescript-eslint/tsconfig-utils@8.46.3': + resolution: {integrity: sha512-GLupljMniHNIROP0zE7nCcybptolcH8QZfXOpCfhQDAdwJ/ZTlcaBOYebSOZotpti/3HrHSw7D3PZm75gYFsOA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.46.2': - resolution: {integrity: sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==} + '@typescript-eslint/type-utils@8.46.3': + resolution: {integrity: sha512-ZPCADbr+qfz3aiTTYNNkCbUt+cjNwI/5McyANNrFBpVxPt7GqpEYz5ZfdwuFyGUnJ9FdDXbGODUu6iRCI6XRXw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/types@8.46.2': - resolution: {integrity: sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==} + '@typescript-eslint/types@8.46.3': + resolution: {integrity: sha512-G7Ok9WN/ggW7e/tOf8TQYMaxgID3Iujn231hfi0Pc7ZheztIJVpO44ekY00b7akqc6nZcvregk0Jpah3kep6hA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.46.2': - resolution: {integrity: sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==} + '@typescript-eslint/typescript-estree@8.46.3': + resolution: {integrity: sha512-f/NvtRjOm80BtNM5OQtlaBdM5BRFUv7gf381j9wygDNL+qOYSNOgtQ/DCndiYi80iIOv76QqaTmp4fa9hwI0OA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.46.2': - resolution: {integrity: sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==} + '@typescript-eslint/utils@8.46.3': + resolution: {integrity: sha512-VXw7qmdkucEx9WkmR3ld/u6VhRyKeiF1uxWwCy/iuNfokjJ7VhsgLSOTjsol8BunSw190zABzpwdNsze2Kpo4g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.46.2': - resolution: {integrity: sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==} + '@typescript-eslint/visitor-keys@8.46.3': + resolution: {integrity: sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vitejs/plugin-react@4.7.0': @@ -1754,8 +1766,8 @@ packages: resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} engines: {node: '>= 0.4'} - axios@1.12.2: - resolution: {integrity: sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==} + axios@1.13.1: + resolution: {integrity: sha512-hU4EGxxt+j7TQijx1oYdAjw4xuIp1wRQSsbMFwSthCWeBQur1eF+qJ5iQ5sN3Tw8YRzQNKb8jszgBdMDVqwJcw==} axobject-query@4.1.0: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} @@ -1764,8 +1776,8 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - baseline-browser-mapping@2.8.18: - resolution: {integrity: sha512-UYmTpOBwgPScZpS4A+YbapwWuBwasxvO/2IOHArSsAhL/+ZdmATBXTex3t+l2hXwLVYK382ibr/nKoY9GKe86w==} + baseline-browser-mapping@2.8.23: + resolution: {integrity: sha512-616V5YX4bepJFzNyOfce5Fa8fDJMfoxzOIzDCZwaGL8MKVpFrXqfNUoIpRn9YMI5pXf/VKgzjB4htFMsFKKdiQ==} hasBin: true big.js@5.2.2: @@ -1792,8 +1804,8 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.26.3: - resolution: {integrity: sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==} + browserslist@4.27.0: + resolution: {integrity: sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -1824,8 +1836,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001751: - resolution: {integrity: sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==} + caniuse-lite@1.0.30001753: + resolution: {integrity: sha512-Bj5H35MD/ebaOV4iDLqPEtiliTN29qkGtEHCwawWn4cYm+bPJM2NsaP30vtZcnERClMzp52J4+aw2UNbK4o+zw==} chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -2011,8 +2023,8 @@ packages: resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} engines: {node: '>=8'} - devalue@5.4.1: - resolution: {integrity: sha512-YtoaOfsqjbZQKGIMRYDWKjUmSB4VJ/RElB+bXZawQAQYAo4xu08GKTMVlsZDTF6R2MbAgjcAQRPI5eIyRAT2OQ==} + devalue@5.4.2: + resolution: {integrity: sha512-MwPZTKEPK2k8Qgfmqrd48ZKVvzSQjgW0lXLxiIBA8dQjtf/6mw6pggHNLcyDKyf+fI6eXxlQwPsfaCMTU5U+Bw==} doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} @@ -2029,8 +2041,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.237: - resolution: {integrity: sha512-icUt1NvfhGLar5lSWH3tHNzablaA5js3HVHacQimfP8ViEBOQv+L7DKEuHdbTZ0SKCO1ogTJTIL1Gwk9S6Qvcg==} + electron-to-chromium@1.5.244: + resolution: {integrity: sha512-OszpBN7xZX4vWMPJwB9illkN/znA8M36GQqQxi6MNy9axWxhOfJyZZJtSLQCpEFLHP2xK33BiWx9aIuIEXVCcw==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2113,8 +2125,8 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.25.11: - resolution: {integrity: sha512-KohQwyzrKTQmhXDW1PjCv3Tyspn9n5GcY2RTDqeORIdIJY8yKIF7sTSopFmn/wpMPW4rdPXI0UE5LJLuq3bx0Q==} + esbuild@0.25.12: + resolution: {integrity: sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==} engines: {node: '>=18'} hasBin: true @@ -2169,8 +2181,8 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - eslint-plugin-svelte@3.12.5: - resolution: {integrity: sha512-4KRG84eAHQfYd9OjZ1K7sCHy0nox+9KwT+s5WCCku3jTim5RV4tVENob274nCwIaApXsYPKAUAZFBxKZ3Wyfjw==} + eslint-plugin-svelte@3.13.0: + resolution: {integrity: sha512-2ohCCQJJTNbIpQCSDSTWj+FN0OVfPmSO03lmSNT7ytqMaWF6kpT86LdzDqtm4sh7TVPl/OEWJ/d7R87bXP2Vjg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.1 || ^9.0.0 @@ -2227,8 +2239,8 @@ packages: deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true - eslint@9.38.0: - resolution: {integrity: sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==} + eslint@9.39.1: + resolution: {integrity: sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -2257,8 +2269,8 @@ packages: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} - esrap@2.1.0: - resolution: {integrity: sha512-yzmPNpl7TBbMRC5Lj2JlJZNPml0tzqoqP5B1JXycNUwtqma9AKCO0M2wHrdgsHcy1WRW7S9rJknAMtByg3usgA==} + esrap@2.1.2: + resolution: {integrity: sha512-DgvlIQeowRNyvLPWW4PT7Gu13WznY288Du086E751mwwbsgr29ytBiYeLzAGIo0qk3Ujob0SDk8TiSaM5WQzNg==} esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} @@ -2433,8 +2445,8 @@ packages: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} - get-tsconfig@4.12.0: - resolution: {integrity: sha512-LScr2aNr2FbjAjZh2C6X6BxRx1/x+aTDExct/xyq2XKbYOiG5c0aK7pMsSuyc0brz3ibr/lbQiHD9jzt4lccJw==} + get-tsconfig@4.13.0: + resolution: {integrity: sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==} glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} @@ -2468,8 +2480,8 @@ packages: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} - globals@16.4.0: - resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} + globals@16.5.0: + resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} engines: {node: '>=18'} globalthis@1.0.4: @@ -2769,6 +2781,9 @@ packages: kuler@2.0.0: resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + laravel-precognition@0.7.3: + resolution: {integrity: sha512-Z97i35Q0wmsRC9WFUY2EmFS2W1F6FF/HakwZg6PqSaR9lHBgbdIs1YZpDlkChVkgcmmvbN19ujKss3ZqbjPM1g==} + laravel-vite-plugin@1.3.0: resolution: {integrity: sha512-P5qyG56YbYxM8OuYmK2OkhcKe0AksNVJUjq9LUZ5tOekU9fBn9LujYyctI4t9XoLjuMvHJXXpCoPntY1oKltuA==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -2896,8 +2911,8 @@ packages: lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - magic-string@0.30.19: - resolution: {integrity: sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} marked@16.4.1: resolution: {integrity: sha512-ntROs7RaN3EvWfy3EZi14H4YxmT6A5YvywfhO+0pm+cH/dnSQRmdAmoFIc3B9aiwTehyk7pESH4ofyBY+V5hZg==} @@ -3005,8 +3020,8 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - node-releases@2.0.26: - resolution: {integrity: sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA==} + node-releases@2.0.27: + resolution: {integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==} nodemon@3.1.10: resolution: {integrity: sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==} @@ -3477,8 +3492,8 @@ packages: resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==} engines: {node: '>= 0.8.0'} - set-cookie-parser@2.7.1: - resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + set-cookie-parser@2.7.2: + resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} @@ -3647,16 +3662,16 @@ packages: resolution: {integrity: sha512-eeEgGc2DtiUil5ANdtd8vPwt9AgaMdnuUFnPft9F5oMvU/FHu5IHFic+p1dR/UOB7XU2mX2yHW+NcTch4DCh5Q==} engines: {node: '>=16'} - svelte@5.41.1: - resolution: {integrity: sha512-0a/huwc8e2es+7KFi70esqsReRfRbrT8h1cJSY/+z1lF0yKM6TT+//HYu28Yxstr50H7ifaqZRDGd0KuKDxP7w==} + svelte@5.43.3: + resolution: {integrity: sha512-kjkAjCk41mJfvJZG56XcJNOdJSke94JxtcX8zFzzz2vrt47E0LnoBzU6azIZ1aBxJgUep8qegAkguSf1GjxLXQ==} engines: {node: '>=18'} table@6.9.0: resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==} engines: {node: '>=10.0.0'} - tailwindcss@4.1.15: - resolution: {integrity: sha512-k2WLnWkYFkdpRv+Oby3EBXIyQC8/s1HOFMBUViwtAh6Z5uAozeUSMQlIsn/c6Q2iJzqG6aJT3wdPaRNj70iYxQ==} + tailwindcss@4.1.16: + resolution: {integrity: sha512-pONL5awpaQX4LN5eiv7moSiSPd/DLDzKVRJz8Q9PgzmAdd1R4307GQS2ZpfiN7ZmekdQrfhZZiSE5jkLR4WNaA==} tapable@2.3.0: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} @@ -3758,8 +3773,8 @@ packages: typedarray@0.0.6: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} - typescript-eslint@8.46.2: - resolution: {integrity: sha512-vbw8bOmiuYNdzzV3lsiWv6sRwjyuKJMQqWulBOU7M0RrxedXledX8G8kBbQeiOYDnTfiXz0Y4081E1QMNB6iQg==} + typescript-eslint@8.46.3: + resolution: {integrity: sha512-bAfgMavTuGo+8n6/QQDVQz4tZ4f7Soqg53RbrlZQEoAltYop/XR4RAts/I0BrO3TTClTSTFJ0wYbla+P8cEWJA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -3795,8 +3810,8 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} - update-browserslist-db@1.1.3: - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + update-browserslist-db@1.1.4: + resolution: {integrity: sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' @@ -4020,23 +4035,23 @@ snapshots: '@babel/code-frame@7.27.1': dependencies: - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.28.4': {} + '@babel/compat-data@7.28.5': {} - '@babel/core@7.28.4': + '@babel/core@7.28.5': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 + '@babel/generator': 7.28.5 '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.5) '@babel/helpers': 7.28.4 - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.5 '@babel/template': 7.27.2 - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 '@jridgewell/remapping': 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3(supports-color@5.5.0) @@ -4046,19 +4061,19 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/generator@7.28.3': + '@babel/generator@7.28.5': dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.28.4 + '@babel/compat-data': 7.28.5 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.26.3 + browserslist: 4.27.0 lru-cache: 5.1.1 semver: 6.3.1 @@ -4066,17 +4081,17 @@ snapshots: '@babel/helper-module-imports@7.27.1': dependencies: - '@babel/traverse': 7.28.4 - '@babel/types': 7.28.4 + '@babel/traverse': 7.28.5 + '@babel/types': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.4 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color @@ -4084,58 +4099,58 @@ snapshots: '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.27.1': {} + '@babel/helper-validator-identifier@7.28.5': {} '@babel/helper-validator-option@7.27.1': {} '@babel/helpers@7.28.4': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 '@babel/highlight@7.25.9': dependencies: - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/parser@7.28.4': + '@babel/parser@7.28.5': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 - '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.5)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.5 '@babel/helper-plugin-utils': 7.27.1 '@babel/template@7.27.2': dependencies: '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 - '@babel/traverse@7.28.4': + '@babel/traverse@7.28.5': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.3 + '@babel/generator': 7.28.5 '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.5 '@babel/template': 7.27.2 - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color - '@babel/types@7.28.4': + '@babel/types@7.28.5': dependencies: '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 '@colors/colors@1.6.0': {} @@ -4148,156 +4163,156 @@ snapshots: '@esbuild/aix-ppc64@0.21.5': optional: true - '@esbuild/aix-ppc64@0.25.11': + '@esbuild/aix-ppc64@0.25.12': optional: true '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-arm64@0.25.11': + '@esbuild/android-arm64@0.25.12': optional: true '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/android-arm@0.25.11': + '@esbuild/android-arm@0.25.12': optional: true '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/android-x64@0.25.11': + '@esbuild/android-x64@0.25.12': optional: true '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.25.11': + '@esbuild/darwin-arm64@0.25.12': optional: true '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/darwin-x64@0.25.11': + '@esbuild/darwin-x64@0.25.12': optional: true '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.25.11': + '@esbuild/freebsd-arm64@0.25.12': optional: true '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.25.11': + '@esbuild/freebsd-x64@0.25.12': optional: true '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/linux-arm64@0.25.11': + '@esbuild/linux-arm64@0.25.12': optional: true '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/linux-arm@0.25.11': + '@esbuild/linux-arm@0.25.12': optional: true '@esbuild/linux-ia32@0.21.5': optional: true - '@esbuild/linux-ia32@0.25.11': + '@esbuild/linux-ia32@0.25.12': optional: true '@esbuild/linux-loong64@0.21.5': optional: true - '@esbuild/linux-loong64@0.25.11': + '@esbuild/linux-loong64@0.25.12': optional: true '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/linux-mips64el@0.25.11': + '@esbuild/linux-mips64el@0.25.12': optional: true '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-ppc64@0.25.11': + '@esbuild/linux-ppc64@0.25.12': optional: true '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.25.11': + '@esbuild/linux-riscv64@0.25.12': optional: true '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-s390x@0.25.11': + '@esbuild/linux-s390x@0.25.12': optional: true '@esbuild/linux-x64@0.21.5': optional: true - '@esbuild/linux-x64@0.25.11': + '@esbuild/linux-x64@0.25.12': optional: true - '@esbuild/netbsd-arm64@0.25.11': + '@esbuild/netbsd-arm64@0.25.12': optional: true '@esbuild/netbsd-x64@0.21.5': optional: true - '@esbuild/netbsd-x64@0.25.11': + '@esbuild/netbsd-x64@0.25.12': optional: true - '@esbuild/openbsd-arm64@0.25.11': + '@esbuild/openbsd-arm64@0.25.12': optional: true '@esbuild/openbsd-x64@0.21.5': optional: true - '@esbuild/openbsd-x64@0.25.11': + '@esbuild/openbsd-x64@0.25.12': optional: true - '@esbuild/openharmony-arm64@0.25.11': + '@esbuild/openharmony-arm64@0.25.12': optional: true '@esbuild/sunos-x64@0.21.5': optional: true - '@esbuild/sunos-x64@0.25.11': + '@esbuild/sunos-x64@0.25.12': optional: true '@esbuild/win32-arm64@0.21.5': optional: true - '@esbuild/win32-arm64@0.25.11': + '@esbuild/win32-arm64@0.25.12': optional: true '@esbuild/win32-ia32@0.21.5': optional: true - '@esbuild/win32-ia32@0.25.11': + '@esbuild/win32-ia32@0.25.12': optional: true '@esbuild/win32-x64@0.21.5': optional: true - '@esbuild/win32-x64@0.25.11': + '@esbuild/win32-x64@0.25.12': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.38.0(jiti@2.6.1))': + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1(jiti@2.6.1))': dependencies: - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.12.1': {} + '@eslint-community/regexpp@4.12.2': {} '@eslint/config-array@0.21.1': dependencies: @@ -4307,11 +4322,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/config-helpers@0.4.1': + '@eslint/config-helpers@0.4.2': dependencies: - '@eslint/core': 0.16.0 + '@eslint/core': 0.17.0 - '@eslint/core@0.16.0': + '@eslint/core@0.17.0': dependencies: '@types/json-schema': 7.0.15 @@ -4343,13 +4358,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.38.0': {} + '@eslint/js@9.39.1': {} '@eslint/object-schema@2.1.7': {} - '@eslint/plugin-kit@0.4.0': + '@eslint/plugin-kit@0.4.1': dependencies: - '@eslint/core': 0.16.0 + '@eslint/core': 0.17.0 levn: 0.4.1 '@humanfs/core@0.19.1': {} @@ -4499,9 +4514,9 @@ snapshots: '@standard-schema/spec@1.0.0': {} - '@stylistic/eslint-plugin-js@4.4.1(eslint@9.38.0(jiti@2.6.1))': + '@stylistic/eslint-plugin-js@4.4.1(eslint@9.39.1(jiti@2.6.1))': dependencies: - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -4509,40 +4524,40 @@ snapshots: dependencies: acorn: 8.15.0 - '@sveltejs/adapter-auto@3.3.1(@sveltejs/kit@2.47.2(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0)))(svelte@4.2.20)(vite@5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0)))': + '@sveltejs/adapter-auto@3.3.1(@sveltejs/kit@2.48.4(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0)))(svelte@4.2.20)(vite@5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0)))': dependencies: - '@sveltejs/kit': 2.47.2(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0)))(svelte@4.2.20)(vite@5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0)) + '@sveltejs/kit': 2.48.4(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0)))(svelte@4.2.20)(vite@5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0)) import-meta-resolve: 4.2.0 - '@sveltejs/eslint-config@8.3.4(@stylistic/eslint-plugin-js@4.4.1(eslint@9.38.0(jiti@2.6.1)))(eslint-config-prettier@10.1.8(eslint@9.38.0(jiti@2.6.1)))(eslint-plugin-n@17.23.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint-plugin-svelte@3.12.5(eslint@9.38.0(jiti@2.6.1))(svelte@4.2.20))(eslint@9.38.0(jiti@2.6.1))(typescript-eslint@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(typescript@5.9.3)': + '@sveltejs/eslint-config@8.3.4(@stylistic/eslint-plugin-js@4.4.1(eslint@9.39.1(jiti@2.6.1)))(eslint-config-prettier@10.1.8(eslint@9.39.1(jiti@2.6.1)))(eslint-plugin-n@17.23.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-plugin-svelte@3.13.0(eslint@9.39.1(jiti@2.6.1))(svelte@4.2.20))(eslint@9.39.1(jiti@2.6.1))(typescript-eslint@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(typescript@5.9.3)': dependencies: - '@stylistic/eslint-plugin-js': 4.4.1(eslint@9.38.0(jiti@2.6.1)) - eslint: 9.38.0(jiti@2.6.1) - eslint-config-prettier: 10.1.8(eslint@9.38.0(jiti@2.6.1)) - eslint-plugin-n: 17.23.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-svelte: 3.12.5(eslint@9.38.0(jiti@2.6.1))(svelte@4.2.20) + '@stylistic/eslint-plugin-js': 4.4.1(eslint@9.39.1(jiti@2.6.1)) + eslint: 9.39.1(jiti@2.6.1) + eslint-config-prettier: 10.1.8(eslint@9.39.1(jiti@2.6.1)) + eslint-plugin-n: 17.23.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-svelte: 3.13.0(eslint@9.39.1(jiti@2.6.1))(svelte@4.2.20) globals: 15.15.0 typescript: 5.9.3 - typescript-eslint: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + typescript-eslint: 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@sveltejs/kit@2.47.2(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0)))(svelte@4.2.20)(vite@5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0))': + '@sveltejs/kit@2.48.4(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0)))(svelte@4.2.20)(vite@5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0))': dependencies: '@standard-schema/spec': 1.0.0 '@sveltejs/acorn-typescript': 1.0.6(acorn@8.15.0) - '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.20)(vite@5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0)) + '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.20)(vite@5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0)) '@types/cookie': 0.6.0 acorn: 8.15.0 cookie: 0.6.0 - devalue: 5.4.1 + devalue: 5.4.2 esm-env: 1.2.2 kleur: 4.1.5 - magic-string: 0.30.19 + magic-string: 0.30.21 mrmime: 2.0.1 sade: 1.8.1 - set-cookie-parser: 2.7.1 + set-cookie-parser: 2.7.2 sirv: 3.0.2 svelte: 4.2.20 - vite: 5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0) + vite: 5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0) '@sveltejs/package@2.5.4(svelte@4.2.20)(typescript@5.9.3)': dependencies: @@ -4555,153 +4570,153 @@ snapshots: transitivePeerDependencies: - typescript - '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0)))(svelte@4.2.20)(vite@5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0))': + '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0)))(svelte@4.2.20)(vite@5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.20)(vite@5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0)) + '@sveltejs/vite-plugin-svelte': 3.1.2(svelte@4.2.20)(vite@5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0)) debug: 4.4.3(supports-color@5.5.0) svelte: 4.2.20 - vite: 5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0) + vite: 5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.41.1)(vite@6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)))(svelte@5.41.1)(vite@6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0))': + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.43.3)(vite@6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)))(svelte@5.43.3)(vite@6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.41.1)(vite@6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)) + '@sveltejs/vite-plugin-svelte': 5.1.1(svelte@5.43.3)(vite@6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)) debug: 4.4.3(supports-color@5.5.0) - svelte: 5.41.1 - vite: 6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0) + svelte: 5.43.3 + vite: 6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0))': + '@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0)))(svelte@4.2.20)(vite@5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0)) + '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.2(svelte@4.2.20)(vite@5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0)))(svelte@4.2.20)(vite@5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0)) debug: 4.4.3(supports-color@5.5.0) deepmerge: 4.3.1 kleur: 4.1.5 - magic-string: 0.30.19 + magic-string: 0.30.21 svelte: 4.2.20 svelte-hmr: 0.16.0(svelte@4.2.20) - vite: 5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0) - vitefu: 0.2.5(vite@5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0)) + vite: 5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0) + vitefu: 0.2.5(vite@5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0)) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.41.1)(vite@6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0))': + '@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.43.3)(vite@6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.41.1)(vite@6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)))(svelte@5.41.1)(vite@6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)) + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.1.1(svelte@5.43.3)(vite@6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)))(svelte@5.43.3)(vite@6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)) debug: 4.4.3(supports-color@5.5.0) deepmerge: 4.3.1 kleur: 4.1.5 - magic-string: 0.30.19 - svelte: 5.41.1 - vite: 6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0) - vitefu: 1.1.1(vite@6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)) + magic-string: 0.30.21 + svelte: 5.43.3 + vite: 6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0) + vitefu: 1.1.1(vite@6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)) transitivePeerDependencies: - supports-color - '@tailwindcss/node@4.1.15': + '@tailwindcss/node@4.1.16': dependencies: '@jridgewell/remapping': 2.3.5 enhanced-resolve: 5.18.3 jiti: 2.6.1 lightningcss: 1.30.2 - magic-string: 0.30.19 + magic-string: 0.30.21 source-map-js: 1.2.1 - tailwindcss: 4.1.15 + tailwindcss: 4.1.16 - '@tailwindcss/oxide-android-arm64@4.1.15': + '@tailwindcss/oxide-android-arm64@4.1.16': optional: true - '@tailwindcss/oxide-darwin-arm64@4.1.15': + '@tailwindcss/oxide-darwin-arm64@4.1.16': optional: true - '@tailwindcss/oxide-darwin-x64@4.1.15': + '@tailwindcss/oxide-darwin-x64@4.1.16': optional: true - '@tailwindcss/oxide-freebsd-x64@4.1.15': + '@tailwindcss/oxide-freebsd-x64@4.1.16': optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.15': + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.16': optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.1.15': + '@tailwindcss/oxide-linux-arm64-gnu@4.1.16': optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.1.15': + '@tailwindcss/oxide-linux-arm64-musl@4.1.16': optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.1.15': + '@tailwindcss/oxide-linux-x64-gnu@4.1.16': optional: true - '@tailwindcss/oxide-linux-x64-musl@4.1.15': + '@tailwindcss/oxide-linux-x64-musl@4.1.16': optional: true - '@tailwindcss/oxide-wasm32-wasi@4.1.15': + '@tailwindcss/oxide-wasm32-wasi@4.1.16': optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.1.15': + '@tailwindcss/oxide-win32-arm64-msvc@4.1.16': optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.1.15': + '@tailwindcss/oxide-win32-x64-msvc@4.1.16': optional: true - '@tailwindcss/oxide@4.1.15': + '@tailwindcss/oxide@4.1.16': optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.1.15 - '@tailwindcss/oxide-darwin-arm64': 4.1.15 - '@tailwindcss/oxide-darwin-x64': 4.1.15 - '@tailwindcss/oxide-freebsd-x64': 4.1.15 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.15 - '@tailwindcss/oxide-linux-arm64-gnu': 4.1.15 - '@tailwindcss/oxide-linux-arm64-musl': 4.1.15 - '@tailwindcss/oxide-linux-x64-gnu': 4.1.15 - '@tailwindcss/oxide-linux-x64-musl': 4.1.15 - '@tailwindcss/oxide-wasm32-wasi': 4.1.15 - '@tailwindcss/oxide-win32-arm64-msvc': 4.1.15 - '@tailwindcss/oxide-win32-x64-msvc': 4.1.15 - - '@tailwindcss/typography@0.5.19(tailwindcss@4.1.15)': + '@tailwindcss/oxide-android-arm64': 4.1.16 + '@tailwindcss/oxide-darwin-arm64': 4.1.16 + '@tailwindcss/oxide-darwin-x64': 4.1.16 + '@tailwindcss/oxide-freebsd-x64': 4.1.16 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.16 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.16 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.16 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.16 + '@tailwindcss/oxide-linux-x64-musl': 4.1.16 + '@tailwindcss/oxide-wasm32-wasi': 4.1.16 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.16 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.16 + + '@tailwindcss/typography@0.5.19(tailwindcss@4.1.16)': dependencies: postcss-selector-parser: 6.0.10 - tailwindcss: 4.1.15 + tailwindcss: 4.1.16 - '@tailwindcss/vite@4.1.15(vite@5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0))': + '@tailwindcss/vite@4.1.16(vite@5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0))': dependencies: - '@tailwindcss/node': 4.1.15 - '@tailwindcss/oxide': 4.1.15 - tailwindcss: 4.1.15 - vite: 5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0) + '@tailwindcss/node': 4.1.16 + '@tailwindcss/oxide': 4.1.16 + tailwindcss: 4.1.16 + vite: 5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0) - '@tailwindcss/vite@4.1.15(vite@6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0))': + '@tailwindcss/vite@4.1.16(vite@6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0))': dependencies: - '@tailwindcss/node': 4.1.15 - '@tailwindcss/oxide': 4.1.15 - tailwindcss: 4.1.15 - vite: 6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0) + '@tailwindcss/node': 4.1.16 + '@tailwindcss/oxide': 4.1.16 + tailwindcss: 4.1.16 + vite: 6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0) '@tsconfig/svelte@5.0.5': {} '@types/babel__core@7.20.5': dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 '@types/babel__template@7.4.4': dependencies: - '@babel/parser': 7.28.4 - '@babel/types': 7.28.4 + '@babel/parser': 7.28.5 + '@babel/types': 7.28.5 '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.28.4 + '@babel/types': 7.28.5 '@types/cookie@0.6.0': {} @@ -4733,11 +4748,11 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/node@22.18.12': + '@types/node@22.19.0': dependencies: undici-types: 6.21.0 - '@types/node@24.9.1': + '@types/node@24.10.0': dependencies: undici-types: 7.16.0 @@ -4755,15 +4770,15 @@ snapshots: '@types/triple-beam@1.3.5': {} - '@typescript-eslint/eslint-plugin@8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.46.2 - '@typescript-eslint/type-utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.46.2 - eslint: 9.38.0(jiti@2.6.1) + '@eslint-community/regexpp': 4.12.2 + '@typescript-eslint/parser': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.3 + '@typescript-eslint/type-utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.3 + eslint: 9.39.1(jiti@2.6.1) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -4772,56 +4787,56 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.46.2 - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.46.2 + '@typescript-eslint/scope-manager': 8.46.3 + '@typescript-eslint/types': 8.46.3 + '@typescript-eslint/typescript-estree': 8.46.3(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.3 debug: 4.4.3(supports-color@5.5.0) - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.46.2(typescript@5.9.3)': + '@typescript-eslint/project-service@8.46.3(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) - '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/tsconfig-utils': 8.46.3(typescript@5.9.3) + '@typescript-eslint/types': 8.46.3 debug: 4.4.3(supports-color@5.5.0) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.46.2': + '@typescript-eslint/scope-manager@8.46.3': dependencies: - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/visitor-keys': 8.46.2 + '@typescript-eslint/types': 8.46.3 + '@typescript-eslint/visitor-keys': 8.46.3 - '@typescript-eslint/tsconfig-utils@8.46.2(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.46.3(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.46.3 + '@typescript-eslint/typescript-estree': 8.46.3(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3(supports-color@5.5.0) - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) ts-api-utils: 2.1.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.46.2': {} + '@typescript-eslint/types@8.46.3': {} - '@typescript-eslint/typescript-estree@8.46.2(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.46.3(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.46.2(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.46.2(typescript@5.9.3) - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/visitor-keys': 8.46.2 + '@typescript-eslint/project-service': 8.46.3(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.46.3(typescript@5.9.3) + '@typescript-eslint/types': 8.46.3 + '@typescript-eslint/visitor-keys': 8.46.3 debug: 4.4.3(supports-color@5.5.0) fast-glob: 3.3.3 is-glob: 4.0.3 @@ -4832,37 +4847,37 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.46.2 - '@typescript-eslint/types': 8.46.2 - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) - eslint: 9.38.0(jiti@2.6.1) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.46.3 + '@typescript-eslint/types': 8.46.3 + '@typescript-eslint/typescript-estree': 8.46.3(typescript@5.9.3) + eslint: 9.39.1(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.46.2': + '@typescript-eslint/visitor-keys@8.46.3': dependencies: - '@typescript-eslint/types': 8.46.2 + '@typescript-eslint/types': 8.46.3 eslint-visitor-keys: 4.2.1 - '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0))': + '@vitejs/plugin-react@4.7.0(vite@6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0))': dependencies: - '@babel/core': 7.28.4 - '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.4) + '@babel/core': 7.28.5 + '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.5) + '@babel/plugin-transform-react-jsx-source': 7.27.1(@babel/core@7.28.5) '@rolldown/pluginutils': 1.0.0-beta.27 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0) + vite: 6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.2.4(vite@6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0))(vue@3.5.22(typescript@5.9.3))': + '@vitejs/plugin-vue@5.2.4(vite@6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0))(vue@3.5.22(typescript@5.9.3))': dependencies: - vite: 6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0) + vite: 6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0) vue: 3.5.22(typescript@5.9.3) '@volar/language-core@2.4.15': @@ -4879,7 +4894,7 @@ snapshots: '@vue/compiler-core@3.5.22': dependencies: - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.5 '@vue/shared': 3.5.22 entities: 4.5.0 estree-walker: 2.0.2 @@ -4892,13 +4907,13 @@ snapshots: '@vue/compiler-sfc@3.5.22': dependencies: - '@babel/parser': 7.28.4 + '@babel/parser': 7.28.5 '@vue/compiler-core': 3.5.22 '@vue/compiler-dom': 3.5.22 '@vue/compiler-ssr': 3.5.22 '@vue/shared': 3.5.22 estree-walker: 2.0.2 - magic-string: 0.30.19 + magic-string: 0.30.21 postcss: 8.5.6 source-map-js: 1.2.1 @@ -4912,14 +4927,14 @@ snapshots: de-indent: 1.0.2 he: 1.2.0 - '@vue/eslint-config-typescript@14.6.0(eslint-plugin-vue@10.5.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.38.0(jiti@2.6.1))))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3)': + '@vue/eslint-config-typescript@14.6.0(eslint-plugin-vue@10.5.1(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.1(jiti@2.6.1))))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.38.0(jiti@2.6.1) - eslint-plugin-vue: 10.5.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.38.0(jiti@2.6.1))) + '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.1(jiti@2.6.1) + eslint-plugin-vue: 10.5.1(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.1(jiti@2.6.1))) fast-glob: 3.3.3 - typescript-eslint: 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) - vue-eslint-parser: 10.2.0(eslint@9.38.0(jiti@2.6.1)) + typescript-eslint: 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + vue-eslint-parser: 10.2.0(eslint@9.39.1(jiti@2.6.1)) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: @@ -5196,7 +5211,7 @@ snapshots: dependencies: possible-typed-array-names: 1.1.0 - axios@1.12.2: + axios@1.13.1: dependencies: follow-redirects: 1.15.11 form-data: 4.0.4 @@ -5208,7 +5223,7 @@ snapshots: balanced-match@1.0.2: {} - baseline-browser-mapping@2.8.18: {} + baseline-browser-mapping@2.8.23: {} big.js@5.2.2: {} @@ -5246,13 +5261,13 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.26.3: + browserslist@4.27.0: dependencies: - baseline-browser-mapping: 2.8.18 - caniuse-lite: 1.0.30001751 - electron-to-chromium: 1.5.237 - node-releases: 2.0.26 - update-browserslist-db: 1.1.3(browserslist@4.26.3) + baseline-browser-mapping: 2.8.23 + caniuse-lite: 1.0.30001753 + electron-to-chromium: 1.5.244 + node-releases: 2.0.27 + update-browserslist-db: 1.1.4(browserslist@4.27.0) buffer-from@1.1.2: {} @@ -5281,7 +5296,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001751: {} + caniuse-lite@1.0.30001753: {} chalk@2.4.2: dependencies: @@ -5465,7 +5480,7 @@ snapshots: detect-libc@2.1.2: {} - devalue@5.4.1: {} + devalue@5.4.2: {} doctrine@2.1.0: dependencies: @@ -5483,7 +5498,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.237: {} + electron-to-chromium@1.5.244: {} emoji-regex@8.0.0: {} @@ -5568,7 +5583,7 @@ snapshots: dependencies: acorn: 8.15.0 acorn-walk: 8.3.4 - browserslist: 4.26.3 + browserslist: 4.27.0 commander: 14.0.1 fast-brake: 0.1.6 fast-glob: 3.3.3 @@ -5623,9 +5638,9 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild-node-externals@1.18.0(esbuild@0.25.11): + esbuild-node-externals@1.18.0(esbuild@0.25.12): dependencies: - esbuild: 0.25.11 + esbuild: 0.25.12 find-up: 5.0.0 esbuild@0.21.5: @@ -5654,34 +5669,34 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - esbuild@0.25.11: + esbuild@0.25.12: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.11 - '@esbuild/android-arm': 0.25.11 - '@esbuild/android-arm64': 0.25.11 - '@esbuild/android-x64': 0.25.11 - '@esbuild/darwin-arm64': 0.25.11 - '@esbuild/darwin-x64': 0.25.11 - '@esbuild/freebsd-arm64': 0.25.11 - '@esbuild/freebsd-x64': 0.25.11 - '@esbuild/linux-arm': 0.25.11 - '@esbuild/linux-arm64': 0.25.11 - '@esbuild/linux-ia32': 0.25.11 - '@esbuild/linux-loong64': 0.25.11 - '@esbuild/linux-mips64el': 0.25.11 - '@esbuild/linux-ppc64': 0.25.11 - '@esbuild/linux-riscv64': 0.25.11 - '@esbuild/linux-s390x': 0.25.11 - '@esbuild/linux-x64': 0.25.11 - '@esbuild/netbsd-arm64': 0.25.11 - '@esbuild/netbsd-x64': 0.25.11 - '@esbuild/openbsd-arm64': 0.25.11 - '@esbuild/openbsd-x64': 0.25.11 - '@esbuild/openharmony-arm64': 0.25.11 - '@esbuild/sunos-x64': 0.25.11 - '@esbuild/win32-arm64': 0.25.11 - '@esbuild/win32-ia32': 0.25.11 - '@esbuild/win32-x64': 0.25.11 + '@esbuild/aix-ppc64': 0.25.12 + '@esbuild/android-arm': 0.25.12 + '@esbuild/android-arm64': 0.25.12 + '@esbuild/android-x64': 0.25.12 + '@esbuild/darwin-arm64': 0.25.12 + '@esbuild/darwin-x64': 0.25.12 + '@esbuild/freebsd-arm64': 0.25.12 + '@esbuild/freebsd-x64': 0.25.12 + '@esbuild/linux-arm': 0.25.12 + '@esbuild/linux-arm64': 0.25.12 + '@esbuild/linux-ia32': 0.25.12 + '@esbuild/linux-loong64': 0.25.12 + '@esbuild/linux-mips64el': 0.25.12 + '@esbuild/linux-ppc64': 0.25.12 + '@esbuild/linux-riscv64': 0.25.12 + '@esbuild/linux-s390x': 0.25.12 + '@esbuild/linux-x64': 0.25.12 + '@esbuild/netbsd-arm64': 0.25.12 + '@esbuild/netbsd-x64': 0.25.12 + '@esbuild/openbsd-arm64': 0.25.12 + '@esbuild/openbsd-x64': 0.25.12 + '@esbuild/openharmony-arm64': 0.25.12 + '@esbuild/sunos-x64': 0.25.12 + '@esbuild/win32-arm64': 0.25.12 + '@esbuild/win32-ia32': 0.25.12 + '@esbuild/win32-x64': 0.25.12 escalade@3.2.0: {} @@ -5691,29 +5706,29 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.38.0(jiti@2.6.1)): + eslint-compat-utils@0.5.1(eslint@9.39.1(jiti@2.6.1)): dependencies: - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) semver: 7.7.3 - eslint-config-prettier@10.1.8(eslint@9.38.0(jiti@2.6.1)): + eslint-config-prettier@10.1.8(eslint@9.39.1(jiti@2.6.1)): dependencies: - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) - eslint-plugin-es-x@7.8.0(eslint@9.38.0(jiti@2.6.1)): + eslint-plugin-es-x@7.8.0(eslint@9.39.1(jiti@2.6.1)): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) - '@eslint-community/regexpp': 4.12.1 - eslint: 9.38.0(jiti@2.6.1) - eslint-compat-utils: 0.5.1(eslint@9.38.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) + '@eslint-community/regexpp': 4.12.2 + eslint: 9.39.1(jiti@2.6.1) + eslint-compat-utils: 0.5.1(eslint@9.39.1(jiti@2.6.1)) - eslint-plugin-n@17.23.1(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3): + eslint-plugin-n@17.23.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) enhanced-resolve: 5.18.3 - eslint: 9.38.0(jiti@2.6.1) - eslint-plugin-es-x: 7.8.0(eslint@9.38.0(jiti@2.6.1)) - get-tsconfig: 4.12.0 + eslint: 9.39.1(jiti@2.6.1) + eslint-plugin-es-x: 7.8.0(eslint@9.39.1(jiti@2.6.1)) + get-tsconfig: 4.13.0 globals: 15.15.0 globrex: 0.1.2 ignore: 5.3.2 @@ -5722,11 +5737,11 @@ snapshots: transitivePeerDependencies: - typescript - eslint-plugin-react-hooks@5.2.0(eslint@9.38.0(jiti@2.6.1)): + eslint-plugin-react-hooks@5.2.0(eslint@9.39.1(jiti@2.6.1)): dependencies: - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) - eslint-plugin-react@7.37.5(eslint@9.38.0(jiti@2.6.1)): + eslint-plugin-react@7.37.5(eslint@9.39.1(jiti@2.6.1)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -5734,7 +5749,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -5748,13 +5763,13 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-svelte@3.12.5(eslint@9.38.0(jiti@2.6.1))(svelte@4.2.20): + eslint-plugin-svelte@3.13.0(eslint@9.39.1(jiti@2.6.1))(svelte@4.2.20): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) '@jridgewell/sourcemap-codec': 1.5.5 - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) esutils: 2.0.3 - globals: 16.4.0 + globals: 16.5.0 known-css-properties: 0.37.0 postcss: 8.5.6 postcss-load-config: 3.1.4(postcss@8.5.6) @@ -5766,18 +5781,18 @@ snapshots: transitivePeerDependencies: - ts-node - eslint-plugin-vue@10.5.1(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.38.0(jiti@2.6.1))): + eslint-plugin-vue@10.5.1(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.1(jiti@2.6.1))): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) - eslint: 9.38.0(jiti@2.6.1) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) + eslint: 9.39.1(jiti@2.6.1) natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.1.2 semver: 7.7.3 - vue-eslint-parser: 10.2.0(eslint@9.38.0(jiti@2.6.1)) + vue-eslint-parser: 10.2.0(eslint@9.39.1(jiti@2.6.1)) xml-name-validator: 4.0.0 optionalDependencies: - '@typescript-eslint/parser': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint-scope@5.1.1: dependencies: @@ -5846,16 +5861,16 @@ snapshots: transitivePeerDependencies: - supports-color - eslint@9.38.0(jiti@2.6.1): + eslint@9.39.1(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) - '@eslint-community/regexpp': 4.12.1 + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) + '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.21.1 - '@eslint/config-helpers': 0.4.1 - '@eslint/core': 0.16.0 + '@eslint/config-helpers': 0.4.2 + '@eslint/core': 0.17.0 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.38.0 - '@eslint/plugin-kit': 0.4.0 + '@eslint/js': 9.39.1 + '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 @@ -5907,7 +5922,7 @@ snapshots: dependencies: estraverse: 5.3.0 - esrap@2.1.0: + esrap@2.1.2: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -6108,7 +6123,7 @@ snapshots: es-errors: 1.3.0 get-intrinsic: 1.3.0 - get-tsconfig@4.12.0: + get-tsconfig@4.13.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -6147,7 +6162,7 @@ snapshots: globals@15.15.0: {} - globals@16.4.0: {} + globals@16.5.0: {} globalthis@1.0.4: dependencies: @@ -6375,7 +6390,7 @@ snapshots: jest-worker@27.5.1: dependencies: - '@types/node': 24.9.1 + '@types/node': 24.10.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -6423,16 +6438,23 @@ snapshots: kuler@2.0.0: {} - laravel-vite-plugin@1.3.0(vite@5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0)): + laravel-precognition@0.7.3: + dependencies: + axios: 1.13.1 + lodash-es: 4.17.21 + transitivePeerDependencies: + - debug + + laravel-vite-plugin@1.3.0(vite@5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0)): dependencies: picocolors: 1.1.1 - vite: 5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0) + vite: 5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0) vite-plugin-full-reload: 1.2.0 - laravel-vite-plugin@1.3.0(vite@6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)): + laravel-vite-plugin@1.3.0(vite@6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)): dependencies: picocolors: 1.1.1 - vite: 6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0) + vite: 6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0) vite-plugin-full-reload: 1.2.0 levn@0.4.1: @@ -6532,7 +6554,7 @@ snapshots: dependencies: yallist: 3.1.1 - magic-string@0.30.19: + magic-string@0.30.21: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -6613,7 +6635,7 @@ snapshots: neo-async@2.6.2: {} - node-releases@2.0.26: {} + node-releases@2.0.27: {} nodemon@3.1.10: dependencies: @@ -6826,17 +6848,17 @@ snapshots: optionalDependencies: vue-tsc: 2.2.12(typescript@5.9.3) - prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.41.1): + prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.43.3): dependencies: prettier: 3.6.2 - svelte: 5.41.1 + svelte: 5.43.3 - prettier-plugin-tailwindcss@0.6.14(prettier-plugin-organize-imports@4.3.0(prettier@3.6.2)(typescript@5.9.3)(vue-tsc@2.2.12(typescript@5.9.3)))(prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.41.1))(prettier@3.6.2): + prettier-plugin-tailwindcss@0.6.14(prettier-plugin-organize-imports@4.3.0(prettier@3.6.2)(typescript@5.9.3)(vue-tsc@2.2.12(typescript@5.9.3)))(prettier-plugin-svelte@3.4.0(prettier@3.6.2)(svelte@5.43.3))(prettier@3.6.2): dependencies: prettier: 3.6.2 optionalDependencies: prettier-plugin-organize-imports: 4.3.0(prettier@3.6.2)(typescript@5.9.3)(vue-tsc@2.2.12(typescript@5.9.3)) - prettier-plugin-svelte: 3.4.0(prettier@3.6.2)(svelte@5.41.1) + prettier-plugin-svelte: 3.4.0(prettier@3.6.2)(svelte@5.43.3) prettier@3.6.2: {} @@ -7064,7 +7086,7 @@ snapshots: transitivePeerDependencies: - supports-color - set-cookie-parser@2.7.1: {} + set-cookie-parser@2.7.2: {} set-function-length@1.2.2: dependencies: @@ -7250,14 +7272,14 @@ snapshots: transitivePeerDependencies: - picomatch - svelte-check@4.3.3(picomatch@4.0.3)(svelte@5.41.1)(typescript@5.9.3): + svelte-check@4.3.3(picomatch@4.0.3)(svelte@5.43.3)(typescript@5.9.3): dependencies: '@jridgewell/trace-mapping': 0.3.31 chokidar: 4.0.3 fdir: 6.5.0(picomatch@4.0.3) picocolors: 1.1.1 sade: 1.8.1 - svelte: 5.41.1 + svelte: 5.43.3 typescript: 5.9.3 transitivePeerDependencies: - picomatch @@ -7298,10 +7320,10 @@ snapshots: estree-walker: 3.0.3 is-reference: 3.0.3 locate-character: 3.0.0 - magic-string: 0.30.19 + magic-string: 0.30.21 periscopic: 3.1.0 - svelte@5.41.1: + svelte@5.43.3: dependencies: '@jridgewell/remapping': 2.3.5 '@jridgewell/sourcemap-codec': 1.5.5 @@ -7312,10 +7334,10 @@ snapshots: axobject-query: 4.1.0 clsx: 2.1.1 esm-env: 1.2.2 - esrap: 2.1.0 + esrap: 2.1.2 is-reference: 3.0.3 locate-character: 3.0.0 - magic-string: 0.30.19 + magic-string: 0.30.21 zimmerframe: 1.1.4 table@6.9.0: @@ -7326,7 +7348,7 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - tailwindcss@4.1.15: {} + tailwindcss@4.1.16: {} tapable@2.3.0: {} @@ -7424,13 +7446,13 @@ snapshots: typedarray@0.0.6: {} - typescript-eslint@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3): + typescript-eslint@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.46.2(@typescript-eslint/parser@8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.46.2(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.2(eslint@9.38.0(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.38.0(jiti@2.6.1) + '@typescript-eslint/eslint-plugin': 8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.46.3(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint: 9.39.1(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -7456,9 +7478,9 @@ snapshots: unpipe@1.0.0: {} - update-browserslist-db@1.1.3(browserslist@4.26.3): + update-browserslist-db@1.1.4(browserslist@4.27.0): dependencies: - browserslist: 4.26.3 + browserslist: 4.27.0 escalade: 3.2.0 picocolors: 1.1.1 @@ -7479,46 +7501,46 @@ snapshots: picocolors: 1.1.1 picomatch: 2.3.1 - vite@5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0): + vite@5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0): dependencies: esbuild: 0.21.5 postcss: 8.5.6 rollup: 4.52.5 optionalDependencies: - '@types/node': 24.9.1 + '@types/node': 24.10.0 fsevents: 2.3.3 lightningcss: 1.30.2 terser: 5.44.0 - vite@6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0): + vite@6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0): dependencies: - esbuild: 0.25.11 + esbuild: 0.25.12 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 rollup: 4.52.5 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.9.1 + '@types/node': 24.10.0 fsevents: 2.3.3 jiti: 2.6.1 lightningcss: 1.30.2 terser: 5.44.0 - vitefu@0.2.5(vite@5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0)): + vitefu@0.2.5(vite@5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0)): optionalDependencies: - vite: 5.4.21(@types/node@24.9.1)(lightningcss@1.30.2)(terser@5.44.0) + vite: 5.4.21(@types/node@24.10.0)(lightningcss@1.30.2)(terser@5.44.0) - vitefu@1.1.1(vite@6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)): + vitefu@1.1.1(vite@6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0)): optionalDependencies: - vite: 6.4.1(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0) + vite: 6.4.1(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.0) vscode-uri@3.1.0: {} - vue-eslint-parser@10.2.0(eslint@9.38.0(jiti@2.6.1)): + vue-eslint-parser@10.2.0(eslint@9.39.1(jiti@2.6.1)): dependencies: debug: 4.4.3(supports-color@5.5.0) - eslint: 9.38.0(jiti@2.6.1) + eslint: 9.39.1(jiti@2.6.1) eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 @@ -7560,7 +7582,7 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.26.3 + browserslist: 4.27.0 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.3 es-module-lexer: 1.7.0 diff --git a/tests/app/server.js b/tests/app/server.js index f9238a104..d011d8006 100644 --- a/tests/app/server.js +++ b/tests/app/server.js @@ -282,6 +282,158 @@ app.post('/form-helper/events/errors', (req, res) => { }, 250) }) +app.post('/precognition/default', (req, res) => { + setTimeout( + () => { + const only = req.headers['precognition-validate-only'] ? req.headers['precognition-validate-only'].split(',') : [] + const name = req.body['name'] + const email = req.body['email'] + const errors = {} + + if (!name) { + errors.name = 'The name field is required.' + } + + if (name && name.length < 3) { + errors.name = 'The name must be at least 3 characters.' + } + + if (!email) { + errors.email = 'The email field is required.' + } + + if (email && !/\S+@\S+\.\S+/.test(email)) { + errors.email = 'The email must be a valid email address.' + } + + if (only.length) { + Object.keys(errors).forEach((key) => { + if (!only.includes(key)) { + delete errors[key] + } + }) + } + + res.header('Precognition', 'true') + res.header('Vary', 'Precognition') + + if (Object.keys(errors).length) { + return res.status(422).json({ errors }) + } + + return res.status(204).header('Precognition-Success', 'true').send() + }, + !!req.query['slow'] ? 2000 : 250, + ) +}) + +app.post('/precognition/array-errors', (req, res) => { + setTimeout(() => { + const only = req.headers['precognition-validate-only'] ? req.headers['precognition-validate-only'].split(',') : [] + const name = req.body['name'] + const email = req.body['email'] + const errors = {} + + if (!name) { + errors.name = ['The name field is required.'] + } + + if (name && name.length < 3) { + errors.name = ['The name must be at least 3 characters.', 'The name contains invalid characters.'] + } + + if (!email) { + errors.email = ['The email field is required.'] + } + + if (email && !/\S+@\S+\.\S+/.test(email)) { + errors.email = ['The email must be a valid email address.', 'The email format is incorrect.'] + } + + if (only.length) { + Object.keys(errors).forEach((key) => { + if (!only.includes(key)) { + delete errors[key] + } + }) + } + + res.header('Precognition', 'true') + res.header('Vary', 'Precognition') + + if (Object.keys(errors).length) { + return res.status(422).json({ errors }) + } + + return res.status(204).header('Precognition-Success', 'true').send() + }, 250) +}) + +app.post('/precognition/files', upload.any(), (req, res) => { + setTimeout(() => { + console.log(req, req) + const only = req.headers['precognition-validate-only'] ? req.headers['precognition-validate-only'].split(',') : [] + const name = req.body['name'] + const hasAvatar = req.files && req.files.avatar + const errors = {} + + if (!name) { + errors.name = 'The name field is required.' + } + + if (name && name.length < 3) { + errors.name = 'The name must be at least 3 characters.' + } + + if (!hasAvatar) { + errors.avatar = 'The avatar field is required.' + } + + if (only.length) { + Object.keys(errors).forEach((key) => { + if (!only.includes(key)) { + delete errors[key] + } + }) + } + + res.header('Precognition', 'true') + res.header('Vary', 'Precognition') + + if (Object.keys(errors).length) { + return res.status(422).json({ errors }) + } + + return res.status(204).header('Precognition-Success', 'true').send() + }, 250) +}) + +app.post('/precognition/headers', (req, res) => { + setTimeout(() => { + const customHeader = req.headers['x-custom-header'] + const name = req.body['name'] + const errors = {} + + // Show error when custom header IS present (to prove it was sent) + if (customHeader === 'custom-value') { + errors.name = 'Custom header received: custom-value' + } else if (!name) { + errors.name = 'The name field is required.' + } else if (name.length < 3) { + errors.name = 'The name must be at least 3 characters.' + } + + res.header('Precognition', 'true') + res.header('Vary', 'Precognition') + + if (Object.keys(errors).length) { + return res.status(422).json({ errors }) + } + + return res.status(204).header('Precognition-Success', 'true').send() + }, 250) +}) + const methods = ['get', 'post', 'put', 'patch', 'delete'] methods.forEach((method) => diff --git a/tests/precognition.spec.ts b/tests/precognition.spec.ts new file mode 100644 index 000000000..9331e6c37 --- /dev/null +++ b/tests/precognition.spec.ts @@ -0,0 +1,538 @@ +import test, { expect } from '@playwright/test' +import { requests } from './support' + +const integrations = ['form-helper'] + +integrations.forEach((integration) => { + test.skip(process.env.PACKAGE !== 'vue', '[WIP] Only for Vue') + + test.describe(integration === 'form-helper' ? 'Form Helper' : 'Form Component', () => { + test.describe('Precognition', () => { + test.beforeEach(async ({ page }) => { + await page.goto('/' + integration + '/precognition/default') + }) + + test('does not validate when field is untouched', async ({ page }) => { + await page.locator('input[name="name"]').focus() + await page.waitForTimeout(100) + await page.locator('input[name="name"]').blur() + + for (let i = 0; i < 5; i++) { + await expect(page.getByText('Validating...')).not.toBeVisible() + await page.waitForTimeout(50) + } + + await expect(page.getByText('The name field is required.')).not.toBeVisible() + }) + + test('shows validation error when field is invalid', async ({ page }) => { + await page.fill('input[name="name"]', 'ab') + await page.locator('input[name="name"]').blur() + + await expect(page.getByText('The name must be at least 3 characters.')).toBeVisible() + }) + + test('clears validation error when field becomes valid', async ({ page }) => { + await page.fill('input[name="name"]', 'ab') + await page.locator('input[name="name"]').blur() + + await expect(page.getByText('The name must be at least 3 characters.')).toBeVisible() + + await page.fill('input[name="name"]', 'John Doe') + await page.locator('input[name="name"]').blur() + + await expect(page.getByText('The name must be at least 3 characters.')).not.toBeVisible() + }) + + test('validates only the specified field', async ({ page }) => { + await page.fill('input[name="name"]', 'ab') + await page.locator('input[name="name"]').blur() + + await expect(page.getByText('The name must be at least 3 characters.')).toBeVisible() + await expect(page.getByText('The email field is required.')).not.toBeVisible() + }) + + test('validates multiple fields independently', async ({ page }) => { + await page.fill('input[name="name"]', 'ab') + await page.locator('input[name="name"]').blur() + + await expect(page.getByText('The name must be at least 3 characters.')).toBeVisible() + await expect(page.getByText('The email must be a valid email address.')).not.toBeVisible() + + await page.fill('input[name="email"]', 'x') + await page.locator('input[name="email"]').blur() + + await expect(page.getByText('The name must be at least 3 characters.')).toBeVisible() + await expect(page.getByText('The email must be a valid email address.')).toBeVisible() + }) + + test('does not clear unrelated field errors', async ({ page }) => { + await page.fill('input[name="name"]', 'ab') + await page.locator('input[name="name"]').blur() + + await expect(page.getByText('The name must be at least 3 characters.')).toBeVisible() + + await page.fill('input[name="email"]', 'x') + await page.locator('input[name="email"]').blur() + + await expect(page.getByText('The email must be a valid email address.')).toBeVisible() + + await page.fill('input[name="email"]', 'test@example.com') + await page.locator('input[name="email"]').blur() + + await expect(page.getByText('The email must be a valid email address.')).not.toBeVisible() + await expect(page.getByText('The name must be at least 3 characters.')).toBeVisible() + }) + + test('field is valid when validated and no errors exist', async ({ page }) => { + await expect(page.getByText('Name is valid!')).not.toBeVisible() + + await page.fill('input[name="name"]', 'John Doe') + await page.locator('input[name="name"]').blur() + + await expect(page.getByText('Validating...')).toBeVisible() + await expect(page.getByText('Validating...')).not.toBeVisible() + + await expect(page.getByText('Name is valid!')).toBeVisible() + }) + + test('field is not valid before validation', async ({ page }) => { + await expect(page.getByText('Name is valid!')).not.toBeVisible() + + await page.fill('input[name="name"]', 'John Doe') + await page.locator('input[name="name"]').blur() + + await expect(page.getByText('Validating...')).toBeVisible() + await expect(page.getByText('Validating...')).not.toBeVisible() + + await expect(page.getByText('Name is valid!')).toBeVisible() + await expect(page.getByText('The name must be at least 3 characters.')).not.toBeVisible() + }) + + test('field is not valid after failed validation', async ({ page }) => { + await page.fill('input[name="name"]', 'ab') + await page.locator('input[name="name"]').blur() + + await expect(page.getByText('Validating...')).toBeVisible() + await expect(page.getByText('Validating...')).not.toBeVisible() + + await expect(page.getByText('The name must be at least 3 characters.')).toBeVisible() + await expect(page.getByText('Name is valid!')).not.toBeVisible() + }) + + test('valid field persists after successful validation', async ({ page }) => { + await page.fill('input[name="name"]', 'John Doe') + await page.locator('input[name="name"]').blur() + + await expect(page.getByText('Validating...')).toBeVisible() + await expect(page.getByText('Validating...')).not.toBeVisible() + + await expect(page.getByText('Name is valid!')).toBeVisible() + + await page.fill('input[name="name"]', 'Jane Doe') + await page.locator('input[name="name"]').blur() + + await expect(page.getByText('Validating...')).toBeVisible() + await expect(page.getByText('Validating...')).not.toBeVisible() + + await expect(page.getByText('Name is valid!')).toBeVisible() + }) + + test('valid field becomes invalid when field is revalidated with errors', async ({ page }) => { + await page.fill('input[name="name"]', 'John Doe') + await page.locator('input[name="name"]').blur() + + await expect(page.getByText('Validating...')).toBeVisible() + await expect(page.getByText('Validating...')).not.toBeVisible() + + await expect(page.getByText('Name is valid!')).toBeVisible() + + await page.fill('input[name="name"]', 'ab') + await page.locator('input[name="name"]').blur() + + await expect(page.getByText('Validating...')).toBeVisible() + await expect(page.getByText('Validating...')).not.toBeVisible() + + await expect(page.getByText('The name must be at least 3 characters.')).toBeVisible() + await expect(page.getByText('Name is valid!')).not.toBeVisible() + }) + + test('shows only first error when server returns errors as array', async ({ page }) => { + await page.goto('/' + integration + '/precognition/array-errors') + + await page.fill('input[name="name"]', 'ab') + await page.locator('input[name="name"]').blur() + + await expect(page.getByText('Validating...')).toBeVisible() + await expect(page.getByText('Validating...')).not.toBeVisible() + + // Should show only the first error from the array, not the second + await expect(page.getByText('The name must be at least 3 characters.')).toBeVisible() + await expect(page.getByText('The name contains invalid characters.')).not.toBeVisible() + }) + + test('shows all errors when simpleValidationErrors is false', async ({ page }) => { + await page.goto('/' + integration + '/precognition/all-errors') + + await page.fill('input[name="name"]', 'ab') + await page.locator('input[name="name"]').blur() + + await expect(page.getByText('Validating...')).toBeVisible() + await expect(page.getByText('Validating...')).not.toBeVisible() + + // Should show all errors from the array + await expect(page.locator('#name-error-0')).toHaveText('The name must be at least 3 characters.') + await expect(page.locator('#name-error-1')).toHaveText('The name contains invalid characters.') + }) + + test('validates all touched fields when calling validate() without arguments', async ({ page }) => { + await page.goto('/' + integration + '/precognition/methods') + + await page.fill('input[name="name"]', 'ab') + await page.locator('input[name="name"]').blur() + + await page.fill('input[name="email"]', 'x') + await page.locator('input[name="email"]').blur() + + await expect(page.getByText('Validating...')).not.toBeVisible() + await expect(page.getByText('The name must be at least 3 characters.')).not.toBeVisible() + await expect(page.getByText('The email must be a valid email address.')).not.toBeVisible() + + await page.getByRole('button', { name: 'Validate All Touched' }).click() + + await expect(page.getByText('Validating...')).toBeVisible() + await expect(page.getByText('Validating...')).not.toBeVisible() + + await expect(page.getByText('The name must be at least 3 characters.')).toBeVisible() + await expect(page.getByText('The email must be a valid email address.')).toBeVisible() + }) + + test('reset all fields clears all touched fields', async ({ page }) => { + await page.goto('/' + integration + '/precognition/methods') + + await page.fill('input[name="name"]', 'ab') + await page.locator('input[name="name"]').blur() + + await page.fill('input[name="email"]', 'x') + await page.locator('input[name="email"]').blur() + + await page.getByRole('button', { name: 'Reset All' }).click() + + await expect(page.locator('input[name="name"]')).toHaveValue('') + await expect(page.locator('input[name="email"]')).toHaveValue('') + + await page.fill('input[name="name"]', 'ab') + await page.locator('input[name="name"]').blur() + + await page.getByRole('button', { name: 'Validate All Touched' }).click() + + await expect(page.getByText('Validating...')).toBeVisible() + await expect(page.getByText('Validating...')).not.toBeVisible() + + await expect(page.getByText('The name must be at least 3 characters.')).toBeVisible() + await expect(page.getByText('The email field is required.')).not.toBeVisible() + }) + + test('reset specific fields removes only those fields from touched', async ({ page }) => { + await page.goto('/' + integration + '/precognition/methods') + + await page.fill('input[name="name"]', 'ab') + await page.locator('input[name="name"]').blur() + + await page.fill('input[name="email"]', 'x') + await page.locator('input[name="email"]').blur() + + await expect(page.locator('input[name="name"]')).toHaveValue('ab') + await expect(page.locator('input[name="email"]')).toHaveValue('x') + + await page.getByRole('button', { name: 'Reset Name', exact: true }).click() + + await expect(page.locator('input[name="name"]')).toHaveValue('') + await expect(page.locator('input[name="email"]')).toHaveValue('x') + + await page.fill('input[name="email"]', 'y') + + await page.getByRole('button', { name: 'Validate All Touched' }).click() + + await expect(page.getByText('Validating...')).toBeVisible() + await expect(page.getByText('Validating...')).not.toBeVisible() + + await expect(page.getByText('The name field is required.')).not.toBeVisible() + await expect(page.getByText('The email must be a valid email address.')).toBeVisible() + }) + + test('touch with array marks multiple fields as touched', async ({ page }) => { + await page.goto('/' + integration + '/precognition/methods') + + await page.getByRole('button', { name: 'Touch Name and Email' }).click() + await page.getByRole('button', { name: 'Validate All Touched' }).click() + + await expect(page.getByText('Validating...')).toBeVisible() + await expect(page.getByText('Validating...')).not.toBeVisible() + + await expect(page.getByText('The name field is required.')).toBeVisible() + await expect(page.getByText('The email field is required.')).toBeVisible() + }) + + test('touch deduplicates fields when called multiple times', async ({ page }) => { + await page.goto('/' + integration + '/precognition/methods') + + await page.fill('input[name="name"]', 'ab') + + await page.getByRole('button', { name: 'Touch Name Twice' }).click() + await page.getByRole('button', { name: 'Validate All Touched' }).click() + + await expect(page.getByText('Validating...')).toBeVisible() + await expect(page.getByText('Validating...')).not.toBeVisible() + + await expect(page.getByText('The name must be at least 3 characters.')).toBeVisible() + await expect(page.getByText('The email must be a valid email address.')).not.toBeVisible() + }) + + test('touched() returns false when no fields are touched', async ({ page }) => { + await page.goto('/' + integration + '/precognition/methods') + + await expect(page.locator('#any-touched')).toHaveText('Form has no touched fields') + await expect(page.locator('#name-touched')).toHaveText('Name is not touched') + await expect(page.locator('#email-touched')).toHaveText('Email is not touched') + }) + + test('touched(field) returns true when specific field is touched', async ({ page }) => { + await page.goto('/' + integration + '/precognition/methods') + + await page.locator('input[name="name"]').focus() + await page.locator('input[name="name"]').blur() + + await expect(page.locator('#name-touched')).toHaveText('Name is touched') + await expect(page.locator('#email-touched')).toHaveText('Email is not touched') + await expect(page.locator('#any-touched')).toHaveText('Form has touched fields') + }) + + test('touched() returns true when any field is touched', async ({ page }) => { + await page.goto('/' + integration + '/precognition/methods') + + await page.locator('input[name="email"]').focus() + await page.locator('input[name="email"]').blur() + + await expect(page.locator('#any-touched')).toHaveText('Form has touched fields') + await expect(page.locator('#email-touched')).toHaveText('Email is touched') + await expect(page.locator('#name-touched')).toHaveText('Name is not touched') + }) + + test('touched() updates when multiple fields are touched', async ({ page }) => { + await page.goto('/' + integration + '/precognition/methods') + + await page.locator('input[name="name"]').focus() + await page.locator('input[name="name"]').blur() + await page.locator('input[name="email"]').focus() + await page.locator('input[name="email"]').blur() + + await expect(page.locator('#name-touched')).toHaveText('Name is touched') + await expect(page.locator('#email-touched')).toHaveText('Email is touched') + await expect(page.locator('#any-touched')).toHaveText('Form has touched fields') + }) + + test('validating a specific field also validates previously touched inputs', async ({ page }) => { + await page.goto('/' + integration + '/precognition/methods') + + await page.fill('input[name="name"]', 'ab') + await page.fill('input[name="email"]', 'x') + + await page.getByRole('button', { name: 'Validate Name', exact: true }).click() + + await expect(page.getByText('Validating...')).toBeVisible() + await expect(page.getByText('Validating...')).not.toBeVisible() + + await expect(page.getByText('The name must be at least 3 characters.')).toBeVisible() + await expect(page.getByText('The email must be a valid email address.')).toBeVisible() + }) + + test('validate with array of fields validates multiple fields', async ({ page }) => { + await page.goto('/' + integration + '/precognition/methods') + + await page.getByRole('button', { name: 'Validate Name and Email' }).click() + + await expect(page.getByText('Validating...')).toBeVisible() + await expect(page.getByText('Validating...')).not.toBeVisible() + + await expect(page.getByText('The name field is required.')).toBeVisible() + await expect(page.getByText('The email field is required.')).toBeVisible() + }) + + test('reset with array removes multiple fields from touched', async ({ page }) => { + await page.goto('/' + integration + '/precognition/methods') + + await page.fill('input[name="name"]', 'ab') + await page.locator('input[name="name"]').blur() + + await page.fill('input[name="email"]', 'x') + await page.locator('input[name="email"]').blur() + + await page.getByRole('button', { name: 'Validate All Touched' }).click() + + await expect(page.getByText('Validating...')).toBeVisible() + await expect(page.getByText('Validating...')).not.toBeVisible() + + await expect(page.getByText('The name must be at least 3 characters.')).toBeVisible() + await expect(page.getByText('The email must be a valid email address.')).toBeVisible() + + await page.getByRole('button', { name: 'Reset Name and Email' }).click() + + await expect(page.locator('input[name="name"]')).toHaveValue('') + await expect(page.locator('input[name="email"]')).toHaveValue('') + + await expect(page.getByText('Name is not touched')).toBeVisible() + await expect(page.getByText('Email is not touched')).toBeVisible() + await expect(page.getByText('Form has no touched fields')).toBeVisible() + + await page.fill('input[name="name"]', 'abc') + await page.fill('input[name="email"]', 'test@example.com') + + await page.getByRole('button', { name: 'Validate All Touched' }).click() + + await page.waitForTimeout(500) + + await expect(page.getByText('The name must be at least 3 characters.')).not.toBeVisible() + await expect(page.getByText('The email must be a valid email address.')).not.toBeVisible() + }) + + test('does not submit files by default', async ({ page }) => { + await page.goto('/' + integration + '/precognition/files') + + await page.setInputFiles('#avatar', { + name: 'avatar.jpg', + mimeType: 'image/jpeg', + buffer: Buffer.from('fake image data'), + }) + + await page.getByRole('button', { name: 'Validate Both' }).click() + + await expect(page.getByText('Validating...')).toBeVisible() + await expect(page.getByText('Validating...')).not.toBeVisible() + + await expect(page.getByText('The name field is required.')).toBeVisible() + await expect(page.getByText('The avatar field is required.')).toBeVisible() + }) + + test('validates files when validate-files prop is true', async ({ page }) => { + await page.goto('/' + integration + '/precognition/files') + await page.getByRole('button', { name: /Toggle Validate Files/ }).click() + await expect(page.getByText('Toggle Validate Files (enabled)')).toBeVisible() + + await page.fill('input[name="name"]', 'ab') + await page.setInputFiles('#avatar', { + name: 'avatar.jpg', + mimeType: 'image/jpeg', + buffer: Buffer.from('fake image data'), + }) + + await page.getByRole('button', { name: 'Validate Both' }).click() + + await expect(page.getByText('Validating...')).toBeVisible() + await expect(page.getByText('Validating...')).not.toBeVisible() + + await expect(page.getByText('The name must be at least 3 characters.')).toBeVisible() + await expect(page.getByText('The avatar field is required.')).not.toBeVisible() + }) + + test('transforms data for validation requests', async ({ page }) => { + await page.goto('/' + integration + '/precognition/transform') + + await page.fill('input[name="name"]', 'a') + await page.locator('input[name="name"]').blur() + + await expect(page.getByText('Validating...')).toBeVisible() + await expect(page.getByText('Validating...')).not.toBeVisible() + + await expect(page.getByText('The name must be at least 3 characters.')).toBeVisible() + + await page.fill('input[name="name"]', 'aa') + await page.locator('input[name="name"]').blur() + + await expect(page.getByText('Validating...')).toBeVisible() + await expect(page.getByText('Validating...')).not.toBeVisible() + + await expect(page.getByText('The name must be at least 3 characters.')).not.toBeVisible() + await expect(page.getByText('Name is valid!')).toBeVisible() + }) + + test('calls onPrecognitionSuccess and onFinish callbacks when validation succeeds', async ({ page }) => { + await page.goto('/' + integration + '/precognition/callbacks') + + await page.fill('input[name="name"]', 'John Doe') + await page.click('button:has-text("Validate")') + + await expect(page.getByText('Validating...')).toBeVisible() + await expect(page.getByText('Validating...')).not.toBeVisible() + + await expect(page.getByText('onPrecognitionSuccess called!')).toBeVisible() + await expect(page.getByText('onValidationError called!')).not.toBeVisible() + await expect(page.getByText('onFinish called!')).toBeVisible() + }) + + test('calls onValidationError and onFinish callbacks when validation fails', async ({ page }) => { + await page.goto('/' + integration + '/precognition/callbacks') + + await page.fill('input[name="name"]', 'ab') + await page.click('button:has-text("Validate")') + + await expect(page.getByText('Validating...')).toBeVisible() + await expect(page.getByText('Validating...')).not.toBeVisible() + + await expect(page.getByText('onPrecognitionSuccess called!')).not.toBeVisible() + await expect(page.getByText('onValidationError called!')).toBeVisible() + await expect(page.getByText('onFinish called!')).toBeVisible() + }) + + test('onBefore can block validation', async ({ page }) => { + await page.goto('/' + integration + '/precognition/before-validation') + + await page.fill('input[name="name"]', 'block') + await page.locator('input[name="name"]').blur() + + for (let i = 0; i < 5; i++) { + await expect(page.getByText('Validating...')).not.toBeVisible() + await page.waitForTimeout(50) + } + }) + + test('sends custom headers with validation requests', async ({ page }) => { + await page.goto('/' + integration + '/precognition/headers') + + // Fill in a valid name to trigger validation + await page.fill('input[name="name"]', 'John Doe') + await page.locator('input[name="name"]').blur() + + await expect(page.getByText('Validating...')).toBeVisible() + await expect(page.getByText('Validating...')).not.toBeVisible() + + // Should show error confirming custom header was received + await expect(page.getByText('Custom header received: custom-value')).toBeVisible() + }) + + test('automatically cancels previous validation when new validation starts', async ({ page }) => { + await page.goto('/' + integration + '/precognition/cancel') + + requests.listenForFailed(page) + requests.listenForResponses(page) + + await page.fill('#auto-cancel-name-input', 'ab') + await page.locator('#auto-cancel-name-input').blur() + await expect(page.getByText('Validating...')).toBeVisible() + + // Immediately change value and trigger new validation - should cancel the first one + await page.fill('#auto-cancel-name-input', 'xy') + await page.locator('#auto-cancel-name-input').blur() + await expect(page.getByText('Validating...')).not.toBeVisible() + await expect(page.getByText('The name must be at least 3 characters.')).toBeVisible() + + // One cancelled, one 422 response + expect(requests.failed).toHaveLength(1) + expect(requests.responses).toHaveLength(1) + + const cancelledRequestError = await requests.failed[0].failure()?.errorText + expect(cancelledRequestError).toBe('net::ERR_ABORTED') + }) + }) + }) +}) diff --git a/tests/support.ts b/tests/support.ts index bae7d4abb..baba83c2b 100644 --- a/tests/support.ts +++ b/tests/support.ts @@ -43,6 +43,8 @@ export const consoleMessages = { export const requests = { requests: [] as Request[], finished: [] as Request[], + failed: [] as Request[], + responses: [] as Response[], listen(page: Page) { this.requests = [] @@ -53,6 +55,16 @@ export const requests = { this.finished = [] page.on('requestfinished', (request) => this.finished.push(request)) }, + + listenForFailed(page: Page) { + this.failed = [] + page.on('requestfailed', (request) => this.failed.push(request)) + }, + + listenForResponses(page: Page) { + this.responses = [] + page.on('response', (data) => this.responses.push(data)) + }, } export const shouldBeDumpPage = async (page: Page, method: 'get' | 'post' | 'patch' | 'put' | 'delete') => { From 350b6e4f28f3c0c49547fa28402455e835489d4a Mon Sep 17 00:00:00 2001 From: Pascal Baljet Date: Tue, 4 Nov 2025 14:32:36 +0100 Subject: [PATCH 02/50] Update Files.vue --- .../test-app/Pages/FormHelper/Precognition/Files.vue | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/vue3/test-app/Pages/FormHelper/Precognition/Files.vue b/packages/vue3/test-app/Pages/FormHelper/Precognition/Files.vue index 9883699cd..761315d32 100644 --- a/packages/vue3/test-app/Pages/FormHelper/Precognition/Files.vue +++ b/packages/vue3/test-app/Pages/FormHelper/Precognition/Files.vue @@ -2,7 +2,10 @@ import { useForm } from '@inertiajs/vue3' import { ref, watch } from 'vue' -const form = useForm({ +const form = useForm<{ + name: string + avatar: File | null +}>({ name: '', avatar: null, }) @@ -28,7 +31,12 @@ watch(validateFiles, (enabled) => {
- +

{{ form.errors.avatar }}

From 065ff960e6ffdc714e54e5efb56b80826d0c8e2a Mon Sep 17 00:00:00 2001 From: Pascal Baljet Date: Tue, 4 Nov 2025 14:38:21 +0100 Subject: [PATCH 03/50] Update Files.vue --- .../vue3/test-app/Pages/FormHelper/Precognition/Files.vue | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/vue3/test-app/Pages/FormHelper/Precognition/Files.vue b/packages/vue3/test-app/Pages/FormHelper/Precognition/Files.vue index 761315d32..c4566ed16 100644 --- a/packages/vue3/test-app/Pages/FormHelper/Precognition/Files.vue +++ b/packages/vue3/test-app/Pages/FormHelper/Precognition/Files.vue @@ -14,10 +14,7 @@ const form = useForm<{ const validateFiles = ref(false) -watch(validateFiles, (enabled) => { - enabled ? form.validateFiles() : form.withoutFileValidation() - console.log(`File validation ${enabled ? 'enabled' : 'disabled'}`) -}) +watch(validateFiles, (enabled) => (enabled ? form.validateFiles() : form.withoutFileValidation()))