@inertiaui/modal-react 2.0.0-beta.1 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"inertiaui-modal.js","sources":["../src/config.ts","../src/helpers.ts","../src/ModalRoot.tsx","../src/ModalRenderer.tsx","../src/useModal.ts","../src/Deferred.tsx","../src/HeadlessModal.tsx","../src/CloseButton.tsx","../node_modules/clsx/dist/clsx.mjs","../src/constants.ts","../src/ModalContent.tsx","../src/SlideoverContent.tsx","../src/Modal.tsx","../src/ModalLink.tsx","../src/WhenVisible.tsx","../src/inertiauiModal.ts"],"sourcesContent":["export interface ModalTypeConfig {\n closeButton: boolean\n closeExplicitly: boolean\n closeOnClickOutside: boolean\n maxWidth: string\n paddingClasses: string\n panelClasses: string\n position: string\n}\n\nexport interface ModalConfig {\n type: 'modal' | 'slideover'\n navigate: boolean\n useNativeDialog: boolean\n appElement: string | null\n modal: ModalTypeConfig\n slideover: ModalTypeConfig\n}\n\nconst defaultConfig: ModalConfig = {\n type: 'modal',\n navigate: false,\n useNativeDialog: true,\n appElement: '#app',\n modal: {\n closeButton: true,\n closeExplicitly: false,\n closeOnClickOutside: true,\n maxWidth: '2xl',\n paddingClasses: 'p-4 sm:p-6',\n panelClasses: 'bg-white rounded',\n position: 'center',\n },\n slideover: {\n closeButton: true,\n closeExplicitly: false,\n closeOnClickOutside: true,\n maxWidth: 'md',\n paddingClasses: 'p-4 sm:p-6',\n panelClasses: 'bg-white min-h-screen',\n position: 'right',\n },\n}\n\nclass Config {\n private config: ModalConfig\n\n constructor() {\n this.config = {} as ModalConfig\n this.reset()\n }\n\n reset(): void {\n this.config = JSON.parse(JSON.stringify(defaultConfig))\n }\n\n put(key: string | Partial<ModalConfig>, value?: unknown): void {\n if (typeof key === 'object') {\n this.config = {\n type: key.type ?? defaultConfig.type,\n navigate: key.navigate ?? defaultConfig.navigate,\n useNativeDialog: key.useNativeDialog ?? defaultConfig.useNativeDialog,\n appElement: key.appElement !== undefined ? key.appElement : defaultConfig.appElement,\n modal: { ...defaultConfig.modal, ...(key.modal ?? {}) },\n slideover: { ...defaultConfig.slideover, ...(key.slideover ?? {}) },\n }\n return\n }\n const keys = key.split('.')\n let current: Record<string, unknown> = this.config as unknown as Record<string, unknown>\n for (let i = 0; i < keys.length - 1; i++) {\n current = (current[keys[i]] = current[keys[i]] || {}) as Record<string, unknown>\n }\n current[keys[keys.length - 1]] = value\n }\n\n get(key?: string): unknown {\n if (typeof key === 'undefined') {\n return this.config\n }\n const keys = key.split('.')\n let current: unknown = this.config\n for (const k of keys) {\n if (current === null || current === undefined || typeof current !== 'object') {\n return null\n }\n current = (current as Record<string, unknown>)[k]\n }\n return current === undefined ? null : current\n }\n}\n\nconst configInstance = new Config()\n\nexport const resetConfig = (): void => configInstance.reset()\nexport const putConfig = (key: string | Partial<ModalConfig>, value?: unknown): void => configInstance.put(key, value)\nexport const getConfig = (key?: string): unknown => configInstance.get(key)\nexport const getConfigByType = (isSlideover: boolean, key: string): unknown =>\n configInstance.get(isSlideover ? `slideover.${key}` : `modal.${key}`)\n","// Re-export helper utilities from vanilla\nexport { sameUrlPath, except, only, rejectNullValues, kebabCase, isStandardDomEvent } from '@inertiaui/vanilla'\nimport { generateId as vanillaGenerateId } from '@inertiaui/vanilla'\n\n// Wrap generateId with custom callback support for testing\nlet generateIdUsingCallback: (() => string) | null = null\n\nexport function generateIdUsing(callback: (() => string) | null): void {\n generateIdUsingCallback = callback\n}\n\nexport function generateId(prefix = 'inertiaui_'): string {\n if (generateIdUsingCallback) {\n return generateIdUsingCallback()\n }\n return vanillaGenerateId(prefix)\n}\n","import { createElement, useEffect, useState, useRef, useReducer, ReactNode, ComponentType } from 'react'\nimport { default as Axios, AxiosResponse, InternalAxiosRequestConfig } from 'axios'\nimport { except, kebabCase, generateId, sameUrlPath } from './helpers'\nimport { router, usePage, progress } from '@inertiajs/react'\nimport { mergeDataIntoQueryString, type RequestPayload } from '@inertiajs/core'\nimport { createContext, useContext } from 'react'\nimport ModalRenderer from './ModalRenderer'\nimport { getConfig } from './config'\nimport type {\n Modal,\n ModalConfig,\n ModalResponseData,\n ModalStackContextValue,\n VisitOptions,\n ReloadOptions,\n EventCallback,\n ComponentResolver,\n PageProps,\n ModalRootProps,\n LocalModal,\n PrefetchOptions,\n} from './types'\n\nconst ModalStackContext = createContext<ModalStackContextValue | null>(null)\nModalStackContext.displayName = 'ModalStackContext'\n\nlet pageVersion: string | null = null\nlet resolveComponent: ComponentResolver | null = null\nlet baseUrl: string | null = null\n\n// Track the URL we're closing to (prevents navigate handler from re-setting baseUrl)\n// Only suppresses if navigate event URL matches this URL\nlet closingToBaseUrlTarget: string | null = null\n\n// Prefetch cache (#146)\ninterface PrefetchCacheEntry {\n response: AxiosResponse\n timestamp: number\n expiresAt: number\n}\n\nconst prefetchCache = new Map<string, PrefetchCacheEntry>()\nconst prefetchInFlight = new Map<string, Promise<AxiosResponse>>()\n\nfunction getPrefetchCacheKey(url: string, method: string, data: RequestPayload): string {\n return `${method}:${url}:${JSON.stringify(data)}`\n}\n\nfunction getCachedResponse(url: string, method: string, data: RequestPayload): AxiosResponse | null {\n const key = getPrefetchCacheKey(url, method, data)\n const cached = prefetchCache.get(key)\n\n if (!cached) {\n return null\n }\n\n if (Date.now() > cached.expiresAt) {\n prefetchCache.delete(key)\n return null\n }\n\n return cached.response\n}\n\nfunction setCachedResponse(url: string, method: string, data: RequestPayload, response: AxiosResponse, cacheFor: number): void {\n const key = getPrefetchCacheKey(url, method, data)\n prefetchCache.set(key, {\n response,\n timestamp: Date.now(),\n expiresAt: Date.now() + cacheFor,\n })\n}\n\nexport function prefetch(href: string, options: PrefetchOptions = {}): Promise<void> {\n if (href.startsWith('#')) {\n return Promise.resolve()\n }\n\n const method = (options.method ?? 'get').toLowerCase()\n const data = options.data ?? ({} as RequestPayload)\n const headers = options.headers ?? {}\n const queryStringArrayFormat = options.queryStringArrayFormat ?? 'brackets'\n const cacheFor = options.cacheFor ?? 30000\n\n const [url, mergedData] = mergeDataIntoQueryString(method as 'get' | 'post' | 'put' | 'patch' | 'delete', href || '', data, queryStringArrayFormat)\n\n // Check if already cached\n const cached = getCachedResponse(url, method, mergedData)\n if (cached) {\n return Promise.resolve()\n }\n\n // Check if already in flight\n const cacheKey = getPrefetchCacheKey(url, method, mergedData)\n const inFlight = prefetchInFlight.get(cacheKey)\n if (inFlight) {\n return inFlight.then(() => {})\n }\n\n options.onPrefetching?.()\n\n const requestHeaders: Record<string, string> = {\n ...headers,\n Accept: 'text/html, application/xhtml+xml',\n 'X-Requested-With': 'XMLHttpRequest',\n 'X-Inertia': 'true',\n 'X-Inertia-Version': pageVersion ?? '',\n 'X-InertiaUI-Modal': generateId(),\n 'X-InertiaUI-Modal-Base-Url': baseUrl ?? '',\n }\n\n const request = Axios({\n url,\n method,\n data: mergedData,\n headers: requestHeaders,\n })\n .then((response) => {\n setCachedResponse(url, method, mergedData, response, cacheFor)\n options.onPrefetched?.()\n return response\n })\n .finally(() => {\n prefetchInFlight.delete(cacheKey)\n })\n\n prefetchInFlight.set(cacheKey, request)\n\n return request.then(() => {})\n}\n\ninterface ModalStackProviderProps {\n children: ReactNode\n}\n\nexport const ModalStackProvider = ({ children }: ModalStackProviderProps) => {\n // Use ref for synchronous access to stack, state only for triggering re-renders\n const stackRef = useRef<Modal[]>([])\n const [, forceUpdate] = useReducer((x) => x + 1, 0)\n const [localModals, setLocalModals] = useState<Record<string, LocalModal>>({})\n\n const updateStack = (withStack: (prevStack: Modal[]) => Modal[]) => {\n const newStack = withStack([...stackRef.current])\n\n const isOnTopOfStack = (modalId: string) => {\n if (newStack.length < 2) {\n return true\n }\n\n return (\n newStack\n .map((modal) => ({ id: modal.id, shouldRender: modal.shouldRender }))\n .reverse()\n .find((modal) => modal.shouldRender)?.id === modalId\n )\n }\n\n newStack.forEach((modal, index) => {\n newStack[index].onTopOfStack = isOnTopOfStack(modal.id)\n newStack[index].getParentModal = () => {\n if (index < 1) {\n // This is the first modal in the stack\n return null\n }\n\n // Find the first open modal before this one\n return (\n stackRef.current\n .slice(0, index)\n .reverse()\n .find((m) => m.isOpen) ?? null\n )\n }\n newStack[index].getChildModal = () => {\n if (index === stackRef.current.length - 1) {\n // This is the last modal in the stack\n return null\n }\n\n // Find the first open modal after this one\n return stackRef.current.slice(index + 1).find((m) => m.isOpen) ?? null\n }\n })\n\n stackRef.current = newStack\n forceUpdate()\n }\n\n class ModalClass implements Modal {\n id: string\n isOpen: boolean\n shouldRender: boolean\n listeners: Record<string, EventCallback[]>\n component: ComponentType | null\n props: Record<string, unknown>\n response: ModalResponseData\n config: ModalConfig\n onCloseCallback: (() => void) | null\n afterLeaveCallback: (() => void) | null\n index: number\n onTopOfStack: boolean\n name?: string\n getParentModal: () => Modal | null\n getChildModal: () => Modal | null\n\n constructor(\n component: ComponentType | null,\n response: ModalResponseData,\n config?: ModalConfig | null,\n onClose?: (() => void) | null,\n afterLeave?: (() => void) | null,\n ) {\n this.id = response.id ?? generateId()\n this.isOpen = false\n this.shouldRender = false\n this.listeners = {}\n\n this.component = component\n this.props = response.props ?? {}\n this.response = response\n this.config = config ?? {}\n this.onCloseCallback = onClose ?? null\n this.afterLeaveCallback = afterLeave ?? null\n\n this.index = -1 // Will be set when added to the stack\n this.getParentModal = () => null // Will be set in push()\n this.getChildModal = () => null // Will be set in push()\n this.onTopOfStack = true // Will be updated in push()\n }\n\n show = () => {\n updateStack((prevStack) =>\n prevStack.map((modal) => {\n if (modal.id === this.id && !modal.isOpen) {\n modal.isOpen = true\n modal.shouldRender = true\n }\n return modal\n }),\n )\n }\n\n setOpen = (open: boolean) => {\n if (open) {\n this.show()\n } else {\n this.close()\n }\n }\n\n close = () => {\n updateStack((currentStack) => {\n let modalClosed = false\n\n const newStack = currentStack.map((modal) => {\n if (modal.id === this.id && modal.isOpen) {\n Object.keys(modal.listeners).forEach((event) => {\n modal.off(event)\n })\n\n modal.isOpen = false\n modal.onCloseCallback?.()\n modalClosed = true\n }\n return modal\n })\n\n return modalClosed ? newStack : currentStack\n })\n }\n\n afterLeave = () => {\n if (this.isOpen) {\n return\n }\n\n updateStack((prevStack) => {\n const updatedStack = prevStack.map((modal) => {\n if (modal.id === this.id && !modal.isOpen) {\n modal.shouldRender = false\n modal.afterLeaveCallback?.()\n modal.afterLeaveCallback = null\n }\n return modal\n })\n\n if (this.index === 0) {\n // Update browser URL back to base when all modals are closed\n // Clear baseUrl BEFORE router.push to prevent the navigate event\n // from setting it back (race condition with props callback)\n const savedBaseUrl = baseUrl\n baseUrl = null\n\n // Set target URL to prevent navigate handler from re-setting baseUrl\n // Only suppresses navigate events to this specific URL\n closingToBaseUrlTarget = savedBaseUrl\n\n if (savedBaseUrl && typeof window !== 'undefined') {\n router.push({\n url: savedBaseUrl,\n preserveScroll: true,\n preserveState: true,\n // Clear _inertiaui_modal prop to prevent modal from reopening\n props: (currentProps: Record<string, unknown>) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { _inertiaui_modal, ...rest } = currentProps\n return { ...rest, _inertiaui_modal: undefined }\n },\n })\n }\n return []\n }\n\n return updatedStack\n })\n }\n\n on = (event: string, callback: EventCallback) => {\n event = kebabCase(event)\n this.listeners[event] = this.listeners[event] ?? []\n this.listeners[event].push(callback)\n }\n\n off = (event: string, callback?: EventCallback) => {\n event = kebabCase(event)\n if (callback) {\n this.listeners[event] = this.listeners[event]?.filter((cb) => cb !== callback) ?? []\n } else {\n delete this.listeners[event]\n }\n }\n\n emit = (event: string, ...args: unknown[]) => {\n this.listeners[kebabCase(event)]?.forEach((callback) => callback(...args))\n }\n\n registerEventListenersFromProps = (props: Record<string, unknown>) => {\n const unsubscribers: (() => void)[] = []\n\n Object.keys(props)\n .filter((key) => key.startsWith('on'))\n .forEach((key) => {\n // e.g. onRefreshKey -> refresh-key\n const eventName = kebabCase(key).replace(/^on-/, '')\n const callback = props[key] as EventCallback\n this.on(eventName, callback)\n unsubscribers.push(() => this.off(eventName, callback))\n })\n\n return () => unsubscribers.forEach((unsub) => unsub())\n }\n\n reload = (options: ReloadOptions = {}) => {\n let keys = Object.keys(this.response.props)\n\n if (options.only) {\n keys = options.only\n }\n\n if (options.except) {\n keys = except(keys, options.except) as string[]\n }\n\n if (!this.response?.url) {\n return\n }\n\n const method = (options.method ?? 'get').toLowerCase()\n const data = options.data ?? {}\n\n options.onStart?.()\n\n Axios({\n url: this.response.url,\n method,\n data: method === 'get' ? {} : data,\n params: method === 'get' ? data : {},\n headers: {\n ...(options.headers ?? {}),\n Accept: 'text/html, application/xhtml+xml',\n 'X-Inertia': 'true',\n 'X-Inertia-Partial-Component': this.response.component,\n 'X-Inertia-Version': this.response.version ?? '',\n 'X-Inertia-Partial-Data': keys.join(','),\n 'X-InertiaUI-Modal': generateId(),\n 'X-InertiaUI-Modal-Base-Url': baseUrl ?? '',\n },\n })\n .then((response) => {\n this.updateProps(response.data.props)\n\n options.onSuccess?.(response)\n })\n .catch((error) => {\n options.onError?.(error)\n })\n .finally(() => {\n options.onFinish?.()\n })\n }\n\n updateProps = (props: Record<string, unknown>) => {\n Object.assign(this.props, props)\n updateStack((prevStack) => prevStack) // Trigger re-render\n }\n }\n\n const isValidModalResponse = (data: unknown): data is ModalResponseData => {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'component' in data &&\n typeof (data as ModalResponseData).component === 'string'\n )\n }\n\n const pushFromResponseData = (\n responseData: ModalResponseData,\n config: ModalConfig = {},\n onClose: (() => void) | null = null,\n onAfterLeave: (() => void) | null = null,\n ): Promise<Modal> => {\n if (!resolveComponent) {\n return Promise.reject(new Error('resolveComponent not set'))\n }\n\n if (!isValidModalResponse(responseData)) {\n return Promise.reject(\n new Error(\n 'Invalid modal response. This usually happens when the server returns a redirect (e.g., due to session expiration). ' +\n 'Check if the user is still authenticated.',\n ),\n )\n }\n\n return resolveComponent(responseData.component).then((component) =>\n push(component, responseData, config, onClose, onAfterLeave),\n )\n }\n\n const loadDeferredProps = (modal: Modal) => {\n const deferred = modal.response?.meta?.deferredProps\n\n if (!deferred) {\n return\n }\n\n Object.keys(deferred).forEach((key) => {\n modal.reload({ only: deferred[key] })\n })\n }\n\n const push = (\n component: ComponentType | null,\n response: ModalResponseData,\n config?: ModalConfig | null,\n onClose?: (() => void) | null,\n afterLeave?: (() => void) | null,\n ): Modal => {\n const newModal = new ModalClass(component, response, config, onClose, afterLeave)\n newModal.index = stackRef.current.length\n\n updateStack((prevStack) => [...prevStack, newModal])\n loadDeferredProps(newModal)\n\n newModal.show()\n\n return newModal\n }\n\n function pushLocalModal(\n name: string,\n config?: ModalConfig | null,\n onClose?: (() => void) | null,\n afterLeave?: (() => void) | null,\n props?: Record<string, unknown> | null,\n ): Modal {\n if (!localModals[name]) {\n throw new Error(`The local modal \"${name}\" has not been registered.`)\n }\n\n const responseData = { props: props ?? {} } as ModalResponseData\n const modal = push(null, responseData, config, onClose, afterLeave)\n modal.name = name\n localModals[name].callback(modal)\n return modal\n }\n\n const visitModal = (url: string, options: VisitOptions = {}): Promise<Modal> =>\n visit(\n url,\n options.method ?? 'get',\n options.data ?? ({} as RequestPayload),\n options.headers ?? {},\n options.config ?? {},\n options.onClose ?? null,\n options.onAfterLeave ?? null,\n options.queryStringArrayFormat ?? 'brackets',\n options.navigate ?? (getConfig('navigate') as boolean),\n options.onStart ?? null,\n options.onSuccess ?? null,\n options.onError ?? null,\n options.props ?? null,\n ).then((modal) => {\n const listeners = options.listeners ?? {}\n\n Object.keys(listeners).forEach((event) => {\n // e.g. refreshKey -> refresh-key\n const eventName = kebabCase(event)\n modal.on(eventName, listeners[event])\n })\n\n return modal\n })\n\n const updateBrowserUrl = (url: string | undefined, useBrowserHistory: boolean, modalData?: ModalResponseData): void => {\n if (!url || !useBrowserHistory || typeof window === 'undefined') {\n return\n }\n\n router.push({\n url,\n preserveScroll: true,\n preserveState: true,\n // Store modal data in page props for history navigation\n props: modalData\n ? (currentProps: Record<string, unknown>) => ({\n ...currentProps,\n _inertiaui_modal: {\n ...modalData,\n baseUrl,\n },\n })\n : undefined,\n })\n }\n\n const visit = (\n href: string,\n method: string,\n payload: RequestPayload = {},\n headers: Record<string, string> = {},\n config: ModalConfig = {},\n onClose: (() => void) | null = null,\n onAfterLeave: (() => void) | null = null,\n queryStringArrayFormat: 'brackets' | 'indices' = 'brackets',\n useBrowserHistory = false,\n onStart: (() => void) | null = null,\n onSuccess: ((response?: AxiosResponse) => void) | null = null,\n onError: ((...args: unknown[]) => void) | null = null,\n props: Record<string, unknown> | null = null,\n ): Promise<Modal> => {\n const modalId = generateId()\n\n return new Promise((resolve, reject) => {\n if (href.startsWith('#')) {\n resolve(pushLocalModal(href.substring(1), config, onClose, onAfterLeave, props))\n return\n }\n\n const [url, data] = mergeDataIntoQueryString(method as 'get' | 'post' | 'put' | 'patch' | 'delete', href || '', payload, queryStringArrayFormat)\n\n // Check for cached prefetch response (#146)\n const cachedResponse = getCachedResponse(url, method, data)\n if (cachedResponse) {\n onSuccess?.(cachedResponse)\n pushFromResponseData(cachedResponse.data, config, onClose, onAfterLeave)\n .then((modal) => {\n updateBrowserUrl(cachedResponse.data.url, useBrowserHistory, cachedResponse.data)\n resolve(modal)\n })\n .catch(reject)\n return\n }\n\n if (stackRef.current.length === 0) {\n baseUrl = typeof window !== 'undefined' ? window.location.href : ''\n }\n\n const requestHeaders: Record<string, string> = {\n ...headers,\n Accept: 'text/html, application/xhtml+xml',\n 'X-Requested-With': 'XMLHttpRequest',\n 'X-Inertia': 'true',\n 'X-Inertia-Version': pageVersion ?? '',\n 'X-InertiaUI-Modal': modalId,\n 'X-InertiaUI-Modal-Base-Url': baseUrl ?? '',\n }\n\n onStart?.()\n\n progress?.start()\n\n Axios({\n url,\n method,\n data,\n headers: requestHeaders,\n })\n .then((response) => {\n onSuccess?.(response)\n pushFromResponseData(response.data, config, onClose, onAfterLeave)\n .then((modal) => {\n updateBrowserUrl(response.data.url, useBrowserHistory, response.data)\n resolve(modal)\n })\n .catch(reject)\n })\n .catch((...args: unknown[]) => {\n onError?.(...args)\n reject(args[0])\n })\n .finally(() => {\n progress?.finish()\n })\n })\n }\n\n const registerLocalModal = (name: string, callback: (modal: Modal) => void) => {\n setLocalModals((prevLocalModals) => ({\n ...prevLocalModals,\n [name]: { name, callback },\n }))\n }\n\n const removeLocalModal = (name: string) => {\n setLocalModals((prevLocalModals) => {\n const newLocalModals = { ...prevLocalModals }\n delete newLocalModals[name]\n return newLocalModals\n })\n }\n\n // Create value object with getter for stack to ensure we always get current ref value\n const value: ModalStackContextValue = {\n get stack() {\n return stackRef.current\n },\n localModals,\n push,\n pushFromResponseData,\n length: () => stackRef.current.length,\n closeAll: (force = false) => {\n if (force) {\n // Force close: immediately remove all modals without transition\n updateStack(() => [])\n } else {\n // Normal close: trigger leave transition for each modal\n ;[...stackRef.current].reverse().forEach((modal) => modal.close())\n }\n },\n reset: () => updateStack(() => []),\n visit,\n visitModal,\n registerLocalModal,\n removeLocalModal,\n }\n\n return <ModalStackContext.Provider value={value}>{children}</ModalStackContext.Provider>\n}\n\nexport const useModalStack = (): ModalStackContextValue => {\n const context = useContext(ModalStackContext)\n if (context === null) {\n throw new Error('useModalStack must be used within a ModalStackProvider')\n }\n return context\n}\n\nexport const modalPropNames = ['closeButton', 'closeExplicitly', 'closeOnClickOutside', 'maxWidth', 'paddingClasses', 'panelClasses', 'position', 'slideover']\n\nexport const initFromPageProps = (pageProps: PageProps) => {\n if (pageProps.initialPage) {\n pageVersion = pageProps.initialPage.version ?? null\n }\n\n if (pageProps.resolveComponent) {\n resolveComponent = pageProps.resolveComponent\n }\n}\n\ninterface RenderInertiaAppProps {\n Component: ComponentType & { layout?: ((page: ReactNode) => ReactNode) | ComponentType[] }\n props: Record<string, unknown>\n key: string\n}\n\nexport const renderApp = (App: ComponentType<{ children: (props: RenderInertiaAppProps) => ReactNode }>, pageProps: PageProps) => {\n initFromPageProps(pageProps)\n\n const renderInertiaApp = ({ Component, props, key }: RenderInertiaAppProps) => {\n const renderComponent = () => {\n const child = createElement(Component, { key, ...props })\n\n if (typeof Component.layout === 'function') {\n return Component.layout(child)\n }\n\n if (Array.isArray(Component.layout)) {\n return Component.layout\n .slice()\n .reverse()\n .reduce(\n (acc, Layout) => createElement(Layout as ComponentType<Record<string, unknown>>, props, acc),\n child as ReactNode,\n )\n }\n\n return child\n }\n\n return (\n <>\n {renderComponent()}\n <ModalRoot />\n </>\n )\n }\n\n return (\n <ModalStackProvider>\n <App {...(pageProps as Record<string, unknown>)}>{renderInertiaApp}</App>\n </ModalStackProvider>\n )\n}\n\ninterface InertiaUIModalPageProps {\n _inertiaui_modal?: ModalResponseData & { baseUrl: string }\n [key: string]: unknown\n}\n\nexport const ModalRoot = ({ children }: ModalRootProps) => {\n const context = useContext(ModalStackContext)\n const $page = usePage<InertiaUIModalPageProps>()\n const pendingModalKeysRef = useRef(new Set<string>())\n\n // Generate a unique key for deduplication (handles case when modal has no id)\n const getModalKey = (modalData: ModalResponseData) => modalData.id || `${modalData.component}:${modalData.url}`\n\n const isNavigatingRef = useRef(false)\n const initialModalStillOpenedRef = useRef(!!$page.props?._inertiaui_modal)\n\n useEffect(() => router.on('start', () => (isNavigatingRef.current = true)), [])\n useEffect(() => router.on('finish', () => (isNavigatingRef.current = false)), [])\n useEffect(\n () =>\n router.on('navigate', function ($event) {\n const modalOnBase = ($event as { detail: { page: { props: InertiaUIModalPageProps; url: string } } }).detail.page.props._inertiaui_modal\n const pageUrl = ($event as { detail: { page: { url: string } } }).detail.page.url\n\n // If we're closing to this specific URL, don't re-open the modal\n // This handles the race condition where router.push in afterLeave\n // fires a navigate event before the props callback clears _inertiaui_modal\n // Only suppresses when navigating to our closing target URL (not browser back to modal)\n if (closingToBaseUrlTarget) {\n const targetPath = new URL(closingToBaseUrlTarget, 'http://x').pathname\n const pagePath = new URL(pageUrl, 'http://x').pathname\n if (targetPath === pagePath) {\n closingToBaseUrlTarget = null\n context?.closeAll(true)\n baseUrl = null\n initialModalStillOpenedRef.current = false\n return\n }\n closingToBaseUrlTarget = null\n }\n\n if (!modalOnBase) {\n // No modal data - close any open modals (force close without transition)\n context?.closeAll(true)\n baseUrl = null\n initialModalStillOpenedRef.current = false\n return\n }\n\n // If the page URL doesn't match the modal URL, close all modals\n if (!sameUrlPath(pageUrl, modalOnBase.url)) {\n context?.closeAll(true)\n baseUrl = null\n initialModalStillOpenedRef.current = false\n return\n }\n\n // Skip if this modal is already being pushed (handles duplicate navigate events)\n const modalKey = getModalKey(modalOnBase)\n if (pendingModalKeysRef.current.has(modalKey)) {\n return\n }\n\n // Also skip if a modal with this id is already in the stack\n if (modalOnBase.id && context?.stack.some((m) => m.id === modalOnBase.id)) {\n return\n }\n\n // Skip if a modal with the same component and URL is already open\n if (context?.stack.some((m) => m.response?.component === modalOnBase.component && sameUrlPath(m.response?.url, modalOnBase.url))) {\n return\n }\n\n // Only set baseUrl when we're actually opening a new modal\n // (after deduplication checks pass)\n baseUrl = modalOnBase.baseUrl\n\n pendingModalKeysRef.current.add(modalKey)\n\n context\n ?.pushFromResponseData(modalOnBase, {}, () => {\n if (!modalOnBase.baseUrl) {\n console.error('No base url in modal response data so cannot navigate back')\n return\n }\n if (!isNavigatingRef.current && typeof window !== 'undefined' && window.location.href !== modalOnBase.baseUrl) {\n router.visit(modalOnBase.baseUrl, {\n preserveScroll: true,\n preserveState: true,\n })\n }\n })\n .finally(() => {\n pendingModalKeysRef.current.delete(modalKey)\n })\n }),\n [],\n )\n\n const axiosRequestInterceptor = (config: InternalAxiosRequestConfig) => {\n // A Modal is opened on top of a base route, so we need to pass this base route\n // so it can redirect back with the back() helper method...\n // Only send the header when we have an actual base URL value\n const baseUrlValue = baseUrl ?? (initialModalStillOpenedRef.current ? $page.props._inertiaui_modal?.baseUrl : null)\n if (baseUrlValue) {\n config.headers['X-InertiaUI-Modal-Base-Url'] = baseUrlValue\n }\n\n return config\n }\n\n useEffect(() => {\n const interceptorId = Axios.interceptors.request.use(axiosRequestInterceptor)\n return () => Axios.interceptors.request.eject(interceptorId)\n }, [])\n\n const previousModalRef = useRef<(ModalResponseData & { baseUrl: string }) | undefined>(undefined)\n\n useEffect(() => {\n const newModal = $page.props?._inertiaui_modal\n const previousModal = previousModalRef.current\n\n // Store the current value for the next render\n previousModalRef.current = newModal\n\n if (!newModal) {\n return\n }\n\n // If there's a previous modal with same component/URL, update its props\n if (previousModal && newModal.component === previousModal.component && sameUrlPath(newModal.url, previousModal.url)) {\n context?.stack[0]?.updateProps(newModal.props ?? {})\n return\n }\n\n // If there's no previous modal but we have modals in the stack (opened via XHR),\n // check if the new modal matches any open modal and update its props\n if (!previousModal && context && context.stack.length > 0) {\n const existingModal = context.stack.find(\n (m) => m.response?.component === newModal.component && sameUrlPath(m.response?.url, newModal.url),\n )\n if (existingModal) {\n existingModal.updateProps(newModal.props ?? {})\n }\n }\n }, [$page.props?._inertiaui_modal])\n\n return (\n <>\n {children}\n {context && context.stack.length > 0 && <ModalRenderer index={0} />}\n </>\n )\n}\n","import React, { useMemo, createElement } from 'react'\nimport { useModalStack } from './ModalRoot'\nimport type { ModalRendererProps } from './types'\n\nconst ModalIndexContext = React.createContext<number | null>(null)\nModalIndexContext.displayName = 'ModalIndexContext'\n\nexport const useModalIndex = (): number | null => {\n return React.useContext(ModalIndexContext)\n}\n\nconst ModalRenderer = ({ index }: ModalRendererProps) => {\n const { stack } = useModalStack()\n\n const modalContext = useMemo(() => {\n return stack[index]\n }, [stack, index])\n\n if (!modalContext?.component) {\n return null\n }\n\n return (\n <ModalIndexContext.Provider value={index}>\n {createElement(modalContext.component as React.ComponentType<Record<string, unknown>>, {\n ...modalContext.props,\n onModalEvent: (...args: unknown[]) => modalContext.emit('modal-event', ...args),\n })}\n </ModalIndexContext.Provider>\n )\n}\n\nexport default ModalRenderer\n","import { useModalIndex } from './ModalRenderer'\nimport { useModalStack } from './ModalRoot'\nimport type { Modal } from './types'\n\nexport default function useModal(): Modal | null {\n return useModalStack().stack[useModalIndex()] ?? null\n}\n","// See: https://github.com/inertiajs/inertia/blob/48bcd21fb7daf467d0df1bfde2408f161f94a579/packages/react/src/Deferred.ts\nimport { useEffect, useState, ReactNode } from 'react'\nimport useModal from './useModal'\n\ninterface DeferredProps {\n children: ReactNode\n data: string | string[]\n fallback?: ReactNode\n}\n\nconst Deferred = ({ children, data, fallback }: DeferredProps) => {\n if (!data) {\n throw new Error('`<Deferred>` requires a `data` prop to be a string or array of strings')\n }\n\n const [loaded, setLoaded] = useState(false)\n const keys = Array.isArray(data) ? data : [data]\n const modal = useModal()\n const modalProps = modal?.props ?? {}\n\n useEffect(() => {\n setLoaded(keys.every((key) => modalProps[key] !== undefined))\n }, [modalProps, keys])\n\n return loaded ? children : fallback\n}\n\nDeferred.displayName = 'InertiaModalDeferred'\n\nexport default Deferred\n","import { useMemo, useState, forwardRef, useImperativeHandle, useEffect, useRef, ReactNode } from 'react'\nimport { getConfig, getConfigByType } from './config'\nimport { useModalIndex } from './ModalRenderer'\nimport { useModalStack } from './ModalRoot'\nimport ModalRenderer from './ModalRenderer'\nimport type { Modal, ModalConfig, ReloadOptions } from './types'\n\ninterface HeadlessModalConfig {\n slideover: boolean\n closeButton: boolean\n closeExplicitly: boolean\n closeOnClickOutside: boolean\n maxWidth: string\n paddingClasses: string\n panelClasses: string\n position: string\n}\n\ninterface HeadlessModalRenderProps {\n afterLeave: () => void\n close: () => void\n config: HeadlessModalConfig\n emit: (event: string, ...args: unknown[]) => void\n getChildModal: () => Modal | null\n getParentModal: () => Modal | null\n id: string\n index: number\n isOpen: boolean\n modalContext: Modal\n onTopOfStack: boolean\n reload: (options?: ReloadOptions) => void\n setOpen: (open: boolean) => void\n shouldRender: boolean\n // Allow additional props from visitModal\n [key: string]: unknown\n}\n\ninterface HeadlessModalBaseProps {\n name?: string\n children: ReactNode | ((props: HeadlessModalRenderProps) => ReactNode)\n onFocus?: () => void\n onBlur?: () => void\n onClose?: () => void\n onSuccess?: () => void\n slideover?: boolean\n closeButton?: boolean\n closeExplicitly?: boolean\n closeOnClickOutside?: boolean\n maxWidth?: string\n paddingClasses?: string\n panelClasses?: string\n position?: string\n}\n\ntype HeadlessModalProps = HeadlessModalBaseProps & Record<string, unknown>\n\nexport interface HeadlessModalRef {\n afterLeave: () => void\n close: () => void\n emit: (event: string, ...args: unknown[]) => void\n getChildModal: () => Modal | null | undefined\n getParentModal: () => Modal | null | undefined\n reload: (options?: ReloadOptions) => void\n setOpen: (open: boolean) => void\n readonly id: string | undefined\n readonly index: number | undefined\n readonly isOpen: boolean | undefined\n readonly config: ModalConfig | undefined\n readonly modalContext: Modal | null\n readonly onTopOfStack: boolean | undefined\n readonly shouldRender: boolean | undefined\n}\n\nconst HeadlessModal = forwardRef<HeadlessModalRef, HeadlessModalProps>(\n (allProps, ref) => {\n const { name, children, onFocus, onBlur, onClose, onSuccess, ...props } = allProps as HeadlessModalBaseProps & Record<string, unknown>\n const modalIndex = useModalIndex()\n const { stack, registerLocalModal, removeLocalModal } = useModalStack()\n\n const [localModalContext, setLocalModalContext] = useState<Modal | null>(null)\n const modalContext = useMemo(\n () => (name ? localModalContext : stack[modalIndex]),\n [name, localModalContext, modalIndex, stack],\n )\n\n const nextIndex = useMemo(() => {\n return stack.find((m) => m.shouldRender && m.index > (modalContext?.index ?? -1))?.index\n }, [modalIndex, stack])\n\n const configSlideover = useMemo(\n () => modalContext?.config.slideover ?? props.slideover ?? getConfig('type') === 'slideover',\n [props.slideover, modalContext?.config.slideover],\n )\n\n const config: HeadlessModalConfig = useMemo(\n () => ({\n slideover: configSlideover as boolean,\n closeButton: (props.closeButton ?? getConfigByType(configSlideover as boolean, 'closeButton')) as boolean,\n closeExplicitly: (props.closeExplicitly ?? getConfigByType(configSlideover as boolean, 'closeExplicitly')) as boolean,\n closeOnClickOutside: (props.closeOnClickOutside ?? getConfigByType(configSlideover as boolean, 'closeOnClickOutside')) as boolean,\n maxWidth: (props.maxWidth ?? getConfigByType(configSlideover as boolean, 'maxWidth')) as string,\n paddingClasses: (props.paddingClasses ?? getConfigByType(configSlideover as boolean, 'paddingClasses')) as string,\n panelClasses: (props.panelClasses ?? getConfigByType(configSlideover as boolean, 'panelClasses')) as string,\n position: (props.position ?? getConfigByType(configSlideover as boolean, 'position')) as string,\n ...modalContext?.config,\n }),\n [props, modalContext?.config, configSlideover],\n )\n\n useEffect(() => {\n if (name) {\n let removeListeners: (() => void) | null = null\n\n registerLocalModal(name as string, (localContext) => {\n removeListeners = localContext.registerEventListenersFromProps(props as Record<string, unknown>)\n setLocalModalContext(localContext)\n })\n\n return () => {\n removeListeners?.()\n removeListeners = null\n removeLocalModal(name as string)\n }\n }\n\n return modalContext?.registerEventListenersFromProps(props as Record<string, unknown>)\n }, [name])\n\n // Store the latest modalContext in a ref to maintain reference\n const modalContextRef = useRef(modalContext)\n\n // Update the ref whenever modalContext changes\n useEffect(() => {\n modalContextRef.current = modalContext\n }, [modalContext])\n\n // Track previous isOpen value to only emit close when transitioning from true to false\n const previousIsOpenRef = useRef<boolean | undefined>(undefined)\n\n useEffect(() => {\n if (modalContext !== null) {\n if (modalContext.isOpen) {\n onSuccess?.()\n } else if (previousIsOpenRef.current === true) {\n // Only call onClose when transitioning from open to closed,\n // not when the component first mounts with isOpen undefined/false\n onClose?.()\n }\n previousIsOpenRef.current = modalContext.isOpen\n }\n }, [modalContext?.isOpen])\n\n const [rendered, setRendered] = useState(false)\n\n useEffect(() => {\n if (rendered && modalContext !== null && modalContext.isOpen) {\n if (modalContext.onTopOfStack) {\n onFocus?.()\n } else {\n onBlur?.()\n }\n }\n\n setRendered(true)\n }, [modalContext?.onTopOfStack])\n\n useImperativeHandle(\n ref,\n () => ({\n afterLeave: () => modalContextRef.current?.afterLeave(),\n close: () => modalContextRef.current?.close(),\n emit: (...args: [string, ...unknown[]]) => modalContextRef.current?.emit(...args),\n getChildModal: () => modalContextRef.current?.getChildModal(),\n getParentModal: () => modalContextRef.current?.getParentModal(),\n reload: (options?: ReloadOptions) => modalContextRef.current?.reload(options),\n setOpen: (open: boolean) => modalContextRef.current?.setOpen(open),\n\n get id() {\n return modalContextRef.current?.id\n },\n get index() {\n return modalContextRef.current?.index\n },\n get isOpen() {\n return modalContextRef.current?.isOpen\n },\n get config() {\n return modalContextRef.current?.config\n },\n get modalContext() {\n return modalContextRef.current\n },\n get onTopOfStack() {\n return modalContextRef.current?.onTopOfStack\n },\n get shouldRender() {\n return modalContextRef.current?.shouldRender\n },\n }),\n [modalContext],\n )\n\n if (!modalContext?.shouldRender) {\n return null\n }\n\n return (\n <>\n {typeof children === 'function'\n ? children({\n // Spread props first so they can be overridden by built-in props\n ...modalContext.props,\n afterLeave: modalContext.afterLeave,\n close: modalContext.close,\n config,\n emit: modalContext.emit,\n getChildModal: modalContext.getChildModal,\n getParentModal: modalContext.getParentModal,\n id: modalContext.id,\n index: modalContext.index,\n isOpen: modalContext.isOpen,\n modalContext,\n onTopOfStack: modalContext.onTopOfStack,\n reload: modalContext.reload,\n setOpen: modalContext.setOpen,\n shouldRender: modalContext.shouldRender,\n })\n : children}\n\n {/* Next modal in the stack */}\n {nextIndex !== undefined && <ModalRenderer index={nextIndex} />}\n </>\n )\n },\n)\n\nHeadlessModal.displayName = 'HeadlessModal'\nexport default HeadlessModal\n","interface CloseButtonProps {\n onClick: () => void\n}\n\nexport default function CloseButton({ onClick }: CloseButtonProps) {\n return (\n <button\n type=\"button\"\n className=\"im-close-button text-gray-400 hover:text-gray-500\"\n onClick={onClick}\n >\n <span className=\"sr-only\">Close</span>\n <svg\n className=\"size-6\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"2\"\n stroke=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )\n}\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","/**\n * Max width classes for modals and slideovers.\n * Uses a map lookup for Tailwind 4 compatibility (scanner picks up full class strings).\n */\nexport const maxWidthClasses: Record<string, string> = {\n sm: 'sm:max-w-sm',\n md: 'sm:max-w-md',\n lg: 'sm:max-w-md md:max-w-lg',\n xl: 'sm:max-w-md md:max-w-xl',\n '2xl': 'sm:max-w-md md:max-w-xl lg:max-w-2xl',\n '3xl': 'sm:max-w-md md:max-w-xl lg:max-w-3xl',\n '4xl': 'sm:max-w-md md:max-w-xl lg:max-w-3xl xl:max-w-4xl',\n '5xl': 'sm:max-w-md md:max-w-xl lg:max-w-3xl xl:max-w-5xl',\n '6xl': 'sm:max-w-md md:max-w-xl lg:max-w-3xl xl:max-w-5xl 2xl:max-w-6xl',\n '7xl': 'sm:max-w-md md:max-w-xl lg:max-w-3xl xl:max-w-5xl 2xl:max-w-7xl',\n}\n\nexport const defaultMaxWidth = '2xl'\n\nexport function getMaxWidthClass(maxWidth: string): string {\n return maxWidthClasses[maxWidth] || maxWidthClasses[defaultMaxWidth]\n}\n","import { useState, useEffect, useRef, useCallback, useMemo, ReactNode, SyntheticEvent, MouseEvent } from 'react'\nimport CloseButton from './CloseButton'\nimport clsx from 'clsx'\nimport { createFocusTrap, onEscapeKey, animate, cancelAnimations } from '@inertiaui/vanilla'\nimport { getMaxWidthClass } from './constants'\nimport type { Modal } from './types'\n\ninterface ModalContentConfig {\n maxWidth: string\n paddingClasses: string\n panelClasses: string\n position: string\n closeButton: boolean\n closeExplicitly?: boolean\n closeOnClickOutside?: boolean\n}\n\ninterface ModalContentProps {\n modalContext: Modal\n config: ModalContentConfig\n useNativeDialog: boolean\n isFirstModal: boolean\n onAfterLeave?: () => void\n children: ReactNode | ((props: { modalContext: Modal; config: ModalContentConfig }) => ReactNode)\n}\n\nconst ModalContent = ({ modalContext, config, useNativeDialog, isFirstModal, onAfterLeave, children }: ModalContentProps) => {\n const [isRendered, setIsRendered] = useState(false)\n const [isVisible, setIsVisible] = useState(false) // For backdrop sync\n const [entered, setEntered] = useState(false) // After animation completes\n const wrapperRef = useRef<HTMLDivElement>(null)\n const dialogRef = useRef<HTMLDialogElement>(null)\n const nativeWrapperRef = useRef<HTMLDivElement>(null)\n const cleanupFocusTrapRef = useRef<(() => void) | null>(null)\n const cleanupEscapeKeyRef = useRef<(() => void) | null>(null)\n\n const maxWidthClass = useMemo(() => getMaxWidthClass(config.maxWidth), [config.maxWidth])\n\n // ============ Animation handlers using Web Animations API ============\n\n const animateIn = useCallback(async (element: HTMLElement | null) => {\n if (!element) return\n\n setIsVisible(true) // Trigger backdrop immediately\n\n await animate(element, [\n { transform: 'translate3d(0, 1rem, 0) scale(0.95)', opacity: 0 },\n { transform: 'translate3d(0, 0, 0) scale(1)', opacity: 1 },\n ])\n\n setEntered(true)\n }, [])\n\n const animateOut = useCallback(\n async (element: HTMLElement | null) => {\n if (!element) return\n\n setIsVisible(false) // Trigger backdrop fade out immediately\n\n await animate(element, [\n { transform: 'translate3d(0, 0, 0) scale(1)', opacity: 1 },\n { transform: 'translate3d(0, 1rem, 0) scale(0.95)', opacity: 0 },\n ])\n\n setIsRendered(false)\n if (useNativeDialog && dialogRef.current) {\n dialogRef.current.close()\n }\n onAfterLeave?.()\n modalContext.afterLeave()\n },\n [useNativeDialog, onAfterLeave, modalContext],\n )\n\n // ============ Non-native dialog handlers ============\n\n const setupFocusTrap = useCallback(() => {\n if (useNativeDialog) return\n if (!wrapperRef.current || !modalContext.onTopOfStack) return\n if (cleanupFocusTrapRef.current) return\n\n cleanupFocusTrapRef.current = createFocusTrap(wrapperRef.current, {\n initialFocus: true,\n returnFocus: false,\n })\n }, [modalContext.onTopOfStack, useNativeDialog])\n\n const cleanupFocusTrap = useCallback(() => {\n if (cleanupFocusTrapRef.current) {\n cleanupFocusTrapRef.current()\n cleanupFocusTrapRef.current = null\n }\n }, [])\n\n const setupEscapeKey = useCallback(() => {\n if (useNativeDialog) return\n if (cleanupEscapeKeyRef.current) return\n if (config?.closeExplicitly) return\n\n cleanupEscapeKeyRef.current = onEscapeKey(() => {\n if (modalContext.onTopOfStack) {\n modalContext.close()\n }\n })\n }, [config?.closeExplicitly, modalContext, useNativeDialog])\n\n const cleanupEscapeKey = useCallback(() => {\n if (cleanupEscapeKeyRef.current) {\n cleanupEscapeKeyRef.current()\n cleanupEscapeKeyRef.current = null\n }\n }, [])\n\n const handleClickOutside = useCallback(\n (event: MouseEvent) => {\n if (useNativeDialog) return\n if (!modalContext.onTopOfStack) return\n if (config?.closeExplicitly) return\n if (config?.closeOnClickOutside === false) return\n if (!wrapperRef.current) return\n\n if (!wrapperRef.current.contains(event.target as Node)) {\n modalContext.close()\n }\n },\n [modalContext, config?.closeExplicitly, config?.closeOnClickOutside, useNativeDialog],\n )\n\n // ============ Native dialog handlers ============\n\n const handleCancel = useCallback(\n (event: SyntheticEvent) => {\n event.preventDefault()\n if (modalContext.onTopOfStack && !config?.closeExplicitly) {\n modalContext.close()\n }\n },\n [modalContext, config?.closeExplicitly],\n )\n\n const handleDialogClick = useCallback(\n (event: MouseEvent) => {\n if (event.target === dialogRef.current) {\n if (modalContext.onTopOfStack && !config?.closeExplicitly && config?.closeOnClickOutside !== false) {\n modalContext.close()\n }\n }\n },\n [modalContext, config?.closeExplicitly, config?.closeOnClickOutside],\n )\n\n // ============ Lifecycle ============\n\n // Track previous isOpen state for detecting close\n const prevIsOpenRef = useRef(modalContext.isOpen)\n\n // Initial mount and open state changes\n useEffect(() => {\n if (useNativeDialog) {\n if (modalContext.isOpen && !dialogRef.current?.open) {\n dialogRef.current?.showModal()\n animateIn(nativeWrapperRef.current)\n } else if (!modalContext.isOpen && prevIsOpenRef.current) {\n setEntered(false)\n animateOut(nativeWrapperRef.current)\n }\n } else {\n if (modalContext.isOpen && !isRendered) {\n setIsRendered(true)\n } else if (!modalContext.isOpen && prevIsOpenRef.current) {\n setEntered(false)\n animateOut(wrapperRef.current)\n }\n }\n prevIsOpenRef.current = modalContext.isOpen\n }, [modalContext.isOpen, useNativeDialog, animateIn, animateOut, isRendered])\n\n // Trigger animation after render (non-native)\n useEffect(() => {\n if (!useNativeDialog && isRendered && !entered && modalContext.isOpen) {\n animateIn(wrapperRef.current).then(() => {\n setupFocusTrap()\n })\n }\n }, [isRendered, useNativeDialog, entered, modalContext.isOpen, animateIn, setupFocusTrap])\n\n // Setup escape key (non-native)\n useEffect(() => {\n if (!useNativeDialog) {\n setupEscapeKey()\n }\n return () => {\n cleanupEscapeKey()\n }\n }, [useNativeDialog, setupEscapeKey, cleanupEscapeKey])\n\n // Handle becoming top of stack / losing top of stack (non-native only)\n useEffect(() => {\n if (useNativeDialog) return\n\n if (modalContext.onTopOfStack) {\n setupEscapeKey()\n if (entered) {\n setupFocusTrap()\n }\n } else {\n cleanupFocusTrap()\n cleanupEscapeKey()\n }\n }, [modalContext.onTopOfStack, entered, setupEscapeKey, setupFocusTrap, cleanupFocusTrap, cleanupEscapeKey, useNativeDialog])\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n const wrapper = useNativeDialog ? nativeWrapperRef.current : wrapperRef.current\n if (wrapper) {\n cancelAnimations(wrapper)\n }\n if (useNativeDialog) {\n if (dialogRef.current?.open) {\n dialogRef.current.close()\n }\n } else {\n cleanupFocusTrap()\n cleanupEscapeKey()\n }\n }\n }, [useNativeDialog, cleanupFocusTrap, cleanupEscapeKey])\n\n // ============ Render ============\n\n const renderContent = () => (\n <div\n className={`im-modal-content relative ${config.paddingClasses} ${config.panelClasses}`}\n data-inertiaui-modal-entered={entered}\n >\n {config.closeButton && (\n <div className=\"absolute right-0 top-0 pr-3 pt-3\">\n <CloseButton onClick={modalContext.close} />\n </div>\n )}\n {typeof children === 'function' ? children({ modalContext, config }) : children}\n </div>\n )\n\n // Native dialog mode\n if (useNativeDialog) {\n return (\n <dialog\n ref={dialogRef}\n className={clsx(\n 'im-modal-dialog m-0 overflow-visible bg-transparent p-0',\n 'size-full max-h-none max-w-none',\n 'backdrop:bg-black/75 backdrop:transition-opacity backdrop:duration-300',\n isVisible ? 'backdrop:opacity-100' : 'backdrop:opacity-0',\n !isFirstModal && 'backdrop:bg-transparent',\n )}\n onCancel={handleCancel}\n onClick={handleDialogClick}\n >\n <div className=\"im-modal-container fixed inset-0 overflow-y-auto p-4\">\n <div\n className={clsx('im-modal-positioner flex min-h-full justify-center', {\n 'items-start': config.position === 'top',\n 'items-center': config.position === 'center',\n 'items-end': config.position === 'bottom',\n })}\n >\n <div\n ref={nativeWrapperRef}\n className={clsx('im-modal-wrapper w-full transition-[filter] duration-300', modalContext.onTopOfStack ? '' : 'blur-xs', maxWidthClass)}\n >\n {renderContent()}\n </div>\n </div>\n </div>\n </dialog>\n )\n }\n\n // Non-native dialog mode\n if (!isRendered) return null\n\n return (\n <div\n className=\"im-modal-container fixed inset-0 z-40 overflow-y-auto p-4\"\n onMouseDown={handleClickOutside}\n >\n <div\n className={clsx('im-modal-positioner flex min-h-full justify-center', {\n 'items-start': config.position === 'top',\n 'items-center': config.position === 'center',\n 'items-end': config.position === 'bottom',\n })}\n onMouseDown={handleClickOutside}\n >\n <div\n ref={wrapperRef}\n role=\"dialog\"\n aria-modal=\"true\"\n className={clsx('im-modal-wrapper w-full transition-[filter] duration-300', modalContext.onTopOfStack ? '' : 'blur-xs', maxWidthClass)}\n >\n <span className=\"sr-only\">Dialog</span>\n {renderContent()}\n </div>\n </div>\n </div>\n )\n}\n\nexport default ModalContent\n","import { useState, useEffect, useRef, useCallback, useMemo, ReactNode, SyntheticEvent, MouseEvent } from 'react'\nimport CloseButton from './CloseButton'\nimport clsx from 'clsx'\nimport { createFocusTrap, onEscapeKey, animate, cancelAnimations } from '@inertiaui/vanilla'\nimport { getMaxWidthClass } from './constants'\nimport type { Modal } from './types'\n\ninterface SlideoverContentConfig {\n maxWidth: string\n paddingClasses: string\n panelClasses: string\n position: string\n closeButton: boolean\n closeExplicitly?: boolean\n closeOnClickOutside?: boolean\n}\n\ninterface SlideoverContentProps {\n modalContext: Modal\n config: SlideoverContentConfig\n useNativeDialog: boolean\n isFirstModal: boolean\n onAfterLeave?: () => void\n children: ReactNode | ((props: { modalContext: Modal; config: SlideoverContentConfig }) => ReactNode)\n}\n\nconst SlideoverContent = ({ modalContext, config, useNativeDialog, isFirstModal, onAfterLeave, children }: SlideoverContentProps) => {\n const [isRendered, setIsRendered] = useState(false)\n const [isVisible, setIsVisible] = useState(false) // For backdrop sync\n const [entered, setEntered] = useState(false) // After animation completes\n const wrapperRef = useRef<HTMLDivElement>(null)\n const dialogRef = useRef<HTMLDialogElement>(null)\n const nativeWrapperRef = useRef<HTMLDivElement>(null)\n const cleanupFocusTrapRef = useRef<(() => void) | null>(null)\n const cleanupEscapeKeyRef = useRef<(() => void) | null>(null)\n\n const isLeft = config.position === 'left'\n\n const maxWidthClass = useMemo(() => getMaxWidthClass(config.maxWidth), [config.maxWidth])\n\n // Get translate value based on position\n const getTranslateX = useCallback(() => (isLeft ? '-100%' : '100%'), [isLeft])\n\n // ============ Animation handlers using Web Animations API ============\n\n const animateIn = useCallback(\n async (element: HTMLElement | null) => {\n if (!element) return\n\n setIsVisible(true) // Trigger backdrop immediately\n const translateX = getTranslateX()\n\n await animate(element, [\n { transform: `translate3d(${translateX}, 0, 0)`, opacity: 0 },\n { transform: 'translate3d(0, 0, 0)', opacity: 1 },\n ])\n\n setEntered(true)\n },\n [getTranslateX],\n )\n\n const animateOut = useCallback(\n async (element: HTMLElement | null) => {\n if (!element) return\n\n setIsVisible(false) // Trigger backdrop fade out immediately\n const translateX = getTranslateX()\n\n await animate(element, [\n { transform: 'translate3d(0, 0, 0)', opacity: 1 },\n { transform: `translate3d(${translateX}, 0, 0)`, opacity: 0 },\n ])\n\n setIsRendered(false)\n if (useNativeDialog && dialogRef.current) {\n dialogRef.current.close()\n }\n onAfterLeave?.()\n modalContext.afterLeave()\n },\n [getTranslateX, useNativeDialog, onAfterLeave, modalContext],\n )\n\n // ============ Non-native dialog handlers ============\n\n const setupFocusTrap = useCallback(() => {\n if (useNativeDialog) return\n if (!wrapperRef.current || !modalContext.onTopOfStack) return\n if (cleanupFocusTrapRef.current) return\n\n cleanupFocusTrapRef.current = createFocusTrap(wrapperRef.current, {\n initialFocus: true,\n returnFocus: false,\n })\n }, [modalContext.onTopOfStack, useNativeDialog])\n\n const cleanupFocusTrap = useCallback(() => {\n if (cleanupFocusTrapRef.current) {\n cleanupFocusTrapRef.current()\n cleanupFocusTrapRef.current = null\n }\n }, [])\n\n const setupEscapeKey = useCallback(() => {\n if (useNativeDialog) return\n if (cleanupEscapeKeyRef.current) return\n if (config?.closeExplicitly) return\n\n cleanupEscapeKeyRef.current = onEscapeKey(() => {\n if (modalContext.onTopOfStack) {\n modalContext.close()\n }\n })\n }, [config?.closeExplicitly, modalContext, useNativeDialog])\n\n const cleanupEscapeKey = useCallback(() => {\n if (cleanupEscapeKeyRef.current) {\n cleanupEscapeKeyRef.current()\n cleanupEscapeKeyRef.current = null\n }\n }, [])\n\n const handleClickOutside = useCallback(\n (event: MouseEvent) => {\n if (useNativeDialog) return\n if (!modalContext.onTopOfStack) return\n if (config?.closeExplicitly) return\n if (config?.closeOnClickOutside === false) return\n if (!wrapperRef.current) return\n\n if (!wrapperRef.current.contains(event.target as Node)) {\n modalContext.close()\n }\n },\n [modalContext, config?.closeExplicitly, config?.closeOnClickOutside, useNativeDialog],\n )\n\n // ============ Native dialog handlers ============\n\n const handleCancel = useCallback(\n (event: SyntheticEvent) => {\n event.preventDefault()\n if (modalContext.onTopOfStack && !config?.closeExplicitly) {\n modalContext.close()\n }\n },\n [modalContext, config?.closeExplicitly],\n )\n\n const handleDialogClick = useCallback(\n (event: MouseEvent) => {\n if (event.target === dialogRef.current) {\n if (modalContext.onTopOfStack && !config?.closeExplicitly && config?.closeOnClickOutside !== false) {\n modalContext.close()\n }\n }\n },\n [modalContext, config?.closeExplicitly, config?.closeOnClickOutside],\n )\n\n // ============ Lifecycle ============\n\n // Track previous isOpen state for detecting close\n const prevIsOpenRef = useRef(modalContext.isOpen)\n\n // Initial mount and open state changes\n useEffect(() => {\n if (useNativeDialog) {\n if (modalContext.isOpen && !dialogRef.current?.open) {\n dialogRef.current?.showModal()\n animateIn(nativeWrapperRef.current)\n } else if (!modalContext.isOpen && prevIsOpenRef.current) {\n setEntered(false)\n animateOut(nativeWrapperRef.current)\n }\n } else {\n if (modalContext.isOpen && !isRendered) {\n setIsRendered(true)\n } else if (!modalContext.isOpen && prevIsOpenRef.current) {\n setEntered(false)\n animateOut(wrapperRef.current)\n }\n }\n prevIsOpenRef.current = modalContext.isOpen\n }, [modalContext.isOpen, useNativeDialog, animateIn, animateOut, isRendered])\n\n // Trigger animation after render (non-native)\n useEffect(() => {\n if (!useNativeDialog && isRendered && !entered && modalContext.isOpen) {\n animateIn(wrapperRef.current).then(() => {\n setupFocusTrap()\n })\n }\n }, [isRendered, useNativeDialog, entered, modalContext.isOpen, animateIn, setupFocusTrap])\n\n // Setup escape key (non-native)\n useEffect(() => {\n if (!useNativeDialog) {\n setupEscapeKey()\n }\n return () => {\n cleanupEscapeKey()\n }\n }, [useNativeDialog, setupEscapeKey, cleanupEscapeKey])\n\n // Handle becoming top of stack / losing top of stack (non-native only)\n useEffect(() => {\n if (useNativeDialog) return\n\n if (modalContext.onTopOfStack) {\n setupEscapeKey()\n if (entered) {\n setupFocusTrap()\n }\n } else {\n cleanupFocusTrap()\n cleanupEscapeKey()\n }\n }, [modalContext.onTopOfStack, entered, setupEscapeKey, setupFocusTrap, cleanupFocusTrap, cleanupEscapeKey, useNativeDialog])\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n const wrapper = useNativeDialog ? nativeWrapperRef.current : wrapperRef.current\n if (wrapper) {\n cancelAnimations(wrapper)\n }\n if (useNativeDialog) {\n if (dialogRef.current?.open) {\n dialogRef.current.close()\n }\n } else {\n cleanupFocusTrap()\n cleanupEscapeKey()\n }\n }\n }, [useNativeDialog, cleanupFocusTrap, cleanupEscapeKey])\n\n // ============ Render ============\n\n const renderContent = () => (\n <div\n className={`im-slideover-content relative ${config.paddingClasses} ${config.panelClasses}`}\n data-inertiaui-modal-entered={entered}\n >\n {config.closeButton && (\n <div className=\"absolute right-0 top-0 pr-3 pt-3\">\n <CloseButton onClick={modalContext.close} />\n </div>\n )}\n {typeof children === 'function' ? children({ modalContext, config }) : children}\n </div>\n )\n\n // Native dialog mode\n if (useNativeDialog) {\n return (\n <dialog\n ref={dialogRef}\n className={clsx(\n 'im-slideover-dialog m-0 overflow-visible bg-transparent p-0',\n 'size-full max-h-none max-w-none',\n 'backdrop:bg-black/75 backdrop:transition-opacity backdrop:duration-300',\n isVisible ? 'backdrop:opacity-100' : 'backdrop:opacity-0',\n !isFirstModal && 'backdrop:bg-transparent',\n )}\n onCancel={handleCancel}\n onClick={handleDialogClick}\n >\n <div className=\"im-slideover-container fixed inset-0 overflow-y-auto overflow-x-hidden\">\n <div\n className={clsx('im-slideover-positioner flex min-h-full items-center', {\n 'justify-start rtl:justify-end': config?.position === 'left',\n 'justify-end rtl:justify-start': config?.position === 'right',\n })}\n >\n <div\n ref={nativeWrapperRef}\n className={clsx('im-slideover-wrapper w-full transition-[filter] duration-300', modalContext.onTopOfStack ? '' : 'blur-xs', maxWidthClass)}\n >\n {renderContent()}\n </div>\n </div>\n </div>\n </dialog>\n )\n }\n\n // Non-native dialog mode\n if (!isRendered) return null\n\n return (\n <div\n className=\"im-slideover-container fixed inset-0 z-40 overflow-y-auto overflow-x-hidden\"\n onMouseDown={handleClickOutside}\n >\n <div\n className={clsx('im-slideover-positioner flex min-h-full items-center', {\n 'justify-start rtl:justify-end': config?.position === 'left',\n 'justify-end rtl:justify-start': config?.position === 'right',\n })}\n onMouseDown={handleClickOutside}\n >\n <div\n ref={wrapperRef}\n role=\"dialog\"\n aria-modal=\"true\"\n className={clsx('im-slideover-wrapper w-full transition-[filter] duration-300', modalContext.onTopOfStack ? '' : 'blur-xs', maxWidthClass)}\n >\n <span className=\"sr-only\">Dialog</span>\n {renderContent()}\n </div>\n </div>\n </div>\n )\n}\n\nexport default SlideoverContent\n","import { forwardRef, useRef, useImperativeHandle, useState, useEffect, useCallback, useMemo, ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\nimport HeadlessModal, { HeadlessModalRef } from './HeadlessModal'\nimport ModalContent from './ModalContent'\nimport SlideoverContent from './SlideoverContent'\nimport { lockScroll, markAriaHidden } from '@inertiaui/vanilla'\nimport { getConfig } from './config'\nimport type { Modal as ModalType, ReloadOptions } from './types'\n\ninterface ModalConfig {\n slideover: boolean\n closeButton: boolean\n closeExplicitly: boolean\n maxWidth: string\n paddingClasses: string\n panelClasses: string\n position: string\n}\n\ninterface ModalRenderProps {\n afterLeave: () => void\n close: () => void\n config: ModalConfig\n emit: (event: string, ...args: unknown[]) => void\n getChildModal: () => ModalType | null\n getParentModal: () => ModalType | null\n id: string\n index: number\n isOpen: boolean\n modalContext: ModalType\n onTopOfStack: boolean\n reload: (options?: ReloadOptions) => void\n setOpen: (open: boolean) => void\n shouldRender: boolean\n // Allow additional props from visitModal\n [key: string]: unknown\n}\n\ninterface ModalBaseProps {\n name?: string\n children: ReactNode | ((props: ModalRenderProps) => ReactNode)\n onFocus?: () => void\n onBlur?: () => void\n onClose?: () => void\n onSuccess?: () => void\n onAfterLeave?: () => void\n slideover?: boolean\n closeButton?: boolean\n closeExplicitly?: boolean\n maxWidth?: string\n paddingClasses?: string\n panelClasses?: string\n position?: string\n}\n\ntype ModalProps = ModalBaseProps & Record<string, unknown>\n\ninterface BackdropTransitionProps {\n show: boolean\n appear: boolean\n onAfterAppear?: () => void\n}\n\nconst Modal = forwardRef<HeadlessModalRef, ModalProps>(\n (allProps, ref) => {\n const { name, children, onFocus, onBlur, onClose, onSuccess, onAfterLeave, ...props } = allProps as ModalBaseProps & Record<string, unknown>\n const renderChildren = (contentProps: ModalRenderProps) => {\n if (typeof children === 'function') {\n return children(contentProps)\n }\n\n return children\n }\n\n const headlessModalRef = useRef<HeadlessModalRef>(null)\n const cleanupScrollLockRef = useRef<(() => void) | null>(null)\n const cleanupAriaHiddenRef = useRef<(() => void) | null>(null)\n const [rendered, setRendered] = useState(false)\n const useNativeDialog = useMemo(() => getConfig('useNativeDialog') as boolean, [])\n\n useImperativeHandle(ref, () => headlessModalRef.current!, [headlessModalRef])\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n cleanupScrollLockRef.current?.()\n cleanupAriaHiddenRef.current?.()\n }\n }, [])\n\n const handleSuccess = useCallback(() => {\n onSuccess?.()\n if (!cleanupScrollLockRef.current) {\n cleanupScrollLockRef.current = lockScroll()\n cleanupAriaHiddenRef.current = markAriaHidden(getConfig('appElement') as string)\n }\n }, [onSuccess])\n\n const handleClose = useCallback(() => {\n onClose?.()\n cleanupScrollLockRef.current?.()\n cleanupAriaHiddenRef.current?.()\n cleanupScrollLockRef.current = null\n cleanupAriaHiddenRef.current = null\n }, [onClose])\n\n const handleAfterLeave = useCallback(() => {\n onAfterLeave?.()\n }, [onAfterLeave])\n\n return (\n <HeadlessModal\n ref={headlessModalRef}\n name={name}\n onFocus={onFocus ?? undefined}\n onBlur={onBlur ?? undefined}\n onClose={handleClose}\n onSuccess={handleSuccess}\n {...props}\n >\n {({\n afterLeave,\n close,\n config,\n emit,\n getChildModal,\n getParentModal,\n id,\n index,\n isOpen,\n modalContext,\n onTopOfStack,\n reload,\n setOpen,\n shouldRender,\n ...extraProps\n }) => (\n <ModalPortal>\n <div\n className=\"im-dialog relative z-20\"\n data-inertiaui-modal-id={id}\n data-inertiaui-modal-index={index}\n aria-hidden={!onTopOfStack}\n >\n {/* Only render backdrop for the first modal (non-native dialog mode) */}\n {/* Native dialog uses ::backdrop pseudo-element instead */}\n {index === 0 && !useNativeDialog && (\n <BackdropTransition\n show={isOpen}\n appear={!rendered}\n onAfterAppear={() => setRendered(true)}\n />\n )}\n\n {/* The modal/slideover content itself */}\n {config.slideover ? (\n <SlideoverContent\n modalContext={modalContext}\n config={config}\n useNativeDialog={useNativeDialog}\n isFirstModal={index === 0}\n onAfterLeave={handleAfterLeave}\n >\n {renderChildren({\n ...extraProps,\n afterLeave,\n close,\n config,\n emit,\n getChildModal,\n getParentModal,\n id,\n index,\n isOpen,\n modalContext,\n onTopOfStack,\n reload,\n setOpen,\n shouldRender,\n })}\n </SlideoverContent>\n ) : (\n <ModalContent\n modalContext={modalContext}\n config={config}\n useNativeDialog={useNativeDialog}\n isFirstModal={index === 0}\n onAfterLeave={handleAfterLeave}\n >\n {renderChildren({\n ...extraProps,\n afterLeave,\n close,\n config,\n emit,\n getChildModal,\n getParentModal,\n id,\n index,\n isOpen,\n modalContext,\n onTopOfStack,\n reload,\n setOpen,\n shouldRender,\n })}\n </ModalContent>\n )}\n </div>\n </ModalPortal>\n )}\n </HeadlessModal>\n )\n },\n)\n\n// Simple portal component\nfunction ModalPortal({ children }: { children: ReactNode }) {\n const [mounted, setMounted] = useState(false)\n\n useEffect(() => {\n setMounted(true)\n }, [])\n\n if (!mounted) return null\n\n return createPortal(children, document.body)\n}\n\n// Backdrop with CSS transition\nfunction BackdropTransition({ show, appear, onAfterAppear }: BackdropTransitionProps) {\n const [state, setState] = useState<'entering' | 'entered' | 'leaving' | 'exited'>(() => {\n if (appear && show) return 'entering'\n return show ? 'entered' : 'exited'\n })\n const initialRender = useRef(true)\n const backdropRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (initialRender.current) {\n initialRender.current = false\n if (appear && show) {\n requestAnimationFrame(() => {\n setState('entered')\n const backdrop = backdropRef.current\n if (backdrop) {\n const onTransitionEnd = (e: TransitionEvent) => {\n if (e.target !== backdrop) return\n backdrop.removeEventListener('transitionend', onTransitionEnd)\n onAfterAppear?.()\n }\n backdrop.addEventListener('transitionend', onTransitionEnd)\n }\n })\n }\n return\n }\n\n if (show) {\n setState('entering')\n requestAnimationFrame(() => {\n setState('entered')\n })\n } else {\n setState('leaving')\n const backdrop = backdropRef.current\n if (backdrop) {\n const onTransitionEnd = (e: TransitionEvent) => {\n if (e.target !== backdrop) return\n backdrop.removeEventListener('transitionend', onTransitionEnd)\n setState('exited')\n }\n backdrop.addEventListener('transitionend', onTransitionEnd)\n }\n }\n }, [show, appear, onAfterAppear])\n\n if (state === 'exited') return null\n\n const isVisible = state === 'entered'\n\n return (\n <div\n ref={backdropRef}\n className={`im-backdrop fixed inset-0 z-30 bg-black/75 transition-opacity duration-300 ease-in-out ${isVisible ? 'opacity-100' : 'opacity-0'}`}\n aria-hidden=\"true\"\n />\n )\n}\n\nModal.displayName = 'Modal'\nexport default Modal\n","import { useCallback, useState, useEffect, useMemo, useRef, ReactNode, ElementType, MouseEvent } from 'react'\nimport { useModalStack, modalPropNames, prefetch as prefetchModal } from './ModalRoot'\nimport { only, rejectNullValues, isStandardDomEvent } from './helpers'\nimport { getConfig } from './config'\nimport type { Modal, PrefetchOption } from './types'\nimport type { RequestPayload } from '@inertiajs/core'\n\ninterface ModalLinkProps {\n href: string\n method?: string\n data?: RequestPayload\n as?: ElementType\n headers?: Record<string, string>\n queryStringArrayFormat?: 'brackets' | 'indices'\n onAfterLeave?: () => void\n onBlur?: () => void\n onClose?: () => void\n onError?: (error: unknown) => void\n onFocus?: () => void\n onStart?: () => void\n onSuccess?: () => void\n onPrefetching?: () => void\n onPrefetched?: () => void\n navigate?: boolean\n // Prefetch options (#146)\n prefetch?: PrefetchOption\n cacheFor?: number\n children: ReactNode | ((props: { loading: boolean }) => ReactNode)\n [key: string]: unknown\n}\n\nconst ModalLink = ({\n href,\n method = 'get',\n data = {} as RequestPayload,\n as: Component = 'a',\n headers = {},\n queryStringArrayFormat = 'brackets' as const,\n onAfterLeave,\n onBlur,\n onClose,\n onError,\n onFocus,\n onStart,\n onSuccess,\n onPrefetching,\n onPrefetched,\n navigate,\n prefetch = false,\n cacheFor = 30000,\n children,\n ...props\n}: ModalLinkProps) => {\n const [loading, setLoading] = useState(false)\n const [modalContext, setModalContext] = useState<Modal | null>(null)\n const { stack, visit } = useModalStack()\n const hoverTimeout = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const shouldNavigate = useMemo(() => {\n return navigate ?? (getConfig('navigate') as boolean)\n }, [navigate])\n\n // Prefetch logic (#146)\n const prefetchModes = useMemo(() => {\n if (prefetch === true) {\n return ['hover']\n }\n if (prefetch === false) {\n return []\n }\n if (Array.isArray(prefetch)) {\n return prefetch\n }\n return [prefetch]\n }, [prefetch])\n\n const doPrefetch = useCallback(() => {\n prefetchModal(href, {\n method,\n data,\n headers,\n queryStringArrayFormat,\n cacheFor,\n onPrefetching: onPrefetching ?? undefined,\n onPrefetched: onPrefetched ?? undefined,\n })\n }, [href, method, data, headers, queryStringArrayFormat, cacheFor, onPrefetching, onPrefetched])\n\n const handleMouseEnter = useCallback(() => {\n if (!prefetchModes.includes('hover')) return\n\n hoverTimeout.current = setTimeout(() => {\n doPrefetch()\n }, 75) // Small delay to avoid prefetching on accidental hovers\n }, [prefetchModes, doPrefetch])\n\n const handleMouseLeave = useCallback(() => {\n if (hoverTimeout.current) {\n clearTimeout(hoverTimeout.current)\n hoverTimeout.current = null\n }\n }, [])\n\n const handleMouseDown = useCallback(\n (event: MouseEvent) => {\n if (!prefetchModes.includes('click')) return\n if (event.button !== 0) return // Only left click\n\n doPrefetch()\n },\n [prefetchModes, doPrefetch],\n )\n\n // Prefetch on mount\n useEffect(() => {\n if (prefetchModes.includes('mount')) {\n doPrefetch()\n }\n }, [])\n\n // Cleanup hover timeout on unmount\n useEffect(() => {\n return () => {\n if (hoverTimeout.current) {\n clearTimeout(hoverTimeout.current)\n }\n }\n }, [])\n\n // Separate standard props from custom event handlers\n const standardProps: Record<string, unknown> = {}\n const customEvents: Record<string, (...args: unknown[]) => void> = {}\n\n Object.keys(props).forEach((key) => {\n if (modalPropNames.includes(key)) {\n return\n }\n\n if (key.startsWith('on') && typeof props[key] === 'function') {\n if (isStandardDomEvent(key)) {\n standardProps[key] = props[key]\n } else {\n customEvents[key] = props[key] as (...args: unknown[]) => void\n }\n } else {\n standardProps[key] = props[key]\n }\n })\n\n const [isBlurred, setIsBlurred] = useState(false)\n\n useEffect(() => {\n if (!modalContext) {\n return\n }\n\n if (modalContext.onTopOfStack && isBlurred) {\n onFocus?.()\n } else if (!modalContext.onTopOfStack && !isBlurred) {\n onBlur?.()\n }\n\n setIsBlurred(!modalContext.onTopOfStack)\n }, [stack])\n\n const onCloseCallback = useCallback(() => {\n onClose?.()\n }, [onClose])\n\n const onAfterLeaveCallback = useCallback(() => {\n setModalContext(null)\n onAfterLeave?.()\n }, [onAfterLeave])\n\n const handle = useCallback(\n (e?: MouseEvent) => {\n e?.preventDefault()\n if (loading) return\n\n if (!href.startsWith('#')) {\n setLoading(true)\n onStart?.()\n }\n\n visit(\n href,\n method,\n data,\n headers,\n rejectNullValues(only(props, modalPropNames)) as Record<string, unknown>,\n () => onCloseCallback(),\n onAfterLeaveCallback,\n queryStringArrayFormat,\n shouldNavigate,\n )\n .then((newModalContext) => {\n setModalContext(newModalContext)\n newModalContext.registerEventListenersFromProps(customEvents)\n onSuccess?.()\n })\n .catch((error) => {\n console.error(error)\n onError?.(error)\n })\n .finally(() => setLoading(false))\n },\n [href, method, data, headers, queryStringArrayFormat, props, onCloseCallback, onAfterLeaveCallback],\n )\n\n return (\n <Component\n {...standardProps}\n href={href}\n onClick={handle}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onMouseDown={handleMouseDown}\n >\n {typeof children === 'function' ? children({ loading }) : children}\n </Component>\n )\n}\n\nexport default ModalLink\n","// See: https://github.com/inertiajs/inertia/blob/48bcd21fb7daf467d0df1bfde2408f161f94a579/packages/react/src/WhenVisible.ts\nimport { createElement, useCallback, useEffect, useRef, useState, ReactNode, ElementType } from 'react'\nimport useModal from './useModal'\nimport type { ReloadOptions } from './types'\n\ninterface WhenVisibleProps {\n children: ReactNode\n data?: string | string[]\n params?: ReloadOptions\n buffer?: number\n as?: ElementType\n always?: boolean\n fallback?: ReactNode\n}\n\nconst WhenVisible = ({ children, data, params, buffer, as, always, fallback }: WhenVisibleProps) => {\n always = always ?? false\n as = as ?? 'div'\n fallback = fallback ?? null\n\n const [loaded, setLoaded] = useState(false)\n const hasFetched = useRef(false)\n const fetching = useRef(false)\n const ref = useRef<HTMLElement>(null)\n\n const modal = useModal()\n\n const getReloadParams = useCallback((): ReloadOptions => {\n if (data) {\n return {\n only: Array.isArray(data) ? data : [data],\n }\n }\n\n if (!params) {\n throw new Error('You must provide either a `data` or `params` prop.')\n }\n\n return params\n }, [params, data])\n\n useEffect(() => {\n if (!ref.current) {\n return\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (!entries[0].isIntersecting) {\n return\n }\n\n if (!always && hasFetched.current) {\n observer.disconnect()\n }\n\n if (fetching.current) {\n return\n }\n\n hasFetched.current = true\n fetching.current = true\n\n const reloadParams = getReloadParams()\n\n modal?.reload({\n ...reloadParams,\n onStart: () => {\n fetching.current = true\n reloadParams.onStart?.()\n },\n onFinish: () => {\n setLoaded(true)\n fetching.current = false\n reloadParams.onFinish?.()\n\n if (!always) {\n observer.disconnect()\n }\n },\n })\n },\n {\n rootMargin: `${buffer || 0}px`,\n },\n )\n\n observer.observe(ref.current)\n\n return () => {\n observer.disconnect()\n }\n }, [ref, getReloadParams, buffer])\n\n if (always || !loaded) {\n return createElement(\n as,\n {\n props: null,\n ref,\n },\n loaded ? children : fallback,\n )\n }\n\n return loaded ? children : null\n}\n\nWhenVisible.displayName = 'InertiaWhenVisible'\n\nexport default WhenVisible\n","import { createElement } from 'react'\nimport { getConfig, putConfig, resetConfig } from './config'\nimport { useModalIndex } from './ModalRenderer'\nimport { useModalStack, ModalRoot, ModalStackProvider, renderApp, initFromPageProps, modalPropNames, prefetch } from './ModalRoot'\nimport useModal from './useModal'\nimport Deferred from './Deferred'\nimport HeadlessModal from './HeadlessModal'\nimport Modal from './Modal'\nimport ModalLink from './ModalLink'\nimport WhenVisible from './WhenVisible'\nimport * as dialogUtils from '@inertiaui/vanilla'\n\n// Types\nexport type {\n Modal as ModalInstance,\n ModalConfig,\n ModalResponseData,\n ModalStackContextValue,\n VisitOptions,\n ReloadOptions,\n EventCallback,\n ComponentResolver,\n PageProps,\n ModalRootProps,\n ModalRendererProps,\n LocalModal,\n // Prefetch types (#146)\n PrefetchOption,\n PrefetchOptions,\n} from './types'\n\nexport type { ModalTypeConfig } from './config'\n\nexport type { CleanupFunction, FocusTrapOptions, EscapeKeyOptions } from '@inertiaui/vanilla'\n\nconst setPageLayout = <T extends { default: { layout?: (page: React.ReactNode) => React.ReactNode } }>(\n layout: React.ComponentType<{ children?: React.ReactNode }>,\n) => (module: T): T => {\n module.default.layout = (page) => createElement(layout, { children: page })\n return module\n}\n\nexport {\n Deferred,\n HeadlessModal,\n Modal,\n ModalLink,\n ModalRoot,\n ModalStackProvider,\n WhenVisible,\n getConfig,\n initFromPageProps,\n modalPropNames,\n putConfig,\n renderApp,\n resetConfig,\n setPageLayout,\n useModal,\n useModalIndex,\n useModalStack,\n // Prefetch function (#146)\n prefetch,\n // Dialog utilities (framework-agnostic)\n dialogUtils,\n}\n"],"names":["vanillaGenerateId","response","prefetch","prefetchModal"],"mappings":"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","x_google_ignoreList":[8]}
1
+ {"version":3,"file":"inertiaui-modal.js","sources":["../src/config.ts","../src/helpers.ts","../src/ModalRoot.tsx","../src/ModalRenderer.tsx","../src/useModal.ts","../src/Deferred.tsx","../src/HeadlessModal.tsx","../src/CloseButton.tsx","../node_modules/clsx/dist/clsx.mjs","../src/constants.ts","../src/ModalContent.tsx","../src/SlideoverContent.tsx","../src/Modal.tsx","../src/ModalLink.tsx","../src/WhenVisible.tsx","../src/inertiauiModal.ts"],"sourcesContent":["export interface ModalTypeConfig {\n closeButton: boolean\n closeExplicitly: boolean\n closeOnClickOutside: boolean\n maxWidth: string\n paddingClasses: string\n panelClasses: string\n position: string\n}\n\nexport interface ModalConfig {\n type: 'modal' | 'slideover'\n navigate: boolean\n useNativeDialog: boolean\n appElement: string | null\n modal: ModalTypeConfig\n slideover: ModalTypeConfig\n}\n\nconst defaultConfig: ModalConfig = {\n type: 'modal',\n navigate: false,\n useNativeDialog: true,\n appElement: '#app',\n modal: {\n closeButton: true,\n closeExplicitly: false,\n closeOnClickOutside: true,\n maxWidth: '2xl',\n paddingClasses: 'p-4 sm:p-6',\n panelClasses: 'bg-white rounded',\n position: 'center',\n },\n slideover: {\n closeButton: true,\n closeExplicitly: false,\n closeOnClickOutside: true,\n maxWidth: 'md',\n paddingClasses: 'p-4 sm:p-6',\n panelClasses: 'bg-white min-h-screen',\n position: 'right',\n },\n}\n\nclass Config {\n private config: ModalConfig\n\n constructor() {\n this.config = {} as ModalConfig\n this.reset()\n }\n\n reset(): void {\n this.config = JSON.parse(JSON.stringify(defaultConfig))\n }\n\n put(key: string | Partial<ModalConfig>, value?: unknown): void {\n if (typeof key === 'object') {\n this.config = {\n type: key.type ?? defaultConfig.type,\n navigate: key.navigate ?? defaultConfig.navigate,\n useNativeDialog: key.useNativeDialog ?? defaultConfig.useNativeDialog,\n appElement: key.appElement !== undefined ? key.appElement : defaultConfig.appElement,\n modal: { ...defaultConfig.modal, ...(key.modal ?? {}) },\n slideover: { ...defaultConfig.slideover, ...(key.slideover ?? {}) },\n }\n return\n }\n const keys = key.split('.')\n let current: Record<string, unknown> = this.config as unknown as Record<string, unknown>\n for (let i = 0; i < keys.length - 1; i++) {\n current = (current[keys[i]] = current[keys[i]] || {}) as Record<string, unknown>\n }\n current[keys[keys.length - 1]] = value\n }\n\n get(key?: string): unknown {\n if (typeof key === 'undefined') {\n return this.config\n }\n const keys = key.split('.')\n let current: unknown = this.config\n for (const k of keys) {\n if (current === null || current === undefined || typeof current !== 'object') {\n return null\n }\n current = (current as Record<string, unknown>)[k]\n }\n return current === undefined ? null : current\n }\n}\n\nconst configInstance = new Config()\n\nexport const resetConfig = (): void => configInstance.reset()\nexport const putConfig = (key: string | Partial<ModalConfig>, value?: unknown): void => configInstance.put(key, value)\nexport const getConfig = (key?: string): unknown => configInstance.get(key)\nexport const getConfigByType = (isSlideover: boolean, key: string): unknown =>\n configInstance.get(isSlideover ? `slideover.${key}` : `modal.${key}`)\n","// Re-export helper utilities from vanilla\nexport { sameUrlPath, except, only, rejectNullValues, kebabCase, isStandardDomEvent } from '@inertiaui/vanilla'\nimport { generateId as vanillaGenerateId } from '@inertiaui/vanilla'\n\n// Wrap generateId with custom callback support for testing\nlet generateIdUsingCallback: (() => string) | null = null\n\nexport function generateIdUsing(callback: (() => string) | null): void {\n generateIdUsingCallback = callback\n}\n\nexport function generateId(prefix = 'inertiaui_'): string {\n if (generateIdUsingCallback) {\n return generateIdUsingCallback()\n }\n return vanillaGenerateId(prefix)\n}\n","import { createElement, useEffect, useState, useRef, useReducer, ReactNode, ComponentType } from 'react'\nimport { default as Axios, AxiosResponse, InternalAxiosRequestConfig } from 'axios'\nimport { except, kebabCase, generateId, sameUrlPath } from './helpers'\nimport { router, usePage, progress } from '@inertiajs/react'\nimport { mergeDataIntoQueryString, type RequestPayload } from '@inertiajs/core'\nimport { createContext, useContext } from 'react'\nimport ModalRenderer from './ModalRenderer'\nimport { getConfig } from './config'\nimport type {\n Modal,\n ModalConfig,\n ModalResponseData,\n ModalStackContextValue,\n VisitOptions,\n ReloadOptions,\n EventCallback,\n ComponentResolver,\n PageProps,\n ModalRootProps,\n LocalModal,\n PrefetchOptions,\n} from './types'\n\nconst ModalStackContext = createContext<ModalStackContextValue | null>(null)\nModalStackContext.displayName = 'ModalStackContext'\n\nlet pageVersion: string | null = null\nlet resolveComponent: ComponentResolver | null = null\nlet baseUrl: string | null = null\n\n// Track the URL we're closing to (prevents navigate handler from re-setting baseUrl)\n// Only suppresses if navigate event URL matches this URL\nlet closingToBaseUrlTarget: string | null = null\n\n// Prefetch cache (#146)\ninterface PrefetchCacheEntry {\n response: AxiosResponse\n timestamp: number\n expiresAt: number\n}\n\nconst prefetchCache = new Map<string, PrefetchCacheEntry>()\nconst prefetchInFlight = new Map<string, Promise<AxiosResponse>>()\n\nfunction getPrefetchCacheKey(url: string, method: string, data: RequestPayload): string {\n return `${method}:${url}:${JSON.stringify(data)}`\n}\n\nfunction getCachedResponse(url: string, method: string, data: RequestPayload): AxiosResponse | null {\n const key = getPrefetchCacheKey(url, method, data)\n const cached = prefetchCache.get(key)\n\n if (!cached) {\n return null\n }\n\n if (Date.now() > cached.expiresAt) {\n prefetchCache.delete(key)\n return null\n }\n\n return cached.response\n}\n\nfunction setCachedResponse(url: string, method: string, data: RequestPayload, response: AxiosResponse, cacheFor: number): void {\n const key = getPrefetchCacheKey(url, method, data)\n prefetchCache.set(key, {\n response,\n timestamp: Date.now(),\n expiresAt: Date.now() + cacheFor,\n })\n}\n\nexport function prefetch(href: string, options: PrefetchOptions = {}): Promise<void> {\n if (href.startsWith('#')) {\n return Promise.resolve()\n }\n\n const method = (options.method ?? 'get').toLowerCase()\n const data = options.data ?? ({} as RequestPayload)\n const headers = options.headers ?? {}\n const queryStringArrayFormat = options.queryStringArrayFormat ?? 'brackets'\n const cacheFor = options.cacheFor ?? 30000\n\n const [url, mergedData] = mergeDataIntoQueryString(method as 'get' | 'post' | 'put' | 'patch' | 'delete', href || '', data, queryStringArrayFormat)\n\n // Check if already cached\n const cached = getCachedResponse(url, method, mergedData)\n if (cached) {\n return Promise.resolve()\n }\n\n // Check if already in flight\n const cacheKey = getPrefetchCacheKey(url, method, mergedData)\n const inFlight = prefetchInFlight.get(cacheKey)\n if (inFlight) {\n return inFlight.then(() => {})\n }\n\n options.onPrefetching?.()\n\n const requestHeaders: Record<string, string> = {\n ...headers,\n Accept: 'text/html, application/xhtml+xml',\n 'X-Requested-With': 'XMLHttpRequest',\n 'X-Inertia': 'true',\n 'X-Inertia-Version': pageVersion ?? '',\n 'X-InertiaUI-Modal': generateId(),\n 'X-InertiaUI-Modal-Base-Url': baseUrl ?? '',\n }\n\n const request = Axios({\n url,\n method,\n data: mergedData,\n headers: requestHeaders,\n })\n .then((response) => {\n setCachedResponse(url, method, mergedData, response, cacheFor)\n options.onPrefetched?.()\n return response\n })\n .finally(() => {\n prefetchInFlight.delete(cacheKey)\n })\n\n prefetchInFlight.set(cacheKey, request)\n\n return request.then(() => {})\n}\n\ninterface ModalStackProviderProps {\n children: ReactNode\n}\n\nexport const ModalStackProvider = ({ children }: ModalStackProviderProps) => {\n // Use ref for synchronous access to stack, state only for triggering re-renders\n const stackRef = useRef<Modal[]>([])\n const [, forceUpdate] = useReducer((x) => x + 1, 0)\n const [localModals, setLocalModals] = useState<Record<string, LocalModal>>({})\n\n const updateStack = (withStack: (prevStack: Modal[]) => Modal[]) => {\n const newStack = withStack([...stackRef.current])\n\n const isOnTopOfStack = (modalId: string) => {\n if (newStack.length < 2) {\n return true\n }\n\n return (\n newStack\n .map((modal) => ({ id: modal.id, shouldRender: modal.shouldRender }))\n .reverse()\n .find((modal) => modal.shouldRender)?.id === modalId\n )\n }\n\n newStack.forEach((modal, index) => {\n newStack[index].onTopOfStack = isOnTopOfStack(modal.id)\n newStack[index].getParentModal = () => {\n if (index < 1) {\n // This is the first modal in the stack\n return null\n }\n\n // Find the first open modal before this one\n return (\n stackRef.current\n .slice(0, index)\n .reverse()\n .find((m) => m.isOpen) ?? null\n )\n }\n newStack[index].getChildModal = () => {\n if (index === stackRef.current.length - 1) {\n // This is the last modal in the stack\n return null\n }\n\n // Find the first open modal after this one\n return stackRef.current.slice(index + 1).find((m) => m.isOpen) ?? null\n }\n })\n\n stackRef.current = newStack\n forceUpdate()\n }\n\n class ModalClass implements Modal {\n id: string\n isOpen: boolean\n shouldRender: boolean\n listeners: Record<string, EventCallback[]>\n component: ComponentType | null\n props: Record<string, unknown>\n response: ModalResponseData\n config: ModalConfig\n onCloseCallback: (() => void) | null\n afterLeaveCallback: (() => void) | null\n index: number\n onTopOfStack: boolean\n name?: string\n getParentModal: () => Modal | null\n getChildModal: () => Modal | null\n\n constructor(\n component: ComponentType | null,\n response: ModalResponseData,\n config?: ModalConfig | null,\n onClose?: (() => void) | null,\n afterLeave?: (() => void) | null,\n ) {\n this.id = response.id ?? generateId()\n this.isOpen = false\n this.shouldRender = false\n this.listeners = {}\n\n this.component = component\n this.props = response.props ?? {}\n this.response = response\n this.config = config ?? {}\n this.onCloseCallback = onClose ?? null\n this.afterLeaveCallback = afterLeave ?? null\n\n this.index = -1 // Will be set when added to the stack\n this.getParentModal = () => null // Will be set in push()\n this.getChildModal = () => null // Will be set in push()\n this.onTopOfStack = true // Will be updated in push()\n }\n\n show = () => {\n updateStack((prevStack) =>\n prevStack.map((modal) => {\n if (modal.id === this.id && !modal.isOpen) {\n modal.isOpen = true\n modal.shouldRender = true\n }\n return modal\n }),\n )\n }\n\n setOpen = (open: boolean) => {\n if (open) {\n this.show()\n } else {\n this.close()\n }\n }\n\n close = () => {\n updateStack((currentStack) => {\n let modalClosed = false\n\n const newStack = currentStack.map((modal) => {\n if (modal.id === this.id && modal.isOpen) {\n Object.keys(modal.listeners).forEach((event) => {\n modal.off(event)\n })\n\n modal.isOpen = false\n modal.onCloseCallback?.()\n modalClosed = true\n }\n return modal\n })\n\n return modalClosed ? newStack : currentStack\n })\n }\n\n afterLeave = () => {\n if (this.isOpen) {\n return\n }\n\n updateStack((prevStack) => {\n const updatedStack = prevStack.map((modal) => {\n if (modal.id === this.id && !modal.isOpen) {\n modal.shouldRender = false\n modal.afterLeaveCallback?.()\n modal.afterLeaveCallback = null\n }\n return modal\n })\n\n if (this.index === 0) {\n // Update browser URL back to base when all modals are closed\n // Clear baseUrl BEFORE router.push to prevent the navigate event\n // from setting it back (race condition with props callback)\n const savedBaseUrl = baseUrl\n baseUrl = null\n\n // Set target URL to prevent navigate handler from re-setting baseUrl\n // Only suppresses navigate events to this specific URL\n closingToBaseUrlTarget = savedBaseUrl\n\n // Only call router.push() when the URL actually changed (navigate mode).\n // In non-navigate mode (default), the URL never changes and _inertiaui_modal\n // is never in page props, so router.push() would be a no-op that triggers\n // an unnecessary full component re-render in Inertia v3.\n if (savedBaseUrl && typeof window !== 'undefined' && !sameUrlPath(savedBaseUrl, window.location.href)) {\n router.push({\n url: savedBaseUrl,\n preserveScroll: true,\n preserveState: true,\n // Clear _inertiaui_modal prop to prevent modal from reopening\n props: (currentProps: Record<string, unknown>) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { _inertiaui_modal, ...rest } = currentProps\n return { ...rest, _inertiaui_modal: undefined }\n },\n })\n }\n return []\n }\n\n return updatedStack\n })\n }\n\n on = (event: string, callback: EventCallback) => {\n event = kebabCase(event)\n this.listeners[event] = this.listeners[event] ?? []\n this.listeners[event].push(callback)\n }\n\n off = (event: string, callback?: EventCallback) => {\n event = kebabCase(event)\n if (callback) {\n this.listeners[event] = this.listeners[event]?.filter((cb) => cb !== callback) ?? []\n } else {\n delete this.listeners[event]\n }\n }\n\n emit = (event: string, ...args: unknown[]) => {\n this.listeners[kebabCase(event)]?.forEach((callback) => callback(...args))\n }\n\n registerEventListenersFromProps = (props: Record<string, unknown>) => {\n const unsubscribers: (() => void)[] = []\n\n Object.keys(props)\n .filter((key) => key.startsWith('on'))\n .forEach((key) => {\n // e.g. onRefreshKey -> refresh-key\n const eventName = kebabCase(key).replace(/^on-/, '')\n const callback = props[key] as EventCallback\n this.on(eventName, callback)\n unsubscribers.push(() => this.off(eventName, callback))\n })\n\n return () => unsubscribers.forEach((unsub) => unsub())\n }\n\n reload = (options: ReloadOptions = {}) => {\n let keys = Object.keys(this.response.props)\n\n if (options.only) {\n keys = options.only\n }\n\n if (options.except) {\n keys = except(keys, options.except) as string[]\n }\n\n if (!this.response?.url) {\n return\n }\n\n const method = (options.method ?? 'get').toLowerCase()\n const data = options.data ?? {}\n\n options.onStart?.()\n\n Axios({\n url: this.response.url,\n method,\n data: method === 'get' ? {} : data,\n params: method === 'get' ? data : {},\n headers: {\n ...(options.headers ?? {}),\n Accept: 'text/html, application/xhtml+xml',\n 'X-Inertia': 'true',\n 'X-Inertia-Partial-Component': this.response.component,\n 'X-Inertia-Version': this.response.version ?? '',\n 'X-Inertia-Partial-Data': keys.join(','),\n 'X-InertiaUI-Modal': generateId(),\n 'X-InertiaUI-Modal-Base-Url': baseUrl ?? '',\n },\n })\n .then((response) => {\n this.updateProps(response.data.props)\n\n options.onSuccess?.(response)\n })\n .catch((error) => {\n options.onError?.(error)\n })\n .finally(() => {\n options.onFinish?.()\n })\n }\n\n updateProps = (props: Record<string, unknown>) => {\n Object.assign(this.props, props)\n updateStack((prevStack) => prevStack) // Trigger re-render\n }\n }\n\n const isValidModalResponse = (data: unknown): data is ModalResponseData => {\n return (\n typeof data === 'object' &&\n data !== null &&\n 'component' in data &&\n typeof (data as ModalResponseData).component === 'string'\n )\n }\n\n const pushFromResponseData = (\n responseData: ModalResponseData,\n config: ModalConfig = {},\n onClose: (() => void) | null = null,\n onAfterLeave: (() => void) | null = null,\n ): Promise<Modal> => {\n if (!resolveComponent) {\n return Promise.reject(new Error('resolveComponent not set'))\n }\n\n if (!isValidModalResponse(responseData)) {\n return Promise.reject(\n new Error(\n 'Invalid modal response. This usually happens when the server returns a redirect (e.g., due to session expiration). ' +\n 'Check if the user is still authenticated.',\n ),\n )\n }\n\n return resolveComponent(responseData.component).then((component) =>\n push(component, responseData, config, onClose, onAfterLeave),\n )\n }\n\n const loadDeferredProps = (modal: Modal) => {\n const deferred = modal.response?.meta?.deferredProps\n\n if (!deferred) {\n return\n }\n\n Object.keys(deferred).forEach((key) => {\n modal.reload({ only: deferred[key] })\n })\n }\n\n const push = (\n component: ComponentType | null,\n response: ModalResponseData,\n config?: ModalConfig | null,\n onClose?: (() => void) | null,\n afterLeave?: (() => void) | null,\n ): Modal => {\n const newModal = new ModalClass(component, response, config, onClose, afterLeave)\n newModal.index = stackRef.current.length\n\n updateStack((prevStack) => [...prevStack, newModal])\n loadDeferredProps(newModal)\n\n newModal.show()\n\n return newModal\n }\n\n function pushLocalModal(\n name: string,\n config?: ModalConfig | null,\n onClose?: (() => void) | null,\n afterLeave?: (() => void) | null,\n props?: Record<string, unknown> | null,\n ): Modal {\n if (!localModals[name]) {\n throw new Error(`The local modal \"${name}\" has not been registered.`)\n }\n\n const responseData = { props: props ?? {} } as ModalResponseData\n const modal = push(null, responseData, config, onClose, afterLeave)\n modal.name = name\n localModals[name].callback(modal)\n return modal\n }\n\n const visitModal = (url: string, options: VisitOptions = {}): Promise<Modal> =>\n visit(\n url,\n options.method ?? 'get',\n options.data ?? ({} as RequestPayload),\n options.headers ?? {},\n options.config ?? {},\n options.onClose ?? null,\n options.onAfterLeave ?? null,\n options.queryStringArrayFormat ?? 'brackets',\n options.navigate ?? (getConfig('navigate') as boolean),\n options.onStart ?? null,\n options.onSuccess ?? null,\n options.onError ?? null,\n options.props ?? null,\n ).then((modal) => {\n const listeners = options.listeners ?? {}\n\n Object.keys(listeners).forEach((event) => {\n // e.g. refreshKey -> refresh-key\n const eventName = kebabCase(event)\n modal.on(eventName, listeners[event])\n })\n\n return modal\n })\n\n const updateBrowserUrl = (url: string | undefined, useBrowserHistory: boolean, modalData?: ModalResponseData): void => {\n if (!url || !useBrowserHistory || typeof window === 'undefined') {\n return\n }\n\n router.push({\n url,\n preserveScroll: true,\n preserveState: true,\n // Store modal data in page props for history navigation\n props: modalData\n ? (currentProps: Record<string, unknown>) => ({\n ...currentProps,\n _inertiaui_modal: {\n ...modalData,\n baseUrl,\n },\n })\n : undefined,\n })\n }\n\n const visit = (\n href: string,\n method: string,\n payload: RequestPayload = {},\n headers: Record<string, string> = {},\n config: ModalConfig = {},\n onClose: (() => void) | null = null,\n onAfterLeave: (() => void) | null = null,\n queryStringArrayFormat: 'brackets' | 'indices' = 'brackets',\n useBrowserHistory = false,\n onStart: (() => void) | null = null,\n onSuccess: ((response?: AxiosResponse) => void) | null = null,\n onError: ((...args: unknown[]) => void) | null = null,\n props: Record<string, unknown> | null = null,\n ): Promise<Modal> => {\n const modalId = generateId()\n\n return new Promise((resolve, reject) => {\n if (href.startsWith('#')) {\n resolve(pushLocalModal(href.substring(1), config, onClose, onAfterLeave, props))\n return\n }\n\n const [url, data] = mergeDataIntoQueryString(method as 'get' | 'post' | 'put' | 'patch' | 'delete', href || '', payload, queryStringArrayFormat)\n\n // Check for cached prefetch response (#146)\n const cachedResponse = getCachedResponse(url, method, data)\n if (cachedResponse) {\n onSuccess?.(cachedResponse)\n pushFromResponseData(cachedResponse.data, config, onClose, onAfterLeave)\n .then((modal) => {\n updateBrowserUrl(cachedResponse.data.url, useBrowserHistory, cachedResponse.data)\n resolve(modal)\n })\n .catch(reject)\n return\n }\n\n if (stackRef.current.length === 0) {\n baseUrl = typeof window !== 'undefined' ? window.location.href : ''\n }\n\n const requestHeaders: Record<string, string> = {\n ...headers,\n Accept: 'text/html, application/xhtml+xml',\n 'X-Requested-With': 'XMLHttpRequest',\n 'X-Inertia': 'true',\n 'X-Inertia-Version': pageVersion ?? '',\n 'X-InertiaUI-Modal': modalId,\n 'X-InertiaUI-Modal-Base-Url': baseUrl ?? '',\n }\n\n onStart?.()\n\n progress?.start()\n\n Axios({\n url,\n method,\n data,\n headers: requestHeaders,\n })\n .then((response) => {\n onSuccess?.(response)\n pushFromResponseData(response.data, config, onClose, onAfterLeave)\n .then((modal) => {\n updateBrowserUrl(response.data.url, useBrowserHistory, response.data)\n resolve(modal)\n })\n .catch(reject)\n })\n .catch((...args: unknown[]) => {\n onError?.(...args)\n reject(args[0])\n })\n .finally(() => {\n progress?.finish()\n })\n })\n }\n\n const registerLocalModal = (name: string, callback: (modal: Modal) => void) => {\n setLocalModals((prevLocalModals) => ({\n ...prevLocalModals,\n [name]: { name, callback },\n }))\n }\n\n const removeLocalModal = (name: string) => {\n setLocalModals((prevLocalModals) => {\n const newLocalModals = { ...prevLocalModals }\n delete newLocalModals[name]\n return newLocalModals\n })\n }\n\n // Create value object with getter for stack to ensure we always get current ref value\n const value: ModalStackContextValue = {\n get stack() {\n return stackRef.current\n },\n localModals,\n push,\n pushFromResponseData,\n length: () => stackRef.current.length,\n closeAll: (force = false) => {\n if (force) {\n // Force close: immediately remove all modals without transition\n updateStack(() => [])\n } else {\n // Normal close: trigger leave transition for each modal\n ;[...stackRef.current].reverse().forEach((modal) => modal.close())\n }\n },\n reset: () => updateStack(() => []),\n visit,\n visitModal,\n registerLocalModal,\n removeLocalModal,\n }\n\n return <ModalStackContext.Provider value={value}>{children}</ModalStackContext.Provider>\n}\n\nexport const useModalStack = (): ModalStackContextValue => {\n const context = useContext(ModalStackContext)\n if (context === null) {\n throw new Error('useModalStack must be used within a ModalStackProvider')\n }\n return context\n}\n\nexport const modalPropNames = ['closeButton', 'closeExplicitly', 'closeOnClickOutside', 'maxWidth', 'paddingClasses', 'panelClasses', 'position', 'slideover']\n\nexport const initFromPageProps = (pageProps: PageProps) => {\n if (pageProps.initialPage) {\n pageVersion = pageProps.initialPage.version ?? null\n }\n\n if (pageProps.resolveComponent) {\n resolveComponent = pageProps.resolveComponent\n }\n}\n\ninterface RenderInertiaAppProps {\n Component: ComponentType & { layout?: ((page: ReactNode) => ReactNode) | ComponentType[] }\n props: Record<string, unknown>\n key: string\n}\n\nexport const renderApp = (App: ComponentType<{ children: (props: RenderInertiaAppProps) => ReactNode }>, pageProps: PageProps) => {\n initFromPageProps(pageProps)\n\n const renderInertiaApp = ({ Component, props, key }: RenderInertiaAppProps) => {\n const renderComponent = () => {\n const child = createElement(Component, { key, ...props })\n\n if (typeof Component.layout === 'function') {\n return Component.layout(child)\n }\n\n if (Array.isArray(Component.layout)) {\n return Component.layout\n .slice()\n .reverse()\n .reduce(\n (acc, Layout) => createElement(Layout as ComponentType<Record<string, unknown>>, props, acc),\n child as ReactNode,\n )\n }\n\n return child\n }\n\n return (\n <>\n {renderComponent()}\n <ModalRoot />\n </>\n )\n }\n\n return (\n <ModalStackProvider>\n <App {...(pageProps as Record<string, unknown>)}>{renderInertiaApp}</App>\n </ModalStackProvider>\n )\n}\n\ninterface InertiaUIModalPageProps {\n _inertiaui_modal?: ModalResponseData & { baseUrl: string }\n [key: string]: unknown\n}\n\nexport const ModalRoot = ({ children }: ModalRootProps) => {\n const context = useContext(ModalStackContext)\n const $page = usePage<InertiaUIModalPageProps>()\n const pendingModalKeysRef = useRef(new Set<string>())\n\n // Generate a unique key for deduplication (handles case when modal has no id)\n const getModalKey = (modalData: ModalResponseData) => modalData.id || `${modalData.component}:${modalData.url}`\n\n const isNavigatingRef = useRef(false)\n const initialModalStillOpenedRef = useRef(!!$page.props?._inertiaui_modal)\n\n useEffect(() => router.on('start', () => (isNavigatingRef.current = true)), [])\n useEffect(() => router.on('finish', () => (isNavigatingRef.current = false)), [])\n useEffect(\n () =>\n router.on('navigate', function ($event) {\n const modalOnBase = ($event as { detail: { page: { props: InertiaUIModalPageProps; url: string } } }).detail.page.props._inertiaui_modal\n const pageUrl = ($event as { detail: { page: { url: string } } }).detail.page.url\n\n // If we're closing to this specific URL, don't re-open the modal\n // This handles the race condition where router.push in afterLeave\n // fires a navigate event before the props callback clears _inertiaui_modal\n // Only suppresses when navigating to our closing target URL (not browser back to modal)\n if (closingToBaseUrlTarget) {\n const targetPath = new URL(closingToBaseUrlTarget, 'http://x').pathname\n const pagePath = new URL(pageUrl, 'http://x').pathname\n if (targetPath === pagePath) {\n closingToBaseUrlTarget = null\n context?.closeAll(true)\n baseUrl = null\n initialModalStillOpenedRef.current = false\n return\n }\n closingToBaseUrlTarget = null\n }\n\n if (!modalOnBase) {\n // No modal data - close any open modals (force close without transition)\n context?.closeAll(true)\n baseUrl = null\n initialModalStillOpenedRef.current = false\n return\n }\n\n // If the page URL doesn't match the modal URL, close all modals\n if (!sameUrlPath(pageUrl, modalOnBase.url)) {\n context?.closeAll(true)\n baseUrl = null\n initialModalStillOpenedRef.current = false\n return\n }\n\n // Skip if this modal is already being pushed (handles duplicate navigate events)\n const modalKey = getModalKey(modalOnBase)\n if (pendingModalKeysRef.current.has(modalKey)) {\n return\n }\n\n // Also skip if a modal with this id is already in the stack\n if (modalOnBase.id && context?.stack.some((m) => m.id === modalOnBase.id)) {\n return\n }\n\n // Skip if a modal with the same component and URL is already open\n if (context?.stack.some((m) => m.response?.component === modalOnBase.component && sameUrlPath(m.response?.url, modalOnBase.url))) {\n return\n }\n\n // Only set baseUrl when we're actually opening a new modal\n // (after deduplication checks pass)\n baseUrl = modalOnBase.baseUrl\n\n pendingModalKeysRef.current.add(modalKey)\n\n context\n ?.pushFromResponseData(modalOnBase, {}, () => {\n if (!modalOnBase.baseUrl) {\n console.error('No base url in modal response data so cannot navigate back')\n return\n }\n if (!isNavigatingRef.current && typeof window !== 'undefined' && window.location.href !== modalOnBase.baseUrl) {\n router.visit(modalOnBase.baseUrl, {\n preserveScroll: true,\n preserveState: true,\n })\n }\n })\n .finally(() => {\n pendingModalKeysRef.current.delete(modalKey)\n })\n }),\n [],\n )\n\n const axiosRequestInterceptor = (config: InternalAxiosRequestConfig) => {\n // A Modal is opened on top of a base route, so we need to pass this base route\n // so it can redirect back with the back() helper method...\n // Only send the header when we have an actual base URL value\n const baseUrlValue = baseUrl ?? (initialModalStillOpenedRef.current ? $page.props._inertiaui_modal?.baseUrl : null)\n if (baseUrlValue) {\n config.headers['X-InertiaUI-Modal-Base-Url'] = baseUrlValue\n }\n\n return config\n }\n\n useEffect(() => {\n const interceptorId = Axios.interceptors.request.use(axiosRequestInterceptor)\n return () => Axios.interceptors.request.eject(interceptorId)\n }, [])\n\n const previousModalRef = useRef<(ModalResponseData & { baseUrl: string }) | undefined>(undefined)\n\n useEffect(() => {\n const newModal = $page.props?._inertiaui_modal\n const previousModal = previousModalRef.current\n\n // Store the current value for the next render\n previousModalRef.current = newModal\n\n if (!newModal) {\n return\n }\n\n // If there's a previous modal with same component/URL, update its props\n if (previousModal && newModal.component === previousModal.component && sameUrlPath(newModal.url, previousModal.url)) {\n context?.stack[0]?.updateProps(newModal.props ?? {})\n return\n }\n\n // If there's no previous modal but we have modals in the stack (opened via XHR),\n // check if the new modal matches any open modal and update its props\n if (!previousModal && context && context.stack.length > 0) {\n const existingModal = context.stack.find(\n (m) => m.response?.component === newModal.component && sameUrlPath(m.response?.url, newModal.url),\n )\n if (existingModal) {\n existingModal.updateProps(newModal.props ?? {})\n }\n }\n }, [$page.props?._inertiaui_modal])\n\n return (\n <>\n {children}\n {context && context.stack.length > 0 && <ModalRenderer index={0} />}\n </>\n )\n}\n","import React, { useMemo, createElement } from 'react'\nimport { useModalStack } from './ModalRoot'\nimport type { ModalRendererProps } from './types'\n\nconst ModalIndexContext = React.createContext<number | null>(null)\nModalIndexContext.displayName = 'ModalIndexContext'\n\nexport const useModalIndex = (): number | null => {\n return React.useContext(ModalIndexContext)\n}\n\nconst ModalRenderer = ({ index }: ModalRendererProps) => {\n const { stack } = useModalStack()\n\n const modalContext = useMemo(() => {\n return stack[index]\n }, [stack, index])\n\n if (!modalContext?.component) {\n return null\n }\n\n return (\n <ModalIndexContext.Provider value={index}>\n {createElement(modalContext.component as React.ComponentType<Record<string, unknown>>, {\n ...modalContext.props,\n onModalEvent: (...args: unknown[]) => modalContext.emit('modal-event', ...args),\n })}\n </ModalIndexContext.Provider>\n )\n}\n\nexport default ModalRenderer\n","import { useModalIndex } from './ModalRenderer'\nimport { useModalStack } from './ModalRoot'\nimport type { Modal } from './types'\n\nexport default function useModal(): Modal | null {\n return useModalStack().stack[useModalIndex()] ?? null\n}\n","// See: https://github.com/inertiajs/inertia/blob/48bcd21fb7daf467d0df1bfde2408f161f94a579/packages/react/src/Deferred.ts\nimport { useEffect, useState, ReactNode } from 'react'\nimport useModal from './useModal'\n\ninterface DeferredProps {\n children: ReactNode\n data: string | string[]\n fallback?: ReactNode\n}\n\nconst Deferred = ({ children, data, fallback }: DeferredProps) => {\n if (!data) {\n throw new Error('`<Deferred>` requires a `data` prop to be a string or array of strings')\n }\n\n const [loaded, setLoaded] = useState(false)\n const keys = Array.isArray(data) ? data : [data]\n const modal = useModal()\n const modalProps = modal?.props ?? {}\n\n useEffect(() => {\n setLoaded(keys.every((key) => modalProps[key] !== undefined))\n }, [modalProps, keys])\n\n return loaded ? children : fallback\n}\n\nDeferred.displayName = 'InertiaModalDeferred'\n\nexport default Deferred\n","import { useMemo, useState, forwardRef, useImperativeHandle, useEffect, useRef, ReactNode } from 'react'\nimport { getConfig, getConfigByType } from './config'\nimport { useModalIndex } from './ModalRenderer'\nimport { useModalStack } from './ModalRoot'\nimport ModalRenderer from './ModalRenderer'\nimport type { Modal, ModalConfig, ReloadOptions } from './types'\n\ninterface HeadlessModalConfig {\n slideover: boolean\n closeButton: boolean\n closeExplicitly: boolean\n closeOnClickOutside: boolean\n maxWidth: string\n paddingClasses: string\n panelClasses: string\n position: string\n}\n\ninterface HeadlessModalRenderProps {\n afterLeave: () => void\n close: () => void\n config: HeadlessModalConfig\n emit: (event: string, ...args: unknown[]) => void\n getChildModal: () => Modal | null\n getParentModal: () => Modal | null\n id: string\n index: number\n isOpen: boolean\n modalContext: Modal\n onTopOfStack: boolean\n reload: (options?: ReloadOptions) => void\n setOpen: (open: boolean) => void\n shouldRender: boolean\n // Allow additional props from visitModal\n [key: string]: unknown\n}\n\ninterface HeadlessModalBaseProps {\n name?: string\n children: ReactNode | ((props: HeadlessModalRenderProps) => ReactNode)\n onFocus?: () => void\n onBlur?: () => void\n onClose?: () => void\n onSuccess?: () => void\n slideover?: boolean\n closeButton?: boolean\n closeExplicitly?: boolean\n closeOnClickOutside?: boolean\n maxWidth?: string\n paddingClasses?: string\n panelClasses?: string\n position?: string\n}\n\ntype HeadlessModalProps = HeadlessModalBaseProps & Record<string, unknown>\n\nexport interface HeadlessModalRef {\n afterLeave: () => void\n close: () => void\n emit: (event: string, ...args: unknown[]) => void\n getChildModal: () => Modal | null | undefined\n getParentModal: () => Modal | null | undefined\n reload: (options?: ReloadOptions) => void\n setOpen: (open: boolean) => void\n readonly id: string | undefined\n readonly index: number | undefined\n readonly isOpen: boolean | undefined\n readonly config: ModalConfig | undefined\n readonly modalContext: Modal | null\n readonly onTopOfStack: boolean | undefined\n readonly shouldRender: boolean | undefined\n}\n\nconst HeadlessModal = forwardRef<HeadlessModalRef, HeadlessModalProps>(\n (allProps, ref) => {\n const { name, children, onFocus, onBlur, onClose, onSuccess, ...props } = allProps as HeadlessModalBaseProps & Record<string, unknown>\n const modalIndex = useModalIndex()\n const { stack, registerLocalModal, removeLocalModal } = useModalStack()\n\n const [localModalContext, setLocalModalContext] = useState<Modal | null>(null)\n const modalContext = useMemo(\n () => (name ? localModalContext : stack[modalIndex]),\n [name, localModalContext, modalIndex, stack],\n )\n\n const nextIndex = useMemo(() => {\n return stack.find((m) => m.shouldRender && m.index > (modalContext?.index ?? -1))?.index\n }, [modalIndex, stack])\n\n const configSlideover = useMemo(\n () => modalContext?.config.slideover ?? props.slideover ?? getConfig('type') === 'slideover',\n [props.slideover, modalContext?.config.slideover],\n )\n\n const config: HeadlessModalConfig = useMemo(\n () => ({\n slideover: configSlideover as boolean,\n closeButton: (props.closeButton ?? getConfigByType(configSlideover as boolean, 'closeButton')) as boolean,\n closeExplicitly: (props.closeExplicitly ?? getConfigByType(configSlideover as boolean, 'closeExplicitly')) as boolean,\n closeOnClickOutside: (props.closeOnClickOutside ?? getConfigByType(configSlideover as boolean, 'closeOnClickOutside')) as boolean,\n maxWidth: (props.maxWidth ?? getConfigByType(configSlideover as boolean, 'maxWidth')) as string,\n paddingClasses: (props.paddingClasses ?? getConfigByType(configSlideover as boolean, 'paddingClasses')) as string,\n panelClasses: (props.panelClasses ?? getConfigByType(configSlideover as boolean, 'panelClasses')) as string,\n position: (props.position ?? getConfigByType(configSlideover as boolean, 'position')) as string,\n ...modalContext?.config,\n }),\n [props, modalContext?.config, configSlideover],\n )\n\n useEffect(() => {\n if (name) {\n let removeListeners: (() => void) | null = null\n\n registerLocalModal(name as string, (localContext) => {\n removeListeners = localContext.registerEventListenersFromProps(props as Record<string, unknown>)\n setLocalModalContext(localContext)\n })\n\n return () => {\n removeListeners?.()\n removeListeners = null\n removeLocalModal(name as string)\n }\n }\n\n return modalContext?.registerEventListenersFromProps(props as Record<string, unknown>)\n }, [name])\n\n // Store the latest modalContext in a ref to maintain reference\n const modalContextRef = useRef(modalContext)\n\n // Update the ref whenever modalContext changes\n useEffect(() => {\n modalContextRef.current = modalContext\n }, [modalContext])\n\n // Track previous isOpen value to only emit close when transitioning from true to false\n const previousIsOpenRef = useRef<boolean | undefined>(undefined)\n\n useEffect(() => {\n if (modalContext != null) {\n if (modalContext.isOpen) {\n onSuccess?.()\n } else if (previousIsOpenRef.current === true) {\n // Only call onClose when transitioning from open to closed,\n // not when the component first mounts with isOpen undefined/false\n onClose?.()\n }\n previousIsOpenRef.current = modalContext.isOpen\n }\n }, [modalContext?.isOpen])\n\n const [rendered, setRendered] = useState(false)\n\n useEffect(() => {\n if (rendered && modalContext != null && modalContext.isOpen) {\n if (modalContext.onTopOfStack) {\n onFocus?.()\n } else {\n onBlur?.()\n }\n }\n\n setRendered(true)\n }, [modalContext?.onTopOfStack])\n\n useImperativeHandle(\n ref,\n () => ({\n afterLeave: () => modalContextRef.current?.afterLeave(),\n close: () => modalContextRef.current?.close(),\n emit: (...args: [string, ...unknown[]]) => modalContextRef.current?.emit(...args),\n getChildModal: () => modalContextRef.current?.getChildModal(),\n getParentModal: () => modalContextRef.current?.getParentModal(),\n reload: (options?: ReloadOptions) => modalContextRef.current?.reload(options),\n setOpen: (open: boolean) => modalContextRef.current?.setOpen(open),\n\n get id() {\n return modalContextRef.current?.id\n },\n get index() {\n return modalContextRef.current?.index\n },\n get isOpen() {\n return modalContextRef.current?.isOpen\n },\n get config() {\n return modalContextRef.current?.config\n },\n get modalContext() {\n return modalContextRef.current\n },\n get onTopOfStack() {\n return modalContextRef.current?.onTopOfStack\n },\n get shouldRender() {\n return modalContextRef.current?.shouldRender\n },\n }),\n [modalContext],\n )\n\n if (!modalContext?.shouldRender) {\n return null\n }\n\n return (\n <>\n {typeof children === 'function'\n ? children({\n // Spread props first so they can be overridden by built-in props\n ...modalContext.props,\n afterLeave: modalContext.afterLeave,\n close: modalContext.close,\n config,\n emit: modalContext.emit,\n getChildModal: modalContext.getChildModal,\n getParentModal: modalContext.getParentModal,\n id: modalContext.id,\n index: modalContext.index,\n isOpen: modalContext.isOpen,\n modalContext,\n onTopOfStack: modalContext.onTopOfStack,\n reload: modalContext.reload,\n setOpen: modalContext.setOpen,\n shouldRender: modalContext.shouldRender,\n })\n : children}\n\n {/* Next modal in the stack */}\n {nextIndex !== undefined && <ModalRenderer index={nextIndex} />}\n </>\n )\n },\n)\n\nHeadlessModal.displayName = 'HeadlessModal'\nexport default HeadlessModal\n","interface CloseButtonProps {\n onClick: () => void\n}\n\nexport default function CloseButton({ onClick }: CloseButtonProps) {\n return (\n <button\n type=\"button\"\n className=\"im-close-button text-gray-400 hover:text-gray-500\"\n onClick={onClick}\n >\n <span className=\"sr-only\">Close</span>\n <svg\n className=\"size-6\"\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n strokeWidth=\"2\"\n stroke=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n d=\"M6 18L18 6M6 6l12 12\"\n />\n </svg>\n </button>\n )\n}\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","/**\n * Max width classes for modals and slideovers.\n * Uses a map lookup for Tailwind 4 compatibility (scanner picks up full class strings).\n */\nexport const maxWidthClasses: Record<string, string> = {\n sm: 'sm:max-w-sm',\n md: 'sm:max-w-md',\n lg: 'sm:max-w-md md:max-w-lg',\n xl: 'sm:max-w-md md:max-w-xl',\n '2xl': 'sm:max-w-md md:max-w-xl lg:max-w-2xl',\n '3xl': 'sm:max-w-md md:max-w-xl lg:max-w-3xl',\n '4xl': 'sm:max-w-md md:max-w-xl lg:max-w-3xl xl:max-w-4xl',\n '5xl': 'sm:max-w-md md:max-w-xl lg:max-w-3xl xl:max-w-5xl',\n '6xl': 'sm:max-w-md md:max-w-xl lg:max-w-3xl xl:max-w-5xl 2xl:max-w-6xl',\n '7xl': 'sm:max-w-md md:max-w-xl lg:max-w-3xl xl:max-w-5xl 2xl:max-w-7xl',\n}\n\nexport const defaultMaxWidth = '2xl'\n\nexport function getMaxWidthClass(maxWidth: string): string {\n return maxWidthClasses[maxWidth] || maxWidthClasses[defaultMaxWidth]\n}\n","import { useState, useEffect, useRef, useCallback, useMemo, ReactNode, SyntheticEvent, MouseEvent } from 'react'\nimport CloseButton from './CloseButton'\nimport clsx from 'clsx'\nimport { createFocusTrap, onEscapeKey, animate, cancelAnimations } from '@inertiaui/vanilla'\nimport { getMaxWidthClass } from './constants'\nimport type { Modal } from './types'\n\ninterface ModalContentConfig {\n maxWidth: string\n paddingClasses: string\n panelClasses: string\n position: string\n closeButton: boolean\n closeExplicitly?: boolean\n closeOnClickOutside?: boolean\n}\n\ninterface ModalContentProps {\n modalContext: Modal\n config: ModalContentConfig\n useNativeDialog: boolean\n isFirstModal: boolean\n onAfterLeave?: () => void\n children: ReactNode | ((props: { modalContext: Modal; config: ModalContentConfig }) => ReactNode)\n}\n\nconst ModalContent = ({ modalContext, config, useNativeDialog, isFirstModal, onAfterLeave, children }: ModalContentProps) => {\n const [isRendered, setIsRendered] = useState(false)\n const [isVisible, setIsVisible] = useState(false) // For backdrop sync\n const [entered, setEntered] = useState(false) // After animation completes\n const wrapperRef = useRef<HTMLDivElement>(null)\n const dialogRef = useRef<HTMLDialogElement>(null)\n const nativeWrapperRef = useRef<HTMLDivElement>(null)\n const cleanupFocusTrapRef = useRef<(() => void) | null>(null)\n const cleanupEscapeKeyRef = useRef<(() => void) | null>(null)\n\n const maxWidthClass = useMemo(() => getMaxWidthClass(config.maxWidth), [config.maxWidth])\n\n // ============ Animation handlers using Web Animations API ============\n\n const animateIn = useCallback(async (element: HTMLElement | null) => {\n if (!element) return\n\n setIsVisible(true) // Trigger backdrop immediately\n\n await animate(element, [\n { transform: 'translate3d(0, 1rem, 0) scale(0.95)', opacity: 0 },\n { transform: 'translate3d(0, 0, 0) scale(1)', opacity: 1 },\n ])\n\n setEntered(true)\n }, [])\n\n const animateOut = useCallback(\n async (element: HTMLElement | null) => {\n if (!element) return\n\n setIsVisible(false) // Trigger backdrop fade out immediately\n\n await animate(element, [\n { transform: 'translate3d(0, 0, 0) scale(1)', opacity: 1 },\n { transform: 'translate3d(0, 1rem, 0) scale(0.95)', opacity: 0 },\n ])\n\n setIsRendered(false)\n if (useNativeDialog && dialogRef.current) {\n dialogRef.current.close()\n }\n onAfterLeave?.()\n modalContext.afterLeave()\n },\n [useNativeDialog, onAfterLeave, modalContext],\n )\n\n // ============ Non-native dialog handlers ============\n\n const setupFocusTrap = useCallback(() => {\n if (useNativeDialog) return\n if (!wrapperRef.current || !modalContext.onTopOfStack) return\n if (cleanupFocusTrapRef.current) return\n\n cleanupFocusTrapRef.current = createFocusTrap(wrapperRef.current, {\n initialFocus: true,\n returnFocus: false,\n })\n }, [modalContext.onTopOfStack, useNativeDialog])\n\n const cleanupFocusTrap = useCallback(() => {\n if (cleanupFocusTrapRef.current) {\n cleanupFocusTrapRef.current()\n cleanupFocusTrapRef.current = null\n }\n }, [])\n\n const setupEscapeKey = useCallback(() => {\n if (useNativeDialog) return\n if (cleanupEscapeKeyRef.current) return\n if (config?.closeExplicitly) return\n\n cleanupEscapeKeyRef.current = onEscapeKey(() => {\n if (modalContext.onTopOfStack) {\n modalContext.close()\n }\n })\n }, [config?.closeExplicitly, modalContext, useNativeDialog])\n\n const cleanupEscapeKey = useCallback(() => {\n if (cleanupEscapeKeyRef.current) {\n cleanupEscapeKeyRef.current()\n cleanupEscapeKeyRef.current = null\n }\n }, [])\n\n const handleClickOutside = useCallback(\n (event: MouseEvent) => {\n if (useNativeDialog) return\n if (!modalContext.onTopOfStack) return\n if (config?.closeExplicitly) return\n if (config?.closeOnClickOutside === false) return\n if (!wrapperRef.current) return\n\n if (!wrapperRef.current.contains(event.target as Node)) {\n modalContext.close()\n }\n },\n [modalContext, config?.closeExplicitly, config?.closeOnClickOutside, useNativeDialog],\n )\n\n // ============ Native dialog handlers ============\n\n const handleCancel = useCallback(\n (event: SyntheticEvent) => {\n event.preventDefault()\n if (modalContext.onTopOfStack && !config?.closeExplicitly) {\n modalContext.close()\n }\n },\n [modalContext, config?.closeExplicitly],\n )\n\n const handleDialogClick = useCallback(\n (event: MouseEvent) => {\n if (event.target === dialogRef.current) {\n if (modalContext.onTopOfStack && !config?.closeExplicitly && config?.closeOnClickOutside !== false) {\n modalContext.close()\n }\n }\n },\n [modalContext, config?.closeExplicitly, config?.closeOnClickOutside],\n )\n\n // ============ Lifecycle ============\n\n // Track previous isOpen state for detecting close\n const prevIsOpenRef = useRef(modalContext.isOpen)\n\n // Initial mount and open state changes\n useEffect(() => {\n if (useNativeDialog) {\n if (modalContext.isOpen && !dialogRef.current?.open) {\n dialogRef.current?.showModal()\n animateIn(nativeWrapperRef.current)\n } else if (!modalContext.isOpen && prevIsOpenRef.current) {\n setEntered(false)\n animateOut(nativeWrapperRef.current)\n }\n } else {\n if (modalContext.isOpen && !isRendered) {\n setIsRendered(true)\n } else if (!modalContext.isOpen && prevIsOpenRef.current) {\n setEntered(false)\n animateOut(wrapperRef.current)\n }\n }\n prevIsOpenRef.current = modalContext.isOpen\n }, [modalContext.isOpen, useNativeDialog, animateIn, animateOut, isRendered])\n\n // Trigger animation after render (non-native)\n useEffect(() => {\n if (!useNativeDialog && isRendered && !entered && modalContext.isOpen) {\n animateIn(wrapperRef.current).then(() => {\n setupFocusTrap()\n })\n }\n }, [isRendered, useNativeDialog, entered, modalContext.isOpen, animateIn, setupFocusTrap])\n\n // Setup escape key (non-native)\n useEffect(() => {\n if (!useNativeDialog) {\n setupEscapeKey()\n }\n return () => {\n cleanupEscapeKey()\n }\n }, [useNativeDialog, setupEscapeKey, cleanupEscapeKey])\n\n // Handle becoming top of stack / losing top of stack (non-native only)\n useEffect(() => {\n if (useNativeDialog) return\n\n if (modalContext.onTopOfStack) {\n setupEscapeKey()\n if (entered) {\n setupFocusTrap()\n }\n } else {\n cleanupFocusTrap()\n cleanupEscapeKey()\n }\n }, [modalContext.onTopOfStack, entered, setupEscapeKey, setupFocusTrap, cleanupFocusTrap, cleanupEscapeKey, useNativeDialog])\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n const wrapper = useNativeDialog ? nativeWrapperRef.current : wrapperRef.current\n if (wrapper) {\n cancelAnimations(wrapper)\n }\n if (useNativeDialog) {\n if (dialogRef.current?.open) {\n dialogRef.current.close()\n }\n } else {\n cleanupFocusTrap()\n cleanupEscapeKey()\n }\n }\n }, [useNativeDialog, cleanupFocusTrap, cleanupEscapeKey])\n\n // ============ Render ============\n\n const renderContent = () => (\n <div\n className={`im-modal-content relative ${config.paddingClasses} ${config.panelClasses}`}\n data-inertiaui-modal-entered={entered}\n >\n {config.closeButton && (\n <div className=\"absolute right-0 top-0 pr-3 pt-3\">\n <CloseButton onClick={modalContext.close} />\n </div>\n )}\n {typeof children === 'function' ? children({ modalContext, config }) : children}\n </div>\n )\n\n // Native dialog mode\n if (useNativeDialog) {\n return (\n <dialog\n ref={dialogRef}\n className={clsx(\n 'im-modal-dialog m-0 overflow-visible bg-transparent p-0',\n 'size-full max-h-none max-w-none',\n 'backdrop:bg-black/75 backdrop:transition-opacity backdrop:duration-300',\n isVisible ? 'backdrop:opacity-100' : 'backdrop:opacity-0',\n !isFirstModal && 'backdrop:bg-transparent',\n )}\n onCancel={handleCancel}\n onClick={handleDialogClick}\n >\n <div className=\"im-modal-container fixed inset-0 overflow-y-auto p-4\">\n <div\n className={clsx('im-modal-positioner flex min-h-full justify-center', {\n 'items-start': config.position === 'top',\n 'items-center': config.position === 'center',\n 'items-end': config.position === 'bottom',\n })}\n >\n <div\n ref={nativeWrapperRef}\n className={clsx('im-modal-wrapper w-full transition-[filter] duration-300', modalContext.onTopOfStack ? '' : 'blur-xs', maxWidthClass)}\n >\n {renderContent()}\n </div>\n </div>\n </div>\n </dialog>\n )\n }\n\n // Non-native dialog mode\n if (!isRendered) return null\n\n return (\n <div\n className=\"im-modal-container fixed inset-0 z-40 overflow-y-auto p-4\"\n onMouseDown={handleClickOutside}\n >\n <div\n className={clsx('im-modal-positioner flex min-h-full justify-center', {\n 'items-start': config.position === 'top',\n 'items-center': config.position === 'center',\n 'items-end': config.position === 'bottom',\n })}\n onMouseDown={handleClickOutside}\n >\n <div\n ref={wrapperRef}\n role=\"dialog\"\n aria-modal=\"true\"\n className={clsx('im-modal-wrapper w-full transition-[filter] duration-300', modalContext.onTopOfStack ? '' : 'blur-xs', maxWidthClass)}\n >\n <span className=\"sr-only\">Dialog</span>\n {renderContent()}\n </div>\n </div>\n </div>\n )\n}\n\nexport default ModalContent\n","import { useState, useEffect, useRef, useCallback, useMemo, ReactNode, SyntheticEvent, MouseEvent } from 'react'\nimport CloseButton from './CloseButton'\nimport clsx from 'clsx'\nimport { createFocusTrap, onEscapeKey, animate, cancelAnimations } from '@inertiaui/vanilla'\nimport { getMaxWidthClass } from './constants'\nimport type { Modal } from './types'\n\ninterface SlideoverContentConfig {\n maxWidth: string\n paddingClasses: string\n panelClasses: string\n position: string\n closeButton: boolean\n closeExplicitly?: boolean\n closeOnClickOutside?: boolean\n}\n\ninterface SlideoverContentProps {\n modalContext: Modal\n config: SlideoverContentConfig\n useNativeDialog: boolean\n isFirstModal: boolean\n onAfterLeave?: () => void\n children: ReactNode | ((props: { modalContext: Modal; config: SlideoverContentConfig }) => ReactNode)\n}\n\nconst SlideoverContent = ({ modalContext, config, useNativeDialog, isFirstModal, onAfterLeave, children }: SlideoverContentProps) => {\n const [isRendered, setIsRendered] = useState(false)\n const [isVisible, setIsVisible] = useState(false) // For backdrop sync\n const [entered, setEntered] = useState(false) // After animation completes\n const wrapperRef = useRef<HTMLDivElement>(null)\n const dialogRef = useRef<HTMLDialogElement>(null)\n const nativeWrapperRef = useRef<HTMLDivElement>(null)\n const cleanupFocusTrapRef = useRef<(() => void) | null>(null)\n const cleanupEscapeKeyRef = useRef<(() => void) | null>(null)\n\n const isLeft = config.position === 'left'\n\n const maxWidthClass = useMemo(() => getMaxWidthClass(config.maxWidth), [config.maxWidth])\n\n // Get translate value based on position\n const getTranslateX = useCallback(() => (isLeft ? '-100%' : '100%'), [isLeft])\n\n // ============ Animation handlers using Web Animations API ============\n\n const animateIn = useCallback(\n async (element: HTMLElement | null) => {\n if (!element) return\n\n setIsVisible(true) // Trigger backdrop immediately\n const translateX = getTranslateX()\n\n await animate(element, [\n { transform: `translate3d(${translateX}, 0, 0)`, opacity: 0 },\n { transform: 'translate3d(0, 0, 0)', opacity: 1 },\n ])\n\n setEntered(true)\n },\n [getTranslateX],\n )\n\n const animateOut = useCallback(\n async (element: HTMLElement | null) => {\n if (!element) return\n\n setIsVisible(false) // Trigger backdrop fade out immediately\n const translateX = getTranslateX()\n\n await animate(element, [\n { transform: 'translate3d(0, 0, 0)', opacity: 1 },\n { transform: `translate3d(${translateX}, 0, 0)`, opacity: 0 },\n ])\n\n setIsRendered(false)\n if (useNativeDialog && dialogRef.current) {\n dialogRef.current.close()\n }\n onAfterLeave?.()\n modalContext.afterLeave()\n },\n [getTranslateX, useNativeDialog, onAfterLeave, modalContext],\n )\n\n // ============ Non-native dialog handlers ============\n\n const setupFocusTrap = useCallback(() => {\n if (useNativeDialog) return\n if (!wrapperRef.current || !modalContext.onTopOfStack) return\n if (cleanupFocusTrapRef.current) return\n\n cleanupFocusTrapRef.current = createFocusTrap(wrapperRef.current, {\n initialFocus: true,\n returnFocus: false,\n })\n }, [modalContext.onTopOfStack, useNativeDialog])\n\n const cleanupFocusTrap = useCallback(() => {\n if (cleanupFocusTrapRef.current) {\n cleanupFocusTrapRef.current()\n cleanupFocusTrapRef.current = null\n }\n }, [])\n\n const setupEscapeKey = useCallback(() => {\n if (useNativeDialog) return\n if (cleanupEscapeKeyRef.current) return\n if (config?.closeExplicitly) return\n\n cleanupEscapeKeyRef.current = onEscapeKey(() => {\n if (modalContext.onTopOfStack) {\n modalContext.close()\n }\n })\n }, [config?.closeExplicitly, modalContext, useNativeDialog])\n\n const cleanupEscapeKey = useCallback(() => {\n if (cleanupEscapeKeyRef.current) {\n cleanupEscapeKeyRef.current()\n cleanupEscapeKeyRef.current = null\n }\n }, [])\n\n const handleClickOutside = useCallback(\n (event: MouseEvent) => {\n if (useNativeDialog) return\n if (!modalContext.onTopOfStack) return\n if (config?.closeExplicitly) return\n if (config?.closeOnClickOutside === false) return\n if (!wrapperRef.current) return\n\n if (!wrapperRef.current.contains(event.target as Node)) {\n modalContext.close()\n }\n },\n [modalContext, config?.closeExplicitly, config?.closeOnClickOutside, useNativeDialog],\n )\n\n // ============ Native dialog handlers ============\n\n const handleCancel = useCallback(\n (event: SyntheticEvent) => {\n event.preventDefault()\n if (modalContext.onTopOfStack && !config?.closeExplicitly) {\n modalContext.close()\n }\n },\n [modalContext, config?.closeExplicitly],\n )\n\n const handleDialogClick = useCallback(\n (event: MouseEvent) => {\n if (event.target === dialogRef.current) {\n if (modalContext.onTopOfStack && !config?.closeExplicitly && config?.closeOnClickOutside !== false) {\n modalContext.close()\n }\n }\n },\n [modalContext, config?.closeExplicitly, config?.closeOnClickOutside],\n )\n\n // ============ Lifecycle ============\n\n // Track previous isOpen state for detecting close\n const prevIsOpenRef = useRef(modalContext.isOpen)\n\n // Initial mount and open state changes\n useEffect(() => {\n if (useNativeDialog) {\n if (modalContext.isOpen && !dialogRef.current?.open) {\n dialogRef.current?.showModal()\n animateIn(nativeWrapperRef.current)\n } else if (!modalContext.isOpen && prevIsOpenRef.current) {\n setEntered(false)\n animateOut(nativeWrapperRef.current)\n }\n } else {\n if (modalContext.isOpen && !isRendered) {\n setIsRendered(true)\n } else if (!modalContext.isOpen && prevIsOpenRef.current) {\n setEntered(false)\n animateOut(wrapperRef.current)\n }\n }\n prevIsOpenRef.current = modalContext.isOpen\n }, [modalContext.isOpen, useNativeDialog, animateIn, animateOut, isRendered])\n\n // Trigger animation after render (non-native)\n useEffect(() => {\n if (!useNativeDialog && isRendered && !entered && modalContext.isOpen) {\n animateIn(wrapperRef.current).then(() => {\n setupFocusTrap()\n })\n }\n }, [isRendered, useNativeDialog, entered, modalContext.isOpen, animateIn, setupFocusTrap])\n\n // Setup escape key (non-native)\n useEffect(() => {\n if (!useNativeDialog) {\n setupEscapeKey()\n }\n return () => {\n cleanupEscapeKey()\n }\n }, [useNativeDialog, setupEscapeKey, cleanupEscapeKey])\n\n // Handle becoming top of stack / losing top of stack (non-native only)\n useEffect(() => {\n if (useNativeDialog) return\n\n if (modalContext.onTopOfStack) {\n setupEscapeKey()\n if (entered) {\n setupFocusTrap()\n }\n } else {\n cleanupFocusTrap()\n cleanupEscapeKey()\n }\n }, [modalContext.onTopOfStack, entered, setupEscapeKey, setupFocusTrap, cleanupFocusTrap, cleanupEscapeKey, useNativeDialog])\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n const wrapper = useNativeDialog ? nativeWrapperRef.current : wrapperRef.current\n if (wrapper) {\n cancelAnimations(wrapper)\n }\n if (useNativeDialog) {\n if (dialogRef.current?.open) {\n dialogRef.current.close()\n }\n } else {\n cleanupFocusTrap()\n cleanupEscapeKey()\n }\n }\n }, [useNativeDialog, cleanupFocusTrap, cleanupEscapeKey])\n\n // ============ Render ============\n\n const renderContent = () => (\n <div\n className={`im-slideover-content relative ${config.paddingClasses} ${config.panelClasses}`}\n data-inertiaui-modal-entered={entered}\n >\n {config.closeButton && (\n <div className=\"absolute right-0 top-0 pr-3 pt-3\">\n <CloseButton onClick={modalContext.close} />\n </div>\n )}\n {typeof children === 'function' ? children({ modalContext, config }) : children}\n </div>\n )\n\n // Native dialog mode\n if (useNativeDialog) {\n return (\n <dialog\n ref={dialogRef}\n className={clsx(\n 'im-slideover-dialog m-0 overflow-visible bg-transparent p-0',\n 'size-full max-h-none max-w-none',\n 'backdrop:bg-black/75 backdrop:transition-opacity backdrop:duration-300',\n isVisible ? 'backdrop:opacity-100' : 'backdrop:opacity-0',\n !isFirstModal && 'backdrop:bg-transparent',\n )}\n onCancel={handleCancel}\n onClick={handleDialogClick}\n >\n <div className=\"im-slideover-container fixed inset-0 overflow-y-auto overflow-x-hidden\">\n <div\n className={clsx('im-slideover-positioner flex min-h-full items-center', {\n 'justify-start rtl:justify-end': config?.position === 'left',\n 'justify-end rtl:justify-start': config?.position === 'right',\n })}\n >\n <div\n ref={nativeWrapperRef}\n className={clsx('im-slideover-wrapper w-full transition-[filter] duration-300', modalContext.onTopOfStack ? '' : 'blur-xs', maxWidthClass)}\n >\n {renderContent()}\n </div>\n </div>\n </div>\n </dialog>\n )\n }\n\n // Non-native dialog mode\n if (!isRendered) return null\n\n return (\n <div\n className=\"im-slideover-container fixed inset-0 z-40 overflow-y-auto overflow-x-hidden\"\n onMouseDown={handleClickOutside}\n >\n <div\n className={clsx('im-slideover-positioner flex min-h-full items-center', {\n 'justify-start rtl:justify-end': config?.position === 'left',\n 'justify-end rtl:justify-start': config?.position === 'right',\n })}\n onMouseDown={handleClickOutside}\n >\n <div\n ref={wrapperRef}\n role=\"dialog\"\n aria-modal=\"true\"\n className={clsx('im-slideover-wrapper w-full transition-[filter] duration-300', modalContext.onTopOfStack ? '' : 'blur-xs', maxWidthClass)}\n >\n <span className=\"sr-only\">Dialog</span>\n {renderContent()}\n </div>\n </div>\n </div>\n )\n}\n\nexport default SlideoverContent\n","import { forwardRef, useRef, useImperativeHandle, useState, useEffect, useCallback, useMemo, ReactNode } from 'react'\nimport { createPortal } from 'react-dom'\nimport HeadlessModal, { HeadlessModalRef } from './HeadlessModal'\nimport ModalContent from './ModalContent'\nimport SlideoverContent from './SlideoverContent'\nimport { lockScroll, markAriaHidden } from '@inertiaui/vanilla'\nimport { getConfig } from './config'\nimport type { Modal as ModalType, ReloadOptions } from './types'\n\ninterface ModalConfig {\n slideover: boolean\n closeButton: boolean\n closeExplicitly: boolean\n maxWidth: string\n paddingClasses: string\n panelClasses: string\n position: string\n}\n\ninterface ModalRenderProps {\n afterLeave: () => void\n close: () => void\n config: ModalConfig\n emit: (event: string, ...args: unknown[]) => void\n getChildModal: () => ModalType | null\n getParentModal: () => ModalType | null\n id: string\n index: number\n isOpen: boolean\n modalContext: ModalType\n onTopOfStack: boolean\n reload: (options?: ReloadOptions) => void\n setOpen: (open: boolean) => void\n shouldRender: boolean\n // Allow additional props from visitModal\n [key: string]: unknown\n}\n\ninterface ModalBaseProps {\n name?: string\n children: ReactNode | ((props: ModalRenderProps) => ReactNode)\n onFocus?: () => void\n onBlur?: () => void\n onClose?: () => void\n onSuccess?: () => void\n onAfterLeave?: () => void\n slideover?: boolean\n closeButton?: boolean\n closeExplicitly?: boolean\n maxWidth?: string\n paddingClasses?: string\n panelClasses?: string\n position?: string\n}\n\ntype ModalProps = ModalBaseProps & Record<string, unknown>\n\ninterface BackdropTransitionProps {\n show: boolean\n appear: boolean\n onAfterAppear?: () => void\n}\n\nconst Modal = forwardRef<HeadlessModalRef, ModalProps>(\n (allProps, ref) => {\n const { name, children, onFocus, onBlur, onClose, onSuccess, onAfterLeave, ...props } = allProps as ModalBaseProps & Record<string, unknown>\n const renderChildren = (contentProps: ModalRenderProps) => {\n if (typeof children === 'function') {\n return children(contentProps)\n }\n\n return children\n }\n\n const headlessModalRef = useRef<HeadlessModalRef>(null)\n const cleanupScrollLockRef = useRef<(() => void) | null>(null)\n const cleanupAriaHiddenRef = useRef<(() => void) | null>(null)\n const [rendered, setRendered] = useState(false)\n const useNativeDialog = useMemo(() => getConfig('useNativeDialog') as boolean, [])\n\n useImperativeHandle(ref, () => headlessModalRef.current!, [headlessModalRef])\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n cleanupScrollLockRef.current?.()\n cleanupAriaHiddenRef.current?.()\n }\n }, [])\n\n const handleSuccess = useCallback(() => {\n onSuccess?.()\n if (!cleanupScrollLockRef.current) {\n cleanupScrollLockRef.current = lockScroll()\n cleanupAriaHiddenRef.current = markAriaHidden(getConfig('appElement') as string)\n }\n }, [onSuccess])\n\n const handleClose = useCallback(() => {\n onClose?.()\n cleanupScrollLockRef.current?.()\n cleanupAriaHiddenRef.current?.()\n cleanupScrollLockRef.current = null\n cleanupAriaHiddenRef.current = null\n }, [onClose])\n\n const handleAfterLeave = useCallback(() => {\n onAfterLeave?.()\n }, [onAfterLeave])\n\n return (\n <HeadlessModal\n ref={headlessModalRef}\n name={name}\n onFocus={onFocus ?? undefined}\n onBlur={onBlur ?? undefined}\n onClose={handleClose}\n onSuccess={handleSuccess}\n {...props}\n >\n {({\n afterLeave,\n close,\n config,\n emit,\n getChildModal,\n getParentModal,\n id,\n index,\n isOpen,\n modalContext,\n onTopOfStack,\n reload,\n setOpen,\n shouldRender,\n ...extraProps\n }) => (\n <ModalPortal>\n <div\n className=\"im-dialog relative z-20\"\n data-inertiaui-modal-id={id}\n data-inertiaui-modal-index={index}\n aria-hidden={!onTopOfStack}\n >\n {/* Only render backdrop for the first modal (non-native dialog mode) */}\n {/* Native dialog uses ::backdrop pseudo-element instead */}\n {index === 0 && !useNativeDialog && (\n <BackdropTransition\n show={isOpen}\n appear={!rendered}\n onAfterAppear={() => setRendered(true)}\n />\n )}\n\n {/* The modal/slideover content itself */}\n {config.slideover ? (\n <SlideoverContent\n modalContext={modalContext}\n config={config}\n useNativeDialog={useNativeDialog}\n isFirstModal={index === 0}\n onAfterLeave={handleAfterLeave}\n >\n {renderChildren({\n ...extraProps,\n afterLeave,\n close,\n config,\n emit,\n getChildModal,\n getParentModal,\n id,\n index,\n isOpen,\n modalContext,\n onTopOfStack,\n reload,\n setOpen,\n shouldRender,\n })}\n </SlideoverContent>\n ) : (\n <ModalContent\n modalContext={modalContext}\n config={config}\n useNativeDialog={useNativeDialog}\n isFirstModal={index === 0}\n onAfterLeave={handleAfterLeave}\n >\n {renderChildren({\n ...extraProps,\n afterLeave,\n close,\n config,\n emit,\n getChildModal,\n getParentModal,\n id,\n index,\n isOpen,\n modalContext,\n onTopOfStack,\n reload,\n setOpen,\n shouldRender,\n })}\n </ModalContent>\n )}\n </div>\n </ModalPortal>\n )}\n </HeadlessModal>\n )\n },\n)\n\n// Simple portal component\nfunction ModalPortal({ children }: { children: ReactNode }) {\n const [mounted, setMounted] = useState(false)\n\n useEffect(() => {\n setMounted(true)\n }, [])\n\n if (!mounted) return null\n\n return createPortal(children, document.body)\n}\n\n// Backdrop with CSS transition\nfunction BackdropTransition({ show, appear, onAfterAppear }: BackdropTransitionProps) {\n const [state, setState] = useState<'entering' | 'entered' | 'leaving' | 'exited'>(() => {\n if (appear && show) return 'entering'\n return show ? 'entered' : 'exited'\n })\n const initialRender = useRef(true)\n const backdropRef = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (initialRender.current) {\n initialRender.current = false\n if (appear && show) {\n requestAnimationFrame(() => {\n setState('entered')\n const backdrop = backdropRef.current\n if (backdrop) {\n const onTransitionEnd = (e: TransitionEvent) => {\n if (e.target !== backdrop) return\n backdrop.removeEventListener('transitionend', onTransitionEnd)\n onAfterAppear?.()\n }\n backdrop.addEventListener('transitionend', onTransitionEnd)\n }\n })\n }\n return\n }\n\n if (show) {\n setState('entering')\n requestAnimationFrame(() => {\n setState('entered')\n })\n } else {\n setState('leaving')\n const backdrop = backdropRef.current\n if (backdrop) {\n const onTransitionEnd = (e: TransitionEvent) => {\n if (e.target !== backdrop) return\n backdrop.removeEventListener('transitionend', onTransitionEnd)\n setState('exited')\n }\n backdrop.addEventListener('transitionend', onTransitionEnd)\n }\n }\n }, [show, appear, onAfterAppear])\n\n if (state === 'exited') return null\n\n const isVisible = state === 'entered'\n\n return (\n <div\n ref={backdropRef}\n className={`im-backdrop fixed inset-0 z-30 bg-black/75 transition-opacity duration-300 ease-in-out ${isVisible ? 'opacity-100' : 'opacity-0'}`}\n aria-hidden=\"true\"\n />\n )\n}\n\nModal.displayName = 'Modal'\nexport default Modal\n","import { useCallback, useState, useEffect, useMemo, useRef, ReactNode, ElementType, MouseEvent } from 'react'\nimport { useModalStack, modalPropNames, prefetch as prefetchModal } from './ModalRoot'\nimport { only, rejectNullValues, isStandardDomEvent } from './helpers'\nimport { getConfig } from './config'\nimport type { Modal, PrefetchOption } from './types'\nimport type { RequestPayload } from '@inertiajs/core'\n\ninterface ModalLinkProps {\n href: string\n method?: string\n data?: RequestPayload\n as?: ElementType\n headers?: Record<string, string>\n queryStringArrayFormat?: 'brackets' | 'indices'\n onAfterLeave?: () => void\n onBlur?: () => void\n onClose?: () => void\n onError?: (error: unknown) => void\n onFocus?: () => void\n onStart?: () => void\n onSuccess?: () => void\n onPrefetching?: () => void\n onPrefetched?: () => void\n navigate?: boolean\n // Prefetch options (#146)\n prefetch?: PrefetchOption\n cacheFor?: number\n children: ReactNode | ((props: { loading: boolean }) => ReactNode)\n [key: string]: unknown\n}\n\nconst ModalLink = ({\n href,\n method = 'get',\n data = {} as RequestPayload,\n as: Component = 'a',\n headers = {},\n queryStringArrayFormat = 'brackets' as const,\n onAfterLeave,\n onBlur,\n onClose,\n onError,\n onFocus,\n onStart,\n onSuccess,\n onPrefetching,\n onPrefetched,\n navigate,\n prefetch = false,\n cacheFor = 30000,\n children,\n ...props\n}: ModalLinkProps) => {\n const [loading, setLoading] = useState(false)\n const [modalContext, setModalContext] = useState<Modal | null>(null)\n const { stack, visit } = useModalStack()\n const hoverTimeout = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n const shouldNavigate = useMemo(() => {\n return navigate ?? (getConfig('navigate') as boolean)\n }, [navigate])\n\n // Prefetch logic (#146)\n const prefetchModes = useMemo(() => {\n if (prefetch === true) {\n return ['hover']\n }\n if (prefetch === false) {\n return []\n }\n if (Array.isArray(prefetch)) {\n return prefetch\n }\n return [prefetch]\n }, [prefetch])\n\n const doPrefetch = useCallback(() => {\n prefetchModal(href, {\n method,\n data,\n headers,\n queryStringArrayFormat,\n cacheFor,\n onPrefetching: onPrefetching ?? undefined,\n onPrefetched: onPrefetched ?? undefined,\n })\n }, [href, method, data, headers, queryStringArrayFormat, cacheFor, onPrefetching, onPrefetched])\n\n const handleMouseEnter = useCallback(() => {\n if (!prefetchModes.includes('hover')) return\n\n hoverTimeout.current = setTimeout(() => {\n doPrefetch()\n }, 75) // Small delay to avoid prefetching on accidental hovers\n }, [prefetchModes, doPrefetch])\n\n const handleMouseLeave = useCallback(() => {\n if (hoverTimeout.current) {\n clearTimeout(hoverTimeout.current)\n hoverTimeout.current = null\n }\n }, [])\n\n const handleMouseDown = useCallback(\n (event: MouseEvent) => {\n if (!prefetchModes.includes('click')) return\n if (event.button !== 0) return // Only left click\n\n doPrefetch()\n },\n [prefetchModes, doPrefetch],\n )\n\n // Prefetch on mount\n useEffect(() => {\n if (prefetchModes.includes('mount')) {\n doPrefetch()\n }\n }, [])\n\n // Cleanup hover timeout on unmount\n useEffect(() => {\n return () => {\n if (hoverTimeout.current) {\n clearTimeout(hoverTimeout.current)\n }\n }\n }, [])\n\n // Separate standard props from custom event handlers\n const standardProps: Record<string, unknown> = {}\n const customEvents: Record<string, (...args: unknown[]) => void> = {}\n\n Object.keys(props).forEach((key) => {\n if (modalPropNames.includes(key)) {\n return\n }\n\n if (key.startsWith('on') && typeof props[key] === 'function') {\n if (isStandardDomEvent(key)) {\n standardProps[key] = props[key]\n } else {\n customEvents[key] = props[key] as (...args: unknown[]) => void\n }\n } else {\n standardProps[key] = props[key]\n }\n })\n\n const [isBlurred, setIsBlurred] = useState(false)\n\n useEffect(() => {\n if (!modalContext) {\n return\n }\n\n if (modalContext.onTopOfStack && isBlurred) {\n onFocus?.()\n } else if (!modalContext.onTopOfStack && !isBlurred) {\n onBlur?.()\n }\n\n setIsBlurred(!modalContext.onTopOfStack)\n }, [stack])\n\n const onCloseCallback = useCallback(() => {\n onClose?.()\n }, [onClose])\n\n const onAfterLeaveCallback = useCallback(() => {\n setModalContext(null)\n onAfterLeave?.()\n }, [onAfterLeave])\n\n const handle = useCallback(\n (e?: MouseEvent) => {\n e?.preventDefault()\n if (loading) return\n\n if (!href.startsWith('#')) {\n setLoading(true)\n onStart?.()\n }\n\n visit(\n href,\n method,\n data,\n headers,\n rejectNullValues(only(props, modalPropNames)) as Record<string, unknown>,\n () => onCloseCallback(),\n onAfterLeaveCallback,\n queryStringArrayFormat,\n shouldNavigate,\n )\n .then((newModalContext) => {\n setModalContext(newModalContext)\n newModalContext.registerEventListenersFromProps(customEvents)\n onSuccess?.()\n })\n .catch((error) => {\n console.error(error)\n onError?.(error)\n })\n .finally(() => setLoading(false))\n },\n [href, method, data, headers, queryStringArrayFormat, props, onCloseCallback, onAfterLeaveCallback],\n )\n\n return (\n <Component\n {...standardProps}\n href={href}\n onClick={handle}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onMouseDown={handleMouseDown}\n >\n {typeof children === 'function' ? children({ loading }) : children}\n </Component>\n )\n}\n\nexport default ModalLink\n","// See: https://github.com/inertiajs/inertia/blob/48bcd21fb7daf467d0df1bfde2408f161f94a579/packages/react/src/WhenVisible.ts\nimport { createElement, useCallback, useEffect, useRef, useState, ReactNode, ElementType } from 'react'\nimport useModal from './useModal'\nimport type { ReloadOptions } from './types'\n\ninterface WhenVisibleProps {\n children: ReactNode\n data?: string | string[]\n params?: ReloadOptions\n buffer?: number\n as?: ElementType\n always?: boolean\n fallback?: ReactNode\n}\n\nconst WhenVisible = ({ children, data, params, buffer, as, always, fallback }: WhenVisibleProps) => {\n always = always ?? false\n as = as ?? 'div'\n fallback = fallback ?? null\n\n const [loaded, setLoaded] = useState(false)\n const hasFetched = useRef(false)\n const fetching = useRef(false)\n const ref = useRef<HTMLElement>(null)\n\n const modal = useModal()\n\n const getReloadParams = useCallback((): ReloadOptions => {\n if (data) {\n return {\n only: Array.isArray(data) ? data : [data],\n }\n }\n\n if (!params) {\n throw new Error('You must provide either a `data` or `params` prop.')\n }\n\n return params\n }, [params, data])\n\n useEffect(() => {\n if (!ref.current) {\n return\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (!entries[0].isIntersecting) {\n return\n }\n\n if (!always && hasFetched.current) {\n observer.disconnect()\n }\n\n if (fetching.current) {\n return\n }\n\n hasFetched.current = true\n fetching.current = true\n\n const reloadParams = getReloadParams()\n\n modal?.reload({\n ...reloadParams,\n onStart: () => {\n fetching.current = true\n reloadParams.onStart?.()\n },\n onFinish: () => {\n setLoaded(true)\n fetching.current = false\n reloadParams.onFinish?.()\n\n if (!always) {\n observer.disconnect()\n }\n },\n })\n },\n {\n rootMargin: `${buffer || 0}px`,\n },\n )\n\n observer.observe(ref.current)\n\n return () => {\n observer.disconnect()\n }\n }, [ref, getReloadParams, buffer])\n\n if (always || !loaded) {\n return createElement(\n as,\n {\n props: null,\n ref,\n },\n loaded ? children : fallback,\n )\n }\n\n return loaded ? children : null\n}\n\nWhenVisible.displayName = 'InertiaWhenVisible'\n\nexport default WhenVisible\n","import { createElement } from 'react'\nimport { getConfig, putConfig, resetConfig } from './config'\nimport { useModalIndex } from './ModalRenderer'\nimport { useModalStack, ModalRoot, ModalStackProvider, renderApp, initFromPageProps, modalPropNames, prefetch } from './ModalRoot'\nimport useModal from './useModal'\nimport Deferred from './Deferred'\nimport HeadlessModal from './HeadlessModal'\nimport Modal from './Modal'\nimport ModalLink from './ModalLink'\nimport WhenVisible from './WhenVisible'\nimport * as dialogUtils from '@inertiaui/vanilla'\n\n// Types\nexport type {\n Modal as ModalInstance,\n ModalConfig,\n ModalResponseData,\n ModalStackContextValue,\n VisitOptions,\n ReloadOptions,\n EventCallback,\n ComponentResolver,\n PageProps,\n ModalRootProps,\n ModalRendererProps,\n LocalModal,\n // Prefetch types (#146)\n PrefetchOption,\n PrefetchOptions,\n} from './types'\n\nexport type { ModalTypeConfig } from './config'\n\nexport type { CleanupFunction, FocusTrapOptions, EscapeKeyOptions } from '@inertiaui/vanilla'\n\nconst setPageLayout = <T extends { default: { layout?: (page: React.ReactNode) => React.ReactNode } }>(\n layout: React.ComponentType<{ children?: React.ReactNode }>,\n) => (module: T): T => {\n module.default.layout = (page) => createElement(layout, { children: page })\n return module\n}\n\nexport {\n Deferred,\n HeadlessModal,\n Modal,\n ModalLink,\n ModalRoot,\n ModalStackProvider,\n WhenVisible,\n getConfig,\n initFromPageProps,\n modalPropNames,\n putConfig,\n renderApp,\n resetConfig,\n setPageLayout,\n useModal,\n useModalIndex,\n useModalStack,\n // Prefetch function (#146)\n prefetch,\n // Dialog utilities (framework-agnostic)\n dialogUtils,\n}\n"],"names":["vanillaGenerateId","response","prefetch","prefetchModal"],"mappings":"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","x_google_ignoreList":[8]}