{"version":3,"sources":["jsdelivr-header.js","/npm/@inertiajs/core@2.3.3/src/index.ts","/npm/@inertiajs/core@2.3.3/src/router.ts","/npm/@inertiajs/core@2.3.3/src/config.ts","/npm/@inertiajs/core@2.3.3/src/debounce.ts","/npm/@inertiajs/core@2.3.3/src/events.ts","/npm/@inertiajs/core@2.3.3/src/history.ts","/npm/@inertiajs/core@2.3.3/src/sessionStorage.ts","/npm/@inertiajs/core@2.3.3/src/encryption.ts","/npm/@inertiajs/core@2.3.3/src/prefetched.ts","/npm/@inertiajs/core@2.3.3/src/objectUtils.ts","/npm/@inertiajs/core@2.3.3/src/time.ts","/npm/@inertiajs/core@2.3.3/src/scroll.ts","/npm/@inertiajs/core@2.3.3/src/url.ts","/npm/@inertiajs/core@2.3.3/src/files.ts","/npm/@inertiajs/core@2.3.3/src/formData.ts","/npm/@inertiajs/core@2.3.3/src/page.ts","/npm/@inertiajs/core@2.3.3/src/queue.ts","/npm/@inertiajs/core@2.3.3/src/eventHandler.ts","/npm/@inertiajs/core@2.3.3/src/navigationType.ts","/npm/@inertiajs/core@2.3.3/src/initialVisit.ts","/npm/@inertiajs/core@2.3.3/src/poll.ts","/npm/@inertiajs/core@2.3.3/src/polls.ts","/npm/@inertiajs/core@2.3.3/src/request.ts","/npm/@inertiajs/core@2.3.3/src/requestParams.ts","/npm/@inertiajs/core@2.3.3/src/response.ts","/npm/@inertiajs/core@2.3.3/src/modal.ts","/npm/@inertiajs/core@2.3.3/src/dialog.ts","/npm/@inertiajs/core@2.3.3/src/requestStream.ts","/npm/@inertiajs/core@2.3.3/src/useFormUtils.ts","/npm/@inertiajs/core@2.3.3/src/domUtils.ts","/npm/@inertiajs/core@2.3.3/src/formObject.ts","/npm/@inertiajs/core@2.3.3/src/head.ts","/npm/@inertiajs/core@2.3.3/src/infiniteScroll/data.ts","/npm/@inertiajs/core@2.3.3/src/infiniteScroll/queryString.ts","/npm/@inertiajs/core@2.3.3/src/intersectionObservers.ts","/npm/@inertiajs/core@2.3.3/src/infiniteScroll/elements.ts","/npm/@inertiajs/core@2.3.3/src/infiniteScroll/scrollPreservation.ts","/npm/@inertiajs/core@2.3.3/src/infiniteScroll.ts","/npm/@inertiajs/core@2.3.3/src/navigationEvents.ts","/npm/@inertiajs/core@2.3.3/src/progress-component.ts","/npm/@inertiajs/core@2.3.3/src/progress.ts","/npm/@inertiajs/core@2.3.3/src/resetFormFields.ts"],"names":[],"mappings":"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","file":"/npm/@inertiajs/core@2.3.3/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@inertiajs/core@2.3.3/dist/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","import { Config } from './config'\nimport { Router } from './router'\n\nexport { UseFormUtils } from './useFormUtils'\n\nexport { config } from './config'\nexport { getInitialPageFromDOM, getScrollableParent } from './domUtils'\nexport { objectToFormData } from './formData'\nexport { formDataToObject } from './formObject'\nexport { default as createHeadManager } from './head'\nexport { default as useInfiniteScroll } from './infiniteScroll'\nexport { shouldIntercept, shouldNavigate } from './navigationEvents'\nexport { hide as hideProgress, progress, reveal as revealProgress, default as setupProgress } from './progress'\nexport { resetFormFields } from './resetFormFields'\nexport * from './types'\nexport {\n  hrefToUrl,\n  isUrlMethodPair,\n  mergeDataIntoQueryString,\n  urlHasProtocol,\n  urlToString,\n  urlWithoutHash,\n} from './url'\nexport { type Config, type Router }\n\nexport const router = new Router()\n","import { cloneDeep, get, set } from 'lodash-es'\nimport { progress } from '.'\nimport { config } from './config'\nimport { eventHandler } from './eventHandler'\nimport { fireBeforeEvent, fireFlashEvent } from './events'\nimport { history } from './history'\nimport { InitialVisit } from './initialVisit'\nimport { page as currentPage } from './page'\nimport { polls } from './polls'\nimport { prefetchedRequests } from './prefetched'\nimport Queue from './queue'\nimport { Request } from './request'\nimport { RequestParams } from './requestParams'\nimport { RequestStream } from './requestStream'\nimport { Scroll } from './scroll'\nimport {\n  ActiveVisit,\n  ClientSideVisitOptions,\n  Component,\n  FlashData,\n  GlobalEvent,\n  GlobalEventNames,\n  GlobalEventResult,\n  InFlightPrefetch,\n  Method,\n  Page,\n  PageFlashData,\n  PendingVisit,\n  PendingVisitOptions,\n  PollOptions,\n  PrefetchedResponse,\n  PrefetchOptions,\n  ReloadOptions,\n  RequestPayload,\n  RouterInitParams,\n  UrlMethodPair,\n  Visit,\n  VisitCallbacks,\n  VisitHelperOptions,\n  VisitOptions,\n} from './types'\nimport { isUrlMethodPair, transformUrlAndData } from './url'\n\nexport class Router {\n  protected syncRequestStream = new RequestStream({\n    maxConcurrent: 1,\n    interruptible: true,\n  })\n\n  protected asyncRequestStream = new RequestStream({\n    maxConcurrent: Infinity,\n    interruptible: false,\n  })\n\n  protected clientVisitQueue = new Queue<Promise<void>>()\n\n  public init<ComponentType = Component>({\n    initialPage,\n    resolveComponent,\n    swapComponent,\n    onFlash,\n  }: RouterInitParams<ComponentType>): void {\n    currentPage.init({\n      initialPage,\n      resolveComponent,\n      swapComponent,\n      onFlash,\n    })\n\n    InitialVisit.handle()\n\n    eventHandler.init()\n\n    eventHandler.on('missingHistoryItem', () => {\n      if (typeof window !== 'undefined') {\n        this.visit(window.location.href, { preserveState: true, preserveScroll: true, replace: true })\n      }\n    })\n\n    eventHandler.on('loadDeferredProps', (deferredProps: Page['deferredProps']) => {\n      this.loadDeferredProps(deferredProps)\n    })\n  }\n\n  public get<T extends RequestPayload = RequestPayload>(\n    url: URL | string | UrlMethodPair,\n    data: T = {} as T,\n    options: VisitHelperOptions<T> = {},\n  ): void {\n    return this.visit(url, { ...options, method: 'get', data })\n  }\n\n  public post<T extends RequestPayload = RequestPayload>(\n    url: URL | string | UrlMethodPair,\n    data: T = {} as T,\n    options: VisitHelperOptions<T> = {},\n  ): void {\n    return this.visit(url, { preserveState: true, ...options, method: 'post', data })\n  }\n\n  public put<T extends RequestPayload = RequestPayload>(\n    url: URL | string | UrlMethodPair,\n    data: T = {} as T,\n    options: VisitHelperOptions<T> = {},\n  ): void {\n    return this.visit(url, { preserveState: true, ...options, method: 'put', data })\n  }\n\n  public patch<T extends RequestPayload = RequestPayload>(\n    url: URL | string | UrlMethodPair,\n    data: T = {} as T,\n    options: VisitHelperOptions<T> = {},\n  ): void {\n    return this.visit(url, { preserveState: true, ...options, method: 'patch', data })\n  }\n\n  public delete<T extends RequestPayload = RequestPayload>(\n    url: URL | string | UrlMethodPair,\n    options: Omit<VisitOptions<T>, 'method'> = {},\n  ): void {\n    return this.visit(url, { preserveState: true, ...options, method: 'delete' })\n  }\n\n  public reload<T extends RequestPayload = RequestPayload>(options: ReloadOptions<T> = {}): void {\n    return this.doReload(options)\n  }\n\n  protected doReload<T extends RequestPayload = RequestPayload>(\n    options: ReloadOptions<T> & {\n      deferredProps?: boolean\n    } = {},\n  ): void {\n    if (typeof window === 'undefined') {\n      return\n    }\n\n    return this.visit(window.location.href, {\n      ...options,\n      preserveScroll: true,\n      preserveState: true,\n      async: true,\n      headers: {\n        ...(options.headers || {}),\n        'Cache-Control': 'no-cache',\n      },\n    })\n  }\n\n  public remember(data: unknown, key = 'default'): void {\n    history.remember(data, key)\n  }\n\n  public restore<T = unknown>(key = 'default'): T | undefined {\n    return history.restore(key) as T | undefined\n  }\n\n  public on<TEventName extends GlobalEventNames>(\n    type: TEventName,\n    callback: (event: GlobalEvent<TEventName>) => GlobalEventResult<TEventName>,\n  ): VoidFunction {\n    if (typeof window === 'undefined') {\n      return () => {}\n    }\n\n    return eventHandler.onGlobalEvent(type, callback)\n  }\n\n  public cancel(): void {\n    this.syncRequestStream.cancelInFlight()\n  }\n\n  public cancelAll(): void {\n    this.asyncRequestStream.cancelInFlight()\n    this.syncRequestStream.cancelInFlight()\n  }\n\n  public poll(interval: number, requestOptions: ReloadOptions = {}, options: PollOptions = {}) {\n    return polls.add(interval, () => this.reload(requestOptions), {\n      autoStart: options.autoStart ?? true,\n      keepAlive: options.keepAlive ?? false,\n    })\n  }\n\n  public visit<T extends RequestPayload = RequestPayload>(\n    href: string | URL | UrlMethodPair,\n    options: VisitOptions<T> = {},\n  ): void {\n    const visit: PendingVisit = this.getPendingVisit(href, {\n      ...options,\n      showProgress: options.showProgress ?? !options.async,\n    } as VisitOptions)\n\n    const events = this.getVisitEvents(options as VisitOptions)\n\n    // If either of these return false, we don't want to continue\n    if (events.onBefore(visit) === false || !fireBeforeEvent(visit)) {\n      return\n    }\n\n    const requestStream = visit.async ? this.asyncRequestStream : this.syncRequestStream\n\n    requestStream.interruptInFlight()\n\n    if (!currentPage.isCleared() && !visit.preserveUrl) {\n      // Save scroll regions for the current page\n      Scroll.save()\n    }\n\n    const requestParams: PendingVisit & VisitCallbacks = {\n      ...visit,\n      ...events,\n    }\n\n    const prefetched = prefetchedRequests.get(requestParams)\n\n    if (prefetched) {\n      progress.reveal(prefetched.inFlight)\n      prefetchedRequests.use(prefetched, requestParams)\n    } else {\n      progress.reveal(true)\n      requestStream.send(Request.create(requestParams, currentPage.get()))\n    }\n  }\n\n  public getCached(\n    href: string | URL | UrlMethodPair,\n    options: VisitOptions = {},\n  ): InFlightPrefetch | PrefetchedResponse | null {\n    return prefetchedRequests.findCached(this.getPrefetchParams(href, options))\n  }\n\n  public flush(href: string | URL | UrlMethodPair, options: VisitOptions = {}): void {\n    prefetchedRequests.remove(this.getPrefetchParams(href, options))\n  }\n\n  public flushAll(): void {\n    prefetchedRequests.removeAll()\n  }\n\n  public flushByCacheTags(tags: string | string[]): void {\n    prefetchedRequests.removeByTags(Array.isArray(tags) ? tags : [tags])\n  }\n\n  public getPrefetching(\n    href: string | URL | UrlMethodPair,\n    options: VisitOptions = {},\n  ): InFlightPrefetch | PrefetchedResponse | null {\n    return prefetchedRequests.findInFlight(this.getPrefetchParams(href, options))\n  }\n\n  public prefetch(\n    href: string | URL | UrlMethodPair,\n    options: VisitOptions = {},\n    prefetchOptions: Partial<PrefetchOptions> = {},\n  ) {\n    const method: Method = options.method ?? (isUrlMethodPair(href) ? href.method : 'get')\n\n    if (method !== 'get') {\n      throw new Error('Prefetch requests must use the GET method')\n    }\n\n    const visit: PendingVisit = this.getPendingVisit(href, {\n      ...options,\n      async: true,\n      showProgress: false,\n      prefetch: true,\n      viewTransition: false,\n    })\n\n    const visitUrl = visit.url.origin + visit.url.pathname + visit.url.search\n    const currentUrl = window.location.origin + window.location.pathname + window.location.search\n\n    if (visitUrl === currentUrl) {\n      // Don't prefetch the current page, you're already on it\n      return\n    }\n\n    const events = this.getVisitEvents(options)\n\n    // If either of these return false, we don't want to continue\n    if (events.onBefore(visit) === false || !fireBeforeEvent(visit)) {\n      return\n    }\n\n    progress.hide()\n\n    this.asyncRequestStream.interruptInFlight()\n\n    const requestParams: PendingVisit & VisitCallbacks = {\n      ...visit,\n      ...events,\n    }\n\n    const ensureCurrentPageIsSet = (): Promise<void> => {\n      return new Promise((resolve) => {\n        const checkIfPageIsDefined = () => {\n          if (currentPage.get()) {\n            resolve()\n          } else {\n            setTimeout(checkIfPageIsDefined, 50)\n          }\n        }\n\n        checkIfPageIsDefined()\n      })\n    }\n\n    ensureCurrentPageIsSet().then(() => {\n      prefetchedRequests.add(\n        requestParams,\n        (params) => {\n          this.asyncRequestStream.send(Request.create(params, currentPage.get()))\n        },\n        {\n          cacheFor: config.get('prefetch.cacheFor'),\n          cacheTags: [],\n          ...prefetchOptions,\n        },\n      )\n    })\n  }\n\n  public clearHistory(): void {\n    history.clear()\n  }\n\n  public decryptHistory(): Promise<Page> {\n    return history.decrypt()\n  }\n\n  public resolveComponent(component: string): Promise<Component> {\n    return currentPage.resolve(component)\n  }\n\n  public replace<TProps = Page['props']>(params: ClientSideVisitOptions<TProps>): void {\n    this.clientVisit(params, { replace: true })\n  }\n\n  public replaceProp<TProps = Page['props']>(\n    name: string,\n    value: unknown | ((oldValue: unknown, props: TProps) => unknown),\n    options?: Pick<ClientSideVisitOptions, 'onError' | 'onFinish' | 'onSuccess'>,\n  ): void {\n    this.replace({\n      preserveScroll: true,\n      preserveState: true,\n      props(currentProps) {\n        const newValue = typeof value === 'function' ? value(get(currentProps, name), currentProps) : value\n\n        return set(cloneDeep(currentProps), name, newValue)\n      },\n      ...(options || {}),\n    })\n  }\n\n  public appendToProp<TProps = Page['props']>(\n    name: string,\n    value: unknown | unknown[] | ((oldValue: unknown, props: TProps) => unknown | unknown[]),\n    options?: Pick<ClientSideVisitOptions, 'onError' | 'onFinish' | 'onSuccess'>,\n  ): void {\n    this.replaceProp(\n      name,\n      (currentValue: unknown, currentProps: TProps) => {\n        const newValue = typeof value === 'function' ? value(currentValue, currentProps) : value\n\n        if (!Array.isArray(currentValue)) {\n          currentValue = currentValue !== undefined ? [currentValue] : []\n        }\n\n        return [...(currentValue as unknown[]), newValue]\n      },\n      options,\n    )\n  }\n\n  public prependToProp<TProps = Page['props']>(\n    name: string,\n    value: unknown | unknown[] | ((oldValue: unknown, props: TProps) => unknown | unknown[]),\n    options?: Pick<ClientSideVisitOptions, 'onError' | 'onFinish' | 'onSuccess'>,\n  ): void {\n    this.replaceProp(\n      name,\n      (currentValue: unknown, currentProps: TProps) => {\n        const newValue = typeof value === 'function' ? value(currentValue, currentProps) : value\n\n        if (!Array.isArray(currentValue)) {\n          currentValue = currentValue !== undefined ? [currentValue] : []\n        }\n\n        return [newValue, ...(currentValue as unknown[])]\n      },\n      options,\n    )\n  }\n\n  public push<TProps = Page['props']>(params: ClientSideVisitOptions<TProps>): void {\n    this.clientVisit(params)\n  }\n\n  public flash<TFlash extends PageFlashData = PageFlashData>(\n    keyOrData: string | ((flash: FlashData) => TFlash) | TFlash,\n    value?: unknown,\n  ): void {\n    const current = currentPage.get().flash\n    let flash: PageFlashData\n\n    if (typeof keyOrData === 'function') {\n      flash = keyOrData(current)\n    } else if (typeof keyOrData === 'string') {\n      flash = { ...current, [keyOrData]: value }\n    } else if (keyOrData && Object.keys(keyOrData).length) {\n      flash = { ...current, ...keyOrData }\n    } else {\n      return\n    }\n\n    currentPage.setFlash(flash)\n\n    if (Object.keys(flash).length) {\n      fireFlashEvent(flash)\n    }\n  }\n\n  protected clientVisit<TProps = Page['props']>(\n    params: ClientSideVisitOptions<TProps>,\n    { replace = false }: { replace?: boolean } = {},\n  ): void {\n    this.clientVisitQueue.add(() => this.performClientVisit(params, { replace }))\n  }\n\n  protected performClientVisit<TProps = Page['props']>(\n    params: ClientSideVisitOptions<TProps>,\n    { replace = false }: { replace?: boolean } = {},\n  ): Promise<void> {\n    const current = currentPage.get()\n\n    const props =\n      typeof params.props === 'function' ? params.props(current.props as TProps) : (params.props ?? current.props)\n\n    const flash = typeof params.flash === 'function' ? params.flash(current.flash) : params.flash\n\n    const { viewTransition, onError, onFinish, onFlash, onSuccess, ...pageParams } = params\n\n    const page = {\n      ...current,\n      ...pageParams,\n      flash: flash ?? {},\n      props: props as Page['props'],\n    }\n\n    const preserveScroll = RequestParams.resolvePreserveOption(params.preserveScroll ?? false, page)\n    const preserveState = RequestParams.resolvePreserveOption(params.preserveState ?? false, page)\n\n    return currentPage\n      .set(page, {\n        replace,\n        preserveScroll,\n        preserveState,\n        viewTransition,\n      })\n      .then(() => {\n        const currentFlash = currentPage.get().flash\n\n        if (Object.keys(currentFlash).length > 0) {\n          fireFlashEvent(currentFlash)\n          onFlash?.(currentFlash)\n        }\n\n        const errors = currentPage.get().props.errors || {}\n\n        if (Object.keys(errors).length === 0) {\n          onSuccess?.(currentPage.get())\n          return\n        }\n\n        const scopedErrors = params.errorBag ? errors[params.errorBag || ''] || {} : errors\n\n        onError?.(scopedErrors)\n      })\n      .finally(() => onFinish?.(params))\n  }\n\n  protected getPrefetchParams(href: string | URL | UrlMethodPair, options: VisitOptions): ActiveVisit {\n    return {\n      ...this.getPendingVisit(href, {\n        ...options,\n        async: true,\n        showProgress: false,\n        prefetch: true,\n        viewTransition: false,\n      }),\n      ...this.getVisitEvents(options),\n    }\n  }\n\n  protected getPendingVisit(\n    href: string | URL | UrlMethodPair,\n    options: VisitOptions,\n    pendingVisitOptions: Partial<PendingVisitOptions> = {},\n  ): PendingVisit {\n    if (isUrlMethodPair(href)) {\n      const urlMethodPair = href\n      href = urlMethodPair.url\n      options.method = options.method ?? urlMethodPair.method\n    }\n\n    const defaultVisitOptionsCallback = config.get('visitOptions')\n\n    const configuredOptions = defaultVisitOptionsCallback\n      ? defaultVisitOptionsCallback(href.toString(), cloneDeep(options)) || {}\n      : {}\n\n    const mergedOptions: Visit = {\n      method: 'get',\n      data: {},\n      replace: false,\n      preserveScroll: false,\n      preserveState: false,\n      only: [],\n      except: [],\n      headers: {},\n      errorBag: '',\n      forceFormData: false,\n      queryStringArrayFormat: 'brackets',\n      async: false,\n      showProgress: true,\n      fresh: false,\n      reset: [],\n      preserveUrl: false,\n      prefetch: false,\n      invalidateCacheTags: [],\n      viewTransition: false,\n      ...options,\n      ...configuredOptions,\n    }\n\n    const [url, _data] = transformUrlAndData(\n      href,\n      mergedOptions.data,\n      mergedOptions.method,\n      mergedOptions.forceFormData,\n      mergedOptions.queryStringArrayFormat,\n    )\n\n    const visit = {\n      cancelled: false,\n      completed: false,\n      interrupted: false,\n      ...mergedOptions,\n      ...pendingVisitOptions,\n      url,\n      data: _data,\n    }\n\n    if (visit.prefetch) {\n      visit.headers['Purpose'] = 'prefetch'\n    }\n\n    return visit\n  }\n\n  protected getVisitEvents(options: VisitOptions): VisitCallbacks {\n    return {\n      onCancelToken: options.onCancelToken || (() => {}),\n      onBefore: options.onBefore || (() => {}),\n      onBeforeUpdate: options.onBeforeUpdate || (() => {}),\n      onStart: options.onStart || (() => {}),\n      onProgress: options.onProgress || (() => {}),\n      onFinish: options.onFinish || (() => {}),\n      onCancel: options.onCancel || (() => {}),\n      onSuccess: options.onSuccess || (() => {}),\n      onError: options.onError || (() => {}),\n      onFlash: options.onFlash || (() => {}),\n      onPrefetched: options.onPrefetched || (() => {}),\n      onPrefetching: options.onPrefetching || (() => {}),\n    }\n  }\n\n  protected loadDeferredProps(deferred: Page['deferredProps']): void {\n    if (deferred) {\n      Object.entries(deferred).forEach(([_, group]) => {\n        this.doReload({ only: group, deferredProps: true })\n      })\n    }\n  }\n}\n","import { get, has, set } from 'lodash-es'\nimport { InertiaAppConfig } from './types'\n\n// Generate all possible nested paths\ntype ConfigKeys<T> = T extends Function\n  ? never\n  : string extends keyof T\n    ? string\n    :\n        | Extract<keyof T, string>\n        | {\n            [Key in Extract<keyof T, string>]: T[Key] extends object ? `${Key}.${ConfigKeys<T[Key]> & string}` : never\n          }[Extract<keyof T, string>]\n\n// Extract the value type at a given path\ntype ConfigValue<T, K extends ConfigKeys<T>> = K extends `${infer P}.${infer Rest}`\n  ? P extends keyof T\n    ? Rest extends ConfigKeys<T[P]>\n      ? ConfigValue<T[P], Rest>\n      : never\n    : never\n  : K extends keyof T\n    ? T[K]\n    : never\n\n// Helper type for setting multiple config values with an object\ntype ConfigSetObject<T> = {\n  [K in ConfigKeys<T>]?: ConfigValue<T, K>\n}\n\ntype FirstLevelOptional<T> = {\n  [K in keyof T]?: T[K] extends object ? { [P in keyof T[K]]?: T[K][P] } : T[K]\n}\n\nexport class Config<TConfig extends {} = {}> {\n  protected config: FirstLevelOptional<TConfig> = {}\n  protected defaults: TConfig\n\n  public constructor(defaults: TConfig) {\n    this.defaults = defaults\n  }\n\n  public extend<TExtension extends {}>(defaults?: TExtension): Config<TConfig & TExtension> {\n    if (defaults) {\n      this.defaults = { ...this.defaults, ...defaults } as TConfig & TExtension\n    }\n\n    return this as unknown as Config<TConfig & TExtension>\n  }\n\n  public replace(newConfig: FirstLevelOptional<TConfig>): void {\n    this.config = newConfig\n  }\n\n  public get<K extends ConfigKeys<TConfig>>(key: K): ConfigValue<TConfig, K> {\n    return (has(this.config, key) ? get(this.config, key) : get(this.defaults, key)) as ConfigValue<TConfig, K>\n  }\n\n  public set<K extends ConfigKeys<TConfig>>(\n    keyOrValues: K | Partial<ConfigSetObject<TConfig>>,\n    value?: ConfigValue<TConfig, K>,\n  ): void {\n    if (typeof keyOrValues === 'string') {\n      set(this.config, keyOrValues, value)\n    } else {\n      Object.entries(keyOrValues).forEach(([key, val]) => {\n        set(this.config, key, val)\n      })\n    }\n  }\n}\n\nexport const config = new Config<InertiaAppConfig>({\n  form: {\n    recentlySuccessfulDuration: 2_000,\n    forceIndicesArrayFormatInFormData: true,\n  },\n  future: {\n    preserveEqualProps: false,\n    useDataInertiaHeadAttribute: false,\n    useDialogForErrorModal: false,\n    useScriptElementForInitialPage: false,\n  },\n  prefetch: {\n    cacheFor: 30_000,\n    hoverDelay: 75,\n  },\n})\n","export default function debounce<F extends (...params: any[]) => ReturnType<F>>(fn: F, delay: number): F {\n  let timeoutID: NodeJS.Timeout\n  return function (...args: unknown[]) {\n    clearTimeout(timeoutID)\n    timeoutID = setTimeout(() => fn.apply(this, args), delay)\n  } as F\n}\n","import { GlobalEventDetails, GlobalEventNames, GlobalEventTrigger } from './types'\n\nfunction fireEvent<TEventName extends GlobalEventNames>(\n  name: TEventName,\n  options: CustomEventInit<GlobalEventDetails<TEventName>>,\n): boolean {\n  return document.dispatchEvent(new CustomEvent(`inertia:${name}`, options))\n}\n\nexport const fireBeforeEvent: GlobalEventTrigger<'before'> = (visit) => {\n  return fireEvent('before', { cancelable: true, detail: { visit } })\n}\n\nexport const fireErrorEvent: GlobalEventTrigger<'error'> = (errors) => {\n  return fireEvent('error', { detail: { errors } })\n}\n\nexport const fireExceptionEvent: GlobalEventTrigger<'exception'> = (exception) => {\n  return fireEvent('exception', { cancelable: true, detail: { exception } })\n}\n\nexport const fireFinishEvent: GlobalEventTrigger<'finish'> = (visit) => {\n  return fireEvent('finish', { detail: { visit } })\n}\n\nexport const fireInvalidEvent: GlobalEventTrigger<'invalid'> = (response) => {\n  return fireEvent('invalid', { cancelable: true, detail: { response } })\n}\n\nexport const fireBeforeUpdateEvent: GlobalEventTrigger<'beforeUpdate'> = (page) => {\n  return fireEvent('beforeUpdate', { detail: { page } })\n}\n\nexport const fireNavigateEvent: GlobalEventTrigger<'navigate'> = (page) => {\n  return fireEvent('navigate', { detail: { page } })\n}\n\nexport const fireProgressEvent: GlobalEventTrigger<'progress'> = (progress) => {\n  return fireEvent('progress', { detail: { progress } })\n}\n\nexport const fireStartEvent: GlobalEventTrigger<'start'> = (visit) => {\n  return fireEvent('start', { detail: { visit } })\n}\n\nexport const fireSuccessEvent: GlobalEventTrigger<'success'> = (page) => {\n  return fireEvent('success', { detail: { page } })\n}\n\nexport const firePrefetchedEvent: GlobalEventTrigger<'prefetched'> = (response, visit) => {\n  return fireEvent('prefetched', { detail: { fetchedAt: Date.now(), response: response.data, visit } })\n}\n\nexport const firePrefetchingEvent: GlobalEventTrigger<'prefetching'> = (visit) => {\n  return fireEvent('prefetching', { detail: { visit } })\n}\n\nexport const fireFlashEvent: GlobalEventTrigger<'flash'> = (flash) => {\n  return fireEvent('flash', { detail: { flash } })\n}\n","import { cloneDeep, isEqual } from 'lodash-es'\nimport { decryptHistory, encryptHistory, historySessionStorageKeys } from './encryption'\nimport { page as currentPage } from './page'\nimport Queue from './queue'\nimport { SessionStorage } from './sessionStorage'\nimport { Page, ScrollRegion } from './types'\n\nconst isServer = typeof window === 'undefined'\nconst queue = new Queue<Promise<void>>()\nconst isChromeIOS = !isServer && /CriOS/.test(window.navigator.userAgent)\n\nclass History {\n  public rememberedState = 'rememberedState' as const\n  public scrollRegions = 'scrollRegions' as const\n  public preserveUrl = false\n  protected current: Partial<Page> = {}\n  // We need initialState for `restore`\n  protected initialState: Partial<Page> | null = null\n\n  public remember(data: unknown, key: string): void {\n    this.replaceState({\n      ...currentPage.getWithoutFlashData(),\n      rememberedState: {\n        ...(currentPage.get()?.rememberedState ?? {}),\n        [key]: data,\n      },\n    })\n  }\n\n  public restore(key: string): unknown {\n    if (!isServer) {\n      return this.current[this.rememberedState]?.[key] !== undefined\n        ? this.current[this.rememberedState]?.[key]\n        : this.initialState?.[this.rememberedState]?.[key]\n    }\n  }\n\n  public pushState(page: Page, cb: (() => void) | null = null): void {\n    if (isServer) {\n      return\n    }\n\n    if (this.preserveUrl) {\n      cb && cb()\n      return\n    }\n\n    this.current = page\n\n    queue.add(() => {\n      return this.getPageData(page).then((data) => {\n        // Defer history.pushState to the next event loop tick to prevent timing conflicts.\n        // Ensure any previous history.replaceState completes before pushState is executed.\n        const doPush = () => this.doPushState({ page: data }, page.url).then(() => cb?.())\n\n        if (isChromeIOS) {\n          return new Promise((resolve) => {\n            setTimeout(() => doPush().then(resolve))\n          })\n        }\n\n        return doPush()\n      })\n    })\n  }\n\n  protected clonePageProps(page: Page): Page {\n    try {\n      structuredClone(page.props)\n      return page\n    } catch {\n      // Props contain non-serializable data (e.g., Proxies, functions).\n      // Clone them to ensure they can be safely stored in browser history.\n      return {\n        ...page,\n        props: cloneDeep(page.props),\n      }\n    }\n  }\n\n  protected getPageData(page: Page): Promise<Page | ArrayBuffer> {\n    const pageWithClonedProps = this.clonePageProps(page)\n\n    return new Promise((resolve) => {\n      return page.encryptHistory ? encryptHistory(pageWithClonedProps).then(resolve) : resolve(pageWithClonedProps)\n    })\n  }\n\n  public processQueue(): Promise<void> {\n    return queue.process()\n  }\n\n  public decrypt(page: Page | null = null): Promise<Page> {\n    if (isServer) {\n      return Promise.resolve(page ?? currentPage.get())\n    }\n\n    const pageData = page ?? window.history.state?.page\n\n    return this.decryptPageData(pageData).then((data) => {\n      if (!data) {\n        throw new Error('Unable to decrypt history')\n      }\n\n      if (this.initialState === null) {\n        this.initialState = data ?? undefined\n      } else {\n        this.current = data ?? {}\n      }\n\n      return data\n    })\n  }\n\n  protected decryptPageData(pageData: ArrayBuffer | Page | null): Promise<Page | null> {\n    return pageData instanceof ArrayBuffer ? decryptHistory(pageData) : Promise.resolve(pageData)\n  }\n\n  public saveScrollPositions(scrollRegions: ScrollRegion[]): void {\n    queue.add(() => {\n      return Promise.resolve().then(() => {\n        if (!window.history.state?.page) {\n          return\n        }\n\n        if (isEqual(this.getScrollRegions(), scrollRegions)) {\n          return\n        }\n\n        return this.doReplaceState({\n          page: window.history.state.page,\n          scrollRegions,\n        })\n      })\n    })\n  }\n\n  public saveDocumentScrollPosition(scrollRegion: ScrollRegion): void {\n    queue.add(() => {\n      return Promise.resolve().then(() => {\n        if (!window.history.state?.page) {\n          return\n        }\n\n        if (isEqual(this.getDocumentScrollPosition(), scrollRegion)) {\n          return\n        }\n\n        return this.doReplaceState({\n          page: window.history.state.page,\n          documentScrollPosition: scrollRegion,\n        })\n      })\n    })\n  }\n\n  public getScrollRegions(): ScrollRegion[] {\n    return window.history.state?.scrollRegions || []\n  }\n\n  public getDocumentScrollPosition(): ScrollRegion {\n    return window.history.state?.documentScrollPosition || { top: 0, left: 0 }\n  }\n\n  public replaceState(page: Page, cb: (() => void) | null = null): void {\n    currentPage.merge(page)\n\n    if (isServer) {\n      return\n    }\n\n    if (this.preserveUrl) {\n      cb && cb()\n      return\n    }\n\n    this.current = page\n\n    queue.add(() => {\n      return this.getPageData(page).then((data) => {\n        // Defer history.replaceState to the next event loop tick to prevent timing conflicts.\n        // Ensure any previous history.pushState completes before replaceState is executed.\n        const doReplace = () => this.doReplaceState({ page: data }, page.url).then(() => cb?.())\n\n        if (isChromeIOS) {\n          return new Promise((resolve) => {\n            setTimeout(() => doReplace().then(resolve))\n          })\n        }\n\n        return doReplace()\n      })\n    })\n  }\n\n  protected doReplaceState(\n    data: {\n      page: Page | ArrayBuffer\n      scrollRegions?: ScrollRegion[]\n      documentScrollPosition?: ScrollRegion\n    },\n    url?: string,\n  ): Promise<void> {\n    return Promise.resolve().then(() =>\n      window.history.replaceState(\n        {\n          ...data,\n          scrollRegions: data.scrollRegions ?? window.history.state?.scrollRegions,\n          documentScrollPosition: data.documentScrollPosition ?? window.history.state?.documentScrollPosition,\n        },\n        '',\n        url,\n      ),\n    )\n  }\n\n  protected doPushState(\n    data: {\n      page: Page | ArrayBuffer\n      scrollRegions?: ScrollRegion[]\n      documentScrollPosition?: ScrollRegion\n    },\n    url: string,\n  ): Promise<void> {\n    return Promise.resolve().then(() => window.history.pushState(data, '', url))\n  }\n\n  public getState<T>(key: keyof Page, defaultValue?: T): any {\n    return this.current?.[key] ?? defaultValue\n  }\n\n  public deleteState(key: keyof Page) {\n    if (this.current[key] !== undefined) {\n      delete this.current[key]\n      this.replaceState(this.current as Page)\n    }\n  }\n\n  public clearInitialState(key: keyof Page) {\n    if (this.initialState && this.initialState[key] !== undefined) {\n      delete this.initialState[key]\n    }\n  }\n\n  public hasAnyState(): boolean {\n    return !!this.getAllState()\n  }\n\n  public clear() {\n    SessionStorage.remove(historySessionStorageKeys.key)\n    SessionStorage.remove(historySessionStorageKeys.iv)\n  }\n\n  public setCurrent(page: Page): void {\n    this.current = page\n  }\n\n  public isValidState(state: any): boolean {\n    return !!state.page\n  }\n\n  public getAllState(): Page {\n    return this.current as Page\n  }\n}\n\nif (typeof window !== 'undefined' && window.history.scrollRestoration) {\n  window.history.scrollRestoration = 'manual'\n}\n\nexport const history = new History()\n","export class SessionStorage {\n  public static locationVisitKey = 'inertiaLocationVisit'\n\n  public static set(key: string, value: any): void {\n    if (typeof window !== 'undefined') {\n      window.sessionStorage.setItem(key, JSON.stringify(value))\n    }\n  }\n\n  public static get(key: string): any {\n    if (typeof window !== 'undefined') {\n      return JSON.parse(window.sessionStorage.getItem(key) || 'null')\n    }\n  }\n\n  public static merge(key: string, value: any): void {\n    const existing = this.get(key)\n\n    if (existing === null) {\n      this.set(key, value)\n    } else {\n      this.set(key, { ...existing, ...value })\n    }\n  }\n\n  public static remove(key: string): void {\n    if (typeof window !== 'undefined') {\n      window.sessionStorage.removeItem(key)\n    }\n  }\n\n  public static removeNested(key: string, nestedKey: string): void {\n    const existing = this.get(key)\n\n    if (existing !== null) {\n      delete existing[nestedKey]\n\n      this.set(key, existing)\n    }\n  }\n\n  public static exists(key: string): boolean {\n    try {\n      return this.get(key) !== null\n    } catch (error) {\n      return false\n    }\n  }\n\n  public static clear(): void {\n    if (typeof window !== 'undefined') {\n      window.sessionStorage.clear()\n    }\n  }\n}\n","import { SessionStorage } from './sessionStorage'\n\nexport const encryptHistory = async (data: any): Promise<ArrayBuffer> => {\n  if (typeof window === 'undefined') {\n    throw new Error('Unable to encrypt history')\n  }\n\n  const iv = getIv()\n  const storedKey = await getKeyFromSessionStorage()\n  const key = await getOrCreateKey(storedKey)\n\n  if (!key) {\n    throw new Error('Unable to encrypt history')\n  }\n\n  const encrypted = await encryptData(iv, key, data)\n\n  return encrypted\n}\n\nexport const historySessionStorageKeys = {\n  key: 'historyKey',\n  iv: 'historyIv',\n}\n\nexport const decryptHistory = async (data: any): Promise<any> => {\n  const iv = getIv()\n  const storedKey = await getKeyFromSessionStorage()\n\n  if (!storedKey) {\n    throw new Error('Unable to decrypt history')\n  }\n\n  return await decryptData(iv, storedKey, data)\n}\n\nconst encryptData = async (iv: BufferSource, key: CryptoKey, data: any) => {\n  if (typeof window === 'undefined') {\n    throw new Error('Unable to encrypt history')\n  }\n\n  if (typeof window.crypto.subtle === 'undefined') {\n    console.warn('Encryption is not supported in this environment. SSL is required.')\n\n    return Promise.resolve(data)\n  }\n\n  const textEncoder = new TextEncoder()\n  const str = JSON.stringify(data)\n  const encoded = new Uint8Array(str.length * 3)\n\n  const result = textEncoder.encodeInto(str, encoded)\n\n  return window.crypto.subtle.encrypt(\n    {\n      name: 'AES-GCM',\n      iv,\n    },\n    key,\n    encoded.subarray(0, result.written),\n  )\n}\n\nconst decryptData = async (iv: BufferSource, key: CryptoKey, data: any) => {\n  if (typeof window.crypto.subtle === 'undefined') {\n    console.warn('Decryption is not supported in this environment. SSL is required.')\n\n    return Promise.resolve(data)\n  }\n\n  const decrypted = await window.crypto.subtle.decrypt(\n    {\n      name: 'AES-GCM',\n      iv,\n    },\n    key,\n    data,\n  )\n\n  return JSON.parse(new TextDecoder().decode(decrypted))\n}\n\nconst getIv = (): BufferSource => {\n  const ivString = SessionStorage.get(historySessionStorageKeys.iv)\n\n  if (ivString) {\n    return new Uint8Array(ivString)\n  }\n\n  const iv = window.crypto.getRandomValues(new Uint8Array(12))\n\n  SessionStorage.set(historySessionStorageKeys.iv, Array.from(iv))\n\n  return iv\n}\n\nconst createKey = async () => {\n  if (typeof window.crypto.subtle === 'undefined') {\n    console.warn('Encryption is not supported in this environment. SSL is required.')\n\n    return Promise.resolve(null)\n  }\n\n  return window.crypto.subtle.generateKey(\n    {\n      name: 'AES-GCM',\n      length: 256,\n    },\n    true,\n    ['encrypt', 'decrypt'],\n  )\n}\n\nconst saveKey = async (key: CryptoKey) => {\n  if (typeof window.crypto.subtle === 'undefined') {\n    console.warn('Encryption is not supported in this environment. SSL is required.')\n\n    return Promise.resolve()\n  }\n\n  const keyData = await window.crypto.subtle.exportKey('raw', key)\n\n  SessionStorage.set(historySessionStorageKeys.key, Array.from(new Uint8Array(keyData)))\n}\n\nconst getOrCreateKey = async (key: CryptoKey | null) => {\n  if (key) {\n    return key\n  }\n\n  const newKey = await createKey()\n\n  if (!newKey) {\n    return null\n  }\n\n  await saveKey(newKey)\n\n  return newKey\n}\n\nconst getKeyFromSessionStorage = async (): Promise<CryptoKey | null> => {\n  const stringKey = SessionStorage.get(historySessionStorageKeys.key)\n\n  if (!stringKey) {\n    return null\n  }\n\n  const key = await window.crypto.subtle.importKey(\n    'raw',\n    new Uint8Array(stringKey),\n    {\n      name: 'AES-GCM',\n      length: 256,\n    },\n    true,\n    ['encrypt', 'decrypt'],\n  )\n\n  return key\n}\n","import { cloneDeep } from 'lodash-es'\nimport { objectsAreEqual } from './objectUtils'\nimport { page as currentPage } from './page'\nimport { Response } from './response'\nimport { timeToMs } from './time'\nimport {\n  ActiveVisit,\n  CacheForOption,\n  InFlightPrefetch,\n  InternalActiveVisit,\n  Page,\n  PrefetchedResponse,\n  PrefetchOptions,\n  PrefetchRemovalTimer,\n} from './types'\n\nclass PrefetchedRequests {\n  protected cached: PrefetchedResponse[] = []\n  protected inFlightRequests: InFlightPrefetch[] = []\n  protected removalTimers: PrefetchRemovalTimer[] = []\n  protected currentUseId: string | null = null\n\n  public add(\n    params: ActiveVisit,\n    sendFunc: (params: InternalActiveVisit) => void,\n    { cacheFor, cacheTags }: PrefetchOptions,\n  ) {\n    const inFlight = this.findInFlight(params)\n\n    if (inFlight) {\n      return Promise.resolve()\n    }\n\n    const existing = this.findCached(params)\n\n    if (!params.fresh && existing && existing.staleTimestamp > Date.now()) {\n      return Promise.resolve()\n    }\n\n    const [stale, prefetchExpiresIn] = this.extractStaleValues(cacheFor)\n\n    const promise = new Promise<Response>((resolve, reject) => {\n      sendFunc({\n        ...params,\n        onCancel: () => {\n          this.remove(params)\n          params.onCancel()\n          reject()\n        },\n        onError: (error) => {\n          this.remove(params)\n          params.onError(error)\n          reject()\n        },\n        onPrefetching(visitParams) {\n          params.onPrefetching(visitParams)\n        },\n        onPrefetched(response, visit) {\n          params.onPrefetched(response, visit)\n        },\n        onPrefetchResponse(response) {\n          resolve(response)\n        },\n        onPrefetchError(error) {\n          prefetchedRequests.removeFromInFlight(params)\n          reject(error)\n        },\n      })\n    }).then((response) => {\n      this.remove(params)\n\n      const pageResponse = response.getPageResponse()\n\n      currentPage.mergeOncePropsIntoResponse(pageResponse)\n\n      this.cached.push({\n        params: { ...params },\n        staleTimestamp: Date.now() + stale,\n        expiresAt: Date.now() + prefetchExpiresIn,\n        response: promise,\n        singleUse: prefetchExpiresIn === 0,\n        timestamp: Date.now(),\n        inFlight: false,\n        tags: Array.isArray(cacheTags) ? cacheTags : [cacheTags],\n      })\n\n      const oncePropExpiresIn = this.getShortestOncePropTtl(pageResponse)\n      this.scheduleForRemoval(\n        params,\n        oncePropExpiresIn ? Math.min(prefetchExpiresIn, oncePropExpiresIn) : prefetchExpiresIn,\n      )\n      this.removeFromInFlight(params)\n\n      response.handlePrefetch()\n\n      return response\n    })\n\n    this.inFlightRequests.push({\n      params: { ...params },\n      response: promise,\n      staleTimestamp: null,\n      inFlight: true,\n    })\n\n    return promise\n  }\n\n  public removeAll(): void {\n    this.cached = []\n    this.removalTimers.forEach((removalTimer) => {\n      clearTimeout(removalTimer.timer)\n    })\n    this.removalTimers = []\n  }\n\n  public removeByTags(tags: string[]): void {\n    this.cached = this.cached.filter((prefetched) => {\n      return !prefetched.tags.some((tag) => tags.includes(tag))\n    })\n  }\n\n  public remove(params: ActiveVisit): void {\n    this.cached = this.cached.filter((prefetched) => {\n      return !this.paramsAreEqual(prefetched.params, params)\n    })\n\n    this.clearTimer(params)\n  }\n\n  protected removeFromInFlight(params: ActiveVisit): void {\n    this.inFlightRequests = this.inFlightRequests.filter((prefetching) => {\n      return !this.paramsAreEqual(prefetching.params, params)\n    })\n  }\n\n  protected extractStaleValues(cacheFor: PrefetchOptions['cacheFor']): [number, number] {\n    const [stale, expires] = this.cacheForToStaleAndExpires(cacheFor)\n\n    return [timeToMs(stale), timeToMs(expires)]\n  }\n\n  protected cacheForToStaleAndExpires(cacheFor: PrefetchOptions['cacheFor']): [CacheForOption, CacheForOption] {\n    if (!Array.isArray(cacheFor)) {\n      return [cacheFor, cacheFor]\n    }\n\n    switch (cacheFor.length) {\n      case 0:\n        return [0, 0]\n      case 1:\n        return [cacheFor[0], cacheFor[0]]\n      default:\n        return [cacheFor[0], cacheFor[1]]\n    }\n  }\n\n  protected clearTimer(params: ActiveVisit) {\n    const timer = this.removalTimers.find((removalTimer) => {\n      return this.paramsAreEqual(removalTimer.params, params)\n    })\n\n    if (timer) {\n      clearTimeout(timer.timer)\n      this.removalTimers = this.removalTimers.filter((removalTimer) => removalTimer !== timer)\n    }\n  }\n\n  protected scheduleForRemoval(params: ActiveVisit, expiresIn: number) {\n    if (typeof window === 'undefined') {\n      return\n    }\n\n    this.clearTimer(params)\n\n    if (expiresIn > 0) {\n      const timer = window.setTimeout(() => this.remove(params), expiresIn)\n\n      this.removalTimers.push({\n        params,\n        timer,\n      })\n    }\n  }\n\n  public get(params: ActiveVisit): InFlightPrefetch | PrefetchedResponse | null {\n    return this.findCached(params) || this.findInFlight(params)\n  }\n\n  public use(prefetched: PrefetchedResponse | InFlightPrefetch, params: ActiveVisit) {\n    const id = `${params.url.pathname}-${Date.now()}-${Math.random().toString(36).substring(7)}`\n\n    this.currentUseId = id\n\n    return prefetched.response.then((response) => {\n      if (this.currentUseId !== id) {\n        // They've since gone on to `use` a different request,\n        // so we should ignore this one\n        return\n      }\n\n      response.mergeParams({ ...params, onPrefetched: () => {} })\n\n      // If this was a one-time cache, remove it\n      // (generally a prefetch=\"click\" request with no specified cache value)\n      this.removeSingleUseItems(params)\n\n      return response.handle()\n    })\n  }\n\n  protected removeSingleUseItems(params: ActiveVisit) {\n    this.cached = this.cached.filter((prefetched) => {\n      if (!this.paramsAreEqual(prefetched.params, params)) {\n        return true\n      }\n\n      return !prefetched.singleUse\n    })\n  }\n\n  public findCached(params: ActiveVisit): PrefetchedResponse | null {\n    return (\n      this.cached.find((prefetched) => {\n        return this.paramsAreEqual(prefetched.params, params)\n      }) || null\n    )\n  }\n\n  public findInFlight(params: ActiveVisit): InFlightPrefetch | null {\n    return (\n      this.inFlightRequests.find((prefetched) => {\n        return this.paramsAreEqual(prefetched.params, params)\n      }) || null\n    )\n  }\n\n  protected withoutPurposePrefetchHeader(params: ActiveVisit): ActiveVisit {\n    const newParams = cloneDeep(params)\n    if (newParams.headers['Purpose'] === 'prefetch') {\n      delete newParams.headers['Purpose']\n    }\n    return newParams\n  }\n\n  protected paramsAreEqual(params1: ActiveVisit, params2: ActiveVisit): boolean {\n    return objectsAreEqual<ActiveVisit>(\n      this.withoutPurposePrefetchHeader(params1),\n      this.withoutPurposePrefetchHeader(params2),\n      [\n        'showProgress',\n        'replace',\n        'prefetch',\n        'preserveScroll',\n        'preserveState',\n        'onBefore',\n        'onBeforeUpdate',\n        'onStart',\n        'onProgress',\n        'onFinish',\n        'onCancel',\n        'onSuccess',\n        'onError',\n        'onFlash',\n        'onPrefetched',\n        'onCancelToken',\n        'onPrefetching',\n        'async',\n        'viewTransition',\n      ],\n    )\n  }\n\n  public updateCachedOncePropsFromCurrentPage(): void {\n    this.cached.forEach((prefetched) => {\n      prefetched.response.then((response) => {\n        const pageResponse = response.getPageResponse()\n\n        currentPage.mergeOncePropsIntoResponse(pageResponse, { force: true })\n\n        for (const [group, deferredProps] of Object.entries(pageResponse.deferredProps ?? {})) {\n          const remaining = deferredProps.filter((prop) => pageResponse.props[prop] === undefined)\n\n          if (remaining.length > 0) {\n            pageResponse.deferredProps![group] = remaining\n          } else {\n            delete pageResponse.deferredProps![group]\n          }\n        }\n\n        const oncePropExpiresIn = this.getShortestOncePropTtl(pageResponse)\n\n        if (oncePropExpiresIn === null) {\n          return\n        }\n\n        const prefetchExpiresIn = prefetched.expiresAt - Date.now()\n        const expiresIn = Math.min(prefetchExpiresIn, oncePropExpiresIn)\n\n        if (expiresIn > 0) {\n          this.scheduleForRemoval(prefetched.params, expiresIn)\n        } else {\n          this.remove(prefetched.params)\n        }\n      })\n    })\n  }\n\n  protected getShortestOncePropTtl(page: Page): number | null {\n    const expiryTimestamps = Object.values(page.onceProps ?? {})\n      .map((onceProp) => onceProp.expiresAt)\n      .filter((expiresAt): expiresAt is number => !!expiresAt)\n\n    if (expiryTimestamps.length === 0) {\n      return null\n    }\n\n    return Math.min(...expiryTimestamps) - Date.now()\n  }\n}\n\nexport const prefetchedRequests = new PrefetchedRequests()\n","export const objectsAreEqual = <T extends Record<string, any>>(\n  obj1: T,\n  obj2: T,\n  excludeKeys: {\n    [K in keyof T]: K\n  }[keyof T][],\n): boolean => {\n  if (obj1 === obj2) {\n    return true\n  }\n\n  // Check keys in obj1\n  for (const key in obj1) {\n    if (excludeKeys.includes(key)) {\n      continue\n    }\n\n    if (obj1[key] === obj2[key]) {\n      continue\n    }\n\n    if (!compareValues(obj1[key], obj2[key])) {\n      return false\n    }\n  }\n\n  // Check keys that exist in obj2 but not in obj1\n  for (const key in obj2) {\n    if (excludeKeys.includes(key)) {\n      continue\n    }\n\n    if (!(key in obj1)) {\n      return false\n    }\n  }\n\n  return true\n}\n\nconst compareValues = (value1: any, value2: any): boolean => {\n  switch (typeof value1) {\n    case 'object':\n      return objectsAreEqual(value1, value2, [])\n    case 'function':\n      return value1.toString() === value2.toString()\n    default:\n      return value1 === value2\n  }\n}\n","import { CacheForOption, TimeUnit } from './types'\n\nconst conversionMap: Record<TimeUnit, number> = {\n  ms: 1,\n  s: 1000,\n  m: 1000 * 60,\n  h: 1000 * 60 * 60,\n  d: 1000 * 60 * 60 * 24,\n}\n\nexport const timeToMs = (time: CacheForOption): number => {\n  if (typeof time === 'number') {\n    return time\n  }\n\n  for (const [unit, conversion] of Object.entries(conversionMap)) {\n    if (time.endsWith(unit)) {\n      return parseFloat(time) * conversion\n    }\n  }\n\n  return parseInt(time)\n}\n","import { history } from './history'\nimport { ScrollRegion } from './types'\n\nexport class Scroll {\n  public static save(): void {\n    history.saveScrollPositions(this.getScrollRegions())\n  }\n\n  public static getScrollRegions(): ScrollRegion[] {\n    return Array.from(this.regions()).map((region) => ({\n      top: region.scrollTop,\n      left: region.scrollLeft,\n    }))\n  }\n\n  protected static regions(): NodeListOf<Element> {\n    return document.querySelectorAll('[scroll-region]')\n  }\n\n  public static reset(): void {\n    const anchorHash = typeof window !== 'undefined' ? window.location.hash : null\n\n    if (!anchorHash) {\n      // Reset the document scroll position if there is no hash.\n      window.scrollTo(0, 0)\n    }\n\n    this.regions().forEach((region) => {\n      if (typeof region.scrollTo === 'function') {\n        region.scrollTo(0, 0)\n      } else {\n        region.scrollTop = 0\n        region.scrollLeft = 0\n      }\n    })\n\n    this.save()\n    this.scrollToAnchor()\n  }\n\n  public static scrollToAnchor(): void {\n    const anchorHash = typeof window !== 'undefined' ? window.location.hash : null\n\n    if (anchorHash) {\n      // We're using a setTimeout() here as a workaround for a bug in the React adapter where the\n      // rendering isn't completing fast enough, causing the anchor link to not be scrolled to.\n      setTimeout(() => {\n        const anchorElement = document.getElementById(anchorHash.slice(1))\n        anchorElement ? anchorElement.scrollIntoView() : window.scrollTo(0, 0)\n      })\n    }\n  }\n\n  public static restore(scrollRegions: ScrollRegion[]): void {\n    if (typeof window === 'undefined') {\n      return\n    }\n\n    window.requestAnimationFrame(() => {\n      this.restoreDocument()\n      this.restoreScrollRegions(scrollRegions)\n    })\n  }\n\n  public static restoreScrollRegions(scrollRegions: ScrollRegion[]): void {\n    if (typeof window === 'undefined') {\n      return\n    }\n\n    this.regions().forEach((region: Element, index: number) => {\n      const scrollPosition = scrollRegions[index]\n\n      if (!scrollPosition) {\n        return\n      }\n\n      if (typeof region.scrollTo === 'function') {\n        region.scrollTo(scrollPosition.left, scrollPosition.top)\n      } else {\n        region.scrollTop = scrollPosition.top\n        region.scrollLeft = scrollPosition.left\n      }\n    })\n  }\n\n  public static restoreDocument(): void {\n    const scrollPosition = history.getDocumentScrollPosition()\n    window.scrollTo(scrollPosition.left, scrollPosition.top)\n  }\n\n  public static onScroll(event: Event): void {\n    const target = event.target as Element\n\n    if (typeof target.hasAttribute === 'function' && target.hasAttribute('scroll-region')) {\n      this.save()\n    }\n  }\n\n  public static onWindowScroll(): void {\n    history.saveDocumentScrollPosition({\n      top: window.scrollY,\n      left: window.scrollX,\n    })\n  }\n}\n","import * as qs from 'qs'\nimport { config } from './config'\nimport { hasFiles } from './files'\nimport { isFormData, objectToFormData } from './formData'\nimport type {\n  FormDataConvertible,\n  Method,\n  QueryStringArrayFormatOption,\n  RequestPayload,\n  UrlMethodPair,\n  VisitOptions,\n} from './types'\n\nexport function hrefToUrl(href: string | URL): URL {\n  return new URL(href.toString(), typeof window === 'undefined' ? undefined : window.location.toString())\n}\n\nexport const transformUrlAndData = (\n  href: string | URL,\n  data: RequestPayload,\n  method: Method,\n  forceFormData: VisitOptions['forceFormData'],\n  queryStringArrayFormat: VisitOptions['queryStringArrayFormat'],\n): [URL, RequestPayload] => {\n  let url = typeof href === 'string' ? hrefToUrl(href) : href\n\n  if ((hasFiles(data) || forceFormData) && !isFormData(data)) {\n    if (config.get('form.forceIndicesArrayFormatInFormData')) {\n      queryStringArrayFormat = 'indices'\n    }\n\n    data = objectToFormData(data, new FormData(), null, queryStringArrayFormat)\n  }\n\n  if (isFormData(data)) {\n    return [url, data]\n  }\n\n  const [_href, _data] = mergeDataIntoQueryString(method, url, data, queryStringArrayFormat)\n\n  return [hrefToUrl(_href), _data]\n}\n\ntype MergeDataIntoQueryStringDataReturnType<T extends RequestPayload> =\n  T extends Record<string, FormDataConvertible> ? Record<string, FormDataConvertible> : RequestPayload\n\nexport function mergeDataIntoQueryString<T extends RequestPayload>(\n  method: Method,\n  href: URL | string,\n  data: T,\n  qsArrayFormat: QueryStringArrayFormatOption = 'brackets',\n): [string, MergeDataIntoQueryStringDataReturnType<T>] {\n  const hasDataForQueryString = method === 'get' && !isFormData(data) && Object.keys(data).length > 0\n  const hasHost = urlHasProtocol(href.toString())\n  const hasAbsolutePath = hasHost || href.toString().startsWith('/') || href.toString() === ''\n  const hasRelativePath = !hasAbsolutePath && !href.toString().startsWith('#') && !href.toString().startsWith('?')\n  const hasRelativePathWithDotPrefix = /^[.]{1,2}([/]|$)/.test(href.toString())\n  const hasSearch = href.toString().includes('?') || hasDataForQueryString\n  const hasHash = href.toString().includes('#')\n\n  const url = new URL(href.toString(), typeof window === 'undefined' ? 'http://localhost' : window.location.toString())\n\n  if (hasDataForQueryString) {\n    const parseOptions = { ignoreQueryPrefix: true, arrayLimit: -1 }\n    url.search = qs.stringify(\n      { ...qs.parse(url.search, parseOptions), ...data },\n      {\n        encodeValuesOnly: true,\n        arrayFormat: qsArrayFormat,\n      },\n    )\n  }\n\n  return [\n    [\n      hasHost ? `${url.protocol}//${url.host}` : '',\n      hasAbsolutePath ? url.pathname : '',\n      hasRelativePath ? url.pathname.substring(hasRelativePathWithDotPrefix ? 0 : 1) : '',\n      hasSearch ? url.search : '',\n      hasHash ? url.hash : '',\n    ].join(''),\n    (hasDataForQueryString ? {} : data) as MergeDataIntoQueryStringDataReturnType<T>,\n  ]\n}\n\nexport function urlWithoutHash(url: URL | Location): URL {\n  url = new URL(url.href)\n  url.hash = ''\n  return url\n}\n\nexport const setHashIfSameUrl = (originUrl: URL | Location, destinationUrl: URL | Location) => {\n  if (originUrl.hash && !destinationUrl.hash && urlWithoutHash(originUrl).href === destinationUrl.href) {\n    destinationUrl.hash = originUrl.hash\n  }\n}\n\nexport const isSameUrlWithoutHash = (url1: URL | Location, url2: URL | Location): boolean => {\n  return urlWithoutHash(url1).href === urlWithoutHash(url2).href\n}\n\nexport function isUrlMethodPair(href: unknown): href is UrlMethodPair {\n  return href !== null && typeof href === 'object' && href !== undefined && 'url' in href && 'method' in href\n}\n\nexport function urlHasProtocol(url: string): boolean {\n  return /^([a-z][a-z0-9+.-]*:)?\\/\\/[^/]/i.test(url)\n}\n\nexport function urlToString(url: URL | string, absolute: boolean): string {\n  const urlObj = typeof url === 'string' ? hrefToUrl(url) : url\n\n  return absolute\n    ? `${urlObj.protocol}//${urlObj.host}${urlObj.pathname}${urlObj.search}${urlObj.hash}`\n    : `${urlObj.pathname}${urlObj.search}${urlObj.hash}`\n}\n","import { FormDataConvertible, RequestPayload } from './types'\n\nexport const isFile = (value: unknown): boolean =>\n  (typeof File !== 'undefined' && value instanceof File) ||\n  value instanceof Blob ||\n  (typeof FileList !== 'undefined' && value instanceof FileList && value.length > 0)\n\nexport function hasFiles(data: RequestPayload | FormDataConvertible): boolean {\n  return (\n    isFile(data) ||\n    (data instanceof FormData && Array.from(data.values()).some((value) => hasFiles(value))) ||\n    (typeof data === 'object' && data !== null && Object.values(data).some((value) => hasFiles(value)))\n  )\n}\n","import type { FormDataConvertible, QueryStringArrayFormatOption } from './types'\n\nexport const isFormData = (value: any): value is FormData => value instanceof FormData\n\nexport function objectToFormData(\n  source: Record<string, FormDataConvertible>,\n  form: FormData = new FormData(),\n  parentKey: string | null = null,\n  queryStringArrayFormat: QueryStringArrayFormatOption = 'brackets',\n): FormData {\n  source = source || {}\n\n  for (const key in source) {\n    if (Object.prototype.hasOwnProperty.call(source, key)) {\n      append(form, composeKey(parentKey, key, 'indices'), source[key], queryStringArrayFormat)\n    }\n  }\n\n  return form\n}\n\nfunction composeKey(parent: string | null, key: string, format: QueryStringArrayFormatOption): string {\n  if (!parent) {\n    return key\n  }\n\n  return format === 'brackets' ? `${parent}[]` : `${parent}[${key}]`\n}\n\nfunction append(form: FormData, key: string, value: FormDataConvertible, format: QueryStringArrayFormatOption): void {\n  if (Array.isArray(value)) {\n    return Array.from(value.keys()).forEach((index) =>\n      append(form, composeKey(key, index.toString(), format), value[index], format),\n    )\n  } else if (value instanceof Date) {\n    return form.append(key, value.toISOString())\n  } else if (value instanceof File) {\n    return form.append(key, value, value.name)\n  } else if (value instanceof Blob) {\n    return form.append(key, value)\n  } else if (typeof value === 'boolean') {\n    return form.append(key, value ? '1' : '0')\n  } else if (typeof value === 'string') {\n    return form.append(key, value)\n  } else if (typeof value === 'number') {\n    return form.append(key, `${value}`)\n  } else if (value === null || value === undefined) {\n    return form.append(key, '')\n  }\n\n  objectToFormData(value, form, key, format)\n}\n","import { eventHandler } from './eventHandler'\nimport { fireNavigateEvent } from './events'\nimport { history } from './history'\nimport { prefetchedRequests } from './prefetched'\nimport { Scroll } from './scroll'\nimport { Component, FlashData, Page, PageEvent, PageHandler, PageResolver, RouterInitParams, Visit } from './types'\nimport { hrefToUrl, isSameUrlWithoutHash } from './url'\n\nclass CurrentPage {\n  protected page!: Page\n  protected swapComponent!: PageHandler<any>\n  protected resolveComponent!: PageResolver\n  protected onFlashCallback?: (flash: Page['flash']) => void\n  protected componentId = {}\n  protected listeners: {\n    event: PageEvent\n    callback: VoidFunction\n  }[] = []\n  protected isFirstPageLoad = true\n  protected cleared = false\n  protected pendingDeferredProps: Pick<Page, 'deferredProps' | 'url' | 'component'> | null = null\n\n  public init<ComponentType = Component>({\n    initialPage,\n    swapComponent,\n    resolveComponent,\n    onFlash,\n  }: RouterInitParams<ComponentType>) {\n    this.page = { ...initialPage, flash: initialPage.flash ?? {} }\n    this.swapComponent = swapComponent\n    this.resolveComponent = resolveComponent\n    this.onFlashCallback = onFlash\n\n    return this\n  }\n\n  public set(\n    page: Page,\n    {\n      replace = false,\n      preserveScroll = false,\n      preserveState = false,\n      viewTransition = false,\n    }: {\n      replace?: boolean\n      preserveScroll?: boolean\n      preserveState?: boolean\n      viewTransition?: Visit['viewTransition']\n    } = {},\n  ): Promise<void> {\n    if (Object.keys(page.deferredProps || {}).length) {\n      this.pendingDeferredProps = {\n        deferredProps: page.deferredProps,\n        component: page.component,\n        url: page.url,\n      }\n    }\n\n    this.componentId = {}\n\n    const componentId = this.componentId\n\n    if (page.clearHistory) {\n      history.clear()\n    }\n\n    return this.resolve(page.component).then((component) => {\n      if (componentId !== this.componentId) {\n        // Component has changed since we started resolving this component, bail\n        return\n      }\n\n      page.rememberedState ??= {}\n\n      const isServer = typeof window === 'undefined'\n      const location = !isServer ? window.location : new URL(page.url)\n      const scrollRegions = !isServer && preserveScroll ? Scroll.getScrollRegions() : []\n      replace = replace || isSameUrlWithoutHash(hrefToUrl(page.url), location)\n\n      // Clear flash data from the page object, we don't want it when navigating back/forward...\n      const pageForHistory = { ...page, flash: {} }\n\n      return new Promise<void>((resolve) =>\n        replace ? history.replaceState(pageForHistory, resolve) : history.pushState(pageForHistory, resolve),\n      ).then(() => {\n        const isNewComponent = !this.isTheSame(page)\n\n        if (!isNewComponent && Object.keys(page.props.errors || {}).length > 0) {\n          // Don't use view transition if the page stays the same and there are (new) errors...\n          viewTransition = false\n        }\n\n        this.page = page\n        this.cleared = false\n\n        if (this.hasOnceProps()) {\n          prefetchedRequests.updateCachedOncePropsFromCurrentPage()\n        }\n\n        if (isNewComponent) {\n          this.fireEventsFor('newComponent')\n        }\n\n        if (this.isFirstPageLoad) {\n          this.fireEventsFor('firstLoad')\n        }\n\n        this.isFirstPageLoad = false\n\n        return this.swap({\n          component,\n          page,\n          preserveState,\n          viewTransition,\n        }).then(() => {\n          if (preserveScroll) {\n            // Scroll regions must be explicitly restored since the DOM elements are destroyed\n            // and recreated during the component 'swap'. Document scroll is naturally\n            // preserved as the document element itself persists across navigations.\n            window.requestAnimationFrame(() => Scroll.restoreScrollRegions(scrollRegions))\n          } else {\n            Scroll.reset()\n          }\n\n          if (\n            this.pendingDeferredProps &&\n            this.pendingDeferredProps.component === page.component &&\n            this.pendingDeferredProps.url === page.url\n          ) {\n            eventHandler.fireInternalEvent('loadDeferredProps', this.pendingDeferredProps.deferredProps)\n          }\n\n          this.pendingDeferredProps = null\n\n          if (!replace) {\n            fireNavigateEvent(page)\n          }\n        })\n      })\n    })\n  }\n\n  public setQuietly(\n    page: Page,\n    {\n      preserveState = false,\n    }: {\n      preserveState?: boolean\n    } = {},\n  ) {\n    return this.resolve(page.component).then((component) => {\n      this.page = page\n      this.cleared = false\n      history.setCurrent(page)\n      return this.swap({ component, page, preserveState, viewTransition: false })\n    })\n  }\n\n  public clear(): void {\n    this.cleared = true\n  }\n\n  public isCleared(): boolean {\n    return this.cleared\n  }\n\n  public get(): Page {\n    return this.page\n  }\n\n  public getWithoutFlashData(): Page {\n    return { ...this.page, flash: {} }\n  }\n\n  public hasOnceProps(): boolean {\n    return Object.keys(this.page.onceProps ?? {}).length > 0\n  }\n\n  public merge(data: Partial<Page>): void {\n    this.page = { ...this.page, ...data }\n  }\n\n  public setFlash(flash: FlashData): void {\n    this.page = { ...this.page, flash }\n    this.onFlashCallback?.(flash)\n  }\n\n  public setUrlHash(hash: string): void {\n    if (!this.page.url.includes(hash)) {\n      this.page.url += hash\n    }\n  }\n\n  public remember(data: Page['rememberedState']): void {\n    this.page.rememberedState = data\n  }\n\n  public swap({\n    component,\n    page,\n    preserveState,\n    viewTransition,\n  }: {\n    component: Component\n    page: Page\n    preserveState: boolean\n    viewTransition: Visit['viewTransition']\n  }): Promise<unknown> {\n    const doSwap = () => this.swapComponent({ component, page, preserveState })\n\n    if (!viewTransition || !document?.startViewTransition) {\n      return doSwap()\n    }\n\n    const viewTransitionCallback = typeof viewTransition === 'boolean' ? () => null : viewTransition\n\n    return new Promise((resolve) => {\n      const transitionResult = document.startViewTransition(() => doSwap().then(resolve))\n\n      viewTransitionCallback(transitionResult)\n    })\n  }\n\n  public resolve(component: string): Promise<Component> {\n    return Promise.resolve(this.resolveComponent(component))\n  }\n\n  public isTheSame(page: Page): boolean {\n    return this.page.component === page.component\n  }\n\n  public on(event: PageEvent, callback: VoidFunction): VoidFunction {\n    this.listeners.push({ event, callback })\n\n    return () => {\n      this.listeners = this.listeners.filter((listener) => listener.event !== event && listener.callback !== callback)\n    }\n  }\n\n  public fireEventsFor(event: PageEvent): void {\n    this.listeners.filter((listener) => listener.event === event).forEach((listener) => listener.callback())\n  }\n\n  public mergeOncePropsIntoResponse(response: Page, { force = false }: { force?: boolean } = {}): void {\n    Object.entries(response.onceProps ?? {}).forEach(([key, onceProp]) => {\n      const existingOnceProp = this.page.onceProps?.[key]\n\n      if (existingOnceProp === undefined) {\n        return\n      }\n\n      if (force || response.props[onceProp.prop] === undefined) {\n        response.props[onceProp.prop] = this.page.props[existingOnceProp.prop]\n        response.onceProps![key].expiresAt = existingOnceProp.expiresAt\n      }\n    })\n  }\n}\n\nexport const page = new CurrentPage()\n","export default class Queue<T> {\n  protected items: (() => T)[] = []\n  protected processingPromise: Promise<void> | null = null\n\n  public add(item: () => T) {\n    this.items.push(item)\n    return this.process()\n  }\n\n  public process() {\n    this.processingPromise ??= this.processNext().finally(() => {\n      this.processingPromise = null\n    })\n\n    return this.processingPromise\n  }\n\n  protected processNext(): Promise<void> {\n    const next = this.items.shift()\n\n    if (next) {\n      return Promise.resolve(next()).then(() => this.processNext())\n    }\n\n    return Promise.resolve()\n  }\n}\n","import debounce from './debounce'\nimport { fireNavigateEvent } from './events'\nimport { history } from './history'\nimport { router } from './index'\nimport { page as currentPage } from './page'\nimport { Scroll } from './scroll'\nimport { GlobalEvent, GlobalEventNames, GlobalEventResult, InternalEvent } from './types'\nimport { hrefToUrl } from './url'\n\nclass EventHandler {\n  protected internalListeners: {\n    event: InternalEvent\n    listener: (...args: any[]) => void\n  }[] = []\n\n  public init() {\n    if (typeof window !== 'undefined') {\n      window.addEventListener('popstate', this.handlePopstateEvent.bind(this))\n      window.addEventListener('scroll', debounce(Scroll.onWindowScroll.bind(Scroll), 100), true)\n    }\n\n    if (typeof document !== 'undefined') {\n      document.addEventListener('scroll', debounce(Scroll.onScroll.bind(Scroll), 100), true)\n    }\n  }\n\n  public onGlobalEvent<TEventName extends GlobalEventNames>(\n    type: TEventName,\n    callback: (event: GlobalEvent<TEventName>) => GlobalEventResult<TEventName>,\n  ): VoidFunction {\n    const listener = ((event: GlobalEvent<TEventName>) => {\n      const response = callback(event)\n\n      if (event.cancelable && !event.defaultPrevented && response === false) {\n        event.preventDefault()\n      }\n    }) as EventListener\n\n    return this.registerListener(`inertia:${type}`, listener)\n  }\n\n  public on(event: InternalEvent, callback: (...args: any[]) => void): VoidFunction {\n    this.internalListeners.push({ event, listener: callback })\n\n    return () => {\n      this.internalListeners = this.internalListeners.filter((listener) => listener.listener !== callback)\n    }\n  }\n\n  public onMissingHistoryItem() {\n    // At this point, the user has probably cleared the state\n    // Mark the current page as cleared so that we don't try to write anything to it.\n    currentPage.clear()\n    // Fire an event so that that any listeners can handle this situation\n    this.fireInternalEvent('missingHistoryItem')\n  }\n\n  public fireInternalEvent(event: InternalEvent, ...args: any[]): void {\n    this.internalListeners\n      .filter((listener) => listener.event === event)\n      .forEach((listener) => listener.listener(...args))\n  }\n\n  protected registerListener(type: string, listener: EventListener): VoidFunction {\n    document.addEventListener(type, listener)\n\n    return () => document.removeEventListener(type, listener)\n  }\n\n  protected handlePopstateEvent(event: PopStateEvent): void {\n    const state = event.state || null\n\n    if (state === null) {\n      const url = hrefToUrl(currentPage.get().url)\n      url.hash = window.location.hash\n\n      history.replaceState({ ...currentPage.getWithoutFlashData(), url: url.href })\n      Scroll.reset()\n\n      return\n    }\n\n    if (!history.isValidState(state)) {\n      return this.onMissingHistoryItem()\n    }\n\n    history\n      .decrypt(state.page)\n      .then((data) => {\n        if (currentPage.get().version !== data.version) {\n          this.onMissingHistoryItem()\n          return\n        }\n\n        // Cancel ongoing requests\n        router.cancelAll()\n\n        currentPage.setQuietly(data, { preserveState: false }).then(() => {\n          Scroll.restore(history.getScrollRegions())\n          fireNavigateEvent(currentPage.get())\n        })\n      })\n      .catch(() => {\n        this.onMissingHistoryItem()\n      })\n  }\n}\n\nexport const eventHandler = new EventHandler()\n","class NavigationType {\n  protected type: NavigationTimingType\n\n  public constructor() {\n    this.type = this.resolveType()\n  }\n\n  protected resolveType(): NavigationTimingType {\n    if (typeof window === 'undefined') {\n      return 'navigate'\n    }\n\n    if (\n      window.performance &&\n      window.performance.getEntriesByType &&\n      window.performance.getEntriesByType('navigation').length > 0\n    ) {\n      return (window.performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming).type\n    }\n\n    return 'navigate'\n  }\n\n  public get(): NavigationTimingType {\n    return this.type\n  }\n\n  public isBackForward(): boolean {\n    return this.type === 'back_forward'\n  }\n\n  public isReload(): boolean {\n    return this.type === 'reload'\n  }\n}\n\nexport const navigationType = new NavigationType()\n","import { eventHandler } from './eventHandler'\nimport { fireFlashEvent, fireNavigateEvent } from './events'\nimport { history } from './history'\nimport { navigationType } from './navigationType'\nimport { page as currentPage } from './page'\nimport { Scroll } from './scroll'\nimport { SessionStorage } from './sessionStorage'\nimport { LocationVisit, Page } from './types'\n\nexport class InitialVisit {\n  public static handle(): void {\n    this.clearRememberedStateOnReload()\n\n    const scenarios = [this.handleBackForward, this.handleLocation, this.handleDefault]\n\n    scenarios.find((handler) => handler.bind(this)())\n  }\n\n  protected static clearRememberedStateOnReload(): void {\n    if (navigationType.isReload()) {\n      history.deleteState(history.rememberedState)\n      history.clearInitialState(history.rememberedState)\n    }\n  }\n\n  protected static handleBackForward(): boolean {\n    if (!navigationType.isBackForward() || !history.hasAnyState()) {\n      return false\n    }\n\n    const scrollRegions = history.getScrollRegions()\n\n    history\n      .decrypt()\n      .then((data) => {\n        currentPage.set(data, { preserveScroll: true, preserveState: true }).then(() => {\n          Scroll.restore(scrollRegions)\n          fireNavigateEvent(currentPage.get())\n        })\n      })\n      .catch(() => {\n        eventHandler.onMissingHistoryItem()\n      })\n\n    return true\n  }\n\n  /**\n   * @link https://inertiajs.com/redirects#external-redirects\n   */\n  protected static handleLocation(): boolean {\n    if (!SessionStorage.exists(SessionStorage.locationVisitKey)) {\n      return false\n    }\n\n    const locationVisit: LocationVisit = SessionStorage.get(SessionStorage.locationVisitKey) || {}\n\n    SessionStorage.remove(SessionStorage.locationVisitKey)\n\n    if (typeof window !== 'undefined') {\n      currentPage.setUrlHash(window.location.hash)\n    }\n\n    history\n      .decrypt(currentPage.get())\n      .then(() => {\n        const rememberedState = history.getState<Page['rememberedState']>(history.rememberedState, {})\n        const scrollRegions = history.getScrollRegions()\n        currentPage.remember(rememberedState)\n\n        currentPage\n          .set(currentPage.get(), {\n            preserveScroll: locationVisit.preserveScroll,\n            preserveState: true,\n          })\n          .then(() => {\n            if (locationVisit.preserveScroll) {\n              Scroll.restore(scrollRegions)\n            }\n\n            fireNavigateEvent(currentPage.get())\n          })\n      })\n      .catch(() => {\n        eventHandler.onMissingHistoryItem()\n      })\n\n    return true\n  }\n\n  protected static handleDefault(): void {\n    if (typeof window !== 'undefined') {\n      currentPage.setUrlHash(window.location.hash)\n    }\n\n    currentPage.set(currentPage.get(), { preserveScroll: true, preserveState: true }).then(() => {\n      if (navigationType.isReload()) {\n        Scroll.restore(history.getScrollRegions())\n      } else {\n        Scroll.scrollToAnchor()\n      }\n\n      const page = currentPage.get()\n\n      fireNavigateEvent(page)\n\n      const flash = page.flash\n\n      if (Object.keys(flash).length > 0) {\n        fireFlashEvent(flash)\n      }\n    })\n  }\n}\n","import { PollOptions } from './types'\n\nexport class Poll {\n  protected id: number | null = null\n  protected throttle = false\n  protected keepAlive = false\n  protected cb: VoidFunction\n  protected interval: number\n  protected cbCount = 0\n\n  constructor(interval: number, cb: VoidFunction, options: PollOptions) {\n    this.keepAlive = options.keepAlive ?? false\n\n    this.cb = cb\n    this.interval = interval\n\n    if (options.autoStart ?? true) {\n      this.start()\n    }\n  }\n\n  public stop() {\n    // console.log('stopping...', this.id)\n    if (this.id) {\n      //   console.log('clearing interval...')\n      clearInterval(this.id)\n    }\n  }\n\n  public start() {\n    if (typeof window === 'undefined') {\n      return\n    }\n\n    this.stop()\n\n    this.id = window.setInterval(() => {\n      if (!this.throttle || this.cbCount % 10 === 0) {\n        this.cb()\n      }\n\n      if (this.throttle) {\n        this.cbCount++\n      }\n    }, this.interval)\n  }\n\n  public isInBackground(hidden: boolean) {\n    this.throttle = this.keepAlive ? false : hidden\n\n    if (this.throttle) {\n      this.cbCount = 0\n    }\n  }\n}\n","import { Poll } from './poll'\nimport { PollOptions } from './types'\n\nclass Polls {\n  protected polls: Poll[] = []\n\n  constructor() {\n    this.setupVisibilityListener()\n  }\n\n  public add(\n    interval: number,\n    cb: VoidFunction,\n    options: PollOptions,\n  ): {\n    stop: VoidFunction\n    start: VoidFunction\n  } {\n    const poll = new Poll(interval, cb, options)\n\n    this.polls.push(poll)\n\n    return {\n      stop: () => poll.stop(),\n      start: () => poll.start(),\n    }\n  }\n\n  public clear() {\n    this.polls.forEach((poll) => poll.stop())\n\n    this.polls = []\n  }\n\n  protected setupVisibilityListener() {\n    if (typeof document === 'undefined') {\n      return\n    }\n\n    document.addEventListener(\n      'visibilitychange',\n      () => {\n        this.polls.forEach((poll) => poll.isInBackground(document.hidden))\n      },\n      false,\n    )\n  }\n}\n\nexport const polls = new Polls()\n","import { default as axios, AxiosProgressEvent, AxiosRequestConfig } from 'axios'\nimport { fireExceptionEvent, fireFinishEvent, firePrefetchingEvent, fireProgressEvent, fireStartEvent } from './events'\nimport { page as currentPage } from './page'\nimport { RequestParams } from './requestParams'\nimport { Response } from './response'\nimport { ActiveVisit, Page } from './types'\nimport { urlWithoutHash } from './url'\n\nexport class Request {\n  protected response!: Response\n  protected cancelToken!: AbortController\n  protected requestParams: RequestParams\n  protected requestHasFinished = false\n\n  constructor(\n    params: ActiveVisit,\n    protected page: Page,\n  ) {\n    this.requestParams = RequestParams.create(params)\n    this.cancelToken = new AbortController()\n  }\n\n  public static create(params: ActiveVisit, page: Page): Request {\n    return new Request(params, page)\n  }\n\n  public async send() {\n    this.requestParams.onCancelToken(() => this.cancel({ cancelled: true }))\n\n    fireStartEvent(this.requestParams.all())\n    this.requestParams.onStart()\n\n    if (this.requestParams.all().prefetch) {\n      this.requestParams.onPrefetching()\n      firePrefetchingEvent(this.requestParams.all())\n    }\n\n    // We capture this up here because the response\n    // will clear the prefetch flag so it can use it\n    // as a regular response once the prefetch is done\n    const originallyPrefetch = this.requestParams.all().prefetch\n\n    return axios({\n      method: this.requestParams.all().method,\n      url: urlWithoutHash(this.requestParams.all().url).href,\n      data: this.requestParams.data(),\n      params: this.requestParams.queryParams(),\n      signal: this.cancelToken.signal,\n      headers: this.getHeaders(),\n      onUploadProgress: this.onProgress.bind(this),\n      // Why text? This allows us to delay JSON.parse until we're ready to use the response,\n      // helps with performance particularly on large responses + history encryption\n      responseType: 'text',\n    })\n      .then((response) => {\n        this.response = Response.create(this.requestParams, response, this.page)\n\n        return this.response.handle()\n      })\n      .catch((error) => {\n        if (error?.response) {\n          this.response = Response.create(this.requestParams, error.response, this.page)\n\n          return this.response.handle()\n        }\n\n        return Promise.reject(error)\n      })\n      .catch((error) => {\n        if (axios.isCancel(error)) {\n          return\n        }\n\n        if (fireExceptionEvent(error)) {\n          if (originallyPrefetch) {\n            this.requestParams.onPrefetchError(error)\n          }\n\n          return Promise.reject(error)\n        }\n      })\n      .finally(() => {\n        this.finish()\n\n        if (originallyPrefetch && this.response) {\n          this.requestParams.onPrefetchResponse(this.response)\n        }\n      })\n  }\n\n  protected finish(): void {\n    if (this.requestParams.wasCancelledAtAll()) {\n      return\n    }\n\n    this.requestParams.markAsFinished()\n    this.fireFinishEvents()\n  }\n\n  protected fireFinishEvents(): void {\n    if (this.requestHasFinished) {\n      // This could be called from multiple places, don't let it re-fire\n      return\n    }\n\n    this.requestHasFinished = true\n\n    fireFinishEvent(this.requestParams.all())\n    this.requestParams.onFinish()\n  }\n\n  public cancel({ cancelled = false, interrupted = false }: { cancelled?: boolean; interrupted?: boolean }): void {\n    if (this.requestHasFinished) {\n      // If the request has already finished, there's no need to cancel it\n      return\n    }\n\n    this.cancelToken.abort()\n\n    this.requestParams.markAsCancelled({ cancelled, interrupted })\n\n    this.fireFinishEvents()\n  }\n\n  protected onProgress(progress: AxiosProgressEvent): void {\n    if (this.requestParams.data() instanceof FormData) {\n      progress.percentage = progress.progress ? Math.round(progress.progress * 100) : 0\n      fireProgressEvent(progress)\n      this.requestParams.all().onProgress(progress)\n    }\n  }\n\n  protected getHeaders(): AxiosRequestConfig['headers'] {\n    const headers: AxiosRequestConfig['headers'] = {\n      ...this.requestParams.headers(),\n      Accept: 'text/html, application/xhtml+xml',\n      'X-Requested-With': 'XMLHttpRequest',\n      'X-Inertia': true,\n    }\n\n    const page = currentPage.get()\n\n    if (page.version) {\n      headers['X-Inertia-Version'] = page.version\n    }\n\n    const onceProps = Object.entries(page.onceProps || {})\n      .filter(([, onceProp]) => {\n        if (page.props[onceProp.prop] === undefined) {\n          // The prop could deferred and not be loaded yet\n          return false\n        }\n\n        return !onceProp.expiresAt || onceProp.expiresAt > Date.now()\n      })\n      .map(([key]) => key)\n\n    if (onceProps.length > 0) {\n      headers['X-Inertia-Except-Once-Props'] = onceProps.join(',')\n    }\n\n    return headers\n  }\n}\n","import { AxiosRequestConfig } from 'axios'\nimport { page as currentPage } from './page'\nimport { Response } from './response'\nimport { ActiveVisit, InternalActiveVisit, Page, PreserveStateOption, VisitCallbacks } from './types'\n\nexport class RequestParams {\n  protected callbacks: {\n    name: keyof VisitCallbacks\n    args: any[]\n  }[] = []\n\n  protected params: InternalActiveVisit\n\n  constructor(params: InternalActiveVisit) {\n    if (!params.prefetch) {\n      this.params = params\n    } else {\n      const wrappedCallbacks: Record<keyof VisitCallbacks, () => any> = {\n        onBefore: this.wrapCallback(params, 'onBefore'),\n        onBeforeUpdate: this.wrapCallback(params, 'onBeforeUpdate'),\n        onStart: this.wrapCallback(params, 'onStart'),\n        onProgress: this.wrapCallback(params, 'onProgress'),\n        onFinish: this.wrapCallback(params, 'onFinish'),\n        onCancel: this.wrapCallback(params, 'onCancel'),\n        onSuccess: this.wrapCallback(params, 'onSuccess'),\n        onError: this.wrapCallback(params, 'onError'),\n        onFlash: this.wrapCallback(params, 'onFlash'),\n        onCancelToken: this.wrapCallback(params, 'onCancelToken'),\n        onPrefetched: this.wrapCallback(params, 'onPrefetched'),\n        onPrefetching: this.wrapCallback(params, 'onPrefetching'),\n      }\n\n      this.params = {\n        ...params,\n        ...wrappedCallbacks,\n        onPrefetchResponse: params.onPrefetchResponse || (() => {}),\n        onPrefetchError: params.onPrefetchError || (() => {}),\n      }\n    }\n    //\n  }\n\n  public static create(params: ActiveVisit): RequestParams {\n    return new RequestParams(params)\n  }\n\n  public data() {\n    return this.params.method === 'get' ? null : this.params.data\n  }\n\n  public queryParams() {\n    return this.params.method === 'get' ? this.params.data : {}\n  }\n\n  public isPartial() {\n    return this.params.only.length > 0 || this.params.except.length > 0 || this.params.reset.length > 0\n  }\n\n  public isDeferredPropsRequest() {\n    return this.params.deferredProps === true\n  }\n\n  public onCancelToken(cb: VoidFunction) {\n    this.params.onCancelToken({\n      cancel: cb,\n    })\n  }\n\n  public markAsFinished() {\n    this.params.completed = true\n    this.params.cancelled = false\n    this.params.interrupted = false\n  }\n\n  public markAsCancelled({ cancelled = true, interrupted = false }) {\n    this.params.onCancel()\n\n    this.params.completed = false\n    this.params.cancelled = cancelled\n    this.params.interrupted = interrupted\n  }\n\n  public wasCancelledAtAll() {\n    return this.params.cancelled || this.params.interrupted\n  }\n\n  public onFinish() {\n    this.params.onFinish(this.params)\n  }\n\n  public onStart() {\n    this.params.onStart(this.params)\n  }\n\n  public onPrefetching() {\n    this.params.onPrefetching(this.params)\n  }\n\n  public onPrefetchResponse(response: Response) {\n    if (this.params.onPrefetchResponse) {\n      this.params.onPrefetchResponse(response)\n    }\n  }\n\n  public onPrefetchError(error: Error) {\n    if (this.params.onPrefetchError) {\n      this.params.onPrefetchError(error)\n    }\n  }\n\n  public all() {\n    return this.params\n  }\n\n  public headers(): AxiosRequestConfig['headers'] {\n    const headers: AxiosRequestConfig['headers'] = {\n      ...this.params.headers,\n    }\n\n    if (this.isPartial()) {\n      headers['X-Inertia-Partial-Component'] = currentPage.get().component\n    }\n\n    const only = this.params.only.concat(this.params.reset)\n\n    if (only.length > 0) {\n      headers['X-Inertia-Partial-Data'] = only.join(',')\n    }\n\n    if (this.params.except.length > 0) {\n      headers['X-Inertia-Partial-Except'] = this.params.except.join(',')\n    }\n\n    if (this.params.reset.length > 0) {\n      headers['X-Inertia-Reset'] = this.params.reset.join(',')\n    }\n\n    if (this.params.errorBag && this.params.errorBag.length > 0) {\n      headers['X-Inertia-Error-Bag'] = this.params.errorBag\n    }\n\n    return headers\n  }\n\n  public setPreserveOptions(page: Page) {\n    this.params.preserveScroll = RequestParams.resolvePreserveOption(this.params.preserveScroll, page)\n    this.params.preserveState = RequestParams.resolvePreserveOption(this.params.preserveState, page)\n  }\n\n  public runCallbacks() {\n    this.callbacks.forEach(({ name, args }) => {\n      // @ts-ignore\n      this.params[name](...args)\n    })\n  }\n\n  public merge(toMerge: Partial<ActiveVisit>) {\n    this.params = {\n      ...this.params,\n      ...toMerge,\n    }\n  }\n\n  protected wrapCallback(params: ActiveVisit, name: keyof VisitCallbacks) {\n    // @ts-ignore\n    return (...args) => {\n      this.recordCallback(name, args)\n      // @ts-ignore\n      params[name](...args)\n    }\n  }\n\n  protected recordCallback(name: keyof VisitCallbacks, args: any[]) {\n    this.callbacks.push({ name, args })\n  }\n\n  public static resolvePreserveOption(value: PreserveStateOption, page: Page): boolean {\n    if (typeof value === 'function') {\n      return value(page)\n    }\n\n    if (value === 'errors') {\n      return Object.keys(page.props.errors || {}).length > 0\n    }\n\n    return value\n  }\n}\n","import { AxiosResponse } from 'axios'\nimport { get, isEqual, set } from 'lodash-es'\nimport { config, router } from '.'\nimport dialog from './dialog'\nimport {\n  fireBeforeUpdateEvent,\n  fireErrorEvent,\n  fireFlashEvent,\n  fireInvalidEvent,\n  firePrefetchedEvent,\n  fireSuccessEvent,\n} from './events'\nimport { history } from './history'\nimport modal from './modal'\nimport { page as currentPage } from './page'\nimport Queue from './queue'\nimport { RequestParams } from './requestParams'\nimport { SessionStorage } from './sessionStorage'\nimport { ActiveVisit, ErrorBag, Errors, Page } from './types'\nimport { hrefToUrl, isSameUrlWithoutHash, setHashIfSameUrl } from './url'\n\nconst queue = new Queue<Promise<boolean | void>>()\n\nexport class Response {\n  protected wasPrefetched = false\n\n  constructor(\n    protected requestParams: RequestParams,\n    protected response: AxiosResponse,\n    protected originatingPage: Page,\n  ) {}\n\n  public static create(params: RequestParams, response: AxiosResponse, originatingPage: Page): Response {\n    return new Response(params, response, originatingPage)\n  }\n\n  public async handlePrefetch() {\n    if (isSameUrlWithoutHash(this.requestParams.all().url, window.location)) {\n      this.handle()\n    }\n  }\n\n  public async handle() {\n    return queue.add(() => this.process())\n  }\n\n  public async process() {\n    if (this.requestParams.all().prefetch) {\n      this.wasPrefetched = true\n      this.requestParams.all().prefetch = false\n\n      this.requestParams.all().onPrefetched(this.response, this.requestParams.all())\n      firePrefetchedEvent(this.response, this.requestParams.all())\n\n      return Promise.resolve()\n    }\n\n    this.requestParams.runCallbacks()\n\n    if (!this.isInertiaResponse()) {\n      return this.handleNonInertiaResponse()\n    }\n\n    await history.processQueue()\n\n    history.preserveUrl = this.requestParams.all().preserveUrl\n\n    const previousFlash = currentPage.get().flash\n\n    await this.setPage()\n\n    const errors = currentPage.get().props.errors || {}\n\n    if (Object.keys(errors).length > 0) {\n      const scopedErrors = this.getScopedErrors(errors)\n\n      fireErrorEvent(scopedErrors)\n\n      return this.requestParams.all().onError(scopedErrors)\n    }\n\n    router.flushByCacheTags(this.requestParams.all().invalidateCacheTags || [])\n\n    if (!this.wasPrefetched) {\n      // We end up here other than from the prefetch cache, so we assume this response is\n      // never than the cached one and therefore flush the cache.\n      router.flush(currentPage.get().url)\n    }\n\n    const { flash } = currentPage.get()\n\n    if (Object.keys(flash).length > 0 && (!this.requestParams.isPartial() || !isEqual(flash, previousFlash))) {\n      fireFlashEvent(flash)\n      this.requestParams.all().onFlash(flash)\n    }\n\n    fireSuccessEvent(currentPage.get())\n\n    await this.requestParams.all().onSuccess(currentPage.get())\n\n    history.preserveUrl = false\n  }\n\n  public mergeParams(params: ActiveVisit) {\n    this.requestParams.merge(params)\n  }\n\n  public getPageResponse(): Page {\n    const data = this.getDataFromResponse(this.response.data)\n    return (this.response.data = { ...data, flash: data.flash ?? {} })\n  }\n\n  protected async handleNonInertiaResponse() {\n    if (this.isLocationVisit()) {\n      const locationUrl = hrefToUrl(this.getHeader('x-inertia-location'))\n\n      setHashIfSameUrl(this.requestParams.all().url, locationUrl)\n\n      return this.locationVisit(locationUrl)\n    }\n\n    const response = {\n      ...this.response,\n      data: this.getDataFromResponse(this.response.data),\n    }\n\n    if (fireInvalidEvent(response)) {\n      return config.get('future.useDialogForErrorModal') ? dialog.show(response.data) : modal.show(response.data)\n    }\n  }\n\n  protected isInertiaResponse(): boolean {\n    return this.hasHeader('x-inertia')\n  }\n\n  protected hasStatus(status: number): boolean {\n    return this.response.status === status\n  }\n\n  protected getHeader(header: string): string {\n    return this.response.headers[header]\n  }\n\n  protected hasHeader(header: string): boolean {\n    return this.getHeader(header) !== undefined\n  }\n\n  protected isLocationVisit(): boolean {\n    return this.hasStatus(409) && this.hasHeader('x-inertia-location')\n  }\n\n  /**\n   * @link https://inertiajs.com/redirects#external-redirects\n   */\n  protected locationVisit(url: URL): boolean | void {\n    try {\n      SessionStorage.set(SessionStorage.locationVisitKey, {\n        preserveScroll: this.requestParams.all().preserveScroll === true,\n      })\n\n      if (typeof window === 'undefined') {\n        return\n      }\n\n      if (isSameUrlWithoutHash(window.location, url)) {\n        window.location.reload()\n      } else {\n        window.location.href = url.href\n      }\n    } catch (error) {\n      return false\n    }\n  }\n\n  protected async setPage(): Promise<void> {\n    const pageResponse = this.getPageResponse()\n\n    if (!this.shouldSetPage(pageResponse)) {\n      return Promise.resolve()\n    }\n\n    this.mergeProps(pageResponse)\n    currentPage.mergeOncePropsIntoResponse(pageResponse)\n    this.preserveEqualProps(pageResponse)\n\n    await this.setRememberedState(pageResponse)\n\n    this.requestParams.setPreserveOptions(pageResponse)\n\n    pageResponse.url = history.preserveUrl ? currentPage.get().url : this.pageUrl(pageResponse)\n\n    this.requestParams.all().onBeforeUpdate(pageResponse)\n    fireBeforeUpdateEvent(pageResponse)\n\n    return currentPage.set(pageResponse, {\n      replace: this.requestParams.all().replace,\n      preserveScroll: this.requestParams.all().preserveScroll as boolean,\n      preserveState: this.requestParams.all().preserveState as boolean,\n      viewTransition: this.requestParams.all().viewTransition,\n    })\n  }\n\n  protected getDataFromResponse(response: any): any {\n    if (typeof response !== 'string') {\n      return response\n    }\n\n    try {\n      return JSON.parse(response)\n    } catch (error) {\n      return response\n    }\n  }\n\n  protected shouldSetPage(pageResponse: Page): boolean {\n    if (!this.requestParams.all().async) {\n      // If the request is sync, we should always set the page\n      return true\n    }\n\n    if (this.originatingPage.component !== pageResponse.component) {\n      // We originated from a component but the response re-directed us,\n      // we should respect the redirection and set the page\n      return true\n    }\n\n    // At this point, if the originating request component is different than the current component,\n    // the user has since navigated and we should discard the response\n    if (this.originatingPage.component !== currentPage.get().component) {\n      return false\n    }\n\n    const originatingUrl = hrefToUrl(this.originatingPage.url)\n    const currentPageUrl = hrefToUrl(currentPage.get().url)\n\n    // We have the same component, let's double-check the URL\n    // If we're no longer on the same path name (e.g. /users/1 -> /users/2), we should not set the page\n    return originatingUrl.origin === currentPageUrl.origin && originatingUrl.pathname === currentPageUrl.pathname\n  }\n\n  protected pageUrl(pageResponse: Page) {\n    const responseUrl = hrefToUrl(pageResponse.url)\n\n    setHashIfSameUrl(this.requestParams.all().url, responseUrl)\n\n    return responseUrl.pathname + responseUrl.search + responseUrl.hash\n  }\n\n  protected preserveEqualProps(pageResponse: Page): void {\n    if (pageResponse.component !== currentPage.get().component || config.get('future.preserveEqualProps') !== true) {\n      return\n    }\n\n    const currentPageProps = currentPage.get().props\n\n    Object.entries(pageResponse.props).forEach(([key, value]) => {\n      if (isEqual(value, currentPageProps[key])) {\n        pageResponse.props[key] = currentPageProps[key]\n      }\n    })\n  }\n\n  protected mergeProps(pageResponse: Page): void {\n    if (!this.requestParams.isPartial() || pageResponse.component !== currentPage.get().component) {\n      return\n    }\n\n    const propsToAppend = pageResponse.mergeProps || []\n    const propsToPrepend = pageResponse.prependProps || []\n    const propsToDeepMerge = pageResponse.deepMergeProps || []\n    const matchPropsOn = pageResponse.matchPropsOn || []\n\n    const mergeProp = (prop: string, shouldAppend: boolean) => {\n      const currentProp = get(currentPage.get().props, prop)\n      const incomingProp = get(pageResponse.props, prop)\n\n      if (Array.isArray(incomingProp)) {\n        const newArray = this.mergeOrMatchItems(\n          (currentProp || []) as any[],\n          incomingProp,\n          prop,\n          matchPropsOn,\n          shouldAppend,\n        )\n\n        set(pageResponse.props, prop, newArray)\n      } else if (typeof incomingProp === 'object' && incomingProp !== null) {\n        const newObject = {\n          ...(currentProp || {}),\n          ...incomingProp,\n        }\n\n        set(pageResponse.props, prop, newObject)\n      }\n    }\n\n    propsToAppend.forEach((prop) => mergeProp(prop, true))\n    propsToPrepend.forEach((prop) => mergeProp(prop, false))\n\n    propsToDeepMerge.forEach((prop) => {\n      const currentProp = currentPage.get().props[prop]\n      const incomingProp = pageResponse.props[prop]\n\n      // Function to recursively merge objects and arrays\n      const deepMerge = (target: any, source: any, matchProp: string) => {\n        if (Array.isArray(source)) {\n          return this.mergeOrMatchItems(target, source, matchProp, matchPropsOn)\n        }\n\n        if (typeof source === 'object' && source !== null) {\n          // Merge objects by iterating over keys\n          return Object.keys(source).reduce(\n            (acc, key) => {\n              acc[key] = deepMerge(target ? target[key] : undefined, source[key], `${matchProp}.${key}`)\n              return acc\n            },\n            { ...target },\n          )\n        }\n\n        // If the source is neither an array nor an object, simply return the it\n        return source\n      }\n\n      // Apply the deep merge and update the page response\n      pageResponse.props[prop] = deepMerge(currentProp, incomingProp, prop)\n    })\n\n    pageResponse.props = { ...currentPage.get().props, ...pageResponse.props }\n\n    if (this.requestParams.isDeferredPropsRequest()) {\n      const currentErrors = currentPage.get().props.errors\n\n      if (currentErrors && Object.keys(currentErrors).length > 0) {\n        // Preserve existing errors during deferred props requests\n        pageResponse.props.errors = currentErrors\n      }\n    }\n\n    // Preserve the existing scrollProps\n    if (currentPage.get().scrollProps) {\n      pageResponse.scrollProps = {\n        ...(currentPage.get().scrollProps || {}),\n        ...(pageResponse.scrollProps || {}),\n      }\n    }\n\n    // Preserve the existing onceProps\n    if (currentPage.hasOnceProps()) {\n      pageResponse.onceProps = {\n        ...(currentPage.get().onceProps || {}),\n        ...(pageResponse.onceProps || {}),\n      }\n    }\n\n    // Preserve flash data and merge with new flash data on non-deferred requests\n    pageResponse.flash = {\n      ...currentPage.get().flash,\n      ...(this.requestParams.isDeferredPropsRequest() ? {} : pageResponse.flash),\n    }\n  }\n\n  protected mergeOrMatchItems(\n    existingItems: any[],\n    newItems: any[],\n    matchProp: string,\n    matchPropsOn: string[],\n    shouldAppend = true,\n  ) {\n    const items = Array.isArray(existingItems) ? existingItems : []\n\n    // Find the matching key for this specific property path\n    const matchingKey = matchPropsOn.find((key) => {\n      const keyPath = key.split('.').slice(0, -1).join('.')\n\n      return keyPath === matchProp\n    })\n\n    // If no matching key is configured, simply concatenate the arrays\n    if (!matchingKey) {\n      return shouldAppend ? [...items, ...newItems] : [...newItems, ...items]\n    }\n\n    // Extract the property name we'll use to match items (e.g., 'id' from 'users.data.id')\n    const uniqueProperty = matchingKey.split('.').pop() || ''\n\n    // Create a map of new items by their unique property lookups\n    const newItemsMap = new Map()\n\n    newItems.forEach((item) => {\n      if (this.hasUniqueProperty(item, uniqueProperty)) {\n        newItemsMap.set(item[uniqueProperty], item)\n      }\n    })\n\n    return shouldAppend\n      ? this.appendWithMatching(items, newItems, newItemsMap, uniqueProperty)\n      : this.prependWithMatching(items, newItems, newItemsMap, uniqueProperty)\n  }\n\n  protected appendWithMatching(\n    existingItems: any[],\n    newItems: any[],\n    newItemsMap: Map<any, any>,\n    uniqueProperty: string,\n  ): any[] {\n    // Update existing items with new values, keep non-matching items\n    const updatedExisting = existingItems.map((item) => {\n      if (this.hasUniqueProperty(item, uniqueProperty) && newItemsMap.has(item[uniqueProperty])) {\n        return newItemsMap.get(item[uniqueProperty])\n      }\n\n      return item\n    })\n\n    // Filter new items to only include those not already in existing items\n    const newItemsToAdd = newItems.filter((item) => {\n      if (!this.hasUniqueProperty(item, uniqueProperty)) {\n        return true // Always add items without unique property\n      }\n\n      return !existingItems.some(\n        (existing) =>\n          this.hasUniqueProperty(existing, uniqueProperty) && existing[uniqueProperty] === item[uniqueProperty],\n      )\n    })\n\n    return [...updatedExisting, ...newItemsToAdd]\n  }\n\n  protected prependWithMatching(\n    existingItems: any[],\n    newItems: any[],\n    newItemsMap: Map<any, any>,\n    uniqueProperty: string,\n  ): any[] {\n    // Filter existing items, keeping only those not being updated\n    const untouchedExisting = existingItems.filter((item) => {\n      if (this.hasUniqueProperty(item, uniqueProperty)) {\n        return !newItemsMap.has(item[uniqueProperty])\n      }\n\n      return true\n    })\n\n    return [...newItems, ...untouchedExisting]\n  }\n\n  protected hasUniqueProperty(item: any, property: string): boolean {\n    return item && typeof item === 'object' && property in item\n  }\n\n  protected async setRememberedState(pageResponse: Page): Promise<void> {\n    const rememberedState = await history.getState<Page['rememberedState']>(history.rememberedState, {})\n\n    if (\n      this.requestParams.all().preserveState &&\n      rememberedState &&\n      pageResponse.component === currentPage.get().component\n    ) {\n      pageResponse.rememberedState = rememberedState\n    }\n  }\n\n  protected getScopedErrors(errors: Errors & ErrorBag): Errors {\n    if (!this.requestParams.all().errorBag) {\n      return errors\n    }\n\n    return errors[this.requestParams.all().errorBag || ''] || {}\n  }\n}\n","export default {\n  modal: null,\n  listener: null,\n\n  createIframeAndPage(html: Record<string, unknown> | string): { iframe: HTMLIFrameElement; page: HTMLElement } {\n    if (typeof html === 'object') {\n      html = `All Inertia requests must receive a valid Inertia response, however a plain JSON response was received.<hr>${JSON.stringify(\n        html,\n      )}`\n    }\n\n    const page = document.createElement('html')\n    page.innerHTML = html\n    page.querySelectorAll('a').forEach((a) => a.setAttribute('target', '_top'))\n\n    const iframe = document.createElement('iframe')\n    iframe.style.backgroundColor = 'white'\n    iframe.style.borderRadius = '5px'\n    iframe.style.width = '100%'\n    iframe.style.height = '100%'\n\n    return { iframe, page }\n  },\n\n  show(html: Record<string, unknown> | string): void {\n    const { iframe, page } = this.createIframeAndPage(html)\n\n    this.modal = document.createElement('div')\n    this.modal.style.position = 'fixed'\n    this.modal.style.width = '100vw'\n    this.modal.style.height = '100vh'\n    this.modal.style.padding = '50px'\n    this.modal.style.boxSizing = 'border-box'\n    this.modal.style.backgroundColor = 'rgba(0, 0, 0, .6)'\n    this.modal.style.zIndex = 200000\n    this.modal.addEventListener('click', () => this.hide())\n    this.modal.appendChild(iframe)\n\n    document.body.prepend(this.modal)\n    document.body.style.overflow = 'hidden'\n    if (!iframe.contentWindow) {\n      throw new Error('iframe not yet ready.')\n    }\n    iframe.contentWindow.document.open()\n    iframe.contentWindow.document.write(page.outerHTML)\n    iframe.contentWindow.document.close()\n\n    this.listener = this.hideOnEscape.bind(this)\n    document.addEventListener('keydown', this.listener)\n  },\n\n  hide(): void {\n    this.modal.outerHTML = ''\n    this.modal = null\n    document.body.style.overflow = 'visible'\n    document.removeEventListener('keydown', this.listener)\n  },\n\n  hideOnEscape(event: KeyboardEvent): void {\n    if (event.keyCode === 27) {\n      this.hide()\n    }\n  },\n}\n","import modal from './modal'\n\nexport default {\n  show(html: Record<string, unknown> | string): void {\n    const { iframe, page } = modal.createIframeAndPage(html)\n\n    iframe.style.boxSizing = 'border-box'\n    iframe.style.display = 'block'\n\n    const dialog = document.createElement('dialog')\n    dialog.id = 'inertia-error-dialog'\n\n    // Style the dialog to mimic 50px padding\n    Object.assign(dialog.style, {\n      width: 'calc(100vw - 100px)',\n      height: 'calc(100vh - 100px)',\n      padding: '0',\n      margin: 'auto',\n      border: 'none',\n      backgroundColor: 'transparent',\n    })\n\n    // There's no way to directly style the backdrop of a dialog, so we need to use a style element...\n    const dialogStyleElement = document.createElement('style')\n    dialogStyleElement.textContent = `\n      dialog#inertia-error-dialog::backdrop {\n        background-color: rgba(0, 0, 0, 0.6);\n      }\n\n      dialog#inertia-error-dialog:focus {\n        outline: none;\n      }\n    `\n    document.head.appendChild(dialogStyleElement)\n\n    dialog.addEventListener('click', (event: MouseEvent) => {\n      if (event.target === dialog) {\n        dialog.close()\n      }\n    })\n\n    dialog.addEventListener('close', () => {\n      dialogStyleElement.remove()\n      dialog.remove()\n    })\n\n    dialog.appendChild(iframe)\n    document.body.prepend(dialog)\n    dialog.showModal()\n\n    // Focus the dialog so the 'Escape' key works immediately\n    dialog.focus()\n\n    if (!iframe.contentWindow) {\n      throw new Error('iframe not yet ready.')\n    }\n\n    iframe.contentWindow.document.open()\n    iframe.contentWindow.document.write(page.outerHTML)\n    iframe.contentWindow.document.close()\n  },\n}\n","import { Request } from './request'\n\nexport class RequestStream {\n  protected requests: Request[] = []\n\n  protected maxConcurrent: number\n\n  protected interruptible: boolean\n\n  constructor({ maxConcurrent, interruptible }: { maxConcurrent: number; interruptible: boolean }) {\n    this.maxConcurrent = maxConcurrent\n    this.interruptible = interruptible\n  }\n\n  public send(request: Request) {\n    this.requests.push(request)\n\n    request.send().then(() => {\n      this.requests = this.requests.filter((r) => r !== request)\n    })\n  }\n\n  public interruptInFlight(): void {\n    this.cancel({ interrupted: true }, false)\n  }\n\n  public cancelInFlight(): void {\n    this.cancel({ cancelled: true }, true)\n  }\n\n  protected cancel({ cancelled = false, interrupted = false } = {}, force: boolean): void {\n    if (!this.shouldCancel(force)) {\n      return\n    }\n\n    const request = this.requests.shift()!\n\n    request?.cancel({ interrupted, cancelled })\n  }\n\n  protected shouldCancel(force: boolean): boolean {\n    if (force) {\n      return true\n    }\n\n    return this.interruptible && this.requests.length >= this.maxConcurrent\n  }\n}\n","import { NamedInputEvent, ValidationConfig } from 'laravel-precognition'\nimport {\n  FormDataType,\n  Method,\n  UrlMethodPair,\n  UseFormArguments,\n  UseFormSubmitArguments,\n  UseFormSubmitOptions,\n} from './types'\nimport { isUrlMethodPair } from './url'\n\nexport class UseFormUtils {\n  /**\n   * Creates a callback that returns a UrlMethodPair.\n   *\n   * createWayfinderCallback(urlMethodPair)\n   * createWayfinderCallback(method, url)\n   * createWayfinderCallback(() => urlMethodPair)\n   * createWayfinderCallback(() => method, () => url)\n   */\n  public static createWayfinderCallback(\n    ...args: [UrlMethodPair | (() => UrlMethodPair)] | [Method | (() => Method), string | (() => string)]\n  ): () => UrlMethodPair {\n    return () => {\n      if (args.length === 1) {\n        // Wayfinder object, return as-is or call function...\n        return isUrlMethodPair(args[0]) ? args[0] : args[0]()\n      }\n\n      // Separate method and url, reconstruct Wayfinder object...\n      return {\n        method: typeof args[0] === 'function' ? args[0]() : args[0],\n        url: typeof args[1] === 'function' ? args[1]() : args[1],\n      }\n    }\n  }\n\n  /**\n   * Parses all useForm() arguments into { rememberKey, data, precognitionEndpoint }.\n   *\n   * useForm(data)\n   * useForm(rememberKey, data)\n   * useForm(method, url, data)\n   * useForm(urlMethodPair, data)\n   *\n   */\n  public static parseUseFormArguments<TForm extends FormDataType<TForm>>(\n    ...args: UseFormArguments<TForm>\n  ): {\n    rememberKey: string | null\n    data: TForm | (() => TForm)\n    precognitionEndpoint: (() => UrlMethodPair) | null\n  } {\n    if (args.length === 1) {\n      // Basic form: useForm(data)\n      return {\n        rememberKey: null,\n        data: args[0],\n        precognitionEndpoint: null,\n      }\n    }\n\n    if (args.length === 2) {\n      if (typeof args[0] === 'string') {\n        // Rememberable form: useForm(rememberKey, data)\n        return {\n          rememberKey: args[0],\n          data: args[1],\n          precognitionEndpoint: null,\n        }\n      }\n\n      // Form with Precognition + Wayfinder: useForm(wayfinder, data)\n      return {\n        rememberKey: null,\n        data: args[1],\n        precognitionEndpoint: this.createWayfinderCallback(args[0]),\n      }\n    }\n\n    // Form with Precognition: useForm(method, url, data)\n    return {\n      rememberKey: null,\n      data: args[2],\n      precognitionEndpoint: this.createWayfinderCallback(args[0], args[1]),\n    }\n  }\n\n  /**\n   * Parses all submission arguments into { method, url, options }.\n   * It uses the Precognition endpoint if no explicit method/url are provided.\n   *\n   * form.submit(method, url)\n   * form.submit(method, url, options)\n   * form.submit(urlMethodPair)\n   * form.submit(urlMethodPair, options)\n   * form.submit()\n   * form.submit(options)\n   */\n  public static parseSubmitArguments(\n    args: UseFormSubmitArguments,\n    precognitionEndpoint: (() => UrlMethodPair) | null,\n  ): { method: Method; url: string; options: UseFormSubmitOptions } {\n    if (args.length === 3 || (args.length === 2 && typeof args[0] === 'string')) {\n      // Explicit method and url provided...\n      return { method: args[0], url: args[1], options: args[2] ?? {} }\n    }\n\n    if (isUrlMethodPair(args[0])) {\n      // Wayfinder object provided...\n      return { ...args[0], options: (args[1] as UseFormSubmitOptions) ?? {} }\n    }\n\n    // Use Precognition endpoint with optional options...\n    return { ...precognitionEndpoint!(), options: (args[0] as UseFormSubmitOptions) ?? {} }\n  }\n\n  /**\n   * Merges headers into the Precognition validate() arguments.\n   */\n  public static mergeHeadersForValidation(\n    field?: string | NamedInputEvent | ValidationConfig,\n    config?: ValidationConfig,\n    headers?: Record<string, string>,\n  ): [string | NamedInputEvent | ValidationConfig | undefined, ValidationConfig | undefined] {\n    const merge = (config: ValidationConfig): ValidationConfig => {\n      config.headers = {\n        ...(headers ?? {}),\n        ...(config.headers ?? {}),\n      }\n\n      return config\n    }\n\n    if (field && typeof field === 'object' && !('target' in field)) {\n      field = merge(field)\n    } else if (config && typeof config === 'object') {\n      config = merge(config)\n    } else if (typeof field === 'string') {\n      config = merge(config ?? {})\n    } else {\n      field = merge(field ?? {})\n    }\n\n    return [field, config]\n  }\n}\n","const elementInViewport = (el: HTMLElement) => {\n  if (el.offsetParent === null) {\n    // Element is not participating in layout (e.g., display: none)\n    return false\n  }\n\n  const rect = el.getBoundingClientRect()\n\n  // We check both vertically and horizontally for containers that scroll in either direction\n  const verticallyVisible = rect.top < window.innerHeight && rect.bottom >= 0\n  const horizontallyVisible = rect.left < window.innerWidth && rect.right >= 0\n\n  return verticallyVisible && horizontallyVisible\n}\n\nexport const getScrollableParent = (element: HTMLElement | null): HTMLElement | null => {\n  const allowsVerticalScroll = (el: HTMLElement): boolean => {\n    const computedStyle = window.getComputedStyle(el)\n\n    if (['scroll', 'overlay'].includes(computedStyle.overflowY)) {\n      return true\n    }\n\n    if (computedStyle.overflowY !== 'auto') {\n      return false\n    }\n\n    if (['visible', 'clip'].includes(computedStyle.overflowX)) {\n      return true\n    }\n\n    return hasDimensionConstraint(computedStyle.maxHeight, el.style.height)\n  }\n\n  const allowsHorizontalScroll = (el: HTMLElement): boolean => {\n    const computedStyle = window.getComputedStyle(el)\n\n    if (['scroll', 'overlay'].includes(computedStyle.overflowX)) {\n      return true\n    }\n\n    if (computedStyle.overflowX !== 'auto') {\n      return false\n    }\n\n    if (['visible', 'clip'].includes(computedStyle.overflowY)) {\n      return true\n    }\n\n    return hasDimensionConstraint(computedStyle.maxWidth, el.style.width)\n  }\n\n  const hasDimensionConstraint = (computedMaxDimension: string, inlineStyleDimension: string): boolean => {\n    if (computedMaxDimension && computedMaxDimension !== 'none' && computedMaxDimension !== '0px') {\n      return true\n    }\n\n    if (inlineStyleDimension && inlineStyleDimension !== 'auto' && inlineStyleDimension !== '0') {\n      return true\n    }\n\n    return false\n  }\n\n  let parent = element?.parentElement\n\n  while (parent) {\n    const allowsScroll = allowsVerticalScroll(parent) || allowsHorizontalScroll(parent)\n\n    if (window.getComputedStyle(parent).display !== 'contents' && allowsScroll) {\n      return parent\n    }\n\n    parent = parent.parentElement\n  }\n\n  return null\n}\n\nexport const getElementsInViewportFromCollection = (\n  elements: HTMLElement[],\n  referenceElement?: HTMLElement,\n): HTMLElement[] => {\n  if (!referenceElement) {\n    return elements.filter((element) => elementInViewport(element))\n  }\n\n  const referenceIndex = elements.indexOf(referenceElement)\n  const upwardElements: HTMLElement[] = []\n  const downwardElements: HTMLElement[] = []\n\n  // Traverse upwards until an element is not visible\n  for (let i = referenceIndex; i >= 0; i--) {\n    const element = elements[i]\n\n    if (elementInViewport(element)) {\n      upwardElements.push(element)\n    } else {\n      break\n    }\n  }\n\n  // Traverse downwards until an element is not visible\n  for (let i = referenceIndex + 1; i < elements.length; i++) {\n    const element = elements[i]\n\n    if (elementInViewport(element)) {\n      downwardElements.push(element)\n    } else {\n      break\n    }\n  }\n\n  // Reverse upward elements to maintain DOM order, then append downward elements\n  return [...upwardElements.reverse(), ...downwardElements]\n}\n\nexport const requestAnimationFrame = (cb: () => void, times: number = 1): void => {\n  window.requestAnimationFrame(() => {\n    if (times > 1) {\n      requestAnimationFrame(cb, times - 1)\n    } else {\n      cb()\n    }\n  })\n}\n\nexport const getInitialPageFromDOM = <T>(id: string, useScriptElement: boolean = false): T | null => {\n  if (typeof window === 'undefined') {\n    return null\n  }\n\n  if (!useScriptElement) {\n    const el = document.getElementById(id)\n\n    if (el?.dataset.page) {\n      return JSON.parse(el.dataset.page)\n    }\n  }\n\n  const scriptEl = document.querySelector(`script[data-page=\"${id}\"][type=\"application/json\"]`)\n\n  if (scriptEl?.textContent) {\n    return JSON.parse(scriptEl.textContent)\n  }\n\n  return null\n}\n","import { get, set } from 'lodash-es'\nimport { isFile } from './files'\nimport { FormDataConvertible } from './types'\n\n/**\n * Transform dotted notation to bracket notation.\n *\n * Examples:\n *   user.name => user[name]\n *   user.profile.city => user[profile][city]\n *   user.skills[] => user[skills][]\n *   users.company[address].street => users[company][address][street]\n *   config\\.app\\.name => config.app.name (escaped, literal)\n */\nfunction undotKey(key: string): string {\n  if (!key.includes('.')) {\n    return key\n  }\n\n  const transformSegment = (segment: string): string => {\n    if (segment.startsWith('[') && segment.endsWith(']')) {\n      return segment // Already in bracket notation - leave untouched\n    }\n\n    // Convert dotted segment to bracket notation: \"user.name\" → \"user[name]\"\n    return segment.split('.').reduce((result, part, index) => (index === 0 ? part : `${result}[${part}]`))\n  }\n\n  return key\n    .replace(/\\\\\\./g, '__ESCAPED_DOT__') // Temporarily replace escaped dots (\\.) to protect them from transformation\n    .split(/(\\[[^\\]]*\\])/) // Split on bracket notation while preserving the brackets in the result array\n    .filter(Boolean) // Remove empty strings from the split operation\n    .map(transformSegment) // Transform each segment: dotted parts become bracketed, existing brackets stay as-is\n    .join('') // Reassemble all segments back into a single string\n    .replace(/__ESCAPED_DOT__/g, '.') // Restore the escaped dots as literal dots in the final result\n}\n\n/**\n * Parse a key into an array of path segments.\n *\n * Examples:\n * - \"user[name]\" => [\"user\", \"name\"]\n * - \"tags[]\" => [\"tags\", \"\"]\n * - \"items[0][name]\" => [\"items\", 0, \"name\"]\n */\nfunction parseKey(key: string): (string | number | '')[] {\n  const path: (string | number | '')[] = []\n  const pattern = /([^\\[\\]]+)|\\[(\\d*)\\]/g\n  let match: RegExpExecArray | null\n\n  while ((match = pattern.exec(key)) !== null) {\n    if (match[1] !== undefined) {\n      path.push(match[1])\n    } else if (match[2] !== undefined) {\n      path.push(match[2] === '' ? '' : Number(match[2]))\n    }\n  }\n\n  return path\n}\n\n/**\n * Set value in nested object, always creating objects (never arrays).\n * This ensures we can analyze the final structure before deciding what should be arrays.\n */\nfunction setNestedObject(obj: Record<string, any>, path: string[], value: any): void {\n  let current = obj\n\n  for (let i = 0; i < path.length - 1; i++) {\n    if (!(path[i] in current)) {\n      current[path[i]] = {}\n    }\n\n    current = current[path[i]]\n  }\n\n  current[path[path.length - 1]] = value\n}\n\n/**\n * Check if an object has sequential numeric keys (0, 1, 2, ...).\n */\nfunction objectHasSequentialNumericKeys(value: any): boolean {\n  const keys = Object.keys(value)\n  const numericKeys = keys\n    .filter((k) => /^\\d+$/.test(k))\n    .map(Number)\n    .sort((a, b) => a - b)\n\n  return (\n    keys.length === numericKeys.length &&\n    numericKeys.length > 0 &&\n    numericKeys[0] === 0 &&\n    numericKeys.every((n, i) => n === i)\n  )\n}\n\n/**\n * Convert objects with sequential numeric keys (0, 1, 2, ...) to arrays.\n */\nfunction convertSequentialObjectsToArrays(value: any): any {\n  if (Array.isArray(value)) {\n    return value.map(convertSequentialObjectsToArrays)\n  }\n\n  if (typeof value !== 'object' || value === null || isFile(value)) {\n    return value\n  }\n\n  if (objectHasSequentialNumericKeys(value)) {\n    const result = []\n\n    for (let i = 0; i < Object.keys(value).length; i++) {\n      result[i] = convertSequentialObjectsToArrays(value[i])\n    }\n\n    return result\n  }\n\n  // Keep as object, recursively process values\n  const result: Record<string, any> = {}\n\n  for (const key in value) {\n    result[key] = convertSequentialObjectsToArrays(value[key])\n  }\n\n  return result\n}\n\n/**\n * Convert a FormData instance into an object structure.\n */\nexport function formDataToObject(source: FormData): Record<string, FormDataConvertible> {\n  const form: Record<string, any> = {}\n\n  // formData.entries() returns an iterator where the first element is the key and the second element\n  // is the value. Examples of the keys are \"user[name]\", \"tags[]\", \"items[0][name]\", \"user.name\", etc.\n  // We should construct a new (nested) object based on these keys.\n  for (const [key, value] of source.entries()) {\n    if (value instanceof File && value.size === 0 && value.name === '') {\n      // Check if the given value is an empty file. We want to filter\n      // those out as they prevent us from comparing objects with\n      // each other, which we do to set the isDirty prop.\n      continue\n    }\n\n    const path = parseKey(undotKey(key))\n\n    // If the key ends with an empty string (''), treat it as an array push (e.g., \"tags[]\")\n    if (path[path.length - 1] === '') {\n      const arrayPath = path.slice(0, -1)\n      const existing = get(form, arrayPath)\n\n      if (Array.isArray(existing)) {\n        existing.push(value)\n      } else if (existing && typeof existing === 'object' && !isFile(existing)) {\n        // If existing is an object with numeric keys, convert to array (treating indices as relative)\n        const numericKeys = Object.keys(existing)\n          .filter((k) => /^\\d+$/.test(k))\n          .map(Number)\n          .sort((a, b) => a - b)\n\n        set(form, arrayPath, numericKeys.length > 0 ? [...numericKeys.map((k) => existing[k]), value] : [value])\n      } else {\n        set(form, arrayPath, [value])\n      }\n\n      continue\n    }\n\n    // Always build nested objects first, then convert sequential numeric keys to arrays.\n    // This prevents the creation of sparse arrays when mixing numeric and string keys.\n    setNestedObject(form, path.map(String), value)\n  }\n\n  // Convert objects with sequential numeric keys (0, 1, 2, ...) to arrays\n  return convertSequentialObjectsToArrays(form)\n}\n","import { config, HeadManager, HeadManagerOnUpdateCallback, HeadManagerTitleCallback } from '.'\nimport debounce from './debounce'\n\nconst Renderer = {\n  preferredAttribute(): 'data-inertia' | 'inertia' {\n    return config.get('future.useDataInertiaHeadAttribute') ? 'data-inertia' : 'inertia'\n  },\n\n  buildDOMElement(tag: string): ChildNode {\n    const template = document.createElement('template')\n    template.innerHTML = tag\n    const node = template.content.firstChild as Element\n\n    if (!tag.startsWith('<script ')) {\n      return node\n    }\n\n    const script = document.createElement('script')\n    script.innerHTML = node.innerHTML\n    node.getAttributeNames().forEach((name) => {\n      script.setAttribute(name, node.getAttribute(name) || '')\n    })\n\n    return script\n  },\n\n  isInertiaManagedElement(element: Element): boolean {\n    return element.nodeType === Node.ELEMENT_NODE && element.getAttribute(this.preferredAttribute()) !== null\n  },\n\n  findMatchingElementIndex(element: Element, elements: Array<Element>): number {\n    const attribute = this.preferredAttribute()\n    const key = element.getAttribute(attribute)\n    if (key !== null) {\n      return elements.findIndex((element) => element.getAttribute(attribute) === key)\n    }\n\n    return -1\n  },\n\n  update: debounce(function (elements: Array<string>) {\n    const sourceElements = elements.map((element) => this.buildDOMElement(element))\n    const targetElements = Array.from(document.head.childNodes).filter((element) =>\n      this.isInertiaManagedElement(element as Element),\n    )\n\n    targetElements.forEach((targetElement) => {\n      const index = this.findMatchingElementIndex(targetElement as Element, sourceElements)\n      if (index === -1) {\n        targetElement?.parentNode?.removeChild(targetElement)\n        return\n      }\n\n      const sourceElement = sourceElements.splice(index, 1)[0]\n      if (sourceElement && !targetElement.isEqualNode(sourceElement)) {\n        targetElement?.parentNode?.replaceChild(sourceElement, targetElement)\n      }\n    })\n\n    sourceElements.forEach((element) => document.head.appendChild(element))\n  }, 1),\n}\n\nexport default function createHeadManager(\n  isServer: boolean,\n  titleCallback: HeadManagerTitleCallback,\n  onUpdate: HeadManagerOnUpdateCallback,\n): HeadManager {\n  const states: Record<string, Array<string>> = {}\n  let lastProviderId = 0\n\n  function connect(): string {\n    const id = (lastProviderId += 1)\n    states[id] = []\n    return id.toString()\n  }\n\n  function disconnect(id: string): void {\n    if (id === null || Object.keys(states).indexOf(id) === -1) {\n      return\n    }\n\n    delete states[id]\n    commit()\n  }\n\n  function reconnect(id: string): void {\n    if (Object.keys(states).indexOf(id) === -1) {\n      states[id] = []\n    }\n  }\n\n  function update(id: string, elements: Array<string> = []): void {\n    if (id !== null && Object.keys(states).indexOf(id) > -1) {\n      states[id] = elements\n    }\n\n    commit()\n  }\n\n  function collect(): Array<string> {\n    const title = titleCallback('')\n    const attribute = Renderer.preferredAttribute()\n\n    const defaults: Record<string, string> = {\n      ...(title ? { title: `<title ${attribute}=\"\">${title}</title>` } : {}),\n    }\n\n    const elements = Object.values(states)\n      .reduce((carry, elements) => carry.concat(elements), [])\n      .reduce((carry, element) => {\n        if (element.indexOf('<') === -1) {\n          return carry\n        }\n\n        if (element.indexOf('<title ') === 0) {\n          const title = element.match(/(<title [^>]+>)(.*?)(<\\/title>)/)\n          carry.title = title ? `${title[1]}${titleCallback(title[2])}${title[3]}` : element\n          return carry\n        }\n\n        const match = element.match(attribute === 'inertia' ? / inertia=\"[^\"]+\"/ : / data-inertia=\"[^\"]+\"/)\n        if (match) {\n          carry[match[0]] = element\n        } else {\n          carry[Object.keys(carry).length] = element\n        }\n\n        return carry\n      }, defaults)\n\n    return Object.values(elements)\n  }\n\n  function commit(): void {\n    isServer ? onUpdate(collect()) : Renderer.update(collect())\n  }\n\n  // By committing during initialization, we can guarantee that the default\n  // tags are set, as well as that they exist during SSR itself.\n  commit()\n\n  return {\n    forceUpdate: commit,\n    createProvider: function () {\n      const id = connect()\n\n      return {\n        preferredAttribute: Renderer.preferredAttribute,\n        reconnect: () => reconnect(id),\n        update: (elements) => update(id, elements),\n        disconnect: () => disconnect(id),\n      }\n    },\n  }\n}\n","import { router } from '../index'\nimport { page as currentPage } from '../page'\nimport { Page, PendingVisit, ReloadOptions, ScrollProp, UseInfiniteScrollDataManager } from '../types'\n\nconst MERGE_INTENT_HEADER = 'X-Inertia-Infinite-Scroll-Merge-Intent'\n\ntype Side = 'previous' | 'next'\ntype ScrollPropPageNames = keyof Pick<ScrollProp, 'previousPage' | 'nextPage'>\n\ntype InfiniteScrollState = {\n  previousPage: number | string | null\n  nextPage: number | string | null\n  lastLoadedPage: number | string | null\n  requestCount: number\n}\n\nexport const useInfiniteScrollData = (options: {\n  getPropName: () => string\n  onBeforeUpdate: () => void\n  onBeforePreviousRequest: () => void\n  onBeforeNextRequest: () => void\n  onCompletePreviousRequest: (loadedPage: string | number | null) => void\n  onCompleteNextRequest: (loadedPage: string | number | null) => void\n}): UseInfiniteScrollDataManager => {\n  const getScrollPropFromCurrentPage = (): ScrollProp => {\n    const scrollProp = currentPage.get().scrollProps?.[options.getPropName()]\n\n    if (scrollProp) {\n      return scrollProp\n    }\n\n    throw new Error(`The page object does not contain a scroll prop named \"${options.getPropName()}\".`)\n  }\n\n  const state = {\n    component: null,\n    loading: false,\n    previousPage: null,\n    nextPage: null,\n    lastLoadedPage: null,\n    requestCount: 0,\n  } as {\n    component: string | null\n    loading: boolean\n  } & InfiniteScrollState\n\n  const resetState = () => {\n    const scrollProp = getScrollPropFromCurrentPage()\n\n    state.component = currentPage.get().component\n    state.loading = false\n    state.previousPage = scrollProp.previousPage\n    state.nextPage = scrollProp.nextPage\n    state.lastLoadedPage = scrollProp.currentPage\n    state.requestCount = 0\n  }\n\n  const getRememberKey = () => `inertia:infinite-scroll-data:${options.getPropName()}`\n\n  if (typeof window !== 'undefined') {\n    resetState()\n\n    const rememberedState = router.restore(getRememberKey()) as InfiniteScrollState | undefined\n\n    if (rememberedState && typeof rememberedState === 'object') {\n      // Restore the remembered state so the state matches the remembered prop data...\n      state.previousPage = rememberedState.previousPage\n      state.nextPage = rememberedState.nextPage\n      state.lastLoadedPage = rememberedState.lastLoadedPage\n      state.requestCount = rememberedState.requestCount || 0\n    }\n  }\n\n  const removeEventListener = router.on('success', (event) => {\n    if (state.component === event.detail.page.component && getScrollPropFromCurrentPage().reset) {\n      resetState()\n    }\n  })\n\n  const getScrollPropKeyForSide = (side: Side): ScrollPropPageNames => {\n    return side === 'next' ? 'nextPage' : 'previousPage'\n  }\n\n  const findPageToLoad = (side: Side) => {\n    const pagePropName = getScrollPropKeyForSide(side)\n\n    return state[pagePropName]\n  }\n\n  const syncStateOnSuccess = (side: Side) => {\n    const scrollProp = getScrollPropFromCurrentPage()\n    const paginationProp = getScrollPropKeyForSide(side)\n\n    state.lastLoadedPage = scrollProp.currentPage\n    state[paginationProp] = scrollProp[paginationProp]\n\n    state.requestCount += 1\n\n    // We save the state in the browser history so it can be restored\n    // if the user navigates away and then back to the page...\n    router.remember(\n      {\n        previousPage: state.previousPage,\n        nextPage: state.nextPage,\n        lastLoadedPage: state.lastLoadedPage,\n        requestCount: state.requestCount,\n      } as InfiniteScrollState,\n      getRememberKey(),\n    )\n  }\n\n  const getPageName = () => getScrollPropFromCurrentPage().pageName\n  const getRequestCount = () => state.requestCount\n\n  const fetchPage = (side: Side, reloadOptions: ReloadOptions = {}): void => {\n    const page = findPageToLoad(side)\n\n    if (state.loading || page === null) {\n      return\n    }\n\n    state.loading = true\n\n    router.reload({\n      ...reloadOptions,\n      data: { [getPageName()]: page },\n      only: [options.getPropName()],\n      preserveUrl: true, // we handle URL updates manually via useInfiniteScrollQueryString()\n      headers: {\n        [MERGE_INTENT_HEADER]: side === 'previous' ? 'prepend' : 'append',\n        ...reloadOptions.headers,\n      },\n      onBefore: (visit: PendingVisit) => {\n        side === 'next' ? options.onBeforeNextRequest() : options.onBeforePreviousRequest()\n        reloadOptions.onBefore?.(visit)\n      },\n      onBeforeUpdate: (page: Page) => {\n        options.onBeforeUpdate()\n        reloadOptions.onBeforeUpdate?.(page)\n      },\n      onSuccess: (page: Page) => {\n        syncStateOnSuccess(side)\n        reloadOptions.onSuccess?.(page)\n      },\n      onFinish: (visit: any) => {\n        state.loading = false\n        side === 'next'\n          ? options.onCompleteNextRequest(state.lastLoadedPage)\n          : options.onCompletePreviousRequest(state.lastLoadedPage)\n        reloadOptions.onFinish?.(visit)\n      },\n    })\n  }\n\n  const getLastLoadedPage = () => state.lastLoadedPage\n  const hasPrevious = () => !!state.previousPage\n  const hasNext = () => !!state.nextPage\n  const fetchPrevious = (reloadOptions?: ReloadOptions): void => fetchPage('previous', reloadOptions)\n  const fetchNext = (reloadOptions?: ReloadOptions): void => fetchPage('next', reloadOptions)\n\n  return {\n    getLastLoadedPage,\n    getPageName,\n    getRequestCount,\n    hasPrevious,\n    hasNext,\n    fetchNext,\n    fetchPrevious,\n    removeEventListener,\n  }\n}\n","import { hrefToUrl, router, urlHasProtocol, urlToString } from '..'\nimport debounce from '../debounce'\nimport { getElementsInViewportFromCollection } from '../domUtils'\nimport { page as currentPage } from './../page'\nimport Queue from './../queue'\nimport { getPageFromElement } from './elements'\n\n// Shared queue among all instances to ensure URL updates are processed sequentially\nconst queue = new Queue<Promise<void>>()\n\nlet initialUrl: URL | null\nlet payloadUrl: URL | null\nlet initialUrlWasAbsolute: boolean | null = null\n\n/**\n * As users scroll through infinite content, this system updates the URL to reflect\n * which page they're currently viewing. It uses a \"most visible page\" calculation\n * so that the URL reflects whichever page has the most visible items.\n */\nexport const useInfiniteScrollQueryString = (options: {\n  getPageName: () => string\n  getItemsElement: () => HTMLElement\n  shouldPreserveUrl: () => boolean\n}) => {\n  let enabled = true\n\n  const queuePageUpdate = (page: string) => {\n    queue\n      .add(() => {\n        return new Promise((resolve) => {\n          if (!enabled) {\n            initialUrl = payloadUrl = null\n            return resolve()\n          }\n\n          if (!initialUrl || !payloadUrl) {\n            const currentPageUrl = currentPage.get().url\n            initialUrl = hrefToUrl(currentPageUrl)\n            payloadUrl = hrefToUrl(currentPageUrl)\n            initialUrlWasAbsolute = urlHasProtocol(currentPageUrl)\n          }\n\n          const pageName = options.getPageName()\n          const searchParams = payloadUrl.searchParams\n\n          // Clean URLs: don't show ?page=1 in the URL, just remove the parameter entirely\n          if (page === '1') {\n            searchParams.delete(pageName)\n          } else {\n            searchParams.set(pageName, page)\n          }\n\n          setTimeout(() => resolve())\n        })\n      })\n      .finally(() => {\n        if (\n          enabled &&\n          initialUrl &&\n          payloadUrl &&\n          initialUrl.href !== payloadUrl.href &&\n          initialUrlWasAbsolute !== null\n        ) {\n          // Update URL without triggering a page reload or affecting scroll position\n          router.replace({\n            url: urlToString(payloadUrl, initialUrlWasAbsolute),\n            preserveScroll: true,\n            preserveState: true,\n          })\n        }\n\n        initialUrl = payloadUrl = initialUrlWasAbsolute = null\n      })\n  }\n\n  // Debounced to avoid excessive URL updates during fast scrolling\n  const onItemIntersected = debounce((itemElement: HTMLElement) => {\n    const itemsElement = options.getItemsElement()\n\n    if (!enabled || options.shouldPreserveUrl() || !itemElement || !itemsElement) {\n      return\n    }\n\n    // Count how many items from each page are currently visible in the viewport\n    const pageMap = new Map<string, number>()\n    const elements = [...itemsElement.children] as HTMLElement[]\n\n    getElementsInViewportFromCollection(elements, itemElement).forEach((element) => {\n      const page = getPageFromElement(element) ?? '1'\n\n      if (pageMap.has(page)) {\n        pageMap.set(page, pageMap.get(page)! + 1)\n      } else {\n        pageMap.set(page, 1)\n      }\n    })\n\n    // Find the page with the most visible items - this becomes the \"current\" page\n    const sortedPages = Array.from(pageMap.entries()).sort((a, b) => b[1] - a[1])\n    const mostVisiblePage = sortedPages[0]?.[0]\n\n    if (mostVisiblePage !== undefined) {\n      queuePageUpdate(mostVisiblePage)\n    }\n  }, 250)\n\n  return {\n    onItemIntersected,\n    cancel: () => (enabled = false),\n  }\n}\n","type IntersectionObserverCallback = (entry: IntersectionObserverEntry) => void\n\ninterface IntersectionObserverManager {\n  new: (callback: IntersectionObserverCallback, options?: IntersectionObserverInit) => IntersectionObserver\n  flushAll: () => void\n}\n\nexport const useIntersectionObservers = (): IntersectionObserverManager => {\n  const intersectionObservers: IntersectionObserver[] = []\n\n  const newIntersectionObserver = (\n    callback: IntersectionObserverCallback,\n    options: IntersectionObserverInit = {},\n  ): IntersectionObserver => {\n    const observer = new IntersectionObserver((entries) => {\n      for (const entry of entries) {\n        if (entry.isIntersecting) {\n          callback(entry)\n        }\n      }\n    }, options)\n\n    intersectionObservers.push(observer)\n\n    return observer\n  }\n\n  const flushAll = () => {\n    intersectionObservers.forEach((observer) => observer.disconnect())\n    intersectionObservers.length = 0\n  }\n\n  return {\n    new: newIntersectionObserver,\n    flushAll,\n  }\n}\n","import { router } from '..'\nimport debounce from '../debounce'\nimport { useIntersectionObservers } from '../intersectionObservers'\nimport { UseInfiniteScrollElementManager } from '../types'\n\nconst INFINITE_SCROLL_PAGE_KEY = 'infiniteScrollPage'\nconst INFINITE_SCROLL_IGNORE_KEY = 'infiniteScrollIgnore'\n\ntype ElementRange = {\n  from: number\n  to: number\n}\n\nexport const getPageFromElement = (element: HTMLElement): string | undefined =>\n  element.dataset[INFINITE_SCROLL_PAGE_KEY]\n\nexport const useInfiniteScrollElementManager = (options: {\n  shouldFetchNext: () => boolean\n  shouldFetchPrevious: () => boolean\n  getTriggerMargin: () => number\n  getStartElement: () => HTMLElement\n  getEndElement: () => HTMLElement\n  getItemsElement: () => HTMLElement\n  getScrollableParent: () => HTMLElement | null\n  onPreviousTriggered: () => void\n  onNextTriggered: () => void\n  onItemIntersected: (element: HTMLElement) => void\n  getPropName: () => string\n}): UseInfiniteScrollElementManager => {\n  const intersectionObservers = useIntersectionObservers()\n\n  let itemsObserver: IntersectionObserver\n  let startElementObserver: IntersectionObserver\n  let endElementObserver: IntersectionObserver\n  let itemsMutationObserver: MutationObserver\n  let triggersEnabled = false\n\n  const setupObservers = () => {\n    // Watch for manually added DOM elements (not from server responses)\n    // This mutation observer tracks when new elements are added to the slot,\n    // so we can distinguish between user-added content and server-loaded pages\n    itemsMutationObserver = new MutationObserver((mutations) => {\n      mutations.forEach((mutation) => {\n        mutation.addedNodes.forEach((node) => {\n          if (node.nodeType !== Node.ELEMENT_NODE) {\n            return\n          }\n\n          addedElements.add(node as HTMLElement)\n        })\n      })\n\n      rememberElementsDebounced()\n    })\n\n    itemsMutationObserver.observe(options.getItemsElement(), { childList: true })\n\n    // Track individual items entering/leaving viewport for URL synchronization\n    // When items become visible, we update the URL to reflect the current page\n    itemsObserver = intersectionObservers.new((entry: IntersectionObserverEntry) =>\n      options.onItemIntersected(entry.target as HTMLElement),\n    )\n\n    // Set up trigger zones at start/end that load more content when intersected. The rootMargin\n    // creates a buffer zone so loading starts before user reaches the edge. We should always\n    // have a root margin of at least 1px as our default elements have no height\n    const observerOptions: IntersectionObserverInit = {\n      root: options.getScrollableParent(),\n      rootMargin: `${Math.max(1, options.getTriggerMargin())}px`,\n    }\n\n    startElementObserver = intersectionObservers.new(options.onPreviousTriggered, observerOptions)\n    endElementObserver = intersectionObservers.new(options.onNextTriggered, observerOptions)\n  }\n\n  const enableTriggers = () => {\n    if (triggersEnabled) {\n      // Make sure we don't register multiple watchers\n      disableTriggers()\n    }\n\n    const startElement = options.getStartElement()\n    const endElement = options.getEndElement()\n\n    if (startElement && options.shouldFetchPrevious()) {\n      startElementObserver.observe(startElement)\n    }\n\n    if (endElement && options.shouldFetchNext()) {\n      endElementObserver.observe(endElement)\n    }\n\n    triggersEnabled = true\n  }\n\n  const disableTriggers = () => {\n    if (!triggersEnabled) {\n      return\n    }\n\n    startElementObserver.disconnect()\n    endElementObserver.disconnect()\n    triggersEnabled = false\n  }\n\n  const refreshTriggers = () => {\n    if (triggersEnabled) {\n      enableTriggers()\n    }\n  }\n\n  const flushAll = () => {\n    disableTriggers()\n    intersectionObservers.flushAll()\n    itemsMutationObserver?.disconnect()\n  }\n\n  const addedElements = new Set<HTMLElement>()\n\n  const elementIsUntagged = (element: HTMLElement): boolean =>\n    !(INFINITE_SCROLL_PAGE_KEY in element.dataset) && !(INFINITE_SCROLL_IGNORE_KEY in element.dataset)\n\n  const processManuallyAddedElements = () => {\n    // Tag manually added elements so they don't interfere with URL management\n    // These elements get marked as \"ignore\" since they weren't loaded from the server\n    Array.from(addedElements).forEach((element) => {\n      if (elementIsUntagged(element)) {\n        element.dataset[INFINITE_SCROLL_IGNORE_KEY] = 'true'\n      }\n\n      itemsObserver.observe(element)\n    })\n\n    addedElements.clear()\n  }\n\n  const findUntaggedElements = (containerElement: HTMLElement): HTMLElement[] => {\n    return Array.from(\n      containerElement.querySelectorAll(\n        `:scope > *:not([data-infinite-scroll-page]):not([data-infinite-scroll-ignore])`,\n      ),\n    )\n  }\n\n  let hasRestoredElements = false\n\n  const processServerLoadedElements = (loadedPage: string | number | null) => {\n    // On first run, try to restore the elements tags from browser history\n    if (!hasRestoredElements) {\n      hasRestoredElements = true\n\n      if (restoreElements()) {\n        return\n      }\n    }\n\n    // Tag new server-loaded elements with their page number for URL management\n    // This allows us to update the URL based on which page's content is most visible\n    findUntaggedElements(options.getItemsElement()).forEach((element) => {\n      if (elementIsUntagged(element)) {\n        element.dataset[INFINITE_SCROLL_PAGE_KEY] = loadedPage?.toString() || '1'\n      }\n\n      itemsObserver.observe(element)\n    })\n\n    rememberElements()\n  }\n\n  const getElementsRememberKey = () => `inertia:infinite-scroll-elements:${options.getPropName()}`\n\n  // Remember in browser history which elements belong to which page, so we can restore\n  // them on back/forward navigation and keep URL synchronization working correctly\n  const rememberElements = () => {\n    const pageElementRange: Record<string, ElementRange> = {}\n    const childNodes = options.getItemsElement().childNodes\n\n    for (let index = 0; index < childNodes.length; index++) {\n      const node = childNodes[index]\n\n      if (node.nodeType !== Node.ELEMENT_NODE) {\n        continue\n      }\n\n      const page = getPageFromElement(node as HTMLElement)\n\n      if (typeof page === 'undefined') {\n        continue\n      }\n\n      if (!(page in pageElementRange)) {\n        pageElementRange[page] = { from: index, to: index }\n      } else {\n        pageElementRange[page].to = index\n      }\n    }\n\n    router.remember(pageElementRange, getElementsRememberKey())\n  }\n\n  const rememberElementsDebounced = debounce(rememberElements, 250)\n\n  const restoreElements = (): boolean => {\n    const pageElementRange = router.restore(getElementsRememberKey()) as Record<string, ElementRange> | undefined\n\n    if (!pageElementRange || typeof pageElementRange !== 'object') {\n      return false\n    }\n\n    const childNodes = options.getItemsElement().childNodes\n\n    // Use for loop instead of forEach for better performance\n    for (let index = 0; index < childNodes.length; index++) {\n      const node = childNodes[index]\n\n      if (node.nodeType !== Node.ELEMENT_NODE) {\n        continue\n      }\n\n      const element = node as HTMLElement\n\n      // Find which page this element belongs to based on ranges\n      let elementPage: string | undefined\n\n      for (const [page, range] of Object.entries(pageElementRange)) {\n        if (index >= range.from && index <= range.to) {\n          elementPage = page\n          break\n        }\n      }\n\n      if (elementPage) {\n        element.dataset[INFINITE_SCROLL_PAGE_KEY] = elementPage\n      } else if (!elementIsUntagged(element)) {\n        continue\n      } else {\n        element.dataset[INFINITE_SCROLL_IGNORE_KEY] = 'true'\n      }\n\n      itemsObserver.observe(element)\n    }\n\n    return true\n  }\n\n  return {\n    setupObservers,\n    enableTriggers,\n    disableTriggers,\n    refreshTriggers,\n    flushAll,\n    processManuallyAddedElements,\n    processServerLoadedElements,\n  }\n}\n","import { getElementsInViewportFromCollection } from '../domUtils'\n\n/**\n * When loading content \"before\" the current viewport (e.g. loading page 1 when viewing page 2),\n * new content is prepended to the DOM, which naturally pushes existing content down and\n * disrupts the user's scroll position. This system maintains visual stability by:\n *\n * 1. Capturing a reference element and its position before the update\n * 2. After new content is added, calculating how far that reference element moved\n * 3. Adjusting scroll position to keep the reference element in the same visual location\n */\nexport const useInfiniteScrollPreservation = (options: {\n  getScrollableParent: () => HTMLElement | null\n  getItemsElement: () => HTMLElement\n}) => {\n  const createCallbacks = () => {\n    let currentScrollTop: number\n    let referenceElement: Element | null = null\n    let referenceElementTop: number = 0\n\n    const captureScrollPosition = () => {\n      const scrollableContainer = options.getScrollableParent()\n      const itemsElement = options.getItemsElement()\n\n      // Capture current scroll position\n      currentScrollTop = scrollableContainer?.scrollTop || window.scrollY\n\n      // Find the first visible element to use as a reference point\n      // This element will help us calculate how much the content shifted after the update\n      const visibleElements = getElementsInViewportFromCollection([...itemsElement.children] as HTMLElement[])\n\n      if (visibleElements.length > 0) {\n        referenceElement = visibleElements[0]\n        const containerRect = scrollableContainer?.getBoundingClientRect() || { top: 0 }\n        const containerTop = scrollableContainer ? containerRect.top : 0\n        const rect = referenceElement.getBoundingClientRect()\n        // Store the reference element's position relative to its container\n        referenceElementTop = rect.top - containerTop\n      }\n    }\n\n    const restoreScrollPosition = () => {\n      if (!referenceElement) {\n        return\n      }\n\n      let attempts = 0\n      let restored = false\n\n      const restore = () => {\n        attempts++\n\n        if (restored || attempts > 10) {\n          return false\n        }\n\n        // Calculate where our reference element ended up after new content was prepended\n        const scrollableContainer = options.getScrollableParent()\n        const containerRect = scrollableContainer?.getBoundingClientRect() || { top: 0 }\n        const containerTop = scrollableContainer ? containerRect.top : 0\n        const newRect = referenceElement!.getBoundingClientRect()\n        const newElementTop = newRect.top - containerTop\n\n        // Calculate how much the reference element moved due to content being prepended\n        const adjustment = newElementTop - referenceElementTop\n\n        if (adjustment === 0) {\n          // Try again on the next frame, as DOM may still be updating\n          window.requestAnimationFrame(restore)\n          return\n        }\n\n        // Adjust scroll position to compensate for the movement, keeping the reference element\n        // in the same visual position as before the update\n        if (scrollableContainer) {\n          scrollableContainer.scrollTo({ top: currentScrollTop + adjustment })\n        } else {\n          window.scrollTo(0, window.scrollY + adjustment)\n        }\n\n        restored = true\n      }\n\n      window.requestAnimationFrame(restore)\n    }\n\n    return {\n      captureScrollPosition,\n      restoreScrollPosition,\n    }\n  }\n\n  return {\n    createCallbacks,\n  }\n}\n","import { requestAnimationFrame } from './domUtils'\nimport { useInfiniteScrollData } from './infiniteScroll/data'\nimport { useInfiniteScrollElementManager } from './infiniteScroll/elements'\nimport { useInfiniteScrollQueryString } from './infiniteScroll/queryString'\nimport { useInfiniteScrollPreservation } from './infiniteScroll/scrollPreservation'\nimport { Page, ReloadOptions, UseInfiniteScrollOptions, UseInfiniteScrollProps } from './types'\n\n/**\n * Core infinite scroll composable that orchestrates data fetching, DOM management,\n * scroll preservation, and URL synchronization.\n *\n * This is the main entry point that coordinates four sub-systems:\n * - Data management: Handles pagination state and server requests\n * - Element management: DOM observation and intersection detection\n * - Query string sync: Updates URL as user scrolls through pages\n * - Scroll preservation: Maintains scroll position during content updates\n */\nexport default function useInfiniteScroll(options: UseInfiniteScrollOptions): UseInfiniteScrollProps {\n  const queryStringManager = useInfiniteScrollQueryString({ ...options, getPageName: () => dataManager.getPageName() })\n\n  // Create scroll preservation callbacks that capture and restore scroll position\n  // and restore it after new content is prepended to maintain visual stability\n  const scrollPreservation = useInfiniteScrollPreservation(options)\n\n  const elementManager = useInfiniteScrollElementManager({\n    ...options,\n    // As items enter viewport, update URL to reflect the most visible page\n    onItemIntersected: queryStringManager.onItemIntersected,\n    onPreviousTriggered: () => dataManager.fetchPrevious(),\n    onNextTriggered: () => dataManager.fetchNext(),\n  })\n\n  const dataManager = useInfiniteScrollData({\n    ...options,\n    // Before updating page data, tag any manually added DOM elements\n    // so they don't get confused with server-loaded content\n    onBeforeUpdate: elementManager.processManuallyAddedElements,\n    // After successful request, tag new server content\n    onCompletePreviousRequest: (loadedPage) => {\n      options.onCompletePreviousRequest()\n      requestAnimationFrame(() => {\n        elementManager.processServerLoadedElements(loadedPage)\n        elementManager.refreshTriggers()\n      }, 2)\n    },\n    onCompleteNextRequest: (loadedPage) => {\n      options.onCompleteNextRequest()\n      requestAnimationFrame(() => {\n        elementManager.processServerLoadedElements(loadedPage)\n        elementManager.refreshTriggers()\n      }, 2)\n    },\n  })\n\n  const addScrollPreservationCallbacks = (reloadOptions: ReloadOptions): ReloadOptions => {\n    const { captureScrollPosition, restoreScrollPosition } = scrollPreservation.createCallbacks()\n\n    const originalOnBeforeUpdate = reloadOptions.onBeforeUpdate || (() => {})\n    const originalOnSuccess = reloadOptions.onSuccess || (() => {})\n\n    reloadOptions.onBeforeUpdate = (page: Page) => {\n      originalOnBeforeUpdate(page)\n      captureScrollPosition()\n    }\n\n    reloadOptions.onSuccess = (page: Page) => {\n      originalOnSuccess(page)\n      restoreScrollPosition()\n    }\n\n    return reloadOptions\n  }\n\n  const originalFetchNext = dataManager.fetchNext\n  dataManager.fetchNext = (reloadOptions: ReloadOptions = {}) => {\n    if (options.inReverseMode()) {\n      reloadOptions = addScrollPreservationCallbacks(reloadOptions)\n    }\n\n    originalFetchNext(reloadOptions)\n  }\n\n  const originalFetchPrevious = dataManager.fetchPrevious\n  dataManager.fetchPrevious = (reloadOptions: ReloadOptions = {}) => {\n    if (!options.inReverseMode()) {\n      reloadOptions = addScrollPreservationCallbacks(reloadOptions)\n    }\n\n    originalFetchPrevious(reloadOptions)\n  }\n\n  return {\n    dataManager,\n    elementManager,\n    flush: () => {\n      dataManager.removeEventListener()\n      elementManager.flushAll()\n      queryStringManager.cancel()\n    },\n  }\n}\n","type MouseNavigationEvent = Pick<\n  MouseEvent,\n  'altKey' | 'ctrlKey' | 'shiftKey' | 'metaKey' | 'button' | 'currentTarget' | 'defaultPrevented' | 'target'\n>\n\ntype KeyboardNavigationEvent = Pick<KeyboardEvent, 'currentTarget' | 'defaultPrevented' | 'key' | 'target'>\n\nfunction isContentEditableOrPrevented(event: KeyboardNavigationEvent | MouseNavigationEvent): boolean {\n  return (event.target instanceof HTMLElement && event.target.isContentEditable) || event.defaultPrevented\n}\n\n/**\n * Determine if this mouse event should be intercepted for navigation purposes.\n * Links with modifier keys or non-left clicks should not be intercepted.\n * Content editable elements and prevented events are ignored.\n */\nexport function shouldIntercept(event: MouseNavigationEvent): boolean {\n  const isLink = (event.currentTarget as HTMLElement).tagName.toLowerCase() === 'a'\n\n  return !(\n    isContentEditableOrPrevented(event) ||\n    (isLink && event.altKey) ||\n    (isLink && event.ctrlKey) ||\n    (isLink && event.metaKey) ||\n    (isLink && event.shiftKey) ||\n    (isLink && 'button' in event && event.button !== 0)\n  )\n}\n\n/**\n * Determine if this keyboard event should trigger a navigation request.\n * Enter triggers navigation for both links and buttons currently.\n * Space only triggers navigation for buttons specifically.\n */\nexport function shouldNavigate(event: KeyboardNavigationEvent): boolean {\n  const isButton = (event.currentTarget as HTMLElement).tagName.toLowerCase() === 'button'\n\n  return !isContentEditableOrPrevented(event) && (event.key === 'Enter' || (isButton && event.key === ' '))\n}\n","/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress\n * @license MIT */\n\nimport { ProgressSettings } from './types'\n\nconst baseComponentSelector = 'nprogress'\n\nlet progress: HTMLDivElement\n\nconst settings: ProgressSettings = {\n  minimum: 0.08,\n  easing: 'linear',\n  positionUsing: 'translate3d',\n  speed: 200,\n  trickle: true,\n  trickleSpeed: 200,\n  showSpinner: true,\n  barSelector: '[role=\"bar\"]',\n  spinnerSelector: '[role=\"spinner\"]',\n  parent: 'body',\n  color: '#29d',\n  includeCSS: true,\n  template: [\n    '<div class=\"bar\" role=\"bar\">',\n    '<div class=\"peg\"></div>',\n    '</div>',\n    '<div class=\"spinner\" role=\"spinner\">',\n    '<div class=\"spinner-icon\"></div>',\n    '</div>',\n  ].join(''),\n}\n\nlet status: number | null = null\n\nconst configure = (options: Partial<ProgressSettings>) => {\n  Object.assign(settings, options)\n\n  if (settings.includeCSS) {\n    injectCSS(settings.color)\n  }\n\n  progress = document.createElement('div')\n  progress.id = baseComponentSelector\n  progress.innerHTML = settings.template\n}\n\n/**\n * Sets the progress bar status, where `n` is a number from `0.0` to `1.0`.\n */\nconst set = (n: number) => {\n  const started = isStarted()\n\n  n = clamp(n, settings.minimum, 1)\n  status = n === 1 ? null : n\n\n  const progress = render(!started)\n  const bar = progress.querySelector(settings.barSelector)! as HTMLElement\n  const speed = settings.speed\n  const ease = settings.easing\n\n  progress.offsetWidth /* Repaint */\n\n  queue((next) => {\n    const barStyles = ((): Partial<CSSStyleDeclaration> => {\n      if (settings.positionUsing === 'translate3d') {\n        return {\n          transition: `all ${speed}ms ${ease}`,\n          transform: `translate3d(${toBarPercentage(n)}%,0,0)`,\n        }\n      }\n\n      if (settings.positionUsing === 'translate') {\n        return {\n          transition: `all ${speed}ms ${ease}`,\n          transform: `translate(${toBarPercentage(n)}%,0)`,\n        }\n      }\n\n      return { marginLeft: `${toBarPercentage(n)}%` }\n    })()\n\n    for (const key in barStyles) {\n      bar.style[key] = barStyles[key]!\n    }\n\n    if (n !== 1) {\n      return setTimeout(next, speed)\n    }\n\n    // Fade out\n    progress.style.transition = 'none'\n    progress.style.opacity = '1'\n    progress.offsetWidth /* Repaint */\n\n    setTimeout(() => {\n      progress.style.transition = `all ${speed}ms linear`\n      progress.style.opacity = '0'\n\n      setTimeout(() => {\n        remove()\n        progress.style.transition = ''\n        progress.style.opacity = ''\n        next()\n      }, speed)\n    }, speed)\n  })\n}\n\nconst isStarted = () => typeof status === 'number'\n\n/**\n * Shows the progress bar.\n * This is the same as setting the status to 0%, except that it doesn't go backwards.\n */\nconst start = () => {\n  if (!status) {\n    set(0)\n  }\n\n  const work = function () {\n    setTimeout(function () {\n      if (!status) {\n        return\n      }\n\n      increaseByRandom()\n      work()\n    }, settings.trickleSpeed)\n  }\n\n  if (settings.trickle) {\n    work()\n  }\n}\n\n/**\n * Hides the progress bar.\n * This is the *sort of* the same as setting the status to 100%, with the\n * difference being `done()` makes some placebo effect of some realistic motion.\n *\n * If `true` is passed, it will show the progress bar even if it's hidden.\n */\nconst done = (force?: boolean) => {\n  if (!force && !status) {\n    return\n  }\n\n  increaseByRandom(0.3 + 0.5 * Math.random())\n  set(1)\n}\n\nconst increaseByRandom = (amount?: number) => {\n  const n = status\n\n  if (n === null) {\n    return start()\n  }\n\n  if (n > 1) {\n    return\n  }\n\n  amount =\n    typeof amount === 'number'\n      ? amount\n      : (() => {\n          const ranges: Record<number, [number, number]> = {\n            0.1: [0, 0.2],\n            0.04: [0.2, 0.5],\n            0.02: [0.5, 0.8],\n            0.005: [0.8, 0.99],\n          }\n\n          for (const r in ranges) {\n            if (n >= ranges[r][0] && n < ranges[r][1]) {\n              return parseFloat(r)\n            }\n          }\n\n          return 0\n        })()\n\n  return set(clamp(n + amount, 0, 0.994))\n}\n\n/**\n * (Internal) renders the progress bar markup based on the `template` setting.\n */\nconst render = (fromStart: boolean) => {\n  if (isRendered()) {\n    return document.getElementById(baseComponentSelector)!\n  }\n\n  document.documentElement.classList.add(`${baseComponentSelector}-busy`)\n\n  const bar = progress.querySelector(settings.barSelector)! as HTMLElement\n  const perc = fromStart ? '-100' : toBarPercentage(status || 0)\n  const parent = getParent()\n\n  bar.style.transition = 'all 0 linear'\n  bar.style.transform = `translate3d(${perc}%,0,0)`\n\n  if (!settings.showSpinner) {\n    progress.querySelector(settings.spinnerSelector)?.remove()\n  }\n\n  if (parent !== document.body) {\n    parent.classList.add(`${baseComponentSelector}-custom-parent`)\n  }\n\n  parent.appendChild(progress)\n\n  return progress\n}\n\nconst getParent = (): HTMLElement => {\n  return (isDOM(settings.parent) ? settings.parent : document.querySelector(settings.parent)) as HTMLElement\n}\n\nconst remove = () => {\n  document.documentElement.classList.remove(`${baseComponentSelector}-busy`)\n  getParent().classList.remove(`${baseComponentSelector}-custom-parent`)\n  progress?.remove()\n}\n\nconst isRendered = () => {\n  return document.getElementById(baseComponentSelector) !== null\n}\n\nconst isDOM = (obj: any) => {\n  if (typeof HTMLElement === 'object') {\n    return obj instanceof HTMLElement\n  }\n\n  return obj && typeof obj === 'object' && obj.nodeType === 1 && typeof obj.nodeName === 'string'\n}\n\nfunction clamp(n: number, min: number, max: number): number {\n  if (n < min) {\n    return min\n  }\n\n  if (n > max) {\n    return max\n  }\n\n  return n\n}\n\n// Converts a percentage (`0..1`) to a bar translateX percentage (`-100%..0%`).\nconst toBarPercentage = (n: number) => (-1 + n) * 100\n\n// Queues a function to be executed.\nconst queue = (() => {\n  const pending: ((...args: any[]) => any)[] = []\n\n  const next = () => {\n    const fn = pending.shift()\n\n    if (fn) {\n      fn(next)\n    }\n  }\n\n  return (fn: (...args: any[]) => any) => {\n    pending.push(fn)\n\n    if (pending.length === 1) {\n      next()\n    }\n  }\n})()\n\nconst injectCSS = (color: string): void => {\n  const element = document.createElement('style')\n\n  element.textContent = `\n    #${baseComponentSelector} {\n      pointer-events: none;\n    }\n\n    #${baseComponentSelector} .bar {\n      background: ${color};\n\n      position: fixed;\n      z-index: 1031;\n      top: 0;\n      left: 0;\n\n      width: 100%;\n      height: 2px;\n    }\n\n    #${baseComponentSelector} .peg {\n      display: block;\n      position: absolute;\n      right: 0px;\n      width: 100px;\n      height: 100%;\n      box-shadow: 0 0 10px ${color}, 0 0 5px ${color};\n      opacity: 1.0;\n\n      transform: rotate(3deg) translate(0px, -4px);\n    }\n\n    #${baseComponentSelector} .spinner {\n      display: block;\n      position: fixed;\n      z-index: 1031;\n      top: 15px;\n      right: 15px;\n    }\n\n    #${baseComponentSelector} .spinner-icon {\n      width: 18px;\n      height: 18px;\n      box-sizing: border-box;\n\n      border: solid 2px transparent;\n      border-top-color: ${color};\n      border-left-color: ${color};\n      border-radius: 50%;\n\n      animation: ${baseComponentSelector}-spinner 400ms linear infinite;\n    }\n\n    .${baseComponentSelector}-custom-parent {\n      overflow: hidden;\n      position: relative;\n    }\n\n    .${baseComponentSelector}-custom-parent #${baseComponentSelector} .spinner,\n    .${baseComponentSelector}-custom-parent #${baseComponentSelector} .bar {\n      position: absolute;\n    }\n\n    @keyframes ${baseComponentSelector}-spinner {\n      0%   { transform: rotate(0deg); }\n      100% { transform: rotate(360deg); }\n    }\n  `\n  document.head.appendChild(element)\n}\n\nconst show = () => {\n  if (progress) {\n    progress.style.display = ''\n  }\n}\n\nconst hide = () => {\n  if (progress) {\n    progress.style.display = 'none'\n  }\n}\n\nexport default {\n  configure,\n  isStarted,\n  done,\n  set,\n  remove,\n  start,\n  status,\n  show,\n  hide,\n}\n","import ProgressComponent from './progress-component'\nimport { GlobalEvent } from './types'\n\nclass Progress {\n  public hideCount = 0\n\n  public start(): void {\n    ProgressComponent.start()\n  }\n\n  public reveal(force: boolean = false): void {\n    this.hideCount = Math.max(0, this.hideCount - 1)\n\n    if (force || this.hideCount === 0) {\n      ProgressComponent.show()\n    }\n  }\n\n  public hide(): void {\n    this.hideCount++\n\n    ProgressComponent.hide()\n  }\n\n  public set(status: number): void {\n    ProgressComponent.set(Math.max(0, Math.min(1, status)))\n  }\n\n  public finish(): void {\n    ProgressComponent.done()\n  }\n\n  public reset(): void {\n    ProgressComponent.set(0)\n  }\n\n  public remove(): void {\n    ProgressComponent.done()\n    ProgressComponent.remove()\n  }\n\n  public isStarted(): boolean {\n    return ProgressComponent.isStarted()\n  }\n\n  public getStatus(): number | null {\n    return ProgressComponent.status\n  }\n}\n\nexport const progress = new Progress()\nexport const reveal = progress.reveal\nexport const hide = progress.hide\n\nfunction addEventListeners(delay: number): void {\n  document.addEventListener('inertia:start', (e) => handleStartEvent(e, delay))\n  document.addEventListener('inertia:progress', handleProgressEvent)\n}\n\nfunction handleStartEvent(event: GlobalEvent<'start'>, delay: number): void {\n  if (!event.detail.visit.showProgress) {\n    progress.hide()\n  }\n\n  const timeout = setTimeout(() => progress.start(), delay)\n  document.addEventListener('inertia:finish', (e) => finish(e, timeout), { once: true })\n}\n\nfunction handleProgressEvent(event: GlobalEvent<'progress'>): void {\n  if (progress.isStarted() && event.detail.progress?.percentage) {\n    progress.set(Math.max(progress.getStatus()!, (event.detail.progress.percentage / 100) * 0.9))\n  }\n}\n\nfunction finish(event: GlobalEvent<'finish'>, timeout: NodeJS.Timeout): void {\n  clearTimeout(timeout!)\n\n  if (!progress.isStarted()) {\n    return\n  }\n\n  if (event.detail.visit.completed) {\n    progress.finish()\n  } else if (event.detail.visit.interrupted) {\n    progress.reset()\n  } else if (event.detail.visit.cancelled) {\n    progress.remove()\n  }\n}\n\nexport default function setupProgress({\n  delay = 250,\n  color = '#29d',\n  includeCSS = true,\n  showSpinner = false,\n} = {}): void {\n  addEventListeners(delay)\n  ProgressComponent.configure({ showSpinner, includeCSS, color })\n}\n","type FormElement = HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement\n\nfunction isFormElement(element: Element): element is FormElement {\n  return (\n    element instanceof HTMLInputElement ||\n    element instanceof HTMLSelectElement ||\n    element instanceof HTMLTextAreaElement\n  )\n}\n\nfunction resetInputElement(input: HTMLInputElement, defaultValues: FormDataEntryValue[]): boolean {\n  const oldValue = input.value\n  const oldChecked = input.checked\n\n  switch (input.type.toLowerCase()) {\n    case 'checkbox':\n      // For checkboxes, check if the input's value is in the array of default values\n      input.checked = defaultValues.includes(input.value)\n      break\n    case 'radio':\n      // For radios, only use the first default value to avoid multiple radios being checked\n      input.checked = defaultValues[0] === input.value\n      break\n    case 'file':\n      input.value = ''\n      break\n    case 'button':\n    case 'submit':\n    case 'reset':\n    case 'image':\n      // These input types don't carry form state\n      break\n    default:\n      // text, email, number, date, etc. - use first default value\n      input.value = defaultValues[0] !== null && defaultValues[0] !== undefined ? String(defaultValues[0]) : ''\n  }\n\n  // Return true if the value actually changed\n  return input.value !== oldValue || input.checked !== oldChecked\n}\n\nfunction resetSelectElement(select: HTMLSelectElement, defaultValues: FormDataEntryValue[]): boolean {\n  const oldValue = select.value\n  const oldSelectedOptions = Array.from(select.selectedOptions).map((opt) => opt.value)\n\n  if (select.multiple) {\n    // For multi-select, select all options that match any of the default values\n    const defaultStrings = defaultValues.map((value) => String(value))\n\n    Array.from(select.options).forEach((option) => {\n      option.selected = defaultStrings.includes(option.value)\n    })\n  } else {\n    // For single select, use the first default value (or empty string)\n    select.value = defaultValues[0] !== undefined ? String(defaultValues[0]) : ''\n  }\n\n  // Check if selection actually changed\n  const newSelectedOptions = Array.from(select.selectedOptions).map((opt) => opt.value)\n  const hasChanged = select.multiple\n    ? JSON.stringify(oldSelectedOptions.sort()) !== JSON.stringify(newSelectedOptions.sort())\n    : select.value !== oldValue\n\n  return hasChanged\n}\n\nfunction resetFormElement(element: FormElement, defaultValues: FormDataEntryValue[]): boolean {\n  if (element.disabled) {\n    // For disabled elements, use their DOM defaultValue since they're not in FormData\n    if (element instanceof HTMLInputElement) {\n      const oldValue = element.value\n      const oldChecked = element.checked\n\n      switch (element.type.toLowerCase()) {\n        case 'checkbox':\n        case 'radio':\n          element.checked = element.defaultChecked\n          return element.checked !== oldChecked\n        case 'file':\n          element.value = ''\n          return oldValue !== ''\n        case 'button':\n        case 'submit':\n        case 'reset':\n        case 'image':\n          // These input types don't carry form state\n          return false\n        default:\n          element.value = element.defaultValue\n          return element.value !== oldValue\n      }\n    } else if (element instanceof HTMLSelectElement) {\n      // Reset select to default selected options\n      const oldSelectedOptions = Array.from(element.selectedOptions).map((opt) => opt.value)\n\n      Array.from(element.options).forEach((option) => {\n        option.selected = option.defaultSelected\n      })\n\n      const newSelectedOptions = Array.from(element.selectedOptions).map((opt) => opt.value)\n      return JSON.stringify(oldSelectedOptions.sort()) !== JSON.stringify(newSelectedOptions.sort())\n    } else if (element instanceof HTMLTextAreaElement) {\n      const oldValue = element.value\n      element.value = element.defaultValue\n      return element.value !== oldValue\n    }\n\n    return false\n  }\n\n  if (element instanceof HTMLInputElement) {\n    // Pass all default values to handle checkboxes and radios correctly\n    return resetInputElement(element, defaultValues)\n  } else if (element instanceof HTMLSelectElement) {\n    return resetSelectElement(element, defaultValues)\n  } else if (element instanceof HTMLTextAreaElement) {\n    const oldValue = element.value\n    element.value = defaultValues[0] !== undefined ? String(defaultValues[0]) : ''\n    return element.value !== oldValue\n  }\n\n  return false\n}\n\nfunction resetFieldElements(\n  elements: Element | RadioNodeList | HTMLCollection,\n  defaultValues: FormDataEntryValue[],\n): boolean {\n  let hasChanged = false\n\n  if (elements instanceof RadioNodeList || elements instanceof HTMLCollection) {\n    // Handle multiple elements with the same name (e.g., radio buttons, checkboxes, array fields)\n    Array.from(elements).forEach((node, index) => {\n      if (node instanceof Element && isFormElement(node)) {\n        if (node instanceof HTMLInputElement && ['checkbox', 'radio'].includes(node.type.toLowerCase())) {\n          // For checkboxes and radios, pass all default values for value-based matching\n          if (resetFormElement(node, defaultValues)) {\n            hasChanged = true\n          }\n        } else {\n          // For other array elements (like text inputs), use index-based matching\n          const indexedDefaultValues =\n            defaultValues[index] !== undefined ? [defaultValues[index]] : [defaultValues[0] ?? null].filter(Boolean)\n\n          if (resetFormElement(node, indexedDefaultValues)) {\n            hasChanged = true\n          }\n        }\n      }\n    })\n  } else if (isFormElement(elements)) {\n    // Handle single element - pass all default values (important for multi-selects)\n    hasChanged = resetFormElement(elements, defaultValues)\n  }\n\n  return hasChanged\n}\n\nexport function resetFormFields(formElement: HTMLFormElement, defaults: FormData, fieldNames?: string[]): void {\n  if (!formElement) {\n    return\n  }\n\n  const resetEntireForm = !fieldNames || fieldNames.length === 0\n\n  // If no specific fields provided, reset the entire form\n  if (resetEntireForm) {\n    // Get all field names from both defaults and form elements (including disabled ones)\n    const formData = new FormData(formElement)\n    const formElementNames = Array.from(formElement.elements)\n      .map((el) => (isFormElement(el) ? el.name : ''))\n      .filter(Boolean)\n    fieldNames = [...new Set([...defaults.keys(), ...formData.keys(), ...formElementNames])]\n  }\n\n  let hasChanged = false\n\n  fieldNames!.forEach((fieldName) => {\n    const elements = formElement.elements.namedItem(fieldName)\n\n    if (elements) {\n      if (resetFieldElements(elements, defaults.getAll(fieldName))) {\n        hasChanged = true\n      }\n    }\n  })\n\n  // Dispatch reset event if any field changed (matching native form.reset() behavior)\n  if (hasChanged && resetEntireForm) {\n    formElement.dispatchEvent(new Event('reset', { bubbles: true }))\n  }\n}\n"]}