Full Code of inertiajs/inertia for AI

master c2e81025e817 cached
1604 files
2.9 MB
859.3k tokens
985 symbols
1 requests
Download .txt
Showing preview only (3,392K chars total). Download the full file or copy to clipboard to get everything.
Repository: inertiajs/inertia
Branch: master
Commit: c2e81025e817
Files: 1604
Total size: 2.9 MB

Directory structure:
gitextract_nfe091gr/

├── .editorconfig
├── .gitattributes
├── .github/
│   ├── CODE_OF_CONDUCT.md
│   ├── ISSUE_TEMPLATE/
│   │   ├── 0-bug-report.yml
│   │   ├── 1-bug-report-react.yml
│   │   ├── 2-bug-report-vue.yml
│   │   ├── 3-bug-report-svelte.yml
│   │   └── config.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── SECURITY.md
│   ├── SUPPORT.md
│   └── workflows/
│       ├── build.yml
│       ├── coding-standards.yml
│       ├── es2020-compatibility.yml
│       ├── playwright-chromium.yml
│       ├── playwright-firefox.yml
│       ├── playwright-webkit.yml
│       ├── publish.yml
│       ├── test-app-quality.yml
│       └── update-changelog.yml
├── .gitignore
├── .prettierignore
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE.md
├── README.md
├── package.json
├── packages/
│   ├── core/
│   │   ├── .gitignore
│   │   ├── LICENSE
│   │   ├── build.js
│   │   ├── package.json
│   │   ├── readme.md
│   │   ├── src/
│   │   │   ├── config.ts
│   │   │   ├── debounce.ts
│   │   │   ├── debug.ts
│   │   │   ├── dialog.ts
│   │   │   ├── domUtils.ts
│   │   │   ├── encryption.ts
│   │   │   ├── eventHandler.ts
│   │   │   ├── events.ts
│   │   │   ├── files.ts
│   │   │   ├── formData.ts
│   │   │   ├── formObject.ts
│   │   │   ├── head.ts
│   │   │   ├── history.ts
│   │   │   ├── index.ts
│   │   │   ├── infiniteScroll/
│   │   │   │   ├── data.ts
│   │   │   │   ├── elements.ts
│   │   │   │   ├── queryString.ts
│   │   │   │   └── scrollPreservation.ts
│   │   │   ├── infiniteScroll.ts
│   │   │   ├── initialVisit.ts
│   │   │   ├── intersectionObservers.ts
│   │   │   ├── modal.ts
│   │   │   ├── navigationEvents.ts
│   │   │   ├── navigationType.ts
│   │   │   ├── objectUtils.ts
│   │   │   ├── page.ts
│   │   │   ├── poll.ts
│   │   │   ├── polls.ts
│   │   │   ├── prefetched.ts
│   │   │   ├── progress-component.ts
│   │   │   ├── progress.ts
│   │   │   ├── queue.ts
│   │   │   ├── request.ts
│   │   │   ├── requestParams.ts
│   │   │   ├── requestStream.ts
│   │   │   ├── resetFormFields.ts
│   │   │   ├── response.ts
│   │   │   ├── router.ts
│   │   │   ├── scroll.ts
│   │   │   ├── server.ts
│   │   │   ├── sessionStorage.ts
│   │   │   ├── time.ts
│   │   │   ├── types.ts
│   │   │   ├── url.ts
│   │   │   └── useFormUtils.ts
│   │   └── tsconfig.json
│   ├── react/
│   │   ├── .gitignore
│   │   ├── LICENSE
│   │   ├── build.js
│   │   ├── package.json
│   │   ├── readme.md
│   │   ├── resources/
│   │   │   └── boost/
│   │   │       ├── guidelines/
│   │   │       │   └── core.blade.php
│   │   │       └── skills/
│   │   │           └── inertia-react-development/
│   │   │               └── SKILL.blade.php
│   │   ├── src/
│   │   │   ├── App.ts
│   │   │   ├── Deferred.ts
│   │   │   ├── Form.ts
│   │   │   ├── Head.ts
│   │   │   ├── HeadContext.ts
│   │   │   ├── InfiniteScroll.ts
│   │   │   ├── Link.ts
│   │   │   ├── PageContext.ts
│   │   │   ├── WhenVisible.ts
│   │   │   ├── createInertiaApp.ts
│   │   │   ├── index.ts
│   │   │   ├── react.ts
│   │   │   ├── server.ts
│   │   │   ├── types.ts
│   │   │   ├── useForm.ts
│   │   │   ├── usePage.ts
│   │   │   ├── usePoll.ts
│   │   │   ├── usePrefetch.ts
│   │   │   └── useRemember.ts
│   │   ├── test-app/
│   │   │   ├── Layouts/
│   │   │   │   ├── NestedLayout.tsx
│   │   │   │   ├── Prefetch.tsx
│   │   │   │   ├── SWR.tsx
│   │   │   │   ├── SiteLayout.tsx
│   │   │   │   ├── WithScrollRegion.tsx
│   │   │   │   └── WithoutScrollRegion.tsx
│   │   │   ├── Pages/
│   │   │   │   ├── Article.tsx
│   │   │   │   ├── ClientSideVisit/
│   │   │   │   │   ├── Page1.tsx
│   │   │   │   │   ├── Page2.tsx
│   │   │   │   │   ├── Props.tsx
│   │   │   │   │   └── Sequential.tsx
│   │   │   │   ├── ComplexMergeSelective.tsx
│   │   │   │   ├── CustomConfig.tsx
│   │   │   │   ├── DeepMergeProps.tsx
│   │   │   │   ├── DeferredProps/
│   │   │   │   │   ├── BackButton/
│   │   │   │   │   │   ├── PageA.tsx
│   │   │   │   │   │   └── PageB.tsx
│   │   │   │   │   ├── InstantReload.tsx
│   │   │   │   │   ├── ManyGroups.tsx
│   │   │   │   │   ├── Page1.tsx
│   │   │   │   │   ├── Page2.tsx
│   │   │   │   │   ├── Page3.tsx
│   │   │   │   │   ├── PartialReloads.tsx
│   │   │   │   │   ├── RapidNavigation.tsx
│   │   │   │   │   ├── ReloadWithoutOptionalChaining.tsx
│   │   │   │   │   ├── WithErrors.tsx
│   │   │   │   │   ├── WithPartialReload.tsx
│   │   │   │   │   ├── WithQueryParams.tsx
│   │   │   │   │   └── WithReload.tsx
│   │   │   │   ├── Dump.tsx
│   │   │   │   ├── ErrorModal.tsx
│   │   │   │   ├── Events.tsx
│   │   │   │   ├── Flash/
│   │   │   │   │   ├── ClientSideVisits.tsx
│   │   │   │   │   ├── Events.tsx
│   │   │   │   │   ├── InitialFlash.tsx
│   │   │   │   │   ├── Partial.tsx
│   │   │   │   │   ├── RouterFlash.tsx
│   │   │   │   │   ├── WithDeferred.tsx
│   │   │   │   │   └── WithInfiniteScroll.tsx
│   │   │   │   ├── FormComponent/
│   │   │   │   │   ├── ChildComponent.tsx
│   │   │   │   │   ├── Context/
│   │   │   │   │   │   ├── ChildComponent.tsx
│   │   │   │   │   │   ├── DeeplyNestedComponent.tsx
│   │   │   │   │   │   ├── Default.tsx
│   │   │   │   │   │   ├── Methods.tsx
│   │   │   │   │   │   ├── MethodsTestComponent.tsx
│   │   │   │   │   │   ├── Multiple.tsx
│   │   │   │   │   │   ├── NestedComponent.tsx
│   │   │   │   │   │   └── OutsideFormComponent.tsx
│   │   │   │   │   ├── DataMethods.tsx
│   │   │   │   │   ├── DefaultValue.tsx
│   │   │   │   │   ├── DisableWhileProcessing.tsx
│   │   │   │   │   ├── DottedKeys.tsx
│   │   │   │   │   ├── Elements.tsx
│   │   │   │   │   ├── EmptyAction.tsx
│   │   │   │   │   ├── Errors.tsx
│   │   │   │   │   ├── Events.tsx
│   │   │   │   │   ├── FormTarget.tsx
│   │   │   │   │   ├── Headers.tsx
│   │   │   │   │   ├── InvalidateTags.tsx
│   │   │   │   │   ├── Methods.tsx
│   │   │   │   │   ├── MixedKeySerialization.tsx
│   │   │   │   │   ├── Options.tsx
│   │   │   │   │   ├── Precognition/
│   │   │   │   │   │   ├── BeforeValidation.tsx
│   │   │   │   │   │   ├── Callbacks.tsx
│   │   │   │   │   │   ├── Cancel.tsx
│   │   │   │   │   │   ├── Default.tsx
│   │   │   │   │   │   ├── DynamicArrayInputs.tsx
│   │   │   │   │   │   ├── ErrorSync.tsx
│   │   │   │   │   │   ├── Files.tsx
│   │   │   │   │   │   ├── Headers.tsx
│   │   │   │   │   │   ├── Methods.tsx
│   │   │   │   │   │   ├── Transform.tsx
│   │   │   │   │   │   ├── TransformKeys.tsx
│   │   │   │   │   │   ├── WithAllErrors.tsx
│   │   │   │   │   │   ├── WithAllErrorsConfig.tsx
│   │   │   │   │   │   └── WithoutAllErrors.tsx
│   │   │   │   │   ├── Progress.tsx
│   │   │   │   │   ├── Ref.tsx
│   │   │   │   │   ├── Reset.tsx
│   │   │   │   │   ├── ResetAttributes/
│   │   │   │   │   │   ├── ResetOnError.tsx
│   │   │   │   │   │   ├── ResetOnErrorFields.tsx
│   │   │   │   │   │   ├── ResetOnSuccess.tsx
│   │   │   │   │   │   └── ResetOnSuccessFields.tsx
│   │   │   │   │   ├── SetDefaultsOnSuccess.tsx
│   │   │   │   │   ├── SubmitButton.tsx
│   │   │   │   │   ├── SubmitComplete/
│   │   │   │   │   │   ├── Defaults.tsx
│   │   │   │   │   │   ├── Redirect.tsx
│   │   │   │   │   │   └── Reset.tsx
│   │   │   │   │   ├── Transform.tsx
│   │   │   │   │   ├── UppercaseMethod.tsx
│   │   │   │   │   ├── ViewTransition.tsx
│   │   │   │   │   └── Wayfinder.tsx
│   │   │   │   ├── FormHelper/
│   │   │   │   │   ├── Data.tsx
│   │   │   │   │   ├── Dirty.tsx
│   │   │   │   │   ├── EffectCount.tsx
│   │   │   │   │   ├── EmptyForm.tsx
│   │   │   │   │   ├── Errors.tsx
│   │   │   │   │   ├── ErrorsClearOnResubmit.tsx
│   │   │   │   │   ├── Events.tsx
│   │   │   │   │   ├── Methods.tsx
│   │   │   │   │   ├── Nested.tsx
│   │   │   │   │   ├── Precognition/
│   │   │   │   │   │   ├── BeforeValidation.tsx
│   │   │   │   │   │   ├── Callbacks.tsx
│   │   │   │   │   │   ├── Cancel.tsx
│   │   │   │   │   │   ├── Compatibility.tsx
│   │   │   │   │   │   ├── Default.tsx
│   │   │   │   │   │   ├── DynamicArrayInputs.tsx
│   │   │   │   │   │   ├── ErrorSync.tsx
│   │   │   │   │   │   ├── Files.tsx
│   │   │   │   │   │   ├── Headers.tsx
│   │   │   │   │   │   ├── Instantiate.tsx
│   │   │   │   │   │   ├── Methods.tsx
│   │   │   │   │   │   ├── Transform.tsx
│   │   │   │   │   │   ├── TransformKeys.tsx
│   │   │   │   │   │   ├── WithAllErrors.tsx
│   │   │   │   │   │   ├── WithAllErrorsConfig.tsx
│   │   │   │   │   │   └── WithoutAllErrors.tsx
│   │   │   │   │   ├── RememberEdit.tsx
│   │   │   │   │   ├── RememberIndex.tsx
│   │   │   │   │   ├── Transform.tsx
│   │   │   │   │   └── TypeScript/
│   │   │   │   │       ├── Any.tsx
│   │   │   │   │       ├── Child.tsx
│   │   │   │   │       ├── CircularlReferences.tsx
│   │   │   │   │       ├── Data.tsx
│   │   │   │   │       ├── DynamicInputName.tsx
│   │   │   │   │       ├── Errors.tsx
│   │   │   │   │       ├── Generic.tsx
│   │   │   │   │       ├── Nullable.tsx
│   │   │   │   │       ├── NullableNestedObject.tsx
│   │   │   │   │       ├── OptionalProps.tsx
│   │   │   │   │       ├── Parent.tsx
│   │   │   │   │       ├── Precognition.tsx
│   │   │   │   │       └── ValidationKey.tsx
│   │   │   │   ├── Head/
│   │   │   │   │   ├── Conditional.tsx
│   │   │   │   │   ├── Dataset.tsx
│   │   │   │   │   ├── Mixed.tsx
│   │   │   │   │   ├── Reactive.tsx
│   │   │   │   │   ├── WithTitle.tsx
│   │   │   │   │   └── WithoutTitle.tsx
│   │   │   │   ├── Head.tsx
│   │   │   │   ├── History/
│   │   │   │   │   ├── Page.tsx
│   │   │   │   │   └── Version.tsx
│   │   │   │   ├── HistoryQuota/
│   │   │   │   │   └── Page.tsx
│   │   │   │   ├── HistoryThrottle.tsx
│   │   │   │   ├── Home.tsx
│   │   │   │   ├── InfiniteScroll/
│   │   │   │   │   ├── CustomElement.tsx
│   │   │   │   │   ├── CustomTriggersRef.tsx
│   │   │   │   │   ├── CustomTriggersRefObject.tsx
│   │   │   │   │   ├── CustomTriggersSelector.tsx
│   │   │   │   │   ├── DataTable.tsx
│   │   │   │   │   ├── Deferred.tsx
│   │   │   │   │   ├── DualContainers.tsx
│   │   │   │   │   ├── DualSibling.tsx
│   │   │   │   │   ├── Empty.tsx
│   │   │   │   │   ├── Filtering.tsx
│   │   │   │   │   ├── FilteringManual.tsx
│   │   │   │   │   ├── FilteringReset.tsx
│   │   │   │   │   ├── Grid.tsx
│   │   │   │   │   ├── HorizontalScroll.tsx
│   │   │   │   │   ├── InfiniteScrollWithLink.tsx
│   │   │   │   │   ├── InvisibleFirstChild.tsx
│   │   │   │   │   ├── Links.tsx
│   │   │   │   │   ├── Manual.tsx
│   │   │   │   │   ├── ManualAfter.tsx
│   │   │   │   │   ├── OverflowX.tsx
│   │   │   │   │   ├── PreserveUrl.tsx
│   │   │   │   │   ├── ProgrammaticRef.tsx
│   │   │   │   │   ├── ReloadUnrelated.tsx
│   │   │   │   │   ├── RememberState.tsx
│   │   │   │   │   ├── Reverse.tsx
│   │   │   │   │   ├── ReverseShortContent.tsx
│   │   │   │   │   ├── ScrollContainer.tsx
│   │   │   │   │   ├── ShortContent.tsx
│   │   │   │   │   ├── Toggles.tsx
│   │   │   │   │   ├── TriggerBoth.tsx
│   │   │   │   │   ├── TriggerEndBuffer.tsx
│   │   │   │   │   ├── TriggerStartBuffer.tsx
│   │   │   │   │   ├── UpdateQueryString.tsx
│   │   │   │   │   └── UserCard.tsx
│   │   │   │   ├── Links/
│   │   │   │   │   ├── AsComponent.tsx
│   │   │   │   │   ├── AsElement.tsx
│   │   │   │   │   ├── AsWarning.tsx
│   │   │   │   │   ├── AsWarningFalse.tsx
│   │   │   │   │   ├── AutomaticCancellation.tsx
│   │   │   │   │   ├── CancelSyncRequest.tsx
│   │   │   │   │   ├── Data/
│   │   │   │   │   │   ├── AutoConverted.tsx
│   │   │   │   │   │   ├── FormData.tsx
│   │   │   │   │   │   └── Object.tsx
│   │   │   │   │   ├── DataLoading.tsx
│   │   │   │   │   ├── Headers.tsx
│   │   │   │   │   ├── Location.tsx
│   │   │   │   │   ├── Method.tsx
│   │   │   │   │   ├── PartialReloads.tsx
│   │   │   │   │   ├── PathTraversal.tsx
│   │   │   │   │   ├── PreserveScroll.tsx
│   │   │   │   │   ├── PreserveScrollFalse.tsx
│   │   │   │   │   ├── PreserveState.tsx
│   │   │   │   │   ├── PreserveUrl.tsx
│   │   │   │   │   ├── PropUpdate.tsx
│   │   │   │   │   ├── Reactivity.tsx
│   │   │   │   │   ├── Replace.tsx
│   │   │   │   │   ├── ScrollRegionList.tsx
│   │   │   │   │   └── UrlFragments.tsx
│   │   │   │   ├── MatchPropsOnKey.tsx
│   │   │   │   ├── MergeNestedProps.tsx
│   │   │   │   ├── MergeProps.tsx
│   │   │   │   ├── NavigateNonInertia.tsx
│   │   │   │   ├── NetworkError.tsx
│   │   │   │   ├── OnceProps/
│   │   │   │   │   ├── ClientSideVisit.tsx
│   │   │   │   │   ├── CustomKeyPageA.tsx
│   │   │   │   │   ├── CustomKeyPageB.tsx
│   │   │   │   │   ├── DeferredPageA.tsx
│   │   │   │   │   ├── DeferredPageB.tsx
│   │   │   │   │   ├── DeferredPageC.tsx
│   │   │   │   │   ├── MergePageA.tsx
│   │   │   │   │   ├── MergePageB.tsx
│   │   │   │   │   ├── OptionalPageA.tsx
│   │   │   │   │   ├── OptionalPageB.tsx
│   │   │   │   │   ├── PageA.tsx
│   │   │   │   │   ├── PageB.tsx
│   │   │   │   │   ├── PageC.tsx
│   │   │   │   │   ├── PageD.tsx
│   │   │   │   │   ├── PageE.tsx
│   │   │   │   │   ├── PartialReloadA.tsx
│   │   │   │   │   ├── PartialReloadB.tsx
│   │   │   │   │   ├── SlowDeferredPageA.tsx
│   │   │   │   │   ├── SlowDeferredPageB.tsx
│   │   │   │   │   ├── TtlPageA.tsx
│   │   │   │   │   ├── TtlPageB.tsx
│   │   │   │   │   └── TtlPageC.tsx
│   │   │   │   ├── PersistentLayouts/
│   │   │   │   │   ├── RenderFunction/
│   │   │   │   │   │   ├── Nested/
│   │   │   │   │   │   │   ├── PageA.tsx
│   │   │   │   │   │   │   └── PageB.tsx
│   │   │   │   │   │   └── Simple/
│   │   │   │   │   │       ├── PageA.tsx
│   │   │   │   │   │       └── PageB.tsx
│   │   │   │   │   └── Shorthand/
│   │   │   │   │       ├── Nested/
│   │   │   │   │       │   ├── PageA.tsx
│   │   │   │   │       │   └── PageB.tsx
│   │   │   │   │       └── Simple/
│   │   │   │   │           ├── PageA.tsx
│   │   │   │   │           └── PageB.tsx
│   │   │   │   ├── Poll/
│   │   │   │   │   ├── Hook.tsx
│   │   │   │   │   ├── HookManual.tsx
│   │   │   │   │   ├── RouterManual.tsx
│   │   │   │   │   └── UnchangedData.tsx
│   │   │   │   ├── Prefetch/
│   │   │   │   │   ├── AfterError.tsx
│   │   │   │   │   ├── Form.tsx
│   │   │   │   │   ├── Page.tsx
│   │   │   │   │   ├── PreserveState.tsx
│   │   │   │   │   ├── SWR.tsx
│   │   │   │   │   ├── Tags.tsx
│   │   │   │   │   ├── TestPage.tsx
│   │   │   │   │   └── Wayfinder.tsx
│   │   │   │   ├── PreserveEqualProps.tsx
│   │   │   │   ├── Progress.tsx
│   │   │   │   ├── ProgressComponent.tsx
│   │   │   │   ├── Reload/
│   │   │   │   │   ├── Concurrent.tsx
│   │   │   │   │   └── ConcurrentWithData.tsx
│   │   │   │   ├── Remember/
│   │   │   │   │   ├── Components/
│   │   │   │   │   │   ├── ComponentA.tsx
│   │   │   │   │   │   └── ComponentB.tsx
│   │   │   │   │   ├── Default.tsx
│   │   │   │   │   ├── FormHelper/
│   │   │   │   │   │   ├── Default.tsx
│   │   │   │   │   │   ├── Password.tsx
│   │   │   │   │   │   └── Remember.tsx
│   │   │   │   │   ├── MultipleComponents.tsx
│   │   │   │   │   ├── Object.tsx
│   │   │   │   │   └── Router.tsx
│   │   │   │   ├── SSR/
│   │   │   │   │   ├── Page1.tsx
│   │   │   │   │   ├── Page2.tsx
│   │   │   │   │   └── PageWithScriptElement.tsx
│   │   │   │   ├── ScrollAfterRender.tsx
│   │   │   │   ├── ScrollRegionPreserveUrl.tsx
│   │   │   │   ├── ScrollSmooth.tsx
│   │   │   │   ├── ScrollableParent.tsx
│   │   │   │   ├── TypeScriptCreateInertiaApp.ts
│   │   │   │   ├── TypeScriptFlash.tsx
│   │   │   │   ├── TypeScriptProps.tsx
│   │   │   │   ├── ViewTransition/
│   │   │   │   │   ├── FormErrors.tsx
│   │   │   │   │   ├── PageA.tsx
│   │   │   │   │   └── PageB.tsx
│   │   │   │   ├── Visits/
│   │   │   │   │   ├── AfterError.tsx
│   │   │   │   │   ├── AutomaticCancellation.tsx
│   │   │   │   │   ├── Data/
│   │   │   │   │   │   ├── AutoConverted.tsx
│   │   │   │   │   │   ├── FormData.tsx
│   │   │   │   │   │   └── Object.tsx
│   │   │   │   │   ├── ErrorBags.tsx
│   │   │   │   │   ├── Headers.tsx
│   │   │   │   │   ├── Location.tsx
│   │   │   │   │   ├── Method.tsx
│   │   │   │   │   ├── PartialReloads.tsx
│   │   │   │   │   ├── PreserveScroll.tsx
│   │   │   │   │   ├── PreserveScrollFalse.tsx
│   │   │   │   │   ├── PreserveState.tsx
│   │   │   │   │   ├── ReloadOnMount.tsx
│   │   │   │   │   ├── Replace.tsx
│   │   │   │   │   ├── UrlFragments.tsx
│   │   │   │   │   └── Wayfinder.tsx
│   │   │   │   ├── WhenVisible.tsx
│   │   │   │   ├── WhenVisibleArrayReload.tsx
│   │   │   │   ├── WhenVisibleBackButton.tsx
│   │   │   │   ├── WhenVisibleFetching.tsx
│   │   │   │   ├── WhenVisibleMergeParams.tsx
│   │   │   │   ├── WhenVisibleParamsUpdate.tsx
│   │   │   │   └── WhenVisibleReload.tsx
│   │   │   ├── app.tsx
│   │   │   ├── eslint.config.js
│   │   │   ├── index.html
│   │   │   ├── package.json
│   │   │   ├── ssr.tsx
│   │   │   ├── tsconfig.json
│   │   │   ├── types.d.ts
│   │   │   └── vite.config.ts
│   │   └── tsconfig.json
│   ├── svelte/
│   │   ├── .gitignore
│   │   ├── LICENSE
│   │   ├── package.json
│   │   ├── readme.md
│   │   ├── resources/
│   │   │   └── boost/
│   │   │       ├── guidelines/
│   │   │       │   └── core.blade.php
│   │   │       └── skills/
│   │   │           └── inertia-svelte-development/
│   │   │               └── SKILL.blade.php
│   │   ├── src/
│   │   │   ├── components/
│   │   │   │   ├── App.svelte
│   │   │   │   ├── Deferred.svelte
│   │   │   │   ├── Form.svelte
│   │   │   │   ├── InfiniteScroll.svelte
│   │   │   │   ├── Link.svelte
│   │   │   │   ├── Render.svelte
│   │   │   │   ├── WhenVisible.svelte
│   │   │   │   └── formContext.ts
│   │   │   ├── createInertiaApp.ts
│   │   │   ├── index.ts
│   │   │   ├── link.ts
│   │   │   ├── page.ts
│   │   │   ├── server.ts
│   │   │   ├── types.ts
│   │   │   ├── useForm.ts
│   │   │   ├── usePoll.ts
│   │   │   ├── usePrefetch.ts
│   │   │   └── useRemember.ts
│   │   ├── svelte.config.js
│   │   ├── test-app/
│   │   │   ├── .gitignore
│   │   │   ├── Layouts/
│   │   │   │   ├── NestedLayout.svelte
│   │   │   │   ├── Prefetch.svelte
│   │   │   │   ├── SWR.svelte
│   │   │   │   ├── SiteLayout.svelte
│   │   │   │   ├── WithScrollRegion.svelte
│   │   │   │   └── WithoutScrollRegion.svelte
│   │   │   ├── Pages/
│   │   │   │   ├── Article.svelte
│   │   │   │   ├── ClientSideVisit/
│   │   │   │   │   ├── Page1.svelte
│   │   │   │   │   ├── Page2.svelte
│   │   │   │   │   ├── Props.svelte
│   │   │   │   │   └── Sequential.svelte
│   │   │   │   ├── ComplexMergeSelective.svelte
│   │   │   │   ├── CustomConfig.svelte
│   │   │   │   ├── DeepMergeProps.svelte
│   │   │   │   ├── DeferredProps/
│   │   │   │   │   ├── BackButton/
│   │   │   │   │   │   ├── PageA.svelte
│   │   │   │   │   │   └── PageB.svelte
│   │   │   │   │   ├── InstantReload.svelte
│   │   │   │   │   ├── ManyGroups.svelte
│   │   │   │   │   ├── Page1.svelte
│   │   │   │   │   ├── Page2.svelte
│   │   │   │   │   ├── Page3.svelte
│   │   │   │   │   ├── PartialReloads.svelte
│   │   │   │   │   ├── RapidNavigation.svelte
│   │   │   │   │   ├── ReloadResults.svelte
│   │   │   │   │   ├── ReloadWithoutOptionalChaining.svelte
│   │   │   │   │   ├── WithErrors.svelte
│   │   │   │   │   ├── WithQueryParams.svelte
│   │   │   │   │   └── WithReload.svelte
│   │   │   │   ├── Dump.svelte
│   │   │   │   ├── ErrorModal.svelte
│   │   │   │   ├── Events.svelte
│   │   │   │   ├── Flash/
│   │   │   │   │   ├── ClientSideVisits.svelte
│   │   │   │   │   ├── Events.svelte
│   │   │   │   │   ├── InitialFlash.svelte
│   │   │   │   │   ├── Partial.svelte
│   │   │   │   │   ├── RouterFlash.svelte
│   │   │   │   │   ├── WithDeferred.svelte
│   │   │   │   │   └── WithInfiniteScroll.svelte
│   │   │   │   ├── FormComponent/
│   │   │   │   │   ├── Context/
│   │   │   │   │   │   ├── ChildComponent.svelte
│   │   │   │   │   │   ├── DeeplyNestedComponent.svelte
│   │   │   │   │   │   ├── Default.svelte
│   │   │   │   │   │   ├── Methods.svelte
│   │   │   │   │   │   ├── MethodsTestComponent.svelte
│   │   │   │   │   │   ├── Multiple.svelte
│   │   │   │   │   │   ├── NestedComponent.svelte
│   │   │   │   │   │   └── OutsideFormComponent.svelte
│   │   │   │   │   ├── DataMethods.svelte
│   │   │   │   │   ├── DefaultValue.svelte
│   │   │   │   │   ├── DisableWhileProcessing.svelte
│   │   │   │   │   ├── DottedKeys.svelte
│   │   │   │   │   ├── Elements.svelte
│   │   │   │   │   ├── EmptyAction.svelte
│   │   │   │   │   ├── Errors.svelte
│   │   │   │   │   ├── Events.svelte
│   │   │   │   │   ├── FormTarget.svelte
│   │   │   │   │   ├── Headers.svelte
│   │   │   │   │   ├── InvalidateTags.svelte
│   │   │   │   │   ├── Methods.svelte
│   │   │   │   │   ├── MixedKeySerialization.svelte
│   │   │   │   │   ├── Options.svelte
│   │   │   │   │   ├── Precognition/
│   │   │   │   │   │   ├── BeforeValidation.svelte
│   │   │   │   │   │   ├── Callbacks.svelte
│   │   │   │   │   │   ├── Cancel.svelte
│   │   │   │   │   │   ├── Default.svelte
│   │   │   │   │   │   ├── DynamicArrayInputs.svelte
│   │   │   │   │   │   ├── ErrorSync.svelte
│   │   │   │   │   │   ├── Files.svelte
│   │   │   │   │   │   ├── Headers.svelte
│   │   │   │   │   │   ├── Methods.svelte
│   │   │   │   │   │   ├── Transform.svelte
│   │   │   │   │   │   ├── TransformKeys.svelte
│   │   │   │   │   │   ├── WithAllErrors.svelte
│   │   │   │   │   │   ├── WithAllErrorsConfig.svelte
│   │   │   │   │   │   └── WithoutAllErrors.svelte
│   │   │   │   │   ├── Progress.svelte
│   │   │   │   │   ├── Ref.svelte
│   │   │   │   │   ├── Reset.svelte
│   │   │   │   │   ├── ResetAttributes/
│   │   │   │   │   │   ├── ResetOnError.svelte
│   │   │   │   │   │   ├── ResetOnErrorFields.svelte
│   │   │   │   │   │   ├── ResetOnSuccess.svelte
│   │   │   │   │   │   └── ResetOnSuccessFields.svelte
│   │   │   │   │   ├── SetDefaultsOnSuccess.svelte
│   │   │   │   │   ├── SubmitButton.svelte
│   │   │   │   │   ├── SubmitComplete/
│   │   │   │   │   │   ├── Defaults.svelte
│   │   │   │   │   │   ├── Redirect.svelte
│   │   │   │   │   │   └── Reset.svelte
│   │   │   │   │   ├── Transform.svelte
│   │   │   │   │   ├── UppercaseMethod.svelte
│   │   │   │   │   ├── ViewTransition.svelte
│   │   │   │   │   └── Wayfinder.svelte
│   │   │   │   ├── FormHelper/
│   │   │   │   │   ├── Data.svelte
│   │   │   │   │   ├── Dirty.svelte
│   │   │   │   │   ├── EmptyForm.svelte
│   │   │   │   │   ├── Errors.svelte
│   │   │   │   │   ├── ErrorsClearOnResubmit.svelte
│   │   │   │   │   ├── Events.svelte
│   │   │   │   │   ├── Methods.svelte
│   │   │   │   │   ├── Nested.svelte
│   │   │   │   │   ├── Precognition/
│   │   │   │   │   │   ├── BeforeValidation.svelte
│   │   │   │   │   │   ├── Callbacks.svelte
│   │   │   │   │   │   ├── Cancel.svelte
│   │   │   │   │   │   ├── Compatibility.svelte
│   │   │   │   │   │   ├── Default.svelte
│   │   │   │   │   │   ├── DynamicArrayInputs.svelte
│   │   │   │   │   │   ├── ErrorSync.svelte
│   │   │   │   │   │   ├── Files.svelte
│   │   │   │   │   │   ├── Headers.svelte
│   │   │   │   │   │   ├── Instantiate.svelte
│   │   │   │   │   │   ├── Methods.svelte
│   │   │   │   │   │   ├── Transform.svelte
│   │   │   │   │   │   ├── TransformKeys.svelte
│   │   │   │   │   │   ├── WithAllErrors.svelte
│   │   │   │   │   │   ├── WithAllErrorsConfig.svelte
│   │   │   │   │   │   └── WithoutAllErrors.svelte
│   │   │   │   │   ├── RememberEdit.svelte
│   │   │   │   │   ├── RememberIndex.svelte
│   │   │   │   │   ├── ReservedKeys.svelte
│   │   │   │   │   ├── Transform.svelte
│   │   │   │   │   └── TypeScript/
│   │   │   │   │       ├── Any.svelte
│   │   │   │   │       ├── Child.svelte
│   │   │   │   │       ├── CircularReferences.svelte
│   │   │   │   │       ├── Data.svelte
│   │   │   │   │       ├── DynamicInputName.svelte
│   │   │   │   │       ├── Errors.svelte
│   │   │   │   │       ├── FormDataCallback.svelte
│   │   │   │   │       ├── Generic.svelte
│   │   │   │   │       ├── Nullable.svelte
│   │   │   │   │       ├── NullableNestedObject.svelte
│   │   │   │   │       ├── OptionalProps.svelte
│   │   │   │   │       ├── Parent.svelte
│   │   │   │   │       ├── Precognition.svelte
│   │   │   │   │       ├── ValidationKey.svelte
│   │   │   │   │       ├── WrapperChild.svelte
│   │   │   │   │       └── WrapperParent.svelte
│   │   │   │   ├── History/
│   │   │   │   │   ├── Page.svelte
│   │   │   │   │   └── Version.svelte
│   │   │   │   ├── HistoryQuota/
│   │   │   │   │   └── Page.svelte
│   │   │   │   ├── HistoryThrottle.svelte
│   │   │   │   ├── Home.svelte
│   │   │   │   ├── InfiniteScroll/
│   │   │   │   │   ├── CustomElement.svelte
│   │   │   │   │   ├── CustomTriggersRef.svelte
│   │   │   │   │   ├── CustomTriggersRefObject.svelte
│   │   │   │   │   ├── CustomTriggersSelector.svelte
│   │   │   │   │   ├── DataTable.svelte
│   │   │   │   │   ├── Deferred.svelte
│   │   │   │   │   ├── DualContainers.svelte
│   │   │   │   │   ├── DualSibling.svelte
│   │   │   │   │   ├── Empty.svelte
│   │   │   │   │   ├── Filtering.svelte
│   │   │   │   │   ├── FilteringManual.svelte
│   │   │   │   │   ├── FilteringReset.svelte
│   │   │   │   │   ├── Grid.svelte
│   │   │   │   │   ├── HorizontalScroll.svelte
│   │   │   │   │   ├── InfiniteScrollWithLink.svelte
│   │   │   │   │   ├── InvisibleFirstChild.svelte
│   │   │   │   │   ├── Links.svelte
│   │   │   │   │   ├── Manual.svelte
│   │   │   │   │   ├── ManualAfter.svelte
│   │   │   │   │   ├── OverflowX.svelte
│   │   │   │   │   ├── PreserveUrl.svelte
│   │   │   │   │   ├── ProgrammaticRef.svelte
│   │   │   │   │   ├── ReloadUnrelated.svelte
│   │   │   │   │   ├── RememberState.svelte
│   │   │   │   │   ├── Reverse.svelte
│   │   │   │   │   ├── ReverseShortContent.svelte
│   │   │   │   │   ├── ScrollContainer.svelte
│   │   │   │   │   ├── ShortContent.svelte
│   │   │   │   │   ├── Toggles.svelte
│   │   │   │   │   ├── TriggerBoth.svelte
│   │   │   │   │   ├── TriggerEndBuffer.svelte
│   │   │   │   │   ├── TriggerStartBuffer.svelte
│   │   │   │   │   ├── UpdateQueryString.svelte
│   │   │   │   │   └── UserCard.svelte
│   │   │   │   ├── Links/
│   │   │   │   │   ├── AsWarning.svelte
│   │   │   │   │   ├── AsWarningFalse.svelte
│   │   │   │   │   ├── AutomaticCancellation.svelte
│   │   │   │   │   ├── CancelSyncRequest.svelte
│   │   │   │   │   ├── Data/
│   │   │   │   │   │   ├── AutoConverted.svelte
│   │   │   │   │   │   ├── FormData.svelte
│   │   │   │   │   │   └── Object.svelte
│   │   │   │   │   ├── DataLoading.svelte
│   │   │   │   │   ├── Headers.svelte
│   │   │   │   │   ├── Location.svelte
│   │   │   │   │   ├── Method.svelte
│   │   │   │   │   ├── PartialReloads.svelte
│   │   │   │   │   ├── PathTraversal.svelte
│   │   │   │   │   ├── PreserveScroll.svelte
│   │   │   │   │   ├── PreserveScrollFalse.svelte
│   │   │   │   │   ├── PreserveState.svelte
│   │   │   │   │   ├── PreserveUrl.svelte
│   │   │   │   │   ├── PropUpdate.svelte
│   │   │   │   │   ├── Reactivity.svelte
│   │   │   │   │   ├── Replace.svelte
│   │   │   │   │   ├── ScrollRegionList.svelte
│   │   │   │   │   └── UrlFragments.svelte
│   │   │   │   ├── MatchPropsOnKey.svelte
│   │   │   │   ├── MergeNestedProps.svelte
│   │   │   │   ├── MergeProps.svelte
│   │   │   │   ├── NavigateNonInertia.svelte
│   │   │   │   ├── NetworkError.svelte
│   │   │   │   ├── OnceProps/
│   │   │   │   │   ├── ClientSideVisit.svelte
│   │   │   │   │   ├── CustomKeyPageA.svelte
│   │   │   │   │   ├── CustomKeyPageB.svelte
│   │   │   │   │   ├── DeferredPageA.svelte
│   │   │   │   │   ├── DeferredPageB.svelte
│   │   │   │   │   ├── DeferredPageC.svelte
│   │   │   │   │   ├── MergePageA.svelte
│   │   │   │   │   ├── MergePageB.svelte
│   │   │   │   │   ├── OptionalPageA.svelte
│   │   │   │   │   ├── OptionalPageB.svelte
│   │   │   │   │   ├── PageA.svelte
│   │   │   │   │   ├── PageB.svelte
│   │   │   │   │   ├── PageC.svelte
│   │   │   │   │   ├── PageD.svelte
│   │   │   │   │   ├── PageE.svelte
│   │   │   │   │   ├── PartialReloadA.svelte
│   │   │   │   │   ├── PartialReloadB.svelte
│   │   │   │   │   ├── SlowDeferredPageA.svelte
│   │   │   │   │   ├── SlowDeferredPageB.svelte
│   │   │   │   │   ├── TtlPageA.svelte
│   │   │   │   │   ├── TtlPageB.svelte
│   │   │   │   │   └── TtlPageC.svelte
│   │   │   │   ├── PersistentLayouts/
│   │   │   │   │   ├── RenderFunction/
│   │   │   │   │   │   ├── Nested/
│   │   │   │   │   │   │   ├── PageA.svelte
│   │   │   │   │   │   │   └── PageB.svelte
│   │   │   │   │   │   └── Simple/
│   │   │   │   │   │       ├── PageA.svelte
│   │   │   │   │   │       └── PageB.svelte
│   │   │   │   │   └── Shorthand/
│   │   │   │   │       ├── Nested/
│   │   │   │   │       │   ├── PageA.svelte
│   │   │   │   │       │   └── PageB.svelte
│   │   │   │   │       └── Simple/
│   │   │   │   │           ├── PageA.svelte
│   │   │   │   │           └── PageB.svelte
│   │   │   │   ├── Poll/
│   │   │   │   │   ├── Hook.svelte
│   │   │   │   │   ├── HookManual.svelte
│   │   │   │   │   ├── RouterManual.svelte
│   │   │   │   │   └── UnchangedData.svelte
│   │   │   │   ├── Prefetch/
│   │   │   │   │   ├── AfterError.svelte
│   │   │   │   │   ├── Form.svelte
│   │   │   │   │   ├── Page.svelte
│   │   │   │   │   ├── PreserveState.svelte
│   │   │   │   │   ├── SWR.svelte
│   │   │   │   │   ├── Tags.svelte
│   │   │   │   │   ├── TestPage.svelte
│   │   │   │   │   └── Wayfinder.svelte
│   │   │   │   ├── PreserveEqualProps.svelte
│   │   │   │   ├── ProgressComponent.svelte
│   │   │   │   ├── Reload/
│   │   │   │   │   ├── Concurrent.svelte
│   │   │   │   │   └── ConcurrentWithData.svelte
│   │   │   │   ├── Remember/
│   │   │   │   │   ├── Components/
│   │   │   │   │   │   ├── ComponentA.svelte
│   │   │   │   │   │   └── ComponentB.svelte
│   │   │   │   │   ├── Default.svelte
│   │   │   │   │   ├── FormHelper/
│   │   │   │   │   │   ├── Default.svelte
│   │   │   │   │   │   ├── Password.svelte
│   │   │   │   │   │   └── Remember.svelte
│   │   │   │   │   ├── MultipleComponents.svelte
│   │   │   │   │   ├── Object.svelte
│   │   │   │   │   └── Router.svelte
│   │   │   │   ├── SSR/
│   │   │   │   │   ├── Page1.svelte
│   │   │   │   │   ├── Page2.svelte
│   │   │   │   │   └── PageWithScriptElement.svelte
│   │   │   │   ├── ScrollAfterRender.svelte
│   │   │   │   ├── ScrollRegionPreserveUrl.svelte
│   │   │   │   ├── ScrollSmooth.svelte
│   │   │   │   ├── ScrollableParent.svelte
│   │   │   │   ├── Svelte/
│   │   │   │   │   └── PropsAndPageStore.svelte
│   │   │   │   ├── TypeScriptCreateInertiaApp.ts
│   │   │   │   ├── TypeScriptFlash.svelte
│   │   │   │   ├── TypeScriptProps.svelte
│   │   │   │   ├── ViewTransition/
│   │   │   │   │   ├── FormErrors.svelte
│   │   │   │   │   ├── PageA.svelte
│   │   │   │   │   └── PageB.svelte
│   │   │   │   ├── Visits/
│   │   │   │   │   ├── AfterError.svelte
│   │   │   │   │   ├── AutomaticCancellation.svelte
│   │   │   │   │   ├── Data/
│   │   │   │   │   │   ├── AutoConverted.svelte
│   │   │   │   │   │   ├── FormData.svelte
│   │   │   │   │   │   └── Object.svelte
│   │   │   │   │   ├── ErrorBags.svelte
│   │   │   │   │   ├── Headers.svelte
│   │   │   │   │   ├── Location.svelte
│   │   │   │   │   ├── Method.svelte
│   │   │   │   │   ├── PartialReloads.svelte
│   │   │   │   │   ├── PreserveScroll.svelte
│   │   │   │   │   ├── PreserveScrollFalse.svelte
│   │   │   │   │   ├── PreserveState.svelte
│   │   │   │   │   ├── ReloadOnMount.svelte
│   │   │   │   │   ├── Replace.svelte
│   │   │   │   │   ├── UrlFragments.svelte
│   │   │   │   │   └── Wayfinder.svelte
│   │   │   │   ├── WhenVisible.svelte
│   │   │   │   ├── WhenVisibleArrayReload.svelte
│   │   │   │   ├── WhenVisibleBackButton.svelte
│   │   │   │   ├── WhenVisibleFetching.svelte
│   │   │   │   ├── WhenVisibleMergeParams.svelte
│   │   │   │   ├── WhenVisibleParamsUpdate.svelte
│   │   │   │   └── WhenVisibleReload.svelte
│   │   │   ├── app.ts
│   │   │   ├── eslint.config.js
│   │   │   ├── index.html
│   │   │   ├── package.json
│   │   │   ├── ssr.ts
│   │   │   ├── svelte-html.d.ts
│   │   │   ├── svelte.config.js
│   │   │   ├── tsconfig.json
│   │   │   ├── types.d.ts
│   │   │   ├── vite-env.d.ts
│   │   │   └── vite.config.js
│   │   ├── tsconfig.json
│   │   ├── vite-with-deps.config.js
│   │   └── vite.config.js
│   └── vue3/
│       ├── .gitignore
│       ├── LICENSE
│       ├── build.js
│       ├── package.json
│       ├── readme.md
│       ├── resources/
│       │   └── boost/
│       │       ├── guidelines/
│       │       │   └── core.blade.php
│       │       └── skills/
│       │           └── inertia-vue-development/
│       │               └── SKILL.blade.php
│       ├── src/
│       │   ├── app.ts
│       │   ├── createInertiaApp.ts
│       │   ├── deferred.ts
│       │   ├── form.ts
│       │   ├── head.ts
│       │   ├── index.ts
│       │   ├── infiniteScroll.ts
│       │   ├── link.ts
│       │   ├── remember.ts
│       │   ├── server.ts
│       │   ├── types.ts
│       │   ├── useForm.ts
│       │   ├── usePoll.ts
│       │   ├── usePrefetch.ts
│       │   ├── useRemember.ts
│       │   └── whenVisible.ts
│       ├── test-app/
│       │   ├── .gitignore
│       │   ├── Layouts/
│       │   │   ├── NestedLayout.vue
│       │   │   ├── Prefetch.vue
│       │   │   ├── SWR.vue
│       │   │   ├── SiteLayout.vue
│       │   │   ├── WithScrollRegion.vue
│       │   │   └── WithoutScrollRegion.vue
│       │   ├── Pages/
│       │   │   ├── Article.vue
│       │   │   ├── ClientSideVisit/
│       │   │   │   ├── Page1.vue
│       │   │   │   ├── Page2.vue
│       │   │   │   ├── Props.vue
│       │   │   │   └── Sequential.vue
│       │   │   ├── ComplexMergeSelective.vue
│       │   │   ├── CustomConfig.vue
│       │   │   ├── DeepMergeProps.vue
│       │   │   ├── DeferredProps/
│       │   │   │   ├── BackButton/
│       │   │   │   │   ├── PageA.vue
│       │   │   │   │   └── PageB.vue
│       │   │   │   ├── InstantReload.vue
│       │   │   │   ├── ManyGroups.vue
│       │   │   │   ├── Page1.vue
│       │   │   │   ├── Page2.vue
│       │   │   │   ├── Page3.vue
│       │   │   │   ├── PartialReloads.vue
│       │   │   │   ├── RapidNavigation.vue
│       │   │   │   ├── ReloadWithoutOptionalChaining.vue
│       │   │   │   ├── WithErrors.vue
│       │   │   │   ├── WithQueryParams.vue
│       │   │   │   └── WithReload.vue
│       │   │   ├── Dump.vue
│       │   │   ├── ErrorModal.vue
│       │   │   ├── Events.vue
│       │   │   ├── Flash/
│       │   │   │   ├── ClientSideVisits.vue
│       │   │   │   ├── Events.vue
│       │   │   │   ├── InitialFlash.vue
│       │   │   │   ├── Partial.vue
│       │   │   │   ├── RouterFlash.vue
│       │   │   │   ├── WithDeferred.vue
│       │   │   │   └── WithInfiniteScroll.vue
│       │   │   ├── FormComponent/
│       │   │   │   ├── Context/
│       │   │   │   │   ├── ChildComponent.vue
│       │   │   │   │   ├── DeeplyNestedComponent.vue
│       │   │   │   │   ├── Default.vue
│       │   │   │   │   ├── Methods.vue
│       │   │   │   │   ├── MethodsTestComponent.vue
│       │   │   │   │   ├── Multiple.vue
│       │   │   │   │   ├── NestedComponent.vue
│       │   │   │   │   └── OutsideFormComponent.vue
│       │   │   │   ├── DataMethods.vue
│       │   │   │   ├── DefaultValue.vue
│       │   │   │   ├── DisableWhileProcessing.vue
│       │   │   │   ├── DottedKeys.vue
│       │   │   │   ├── Elements.vue
│       │   │   │   ├── EmptyAction.vue
│       │   │   │   ├── Errors.vue
│       │   │   │   ├── Events.vue
│       │   │   │   ├── FormTarget.vue
│       │   │   │   ├── Headers.vue
│       │   │   │   ├── InvalidateTags.vue
│       │   │   │   ├── Methods.vue
│       │   │   │   ├── MixedKeySerialization.vue
│       │   │   │   ├── Options.vue
│       │   │   │   ├── Precognition/
│       │   │   │   │   ├── BeforeValidation.vue
│       │   │   │   │   ├── Callbacks.vue
│       │   │   │   │   ├── Cancel.vue
│       │   │   │   │   ├── Default.vue
│       │   │   │   │   ├── DynamicArrayInputs.vue
│       │   │   │   │   ├── ErrorSync.vue
│       │   │   │   │   ├── Files.vue
│       │   │   │   │   ├── Headers.vue
│       │   │   │   │   ├── Methods.vue
│       │   │   │   │   ├── Transform.vue
│       │   │   │   │   ├── TransformKeys.vue
│       │   │   │   │   ├── WithAllErrors.vue
│       │   │   │   │   ├── WithAllErrorsConfig.vue
│       │   │   │   │   └── WithoutAllErrors.vue
│       │   │   │   ├── Progress.vue
│       │   │   │   ├── Ref.vue
│       │   │   │   ├── Reset.vue
│       │   │   │   ├── ResetAttributes/
│       │   │   │   │   ├── ResetOnError.vue
│       │   │   │   │   ├── ResetOnErrorFields.vue
│       │   │   │   │   ├── ResetOnSuccess.vue
│       │   │   │   │   └── ResetOnSuccessFields.vue
│       │   │   │   ├── SetDefaultsOnSuccess.vue
│       │   │   │   ├── SubmitButton.vue
│       │   │   │   ├── SubmitComplete/
│       │   │   │   │   ├── Defaults.vue
│       │   │   │   │   ├── Redirect.vue
│       │   │   │   │   └── Reset.vue
│       │   │   │   ├── Transform.vue
│       │   │   │   ├── UppercaseMethod.vue
│       │   │   │   ├── ViewTransition.vue
│       │   │   │   └── Wayfinder.vue
│       │   │   ├── FormHelper/
│       │   │   │   ├── Data.vue
│       │   │   │   ├── Dirty.vue
│       │   │   │   ├── EmptyForm.vue
│       │   │   │   ├── Errors.vue
│       │   │   │   ├── ErrorsClearOnResubmit.vue
│       │   │   │   ├── Events.vue
│       │   │   │   ├── Methods.vue
│       │   │   │   ├── Nested.vue
│       │   │   │   ├── NestedError.vue
│       │   │   │   ├── OptionsApi.vue
│       │   │   │   ├── Precognition/
│       │   │   │   │   ├── BeforeValidation.vue
│       │   │   │   │   ├── Callbacks.vue
│       │   │   │   │   ├── Cancel.vue
│       │   │   │   │   ├── Compatibility.vue
│       │   │   │   │   ├── Default.vue
│       │   │   │   │   ├── DynamicArrayInputs.vue
│       │   │   │   │   ├── ErrorSync.vue
│       │   │   │   │   ├── Files.vue
│       │   │   │   │   ├── Headers.vue
│       │   │   │   │   ├── Instantiate.vue
│       │   │   │   │   ├── Methods.vue
│       │   │   │   │   ├── Transform.vue
│       │   │   │   │   ├── TransformKeys.vue
│       │   │   │   │   ├── WithAllErrors.vue
│       │   │   │   │   ├── WithAllErrorsConfig.vue
│       │   │   │   │   └── WithoutAllErrors.vue
│       │   │   │   ├── RememberEdit.vue
│       │   │   │   ├── RememberIndex.vue
│       │   │   │   ├── ReservedKeys.vue
│       │   │   │   ├── Transform.vue
│       │   │   │   └── TypeScript/
│       │   │   │       ├── Any.vue
│       │   │   │       ├── Child.vue
│       │   │   │       ├── CircularReferences.vue
│       │   │   │       ├── Data.vue
│       │   │   │       ├── DynamicInputName.vue
│       │   │   │       ├── Errors.vue
│       │   │   │       ├── FormDataCallback.vue
│       │   │   │       ├── Generic.vue
│       │   │   │       ├── Nullable.vue
│       │   │   │       ├── NullableNestedObject.vue
│       │   │   │       ├── OptionalProps.vue
│       │   │   │       ├── Parent.vue
│       │   │   │       ├── Precognition.vue
│       │   │   │       ├── ValidationKey.vue
│       │   │   │       ├── WrapperChild.vue
│       │   │   │       └── WrapperParent.vue
│       │   │   ├── Head/
│       │   │   │   ├── Conditional.vue
│       │   │   │   ├── Dataset.vue
│       │   │   │   ├── Mixed.vue
│       │   │   │   ├── Reactive.vue
│       │   │   │   ├── WithTitle.vue
│       │   │   │   └── WithoutTitle.vue
│       │   │   ├── Head.vue
│       │   │   ├── History/
│       │   │   │   ├── Page.vue
│       │   │   │   └── Version.vue
│       │   │   ├── HistoryQuota/
│       │   │   │   └── Page.vue
│       │   │   ├── HistoryThrottle.vue
│       │   │   ├── Home.vue
│       │   │   ├── InfiniteScroll/
│       │   │   │   ├── CustomElement.vue
│       │   │   │   ├── CustomTriggersRef.vue
│       │   │   │   ├── CustomTriggersRefObject.vue
│       │   │   │   ├── CustomTriggersSelector.vue
│       │   │   │   ├── DataTable.vue
│       │   │   │   ├── Deferred.vue
│       │   │   │   ├── DualContainers.vue
│       │   │   │   ├── DualSibling.vue
│       │   │   │   ├── Empty.vue
│       │   │   │   ├── Filtering.vue
│       │   │   │   ├── FilteringManual.vue
│       │   │   │   ├── FilteringReset.vue
│       │   │   │   ├── Grid.vue
│       │   │   │   ├── HorizontalScroll.vue
│       │   │   │   ├── InfiniteScrollWithLink.vue
│       │   │   │   ├── InvisibleFirstChild.vue
│       │   │   │   ├── Links.vue
│       │   │   │   ├── Manual.vue
│       │   │   │   ├── ManualAfter.vue
│       │   │   │   ├── ManualReverse.vue
│       │   │   │   ├── ManualToggle.vue
│       │   │   │   ├── OverflowX.vue
│       │   │   │   ├── PreserveUrl.vue
│       │   │   │   ├── ProgrammaticRef.vue
│       │   │   │   ├── ReloadUnrelated.vue
│       │   │   │   ├── RememberState.vue
│       │   │   │   ├── Reverse.vue
│       │   │   │   ├── ReverseShortContent.vue
│       │   │   │   ├── ScrollContainer.vue
│       │   │   │   ├── ShortContent.vue
│       │   │   │   ├── Toggles.vue
│       │   │   │   ├── TriggerBoth.vue
│       │   │   │   ├── TriggerEndBuffer.vue
│       │   │   │   ├── TriggerStartBuffer.vue
│       │   │   │   ├── TriggerToggle.vue
│       │   │   │   ├── UpdateQueryString.vue
│       │   │   │   └── UserCard.vue
│       │   │   ├── Links/
│       │   │   │   ├── AsComponent.vue
│       │   │   │   ├── AsElement.vue
│       │   │   │   ├── AsWarning.vue
│       │   │   │   ├── AsWarningFalse.vue
│       │   │   │   ├── AutomaticCancellation.vue
│       │   │   │   ├── CancelSyncRequest.vue
│       │   │   │   ├── Data/
│       │   │   │   │   ├── AutoConverted.vue
│       │   │   │   │   ├── FormData.vue
│       │   │   │   │   └── Object.vue
│       │   │   │   ├── DataLoading.vue
│       │   │   │   ├── Headers.vue
│       │   │   │   ├── Location.vue
│       │   │   │   ├── Method.vue
│       │   │   │   ├── PartialReloads.vue
│       │   │   │   ├── PathTraversal.vue
│       │   │   │   ├── PreserveScroll.vue
│       │   │   │   ├── PreserveScrollFalse.vue
│       │   │   │   ├── PreserveState.vue
│       │   │   │   ├── PreserveUrl.vue
│       │   │   │   ├── PropUpdate.vue
│       │   │   │   ├── Reactivity.vue
│       │   │   │   ├── Replace.vue
│       │   │   │   ├── ScrollRegionList.vue
│       │   │   │   └── UrlFragments.vue
│       │   │   ├── MatchPropsOnKey.vue
│       │   │   ├── MergeNestedProps.vue
│       │   │   ├── MergeProps.vue
│       │   │   ├── NavigateNonInertia.vue
│       │   │   ├── NetworkError.vue
│       │   │   ├── OnceProps/
│       │   │   │   ├── ClientSideVisit.vue
│       │   │   │   ├── CustomKeyPageA.vue
│       │   │   │   ├── CustomKeyPageB.vue
│       │   │   │   ├── DeferredPageA.vue
│       │   │   │   ├── DeferredPageB.vue
│       │   │   │   ├── DeferredPageC.vue
│       │   │   │   ├── MergePageA.vue
│       │   │   │   ├── MergePageB.vue
│       │   │   │   ├── OptionalPageA.vue
│       │   │   │   ├── OptionalPageB.vue
│       │   │   │   ├── PageA.vue
│       │   │   │   ├── PageB.vue
│       │   │   │   ├── PageC.vue
│       │   │   │   ├── PageD.vue
│       │   │   │   ├── PageE.vue
│       │   │   │   ├── PartialReloadA.vue
│       │   │   │   ├── PartialReloadB.vue
│       │   │   │   ├── SlowDeferredPageA.vue
│       │   │   │   ├── SlowDeferredPageB.vue
│       │   │   │   ├── TtlPageA.vue
│       │   │   │   ├── TtlPageB.vue
│       │   │   │   └── TtlPageC.vue
│       │   │   ├── PersistentLayouts/
│       │   │   │   ├── RenderFunction/
│       │   │   │   │   ├── Nested/
│       │   │   │   │   │   ├── PageA.vue
│       │   │   │   │   │   └── PageB.vue
│       │   │   │   │   └── Simple/
│       │   │   │   │       ├── PageA.vue
│       │   │   │   │       └── PageB.vue
│       │   │   │   └── Shorthand/
│       │   │   │       ├── Nested/
│       │   │   │       │   ├── PageA.vue
│       │   │   │       │   └── PageB.vue
│       │   │   │       └── Simple/
│       │   │   │           ├── PageA.vue
│       │   │   │           └── PageB.vue
│       │   │   ├── Poll/
│       │   │   │   ├── Hook.vue
│       │   │   │   ├── HookManual.vue
│       │   │   │   ├── RouterManual.vue
│       │   │   │   └── UnchangedData.vue
│       │   │   ├── Prefetch/
│       │   │   │   ├── AfterError.vue
│       │   │   │   ├── Form.vue
│       │   │   │   ├── Page.vue
│       │   │   │   ├── PreserveState.vue
│       │   │   │   ├── SWR.vue
│       │   │   │   ├── Tags.vue
│       │   │   │   ├── TestPage.vue
│       │   │   │   └── Wayfinder.vue
│       │   │   ├── PreserveEqualProps.vue
│       │   │   ├── ProgressComponent.vue
│       │   │   ├── Reload/
│       │   │   │   ├── Concurrent.vue
│       │   │   │   └── ConcurrentWithData.vue
│       │   │   ├── Remember/
│       │   │   │   ├── Components/
│       │   │   │   │   ├── ComponentA.vue
│       │   │   │   │   └── ComponentB.vue
│       │   │   │   ├── Default.vue
│       │   │   │   ├── FormHelper/
│       │   │   │   │   ├── Default.vue
│       │   │   │   │   ├── Password.vue
│       │   │   │   │   └── Remember.vue
│       │   │   │   ├── MultipleComponents.vue
│       │   │   │   ├── Object.vue
│       │   │   │   └── Router.vue
│       │   │   ├── SSR/
│       │   │   │   ├── Page1.vue
│       │   │   │   ├── Page2.vue
│       │   │   │   └── PageWithScriptElement.vue
│       │   │   ├── ScrollAfterRender.vue
│       │   │   ├── ScrollRegionPreserveUrl.vue
│       │   │   ├── ScrollSmooth.vue
│       │   │   ├── ScrollableParent.vue
│       │   │   ├── TypeScriptCreateInertiaApp.ts
│       │   │   ├── TypeScriptFlash.vue
│       │   │   ├── TypeScriptProps.vue
│       │   │   ├── ViewTransition/
│       │   │   │   ├── FormErrors.vue
│       │   │   │   ├── PageA.vue
│       │   │   │   └── PageB.vue
│       │   │   ├── Visits/
│       │   │   │   ├── AfterError.vue
│       │   │   │   ├── AutomaticCancellation.vue
│       │   │   │   ├── Data/
│       │   │   │   │   ├── AutoConverted.vue
│       │   │   │   │   ├── FormData.vue
│       │   │   │   │   └── Object.vue
│       │   │   │   ├── ErrorBags.vue
│       │   │   │   ├── Headers.vue
│       │   │   │   ├── Location.vue
│       │   │   │   ├── Method.vue
│       │   │   │   ├── PartialReloads.vue
│       │   │   │   ├── PreserveScroll.vue
│       │   │   │   ├── PreserveScrollFalse.vue
│       │   │   │   ├── PreserveState.vue
│       │   │   │   ├── Proxy.vue
│       │   │   │   ├── ReloadOnMount.vue
│       │   │   │   ├── Replace.vue
│       │   │   │   ├── UrlFragments.vue
│       │   │   │   └── Wayfinder.vue
│       │   │   ├── WhenVisible.vue
│       │   │   ├── WhenVisibleArrayReload.vue
│       │   │   ├── WhenVisibleBackButton.vue
│       │   │   ├── WhenVisibleFetching.vue
│       │   │   ├── WhenVisibleMergeParams.vue
│       │   │   ├── WhenVisibleParamsUpdate.vue
│       │   │   └── WhenVisibleReload.vue
│       │   ├── app.ts
│       │   ├── eslint.config.js
│       │   ├── index.html
│       │   ├── package.json
│       │   ├── ssr.ts
│       │   ├── tsconfig.json
│       │   ├── types.d.ts
│       │   └── vite.config.ts
│       └── tsconfig.json
├── playgrounds/
│   ├── react/
│   │   ├── .gitattributes
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── app/
│   │   │   ├── Console/
│   │   │   │   └── Kernel.php
│   │   │   ├── Exceptions/
│   │   │   │   └── Handler.php
│   │   │   ├── Http/
│   │   │   │   ├── Controllers/
│   │   │   │   │   └── Controller.php
│   │   │   │   ├── Kernel.php
│   │   │   │   ├── Middleware/
│   │   │   │   │   ├── Authenticate.php
│   │   │   │   │   ├── EncryptCookies.php
│   │   │   │   │   ├── HandleInertiaRequests.php
│   │   │   │   │   ├── PreventRequestsDuringMaintenance.php
│   │   │   │   │   ├── RedirectIfAuthenticated.php
│   │   │   │   │   ├── TrimStrings.php
│   │   │   │   │   ├── TrustHosts.php
│   │   │   │   │   ├── TrustProxies.php
│   │   │   │   │   ├── ValidateSignature.php
│   │   │   │   │   └── VerifyCsrfToken.php
│   │   │   │   ├── Requests/
│   │   │   │   │   └── PrecognitionFormRequest.php
│   │   │   │   └── Resources/
│   │   │   │       └── UserResource.php
│   │   │   ├── Models/
│   │   │   │   ├── ChatMessage.php
│   │   │   │   └── User.php
│   │   │   └── Providers/
│   │   │       ├── AppServiceProvider.php
│   │   │       ├── AuthServiceProvider.php
│   │   │       ├── BroadcastServiceProvider.php
│   │   │       ├── EventServiceProvider.php
│   │   │       └── RouteServiceProvider.php
│   │   ├── artisan
│   │   ├── bootstrap/
│   │   │   ├── app.php
│   │   │   └── cache/
│   │   │       └── .gitignore
│   │   ├── composer.json
│   │   ├── config/
│   │   │   ├── app.php
│   │   │   ├── auth.php
│   │   │   ├── broadcasting.php
│   │   │   ├── cache.php
│   │   │   ├── cors.php
│   │   │   ├── database.php
│   │   │   ├── filesystems.php
│   │   │   ├── hashing.php
│   │   │   ├── inertia.php
│   │   │   ├── logging.php
│   │   │   ├── mail.php
│   │   │   ├── prism.php
│   │   │   ├── queue.php
│   │   │   ├── sanctum.php
│   │   │   ├── services.php
│   │   │   ├── session.php
│   │   │   └── view.php
│   │   ├── database/
│   │   │   ├── .gitignore
│   │   │   ├── factories/
│   │   │   │   ├── ChatMessageFactory.php
│   │   │   │   └── UserFactory.php
│   │   │   ├── migrations/
│   │   │   │   ├── 2014_10_12_000000_create_users_table.php
│   │   │   │   ├── 2014_10_12_100000_create_password_resets_table.php
│   │   │   │   ├── 2019_08_19_000000_create_failed_jobs_table.php
│   │   │   │   ├── 2019_12_14_000001_create_personal_access_tokens_table.php
│   │   │   │   └── 2025_08_29_115526_create_chat_messages_table.php
│   │   │   └── seeders/
│   │   │       ├── DatabaseSeeder.php
│   │   │       └── conversation.json
│   │   ├── init.sh
│   │   ├── lang/
│   │   │   └── en/
│   │   │       ├── auth.php
│   │   │       ├── pagination.php
│   │   │       ├── passwords.php
│   │   │       └── validation.php
│   │   ├── package.json
│   │   ├── phpunit.xml
│   │   ├── public/
│   │   │   ├── .htaccess
│   │   │   ├── index.php
│   │   │   └── robots.txt
│   │   ├── resources/
│   │   │   ├── css/
│   │   │   │   └── app.css
│   │   │   ├── js/
│   │   │   │   ├── Components/
│   │   │   │   │   ├── DeferredFood.tsx
│   │   │   │   │   ├── DeferredOrganizations.tsx
│   │   │   │   │   ├── DeferredUsers.tsx
│   │   │   │   │   ├── Image.tsx
│   │   │   │   │   ├── Layout.tsx
│   │   │   │   │   ├── Message.tsx
│   │   │   │   │   ├── PaperAirplaneIcon.tsx
│   │   │   │   │   ├── Spinner.tsx
│   │   │   │   │   ├── StreamingIndicator.tsx
│   │   │   │   │   ├── TestGrid.tsx
│   │   │   │   │   ├── TestGridItem.tsx
│   │   │   │   │   └── Textarea.tsx
│   │   │   │   ├── Pages/
│   │   │   │   │   ├── Article.tsx
│   │   │   │   │   ├── Async.tsx
│   │   │   │   │   ├── Chat.tsx
│   │   │   │   │   ├── DataTable.tsx
│   │   │   │   │   ├── Defer.tsx
│   │   │   │   │   ├── Flash.tsx
│   │   │   │   │   ├── Form.tsx
│   │   │   │   │   ├── FormComponent.tsx
│   │   │   │   │   ├── FormComponentPrecognition.tsx
│   │   │   │   │   ├── Home.tsx
│   │   │   │   │   ├── Login.tsx
│   │   │   │   │   ├── Once/
│   │   │   │   │   │   ├── First.tsx
│   │   │   │   │   │   ├── Fourth.tsx
│   │   │   │   │   │   ├── Layout.tsx
│   │   │   │   │   │   ├── Second.tsx
│   │   │   │   │   │   └── Third.tsx
│   │   │   │   │   ├── PhotoGrid.tsx
│   │   │   │   │   ├── PhotoHorizontal.tsx
│   │   │   │   │   ├── Poll.tsx
│   │   │   │   │   ├── User.tsx
│   │   │   │   │   └── Users.tsx
│   │   │   │   ├── app.tsx
│   │   │   │   ├── ssr.tsx
│   │   │   │   ├── types/
│   │   │   │   │   └── globals.d.ts
│   │   │   │   └── vite.d.ts
│   │   │   └── views/
│   │   │       └── app.blade.php
│   │   ├── routes/
│   │   │   ├── api.php
│   │   │   ├── channels.php
│   │   │   ├── console.php
│   │   │   └── web.php
│   │   ├── storage/
│   │   │   ├── app/
│   │   │   │   └── .gitignore
│   │   │   ├── framework/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── cache/
│   │   │   │   │   └── .gitignore
│   │   │   │   ├── sessions/
│   │   │   │   │   └── .gitignore
│   │   │   │   ├── testing/
│   │   │   │   │   └── .gitignore
│   │   │   │   └── views/
│   │   │   │       └── .gitignore
│   │   │   └── logs/
│   │   │       └── .gitignore
│   │   ├── tests/
│   │   │   ├── CreatesApplication.php
│   │   │   ├── Feature/
│   │   │   │   └── ExampleTest.php
│   │   │   ├── TestCase.php
│   │   │   └── Unit/
│   │   │       └── ExampleTest.php
│   │   ├── tsconfig.json
│   │   └── vite.config.ts
│   ├── svelte4/
│   │   ├── .gitattributes
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── app/
│   │   │   ├── Console/
│   │   │   │   └── Kernel.php
│   │   │   ├── Exceptions/
│   │   │   │   └── Handler.php
│   │   │   ├── Http/
│   │   │   │   ├── Controllers/
│   │   │   │   │   └── Controller.php
│   │   │   │   ├── Kernel.php
│   │   │   │   ├── Middleware/
│   │   │   │   │   ├── Authenticate.php
│   │   │   │   │   ├── EncryptCookies.php
│   │   │   │   │   ├── HandleInertiaRequests.php
│   │   │   │   │   ├── PreventRequestsDuringMaintenance.php
│   │   │   │   │   ├── RedirectIfAuthenticated.php
│   │   │   │   │   ├── TrimStrings.php
│   │   │   │   │   ├── TrustHosts.php
│   │   │   │   │   ├── TrustProxies.php
│   │   │   │   │   ├── ValidateSignature.php
│   │   │   │   │   └── VerifyCsrfToken.php
│   │   │   │   └── Requests/
│   │   │   │       └── PrecognitionFormRequest.php
│   │   │   ├── Models/
│   │   │   │   └── User.php
│   │   │   └── Providers/
│   │   │       ├── AppServiceProvider.php
│   │   │       ├── AuthServiceProvider.php
│   │   │       ├── BroadcastServiceProvider.php
│   │   │       ├── EventServiceProvider.php
│   │   │       └── RouteServiceProvider.php
│   │   ├── artisan
│   │   ├── bootstrap/
│   │   │   ├── app.php
│   │   │   └── cache/
│   │   │       └── .gitignore
│   │   ├── composer.json
│   │   ├── config/
│   │   │   ├── app.php
│   │   │   ├── auth.php
│   │   │   ├── broadcasting.php
│   │   │   ├── cache.php
│   │   │   ├── cors.php
│   │   │   ├── database.php
│   │   │   ├── filesystems.php
│   │   │   ├── hashing.php
│   │   │   ├── inertia.php
│   │   │   ├── logging.php
│   │   │   ├── mail.php
│   │   │   ├── queue.php
│   │   │   ├── sanctum.php
│   │   │   ├── services.php
│   │   │   ├── session.php
│   │   │   └── view.php
│   │   ├── database/
│   │   │   ├── .gitignore
│   │   │   ├── factories/
│   │   │   │   └── UserFactory.php
│   │   │   ├── migrations/
│   │   │   │   ├── 2014_10_12_000000_create_users_table.php
│   │   │   │   ├── 2014_10_12_100000_create_password_resets_table.php
│   │   │   │   ├── 2019_08_19_000000_create_failed_jobs_table.php
│   │   │   │   └── 2019_12_14_000001_create_personal_access_tokens_table.php
│   │   │   └── seeders/
│   │   │       └── DatabaseSeeder.php
│   │   ├── init.sh
│   │   ├── lang/
│   │   │   └── en/
│   │   │       ├── auth.php
│   │   │       ├── pagination.php
│   │   │       ├── passwords.php
│   │   │       └── validation.php
│   │   ├── package.json
│   │   ├── phpunit.xml
│   │   ├── public/
│   │   │   ├── .htaccess
│   │   │   ├── index.php
│   │   │   └── robots.txt
│   │   ├── resources/
│   │   │   ├── css/
│   │   │   │   └── app.css
│   │   │   ├── js/
│   │   │   │   ├── Components/
│   │   │   │   │   ├── Image.svelte
│   │   │   │   │   ├── Layout.svelte
│   │   │   │   │   ├── Spinner.svelte
│   │   │   │   │   ├── TestGrid.svelte
│   │   │   │   │   └── TestGridItem.svelte
│   │   │   │   ├── Pages/
│   │   │   │   │   ├── Article.svelte
│   │   │   │   │   ├── Async.svelte
│   │   │   │   │   ├── DataTable.svelte
│   │   │   │   │   ├── Defer.svelte
│   │   │   │   │   ├── Flash.svelte
│   │   │   │   │   ├── Form.svelte
│   │   │   │   │   ├── FormComponent.svelte
│   │   │   │   │   ├── FormComponentPrecognition.svelte
│   │   │   │   │   ├── Home.svelte
│   │   │   │   │   ├── InfiniteScroll.svelte
│   │   │   │   │   ├── Login.svelte
│   │   │   │   │   ├── Once/
│   │   │   │   │   │   ├── First.svelte
│   │   │   │   │   │   ├── Fourth.svelte
│   │   │   │   │   │   ├── Layout.svelte
│   │   │   │   │   │   ├── Second.svelte
│   │   │   │   │   │   └── Third.svelte
│   │   │   │   │   ├── PhotoGrid.svelte
│   │   │   │   │   ├── PhotoHorizontal.svelte
│   │   │   │   │   ├── Poll.svelte
│   │   │   │   │   ├── User.svelte
│   │   │   │   │   └── Users.svelte
│   │   │   │   ├── app.ts
│   │   │   │   ├── ssr.ts
│   │   │   │   ├── types/
│   │   │   │   │   └── globals.d.ts
│   │   │   │   └── vite-env.d.ts
│   │   │   └── views/
│   │   │       └── app.blade.php
│   │   ├── routes/
│   │   │   ├── api.php
│   │   │   ├── channels.php
│   │   │   ├── console.php
│   │   │   └── web.php
│   │   ├── storage/
│   │   │   ├── app/
│   │   │   │   └── .gitignore
│   │   │   ├── framework/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── cache/
│   │   │   │   │   └── .gitignore
│   │   │   │   ├── sessions/
│   │   │   │   │   └── .gitignore
│   │   │   │   ├── testing/
│   │   │   │   │   └── .gitignore
│   │   │   │   └── views/
│   │   │   │       └── .gitignore
│   │   │   └── logs/
│   │   │       └── .gitignore
│   │   ├── svelte.config.js
│   │   ├── tests/
│   │   │   ├── CreatesApplication.php
│   │   │   ├── Feature/
│   │   │   │   └── ExampleTest.php
│   │   │   ├── TestCase.php
│   │   │   └── Unit/
│   │   │       └── ExampleTest.php
│   │   ├── tsconfig.json
│   │   └── vite.config.js
│   ├── svelte5/
│   │   ├── .gitattributes
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── app/
│   │   │   ├── Console/
│   │   │   │   └── Kernel.php
│   │   │   ├── Exceptions/
│   │   │   │   └── Handler.php
│   │   │   ├── Http/
│   │   │   │   ├── Controllers/
│   │   │   │   │   └── Controller.php
│   │   │   │   ├── Kernel.php
│   │   │   │   ├── Middleware/
│   │   │   │   │   ├── Authenticate.php
│   │   │   │   │   ├── EncryptCookies.php
│   │   │   │   │   ├── HandleInertiaRequests.php
│   │   │   │   │   ├── PreventRequestsDuringMaintenance.php
│   │   │   │   │   ├── RedirectIfAuthenticated.php
│   │   │   │   │   ├── TrimStrings.php
│   │   │   │   │   ├── TrustHosts.php
│   │   │   │   │   ├── TrustProxies.php
│   │   │   │   │   ├── ValidateSignature.php
│   │   │   │   │   └── VerifyCsrfToken.php
│   │   │   │   └── Requests/
│   │   │   │       └── PrecognitionFormRequest.php
│   │   │   ├── Models/
│   │   │   │   └── User.php
│   │   │   └── Providers/
│   │   │       ├── AppServiceProvider.php
│   │   │       ├── AuthServiceProvider.php
│   │   │       ├── BroadcastServiceProvider.php
│   │   │       ├── EventServiceProvider.php
│   │   │       └── RouteServiceProvider.php
│   │   ├── artisan
│   │   ├── bootstrap/
│   │   │   ├── app.php
│   │   │   └── cache/
│   │   │       └── .gitignore
│   │   ├── composer.json
│   │   ├── config/
│   │   │   ├── app.php
│   │   │   ├── auth.php
│   │   │   ├── broadcasting.php
│   │   │   ├── cache.php
│   │   │   ├── cors.php
│   │   │   ├── database.php
│   │   │   ├── filesystems.php
│   │   │   ├── hashing.php
│   │   │   ├── inertia.php
│   │   │   ├── logging.php
│   │   │   ├── mail.php
│   │   │   ├── queue.php
│   │   │   ├── sanctum.php
│   │   │   ├── services.php
│   │   │   ├── session.php
│   │   │   └── view.php
│   │   ├── database/
│   │   │   ├── .gitignore
│   │   │   ├── factories/
│   │   │   │   └── UserFactory.php
│   │   │   ├── migrations/
│   │   │   │   ├── 2014_10_12_000000_create_users_table.php
│   │   │   │   ├── 2014_10_12_100000_create_password_resets_table.php
│   │   │   │   ├── 2019_08_19_000000_create_failed_jobs_table.php
│   │   │   │   └── 2019_12_14_000001_create_personal_access_tokens_table.php
│   │   │   └── seeders/
│   │   │       └── DatabaseSeeder.php
│   │   ├── init.sh
│   │   ├── lang/
│   │   │   └── en/
│   │   │       ├── auth.php
│   │   │       ├── pagination.php
│   │   │       ├── passwords.php
│   │   │       └── validation.php
│   │   ├── package.json
│   │   ├── phpunit.xml
│   │   ├── public/
│   │   │   ├── .htaccess
│   │   │   ├── index.php
│   │   │   └── robots.txt
│   │   ├── resources/
│   │   │   ├── css/
│   │   │   │   └── app.css
│   │   │   ├── js/
│   │   │   │   ├── Components/
│   │   │   │   │   ├── Image.svelte
│   │   │   │   │   ├── Layout.svelte
│   │   │   │   │   ├── Spinner.svelte
│   │   │   │   │   ├── TestGrid.svelte
│   │   │   │   │   └── TestGridItem.svelte
│   │   │   │   ├── Pages/
│   │   │   │   │   ├── Article.svelte
│   │   │   │   │   ├── Async.svelte
│   │   │   │   │   ├── DataTable.svelte
│   │   │   │   │   ├── Flash.svelte
│   │   │   │   │   ├── Form.svelte
│   │   │   │   │   ├── FormComponent.svelte
│   │   │   │   │   ├── FormComponentPrecognition.svelte
│   │   │   │   │   ├── Home.svelte
│   │   │   │   │   ├── Login.svelte
│   │   │   │   │   ├── Once/
│   │   │   │   │   │   ├── First.svelte
│   │   │   │   │   │   ├── Fourth.svelte
│   │   │   │   │   │   ├── Layout.svelte
│   │   │   │   │   │   ├── Second.svelte
│   │   │   │   │   │   └── Third.svelte
│   │   │   │   │   ├── PhotoGrid.svelte
│   │   │   │   │   ├── PhotoHorizontal.svelte
│   │   │   │   │   ├── Poll.svelte
│   │   │   │   │   ├── User.svelte
│   │   │   │   │   └── Users.svelte
│   │   │   │   ├── app.ts
│   │   │   │   ├── ssr.ts
│   │   │   │   ├── types/
│   │   │   │   │   └── globals.d.ts
│   │   │   │   └── vite-env.d.ts
│   │   │   └── views/
│   │   │       └── app.blade.php
│   │   ├── routes/
│   │   │   ├── api.php
│   │   │   ├── channels.php
│   │   │   ├── console.php
│   │   │   └── web.php
│   │   ├── storage/
│   │   │   ├── app/
│   │   │   │   └── .gitignore
│   │   │   ├── framework/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── cache/
│   │   │   │   │   └── .gitignore
│   │   │   │   ├── sessions/
│   │   │   │   │   └── .gitignore
│   │   │   │   ├── testing/
│   │   │   │   │   └── .gitignore
│   │   │   │   └── views/
│   │   │   │       └── .gitignore
│   │   │   └── logs/
│   │   │       └── .gitignore
│   │   ├── tests/
│   │   │   ├── CreatesApplication.php
│   │   │   ├── Feature/
│   │   │   │   └── ExampleTest.php
│   │   │   ├── TestCase.php
│   │   │   └── Unit/
│   │   │       └── ExampleTest.php
│   │   ├── tsconfig.json
│   │   └── vite.config.js
│   └── vue3/
│       ├── .gitattributes
│       ├── .gitignore
│       ├── README.md
│       ├── app/
│       │   ├── Console/
│       │   │   └── Kernel.php
│       │   ├── Exceptions/
│       │   │   └── Handler.php
│       │   ├── Http/
│       │   │   ├── Controllers/
│       │   │   │   └── Controller.php
│       │   │   ├── Kernel.php
│       │   │   ├── Middleware/
│       │   │   │   ├── Authenticate.php
│       │   │   │   ├── EncryptCookies.php
│       │   │   │   ├── HandleInertiaRequests.php
│       │   │   │   ├── PreventRequestsDuringMaintenance.php
│       │   │   │   ├── RedirectIfAuthenticated.php
│       │   │   │   ├── TrimStrings.php
│       │   │   │   ├── TrustHosts.php
│       │   │   │   ├── TrustProxies.php
│       │   │   │   ├── ValidateSignature.php
│       │   │   │   └── VerifyCsrfToken.php
│       │   │   ├── Requests/
│       │   │   │   └── PrecognitionFormRequest.php
│       │   │   └── Resources/
│       │   │       └── UserResource.php
│       │   ├── Models/
│       │   │   ├── ChatMessage.php
│       │   │   └── User.php
│       │   └── Providers/
│       │       ├── AppServiceProvider.php
│       │       ├── AuthServiceProvider.php
│       │       ├── BroadcastServiceProvider.php
│       │       ├── EventServiceProvider.php
│       │       └── RouteServiceProvider.php
│       ├── artisan
│       ├── bootstrap/
│       │   ├── app.php
│       │   └── cache/
│       │       └── .gitignore
│       ├── composer.json
│       ├── config/
│       │   ├── app.php
│       │   ├── auth.php
│       │   ├── broadcasting.php
│       │   ├── cache.php
│       │   ├── cors.php
│       │   ├── database.php
│       │   ├── filesystems.php
│       │   ├── hashing.php
│       │   ├── inertia.php
│       │   ├── logging.php
│       │   ├── mail.php
│       │   ├── prism.php
│       │   ├── queue.php
│       │   ├── sanctum.php
│       │   ├── services.php
│       │   ├── session.php
│       │   └── view.php
│       ├── database/
│       │   ├── .gitignore
│       │   ├── factories/
│       │   │   ├── ChatMessageFactory.php
│       │   │   └── UserFactory.php
│       │   ├── migrations/
│       │   │   ├── 2014_10_12_000000_create_users_table.php
│       │   │   ├── 2014_10_12_100000_create_password_resets_table.php
│       │   │   ├── 2019_08_19_000000_create_failed_jobs_table.php
│       │   │   ├── 2019_12_14_000001_create_personal_access_tokens_table.php
│       │   │   └── 2025_08_29_115526_create_chat_messages_table.php
│       │   └── seeders/
│       │       ├── DatabaseSeeder.php
│       │       └── conversation.json
│       ├── init.sh
│       ├── lang/
│       │   └── en/
│       │       ├── auth.php
│       │       ├── pagination.php
│       │       ├── passwords.php
│       │       └── validation.php
│       ├── package.json
│       ├── phpunit.xml
│       ├── public/
│       │   ├── .htaccess
│       │   ├── index.php
│       │   └── robots.txt
│       ├── resources/
│       │   ├── css/
│       │   │   └── app.css
│       │   ├── js/
│       │   │   ├── Components/
│       │   │   │   ├── Image.vue
│       │   │   │   ├── Layout.vue
│       │   │   │   ├── Message.vue
│       │   │   │   ├── PaperAirplaneIcon.vue
│       │   │   │   ├── PhotoIcon.vue
│       │   │   │   ├── Spinner.vue
│       │   │   │   ├── StreamingIndicator.vue
│       │   │   │   ├── TestGrid.vue
│       │   │   │   ├── TestGridItem.vue
│       │   │   │   └── Textarea.vue
│       │   │   ├── Pages/
│       │   │   │   ├── Article.vue
│       │   │   │   ├── Async.vue
│       │   │   │   ├── Chat.vue
│       │   │   │   ├── DataTable.vue
│       │   │   │   ├── Defer.vue
│       │   │   │   ├── Flash.vue
│       │   │   │   ├── Form.vue
│       │   │   │   ├── FormComponent.vue
│       │   │   │   ├── FormComponentPrecognition.vue
│       │   │   │   ├── Home.vue
│       │   │   │   ├── InfiniteScroll.vue
│       │   │   │   ├── Login.vue
│       │   │   │   ├── Once/
│       │   │   │   │   ├── First.vue
│       │   │   │   │   ├── Fourth.vue
│       │   │   │   │   ├── Layout.vue
│       │   │   │   │   ├── Second.vue
│       │   │   │   │   └── Third.vue
│       │   │   │   ├── PhotoGrid.vue
│       │   │   │   ├── PhotoHorizontal.vue
│       │   │   │   ├── Poll.vue
│       │   │   │   ├── User.vue
│       │   │   │   └── Users.vue
│       │   │   ├── app.ts
│       │   │   ├── ssr.ts
│       │   │   ├── types/
│       │   │   │   └── globals.d.ts
│       │   │   └── vite-env.d.ts
│       │   └── views/
│       │       └── app.blade.php
│       ├── routes/
│       │   ├── api.php
│       │   ├── channels.php
│       │   ├── console.php
│       │   └── web.php
│       ├── storage/
│       │   ├── app/
│       │   │   └── .gitignore
│       │   ├── framework/
│       │   │   ├── .gitignore
│       │   │   ├── cache/
│       │   │   │   └── .gitignore
│       │   │   ├── sessions/
│       │   │   │   └── .gitignore
│       │   │   ├── testing/
│       │   │   │   └── .gitignore
│       │   │   └── views/
│       │   │       └── .gitignore
│       │   └── logs/
│       │       └── .gitignore
│       ├── tests/
│       │   ├── CreatesApplication.php
│       │   ├── Feature/
│       │   │   └── ExampleTest.php
│       │   ├── TestCase.php
│       │   └── Unit/
│       │       └── ExampleTest.php
│       ├── tsconfig.json
│       └── vite.config.ts
├── playwright.config.ts
├── playwright.js
├── pnpm-workspace.yaml
├── prettier.config.js
├── release.sh
└── tests/
    ├── app/
    │   ├── eloquent.js
    │   ├── helpers.js
    │   ├── package.json
    │   ├── server-status.js
    │   ├── server.js
    │   └── ssr.js
    ├── client-side-visits-props.spec.ts
    ├── client-side-visits-sequential.spec.ts
    ├── client-side-visits.spec.ts
    ├── config.spec.ts
    ├── core/
    │   ├── config.test.ts
    │   ├── formObject.test.ts
    │   ├── objectUtils.test.ts
    │   └── url.test.ts
    ├── deep-merge-props.spec.ts
    ├── deferred-props-cancellation.spec.ts
    ├── deferred-props.spec.ts
    ├── domUtils.spec.ts
    ├── error-modal.spec.ts
    ├── events.spec.ts
    ├── flash.spec.ts
    ├── form-component-context.spec.ts
    ├── form-component.spec.ts
    ├── form-helper.spec.ts
    ├── head.spec.ts
    ├── history-quota.spec.ts
    ├── history-throttle.spec.ts
    ├── history.spec.ts
    ├── inertia.spec.ts
    ├── infinite-scroll.spec.ts
    ├── initial-visit.spec.ts
    ├── links.spec.ts
    ├── manual-visits.spec.ts
    ├── match-props-on-key.spec.ts
    ├── merge-props.spec.ts
    ├── network-error.spec.ts
    ├── once-props.spec.ts
    ├── pages.spec.ts
    ├── plugin.spec.ts
    ├── poll.spec.ts
    ├── precognition.spec.ts
    ├── prefetch.spec.ts
    ├── progress-component.spec.ts
    ├── remember.spec.ts
    ├── scroll-smooth.spec.ts
    ├── ssr.spec.ts
    ├── support.ts
    ├── svelte.spec.ts
    ├── view-transitions.spec.ts
    └── when-visible.spec.ts

================================================
FILE CONTENTS
================================================

================================================
FILE: .editorconfig
================================================
root = true

[*]
charset = utf-8
end_of_line = lf
indent_size = 2
indent_style = space
insert_final_newline = true
trim_trailing_whitespace = true

[*.{php,xml,htaccess}]
indent_size = 4

[*.blade.php]
indent_size = 2


================================================
FILE: .gitattributes
================================================
# exclude playgrounds/ since otherwise the project gets classified as mainly php based.
# https://github.com/github-linguist/linguist/blob/master/docs/overrides.md#summary
playgrounds/** linguist-vendored

* text=auto


================================================
FILE: .github/CODE_OF_CONDUCT.md
================================================
# Code of Conduct

The Laravel Code of Conduct can be found in the [Laravel documentation](https://laravel.com/docs/contributions#code-of-conduct).


================================================
FILE: .github/ISSUE_TEMPLATE/0-bug-report.yml
================================================
name: Bug Report
description: 'Submit an issue.'
body:
  - type: markdown
    attributes:
      value: |
        Please read [our full contribution guide](https://laravel.com/docs/contributions#bug-reports) before submitting bug reports.

        Before submitting, please confirm:
        - You have **upgraded to the latest version** of both the JS package (`@inertiajs/{adapter}`) and the server-side adapter (`inertiajs/inertia-laravel`) and confirmed the issue still exists
        - Only Inertia **2.x** and **3.x (beta)** are supported. Issues for 0.x or 1.x will be closed.
  - type: dropdown
    attributes:
      label: Inertia version
      description: Which major version of Inertia are you using?
      options:
        - 2.x (stable)
        - 3.x (beta)
    validations:
      required: true
  - type: checkboxes
    attributes:
      label: Inertia adapter(s) affected
      description: Select all frontend adapters that are impacted by this issue.
      options:
        - label: React
        - label: Vue 3
        - label: Svelte
        - label: Not Applicable
  - type: input
    attributes:
      label: 'JS package version'
      description: Provide the exact version of `@inertiajs/{adapter}` you are using (e.g. 2.0.3 or 3.0.0-beta.2).
      placeholder: 2.0.3
    validations:
      required: true
  - type: textarea
    attributes:
      label: Backend stack (optional)
      description: If this bug depends on backend integration, provide details such as Laravel version, PHP version, or other relevant environment info.
      placeholder: |
        Laravel 12.x
        PHP 8.4
    validations:
      required: false
  - type: textarea
    attributes:
      label: Describe the problem
      description: Explain the behavior you're seeing that you think is a bug, and describe how you expect it to behave instead.
    validations:
      required: true
  - type: textarea
    attributes:
      label: Steps to reproduce
      description: Provide clear steps to reproduce the issue. Include a minimal code example that clearly shows the problem.
    validations:
      required: true


================================================
FILE: .github/ISSUE_TEMPLATE/1-bug-report-react.yml
================================================
name: Bug Report - React
description: 'Submit a React related issue.'
labels: [react]
body:
  - type: markdown
    attributes:
      value: |
        Please read [our full contribution guide](https://laravel.com/docs/contributions#bug-reports) before submitting bug reports.

        Before submitting, please confirm:
        - You have **upgraded to the latest version** of both `@inertiajs/react` and `inertiajs/inertia-laravel` and confirmed the issue still exists
        - Only Inertia **2.x** and **3.x (beta)** are supported. Issues for 0.x or 1.x will be closed.
  - type: dropdown
    attributes:
      label: Inertia version
      description: Which major version of Inertia are you using?
      options:
        - 2.x (stable)
        - 3.x (beta)
    validations:
      required: true
  - type: input
    attributes:
      label: '@inertiajs/react Version'
      description: Provide the exact version of `@inertiajs/react` you are using (e.g. 2.0.3 or 3.0.0-beta.2).
      placeholder: 2.0.3
    validations:
      required: true
  - type: textarea
    attributes:
      label: Backend stack (optional)
      description: If this bug depends on backend integration, provide details such as Laravel version, PHP version, or other relevant environment info.
      placeholder: |
        Laravel 12.x
        PHP 8.4
    validations:
      required: false
  - type: textarea
    attributes:
      label: Describe the problem
      description: Explain the behavior you're seeing that you think is a bug, and describe how you expect it to behave instead.
    validations:
      required: true
  - type: textarea
    attributes:
      label: Steps to reproduce
      description: Provide clear steps to reproduce the issue. Include a minimal code example that clearly shows the problem.
    validations:
      required: true


================================================
FILE: .github/ISSUE_TEMPLATE/2-bug-report-vue.yml
================================================
name: Bug Report - Vue 3
description: 'Submit a Vue 3 related issue.'
labels: ['vue 3']
body:
  - type: markdown
    attributes:
      value: |
        Please read [our full contribution guide](https://laravel.com/docs/contributions#bug-reports) before submitting bug reports.

        Before submitting, please confirm:
        - You have **upgraded to the latest version** of both `@inertiajs/vue3` and `inertiajs/inertia-laravel` and confirmed the issue still exists
        - Only Inertia **2.x** and **3.x (beta)** are supported. Issues for 0.x or 1.x will be closed.
  - type: dropdown
    attributes:
      label: Inertia version
      description: Which major version of Inertia are you using?
      options:
        - 2.x (stable)
        - 3.x (beta)
    validations:
      required: true
  - type: input
    attributes:
      label: '@inertiajs/vue3 Version'
      description: Provide the exact version of `@inertiajs/vue3` you are using (e.g. 2.0.3 or 3.0.0-beta.2).
      placeholder: 2.0.3
    validations:
      required: true
  - type: textarea
    attributes:
      label: Backend stack (optional)
      description: If this bug depends on backend integration, provide details such as Laravel version, PHP version, or other relevant environment info.
      placeholder: |
        Laravel 12.x
        PHP 8.4
    validations:
      required: false
  - type: textarea
    attributes:
      label: Describe the problem
      description: Explain the behavior you're seeing that you think is a bug, and describe how you expect it to behave instead.
    validations:
      required: true
  - type: textarea
    attributes:
      label: Steps to reproduce
      description: Provide clear steps to reproduce the issue. Include a minimal code example that clearly shows the problem.
    validations:
      required: true


================================================
FILE: .github/ISSUE_TEMPLATE/3-bug-report-svelte.yml
================================================
name: Bug Report - Svelte
description: 'Submit a Svelte related issue.'
labels: [svelte]
assignees:
  - pedroborges
body:
  - type: markdown
    attributes:
      value: |
        Please read [our full contribution guide](https://laravel.com/docs/contributions#bug-reports) before submitting bug reports.

        Before submitting, please confirm:
        - You have **upgraded to the latest version** of both `@inertiajs/svelte` and `inertiajs/inertia-laravel` and confirmed the issue still exists
        - Only Inertia **2.x** and **3.x (beta)** are supported. Issues for 0.x or 1.x will be closed.
  - type: dropdown
    attributes:
      label: Inertia version
      description: Which major version of Inertia are you using?
      options:
        - 2.x (stable)
        - 3.x (beta)
    validations:
      required: true
  - type: input
    attributes:
      label: '@inertiajs/svelte Version'
      description: Provide the exact version of `@inertiajs/svelte` you are using (e.g. 2.0.3 or 3.0.0-beta.2).
      placeholder: 2.0.3
    validations:
      required: true
  - type: textarea
    attributes:
      label: Backend stack (optional)
      description: If this bug depends on backend integration, provide details such as Laravel version, PHP version, or other relevant environment info.
      placeholder: |
        Laravel 12.x
        PHP 8.4
    validations:
      required: false
  - type: textarea
    attributes:
      label: Describe the problem
      description: Explain the behavior you're seeing that you think is a bug, and describe how you expect it to behave instead.
    validations:
      required: true
  - type: textarea
    attributes:
      label: Steps to reproduce
      description: Provide clear steps to reproduce the issue. Include a minimal code example that clearly shows the problem.
    validations:
      required: true


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
  - name: Feature Request
    url: https://github.com/inertiajs/inertia/discussions/new?category=ideas
    about: 'For ideas or feature requests, start a new discussion'
  - name: Support Questions & Other
    url: https://github.com/inertiajs/inertia/discussions/new?category=help
    about: 'This repository is only for reporting bugs. If you have a question or need help using the library, click:'
  - name: Documentation issue
    url: https://github.com/inertiajs/docs
    about: For documentation issues, open a pull request at the inertiajs/docs repository


================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
<!--
Please only send a pull request to branches which are currently supported: https://laravel.com/docs/releases#support-policy

If you are unsure which branch your pull request should be sent to, please read: https://laravel.com/docs/contributions#which-branch

Pull requests without a descriptive title, thorough description, or tests will be closed.

In addition, please describe the benefit to end users; the reasons it does not break any existing features; how it makes building web applications easier, etc.
-->


================================================
FILE: .github/SECURITY.md
================================================
# Security Policy

**PLEASE DON'T DISCLOSE SECURITY-RELATED ISSUES PUBLICLY, [SEE BELOW](#reporting-a-vulnerability).**

## Supported Versions

Only the latest major version receives security fixes.

## Reporting a Vulnerability

If you discover a security vulnerability within Laravel, please send an email to Taylor Otwell at taylor@laravel.com. All security vulnerabilities will be promptly addressed.

### Public PGP Key

```
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: OpenPGP v2.0.8
Comment: Report Security Vulnerabilities to taylor@laravel.com

xsFNBFugFSQBEACxEKhIY9IoJzcouVTIYKJfWFGvwFgbRjQWBiH3QdHId5vCrbWo
s2l+4Rv03gMG+yHLJ3rWElnNdRaNdQv59+lShrZF7Bvu7Zvc0mMNmFOM/mQ/K2Lt
OK/8bh6iwNNbEuyOhNQlarEy/w8hF8Yf55hBeu/rajGtcyURJDloQ/vNzcx4RWGK
G3CLr8ka7zPYIjIFUvHLt27mcYFF9F4/G7b4HKpn75ICKC4vPoQSaYNAHlHQBLFb
Jg/WPl93SySHLugU5F58sICs+fBZadXYQG5dWmbaF5OWB1K2XgRs45BQaBzf/8oS
qq0scN8wVhAdBeYlVFf0ImDOxGlZ2suLK1BKJboR6zCIkBAwufKss4NV1R9KSUMv
YGn3mq13PGme0QoIkvQkua5VjTwWfQx7wFDxZ3VQSsjIlbVyRL/Ac/hq71eAmiIR
t6ZMNMPFpuSwBfYimrXqqb4EOffrfsTzRenG1Cxm4jNZRzX/6P4an7F/euoqXeXZ
h37TiC7df+eHKcBI4mL+qOW4ibBqg8WwWPJ+jvuhANyQpRVzf3NNEOwJYCNbQPM/
PbqYvMruAH+gg7uyu9u0jX3o/yLSxJMV7kF4x/SCDuBKIxSSUI4cgbjIlnxWLXZC
wl7KW4xAKkerO3wgIPnxNfxQoiYiEKA1c3PShWRA0wHIMt3rVRJxwGM4CwARAQAB
zRJ0YXlsb3JAbGFyYXZlbC5jb23CwXAEEwEKABoFAlugFSQCGy8DCwkHAxUKCAIe
AQIXgAIZAQAKCRDKAI7r/Ml7Zo0SD/9zwu9K87rbqXbvZ3TVu7TnN+z7mPvVBzl+
SFEK360TYq8a4GosghZuGm4aNEyZ90CeUjPQwc5fHwa26tIwqgLRppsG21B/mZwu
0m8c5RaBFRFX/mCTEjlpvBkOwMJZ8f05nNdaktq6W98DbMN03neUwnpWlNSLeoNI
u4KYZmJopNFLEax5WGaaDpmqD1J+WDr/aPHx39MUAg2ZVuC3Gj/IjYZbD1nCh0xD
a09uDODje8a9uG33cKRBcKKPRLZjWEt5SWReLx0vsTuqJSWhCybHRBl9BQTc/JJR
gJu5V4X3f1IYMTNRm9GggxcXrlOAiDCjE2J8ZTUt0cSxedQFnNyGfKxe/l94oTFP
wwFHbdKhsSDZ1OyxPNIY5OHlMfMvvJaNbOw0xPPAEutPwr1aqX9sbgPeeiJwAdyw
mPw2x/wNQvKJITRv6atw56TtLxSevQIZGPHCYTSlsIoi9jqh9/6vfq2ruMDYItCq
+8uzei6TyH6w+fUpp/uFmcwZdrDwgNVqW+Ptu+pD2WmthqESF8UEQVoOv7OPgA5E
ofOMaeH2ND74r2UgcXjPxZuUp1RkhHE2jJeiuLtbvOgrWwv3KOaatyEbVl+zHA1e
1RHdJRJRPK+S7YThxxduqfOBX7E03arbbhHdS1HKhPwMc2e0hNnQDoNxQcv0GQp4
2Y6UyCRaus7ATQRboBUkAQgA0h5j3EO2HNvp8YuT1t/VF00uUwbQaz2LIoZogqgC
14Eb77diuIPM9MnuG7bEOnNtPVMFXxI5UYBIlzhLMxf7pfbrsoR4lq7Ld+7KMzdm
eREqJRgUNfjZhtRZ9Z+jiFPr8AGpYxwmJk4v387uQGh1GC9JCc3CCLJoI62I9t/1
K2b25KiOzW/FVZ/vYFj1WbISRd5GqS8SEFh4ifU79LUlJ/nEsFv4JxAXN9RqjU0e
H4S/m1Nb24UCtYAv1JKymcf5O0G7kOzvI0w06uKxk0hNwspjDcOebD8Vv9IdYtGl
0bn7PpBlVO1Az3s8s6Xoyyw+9Us+VLNtVka3fcrdaV/n0wARAQABwsKEBBgBCgAP
BQJboBUkBQkPCZwAAhsuASkJEMoAjuv8yXtmwF0gBBkBCgAGBQJboBUkAAoJEA1I
8aTLtYHmjpIH/A1ZKwTGetHFokJxsd2omvbqv+VtpAjnUbvZEi5g3yZXn+dHJV+K
UR/DNlfGxLWEcY6datJ3ziNzzD5u8zcPp2CqeTlCxOky8F74FjEL9tN/EqUbvvmR
td2LXsSFjHnLJRK5lYfZ3rnjKA5AjqC9MttILBovY2rI7lyVt67kbS3hMHi8AZl8
EgihnHRJxGZjEUxyTxcB13nhfjAvxQq58LOj5754Rpe9ePSKbT8DNMjHbGpLrESz
cmyn0VzDMLfxg8AA9uQFMwdlKqve7yRZXzeqvy08AatUpJaL7DsS4LKOItwvBub6
tHbCE3mqrUw5lSNyUahO3vOcMAHnF7fd4W++eA//WIQKnPX5t3CwCedKn8Qkb3Ow
oj8xUNl2T6kEtQJnO85lKBFXaMOUykopu6uB9EEXEr0ShdunOKX/UdDbkv46F2AB
7TtltDSLB6s/QeHExSb8Jo3qra86JkDUutWdJxV7DYFUttBga8I0GqdPu4yRRoc/
0irVXsdDY9q7jz6l7fw8mSeJR96C0Puhk70t4M1Vg/tu/ONRarXQW7fJ8kl21PcD
UKNWWa242gji/+GLRI8AIpGMsBiX7pHhqmMMth3u7+ne5BZGGJz0uX+CzWboOHyq
kWgfY4a62t3hM0vwnUkl/D7VgSGy4LiKQrapd3LvU2uuEfFsMu3CDicZBRXPqoXj
PBjkkPKhwUTNlwEQrGF3QsZhNe0M9ptM2fC34qtxZtMIMB2NLvE4S621rmQ05oQv
sT0B9WgUL3GYRKdx700+ojHEuwZ79bcLgo1dezvkfPtu/++2CXtieFthDlWHy8x5
XJJjI1pDfGO+BgX0rS3QrQEYlF/uPQynKwxe6cGI62eZ0ug0hNrPvKEcfMLVqBQv
w4VH6iGp9yNKMUOgAECLCs4YCxK+Eka9Prq/Gh4wuqjWiX8m66z8YvKf27sFL3fR
OwGaz3LsnRSxbk/8oSiZuOVLfn44XRcxsHebteZat23lwD93oq54rtKnlJgmZHJY
4vMgk1jpS4laGnvhZj7OwE0EW6AVJAEIAKJSrUvXRyK3XQnLp3Kfj82uj0St8Dt2
h8BMeVbrAbg38wCN8XQZzVR9+bRZRR+aCzpKSqwhEQVtH7gdKgfdNdGNhG2DFAVk
SihMhQz190FKttUZgwY00enzD7uaaA5VwNAZzRIr8skwiASB7UoO+lIhrAYgcQCA
LpwCSMrUNB3gY1IVa2xi9FljEbS2uMABfOsTfl7z4L4T4DRv/ovDf+ihyZOXsXiH
RVoUTIpN8ZILCZiiKubE1sMj4fSQwCs06UyDy17HbOG5/dO9awR/LHW53O3nZCxE
JbCqr5iHa2MdHMC12+luxWJKD9DbVB01LiiPZCTkuKUDswCyi7otpVEAEQEAAcLC
hAQYAQoADwUCW6AVJAUJDwmcAAIbLgEpCRDKAI7r/Ml7ZsBdIAQZAQoABgUCW6AV
JAAKCRDxrCjKN7eORjt2B/9EnKVJ9lwB1JwXcQp6bZgJ21r6ghyXBssv24N9UF+v
5QDz/tuSkTsKK1UoBrBDEinF/xTP2z+xXIeyP4c3mthMHsYdMl7AaGpcCwVJiL62
fZvd+AiYNX3C+Bepwnwoziyhx4uPaqoezSEMD8G2WQftt6Gqttmm0Di5RVysCECF
EyhkHwvCcbpXb5Qq+4XFzCUyaIZuGpe+oeO7U8B1CzOC16hEUu0Uhbk09Xt6dSbS
ZERoxFjrGU+6bk424MkZkKvNS8FdTN2s3kQuHoNmhbMY+fRzKX5JNrcQ4dQQufiB
zFcc2Ba0JVU0nYAMftTeT5ALakhwSqr3AcdD2avJZp3EYfYP/3smPGTeg1cDJV3E
WIlCtSlhbwviUjvWEWJUE+n9MjhoUNU0TJtHIliUYUajKMG/At5wJZTXJaKVUx32
UCWr4ioKfSzlbp1ngBuFlvU7LgZRcKbBZWvKj/KRYpxpfvPyPElmegCjAk6oiZYV
LOV+jFfnMkk9PnR91ZZfTNx/bK+BwjOnO+g7oE8V2g2bA90vHdeSUHR52SnaVN/b
9ytt07R0f+YtyKojuPmlNsbyAaUYUtJ1o+XNCwdVxzarYEuUabhAfDiVTu9n8wTr
YVvnriSFOjNvOY9wdLAa56n7/qM8bzuGpoBS5SilXgJvITvQfWPvg7I9C3QhwK1S
F6B1uquQGbBSze2wlnMbKXmhyGLlv9XpOqpkkejQo3o58B+Sqj4B8DuYixSjoknr
pRbj8gqgqBKlcpf1wD5X9qCrl9vq19asVOHaKhiFZGxZIVbBpBOdvAKaMj4p/uln
yklN3YFIfgmGPYbL0elvXVn7XfvwSV1mCQV5LtMbLHsFf0VsA16UsG8A/tLWtwgt
0antzftRHXb+DI4qr+qEYKFkv9F3oCOXyH4QBhPA42EzKqhMXByEkEK9bu6skioL
mHhDQ7yHjTWcxstqQjkUQ0T/IF9ls+Sm5u7rVXEifpyI7MCb+76kSCDawesvInKt
WBGOG/qJGDlNiqBYYt2xNqzHCJoC
=zXOv
-----END PGP PUBLIC KEY BLOCK-----
```


================================================
FILE: .github/SUPPORT.md
================================================
# Support Questions

The Laravel support guide can be found in the [Laravel documentation](https://laravel.com/docs/contributions#support-questions).


================================================
FILE: .github/workflows/build.yml
================================================
name: Build
on: [push, pull_request]
jobs:
  build:
    if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository
    timeout-minutes: 15
    runs-on: ubuntu-24.04

    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install pnpm
        uses: pnpm/action-setup@v3
        with:
          version: 10

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 22.14
          cache: pnpm

      - name: Install dependencies
        run: pnpm install

      - name: Build Inertia
        run: pnpm build:all


================================================
FILE: .github/workflows/coding-standards.yml
================================================
name: Coding Standards

on:
  push:
    branches:
      - master
  pull_request:

jobs:
  format:
    runs-on: ubuntu-latest

    permissions:
      contents: write

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Install pnpm
        uses: pnpm/action-setup@v4
        with:
          version: 10

      - name: Install dependencies
        run: pnpm install

      - name: Format code
        run: pnpm run format

      - name: Commit linted files
        uses: stefanzweifel/git-auto-commit-action@v5
        with:
          commit_message: 'Fix code style'


================================================
FILE: .github/workflows/es2020-compatibility.yml
================================================
name: Compatibility Checks
on: [push, pull_request]
jobs:
  es2020-compatibility:
    name: ES2020 (${{ matrix.adapter }})
    if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository
    runs-on: ubuntu-24.04
    timeout-minutes: 15

    strategy:
      fail-fast: false
      matrix:
        adapter: ['core', 'react', 'vue', 'svelte']

    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup pnpm
        uses: pnpm/action-setup@v3
        with:
          version: 10

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 22.14
          cache: pnpm

      - name: Install dependencies
        run: pnpm install

      - name: Build core package
        if: matrix.adapter != 'core'
        run: pnpm -r --filter ./packages/core build

      - name: Validate ES2020 compatibility
        run: pnpm -r --filter ./packages/${{ matrix.adapter }}* es2020-check


================================================
FILE: .github/workflows/playwright-chromium.yml
================================================
name: Playwright Tests on Chromium
on: [push, pull_request]
jobs:
  test-chromium:
    if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository
    name: Chromium (${{ matrix.adapter }})
    timeout-minutes: 15
    runs-on: ubuntu-24.04
    strategy:
      matrix:
        adapter: ['vue', 'react', 'svelte']
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install pnpm
        uses: pnpm/action-setup@v3
        with:
          version: 10

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 22.14
          cache: pnpm

      - name: Install dependencies
        run: pnpm install

      - name: Build Inertia
        run: pnpm -r --filter ./packages/core --filter ./packages/${{ matrix.adapter }}* build

      - name: Install Playwright Browsers
        run: pnpm playwright install chromium

      - name: Run Playwright Tests
        run: pnpm test:${{ matrix.adapter }}

      - name: Upload failure screenshots
        if: failure()
        uses: actions/upload-artifact@v4
        with:
          name: playwright-failure-screenshots-${{ matrix.adapter }}-chromium
          path: test-results

  test-chromium-ssr:
    if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository
    name: Chromium SSR (${{ matrix.adapter }})
    timeout-minutes: 15
    runs-on: ubuntu-24.04
    strategy:
      matrix:
        adapter: ['vue', 'react', 'svelte']
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install pnpm
        uses: pnpm/action-setup@v3
        with:
          version: 10

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 22.14
          cache: pnpm

      - name: Install dependencies
        run: pnpm install

      - name: Build Inertia
        run: pnpm -r --filter ./packages/core --filter ./packages/${{ matrix.adapter }}* build

      - name: Install Playwright Browsers
        run: pnpm playwright install chromium

      - name: Run Playwright SSR Tests
        run: pnpm test:ssr:${{ matrix.adapter }} --project=chromium

      - name: Upload failure screenshots
        if: failure()
        uses: actions/upload-artifact@v4
        with:
          name: playwright-failure-screenshots-${{ matrix.adapter }}-chromium-ssr
          path: test-results


================================================
FILE: .github/workflows/playwright-firefox.yml
================================================
name: Playwright Tests on Firefox
on: [push, pull_request]
jobs:
  test-firefox:
    if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository
    name: Firefox (${{ matrix.adapter }}) - shard ${{ matrix.shard }} of 3)
    timeout-minutes: 15
    runs-on: ubuntu-24.04
    strategy:
      matrix:
        adapter: ['vue', 'react', 'svelte']
        shard: ['1', '2', '3']
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install pnpm
        uses: pnpm/action-setup@v3
        with:
          version: 10

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 22.14
          cache: pnpm

      - name: Install dependencies
        run: pnpm install

      - name: Build Inertia
        run: pnpm -r --filter ./packages/core --filter ./packages/${{ matrix.adapter }}* build

      - name: Install Playwright Browsers
        run: pnpm playwright install firefox

      - name: Run Playwright Tests
        run: pnpm test:${{ matrix.adapter }} --firefox --shard=${{ matrix.shard }}/3

      - name: Upload failure screenshots
        if: failure()
        uses: actions/upload-artifact@v4
        with:
          name: playwright-failure-screenshots-${{ matrix.adapter }}-firefox-shard-${{ matrix.shard }}
          path: test-results


================================================
FILE: .github/workflows/playwright-webkit.yml
================================================
name: Playwright Tests on WebKit
on: [push, pull_request]
jobs:
  test-webkit:
    if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository
    name: WebKit (${{ matrix.adapter }} - shard ${{ matrix.shard }} of 4)
    timeout-minutes: 15
    runs-on: macos-15
    strategy:
      matrix:
        adapter: ['vue', 'react', 'svelte']
        shard: ['1', '2', '3', '4']
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install pnpm
        uses: pnpm/action-setup@v3
        with:
          version: 10

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 22.14
          cache: pnpm

      - name: Install dependencies
        run: pnpm install

      - name: Build Inertia
        run: pnpm -r --filter ./packages/core --filter ./packages/${{ matrix.adapter }}* build

      - name: Install Playwright Browsers
        run: pnpm playwright install webkit

      - name: Run Playwright Tests
        run: pnpm test:${{ matrix.adapter }} --webkit --shard=${{ matrix.shard }}/4

      - name: Upload failure screenshots
        if: failure()
        uses: actions/upload-artifact@v4
        with:
          name: playwright-failure-screenshots-${{ matrix.adapter }}-webkit-shard-${{ matrix.shard }}
          path: test-results


================================================
FILE: .github/workflows/publish.yml
================================================
name: Publish Packages

on:
  release:
    types: [released, prereleased]

permissions:
  id-token: write # Required for OIDC
  contents: read

jobs:
  publish:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        adapter: ['core', 'vue3', 'react', 'svelte']
    steps:
      - name: Checkout
        uses: actions/checkout@v6

      - name: Install pnpm
        uses: pnpm/action-setup@v4
        with:
          version: 10

      - uses: actions/setup-node@v6
        with:
          node-version: 24
          registry-url: 'https://registry.npmjs.org'
          cache: pnpm

      # Ensure npm 11.5.1 or later is installed
      - name: Update npm
        run: npm install -g npm@latest

      - name: Install dependencies
        run: pnpm install

      - name: 'Publish ${{ matrix.adapter }}'
        run: pnpm -r --filter ./packages/core --filter ./packages/${{ matrix.adapter }} build

      - name: 'Publish ${{ matrix.adapter }} to npm'
        run: cd ./packages/${{ matrix.adapter }} && pnpm publish --no-git-checks


================================================
FILE: .github/workflows/test-app-quality.yml
================================================
name: Test App Quality
on: [push, pull_request]
jobs:
  test-app-quality:
    if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name != github.repository
    timeout-minutes: 15
    runs-on: ubuntu-24.04
    strategy:
      matrix:
        adapter: ['vue', 'react', 'svelte']
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Install pnpm
        uses: pnpm/action-setup@v3
        with:
          version: 10

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 22.14
          cache: pnpm

      - name: Install dependencies
        run: pnpm install

      - name: Build Inertia
        run: pnpm -r --filter ./packages/core --filter ./packages/${{ matrix.adapter }}* build

      - name: Type-check test-app
        run: cd packages/${{ matrix.adapter == 'vue' && 'vue3' || matrix.adapter }}/test-app && pnpm run type-check

      - name: ESLint test-app
        run: cd packages/${{ matrix.adapter == 'vue' && 'vue3' || matrix.adapter }}/test-app && pnpm run lint


================================================
FILE: .github/workflows/update-changelog.yml
================================================
name: update changelog

on:
  release:
    types: [released]

permissions: {}

jobs:
  update:
    permissions:
      contents: write
    uses: laravel/.github/.github/workflows/update-changelog.yml@main


================================================
FILE: .gitignore
================================================
.DS_Store
.idea
/packages/*/test-app/test-results/.last-run.json
/packages/svelte/test-app/vite.config.js.timestamp-*.mjs
/playwright-report
/test-results
node_modules


================================================
FILE: .prettierignore
================================================
# Dependencies
node_modules/
**/vendor/

# Build outputs
**/dist/
**/.svelte-kit
**/bootstrap/ssr
**/public/build

# Files we don't want to format
pnpm-lock.yaml
*.lock
*.md
*.timestamp-*.mjs

# Vue files with parsing issues (dual script blocks)
packages/vue3/test-app/Pages/PersistentLayouts/RenderFunction/Nested/PageA.vue
packages/vue3/test-app/Pages/PersistentLayouts/RenderFunction/Nested/PageB.vue
packages/vue3/test-app/Pages/PersistentLayouts/RenderFunction/Simple/PageA.vue
packages/vue3/test-app/Pages/PersistentLayouts/RenderFunction/Simple/PageB.vue
packages/vue3/test-app/Pages/PersistentLayouts/Shorthand/Nested/PageA.vue
packages/vue3/test-app/Pages/PersistentLayouts/Shorthand/Nested/PageB.vue

# Directories we don't want to format
**/test-results/


================================================
FILE: CHANGELOG.md
================================================
# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

For changes prior to v1.0.0, see the [legacy releases](https://legacy.inertiajs.com/releases).

## [Unreleased](https://github.com/inertiajs/inertia/compare/v2.3.18...master)

- Nothing yet

## [v2.3.18](https://github.com/inertiajs/inertia/compare/v2.3.17...v2.3.18) - 2026-03-12

### What's Changed

* Bump [@sveltejs](https://github.com/sveltejs)/kit from 2.53.2 to 2.53.3 by [@dependabot](https://github.com/dependabot)[bot] in https://github.com/inertiajs/inertia/pull/2919
* Bump multer from 2.0.2 to 2.1.1 by [@dependabot](https://github.com/dependabot)[bot] in https://github.com/inertiajs/inertia/pull/2923
* [2.x] Remove request from stream on network failure by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2948
* Use SharedPageProps in GlobalEventsMap event types by [@hamedelasma](https://github.com/hamedelasma) in https://github.com/inertiajs/inertia/pull/2946
* [2.x] fix: include SharedPageProps in createInertiaApp and onSuccess types by [@isaackaara](https://github.com/isaackaara) in https://github.com/inertiajs/inertia/pull/2931
* [2.x] Remove `server-renderer` dependency from Vue adapter type by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2955
* [2.x] fix(types): module augmentation example by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2954
* [2.x] fix: always fire flash event regardless of partial reload equality by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2953
* fix: skip view transition when document visibility is hidden by [@mortenhauberg](https://github.com/mortenhauberg) in https://github.com/inertiajs/inertia/pull/2957

### New Contributors

* [@hamedelasma](https://github.com/hamedelasma) made their first contribution in https://github.com/inertiajs/inertia/pull/2946
* [@mortenhauberg](https://github.com/mortenhauberg) made their first contribution in https://github.com/inertiajs/inertia/pull/2957

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.3.17...v2.3.18

## [v2.3.17](https://github.com/inertiajs/inertia/compare/v2.3.16...v2.3.17) - 2026-02-26

### What's Changed

* Include resources directory in published packages by [@pushpak1300](https://github.com/pushpak1300) in https://github.com/inertiajs/inertia/pull/2914
* [2.x] Bump deps by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2916

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.3.16...v2.3.17

## [v2.3.16](https://github.com/inertiajs/inertia/compare/v2.3.15...v2.3.16) - 2026-02-24

### What's Changed

* Bump [@sveltejs](https://github.com/sveltejs)/kit from 2.50.2 to 2.52.2 by [@dependabot](https://github.com/dependabot)[bot] in https://github.com/inertiajs/inertia/pull/2904
* Add Boost Guidelines & Skills by [@pushpak1300](https://github.com/pushpak1300) in https://github.com/inertiajs/inertia/pull/2896

### New Contributors

* [@pushpak1300](https://github.com/pushpak1300) made their first contribution in https://github.com/inertiajs/inertia/pull/2896

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.3.15...v2.3.16

## [v2.3.15](https://github.com/inertiajs/inertia/compare/v2.3.14...v2.3.15) - 2026-02-13

### What's Changed

* Bump axios from 1.13.2 to 1.13.5 by [@dependabot](https://github.com/dependabot)[bot] in https://github.com/inertiajs/inertia/pull/2888
* [2.x] Fix flash data being cleared by `history.replaceState` by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2889
* [2.x] Handle `bfcache` restoration for encrypted history by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2890
* [2.x] Bump dependencies by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2891
* [2.x] Fix InfiniteScroll loading all pages in reverse mode with flex/grid layouts by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2893
* [2.x] Improve flaky tests and test app quality by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2895

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.3.14...v2.3.15

## [v2.3.14](https://github.com/inertiajs/inertia/compare/v2.3.13...v2.3.14) - 2026-02-11

### What's Changed

* [2.x] Shut down entire cluster on SSR shutdown by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2876
* [2.x] Fix `useForm` type inference when passing data as callback by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2878
* Add global configuration support for withAllErrors in form components by [@skryukov](https://github.com/skryukov) in https://github.com/inertiajs/inertia/pull/2865

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.3.13...v2.3.14

## [v2.3.13](https://github.com/inertiajs/inertia/compare/v2.3.12...v2.3.13) - 2026-01-30

### What's Changed

* Fix `useForm` type inference in generic wrapper components by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2851
* Support wildcard paths in `validate()` method by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2854

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.3.12...v2.3.13

## [v2.3.12](https://github.com/inertiajs/inertia/compare/v2.3.11...v2.3.12) - 2026-01-27

### What's Changed

* Bump lodash from 4.17.21 to 4.17.23 by [@dependabot](https://github.com/dependabot)[bot] in https://github.com/inertiajs/inertia/pull/2835
* Bump lodash-es from 4.17.22 to 4.17.23 by [@dependabot](https://github.com/dependabot)[bot] in https://github.com/inertiajs/inertia/pull/2836
* Fix cancellation of concurrent partial reloads with query parameters by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2843
* Support for the `formTarget` attribute in the `<Form>` component by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2844
* Clear stale form errors on resubmit by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2845
* Prevent `<Deferred>` from rendering children with undefined props by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2846

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.3.11...v2.3.12

## [v2.3.11](https://github.com/inertiajs/inertia/compare/v2.3.10...v2.3.11) - 2026-01-20

### What's Changed

* Bump and cleanup dependencies by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2822
* Add test for Precognition validation with transform key changes by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2827
* TS and console error on conflicting `useForm()` keys by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2823
* Allow `useForm` without arguments by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2830
* Pass `true` to `inert` attribute in React 19 by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2831

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.3.10...v2.3.11

## [v2.3.10](https://github.com/inertiajs/inertia/compare/v2.3.9...v2.3.10) - 2026-01-15

### What's Changed

* Add `async` and `sync` options to `cancelAll` method by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2814
* Fix smooth scrolling in Firefox and add Firefox to CI by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2815
* Improve flaky `<InfiniteScroll>` test in WebKit CI by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2818
* Pass `onceProps` as second argument in client-side visit props callback by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2816
* Prevent converting a string response to an object by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2821

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.3.9...v2.3.10

## [v2.3.9](https://github.com/inertiajs/inertia/compare/v2.3.8...v2.3.9) - 2026-01-14

### What's Changed

* Fix React Precognition Error Sync (issue #2806) by [@joetifa2003](https://github.com/joetifa2003) in https://github.com/inertiajs/inertia/pull/2808
* Add tests for deferred scroll props by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2811
* Fix deferred props not loading after back button navigation by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2812
* Add test for concurrent reloads by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2813
* Cancel in-flight deferred prop requests on navigation by [@alexspeller](https://github.com/alexspeller) in https://github.com/inertiajs/inertia/pull/2656
* fix: preserve query parameters in test server responses by [@alexspeller](https://github.com/alexspeller) in https://github.com/inertiajs/inertia/pull/2665
* [2.x] Add Form Context Support by [@laserhybiz](https://github.com/laserhybiz) in https://github.com/inertiajs/inertia/pull/2671

### New Contributors

* [@joetifa2003](https://github.com/joetifa2003) made their first contribution in https://github.com/inertiajs/inertia/pull/2808
* [@alexspeller](https://github.com/alexspeller) made their first contribution in https://github.com/inertiajs/inertia/pull/2656
* [@laserhybiz](https://github.com/laserhybiz) made their first contribution in https://github.com/inertiajs/inertia/pull/2671

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.3.8...v2.3.9

## [v2.3.8](https://github.com/inertiajs/inertia/compare/v2.3.7...v2.3.8) - 2026-01-09

### What's Changed

* fix: update has more state when resetting before updating page by [@AydinHassan](https://github.com/AydinHassan) in https://github.com/inertiajs/inertia/pull/2787
* Ensure Flash Data listener is registered before event is fired by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2799
* Improve indices detection in `mergeDataIntoQueryString()` by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2798
* Fix `<WhenVisible>` re-registering observer when params change by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2804

### New Contributors

* [@AydinHassan](https://github.com/AydinHassan) made their first contribution in https://github.com/inertiajs/inertia/pull/2787

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.3.7...v2.3.8

## [v2.3.7](https://github.com/inertiajs/inertia/compare/v2.3.6...v2.3.7) - 2026-01-07

### What's Changed

* Add `dontRemember()` method to form helper by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2792
* Only call `replaceState()` when page data has actually changed by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2793
* Fix `@typescript-eslint/unbound-method` warning when destructuring `useForm()` methods by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2794

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.3.6...v2.3.7

## [v2.3.6](https://github.com/inertiajs/inertia/compare/v2.3.5...v2.3.6) - 2025-12-31

### What's Changed

* Bump qs from 6.14.0 to 6.14.1 by [@dependabot](https://github.com/dependabot)[bot] in https://github.com/inertiajs/inertia/pull/2790

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.3.5...v2.3.6

## [v2.3.5](https://github.com/inertiajs/inertia/compare/v2.3.4...v2.3.5) - 2025-12-31

### What's Changed

* Refresh the Infinite Scroll triggers after partial reload by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2784
* Fix `hasAnyState()` to actually check for browser history by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2785
* Handle WebKit history throttle errors by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2786
* Merge `data` and `params` props in `<WhenVisible>` by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2789
* Handle `QuotaExceededError` in WebKit by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2788

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.3.4...v2.3.5

## [v2.3.4](https://github.com/inertiajs/inertia/compare/v2.3.3...v2.3.4) - 2025-12-19

### What's Changed

* Only restore Infinite Scroll state from history on back/forward navigation by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2777

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.3.3...v2.3.4

## [v2.3.3](https://github.com/inertiajs/inertia/compare/v2.3.2...v2.3.3) - 2025-12-17

### What's Changed

* Add support for protocol-relative urls in url.ts by [@machour](https://github.com/machour) in https://github.com/inertiajs/inertia/pull/2769
* Fix brackets notation qs parsing by [@skryukov](https://github.com/skryukov) in https://github.com/inertiajs/inertia/pull/2722
* Support for Flash Data by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2757

### New Contributors

* [@machour](https://github.com/machour) made their first contribution in https://github.com/inertiajs/inertia/pull/2769

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.3.2...v2.3.3

## [v2.3.2](https://github.com/inertiajs/inertia/compare/v2.3.1...v2.3.2) - 2025-12-16

### What's Changed

* Expose InertiaPrecognitiveForm type by [@lcdss](https://github.com/lcdss) in https://github.com/inertiajs/inertia/pull/2756
* Test for loading deferred props on `router.reload()` without `only`/`except` by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2761
* Expose `fetching` in default `<WhenVisible>` slot by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2766
* Include submitter element value in Form component submission by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2770

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.3.1...v2.3.2

## [v2.3.1](https://github.com/inertiajs/inertia/compare/v2.3.0...v2.3.1) - 2025-12-12

### What's Changed

* Test for Form + Vue Options API by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2750
* Fix for validating items in dynamic arrays by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2753
* Escape forward slashes when using useScriptElementForInitialPage by [@kirk-loretz-fsn](https://github.com/kirk-loretz-fsn) in https://github.com/inertiajs/inertia/pull/2751
* Sync Playground configs by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2754
* Fix race condition when restoring scroll regions by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2755

### New Contributors

* [@kirk-loretz-fsn](https://github.com/kirk-loretz-fsn) made their first contribution in https://github.com/inertiajs/inertia/pull/2751

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.3.0...v2.3.1

## [v2.3.0](https://github.com/inertiajs/inertia/compare/v2.2.21...v2.3.0) - 2025-12-11

### What's Changed

* Support for Precognition in `useForm()` by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2684
* Support for Precognition in `<Form>` component by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2700
* Improve Precognition examples in Playgrounds by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2746
* Improve flaky tests by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2747
* bugfix(whenVisible-vue): Fix loaded state when data already exists by [@ClaraLeigh](https://github.com/ClaraLeigh) in https://github.com/inertiajs/inertia/pull/2748

### New Contributors

* [@ClaraLeigh](https://github.com/ClaraLeigh) made their first contribution in https://github.com/inertiajs/inertia/pull/2748

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.2.21...v2.3.0

## [v2.2.21](https://github.com/inertiajs/inertia/compare/v2.2.20...v2.2.21) - 2025-12-10

### What's Changed

* Add `viewTransition` to `FormComponentOptions` type  by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2741
* Preserve untouched Once Props on Partial Reload + Once Props in Playground  by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2743
* Only preserve loaded Deferred + Once props by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2745

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.2.20...v2.2.21

## [v2.2.20](https://github.com/inertiajs/inertia/compare/v2.2.19...v2.2.20) - 2025-12-09

### What's Changed

* Bump express from 5.1.0 to 5.2.0 by [@dependabot](https://github.com/dependabot)[bot] in https://github.com/inertiajs/inertia/pull/2727
* Add tests for SSR server by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2730
* Preserve errors when loading deferred props by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2729
* Optimize page data size and parsing (37% size reduction!) by [@bram-pkg](https://github.com/bram-pkg) in https://github.com/inertiajs/inertia/pull/2687
* Support for `once()` props by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2732
* Fix for sequential Client Side Visits by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2737
* Refactor duplicated initial page code by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2738

### New Contributors

* [@bram-pkg](https://github.com/bram-pkg) made their first contribution in https://github.com/inertiajs/inertia/pull/2687

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.2.19...v2.2.20

## [v2.2.19](https://github.com/inertiajs/inertia/compare/v2.2.18...v2.2.19) - 2025-11-27

### What's Changed

* Bump dependencies by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2710
* TypeScript fix accessing error keys of optional nested object by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2718
* Use FormValue in Form component by [@skryukov](https://github.com/skryukov) in https://github.com/inertiajs/inertia/pull/2709
* Fix anchor hash scrolling on initial page visit in React by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2719
* Ensure page is rendered before scrolling to top by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2721

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.2.18...v2.2.19

## [v2.2.18](https://github.com/inertiajs/inertia/compare/v2.2.17...v2.2.18) - 2025-11-17

### What's Changed

* Ensure `objectsAreEqual()` checks all keys in both objects by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2705

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.2.17...v2.2.18

## [v2.2.17](https://github.com/inertiajs/inertia/compare/v2.2.16...v2.2.17) - 2025-11-14

### What's Changed

* Reset `<WhenVisible>` loading state after a page reload by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2699
* Add test for reloading deferred props by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2698
* Force `indices` array format when submitting data using `FormData` by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2701

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.2.16...v2.2.17

## [v2.2.16](https://github.com/inertiajs/inertia/compare/v2.2.15...v2.2.16) - 2025-11-13

### What's Changed

* Added test for `defaultValue` in Form component by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2685
* Prevent navigation on right-click on `<Link>` with `prefetch="click"` by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2676
* Export page component type for React adapter by [@skryukov](https://github.com/skryukov) in https://github.com/inertiajs/inertia/pull/2691
* Switch `useContext` to `use` in `usePage()` hook by [@HichemTab-tech](https://github.com/HichemTab-tech) in https://github.com/inertiajs/inertia/pull/2680
* Improve serialization in `formDataToObject()` when mixing numeric and non-numeric object keys by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2692
* Fix `InfiniteScroll` scroll preservation by [@skryukov](https://github.com/skryukov) in https://github.com/inertiajs/inertia/pull/2689
* Export Inertia `App` component by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2695
* Ignore `preserveScroll` and `preserveState` when finding cached response by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2694
* Upgrade Express server for test apps to v5 by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2693
* Add WebKit browser testing to CI with Safari compatibility fixes by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2696
* Bump symfony/http-foundation from 7.3.4 to 7.3.7 in /playgrounds/vue3 by [@dependabot](https://github.com/dependabot)[bot] in https://github.com/inertiajs/inertia/pull/2697
* Fix array keys misalignment in form data and query by [@skryukov](https://github.com/skryukov) in https://github.com/inertiajs/inertia/pull/2690

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.2.15...v2.2.16

## [v2.2.15](https://github.com/inertiajs/inertia/compare/v2.2.14...v2.2.15) - 2025-10-30

### What's Changed

* TS Fix for circularly references in form data  by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2673
* Improve TS for config defaults by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2674
* [v2.x] feat: allow adding type to `router.restore` by [@peaklabs-dev](https://github.com/peaklabs-dev) in https://github.com/inertiajs/inertia/pull/2545
* Configurable prefetch hover delay by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2675

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.2.14...v2.2.15

## [v2.2.14](https://github.com/inertiajs/inertia/compare/v2.2.13...v2.2.14) - 2025-10-28

### What's Changed

* TS cleanup for `<Link>` component + View Transition prop in Svelte by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2667
* Improve support for `any` as form data value by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2668

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.2.13...v2.2.14

## [v2.2.13](https://github.com/inertiajs/inertia/compare/v2.2.12...v2.2.13) - 2025-10-28

### What's Changed

* Support for View Transitions by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2658
* Opt-in to using `data-inertia` attribute in `<Head>` component by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2663
* Opt-in to using `<dialog>` for error modals by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2664
* feat: give access to underlying data as object and as form data object by [@MeiKatz](https://github.com/MeiKatz) in https://github.com/inertiajs/inertia/pull/2605

### New Contributors

* [@MeiKatz](https://github.com/MeiKatz) made their first contribution in https://github.com/inertiajs/inertia/pull/2605

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.2.12...v2.2.13

## [v2.2.12](https://github.com/inertiajs/inertia/compare/v2.2.11...v2.2.12) - 2025-10-27

### What's Changed

* Clone page props before writing it to the browser's history by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2662

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.2.11...v2.2.12

## [v2.2.11](https://github.com/inertiajs/inertia/compare/v2.2.10...v2.2.11) - 2025-10-24

### What's Changed

* Configure global defaults and update during runtime by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2655
* Stabilize prop references when visiting the same page by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2657

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.2.10...v2.2.11

## [v2.2.10](https://github.com/inertiajs/inertia/compare/v2.2.9...v2.2.10) - 2025-10-23

### What's Changed

* Restore uppercase `Component` object key in React's `App.ts` by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2654

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.2.9...v2.2.10

## [v2.2.9](https://github.com/inertiajs/inertia/compare/v2.2.8...v2.2.9) - 2025-10-21

### What's Changed

* Use local `@inertiajs/core` in Playgrounds + dependencies bump by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2633
* Introduce types for Head Manager by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2634
* Fix resolving `preserveScroll` and `preserveState` in Client Side Visits by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2635
* Support for type-hinting shared Page Props by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2636
* Add `globals.d.ts` file to Playgrounds by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2637
* Remove wrong `shouldIntercept()` call in `keydown` event handler in `<Link>` component by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2638
* Introduce `CancelToken` and `CancelTokenCallback` types to replace Axios imports by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2639
* Internal TypeScript improvements by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2640
* Tests and TS improvements for the `<Head>` component by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2641
* Make `data` prop of `<InfiniteScroll>` required by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2642
* TS fixes in Vue adapter for `useRemember` and `remember` mixin by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2643
* Bump vite from 5.4.20 to 5.4.21 by [@dependabot](https://github.com/dependabot)[bot] in https://github.com/inertiajs/inertia/pull/2647
* TypeScript improvements to `createInertiaApp()` and unifying it across adapters by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2648
* ESLint check for test-apps by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2560

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.2.8...v2.2.9

## [v2.2.8](https://github.com/inertiajs/inertia/compare/v2.2.7...v2.2.8) - 2025-10-09

### What's Changed

* Prevent false positives in `getScrollableParent()` by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2626
* Restore scroll regions after navigation by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2627
* Prevent replacing history state when scroll regions are unchanged to fix popstate behavior in WebKit by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2629

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.2.7...v2.2.8

## [v2.2.7](https://github.com/inertiajs/inertia/compare/v2.2.6...v2.2.7) - 2025-10-07

### What's Changed

* Preserve relative URL when `<InfiniteScroll>` updates query string by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2623
* Use `SlotsType` to type-hint Vue slots by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2620
* Fix race condition in `history.ts` by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2624

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.2.6...v2.2.7

## [v2.2.6](https://github.com/inertiajs/inertia/compare/v2.2.5...v2.2.6) - 2025-10-03

### What's Changed

* SSR fixes for `<InfiniteScroll>` component. by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2616

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.2.5...v2.2.6

## [v2.2.5](https://github.com/inertiajs/inertia/compare/v2.2.4...v2.2.5) - 2025-10-02

### What's Changed

* Improve `<InfiniteScroll>` cleanup after navigating away by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2610
* Fix for `<Form>` component when using React SSR by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2612
* Fix conflicting Client Side Visits by queuing the URL synchronization by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2613
* Improvements to `<InfiniteScroll>` in Svelte adapter by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2614

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.2.4...v2.2.5

## [v2.2.4](https://github.com/inertiajs/inertia/compare/v2.2.3...v2.2.4) - 2025-09-30

### What's Changed

* Compile TS while developing + improve CLI output by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2600
* Improve testing of scroll restoration by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2602
* Fix for reloading an unrelated prop affecting infinite scroll by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2603
* Add `preserve-url` prop to `<Link>` component by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2541

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.2.3...v2.2.4

## [v2.2.3](https://github.com/inertiajs/inertia/compare/v2.2.2...v2.2.3) - 2025-09-29

### What's Changed

* Preserve `ScrollProp` on Partial Reloads by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2597

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.2.2...v2.2.3

## [v2.2.2](https://github.com/inertiajs/inertia/compare/v2.2.1...v2.2.2) - 2025-09-28

### What's Changed

* Reset `ScrollProp` when requested by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2595

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.2.1...v2.2.2

## [v2.2.1](https://github.com/inertiajs/inertia/compare/v2.2.0...v2.2.1) - 2025-09-28

### What's Changed

* Don't restore remembered state after a refresh by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2591
* Remember Infinite Scroll state by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2592

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.2.0...v2.2.1

## [v2.2.0](https://github.com/inertiajs/inertia/compare/v2.1.11...v2.2.0) - 2025-09-26

### What's Changed

* Support for merging nested prop paths by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2561
* Client-side visit helpers to update props by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2589
* Introduction of the `<InfiniteScroll>` component by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2580

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.1.11...v2.2.0

## [v2.1.11](https://github.com/inertiajs/inertia/compare/v2.1.10...v2.1.11) - 2025-09-24

### What's Changed

* Fix flaky tests in CI by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2582
* Bump Playwright by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2585
* Progress indicator API by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2581

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.1.10...v2.1.11

## [v2.1.10](https://github.com/inertiajs/inertia/compare/v2.1.9...v2.1.10) - 2025-09-22

### What's Changed

* Fix PNPM publishing by [@joetannenbaum](https://github.com/joetannenbaum) in https://github.com/inertiajs/inertia/pull/2578

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.1.9...v2.1.10

## [v2.1.9](https://github.com/inertiajs/inertia/compare/v2.1.8...v2.1.9) - 2025-09-22

### What's Changed

* Fix PNPM build by [@joetannenbaum](https://github.com/joetannenbaum) in https://github.com/inertiajs/inertia/pull/2577

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.1.8...v2.1.9

## [v2.1.8](https://github.com/inertiajs/inertia/compare/v2.1.7...v2.1.8) - 2025-09-22

### What's Changed

* Publish packages in CI by [@joetannenbaum](https://github.com/joetannenbaum) in https://github.com/inertiajs/inertia/pull/2575

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.1.7...v2.1.8

## [v2.1.7](https://github.com/inertiajs/inertia/compare/v2.1.6...v2.1.7) - 2025-09-18

### What's Changed

* Bump axios from 1.11.0 to 1.12.0 by [@dependabot](https://github.com/dependabot)[bot] in https://github.com/inertiajs/inertia/pull/2568
* Bump dependencies by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2571
* TypeScript upgrade by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2573

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.1.6...v2.1.7

## [v2.1.6](https://github.com/inertiajs/inertia/compare/v2.1.5...v2.1.6) - 2025-09-12

### What's Changed

* Invalidate prefetch cache when page is received from a network request by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2567

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.1.5...v2.1.6

## [v2.1.5](https://github.com/inertiajs/inertia/compare/v2.1.4...v2.1.5) - 2025-09-05

### What's Changed

* Fix race condition when combining Deferred Props with an instant Partial Reload on mount by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2562

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.1.4...v2.1.5

## [v2.1.4](https://github.com/inertiajs/inertia/compare/v2.1.3...v2.1.4) - 2025-09-03

### What's Changed

* Replace html-escape with built-in function on Svelte package by [@kresnasatya](https://github.com/kresnasatya) in https://github.com/inertiajs/inertia/pull/2535
* Update dirty state after DOM changes (React only) by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2558
* Prevent errors caused by null href value by [@fritz-c](https://github.com/fritz-c) in https://github.com/inertiajs/inertia/pull/2550
* Remove data from the dependency array of setDefaults by [@jasonlbeggs](https://github.com/jasonlbeggs) in https://github.com/inertiajs/inertia/pull/2554

### New Contributors

* [@fritz-c](https://github.com/fritz-c) made their first contribution in https://github.com/inertiajs/inertia/pull/2550
* [@jasonlbeggs](https://github.com/jasonlbeggs) made their first contribution in https://github.com/inertiajs/inertia/pull/2554

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.1.3...v2.1.4

## [v2.1.3](https://github.com/inertiajs/inertia/compare/v2.1.2...v2.1.3) - 2025-08-27

### What's Changed

* Code formatting with Prettier by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2515
* Add EditorConfig and fix some whitespace issues by [@jrmajor](https://github.com/jrmajor) in https://github.com/inertiajs/inertia/pull/2516
* Fix for nullable object types in `useForm` by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2528
* Fix for Form Component in Svelte when resetting use input/button by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2525
* Improve Link component `as` prop by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2524
* [v2.x] fix: type error by changing page props type to `any` by [@peaklabs-dev](https://github.com/peaklabs-dev) in https://github.com/inertiajs/inertia/pull/2520
* Revert to back to Lodash to retain ES2020 compatibility by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2527
* Verify ES2020 compatibility in CI by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2530
* [Vue] Fixing action attribute on Form Component when using Wayfinder by [@nicolagianelli](https://github.com/nicolagianelli) in https://github.com/inertiajs/inertia/pull/2532
* Make package.json structure in Svelte package Consistent as Vue and React by [@kresnasatya](https://github.com/kresnasatya) in https://github.com/inertiajs/inertia/pull/2529
* Remove Svelte 5-next version constraint by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2533
* improve typescript configuration by [@sudo-barun](https://github.com/sudo-barun) in https://github.com/inertiajs/inertia/pull/2470
* Format JSON files with Prettier by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2534
* Fix warning about `inert` attribute in React < 19 by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2536
* Fix keyboard activation when using `prefetch: 'click'` by [@pedroborges](https://github.com/pedroborges) in https://github.com/inertiajs/inertia/pull/2538
* Fix `useForm` to respect manual `setDefaults()` calls in `onSuccess` and unify timing across adapters by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2539
* Run Playwright in parallel in CI by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2540
* Fix Coding Standards workflow by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2547
* bumpup axios to fix CVE-2025-7783 by [@vallerydelexy](https://github.com/vallerydelexy) in https://github.com/inertiajs/inertia/pull/2546
* Bump `@sveltejs/kit` version by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2548

### New Contributors

* [@peaklabs-dev](https://github.com/peaklabs-dev) made their first contribution in https://github.com/inertiajs/inertia/pull/2520
* [@nicolagianelli](https://github.com/nicolagianelli) made their first contribution in https://github.com/inertiajs/inertia/pull/2532
* [@kresnasatya](https://github.com/kresnasatya) made their first contribution in https://github.com/inertiajs/inertia/pull/2529
* [@vallerydelexy](https://github.com/vallerydelexy) made their first contribution in https://github.com/inertiajs/inertia/pull/2546

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.1.2...v2.1.3

## [v2.1.2](https://github.com/inertiajs/inertia/compare/v2.1.1...v2.1.2) - 2025-08-15

### What's Changed

* Fix for manipulating form after redirect in `onSubmitComplete` by [@joetannenbaum](https://github.com/joetannenbaum) in https://github.com/inertiajs/inertia/pull/2510
* Support for passing Wayfinder objects to router methods by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2497
* Tag-based cache invalidation for prefetch requests by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2484
* Add `resetOnError`, `resetOnSuccess`, `setDefaultsOnSuccess` to Form component by [@joetannenbaum](https://github.com/joetannenbaum) in https://github.com/inertiajs/inertia/pull/2514

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.1.1...v2.1.2

## [v2.1.1](https://github.com/inertiajs/inertia/compare/v2.1.0...v2.1.1) - 2025-08-14

### What's Changed

* Improve `Link` component types and support for prefetch events by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2464
* allow passing partial errors object to `setError()` by [@sudo-barun](https://github.com/sudo-barun) in https://github.com/inertiajs/inertia/pull/2461
* Add missing generic type support to PendingVisit and VisitHelperOptions by [@HichemTab-tech](https://github.com/HichemTab-tech) in https://github.com/inertiajs/inertia/pull/2454
* Revamp useForm's generic types across adaptors by [@Spice-King](https://github.com/Spice-King) in https://github.com/inertiajs/inertia/pull/2335
* TypeScript improvements for `Link` component and Client Side Visits by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2472
* Further TS improvements for `useForm` by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2475
* Improve consistency in `useForm` across adapters by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2482
* Improve TypeScript support for Client Side Visit `props` callback by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2483
* TS improvements to Svelte's `<Form>` and `useForm()` implementations by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2489
* Typescript Improvements by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2468
* Test apps in TypeScript by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2469
* Fix empty action in `<Form>` component when the current URL has more than one segment by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2501
* Support uppercase method in `<Form>` component by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2502
* Add `Form` component `disableWhileProcessing` prop by [@joetannenbaum](https://github.com/joetannenbaum) in https://github.com/inertiajs/inertia/pull/2504
* Reset form fields by name in Form components by [@skryukov](https://github.com/skryukov) in https://github.com/inertiajs/inertia/pull/2499
* Add `onSubmitComplete` prop to `Form` component by [@joetannenbaum](https://github.com/joetannenbaum) in https://github.com/inertiajs/inertia/pull/2503
* Remove failed prefetch requests from in-flight array by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2500
* Add `defaults()` method to Form component by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2507
* Release script by [@joetannenbaum](https://github.com/joetannenbaum) in https://github.com/inertiajs/inertia/pull/2508
* Only `reset()` and `defaults()` in `onSubmitComplete` by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2509

### New Contributors

* [@sudo-barun](https://github.com/sudo-barun) made their first contribution in https://github.com/inertiajs/inertia/pull/2461

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.1.0...v2.1.1

## [v2.1.0](https://github.com/inertiajs/inertia/compare/v2.0.17...v2.1.0) - 2025-08-13

### What's Changed

* Support for passing custom component to `as` prop of `Link` component. by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2443
* Use `nodemon` to trigger new files and deleted files in test apps by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2442
* Use ReactNode type for children props by [@chack1172](https://github.com/chack1172) in https://github.com/inertiajs/inertia/pull/2385
* Allow function as children component in react Deferred and WhenVisible by [@chack1172](https://github.com/chack1172) in https://github.com/inertiajs/inertia/pull/2386
* Improve test that waits for scroll position restoration by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2473
* Introduction of the `Form` component by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2474
* Improve `children` prop of `<Form>` Component by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2487
* Add Form component ref support by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2496
* Make Svelte's <Deferred> not crash in an SSR environment by [@dkulchenko](https://github.com/dkulchenko) in https://github.com/inertiajs/inertia/pull/2396
* Fix core: Queue processing when an item fails by [@pintend](https://github.com/pintend) in https://github.com/inertiajs/inertia/pull/2467
* Migrate playgrounds to Tailwind 4 by [@jrmajor](https://github.com/jrmajor) in https://github.com/inertiajs/inertia/pull/2369

### New Contributors

* [@dkulchenko](https://github.com/dkulchenko) made their first contribution in https://github.com/inertiajs/inertia/pull/2396
* [@pintend](https://github.com/pintend) made their first contribution in https://github.com/inertiajs/inertia/pull/2467

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.0.17...v2.1.0

## [v2.0.17](https://github.com/inertiajs/inertia/compare/v2.0.16...v2.0.17) - 2025-07-18

### What's Changed

* Bump multer from 2.0.1 to 2.0.2 by [@dependabot](https://github.com/dependabot)[bot] in https://github.com/inertiajs/inertia/pull/2447
* Bump vite from 5.4.12 to 5.4.19 by [@dependabot](https://github.com/dependabot)[bot] in https://github.com/inertiajs/inertia/pull/2450
* Bump esbuild from 0.21.5 to 0.25.0 by [@dependabot](https://github.com/dependabot)[bot] in https://github.com/inertiajs/inertia/pull/2451
* Explicit string coercion in `Head` component by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2453

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.0.16...v2.0.17

## [v2.0.16](https://github.com/inertiajs/inertia/compare/v2.0.15...v2.0.16) - 2025-07-18

### What's Changed

* Make errorBag parameter optional by [@joelstein](https://github.com/joelstein) in https://github.com/inertiajs/inertia/pull/2445

### New Contributors

* [@joelstein](https://github.com/joelstein) made their first contribution in https://github.com/inertiajs/inertia/pull/2445

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.0.15...v2.0.16

## [v2.0.15](https://github.com/inertiajs/inertia/compare/v2.0.14...v2.0.15) - 2025-07-17

### What's Changed

* Improve GitHub issue templates by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2418
* Escape the attribute values that are passed into the `Head` component by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2403
* Introduce single method to reset form state and clear errors by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2414
* Use `CacheForOption` type in React `Link` component by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2426
* Improve query string merging in `mergeDataIntoQueryString()`  by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2417
* Improve scrolling when using anchor hash by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2428
* Cancel sync request on popstate event by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2429
* Support for path traversal by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2413
* Add event callbacks to `ClientSideVisitOptions` by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2405
* Pass parameters to `onFinish` and `onSuccess` callbacks on Client Side Visits by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2433
* Prevent JS builds and test apps from being minified by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2424
* Migrate to pnpm by [@jrmajor](https://github.com/jrmajor) in https://github.com/inertiajs/inertia/pull/2276
* Fix single-use prefetching by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2440
* Change defaults values order in onSuccess callback of useForm by [@yilanboy](https://github.com/yilanboy) in https://github.com/inertiajs/inertia/pull/2437
* Improve reactivity of Link components by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2441

### New Contributors

* [@yilanboy](https://github.com/yilanboy) made their first contribution in https://github.com/inertiajs/inertia/pull/2437

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.0.14...v2.0.15

## [v2.0.14](https://github.com/inertiajs/inertia/compare/v2.0.13...v2.0.14) - 2025-06-26

### What's Changed

* fix: fixed type error in `useForm SetDataAction` type by [@fxnm](https://github.com/fxnm) in https://github.com/inertiajs/inertia/pull/2395
* Call `provider.update` outside useEffect block to support SSR by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2397
* Improve state restore logic in `useRemember` by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2401

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.0.13...v2.0.14

## [v2.0.13](https://github.com/inertiajs/inertia/compare/v2.0.12...v2.0.13) - 2025-06-20

### What's Changed

* Allow deepMerge on custom properties by [@mpociot](https://github.com/mpociot) in https://github.com/inertiajs/inertia/pull/2344
* fix: React StrictMode breaking Inertia Head by [@jordanhavard](https://github.com/jordanhavard) in https://github.com/inertiajs/inertia/pull/2328
* Bump multer from 1.4.4 to 2.0.1 in /tests/app by [@dependabot](https://github.com/dependabot) in https://github.com/inertiajs/inertia/pull/2373
* Initialize router before components in React by [@chack1172](https://github.com/chack1172) in https://github.com/inertiajs/inertia/pull/2379
* Prevent duplicate render of the initial page in React by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2377
* Update default state when `setDefault()` is called right after `setData()` is called by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2364
* [2.x] Restore `router.resolveComponent()` method by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2039
* Move `currentIsInitialPage` variable outside of `App` by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2381
* Don't overwrite Vite class in Svelte playgrounds by [@jrmajor](https://github.com/jrmajor) in https://github.com/inertiajs/inertia/pull/2368
* Dependency update + Prevent Playwright 1.53.0 due to Svelte bug by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2382
* Update to Vite 6 by [@SuperDJ](https://github.com/SuperDJ) in https://github.com/inertiajs/inertia/pull/2315
* Fix React scroll restoration on popState by [@sebastiandedeyne](https://github.com/sebastiandedeyne) in https://github.com/inertiajs/inertia/pull/2357
* feat(useForm): export granular setData types and introduce SetDataAction<TForm> by [@hasib-devs](https://github.com/hasib-devs) in https://github.com/inertiajs/inertia/pull/2356
* Refactor `mergeStrategies` to `matchOn` by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2384
* Remove `setSwapComponent` method and cleanup after PR #2379 by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2383

### New Contributors

* [@jordanhavard](https://github.com/jordanhavard) made their first contribution in https://github.com/inertiajs/inertia/pull/2328
* [@chack1172](https://github.com/chack1172) made their first contribution in https://github.com/inertiajs/inertia/pull/2379
* [@jrmajor](https://github.com/jrmajor) made their first contribution in https://github.com/inertiajs/inertia/pull/2368
* [@SuperDJ](https://github.com/SuperDJ) made their first contribution in https://github.com/inertiajs/inertia/pull/2315
* [@hasib-devs](https://github.com/hasib-devs) made their first contribution in https://github.com/inertiajs/inertia/pull/2356

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.0.12...v2.0.13

## [v2.0.12](https://github.com/inertiajs/inertia/compare/v2.0.11...v2.0.12) - 2025-06-10

### What's Changed

* Send `Purpose: prefetch` header on prefetching by [@pascalbaljet](https://github.com/pascalbaljet) in https://github.com/inertiajs/inertia/pull/2367

### New Contributors

* [@pascalbaljet](https://github.com/pascalbaljet) made their first contribution in https://github.com/inertiajs/inertia/pull/2367

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.0.11...v2.0.12

## [v2.0.11](https://github.com/inertiajs/inertia/compare/v2.0.10...v2.0.11) - 2025-05-16

### What's Changed

* Fix progress bar not showing on subsequent page clicks by [@joetannenbaum](https://github.com/joetannenbaum) in https://github.com/inertiajs/inertia/pull/2349

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.0.10...v2.0.11

## [v2.0.10](https://github.com/inertiajs/inertia/compare/v2.0.9...v2.0.10) - 2025-05-15

### What's Changed

* Don't show progress bar on prefetch hover by [@joetannenbaum](https://github.com/joetannenbaum) in https://github.com/inertiajs/inertia/pull/2347

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.0.9...v2.0.10

## [v2.0.9](https://github.com/inertiajs/inertia/compare/v2.0.8...v2.0.9) - 2025-05-09

### What's Changed

* Bump [@sveltejs](https://github.com/sveltejs)/kit from 2.11.1 to 2.20.6 by [@dependabot](https://github.com/dependabot) in https://github.com/inertiajs/inertia/pull/2312
* Bump vite from 5.4.17 to 5.4.18 by [@dependabot](https://github.com/dependabot) in https://github.com/inertiajs/inertia/pull/2307
* Fix for deferred props + prefetch links by [@joetannenbaum](https://github.com/joetannenbaum) in https://github.com/inertiajs/inertia/pull/2321
* Progress: Make hide and reveal CSP-compatible by [@flexponsive](https://github.com/flexponsive) in https://github.com/inertiajs/inertia/pull/2316
* Corrected URL search parameter merge logic to match behavior prior to v2.0.8 by [@joetannenbaum](https://github.com/joetannenbaum) in https://github.com/inertiajs/inertia/pull/2341
* Corrects url search parameter merge logic to match behavior prior to v2.0.8 by [@CTOJoe](https://github.com/CTOJoe) in https://github.com/inertiajs/inertia/pull/2320
* Bump vite from 5.4.18 to 5.4.19 by [@dependabot](https://github.com/dependabot) in https://github.com/inertiajs/inertia/pull/2334
* On back button, fetch from server if version hash is not current by [@joetannenbaum](https://github.com/joetannenbaum) in https://github.com/inertiajs/inertia/pull/2342
* Allow custom URL protocols by [@mpociot](https://github.com/mpociot) in https://github.com/inertiajs/inertia/pull/2329

### New Contributors

* [@flexponsive](https://github.com/flexponsive) made their first contribution in https://github.com/inertiajs/inertia/pull/2316
* [@CTOJoe](https://github.com/CTOJoe) made their first contribution in https://github.com/inertiajs/inertia/pull/2320

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.0.8...v2.0.9

## [v2.0.8](https://github.com/inertiajs/inertia/compare/v2.0.7...v2.0.8) - 2025-04-10

### What's Changed

* Add deepMerge Support for Merging Nested Arrays and Objects in Props by [@HichemTab-tech](https://github.com/HichemTab-tech) in https://github.com/inertiajs/inertia/pull/2069
* fix: build error because of invalid type definitions by [@fxnm](https://github.com/fxnm) in https://github.com/inertiajs/inertia/pull/2301
* fix(vue/useForm/defaults): untrack before assign by [@Dsaquel](https://github.com/Dsaquel) in https://github.com/inertiajs/inertia/pull/2112
* Improve type checking of request data by [@7nohe](https://github.com/7nohe) in https://github.com/inertiajs/inertia/pull/2304
* Remove empty payload from GET requests by [@edgars-vasiljevs](https://github.com/edgars-vasiljevs) in https://github.com/inertiajs/inertia/pull/2305

### New Contributors

* [@HichemTab-tech](https://github.com/HichemTab-tech) made their first contribution in https://github.com/inertiajs/inertia/pull/2069
* [@fxnm](https://github.com/fxnm) made their first contribution in https://github.com/inertiajs/inertia/pull/2301
* [@Dsaquel](https://github.com/Dsaquel) made their first contribution in https://github.com/inertiajs/inertia/pull/2112

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.0.7...v2.0.8

## [v2.0.7](https://github.com/inertiajs/inertia/compare/v2.0.6...v2.0.7) - 2025-04-08

### What's Changed

* Added missing pages to React and Svelte5 playrounds by [@Verox001](https://github.com/Verox001) in https://github.com/inertiajs/inertia/pull/2217
* chore: replace lodash to decrease bundle size by [@lcdss](https://github.com/lcdss) in https://github.com/inertiajs/inertia/pull/2210
* do not pass url when storing scroll state to history by [@miDeb](https://github.com/miDeb) in https://github.com/inertiajs/inertia/pull/2280
* fix: react `Deferred` component error on partial visits by [@KaioFelps](https://github.com/KaioFelps) in https://github.com/inertiajs/inertia/pull/2223
* Bump vite from 5.4.16 to 5.4.17 by [@dependabot](https://github.com/dependabot) in https://github.com/inertiajs/inertia/pull/2295
* [2.x] SSR clustering by [@RobertBoes](https://github.com/RobertBoes) in https://github.com/inertiajs/inertia/pull/2206
* Allow Object type for href prop by [@nckrtl](https://github.com/nckrtl) in https://github.com/inertiajs/inertia/pull/2292
* Update GitHub Actions to Ubuntu 24.04 by [@joetannenbaum](https://github.com/joetannenbaum) in https://github.com/inertiajs/inertia/pull/2299
* [2.x]: Support for nested paths in forms by [@joaopalopes24](https://github.com/joaopalopes24) in https://github.com/inertiajs/inertia/pull/2181

### New Contributors

* [@Verox001](https://github.com/Verox001) made their first contribution in https://github.com/inertiajs/inertia/pull/2217
* [@lcdss](https://github.com/lcdss) made their first contribution in https://github.com/inertiajs/inertia/pull/2210
* [@miDeb](https://github.com/miDeb) made their first contribution in https://github.com/inertiajs/inertia/pull/2280
* [@KaioFelps](https://github.com/KaioFelps) made their first contribution in https://github.com/inertiajs/inertia/pull/2223
* [@nckrtl](https://github.com/nckrtl) made their first contribution in https://github.com/inertiajs/inertia/pull/2292
* [@joaopalopes24](https://github.com/joaopalopes24) made their first contribution in https://github.com/inertiajs/inertia/pull/2181

**Full Changelog**: https://github.com/inertiajs/inertia/compare/v2.0.6...v2.0.7

## [v2.0.6](https://github.com/inertiajs/inertia/compare/v2.0.5...v2.0.6)

- Deferred: More descriptive Deferred data prop error ([#2284](https://github.com/inertiajs/inertia/pull/2284))
- Bump vite from 5.4.12 to 5.4.16 ([#2288](https://github.com/inertiajs/inertia/pull/2288))
- Fix location return history decryption throwing error ([#2282](https://github.com/inertiajs/inertia/pull/2282))
- Make isDirty reactive to defaults ([#2236](https://github.com/inertiajs/inertia/pull/2236))
- Fix playground WhenVisible always ([#2203](https://github.com/inertiajs/inertia/pull/2203))
- Wayfinder support ([#2290](https://github.com/inertiajs/inertia/pull/2290))

## [v2.0.5](https://github.com/inertiajs/inertia/compare/v2.0.4...v2.0.5)

- Fix history state errors by nicholaspufal ([#2265](https://github.com/inertiajs/inertia/pull/2265))
- Bump axios from 1.7.9 to 1.8.2 ([#2269](https://github.com/inertiajs/inertia/pull/2269))
- Bump esbuild from 0.16.17 to 0.25.0 #2231 ([#2231](https://github.com/inertiajs/inertia/pull/2231))
- Bump vite from 5.4.11 to 5.4.12 ([#2201](https://github.com/inertiajs/inertia/pull/2201))

## [v2.0.4](https://github.com/inertiajs/inertia/compare/v2.0.3...v2.0.4)

- Fix anchor links on initial visits ([#2258](https://github.com/inertiajs/inertia/pull/2258))

## [v2.0.3](https://github.com/inertiajs/inertia/compare/v2.0.2...v2.0.3)

- Fix: Reload on mount ([#2200](https://github.com/inertiajs/inertia/pull/2200))

## [v2.0.2](https://github.com/inertiajs/inertia/compare/v2.0.1...v2.0.2)

- Fix SSR with scroll restoration ([#2190](https://github.com/inertiajs/inertia/pull/2190))
- Fix for scroll + back bug ([#2191](https://github.com/inertiajs/inertia/pull/2191))
- Backport 1.x fixes from [v1.3.0](https://github.com/inertiajs/inertia/releases/tag/v1.3.0) release ([#2193](https://github.com/inertiajs/inertia/pull/2193))

## [v2.0.1](https://github.com/inertiajs/inertia/compare/v2.0.0...v2.0.1)

- Fix playground dependencies ([#2070](https://github.com/inertiajs/inertia/pull/2070))
- Removed Vitest tests + dependencies ([#2175](https://github.com/inertiajs/inertia/pull/2175))
- Augment `vue` instead of `@vue/runtime-core` ([#2099](https://github.com/inertiajs/inertia/pull/2099))
- Fix prefetch missing `cacheFor` default value ([#2136](https://github.com/inertiajs/inertia/pull/2136))
- Fix `useForm` re-renders by memoizing functions in React [#2146](https://github.com/inertiajs/inertia/pull/2146)
- WhenVisible useEffect function is not recreated when params change. ([#2153](https://github.com/inertiajs/inertia/pull/2153))
- Ensure callback execution ([#2163](https://github.com/inertiajs/inertia/pull/2163))
- More resilient logic for stripping the origin from page URLs ([#2164](https://github.com/inertiajs/inertia/pull/2164))
- Add helper scripts for running tests ([#2173](https://github.com/inertiajs/inertia/pull/2173))
- Export `InertiaFormProps` in React ([#2161](https://github.com/inertiajs/inertia/pull/2161))
- Use default empty object in `useForm` Vue and Svelte ([#2052](https://github.com/inertiajs/inertia/pull/2052))
- Remove `data` option from `useForm` options type ([#2060](https://github.com/inertiajs/inertia/pull/2060))
- Take over scroll restoration from browser ([#2051](https://github.com/inertiajs/inertia/pull/2051))

## [v2.0.0](https://github.com/inertiajs/inertia/compare/v1.2.0...v2.0.0)

### Added

- Add polling
- Add link prefetching
- Add deferred props
- Add lazy loading of data when scrolling
- Add history encryption API
- Add React 19 support ([#2131](https://github.com/inertiajs/inertia/pull/2131))
- Add client side visits ([#2130](https://github.com/inertiajs/inertia/pull/2130))

### Changed

- Removal of NProgress dependency ([#2045](https://github.com/inertiajs/inertia/pull/2045))
- Change TypeScript module resolution in the Svelte adapter ([#2035](https://github.com/inertiajs/inertia/pull/2035))
- Refactor `createInertiaApp` in Svelte adapter ([#2036](https://github.com/inertiajs/inertia/pull/2036))

### Fixed

- Fix: make Link href prop reactive ([#2089](https://github.com/inertiajs/inertia/pull/2089))

## [v1.3.0](https://github.com/inertiajs/inertia/compare/v1.2.0...v1.3.0)

### Added

- Add React 19 support ([#2121](https://github.com/inertiajs/inertia/pull/2121))
- Add Svelte 5 support ([#1970](https://github.com/inertiajs/inertia/pull/1970))
- Add TypeScript support to Svelte adapter ([#1866](https://github.com/inertiajs/inertia/pull/1866), [69292e](https://github.com/inertiajs/inertia/commit/69292ef3592ccca5e0f05f7ce131a53f6c1ba22b), [#2003](https://github.com/inertiajs/inertia/pull/2003), [#2005](https://github.com/inertiajs/inertia/pull/2005))

### Changed

- Skip intercepting non-left button clicks on links ([#1908](https://github.com/inertiajs/inertia/pull/1908), [#1910](https://github.com/inertiajs/inertia/pull/1910))
- Changed `preserveScroll` to be `true` on initial page visit ([#1360](https://github.com/inertiajs/inertia/pull/1360))
- Return early when using `router.on()` during SSR ([#1715](https://github.com/inertiajs/inertia/pull/1715))
- Use updater function in `setData` in `useForm` hook in React adapter ([#1859](https://github.com/inertiajs/inertia/pull/1859))

### Fixed

- Fix history navigation issue on Chrome iOS ([#1984](https://github.com/inertiajs/inertia/pull/1984), [#1992](https://github.com/inertiajs/inertia/pull/1992))
- Fix `setNavigationType` for Safari 10 ([#1957](https://github.com/inertiajs/inertia/pull/1957))
- Export `InertiaFormProps` in all adapters ([#1596](https://github.com/inertiajs/inertia/pull/1596), [#1734](https://github.com/inertiajs/inertia/pull/1734))
- Fix `isDirty` after `form.defaults()` call in Vue 3 ([#1985](https://github.com/inertiajs/inertia/pull/1985))
- Fix scroll reset on page navigation ([#1980](https://github.com/inertiajs/inertia/pull/1980))
- Fix scroll position restoration for `[scroll-region]` elements ([#1782](https://github.com/inertiajs/inertia/pull/1782), [#1980](https://github.com/inertiajs/inertia/pull/1980))
- Fix `useForm` re-renders by memoizing functions in React adapter ([#1607](https://github.com/inertiajs/inertia/pull/1607))
- Fix doubling hash when using `<React.StrictMode>` ([#1728](https://github.com/inertiajs/inertia/pull/1728))
- Fix type augmentation in Vue 3 adapter ([#1958](https://github.com/inertiajs/inertia/pull/1958))
- Fix form helper `transform` return type in React adapter ([#1896](https://github.com/inertiajs/inertia/pull/1896))
- Fix props reactivity in Svelte adapter ([#1969](https://github.com/inertiajs/inertia/pull/1969))
- Fix `<Render />` component to respect `preserveState` option in Svelte adapter ([#1943](https://github.com/inertiajs/inertia/pull/1943))
- Fix 'received an unexpected slot "default"' warning in Svelte adapter ([#1941](https://github.com/inertiajs/inertia/pull/1941))
- Fix command + click behavior on links in React adapter ([#2132](https://github.com/inertiajs/inertia/pull/2132))
- Fix import in Svelte adapter ([#2002](https://github.com/inertiajs/inertia/pull/2002))

## [v1.2.0](https://github.com/inertiajs/inertia/compare/v1.1.0...v1.2.0)

- Fix `preserveScroll` and `preserveState` types ([#1882](https://github.com/inertiajs/inertia/pull/1882))
- Revert "merge props from partial reloads" ([#1895](https://github.com/inertiajs/inertia/pull/1895))

## [v1.1.0](https://github.com/inertiajs/inertia/compare/v1.0.16...v1.1.0)

- Add new `except` visit option to exclude props from partial reloads ([#1876](https://github.com/inertiajs/inertia/pull/1876))
- Deep merge props from partial reloads ([#1877](https://github.com/inertiajs/inertia/pull/1877))

## [v1.0.16](https://github.com/inertiajs/inertia/compare/v1.0.15...v1.0.16)

- Fix Svelte 4 slot rendering issues ([#1763](https://github.com/inertiajs/inertia/pull/1763))
- Fix accessibility warning in Svelte `Link` component ([#1858](https://github.com/inertiajs/inertia/pull/1858))
- Use `Omit` instead of `Exclude` in router types ([#1857](https://github.com/inertiajs/inertia/pull/1857))

## [v1.0.15](https://github.com/inertiajs/inertia/compare/v1.0.14...v1.0.15)

- Bump axios from `v1.4.0` to `v1.6.0` ([#1723](https://github.com/inertiajs/inertia/pull/1723))

## [v1.0.14](https://github.com/inertiajs/inertia/compare/v1.0.13...v1.0.14)

- Revert "Clear errors on form reset (#1568)" ([#1716](https://github.com/inertiajs/inertia/pull/1716))

## [v1.0.13](https://github.com/inertiajs/inertia/compare/v1.0.12...v1.0.13)

- Clear errors on form reset ([#1568](https://github.com/inertiajs/inertia/pull/1568))
- Fix `Link` type in React ([#1659](https://github.com/inertiajs/inertia/pull/1659))

## [v1.0.12](https://github.com/inertiajs/inertia/compare/v1.0.11...v1.0.12)

- Fix type of `onClick` for `Link` component in React and Vue ([#1699](https://github.com/inertiajs/inertia/pull/1699), [#1701](https://github.com/inertiajs/inertia/pull/1701))

## [v1.0.11](https://github.com/inertiajs/inertia/compare/v1.0.10...v1.0.11)

- Fix form helper types for `setDefaults()` method (React) and `defaults()` method (Vue) ([#1504](https://github.com/inertiajs/inertia/pull/1504))
- Fix interface issue with `useForm()` in React and Vue adapters ([#1649](https://github.com/inertiajs/inertia/pull/1649))

## [v1.0.10](https://github.com/inertiajs/inertia/compare/v1.0.9...v1.0.10)

- Fix Svelte's `useForm` helper ([#1610](https://github.com/inertiajs/inertia/pull/1610))

## [v1.0.9](https://github.com/inertiajs/inertia/compare/v1.0.8...v1.0.9)

- Fix `<Head>` vNode handling in Vue 3 adapter ([#1590](https://github.com/inertiajs/inertia/pull/1590))
- Add Svelte 4 support ([60699c7](https://github.com/inertiajs/inertia/commit/60699c7c5978eebd393e0333b567d8e465f4b58f))

## [v1.0.8](https://github.com/inertiajs/inertia/compare/v1.0.7...v1.0.8)

### Fixed

- Fix `<Head>` vNode handling in Vue 3 adapter ([#1570](https://github.com/inertiajs/inertia/pull/1570))
- Fix watching remembered data in Vue 3 adapter ([#1571](https://github.com/inertiajs/inertia/pull/1571))

## [v1.0.7](https://github.com/inertiajs/inertia/compare/v1.0.6...v1.0.7)

### Fixed

- Fix `<Head>` fragment detection in Vue 3 adapter ([#1509](https://github.com/inertiajs/inertia/pull/1509))

## [v1.0.6](https://github.com/inertiajs/inertia/compare/v1.0.5...v1.0.6)

### Fixed

- Fix `usePage()` null object error in Vue 3 adapter ([#1530](https://github.com/inertiajs/inertia/pull/1530))

## [v1.0.5](https://github.com/inertiajs/inertia/compare/v1.0.4...v1.0.5)

### Fixed

- Fix `usePage()` reactivity in Vue 2 adapter ([#1527](https://github.com/inertiajs/inertia/pull/1527))

### Changed

- Simplify the Vue 2 form helper ([#1529](https://github.com/inertiajs/inertia/pull/1529))

## [v1.0.4](https://github.com/inertiajs/inertia/compare/v1.0.3...v1.0.4)

### Added

- Added `displayName` to `Link` component in React adapter ([#1512](https://github.com/inertiajs/inertia/pull/1512))

### Fixed

- Fix `usePage()` reactivity in Vue 3 adapter ([#1469](https://github.com/inertiajs/inertia/pull/1469))

## [v1.0.3](https://github.com/inertiajs/inertia/compare/v1.0.2...v1.0.3)

### Added

- Added initialization callback to form helper in Vue adapters ([#1516](https://github.com/inertiajs/inertia/pull/1516))

## [v1.0.2](https://github.com/inertiajs/inertia/compare/v1.0.1...v1.0.2)

### Fixed

- Added explicit children to `InertiaHeadProps` ([#1448](https://github.com/inertiajs/inertia/pull/1448))
- Exported `InertiaLinkProps` type ([#1450](https://github.com/inertiajs/inertia/pull/1450))
- Improved React `usePage` generic type ([#1451](https://github.com/inertiajs/inertia/pull/1451))

## [v1.0.1](https://github.com/inertiajs/inertia/compare/v1.0.0...v1.0.1)

### Fixed

- Fixed Vue type overrides for `$page` and `$inertia` ([#1393](https://github.com/inertiajs/inertia/pull/1393))
- Restored React `usePage` generic type ([#1396](https://github.com/inertiajs/inertia/pull/1396))
- Prevented need to use `Method` enum with the Link component ([#1392](https://github.com/inertiajs/inertia/pull/1392))
- Restored Vue 3 `usePage` generic type ([#1394](https://github.com/inertiajs/inertia/pull/1394))
- Fixed export of server types ([#1397](https://github.com/inertiajs/inertia/pull/1397))
- Updated form types to support nested data ([#1401](https://github.com/inertiajs/inertia/pull/1401))
- Allowed stronger type support with Vue `useForm` ([#1413](https://github.com/inertiajs/inertia/pull/1413))
- Fixed Vue 2 `setup` prop types ([#1418](https://github.com/inertiajs/inertia/pull/1418))
- Fixed issue when passing multiple children to React `Head` component ([#1433](https://github.com/inertiajs/inertia/pull/1433))

## [v1.0.0](https://github.com/inertiajs/inertia/compare/7ce91ec...v1.0.0) - 2023-01-14

### Added

- Added SSR support to Svelte library ([#1349](https://github.com/inertiajs/inertia/pull/1349))
- Added first-class TypeScript support to React adapter
- Added first-class TypeScript support to Vue 2 adapter
- Added first-class TypeScript support to Vue 3 adapter
- Added new `useForm()` hook to Vue 2 adapter ([ff59196](https://github.com/inertiajs/inertia/commit/ff59196))

### Changed

- Renamed `@inertiajs/inertia` library to `@inertiajs/core` ([#1282](https://github.com/inertiajs/inertia/pull/1282))
- Renamed `@inertiajs/inertia-react` library to `@inertiajs/react` ([#1282](https://github.com/inertiajs/inertia/pull/1282))
- Renamed `@inertiajs/inertia-svelte` library to `@inertiajs/svelte` ([#1282](https://github.com/inertiajs/inertia/pull/1282))
- Renamed `@inertiajs/inertia-vue` library to `@inertiajs/vue2` ([#1282](https://github.com/inertiajs/inertia/pull/1282))
- Renamed `@inertiajs/inertia-vue3` library to `@inertiajs/vue3` ([#1282](https://github.com/inertiajs/inertia/pull/1282))
- Merged progress library to core and deprecated `@inertiajs/progress` library ([#1282](https://github.com/inertiajs/inertia/pull/1282), [0b5f773](https://github.com/inertiajs/inertia/commit/0b5f773))
- Merged server library to core and deprecated `@inertiajs/server` library ([#1282](https://github.com/inertiajs/inertia/pull/1282))
- Renamed `Inertia` named export to `router` ([#1282](https://github.com/inertiajs/inertia/pull/1282), [e556703](https://github.com/inertiajs/inertia/commit/e556703))
- Removed deprecated named exports ([#1282](https://github.com/inertiajs/inertia/pull/1282), [e556703](https://github.com/inertiajs/inertia/commit/e556703))
- Removed deprecated `app` argument from `createInertiaApp()` in Vue adapters ([#1282](https://github.com/inertiajs/inertia/pull/1282), [65f8a5f](https://github.com/inertiajs/inertia/commit/65f8a5f))
- Updated axios to 1.x ([#1377](https://github.com/inertiajs/inertia/pull/1377))
- Simplified `usePage()` hook in Vue 3 adapter ([#1373](https://github.com/inertiajs/inertia/pull/1373))
- Improved Svelte `use:inertia` and `<Link />` component ([#1344](https://github.com/inertiajs/inertia/pull/1344))
- Removed global `visitOptions()` hook ([#1282](https://github.com/inertiajs/inertia/pull/1282), [30908c2](https://github.com/inertiajs/inertia/commit/30908c2))
- Switched bundler from Microbundle to ESbuild ([f711b46](https://github.com/inertiajs/inertia/commit/f711b46), [8093713](https://github.com/inertiajs/inertia/commit/8093713), [342312d](https://github.com/inertiajs/inertia/commit/342312d), [c9e12b3](https://github.com/inertiajs/inertia/commit/c9e12b3))

### Fixed

- Fixed `<title>` tag not always being included when a `title` callback is defined in `createInertiaApp()` ([#1055](https://github.com/inertiajs/inertia/pull/1055))
- Fixed types to include `undefined` as a valid `FormDataConvertable` option ([#1165](https://github.com/inertiajs/inertia/pull/1165))
- Fixed issue where remembered state wasn't clear on a full page reload ([769f643](https://github.com/inertiajs/inertia/commit/769f643))


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing

Thank you for your interest in contributing to Inertia.js! Your contributions help make this project better for everyone.

Inertia.js is maintained as a monorepo using [pnpm workspaces](https://pnpm.io/workspaces). Below you'll find an overview of the repository and how to get your development environment running.

> **Note:** You'll need **pnpm version 10 or higher**. If you're unsure which version you have, run `pnpm -v`.

## Repository Overview

```
inertia/
├── packages/          Core libraries and framework adapters
│   ├── core/          Framework-agnostic core library
│   ├── react/         React adapter
│   │   └── test-app/  React test application
│   ├── svelte/        Svelte adapter
│   │   └── test-app/  Svelte test application
│   └── vue3/          Vue 3 adapter
│       └── test-app/  Vue 3 test application
├── playgrounds/       Full Laravel applications for manual testing
│   ├── react/         Laravel + React
│   ├── svelte4/       Laravel + Svelte 4
│   ├── svelte5/       Laravel + Svelte 5
│   └── vue3/          Laravel + Vue 3
└── tests/             End-to-end tests and test server
    ├── app/           Shared Node.js backend
    └── *.spec.ts      Playwright test suite
```

### Key Components

- **Core Library:** The framework-agnostic engine powering all adapters (`packages/core`).
- **Adapters:** Framework-specific integrations for React, Svelte, and Vue.
- **Test Applications:** Minimal frontend apps used for automated testing (`packages/*/test-app/`).
- **Playwright Tests:** Framework-agnostic end-to-end tests that verify behavior across adapters (`tests/*.spec.ts`).
- **Playgrounds:** Full Laravel applications for manual testing (`playgrounds/`). These are optional and may eventually be removed.

## Getting Started

Clone the repository and install the dependencies:

```sh
git clone https://github.com/inertiajs/inertia.git inertia
cd inertia
pnpm install
```

Then, start the development environment:

```sh
pnpm dev
```

This builds the core library and all adapters, and starts a file watcher that will automatically rebuild each package when changes are made.

If you prefer, you can also start individual watchers from each package directory. For example:

```sh
cd packages/core && pnpm dev
cd packages/react && pnpm dev
```

> **Note:** The core package (`packages/core`) must always be running, as all adapters depend on it.

## Running Tests

Inertia.js uses Playwright to run a shared end-to-end test suite against each adapter. This is how we verify that Inertia behaves the same across React, Svelte, and Vue.

Run the test suite for a specific adapter:

```sh
pnpm test:react
pnpm test:svelte
pnpm test:vue
```

These commands automatically set a `PACKAGE` environment variable that tells the Node.js test server which adapter to serve. For example, when running `pnpm test:react`, the test server loads the React test application.

If you want to run Playwright directly, you can pass the environment variable yourself:

```sh
PACKAGE=react playwright test
```

You may filter tests by name:

```sh
pnpm test:react -g "partial reload"
```

Run tests in headed mode (to see the browser):

```sh
pnpm test:vue --headed
```

Or in debug mode:

```sh
pnpm test:vue --debug
```

### How the Test Setup Works

All adapters use the same Node.js backend and Playwright test suite. The only difference is which adapter's test app is served.

```
tests/app/server.js         Shared Node.js backend
├── serves: react test app  (when PACKAGE=react)
├── serves: svelte test app (when PACKAGE=svelte)
└── serves: vue test app    (when PACKAGE=vue3)

tests/*.spec.ts             Shared Playwright test suite
```

When running a test command, the correct adapter is selected automatically:

| Adapter | `PACKAGE` value | Test server port | App URL                                            |
| ------- | --------------- | ---------------- | -------------------------------------------------- |
| React   | `react`         | 13716            | [http://localhost:13716/](http://localhost:13716/) |
| Svelte  | `svelte`        | 13717            | [http://localhost:13717/](http://localhost:13717/) |
| Vue 3   | `vue3`          | 13715            | [http://localhost:13715/](http://localhost:13715/) |

### Automatic Test Server Boot

You do not need to start the test server manually. When you run a test, Playwright automatically builds the frontend for the selected adapter and boots the Node.js test server before running the tests. This is configured in the Playwright config (`playwright.config.ts`) using the [`webServer`](https://playwright.dev/docs/test-configuration#webserver) option. If a server is already running (for example, during local development), Playwright will reuse it.

## Running Test Applications

The test applications are the primary development environments for Inertia.js. These minimal apps cover all supported features and are used for both manual development and automated end-to-end testing.

Run all test apps at once:

```sh
pnpm dev:test-app
```

Or start an individual one:

```sh
pnpm dev:test-app:react
pnpm dev:test-app:svelte
pnpm dev:test-app:vue
```

Each test app runs two servers:

- A Node.js backend that automatically restarts when changed
- A Vite development server for the frontend

If you are developing a new feature or fixing a bug, you can use these test apps to develop and test your changes.

## Adding Tests

If you are fixing a bug, adding a feature, or improving existing functionality, please verify that your changes work across all adapters, not just one.

### 1. Add Frontend Pages

Create the same frontend page in each test application:

```
packages/react/test-app/Pages/YourFeature.jsx
packages/svelte/test-app/Pages/YourFeature.svelte
packages/vue3/test-app/Pages/YourFeature.vue
```

Each page should provide the same behavior and functionality.

### 2. Add Backend Routes (If Needed)

If your change requires a backend route, add it to the shared Node.js test server:

```javascript
// tests/app/server.js
app.get('/your-feature', (req, res) =>
  inertia.render(req, res, {
    component: 'YourFeature',
    props: { foo: 'bar' },
  }),
)
```

### 3. Write a Playwright Test

Add a new Playwright test to verify your change. Playwright allows us to test features across all adapters without duplicating test logic.

```typescript
// tests/your-feature.spec.ts
import { test, expect } from '@playwright/test'

test('your feature works', async ({ page }) => {
  await page.goto('/your-feature')
  // Your assertions here
})
```

### 4. Run the Tests in All Adapters

Be sure to run your test for each adapter:

```sh
pnpm test:react -g "your feature"
pnpm test:svelte -g "your feature"
pnpm test:vue -g "your feature"
```

Your work is not considered complete until it works consistently across all frameworks.

## Using the Playgrounds (Optional)

The repository also includes several full Laravel applications that integrate Inertia.js. These are optional and mostly useful for manually exploring how Inertia works inside a real Laravel app.

The playgrounds are provided as-is and are not part of the automated test setup. They may be removed in the future.

### Getting Started

To start a playground, simply run:

```sh
pnpm playground:react
```

The playground script will automatically handle initial setup if needed:
- Installing PHP dependencies via Composer
- Installing Node.js dependencies via pnpm
- Creating the `.env` file from `.env.example`
- Generating the application key
- Setting up the SQLite database
- Running migrations with seed data

Visit the application at [http://127.0.0.1:8000](http://127.0.0.1:8000).

Each playground has its own pnpm script:

```sh
pnpm playground:react
pnpm playground:svelte4
pnpm playground:svelte5
pnpm playground:vue
```

## Publishing (Maintainers Only)

Releasing is handled by the included release script. You'll need both the `git` CLI and the GitHub CLI ([`gh`](https://cli.github.com)) installed. To create a new release:

```sh
./release.sh
```

The script will:
- Ensure you're on the master branch with a clean working tree
- Prompt you to select the type of version bump (patch, minor, or major)
- Update all package versions automatically
- Update the lockfile
- Create a git commit and tag
- Push changes and tags to GitHub
- Create a GitHub release with auto-generated notes
- Trigger the CI publishing workflow

Publishing is handled securely using GitHub + npm [trusted publishing](https://docs.npmjs.com/trusted-publishers).


================================================
FILE: LICENSE.md
================================================
MIT License

Copyright (c) Jonathan Reinink <jonathan@reinink.ca>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: README.md
================================================
[![Inertia.js](https://raw.githubusercontent.com/inertiajs/inertia/master/.github/LOGO.png)](https://inertiajs.com/)

Inertia.js lets you quickly build modern single-page React, Vue and Svelte apps using classic server-side routing and controllers. Find full documentation at [inertiajs.com](https://inertiajs.com/).

## Contributing

Thank you for considering contributing to Inertia! You can read the contribution guide [here](CONTRIBUTING.md).

## Code of Conduct

In order to ensure that the Laravel community is welcoming to all, please review and abide by the [Code of Conduct](https://laravel.com/docs/contributions#code-of-conduct).

## Security Vulnerabilities

Please review [our security policy](https://github.com/inertiajs/inertia/security/policy) on how to report security vulnerabilities.

## License

Inertia is open-sourced software licensed under the [MIT license](LICENSE.md).


================================================
FILE: package.json
================================================
{
  "name": "inertia",
  "private": true,
  "type": "module",
  "scripts": {
    "build:all": "pnpm -r --filter './packages/*' build",
    "dev": "pnpx concurrently -c \"#b794f4,#61dafb,#d43008,#32a06f\" \"pnpm dev:core\" \"pnpm dev:react\" \"pnpm dev:svelte\" \"pnpm dev:vue\" --names=core,react,svelte,vue",
    "dev:core": "cd packages/core && pnpm run dev",
    "dev:vue": "cd packages/vue3 && pnpm run dev",
    "dev:react": "cd packages/react && pnpm run dev",
    "dev:svelte": "cd packages/svelte && pnpm run dev",
    "dev:test-app": "pnpx concurrently -c \"#61dafb,#d43008,#32a06f\" \"pnpm dev:test-app:react\" \"pnpm dev:test-app:svelte\" \"pnpm dev:test-app:vue\" --names=react,svelte,vue",
    "dev:test-app:react": "pnpx concurrently -c \"#c4b5fd,#ffa800\" \"cd tests/app && PACKAGE=react pnpm serve:watch\" \"cd packages/react/test-app && pnpm run dev\" --names=server,vite",
    "dev:test-app:svelte": "pnpx concurrently -c \"#c4b5fd,#ffa800\" \"cd tests/app && PACKAGE=svelte pnpm serve:watch\" \"cd packages/svelte/test-app && pnpm run dev\" --names=server,vite",
    "dev:test-app:vue": "pnpx concurrently -c \"#c4b5fd,#ffa800\" \"cd tests/app && PACKAGE=vue3 pnpm serve:watch\" \"cd packages/vue3/test-app && pnpm run dev\" --names=server,vite",
    "es2020-check": "pnpm -r --filter './packages/*' es2020-check",
    "lint:test-app": "pnpm -r --filter './packages/*/test-app' lint",
    "lint:test-app:react": "cd packages/react/test-app && pnpm run lint",
    "lint:test-app:svelte": "cd packages/svelte/test-app && pnpm run lint",
    "lint:test-app:vue": "cd packages/vue3/test-app && pnpm run lint",
    "type-check:test-app": "pnpm -r --filter './packages/*/test-app' type-check",
    "type-check:test-app:react": "cd packages/react/test-app && pnpm run type-check",
    "type-check:test-app:svelte": "cd packages/svelte/test-app && pnpm run type-check",
    "type-check:test-app:vue": "cd packages/vue3/test-app && pnpm run type-check",
    "test:react": "PACKAGE=react node playwright.js",
    "test:svelte": "PACKAGE=svelte node playwright.js",
    "test:vue": "PACKAGE=vue3 node playwright.js",
    "test:ssr:react": "PACKAGE=react SSR=true npx playwright test",
    "test:ssr:svelte": "PACKAGE=svelte SSR=true npx playwright test",
    "test:ssr:vue": "PACKAGE=vue3 SSR=true npx playwright test",
    "playground:react": "cd playgrounds/react && ./init.sh && composer run dev",
    "playground:svelte4": "cd playgrounds/svelte4 && ./init.sh && composer run dev",
    "playground:svelte5": "cd playgrounds/svelte5 && ./init.sh && composer run dev",
    "playground:vue": "cd playgrounds/vue3 && ./init.sh && composer run dev",
    "format": "prettier --write ."
  },
  "dependencies": {
    "@playwright/test": "^1.58.2",
    "prettier": "^3.8.1",
    "prettier-plugin-organize-imports": "^4.3.0",
    "prettier-plugin-svelte": "^3.5.0",
    "prettier-plugin-tailwindcss": "^0.7.2"
  },
  "optionalDependencies": {
    "@rollup/rollup-linux-x64-gnu": "^4.59.0"
  },
  "pnpm": {
    "overrides": {
      "cookie": ">=0.7.0",
      "esbuild": ">=0.25.0"
    }
  }
}


================================================
FILE: packages/core/.gitignore
================================================
dist
types
node_modules
package-lock.json
yarn.lock


================================================
FILE: packages/core/LICENSE
================================================
MIT License

Copyright (c) Jonathan Reinink <jonathan@reinink.ca>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: packages/core/build.js
================================================
#!/usr/bin/env node
import esbuild from 'esbuild'
import { nodeExternalsPlugin } from 'esbuild-node-externals'

const watch = process.argv.slice(1).includes('--watch')
const withDeps = process.argv.slice(1).includes('--with-deps')

const config = {
  bundle: true,
  minify: false,
  sourcemap: withDeps ? false : true,
  target: 'es2020',
  plugins: [
    ...(withDeps ? [] : [nodeExternalsPlugin()]),
    {
      name: 'inertia',
      setup(build) {
        let count = 0
        build.onEnd((result) => {
          if (count++ !== 0) {
            console.log(`Rebuilding ${build.initialOptions.entryPoints} (${build.initialOptions.format})…`)
          }
        })
      },
    },
  ],
}

const builds = [
  { entryPoints: ['src/index.ts'], format: 'esm', outfile: 'dist/index.esm.js', platform: 'browser' },
  { entryPoints: ['src/index.ts'], format: 'cjs', outfile: 'dist/index.js', platform: 'browser' },
  { entryPoints: ['src/server.ts'], format: 'esm', outfile: 'dist/server.esm.js', platform: 'node' },
  { entryPoints: ['src/server.ts'], format: 'cjs', outfile: 'dist/server.js', platform: 'node' },
]

builds.forEach(async (build) => {
  const context = await esbuild.context({ ...config, ...build })

  if (watch) {
    console.log(`Watching ${build.entryPoints} (${build.format})…`)
    await context.watch()
  } else {
    await context.rebuild()
    context.dispose()
    console.log(`Built ${build.entryPoints} (${build.format}) ${withDeps ? '(with-deps)' : ''}…`)
  }
})


================================================
FILE: packages/core/package.json
================================================
{
  "name": "@inertiajs/core",
  "version": "2.3.18",
  "license": "MIT",
  "description": "A framework for creating server-driven single page apps.",
  "contributors": [
    "Jonathan Reinink <jonathan@reinink.ca>",
    "Claudio Dekker <claudio@ubient.net>",
    "Sebastian De Deyne <sebastiandedeyne@gmail.com>"
  ],
  "homepage": "https://inertiajs.com/",
  "repository": {
    "type": "git",
    "url": "https://github.com/inertiajs/inertia.git",
    "directory": "packages/inertia"
  },
  "bugs": {
    "url": "https://github.com/inertiajs/inertia/issues"
  },
  "files": [
    "dist",
    "types"
  ],
  "type": "module",
  "main": "dist/index.js",
  "types": "types/index.d.ts",
  "exports": {
    ".": {
      "types": "./types/index.d.ts",
      "import": "./dist/index.esm.js",
      "require": "./dist/index.js"
    },
    "./server": {
      "types": "./types/server.d.ts",
      "import": "./dist/server.esm.js",
      "require": "./dist/server.js"
    }
  },
  "typesVersions": {
    "*": {
      "server": [
        "types/server.d.ts"
      ]
    }
  },
  "scripts": {
    "build": "pnpm clean && ./build.js && tsc",
    "build:with-deps": "./build.js --with-deps",
    "clean": "rm -rf types && rm -rf dist",
    "dev": "pnpx concurrently -c \"#ffcf00,#3178c6\" \"pnpm dev:build\" \"pnpm dev:types\" --names build,types",
    "dev:build": "./build.js --watch",
    "dev:types": "tsc --watch --preserveWatchOutput",
    "es2020-check": "pnpm build:with-deps && es-check es2020 \"dist/index.esm.js\" --checkFeatures --module --noCache --verbose"
  },
  "dependencies": {
    "@types/lodash-es": "^4.17.12",
    "axios": "^1.13.5",
    "laravel-precognition": "^1.0.2",
    "lodash-es": "^4.17.23",
    "qs": "^6.15.0"
  },
  "devDependencies": {
    "@types/node": "^18.19.130",
    "@types/qs": "^6.14.0",
    "es-check": "^9.6.1",
    "esbuild": "^0.27.3",
    "esbuild-node-externals": "^1.20.1",
    "typescript": "^5.9.3"
  }
}


================================================
FILE: packages/core/readme.md
================================================
# Inertia.js

Inertia.js lets you quickly build modern single-page React, Vue and Svelte apps using classic server-side routing and controllers.

Visit [inertiajs.com](https://inertiajs.com/) to learn more.


================================================
FILE: packages/core/src/config.ts
================================================
import { get, has, set } from 'lodash-es'
import { InertiaAppConfig } from './types'

// Generate all possible nested paths
type ConfigKeys<T> = T extends Function
  ? never
  : string extends keyof T
    ? string
    :
        | Extract<keyof T, string>
        | {
            [Key in Extract<keyof T, string>]: T[Key] extends object ? `${Key}.${ConfigKeys<T[Key]> & string}` : never
          }[Extract<keyof T, string>]

// Extract the value type at a given path
type ConfigValue<T, K extends ConfigKeys<T>> = K extends `${infer P}.${infer Rest}`
  ? P extends keyof T
    ? Rest extends ConfigKeys<T[P]>
      ? ConfigValue<T[P], Rest>
      : never
    : never
  : K extends keyof T
    ? T[K]
    : never

// Helper type for setting multiple config values with an object
type ConfigSetObject<T> = {
  [K in ConfigKeys<T>]?: ConfigValue<T, K>
}

type FirstLevelOptional<T> = {
  [K in keyof T]?: T[K] extends object ? { [P in keyof T[K]]?: T[K][P] } : T[K]
}

export class Config<TConfig extends {} = {}> {
  protected config: FirstLevelOptional<TConfig> = {}
  protected defaults: TConfig

  public constructor(defaults: TConfig) {
    this.defaults = defaults
  }

  public extend<TExtension extends {}>(defaults?: TExtension): Config<TConfig & TExtension> {
    if (defaults) {
      this.defaults = { ...this.defaults, ...defaults } as TConfig & TExtension
    }

    return this as unknown as Config<TConfig & TExtension>
  }

  public replace(newConfig: FirstLevelOptional<TConfig>): void {
    this.config = newConfig
  }

  public get<K extends ConfigKeys<TConfig>>(key: K): ConfigValue<TConfig, K> {
    return (has(this.config, key) ? get(this.config, key) : get(this.defaults, key)) as ConfigValue<TConfig, K>
  }

  public set<K extends ConfigKeys<TConfig>>(
    keyOrValues: K | Partial<ConfigSetObject<TConfig>>,
    value?: ConfigValue<TConfig, K>,
  ): void {
    if (typeof keyOrValues === 'string') {
      set(this.config, keyOrValues, value)
    } else {
      Object.entries(keyOrValues).forEach(([key, val]) => {
        set(this.config, key, val)
      })
    }
  }
}

export const config = new Config<InertiaAppConfig>({
  form: {
    recentlySuccessfulDuration: 2_000,
    forceIndicesArrayFormatInFormData: true,
    withAllErrors: false,
  },
  future: {
    preserveEqualProps: false,
    useDataInertiaHeadAttribute: false,
    useDialogForErrorModal: false,
    useScriptElementForInitialPage: false,
  },
  prefetch: {
    cacheFor: 30_000,
    hoverDelay: 75,
  },
})


================================================
FILE: packages/core/src/debounce.ts
================================================
export default function debounce<F extends (...params: any[]) => ReturnType<F>>(fn: F, delay: number): F {
  let timeoutID: NodeJS.Timeout
  return function (...args: unknown[]) {
    clearTimeout(timeoutID)
    timeoutID = setTimeout(() => fn.apply(this, args), delay)
  } as F
}


================================================
FILE: packages/core/src/debug.ts
================================================
export const stackTrace = (autolog = true) => {
  try {
    throw new Error()
  } catch (e) {
    const stack = (e as Error).stack

    if (!autolog) {
      return stack
    }

    console.log(stack)
  }
}


================================================
FILE: packages/core/src/dialog.ts
================================================
import modal from './modal'

export default {
  show(html: Record<string, unknown> | string): void {
    const { iframe, page } = modal.createIframeAndPage(html)

    iframe.style.boxSizing = 'border-box'
    iframe.style.display = 'block'

    const dialog = document.createElement('dialog')
    dialog.id = 'inertia-error-dialog'

    // Style the dialog to mimic 50px padding
    Object.assign(dialog.style, {
      width: 'calc(100vw - 100px)',
      height: 'calc(100vh - 100px)',
      padding: '0',
      margin: 'auto',
      border: 'none',
      backgroundColor: 'transparent',
    })

    // There's no way to directly style the backdrop of a dialog, so we need to use a style element...
    const dialogStyleElement = document.createElement('style')
    dialogStyleElement.textContent = `
      dialog#inertia-error-dialog::backdrop {
        background-color: rgba(0, 0, 0, 0.6);
      }

      dialog#inertia-error-dialog:focus {
        outline: none;
      }
    `
    document.head.appendChild(dialogStyleElement)

    dialog.addEventListener('click', (event: MouseEvent) => {
      if (event.target === dialog) {
        dialog.close()
      }
    })

    dialog.addEventListener('close', () => {
      dialogStyleElement.remove()
      dialog.remove()
    })

    dialog.appendChild(iframe)
    document.body.prepend(dialog)
    dialog.showModal()

    // Focus the dialog so the 'Escape' key works immediately
    dialog.focus()

    if (!iframe.contentWindow) {
      throw new Error('iframe not yet ready.')
    }

    iframe.contentWindow.document.open()
    iframe.contentWindow.document.write(page.outerHTML)
    iframe.contentWindow.document.close()
  },
}


================================================
FILE: packages/core/src/domUtils.ts
================================================
const elementInViewport = (el: HTMLElement) => {
  if (el.offsetParent === null) {
    // Element is not participating in layout (e.g., display: none)
    return false
  }

  const rect = el.getBoundingClientRect()

  // We check both vertically and horizontally for containers that scroll in either direction
  const verticallyVisible = rect.top < window.innerHeight && rect.bottom >= 0
  const horizontallyVisible = rect.left < window.innerWidth && rect.right >= 0

  return verticallyVisible && horizontallyVisible
}

export const getScrollableParent = (element: HTMLElement | null): HTMLElement | null => {
  const allowsVerticalScroll = (el: HTMLElement): boolean => {
    const computedStyle = window.getComputedStyle(el)

    if (['scroll', 'overlay'].includes(computedStyle.overflowY)) {
      return true
    }

    if (computedStyle.overflowY !== 'auto') {
      return false
    }

    if (['visible', 'clip'].includes(computedStyle.overflowX)) {
      return true
    }

    return hasDimensionConstraint(computedStyle.maxHeight, el.style.height) || isConstrainedByLayout(el, 'height')
  }

  const allowsHorizontalScroll = (el: HTMLElement): boolean => {
    const computedStyle = window.getComputedStyle(el)

    if (['scroll', 'overlay'].includes(computedStyle.overflowX)) {
      return true
    }

    if (computedStyle.overflowX !== 'auto') {
      return false
    }

    if (['visible', 'clip'].includes(computedStyle.overflowY)) {
      return true
    }

    return hasDimensionConstraint(computedStyle.maxWidth, el.style.width) || isConstrainedByLayout(el, 'width')
  }

  const hasDimensionConstraint = (computedMaxDimension: string, inlineStyleDimension: string): boolean => {
    if (computedMaxDimension && computedMaxDimension !== 'none' && computedMaxDimension !== '0px') {
      return true
    }

    if (inlineStyleDimension && inlineStyleDimension !== 'auto' && inlineStyleDimension !== '0') {
      return true
    }

    return false
  }

  // When overflow is set to 'auto' on one axis, the browser implicitly sets the other axis
  // to 'auto' as well (CSS spec), which causes the 'visible'/'clip' checks above to fail.
  // In flex/grid layouts, the element's size may be constrained by the parent layout rather
  // than explicit dimension properties, so we check for that here.
  const isConstrainedByLayout = (el: HTMLElement, dimension: 'height' | 'width'): boolean => {
    const parent = el.parentElement

    if (!parent) {
      return false
    }

    const parentStyle = window.getComputedStyle(parent)

    if (['flex', 'inline-flex'].includes(parentStyle.display)) {
      const isColumnLayout = ['column', 'column-reverse'].includes(parentStyle.flexDirection)
      return dimension === 'height' ? isColumnLayout : !isColumnLayout
    }

    return ['grid', 'inline-grid'].includes(parentStyle.display)
  }

  let parent = element?.parentElement

  while (parent) {
    const allowsScroll = allowsVerticalScroll(parent) || allowsHorizontalScroll(parent)

    if (window.getComputedStyle(parent).display !== 'contents' && allowsScroll) {
      return parent
    }

    parent = parent.parentElement
  }

  return null
}

export const getElementsInViewportFromCollection = (
  elements: HTMLElement[],
  referenceElement?: HTMLElement,
): HTMLElement[] => {
  if (!referenceElement) {
    return elements.filter((element) => elementInViewport(element))
  }

  const referenceIndex = elements.indexOf(referenceElement)
  const upwardElements: HTMLElement[] = []
  const downwardElements: HTMLElement[] = []

  // Traverse upwards until an element is not visible
  for (let i = referenceIndex; i >= 0; i--) {
    const element = elements[i]

    if (elementInViewport(element)) {
      upwardElements.push(element)
    } else {
      break
    }
  }

  // Traverse downwards until an element is not visible
  for (let i = referenceIndex + 1; i < elements.length; i++) {
    const element = elements[i]

    if (elementInViewport(element)) {
      downwardElements.push(element)
    } else {
      break
    }
  }

  // Reverse upward elements to maintain DOM order, then append downward elements
  return [...upwardElements.reverse(), ...downwardElements]
}

export const requestAnimationFrame = (cb: () => void, times: number = 1): void => {
  window.requestAnimationFrame(() => {
    if (times > 1) {
      requestAnimationFrame(cb, times - 1)
    } else {
      cb()
    }
  })
}

export const getInitialPageFromDOM = <T>(id: string, useScriptElement: boolean = false): T | null => {
  if (typeof window === 'undefined') {
    return null
  }

  if (!useScriptElement) {
    const el = document.getElementById(id)

    if (el?.dataset.page) {
      return JSON.parse(el.dataset.page)
    }
  }

  const scriptEl = document.querySelector(`script[data-page="${id}"][type="application/json"]`)

  if (scriptEl?.textContent) {
    return JSON.parse(scriptEl.textContent)
  }

  return null
}


================================================
FILE: packages/core/src/encryption.ts
================================================
import { SessionStorage } from './sessionStorage'

export const encryptHistory = async (data: any): Promise<ArrayBuffer> => {
  if (typeof window === 'undefined') {
    throw new Error('Unable to encrypt history')
  }

  const iv = getIv()
  const storedKey = await getKeyFromSessionStorage()
  const key = await getOrCreateKey(storedKey)

  if (!key) {
    throw new Error('Unable to encrypt history')
  }

  const encrypted = await encryptData(iv, key, data)

  return encrypted
}

export const historySessionStorageKeys = {
  key: 'historyKey',
  iv: 'historyIv',
}

export const decryptHistory = async (data: any): Promise<any> => {
  const iv = getIv()
  const storedKey = await getKeyFromSessionStorage()

  if (!storedKey) {
    throw new Error('Unable to decrypt history')
  }

  return await decryptData(iv, storedKey, data)
}

const encryptData = async (iv: BufferSource, key: CryptoKey, data: any) => {
  if (typeof window === 'undefined') {
    throw new Error('Unable to encrypt history')
  }

  if (typeof window.crypto.subtle === 'undefined') {
    console.warn('Encryption is not supported in this environment. SSL is required.')

    return Promise.resolve(data)
  }

  const textEncoder = new TextEncoder()
  const str = JSON.stringify(data)
  const encoded = new Uint8Array(str.length * 3)

  const result = textEncoder.encodeInto(str, encoded)

  return window.crypto.subtle.encrypt(
    {
      name: 'AES-GCM',
      iv,
    },
    key,
    encoded.subarray(0, result.written),
  )
}

const decryptData = async (iv: BufferSource, key: CryptoKey, data: any) => {
  if (typeof window.crypto.subtle === 'undefined') {
    console.warn('Decryption is not supported in this environment. SSL is required.')

    return Promise.resolve(data)
  }

  const decrypted = await window.crypto.subtle.decrypt(
    {
      name: 'AES-GCM',
      iv,
    },
    key,
    data,
  )

  return JSON.parse(new TextDecoder().decode(decrypted))
}

const getIv = (): BufferSource => {
  const ivString = SessionStorage.get(historySessionStorageKeys.iv)

  if (ivString) {
    return new Uint8Array(ivString)
  }

  const iv = window.crypto.getRandomValues(new Uint8Array(12))

  SessionStorage.set(historySessionStorageKeys.iv, Array.from(iv))

  return iv
}

const createKey = async () => {
  if (typeof window.crypto.subtle === 'undefined') {
    console.warn('Encryption is not supported in this environment. SSL is required.')

    return Promise.resolve(null)
  }

  return window.crypto.subtle.generateKey(
    {
      name: 'AES-GCM',
      length: 256,
    },
    true,
    ['encrypt', 'decrypt'],
  )
}

const saveKey = async (key: CryptoKey) => {
  if (typeof window.crypto.subtle === 'undefined') {
    console.warn('Encryption is not supported in this environment. SSL is required.')

    return Promise.resolve()
  }

  const keyData = await window.crypto.subtle.exportKey('raw', key)

  SessionStorage.set(historySessionStorageKeys.key, Array.from(new Uint8Array(keyData)))
}

const getOrCreateKey = async (key: CryptoKey | null) => {
  if (key) {
    return key
  }

  const newKey = await createKey()

  if (!newKey) {
    return null
  }

  await saveKey(newKey)

  return newKey
}

const getKeyFromSessionStorage = async (): Promise<CryptoKey | null> => {
  const stringKey = SessionStorage.get(historySessionStorageKeys.key)

  if (!stringKey) {
    return null
  }

  const key = await window.crypto.subtle.importKey(
    'raw',
    new Uint8Array(stringKey),
    {
      name: 'AES-GCM',
      length: 256,
    },
    true,
    ['encrypt', 'decrypt'],
  )

  return key
}


================================================
FILE: packages/core/src/eventHandler.ts
================================================
import debounce from './debounce'
import { fireNavigateEvent } from './events'
import { history } from './history'
import { router } from './index'
import { page as currentPage } from './page'
import { Scroll } from './scroll'
import { GlobalEvent, GlobalEventNames, GlobalEventResult, InternalEvent } from './types'
import { hrefToUrl } from './url'

class EventHandler {
  protected internalListeners: {
    event: InternalEvent
    listener: (...args: any[]) => void
  }[] = []

  public init() {
    if (typeof window !== 'undefined') {
      window.addEventListener('popstate', this.handlePopstateEvent.bind(this))
      window.addEventListener('pageshow', this.handlePageshowEvent.bind(this))
      window.addEventListener('scroll', debounce(Scroll.onWindowScroll.bind(Scroll), 100), true)
    }

    if (typeof document !== 'undefined') {
      document.addEventListener('scroll', debounce(Scroll.onScroll.bind(Scroll), 100), true)
    }
  }

  public onGlobalEvent<TEventName extends GlobalEventNames>(
    type: TEventName,
    callback: (event: GlobalEvent<TEventName>) => GlobalEventResult<TEventName>,
  ): VoidFunction {
    const listener = ((event: GlobalEvent<TEventName>) => {
      const response = callback(event)

      if (event.cancelable && !event.defaultPrevented && response === false) {
        event.preventDefault()
      }
    }) as EventListener

    return this.registerListener(`inertia:${type}`, listener)
  }

  public on(event: InternalEvent, callback: (...args: any[]) => void): VoidFunction {
    this.internalListeners.push({ event, listener: callback })

    return () => {
      this.internalListeners = this.internalListeners.filter((listener) => listener.listener !== callback)
    }
  }

  public onMissingHistoryItem() {
    // At this point, the user has probably cleared the state
    // Mark the current page as cleared so that we don't try to write anything to it.
    currentPage.clear()
    // Fire an event so that that any listeners can handle this situation
    this.fireInternalEvent('missingHistoryItem')
  }

  public fireInternalEvent(event: InternalEvent, ...args: any[]): void {
    this.internalListeners
      .filter((listener) => listener.event === event)
      .forEach((listener) => listener.listener(...args))
  }

  protected registerListener(type: string, listener: EventListener): VoidFunction {
    document.addEventListener(type, listener)

    return () => document.removeEventListener(type, listener)
  }

  // bfcache restores pages without firing `popstate`, so we use `pageshow` to
  // re-validate encrypted history entries after `clearHistory` removed the keys.
  // https://web.dev/articles/bfcache
  protected handlePageshowEvent(event: PageTransitionEvent): void {
    if (event.persisted) {
      history.decrypt().catch(() => this.onMissingHistoryItem())
    }
  }

  protected handlePopstateEvent(event: PopStateEvent): void {
    const state = event.state || null

    if (state === null) {
      const url = hrefToUrl(currentPage.get().url)
      url.hash = window.location.hash

      history.replaceState({ ...currentPage.getWithoutFlashData(), url: url.href })
      Scroll.reset()

      return
    }

    if (!history.isValidState(state)) {
      return this.onMissingHistoryItem()
    }

    history
      .decrypt(state.page)
      .then((data) => {
        if (currentPage.get().version !== data.version) {
          this.onMissingHistoryItem()
          return
        }

        // Cancel ongoing requests except prefetch requests
        router.cancelAll({ prefetch: false })

        currentPage.setQuietly(data, { preserveState: false }).then(() => {
          Scroll.restore(history.getScrollRegions())
          fireNavigateEvent(currentPage.get())

          const pendingDeferred: Record<string, string[]> = {}
          const pageProps = currentPage.get().props

          for (const [group, props] of Object.entries(data.initialDeferredProps ?? data.deferredProps ?? {})) {
            const missing = props.filter((prop) => pageProps[prop] === undefined)

            if (missing.length > 0) {
              pendingDeferred[group] = missing
            }
          }

          if (Object.keys(pendingDeferred).length > 0) {
            this.fireInternalEvent('loadDeferredProps', pendingDeferred)
          }
        })
      })
      .catch(() => {
        this.onMissingHistoryItem()
      })
  }
}

export const eventHandler = new EventHandler()


================================================
FILE: packages/core/src/events.ts
================================================
import { GlobalEventDetails, GlobalEventNames, GlobalEventTrigger } from './types'

function fireEvent<TEventName extends GlobalEventNames>(
  name: TEventName,
  options: CustomEventInit<GlobalEventDetails<TEventName>>,
): boolean {
  return document.dispatchEvent(new CustomEvent(`inertia:${name}`, options))
}

export const fireBeforeEvent: GlobalEventTrigger<'before'> = (visit) => {
  return fireEvent('before', { cancelable: true, detail: { visit } })
}

export const fireErrorEvent: GlobalEventTrigger<'error'> = (errors) => {
  return fireEvent('error', { detail: { errors } })
}

export const fireExceptionEvent: GlobalEventTrigger<'exception'> = (exception) => {
  return fireEvent('exception', { cancelable: true, detail: { exception } })
}

export const fireFinishEvent: GlobalEventTrigger<'finish'> = (visit) => {
  return fireEvent('finish', { detail: { visit } })
}

export const fireInvalidEvent: GlobalEventTrigger<'invalid'> = (response) => {
  return fireEvent('invalid', { cancelable: true, detail: { response } })
}

export const fireBeforeUpdateEvent: GlobalEventTrigger<'beforeUpdate'> = (page) => {
  return fireEvent('beforeUpdate', { detail: { page } })
}

export const fireNavigateEvent: GlobalEventTrigger<'navigate'> = (page) => {
  return fireEvent('navigate', { detail: { page } })
}

export const fireProgressEvent: GlobalEventTrigger<'progress'> = (progress) => {
  return fireEvent('progress', { detail: { progress } })
}

export const fireStartEvent: GlobalEventTrigger<'start'> = (visit) => {
  return fireEvent('start', { detail: { visit } })
}

export const fireSuccessEvent: GlobalEventTrigger<'success'> = (page) => {
  return fireEvent('success', { detail: { page } })
}

export const firePrefetchedEvent: GlobalEventTrigger<'prefetched'> = (response, visit) => {
  return fireEvent('prefetched', { detail: { fetchedAt: Date.now(), response: response.data, visit } })
}

export const firePrefetchingEvent: GlobalEventTrigger<'prefetching'> = (visit) => {
  return fireEvent('prefetching', { detail: { visit } })
}

export const fireFlashEvent: GlobalEventTrigger<'flash'> = (flash) => {
  return fireEvent('flash', { detail: { flash } })
}


================================================
FILE: packages/core/src/files.ts
================================================
import { FormDataConvertible, RequestPayload } from './types'

export const isFile = (value: unknown): boolean =>
  (typeof File !== 'undefined' && value instanceof File) ||
  value instanceof Blob ||
  (typeof FileList !== 'undefined' && value instanceof FileList && value.length > 0)

export function hasFiles(data: RequestPayload | FormDataConvertible): boolean {
  return (
    isFile(data) ||
    (data instanceof FormData && Array.from(data.values()).some((value) => hasFiles(value))) ||
    (typeof data === 'object' && data !== null && Object.values(data).some((value) => hasFiles(value)))
  )
}


================================================
FILE: packages/core/src/formData.ts
================================================
import type { FormDataConvertible, QueryStringArrayFormatOption } from './types'

export const isFormData = (value: any): value is FormData => value instanceof FormData

export function objectToFormData(
  source: Record<string, FormDataConvertible>,
  form: FormData = new FormData(),
  parentKey: string | null = null,
  queryStringArrayFormat: QueryStringArrayFormatOption = 'brackets',
): FormData {
  source = source || {}

  for (const key in source) {
    if (Object.prototype.hasOwnProperty.call(source, key)) {
      append(form, composeKey(parentKey, key, 'indices'), source[key], queryStringArrayFormat)
    }
  }

  return form
}

function composeKey(parent: string | null, key: string, format: QueryStringArrayFormatOption): string {
  if (!parent) {
    return key
  }

  return format === 'brackets' ? `${parent}[]` : `${parent}[${key}]`
}

function append(form: FormData, key: string, value: FormDataConvertible, format: QueryStringArrayFormatOption): void {
  if (Array.isArray(value)) {
    return Array.from(value.keys()).forEach((index) =>
      append(form, composeKey(key, index.toString(), format), value[index], format),
    )
  } else if (value instanceof Date) {
    return form.append(key, value.toISOString())
  } else if (value instanceof File) {
    return form.append(key, value, value.name)
  } else if (value instanceof Blob) {
    return form.append(key, value)
  } else if (typeof value === 'boolean') {
    return form.append(key, value ? '1' : '0')
  } else if (typeof value === 'string') {
    return form.append(key, value)
  } else if (typeof value === 'number') {
    return form.append(key, `${value}`)
  } else if (value === null || value === undefined) {
    return form.append(key, '')
  }

  objectToFormData(value, form, key, format)
}


================================================
FILE: packages/core/src/formObject.ts
================================================
import { get, set } from 'lodash-es'
import { isFile } from './files'
import { FormDataConvertible } from './types'

/**
 * Transform dotted notation to bracket notation.
 *
 * Examples:
 *   user.name => user[name]
 *   user.profile.city => user[profile][city]
 *   user.skills[] => user[skills][]
 *   users.company[address].street => users[company][address][street]
 *   config\.app\.name => config.app.name (escaped, literal)
 */
function undotKey(key: string): string {
  if (!key.includes('.')) {
    return key
  }

  const transformSegment = (segment: string): string => {
    if (segment.startsWith('[') && segment.endsWith(']')) {
      return segment // Already in bracket notation - leave untouched
    }

    // Convert dotted segment to bracket notation: "user.name" → "user[name]"
    return segment.split('.').reduce((result, part, index) => (index === 0 ? part : `${result}[${part}]`))
  }

  return key
    .replace(/\\\./g, '__ESCAPED_DOT__') // Temporarily replace escaped dots (\.) to protect them from transformation
    .split(/(\[[^\]]*\])/) // Split on bracket notation while preserving the brackets in the result array
    .filter(Boolean) // Remove empty strings from the split operation
    .map(transformSegment) // Transform each segment: dotted parts become bracketed, existing brackets stay as-is
    .join('') // Reassemble all segments back into a single string
    .replace(/__ESCAPED_DOT__/g, '.') // Restore the escaped dots as literal dots in the final result
}

/**
 * Parse a key into an array of path segments.
 *
 * Examples:
 * - "user[name]" => ["user", "name"]
 * - "tags[]" => ["tags", ""]
 * - "items[0][name]" => ["items", 0, "name"]
 */
function parseKey(key: string): (string | number | '')[] {
  const path: (string | number | '')[] = []
  const pattern = /([^\[\]]+)|\[(\d*)\]/g
  let match: RegExpExecArray | null

  while ((match = pattern.exec(key)) !== null) {
    if (match[1] !== undefined) {
      path.push(match[1])
    } else if (match[2] !== undefined) {
      path.push(match[2] === '' ? '' : Number(match[2]))
    }
  }

  return path
}

/**
 * Set value in nested object, always creating objects (never arrays).
 * This ensures we can analyze the final structure before deciding what should be arrays.
 */
function setNestedObject(obj: Record<string, any>, path: string[], value: any): void {
  let current = obj

  for (let i = 0; i < path.length - 1; i++) {
    if (!(path[i] in current)) {
      current[path[i]] = {}
    }

    current = current[path[i]]
  }

  current[path[path.length - 1]] = value
}

/**
 * Check if an object has sequential numeric keys (0, 1, 2, ...).
 */
function objectHasSequentialNumericKeys(value: any): boolean {
  const keys = Object.keys(value)
  const numericKeys = keys
    .filter((k) => /^\d+$/.test(k))
    .map(Number)
    .sort((a, b) => a - b)

  return (
    keys.length === numericKeys.length &&
    numericKeys.length > 0 &&
    numericKeys[0] === 0 &&
    numericKeys.every((n, i) => n === i)
  )
}

/**
 * Convert objects with sequential numeric keys (0, 1, 2, ...) to arrays.
 */
function convertSequentialObjectsToArrays(value: any): any {
  if (Array.isArray(value)) {
    return value.map(convertSequentialObjectsToArrays)
  }

  if (typeof value !== 'object' || value === null || isFile(value)) {
    return value
  }

  if (objectHasSequentialNumericKeys(value)) {
    const result = []

    for (let i = 0; i < Object.keys(value).length; i++) {
      result[i] = convertSequentialObjectsToArrays(value[i])
    }

    return result
  }

  // Keep as object, recursively process values
  const result: Record<string, any> = {}

  for (const key in value) {
    result[key] = convertSequentialObjectsToArrays(value[key])
  }

  return result
}

/**
 * Convert a FormData instance into an object structure.
 */
export function formDataToObject(source: FormData): Record<string, FormDataConvertible> {
  const form: Record<string, any> = {}

  // formData.entries() returns an iterator where the first element is the key and the second element
  // is the value. Examples of the keys are "user[name]", "tags[]", "items[0][name]", "user.name", etc.
  // We should construct a new (nested) object based on these keys.
  for (const [key, value] of source.entries()) {
    if (value instanceof File && value.size === 0 && value.name === '') {
      // Check if the given value is an empty file. We want to filter
      // those out as they prevent us from comparing objects with
      // each other, which we do to set the isDirty prop.
      continue
    }

    const path = parseKey(undotKey(key))

    // If the key ends with an empty string (''), treat it as an array push (e.g., "tags[]")
    if (path[path.length - 1] === '') {
      const arrayPath = path.slice(0, -1)
      const existing = get(form, arrayPath)

      if (Array.isArray(existing)) {
        existing.push(value)
      } else if (existing && typeof existing === 'object' && !isFile(existing)) {
        // If existing is an object with numeric keys, convert to array (treating indices as relative)
        const numericKeys = Object.keys(existing)
          .filter((k) => /^\d+$/.test(k))
          .map(Number)
          .sort((a, b) => a - b)

        set(form, arrayPath, numericKeys.length > 0 ? [...numericKeys.map((k) => existing[k]), value] : [value])
      } else {
        set(form, arrayPath, [value])
      }

      continue
    }

    // Always build nested objects first, then convert sequential numeric keys to arrays.
    // This prevents the creation of sparse arrays when mixing numeric and string keys.
    setNestedObject(form, path.map(String), value)
  }

  // Convert objects with sequential numeric keys (0, 1, 2, ...) to arrays
  return convertSequentialObjectsToArrays(form)
}


================================================
FILE: packages/core/src/head.ts
================================================
import { config, HeadManager, HeadManagerOnUpdateCallback, HeadManagerTitleCallback } from '.'
import debounce from './debounce'

const Renderer = {
  preferredAttribute(): 'data-inertia' | 'inertia' {
    return config.get('future.useDataInertiaHeadAttribute') ? 'data-inertia' : 'inertia'
  },

  buildDOMElement(tag: string): ChildNode {
    const template = document.createElement('template')
    template.innerHTML = tag
    const node = template.content.firstChild as Element

    if (!tag.startsWith('<script ')) {
      return node
    }

    const script = document.createElement('script')
    script.innerHTML = node.innerHTML
    node.getAttributeNames().forEach((name) => {
      script.setAttribute(name, node.getAttribute(name) || '')
    })

    return script
  },

  isInertiaManagedElement(element: Element): boolean {
    return element.nodeType === Node.ELEMENT_NODE && element.getAttribute(this.preferredAttribute()) !== null
  },

  findMatchingElementIndex(element: Element, elements: Array<Element>): number {
    const attribute = this.preferredAttribute()
    const key = element.getAttribute(attribute)
    if (key !== null) {
      return elements.findIndex((element) => element.getAttribute(attribute) === key)
    }

    return -1
  },

  update: debounce(function (elements: Array<string>) {
    const sourceElements = elements.map((element) => this.buildDOMElement(element))
    const targetElements = Array.from(document.head.childNodes).filter((element) =>
      this.isInertiaManagedElement(element as Element),
    )

    targetElements.forEach((targetElement) => {
      const index = this.findMatchingElementIndex(targetElement as Element, sourceElements)
      if (index === -1) {
        targetElement?.parentNode?.removeChild(targetElement)
        return
      }

      const sourceElement = sourceElements.splice(index, 1)[0]
      if (sourceElement && !targetElement.isEqualNode(sourceElement)) {
        targetElement?.parentNode?.replaceChild(sourceElement, targetElement)
      }
    })

    sourceElements.forEach((element) => document.head.appendChild(element))
  }, 1),
}

export default function createHeadManager(
  isServer: boolean,
  titleCallback: HeadManagerTitleCallback,
  onUpdate: HeadManagerOnUpdateCallback,
): HeadManager {
  const states: Record<string, Array<string>> = {}
  let lastProviderId = 0

  function connect(): string {
    const id = (lastProviderId += 1)
    states[id] = []
    return id.toString()
  }

  function disconnect(id: string): void {
    if (id === null || Object.keys(states).indexOf(id) === -1) {
      return
    }

    delete states[id]
    commit()
  }

  function reconnect(id: string): void {
    if (Object.keys(states).indexOf(id) === -1) {
      states[id] = []
    }
  }

  function update(id: string, elements: Array<string> = []): void {
    if (id !== null && Object.keys(states).indexOf(id) > -1) {
      states[id] = elements
    }

    commit()
  }

  function collect(): Array<string> {
    const title = titleCallback('')
    const attribute = Renderer.preferredAttribute()

    const defaults: Record<string, string> = {
      ...(title ? { title: `<title ${attribute}="">${title}</title>` } : {}),
    }

    const elements = Object.values(states)
      .reduce((carry, elements) => carry.concat(elements), [])
      .reduce((carry, element) => {
        if (element.indexOf('<') === -1) {
          return carry
        }

        if (element.indexOf('<title ') === 0) {
          const title = element.match(/(<title [^>]+>)(.*?)(<\/title>)/)
          carry.title = title ? `${title[1]}${titleCallback(title[2])}${title[3]}` : element
          return carry
        }

        const match = element.match(attribute === 'inertia' ? / inertia="[^"]+"/ : / data-inertia="[^"]+"/)
        if (match) {
          carry[match[0]] = element
        } else {
          carry[Object.keys(carry).length] = element
        }

        return carry
      }, defaults)

    return Object.values(elements)
  }

  function commit(): void {
    isServer ? onUpdate(collect()) : Renderer.update(collect())
  }

  // By committing during initialization, we can guarantee that the default
  // tags are set, as well as that they exist during SSR itself.
  commit()

  return {
    forceUpdate: commit,
    createProvider: function () {
      const id = connect()

      return {
        preferredAttribute: Renderer.preferredAttribute,
        reconnect: () => reconnect(id),
        update: (elements) => update(id, elements),
        disconnect: () => disconnect(id),
      }
    },
  }
}


================================================
FILE: packages/core/src/history.ts
================================================
import { cloneDeep, isEqual } from 'lodash-es'
import { decryptHistory, encryptHistory, historySessionStorageKeys } from './encryption'
import { eventHandler } from './eventHandler'
import { page as currentPage } from './page'
import Queue from './queue'
import { SessionStorage } from './sessionStorage'
import { Page, ScrollRegion } from './types'

const isServer = typeof window === 'undefined'
const queue = new Queue<Promise<void>>()
const isChromeIOS = !isServer && /CriOS/.test(window.navigator.userAgent)

class History {
  public rememberedState = 'rememberedState' as const
  public scrollRegions = 'scrollRegions' as const
  public preserveUrl = false
  protected current: Partial<Page> = {}
  // We need initialState for `restore`
  protected initialState: Partial<Page> | null = null

  public remember(data: unknown, key: string): void {
    this.replaceState({
      ...currentPage.getWithoutFlashData(),
      rememberedState: {
        ...(currentPage.get()?.rememberedState ?? {}),
        [key]: data,
      },
    })
  }

  public restore(key: string): unknown {
    if (!isServer) {
      return this.current[this.rememberedState]?.[key] !== undefined
        ? this.current[this.rememberedState]?.[key]
        : this.initialState?.[this.rememberedState]?.[key]
    }
  }

  public pushState(page: Page, cb: (() => void) | null = null): void {
    if (isServer) {
      return
    }

    if (this.preserveUrl) {
      cb && cb()
      return
    }

    this.current = page

    queue.add(() => {
      return this.getPageData(page).then((data) => {
        // Defer history.pushState to the next event loop tick to prevent timing conflicts.
        // Ensure any previous history.replaceState completes before pushState is executed.
        const doPush = () => this.doPushState({ page: data }, page.url).then(() => cb?.())

        if (isChromeIOS) {
          return new Promise((resolve) => {
            setTimeout(() => doPush().then(resolve))
          })
        }

        return doPush()
      })
    })
  }

  protected clonePageProps(page: Page): Page {
    try {
      structuredClone(page.props)
      return page
    } catch {
      // Props contain non-serializable data (e.g., Proxies, functions).
      // Clone them to ensure they can be safely stored in browser history.
      return {
        ...page,
        props: cloneDeep(page.props),
      }
    }
  }

  protected getPageData(page: Page): Promise<Page | ArrayBuffer> {
    const pageWithClonedProps = this.clonePageProps(page)

    return new Promise((resolve) => {
      return page.encryptHistory ? encryptHistory(pageWithClonedProps).then(resolve) : resolve(pageWithClonedProps)
    })
  }

  public processQueue(): Promise<void> {
    return queue.process()
  }

  public decrypt(page: Page | null = null): Promise<Page> {
    if (isServer) {
      return Promise.resolve(page ?? currentPage.get())
    }

    const pageData = page ?? window.history.state?.page

    return this.decryptPageData(pageData).then((data) => {
      if (!data) {
        throw new Error('Unable to decrypt history')
      }

      if (this.initialState === null) {
        this.initialState = data ?? undefined
      } else {
        this.current = data ?? {}
      }

      return data
    })
  }

  protected decryptPageData(pageData: ArrayBuffer | Page | null): Promise<Page | null> {
    return pageData instanceof ArrayBuffer ? decryptHistory(pageData) : Promise.resolve(pageData)
  }

  public saveScrollPositions(scrollRegions: ScrollRegion[]): void {
    queue.add(() => {
      return Promise.resolve().then(() => {
        if (!window.history.state?.page) {
          return
        }

        if (isEqual(this.getScrollRegions(), scrollRegions)) {
          return
        }

        return this.doReplaceState({
          page: window.history.state.page,
          scrollRegions,
        })
      })
    })
  }

  public saveDocumentScrollPosition(scrollRegion: ScrollRegion): void {
    queue.add(() => {
      return Promise.resolve().then(() => {
        if (!window.history.state?.page) {
          return
        }

        if (isEqual(this.getDocumentScrollPosition(), scrollRegion)) {
          return
        }

        return this.doReplaceState({
          page: window.history.state.page,
          documentScrollPosition: scrollRegion,
        })
      })
    })
  }

  public getScrollRegions(): ScrollRegion[] {
    return window.history.state?.scrollRegions || []
  }

  public getDocumentScrollPosition(): ScrollRegion {
    return window.history.state?.documentScrollPosition || { top: 0, left: 0 }
  }

  public replaceState(page: Page, cb: (() => void) | null = null): void {
    if (isEqual(this.current, page)) {
      cb && cb()
      return
    }

    // Exclude flash from the merge to prevent callers (like router.remember())
    // from accidentally clearing flash data on the current page.
    const { flash, ...pageWithoutFlash } = page
    currentPage.merge(pageWithoutFlash)

    if (isServer) {
      return
    }

    if (this.preserveUrl) {
      cb && cb()
      return
    }

    this.current = page

    queue.add(() => {
      return this.getPageData(page).then((data) => {
        // Defer history.replaceState to the next event loop tick to prevent timing conflicts.
        // Ensure any previous history.pushState completes before replaceState is executed.
        const doReplace = () => this.doReplaceState({ page: data }, page.url).then(() => cb?.())

        if (isChromeIOS) {
          return new Promise((resolve) => {
            setTimeout(() => doReplace().then(resolve))
          })
        }

        return doReplace()
      })
    })
  }

  protected isHistoryThrottleError(error: unknown): error is Error & { name: 'SecurityError' } {
    return (
      error instanceof Error &&
      error.name === 'SecurityError' &&
      (error.message.includes('history.pushState') || error.message.includes('history.replaceState'))
    )
  }

  protected isQuotaExceededError(error: unknown): error is Error & { name: 'QuotaExceededError' } {
    return error instanceof Error && error.name === 'QuotaExceededError'
  }

  protected withThrottleProtection<T = void>(cb: () => T): Promise<T | undefined> {
    return Promise.resolve().then(() => {
      try {
        return cb()
      } catch (error) {
        if (!this.isHistoryThrottleError(error)) {
          throw error
        }

        console.error(error.message)
      }
    })
  }

  protected doReplaceState(
    data: {
      page: Page | ArrayBuffer
      scrollRegions?: ScrollRegion[]
      documentScrollPosition?: ScrollRegion
    },
    url?: string,
  ): Promise<void> {
    return this.withThrottleProtection(() => {
      window.history.replaceState(
        {
          ...data,
          scrollRegions: data.scrollRegions ?? window.history.state?.scrollRegions,
          documentScrollPosition: data.documentScrollPosition ?? window.history.state?.documentScrollPosition,
        },
        '',
        url,
      )
    })
  }

  protected doPushState(
    data: {
      page: Page | ArrayBuffer
      scrollRegions?: ScrollRegion[]
      documentScrollPosition?: ScrollRegion
    },
    url: string,
  ): Promise<void> {
    return this.withThrottleProtection(() => {
      try {
        window.history.pushState(data, '', url)
      } catch (error) {
        if (!this.isQuotaExceededError(error)) {
          throw error
        }

        eventHandler.fireInternalEvent('historyQuotaExceeded', url)
      }
    })
  }

  public getState<T>(key: keyof Page, defaultValue?: T): any {
    return this.current?.[key] ?? defaultValue
  }

  public deleteState(key: keyof Page) {
    if (this.current[key] !== undefined) {
      delete this.current[key]
      this.replaceState(this.current as Page)
    }
  }

  public clearInitialState(key: keyof Page) {
    if (this.initialState && this.initialState[key] !== undefined) {
      delete this.initialState[key]
    }
  }

  public browserHasHistoryEntry(): boolean {
    return !isServer && !!window.history.state?.page
  }

  public clear() {
    SessionStorage.remove(historySessionStorageKeys.key)
    SessionStorage.remove(historySessionStorageKeys.iv)
  }

  public setCurrent(page: Page): void {
    this.current = page
  }

  public isValidState(state: any): boolean {
    return !!state.page
  }

  public getAllState(): Page {
    return this.current as Page
  }
}

if (typeof window !== 'undefined' && window.history.scrollRestoration) {
  window.history.scrollRestoration = 'manual'
}

export const history = new History()


================================================
FILE: packages/core/src/index.ts
================================================
import { Config } from './config'
import { Router } from './router'

export { UseFormUtils } from './useFormUtils'

export { config } from './config'
export { getInitialPageFromDOM, getScrollableParent } from './domUtils'
export { objectToFormData } from './formData'
export { formDataToObject } from './formObject'
export { default as createHeadManager } from './head'
export { default as useInfiniteScroll } from './infiniteScroll'
export { shouldIntercept, shouldNavigate } from './navigationEvents'
export { hide as hideProgress, progress, reveal as revealProgress, default as setupProgress } from './progress'
export { FormComponentResetSymbol, resetFormFields } from './resetFormFields'
export * from './types'
export {
  hrefToUrl,
  isUrlMethodPair,
  mergeDataIntoQueryString,
  urlHasProtocol,
  urlToString,
  urlWithoutHash,
} from './url'
export { type Config, type Router }

export const router = new Router()


================================================
FILE: packages/core/src/infiniteScroll/data.ts
================================================
import { router } from '../index'
import { page as currentPage } from '../page'
import { Page, PendingVisit, ReloadOptions, ScrollProp, UseInfiniteScrollDataManager } from '../types'

const MERGE_INTENT_HEADER = 'X-Inertia-Infinite-Scroll-Merge-Intent'

type Side = 'previous' | 'next'
type ScrollPropPageNames = keyof Pick<ScrollProp, 'previousPage' | 'nextPage'>

type InfiniteScrollState = {
  previousPage: number | string | null
  nextPage: number | string | null
  lastLoadedPage: number | string | null
  requestCount: number
}

export const useInfiniteScrollData = (options: {
  getPropName: () => string
  onBeforeUpdate: () => void
  onBeforePreviousRequest: () => void
  onBeforeNextRequest: () => void
  onCompletePreviousRequest: (loadedPage: string | number | null) => void
  onCompleteNextRequest: (loadedPage: string | number | null) => void
  onReset?: () => void
}): UseInfiniteScrollDataManager => {
  const getScrollPropFromCurrentPage = (): ScrollProp => {
    const scrollProp = currentPage.get().scrollProps?.[options.getPropName()]

    if (scrollProp) {
      return scrollProp
    }

    throw new Error(`The page object does not contain a scroll prop named "${options.getPropName()}".`)
  }

  const state = {
    component: null,
    loading: false,
    previousPage: null,
    nextPage: null,
    lastLoadedPage: null,
    requestCount: 0,
  } as {
    component: string | null
    loading: boolean
  } & InfiniteScrollState

  const resetState = () => {
    const scrollProp = getScrollPropFromCurrentPage()

    state.component = currentPage.get().component
    state.loading = false
    state.previousPage = scrollProp.previousPage
    state.nextPage = scrollProp.nextPage
    state.lastLoadedPage = scrollProp.currentPage
    state.requestCount = 0
  }

  const getRememberKey = () => `inertia:infinite-scroll-data:${options.getPropName()}`

  if (typeof window !== 'undefined') {
    resetState()

    const rememberedState = router.restore(getRememberKey()) as InfiniteScrollState | undefined

    if (
      rememberedState &&
      typeof rememberedState === 'object' &&
      rememberedState.lastLoadedPage === getScrollPropFromCurrentPage().currentPage
    ) {
      // Restore remembered state only when it's consistent with the current scroll prop,
      // which ensures back/forward navigation works while direct URL visits reset properly.
      state.previousPage = rememberedState.previousPage
      state.nextPage = rememberedState.nextPage
      state.lastLoadedPage = rememberedState.lastLoadedPage
      state.requestCount = rememberedState.requestCount || 0
    }
  }

  const removeEventListener = router.on('success', (event) => {
    if (state.component === event.detail.page.component && getScrollPropFromCurrentPage().reset) {
      resetState()
      options.onReset?.()
    }
  })

  const getScrollPropKeyForSide = (side: Side): ScrollPropPageNames => {
    return side === 'next' ? 'nextPage' : 'previousPage'
  }

  const findPageToLoad = (side: Side) => {
    const pagePropName = getScrollPropKeyForSide(side)

    return state[pagePropName]
  }

  const syncStateOnSuccess = (side: Side) => {
    const scrollProp = getScrollPropFromCurrentPage()
    const paginationProp = getScrollPropKeyForSide(side)

    state.lastLoadedPage = scrollProp.currentPage
    state[paginationProp] = scrollProp[paginationProp]

    state.requestCount += 1

    // We save the state in the browser history so it can be restored
    // if the user navigates away and then back to the page...
    router.remember(
      {
        previousPage: state.previousPage,
        nextPage: state.nextPage,
        lastLoadedPage: state.lastLoadedPage,
        requestCount: state.requestCount,
      } as InfiniteScrollState,
      getRememberKey(),
    )
  }

  const getPageName = () => getScrollPropFromCurrentPage().pageName
  const getRequestCount = () => state.requestCount

  const fetchPage = (side: Side, reloadOptions: ReloadOptions = {}): void => {
    const page = findPageToLoad(side)

    if (state.loading || page === null) {
      return
    }

    state.loading = true

    router.reload({
      ...reloadOptions,
      data: { [getPageName()]: page },
      only: [options.getPropName()],
      preserveUrl: true, // we handle URL updates manually via useInfiniteScrollQueryString()
      headers: {
        [MERGE_INTENT_HEADER]: side === 'previous' ? 'prepend' : 'append',
        ...reloadOptions.headers,
      },
      onBefore: (visit: PendingVisit) => {
        side === 'next' ? options.onBeforeNextRequest() : options.onBeforePreviousRequest()
        reloadOptions.onBefore?.(visit)
      },
      onBeforeUpdate: (page: Page) => {
        options.onBeforeUpdate()
        reloadOptions.onBeforeUpdate?.(page)
      },
      onSuccess: (page: Page) => {
        syncStateOnSuccess(side)
        reloadOptions.onSuccess?.(page)
      },
      onFinish: (visit: any) => {
        state.loading = false
        side === 'next'
          ? options.onCompleteNextRequest(state.lastLoadedPage)
          : options.onCompletePreviousRequest(state.lastLoadedPage)
        reloadOptions.onFinish?.(visit)
      },
    })
  }

  const getLastLoadedPage = () => state.lastLoadedPage
  const hasPrevious = () => !!state.previousPage
  const hasNext = () => !!state.nextPage
  const fetchPrevious = (reloadOptions?: ReloadOptions): void => fetchPage('previous', reloadOptions)
  const fetchNext = (reloadOptions?: ReloadOptions): void => fetchPage('next', reloadOptions)

  return {
    getLastLoadedPage,
    getPageName,
    getRequestCount,
    hasPrevious,
    hasNext,
    fetchNext,
    fetchPrevious,
    removeEventListener,
  }
}


================================================
FILE: packages/core/src/infiniteScroll/elements.ts
================================================
import { router } from '..'
import debounce from '../debounce'
import { useIntersectionObservers } from '../intersectionObservers'
import { UseInfiniteScrollElementManager } from '../types'

const INFINITE_SCROLL_PAGE_KEY = 'infiniteScrollPage'
const INFINITE_SCROLL_IGNORE_KEY = 'infiniteScrollIgnore'

type ElementRange = {
  from: number
  to: number
}

export const getPageFromElement = (element: HTMLElement): string | undefined =>
  element.dataset[INFINITE_SCROLL_PAGE_KEY]

export const useInfiniteScrollElementManager = (options: {
  shouldFetchNext: () => boolean
  shouldFetchPrevious: () => boolean
  getTriggerMargin: () => number
  getStartElement: () => HTMLElement
  getEndElement: () => HTMLElement
  getItemsElement: () => HTMLElement
  getScrollableParent: () => HTMLElement | null
  onPreviousTriggered: () => void
  onNextTriggered: () => void
  onItemIntersected: (element: HTMLElement) => void
  getPropName: () => string
}): UseInfiniteScrollElementManager => {
  const intersectionObservers = useIntersectionObservers()

  let itemsObserver: IntersectionObserver
  let startElementObserver: IntersectionObserver
  let endElementObserver: IntersectionObserver
  let itemsMutationObserver: MutationObserver
  let triggersEnabled = false

  const setupObservers = () => {
    // Watch for manually added DOM elements (not from server responses)
    // This mutation observer tracks when new elements are added to the slot,
    // so we can distinguish between user-added content and server-loaded pages
    itemsMutationObserver = new MutationObserver((mutations) => {
      mutations.forEach((mutation) => {
        mutation.addedNodes.forEach((node) => {
          if (node.nodeType !== Node.ELEMENT_NODE) {
            return
          }

          addedElements.add(node as HTMLElement)
        })
      })

      rememberElementsDebounced()
    })

    itemsMutationObserver.observe(options.getItemsElement(), { childList: true })

    // Track individual items entering/leaving viewport for URL synchronization
    // When items become visible, we update the URL to reflect the current page
    itemsObserver = intersectionObservers.new((entry: IntersectionObserverEntry) =>
      options.onItemIntersected(entry.target as HTMLElement),
    )

    // Set up trigger zones at start/end that load more content when intersected. The rootMargin
    // creates a buffer zone so loading starts before user reaches the edge. We should always
    // have a root margin of at least 1px as our default elements have no height
    const observerOptions: IntersectionObserverInit = {
      root: options.getScrollableParent(),
      rootMargin: `${Math.max(1, options.getTriggerMargin())}px`,
    }

    startElementObserver = intersectionObservers.new(options.onPreviousTriggered, observerOptions)
    endElementObserver = intersectionObservers.new(options.onNextTriggered, observerOptions)
  }

  const enableTriggers = () => {
    if (triggersEnabled) {
      // Make sure we don't register multiple watchers
      disableTriggers()
    }

    const startElement = options.getStartElement()
    const endElement = options.getEndElement()

    if (startElement && options.shouldFetchPrevious()) {
      startElementObserver.observe(startElement)
    }

    if (endElement && options.shouldFetchNext()) {
      endElementObserver.observe(endElement)
    }

    triggersEnabled = true
  }

  const disableTriggers = () => {
    if (!triggersEnabled) {
      return
    }

    startElementObserver.disconnect()
    endElementObserver.disconnect()
    triggersEnabled = false
  }

  const refreshTriggers = () => {
    if (triggersEnabled) {
      enableTriggers()
    }
  }

  const flushAll = () => {
    disableTriggers()
    intersectionObservers.flushAll()
    itemsMutationObserver?.disconnect()
  }

  const addedElements = new Set<HTMLElement>()

  const elementIsUntagged = (element: HTMLElement): boolean =>
    !(INFINITE_SCROLL_PAGE_KEY in element.dataset) && !(INFINITE_SCROLL_IGNORE_KEY in element.dataset)

  const processManuallyAddedElements = () => {
    // Tag manually added elements so they don't interfere with URL management
    // These elements get marked as "ignore" since they weren't loaded from the server
    Array.from(addedElements).forEach((element) => {
      if (elementIsUntagged(element)) {
        element.dataset[INFINITE_SCROLL_IGNORE_KEY] = 'true'
      }

      itemsObserver.observe(element)
    })

    addedElements.clear()
  }

  const findUntaggedElements = (containerElement: HTMLElement): HTMLElement[] => {
    return Array.from(
      containerElement.querySelectorAll(
        `:scope > *:not([data-infinite-scroll-page]):not([data-infinite-scroll-ignore])`,
      ),
    )
  }

  let hasRestoredElements = false

  const processServerLoadedElements = (loadedPage: string | number | null) => {
    // On first run, try to restore the elements tags from browser history
    if (!hasRestoredElements) {
      hasRestoredElements = true

      if (restoreElements()) {
        return
      }
    }

    // Tag new server-loaded elements with their page number for URL management
    // This allows us to update the URL based on which page's content is most visible
    findUntaggedElements(options.getItemsElement()).forEach((element) => {
      if (elementIsUntagged(element)) {
        element.dataset[INFINITE_SCROLL_PAGE_KEY] = loadedPage?.toString() || '1'
      }

      itemsObserver.observe(element)
    })

    rememberElements()
  }

  const getElementsRememberKey = () => `inertia:infinite-scroll-elements:${options.getPropName()}`

  // Remember in browser history which elements belong to which page, so we can restore
  // them on back/forward navigation and keep URL synchronization working correctly
  const rememberElements = () => {
    const pageElementRange: Record<string, ElementRange> = {}
    const childNodes = options.getItemsElement().childNodes

    for (let index = 0; index < childNodes.length; index++) {
      const node = childNodes[index]

      if (node.nodeType !== Node.ELEMENT_NODE) {
        continue
      }

      const page = getPageFromElement(node as HTMLElement)

      if (typeof page === 'undefined') {
        continue
      }

      if (!(page in pageElementRange)) {
        pageElementRange[page] = { from: index, to: index }
      } else {
        pageElementRange[page].to = index
      }
    }

    router.remember(pageElementRange, getElementsRememberKey())
  }

  const rememberElementsDebounced = debounce(rememberElements, 250)

  const restoreElements = (): boolean => {
    const pageElementRange = router.restore(getElementsRememberKey()) as Record<string, ElementRange> | undefined

    if (!pageElementRange || typeof pageElementRange !== 'object') {
      return false
    }

    const childNodes = options.getItemsElement().childNodes

    // Use for loop instead of forEach for better performance
    for (let index = 0; index < childNodes.length; index++) {
      const node = childNodes[index]

      if (node.nodeType !== Node.ELEMENT_NODE) {
        continue
      }

      const element = node as HTMLElement

      // Find which page this element belongs to based on ranges
      let elementPage: string | undefined

      for (const [page, range] of Object.entries(pageElementRange)) {
        if (index >= range.from && index <= range.to) {
          elementPage = page
          break
        }
      }

      if (elementPage) {
        element.dataset[INFINITE_SCROLL_PAGE_KEY] = elementPage
      } else if (!elementIsUntagged(element)) {
        continue
      } else {
        element.dataset[INFINITE_SCROLL_IGNORE_KEY] = 'true'
      }

      itemsObserver.observe(element)
    }

    return true
  }

  return {
    setupObservers,
    enableTriggers,
    disableTriggers,
    refreshTriggers,
    flushAll,
    processManuallyAddedElements,
    processServerLoadedElements,
  }
}


================================================
FILE: packages/core/src/infiniteScroll/queryString.ts
================================================
import { hrefToUrl, router, urlHasProtocol, urlToString } from '..'
import debounce from '../debounce'
import { getElementsInViewportFromCollection } from '../domUtils'
import { page as currentPage } from './../page'
import Queue from './../queue'
import { getPageFromElement } from './elements'

// Shared queue among all instances to ensure URL updates are processed sequentially
const queue = new Queue<Promise<void>>()

let initialUrl: URL | null
let payloadUrl: URL | null
let initialUrlWasAbsolute: boolean | null = null

/**
 * As users scroll through infinite content, this system updates the URL to reflect
 * which page they're currently viewing. It uses a "most visible page" calculation
 * so that the URL reflects whichever page has the most visible items.
 */
export const useInfiniteScrollQueryString = (options: {
  getPageName: () => string
  getItemsElement: () => HTMLElement
  shouldPreserveUrl: () => boolean
}) => {
  let enabled = true

  const queuePageUpdate = (page: string) => {
    queue
      .add(() => {
        return new Promise((resolve) => {
          if (!enabled) {
            initialUrl = payloadUrl = null
            return resolve()
          }

          if (!initialUrl || !payloadUrl) {
            const currentPageUrl = currentPage.get().url
            initialUrl = hrefToUrl(currentPageUrl)
            payloadUrl = hrefToUrl(currentPageUrl)
            initialUrlWasAbsolute = urlHasProtocol(currentPageUrl)
          }

          const pageName = options.getPageName()
          const searchParams = payloadUrl.searchParams

          // Clean URLs: don't show ?page=1 in the URL, just remove the parameter entirely
          if (page === '1') {
            searchParams.delete(pageName)
          } else {
            searchParams.set(pageName, page)
          }

          setTimeout(() => resolve())
        })
      })
      .finally(() => {
        if (
          enabled &&
          initialUrl &&
          payloadUrl &&
          initialUrl.href !== payloadUrl.href &&
          initialUrlWasAbsolute !== null
        ) {
          // Update URL without triggering a page reload or affecting scroll position
          router.replace({
            url: urlToString(payloadUrl, initialUrlWasAbsolute),
            preserveScroll: true,
            preserveState: true,
          })
        }

        initialUrl = payloadUrl = initialUrlWasAbsolute = null
      })
  }

  // Debounced to avoid excessive URL updates during fast scrolling
  const onItemIntersected = debounce((itemElement: HTMLElement) => {
    const itemsElement = options.getItemsElement()

    if (!enabled || options.shouldPreserveUrl() || !itemElement || !itemsElement) {
      return
    }

    // Count how many items from each page are currently visible in the viewport
    const pageMap = new Map<string, number>()
    const elements = [...itemsElement.children] as HTMLElement[]

    getElementsInViewportFromCollection(elements, itemElement).forEach((element) => {
      const page = getPageFromElement(element) ?? '1'

      if (pageMap.has(page)) {
        pageMap.set(page, pageMap.get(page)! + 1)
      } else {
        pageMap.set(page, 1)
      }
    })

    // Find the page with the most visible items - this becomes the "current" page
    const sortedPages = Array.from(pageMap.entries()).sort((a, b) => b[1] - a[1])
    const mostVisiblePage = sortedPages[0]?.[0]

    if (mostVisiblePage !== undefined) {
      queuePageUpdate(mostVisiblePage)
    }
  }, 250)

  return {
    onItemIntersected,
    cancel: () => (enabled = false),
  }
}


================================================
FILE: packages/core/src/infiniteScroll/scrollPreservation.ts
================================================
import { getElementsInViewportFromCollection } from '../domUtils'

/**
 * When loading content "before" the current viewport (e.g. loading page 1 when viewing page 2),
 * new content is prepended to the DOM, which naturally pushes existing content down and
 * disrupts the user's scroll position. This system maintains visual stability by:
 *
 * 1. Capturing a reference element and its position before the update
 * 2. After new content is added, calculating how far that reference element moved
 * 3. Adjusting scroll position to keep the reference element in the same visual location
 */
export const useInfiniteScrollPreservation = (options: {
  getScrollableParent: () => HTMLElement | null
  getItemsElement: () => HTMLElement
}) => {
  const createCallbacks = () => {
    let currentScrollTop: number
    let referenceElement: Element | null = null
    let referenceElementTop: number = 0

    const captureScrollPosition = () => {
      const scrollableContainer = options.getScrollableParent()
      const itemsElement = options.getItemsElement()

      // Capture current scroll position
      currentScrollTop = scrollableContainer?.scrollTop || window.scrollY

      // Find the first visible element to use as a reference point
      // This element will help us calculate how much the content shifted after the update
      const visibleElements = getElementsInViewportFromCollection([...itemsElement.children] as HTMLElement[])

      if (visibleElements.length > 0) {
        referenceElement = visibleElements[0]
        const containerRect = scrollableContainer?.getBoundingClientRect() || { top: 0 }
        const containerTop = scrollableContainer ? containerRect.top : 0
        const rect = referenceElement.getBoundingClientRect()
        // Store the reference element's position relative to its container
        referenceElementTop = rect.top - containerTop
      }
    }

    const restoreScrollPosition = () => {
      if (!referenceElement) {
        return
      }

      let attempts = 0
      let restored = false

      const restore = () => {
        attempts++

        if (restored || attempts > 10) {
          return false
        }

        // Calculate where our reference element ended up after new content was prepended
        const scrollableContainer = options.getScrollableParent()
        const containerRect = scrollableContainer?.getBoundingClientRect() || { top: 0 }
        const containerTop = scrollableContainer ? containerRect.top : 0
        const newRect = referenceElement!.getBoundingClientRect()
        const newElementTop = newRect.top - containerTop

        // Calculate how much the reference element moved due to content being prepended
        const adjustment = newElementTop - referenceElementTop

        if (adjustment === 0) {
          // Try again on the next frame, as DOM may still be updating
          window.requestAnimationFrame(restore)
          return
        }

        // Adjust scroll position to compensate for the movement, keeping the reference element
        // in the same visual position as before the update
        if (scrollableContainer) {
          scrollableContainer.scrollTo({ top: currentScrollTop + adjustment })
        } else {
          window.scrollTo(0, window.scrollY + adjustment)
        }

        restored = true
      }

      window.requestAnimationFrame(restore)
    }

    return {
      captureScrollPosition,
      restoreScrollPosition,
    }
  }

  return {
    createCallbacks,
  }
}


================================================
FILE: packages/core/src/infiniteScroll.ts
================================================
import { requestAnimationFrame } from './domUtils'
import { router } from './index'
import { useInfiniteScrollData } from './infiniteScroll/data'
import { useInfiniteScrollElementManager } from './infiniteScroll/elements'
import { useInfiniteScrollQueryString } from './infiniteScroll/queryString'
import { useInfiniteScrollPreservation } from './infiniteScroll/scrollPreservation'
import { Page, ReloadOptions, UseInfiniteScrollOptions, UseInfiniteScrollProps } from './types'

/**
 * Core infinite scroll composable that orchestrates data fetching, DOM management,
 * scroll preservation, and URL synchronization.
 *
 * This is the main entry point that coordinates four sub-systems:
 * - Data management: Handles pagination state and server requests
 * - Element management: DOM observation and intersection detection
 * - Query string sync: Updates URL as user scrolls through pages
 * - Scroll preservation: Maintains scroll position during content updates
 */
export default function useInfiniteScroll(options: UseInfiniteScrollOptions): UseInfiniteScrollProps {
  const queryStringManager = useInfiniteScrollQueryString({ ...options, getPageName: () => dataManager.getPageName() })

  // Create scroll preservation callbacks that capture and restore scroll position
  // and restore it after new content is prepended to maintain visual stability
  const scrollPreservation = useInfiniteScrollPreservation(options)

  const elementManager = useInfiniteScrollElementManager({
    ...options,
    // As items enter viewport, update URL to reflect the most visible page
    onItemIntersected: queryStringManager.onItemIntersected,
    onPreviousTriggered: () => dataManager.fetchPrevious(),
    onNextTriggered: () => dataManager.fetchNext(),
  })

  const dataManager = useInfiniteScrollData({
    ...options,
    // Before updating page data, tag any manually added DOM elements
    // so they don't get confused with server-loaded content
    onBeforeUpdate: elementManager.processManuallyAddedElements,
    // After successful request, tag new server content
    onCompletePreviousRequest: (loadedPage) => {
      options.onCompletePreviousRequest()
      requestAnimationFrame(() => elementManager.processServerLoadedElements(loadedPage), 2)
    },
    onCompleteNextRequest: (loadedPage) => {
      options.onCompleteNextRequest()
      requestAnimationFrame(() => elementManager.processServerLoadedElements(loadedPage), 2)
    },
    onReset: options.onDataReset,
  })

  const addScrollPreservationCallbacks = (reloadOptions: ReloadOptions): ReloadOptions => {
    const { captureScrollPosition, restoreScrollPosition } = scrollPreservation.createCallbacks()

    const originalOnBeforeUpdate = reloadOptions.onBeforeUpdate || (() => {})
    const originalOnSuccess = reloadOptions.onSuccess || (() => {})

    reloadOptions.onBeforeUpdate = (page: Page) => {
      originalOnBeforeUpdate(page)
      captureScrollPosition()
    }

    reloadOptions.onSuccess = (page: Page) => {
      originalOnSuccess(page)
      restoreScrollPosition()
    }

    return reloadOptions
  }

  const originalFetchNext = dataManager.fetchNext
  dataManager.fetchNext = (reloadOptions: ReloadOptions = {}) => {
    if (options.inReverseMode()) {
      reloadOptions = addScrollPreservationCallbacks(reloadOptions)
    }

    originalFetchNext(reloadOptions)
  }

  const originalFetchPrevious = dataManager.fetchPrevious
  dataManager.fetchPrevious = (reloadOptions: ReloadOptions = {}) => {
    if (!options.inReverseMode()) {
      reloadOptions = addScrollPreservationCallbacks(reloadOptions)
    }

    originalFetchPrevious(reloadOptions)
  }

  const removeEventListener = router.on('success', () => requestAnimationFrame(elementManager.refreshTriggers, 2))

  return {
    dataManager,
    elementManager,
    flush: () => {
      removeEventListener()
      dataManager.removeEventListener()
      elementManager.flushAll()
      queryStringManager.cancel()
    },
  }
}


================================================
FILE: packages/core/src/initialVisit.ts
================================================
import { eventHandler } from './eventHandler'
import { fireFlashEvent, fireNavigateEvent } from './events'
import { history } from './history'
import { navigationType } from './navigationType'
import { page as currentPage } from './page'
import { Scroll } from './scroll'
import { SessionStorage } from './sessionStorage'
import { LocationVisit, Page } from './types'

export class InitialVisit {
  public static handle(): void {
    this.clearRememberedStateOnReload()

    const scenarios = [this.handleBackForward, this.handleLocation, this.handleDefault]

    scenarios.find((handler) => handler.bind(this)())
  }

  protected static clearRememberedStateOnReload(): void {
    if (navigationType.isReload()) {
      history.deleteState(history.rememberedState)
      history.clearInitialState(history.rememberedState)
    }
  }

  protected static handleBackForward(): boolean {
    if (!navigationType.isBackForward() || !history.browserHasHistoryEntry()) {
      return false
    }

    const scrollRegions = history.getScrollRegions()

    history
      .decrypt()
      .then((data) => {
        currentPage.set(data, { preserveScroll: true, preserveState: true }).then(() => {
          Scroll.restore(scrollRegions)
          fireNavigateEvent(currentPage.get())
        })
      })
      .catch(() => {
        eventHandler.onMissingHistoryItem()
      })

    return true
  }

  /**
   * @link https://inertiajs.com/redirects#external-redirects
   */
  protected static handleLocation(): boolean {
    if (!SessionStorage.exists(SessionStorage.locationVisitKey)) {
      return false
    }

    const locationVisit: LocationVisit = SessionStorage.get(SessionStorage.locationVisitKey) || {}

    SessionStorage.remove(SessionStorage.locationVisitKey)

    if (typeof window !== 'undefined') {
      currentPage.setUrlHash(window.location.hash)
    }

    history
      .decrypt(currentPage.get())
      .then(() => {
        const rememberedState = history.getState<Page['rememberedState']>(history.rememberedState, {})
        const scrollRegions = history.getScrollRegions()
        currentPage.remember(rememberedState)

        currentPage
          .set(currentPage.get(), {
            preserveScroll: locationVisit.preserveScroll,
            preserveState: true,
          })
          .then(() => {
            if (locationVisit.preserveScroll) {
              Scroll.restore(scrollRegions)
            }

            fireNavigateEvent(currentPage.get())
          })
      })
      .catch(() => {
        eventHandler.onMissingHistoryItem()
      })

    return true
  }

  protected static handleDefault(): void {
    if (typeof window !== 'undefined') {
      currentPage.setUrlHash(window.location.hash)
    }

    currentPage.set(currentPage.get(), { preserveScroll: true, preserveState: true }).then(() => {
      if (navigationType.isReload()) {
        Scroll.restore(history.getScrollRegions())
      } else {
        Scroll.scrollToAnchor()
      }

      const page = currentPage.get()

      fireNavigateEvent(page)

      const flash = page.flash

      if (Object.keys(flash).length > 0) {
        queueMicrotask(() => fireFlashEvent(flash))
      }
    })
  }
}


================================================
FILE: packages/core/src/intersectionObservers.ts
================================================
type IntersectionObserverCallback = (entry: IntersectionObserverEntry) => void

interface IntersectionObserverManager {
  new: (callback: IntersectionObserverCallback, options?: IntersectionObserverInit) => IntersectionObserver
  flushAll: () => void
}

export const useIntersectionObservers = (): IntersectionObserverManager => {
  const int
Download .txt
gitextract_nfe091gr/

├── .editorconfig
├── .gitattributes
├── .github/
│   ├── CODE_OF_CONDUCT.md
│   ├── ISSUE_TEMPLATE/
│   │   ├── 0-bug-report.yml
│   │   ├── 1-bug-report-react.yml
│   │   ├── 2-bug-report-vue.yml
│   │   ├── 3-bug-report-svelte.yml
│   │   └── config.yml
│   ├── PULL_REQUEST_TEMPLATE.md
│   ├── SECURITY.md
│   ├── SUPPORT.md
│   └── workflows/
│       ├── build.yml
│       ├── coding-standards.yml
│       ├── es2020-compatibility.yml
│       ├── playwright-chromium.yml
│       ├── playwright-firefox.yml
│       ├── playwright-webkit.yml
│       ├── publish.yml
│       ├── test-app-quality.yml
│       └── update-changelog.yml
├── .gitignore
├── .prettierignore
├── CHANGELOG.md
├── CONTRIBUTING.md
├── LICENSE.md
├── README.md
├── package.json
├── packages/
│   ├── core/
│   │   ├── .gitignore
│   │   ├── LICENSE
│   │   ├── build.js
│   │   ├── package.json
│   │   ├── readme.md
│   │   ├── src/
│   │   │   ├── config.ts
│   │   │   ├── debounce.ts
│   │   │   ├── debug.ts
│   │   │   ├── dialog.ts
│   │   │   ├── domUtils.ts
│   │   │   ├── encryption.ts
│   │   │   ├── eventHandler.ts
│   │   │   ├── events.ts
│   │   │   ├── files.ts
│   │   │   ├── formData.ts
│   │   │   ├── formObject.ts
│   │   │   ├── head.ts
│   │   │   ├── history.ts
│   │   │   ├── index.ts
│   │   │   ├── infiniteScroll/
│   │   │   │   ├── data.ts
│   │   │   │   ├── elements.ts
│   │   │   │   ├── queryString.ts
│   │   │   │   └── scrollPreservation.ts
│   │   │   ├── infiniteScroll.ts
│   │   │   ├── initialVisit.ts
│   │   │   ├── intersectionObservers.ts
│   │   │   ├── modal.ts
│   │   │   ├── navigationEvents.ts
│   │   │   ├── navigationType.ts
│   │   │   ├── objectUtils.ts
│   │   │   ├── page.ts
│   │   │   ├── poll.ts
│   │   │   ├── polls.ts
│   │   │   ├── prefetched.ts
│   │   │   ├── progress-component.ts
│   │   │   ├── progress.ts
│   │   │   ├── queue.ts
│   │   │   ├── request.ts
│   │   │   ├── requestParams.ts
│   │   │   ├── requestStream.ts
│   │   │   ├── resetFormFields.ts
│   │   │   ├── response.ts
│   │   │   ├── router.ts
│   │   │   ├── scroll.ts
│   │   │   ├── server.ts
│   │   │   ├── sessionStorage.ts
│   │   │   ├── time.ts
│   │   │   ├── types.ts
│   │   │   ├── url.ts
│   │   │   └── useFormUtils.ts
│   │   └── tsconfig.json
│   ├── react/
│   │   ├── .gitignore
│   │   ├── LICENSE
│   │   ├── build.js
│   │   ├── package.json
│   │   ├── readme.md
│   │   ├── resources/
│   │   │   └── boost/
│   │   │       ├── guidelines/
│   │   │       │   └── core.blade.php
│   │   │       └── skills/
│   │   │           └── inertia-react-development/
│   │   │               └── SKILL.blade.php
│   │   ├── src/
│   │   │   ├── App.ts
│   │   │   ├── Deferred.ts
│   │   │   ├── Form.ts
│   │   │   ├── Head.ts
│   │   │   ├── HeadContext.ts
│   │   │   ├── InfiniteScroll.ts
│   │   │   ├── Link.ts
│   │   │   ├── PageContext.ts
│   │   │   ├── WhenVisible.ts
│   │   │   ├── createInertiaApp.ts
│   │   │   ├── index.ts
│   │   │   ├── react.ts
│   │   │   ├── server.ts
│   │   │   ├── types.ts
│   │   │   ├── useForm.ts
│   │   │   ├── usePage.ts
│   │   │   ├── usePoll.ts
│   │   │   ├── usePrefetch.ts
│   │   │   └── useRemember.ts
│   │   ├── test-app/
│   │   │   ├── Layouts/
│   │   │   │   ├── NestedLayout.tsx
│   │   │   │   ├── Prefetch.tsx
│   │   │   │   ├── SWR.tsx
│   │   │   │   ├── SiteLayout.tsx
│   │   │   │   ├── WithScrollRegion.tsx
│   │   │   │   └── WithoutScrollRegion.tsx
│   │   │   ├── Pages/
│   │   │   │   ├── Article.tsx
│   │   │   │   ├── ClientSideVisit/
│   │   │   │   │   ├── Page1.tsx
│   │   │   │   │   ├── Page2.tsx
│   │   │   │   │   ├── Props.tsx
│   │   │   │   │   └── Sequential.tsx
│   │   │   │   ├── ComplexMergeSelective.tsx
│   │   │   │   ├── CustomConfig.tsx
│   │   │   │   ├── DeepMergeProps.tsx
│   │   │   │   ├── DeferredProps/
│   │   │   │   │   ├── BackButton/
│   │   │   │   │   │   ├── PageA.tsx
│   │   │   │   │   │   └── PageB.tsx
│   │   │   │   │   ├── InstantReload.tsx
│   │   │   │   │   ├── ManyGroups.tsx
│   │   │   │   │   ├── Page1.tsx
│   │   │   │   │   ├── Page2.tsx
│   │   │   │   │   ├── Page3.tsx
│   │   │   │   │   ├── PartialReloads.tsx
│   │   │   │   │   ├── RapidNavigation.tsx
│   │   │   │   │   ├── ReloadWithoutOptionalChaining.tsx
│   │   │   │   │   ├── WithErrors.tsx
│   │   │   │   │   ├── WithPartialReload.tsx
│   │   │   │   │   ├── WithQueryParams.tsx
│   │   │   │   │   └── WithReload.tsx
│   │   │   │   ├── Dump.tsx
│   │   │   │   ├── ErrorModal.tsx
│   │   │   │   ├── Events.tsx
│   │   │   │   ├── Flash/
│   │   │   │   │   ├── ClientSideVisits.tsx
│   │   │   │   │   ├── Events.tsx
│   │   │   │   │   ├── InitialFlash.tsx
│   │   │   │   │   ├── Partial.tsx
│   │   │   │   │   ├── RouterFlash.tsx
│   │   │   │   │   ├── WithDeferred.tsx
│   │   │   │   │   └── WithInfiniteScroll.tsx
│   │   │   │   ├── FormComponent/
│   │   │   │   │   ├── ChildComponent.tsx
│   │   │   │   │   ├── Context/
│   │   │   │   │   │   ├── ChildComponent.tsx
│   │   │   │   │   │   ├── DeeplyNestedComponent.tsx
│   │   │   │   │   │   ├── Default.tsx
│   │   │   │   │   │   ├── Methods.tsx
│   │   │   │   │   │   ├── MethodsTestComponent.tsx
│   │   │   │   │   │   ├── Multiple.tsx
│   │   │   │   │   │   ├── NestedComponent.tsx
│   │   │   │   │   │   └── OutsideFormComponent.tsx
│   │   │   │   │   ├── DataMethods.tsx
│   │   │   │   │   ├── DefaultValue.tsx
│   │   │   │   │   ├── DisableWhileProcessing.tsx
│   │   │   │   │   ├── DottedKeys.tsx
│   │   │   │   │   ├── Elements.tsx
│   │   │   │   │   ├── EmptyAction.tsx
│   │   │   │   │   ├── Errors.tsx
│   │   │   │   │   ├── Events.tsx
│   │   │   │   │   ├── FormTarget.tsx
│   │   │   │   │   ├── Headers.tsx
│   │   │   │   │   ├── InvalidateTags.tsx
│   │   │   │   │   ├── Methods.tsx
│   │   │   │   │   ├── MixedKeySerialization.tsx
│   │   │   │   │   ├── Options.tsx
│   │   │   │   │   ├── Precognition/
│   │   │   │   │   │   ├── BeforeValidation.tsx
│   │   │   │   │   │   ├── Callbacks.tsx
│   │   │   │   │   │   ├── Cancel.tsx
│   │   │   │   │   │   ├── Default.tsx
│   │   │   │   │   │   ├── DynamicArrayInputs.tsx
│   │   │   │   │   │   ├── ErrorSync.tsx
│   │   │   │   │   │   ├── Files.tsx
│   │   │   │   │   │   ├── Headers.tsx
│   │   │   │   │   │   ├── Methods.tsx
│   │   │   │   │   │   ├── Transform.tsx
│   │   │   │   │   │   ├── TransformKeys.tsx
│   │   │   │   │   │   ├── WithAllErrors.tsx
│   │   │   │   │   │   ├── WithAllErrorsConfig.tsx
│   │   │   │   │   │   └── WithoutAllErrors.tsx
│   │   │   │   │   ├── Progress.tsx
│   │   │   │   │   ├── Ref.tsx
│   │   │   │   │   ├── Reset.tsx
│   │   │   │   │   ├── ResetAttributes/
│   │   │   │   │   │   ├── ResetOnError.tsx
│   │   │   │   │   │   ├── ResetOnErrorFields.tsx
│   │   │   │   │   │   ├── ResetOnSuccess.tsx
│   │   │   │   │   │   └── ResetOnSuccessFields.tsx
│   │   │   │   │   ├── SetDefaultsOnSuccess.tsx
│   │   │   │   │   ├── SubmitButton.tsx
│   │   │   │   │   ├── SubmitComplete/
│   │   │   │   │   │   ├── Defaults.tsx
│   │   │   │   │   │   ├── Redirect.tsx
│   │   │   │   │   │   └── Reset.tsx
│   │   │   │   │   ├── Transform.tsx
│   │   │   │   │   ├── UppercaseMethod.tsx
│   │   │   │   │   ├── ViewTransition.tsx
│   │   │   │   │   └── Wayfinder.tsx
│   │   │   │   ├── FormHelper/
│   │   │   │   │   ├── Data.tsx
│   │   │   │   │   ├── Dirty.tsx
│   │   │   │   │   ├── EffectCount.tsx
│   │   │   │   │   ├── EmptyForm.tsx
│   │   │   │   │   ├── Errors.tsx
│   │   │   │   │   ├── ErrorsClearOnResubmit.tsx
│   │   │   │   │   ├── Events.tsx
│   │   │   │   │   ├── Methods.tsx
│   │   │   │   │   ├── Nested.tsx
│   │   │   │   │   ├── Precognition/
│   │   │   │   │   │   ├── BeforeValidation.tsx
│   │   │   │   │   │   ├── Callbacks.tsx
│   │   │   │   │   │   ├── Cancel.tsx
│   │   │   │   │   │   ├── Compatibility.tsx
│   │   │   │   │   │   ├── Default.tsx
│   │   │   │   │   │   ├── DynamicArrayInputs.tsx
│   │   │   │   │   │   ├── ErrorSync.tsx
│   │   │   │   │   │   ├── Files.tsx
│   │   │   │   │   │   ├── Headers.tsx
│   │   │   │   │   │   ├── Instantiate.tsx
│   │   │   │   │   │   ├── Methods.tsx
│   │   │   │   │   │   ├── Transform.tsx
│   │   │   │   │   │   ├── TransformKeys.tsx
│   │   │   │   │   │   ├── WithAllErrors.tsx
│   │   │   │   │   │   ├── WithAllErrorsConfig.tsx
│   │   │   │   │   │   └── WithoutAllErrors.tsx
│   │   │   │   │   ├── RememberEdit.tsx
│   │   │   │   │   ├── RememberIndex.tsx
│   │   │   │   │   ├── Transform.tsx
│   │   │   │   │   └── TypeScript/
│   │   │   │   │       ├── Any.tsx
│   │   │   │   │       ├── Child.tsx
│   │   │   │   │       ├── CircularlReferences.tsx
│   │   │   │   │       ├── Data.tsx
│   │   │   │   │       ├── DynamicInputName.tsx
│   │   │   │   │       ├── Errors.tsx
│   │   │   │   │       ├── Generic.tsx
│   │   │   │   │       ├── Nullable.tsx
│   │   │   │   │       ├── NullableNestedObject.tsx
│   │   │   │   │       ├── OptionalProps.tsx
│   │   │   │   │       ├── Parent.tsx
│   │   │   │   │       ├── Precognition.tsx
│   │   │   │   │       └── ValidationKey.tsx
│   │   │   │   ├── Head/
│   │   │   │   │   ├── Conditional.tsx
│   │   │   │   │   ├── Dataset.tsx
│   │   │   │   │   ├── Mixed.tsx
│   │   │   │   │   ├── Reactive.tsx
│   │   │   │   │   ├── WithTitle.tsx
│   │   │   │   │   └── WithoutTitle.tsx
│   │   │   │   ├── Head.tsx
│   │   │   │   ├── History/
│   │   │   │   │   ├── Page.tsx
│   │   │   │   │   └── Version.tsx
│   │   │   │   ├── HistoryQuota/
│   │   │   │   │   └── Page.tsx
│   │   │   │   ├── HistoryThrottle.tsx
│   │   │   │   ├── Home.tsx
│   │   │   │   ├── InfiniteScroll/
│   │   │   │   │   ├── CustomElement.tsx
│   │   │   │   │   ├── CustomTriggersRef.tsx
│   │   │   │   │   ├── CustomTriggersRefObject.tsx
│   │   │   │   │   ├── CustomTriggersSelector.tsx
│   │   │   │   │   ├── DataTable.tsx
│   │   │   │   │   ├── Deferred.tsx
│   │   │   │   │   ├── DualContainers.tsx
│   │   │   │   │   ├── DualSibling.tsx
│   │   │   │   │   ├── Empty.tsx
│   │   │   │   │   ├── Filtering.tsx
│   │   │   │   │   ├── FilteringManual.tsx
│   │   │   │   │   ├── FilteringReset.tsx
│   │   │   │   │   ├── Grid.tsx
│   │   │   │   │   ├── HorizontalScroll.tsx
│   │   │   │   │   ├── InfiniteScrollWithLink.tsx
│   │   │   │   │   ├── InvisibleFirstChild.tsx
│   │   │   │   │   ├── Links.tsx
│   │   │   │   │   ├── Manual.tsx
│   │   │   │   │   ├── ManualAfter.tsx
│   │   │   │   │   ├── OverflowX.tsx
│   │   │   │   │   ├── PreserveUrl.tsx
│   │   │   │   │   ├── ProgrammaticRef.tsx
│   │   │   │   │   ├── ReloadUnrelated.tsx
│   │   │   │   │   ├── RememberState.tsx
│   │   │   │   │   ├── Reverse.tsx
│   │   │   │   │   ├── ReverseShortContent.tsx
│   │   │   │   │   ├── ScrollContainer.tsx
│   │   │   │   │   ├── ShortContent.tsx
│   │   │   │   │   ├── Toggles.tsx
│   │   │   │   │   ├── TriggerBoth.tsx
│   │   │   │   │   ├── TriggerEndBuffer.tsx
│   │   │   │   │   ├── TriggerStartBuffer.tsx
│   │   │   │   │   ├── UpdateQueryString.tsx
│   │   │   │   │   └── UserCard.tsx
│   │   │   │   ├── Links/
│   │   │   │   │   ├── AsComponent.tsx
│   │   │   │   │   ├── AsElement.tsx
│   │   │   │   │   ├── AsWarning.tsx
│   │   │   │   │   ├── AsWarningFalse.tsx
│   │   │   │   │   ├── AutomaticCancellation.tsx
│   │   │   │   │   ├── CancelSyncRequest.tsx
│   │   │   │   │   ├── Data/
│   │   │   │   │   │   ├── AutoConverted.tsx
│   │   │   │   │   │   ├── FormData.tsx
│   │   │   │   │   │   └── Object.tsx
│   │   │   │   │   ├── DataLoading.tsx
│   │   │   │   │   ├── Headers.tsx
│   │   │   │   │   ├── Location.tsx
│   │   │   │   │   ├── Method.tsx
│   │   │   │   │   ├── PartialReloads.tsx
│   │   │   │   │   ├── PathTraversal.tsx
│   │   │   │   │   ├── PreserveScroll.tsx
│   │   │   │   │   ├── PreserveScrollFalse.tsx
│   │   │   │   │   ├── PreserveState.tsx
│   │   │   │   │   ├── PreserveUrl.tsx
│   │   │   │   │   ├── PropUpdate.tsx
│   │   │   │   │   ├── Reactivity.tsx
│   │   │   │   │   ├── Replace.tsx
│   │   │   │   │   ├── ScrollRegionList.tsx
│   │   │   │   │   └── UrlFragments.tsx
│   │   │   │   ├── MatchPropsOnKey.tsx
│   │   │   │   ├── MergeNestedProps.tsx
│   │   │   │   ├── MergeProps.tsx
│   │   │   │   ├── NavigateNonInertia.tsx
│   │   │   │   ├── NetworkError.tsx
│   │   │   │   ├── OnceProps/
│   │   │   │   │   ├── ClientSideVisit.tsx
│   │   │   │   │   ├── CustomKeyPageA.tsx
│   │   │   │   │   ├── CustomKeyPageB.tsx
│   │   │   │   │   ├── DeferredPageA.tsx
│   │   │   │   │   ├── DeferredPageB.tsx
│   │   │   │   │   ├── DeferredPageC.tsx
│   │   │   │   │   ├── MergePageA.tsx
│   │   │   │   │   ├── MergePageB.tsx
│   │   │   │   │   ├── OptionalPageA.tsx
│   │   │   │   │   ├── OptionalPageB.tsx
│   │   │   │   │   ├── PageA.tsx
│   │   │   │   │   ├── PageB.tsx
│   │   │   │   │   ├── PageC.tsx
│   │   │   │   │   ├── PageD.tsx
│   │   │   │   │   ├── PageE.tsx
│   │   │   │   │   ├── PartialReloadA.tsx
│   │   │   │   │   ├── PartialReloadB.tsx
│   │   │   │   │   ├── SlowDeferredPageA.tsx
│   │   │   │   │   ├── SlowDeferredPageB.tsx
│   │   │   │   │   ├── TtlPageA.tsx
│   │   │   │   │   ├── TtlPageB.tsx
│   │   │   │   │   └── TtlPageC.tsx
│   │   │   │   ├── PersistentLayouts/
│   │   │   │   │   ├── RenderFunction/
│   │   │   │   │   │   ├── Nested/
│   │   │   │   │   │   │   ├── PageA.tsx
│   │   │   │   │   │   │   └── PageB.tsx
│   │   │   │   │   │   └── Simple/
│   │   │   │   │   │       ├── PageA.tsx
│   │   │   │   │   │       └── PageB.tsx
│   │   │   │   │   └── Shorthand/
│   │   │   │   │       ├── Nested/
│   │   │   │   │       │   ├── PageA.tsx
│   │   │   │   │       │   └── PageB.tsx
│   │   │   │   │       └── Simple/
│   │   │   │   │           ├── PageA.tsx
│   │   │   │   │           └── PageB.tsx
│   │   │   │   ├── Poll/
│   │   │   │   │   ├── Hook.tsx
│   │   │   │   │   ├── HookManual.tsx
│   │   │   │   │   ├── RouterManual.tsx
│   │   │   │   │   └── UnchangedData.tsx
│   │   │   │   ├── Prefetch/
│   │   │   │   │   ├── AfterError.tsx
│   │   │   │   │   ├── Form.tsx
│   │   │   │   │   ├── Page.tsx
│   │   │   │   │   ├── PreserveState.tsx
│   │   │   │   │   ├── SWR.tsx
│   │   │   │   │   ├── Tags.tsx
│   │   │   │   │   ├── TestPage.tsx
│   │   │   │   │   └── Wayfinder.tsx
│   │   │   │   ├── PreserveEqualProps.tsx
│   │   │   │   ├── Progress.tsx
│   │   │   │   ├── ProgressComponent.tsx
│   │   │   │   ├── Reload/
│   │   │   │   │   ├── Concurrent.tsx
│   │   │   │   │   └── ConcurrentWithData.tsx
│   │   │   │   ├── Remember/
│   │   │   │   │   ├── Components/
│   │   │   │   │   │   ├── ComponentA.tsx
│   │   │   │   │   │   └── ComponentB.tsx
│   │   │   │   │   ├── Default.tsx
│   │   │   │   │   ├── FormHelper/
│   │   │   │   │   │   ├── Default.tsx
│   │   │   │   │   │   ├── Password.tsx
│   │   │   │   │   │   └── Remember.tsx
│   │   │   │   │   ├── MultipleComponents.tsx
│   │   │   │   │   ├── Object.tsx
│   │   │   │   │   └── Router.tsx
│   │   │   │   ├── SSR/
│   │   │   │   │   ├── Page1.tsx
│   │   │   │   │   ├── Page2.tsx
│   │   │   │   │   └── PageWithScriptElement.tsx
│   │   │   │   ├── ScrollAfterRender.tsx
│   │   │   │   ├── ScrollRegionPreserveUrl.tsx
│   │   │   │   ├── ScrollSmooth.tsx
│   │   │   │   ├── ScrollableParent.tsx
│   │   │   │   ├── TypeScriptCreateInertiaApp.ts
│   │   │   │   ├── TypeScriptFlash.tsx
│   │   │   │   ├── TypeScriptProps.tsx
│   │   │   │   ├── ViewTransition/
│   │   │   │   │   ├── FormErrors.tsx
│   │   │   │   │   ├── PageA.tsx
│   │   │   │   │   └── PageB.tsx
│   │   │   │   ├── Visits/
│   │   │   │   │   ├── AfterError.tsx
│   │   │   │   │   ├── AutomaticCancellation.tsx
│   │   │   │   │   ├── Data/
│   │   │   │   │   │   ├── AutoConverted.tsx
│   │   │   │   │   │   ├── FormData.tsx
│   │   │   │   │   │   └── Object.tsx
│   │   │   │   │   ├── ErrorBags.tsx
│   │   │   │   │   ├── Headers.tsx
│   │   │   │   │   ├── Location.tsx
│   │   │   │   │   ├── Method.tsx
│   │   │   │   │   ├── PartialReloads.tsx
│   │   │   │   │   ├── PreserveScroll.tsx
│   │   │   │   │   ├── PreserveScrollFalse.tsx
│   │   │   │   │   ├── PreserveState.tsx
│   │   │   │   │   ├── ReloadOnMount.tsx
│   │   │   │   │   ├── Replace.tsx
│   │   │   │   │   ├── UrlFragments.tsx
│   │   │   │   │   └── Wayfinder.tsx
│   │   │   │   ├── WhenVisible.tsx
│   │   │   │   ├── WhenVisibleArrayReload.tsx
│   │   │   │   ├── WhenVisibleBackButton.tsx
│   │   │   │   ├── WhenVisibleFetching.tsx
│   │   │   │   ├── WhenVisibleMergeParams.tsx
│   │   │   │   ├── WhenVisibleParamsUpdate.tsx
│   │   │   │   └── WhenVisibleReload.tsx
│   │   │   ├── app.tsx
│   │   │   ├── eslint.config.js
│   │   │   ├── index.html
│   │   │   ├── package.json
│   │   │   ├── ssr.tsx
│   │   │   ├── tsconfig.json
│   │   │   ├── types.d.ts
│   │   │   └── vite.config.ts
│   │   └── tsconfig.json
│   ├── svelte/
│   │   ├── .gitignore
│   │   ├── LICENSE
│   │   ├── package.json
│   │   ├── readme.md
│   │   ├── resources/
│   │   │   └── boost/
│   │   │       ├── guidelines/
│   │   │       │   └── core.blade.php
│   │   │       └── skills/
│   │   │           └── inertia-svelte-development/
│   │   │               └── SKILL.blade.php
│   │   ├── src/
│   │   │   ├── components/
│   │   │   │   ├── App.svelte
│   │   │   │   ├── Deferred.svelte
│   │   │   │   ├── Form.svelte
│   │   │   │   ├── InfiniteScroll.svelte
│   │   │   │   ├── Link.svelte
│   │   │   │   ├── Render.svelte
│   │   │   │   ├── WhenVisible.svelte
│   │   │   │   └── formContext.ts
│   │   │   ├── createInertiaApp.ts
│   │   │   ├── index.ts
│   │   │   ├── link.ts
│   │   │   ├── page.ts
│   │   │   ├── server.ts
│   │   │   ├── types.ts
│   │   │   ├── useForm.ts
│   │   │   ├── usePoll.ts
│   │   │   ├── usePrefetch.ts
│   │   │   └── useRemember.ts
│   │   ├── svelte.config.js
│   │   ├── test-app/
│   │   │   ├── .gitignore
│   │   │   ├── Layouts/
│   │   │   │   ├── NestedLayout.svelte
│   │   │   │   ├── Prefetch.svelte
│   │   │   │   ├── SWR.svelte
│   │   │   │   ├── SiteLayout.svelte
│   │   │   │   ├── WithScrollRegion.svelte
│   │   │   │   └── WithoutScrollRegion.svelte
│   │   │   ├── Pages/
│   │   │   │   ├── Article.svelte
│   │   │   │   ├── ClientSideVisit/
│   │   │   │   │   ├── Page1.svelte
│   │   │   │   │   ├── Page2.svelte
│   │   │   │   │   ├── Props.svelte
│   │   │   │   │   └── Sequential.svelte
│   │   │   │   ├── ComplexMergeSelective.svelte
│   │   │   │   ├── CustomConfig.svelte
│   │   │   │   ├── DeepMergeProps.svelte
│   │   │   │   ├── DeferredProps/
│   │   │   │   │   ├── BackButton/
│   │   │   │   │   │   ├── PageA.svelte
│   │   │   │   │   │   └── PageB.svelte
│   │   │   │   │   ├── InstantReload.svelte
│   │   │   │   │   ├── ManyGroups.svelte
│   │   │   │   │   ├── Page1.svelte
│   │   │   │   │   ├── Page2.svelte
│   │   │   │   │   ├── Page3.svelte
│   │   │   │   │   ├── PartialReloads.svelte
│   │   │   │   │   ├── RapidNavigation.svelte
│   │   │   │   │   ├── ReloadResults.svelte
│   │   │   │   │   ├── ReloadWithoutOptionalChaining.svelte
│   │   │   │   │   ├── WithErrors.svelte
│   │   │   │   │   ├── WithQueryParams.svelte
│   │   │   │   │   └── WithReload.svelte
│   │   │   │   ├── Dump.svelte
│   │   │   │   ├── ErrorModal.svelte
│   │   │   │   ├── Events.svelte
│   │   │   │   ├── Flash/
│   │   │   │   │   ├── ClientSideVisits.svelte
│   │   │   │   │   ├── Events.svelte
│   │   │   │   │   ├── InitialFlash.svelte
│   │   │   │   │   ├── Partial.svelte
│   │   │   │   │   ├── RouterFlash.svelte
│   │   │   │   │   ├── WithDeferred.svelte
│   │   │   │   │   └── WithInfiniteScroll.svelte
│   │   │   │   ├── FormComponent/
│   │   │   │   │   ├── Context/
│   │   │   │   │   │   ├── ChildComponent.svelte
│   │   │   │   │   │   ├── DeeplyNestedComponent.svelte
│   │   │   │   │   │   ├── Default.svelte
│   │   │   │   │   │   ├── Methods.svelte
│   │   │   │   │   │   ├── MethodsTestComponent.svelte
│   │   │   │   │   │   ├── Multiple.svelte
│   │   │   │   │   │   ├── NestedComponent.svelte
│   │   │   │   │   │   └── OutsideFormComponent.svelte
│   │   │   │   │   ├── DataMethods.svelte
│   │   │   │   │   ├── DefaultValue.svelte
│   │   │   │   │   ├── DisableWhileProcessing.svelte
│   │   │   │   │   ├── DottedKeys.svelte
│   │   │   │   │   ├── Elements.svelte
│   │   │   │   │   ├── EmptyAction.svelte
│   │   │   │   │   ├── Errors.svelte
│   │   │   │   │   ├── Events.svelte
│   │   │   │   │   ├── FormTarget.svelte
│   │   │   │   │   ├── Headers.svelte
│   │   │   │   │   ├── InvalidateTags.svelte
│   │   │   │   │   ├── Methods.svelte
│   │   │   │   │   ├── MixedKeySerialization.svelte
│   │   │   │   │   ├── Options.svelte
│   │   │   │   │   ├── Precognition/
│   │   │   │   │   │   ├── BeforeValidation.svelte
│   │   │   │   │   │   ├── Callbacks.svelte
│   │   │   │   │   │   ├── Cancel.svelte
│   │   │   │   │   │   ├── Default.svelte
│   │   │   │   │   │   ├── DynamicArrayInputs.svelte
│   │   │   │   │   │   ├── ErrorSync.svelte
│   │   │   │   │   │   ├── Files.svelte
│   │   │   │   │   │   ├── Headers.svelte
│   │   │   │   │   │   ├── Methods.svelte
│   │   │   │   │   │   ├── Transform.svelte
│   │   │   │   │   │   ├── TransformKeys.svelte
│   │   │   │   │   │   ├── WithAllErrors.svelte
│   │   │   │   │   │   ├── WithAllErrorsConfig.svelte
│   │   │   │   │   │   └── WithoutAllErrors.svelte
│   │   │   │   │   ├── Progress.svelte
│   │   │   │   │   ├── Ref.svelte
│   │   │   │   │   ├── Reset.svelte
│   │   │   │   │   ├── ResetAttributes/
│   │   │   │   │   │   ├── ResetOnError.svelte
│   │   │   │   │   │   ├── ResetOnErrorFields.svelte
│   │   │   │   │   │   ├── ResetOnSuccess.svelte
│   │   │   │   │   │   └── ResetOnSuccessFields.svelte
│   │   │   │   │   ├── SetDefaultsOnSuccess.svelte
│   │   │   │   │   ├── SubmitButton.svelte
│   │   │   │   │   ├── SubmitComplete/
│   │   │   │   │   │   ├── Defaults.svelte
│   │   │   │   │   │   ├── Redirect.svelte
│   │   │   │   │   │   └── Reset.svelte
│   │   │   │   │   ├── Transform.svelte
│   │   │   │   │   ├── UppercaseMethod.svelte
│   │   │   │   │   ├── ViewTransition.svelte
│   │   │   │   │   └── Wayfinder.svelte
│   │   │   │   ├── FormHelper/
│   │   │   │   │   ├── Data.svelte
│   │   │   │   │   ├── Dirty.svelte
│   │   │   │   │   ├── EmptyForm.svelte
│   │   │   │   │   ├── Errors.svelte
│   │   │   │   │   ├── ErrorsClearOnResubmit.svelte
│   │   │   │   │   ├── Events.svelte
│   │   │   │   │   ├── Methods.svelte
│   │   │   │   │   ├── Nested.svelte
│   │   │   │   │   ├── Precognition/
│   │   │   │   │   │   ├── BeforeValidation.svelte
│   │   │   │   │   │   ├── Callbacks.svelte
│   │   │   │   │   │   ├── Cancel.svelte
│   │   │   │   │   │   ├── Compatibility.svelte
│   │   │   │   │   │   ├── Default.svelte
│   │   │   │   │   │   ├── DynamicArrayInputs.svelte
│   │   │   │   │   │   ├── ErrorSync.svelte
│   │   │   │   │   │   ├── Files.svelte
│   │   │   │   │   │   ├── Headers.svelte
│   │   │   │   │   │   ├── Instantiate.svelte
│   │   │   │   │   │   ├── Methods.svelte
│   │   │   │   │   │   ├── Transform.svelte
│   │   │   │   │   │   ├── TransformKeys.svelte
│   │   │   │   │   │   ├── WithAllErrors.svelte
│   │   │   │   │   │   ├── WithAllErrorsConfig.svelte
│   │   │   │   │   │   └── WithoutAllErrors.svelte
│   │   │   │   │   ├── RememberEdit.svelte
│   │   │   │   │   ├── RememberIndex.svelte
│   │   │   │   │   ├── ReservedKeys.svelte
│   │   │   │   │   ├── Transform.svelte
│   │   │   │   │   └── TypeScript/
│   │   │   │   │       ├── Any.svelte
│   │   │   │   │       ├── Child.svelte
│   │   │   │   │       ├── CircularReferences.svelte
│   │   │   │   │       ├── Data.svelte
│   │   │   │   │       ├── DynamicInputName.svelte
│   │   │   │   │       ├── Errors.svelte
│   │   │   │   │       ├── FormDataCallback.svelte
│   │   │   │   │       ├── Generic.svelte
│   │   │   │   │       ├── Nullable.svelte
│   │   │   │   │       ├── NullableNestedObject.svelte
│   │   │   │   │       ├── OptionalProps.svelte
│   │   │   │   │       ├── Parent.svelte
│   │   │   │   │       ├── Precognition.svelte
│   │   │   │   │       ├── ValidationKey.svelte
│   │   │   │   │       ├── WrapperChild.svelte
│   │   │   │   │       └── WrapperParent.svelte
│   │   │   │   ├── History/
│   │   │   │   │   ├── Page.svelte
│   │   │   │   │   └── Version.svelte
│   │   │   │   ├── HistoryQuota/
│   │   │   │   │   └── Page.svelte
│   │   │   │   ├── HistoryThrottle.svelte
│   │   │   │   ├── Home.svelte
│   │   │   │   ├── InfiniteScroll/
│   │   │   │   │   ├── CustomElement.svelte
│   │   │   │   │   ├── CustomTriggersRef.svelte
│   │   │   │   │   ├── CustomTriggersRefObject.svelte
│   │   │   │   │   ├── CustomTriggersSelector.svelte
│   │   │   │   │   ├── DataTable.svelte
│   │   │   │   │   ├── Deferred.svelte
│   │   │   │   │   ├── DualContainers.svelte
│   │   │   │   │   ├── DualSibling.svelte
│   │   │   │   │   ├── Empty.svelte
│   │   │   │   │   ├── Filtering.svelte
│   │   │   │   │   ├── FilteringManual.svelte
│   │   │   │   │   ├── FilteringReset.svelte
│   │   │   │   │   ├── Grid.svelte
│   │   │   │   │   ├── HorizontalScroll.svelte
│   │   │   │   │   ├── InfiniteScrollWithLink.svelte
│   │   │   │   │   ├── InvisibleFirstChild.svelte
│   │   │   │   │   ├── Links.svelte
│   │   │   │   │   ├── Manual.svelte
│   │   │   │   │   ├── ManualAfter.svelte
│   │   │   │   │   ├── OverflowX.svelte
│   │   │   │   │   ├── PreserveUrl.svelte
│   │   │   │   │   ├── ProgrammaticRef.svelte
│   │   │   │   │   ├── ReloadUnrelated.svelte
│   │   │   │   │   ├── RememberState.svelte
│   │   │   │   │   ├── Reverse.svelte
│   │   │   │   │   ├── ReverseShortContent.svelte
│   │   │   │   │   ├── ScrollContainer.svelte
│   │   │   │   │   ├── ShortContent.svelte
│   │   │   │   │   ├── Toggles.svelte
│   │   │   │   │   ├── TriggerBoth.svelte
│   │   │   │   │   ├── TriggerEndBuffer.svelte
│   │   │   │   │   ├── TriggerStartBuffer.svelte
│   │   │   │   │   ├── UpdateQueryString.svelte
│   │   │   │   │   └── UserCard.svelte
│   │   │   │   ├── Links/
│   │   │   │   │   ├── AsWarning.svelte
│   │   │   │   │   ├── AsWarningFalse.svelte
│   │   │   │   │   ├── AutomaticCancellation.svelte
│   │   │   │   │   ├── CancelSyncRequest.svelte
│   │   │   │   │   ├── Data/
│   │   │   │   │   │   ├── AutoConverted.svelte
│   │   │   │   │   │   ├── FormData.svelte
│   │   │   │   │   │   └── Object.svelte
│   │   │   │   │   ├── DataLoading.svelte
│   │   │   │   │   ├── Headers.svelte
│   │   │   │   │   ├── Location.svelte
│   │   │   │   │   ├── Method.svelte
│   │   │   │   │   ├── PartialReloads.svelte
│   │   │   │   │   ├── PathTraversal.svelte
│   │   │   │   │   ├── PreserveScroll.svelte
│   │   │   │   │   ├── PreserveScrollFalse.svelte
│   │   │   │   │   ├── PreserveState.svelte
│   │   │   │   │   ├── PreserveUrl.svelte
│   │   │   │   │   ├── PropUpdate.svelte
│   │   │   │   │   ├── Reactivity.svelte
│   │   │   │   │   ├── Replace.svelte
│   │   │   │   │   ├── ScrollRegionList.svelte
│   │   │   │   │   └── UrlFragments.svelte
│   │   │   │   ├── MatchPropsOnKey.svelte
│   │   │   │   ├── MergeNestedProps.svelte
│   │   │   │   ├── MergeProps.svelte
│   │   │   │   ├── NavigateNonInertia.svelte
│   │   │   │   ├── NetworkError.svelte
│   │   │   │   ├── OnceProps/
│   │   │   │   │   ├── ClientSideVisit.svelte
│   │   │   │   │   ├── CustomKeyPageA.svelte
│   │   │   │   │   ├── CustomKeyPageB.svelte
│   │   │   │   │   ├── DeferredPageA.svelte
│   │   │   │   │   ├── DeferredPageB.svelte
│   │   │   │   │   ├── DeferredPageC.svelte
│   │   │   │   │   ├── MergePageA.svelte
│   │   │   │   │   ├── MergePageB.svelte
│   │   │   │   │   ├── OptionalPageA.svelte
│   │   │   │   │   ├── OptionalPageB.svelte
│   │   │   │   │   ├── PageA.svelte
│   │   │   │   │   ├── PageB.svelte
│   │   │   │   │   ├── PageC.svelte
│   │   │   │   │   ├── PageD.svelte
│   │   │   │   │   ├── PageE.svelte
│   │   │   │   │   ├── PartialReloadA.svelte
│   │   │   │   │   ├── PartialReloadB.svelte
│   │   │   │   │   ├── SlowDeferredPageA.svelte
│   │   │   │   │   ├── SlowDeferredPageB.svelte
│   │   │   │   │   ├── TtlPageA.svelte
│   │   │   │   │   ├── TtlPageB.svelte
│   │   │   │   │   └── TtlPageC.svelte
│   │   │   │   ├── PersistentLayouts/
│   │   │   │   │   ├── RenderFunction/
│   │   │   │   │   │   ├── Nested/
│   │   │   │   │   │   │   ├── PageA.svelte
│   │   │   │   │   │   │   └── PageB.svelte
│   │   │   │   │   │   └── Simple/
│   │   │   │   │   │       ├── PageA.svelte
│   │   │   │   │   │       └── PageB.svelte
│   │   │   │   │   └── Shorthand/
│   │   │   │   │       ├── Nested/
│   │   │   │   │       │   ├── PageA.svelte
│   │   │   │   │       │   └── PageB.svelte
│   │   │   │   │       └── Simple/
│   │   │   │   │           ├── PageA.svelte
│   │   │   │   │           └── PageB.svelte
│   │   │   │   ├── Poll/
│   │   │   │   │   ├── Hook.svelte
│   │   │   │   │   ├── HookManual.svelte
│   │   │   │   │   ├── RouterManual.svelte
│   │   │   │   │   └── UnchangedData.svelte
│   │   │   │   ├── Prefetch/
│   │   │   │   │   ├── AfterError.svelte
│   │   │   │   │   ├── Form.svelte
│   │   │   │   │   ├── Page.svelte
│   │   │   │   │   ├── PreserveState.svelte
│   │   │   │   │   ├── SWR.svelte
│   │   │   │   │   ├── Tags.svelte
│   │   │   │   │   ├── TestPage.svelte
│   │   │   │   │   └── Wayfinder.svelte
│   │   │   │   ├── PreserveEqualProps.svelte
│   │   │   │   ├── ProgressComponent.svelte
│   │   │   │   ├── Reload/
│   │   │   │   │   ├── Concurrent.svelte
│   │   │   │   │   └── ConcurrentWithData.svelte
│   │   │   │   ├── Remember/
│   │   │   │   │   ├── Components/
│   │   │   │   │   │   ├── ComponentA.svelte
│   │   │   │   │   │   └── ComponentB.svelte
│   │   │   │   │   ├── Default.svelte
│   │   │   │   │   ├── FormHelper/
│   │   │   │   │   │   ├── Default.svelte
│   │   │   │   │   │   ├── Password.svelte
│   │   │   │   │   │   └── Remember.svelte
│   │   │   │   │   ├── MultipleComponents.svelte
│   │   │   │   │   ├── Object.svelte
│   │   │   │   │   └── Router.svelte
│   │   │   │   ├── SSR/
│   │   │   │   │   ├── Page1.svelte
│   │   │   │   │   ├── Page2.svelte
│   │   │   │   │   └── PageWithScriptElement.svelte
│   │   │   │   ├── ScrollAfterRender.svelte
│   │   │   │   ├── ScrollRegionPreserveUrl.svelte
│   │   │   │   ├── ScrollSmooth.svelte
│   │   │   │   ├── ScrollableParent.svelte
│   │   │   │   ├── Svelte/
│   │   │   │   │   └── PropsAndPageStore.svelte
│   │   │   │   ├── TypeScriptCreateInertiaApp.ts
│   │   │   │   ├── TypeScriptFlash.svelte
│   │   │   │   ├── TypeScriptProps.svelte
│   │   │   │   ├── ViewTransition/
│   │   │   │   │   ├── FormErrors.svelte
│   │   │   │   │   ├── PageA.svelte
│   │   │   │   │   └── PageB.svelte
│   │   │   │   ├── Visits/
│   │   │   │   │   ├── AfterError.svelte
│   │   │   │   │   ├── AutomaticCancellation.svelte
│   │   │   │   │   ├── Data/
│   │   │   │   │   │   ├── AutoConverted.svelte
│   │   │   │   │   │   ├── FormData.svelte
│   │   │   │   │   │   └── Object.svelte
│   │   │   │   │   ├── ErrorBags.svelte
│   │   │   │   │   ├── Headers.svelte
│   │   │   │   │   ├── Location.svelte
│   │   │   │   │   ├── Method.svelte
│   │   │   │   │   ├── PartialReloads.svelte
│   │   │   │   │   ├── PreserveScroll.svelte
│   │   │   │   │   ├── PreserveScrollFalse.svelte
│   │   │   │   │   ├── PreserveState.svelte
│   │   │   │   │   ├── ReloadOnMount.svelte
│   │   │   │   │   ├── Replace.svelte
│   │   │   │   │   ├── UrlFragments.svelte
│   │   │   │   │   └── Wayfinder.svelte
│   │   │   │   ├── WhenVisible.svelte
│   │   │   │   ├── WhenVisibleArrayReload.svelte
│   │   │   │   ├── WhenVisibleBackButton.svelte
│   │   │   │   ├── WhenVisibleFetching.svelte
│   │   │   │   ├── WhenVisibleMergeParams.svelte
│   │   │   │   ├── WhenVisibleParamsUpdate.svelte
│   │   │   │   └── WhenVisibleReload.svelte
│   │   │   ├── app.ts
│   │   │   ├── eslint.config.js
│   │   │   ├── index.html
│   │   │   ├── package.json
│   │   │   ├── ssr.ts
│   │   │   ├── svelte-html.d.ts
│   │   │   ├── svelte.config.js
│   │   │   ├── tsconfig.json
│   │   │   ├── types.d.ts
│   │   │   ├── vite-env.d.ts
│   │   │   └── vite.config.js
│   │   ├── tsconfig.json
│   │   ├── vite-with-deps.config.js
│   │   └── vite.config.js
│   └── vue3/
│       ├── .gitignore
│       ├── LICENSE
│       ├── build.js
│       ├── package.json
│       ├── readme.md
│       ├── resources/
│       │   └── boost/
│       │       ├── guidelines/
│       │       │   └── core.blade.php
│       │       └── skills/
│       │           └── inertia-vue-development/
│       │               └── SKILL.blade.php
│       ├── src/
│       │   ├── app.ts
│       │   ├── createInertiaApp.ts
│       │   ├── deferred.ts
│       │   ├── form.ts
│       │   ├── head.ts
│       │   ├── index.ts
│       │   ├── infiniteScroll.ts
│       │   ├── link.ts
│       │   ├── remember.ts
│       │   ├── server.ts
│       │   ├── types.ts
│       │   ├── useForm.ts
│       │   ├── usePoll.ts
│       │   ├── usePrefetch.ts
│       │   ├── useRemember.ts
│       │   └── whenVisible.ts
│       ├── test-app/
│       │   ├── .gitignore
│       │   ├── Layouts/
│       │   │   ├── NestedLayout.vue
│       │   │   ├── Prefetch.vue
│       │   │   ├── SWR.vue
│       │   │   ├── SiteLayout.vue
│       │   │   ├── WithScrollRegion.vue
│       │   │   └── WithoutScrollRegion.vue
│       │   ├── Pages/
│       │   │   ├── Article.vue
│       │   │   ├── ClientSideVisit/
│       │   │   │   ├── Page1.vue
│       │   │   │   ├── Page2.vue
│       │   │   │   ├── Props.vue
│       │   │   │   └── Sequential.vue
│       │   │   ├── ComplexMergeSelective.vue
│       │   │   ├── CustomConfig.vue
│       │   │   ├── DeepMergeProps.vue
│       │   │   ├── DeferredProps/
│       │   │   │   ├── BackButton/
│       │   │   │   │   ├── PageA.vue
│       │   │   │   │   └── PageB.vue
│       │   │   │   ├── InstantReload.vue
│       │   │   │   ├── ManyGroups.vue
│       │   │   │   ├── Page1.vue
│       │   │   │   ├── Page2.vue
│       │   │   │   ├── Page3.vue
│       │   │   │   ├── PartialReloads.vue
│       │   │   │   ├── RapidNavigation.vue
│       │   │   │   ├── ReloadWithoutOptionalChaining.vue
│       │   │   │   ├── WithErrors.vue
│       │   │   │   ├── WithQueryParams.vue
│       │   │   │   └── WithReload.vue
│       │   │   ├── Dump.vue
│       │   │   ├── ErrorModal.vue
│       │   │   ├── Events.vue
│       │   │   ├── Flash/
│       │   │   │   ├── ClientSideVisits.vue
│       │   │   │   ├── Events.vue
│       │   │   │   ├── InitialFlash.vue
│       │   │   │   ├── Partial.vue
│       │   │   │   ├── RouterFlash.vue
│       │   │   │   ├── WithDeferred.vue
│       │   │   │   └── WithInfiniteScroll.vue
│       │   │   ├── FormComponent/
│       │   │   │   ├── Context/
│       │   │   │   │   ├── ChildComponent.vue
│       │   │   │   │   ├── DeeplyNestedComponent.vue
│       │   │   │   │   ├── Default.vue
│       │   │   │   │   ├── Methods.vue
│       │   │   │   │   ├── MethodsTestComponent.vue
│       │   │   │   │   ├── Multiple.vue
│       │   │   │   │   ├── NestedComponent.vue
│       │   │   │   │   └── OutsideFormComponent.vue
│       │   │   │   ├── DataMethods.vue
│       │   │   │   ├── DefaultValue.vue
│       │   │   │   ├── DisableWhileProcessing.vue
│       │   │   │   ├── DottedKeys.vue
│       │   │   │   ├── Elements.vue
│       │   │   │   ├── EmptyAction.vue
│       │   │   │   ├── Errors.vue
│       │   │   │   ├── Events.vue
│       │   │   │   ├── FormTarget.vue
│       │   │   │   ├── Headers.vue
│       │   │   │   ├── InvalidateTags.vue
│       │   │   │   ├── Methods.vue
│       │   │   │   ├── MixedKeySerialization.vue
│       │   │   │   ├── Options.vue
│       │   │   │   ├── Precognition/
│       │   │   │   │   ├── BeforeValidation.vue
│       │   │   │   │   ├── Callbacks.vue
│       │   │   │   │   ├── Cancel.vue
│       │   │   │   │   ├── Default.vue
│       │   │   │   │   ├── DynamicArrayInputs.vue
│       │   │   │   │   ├── ErrorSync.vue
│       │   │   │   │   ├── Files.vue
│       │   │   │   │   ├── Headers.vue
│       │   │   │   │   ├── Methods.vue
│       │   │   │   │   ├── Transform.vue
│       │   │   │   │   ├── TransformKeys.vue
│       │   │   │   │   ├── WithAllErrors.vue
│       │   │   │   │   ├── WithAllErrorsConfig.vue
│       │   │   │   │   └── WithoutAllErrors.vue
│       │   │   │   ├── Progress.vue
│       │   │   │   ├── Ref.vue
│       │   │   │   ├── Reset.vue
│       │   │   │   ├── ResetAttributes/
│       │   │   │   │   ├── ResetOnError.vue
│       │   │   │   │   ├── ResetOnErrorFields.vue
│       │   │   │   │   ├── ResetOnSuccess.vue
│       │   │   │   │   └── ResetOnSuccessFields.vue
│       │   │   │   ├── SetDefaultsOnSuccess.vue
│       │   │   │   ├── SubmitButton.vue
│       │   │   │   ├── SubmitComplete/
│       │   │   │   │   ├── Defaults.vue
│       │   │   │   │   ├── Redirect.vue
│       │   │   │   │   └── Reset.vue
│       │   │   │   ├── Transform.vue
│       │   │   │   ├── UppercaseMethod.vue
│       │   │   │   ├── ViewTransition.vue
│       │   │   │   └── Wayfinder.vue
│       │   │   ├── FormHelper/
│       │   │   │   ├── Data.vue
│       │   │   │   ├── Dirty.vue
│       │   │   │   ├── EmptyForm.vue
│       │   │   │   ├── Errors.vue
│       │   │   │   ├── ErrorsClearOnResubmit.vue
│       │   │   │   ├── Events.vue
│       │   │   │   ├── Methods.vue
│       │   │   │   ├── Nested.vue
│       │   │   │   ├── NestedError.vue
│       │   │   │   ├── OptionsApi.vue
│       │   │   │   ├── Precognition/
│       │   │   │   │   ├── BeforeValidation.vue
│       │   │   │   │   ├── Callbacks.vue
│       │   │   │   │   ├── Cancel.vue
│       │   │   │   │   ├── Compatibility.vue
│       │   │   │   │   ├── Default.vue
│       │   │   │   │   ├── DynamicArrayInputs.vue
│       │   │   │   │   ├── ErrorSync.vue
│       │   │   │   │   ├── Files.vue
│       │   │   │   │   ├── Headers.vue
│       │   │   │   │   ├── Instantiate.vue
│       │   │   │   │   ├── Methods.vue
│       │   │   │   │   ├── Transform.vue
│       │   │   │   │   ├── TransformKeys.vue
│       │   │   │   │   ├── WithAllErrors.vue
│       │   │   │   │   ├── WithAllErrorsConfig.vue
│       │   │   │   │   └── WithoutAllErrors.vue
│       │   │   │   ├── RememberEdit.vue
│       │   │   │   ├── RememberIndex.vue
│       │   │   │   ├── ReservedKeys.vue
│       │   │   │   ├── Transform.vue
│       │   │   │   └── TypeScript/
│       │   │   │       ├── Any.vue
│       │   │   │       ├── Child.vue
│       │   │   │       ├── CircularReferences.vue
│       │   │   │       ├── Data.vue
│       │   │   │       ├── DynamicInputName.vue
│       │   │   │       ├── Errors.vue
│       │   │   │       ├── FormDataCallback.vue
│       │   │   │       ├── Generic.vue
│       │   │   │       ├── Nullable.vue
│       │   │   │       ├── NullableNestedObject.vue
│       │   │   │       ├── OptionalProps.vue
│       │   │   │       ├── Parent.vue
│       │   │   │       ├── Precognition.vue
│       │   │   │       ├── ValidationKey.vue
│       │   │   │       ├── WrapperChild.vue
│       │   │   │       └── WrapperParent.vue
│       │   │   ├── Head/
│       │   │   │   ├── Conditional.vue
│       │   │   │   ├── Dataset.vue
│       │   │   │   ├── Mixed.vue
│       │   │   │   ├── Reactive.vue
│       │   │   │   ├── WithTitle.vue
│       │   │   │   └── WithoutTitle.vue
│       │   │   ├── Head.vue
│       │   │   ├── History/
│       │   │   │   ├── Page.vue
│       │   │   │   └── Version.vue
│       │   │   ├── HistoryQuota/
│       │   │   │   └── Page.vue
│       │   │   ├── HistoryThrottle.vue
│       │   │   ├── Home.vue
│       │   │   ├── InfiniteScroll/
│       │   │   │   ├── CustomElement.vue
│       │   │   │   ├── CustomTriggersRef.vue
│       │   │   │   ├── CustomTriggersRefObject.vue
│       │   │   │   ├── CustomTriggersSelector.vue
│       │   │   │   ├── DataTable.vue
│       │   │   │   ├── Deferred.vue
│       │   │   │   ├── DualContainers.vue
│       │   │   │   ├── DualSibling.vue
│       │   │   │   ├── Empty.vue
│       │   │   │   ├── Filtering.vue
│       │   │   │   ├── FilteringManual.vue
│       │   │   │   ├── FilteringReset.vue
│       │   │   │   ├── Grid.vue
│       │   │   │   ├── HorizontalScroll.vue
│       │   │   │   ├── InfiniteScrollWithLink.vue
│       │   │   │   ├── InvisibleFirstChild.vue
│       │   │   │   ├── Links.vue
│       │   │   │   ├── Manual.vue
│       │   │   │   ├── ManualAfter.vue
│       │   │   │   ├── ManualReverse.vue
│       │   │   │   ├── ManualToggle.vue
│       │   │   │   ├── OverflowX.vue
│       │   │   │   ├── PreserveUrl.vue
│       │   │   │   ├── ProgrammaticRef.vue
│       │   │   │   ├── ReloadUnrelated.vue
│       │   │   │   ├── RememberState.vue
│       │   │   │   ├── Reverse.vue
│       │   │   │   ├── ReverseShortContent.vue
│       │   │   │   ├── ScrollContainer.vue
│       │   │   │   ├── ShortContent.vue
│       │   │   │   ├── Toggles.vue
│       │   │   │   ├── TriggerBoth.vue
│       │   │   │   ├── TriggerEndBuffer.vue
│       │   │   │   ├── TriggerStartBuffer.vue
│       │   │   │   ├── TriggerToggle.vue
│       │   │   │   ├── UpdateQueryString.vue
│       │   │   │   └── UserCard.vue
│       │   │   ├── Links/
│       │   │   │   ├── AsComponent.vue
│       │   │   │   ├── AsElement.vue
│       │   │   │   ├── AsWarning.vue
│       │   │   │   ├── AsWarningFalse.vue
│       │   │   │   ├── AutomaticCancellation.vue
│       │   │   │   ├── CancelSyncRequest.vue
│       │   │   │   ├── Data/
│       │   │   │   │   ├── AutoConverted.vue
│       │   │   │   │   ├── FormData.vue
│       │   │   │   │   └── Object.vue
│       │   │   │   ├── DataLoading.vue
│       │   │   │   ├── Headers.vue
│       │   │   │   ├── Location.vue
│       │   │   │   ├── Method.vue
│       │   │   │   ├── PartialReloads.vue
│       │   │   │   ├── PathTraversal.vue
│       │   │   │   ├── PreserveScroll.vue
│       │   │   │   ├── PreserveScrollFalse.vue
│       │   │   │   ├── PreserveState.vue
│       │   │   │   ├── PreserveUrl.vue
│       │   │   │   ├── PropUpdate.vue
│       │   │   │   ├── Reactivity.vue
│       │   │   │   ├── Replace.vue
│       │   │   │   ├── ScrollRegionList.vue
│       │   │   │   └── UrlFragments.vue
│       │   │   ├── MatchPropsOnKey.vue
│       │   │   ├── MergeNestedProps.vue
│       │   │   ├── MergeProps.vue
│       │   │   ├── NavigateNonInertia.vue
│       │   │   ├── NetworkError.vue
│       │   │   ├── OnceProps/
│       │   │   │   ├── ClientSideVisit.vue
│       │   │   │   ├── CustomKeyPageA.vue
│       │   │   │   ├── CustomKeyPageB.vue
│       │   │   │   ├── DeferredPageA.vue
│       │   │   │   ├── DeferredPageB.vue
│       │   │   │   ├── DeferredPageC.vue
│       │   │   │   ├── MergePageA.vue
│       │   │   │   ├── MergePageB.vue
│       │   │   │   ├── OptionalPageA.vue
│       │   │   │   ├── OptionalPageB.vue
│       │   │   │   ├── PageA.vue
│       │   │   │   ├── PageB.vue
│       │   │   │   ├── PageC.vue
│       │   │   │   ├── PageD.vue
│       │   │   │   ├── PageE.vue
│       │   │   │   ├── PartialReloadA.vue
│       │   │   │   ├── PartialReloadB.vue
│       │   │   │   ├── SlowDeferredPageA.vue
│       │   │   │   ├── SlowDeferredPageB.vue
│       │   │   │   ├── TtlPageA.vue
│       │   │   │   ├── TtlPageB.vue
│       │   │   │   └── TtlPageC.vue
│       │   │   ├── PersistentLayouts/
│       │   │   │   ├── RenderFunction/
│       │   │   │   │   ├── Nested/
│       │   │   │   │   │   ├── PageA.vue
│       │   │   │   │   │   └── PageB.vue
│       │   │   │   │   └── Simple/
│       │   │   │   │       ├── PageA.vue
│       │   │   │   │       └── PageB.vue
│       │   │   │   └── Shorthand/
│       │   │   │       ├── Nested/
│       │   │   │       │   ├── PageA.vue
│       │   │   │       │   └── PageB.vue
│       │   │   │       └── Simple/
│       │   │   │           ├── PageA.vue
│       │   │   │           └── PageB.vue
│       │   │   ├── Poll/
│       │   │   │   ├── Hook.vue
│       │   │   │   ├── HookManual.vue
│       │   │   │   ├── RouterManual.vue
│       │   │   │   └── UnchangedData.vue
│       │   │   ├── Prefetch/
│       │   │   │   ├── AfterError.vue
│       │   │   │   ├── Form.vue
│       │   │   │   ├── Page.vue
│       │   │   │   ├── PreserveState.vue
│       │   │   │   ├── SWR.vue
│       │   │   │   ├── Tags.vue
│       │   │   │   ├── TestPage.vue
│       │   │   │   └── Wayfinder.vue
│       │   │   ├── PreserveEqualProps.vue
│       │   │   ├── ProgressComponent.vue
│       │   │   ├── Reload/
│       │   │   │   ├── Concurrent.vue
│       │   │   │   └── ConcurrentWithData.vue
│       │   │   ├── Remember/
│       │   │   │   ├── Components/
│       │   │   │   │   ├── ComponentA.vue
│       │   │   │   │   └── ComponentB.vue
│       │   │   │   ├── Default.vue
│       │   │   │   ├── FormHelper/
│       │   │   │   │   ├── Default.vue
│       │   │   │   │   ├── Password.vue
│       │   │   │   │   └── Remember.vue
│       │   │   │   ├── MultipleComponents.vue
│       │   │   │   ├── Object.vue
│       │   │   │   └── Router.vue
│       │   │   ├── SSR/
│       │   │   │   ├── Page1.vue
│       │   │   │   ├── Page2.vue
│       │   │   │   └── PageWithScriptElement.vue
│       │   │   ├── ScrollAfterRender.vue
│       │   │   ├── ScrollRegionPreserveUrl.vue
│       │   │   ├── ScrollSmooth.vue
│       │   │   ├── ScrollableParent.vue
│       │   │   ├── TypeScriptCreateInertiaApp.ts
│       │   │   ├── TypeScriptFlash.vue
│       │   │   ├── TypeScriptProps.vue
│       │   │   ├── ViewTransition/
│       │   │   │   ├── FormErrors.vue
│       │   │   │   ├── PageA.vue
│       │   │   │   └── PageB.vue
│       │   │   ├── Visits/
│       │   │   │   ├── AfterError.vue
│       │   │   │   ├── AutomaticCancellation.vue
│       │   │   │   ├── Data/
│       │   │   │   │   ├── AutoConverted.vue
│       │   │   │   │   ├── FormData.vue
│       │   │   │   │   └── Object.vue
│       │   │   │   ├── ErrorBags.vue
│       │   │   │   ├── Headers.vue
│       │   │   │   ├── Location.vue
│       │   │   │   ├── Method.vue
│       │   │   │   ├── PartialReloads.vue
│       │   │   │   ├── PreserveScroll.vue
│       │   │   │   ├── PreserveScrollFalse.vue
│       │   │   │   ├── PreserveState.vue
│       │   │   │   ├── Proxy.vue
│       │   │   │   ├── ReloadOnMount.vue
│       │   │   │   ├── Replace.vue
│       │   │   │   ├── UrlFragments.vue
│       │   │   │   └── Wayfinder.vue
│       │   │   ├── WhenVisible.vue
│       │   │   ├── WhenVisibleArrayReload.vue
│       │   │   ├── WhenVisibleBackButton.vue
│       │   │   ├── WhenVisibleFetching.vue
│       │   │   ├── WhenVisibleMergeParams.vue
│       │   │   ├── WhenVisibleParamsUpdate.vue
│       │   │   └── WhenVisibleReload.vue
│       │   ├── app.ts
│       │   ├── eslint.config.js
│       │   ├── index.html
│       │   ├── package.json
│       │   ├── ssr.ts
│       │   ├── tsconfig.json
│       │   ├── types.d.ts
│       │   └── vite.config.ts
│       └── tsconfig.json
├── playgrounds/
│   ├── react/
│   │   ├── .gitattributes
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── app/
│   │   │   ├── Console/
│   │   │   │   └── Kernel.php
│   │   │   ├── Exceptions/
│   │   │   │   └── Handler.php
│   │   │   ├── Http/
│   │   │   │   ├── Controllers/
│   │   │   │   │   └── Controller.php
│   │   │   │   ├── Kernel.php
│   │   │   │   ├── Middleware/
│   │   │   │   │   ├── Authenticate.php
│   │   │   │   │   ├── EncryptCookies.php
│   │   │   │   │   ├── HandleInertiaRequests.php
│   │   │   │   │   ├── PreventRequestsDuringMaintenance.php
│   │   │   │   │   ├── RedirectIfAuthenticated.php
│   │   │   │   │   ├── TrimStrings.php
│   │   │   │   │   ├── TrustHosts.php
│   │   │   │   │   ├── TrustProxies.php
│   │   │   │   │   ├── ValidateSignature.php
│   │   │   │   │   └── VerifyCsrfToken.php
│   │   │   │   ├── Requests/
│   │   │   │   │   └── PrecognitionFormRequest.php
│   │   │   │   └── Resources/
│   │   │   │       └── UserResource.php
│   │   │   ├── Models/
│   │   │   │   ├── ChatMessage.php
│   │   │   │   └── User.php
│   │   │   └── Providers/
│   │   │       ├── AppServiceProvider.php
│   │   │       ├── AuthServiceProvider.php
│   │   │       ├── BroadcastServiceProvider.php
│   │   │       ├── EventServiceProvider.php
│   │   │       └── RouteServiceProvider.php
│   │   ├── artisan
│   │   ├── bootstrap/
│   │   │   ├── app.php
│   │   │   └── cache/
│   │   │       └── .gitignore
│   │   ├── composer.json
│   │   ├── config/
│   │   │   ├── app.php
│   │   │   ├── auth.php
│   │   │   ├── broadcasting.php
│   │   │   ├── cache.php
│   │   │   ├── cors.php
│   │   │   ├── database.php
│   │   │   ├── filesystems.php
│   │   │   ├── hashing.php
│   │   │   ├── inertia.php
│   │   │   ├── logging.php
│   │   │   ├── mail.php
│   │   │   ├── prism.php
│   │   │   ├── queue.php
│   │   │   ├── sanctum.php
│   │   │   ├── services.php
│   │   │   ├── session.php
│   │   │   └── view.php
│   │   ├── database/
│   │   │   ├── .gitignore
│   │   │   ├── factories/
│   │   │   │   ├── ChatMessageFactory.php
│   │   │   │   └── UserFactory.php
│   │   │   ├── migrations/
│   │   │   │   ├── 2014_10_12_000000_create_users_table.php
│   │   │   │   ├── 2014_10_12_100000_create_password_resets_table.php
│   │   │   │   ├── 2019_08_19_000000_create_failed_jobs_table.php
│   │   │   │   ├── 2019_12_14_000001_create_personal_access_tokens_table.php
│   │   │   │   └── 2025_08_29_115526_create_chat_messages_table.php
│   │   │   └── seeders/
│   │   │       ├── DatabaseSeeder.php
│   │   │       └── conversation.json
│   │   ├── init.sh
│   │   ├── lang/
│   │   │   └── en/
│   │   │       ├── auth.php
│   │   │       ├── pagination.php
│   │   │       ├── passwords.php
│   │   │       └── validation.php
│   │   ├── package.json
│   │   ├── phpunit.xml
│   │   ├── public/
│   │   │   ├── .htaccess
│   │   │   ├── index.php
│   │   │   └── robots.txt
│   │   ├── resources/
│   │   │   ├── css/
│   │   │   │   └── app.css
│   │   │   ├── js/
│   │   │   │   ├── Components/
│   │   │   │   │   ├── DeferredFood.tsx
│   │   │   │   │   ├── DeferredOrganizations.tsx
│   │   │   │   │   ├── DeferredUsers.tsx
│   │   │   │   │   ├── Image.tsx
│   │   │   │   │   ├── Layout.tsx
│   │   │   │   │   ├── Message.tsx
│   │   │   │   │   ├── PaperAirplaneIcon.tsx
│   │   │   │   │   ├── Spinner.tsx
│   │   │   │   │   ├── StreamingIndicator.tsx
│   │   │   │   │   ├── TestGrid.tsx
│   │   │   │   │   ├── TestGridItem.tsx
│   │   │   │   │   └── Textarea.tsx
│   │   │   │   ├── Pages/
│   │   │   │   │   ├── Article.tsx
│   │   │   │   │   ├── Async.tsx
│   │   │   │   │   ├── Chat.tsx
│   │   │   │   │   ├── DataTable.tsx
│   │   │   │   │   ├── Defer.tsx
│   │   │   │   │   ├── Flash.tsx
│   │   │   │   │   ├── Form.tsx
│   │   │   │   │   ├── FormComponent.tsx
│   │   │   │   │   ├── FormComponentPrecognition.tsx
│   │   │   │   │   ├── Home.tsx
│   │   │   │   │   ├── Login.tsx
│   │   │   │   │   ├── Once/
│   │   │   │   │   │   ├── First.tsx
│   │   │   │   │   │   ├── Fourth.tsx
│   │   │   │   │   │   ├── Layout.tsx
│   │   │   │   │   │   ├── Second.tsx
│   │   │   │   │   │   └── Third.tsx
│   │   │   │   │   ├── PhotoGrid.tsx
│   │   │   │   │   ├── PhotoHorizontal.tsx
│   │   │   │   │   ├── Poll.tsx
│   │   │   │   │   ├── User.tsx
│   │   │   │   │   └── Users.tsx
│   │   │   │   ├── app.tsx
│   │   │   │   ├── ssr.tsx
│   │   │   │   ├── types/
│   │   │   │   │   └── globals.d.ts
│   │   │   │   └── vite.d.ts
│   │   │   └── views/
│   │   │       └── app.blade.php
│   │   ├── routes/
│   │   │   ├── api.php
│   │   │   ├── channels.php
│   │   │   ├── console.php
│   │   │   └── web.php
│   │   ├── storage/
│   │   │   ├── app/
│   │   │   │   └── .gitignore
│   │   │   ├── framework/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── cache/
│   │   │   │   │   └── .gitignore
│   │   │   │   ├── sessions/
│   │   │   │   │   └── .gitignore
│   │   │   │   ├── testing/
│   │   │   │   │   └── .gitignore
│   │   │   │   └── views/
│   │   │   │       └── .gitignore
│   │   │   └── logs/
│   │   │       └── .gitignore
│   │   ├── tests/
│   │   │   ├── CreatesApplication.php
│   │   │   ├── Feature/
│   │   │   │   └── ExampleTest.php
│   │   │   ├── TestCase.php
│   │   │   └── Unit/
│   │   │       └── ExampleTest.php
│   │   ├── tsconfig.json
│   │   └── vite.config.ts
│   ├── svelte4/
│   │   ├── .gitattributes
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── app/
│   │   │   ├── Console/
│   │   │   │   └── Kernel.php
│   │   │   ├── Exceptions/
│   │   │   │   └── Handler.php
│   │   │   ├── Http/
│   │   │   │   ├── Controllers/
│   │   │   │   │   └── Controller.php
│   │   │   │   ├── Kernel.php
│   │   │   │   ├── Middleware/
│   │   │   │   │   ├── Authenticate.php
│   │   │   │   │   ├── EncryptCookies.php
│   │   │   │   │   ├── HandleInertiaRequests.php
│   │   │   │   │   ├── PreventRequestsDuringMaintenance.php
│   │   │   │   │   ├── RedirectIfAuthenticated.php
│   │   │   │   │   ├── TrimStrings.php
│   │   │   │   │   ├── TrustHosts.php
│   │   │   │   │   ├── TrustProxies.php
│   │   │   │   │   ├── ValidateSignature.php
│   │   │   │   │   └── VerifyCsrfToken.php
│   │   │   │   └── Requests/
│   │   │   │       └── PrecognitionFormRequest.php
│   │   │   ├── Models/
│   │   │   │   └── User.php
│   │   │   └── Providers/
│   │   │       ├── AppServiceProvider.php
│   │   │       ├── AuthServiceProvider.php
│   │   │       ├── BroadcastServiceProvider.php
│   │   │       ├── EventServiceProvider.php
│   │   │       └── RouteServiceProvider.php
│   │   ├── artisan
│   │   ├── bootstrap/
│   │   │   ├── app.php
│   │   │   └── cache/
│   │   │       └── .gitignore
│   │   ├── composer.json
│   │   ├── config/
│   │   │   ├── app.php
│   │   │   ├── auth.php
│   │   │   ├── broadcasting.php
│   │   │   ├── cache.php
│   │   │   ├── cors.php
│   │   │   ├── database.php
│   │   │   ├── filesystems.php
│   │   │   ├── hashing.php
│   │   │   ├── inertia.php
│   │   │   ├── logging.php
│   │   │   ├── mail.php
│   │   │   ├── queue.php
│   │   │   ├── sanctum.php
│   │   │   ├── services.php
│   │   │   ├── session.php
│   │   │   └── view.php
│   │   ├── database/
│   │   │   ├── .gitignore
│   │   │   ├── factories/
│   │   │   │   └── UserFactory.php
│   │   │   ├── migrations/
│   │   │   │   ├── 2014_10_12_000000_create_users_table.php
│   │   │   │   ├── 2014_10_12_100000_create_password_resets_table.php
│   │   │   │   ├── 2019_08_19_000000_create_failed_jobs_table.php
│   │   │   │   └── 2019_12_14_000001_create_personal_access_tokens_table.php
│   │   │   └── seeders/
│   │   │       └── DatabaseSeeder.php
│   │   ├── init.sh
│   │   ├── lang/
│   │   │   └── en/
│   │   │       ├── auth.php
│   │   │       ├── pagination.php
│   │   │       ├── passwords.php
│   │   │       └── validation.php
│   │   ├── package.json
│   │   ├── phpunit.xml
│   │   ├── public/
│   │   │   ├── .htaccess
│   │   │   ├── index.php
│   │   │   └── robots.txt
│   │   ├── resources/
│   │   │   ├── css/
│   │   │   │   └── app.css
│   │   │   ├── js/
│   │   │   │   ├── Components/
│   │   │   │   │   ├── Image.svelte
│   │   │   │   │   ├── Layout.svelte
│   │   │   │   │   ├── Spinner.svelte
│   │   │   │   │   ├── TestGrid.svelte
│   │   │   │   │   └── TestGridItem.svelte
│   │   │   │   ├── Pages/
│   │   │   │   │   ├── Article.svelte
│   │   │   │   │   ├── Async.svelte
│   │   │   │   │   ├── DataTable.svelte
│   │   │   │   │   ├── Defer.svelte
│   │   │   │   │   ├── Flash.svelte
│   │   │   │   │   ├── Form.svelte
│   │   │   │   │   ├── FormComponent.svelte
│   │   │   │   │   ├── FormComponentPrecognition.svelte
│   │   │   │   │   ├── Home.svelte
│   │   │   │   │   ├── InfiniteScroll.svelte
│   │   │   │   │   ├── Login.svelte
│   │   │   │   │   ├── Once/
│   │   │   │   │   │   ├── First.svelte
│   │   │   │   │   │   ├── Fourth.svelte
│   │   │   │   │   │   ├── Layout.svelte
│   │   │   │   │   │   ├── Second.svelte
│   │   │   │   │   │   └── Third.svelte
│   │   │   │   │   ├── PhotoGrid.svelte
│   │   │   │   │   ├── PhotoHorizontal.svelte
│   │   │   │   │   ├── Poll.svelte
│   │   │   │   │   ├── User.svelte
│   │   │   │   │   └── Users.svelte
│   │   │   │   ├── app.ts
│   │   │   │   ├── ssr.ts
│   │   │   │   ├── types/
│   │   │   │   │   └── globals.d.ts
│   │   │   │   └── vite-env.d.ts
│   │   │   └── views/
│   │   │       └── app.blade.php
│   │   ├── routes/
│   │   │   ├── api.php
│   │   │   ├── channels.php
│   │   │   ├── console.php
│   │   │   └── web.php
│   │   ├── storage/
│   │   │   ├── app/
│   │   │   │   └── .gitignore
│   │   │   ├── framework/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── cache/
│   │   │   │   │   └── .gitignore
│   │   │   │   ├── sessions/
│   │   │   │   │   └── .gitignore
│   │   │   │   ├── testing/
│   │   │   │   │   └── .gitignore
│   │   │   │   └── views/
│   │   │   │       └── .gitignore
│   │   │   └── logs/
│   │   │       └── .gitignore
│   │   ├── svelte.config.js
│   │   ├── tests/
│   │   │   ├── CreatesApplication.php
│   │   │   ├── Feature/
│   │   │   │   └── ExampleTest.php
│   │   │   ├── TestCase.php
│   │   │   └── Unit/
│   │   │       └── ExampleTest.php
│   │   ├── tsconfig.json
│   │   └── vite.config.js
│   ├── svelte5/
│   │   ├── .gitattributes
│   │   ├── .gitignore
│   │   ├── README.md
│   │   ├── app/
│   │   │   ├── Console/
│   │   │   │   └── Kernel.php
│   │   │   ├── Exceptions/
│   │   │   │   └── Handler.php
│   │   │   ├── Http/
│   │   │   │   ├── Controllers/
│   │   │   │   │   └── Controller.php
│   │   │   │   ├── Kernel.php
│   │   │   │   ├── Middleware/
│   │   │   │   │   ├── Authenticate.php
│   │   │   │   │   ├── EncryptCookies.php
│   │   │   │   │   ├── HandleInertiaRequests.php
│   │   │   │   │   ├── PreventRequestsDuringMaintenance.php
│   │   │   │   │   ├── RedirectIfAuthenticated.php
│   │   │   │   │   ├── TrimStrings.php
│   │   │   │   │   ├── TrustHosts.php
│   │   │   │   │   ├── TrustProxies.php
│   │   │   │   │   ├── ValidateSignature.php
│   │   │   │   │   └── VerifyCsrfToken.php
│   │   │   │   └── Requests/
│   │   │   │       └── PrecognitionFormRequest.php
│   │   │   ├── Models/
│   │   │   │   └── User.php
│   │   │   └── Providers/
│   │   │       ├── AppServiceProvider.php
│   │   │       ├── AuthServiceProvider.php
│   │   │       ├── BroadcastServiceProvider.php
│   │   │       ├── EventServiceProvider.php
│   │   │       └── RouteServiceProvider.php
│   │   ├── artisan
│   │   ├── bootstrap/
│   │   │   ├── app.php
│   │   │   └── cache/
│   │   │       └── .gitignore
│   │   ├── composer.json
│   │   ├── config/
│   │   │   ├── app.php
│   │   │   ├── auth.php
│   │   │   ├── broadcasting.php
│   │   │   ├── cache.php
│   │   │   ├── cors.php
│   │   │   ├── database.php
│   │   │   ├── filesystems.php
│   │   │   ├── hashing.php
│   │   │   ├── inertia.php
│   │   │   ├── logging.php
│   │   │   ├── mail.php
│   │   │   ├── queue.php
│   │   │   ├── sanctum.php
│   │   │   ├── services.php
│   │   │   ├── session.php
│   │   │   └── view.php
│   │   ├── database/
│   │   │   ├── .gitignore
│   │   │   ├── factories/
│   │   │   │   └── UserFactory.php
│   │   │   ├── migrations/
│   │   │   │   ├── 2014_10_12_000000_create_users_table.php
│   │   │   │   ├── 2014_10_12_100000_create_password_resets_table.php
│   │   │   │   ├── 2019_08_19_000000_create_failed_jobs_table.php
│   │   │   │   └── 2019_12_14_000001_create_personal_access_tokens_table.php
│   │   │   └── seeders/
│   │   │       └── DatabaseSeeder.php
│   │   ├── init.sh
│   │   ├── lang/
│   │   │   └── en/
│   │   │       ├── auth.php
│   │   │       ├── pagination.php
│   │   │       ├── passwords.php
│   │   │       └── validation.php
│   │   ├── package.json
│   │   ├── phpunit.xml
│   │   ├── public/
│   │   │   ├── .htaccess
│   │   │   ├── index.php
│   │   │   └── robots.txt
│   │   ├── resources/
│   │   │   ├── css/
│   │   │   │   └── app.css
│   │   │   ├── js/
│   │   │   │   ├── Components/
│   │   │   │   │   ├── Image.svelte
│   │   │   │   │   ├── Layout.svelte
│   │   │   │   │   ├── Spinner.svelte
│   │   │   │   │   ├── TestGrid.svelte
│   │   │   │   │   └── TestGridItem.svelte
│   │   │   │   ├── Pages/
│   │   │   │   │   ├── Article.svelte
│   │   │   │   │   ├── Async.svelte
│   │   │   │   │   ├── DataTable.svelte
│   │   │   │   │   ├── Flash.svelte
│   │   │   │   │   ├── Form.svelte
│   │   │   │   │   ├── FormComponent.svelte
│   │   │   │   │   ├── FormComponentPrecognition.svelte
│   │   │   │   │   ├── Home.svelte
│   │   │   │   │   ├── Login.svelte
│   │   │   │   │   ├── Once/
│   │   │   │   │   │   ├── First.svelte
│   │   │   │   │   │   ├── Fourth.svelte
│   │   │   │   │   │   ├── Layout.svelte
│   │   │   │   │   │   ├── Second.svelte
│   │   │   │   │   │   └── Third.svelte
│   │   │   │   │   ├── PhotoGrid.svelte
│   │   │   │   │   ├── PhotoHorizontal.svelte
│   │   │   │   │   ├── Poll.svelte
│   │   │   │   │   ├── User.svelte
│   │   │   │   │   └── Users.svelte
│   │   │   │   ├── app.ts
│   │   │   │   ├── ssr.ts
│   │   │   │   ├── types/
│   │   │   │   │   └── globals.d.ts
│   │   │   │   └── vite-env.d.ts
│   │   │   └── views/
│   │   │       └── app.blade.php
│   │   ├── routes/
│   │   │   ├── api.php
│   │   │   ├── channels.php
│   │   │   ├── console.php
│   │   │   └── web.php
│   │   ├── storage/
│   │   │   ├── app/
│   │   │   │   └── .gitignore
│   │   │   ├── framework/
│   │   │   │   ├── .gitignore
│   │   │   │   ├── cache/
│   │   │   │   │   └── .gitignore
│   │   │   │   ├── sessions/
│   │   │   │   │   └── .gitignore
│   │   │   │   ├── testing/
│   │   │   │   │   └── .gitignore
│   │   │   │   └── views/
│   │   │   │       └── .gitignore
│   │   │   └── logs/
│   │   │       └── .gitignore
│   │   ├── tests/
│   │   │   ├── CreatesApplication.php
│   │   │   ├── Feature/
│   │   │   │   └── ExampleTest.php
│   │   │   ├── TestCase.php
│   │   │   └── Unit/
│   │   │       └── ExampleTest.php
│   │   ├── tsconfig.json
│   │   └── vite.config.js
│   └── vue3/
│       ├── .gitattributes
│       ├── .gitignore
│       ├── README.md
│       ├── app/
│       │   ├── Console/
│       │   │   └── Kernel.php
│       │   ├── Exceptions/
│       │   │   └── Handler.php
│       │   ├── Http/
│       │   │   ├── Controllers/
│       │   │   │   └── Controller.php
│       │   │   ├── Kernel.php
│       │   │   ├── Middleware/
│       │   │   │   ├── Authenticate.php
│       │   │   │   ├── EncryptCookies.php
│       │   │   │   ├── HandleInertiaRequests.php
│       │   │   │   ├── PreventRequestsDuringMaintenance.php
│       │   │   │   ├── RedirectIfAuthenticated.php
│       │   │   │   ├── TrimStrings.php
│       │   │   │   ├── TrustHosts.php
│       │   │   │   ├── TrustProxies.php
│       │   │   │   ├── ValidateSignature.php
│       │   │   │   └── VerifyCsrfToken.php
│       │   │   ├── Requests/
│       │   │   │   └── PrecognitionFormRequest.php
│       │   │   └── Resources/
│       │   │       └── UserResource.php
│       │   ├── Models/
│       │   │   ├── ChatMessage.php
│       │   │   └── User.php
│       │   └── Providers/
│       │       ├── AppServiceProvider.php
│       │       ├── AuthServiceProvider.php
│       │       ├── BroadcastServiceProvider.php
│       │       ├── EventServiceProvider.php
│       │       └── RouteServiceProvider.php
│       ├── artisan
│       ├── bootstrap/
│       │   ├── app.php
│       │   └── cache/
│       │       └── .gitignore
│       ├── composer.json
│       ├── config/
│       │   ├── app.php
│       │   ├── auth.php
│       │   ├── broadcasting.php
│       │   ├── cache.php
│       │   ├── cors.php
│       │   ├── database.php
│       │   ├── filesystems.php
│       │   ├── hashing.php
│       │   ├── inertia.php
│       │   ├── logging.php
│       │   ├── mail.php
│       │   ├── prism.php
│       │   ├── queue.php
│       │   ├── sanctum.php
│       │   ├── services.php
│       │   ├── session.php
│       │   └── view.php
│       ├── database/
│       │   ├── .gitignore
│       │   ├── factories/
│       │   │   ├── ChatMessageFactory.php
│       │   │   └── UserFactory.php
│       │   ├── migrations/
│       │   │   ├── 2014_10_12_000000_create_users_table.php
│       │   │   ├── 2014_10_12_100000_create_password_resets_table.php
│       │   │   ├── 2019_08_19_000000_create_failed_jobs_table.php
│       │   │   ├── 2019_12_14_000001_create_personal_access_tokens_table.php
│       │   │   └── 2025_08_29_115526_create_chat_messages_table.php
│       │   └── seeders/
│       │       ├── DatabaseSeeder.php
│       │       └── conversation.json
│       ├── init.sh
│       ├── lang/
│       │   └── en/
│       │       ├── auth.php
│       │       ├── pagination.php
│       │       ├── passwords.php
│       │       └── validation.php
│       ├── package.json
│       ├── phpunit.xml
│       ├── public/
│       │   ├── .htaccess
│       │   ├── index.php
│       │   └── robots.txt
│       ├── resources/
│       │   ├── css/
│       │   │   └── app.css
│       │   ├── js/
│       │   │   ├── Components/
│       │   │   │   ├── Image.vue
│       │   │   │   ├── Layout.vue
│       │   │   │   ├── Message.vue
│       │   │   │   ├── PaperAirplaneIcon.vue
│       │   │   │   ├── PhotoIcon.vue
│       │   │   │   ├── Spinner.vue
│       │   │   │   ├── StreamingIndicator.vue
│       │   │   │   ├── TestGrid.vue
│       │   │   │   ├── TestGridItem.vue
│       │   │   │   └── Textarea.vue
│       │   │   ├── Pages/
│       │   │   │   ├── Article.vue
│       │   │   │   ├── Async.vue
│       │   │   │   ├── Chat.vue
│       │   │   │   ├── DataTable.vue
│       │   │   │   ├── Defer.vue
│       │   │   │   ├── Flash.vue
│       │   │   │   ├── Form.vue
│       │   │   │   ├── FormComponent.vue
│       │   │   │   ├── FormComponentPrecognition.vue
│       │   │   │   ├── Home.vue
│       │   │   │   ├── InfiniteScroll.vue
│       │   │   │   ├── Login.vue
│       │   │   │   ├── Once/
│       │   │   │   │   ├── First.vue
│       │   │   │   │   ├── Fourth.vue
│       │   │   │   │   ├── Layout.vue
│       │   │   │   │   ├── Second.vue
│       │   │   │   │   └── Third.vue
│       │   │   │   ├── PhotoGrid.vue
│       │   │   │   ├── PhotoHorizontal.vue
│       │   │   │   ├── Poll.vue
│       │   │   │   ├── User.vue
│       │   │   │   └── Users.vue
│       │   │   ├── app.ts
│       │   │   ├── ssr.ts
│       │   │   ├── types/
│       │   │   │   └── globals.d.ts
│       │   │   └── vite-env.d.ts
│       │   └── views/
│       │       └── app.blade.php
│       ├── routes/
│       │   ├── api.php
│       │   ├── channels.php
│       │   ├── console.php
│       │   └── web.php
│       ├── storage/
│       │   ├── app/
│       │   │   └── .gitignore
│       │   ├── framework/
│       │   │   ├── .gitignore
│       │   │   ├── cache/
│       │   │   │   └── .gitignore
│       │   │   ├── sessions/
│       │   │   │   └── .gitignore
│       │   │   ├── testing/
│       │   │   │   └── .gitignore
│       │   │   └── views/
│       │   │       └── .gitignore
│       │   └── logs/
│       │       └── .gitignore
│       ├── tests/
│       │   ├── CreatesApplication.php
│       │   ├── Feature/
│       │   │   └── ExampleTest.php
│       │   ├── TestCase.php
│       │   └── Unit/
│       │       └── ExampleTest.php
│       ├── tsconfig.json
│       └── vite.config.ts
├── playwright.config.ts
├── playwright.js
├── pnpm-workspace.yaml
├── prettier.config.js
├── release.sh
└── tests/
    ├── app/
    │   ├── eloquent.js
    │   ├── helpers.js
    │   ├── package.json
    │   ├── server-status.js
    │   ├── server.js
    │   └── ssr.js
    ├── client-side-visits-props.spec.ts
    ├── client-side-visits-sequential.spec.ts
    ├── client-side-visits.spec.ts
    ├── config.spec.ts
    ├── core/
    │   ├── config.test.ts
    │   ├── formObject.test.ts
    │   ├── objectUtils.test.ts
    │   └── url.test.ts
    ├── deep-merge-props.spec.ts
    ├── deferred-props-cancellation.spec.ts
    ├── deferred-props.spec.ts
    ├── domUtils.spec.ts
    ├── error-modal.spec.ts
    ├── events.spec.ts
    ├── flash.spec.ts
    ├── form-component-context.spec.ts
    ├── form-component.spec.ts
    ├── form-helper.spec.ts
    ├── head.spec.ts
    ├── history-quota.spec.ts
    ├── history-throttle.spec.ts
    ├── history.spec.ts
    ├── inertia.spec.ts
    ├── infinite-scroll.spec.ts
    ├── initial-visit.spec.ts
    ├── links.spec.ts
    ├── manual-visits.spec.ts
    ├── match-props-on-key.spec.ts
    ├── merge-props.spec.ts
    ├── network-error.spec.ts
    ├── once-props.spec.ts
    ├── pages.spec.ts
    ├── plugin.spec.ts
    ├── poll.spec.ts
    ├── precognition.spec.ts
    ├── prefetch.spec.ts
    ├── progress-component.spec.ts
    ├── remember.spec.ts
    ├── scroll-smooth.spec.ts
    ├── ssr.spec.ts
    ├── support.ts
    ├── svelte.spec.ts
    ├── view-transitions.spec.ts
    └── when-visible.spec.ts
Download .txt
SYMBOL INDEX (985 symbols across 314 files)

FILE: packages/core/build.js
  method setup (line 17) | setup(build) {

FILE: packages/core/src/config.ts
  type ConfigKeys (line 5) | type ConfigKeys<T> = T extends Function
  type ConfigValue (line 16) | type ConfigValue<T, K extends ConfigKeys<T>> = K extends `${infer P}.${i...
  type ConfigSetObject (line 27) | type ConfigSetObject<T> = {
  type FirstLevelOptional (line 31) | type FirstLevelOptional<T> = {
  class Config (line 35) | class Config<TConfig extends {} = {}> {
    method constructor (line 39) | public constructor(defaults: TConfig) {
    method extend (line 43) | public extend<TExtension extends {}>(defaults?: TExtension): Config<TC...
    method replace (line 51) | public replace(newConfig: FirstLevelOptional<TConfig>): void {
    method get (line 55) | public get<K extends ConfigKeys<TConfig>>(key: K): ConfigValue<TConfig...
    method set (line 59) | public set<K extends ConfigKeys<TConfig>>(

FILE: packages/core/src/debounce.ts
  function debounce (line 1) | function debounce<F extends (...params: any[]) => ReturnType<F>>(fn: F, ...

FILE: packages/core/src/dialog.ts
  method show (line 4) | show(html: Record<string, unknown> | string): void {

FILE: packages/core/src/eventHandler.ts
  class EventHandler (line 10) | class EventHandler {
    method init (line 16) | public init() {
    method onGlobalEvent (line 28) | public onGlobalEvent<TEventName extends GlobalEventNames>(
    method on (line 43) | public on(event: InternalEvent, callback: (...args: any[]) => void): V...
    method onMissingHistoryItem (line 51) | public onMissingHistoryItem() {
    method fireInternalEvent (line 59) | public fireInternalEvent(event: InternalEvent, ...args: any[]): void {
    method registerListener (line 65) | protected registerListener(type: string, listener: EventListener): Voi...
    method handlePageshowEvent (line 74) | protected handlePageshowEvent(event: PageTransitionEvent): void {
    method handlePopstateEvent (line 80) | protected handlePopstateEvent(event: PopStateEvent): void {

FILE: packages/core/src/events.ts
  function fireEvent (line 3) | function fireEvent<TEventName extends GlobalEventNames>(

FILE: packages/core/src/files.ts
  function hasFiles (line 8) | function hasFiles(data: RequestPayload | FormDataConvertible): boolean {

FILE: packages/core/src/formData.ts
  function objectToFormData (line 5) | function objectToFormData(
  function composeKey (line 22) | function composeKey(parent: string | null, key: string, format: QueryStr...
  function append (line 30) | function append(form: FormData, key: string, value: FormDataConvertible,...

FILE: packages/core/src/formObject.ts
  function undotKey (line 15) | function undotKey(key: string): string {
  function parseKey (line 46) | function parseKey(key: string): (string | number | '')[] {
  function setNestedObject (line 66) | function setNestedObject(obj: Record<string, any>, path: string[], value...
  function objectHasSequentialNumericKeys (line 83) | function objectHasSequentialNumericKeys(value: any): boolean {
  function convertSequentialObjectsToArrays (line 101) | function convertSequentialObjectsToArrays(value: any): any {
  function formDataToObject (line 133) | function formDataToObject(source: FormData): Record<string, FormDataConv...

FILE: packages/core/src/head.ts
  method preferredAttribute (line 5) | preferredAttribute(): 'data-inertia' | 'inertia' {
  method buildDOMElement (line 9) | buildDOMElement(tag: string): ChildNode {
  method isInertiaManagedElement (line 27) | isInertiaManagedElement(element: Element): boolean {
  method findMatchingElementIndex (line 31) | findMatchingElementIndex(element: Element, elements: Array<Element>): nu...
  function createHeadManager (line 64) | function createHeadManager(

FILE: packages/core/src/history.ts
  class History (line 13) | class History {
    method remember (line 21) | public remember(data: unknown, key: string): void {
    method restore (line 31) | public restore(key: string): unknown {
    method pushState (line 39) | public pushState(page: Page, cb: (() => void) | null = null): void {
    method clonePageProps (line 68) | protected clonePageProps(page: Page): Page {
    method getPageData (line 82) | protected getPageData(page: Page): Promise<Page | ArrayBuffer> {
    method processQueue (line 90) | public processQueue(): Promise<void> {
    method decrypt (line 94) | public decrypt(page: Page | null = null): Promise<Page> {
    method decryptPageData (line 116) | protected decryptPageData(pageData: ArrayBuffer | Page | null): Promis...
    method saveScrollPositions (line 120) | public saveScrollPositions(scrollRegions: ScrollRegion[]): void {
    method saveDocumentScrollPosition (line 139) | public saveDocumentScrollPosition(scrollRegion: ScrollRegion): void {
    method getScrollRegions (line 158) | public getScrollRegions(): ScrollRegion[] {
    method getDocumentScrollPosition (line 162) | public getDocumentScrollPosition(): ScrollRegion {
    method replaceState (line 166) | public replaceState(page: Page, cb: (() => void) | null = null): void {
    method isHistoryThrottleError (line 205) | protected isHistoryThrottleError(error: unknown): error is Error & { n...
    method isQuotaExceededError (line 213) | protected isQuotaExceededError(error: unknown): error is Error & { nam...
    method withThrottleProtection (line 217) | protected withThrottleProtection<T = void>(cb: () => T): Promise<T | u...
    method doReplaceState (line 231) | protected doReplaceState(
    method doPushState (line 252) | protected doPushState(
    method getState (line 273) | public getState<T>(key: keyof Page, defaultValue?: T): any {
    method deleteState (line 277) | public deleteState(key: keyof Page) {
    method clearInitialState (line 284) | public clearInitialState(key: keyof Page) {
    method browserHasHistoryEntry (line 290) | public browserHasHistoryEntry(): boolean {
    method clear (line 294) | public clear() {
    method setCurrent (line 299) | public setCurrent(page: Page): void {
    method isValidState (line 303) | public isValidState(state: any): boolean {
    method getAllState (line 307) | public getAllState(): Page {

FILE: packages/core/src/infiniteScroll.ts
  function useInfiniteScroll (line 19) | function useInfiniteScroll(options: UseInfiniteScrollOptions): UseInfini...

FILE: packages/core/src/infiniteScroll/data.ts
  constant MERGE_INTENT_HEADER (line 5) | const MERGE_INTENT_HEADER = 'X-Inertia-Infinite-Scroll-Merge-Intent'
  type Side (line 7) | type Side = 'previous' | 'next'
  type ScrollPropPageNames (line 8) | type ScrollPropPageNames = keyof Pick<ScrollProp, 'previousPage' | 'next...
  type InfiniteScrollState (line 10) | type InfiniteScrollState = {

FILE: packages/core/src/infiniteScroll/elements.ts
  constant INFINITE_SCROLL_PAGE_KEY (line 6) | const INFINITE_SCROLL_PAGE_KEY = 'infiniteScrollPage'
  constant INFINITE_SCROLL_IGNORE_KEY (line 7) | const INFINITE_SCROLL_IGNORE_KEY = 'infiniteScrollIgnore'
  type ElementRange (line 9) | type ElementRange = {

FILE: packages/core/src/initialVisit.ts
  class InitialVisit (line 10) | class InitialVisit {
    method handle (line 11) | public static handle(): void {
    method clearRememberedStateOnReload (line 19) | protected static clearRememberedStateOnReload(): void {
    method handleBackForward (line 26) | protected static handleBackForward(): boolean {
    method handleLocation (line 51) | protected static handleLocation(): boolean {
    method handleDefault (line 91) | protected static handleDefault(): void {

FILE: packages/core/src/intersectionObservers.ts
  type IntersectionObserverCallback (line 1) | type IntersectionObserverCallback = (entry: IntersectionObserverEntry) =...
  type IntersectionObserverManager (line 3) | interface IntersectionObserverManager {

FILE: packages/core/src/modal.ts
  method createIframeAndPage (line 5) | createIframeAndPage(html: Record<string, unknown> | string): { iframe: H...
  method show (line 25) | show(html: Record<string, unknown> | string): void {
  method hide (line 52) | hide(): void {
  method hideOnEscape (line 59) | hideOnEscape(event: KeyboardEvent): void {

FILE: packages/core/src/navigationEvents.ts
  type MouseNavigationEvent (line 1) | type MouseNavigationEvent = Pick<
  type KeyboardNavigationEvent (line 6) | type KeyboardNavigationEvent = Pick<KeyboardEvent, 'currentTarget' | 'de...
  function isContentEditableOrPrevented (line 8) | function isContentEditableOrPrevented(event: KeyboardNavigationEvent | M...
  function shouldIntercept (line 17) | function shouldIntercept(event: MouseNavigationEvent): boolean {
  function shouldNavigate (line 35) | function shouldNavigate(event: KeyboardNavigationEvent): boolean {

FILE: packages/core/src/navigationType.ts
  class NavigationType (line 1) | class NavigationType {
    method constructor (line 4) | public constructor() {
    method resolveType (line 8) | protected resolveType(): NavigationTimingType {
    method get (line 24) | public get(): NavigationTimingType {
    method isBackForward (line 28) | public isBackForward(): boolean {
    method isReload (line 32) | public isReload(): boolean {

FILE: packages/core/src/page.ts
  class CurrentPage (line 9) | class CurrentPage {
    method init (line 24) | public init<ComponentType = Component>({
    method set (line 42) | public set(
    method setQuietly (line 160) | public setQuietly(
    method clear (line 176) | public clear(): void {
    method isCleared (line 180) | public isCleared(): boolean {
    method get (line 184) | public get(): Page {
    method getWithoutFlashData (line 188) | public getWithoutFlashData(): Page {
    method hasOnceProps (line 192) | public hasOnceProps(): boolean {
    method merge (line 196) | public merge(data: Partial<Page>): void {
    method setFlash (line 200) | public setFlash(flash: FlashData): void {
    method setUrlHash (line 205) | public setUrlHash(hash: string): void {
    method remember (line 211) | public remember(data: Page['rememberedState']): void {
    method swap (line 215) | public swap({
    method resolve (line 241) | public resolve(component: string): Promise<Component> {
    method isTheSame (line 245) | public isTheSame(page: Page): boolean {
    method on (line 249) | public on(event: PageEvent, callback: VoidFunction): VoidFunction {
    method fireEventsFor (line 257) | public fireEventsFor(event: PageEvent): void {
    method mergeOncePropsIntoResponse (line 261) | public mergeOncePropsIntoResponse(response: Page, { force = false }: {...

FILE: packages/core/src/poll.ts
  class Poll (line 3) | class Poll {
    method constructor (line 11) | constructor(interval: number, cb: VoidFunction, options: PollOptions) {
    method stop (line 22) | public stop() {
    method start (line 30) | public start() {
    method isInBackground (line 48) | public isInBackground(hidden: boolean) {

FILE: packages/core/src/polls.ts
  class Polls (line 4) | class Polls {
    method constructor (line 7) | constructor() {
    method add (line 11) | public add(
    method clear (line 29) | public clear() {
    method setupVisibilityListener (line 35) | protected setupVisibilityListener() {

FILE: packages/core/src/prefetched.ts
  class PrefetchedRequests (line 17) | class PrefetchedRequests {
    method add (line 23) | public add(
    method removeAll (line 109) | public removeAll(): void {
    method removeByTags (line 117) | public removeByTags(tags: string[]): void {
    method remove (line 123) | public remove(params: ActiveVisit): void {
    method removeFromInFlight (line 131) | protected removeFromInFlight(params: ActiveVisit): void {
    method extractStaleValues (line 137) | protected extractStaleValues(cacheFor: PrefetchOptions['cacheFor']): [...
    method cacheForToStaleAndExpires (line 143) | protected cacheForToStaleAndExpires(cacheFor: PrefetchOptions['cacheFo...
    method clearTimer (line 158) | protected clearTimer(params: ActiveVisit) {
    method scheduleForRemoval (line 169) | protected scheduleForRemoval(params: ActiveVisit, expiresIn: number) {
    method get (line 186) | public get(params: ActiveVisit): InFlightPrefetch | PrefetchedResponse...
    method use (line 190) | public use(prefetched: PrefetchedResponse | InFlightPrefetch, params: ...
    method removeSingleUseItems (line 212) | protected removeSingleUseItems(params: ActiveVisit) {
    method findCached (line 222) | public findCached(params: ActiveVisit): PrefetchedResponse | null {
    method findInFlight (line 230) | public findInFlight(params: ActiveVisit): InFlightPrefetch | null {
    method withoutPurposePrefetchHeader (line 238) | protected withoutPurposePrefetchHeader(params: ActiveVisit): ActiveVis...
    method paramsAreEqual (line 246) | protected paramsAreEqual(params1: ActiveVisit, params2: ActiveVisit): ...
    method updateCachedOncePropsFromCurrentPage (line 274) | public updateCachedOncePropsFromCurrentPage(): void {
    method getShortestOncePropTtl (line 309) | protected getShortestOncePropTtl(page: Page): number | null {

FILE: packages/core/src/progress-component.ts
  function clamp (line 238) | function clamp(n: number, min: number, max: number): number {

FILE: packages/core/src/progress.ts
  class Progress (line 4) | class Progress {
    method start (line 7) | public start(): void {
    method reveal (line 11) | public reveal(force: boolean = false): void {
    method hide (line 19) | public hide(): void {
    method set (line 25) | public set(status: number): void {
    method finish (line 29) | public finish(): void {
    method reset (line 33) | public reset(): void {
    method remove (line 37) | public remove(): void {
    method isStarted (line 42) | public isStarted(): boolean {
    method getStatus (line 46) | public getStatus(): number | null {
  function addEventListeners (line 55) | function addEventListeners(delay: number): void {
  function handleStartEvent (line 60) | function handleStartEvent(event: GlobalEvent<'start'>, delay: number): v...
  function handleProgressEvent (line 69) | function handleProgressEvent(event: GlobalEvent<'progress'>): void {
  function finish (line 75) | function finish(event: GlobalEvent<'finish'>, timeout: NodeJS.Timeout): ...
  function setupProgress (line 91) | function setupProgress({

FILE: packages/core/src/queue.ts
  class Queue (line 1) | class Queue<T> {
    method add (line 5) | public add(item: () => T) {
    method process (line 10) | public process() {
    method processNext (line 18) | protected processNext(): Promise<void> {

FILE: packages/core/src/request.ts
  class Request (line 9) | class Request {
    method constructor (line 15) | constructor(
    method create (line 23) | public static create(params: ActiveVisit, page: Page): Request {
    method isPrefetch (line 27) | public isPrefetch(): boolean {
    method send (line 31) | public async send() {
    method finish (line 95) | protected finish(): void {
    method fireFinishEvents (line 104) | protected fireFinishEvents(): void {
    method cancel (line 116) | public cancel({ cancelled = false, interrupted = false }: { cancelled?...
    method onProgress (line 129) | protected onProgress(progress: AxiosProgressEvent): void {
    method getHeaders (line 137) | protected getHeaders(): AxiosRequestConfig['headers'] {

FILE: packages/core/src/requestParams.ts
  class RequestParams (line 6) | class RequestParams {
    method constructor (line 14) | constructor(params: InternalActiveVisit) {
    method create (line 43) | public static create(params: ActiveVisit): RequestParams {
    method data (line 47) | public data() {
    method queryParams (line 51) | public queryParams() {
    method isPartial (line 55) | public isPartial() {
    method isPrefetch (line 59) | public isPrefetch(): boolean {
    method isDeferredPropsRequest (line 63) | public isDeferredPropsRequest() {
    method onCancelToken (line 67) | public onCancelToken(cb: VoidFunction) {
    method markAsFinished (line 73) | public markAsFinished() {
    method markAsCancelled (line 79) | public markAsCancelled({ cancelled = true, interrupted = false }) {
    method wasCancelledAtAll (line 87) | public wasCancelledAtAll() {
    method onFinish (line 91) | public onFinish() {
    method onStart (line 95) | public onStart() {
    method onPrefetching (line 99) | public onPrefetching() {
    method onPrefetchResponse (line 103) | public onPrefetchResponse(response: Response) {
    method onPrefetchError (line 109) | public onPrefetchError(error: Error) {
    method all (line 115) | public all() {
    method headers (line 119) | public headers(): AxiosRequestConfig['headers'] {
    method setPreserveOptions (line 149) | public setPreserveOptions(page: Page) {
    method runCallbacks (line 154) | public runCallbacks() {
    method merge (line 161) | public merge(toMerge: Partial<ActiveVisit>) {
    method wrapCallback (line 168) | protected wrapCallback(params: ActiveVisit, name: keyof VisitCallbacks) {
    method recordCallback (line 177) | protected recordCallback(name: keyof VisitCallbacks, args: any[]) {
    method resolvePreserveOption (line 181) | public static resolvePreserveOption(value: PreserveStateOption, page: ...

FILE: packages/core/src/requestStream.ts
  class RequestStream (line 3) | class RequestStream {
    method constructor (line 10) | constructor({ maxConcurrent, interruptible }: { maxConcurrent: number;...
    method send (line 15) | public send(request: Request) {
    method interruptInFlight (line 23) | public interruptInFlight(): void {
    method cancelInFlight (line 27) | public cancelInFlight({ prefetch = true } = {}): void {
    method cancel (line 33) | protected cancel({ cancelled = false, interrupted = false } = {}, forc...
    method shouldCancel (line 43) | protected shouldCancel(): boolean {

FILE: packages/core/src/resetFormFields.ts
  type FormElement (line 3) | type FormElement = HTMLInputElement | HTMLSelectElement | HTMLTextAreaEl...
  function isFormElement (line 5) | function isFormElement(element: Element): element is FormElement {
  function resetInputElement (line 13) | function resetInputElement(input: HTMLInputElement, defaultValues: FormD...
  function resetSelectElement (line 44) | function resetSelectElement(select: HTMLSelectElement, defaultValues: Fo...
  function resetFormElement (line 69) | function resetFormElement(element: FormElement, defaultValues: FormDataE...
  function resetFieldElements (line 127) | function resetFieldElements(
  function resetFormFields (line 161) | function resetFormFields(formElement: HTMLFormElement, defaults: FormDat...

FILE: packages/core/src/response.ts
  class Response (line 24) | class Response {
    method constructor (line 27) | constructor(
    method create (line 33) | public static create(params: RequestParams, response: AxiosResponse, o...
    method handlePrefetch (line 37) | public async handlePrefetch() {
    method handle (line 43) | public async handle() {
    method process (line 47) | public async process() {
    method mergeParams (line 102) | public mergeParams(params: ActiveVisit) {
    method getPageResponse (line 106) | public getPageResponse(): Page {
    method handleNonInertiaResponse (line 117) | protected async handleNonInertiaResponse() {
    method isInertiaResponse (line 136) | protected isInertiaResponse(): boolean {
    method hasStatus (line 140) | protected hasStatus(status: number): boolean {
    method getHeader (line 144) | protected getHeader(header: string): string {
    method hasHeader (line 148) | protected hasHeader(header: string): boolean {
    method isLocationVisit (line 152) | protected isLocationVisit(): boolean {
    method locationVisit (line 159) | protected locationVisit(url: URL): boolean | void {
    method setPage (line 179) | protected async setPage(): Promise<void> {
    method getDataFromResponse (line 207) | protected getDataFromResponse(response: any): any {
    method shouldSetPage (line 219) | protected shouldSetPage(pageResponse: Page): boolean {
    method pageUrl (line 245) | protected pageUrl(pageResponse: Page) {
    method preserveEqualProps (line 253) | protected preserveEqualProps(pageResponse: Page): void {
    method mergeProps (line 267) | protected mergeProps(pageResponse: Page): void {
    method mergeOrMatchItems (line 372) | protected mergeOrMatchItems(
    method appendWithMatching (line 410) | protected appendWithMatching(
    method prependWithMatching (line 440) | protected prependWithMatching(
    method hasUniqueProperty (line 458) | protected hasUniqueProperty(item: any, property: string): boolean {
    method setRememberedState (line 462) | protected async setRememberedState(pageResponse: Page): Promise<void> {
    method getScopedErrors (line 474) | protected getScopedErrors(errors: Errors & ErrorBag): Errors {

FILE: packages/core/src/router.ts
  class Router (line 50) | class Router {
    method init (line 63) | public init<ComponentType = Component>({
    method get (line 95) | public get<T extends RequestPayload = RequestPayload>(
    method post (line 103) | public post<T extends RequestPayload = RequestPayload>(
    method put (line 111) | public put<T extends RequestPayload = RequestPayload>(
    method patch (line 119) | public patch<T extends RequestPayload = RequestPayload>(
    method delete (line 127) | public delete<T extends RequestPayload = RequestPayload>(
    method reload (line 134) | public reload<T extends RequestPayload = RequestPayload>(options: Relo...
    method doReload (line 138) | protected doReload<T extends RequestPayload = RequestPayload>(
    method remember (line 159) | public remember(data: unknown, key = 'default'): void {
    method restore (line 163) | public restore<T = unknown>(key = 'default'): T | undefined {
    method on (line 167) | public on<TEventName extends GlobalEventNames>(
    method cancel (line 181) | public cancel(): void {
    method cancelAll (line 185) | public cancelAll({ async = true, prefetch = true, sync = true } = {}):...
    method poll (line 195) | public poll(interval: number, requestOptions: ReloadOptions = {}, opti...
    method visit (line 202) | public visit<T extends RequestPayload = RequestPayload>(
    method getCached (line 258) | public getCached(
    method flush (line 265) | public flush(href: string | URL | UrlMethodPair, options: VisitOptions...
    method flushAll (line 269) | public flushAll(): void {
    method flushByCacheTags (line 273) | public flushByCacheTags(tags: string | string[]): void {
    method getPrefetching (line 277) | public getPrefetching(
    method prefetch (line 284) | public prefetch(
    method clearHistory (line 356) | public clearHistory(): void {
    method decryptHistory (line 360) | public decryptHistory(): Promise<Page> {
    method resolveComponent (line 364) | public resolveComponent(component: string): Promise<Component> {
    method replace (line 368) | public replace<TProps = Page['props']>(params: ClientSideVisitOptions<...
    method replaceProp (line 372) | public replaceProp<TProps = Page['props']>(
    method appendToProp (line 389) | public appendToProp<TProps = Page['props']>(
    method prependToProp (line 409) | public prependToProp<TProps = Page['props']>(
    method push (line 429) | public push<TProps = Page['props']>(params: ClientSideVisitOptions<TPr...
    method flash (line 433) | public flash<TFlash extends PageFlashData = PageFlashData>(
    method clientVisit (line 457) | protected clientVisit<TProps = Page['props']>(
    method performClientVisit (line 464) | protected performClientVisit<TProps = Page['props']>(
    method getPrefetchParams (line 525) | protected getPrefetchParams(href: string | URL | UrlMethodPair, option...
    method getPendingVisit (line 538) | protected getPendingVisit(
    method getVisitEvents (line 604) | protected getVisitEvents(options: VisitOptions): VisitCallbacks {
    method loadDeferredProps (line 621) | protected loadDeferredProps(deferred: Page['deferredProps']): void {

FILE: packages/core/src/scroll.ts
  class Scroll (line 8) | class Scroll {
    method save (line 9) | public static save(): void {
    method getScrollRegions (line 13) | public static getScrollRegions(): ScrollRegion[] {
    method regions (line 20) | protected static regions(): NodeListOf<Element> {
    method scrollToTop (line 24) | public static scrollToTop(): void {
    method reset (line 33) | public static reset(): void {
    method scrollToAnchor (line 54) | public static scrollToAnchor(): void {
    method restore (line 67) | public static restore(scrollRegions: ScrollRegion[]): void {
    method restoreScrollRegions (line 78) | public static restoreScrollRegions(scrollRegions: ScrollRegion[]): void {
    method restoreDocument (line 99) | public static restoreDocument(): void {
    method onScroll (line 104) | public static onScroll(event: Event): void {
    method onWindowScroll (line 112) | public static onWindowScroll(): void {

FILE: packages/core/src/server.ts
  type AppCallback (line 7) | type AppCallback = (page: Page) => InertiaAppResponse
  type RouteHandler (line 8) | type RouteHandler = (request: IncomingMessage) => Promise<unknown>
  type ServerOptions (line 9) | type ServerOptions = {
  type Port (line 13) | type Port = number

FILE: packages/core/src/sessionStorage.ts
  class SessionStorage (line 1) | class SessionStorage {
    method set (line 4) | public static set(key: string, value: any): void {
    method get (line 10) | public static get(key: string): any {
    method merge (line 16) | public static merge(key: string, value: any): void {
    method remove (line 26) | public static remove(key: string): void {
    method removeNested (line 32) | public static removeNested(key: string, nestedKey: string): void {
    method exists (line 42) | public static exists(key: string): boolean {
    method clear (line 50) | public static clear(): void {

FILE: packages/core/src/types.ts
  type AxiosProgressEvent (line 6) | interface AxiosProgressEvent {
  type PageFlashData (line 11) | interface PageFlashData {
  type DefaultInertiaConfig (line 15) | type DefaultInertiaConfig = {
  type InertiaConfig (line 43) | interface InertiaConfig {}
  type InertiaConfigFor (line 44) | type InertiaConfigFor<Key extends keyof DefaultInertiaConfig> = Key exte...
  type ErrorValue (line 47) | type ErrorValue = InertiaConfigFor<'errorValueType'>
  type FlashData (line 48) | type FlashData = InertiaConfigFor<'flashDataType'>
  type SharedPageProps (line 49) | type SharedPageProps = InertiaConfigFor<'sharedPageProps'>
  type Errors (line 51) | type Errors = Record<string, ErrorValue>
  type ErrorBag (line 52) | type ErrorBag = Record<string, Errors>
  type FormDataConvertibleValue (line 54) | type FormDataConvertibleValue = Blob | FormDataEntryValue | Date | boole...
  type FormDataConvertible (line 55) | type FormDataConvertible =
  type FormDataType (line 60) | type FormDataType<T extends object> = {
  type FormDataKeys (line 75) | type FormDataKeys<T> = T extends Function | FormDataConvertibleValue
  type ArrayFormDataKeys (line 86) | type ArrayFormDataKeys<T extends unknown[]> = number extends T['length']
  type ObjectFormDataKeys (line 107) | type ObjectFormDataKeys<T extends object> = string extends keyof T
  type PartialFormDataErrors (line 127) | type PartialFormDataErrors<T> = {
  type FormDataErrors (line 131) | type FormDataErrors<T> = PartialFormDataErrors<T> & {
  type FormDataValues (line 135) | type FormDataValues<T, K extends FormDataKeys<T>> = K extends `${infer P...
  type FormDataError (line 153) | type FormDataError<T> = Partial<Record<FormDataKeys<T>, ErrorValue>>
  type Method (line 155) | type Method = 'get' | 'post' | 'put' | 'patch' | 'delete'
  type RequestPayload (line 157) | type RequestPayload = Record<string, FormDataConvertible> | FormData
  type PageProps (line 159) | interface PageProps {
  type ScrollProp (line 163) | type ScrollProp = {
  type Page (line 171) | interface Page<SharedProps extends PageProps = PageProps> {
  type ScrollRegion (line 202) | type ScrollRegion = {
  type ClientSideVisitOptions (line 207) | interface ClientSideVisitOptions<TProps = Page['props']> {
  type PageResolver (line 224) | type PageResolver = (name: string) => Component
  type PageHandler (line 226) | type PageHandler<ComponentType = Component> = ({
  type PreserveStateOption (line 236) | type PreserveStateOption = boolean | 'errors' | ((page: Page) => boolean)
  type QueryStringArrayFormatOption (line 238) | type QueryStringArrayFormatOption = 'indices' | 'brackets'
  type Progress (line 240) | type Progress = AxiosProgressEvent
  type LocationVisit (line 242) | type LocationVisit = {
  type CancelToken (line 246) | type CancelToken = {
  type CancelTokenCallback (line 250) | type CancelTokenCallback = (cancelToken: CancelToken) => void
  type Visit (line 252) | type Visit<T extends RequestPayload = RequestPayload> = {
  type GlobalEventsMap (line 274) | type GlobalEventsMap<T extends RequestPayload = RequestPayload> = {
  type PageEvent (line 375) | type PageEvent = 'newComponent' | 'firstLoad'
  type GlobalEventNames (line 377) | type GlobalEventNames<T extends RequestPayload = RequestPayload> = keyof...
  type GlobalEvent (line 379) | type GlobalEvent<
  type GlobalEventParameters (line 384) | type GlobalEventParameters<
  type GlobalEventResult (line 389) | type GlobalEventResult<
  type GlobalEventDetails (line 394) | type GlobalEventDetails<
  type GlobalEventTrigger (line 399) | type GlobalEventTrigger<TEventName extends GlobalEventNames<T>, T extend...
  type GlobalEventCallback (line 403) | type GlobalEventCallback<TEventName extends GlobalEventNames<T>, T exten...
  type InternalEvent (line 407) | type InternalEvent = 'missingHistoryItem' | 'loadDeferredProps' | 'histo...
  type VisitCallbacks (line 409) | type VisitCallbacks<T extends RequestPayload = RequestPayload> = {
  type VisitOptions (line 424) | type VisitOptions<T extends RequestPayload = RequestPayload> = Partial<V...
  type ReloadOptions (line 426) | type ReloadOptions<T extends RequestPayload = RequestPayload> = Omit<
  type PollOptions (line 431) | type PollOptions = {
  type VisitHelperOptions (line 436) | type VisitHelperOptions<T extends RequestPayload = RequestPayload> = Omi...
  type RouterInitParams (line 438) | type RouterInitParams<ComponentType = Component> = {
  type PendingVisitOptions (line 445) | type PendingVisitOptions = {
  type PendingVisit (line 452) | type PendingVisit<T extends RequestPayload = RequestPayload> = Visit<T> ...
  type ActiveVisit (line 454) | type ActiveVisit<T extends RequestPayload = RequestPayload> = PendingVis...
  type InternalActiveVisit (line 456) | type InternalActiveVisit = ActiveVisit & {
  type VisitId (line 462) | type VisitId = unknown
  type Component (line 463) | type Component = unknown
  type FirstLevelOptional (line 465) | type FirstLevelOptional<T> = {
  type CreateInertiaAppOptions (line 469) | interface CreateInertiaAppOptions<TComponentResolver, TSetupOptions, TSe...
  type CreateInertiaAppOptionsForCSR (line 476) | interface CreateInertiaAppOptionsForCSR<
  type CreateInertiaAppOptionsForSSR (line 496) | interface CreateInertiaAppOptionsForSSR<
  type InertiaAppSSRResponse (line 509) | type InertiaAppSSRResponse = { head: string[]; body: string }
  type InertiaAppResponse (line 510) | type InertiaAppResponse = Promise<InertiaAppSSRResponse | void>
  type HeadManagerTitleCallback (line 512) | type HeadManagerTitleCallback = (title: string) => string
  type HeadManagerOnUpdateCallback (line 513) | type HeadManagerOnUpdateCallback = (elements: string[]) => void
  type HeadManager (line 514) | type HeadManager = {
  type LinkPrefetchOption (line 524) | type LinkPrefetchOption = 'mount' | 'hover' | 'click'
  type TimeUnit (line 526) | type TimeUnit = 'ms' | 's' | 'm' | 'h' | 'd'
  type CacheForOption (line 527) | type CacheForOption = number | `${number}${TimeUnit}` | string
  type PrefetchOptions (line 529) | type PrefetchOptions = {
  type InertiaAppConfig (line 534) | type InertiaAppConfig = {
  type LinkComponentBaseProps (line 557) | interface LinkComponentBaseProps extends Partial<
  type PrefetchObject (line 581) | type PrefetchObject = {
  type InFlightPrefetch (line 586) | type InFlightPrefetch = PrefetchObject & {
  type PrefetchCancellationToken (line 591) | type PrefetchCancellationToken = {
  type PrefetchedResponse (line 596) | type PrefetchedResponse = PrefetchObject & {
  type PrefetchRemovalTimer (line 605) | type PrefetchRemovalTimer = {
  type ProgressSettings (line 610) | type ProgressSettings = {
  type UrlMethodPair (line 626) | type UrlMethodPair = { url: string; method: Method }
  type UseFormTransformCallback (line 628) | type UseFormTransformCallback<TForm> = (data: TForm) => object
  type UseFormWithPrecognitionArguments (line 629) | type UseFormWithPrecognitionArguments =
  type UseFormInertiaArguments (line 633) | type UseFormInertiaArguments<TForm> =
  type UseFormPrecognitionArguments (line 637) | type UseFormPrecognitionArguments<TForm> =
  type UseFormArguments (line 640) | type UseFormArguments<TForm> = UseFormInertiaArguments<TForm> | UseFormP...
  type UseFormSubmitOptions (line 642) | type UseFormSubmitOptions = Omit<VisitOptions, 'data'>
  type UseFormSubmitArguments (line 643) | type UseFormSubmitArguments =
  type FormComponentOptions (line 648) | type FormComponentOptions = Pick<
  type FormComponentProps (line 653) | type FormComponentProps = Partial<
  type FormComponentMethods (line 671) | type FormComponentMethods = {
  type FormComponentonSubmitCompleteArguments (line 691) | type FormComponentonSubmitCompleteArguments = Pick<FormComponentMethods,...
  type FormComponentState (line 693) | type FormComponentState = {
  type FormComponentSlotProps (line 704) | type FormComponentSlotProps = FormComponentMethods & FormComponentState
  type FormComponentRef (line 706) | type FormComponentRef = FormComponentSlotProps
  type UseInfiniteScrollOptions (line 708) | interface UseInfiniteScrollOptions {
  type UseInfiniteScrollDataManager (line 731) | interface UseInfiniteScrollDataManager {
  type UseInfiniteScrollElementManager (line 742) | interface UseInfiniteScrollElementManager {
  type UseInfiniteScrollProps (line 752) | interface UseInfiniteScrollProps {
  type InfiniteScrollSlotProps (line 758) | interface InfiniteScrollSlotProps {
  type InfiniteScrollActionSlotProps (line 764) | interface InfiniteScrollActionSlotProps {
  type InfiniteScrollRef (line 776) | interface InfiniteScrollRef {
  type InfiniteScrollComponentBaseProps (line 783) | interface InfiniteScrollComponentBaseProps {
  type DocumentEventMap (line 797) | interface DocumentEventMap {

FILE: packages/core/src/url.ts
  function hrefToUrl (line 14) | function hrefToUrl(href: string | URL): URL {
  type MergeDataIntoQueryStringDataReturnType (line 44) | type MergeDataIntoQueryStringDataReturnType<T extends RequestPayload> =
  function mergeDataIntoQueryString (line 47) | function mergeDataIntoQueryString<T extends RequestPayload>(
  function urlWithoutHash (line 90) | function urlWithoutHash(url: URL | Location): URL {
  function isUrlMethodPair (line 110) | function isUrlMethodPair(href: unknown): href is UrlMethodPair {
  function urlHasProtocol (line 114) | function urlHasProtocol(url: string): boolean {
  function urlToString (line 118) | function urlToString(url: URL | string, absolute: boolean): string {

FILE: packages/core/src/useFormUtils.ts
  class UseFormUtils (line 12) | class UseFormUtils {
    method createWayfinderCallback (line 21) | public static createWayfinderCallback(
    method parseUseFormArguments (line 48) | public static parseUseFormArguments<TForm extends FormDataType<TForm>>(
    method parseSubmitArguments (line 110) | public static parseSubmitArguments(
    method mergeHeadersForValidation (line 131) | public static mergeHeadersForValidation(

FILE: packages/react/build.js
  method setup (line 29) | setup(build) {

FILE: packages/react/src/App.ts
  type CurrentPage (line 25) | type CurrentPage = {
  type InertiaAppProps (line 31) | interface InertiaAppProps<SharedProps extends PageProps = PageProps> {
  type InertiaApp (line 40) | type InertiaApp = FunctionComponent<InertiaAppProps>
  function App (line 42) | function App<SharedProps extends PageProps = PageProps>({

FILE: packages/react/src/Deferred.ts
  type DeferredProps (line 16) | interface DeferredProps {

FILE: packages/react/src/Form.ts
  type ComponentProps (line 39) | type ComponentProps = (FormComponentProps &
  type FormSubmitOptions (line 45) | type FormSubmitOptions = Omit<VisitOptions, 'data' | 'onPrefetched' | 'o...
  type FormSubmitter (line 46) | type FormSubmitter = HTMLElement | null
  method onError (line 234) | onError(...args) {
  function useFormContext (line 309) | function useFormContext(): FormComponentRef | undefined {

FILE: packages/react/src/Head.ts
  type InertiaHeadProps (line 5) | type InertiaHeadProps = {
  type InertiaHead (line 10) | type InertiaHead = FunctionComponent<InertiaHeadProps>
  function isUnaryTag (line 25) | function isUnaryTag(node: ReactElement<any>) {
  function renderTagStart (line 48) | function renderTagStart(node: ReactElement<any>): string {
  function renderTagChildren (line 66) | function renderTagChildren(node: ReactElement<any>): string {
  function renderTag (line 80) | function renderTag(node: ReactElement<any>): string {
  function ensureNodeHasInertiaProp (line 98) | function ensureNodeHasInertiaProp(node: ReactElement<any>) {
  function renderNode (line 104) | function renderNode(node: ReactElement<any>) {
  function renderNodes (line 108) | function renderNodes(nodes: ReactNode) {

FILE: packages/react/src/InfiniteScroll.ts
  type ComponentProps (line 55) | interface ComponentProps
  function syncStateFromDataManager (line 177) | function syncStateFromDataManager() {

FILE: packages/react/src/Link.ts
  type BaseInertiaLinkProps (line 19) | interface BaseInertiaLinkProps extends LinkComponentBaseProps {
  type InertiaLinkProps (line 24) | type InertiaLinkProps = BaseInertiaLinkProps &
  method onStart (line 110) | onStart(visit: PendingVisit) {
  method onFinish (line 115) | onFinish(visit: ActiveVisit) {

FILE: packages/react/src/WhenVisible.ts
  type WhenVisibleSlotProps (line 5) | interface WhenVisibleSlotProps {
  type WhenVisibleProps (line 9) | interface WhenVisibleProps {

FILE: packages/react/src/createInertiaApp.ts
  type SetupOptions (line 19) | type SetupOptions<ElementType, SharedProps extends PageProps> = {
  type ComponentResolver (line 26) | type ComponentResolver = (
  type InertiaAppOptionsForCSR (line 30) | type InertiaAppOptionsForCSR<SharedProps extends PageProps> = CreateIner...
  type InertiaAppOptionsForSSR (line 38) | type InertiaAppOptionsForSSR<SharedProps extends PageProps> = CreateIner...
  function createInertiaApp (line 54) | async function createInertiaApp<SharedProps extends PageProps = PageProp...

FILE: packages/react/src/react.ts
  function useIsomorphicLayoutEffect (line 5) | function useIsomorphicLayoutEffect(effect: EffectCallback, deps?: Depend...

FILE: packages/react/src/types.ts
  type LayoutFunction (line 4) | type LayoutFunction = (page: ReactNode) => ReactNode
  type LayoutComponent (line 5) | type LayoutComponent = ComponentType<{ children: ReactNode }>
  type ReactComponent (line 7) | type ReactComponent = ComponentType<any> & {
  type ReactPageHandlerArgs (line 11) | type ReactPageHandlerArgs = Parameters<PageHandler<ComponentType>>[0]
  type ReactInertiaAppConfig (line 12) | type ReactInertiaAppConfig = {}

FILE: packages/react/src/useForm.ts
  type SetDataByObject (line 37) | type SetDataByObject<TForm> = (data: Partial<TForm>) => void
  type SetDataByMethod (line 38) | type SetDataByMethod<TForm> = (data: (previousData: TForm) => TForm) => ...
  type SetDataByKeyValuePair (line 39) | type SetDataByKeyValuePair<TForm> = <K extends FormDataKeys<TForm>>(
  type SetDataAction (line 43) | type SetDataAction<TForm extends Record<any, any>> = SetDataByObject<TFo...
  type PrecognitionValidationConfig (line 47) | type PrecognitionValidationConfig<TKeys> = ValidationConfig & {
  type InertiaFormProps (line 51) | interface InertiaFormProps<TForm extends object> {
  type InertiaFormValidationProps (line 85) | interface InertiaFormValidationProps<TForm extends object> {
  type InertiaForm (line 108) | type InertiaForm<TForm extends object> = InertiaFormProps<TForm>
  type InertiaPrecognitiveFormProps (line 109) | type InertiaPrecognitiveFormProps<TForm extends object> = InertiaFormPro...
  function useForm (line 127) | function useForm<TForm extends FormDataType<TForm>>(

FILE: packages/react/src/usePage.ts
  function usePage (line 6) | function usePage<TPageProps extends PageProps = PageProps>(): Page<TPage...

FILE: packages/react/src/usePoll.ts
  function usePoll (line 4) | function usePoll(

FILE: packages/react/src/usePrefetch.ts
  function usePrefetch (line 4) | function usePrefetch(options: VisitOptions = {}): {

FILE: packages/react/src/useRemember.ts
  function useRemember (line 4) | function useRemember<State>(

FILE: packages/react/test-app/Pages/ClientSideVisit/Page1.tsx
  type PageProps (line 5) | interface PageProps {

FILE: packages/react/test-app/Pages/ClientSideVisit/Props.tsx
  type Tag (line 3) | interface Tag {
  type User (line 8) | interface User {

FILE: packages/react/test-app/Pages/DeepMergeProps.tsx
  type PageProps (line 4) | type PageProps = {
  method onSuccess (line 19) | onSuccess(visit) {

FILE: packages/react/test-app/Pages/Events.tsx
  type Window (line 4) | interface Window {
  type CancelToken (line 468) | type CancelToken = {

FILE: packages/react/test-app/Pages/Flash/ClientSideVisits.tsx
  type Window (line 4) | interface Window {

FILE: packages/react/test-app/Pages/Flash/Events.tsx
  type Window (line 4) | interface Window {

FILE: packages/react/test-app/Pages/FormComponent/DottedKeys.tsx
  function DottedKeys (line 3) | function DottedKeys() {

FILE: packages/react/test-app/Pages/FormComponent/Events.tsx
  function log (line 12) | function log(eventName: string) {

FILE: packages/react/test-app/Pages/FormComponent/Headers.tsx
  function addCustomHeader (line 9) | function addCustomHeader() {

FILE: packages/react/test-app/Pages/FormComponent/Options.tsx
  function setOnly (line 19) | function setOnly() {
  function setExcept (line 23) | function setExcept() {
  function setReset (line 27) | function setReset() {
  function enableReplace (line 31) | function enableReplace() {
  function enablePreserveScroll (line 35) | function enablePreserveScroll() {
  function enablePreserveState (line 39) | function enablePreserveState() {
  function enablePreserveUrl (line 44) | function enablePreserveUrl() {

FILE: packages/react/test-app/Pages/FormComponent/Precognition/BeforeValidation.tsx
  function PrecognitionBefore (line 4) | function PrecognitionBefore() {

FILE: packages/react/test-app/Pages/FormComponent/Precognition/DynamicArrayInputs.tsx
  function addItem (line 7) | function addItem() {
  function updateItem (line 11) | function updateItem(index: number, value: string) {

FILE: packages/react/test-app/Pages/FormComponent/Precognition/Headers.tsx
  function PrecognitionHeaders (line 3) | function PrecognitionHeaders() {

FILE: packages/react/test-app/Pages/FormComponent/Progress.tsx
  function disableProgress (line 11) | function disableProgress() {

FILE: packages/react/test-app/Pages/FormComponent/Ref.tsx
  function Ref (line 5) | function Ref() {

FILE: packages/react/test-app/Pages/FormComponent/Reset.tsx
  type Window (line 6) | interface Window {
  function Reset (line 11) | function Reset() {

FILE: packages/react/test-app/Pages/FormHelper/EmptyForm.tsx
  type FormData (line 3) | interface FormData {

FILE: packages/react/test-app/Pages/FormHelper/Events.tsx
  type Window (line 7) | interface Window {

FILE: packages/react/test-app/Pages/FormHelper/Precognition/DynamicArrayInputs.tsx
  function addItem (line 10) | function addItem() {
  function updateItem (line 14) | function updateItem(index: number, value: string) {

FILE: packages/react/test-app/Pages/FormHelper/RememberEdit.tsx
  type User (line 3) | interface User {

FILE: packages/react/test-app/Pages/FormHelper/RememberIndex.tsx
  type User (line 3) | interface User {

FILE: packages/react/test-app/Pages/FormHelper/TypeScript/Any.tsx
  function Any (line 4) | function Any() {

FILE: packages/react/test-app/Pages/FormHelper/TypeScript/Child.tsx
  type ChildProps (line 4) | interface ChildProps {
  function Child (line 11) | function Child({ form }: ChildProps) {

FILE: packages/react/test-app/Pages/FormHelper/TypeScript/CircularlReferences.tsx
  type SubData (line 4) | type SubData = {
  type Data (line 9) | type Data = {
  function Any (line 13) | function Any() {

FILE: packages/react/test-app/Pages/FormHelper/TypeScript/Data.tsx
  type FormData (line 4) | type FormData = {
  function Data (line 16) | function Data() {

FILE: packages/react/test-app/Pages/FormHelper/TypeScript/DynamicInputName.tsx
  type ClientForm (line 4) | interface ClientForm {
  function DynamicInputName (line 9) | function DynamicInputName() {

FILE: packages/react/test-app/Pages/FormHelper/TypeScript/Errors.tsx
  type FormData (line 4) | type FormData = {
  function Errors (line 16) | function Errors() {

FILE: packages/react/test-app/Pages/FormHelper/TypeScript/Generic.tsx
  type GenericProps (line 5) | interface GenericProps<TFormData extends Record<string, FormDataConverti...
  function Generic (line 9) | function Generic<TFormData extends Record<string, FormDataConvertible>>({

FILE: packages/react/test-app/Pages/FormHelper/TypeScript/Nullable.tsx
  function Nullable (line 4) | function Nullable() {

FILE: packages/react/test-app/Pages/FormHelper/TypeScript/NullableNestedObject.tsx
  type FormData (line 4) | interface FormData {
  function NullableNestedObject (line 10) | function NullableNestedObject() {

FILE: packages/react/test-app/Pages/FormHelper/TypeScript/OptionalProps.tsx
  type LoginData (line 4) | interface LoginData {
  function OptionalProps (line 10) | function OptionalProps({ user }: { user?: { username: string } }) {

FILE: packages/react/test-app/Pages/FormHelper/TypeScript/Parent.tsx
  function Parent (line 5) | function Parent() {

FILE: packages/react/test-app/Pages/FormHelper/TypeScript/ValidationKey.tsx
  type Key (line 6) | type Key = keyof ReturnType<typeof errors>
  function ValidationKey (line 23) | function ValidationKey() {

FILE: packages/react/test-app/Pages/HistoryThrottle.tsx
  function HistoryThrottle (line 4) | function HistoryThrottle() {

FILE: packages/react/test-app/Pages/InfiniteScroll/DualContainers.tsx
  type Props (line 4) | interface Props {

FILE: packages/react/test-app/Pages/InfiniteScroll/DualSibling.tsx
  type Props (line 4) | interface Props {

FILE: packages/react/test-app/Pages/InfiniteScroll/Filtering.tsx
  type Props (line 6) | interface Props {

FILE: packages/react/test-app/Pages/InfiniteScroll/FilteringManual.tsx
  type Props (line 6) | interface Props {

FILE: packages/react/test-app/Pages/InfiniteScroll/RememberState.tsx
  function prependUser (line 5) | function prependUser(id: number) {

FILE: packages/react/test-app/Pages/InfiniteScroll/UpdateQueryString.tsx
  method pageUrl (line 9) | get pageUrl() {

FILE: packages/react/test-app/Pages/InfiniteScroll/UserCard.tsx
  type User (line 1) | interface User {

FILE: packages/react/test-app/Pages/Links/AsComponent.tsx
  type Window (line 5) | interface Window {

FILE: packages/react/test-app/Pages/Links/AsElement.tsx
  type Window (line 5) | interface Window {

FILE: packages/react/test-app/Pages/Links/PreserveUrl.tsx
  type PreserveUrlProps (line 3) | interface PreserveUrlProps {

FILE: packages/react/test-app/Pages/MatchPropsOnKey.tsx
  type FooItem (line 4) | interface FooItem {
  type FooProps (line 8) | interface FooProps {
  type PageProps (line 19) | interface PageProps {
  method onSuccess (line 34) | onSuccess(page) {

FILE: packages/react/test-app/Pages/NavigateNonInertia.tsx
  function navigate (line 2) | function navigate(e: React.MouseEvent) {

FILE: packages/react/test-app/Pages/NetworkError.tsx
  function makeRequest (line 14) | function makeRequest() {

FILE: packages/react/test-app/Pages/Poll/Hook.tsx
  method onFinish (line 6) | onFinish() {

FILE: packages/react/test-app/Pages/Poll/HookManual.tsx
  method onFinish (line 8) | onFinish() {

FILE: packages/react/test-app/Pages/Poll/RouterManual.tsx
  method onFinish (line 10) | onFinish() {

FILE: packages/react/test-app/Pages/Prefetch/AfterError.tsx
  function AfterError (line 3) | function AfterError() {

FILE: packages/react/test-app/Pages/Prefetch/Wayfinder.tsx
  function Wayfinder (line 4) | function Wayfinder() {

FILE: packages/react/test-app/Pages/PreserveEqualProps.tsx
  function enable (line 16) | function enable() {

FILE: packages/react/test-app/Pages/ProgressComponent.tsx
  type Window (line 5) | interface Window {

FILE: packages/react/test-app/Pages/Reload/Concurrent.tsx
  function reloadBothProps (line 6) | function reloadBothProps() {

FILE: packages/react/test-app/Pages/Reload/ConcurrentWithData.tsx
  function reloadBothPropsWithData (line 6) | function reloadBothPropsWithData() {

FILE: packages/react/test-app/Pages/Remember/Router.tsx
  function remember (line 8) | function remember() {
  function restore (line 13) | function restore() {
  function restoreTyped (line 18) | function restoreTyped() {

FILE: packages/react/test-app/Pages/TypeScriptCreateInertiaApp.ts
  type InertiaConfig (line 5) | interface InertiaConfig {
  method setup (line 18) | setup({ props }) {

FILE: packages/react/test-app/Pages/TypeScriptFlash.tsx
  type InertiaConfig (line 5) | interface InertiaConfig {
  function TypeScriptFlash (line 12) | function TypeScriptFlash() {

FILE: packages/react/test-app/Pages/TypeScriptProps.tsx
  type InertiaConfig (line 5) | interface InertiaConfig {
  type PageProps (line 12) | type PageProps = {
  function TypeScriptProps (line 16) | function TypeScriptProps() {

FILE: packages/react/test-app/Pages/Visits/Wayfinder.tsx
  function Wayfinder (line 3) | function Wayfinder() {

FILE: packages/react/test-app/Pages/WhenVisibleArrayReload.tsx
  type Props (line 3) | interface Props {

FILE: packages/react/test-app/Pages/WhenVisibleReload.tsx
  type Props (line 3) | interface Props {

FILE: packages/react/test-app/app.tsx
  method setup (line 23) | setup({ el, App, props }) {

FILE: packages/react/test-app/types.d.ts
  type Window (line 4) | interface Window {
  type ImportMeta (line 28) | interface ImportMeta {
  type MulterFile (line 33) | type MulterFile = Express.Multer.File

FILE: packages/svelte/src/components/formContext.ts
  function useFormContext (line 7) | function useFormContext(): Readable<FormComponentRef> | undefined {

FILE: packages/svelte/src/createInertiaApp.ts
  type SvelteRenderResult (line 16) | type SvelteRenderResult = { html: string; head: string; css?: { code: st...
  type SetupOptions (line 18) | type SetupOptions<SharedProps extends PageProps> = {
  type InertiaAppOptions (line 26) | type InertiaAppOptions<SharedProps extends PageProps> = CreateInertiaApp...
  function createInertiaApp (line 34) | async function createInertiaApp<SharedProps extends PageProps = PageProp...

FILE: packages/svelte/src/link.ts
  type ActionEventHandlers (line 18) | type ActionEventHandlers = {
  type ActionElement (line 22) | interface ActionElement extends HTMLElement {
  type ActionParameters (line 26) | type ActionParameters = Omit<LinkComponentBaseProps, 'onCancelToken'> & ...
  type SelectedEventKeys (line 28) | type SelectedEventKeys =
  type SelectedGlobalEventsMap (line 38) | type SelectedGlobalEventsMap = Pick<GlobalEventsMap, SelectedEventKeys>
  type ActionAttributes (line 39) | type ActionAttributes = {
  function link (line 48) | function link(

FILE: packages/svelte/src/page.ts
  type SveltePage (line 4) | type SveltePage<TPageProps extends PageProps = PageProps> = Omit<Page<TP...
  function usePage (line 16) | function usePage<TPageProps extends PageProps = PageProps>(): Readable<S...

FILE: packages/svelte/src/types.ts
  type ComponentResolver (line 4) | type ComponentResolver = (name: string) => ResolvedComponent | Promise<R...
  type LayoutResolver (line 6) | type LayoutResolver = (h: RenderFunction, page: RenderProps) => RenderProps
  type LayoutType (line 8) | type LayoutType = LayoutResolver | ComponentType | ComponentType[]
  type ResolvedComponent (line 10) | type ResolvedComponent = {
  type SvelteInertiaAppConfig (line 15) | type SvelteInertiaAppConfig = {}

FILE: packages/svelte/src/useForm.ts
  function validateFormDataKeys (line 35) | function validateFormDataKeys<TForm extends object>(data: TForm): void {
  type InertiaFormStore (line 57) | type InertiaFormStore<TForm extends object> = Writable<InertiaForm<TForm...
  type InertiaPrecognitiveFormStore (line 58) | type InertiaPrecognitiveFormStore<TForm extends object> = Writable<Inert...
  type TransformCallback (line 61) | type TransformCallback<TForm> = (data: TForm) => object
  type PrecognitionValidationConfig (line 63) | type PrecognitionValidationConfig<TKeys> = ValidationConfig & {
  type InertiaFormProps (line 67) | interface InertiaFormProps<TForm extends object> {
  type InertiaFormValidationProps (line 98) | interface InertiaFormValidationProps<TForm extends object> {
  type InternalPrecognitionState (line 118) | interface InternalPrecognitionState {
  type InertiaForm (line 123) | type InertiaForm<TForm extends object> = InertiaFormProps<TForm> & TForm
  type InertiaPrecognitiveForm (line 124) | type InertiaPrecognitiveForm<TForm extends object> = InertiaForm<TForm> ...
  type ReservedFormKeys (line 126) | type ReservedFormKeys = keyof InertiaFormProps<any>
  type ValidateFormData (line 128) | type ValidateFormData<T> = {
  function useForm (line 149) | function useForm<TForm extends FormDataType<TForm>>(

FILE: packages/svelte/src/usePoll.ts
  function usePoll (line 4) | function usePoll(

FILE: packages/svelte/src/usePrefetch.ts
  function usePrefetch (line 5) | function usePrefetch(options: VisitOptions = {}) {

FILE: packages/svelte/src/useRemember.ts
  function useRemember (line 6) | function useRemember<State>(initialState: State, key?: string) {

FILE: packages/svelte/test-app/Pages/TypeScriptCreateInertiaApp.ts
  type InertiaConfig (line 5) | interface InertiaConfig {
  method setup (line 18) | setup({ el, App, props }) {

FILE: packages/svelte/test-app/app.ts
  method setup (line 21) | setup({ el, App, props }) {

FILE: packages/svelte/test-app/ssr.ts
  method setup (line 11) | setup({ App, props }) {

FILE: packages/svelte/test-app/svelte-html.d.ts
  type HTMLAttributes (line 2) | interface HTMLAttributes<T extends EventTarget> {

FILE: packages/svelte/test-app/types.d.ts
  type Window (line 4) | interface Window {
  type ImportMeta (line 28) | interface ImportMeta {
  type MulterFile (line 33) | type MulterFile = Express.Multer.File

FILE: packages/vue3/build.js
  method setup (line 29) | setup(build) {

FILE: packages/vue3/src/app.ts
  type InertiaAppProps (line 27) | interface InertiaAppProps<SharedProps extends PageProps = PageProps> {
  type InertiaApp (line 35) | type InertiaApp = DefineComponent<InertiaAppProps>
  method setup (line 69) | setup({ initialPage, initialComponent, resolveComponent, titleCallback, ...
  method install (line 130) | install(app) {
  function usePage (line 141) | function usePage<TPageProps extends PageProps = PageProps>(): Page<TPage...

FILE: packages/vue3/src/createInertiaApp.ts
  type ComponentResolver (line 18) | type ComponentResolver = (name: string) => DefineComponent | Promise<Def...
  type SetupOptions (line 20) | type SetupOptions<ElementType, SharedProps extends PageProps> = {
  type InertiaAppOptionsForCSR (line 27) | type InertiaAppOptionsForCSR<SharedProps extends PageProps> = CreateIner...
  type InertiaAppOptionsForSSR (line 35) | type InertiaAppOptionsForSSR<SharedProps extends PageProps> = CreateIner...
  function createInertiaApp (line 51) | async function createInertiaApp<SharedProps extends PageProps = PageProp...

FILE: packages/vue3/src/deferred.ts
  method render (line 11) | render() {

FILE: packages/vue3/src/form.ts
  type FormSubmitOptions (line 35) | type FormSubmitOptions = Omit<VisitOptions, 'data' | 'onPrefetched' | 'o...
  type FormSubmitter (line 36) | type FormSubmitter = HTMLElement | null
  method setup (line 149) | setup(props, { slots, attrs, expose }) {
  function useFormContext (line 375) | function useFormContext(): FormComponentRef | undefined {

FILE: packages/vue3/src/head.ts
  type InertiaHead (line 4) | type InertiaHead = DefineComponent<{
  method data (line 15) | data() {
  method beforeUnmount (line 20) | beforeUnmount() {
  method isUnaryTag (line 24) | isUnaryTag(node: VNode) {
  method renderTagStart (line 46) | renderTagStart(node: VNode) {
  method renderTagChildren (line 64) | renderTagChildren(node: VNode): string {
  method isFunctionNode (line 79) | isFunctionNode(node: VNode): node is VNode & { type: () => VNode } {
  method isComponentNode (line 82) | isComponentNode(node: VNode): node is VNode & { type: object } {
  method isCommentNode (line 85) | isCommentNode(node: VNode) {
  method isFragmentNode (line 88) | isFragmentNode(node: VNode) {
  method isTextNode (line 91) | isTextNode(node: VNode) {
  method renderTag (line 94) | renderTag(node: VNode): string {
  method addTitleElement (line 115) | addTitleElement(elements: string[]) {
  method renderNodes (line 122) | renderNodes(nodes: VNode[]) {
  method resolveNode (line 130) | resolveNode(node: VNode): VNode | VNode[] {
  method render (line 147) | render() {

FILE: packages/vue3/src/infiniteScroll.ts
  method setup (line 96) | setup(props, { slots, attrs, expose }) {

FILE: packages/vue3/src/link.ts
  type InertiaLinkProps (line 18) | interface InertiaLinkProps extends LinkComponentBaseProps {
  type InertiaLink (line 23) | type InertiaLink = DefineComponent<InertiaLinkProps>
  method setup (line 137) | setup(props, { slots, attrs }) {

FILE: packages/vue3/src/remember.ts
  method created (line 6) | created() {

FILE: packages/vue3/src/types.ts
  type VuePageHandlerArgs (line 5) | type VuePageHandlerArgs = Parameters<PageHandler<DefineComponent>>[0]
  type VueInertiaAppConfig (line 6) | type VueInertiaAppConfig = {}
  type Router (line 9) | interface Router {
  type ComponentCustomProperties (line 15) | interface ComponentCustomProperties {
  type ComponentCustomOptions (line 21) | interface ComponentCustomOptions {

FILE: packages/vue3/src/useForm.ts
  function validateFormDataKeys (line 39) | function validateFormDataKeys<TForm extends object>(data: TForm): void {
  type InertiaFormProps (line 59) | interface InertiaFormProps<TForm extends object> {
  type PrecognitionValidationConfig (line 88) | type PrecognitionValidationConfig<TKeys> = ValidationConfig & {
  type InertiaFormValidationProps (line 92) | interface InertiaFormValidationProps<TForm extends object> {
  type InternalPrecognitionState (line 112) | interface InternalPrecognitionState {
  type InternalRememberState (line 117) | interface InternalRememberState<TForm extends object> {
  type InertiaForm (line 123) | type InertiaForm<TForm extends object> = TForm & InertiaFormProps<TForm>
  type InertiaPrecognitiveForm (line 124) | type InertiaPrecognitiveForm<TForm extends object> = InertiaForm<TForm> &
  type ReservedFormKeys (line 128) | type ReservedFormKeys = keyof InertiaFormProps<any>
  type ValidateFormData (line 130) | type ValidateFormData<T> = {
  function useForm (line 151) | function useForm<TForm extends FormDataType<TForm>>(

FILE: packages/vue3/src/usePoll.ts
  function usePoll (line 4) | function usePoll(

FILE: packages/vue3/src/usePrefetch.ts
  function usePrefetch (line 4) | function usePrefetch(options: VisitOptions = {}): {

FILE: packages/vue3/src/useRemember.ts
  function useRemember (line 5) | function useRemember<T extends object>(

FILE: packages/vue3/src/whenVisible.ts
  method data (line 31) | data() {
  method unmounted (line 38) | unmounted() {
  method keys (line 42) | keys(): string[] {
  method created (line 46) | created() {
  method registerObserver (line 67) | registerObserver() {
  method getReloadParams (line 112) | getReloadParams(): Partial<ReloadOptions> {
  method render (line 122) | render() {

FILE: packages/vue3/test-app/Pages/TypeScriptCreateInertiaApp.ts
  type InertiaConfig (line 7) | interface InertiaConfig {
  method setup (line 20) | setup({ el, App, props, plugin }) {

FILE: packages/vue3/test-app/app.ts
  method setup (line 23) | setup({ el, App, props, plugin }) {

FILE: packages/vue3/test-app/ssr.ts
  method setup (line 14) | setup({ App, props, plugin }) {

FILE: packages/vue3/test-app/types.d.ts
  type Window (line 4) | interface Window {
  type ImportMeta (line 28) | interface ImportMeta {
  type MulterFile (line 33) | type MulterFile = Express.Multer.File

FILE: playgrounds/react/app/Console/Kernel.php
  class Kernel (line 8) | class Kernel extends ConsoleKernel
    method schedule (line 16) | protected function schedule(Schedule $schedule)
    method commands (line 26) | protected function commands()

FILE: playgrounds/react/app/Exceptions/Handler.php
  class Handler (line 8) | class Handler extends ExceptionHandler
    method register (line 44) | public function register()

FILE: playgrounds/react/app/Http/Controllers/Controller.php
  class Controller (line 10) | class Controller extends BaseController

FILE: playgrounds/react/app/Http/Kernel.php
  class Kernel (line 7) | class Kernel extends HttpKernel

FILE: playgrounds/react/app/Http/Middleware/Authenticate.php
  class Authenticate (line 7) | class Authenticate extends Middleware
    method redirectTo (line 15) | protected function redirectTo($request)

FILE: playgrounds/react/app/Http/Middleware/EncryptCookies.php
  class EncryptCookies (line 7) | class EncryptCookies extends Middleware

FILE: playgrounds/react/app/Http/Middleware/HandleInertiaRequests.php
  class HandleInertiaRequests (line 8) | class HandleInertiaRequests extends Middleware
    method version (line 25) | public function version(Request $request): ?string
    method share (line 37) | public function share(Request $request): array

FILE: playgrounds/react/app/Http/Middleware/PreventRequestsDuringMaintenance.php
  class PreventRequestsDuringMaintenance (line 7) | class PreventRequestsDuringMaintenance extends Middleware

FILE: playgrounds/react/app/Http/Middleware/RedirectIfAuthenticated.php
  class RedirectIfAuthenticated (line 10) | class RedirectIfAuthenticated
    method handle (line 20) | public function handle(Request $request, Closure $next, ...$guards)

FILE: playgrounds/react/app/Http/Middleware/TrimStrings.php
  class TrimStrings (line 7) | class TrimStrings extends Middleware

FILE: playgrounds/react/app/Http/Middleware/TrustHosts.php
  class TrustHosts (line 7) | class TrustHosts extends Middleware
    method hosts (line 14) | public function hosts()

FILE: playgrounds/react/app/Http/Middleware/TrustProxies.php
  class TrustProxies (line 8) | class TrustProxies extends Middleware

FILE: playgrounds/react/app/Http/Middleware/ValidateSignature.php
  class ValidateSignature (line 7) | class ValidateSignature extends Middleware

FILE: playgrounds/react/app/Http/Middleware/VerifyCsrfToken.php
  class VerifyCsrfToken (line 7) | class VerifyCsrfToken extends Middleware

FILE: playgrounds/react/app/Http/Requests/PrecognitionFormRequest.php
  class PrecognitionFormRequest (line 7) | class PrecognitionFormRequest extends FormRequest
    method authorize (line 12) | public function authorize(): bool
    method rules (line 22) | public function rules(): array

FILE: playgrounds/react/app/Http/Resources/UserResource.php
  class UserResource (line 8) | class UserResource extends JsonResource
    method toArray (line 15) | public function toArray(Request $request): array

FILE: playgrounds/react/app/Models/ChatMessage.php
  class ChatMessage (line 8) | class ChatMessage extends Model

FILE: playgrounds/react/app/Models/User.php
  class User (line 11) | class User extends Authenticatable

FILE: playgrounds/react/app/Providers/AppServiceProvider.php
  class AppServiceProvider (line 7) | class AppServiceProvider extends ServiceProvider
    method register (line 14) | public function register()
    method boot (line 24) | public function boot()

FILE: playgrounds/react/app/Providers/AuthServiceProvider.php
  class AuthServiceProvider (line 8) | class AuthServiceProvider extends ServiceProvider
    method boot (line 24) | public function boot()

FILE: playgrounds/react/app/Providers/BroadcastServiceProvider.php
  class BroadcastServiceProvider (line 8) | class BroadcastServiceProvider extends ServiceProvider
    method boot (line 15) | public function boot()

FILE: playgrounds/react/app/Providers/EventServiceProvider.php
  class EventServiceProvider (line 10) | class EventServiceProvider extends ServiceProvider
    method boot (line 28) | public function boot()
    method shouldDiscoverEvents (line 38) | public function shouldDiscoverEvents()

FILE: playgrounds/react/app/Providers/RouteServiceProvider.php
  class RouteServiceProvider (line 11) | class RouteServiceProvider extends ServiceProvider
    method boot (line 27) | public function boot()
    method configureRateLimiting (line 46) | protected function configureRateLimiting()

FILE: playgrounds/react/database/factories/ChatMessageFactory.php
  class ChatMessageFactory (line 10) | class ChatMessageFactory extends Factory
    method definition (line 17) | public function definition(): array

FILE: playgrounds/react/database/factories/UserFactory.php
  class UserFactory (line 11) | class UserFactory extends Factory
    method definition (line 18) | public function definition()
    method unverified (line 34) | public function unverified()

FILE: playgrounds/react/database/migrations/2014_10_12_000000_create_users_table.php
  method up (line 14) | public function up()
  method down (line 32) | public function down()

FILE: playgrounds/react/database/migrations/2014_10_12_100000_create_password_resets_table.php
  method up (line 14) | public function up()
  method down (line 28) | public function down()

FILE: playgrounds/react/database/migrations/2019_08_19_000000_create_failed_jobs_table.php
  method up (line 14) | public function up()
  method down (line 32) | public function down()

FILE: playgrounds/react/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php
  method up (line 14) | public function up()
  method down (line 33) | public function down()

FILE: playgrounds/react/database/migrations/2025_08_29_115526_create_chat_messages_table.php
  method up (line 12) | public function up(): void
  method down (line 25) | public function down(): void

FILE: playgrounds/react/database/seeders/DatabaseSeeder.php
  class DatabaseSeeder (line 11) | class DatabaseSeeder extends Seeder
    method run (line 18) | public function run()

FILE: playgrounds/react/resources/js/Components/Image.tsx
  function Image (line 3) | function Image({ id, url }: { id: number; url: string }) {

FILE: playgrounds/react/resources/js/Components/Layout.tsx
  function Layout (line 3) | function Layout({ children, padding = true }: { children: React.ReactNod...

FILE: playgrounds/react/resources/js/Components/Message.tsx
  type Message (line 3) | interface Message {
  function MessageComponent (line 9) | function MessageComponent({ message }: { message: Message }) {

FILE: playgrounds/react/resources/js/Components/PaperAirplaneIcon.tsx
  function PaperAirplaneIcon (line 1) | function PaperAirplaneIcon({ className = 'size-6' }: { className?: strin...

FILE: playgrounds/react/resources/js/Components/Spinner.tsx
  function Spinner (line 1) | function Spinner({ className = '' }: { className?: string }) {

FILE: playgrounds/react/resources/js/Components/StreamingIndicator.tsx
  function StreamingIndicator (line 1) | function StreamingIndicator({ className = '' }: { className?: string }) {

FILE: playgrounds/react/resources/js/Components/Textarea.tsx
  function autosize (line 3) | function autosize(element: HTMLTextAreaElement) {
  function Textarea (line 8) | function Textarea({

FILE: playgrounds/react/resources/js/Pages/Form.tsx
  function submit (line 11) | function submit(e) {

FILE: playgrounds/react/resources/js/Pages/Once/Layout.tsx
  function Layout (line 4) | function Layout({ children }: { children: React.ReactNode }) {

FILE: playgrounds/react/resources/js/app.tsx
  method setup (line 10) | setup({ el, App, props }) {

FILE: playgrounds/react/resources/js/types/globals.d.ts
  type InertiaConfig (line 4) | interface InertiaConfig {

FILE: playgrounds/react/tests/CreatesApplication.php
  type CreatesApplication (line 7) | trait CreatesApplication
    method createApplication (line 14) | public function createApplication()

FILE: playgrounds/react/tests/Feature/ExampleTest.php
  class ExampleTest (line 8) | class ExampleTest extends TestCase
    method test_the_application_returns_a_successful_response (line 15) | public function test_the_application_returns_a_successful_response()

FILE: playgrounds/react/tests/TestCase.php
  class TestCase (line 7) | abstract class TestCase extends BaseTestCase

FILE: playgrounds/react/tests/Unit/ExampleTest.php
  class ExampleTest (line 7) | class ExampleTest extends TestCase
    method test_that_true_is_true (line 14) | public function test_that_true_is_true()

FILE: playgrounds/svelte4/app/Console/Kernel.php
  class Kernel (line 8) | class Kernel extends ConsoleKernel
    method schedule (line 15) | protected function schedule(Schedule $schedule)
    method commands (line 25) | protected function commands()

FILE: playgrounds/svelte4/app/Exceptions/Handler.php
  class Handler (line 8) | class Handler extends ExceptionHandler
    method register (line 44) | public function register()

FILE: playgrounds/svelte4/app/Http/Controllers/Controller.php
  class Controller (line 10) | class Controller extends BaseController

FILE: playgrounds/svelte4/app/Http/Kernel.php
  class Kernel (line 7) | class Kernel extends HttpKernel

FILE: playgrounds/svelte4/app/Http/Middleware/Authenticate.php
  class Authenticate (line 7) | class Authenticate extends Middleware
    method redirectTo (line 15) | protected function redirectTo($request)

FILE: playgrounds/svelte4/app/Http/Middleware/EncryptCookies.php
  class EncryptCookies (line 7) | class EncryptCookies extends Middleware

FILE: playgrounds/svelte4/app/Http/Middleware/HandleInertiaRequests.php
  class HandleInertiaRequests (line 8) | class HandleInertiaRequests extends Middleware
    method version (line 23) | public function version(Request $request): ?string
    method share (line 33) | public function share(Request $request): array

FILE: playgrounds/svelte4/app/Http/Middleware/PreventRequestsDuringMaintenance.php
  class PreventRequestsDuringMaintenance (line 7) | class PreventRequestsDuringMaintenance extends Middleware

FILE: playgrounds/svelte4/app/Http/Middleware/RedirectIfAuthenticated.php
  class RedirectIfAuthenticated (line 10) | class RedirectIfAuthenticated
    method handle (line 19) | public function handle(Request $request, Closure $next, ...$guards)

FILE: playgrounds/svelte4/app/Http/Middleware/TrimStrings.php
  class TrimStrings (line 7) | class TrimStrings extends Middleware

FILE: playgrounds/svelte4/app/Http/Middleware/TrustHosts.php
  class TrustHosts (line 7) | class TrustHosts extends Middleware
    method hosts (line 14) | public function hosts()

FILE: playgrounds/svelte4/app/Http/Middleware/TrustProxies.php
  class TrustProxies (line 8) | class TrustProxies extends Middleware

FILE: playgrounds/svelte4/app/Http/Middleware/ValidateSignature.php
  class ValidateSignature (line 7) | class ValidateSignature extends Middleware

FILE: playgrounds/svelte4/app/Http/Middleware/VerifyCsrfToken.php
  class VerifyCsrfToken (line 7) | class VerifyCsrfToken extends Middleware

FILE: playgrounds/svelte4/app/Http/Requests/PrecognitionFormRequest.php
  class PrecognitionFormRequest (line 7) | class PrecognitionFormRequest extends FormRequest
    method authorize (line 12) | public function authorize(): bool
    method rules (line 22) | public function rules(): array

FILE: playgrounds/svelte4/app/Models/User.php
  class User (line 11) | class User extends Authenticatable

FILE: playgrounds/svelte4/app/Providers/AppServiceProvider.php
  class AppServiceProvider (line 7) | class AppServiceProvider extends ServiceProvider
    method register (line 14) | public function register()
    method boot (line 24) | public function boot()

FILE: playgrounds/svelte4/app/Providers/AuthServiceProvider.php
  class AuthServiceProvider (line 8) | class AuthServiceProvider extends ServiceProvider
    method boot (line 24) | public function boot()

FILE: playgrounds/svelte4/app/Providers/BroadcastServiceProvider.php
  class BroadcastServiceProvider (line 8) | class BroadcastServiceProvider extends ServiceProvider
    method boot (line 15) | public function boot()

FILE: playgrounds/svelte4/app/Providers/EventServiceProvider.php
  class EventServiceProvider (line 10) | class EventServiceProvider extends ServiceProvider
    method boot (line 28) | public function boot()
    method shouldDiscoverEvents (line 38) | public function shouldDiscoverEvents()

FILE: playgrounds/svelte4/app/Providers/RouteServiceProvider.php
  class RouteServiceProvider (line 11) | class RouteServiceProvider extends ServiceProvider
    method boot (line 27) | public function boot()
    method configureRateLimiting (line 46) | protected function configureRateLimiting()

FILE: playgrounds/svelte4/database/factories/UserFactory.php
  class UserFactory (line 11) | class UserFactory extends Factory
    method definition (line 18) | public function definition()
    method unverified (line 34) | public function unverified()

FILE: playgrounds/svelte4/database/migrations/2014_10_12_000000_create_users_table.php
  method up (line 14) | public function up()
  method down (line 32) | public function down()

FILE: playgrounds/svelte4/database/migrations/2014_10_12_100000_create_password_resets_table.php
  method up (line 14) | public function up()
  method down (line 28) | public function down()

FILE: playgrounds/svelte4/database/migrations/2019_08_19_000000_create_failed_jobs_table.php
  method up (line 14) | public function up()
  method down (line 32) | public function down()

FILE: playgrounds/svelte4/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php
  method up (line 14) | public function up()
  method down (line 33) | public function down()

FILE: playgrounds/svelte4/database/seeders/DatabaseSeeder.php
  class DatabaseSeeder (line 8) | class DatabaseSeeder extends Seeder
    method run (line 15) | public function run()

FILE: playgrounds/svelte4/resources/js/app.ts
  method setup (line 8) | setup({ el, App, props }) {

FILE: playgrounds/svelte4/resources/js/ssr.ts
  method setup (line 11) | setup({ App, props }) {

FILE: playgrounds/svelte4/resources/js/types/globals.d.ts
  type InertiaConfig (line 4) | interface InertiaConfig {

FILE: playgrounds/svelte4/tests/CreatesApplication.php
  type CreatesApplication (line 7) | trait CreatesApplication
    method createApplication (line 14) | public function createApplication()

FILE: playgrounds/svelte4/tests/Feature/ExampleTest.php
  class ExampleTest (line 8) | class ExampleTest extends TestCase
    method test_the_application_returns_a_successful_response (line 15) | public function test_the_application_returns_a_successful_response()

FILE: playgrounds/svelte4/tests/TestCase.php
  class TestCase (line 7) | abstract class TestCase extends BaseTestCase

FILE: playgrounds/svelte4/tests/Unit/ExampleTest.php
  class ExampleTest (line 7) | class ExampleTest extends TestCase
    method test_that_true_is_true (line 14) | public function test_that_true_is_true()

FILE: playgrounds/svelte5/app/Console/Kernel.php
  class Kernel (line 8) | class Kernel extends ConsoleKernel
    method schedule (line 15) | protected function schedule(Schedule $schedule)
    method commands (line 25) | protected function commands()

FILE: playgrounds/svelte5/app/Exceptions/Handler.php
  class Handler (line 8) | class Handler extends ExceptionHandler
    method register (line 44) | public function register()

FILE: playgrounds/svelte5/app/Http/Controllers/Controller.php
  class Controller (line 10) | class Controller extends BaseController

FILE: playgrounds/svelte5/app/Http/Kernel.php
  class Kernel (line 7) | class Kernel extends HttpKernel

FILE: playgrounds/svelte5/app/Http/Middleware/Authenticate.php
  class Authenticate (line 7) | class Authenticate extends Middleware
    method redirectTo (line 15) | protected function redirectTo($request)

FILE: playgrounds/svelte5/app/Http/Middleware/EncryptCookies.php
  class EncryptCookies (line 7) | class EncryptCookies extends Middleware

FILE: playgrounds/svelte5/app/Http/Middleware/HandleInertiaRequests.php
  class HandleInertiaRequests (line 8) | class HandleInertiaRequests extends Middleware
    method version (line 23) | public function version(Request $request): ?string
    method share (line 33) | public function share(Request $request): array

FILE: playgrounds/svelte5/app/Http/Middleware/PreventRequestsDuringMaintenance.php
  class PreventRequestsDuringMaintenance (line 7) | class PreventRequestsDuringMaintenance extends Middleware

FILE: playgrounds/svelte5/app/Http/Middleware/RedirectIfAuthenticated.php
  class RedirectIfAuthenticated (line 10) | class RedirectIfAuthenticated
    method handle (line 19) | public function handle(Request $request, Closure $next, ...$guards)

FILE: playgrounds/svelte5/app/Http/Middleware/TrimStrings.php
  class TrimStrings (line 7) | class TrimStrings extends Middleware

FILE: playgrounds/svelte5/app/Http/Middleware/TrustHosts.php
  class TrustHosts (line 7) | class TrustHosts extends Middleware
    method hosts (line 14) | public function hosts()

FILE: playgrounds/svelte5/app/Http/Middleware/TrustProxies.php
  class TrustProxies (line 8) | class TrustProxies extends Middleware

FILE: playgrounds/svelte5/app/Http/Middleware/ValidateSignature.php
  class ValidateSignature (line 7) | class ValidateSignature extends Middleware

FILE: playgrounds/svelte5/app/Http/Middleware/VerifyCsrfToken.php
  class VerifyCsrfToken (line 7) | class VerifyCsrfToken extends Middleware

FILE: playgrounds/svelte5/app/Http/Requests/PrecognitionFormRequest.php
  class PrecognitionFormRequest (line 7) | class PrecognitionFormRequest extends FormRequest
    method authorize (line 12) | public function authorize(): bool
    method rules (line 22) | public function rules(): array

FILE: playgrounds/svelte5/app/Models/User.php
  class User (line 11) | class User extends Authenticatable

FILE: playgrounds/svelte5/app/Providers/AppServiceProvider.php
  class AppServiceProvider (line 7) | class AppServiceProvider extends ServiceProvider
    method register (line 14) | public function register()
    method boot (line 24) | public function boot()

FILE: playgrounds/svelte5/app/Providers/AuthServiceProvider.php
  class AuthServiceProvider (line 8) | class AuthServiceProvider extends ServiceProvider
    method boot (line 24) | public function boot()

FILE: playgrounds/svelte5/app/Providers/BroadcastServiceProvider.php
  class BroadcastServiceProvider (line 8) | class BroadcastServiceProvider extends ServiceProvider
    method boot (line 15) | public function boot()

FILE: playgrounds/svelte5/app/Providers/EventServiceProvider.php
  class EventServiceProvider (line 10) | class EventServiceProvider extends ServiceProvider
    method boot (line 28) | public function boot()
    method shouldDiscoverEvents (line 38) | public function shouldDiscoverEvents()

FILE: playgrounds/svelte5/app/Providers/RouteServiceProvider.php
  class RouteServiceProvider (line 11) | class RouteServiceProvider extends ServiceProvider
    method boot (line 27) | public function boot()
    method configureRateLimiting (line 46) | protected function configureRateLimiting()

FILE: playgrounds/svelte5/database/factories/UserFactory.php
  class UserFactory (line 11) | class UserFactory extends Factory
    method definition (line 18) | public function definition()
    method unverified (line 34) | public function unverified()

FILE: playgrounds/svelte5/database/migrations/2014_10_12_000000_create_users_table.php
  method up (line 14) | public function up()
  method down (line 32) | public function down()

FILE: playgrounds/svelte5/database/migrations/2014_10_12_100000_create_password_resets_table.php
  method up (line 14) | public function up()
  method down (line 28) | public function down()

FILE: playgrounds/svelte5/database/migrations/2019_08_19_000000_create_failed_jobs_table.php
  method up (line 14) | public function up()
  method down (line 32) | public function down()

FILE: playgrounds/svelte5/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php
  method up (line 14) | public function up()
  method down (line 33) | public function down()

FILE: playgrounds/svelte5/database/seeders/DatabaseSeeder.php
  class DatabaseSeeder (line 8) | class DatabaseSeeder extends Seeder
    method run (line 15) | public function run()

FILE: playgrounds/svelte5/resources/js/app.ts
  method setup (line 9) | setup({ el, App, props }) {

FILE: playgrounds/svelte5/resources/js/ssr.ts
  method setup (line 12) | setup({ App, props }) {

FILE: playgrounds/svelte5/resources/js/types/globals.d.ts
  type InertiaConfig (line 4) | interface InertiaConfig {

FILE: playgrounds/svelte5/tests/CreatesApplication.php
  type CreatesApplication (line 7) | trait CreatesApplication
    method createApplication (line 14) | public function createApplication()

FILE: playgrounds/svelte5/tests/Feature/ExampleTest.php
  class ExampleTest (line 8) | class ExampleTest extends TestCase
    method test_the_application_returns_a_successful_response (line 15) | public function test_the_application_returns_a_successful_response()

FILE: playgrounds/svelte5/tests/TestCase.php
  class TestCase (line 7) | abstract class TestCase extends BaseTestCase

FILE: playgrounds/svelte5/tests/Unit/ExampleTest.php
  class ExampleTest (line 7) | class ExampleTest extends TestCase
    method test_that_true_is_true (line 14) | public function test_that_true_is_true()

FILE: playgrounds/vue3/app/Console/Kernel.php
  class Kernel (line 8) | class Kernel extends ConsoleKernel
    method schedule (line 15) | protected function schedule(Schedule $schedule)
    method commands (line 25) | protected function commands()

FILE: playgrounds/vue3/app/Exceptions/Handler.php
  class Handler (line 8) | class Handler extends ExceptionHandler
    method register (line 44) | public function register()

FILE: playgrounds/vue3/app/Http/Controllers/Controller.php
  class Controller (line 10) | class Controller extends BaseController

FILE: playgrounds/vue3/app/Http/Kernel.php
  class Kernel (line 7) | class Kernel extends HttpKernel

FILE: playgrounds/vue3/app/Http/Middleware/Authenticate.php
  class Authenticate (line 7) | class Authenticate extends Middleware
    method redirectTo (line 15) | protected function redirectTo($request)

FILE: playgrounds/vue3/app/Http/Middleware/EncryptCookies.php
  class EncryptCookies (line 7) | class EncryptCookies extends Middleware

FILE: playgrounds/vue3/app/Http/Middleware/HandleInertiaRequests.php
  class HandleInertiaRequests (line 8) | class HandleInertiaRequests extends Middleware
    method version (line 24) | public function version(Request $request): ?string
    method share (line 34) | public function share(Request $request): array

FILE: playgrounds/vue3/app/Http/Middleware/PreventRequestsDuringMaintenance.php
  class PreventRequestsDuringMaintenance (line 7) | class PreventRequestsDuringMaintenance extends Middleware

FILE: playgrounds/vue3/app/Http/Middleware/RedirectIfAuthenticated.php
  class RedirectIfAuthenticated (line 10) | class RedirectIfAuthenticated
    method handle (line 19) | public function handle(Request $request, Closure $next, ...$guards)

FILE: playgrounds/vue3/app/Http/Middleware/TrimStrings.php
  class TrimStrings (line 7) | class TrimStrings extends Middleware

FILE: playgrounds/vue3/app/Http/Middleware/TrustHosts.php
  class TrustHosts (line 7) | class TrustHosts extends Middleware
    method hosts (line 14) | public function hosts()

FILE: playgrounds/vue3/app/Http/Middleware/TrustProxies.php
  class TrustProxies (line 8) | class TrustProxies extends Middleware

FILE: playgrounds/vue3/app/Http/Middleware/ValidateSignature.php
  class ValidateSignature (line 7) | class ValidateSignature extends Middleware

FILE: playgrounds/vue3/app/Http/Middleware/VerifyCsrfToken.php
  class VerifyCsrfToken (line 7) | class VerifyCsrfToken extends Middleware

FILE: playgrounds/vue3/app/Http/Requests/PrecognitionFormRequest.php
  class PrecognitionFormRequest (line 7) | class PrecognitionFormRequest extends FormRequest
    method authorize (line 12) | public function authorize(): bool
    method rules (line 22) | public function rules(): array

FILE: playgrounds/vue3/app/Http/Resources/UserResource.php
  class UserResource (line 8) | class UserResource extends JsonResource
    method toArray (line 15) | public function toArray(Request $request): array

FILE: playgrounds/vue3/app/Models/ChatMessage.php
  class ChatMessage (line 8) | class ChatMessage extends Model

FILE: playgrounds/vue3/app/Models/User.php
  class User (line 11) | class User extends Authenticatable

FILE: playgrounds/vue3/app/Providers/AppServiceProvider.php
  class AppServiceProvider (line 7) | class AppServiceProvider extends ServiceProvider
    method register (line 14) | public function register()
    method boot (line 24) | public function boot()

FILE: playgrounds/vue3/app/Providers/AuthServiceProvider.php
  class AuthServiceProvider (line 8) | class AuthServiceProvider extends ServiceProvider
    method boot (line 24) | public function boot()

FILE: playgrounds/vue3/app/Providers/BroadcastServiceProvider.php
  class BroadcastServiceProvider (line 8) | class BroadcastServiceProvider extends ServiceProvider
    method boot (line 15) | public function boot()

FILE: playgrounds/vue3/app/Providers/EventServiceProvider.php
  class EventServiceProvider (line 10) | class EventServiceProvider extends ServiceProvider
    method boot (line 28) | public function boot()
    method shouldDiscoverEvents (line 38) | public function shouldDiscoverEvents()

FILE: playgrounds/vue3/app/Providers/RouteServiceProvider.php
  class RouteServiceProvider (line 11) | class RouteServiceProvider extends ServiceProvider
    method boot (line 27) | public function boot()
    method configureRateLimiting (line 46) | protected function configureRateLimiting()

FILE: playgrounds/vue3/database/factories/ChatMessageFactory.php
  class ChatMessageFactory (line 10) | class ChatMessageFactory extends Factory
    method definition (line 17) | public function definition(): array

FILE: playgrounds/vue3/database/factories/UserFactory.php
  class UserFactory (line 11) | class UserFactory extends Factory
    method definition (line 18) | public function definition()
    method unverified (line 34) | public function unverified()

FILE: playgrounds/vue3/database/migrations/2014_10_12_000000_create_users_table.php
  method up (line 14) | public function up()
  method down (line 32) | public function down()

FILE: playgrounds/vue3/database/migrations/2014_10_12_100000_create_password_resets_table.php
  method up (line 14) | public function up()
  method down (line 28) | public function down()

FILE: playgrounds/vue3/database/migrations/2019_08_19_000000_create_failed_jobs_table.php
  method up (line 14) | public function up()
  method down (line 32) | public function down()

FILE: playgrounds/vue3/database/migrations/2019_12_14_000001_create_personal_access_tokens_table.php
  method up (line 14) | public function up()
  method down (line 33) | public function down()

FILE: playgrounds/vue3/database/migrations/2025_08_29_115526_create_chat_messages_table.php
  method up (line 12) | public function up(): void
  method down (line 25) | public function down(): void

FILE: playgrounds/vue3/database/seeders/DatabaseSeeder.php
  class DatabaseSeeder (line 11) | class DatabaseSeeder extends Seeder
    method run (line 18) | public function run()

FILE: playgrounds/vue3/resources/js/app.ts
  method setup (line 11) | setup({ el, App, props, plugin }) {

FILE: playgrounds/vue3/resources/js/ssr.ts
  method setup (line 15) | setup({ App, props, plugin }) {

FILE: playgrounds/vue3/resources/js/types/globals.d.ts
  type InertiaConfig (line 4) | interface InertiaConfig {

FILE: playgrounds/vue3/tests/CreatesApplication.php
  type CreatesApplication (line 7) | trait CreatesApplication
    method createApplication (line 14) | public function createApplication()

FILE: playgrounds/vue3/tests/Feature/ExampleTest.php
  class ExampleTest (line 8) | class ExampleTest extends TestCase
    method test_the_application_returns_a_successful_response (line 15) | public function test_the_application_returns_a_successful_response()

FILE: playgrounds/vue3/tests/TestCase.php
  class TestCase (line 7) | abstract class TestCase extends BaseTestCase

FILE: playgrounds/vue3/tests/Unit/ExampleTest.php
  class ExampleTest (line 7) | class ExampleTest extends TestCase
    method test_that_true_is_true (line 14) | public function test_that_true_is_true()

FILE: tests/app/eloquent.js
  function makeUser (line 1) | function makeUser(id) {
  function getUserNames (line 8) | function getUserNames() {
  function getUsers (line 104) | function getUsers(page = 1, perPage = 15, total = 40, orderByDesc = fals...
  function paginateUsers (line 134) | function paginateUsers(page = 1, perPage = 15, total = 40, orderByDesc =...

FILE: tests/app/server-status.js
  function showServerStatus (line 5) | function showServerStatus(packageName, port) {

FILE: tests/app/server.js
  function renderInfiniteScroll (line 1774) | function renderInfiniteScroll(req, res, component, total = 40, orderByDe...
  function renderInfiniteScrollWithTag (line 1966) | function renderInfiniteScrollWithTag(req, res, component, total = 40, or...

FILE: tests/app/ssr.js
  constant SSR_PORT (line 3) | const SSR_PORT = 13714
  method render (line 6) | render(pageData) {

FILE: tests/core/config.test.ts
  type TestConfig (line 4) | type TestConfig = {
  function createConfig (line 20) | function createConfig(): Config<TestConfig> {
  type BaseConfig (line 97) | type BaseConfig = {
  type ExtendedConfig (line 101) | type ExtendedConfig = {

FILE: tests/core/formObject.test.ts
  function makeFormData (line 4) | function makeFormData(entries: [string, string | Blob][] = []): FormData {

FILE: tests/head.spec.ts
  function getInertiaHeadHTML (line 3) | async function getInertiaHeadHTML(page: Page) {

FILE: tests/infinite-scroll.spec.ts
  function infiniteScrollRequests (line 4) | function infiniteScrollRequests() {
  function scrollToTop (line 14) | async function scrollToTop(page: Page) {
  function scrollToBottom (line 19) | async function scrollToBottom(page: Page) {
  function smoothScrollTo (line 28) | async function smoothScrollTo(page: any, targetY: number) {
  function scrollElementSmoothTo (line 41) | async function scrollElementSmoothTo(element: Locator, targetY: number) {
  function scrollElementToBottom (line 53) | async function scrollElementToBottom(element: Locator) {
  function getUserIdsFromDOM (line 59) | async function getUserIdsFromDOM(page: Page) {
  function expectQueryString (line 72) | async function expectQueryString(page: Page, expectedPage: string) {
  function getUserCardPosition (line 88) | async function getUserCardPosition(page: Page, id: string) {
  function getUserCardPositionInContainer (line 110) | async function getUserCardPositionInContainer(page: Page, container: Loc...

FILE: tests/ssr.spec.ts
  constant SSR_SERVER_PORT (line 4) | const SSR_SERVER_PORT = 13714

FILE: tests/support.ts
  method watch (line 17) | watch(page: Page, maxLoads = 1) {
  method listen (line 39) | listen(page: Page) {
  method _replaceListener (line 54) | _replaceListener(page: Page, event: string, handler: (...args: any[]) =>...
  method listen (line 65) | listen(page: Page) {
  method listenForFinished (line 70) | listenForFinished(page: Page) {
  method listenForFailed (line 75) | listenForFailed(page: Page) {
  method listenForResponses (line 80) | listenForResponses(page: Page) {
Condensed preview — 1604 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,325K chars).
[
  {
    "path": ".editorconfig",
    "chars": 218,
    "preview": "root = true\n\n[*]\ncharset = utf-8\nend_of_line = lf\nindent_size = 2\nindent_style = space\ninsert_final_newline = true\ntrim_"
  },
  {
    "path": ".gitattributes",
    "chars": 218,
    "preview": "# exclude playgrounds/ since otherwise the project gets classified as mainly php based.\n# https://github.com/github-ling"
  },
  {
    "path": ".github/CODE_OF_CONDUCT.md",
    "chars": 148,
    "preview": "# Code of Conduct\n\nThe Laravel Code of Conduct can be found in the [Laravel documentation](https://laravel.com/docs/cont"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/0-bug-report.yml",
    "chars": 2118,
    "preview": "name: Bug Report\ndescription: 'Submit an issue.'\nbody:\n  - type: markdown\n    attributes:\n      value: |\n        Please "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/1-bug-report-react.yml",
    "chars": 1834,
    "preview": "name: Bug Report - React\ndescription: 'Submit a React related issue.'\nlabels: [react]\nbody:\n  - type: markdown\n    attri"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/2-bug-report-vue.yml",
    "chars": 1833,
    "preview": "name: Bug Report - Vue 3\ndescription: 'Submit a Vue 3 related issue.'\nlabels: ['vue 3']\nbody:\n  - type: markdown\n    att"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/3-bug-report-svelte.yml",
    "chars": 1867,
    "preview": "name: Bug Report - Svelte\ndescription: 'Submit a Svelte related issue.'\nlabels: [svelte]\nassignees:\n  - pedroborges\nbody"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 607,
    "preview": "blank_issues_enabled: false\ncontact_links:\n  - name: Feature Request\n    url: https://github.com/inertiajs/inertia/discu"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "chars": 519,
    "preview": "<!--\nPlease only send a pull request to branches which are currently supported: https://laravel.com/docs/releases#suppor"
  },
  {
    "path": ".github/SECURITY.md",
    "chars": 5114,
    "preview": "# Security Policy\n\n**PLEASE DON'T DISCLOSE SECURITY-RELATED ISSUES PUBLICLY, [SEE BELOW](#reporting-a-vulnerability).**\n"
  },
  {
    "path": ".github/SUPPORT.md",
    "chars": 150,
    "preview": "# Support Questions\n\nThe Laravel support guide can be found in the [Laravel documentation](https://laravel.com/docs/cont"
  },
  {
    "path": ".github/workflows/build.yml",
    "chars": 634,
    "preview": "name: Build\non: [push, pull_request]\njobs:\n  build:\n    if: github.event_name != 'pull_request' || github.event.pull_req"
  },
  {
    "path": ".github/workflows/coding-standards.yml",
    "chars": 602,
    "preview": "name: Coding Standards\n\non:\n  push:\n    branches:\n      - master\n  pull_request:\n\njobs:\n  format:\n    runs-on: ubuntu-la"
  },
  {
    "path": ".github/workflows/es2020-compatibility.yml",
    "chars": 1000,
    "preview": "name: Compatibility Checks\non: [push, pull_request]\njobs:\n  es2020-compatibility:\n    name: ES2020 (${{ matrix.adapter }"
  },
  {
    "path": ".github/workflows/playwright-chromium.yml",
    "chars": 2458,
    "preview": "name: Playwright Tests on Chromium\non: [push, pull_request]\njobs:\n  test-chromium:\n    if: github.event_name != 'pull_re"
  },
  {
    "path": ".github/workflows/playwright-firefox.yml",
    "chars": 1368,
    "preview": "name: Playwright Tests on Firefox\non: [push, pull_request]\njobs:\n  test-firefox:\n    if: github.event_name != 'pull_requ"
  },
  {
    "path": ".github/workflows/playwright-webkit.yml",
    "chars": 1362,
    "preview": "name: Playwright Tests on WebKit\non: [push, pull_request]\njobs:\n  test-webkit:\n    if: github.event_name != 'pull_reques"
  },
  {
    "path": ".github/workflows/publish.yml",
    "chars": 1040,
    "preview": "name: Publish Packages\n\non:\n  release:\n    types: [released, prereleased]\n\npermissions:\n  id-token: write # Required for"
  },
  {
    "path": ".github/workflows/test-app-quality.yml",
    "chars": 1086,
    "preview": "name: Test App Quality\non: [push, pull_request]\njobs:\n  test-app-quality:\n    if: github.event_name != 'pull_request' ||"
  },
  {
    "path": ".github/workflows/update-changelog.yml",
    "chars": 204,
    "preview": "name: update changelog\n\non:\n  release:\n    types: [released]\n\npermissions: {}\n\njobs:\n  update:\n    permissions:\n      co"
  },
  {
    "path": ".gitignore",
    "chars": 168,
    "preview": ".DS_Store\n.idea\n/packages/*/test-app/test-results/.last-run.json\n/packages/svelte/test-app/vite.config.js.timestamp-*.mj"
  },
  {
    "path": ".prettierignore",
    "chars": 766,
    "preview": "# Dependencies\nnode_modules/\n**/vendor/\n\n# Build outputs\n**/dist/\n**/.svelte-kit\n**/bootstrap/ssr\n**/public/build\n\n# Fil"
  },
  {
    "path": "CHANGELOG.md",
    "chars": 78718,
    "preview": "# Changelog\n\nAll notable changes to this project will be documented in this file.\n\nThe format is based on [Keep a Change"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 8539,
    "preview": "# Contributing\n\nThank you for your interest in contributing to Inertia.js! Your contributions help make this project bet"
  },
  {
    "path": "LICENSE.md",
    "chars": 1090,
    "preview": "MIT License\n\nCopyright (c) Jonathan Reinink <jonathan@reinink.ca>\n\nPermission is hereby granted, free of charge, to any "
  },
  {
    "path": "README.md",
    "chars": 896,
    "preview": "[![Inertia.js](https://raw.githubusercontent.com/inertiajs/inertia/master/.github/LOGO.png)](https://inertiajs.com/)\n\nIn"
  },
  {
    "path": "package.json",
    "chars": 3094,
    "preview": "{\n  \"name\": \"inertia\",\n  \"private\": true,\n  \"type\": \"module\",\n  \"scripts\": {\n    \"build:all\": \"pnpm -r --filter './packa"
  },
  {
    "path": "packages/core/.gitignore",
    "chars": 52,
    "preview": "dist\ntypes\nnode_modules\npackage-lock.json\nyarn.lock\n"
  },
  {
    "path": "packages/core/LICENSE",
    "chars": 1090,
    "preview": "MIT License\n\nCopyright (c) Jonathan Reinink <jonathan@reinink.ca>\n\nPermission is hereby granted, free of charge, to any "
  },
  {
    "path": "packages/core/build.js",
    "chars": 1492,
    "preview": "#!/usr/bin/env node\nimport esbuild from 'esbuild'\nimport { nodeExternalsPlugin } from 'esbuild-node-externals'\n\nconst wa"
  },
  {
    "path": "packages/core/package.json",
    "chars": 1948,
    "preview": "{\n  \"name\": \"@inertiajs/core\",\n  \"version\": \"2.3.18\",\n  \"license\": \"MIT\",\n  \"description\": \"A framework for creating ser"
  },
  {
    "path": "packages/core/readme.md",
    "chars": 207,
    "preview": "# Inertia.js\n\nInertia.js lets you quickly build modern single-page React, Vue and Svelte apps using classic server-side "
  },
  {
    "path": "packages/core/src/config.ts",
    "chars": 2506,
    "preview": "import { get, has, set } from 'lodash-es'\nimport { InertiaAppConfig } from './types'\n\n// Generate all possible nested pa"
  },
  {
    "path": "packages/core/src/debounce.ts",
    "chars": 281,
    "preview": "export default function debounce<F extends (...params: any[]) => ReturnType<F>>(fn: F, delay: number): F {\n  let timeout"
  },
  {
    "path": "packages/core/src/debug.ts",
    "chars": 207,
    "preview": "export const stackTrace = (autolog = true) => {\n  try {\n    throw new Error()\n  } catch (e) {\n    const stack = (e as Er"
  },
  {
    "path": "packages/core/src/dialog.ts",
    "chars": 1683,
    "preview": "import modal from './modal'\n\nexport default {\n  show(html: Record<string, unknown> | string): void {\n    const { iframe,"
  },
  {
    "path": "packages/core/src/domUtils.ts",
    "chars": 4938,
    "preview": "const elementInViewport = (el: HTMLElement) => {\n  if (el.offsetParent === null) {\n    // Element is not participating i"
  },
  {
    "path": "packages/core/src/encryption.ts",
    "chars": 3592,
    "preview": "import { SessionStorage } from './sessionStorage'\n\nexport const encryptHistory = async (data: any): Promise<ArrayBuffer>"
  },
  {
    "path": "packages/core/src/eventHandler.ts",
    "chars": 4456,
    "preview": "import debounce from './debounce'\nimport { fireNavigateEvent } from './events'\nimport { history } from './history'\nimpor"
  },
  {
    "path": "packages/core/src/events.ts",
    "chars": 2181,
    "preview": "import { GlobalEventDetails, GlobalEventNames, GlobalEventTrigger } from './types'\n\nfunction fireEvent<TEventName extend"
  },
  {
    "path": "packages/core/src/files.ts",
    "chars": 604,
    "preview": "import { FormDataConvertible, RequestPayload } from './types'\n\nexport const isFile = (value: unknown): boolean =>\n  (typ"
  },
  {
    "path": "packages/core/src/formData.ts",
    "chars": 1783,
    "preview": "import type { FormDataConvertible, QueryStringArrayFormatOption } from './types'\n\nexport const isFormData = (value: any)"
  },
  {
    "path": "packages/core/src/formObject.ts",
    "chars": 5788,
    "preview": "import { get, set } from 'lodash-es'\nimport { isFile } from './files'\nimport { FormDataConvertible } from './types'\n\n/**"
  },
  {
    "path": "packages/core/src/head.ts",
    "chars": 4585,
    "preview": "import { config, HeadManager, HeadManagerOnUpdateCallback, HeadManagerTitleCallback } from '.'\nimport debounce from './d"
  },
  {
    "path": "packages/core/src/history.ts",
    "chars": 8599,
    "preview": "import { cloneDeep, isEqual } from 'lodash-es'\nimport { decryptHistory, encryptHistory, historySessionStorageKeys } from"
  },
  {
    "path": "packages/core/src/index.ts",
    "chars": 924,
    "preview": "import { Config } from './config'\nimport { Router } from './router'\n\nexport { UseFormUtils } from './useFormUtils'\n\nexpo"
  },
  {
    "path": "packages/core/src/infiniteScroll/data.ts",
    "chars": 5689,
    "preview": "import { router } from '../index'\nimport { page as currentPage } from '../page'\nimport { Page, PendingVisit, ReloadOptio"
  },
  {
    "path": "packages/core/src/infiniteScroll/elements.ts",
    "chars": 7926,
    "preview": "import { router } from '..'\nimport debounce from '../debounce'\nimport { useIntersectionObservers } from '../intersection"
  },
  {
    "path": "packages/core/src/infiniteScroll/queryString.ts",
    "chars": 3583,
    "preview": "import { hrefToUrl, router, urlHasProtocol, urlToString } from '..'\nimport debounce from '../debounce'\nimport { getEleme"
  },
  {
    "path": "packages/core/src/infiniteScroll/scrollPreservation.ts",
    "chars": 3506,
    "preview": "import { getElementsInViewportFromCollection } from '../domUtils'\n\n/**\n * When loading content \"before\" the current view"
  },
  {
    "path": "packages/core/src/infiniteScroll.ts",
    "chars": 3973,
    "preview": "import { requestAnimationFrame } from './domUtils'\nimport { router } from './index'\nimport { useInfiniteScrollData } fro"
  },
  {
    "path": "packages/core/src/initialVisit.ts",
    "chars": 3197,
    "preview": "import { eventHandler } from './eventHandler'\nimport { fireFlashEvent, fireNavigateEvent } from './events'\nimport { hist"
  },
  {
    "path": "packages/core/src/intersectionObservers.ts",
    "chars": 1013,
    "preview": "type IntersectionObserverCallback = (entry: IntersectionObserverEntry) => void\n\ninterface IntersectionObserverManager {\n"
  },
  {
    "path": "packages/core/src/modal.ts",
    "chars": 2019,
    "preview": "export default {\n  modal: null,\n  listener: null,\n\n  createIframeAndPage(html: Record<string, unknown> | string): { ifra"
  },
  {
    "path": "packages/core/src/navigationEvents.ts",
    "chars": 1599,
    "preview": "type MouseNavigationEvent = Pick<\n  MouseEvent,\n  'altKey' | 'ctrlKey' | 'shiftKey' | 'metaKey' | 'button' | 'currentTar"
  },
  {
    "path": "packages/core/src/navigationType.ts",
    "chars": 814,
    "preview": "class NavigationType {\n  protected type: NavigationTimingType\n\n  public constructor() {\n    this.type = this.resolveType"
  },
  {
    "path": "packages/core/src/objectUtils.ts",
    "chars": 940,
    "preview": "export const objectsAreEqual = <T extends Record<string, any>>(\n  obj1: T,\n  obj2: T,\n  excludeKeys: {\n    [K in keyof T"
  },
  {
    "path": "packages/core/src/page.ts",
    "chars": 8136,
    "preview": "import { eventHandler } from './eventHandler'\nimport { fireNavigateEvent } from './events'\nimport { history } from './hi"
  },
  {
    "path": "packages/core/src/poll.ts",
    "chars": 1103,
    "preview": "import { PollOptions } from './types'\n\nexport class Poll {\n  protected id: number | null = null\n  protected throttle = f"
  },
  {
    "path": "packages/core/src/polls.ts",
    "chars": 890,
    "preview": "import { Poll } from './poll'\nimport { PollOptions } from './types'\n\nclass Polls {\n  protected polls: Poll[] = []\n\n  con"
  },
  {
    "path": "packages/core/src/prefetched.ts",
    "chars": 8922,
    "preview": "import { cloneDeep } from 'lodash-es'\nimport { objectsAreEqual } from './objectUtils'\nimport { page as currentPage } fro"
  },
  {
    "path": "packages/core/src/progress-component.ts",
    "chars": 8027,
    "preview": "/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress\n * @license MIT */\n\nimport { ProgressSett"
  },
  {
    "path": "packages/core/src/progress.ts",
    "chars": 2363,
    "preview": "import ProgressComponent from './progress-component'\nimport { GlobalEvent } from './types'\n\nclass Progress {\n  public hi"
  },
  {
    "path": "packages/core/src/queue.ts",
    "chars": 591,
    "preview": "export default class Queue<T> {\n  protected items: (() => T)[] = []\n  protected processingPromise: Promise<void> | null "
  },
  {
    "path": "packages/core/src/request.ts",
    "chars": 4971,
    "preview": "import { type AxiosProgressEvent, type AxiosRequestConfig, default as axios } from 'axios'\nimport { fireExceptionEvent, "
  },
  {
    "path": "packages/core/src/requestParams.ts",
    "chars": 5115,
    "preview": "import { AxiosRequestConfig } from 'axios'\nimport { page as currentPage } from './page'\nimport { Response } from './resp"
  },
  {
    "path": "packages/core/src/requestStream.ts",
    "chars": 1213,
    "preview": "import { Request } from './request'\n\nexport class RequestStream {\n  protected requests: Request[] = []\n\n  protected maxC"
  },
  {
    "path": "packages/core/src/resetFormFields.ts",
    "chars": 7223,
    "preview": "export const FormComponentResetSymbol = Symbol('FormComponentReset')\n\ntype FormElement = HTMLInputElement | HTMLSelectEl"
  },
  {
    "path": "packages/core/src/response.ts",
    "chars": 14794,
    "preview": "import { AxiosResponse } from 'axios'\nimport { get, isEqual, set } from 'lodash-es'\nimport { config, router } from '.'\ni"
  },
  {
    "path": "packages/core/src/router.ts",
    "chars": 17910,
    "preview": "import { cloneDeep, get, set } from 'lodash-es'\nimport { progress } from '.'\nimport { config } from './config'\nimport { "
  },
  {
    "path": "packages/core/src/scroll.ts",
    "chars": 3310,
    "preview": "import { requestAnimationFrame } from './domUtils'\nimport { history } from './history'\nimport { ScrollRegion } from './t"
  },
  {
    "path": "packages/core/src/server.ts",
    "chars": 2517,
    "preview": "import { createServer, IncomingMessage } from 'http'\nimport cluster from 'node:cluster'\nimport { availableParallelism } "
  },
  {
    "path": "packages/core/src/sessionStorage.ts",
    "chars": 1253,
    "preview": "export class SessionStorage {\n  public static locationVisitKey = 'inertiaLocationVisit'\n\n  public static set(key: string"
  },
  {
    "path": "packages/core/src/time.ts",
    "chars": 482,
    "preview": "import { CacheForOption, TimeUnit } from './types'\n\nconst conversionMap: Record<TimeUnit, number> = {\n  ms: 1,\n  s: 1000"
  },
  {
    "path": "packages/core/src/types.ts",
    "chars": 22857,
    "preview": "import { AxiosProgressEvent, AxiosResponse } from 'axios'\nimport { NamedInputEvent, ValidationConfig, Validator } from '"
  },
  {
    "path": "packages/core/src/url.ts",
    "chars": 4656,
    "preview": "import * as qs from 'qs'\nimport { config } from './config'\nimport { hasFiles } from './files'\nimport { isFormData, objec"
  },
  {
    "path": "packages/core/src/useFormUtils.ts",
    "chars": 4604,
    "preview": "import { NamedInputEvent, ValidationConfig } from 'laravel-precognition'\nimport {\n  FormDataType,\n  Method,\n  UrlMethodP"
  },
  {
    "path": "packages/core/tsconfig.json",
    "chars": 634,
    "preview": "{\n  \"compilerOptions\": {\n    \"rootDir\": \"src\",\n    \"noEmitOnError\": true,\n\n    \"lib\": [\"DOM\", \"DOM.Iterable\", \"ES2020\"],"
  },
  {
    "path": "packages/react/.gitignore",
    "chars": 52,
    "preview": "dist\ntypes\nnode_modules\npackage-lock.json\nyarn.lock\n"
  },
  {
    "path": "packages/react/LICENSE",
    "chars": 1090,
    "preview": "MIT License\n\nCopyright (c) Jonathan Reinink <jonathan@reinink.ca>\n\nPermission is hereby granted, free of charge, to any "
  },
  {
    "path": "packages/react/build.js",
    "chars": 2026,
    "preview": "#!/usr/bin/env node\nimport esbuild from 'esbuild'\nimport { nodeExternalsPlugin } from 'esbuild-node-externals'\nimport { "
  },
  {
    "path": "packages/react/package.json",
    "chars": 2118,
    "preview": "{\n  \"name\": \"@inertiajs/react\",\n  \"version\": \"2.3.18\",\n  \"license\": \"MIT\",\n  \"description\": \"The React adapter for Inert"
  },
  {
    "path": "packages/react/readme.md",
    "chars": 89,
    "preview": "# Inertia.js React Adapter\n\nVisit [inertiajs.com](https://inertiajs.com/) to learn more.\n"
  },
  {
    "path": "packages/react/resources/boost/guidelines/core.blade.php",
    "chars": 123,
    "preview": "# Inertia + React\n\n- IMPORTANT: Activate `inertia-react-development` when working with Inertia React client-side pattern"
  },
  {
    "path": "packages/react/resources/boost/skills/inertia-react-development/SKILL.blade.php",
    "chars": 10259,
    "preview": "---\nname: inertia-react-development\ndescription: \"Develops Inertia.js v2 React client-side applications. Activates when "
  },
  {
    "path": "packages/react/src/App.ts",
    "chars": 4043,
    "preview": "import {\n  createHeadManager,\n  HeadManagerOnUpdateCallback,\n  HeadManagerTitleCallback,\n  Page,\n  PageHandler,\n  PagePr"
  },
  {
    "path": "packages/react/src/Deferred.ts",
    "chars": 1946,
    "preview": "import { ReactNode, useEffect, useMemo, useState } from 'react'\nimport { router } from '.'\nimport usePage from './usePag"
  },
  {
    "path": "packages/react/src/Form.ts",
    "chars": 9047,
    "preview": "import {\n  config,\n  FormComponentProps,\n  FormComponentRef,\n  FormComponentResetSymbol,\n  FormComponentSlotProps,\n  For"
  },
  {
    "path": "packages/react/src/Head.ts",
    "chars": 3053,
    "preview": "import { escape } from 'lodash-es'\nimport React, { FunctionComponent, ReactElement, ReactNode, useContext, useEffect, us"
  },
  {
    "path": "packages/react/src/HeadContext.ts",
    "chars": 220,
    "preview": "import { HeadManager } from '@inertiajs/core'\nimport { createContext } from 'react'\n\nconst headContext = createContext<H"
  },
  {
    "path": "packages/react/src/InfiniteScroll.ts",
    "chars": 10888,
    "preview": "import {\n  getScrollableParent,\n  InfiniteScrollActionSlotProps,\n  InfiniteScrollComponentBaseProps,\n  InfiniteScrollRef"
  },
  {
    "path": "packages/react/src/Link.ts",
    "chars": 7218,
    "preview": "import {\n  ActiveVisit,\n  isUrlMethodPair,\n  LinkComponentBaseProps,\n  LinkPrefetchOption,\n  mergeDataIntoQueryString,\n "
  },
  {
    "path": "packages/react/src/PageContext.ts",
    "chars": 206,
    "preview": "import { Page } from '@inertiajs/core'\nimport { createContext } from 'react'\n\nconst pageContext = createContext<Page | n"
  },
  {
    "path": "packages/react/src/WhenVisible.ts",
    "chars": 3451,
    "preview": "import { ReloadOptions, router } from '@inertiajs/core'\nimport { createElement, ReactNode, useCallback, useEffect, useMe"
  },
  {
    "path": "packages/react/src/createInertiaApp.ts",
    "chars": 4026,
    "preview": "import {\n  CreateInertiaAppOptionsForCSR,\n  CreateInertiaAppOptionsForSSR,\n  getInitialPageFromDOM,\n  InertiaAppResponse"
  },
  {
    "path": "packages/react/src/index.ts",
    "chars": 1146,
    "preview": "import { config as coreConfig, progress as Progress, router as Router } from '@inertiajs/core'\nimport { ReactInertiaAppC"
  },
  {
    "path": "packages/react/src/react.ts",
    "chars": 557,
    "preview": "import React, { DependencyList, EffectCallback, useEffect, useLayoutEffect } from 'react'\n\n// Inspired by react-redux, t"
  },
  {
    "path": "packages/react/src/server.ts",
    "chars": 60,
    "preview": "export { default as default } from '@inertiajs/core/server'\n"
  },
  {
    "path": "packages/react/src/types.ts",
    "chars": 461,
    "preview": "import { PageHandler } from '@inertiajs/core'\nimport { ComponentType, ReactNode } from 'react'\n\nexport type LayoutFuncti"
  },
  {
    "path": "packages/react/src/useForm.ts",
    "chars": 19726,
    "preview": "import {\n  CancelToken,\n  Errors,\n  ErrorValue,\n  FormDataErrors,\n  FormDataKeys,\n  FormDataType,\n  FormDataValues,\n  Me"
  },
  {
    "path": "packages/react/src/usePage.ts",
    "chars": 611,
    "preview": "import { Page, PageProps, SharedPageProps } from '@inertiajs/core'\nimport React from 'react'\nimport PageContext from './"
  },
  {
    "path": "packages/react/src/usePoll.ts",
    "chars": 634,
    "preview": "import { PollOptions, ReloadOptions, router } from '@inertiajs/core'\nimport { useEffect, useRef } from 'react'\n\nexport d"
  },
  {
    "path": "packages/react/src/usePrefetch.ts",
    "chars": 1433,
    "preview": "import { router, VisitOptions } from '@inertiajs/core'\nimport { useEffect, useState } from 'react'\n\nexport default funct"
  },
  {
    "path": "packages/react/src/useRemember.ts",
    "chars": 859,
    "preview": "import { router } from '@inertiajs/core'\nimport { Dispatch, MutableRefObject, SetStateAction, useEffect, useState } from"
  },
  {
    "path": "packages/react/test-app/Layouts/NestedLayout.tsx",
    "chars": 426,
    "preview": "import { usePage } from '@inertiajs/react'\nimport { useId, useState } from 'react'\n\nexport default ({ children }: { chil"
  },
  {
    "path": "packages/react/test-app/Layouts/Prefetch.tsx",
    "chars": 805,
    "preview": "import { Link } from '@inertiajs/react'\n\nexport default ({ children }: { children: React.ReactNode }) => {\n  return (\n  "
  },
  {
    "path": "packages/react/test-app/Layouts/SWR.tsx",
    "chars": 601,
    "preview": "import { Link } from '@inertiajs/react'\n\nexport default ({ children }: { children: React.ReactNode }) => {\n  return (\n  "
  },
  {
    "path": "packages/react/test-app/Layouts/SiteLayout.tsx",
    "chars": 415,
    "preview": "import { usePage } from '@inertiajs/react'\nimport { useId, useState } from 'react'\n\nexport default ({ children }: { chil"
  },
  {
    "path": "packages/react/test-app/Layouts/WithScrollRegion.tsx",
    "chars": 1582,
    "preview": "import { useEffect, useState } from 'react'\n\nexport default ({ children }: { children: React.ReactNode }) => {\n  const ["
  },
  {
    "path": "packages/react/test-app/Layouts/WithoutScrollRegion.tsx",
    "chars": 1519,
    "preview": "import { useEffect, useState } from 'react'\n\nexport default ({ children }: { children: React.ReactNode }) => {\n  const ["
  },
  {
    "path": "packages/react/test-app/Pages/Article.tsx",
    "chars": 6218,
    "preview": "import { Link } from '@inertiajs/react'\nimport { useEffect, useState } from 'react'\n\nexport default () => {\n  const enab"
  },
  {
    "path": "packages/react/test-app/Pages/ClientSideVisit/Page1.tsx",
    "chars": 2410,
    "preview": "import { Page } from '@inertiajs/core'\nimport { router } from '@inertiajs/react'\nimport { useState } from 'react'\n\ninter"
  },
  {
    "path": "packages/react/test-app/Pages/ClientSideVisit/Page2.tsx",
    "chars": 75,
    "preview": "export default ({ baz }: { baz: string }) => {\n  return <div>{baz}</div>\n}\n"
  },
  {
    "path": "packages/react/test-app/Pages/ClientSideVisit/Props.tsx",
    "chars": 3931,
    "preview": "import { router } from '@inertiajs/react'\n\ninterface Tag {\n  id: number\n  name: string\n}\n\ninterface User {\n  name: strin"
  },
  {
    "path": "packages/react/test-app/Pages/ClientSideVisit/Sequential.tsx",
    "chars": 410,
    "preview": "import { router } from '@inertiajs/react'\n\nexport default ({ foo = '', bar = '' }: { foo?: string; bar?: string }) => {\n"
  },
  {
    "path": "packages/react/test-app/Pages/ComplexMergeSelective.tsx",
    "chars": 752,
    "preview": "import { router } from '@inertiajs/react'\n\nexport default ({\n  mixed,\n}: {\n  mixed: {\n    name: string\n    users: string"
  },
  {
    "path": "packages/react/test-app/Pages/CustomConfig.tsx",
    "chars": 902,
    "preview": "import type { VisitOptions } from '@inertiajs/core'\nimport { config, Link, useForm, usePage } from '@inertiajs/react'\n\ne"
  },
  {
    "path": "packages/react/test-app/Pages/DeepMergeProps.tsx",
    "chars": 1067,
    "preview": "import { router } from '@inertiajs/react'\nimport { useState } from 'react'\n\ntype PageProps = {\n  bar: number[]\n  foo: { "
  },
  {
    "path": "packages/react/test-app/Pages/DeferredProps/BackButton/PageA.tsx",
    "chars": 634,
    "preview": "import { Deferred, Link, usePage } from '@inertiajs/react'\n\nconst FastProp = () => {\n  const { fastProp } = usePage<{ fa"
  },
  {
    "path": "packages/react/test-app/Pages/DeferredProps/BackButton/PageB.tsx",
    "chars": 380,
    "preview": "import { Deferred, Link, usePage } from '@inertiajs/react'\n\nconst Data = () => {\n  const { data } = usePage<{ data?: str"
  },
  {
    "path": "packages/react/test-app/Pages/DeferredProps/InstantReload.tsx",
    "chars": 513,
    "preview": "import { Deferred, router } from '@inertiajs/react'\nimport { useEffect } from 'react'\n\nexport default ({ foo, bar }: { f"
  },
  {
    "path": "packages/react/test-app/Pages/DeferredProps/ManyGroups.tsx",
    "chars": 1015,
    "preview": "import { Deferred, Link, usePage } from '@inertiajs/react'\n\nexport default () => {\n  const { foo, bar, baz, qux, quux } "
  },
  {
    "path": "packages/react/test-app/Pages/DeferredProps/Page1.tsx",
    "chars": 732,
    "preview": "import { Deferred, Link, usePage } from '@inertiajs/react'\n\nconst Foo = () => {\n  const { foo } = usePage<{ foo?: { text"
  },
  {
    "path": "packages/react/test-app/Pages/DeferredProps/Page2.tsx",
    "chars": 798,
    "preview": "import { Deferred, Link, usePage } from '@inertiajs/react'\n\nconst Baz = () => {\n  const { baz } = usePage<{ baz?: string"
  },
  {
    "path": "packages/react/test-app/Pages/DeferredProps/Page3.tsx",
    "chars": 507,
    "preview": "import { Deferred, usePage } from '@inertiajs/react'\n\nconst Alpha = () => {\n  const { alpha } = usePage<{ alpha?: string"
  },
  {
    "path": "packages/react/test-app/Pages/DeferredProps/PartialReloads.tsx",
    "chars": 1127,
    "preview": "import { Deferred, router, usePage } from '@inertiajs/react'\n\nconst FooTimestamp = () => {\n  const { foo } = usePage<{ f"
  },
  {
    "path": "packages/react/test-app/Pages/DeferredProps/RapidNavigation.tsx",
    "chars": 1729,
    "preview": "import { Deferred, Link, router, usePage } from '@inertiajs/react'\n\nconst Users = () => {\n  const { users } = usePage<{ "
  },
  {
    "path": "packages/react/test-app/Pages/DeferredProps/ReloadWithoutOptionalChaining.tsx",
    "chars": 642,
    "preview": "import { Deferred, router, usePage } from '@inertiajs/react'\n\nconst Results = () => {\n  const { results } = usePage<{ re"
  },
  {
    "path": "packages/react/test-app/Pages/DeferredProps/WithErrors.tsx",
    "chars": 742,
    "preview": "import { Deferred, useForm, usePage } from '@inertiajs/react'\n\nconst Foo = () => {\n  const { foo } = usePage<{ foo?: { t"
  },
  {
    "path": "packages/react/test-app/Pages/DeferredProps/WithPartialReload.tsx",
    "chars": 900,
    "preview": "import { Deferred, Link, router, usePage } from '@inertiajs/react'\n\nconst WithPartialReload = ({ withOnly, withExcept }:"
  },
  {
    "path": "packages/react/test-app/Pages/DeferredProps/WithQueryParams.tsx",
    "chars": 433,
    "preview": "import { Deferred, usePage } from '@inertiajs/react'\n\nconst Users = () => {\n  const { users } = usePage<{ users?: { text"
  },
  {
    "path": "packages/react/test-app/Pages/DeferredProps/WithReload.tsx",
    "chars": 646,
    "preview": "import { Deferred, router, usePage } from '@inertiajs/react'\n\nconst Results = () => {\n  const { results } = usePage<{ re"
  },
  {
    "path": "packages/react/test-app/Pages/Dump.tsx",
    "chars": 963,
    "preview": "import type { Method } from '@inertiajs/core'\nimport { usePage } from '@inertiajs/react'\nimport { useEffect, useMemo } f"
  },
  {
    "path": "packages/react/test-app/Pages/ErrorModal.tsx",
    "chars": 572,
    "preview": "import { config, router } from '@inertiajs/react'\n\nexport default ({ dialog }: { dialog: boolean }) => {\n  const invalid"
  },
  {
    "path": "packages/react/test-app/Pages/Events.tsx",
    "chars": 21330,
    "preview": "import { Link, router, usePage } from '@inertiajs/react'\n\ndeclare global {\n  interface Window {\n    messages: unknown[]\n"
  },
  {
    "path": "packages/react/test-app/Pages/Flash/ClientSideVisits.tsx",
    "chars": 925,
    "preview": "import { router, usePage } from '@inertiajs/react'\n\ndeclare global {\n  interface Window {\n    flashCount: number\n  }\n}\n\n"
  },
  {
    "path": "packages/react/test-app/Pages/Flash/Events.tsx",
    "chars": 2137,
    "preview": "import { router, usePage } from '@inertiajs/react'\n\ndeclare global {\n  interface Window {\n    messages: unknown[]\n  }\n}\n"
  },
  {
    "path": "packages/react/test-app/Pages/Flash/InitialFlash.tsx",
    "chars": 664,
    "preview": "import { router, usePage } from '@inertiajs/react'\nimport { useRef, useState } from 'react'\n\nexport default () => {\n  co"
  },
  {
    "path": "packages/react/test-app/Pages/Flash/Partial.tsx",
    "chars": 1043,
    "preview": "import { router, usePage } from '@inertiajs/react'\nimport { useRef, useState } from 'react'\n\nexport default ({ count }: "
  },
  {
    "path": "packages/react/test-app/Pages/Flash/RouterFlash.tsx",
    "chars": 726,
    "preview": "import { router, usePage } from '@inertiajs/react'\n\nexport default () => {\n  const page = usePage()\n\n  const setFlash = "
  },
  {
    "path": "packages/react/test-app/Pages/Flash/WithDeferred.tsx",
    "chars": 711,
    "preview": "import { Deferred, router, usePage } from '@inertiajs/react'\nimport { useRef, useState } from 'react'\n\nexport default ({"
  },
  {
    "path": "packages/react/test-app/Pages/Flash/WithInfiniteScroll.tsx",
    "chars": 896,
    "preview": "import { InfiniteScroll, router, usePage } from '@inertiajs/react'\nimport { useRef, useState } from 'react'\n\nexport defa"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/ChildComponent.tsx",
    "chars": 859,
    "preview": "import { Form } from '@inertiajs/react'\nimport { useMemo, useState } from 'react'\n\nconst ChildElement = ({ name }: { nam"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Context/ChildComponent.tsx",
    "chars": 1420,
    "preview": "import { useFormContext } from '@inertiajs/react'\n\nexport default ({ formId }: { formId?: string }) => {\n  const form = "
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Context/DeeplyNestedComponent.tsx",
    "chars": 263,
    "preview": "import { useFormContext } from '@inertiajs/react'\n\nexport default () => {\n  const form = useFormContext()\n\n  return form"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Context/Default.tsx",
    "chars": 830,
    "preview": "import { Form } from '@inertiajs/react'\nimport ChildComponent from './ChildComponent'\nimport NestedComponent from './Nes"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Context/Methods.tsx",
    "chars": 579,
    "preview": "import { Form } from '@inertiajs/react'\nimport MethodsTestComponent from './MethodsTestComponent'\n\nexport default () => "
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Context/MethodsTestComponent.tsx",
    "chars": 2675,
    "preview": "import { useFormContext } from '@inertiajs/react'\nimport { useState } from 'react'\n\nexport default () => {\n  const form "
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Context/Multiple.tsx",
    "chars": 938,
    "preview": "import { Form } from '@inertiajs/react'\nimport ChildComponent from './ChildComponent'\n\nexport default () => (\n  <>\n    <"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Context/NestedComponent.tsx",
    "chars": 108,
    "preview": "import DeeplyNestedComponent from './DeeplyNestedComponent'\n\nexport default () => <DeeplyNestedComponent />\n"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Context/OutsideFormComponent.tsx",
    "chars": 276,
    "preview": "import { useFormContext } from '@inertiajs/react'\n\nexport default () => {\n  const form = useFormContext()\n\n  return form"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/DataMethods.tsx",
    "chars": 916,
    "preview": "import { Form } from '@inertiajs/react'\n\nexport default () => {\n  return (\n    <div>\n      <h1>Test getData() and getFor"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/DefaultValue.tsx",
    "chars": 573,
    "preview": "import { Form } from '@inertiajs/react'\n\nexport default ({\n  user,\n}: {\n  user: {\n    name: string\n  }\n}) => {\n  return "
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/DisableWhileProcessing.tsx",
    "chars": 727,
    "preview": "import { Form } from '@inertiajs/react'\n\nexport default ({ disable }: { disable: boolean }) => {\n  return (\n    <div>\n  "
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/DottedKeys.tsx",
    "chars": 1509,
    "preview": "import { Form } from '@inertiajs/react'\n\nexport default function DottedKeys() {\n  return (\n    <div>\n      <h1>Dotted Ke"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Elements.tsx",
    "chars": 4633,
    "preview": "import { QueryStringArrayFormatOption } from '@inertiajs/core'\nimport { config, Form } from '@inertiajs/react'\n\nexport d"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/EmptyAction.tsx",
    "chars": 533,
    "preview": "import { Form } from '@inertiajs/react'\n\nexport default () => {\n  return (\n    <div>\n      <h1>Form Empty Action Test</h"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Errors.tsx",
    "chars": 1655,
    "preview": "import { Form } from '@inertiajs/react'\nimport { useState } from 'react'\n\nexport default () => {\n  const [errorBag, setE"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Events.tsx",
    "chars": 3100,
    "preview": "import { Form } from '@inertiajs/react'\nimport { useCallback, useMemo, useState } from 'react'\n\nexport default () => {\n "
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/FormTarget.tsx",
    "chars": 469,
    "preview": "import { Form } from '@inertiajs/react'\n\nexport default () => {\n  return (\n    <Form action=\"/non-inertia/download\" meth"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Headers.tsx",
    "chars": 628,
    "preview": "import { Form } from '@inertiajs/react'\nimport { useState } from 'react'\n\nexport default () => {\n  const [headers, setHe"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/InvalidateTags.tsx",
    "chars": 1161,
    "preview": "import { Form, Link } from '@inertiajs/react'\n\nexport default ({ lastLoaded, propType }: { lastLoaded: number; propType:"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Methods.tsx",
    "chars": 1083,
    "preview": "import type { Method } from '@inertiajs/core'\nimport { Form } from '@inertiajs/react'\nimport { useState } from 'react'\n\n"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/MixedKeySerialization.tsx",
    "chars": 1057,
    "preview": "import { Form } from '@inertiajs/react'\n\nexport default () => {\n  return (\n    <div>\n      <h1>Mixed Key Serialization</"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Options.tsx",
    "chars": 3711,
    "preview": "import type { Method, QueryStringArrayFormatOption } from '@inertiajs/core'\nimport { Form } from '@inertiajs/react'\nimpo"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Precognition/BeforeValidation.tsx",
    "chars": 1662,
    "preview": "import { Form } from '@inertiajs/react'\nimport { isEqual } from 'lodash-es'\n\nexport default function PrecognitionBefore("
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Precognition/Callbacks.tsx",
    "chars": 1559,
    "preview": "import { Form } from '@inertiajs/react'\nimport { useState } from 'react'\n\nexport default () => {\n  const [successCalled,"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Precognition/Cancel.tsx",
    "chars": 727,
    "preview": "import { Form } from '@inertiajs/react'\n\nexport default () => {\n  return (\n    <div>\n      <h1>Precognition - Cancel Tes"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Precognition/Default.tsx",
    "chars": 863,
    "preview": "import { Form } from '@inertiajs/react'\n\nexport default () => {\n  return (\n    <div>\n      <h1>Form Precognition</h1>\n\n "
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Precognition/DynamicArrayInputs.tsx",
    "chars": 1236,
    "preview": "import { Form } from '@inertiajs/react'\nimport { useState } from 'react'\n\nexport default () => {\n  const [items, setItem"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Precognition/ErrorSync.tsx",
    "chars": 902,
    "preview": "import { Form } from '@inertiajs/react'\n\nexport default () => {\n  return (\n    <div>\n      <h1>Precognition Error Sync T"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Precognition/Files.tsx",
    "chars": 1336,
    "preview": "import { Form } from '@inertiajs/react'\nimport { useState } from 'react'\n\nexport default () => {\n  const [validateFilesE"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Precognition/Headers.tsx",
    "chars": 733,
    "preview": "import { Form } from '@inertiajs/react'\n\nexport default function PrecognitionHeaders() {\n  return (\n    <div>\n      <h1>"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Precognition/Methods.tsx",
    "chars": 2186,
    "preview": "import { Form } from '@inertiajs/react'\n\nexport default () => {\n  return (\n    <div>\n      <h1>Form Precognition - Touch"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Precognition/Transform.tsx",
    "chars": 737,
    "preview": "import { Form } from '@inertiajs/react'\n\nexport default () => {\n  return (\n    <div>\n      <h1>Form Precognition Transfo"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Precognition/TransformKeys.tsx",
    "chars": 1007,
    "preview": "import { Form } from '@inertiajs/react'\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst transformD"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Precognition/WithAllErrors.tsx",
    "chars": 1700,
    "preview": "import { Form } from '@inertiajs/react'\n\nexport default () => {\n  return (\n    <div>\n      <h1>Form Precognition - All E"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Precognition/WithAllErrorsConfig.tsx",
    "chars": 1820,
    "preview": "import { config, Form } from '@inertiajs/react'\n\nexport default () => {\n  // Set global config for withAllErrors (no pro"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Precognition/WithoutAllErrors.tsx",
    "chars": 886,
    "preview": "import { Form } from '@inertiajs/react'\n\nexport default () => {\n  return (\n    <div>\n      <h1>Form Precognition - Array"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Progress.tsx",
    "chars": 1583,
    "preview": "import { Form } from '@inertiajs/react'\nimport { useEffect, useRef, useState } from 'react'\n\nexport default () => {\n  co"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Ref.tsx",
    "chars": 2271,
    "preview": "import { FormComponentRef } from '@inertiajs/core'\nimport { Form } from '@inertiajs/react'\nimport { useRef } from 'react"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Reset.tsx",
    "chars": 9276,
    "preview": "import { FormComponentRef } from '@inertiajs/core'\nimport { Form } from '@inertiajs/react'\nimport { useRef } from 'react"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/ResetAttributes/ResetOnError.tsx",
    "chars": 833,
    "preview": "import { Form } from '@inertiajs/react'\n\nexport default () => {\n  return (\n    <div>\n      <h1>Reset On Error Test</h1>\n"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/ResetAttributes/ResetOnErrorFields.tsx",
    "chars": 869,
    "preview": "import { Form } from '@inertiajs/react'\n\nexport default () => {\n  return (\n    <div>\n      <h1>Reset On Error (Specific "
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/ResetAttributes/ResetOnSuccess.tsx",
    "chars": 839,
    "preview": "import { Form } from '@inertiajs/react'\n\nexport default () => {\n  return (\n    <div>\n      <h1>Reset On Success Test</h1"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/ResetAttributes/ResetOnSuccessFields.tsx",
    "chars": 875,
    "preview": "import { Form } from '@inertiajs/react'\n\nexport default () => {\n  return (\n    <div>\n      <h1>Reset On Success (Specifi"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/SetDefaultsOnSuccess.tsx",
    "chars": 952,
    "preview": "import { Form } from '@inertiajs/react'\n\nexport default () => {\n  return (\n    <div>\n      <h1>Set Defaults On Success T"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/SubmitButton.tsx",
    "chars": 556,
    "preview": "import { Form } from '@inertiajs/react'\n\nexport default () => {\n  return (\n    <Form action=\"/dump/post\" method=\"post\">\n"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/SubmitComplete/Defaults.tsx",
    "chars": 948,
    "preview": "import { Form } from '@inertiajs/react'\n\nexport default () => {\n  return (\n    <div>\n      <h1>OnSubmitComplete Defaults"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/SubmitComplete/Redirect.tsx",
    "chars": 587,
    "preview": "import { Form } from '@inertiajs/react'\n\nexport default () => {\n  return (\n    <div>\n      <h1>Form Redirect Test</h1>\n\n"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/SubmitComplete/Reset.tsx",
    "chars": 816,
    "preview": "import { Form } from '@inertiajs/react'\n\nexport default () => {\n  return (\n    <div>\n      <h1>OnSubmitComplete Reset Te"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Transform.tsx",
    "chars": 1670,
    "preview": "import type { FormDataConvertible } from '@inertiajs/core'\nimport { Form } from '@inertiajs/react'\nimport { useState } f"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/UppercaseMethod.tsx",
    "chars": 938,
    "preview": "import { Form } from '@inertiajs/react'\n\nexport default () => {\n  return (\n    <div>\n      <h1>Uppercase Method Test</h1"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/ViewTransition.tsx",
    "chars": 589,
    "preview": "import { Form } from '@inertiajs/react'\n\nexport default () => {\n  return (\n    <>\n      <Form\n        action=\"/form-comp"
  },
  {
    "path": "packages/react/test-app/Pages/FormComponent/Wayfinder.tsx",
    "chars": 644,
    "preview": "import { Form } from '@inertiajs/react'\n\nexport default () => {\n  const wayfinderUrl = (): {\n    url: string\n    method:"
  },
  {
    "path": "packages/react/test-app/Pages/FormHelper/Data.tsx",
    "chars": 2585,
    "preview": "import { useForm, usePage } from '@inertiajs/react'\n\nexport default () => {\n  const form = useForm({\n    name: 'foo',\n  "
  },
  {
    "path": "packages/react/test-app/Pages/FormHelper/Dirty.tsx",
    "chars": 1678,
    "preview": "import { useForm } from '@inertiajs/react'\n\nexport default () => {\n  const form = useForm({ name: 'foo', foo: [] as stri"
  },
  {
    "path": "packages/react/test-app/Pages/FormHelper/EffectCount.tsx",
    "chars": 747,
    "preview": "import { useForm } from '@inertiajs/react'\nimport { useEffect, useState } from 'react'\n\nexport default () => {\n  const ["
  },
  {
    "path": "packages/react/test-app/Pages/FormHelper/EmptyForm.tsx",
    "chars": 394,
    "preview": "import { useForm } from '@inertiajs/react'\n\ninterface FormData {\n  name: string\n  email: string\n}\n\nexport default () => "
  },
  {
    "path": "packages/react/test-app/Pages/FormHelper/Errors.tsx",
    "chars": 2506,
    "preview": "import { useForm } from '@inertiajs/react'\n\nexport default () => {\n  const form = useForm({ name: 'foo', handle: 'exampl"
  }
]

// ... and 1404 more files (download for full content)

About this extraction

This page contains the full source code of the inertiajs/inertia GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1604 files (2.9 MB), approximately 859.3k tokens, and a symbol index with 985 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!