diff --git a/.github/workflows/playwright-chromium.yml b/.github/workflows/playwright-chromium.yml index 62e32d901..aaed89c9d 100644 --- a/.github/workflows/playwright-chromium.yml +++ b/.github/workflows/playwright-chromium.yml @@ -28,7 +28,7 @@ jobs: run: pnpm install - name: Build Inertia - run: pnpm -r --filter ./packages/core --filter ./packages/${{ matrix.adapter }}* build + run: pnpm -r --filter ./packages/core --filter "@inertiajs/${{ matrix.adapter == 'vue' && 'vue3' || matrix.adapter }}" build - name: Install Playwright Browsers run: pnpm playwright install chromium diff --git a/packages/svelte/package.json b/packages/svelte/package.json index 521e7202b..d7df02076 100644 --- a/packages/svelte/package.json +++ b/packages/svelte/package.json @@ -44,21 +44,21 @@ "package": "svelte-kit sync && svelte-package --input src" }, "devDependencies": { - "@sveltejs/adapter-auto": "^3.3.1", + "@sveltejs/adapter-auto": "^7.0.0", "@sveltejs/kit": "^2.48.5", "@sveltejs/package": "^2.5.4", - "@sveltejs/vite-plugin-svelte": "^3.1.2", + "@sveltejs/vite-plugin-svelte": "^6.2.1", "axios": "^1.13.2", "es-check": "^9.4.5", - "publint": "^0.2.12", - "svelte": "^4.2.20", + "publint": "^0.3.15", + "svelte": "^5.43.2", "svelte-check": "^4.3.4", "tslib": "^2.8.1", "typescript": "^5.9.3", - "vite": "^5.4.21" + "vite": "^7.1.12" }, "peerDependencies": { - "svelte": "^4.0.0 || ^5.0.0" + "svelte": "^5.0.0" }, "dependencies": { "@inertiajs/core": "workspace:*", diff --git a/packages/svelte/src/components/App.svelte b/packages/svelte/src/components/App.svelte index 24ad23044..73036ea49 100644 --- a/packages/svelte/src/components/App.svelte +++ b/packages/svelte/src/components/App.svelte @@ -1,4 +1,4 @@ - {#if loaded} - + {@render children?.()} {:else} - + {@render fallback?.()} {/if} diff --git a/packages/svelte/src/components/Form.svelte b/packages/svelte/src/components/Form.svelte index 0206a8630..1f00af903 100644 --- a/packages/svelte/src/components/Form.svelte +++ b/packages/svelte/src/components/Form.svelte @@ -12,42 +12,73 @@ } from '@inertiajs/core' import { isEqual } from 'lodash-es' import { onMount } from 'svelte' - import useForm from '../useForm' + import useForm from '../useForm.svelte' const noop = () => undefined - export let action: FormComponentProps['action'] = '' - export let method: FormComponentProps['method'] = 'get' - export let headers: FormComponentProps['headers'] = {} - export let queryStringArrayFormat: FormComponentProps['queryStringArrayFormat'] = 'brackets' - export let errorBag: FormComponentProps['errorBag'] = null - export let showProgress: FormComponentProps['showProgress'] = true - export let transform: FormComponentProps['transform'] = (data) => data - export let options: FormComponentProps['options'] = {} - export let onCancelToken: FormComponentProps['onCancelToken'] = noop - export let onBefore: FormComponentProps['onBefore'] = noop - export let onStart: FormComponentProps['onStart'] = noop - export let onProgress: FormComponentProps['onProgress'] = noop - export let onFinish: FormComponentProps['onFinish'] = noop - export let onCancel: FormComponentProps['onCancel'] = noop - export let onSuccess: FormComponentProps['onSuccess'] = noop - export let onError: FormComponentProps['onError'] = noop - export let onSubmitComplete: FormComponentProps['onSubmitComplete'] = noop - export let disableWhileProcessing: boolean = false - export let invalidateCacheTags: FormComponentProps['invalidateCacheTags'] = [] - export let resetOnError: FormComponentProps['resetOnError'] = false - export let resetOnSuccess: FormComponentProps['resetOnSuccess'] = false - export let setDefaultsOnSuccess: FormComponentProps['setDefaultsOnSuccess'] = false + interface Props { + action?: FormComponentProps['action'] + method?: FormComponentProps['method'] + headers?: FormComponentProps['headers'] + queryStringArrayFormat?: FormComponentProps['queryStringArrayFormat'] + errorBag?: FormComponentProps['errorBag'] + showProgress?: FormComponentProps['showProgress'] + transform?: FormComponentProps['transform'] + options?: FormComponentProps['options'] + onCancelToken?: FormComponentProps['onCancelToken'] + onBefore?: FormComponentProps['onBefore'] + onStart?: FormComponentProps['onStart'] + onProgress?: FormComponentProps['onProgress'] + onFinish?: FormComponentProps['onFinish'] + onCancel?: FormComponentProps['onCancel'] + onSuccess?: FormComponentProps['onSuccess'] + onError?: FormComponentProps['onError'] + onSubmitComplete?: FormComponentProps['onSubmitComplete'] + disableWhileProcessing?: boolean + invalidateCacheTags?: FormComponentProps['invalidateCacheTags'] + resetOnError?: FormComponentProps['resetOnError'] + resetOnSuccess?: FormComponentProps['resetOnSuccess'] + setDefaultsOnSuccess?: FormComponentProps['setDefaultsOnSuccess'] + children?: import('svelte').Snippet<[any]> + [key: string]: any + } + + let { + action = $bindable(''), + method = 'get', + headers = {}, + queryStringArrayFormat = 'brackets', + errorBag = null, + showProgress = true, + transform = (data) => data, + options = {}, + onCancelToken = noop, + onBefore = noop, + onStart = noop, + onProgress = noop, + onFinish = noop, + onCancel = noop, + onSuccess = noop, + onError = noop, + onSubmitComplete = noop, + disableWhileProcessing = false, + invalidateCacheTags = [], + resetOnError = false, + resetOnSuccess = false, + setDefaultsOnSuccess = false, + children, + ...rest + }: Props = $props() type FormSubmitOptions = Omit const form = useForm({}) - let formElement: HTMLFormElement - let isDirty = false + let formElement: HTMLFormElement = $state(null!) + let isDirty = $state(false) let defaultData: FormData = new FormData() - $: _method = isUrlMethodPair(action) ? action.method : ((method ?? 'get').toLowerCase() as Method) - $: _action = isUrlMethodPair(action) ? action.url : (action as string) + const _method = $derived(isUrlMethodPair(action) ? action.method : ((method ?? 'get').toLowerCase() as Method)) + const _action = $derived(isUrlMethodPair(action) ? action.url : (action as string)) export function getFormData(): FormData { return new FormData(formElement) @@ -119,7 +150,7 @@ ...options, } - $form.transform(() => transform!(_data)).submit(_method, url, submitOptions) + form.transform(() => transform!(_data)).submit(_method, url, submitOptions) } function handleSubmit(event: Event) { @@ -141,21 +172,21 @@ export function clearErrors(...fields: string[]) { // @ts-expect-error - $form.clearErrors(...fields) + form.clearErrors(...fields) } export function resetAndClearErrors(...fields: string[]) { // @ts-expect-error - $form.clearErrors(...fields) + form.clearErrors(...fields) reset(...fields) } export function setError(field: string | object, value?: string) { if (typeof field === 'string') { // @ts-expect-error - $form.setError(field, value) + form.setError(field, value) } else { - $form.setError(field) + form.setError(field) } } @@ -174,32 +205,33 @@ formEvents.forEach((e) => formElement?.removeEventListener(e, updateDirtyState)) } }) - $: slotErrors = $form.errors as Errors + const slotErrors = $derived(form.errors as Errors) +{/* @ts-expect-error method type does not match here*/ null}
- + {@render children?.({ + errors: slotErrors, + hasErrors: form.hasErrors, + processing: form.processing, + progress: form.progress, + wasSuccessful: form.wasSuccessful, + recentlySuccessful: form.recentlySuccessful, + clearErrors, + resetAndClearErrors, + setError, + isDirty, + submit, + defaults, + getData, + getFormData, + })} diff --git a/packages/svelte/src/components/InfiniteScroll.svelte b/packages/svelte/src/components/InfiniteScroll.svelte index f9a5e4c7d..743d35a69 100644 --- a/packages/svelte/src/components/InfiniteScroll.svelte +++ b/packages/svelte/src/components/InfiniteScroll.svelte @@ -9,62 +9,56 @@ } from '@inertiajs/core' import { onDestroy, onMount } from 'svelte' - export let data: InfiniteScrollComponentBaseProps['data'] - export let buffer: InfiniteScrollComponentBaseProps['buffer'] = 0 - export let as: InfiniteScrollComponentBaseProps['as'] = 'div' - export let manual: InfiniteScrollComponentBaseProps['manual'] = false - export let manualAfter: InfiniteScrollComponentBaseProps['manualAfter'] = 0 - export let preserveUrl: InfiniteScrollComponentBaseProps['preserveUrl'] = false - export let reverse: InfiniteScrollComponentBaseProps['reverse'] = false - export let autoScroll: InfiniteScrollComponentBaseProps['autoScroll'] = undefined - export let startElement: string | (() => HTMLElement | null) | null = null - export let endElement: string | (() => HTMLElement | null) | null = null - export let itemsElement: string | (() => HTMLElement | null) | null = null - export let onlyNext = false - export let onlyPrevious = false - - let itemsElementRef: HTMLElement - let startElementRef: HTMLElement - let endElementRef: HTMLElement - let loadingPrevious = false - let loadingNext = false - let requestCount = 0 - - $: resolvedItemsElement = resolveHTMLElement(itemsElement, itemsElementRef) - $: scrollableParent = resolvedItemsElement ? getScrollableParent(resolvedItemsElement) : null - - $: sharedExposed = { - loadingPrevious, - loadingNext, - hasPrevious: infiniteScrollInstance?.dataManager.hasPrevious() || false, - hasNext: infiniteScrollInstance?.dataManager.hasNext() || false, - } satisfies Pick - - $: exposedPrevious = { - loading: loadingPrevious, - fetch: fetchPrevious, - autoMode: headerAutoMode, - manualMode: !headerAutoMode, - hasMore: infiniteScrollInstance?.dataManager.hasPrevious() || false, - ...sharedExposed, - } satisfies InfiniteScrollActionSlotProps - - $: exposedNext = { - loading: loadingNext, - fetch: fetchNext, - autoMode: footerAutoMode, - manualMode: !footerAutoMode, - hasMore: infiniteScrollInstance?.dataManager.hasNext() || false, - ...sharedExposed, - } satisfies InfiniteScrollActionSlotProps - - $: exposedSlot = { - loading: loadingPrevious || loadingNext, - loadingPrevious, - loadingNext, - } satisfies InfiniteScrollSlotProps + interface Props { + data: InfiniteScrollComponentBaseProps['data'] + buffer?: InfiniteScrollComponentBaseProps['buffer'] + as?: InfiniteScrollComponentBaseProps['as'] + manual?: InfiniteScrollComponentBaseProps['manual'] + manualAfter?: InfiniteScrollComponentBaseProps['manualAfter'] + preserveUrl?: InfiniteScrollComponentBaseProps['preserveUrl'] + reverse?: InfiniteScrollComponentBaseProps['reverse'] + autoScroll?: InfiniteScrollComponentBaseProps['autoScroll'] + startElement?: string | (() => HTMLElement | null) | null + endElement?: string | (() => HTMLElement | null) | null + itemsElement?: string | (() => HTMLElement | null) | null + onlyNext?: boolean + onlyPrevious?: boolean + previous?: import('svelte').Snippet<[any]> + loading?: import('svelte').Snippet<[any]> + next?: import('svelte').Snippet<[any]> + children?: import('svelte').Snippet<[any]> + [key: string]: any + } - let infiniteScrollInstance: UseInfiniteScrollProps | null = null + let { + data, + buffer = 0, + as = 'div', + manual = false, + manualAfter = 0, + preserveUrl = false, + reverse = false, + autoScroll = undefined, + startElement = null, + endElement = null, + itemsElement = null, + onlyNext = false, + onlyPrevious = false, + previous, + loading, + next, + children, + ...rest + }: Props = $props() + + let itemsElementRef: HTMLElement = $state(null!) + let startElementRef: HTMLElement = $state(null!) + let endElementRef: HTMLElement = $state(null!) + let loadingPrevious = $state(false) + let loadingNext = $state(false) + let requestCount = $state(0) + + let infiniteScrollInstance: UseInfiniteScrollProps = $state(null!) function resolveHTMLElement( value: string | (() => HTMLElement | null) | null, @@ -167,64 +161,82 @@ } } - $: manualMode = manual || (manualAfter !== undefined && manualAfter > 0 && requestCount >= manualAfter) - $: autoLoad = !manualMode - - $: headerAutoMode = autoLoad && !onlyNext - $: footerAutoMode = autoLoad && !onlyPrevious - - $: { + onDestroy(() => infiniteScrollInstance?.flush()) + let resolvedItemsElement = $derived(resolveHTMLElement(itemsElement, itemsElementRef)) + let scrollableParent = $derived(resolvedItemsElement ? getScrollableParent(resolvedItemsElement) : null) + let sharedExposed = $derived({ + loadingPrevious, + loadingNext, + hasPrevious: infiniteScrollInstance?.dataManager.hasPrevious() || false, + hasNext: infiniteScrollInstance?.dataManager.hasNext() || false, + } satisfies Pick) + let manualMode = $derived(manual || (manualAfter !== undefined && manualAfter > 0 && requestCount >= manualAfter)) + let autoLoad = $derived(!manualMode) + let headerAutoMode = $derived(autoLoad && !onlyNext) + let exposedPrevious = $derived({ + loading: loadingPrevious, + fetch: fetchPrevious, + autoMode: headerAutoMode, + manualMode: !headerAutoMode, + hasMore: infiniteScrollInstance?.dataManager.hasPrevious() || false, + ...sharedExposed, + } satisfies InfiniteScrollActionSlotProps) + let footerAutoMode = $derived(autoLoad && !onlyPrevious) + let exposedNext = $derived({ + loading: loadingNext, + fetch: fetchNext, + autoMode: footerAutoMode, + manualMode: !footerAutoMode, + hasMore: infiniteScrollInstance?.dataManager.hasNext() || false, + ...sharedExposed, + } satisfies InfiniteScrollActionSlotProps) + let exposedSlot = $derived({ + loading: loadingPrevious || loadingNext, + loadingPrevious, + loadingNext, + } satisfies InfiniteScrollSlotProps) + $effect(() => { // Make this block run whenever these change ;[autoLoad, onlyNext, onlyPrevious, reverse] autoLoad ? infiniteScrollInstance?.elementManager.enableTriggers() : infiniteScrollInstance?.elementManager.disableTriggers() - } - - onDestroy(() => infiniteScrollInstance?.flush()) + }) {#if !startElement && !reverse}
- - {#if loadingPrevious} - - {/if} - + {#if previous}{@render previous({ exposedPrevious, ...exposedPrevious })}{:else if loadingPrevious} + {@render loading?.({ exposedPrevious, ...exposedPrevious })} + {/if}
{/if} {#if !endElement && reverse}
- - {#if loadingNext} - - {/if} - + {#if next}{@render next({ exposedNext, ...exposedNext })}{:else if loadingNext} + {@render loading?.({ exposedNext, ...exposedNext })} + {/if}
{/if} - - + + {@render children?.({ exposedSlot, ...exposedSlot })} {#if !startElement && reverse}
- - {#if loadingPrevious} - - {/if} - + {#if previous}{@render previous({ exposedPrevious, ...exposedPrevious })}{:else if loadingPrevious} + {@render loading?.({ exposedPrevious, ...exposedPrevious })} + {/if}
{/if} {#if !endElement && !reverse}
- - {#if loadingNext} - - {/if} - + {#if next}{@render next({ exposedNext, ...exposedNext })}{:else if loadingNext} + {@render loading?.({ exposedNext, ...exposedNext })} + {/if}
{/if} diff --git a/packages/svelte/src/components/Link.svelte b/packages/svelte/src/components/Link.svelte index 4f3efc06f..3c7b3e48a 100644 --- a/packages/svelte/src/components/Link.svelte +++ b/packages/svelte/src/components/Link.svelte @@ -3,36 +3,86 @@ import type { LinkComponentBaseProps } from '@inertiajs/core' import { inertia } from '../index' - export let href: LinkComponentBaseProps['href'] = '' - export let as: keyof HTMLElementTagNameMap = 'a' - export let data: LinkComponentBaseProps['data'] = {} - export let method: LinkComponentBaseProps['method'] = 'get' - export let replace: LinkComponentBaseProps['replace'] = false - export let preserveScroll: LinkComponentBaseProps['preserveScroll'] = false - export let preserveState: LinkComponentBaseProps['preserveState'] | null = null - export let preserveUrl: LinkComponentBaseProps['preserveUrl'] = false - export let only: LinkComponentBaseProps['only'] = [] - export let except: LinkComponentBaseProps['except'] = [] - export let headers: LinkComponentBaseProps['headers'] = {} - export let queryStringArrayFormat: LinkComponentBaseProps['queryStringArrayFormat'] = 'brackets' - export let async: LinkComponentBaseProps['async'] = false - export let prefetch: LinkComponentBaseProps['prefetch'] = false - export let cacheFor: LinkComponentBaseProps['cacheFor'] = 0 - export let cacheTags: LinkComponentBaseProps['cacheTags'] = [] - export let viewTransition: LinkComponentBaseProps['viewTransition'] = false + interface Props { + href?: LinkComponentBaseProps['href'] + as?: keyof HTMLElementTagNameMap + data?: LinkComponentBaseProps['data'] + method?: LinkComponentBaseProps['method'] + replace?: LinkComponentBaseProps['replace'] + preserveScroll?: LinkComponentBaseProps['preserveScroll'] + preserveState?: LinkComponentBaseProps['preserveState'] | null + preserveUrl?: LinkComponentBaseProps['preserveUrl'] + only?: LinkComponentBaseProps['only'] + except?: LinkComponentBaseProps['except'] + headers?: LinkComponentBaseProps['headers'] + queryStringArrayFormat?: LinkComponentBaseProps['queryStringArrayFormat'] + async?: LinkComponentBaseProps['async'] + prefetch?: LinkComponentBaseProps['prefetch'] + cacheFor?: LinkComponentBaseProps['cacheFor'] + cacheTags?: LinkComponentBaseProps['cacheTags'] + viewTransition?: LinkComponentBaseProps['viewTransition'] + children?: import('svelte').Snippet + [key: string]: any + } - $: _method = isUrlMethodPair(href) ? href.method : method - $: _href = isUrlMethodPair(href) ? href.url : href + // Are these defined anywhere else? + type Callbacks = { + onfocus?: () => void + onblur?: () => void + onclick?: () => void + ondblclick?: () => void + onmousedown?: () => void + onmousemove?: () => void + onmouseout?: () => void + onmouseover?: () => void + onmouseup?: () => void + 'oncancel-token'?: () => void + onbefore?: () => void + onstart?: () => void + onprogress?: () => void + onfinish?: () => void + oncancel?: () => void + onsuccess?: () => void + onerror?: () => void + onprefetching?: () => void + onprefetched?: () => void + } - $: asProp = _method !== 'get' ? 'button' : as.toLowerCase() - $: elProps = + let { + href = '', + as = 'a', + data = {}, + method = 'get', + replace = false, + preserveScroll = false, + preserveState = null, + preserveUrl = false, + only = [], + except = [], + headers = {}, + queryStringArrayFormat = 'brackets', + async = false, + prefetch = false, + cacheFor = 0, + cacheTags = [], + viewTransition = false, + children, + ...rest + }: Props & Callbacks = $props() + + let _method = $derived(isUrlMethodPair(href) ? href.method : method) + let _href = $derived(isUrlMethodPair(href) ? href.url : href) + + let asProp = $derived(_method !== 'get' ? 'button' : as.toLowerCase()) + let elProps = $derived( { a: { href: _href }, button: { type: 'button' }, - }[asProp] || {} + }[asProp] || {}, + ) - + - + {@render children?.()} diff --git a/packages/svelte/src/components/Render.svelte b/packages/svelte/src/components/Render.svelte index 895dec332..dcb228322 100644 --- a/packages/svelte/src/components/Render.svelte +++ b/packages/svelte/src/components/Render.svelte @@ -1,17 +1,17 @@ - {#if component} @@ -50,13 +49,15 @@ while the layout components are persisted across page changes. --> {#key children?.length === 0 ? key : null} {#if children.length > 0} - + {@const SvelteComponent = component} + {#each children as child} - + {/each} - + {:else} - + {@const SvelteComponent_1 = component} + {/if} {/key} {/if} diff --git a/packages/svelte/src/components/WhenVisible.svelte b/packages/svelte/src/components/WhenVisible.svelte index a1e9cb20f..a33b0ffce 100644 --- a/packages/svelte/src/components/WhenVisible.svelte +++ b/packages/svelte/src/components/WhenVisible.svelte @@ -1,40 +1,38 @@ {#if always || !loaded} - + {/if} {#if loaded} - -{:else if $$slots.fallback} - + {@render children?.()} +{:else if fallback} + {@render fallback?.()} {/if} diff --git a/packages/svelte/src/createInertiaApp.ts b/packages/svelte/src/createInertiaApp.ts index 363b57940..573bf39c3 100644 --- a/packages/svelte/src/createInertiaApp.ts +++ b/packages/svelte/src/createInertiaApp.ts @@ -10,7 +10,7 @@ import App, { type InertiaAppProps } from './components/App.svelte' import { config } from './index' import type { ComponentResolver, SvelteInertiaAppConfig } from './types' -type SvelteRenderResult = { html: string; head: string; css?: { code: string } } +type SvelteRenderResult = { body: string; head: string; css?: { code: string } } type SetupOptions = { el: HTMLElement | null @@ -49,24 +49,26 @@ export default async function createInertiaApp Promise.resolve(resolve(name)) - const svelteApp = await Promise.all([ + const [initialComponent] = await Promise.all([ resolveComponent(initialPage.component), router.decryptHistory().catch(() => {}), - ]).then(([initialComponent]) => { - return setup({ - el, - App, - props: { initialPage, initialComponent, resolveComponent }, - }) + ]) + + const props: InertiaAppProps = { initialPage, initialComponent, resolveComponent } + + const svelteApp = await setup({ + el, + App, + props, }) if (isServer && svelteApp) { - const { html, head, css } = svelteApp + const { body, head, css } = svelteApp return { body: useScriptElementForInitialPage - ? `
${html}
` - : `
${html}
`, + ? `
${body}
` + : `
${body}
`, head: [head, css ? `` : ''], } } diff --git a/packages/svelte/src/index.ts b/packages/svelte/src/index.ts index 57409aabf..aecff4551 100644 --- a/packages/svelte/src/index.ts +++ b/packages/svelte/src/index.ts @@ -10,11 +10,11 @@ export { default as Link } from './components/Link.svelte' export { default as WhenVisible } from './components/WhenVisible.svelte' export { default as createInertiaApp } from './createInertiaApp' export { default as inertia } from './link' -export { default as page, usePage } from './page' +export { default as page, usePage } from './page.svelte' export { type ResolvedComponent, type SvelteInertiaAppConfig } from './types' -export { default as useForm, type InertiaForm, type InertiaFormProps } from './useForm' +export { default as useForm, type InertiaForm, type InertiaFormProps } from './useForm.svelte' export { default as usePoll } from './usePoll' -export { default as usePrefetch } from './usePrefetch' -export { default as useRemember } from './useRemember' +export { default as usePrefetch } from './usePrefetch.svelte' +export { default as useRemember } from './useRemember.svelte' export const config = coreConfig.extend({}) diff --git a/packages/svelte/src/page.ts b/packages/svelte/src/page.svelte.ts similarity index 55% rename from packages/svelte/src/page.ts rename to packages/svelte/src/page.svelte.ts index b4c2a7913..abd06c3dd 100644 --- a/packages/svelte/src/page.ts +++ b/packages/svelte/src/page.svelte.ts @@ -1,5 +1,4 @@ import { type Page, type PageProps, type SharedPageProps } from '@inertiajs/core' -import { derived, writable, type Readable } from 'svelte/store' type SveltePage = Omit, 'props'> & { props: Page['props'] & { @@ -7,12 +6,19 @@ type SveltePage = Omit() +const page = $state({ + component: '', + props: {}, + url: '', + version: null, +} as SveltePage) -export const setPage = set - -export default { subscribe } +export function setPage(newPage: SveltePage) { + Object.assign(page, newPage) +} -export function usePage(): Readable> { - return derived({ subscribe }, ($page) => $page as SveltePage) +export function usePage(): SveltePage { + return page as SveltePage } + +export default page diff --git a/packages/svelte/src/types.ts b/packages/svelte/src/types.ts index 9faee824a..e50c1914b 100644 --- a/packages/svelte/src/types.ts +++ b/packages/svelte/src/types.ts @@ -1,14 +1,14 @@ -import type { ComponentType } from 'svelte' +import type { Component } from 'svelte' import type { RenderFunction, RenderProps } from './components/Render.svelte' export type ComponentResolver = (name: string) => ResolvedComponent | Promise export type LayoutResolver = (h: RenderFunction, page: RenderProps) => RenderProps -export type LayoutType = LayoutResolver | ComponentType | ComponentType[] +export type LayoutType = LayoutResolver | Component | Component[] export type ResolvedComponent = { - default: ComponentType + default: Component layout?: LayoutType } diff --git a/packages/svelte/src/useForm.ts b/packages/svelte/src/useForm.svelte.ts similarity index 76% rename from packages/svelte/src/useForm.ts rename to packages/svelte/src/useForm.svelte.ts index 26f09e893..c3882ec4b 100644 --- a/packages/svelte/src/useForm.ts +++ b/packages/svelte/src/useForm.svelte.ts @@ -18,10 +18,9 @@ import type { import { router } from '@inertiajs/core' import type { AxiosProgressEvent } from 'axios' import { cloneDeep, get, has, isEqual, set } from 'lodash-es' -import { writable, type Writable } from 'svelte/store' import { config } from '.' -type InertiaFormStore = Writable> & InertiaForm +type InertiaFormStore = InertiaForm type FormOptions = Omit type SubmitArgs = [Method, string, FormOptions?] | [UrlMethodPair, FormOptions?] @@ -81,12 +80,7 @@ export default function useForm>( // overriding user's custom defaults with automatic behavior. let defaultsCalledInOnSuccess = false - // Internal helper to update form state properties - const setFormState = >(key: K, value: InertiaFormProps[K]) => { - store.update((form) => ({ ...form, [key]: value })) - } - - const store = writable>({ + let form = $state({ ...(restored ? restored.data : data), isDirty: false, errors: (restored ? restored.errors : {}) as FormDataErrors, @@ -96,9 +90,11 @@ export default function useForm>( recentlySuccessful: false, processing: false, setStore(keyOrData: keyof InertiaFormProps | FormDataKeys | TForm, maybeValue = undefined) { - store.update((store) => { - return typeof keyOrData === 'string' ? set(store, keyOrData, maybeValue) : Object.assign(store, keyOrData) - }) + if (typeof keyOrData === 'string') { + set(form, keyOrData, maybeValue) + } else { + Object.assign(form, keyOrData) + } }, data() { return Object.keys(data).reduce((carry, key) => { @@ -140,24 +136,21 @@ export default function useForm>( return this }, setError(fieldOrFields: FormDataKeys | FormDataErrors, maybeValue?: ErrorValue) { - setFormState('errors', { + form.errors = { ...this.errors, ...((typeof fieldOrFields === 'string' ? { [fieldOrFields]: maybeValue } : fieldOrFields) as Errors), - }) + } as FormDataErrors return this }, clearErrors(...fields: string[]) { - setFormState( - 'errors', - Object.keys(this.errors).reduce( - (carry, field) => ({ - ...carry, - ...(fields.length > 0 && !fields.includes(field) ? { [field]: (this.errors as Errors)[field] } : {}), - }), - {}, - ) as FormDataErrors, - ) + form.errors = Object.keys(this.errors).reduce( + (carry, field) => ({ + ...carry, + ...(fields.length > 0 && !fields.includes(field) ? { [field]: (this.errors as Errors)[field] } : {}), + }), + {}, + ) as FormDataErrors return this }, resetAndClearErrors(...fields: Array>) { @@ -174,7 +167,7 @@ export default function useForm>( defaultsCalledInOnSuccess = false - const data = transform(this.data()) as RequestPayload + const transformedData = transform(this.data()) as RequestPayload const _options: Omit = { ...options, @@ -186,8 +179,8 @@ export default function useForm>( } }, onBefore: (visit: PendingVisit) => { - setFormState('wasSuccessful', false) - setFormState('recentlySuccessful', false) + form.wasSuccessful = false + form.recentlySuccessful = false if (recentlySuccessfulTimeoutId) { clearTimeout(recentlySuccessfulTimeoutId) } @@ -197,44 +190,41 @@ export default function useForm>( } }, onStart: (visit: PendingVisit) => { - setFormState('processing', true) + form.processing = true if (options.onStart) { return options.onStart(visit) } }, onProgress: (event?: AxiosProgressEvent) => { - setFormState('progress', event || null) + form.progress = event || null if (options.onProgress) { return options.onProgress(event) } }, onSuccess: async (page: Page) => { - setFormState('processing', false) - setFormState('progress', null) + form.processing = false + form.progress = null this.clearErrors() - setFormState('wasSuccessful', true) - setFormState('recentlySuccessful', true) + form.wasSuccessful = true + form.recentlySuccessful = true recentlySuccessfulTimeoutId = setTimeout( - () => setFormState('recentlySuccessful', false), + () => (form.recentlySuccessful = false), config.get('form.recentlySuccessfulDuration'), ) const onSuccess = options.onSuccess ? await options.onSuccess(page) : null if (!defaultsCalledInOnSuccess) { - store.update((form) => { - this.defaults(cloneDeep(form.data())) - return form - }) + this.defaults(cloneDeep(this.data())) } return onSuccess }, onError: (errors: Errors) => { - setFormState('processing', false) - setFormState('progress', null) + form.processing = false + form.progress = null this.clearErrors().setError(errors as FormDataErrors) if (options.onError) { @@ -242,16 +232,16 @@ export default function useForm>( } }, onCancel: () => { - setFormState('processing', false) - setFormState('progress', null) + form.processing = false + form.progress = null if (options.onCancel) { return options.onCancel() } }, onFinish: (visit: ActiveVisit) => { - setFormState('processing', false) - setFormState('progress', null) + form.processing = false + form.progress = null cancelToken = null if (options.onFinish) { @@ -261,24 +251,24 @@ export default function useForm>( } if (method === 'delete') { - router.delete(url, { ..._options, data }) + router.delete(url, { ..._options, data: transformedData }) } else { - router[method](url, data, _options) + router[method](url, transformedData, _options) } }, - get(url: string, options: VisitOptions) { + get(url: string, options?: VisitOptions) { this.submit('get', url, options) }, - post(url: string, options: VisitOptions) { + post(url: string, options?: VisitOptions) { this.submit('post', url, options) }, - put(url: string, options: VisitOptions) { + put(url: string, options?: VisitOptions) { this.submit('put', url, options) }, - patch(url: string, options: VisitOptions) { + patch(url: string, options?: VisitOptions) { this.submit('patch', url, options) }, - delete(url: string, options: VisitOptions) { + delete(url: string, options?: VisitOptions) { this.submit('delete', url, options) }, cancel() { @@ -286,20 +276,20 @@ export default function useForm>( }, } as InertiaForm) - store.subscribe((form) => { + $effect(() => { if (form.isDirty === isEqual(form.data(), defaults)) { - setFormState('isDirty', !form.isDirty) + form.isDirty = !form.isDirty } const hasErrors = Object.keys(form.errors).length > 0 if (form.hasErrors !== hasErrors) { - setFormState('hasErrors', !form.hasErrors) + form.hasErrors = !form.hasErrors } if (rememberKey) { - router.remember({ data: form.data(), errors: form.errors }, rememberKey) + router.remember({ data: form.data(), errors: $state.snapshot(form.errors) }, rememberKey) } }) - return store as InertiaFormStore + return form as InertiaFormStore } diff --git a/packages/svelte/src/usePrefetch.ts b/packages/svelte/src/usePrefetch.svelte.ts similarity index 67% rename from packages/svelte/src/usePrefetch.ts rename to packages/svelte/src/usePrefetch.svelte.ts index cc02f644b..792448ded 100644 --- a/packages/svelte/src/usePrefetch.ts +++ b/packages/svelte/src/usePrefetch.svelte.ts @@ -1,18 +1,17 @@ import { router, type VisitOptions } from '@inertiajs/core' import { onDestroy, onMount } from 'svelte' -import { readonly, writable } from 'svelte/store' export default function usePrefetch(options: VisitOptions = {}) { - const isPrefetched = writable(false) - const isPrefetching = writable(false) - const lastUpdatedAt = writable(null) + let isPrefetched = $state(false) + let isPrefetching = $state(false) + let lastUpdatedAt = $state(null) const cached = typeof window === 'undefined' ? null : router.getCached(window.location.pathname, options) const inFlight = typeof window === 'undefined' ? null : router.getPrefetching(window.location.pathname, options) - isPrefetched.set(cached !== null) - isPrefetching.set(inFlight !== null) - lastUpdatedAt.set(cached?.staleTimestamp || null) + isPrefetched = cached !== null + isPrefetching = inFlight !== null + lastUpdatedAt = cached?.staleTimestamp || null let removePrefetchedListener: () => void let removePrefetchingListener: () => void @@ -20,14 +19,14 @@ export default function usePrefetch(options: VisitOptions = {}) { onMount(() => { removePrefetchingListener = router.on('prefetching', ({ detail }) => { if (detail.visit.url.pathname === window.location.pathname) { - isPrefetching.set(true) + isPrefetching = true } }) removePrefetchedListener = router.on('prefetched', ({ detail }) => { if (detail.visit.url.pathname === window.location.pathname) { - isPrefetched.set(true) - isPrefetching.set(false) + isPrefetched = true + isPrefetching = false } }) }) @@ -43,9 +42,15 @@ export default function usePrefetch(options: VisitOptions = {}) { }) return { - isPrefetched: readonly(isPrefetched), - isPrefetching: readonly(isPrefetching), - lastUpdatedAt: readonly(lastUpdatedAt), + get isPrefetched() { + return isPrefetched + }, + get isPrefetching() { + return isPrefetching + }, + get lastUpdatedAt() { + return lastUpdatedAt + }, flush() { router.flush(window.location.pathname, options) }, diff --git a/packages/svelte/src/useRemember.svelte.ts b/packages/svelte/src/useRemember.svelte.ts new file mode 100644 index 000000000..bf6000152 --- /dev/null +++ b/packages/svelte/src/useRemember.svelte.ts @@ -0,0 +1,12 @@ +import { router } from '@inertiajs/core' + +export default function useRemember(initialState: State, key?: string): State { + const restored = router.restore(key) as State | undefined + const state = $state(restored !== undefined ? restored : initialState) + + $effect(() => { + router.remember($state.snapshot(state), key) + }) + + return state +} diff --git a/packages/svelte/src/useRemember.ts b/packages/svelte/src/useRemember.ts deleted file mode 100644 index de6b6e034..000000000 --- a/packages/svelte/src/useRemember.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { router } from '@inertiajs/core' -import { onDestroy } from 'svelte' -import { writable } from 'svelte/store' - -export default function useRemember(initialState: State, key?: string) { - const restored = router.restore(key) as State | undefined - const store = writable(restored !== undefined ? restored : initialState) - const unsubscribe = store.subscribe((state) => router.remember(state, key)) - - onDestroy(unsubscribe) - - return store -} diff --git a/packages/svelte/test-app/Layouts/NestedLayout.svelte b/packages/svelte/test-app/Layouts/NestedLayout.svelte index fed03ab31..5721b8aa1 100644 --- a/packages/svelte/test-app/Layouts/NestedLayout.svelte +++ b/packages/svelte/test-app/Layouts/NestedLayout.svelte @@ -1,20 +1,30 @@
Nested Layout {createdAt}
- + {@render children?.()}
diff --git a/packages/svelte/test-app/Layouts/Prefetch.svelte b/packages/svelte/test-app/Layouts/Prefetch.svelte index edd473c98..94380109a 100644 --- a/packages/svelte/test-app/Layouts/Prefetch.svelte +++ b/packages/svelte/test-app/Layouts/Prefetch.svelte @@ -1,5 +1,10 @@
@@ -11,6 +16,6 @@ On Enter
- + {@render children?.()}
diff --git a/packages/svelte/test-app/Layouts/SWR.svelte b/packages/svelte/test-app/Layouts/SWR.svelte index cee0bd331..73300ca63 100644 --- a/packages/svelte/test-app/Layouts/SWR.svelte +++ b/packages/svelte/test-app/Layouts/SWR.svelte @@ -1,5 +1,10 @@
@@ -10,6 +15,6 @@ 1s Stale, 2s Expired (Number)
- + {@render children?.()}
diff --git a/packages/svelte/test-app/Layouts/SiteLayout.svelte b/packages/svelte/test-app/Layouts/SiteLayout.svelte index 734e59089..0c2602113 100644 --- a/packages/svelte/test-app/Layouts/SiteLayout.svelte +++ b/packages/svelte/test-app/Layouts/SiteLayout.svelte @@ -1,12 +1,17 @@ @@ -15,6 +20,6 @@ Site Layout {createdAt}
- + {@render children?.()}
diff --git a/packages/svelte/test-app/Layouts/WithScrollRegion.svelte b/packages/svelte/test-app/Layouts/WithScrollRegion.svelte index d199c42cb..8483f636e 100644 --- a/packages/svelte/test-app/Layouts/WithScrollRegion.svelte +++ b/packages/svelte/test-app/Layouts/WithScrollRegion.svelte @@ -1,9 +1,14 @@ - +
With scroll regions - +
Document scroll position is {documentScrollLeft} & {documentScrollTop}
Slot scroll position is {slotScrollLeft} & {slotScrollTop} @@ -26,9 +31,9 @@ id="slot" scroll-region style="height: 100px; width: 500px; overflow: scroll" - on:scroll={handleScrollEvent} + onscroll={handleScrollEvent} > - + {@render children?.()}
diff --git a/packages/svelte/test-app/Layouts/WithoutScrollRegion.svelte b/packages/svelte/test-app/Layouts/WithoutScrollRegion.svelte index 2e716afce..d5ba7c613 100644 --- a/packages/svelte/test-app/Layouts/WithoutScrollRegion.svelte +++ b/packages/svelte/test-app/Layouts/WithoutScrollRegion.svelte @@ -1,9 +1,14 @@ - +
Without scroll regions - +
Document scroll position is {documentScrollLeft} & {documentScrollTop}
Slot scroll position is {slotScrollLeft} & {slotScrollTop} -
- +
+ {@render children?.()}
diff --git a/packages/svelte/test-app/Pages/Article.svelte b/packages/svelte/test-app/Pages/Article.svelte index 6b6b2afca..d94a1e29b 100644 --- a/packages/svelte/test-app/Pages/Article.svelte +++ b/packages/svelte/test-app/Pages/Article.svelte @@ -6,7 +6,11 @@ document.documentElement.style.scrollBehavior = 'smooth' } - export let scrollLog: number[] = [] + interface Props { + scrollLog?: number[] + } + + let { scrollLog = $bindable([]) }: Props = $props() const handleScrollEvent = () => { scrollLog = [...scrollLog, document.documentElement.scrollTop] @@ -89,8 +93,8 @@ Article Far Down - - + diff --git a/packages/svelte/test-app/Pages/ClientSideVisit/Page1.svelte b/packages/svelte/test-app/Pages/ClientSideVisit/Page1.svelte index 855af86df..5bebc79e9 100644 --- a/packages/svelte/test-app/Pages/ClientSideVisit/Page1.svelte +++ b/packages/svelte/test-app/Pages/ClientSideVisit/Page1.svelte @@ -7,12 +7,16 @@ bar: string } - export let foo: string - export let bar: string + interface Props { + foo: string + bar: string + } + + let { foo, bar }: Props = $props() - let errors = 0 - let finished = 0 - let success = 0 + let errors = $state(0) + let finished = $state(0) + let success = $state(0) let random = Math.random() const bagErrors = () => { @@ -68,14 +72,14 @@
{foo}
{bar}
- - + - - - - + + + +
Errors: {errors}
Finished: {finished}
Success: {success}
diff --git a/packages/svelte/test-app/Pages/ClientSideVisit/Page2.svelte b/packages/svelte/test-app/Pages/ClientSideVisit/Page2.svelte index 6e8277280..acb8470b0 100644 --- a/packages/svelte/test-app/Pages/ClientSideVisit/Page2.svelte +++ b/packages/svelte/test-app/Pages/ClientSideVisit/Page2.svelte @@ -1,5 +1,9 @@
{baz}
diff --git a/packages/svelte/test-app/Pages/ClientSideVisit/Props.svelte b/packages/svelte/test-app/Pages/ClientSideVisit/Props.svelte index 126c61112..412c85453 100644 --- a/packages/svelte/test-app/Pages/ClientSideVisit/Props.svelte +++ b/packages/svelte/test-app/Pages/ClientSideVisit/Props.svelte @@ -11,12 +11,23 @@ age: number } - export let items: string[] = [] - export let tags: Tag[] = [] - export let user: User | undefined = undefined - export let count = 0 - export let singleValue: string | string[] | undefined = undefined - export let undefinedValue: string | string[] | undefined = undefined + interface Props_1 { + items?: string[] + tags?: Tag[] + user?: User | undefined + count?: number + singleValue?: string | string[] | undefined + undefinedValue?: string | string[] | undefined + } + + let { + items = [], + tags = [], + user = undefined, + count = 0, + singleValue = undefined, + undefinedValue = undefined, + }: Props_1 = $props() const replacePropString = () => { router.replaceProp('user.name', 'Jane Smith') @@ -101,26 +112,26 @@

Replace Prop Tests

- - - + + +

Append To Prop Tests

- - - - + + + +

Prepend To Prop Tests

- - - + + +

Edge Case Tests (mergeArrays behavior)

- - - - - - + + + + + +
diff --git a/packages/svelte/test-app/Pages/ComplexMergeSelective.svelte b/packages/svelte/test-app/Pages/ComplexMergeSelective.svelte index 352c9f3da..bf4130e1c 100644 --- a/packages/svelte/test-app/Pages/ComplexMergeSelective.svelte +++ b/packages/svelte/test-app/Pages/ComplexMergeSelective.svelte @@ -1,13 +1,17 @@ - + {#snippet fallback()}
Loading foo...
-
+ {/snippet}
{foo?.text}
- + {#snippet fallback()}
Loading bar...
-
+ {/snippet}
{bar?.text}
diff --git a/packages/svelte/test-app/Pages/DeferredProps/ManyGroups.svelte b/packages/svelte/test-app/Pages/DeferredProps/ManyGroups.svelte index d718139e3..49a882127 100644 --- a/packages/svelte/test-app/Pages/DeferredProps/ManyGroups.svelte +++ b/packages/svelte/test-app/Pages/DeferredProps/ManyGroups.svelte @@ -1,45 +1,49 @@ - + {#snippet fallback()}
Loading foo...
-
+ {/snippet} {foo?.text}
- + {#snippet fallback()}
Loading bar...
-
+ {/snippet} {bar?.text}
- + {#snippet fallback()}
Loading baz...
-
+ {/snippet} {baz?.text}
- + {#snippet fallback()}
Loading qux...
-
+ {/snippet} {qux?.text}
- + {#snippet fallback()}
Loading quux...
-
+ {/snippet} {quux?.text}
diff --git a/packages/svelte/test-app/Pages/DeferredProps/Page1.svelte b/packages/svelte/test-app/Pages/DeferredProps/Page1.svelte index b032ace51..b9d9721a1 100644 --- a/packages/svelte/test-app/Pages/DeferredProps/Page1.svelte +++ b/packages/svelte/test-app/Pages/DeferredProps/Page1.svelte @@ -1,21 +1,25 @@ - + {#snippet fallback()}
Loading foo...
-
+ {/snippet} {foo?.text}
- + {#snippet fallback()}
Loading bar...
-
+ {/snippet} {bar?.text}
diff --git a/packages/svelte/test-app/Pages/DeferredProps/Page2.svelte b/packages/svelte/test-app/Pages/DeferredProps/Page2.svelte index b2e87c632..d85e4894c 100644 --- a/packages/svelte/test-app/Pages/DeferredProps/Page2.svelte +++ b/packages/svelte/test-app/Pages/DeferredProps/Page2.svelte @@ -1,21 +1,31 @@ -
Loading baz...
+ {#snippet fallback()} +
Loading baz...
+ {/snippet} {baz}
-
Loading qux...
+ {#snippet fallback()} +
Loading qux...
+ {/snippet} {qux}
-
Loading baz and qux...
+ {#snippet fallback()} +
Loading baz and qux...
+ {/snippet} both {baz} and {qux}
diff --git a/packages/svelte/test-app/Pages/DeferredProps/Page3.svelte b/packages/svelte/test-app/Pages/DeferredProps/Page3.svelte index 81330305e..a93d1ebc9 100644 --- a/packages/svelte/test-app/Pages/DeferredProps/Page3.svelte +++ b/packages/svelte/test-app/Pages/DeferredProps/Page3.svelte @@ -1,16 +1,24 @@ -
Loading alpha...
+ {#snippet fallback()} +
Loading alpha...
+ {/snippet} {alpha}
-
Loading beta...
+ {#snippet fallback()} +
Loading beta...
+ {/snippet} {beta}
diff --git a/packages/svelte/test-app/Pages/DeferredProps/PartialReloads.svelte b/packages/svelte/test-app/Pages/DeferredProps/PartialReloads.svelte index c467432f3..9fed54773 100644 --- a/packages/svelte/test-app/Pages/DeferredProps/PartialReloads.svelte +++ b/packages/svelte/test-app/Pages/DeferredProps/PartialReloads.svelte @@ -1,8 +1,12 @@ - + {#snippet fallback()}
Loading foo...
-
+ {/snippet}
{foo?.timestamp}
- + {#snippet fallback()}
Loading bar...
-
+ {/snippet}
{bar?.timestamp}
- - - + + + diff --git a/packages/svelte/test-app/Pages/DeferredProps/WithErrors.svelte b/packages/svelte/test-app/Pages/DeferredProps/WithErrors.svelte index 1c42c7746..da5d37b4b 100644 --- a/packages/svelte/test-app/Pages/DeferredProps/WithErrors.svelte +++ b/packages/svelte/test-app/Pages/DeferredProps/WithErrors.svelte @@ -1,30 +1,34 @@ - + {#snippet fallback()}
Loading foo...
-
+ {/snippet}
{foo?.text}
-{#if $page.props.errors?.name} -

{$page.props.errors.name}

+{#if page.props.errors?.name} +

{page.props.errors.name}

{/if} -{#if $form.errors.name} -

{$form.errors.name}

+{#if form.errors.name} +

{form.errors.name}

{/if} - + diff --git a/packages/svelte/test-app/Pages/Dump.svelte b/packages/svelte/test-app/Pages/Dump.svelte index 7f378d11e..95eb44e45 100644 --- a/packages/svelte/test-app/Pages/Dump.svelte +++ b/packages/svelte/test-app/Pages/Dump.svelte @@ -1,16 +1,20 @@ diff --git a/packages/svelte/test-app/Pages/ErrorModal.svelte b/packages/svelte/test-app/Pages/ErrorModal.svelte index 1ca579353..a77ffd559 100644 --- a/packages/svelte/test-app/Pages/ErrorModal.svelte +++ b/packages/svelte/test-app/Pages/ErrorModal.svelte @@ -1,7 +1,11 @@
e.key === 'Enter' && invalidVisit()} + onclick={invalidVisit} + onkeydown={(e) => e.key === 'Enter' && invalidVisit()} role="button" tabindex="0" class="invalid-visit">Invalid Visit e.key === 'Enter' && invalidVisitJson()} + onclick={invalidVisitJson} + onkeydown={(e) => e.key === 'Enter' && invalidVisitJson()} role="button" tabindex="0" class="invalid-visit-json">Invalid Visit (JSON response) + -
-

Form Default Values

+ + {#snippet children({ errors })} +

Form Default Values

-
- - -
{errors['user.name']}
-
+
+ + +
{errors['user.name']}
+
- + + {/snippet}
diff --git a/packages/svelte/test-app/Pages/FormComponent/DisableWhileProcessing.svelte b/packages/svelte/test-app/Pages/FormComponent/DisableWhileProcessing.svelte index ef1ef38ba..42b90f8b1 100644 --- a/packages/svelte/test-app/Pages/FormComponent/DisableWhileProcessing.svelte +++ b/packages/svelte/test-app/Pages/FormComponent/DisableWhileProcessing.svelte @@ -1,22 +1,30 @@

Form Disable While Processing Test

-
-
- - {#if errors.name} -

{errors.name}

- {/if} -
+ + {#snippet children({ errors })} +
+ + {#if errors.name} +

{errors.name}

+ {/if} +
-
- -
+
+ +
+ {/snippet}
diff --git a/packages/svelte/test-app/Pages/FormComponent/Elements.svelte b/packages/svelte/test-app/Pages/FormComponent/Elements.svelte index 7986a54b4..0b17f4740 100644 --- a/packages/svelte/test-app/Pages/FormComponent/Elements.svelte +++ b/packages/svelte/test-app/Pages/FormComponent/Elements.svelte @@ -2,118 +2,126 @@ import { config, Form } from '@inertiajs/svelte' import type { QueryStringArrayFormatOption } from '@inertiajs/core' - export let queryStringArrayFormat: QueryStringArrayFormatOption | 'force-brackets' + interface Props { + queryStringArrayFormat: QueryStringArrayFormatOption | 'force-brackets' + } - const format = queryStringArrayFormat === 'force-brackets' ? 'brackets' : queryStringArrayFormat + let { queryStringArrayFormat }: Props = $props() - if (queryStringArrayFormat === 'force-brackets') { - config.set('form.forceIndicesArrayFormatInFormData', false) - } + const format = $derived(queryStringArrayFormat === 'force-brackets' ? 'brackets' : queryStringArrayFormat) + + $effect(() => { + if (queryStringArrayFormat === 'force-brackets') { + config.set('form.forceIndicesArrayFormatInFormData', false) + } + }) -
-

Form Elements

- -
- Form is {isDirty ? 'dirty' : 'clean'} -
- - -
- -
- - -
- -
- - -
- -
- - -
- - - -
- - -
- - -
- - -
- - - -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- -
- - -
- - -
- - -
- -
- - - + + {#snippet children({ isDirty })} +

Form Elements

+ +
+ Form is {isDirty ? 'dirty' : 'clean'} +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + + +
+ + +
+ + +
+ + +
+ + + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+ + +
+ +
+ + + + {/snippet}
diff --git a/packages/svelte/test-app/Pages/FormComponent/EmptyAction.svelte b/packages/svelte/test-app/Pages/FormComponent/EmptyAction.svelte index b971d6f2e..f61f56b24 100644 --- a/packages/svelte/test-app/Pages/FormComponent/EmptyAction.svelte +++ b/packages/svelte/test-app/Pages/FormComponent/EmptyAction.svelte @@ -5,16 +5,18 @@

Form Empty Action Test

-
-
- - {#if errors.name} -

{errors.name}

- {/if} -
+ + {#snippet children({ errors })} +
+ + {#if errors.name} +

{errors.name}

+ {/if} +
-
- -
+
+ +
+ {/snippet}
diff --git a/packages/svelte/test-app/Pages/FormComponent/Errors.svelte b/packages/svelte/test-app/Pages/FormComponent/Errors.svelte index fc65a6526..5b617b897 100644 --- a/packages/svelte/test-app/Pages/FormComponent/Errors.svelte +++ b/packages/svelte/test-app/Pages/FormComponent/Errors.svelte @@ -1,53 +1,47 @@ -
-

Form Errors

+ + {#snippet children({ errors, hasErrors, setError, clearErrors })} +

Form Errors

- {#if hasErrors} -
Form has errors
- {:else} -
No errors
- {/if} + {#if hasErrors} +
Form has errors
+ {:else} +
No errors
+ {/if} -
- - -
{errors.name || ''}
-
+
+ + +
{errors.name || ''}
+
-
- - -
{errors.handle || ''}
-
+
+ + +
{errors.handle || ''}
+
-
- - - - -
+
+ + + + +
- + + {/snippet}
diff --git a/packages/svelte/test-app/Pages/FormComponent/Events.svelte b/packages/svelte/test-app/Pages/FormComponent/Events.svelte index 7b78899b9..f8025bb50 100644 --- a/packages/svelte/test-app/Pages/FormComponent/Events.svelte +++ b/packages/svelte/test-app/Pages/FormComponent/Events.svelte @@ -1,27 +1,29 @@
diff --git a/packages/svelte/test-app/Pages/FormComponent/Methods.svelte b/packages/svelte/test-app/Pages/FormComponent/Methods.svelte index 8eb599abb..a89780aa9 100644 --- a/packages/svelte/test-app/Pages/FormComponent/Methods.svelte +++ b/packages/svelte/test-app/Pages/FormComponent/Methods.svelte @@ -2,18 +2,18 @@ import { Form } from '@inertiajs/svelte' import type { Method } from '@inertiajs/core' - let method: Method = 'get' + let method: Method = $state('get')

HTTP Methods

- - - - - + + + + +
Current method: {method}
diff --git a/packages/svelte/test-app/Pages/FormComponent/Options.svelte b/packages/svelte/test-app/Pages/FormComponent/Options.svelte index 0c36e5c3c..88d71be78 100644 --- a/packages/svelte/test-app/Pages/FormComponent/Options.svelte +++ b/packages/svelte/test-app/Pages/FormComponent/Options.svelte @@ -1,3 +1,5 @@ + -
-
- - -

{errors.name || ''}

-
+ + {#snippet children({ errors })} +
+ + +

{errors.name || ''}

+
-
- - -

{errors.email || ''}

-
+
+ + +

{errors.email || ''}

+
- + + {/snippet}
diff --git a/packages/svelte/test-app/Pages/FormComponent/ResetAttributes/ResetOnErrorFields.svelte b/packages/svelte/test-app/Pages/FormComponent/ResetAttributes/ResetOnErrorFields.svelte index 50ef8b95d..814ea2f89 100644 --- a/packages/svelte/test-app/Pages/FormComponent/ResetAttributes/ResetOnErrorFields.svelte +++ b/packages/svelte/test-app/Pages/FormComponent/ResetAttributes/ResetOnErrorFields.svelte @@ -2,18 +2,20 @@ import { Form } from '@inertiajs/svelte' -
-
- - -

{errors.name || ''}

-
+ + {#snippet children({ errors })} +
+ + +

{errors.name || ''}

+
-
- - -

{errors.email || ''}

-
+
+ + +

{errors.email || ''}

+
- + + {/snippet}
diff --git a/packages/svelte/test-app/Pages/FormComponent/ResetAttributes/ResetOnSuccess.svelte b/packages/svelte/test-app/Pages/FormComponent/ResetAttributes/ResetOnSuccess.svelte index 87b8fd612..07dd4ac6e 100644 --- a/packages/svelte/test-app/Pages/FormComponent/ResetAttributes/ResetOnSuccess.svelte +++ b/packages/svelte/test-app/Pages/FormComponent/ResetAttributes/ResetOnSuccess.svelte @@ -2,18 +2,20 @@ import { Form } from '@inertiajs/svelte' -
-
- - -

{errors.name || ''}

-
+ + {#snippet children({ errors })} +
+ + +

{errors.name || ''}

+
-
- - -

{errors.email || ''}

-
+
+ + +

{errors.email || ''}

+
- + + {/snippet}
diff --git a/packages/svelte/test-app/Pages/FormComponent/ResetAttributes/ResetOnSuccessFields.svelte b/packages/svelte/test-app/Pages/FormComponent/ResetAttributes/ResetOnSuccessFields.svelte index f072e84d8..1d423b343 100644 --- a/packages/svelte/test-app/Pages/FormComponent/ResetAttributes/ResetOnSuccessFields.svelte +++ b/packages/svelte/test-app/Pages/FormComponent/ResetAttributes/ResetOnSuccessFields.svelte @@ -2,18 +2,20 @@ import { Form } from '@inertiajs/svelte' -
-
- - -

{errors.name || ''}

-
+ + {#snippet children({ errors })} +
+ + +

{errors.name || ''}

+
-
- - -

{errors.email || ''}

-
+
+ + +

{errors.email || ''}

+
- + + {/snippet}
diff --git a/packages/svelte/test-app/Pages/FormComponent/SetDefaultsOnSuccess.svelte b/packages/svelte/test-app/Pages/FormComponent/SetDefaultsOnSuccess.svelte index aec47f021..4473b3c30 100644 --- a/packages/svelte/test-app/Pages/FormComponent/SetDefaultsOnSuccess.svelte +++ b/packages/svelte/test-app/Pages/FormComponent/SetDefaultsOnSuccess.svelte @@ -2,20 +2,22 @@ import { Form } from '@inertiajs/svelte' -
-

{isDirty ? 'Form is dirty' : 'Form is clean'}

+ + {#snippet children({ isDirty, errors })} +

{isDirty ? 'Form is dirty' : 'Form is clean'}

-
- - -

{errors.name || ''}

-
+
+ + +

{errors.name || ''}

+
-
- - -

{errors.email || ''}

-
+
+ + +

{errors.email || ''}

+
- + + {/snippet}
diff --git a/packages/svelte/test-app/Pages/FormComponent/SubmitComplete/Defaults.svelte b/packages/svelte/test-app/Pages/FormComponent/SubmitComplete/Defaults.svelte index 11184eadd..47d7e25de 100644 --- a/packages/svelte/test-app/Pages/FormComponent/SubmitComplete/Defaults.svelte +++ b/packages/svelte/test-app/Pages/FormComponent/SubmitComplete/Defaults.svelte @@ -5,27 +5,29 @@

OnSubmitComplete Defaults Test

-
props.defaults()}> -
-

{isDirty ? 'Form is dirty' : 'Form is clean'}

-
+ props.defaults()}> + {#snippet children({ errors, isDirty })} +
+

{isDirty ? 'Form is dirty' : 'Form is clean'}

+
-
- - {#if errors.name} -

{errors.name}

- {/if} -
+
+ + {#if errors.name} +

{errors.name}

+ {/if} +
-
- - {#if errors.email} -

{errors.email}

- {/if} -
+
+ + {#if errors.email} +

{errors.email}

+ {/if} +
-
- -
+
+ +
+ {/snippet}
diff --git a/packages/svelte/test-app/Pages/FormComponent/SubmitComplete/Redirect.svelte b/packages/svelte/test-app/Pages/FormComponent/SubmitComplete/Redirect.svelte index b63527595..593a1f74d 100644 --- a/packages/svelte/test-app/Pages/FormComponent/SubmitComplete/Redirect.svelte +++ b/packages/svelte/test-app/Pages/FormComponent/SubmitComplete/Redirect.svelte @@ -5,16 +5,18 @@

Form Empty Action Test

-
props.reset('name')}> -
- - {#if errors.name} -

{errors.name}

- {/if} -
+ props.reset('name')}> + {#snippet children({ errors })} +
+ + {#if errors.name} +

{errors.name}

+ {/if} +
-
- -
+
+ +
+ {/snippet}
diff --git a/packages/svelte/test-app/Pages/FormComponent/SubmitComplete/Reset.svelte b/packages/svelte/test-app/Pages/FormComponent/SubmitComplete/Reset.svelte index 7665e2aca..963e2a2b2 100644 --- a/packages/svelte/test-app/Pages/FormComponent/SubmitComplete/Reset.svelte +++ b/packages/svelte/test-app/Pages/FormComponent/SubmitComplete/Reset.svelte @@ -5,23 +5,25 @@

OnSubmitComplete Reset Test

-
props.reset('name')}> -
- - {#if errors.name} -

{errors.name}

- {/if} -
+ props.reset('name')}> + {#snippet children({ errors })} +
+ + {#if errors.name} +

{errors.name}

+ {/if} +
-
- - {#if errors.email} -

{errors.email}

- {/if} -
+
+ + {#if errors.email} +

{errors.email}

+ {/if} +
-
- -
+
+ +
+ {/snippet}
diff --git a/packages/svelte/test-app/Pages/FormComponent/Transform.svelte b/packages/svelte/test-app/Pages/FormComponent/Transform.svelte index 127a53753..c7daecd41 100644 --- a/packages/svelte/test-app/Pages/FormComponent/Transform.svelte +++ b/packages/svelte/test-app/Pages/FormComponent/Transform.svelte @@ -2,7 +2,7 @@ import { Form } from '@inertiajs/svelte' import type { FormDataConvertible } from '@inertiajs/core' - let transformType = 'none' + let transformType = $state('none') const getTransform = (type: string) => { switch (type) { @@ -21,16 +21,16 @@ } } - $: transform = getTransform(transformType) + let transform = $derived(getTransform(transformType))

Transform Function

- - - + + +
Current transform: {transformType}
diff --git a/packages/svelte/test-app/Pages/FormHelper/Data.svelte b/packages/svelte/test-app/Pages/FormHelper/Data.svelte index 7c3727586..c32220e94 100644 --- a/packages/svelte/test-app/Pages/FormHelper/Data.svelte +++ b/packages/svelte/test-app/Pages/FormHelper/Data.svelte @@ -8,71 +8,71 @@ }) const submit = () => { - $form.post($page.url) + form.post(page.url) } const submitAndReset = () => { - $form.post('/form-helper/data/redirect-back', { - onSuccess: () => $form.reset(), + form.post('/form-helper/data/redirect-back', { + onSuccess: () => form.reset(), }) } const resetAll = () => { - $form.reset() + form.reset() } const resetOne = () => { - $form.reset('handle') + form.reset('handle') } const reassign = () => { - $form.defaults() + form.defaults() } const reassignObject = () => { - $form.defaults({ + form.defaults({ handle: 'updated handle', remember: true, }) } const reassignSingle = () => { - $form.defaults('name', 'single value') + form.defaults('name', 'single value') }
- {#if $form.errors.name} - {$form.errors.name} + {#if form.errors.name} + {form.errors.name} {/if} - {#if $form.errors.handle} - {$form.errors.handle} + {#if form.errors.handle} + {form.errors.handle} {/if} - {#if $form.errors.remember} - {$form.errors.remember} + {#if form.errors.remember} + {form.errors.remember} {/if} - - + + - - + + - - - + + + - Form has {$form.hasErrors ? '' : 'no '}errors + Form has {form.hasErrors ? '' : 'no '}errors
diff --git a/packages/svelte/test-app/Pages/FormHelper/Dirty.svelte b/packages/svelte/test-app/Pages/FormHelper/Dirty.svelte index 61295151e..53b0f9d4a 100644 --- a/packages/svelte/test-app/Pages/FormHelper/Dirty.svelte +++ b/packages/svelte/test-app/Pages/FormHelper/Dirty.svelte @@ -7,15 +7,15 @@ }) const submit = () => { - $form.post('') + form.post('') } const defaults = () => { - $form.defaults() + form.defaults() } const pushValue = () => { - $form.foo.push('bar') + form.foo.push('bar') } const dataAndDefaults = () => { @@ -24,35 +24,35 @@ } const submitAndSetDefaults = () => { - $form.post('/form-helper/dirty/redirect-back', { - onSuccess: () => $form.defaults(), + form.post('/form-helper/dirty/redirect-back', { + onSuccess: () => form.defaults(), }) } const submitAndSetCustomDefaults = () => { - $form.post('/form-helper/dirty/redirect-back', { - onSuccess: () => $form.defaults({ name: 'Custom Default', foo: [] }), + form.post('/form-helper/dirty/redirect-back', { + onSuccess: () => form.defaults({ name: 'Custom Default', foo: [] }), }) }
- Form is {#if $form.isDirty}dirty{:else}clean{/if} + Form is {#if form.isDirty}dirty{:else}clean{/if}
- - - - + + + + - + -
diff --git a/packages/svelte/test-app/Pages/FormHelper/Errors.svelte b/packages/svelte/test-app/Pages/FormHelper/Errors.svelte index e7865ef21..8459007d1 100644 --- a/packages/svelte/test-app/Pages/FormHelper/Errors.svelte +++ b/packages/svelte/test-app/Pages/FormHelper/Errors.svelte @@ -8,68 +8,68 @@ }) const submit = () => { - $form.post('/form-helper/errors') + form.post('/form-helper/errors') } const clearErrors = () => { - $form.clearErrors() + form.clearErrors() } const clearError = () => { - $form.clearErrors('handle') + form.clearErrors('handle') } const setErrors = () => { - $form.setError({ + form.setError({ name: 'Manually set Name error', handle: 'Manually set Handle error', }) } const setError = () => { - $form.setError('handle', 'Manually set Handle error') + form.setError('handle', 'Manually set Handle error') } const resetAndClearErrors = () => { - $form.resetAndClearErrors() + form.resetAndClearErrors() } const resetHandle = () => { - $form.resetAndClearErrors('handle') + form.resetAndClearErrors('handle') }
- {#if $form.errors.name} - {$form.errors.name} + {#if form.errors.name} + {form.errors.name} {/if} - {#if $form.errors.handle} - {$form.errors.handle} + {#if form.errors.handle} + {form.errors.handle} {/if} - {#if $form.errors.remember} - {$form.errors.remember} + {#if form.errors.remember} + {form.errors.remember} {/if} - + - - - - - - + + + + + + - Form has {$form.hasErrors ? '' : 'no '}errors + Form has {form.hasErrors ? '' : 'no '}errors
diff --git a/packages/svelte/test-app/Pages/FormHelper/Events.svelte b/packages/svelte/test-app/Pages/FormHelper/Events.svelte index 946f7902b..4337a6d35 100644 --- a/packages/svelte/test-app/Pages/FormHelper/Events.svelte +++ b/packages/svelte/test-app/Pages/FormHelper/Events.svelte @@ -1,4 +1,4 @@ -
- + - - + + - - - - + + + + - - - - - - + + + + + + - - - - - + + + + + - + - Form was {$form.wasSuccessful ? '' : 'not '}successful - Form was {$form.recentlySuccessful ? '' : 'not '}recently successful + Form was {form.wasSuccessful ? '' : 'not '}successful + Form was {form.recentlySuccessful ? '' : 'not '}recently successful - - + +
diff --git a/packages/svelte/test-app/Pages/FormHelper/Methods.svelte b/packages/svelte/test-app/Pages/FormHelper/Methods.svelte index bf5a4c1aa..fd3b1ab28 100644 --- a/packages/svelte/test-app/Pages/FormHelper/Methods.svelte +++ b/packages/svelte/test-app/Pages/FormHelper/Methods.svelte @@ -7,27 +7,27 @@ }) const postForm = () => { - $form.post('/dump/post') + form.post('/dump/post') } const putForm = () => { - $form.put('/dump/put') + form.put('/dump/put') } const patchForm = () => { - $form.patch('/dump/patch') + form.patch('/dump/patch') } const deleteForm = () => { - $form.delete('/dump/delete') + form.delete('/dump/delete') } const submitForm = () => { - $form.submit('post', '/dump/post') + form.submit('post', '/dump/post') } const submitFormObject = () => { - $form.submit({ + form.submit({ method: 'post', url: '/dump/post', }) @@ -37,17 +37,17 @@
- - - - - - + + + + + +
diff --git a/packages/svelte/test-app/Pages/FormHelper/Nested.svelte b/packages/svelte/test-app/Pages/FormHelper/Nested.svelte index 497305581..2247a870a 100644 --- a/packages/svelte/test-app/Pages/FormHelper/Nested.svelte +++ b/packages/svelte/test-app/Pages/FormHelper/Nested.svelte @@ -18,55 +18,55 @@ }) const submit = () => { - $form.submit('post', '/dump/post') + form.submit('post', '/dump/post') }
Repository Tags - +
diff --git a/packages/svelte/test-app/Pages/FormHelper/RememberEdit.svelte b/packages/svelte/test-app/Pages/FormHelper/RememberEdit.svelte index 5b01cc13e..0f1d66210 100644 --- a/packages/svelte/test-app/Pages/FormHelper/RememberEdit.svelte +++ b/packages/svelte/test-app/Pages/FormHelper/RememberEdit.svelte @@ -7,8 +7,13 @@ email: string } - export let user: User + interface Props { + user: User + } + + let { user }: Props = $props() + // svelte-ignore state_referenced_locally const form = useForm('EditUserForm', { name: user.name, email: user.email, @@ -20,11 +25,11 @@
- +
- +
diff --git a/packages/svelte/test-app/Pages/FormHelper/RememberIndex.svelte b/packages/svelte/test-app/Pages/FormHelper/RememberIndex.svelte index d222c0aae..e2edf7374 100644 --- a/packages/svelte/test-app/Pages/FormHelper/RememberIndex.svelte +++ b/packages/svelte/test-app/Pages/FormHelper/RememberIndex.svelte @@ -7,7 +7,11 @@ email: string } - export let users: User[] + interface Props { + users: User[] + } + + let { users }: Props = $props()
diff --git a/packages/svelte/test-app/Pages/FormHelper/Transform.svelte b/packages/svelte/test-app/Pages/FormHelper/Transform.svelte index ecc9f3bc2..b3c329c79 100644 --- a/packages/svelte/test-app/Pages/FormHelper/Transform.svelte +++ b/packages/svelte/test-app/Pages/FormHelper/Transform.svelte @@ -7,7 +7,7 @@ }) const postForm = () => { - $form + form .transform((data) => ({ ...data, name: 'bar', @@ -16,7 +16,7 @@ } const putForm = () => { - $form + form .transform((data) => ({ ...data, name: 'baz', @@ -25,7 +25,7 @@ } const patchForm = () => { - $form + form .transform((data) => ({ ...data, name: 'foo', @@ -34,7 +34,7 @@ } const deleteForm = () => { - $form + form .transform((data) => ({ ...data, name: 'bar', @@ -46,15 +46,15 @@
- - - - + + + +
diff --git a/packages/svelte/test-app/Pages/FormHelper/TypeScript/Any.svelte b/packages/svelte/test-app/Pages/FormHelper/TypeScript/Any.svelte index e2bea15a6..c13914461 100644 --- a/packages/svelte/test-app/Pages/FormHelper/TypeScript/Any.svelte +++ b/packages/svelte/test-app/Pages/FormHelper/TypeScript/Any.svelte @@ -4,11 +4,11 @@ const form = useForm<{ name: any }>({ name: null }) // eslint-disable-line @typescript-eslint/no-explicit-any - $form.name = 0 - $form.name = 'test' - $form.name = true - $form.name = null - $form.name = { + form.name = 0 + form.name = 'test' + form.name = true + form.name = null + form.name = { key: 'value', } diff --git a/packages/svelte/test-app/Pages/FormHelper/TypeScript/Child.svelte b/packages/svelte/test-app/Pages/FormHelper/TypeScript/Child.svelte index 68b042c46..b8ca05d33 100644 --- a/packages/svelte/test-app/Pages/FormHelper/TypeScript/Child.svelte +++ b/packages/svelte/test-app/Pages/FormHelper/TypeScript/Child.svelte @@ -2,10 +2,14 @@ // This component is used for checking the TypeScript implementation; there is no Playwright test depending on it. import type { InertiaForm } from '@inertiajs/svelte' - export let form: InertiaForm<{ - name: string - email?: string - }> + interface Props { + form: InertiaForm<{ + name: string + email?: string + }> + } + + let { form }: Props = $props()

Name: {form.name}

diff --git a/packages/svelte/test-app/Pages/FormHelper/TypeScript/CircularReferences.svelte b/packages/svelte/test-app/Pages/FormHelper/TypeScript/CircularReferences.svelte index 1af2f0817..c546b8bc1 100644 --- a/packages/svelte/test-app/Pages/FormHelper/TypeScript/CircularReferences.svelte +++ b/packages/svelte/test-app/Pages/FormHelper/TypeScript/CircularReferences.svelte @@ -15,8 +15,8 @@ items: [], }) - $form.items = [] - $form.items = [ + form.items = [] + form.items = [ { foo: 'bar', items: [ @@ -33,11 +33,11 @@ ] // @ts-expect-error - items should be an array of SubData - $form.items = {} + form.items = {} // @ts-expect-error - foo should be a string - $form.items = [{ foo: 123 }] + form.items = [{ foo: 123 }] // @ts-expect-error - items should be an array of SubData - $form.items = [{ foo: 'bar', items: {} }] + form.items = [{ foo: 'bar', items: {} }] // @ts-expect-error - foo should be a string - $form.items = [{ foo: 'bar', items: [{ foo: 123 }] }] + form.items = [{ foo: 'bar', items: [{ foo: 123 }] }] diff --git a/packages/svelte/test-app/Pages/FormHelper/TypeScript/Data.svelte b/packages/svelte/test-app/Pages/FormHelper/TypeScript/Data.svelte index 7a2393ad4..685ae22eb 100644 --- a/packages/svelte/test-app/Pages/FormHelper/TypeScript/Data.svelte +++ b/packages/svelte/test-app/Pages/FormHelper/TypeScript/Data.svelte @@ -15,15 +15,15 @@ } const form = useForm(defaultData) - $form.name = 'John Doe' - $form.company.name = 'Acme Corp' - $form.users = [{ name: 'Jane Doe' }] + form.name = 'John Doe' + form.company.name = 'Acme Corp' + form.users = [{ name: 'Jane Doe' }] // @ts-expect-error - A form has no email field - $form.email = 'john@example.com' + form.email = 'john@example.com' // @ts-expect-error - A company has no street field - $form.company.street = '123 Main St' + form.company.street = '123 Main St' // @ts-expect-error - A company has no street field - $form.company = { name: 'Acme Corp', street: '123 Main St' } + form.company = { name: 'Acme Corp', street: '123 Main St' } // @ts-expect-error - A form has no email field - $form.users = [{ name: 'Jane Doe', email: 'jane@example.com' }] + form.users = [{ name: 'Jane Doe', email: 'jane@example.com' }] diff --git a/packages/svelte/test-app/Pages/FormHelper/TypeScript/DynamicInputName.svelte b/packages/svelte/test-app/Pages/FormHelper/TypeScript/DynamicInputName.svelte index a1aaf3561..3b136af7e 100644 --- a/packages/svelte/test-app/Pages/FormHelper/TypeScript/DynamicInputName.svelte +++ b/packages/svelte/test-app/Pages/FormHelper/TypeScript/DynamicInputName.svelte @@ -14,8 +14,8 @@ const handleChange = (e: Event) => { const target = e.target as HTMLInputElement const { name, value } = target - $form[name] = value + form[name] = value } - + diff --git a/packages/svelte/test-app/Pages/FormHelper/TypeScript/Errors.svelte b/packages/svelte/test-app/Pages/FormHelper/TypeScript/Errors.svelte index 96a1bf48e..9ec9181a7 100644 --- a/packages/svelte/test-app/Pages/FormHelper/TypeScript/Errors.svelte +++ b/packages/svelte/test-app/Pages/FormHelper/TypeScript/Errors.svelte @@ -21,36 +21,36 @@ console.log(form.errors['company.name']) // Clear Errors - $form.clearErrors('name') - $form.clearErrors('company') - $form.clearErrors('company.name') - $form.clearErrors('users') - $form.clearErrors('users.0') - $form.clearErrors('users.0.name') + form.clearErrors('name') + form.clearErrors('company') + form.clearErrors('company.name') + form.clearErrors('users') + form.clearErrors('users.0') + form.clearErrors('users.0.name') // Reset and Clear Errors - $form.resetAndClearErrors('name') - $form.resetAndClearErrors('company') - $form.resetAndClearErrors('company.name') - $form.resetAndClearErrors('users') - $form.resetAndClearErrors('users.0') - $form.resetAndClearErrors('users.0.name') + form.resetAndClearErrors('name') + form.resetAndClearErrors('company') + form.resetAndClearErrors('company.name') + form.resetAndClearErrors('users') + form.resetAndClearErrors('users.0') + form.resetAndClearErrors('users.0.name') // Set error by key - $form.setError('name', 'Validation error') - $form.setError('company', 'Validation error') - $form.setError('company.name', 'Validation error') - $form.setError('users', 'Validation error') - $form.setError('users.0', 'Validation error') - $form.setError('users.0.name', 'Validation error') + form.setError('name', 'Validation error') + form.setError('company', 'Validation error') + form.setError('company.name', 'Validation error') + form.setError('users', 'Validation error') + form.setError('users.0', 'Validation error') + form.setError('users.0.name', 'Validation error') // Set error by object - $form.setError({ name: 'Validation error' }) - $form.setError({ company: 'Validation error' }) - $form.setError({ 'company.name': 'Validation error' }) - $form.setError({ users: 'Validation error' }) - $form.setError({ 'users.0': 'Validation error' }) - $form.setError({ 'users.0.name': 'Validation error' }) + form.setError({ name: 'Validation error' }) + form.setError({ company: 'Validation error' }) + form.setError({ 'company.name': 'Validation error' }) + form.setError({ users: 'Validation error' }) + form.setError({ 'users.0': 'Validation error' }) + form.setError({ 'users.0.name': 'Validation error' }) // @ts-expect-error - Form has no email field console.log(form.errors.email) @@ -58,29 +58,29 @@ console.log(form.errors['company.email']) // @ts-expect-error - Form has no email field - $form.clearErrors('email') + form.clearErrors('email') // @ts-expect-error - Form has no email field - $form.resetAndClearErrors('email') + form.resetAndClearErrors('email') // @ts-expect-error - Form has no email field - $form.setError('email', 'Validation error') + form.setError('email', 'Validation error') // @ts-expect-error - Form has no email field - $form.setError({ email: 'Validation error' }) + form.setError({ email: 'Validation error' }) // @ts-expect-error - Company has no email field - $form.clearErrors('company.email') + form.clearErrors('company.email') // @ts-expect-error - Company has no email field - $form.resetAndClearErrors('company.email') + form.resetAndClearErrors('company.email') // @ts-expect-error - Company has no email field - $form.setError('company.email', 'Validation error') + form.setError('company.email', 'Validation error') // @ts-expect-error - Company has no email field - $form.setError({ 'company.email': 'Validation error' }) + form.setError({ 'company.email': 'Validation error' }) // @ts-expect-error - A user has no email field - $form.clearErrors('users.0.email') + form.clearErrors('users.0.email') // @ts-expect-error - A user has no email field - $form.resetAndClearErrors('users.0.email') + form.resetAndClearErrors('users.0.email') // @ts-expect-error - A user has no email field - $form.setError('users.0.email', 'Validation error') + form.setError('users.0.email', 'Validation error') // @ts-expect-error - A user has no email field - $form.setError({ 'users.0.email': 'Validation error' }) + form.setError({ 'users.0.email': 'Validation error' }) diff --git a/packages/svelte/test-app/Pages/FormHelper/TypeScript/Generic.svelte b/packages/svelte/test-app/Pages/FormHelper/TypeScript/Generic.svelte index 073f82d40..0d67d4150 100644 --- a/packages/svelte/test-app/Pages/FormHelper/TypeScript/Generic.svelte +++ b/packages/svelte/test-app/Pages/FormHelper/TypeScript/Generic.svelte @@ -3,7 +3,11 @@ import type { FormDataConvertible } from '@inertiajs/core' import type { InertiaForm } from '@inertiajs/svelte' - export let form: InertiaForm + interface Props { + form: InertiaForm + } + + let { form }: Props = $props()
{form}
diff --git a/packages/svelte/test-app/Pages/FormHelper/TypeScript/NullableNestedObject.svelte b/packages/svelte/test-app/Pages/FormHelper/TypeScript/NullableNestedObject.svelte index 9db7538be..ce638d273 100644 --- a/packages/svelte/test-app/Pages/FormHelper/TypeScript/NullableNestedObject.svelte +++ b/packages/svelte/test-app/Pages/FormHelper/TypeScript/NullableNestedObject.svelte @@ -12,5 +12,5 @@ foo: null, }) - console.log($form.errors['foo.bar']) + console.log(form.errors['foo.bar']) diff --git a/packages/svelte/test-app/Pages/FormHelper/TypeScript/OptionalProps.svelte b/packages/svelte/test-app/Pages/FormHelper/TypeScript/OptionalProps.svelte index 7e3c7da1a..685ac7cc6 100644 --- a/packages/svelte/test-app/Pages/FormHelper/TypeScript/OptionalProps.svelte +++ b/packages/svelte/test-app/Pages/FormHelper/TypeScript/OptionalProps.svelte @@ -8,10 +8,15 @@ remember: boolean } - export let user: { - username?: string | null - } | null = null + interface Props { + user?: { + username?: string | null + } | null + } + + let { user = null }: Props = $props() + // svelte-ignore state_referenced_locally useForm({ username: user?.username ?? '', password: '', diff --git a/packages/svelte/test-app/Pages/FormHelper/TypeScript/Parent.svelte b/packages/svelte/test-app/Pages/FormHelper/TypeScript/Parent.svelte index 5aa0422d4..4258fe756 100644 --- a/packages/svelte/test-app/Pages/FormHelper/TypeScript/Parent.svelte +++ b/packages/svelte/test-app/Pages/FormHelper/TypeScript/Parent.svelte @@ -9,4 +9,4 @@ }) - + diff --git a/packages/svelte/test-app/Pages/FormHelper/TypeScript/ValidationKey.svelte b/packages/svelte/test-app/Pages/FormHelper/TypeScript/ValidationKey.svelte index 547e0f66d..54e675e92 100644 --- a/packages/svelte/test-app/Pages/FormHelper/TypeScript/ValidationKey.svelte +++ b/packages/svelte/test-app/Pages/FormHelper/TypeScript/ValidationKey.svelte @@ -20,4 +20,4 @@ } - + diff --git a/packages/svelte/test-app/Pages/History/Page.svelte b/packages/svelte/test-app/Pages/History/Page.svelte index 7145e026f..56071e413 100644 --- a/packages/svelte/test-app/Pages/History/Page.svelte +++ b/packages/svelte/test-app/Pages/History/Page.svelte @@ -1,8 +1,7 @@ Page 1 @@ -11,7 +10,7 @@ Page 4 Page 5 - +
This is page {pageNumber}.
Multi byte character: {multiByte}
diff --git a/packages/svelte/test-app/Pages/Home.svelte b/packages/svelte/test-app/Pages/Home.svelte index a39e8a53d..73459ffac 100644 --- a/packages/svelte/test-app/Pages/Home.svelte +++ b/packages/svelte/test-app/Pages/Home.svelte @@ -20,7 +20,7 @@ onMount(() => { window._inertia_page_key = crypto.randomUUID() - window._inertia_props = $page.props + window._inertia_props = page.props window._plugin_global_props = {} }) @@ -31,14 +31,14 @@ Basic Links 'Replace' Links - Manual basic visits - Manual 'Replace' visits + Manual basic visits + Manual 'Replace' visits - Manual Redirect visit + Manual Redirect visit - Manual External Redirect visit + Manual External Redirect visit
diff --git a/packages/svelte/test-app/Pages/InfiniteScroll/CustomElement.svelte b/packages/svelte/test-app/Pages/InfiniteScroll/CustomElement.svelte index 44a3ed48d..5a8848cb6 100644 --- a/packages/svelte/test-app/Pages/InfiniteScroll/CustomElement.svelte +++ b/packages/svelte/test-app/Pages/InfiniteScroll/CustomElement.svelte @@ -2,11 +2,17 @@ import { InfiniteScroll } from '@inertiajs/svelte' import UserCard, { type User } from './UserCard.svelte' - export let users: { data: User[] } + interface Props { + users: { data: User[] } + } + + let { users }: Props = $props() -
Loading...
+ {#snippet loading()} +
Loading...
+ {/snippet} {#each users.data as user (user.id)} diff --git a/packages/svelte/test-app/Pages/InfiniteScroll/CustomTriggersRef.svelte b/packages/svelte/test-app/Pages/InfiniteScroll/CustomTriggersRef.svelte index adcabf873..99a7207d1 100644 --- a/packages/svelte/test-app/Pages/InfiniteScroll/CustomTriggersRef.svelte +++ b/packages/svelte/test-app/Pages/InfiniteScroll/CustomTriggersRef.svelte @@ -2,11 +2,15 @@ import { InfiniteScroll } from '@inertiajs/svelte' import { type User } from './UserCard.svelte' - export let users: { data: User[] } + interface Props { + users: { data: User[] } + } - let tableHeader: HTMLTableSectionElement - let tableFooter: HTMLTableSectionElement - let tableBody: HTMLTableSectionElement + let { users }: Props = $props() + + let tableHeader: HTMLTableSectionElement = $state(null!) + let tableFooter: HTMLTableSectionElement = $state(null!) + let tableBody: HTMLTableSectionElement = $state(null!)
@@ -17,42 +21,47 @@ startElement={() => tableHeader} endElement={() => tableFooter} itemsElement={() => tableBody} - let:loading > -
Spacer
- - - - - - - - - - - {#each users.data as user (user.id)} - - - + {#snippet children({ loading })} +
+ Spacer +
+ +
IDName
{user.id}{user.name}
+ + + + - {/each} + - {#if loading} + + {#each users.data as user (user.id)} + + + + + {/each} + + {#if loading} + + + + {/if} + + + - + - {/if} - - - - - - - -
IDName
{user.id}{user.name}
Loading...
Loading... + Table Footer - Triggers when this comes into view +
- Table Footer - Triggers when this comes into view -
- -
Spacer
+ + + +
+ Spacer +
+ {/snippet}
diff --git a/packages/svelte/test-app/Pages/InfiniteScroll/CustomTriggersRefObject.svelte b/packages/svelte/test-app/Pages/InfiniteScroll/CustomTriggersRefObject.svelte index 2aa64ed8a..d395a75cb 100644 --- a/packages/svelte/test-app/Pages/InfiniteScroll/CustomTriggersRefObject.svelte +++ b/packages/svelte/test-app/Pages/InfiniteScroll/CustomTriggersRefObject.svelte @@ -2,11 +2,15 @@ import { InfiniteScroll } from '@inertiajs/svelte' import { type User } from './UserCard.svelte' - export let users: { data: User[] } + interface Props { + users: { data: User[] } + } - let tableHeader: HTMLTableSectionElement - let tableFooter: HTMLTableSectionElement - let tableBody: HTMLTableSectionElement + let { users }: Props = $props() + + let tableHeader: HTMLTableSectionElement = $state(null!) + let tableFooter: HTMLTableSectionElement = $state(null!) + let tableBody: HTMLTableSectionElement = $state(null!)
@@ -17,42 +21,47 @@ startElement={() => tableHeader} endElement={() => tableFooter} itemsElement={() => tableBody} - let:loading > -
Spacer
- - - - - - - - - - - {#each users.data as user (user.id)} - - - + {#snippet children({ loading })} +
+ Spacer +
+ +
IDName
{user.id}{user.name}
+ + + + - {/each} + - {#if loading} + + {#each users.data as user (user.id)} + + + + + {/each} + + {#if loading} + + + + {/if} + + + - + - {/if} - - - - - - - -
IDName
{user.id}{user.name}
Loading...
Loading... + Table Footer - Triggers when this comes into view +
- Table Footer - Triggers when this comes into view -
- -
Spacer
+ + + +
+ Spacer +
+ {/snippet}
diff --git a/packages/svelte/test-app/Pages/InfiniteScroll/CustomTriggersSelector.svelte b/packages/svelte/test-app/Pages/InfiniteScroll/CustomTriggersSelector.svelte index 8d14b562b..a9533ac74 100644 --- a/packages/svelte/test-app/Pages/InfiniteScroll/CustomTriggersSelector.svelte +++ b/packages/svelte/test-app/Pages/InfiniteScroll/CustomTriggersSelector.svelte @@ -2,53 +2,57 @@ import { InfiniteScroll } from '@inertiajs/svelte' import { type User } from './UserCard.svelte' - export let users: { data: User[] } + interface Props { + users: { data: User[] } + } + + let { users }: Props = $props()

Custom Triggers with Selectors Test

- -
Spacer
- - - - - - - - - - - {#each users.data as user (user.id)} - - - - - {/each} + + {#snippet children({ loading })} +
+ Spacer +
- {#if loading} +
IDName
{user.id}{user.name}
+ - + + - {/if} - - - - - - - -
Loading... IDName
- Table Footer - Triggers when this comes into view -
- -
Spacer
+ + + + {#each users.data as user (user.id)} + + {user.id} + {user.name} + + {/each} + + {#if loading} + + Loading... + + {/if} + + + + + + Table Footer - Triggers when this comes into view + + + + + +
+ Spacer +
+ {/snippet}
diff --git a/packages/svelte/test-app/Pages/InfiniteScroll/DataTable.svelte b/packages/svelte/test-app/Pages/InfiniteScroll/DataTable.svelte index b9b3da679..d7dc4276b 100644 --- a/packages/svelte/test-app/Pages/InfiniteScroll/DataTable.svelte +++ b/packages/svelte/test-app/Pages/InfiniteScroll/DataTable.svelte @@ -2,33 +2,39 @@ import { InfiniteScroll } from '@inertiajs/svelte' import { type User } from './UserCard.svelte' - export let users: { data: User[] } - - - - - - - - - - + interface Props { + users: { data: User[] } + } - - {#each users.data as user (user.id)} - - - - - {/each} - + let { users }: Props = $props() + - - {#if loading} + + {#snippet children({ loading })} +
IDName
{user.id}{user.name}
+ - + + - {/if} - -
Loading... IDName
+ + + + {#each users.data as user (user.id)} + + {user.id} + {user.name} + + {/each} + + + + {#if loading} + + Loading... + + {/if} + + + {/snippet}
diff --git a/packages/svelte/test-app/Pages/InfiniteScroll/DualContainers.svelte b/packages/svelte/test-app/Pages/InfiniteScroll/DualContainers.svelte index d5540e821..52770769c 100644 --- a/packages/svelte/test-app/Pages/InfiniteScroll/DualContainers.svelte +++ b/packages/svelte/test-app/Pages/InfiniteScroll/DualContainers.svelte @@ -2,8 +2,12 @@ import { InfiniteScroll } from '@inertiajs/svelte' import UserCard, { type User } from './UserCard.svelte' - export let users1: { data: User[] } - export let users2: { data: User[] } + interface Props { + users1: { data: User[] } + users2: { data: User[] } + } + + let { users1, users2 }: Props = $props()
@@ -16,7 +20,9 @@ style="height: 400px; width: 100%; border: 2px solid #3b82f6; overflow-y: auto; background: #f0f9ff; padding: 10px" > -
Loading more users1...
+ {#snippet loading()} +
Loading more users1...
+ {/snippet} {#each users1.data as user (user.id)} @@ -33,7 +39,9 @@ style="height: 400px; width: 100%; border: 2px solid #ef4444; overflow-y: auto; background: #fef2f2; padding: 10px" > -
Loading more users2...
+ {#snippet loading()} +
Loading more users2...
+ {/snippet} {#each users2.data as user (user.id)} diff --git a/packages/svelte/test-app/Pages/InfiniteScroll/DualSibling.svelte b/packages/svelte/test-app/Pages/InfiniteScroll/DualSibling.svelte index 2efb0af53..952d68401 100644 --- a/packages/svelte/test-app/Pages/InfiniteScroll/DualSibling.svelte +++ b/packages/svelte/test-app/Pages/InfiniteScroll/DualSibling.svelte @@ -2,8 +2,12 @@ import { InfiniteScroll } from '@inertiajs/svelte' import UserCard, { type User } from './UserCard.svelte' - export let users1: { data: User[] } - export let users2: { data: User[] } + interface Props { + users1: { data: User[] } + users2: { data: User[] } + } + + let { users1, users2 }: Props = $props()
@@ -18,11 +22,13 @@ {/each} -
- -
+ {#snippet next({ exposedNext })} +
+ +
+ {/snippet}
@@ -33,11 +39,13 @@ {/each} -
- -
+ {#snippet next({ exposedNext })} +
+ +
+ {/snippet}
diff --git a/packages/svelte/test-app/Pages/InfiniteScroll/Empty.svelte b/packages/svelte/test-app/Pages/InfiniteScroll/Empty.svelte index 0a1082f95..64ddfd60e 100644 --- a/packages/svelte/test-app/Pages/InfiniteScroll/Empty.svelte +++ b/packages/svelte/test-app/Pages/InfiniteScroll/Empty.svelte @@ -2,13 +2,19 @@ import { InfiniteScroll } from '@inertiajs/svelte' import UserCard, { type User } from './UserCard.svelte' - export let users: { data: User[] } + interface Props { + users: { data: User[] } + } + + let { users }: Props = $props()

Empty Dataset Test

-
Loading...
+ {#snippet loading()} +
Loading...
+ {/snippet} {#each users.data as user (user.id)} diff --git a/packages/svelte/test-app/Pages/InfiniteScroll/Filtering.svelte b/packages/svelte/test-app/Pages/InfiniteScroll/Filtering.svelte index 92807b596..1ac6d51ff 100644 --- a/packages/svelte/test-app/Pages/InfiniteScroll/Filtering.svelte +++ b/packages/svelte/test-app/Pages/InfiniteScroll/Filtering.svelte @@ -1,21 +1,27 @@
@@ -56,11 +66,13 @@ N-Z
Current filter: {filter || 'none'}
Current search: {search || 'none'}
- +
-
Loading...
+ {#snippet loading()} +
Loading...
+ {/snippet} {#each users.data as user (user.id)} @@ -73,6 +85,6 @@ N-Z
Current filter: {filter || 'none'}
Current search: {search || 'none'}
- +
diff --git a/packages/svelte/test-app/Pages/InfiniteScroll/Grid.svelte b/packages/svelte/test-app/Pages/InfiniteScroll/Grid.svelte index fa174c0c1..2336483f8 100644 --- a/packages/svelte/test-app/Pages/InfiniteScroll/Grid.svelte +++ b/packages/svelte/test-app/Pages/InfiniteScroll/Grid.svelte @@ -2,15 +2,23 @@ import { InfiniteScroll } from '@inertiajs/svelte' import UserCard, { type User } from './UserCard.svelte' - export let users: { data: User[] } + interface Props { + users: { data: User[] } + } + + let { users }: Props = $props() -
Loading more users...
+ {#snippet loading()} +
Loading more users...
+ {/snippet} - + + {#snippet children()} {#each users.data as user (user.id)} {/each} - + {/snippet} +
diff --git a/packages/svelte/test-app/Pages/InfiniteScroll/HorizontalScroll.svelte b/packages/svelte/test-app/Pages/InfiniteScroll/HorizontalScroll.svelte index 987303228..5fa47c541 100644 --- a/packages/svelte/test-app/Pages/InfiniteScroll/HorizontalScroll.svelte +++ b/packages/svelte/test-app/Pages/InfiniteScroll/HorizontalScroll.svelte @@ -2,17 +2,22 @@ import { InfiniteScroll } from '@inertiajs/svelte' import { type User } from './UserCard.svelte' - export let users: { data: User[] } + interface Props { + users: { data: User[] } + } + + let { users }: Props = $props()
-
- Loading... -
+ {#snippet loading()} +
+ Loading... +
+ {/snippet} {#each users.data as user (user.id)}
Go back to Links -
Loading...
+ {#snippet loading()} +
Loading...
+ {/snippet} {#each users.data as user (user.id)} diff --git a/packages/svelte/test-app/Pages/InfiniteScroll/InvisibleFirstChild.svelte b/packages/svelte/test-app/Pages/InfiniteScroll/InvisibleFirstChild.svelte index 8bf6f6586..13e201613 100644 --- a/packages/svelte/test-app/Pages/InfiniteScroll/InvisibleFirstChild.svelte +++ b/packages/svelte/test-app/Pages/InfiniteScroll/InvisibleFirstChild.svelte @@ -2,14 +2,20 @@ import { InfiniteScroll } from '@inertiajs/svelte' import UserCard, { type User } from './UserCard.svelte' - export let users: { data: User[] } + interface Props { + users: { data: User[] } + } + + let { users }: Props = $props()

Infinite Scroll with Invisible First Child

-
Loading...
+ {#snippet loading()} +
Loading...
+ {/snippet}
Hidden first element
diff --git a/packages/svelte/test-app/Pages/InfiniteScroll/Manual.svelte b/packages/svelte/test-app/Pages/InfiniteScroll/Manual.svelte index 245799d79..912f821ff 100644 --- a/packages/svelte/test-app/Pages/InfiniteScroll/Manual.svelte +++ b/packages/svelte/test-app/Pages/InfiniteScroll/Manual.svelte @@ -2,25 +2,33 @@ import { InfiniteScroll } from '@inertiajs/svelte' import UserCard, { type User } from './UserCard.svelte' - export let users: { data: User[] } + interface Props { + users: { data: User[] } + } + + let { users }: Props = $props() -
-

Has more previous items: {hasMore}

- -
+ {#snippet previous({ hasMore, loading, fetch })} +
+

Has more previous items: {hasMore}

+ +
+ {/snippet} {#each users.data as user (user.id)} {/each} -
-

Has more next items: {hasMore}

- -
+ {#snippet next({ hasMore, loading, fetch })} +
+

Has more next items: {hasMore}

+ +
+ {/snippet}
diff --git a/packages/svelte/test-app/Pages/InfiniteScroll/ManualAfter.svelte b/packages/svelte/test-app/Pages/InfiniteScroll/ManualAfter.svelte index e6d3ff030..82c3dce3f 100644 --- a/packages/svelte/test-app/Pages/InfiniteScroll/ManualAfter.svelte +++ b/packages/svelte/test-app/Pages/InfiniteScroll/ManualAfter.svelte @@ -2,7 +2,11 @@ import { InfiniteScroll } from '@inertiajs/svelte' import UserCard, { type User } from './UserCard.svelte' - export let users: { data: User[] } + interface Props { + users: { data: User[] } + } + + let { users }: Props = $props() @@ -10,15 +14,17 @@ {/each} -
- {#if loading} -

Loading...

- {/if} + {#snippet next({ loading, manualMode, fetch })} +
+ {#if loading} +

Loading...

+ {/if} -

Manual mode: {manualMode}

+

Manual mode: {manualMode}

- {#if manualMode} - - {/if} -
+ {#if manualMode} + + {/if} +
+ {/snippet}
diff --git a/packages/svelte/test-app/Pages/InfiniteScroll/OverflowX.svelte b/packages/svelte/test-app/Pages/InfiniteScroll/OverflowX.svelte index 588b27b17..c95551b70 100644 --- a/packages/svelte/test-app/Pages/InfiniteScroll/OverflowX.svelte +++ b/packages/svelte/test-app/Pages/InfiniteScroll/OverflowX.svelte @@ -2,7 +2,11 @@ import { InfiniteScroll } from '@inertiajs/svelte' import type { User } from './UserCard.svelte' - export let users: { data: User[] } + interface Props { + users: { data: User[] } + } + + let { users }: Props = $props()
diff --git a/packages/svelte/test-app/Pages/InfiniteScroll/PreserveUrl.svelte b/packages/svelte/test-app/Pages/InfiniteScroll/PreserveUrl.svelte index f1a52e8be..01aad4d9f 100644 --- a/packages/svelte/test-app/Pages/InfiniteScroll/PreserveUrl.svelte +++ b/packages/svelte/test-app/Pages/InfiniteScroll/PreserveUrl.svelte @@ -2,11 +2,17 @@ import { InfiniteScroll } from '@inertiajs/svelte' import UserCard, { type User } from './UserCard.svelte' - export let users: { data: User[] } + interface Props { + users: { data: User[] } + } + + let { users }: Props = $props() -
Loading...
+ {#snippet loading()} +
Loading...
+ {/snippet} {#each users.data as user (user.id)} diff --git a/packages/svelte/test-app/Pages/InfiniteScroll/ProgrammaticRef.svelte b/packages/svelte/test-app/Pages/InfiniteScroll/ProgrammaticRef.svelte index 961225877..df605be8a 100644 --- a/packages/svelte/test-app/Pages/InfiniteScroll/ProgrammaticRef.svelte +++ b/packages/svelte/test-app/Pages/InfiniteScroll/ProgrammaticRef.svelte @@ -3,12 +3,16 @@ import { onMount } from 'svelte' import UserCard, { type User } from './UserCard.svelte' import type { InfiniteScrollRef } from '@inertiajs/core' - export let users: { data: User[] } + interface Props { + users: { data: User[] } + } + + let { users }: Props = $props() // Use the actual component type like Form component does - let infRef: InfiniteScrollRef | null = null - let hasPrevious = false - let hasNext = false + let infRef: InfiniteScrollRef | null = $state(null) + let hasPrevious = $state(false) + let hasNext = $state(false) function updateStates() { hasPrevious = infRef?.hasPrevious() || false @@ -34,13 +38,15 @@

Has more next items: {hasNext.toString()}

- - + +
-
Loading...
+ {#snippet loading()} +
Loading...
+ {/snippet} {#each users.data as user (user.id)} diff --git a/packages/svelte/test-app/Pages/InfiniteScroll/ReloadUnrelated.svelte b/packages/svelte/test-app/Pages/InfiniteScroll/ReloadUnrelated.svelte index f35c83bec..ce1eaefc4 100644 --- a/packages/svelte/test-app/Pages/InfiniteScroll/ReloadUnrelated.svelte +++ b/packages/svelte/test-app/Pages/InfiniteScroll/ReloadUnrelated.svelte @@ -2,8 +2,12 @@ import { InfiniteScroll, router } from '@inertiajs/svelte' import UserCard, { type User } from './UserCard.svelte' - export let users: { data: User[] } - export let time: number + interface Props { + users: { data: User[] } + time: number + } + + let { users, time }: Props = $props() const reloadTime = () => { router.reload({ only: ['time'] }) @@ -12,7 +16,7 @@
- + Current time: {time}
diff --git a/packages/svelte/test-app/Pages/InfiniteScroll/RememberState.svelte b/packages/svelte/test-app/Pages/InfiniteScroll/RememberState.svelte index 74bef06ac..8c3db97f0 100644 --- a/packages/svelte/test-app/Pages/InfiniteScroll/RememberState.svelte +++ b/packages/svelte/test-app/Pages/InfiniteScroll/RememberState.svelte @@ -1,8 +1,14 @@ -
Loading...
+ {#snippet loading()} +
Loading...
+ {/snippet} {#each reversedUsers as user (user.id)} diff --git a/packages/svelte/test-app/Pages/InfiniteScroll/ScrollContainer.svelte b/packages/svelte/test-app/Pages/InfiniteScroll/ScrollContainer.svelte index 147e3eb82..70cecef27 100644 --- a/packages/svelte/test-app/Pages/InfiniteScroll/ScrollContainer.svelte +++ b/packages/svelte/test-app/Pages/InfiniteScroll/ScrollContainer.svelte @@ -2,7 +2,11 @@ import { InfiniteScroll } from '@inertiajs/svelte' import UserCard, { type User } from './UserCard.svelte' - export let users: { data: User[] } + interface Props { + users: { data: User[] } + } + + let { users }: Props = $props()
@@ -15,7 +19,9 @@ style="height: 400px; width: 100%; border: 2px solid #ccc; overflow-y: auto; background: #f9f9f9; padding: 10px" > -
Loading more users...
+ {#snippet loading()} +
Loading more users...
+ {/snippet} {#each users.data as user (user.id)} diff --git a/packages/svelte/test-app/Pages/InfiniteScroll/ShortContent.svelte b/packages/svelte/test-app/Pages/InfiniteScroll/ShortContent.svelte index e63975c96..f822dbeb7 100644 --- a/packages/svelte/test-app/Pages/InfiniteScroll/ShortContent.svelte +++ b/packages/svelte/test-app/Pages/InfiniteScroll/ShortContent.svelte @@ -2,7 +2,11 @@ import { InfiniteScroll } from '@inertiajs/svelte' import { type User } from './UserCard.svelte' - export let users: { data: User[] } + interface Props { + users: { data: User[] } + } + + let { users }: Props = $props() diff --git a/packages/svelte/test-app/Pages/InfiniteScroll/Toggles.svelte b/packages/svelte/test-app/Pages/InfiniteScroll/Toggles.svelte index 89152432c..1cd015c42 100644 --- a/packages/svelte/test-app/Pages/InfiniteScroll/Toggles.svelte +++ b/packages/svelte/test-app/Pages/InfiniteScroll/Toggles.svelte @@ -2,11 +2,15 @@ import { InfiniteScroll } from '@inertiajs/svelte' import UserCard, { type User } from './UserCard.svelte' - export let users: { data: User[] } + interface Props { + users: { data: User[] } + } - let manual = false - let preserveUrl = false - let triggerMode: 'onlyPrevious' | 'onlyNext' | 'both' = 'onlyNext' + let { users }: Props = $props() + + let manual = $state(false) + let preserveUrl = $state(false) + let triggerMode: 'onlyPrevious' | 'onlyNext' | 'both' = $state('onlyNext')
@@ -45,7 +49,9 @@ onlyNext={triggerMode === 'onlyNext'} onlyPrevious={triggerMode === 'onlyPrevious'} > -
Loading...
+ {#snippet loading()} +
Loading...
+ {/snippet} {#each users.data as user (user.id)} diff --git a/packages/svelte/test-app/Pages/InfiniteScroll/TriggerBoth.svelte b/packages/svelte/test-app/Pages/InfiniteScroll/TriggerBoth.svelte index 2727b3264..d00267fa1 100644 --- a/packages/svelte/test-app/Pages/InfiniteScroll/TriggerBoth.svelte +++ b/packages/svelte/test-app/Pages/InfiniteScroll/TriggerBoth.svelte @@ -2,11 +2,17 @@ import { InfiniteScroll } from '@inertiajs/svelte' import UserCard, { type User } from './UserCard.svelte' - export let users: { data: User[] } + interface Props { + users: { data: User[] } + } + + let { users }: Props = $props() -
Loading...
+ {#snippet loading()} +
Loading...
+ {/snippet} {#each users.data as user (user.id)} diff --git a/packages/svelte/test-app/Pages/InfiniteScroll/TriggerEndBuffer.svelte b/packages/svelte/test-app/Pages/InfiniteScroll/TriggerEndBuffer.svelte index 39e8bbb79..3e7918aef 100644 --- a/packages/svelte/test-app/Pages/InfiniteScroll/TriggerEndBuffer.svelte +++ b/packages/svelte/test-app/Pages/InfiniteScroll/TriggerEndBuffer.svelte @@ -2,11 +2,17 @@ import { InfiniteScroll } from '@inertiajs/svelte' import UserCard, { type User } from './UserCard.svelte' - export let users: { data: User[] } + interface Props { + users: { data: User[] } + } + + let { users }: Props = $props() -
Loading...
+ {#snippet loading()} +
Loading...
+ {/snippet} {#each users.data as user (user.id)} diff --git a/packages/svelte/test-app/Pages/InfiniteScroll/TriggerStartBuffer.svelte b/packages/svelte/test-app/Pages/InfiniteScroll/TriggerStartBuffer.svelte index d9941d340..6647170fe 100644 --- a/packages/svelte/test-app/Pages/InfiniteScroll/TriggerStartBuffer.svelte +++ b/packages/svelte/test-app/Pages/InfiniteScroll/TriggerStartBuffer.svelte @@ -2,11 +2,17 @@ import { InfiniteScroll } from '@inertiajs/svelte' import UserCard, { type User } from './UserCard.svelte' - export let users: { data: User[] } + interface Props { + users: { data: User[] } + } + + let { users }: Props = $props() -
Loading...
+ {#snippet loading()} +
Loading...
+ {/snippet} {#each users.data as user (user.id)} diff --git a/packages/svelte/test-app/Pages/InfiniteScroll/UpdateQueryString.svelte b/packages/svelte/test-app/Pages/InfiniteScroll/UpdateQueryString.svelte index 2f5eda327..9d915dc63 100644 --- a/packages/svelte/test-app/Pages/InfiniteScroll/UpdateQueryString.svelte +++ b/packages/svelte/test-app/Pages/InfiniteScroll/UpdateQueryString.svelte @@ -2,18 +2,24 @@ import { InfiniteScroll, page } from '@inertiajs/svelte' import UserCard, { type User } from './UserCard.svelte' - export let users: { data: User[] } + interface Props { + users: { data: User[] } + } + + let { users }: Props = $props() window.testing = { ...(window.testing || {}), get pageUrl() { - return $page.url + return page.url }, } -
Loading...
+ {#snippet loading()} +
Loading...
+ {/snippet} {#each users.data as user (user.id)} diff --git a/packages/svelte/test-app/Pages/InfiniteScroll/UserCard.svelte b/packages/svelte/test-app/Pages/InfiniteScroll/UserCard.svelte index 23ecbef9a..004393a74 100644 --- a/packages/svelte/test-app/Pages/InfiniteScroll/UserCard.svelte +++ b/packages/svelte/test-app/Pages/InfiniteScroll/UserCard.svelte @@ -1,4 +1,4 @@ -
import { Link } from '@inertiajs/svelte' - export let method + let { method } = $props()
diff --git a/packages/svelte/test-app/Pages/Links/AsWarningFalse.svelte b/packages/svelte/test-app/Pages/Links/AsWarningFalse.svelte index 0fd8eec12..d1189990e 100644 --- a/packages/svelte/test-app/Pages/Links/AsWarningFalse.svelte +++ b/packages/svelte/test-app/Pages/Links/AsWarningFalse.svelte @@ -1,7 +1,7 @@
diff --git a/packages/svelte/test-app/Pages/Links/AutomaticCancellation.svelte b/packages/svelte/test-app/Pages/Links/AutomaticCancellation.svelte index d8d2e2f45..bbbc36a05 100644 --- a/packages/svelte/test-app/Pages/Links/AutomaticCancellation.svelte +++ b/packages/svelte/test-app/Pages/Links/AutomaticCancellation.svelte @@ -7,8 +7,8 @@ console.log('cancelled')} - on:start={() => console.log('started')} + oncancel={() => console.log('cancelled')} + onstart={() => console.log('started')} class="visit" > Link diff --git a/packages/svelte/test-app/Pages/Links/CancelSyncRequest.svelte b/packages/svelte/test-app/Pages/Links/CancelSyncRequest.svelte index 37059c04c..9101b4ac3 100644 --- a/packages/svelte/test-app/Pages/Links/CancelSyncRequest.svelte +++ b/packages/svelte/test-app/Pages/Links/CancelSyncRequest.svelte @@ -1,7 +1,11 @@

diff --git a/packages/svelte/test-app/Pages/Links/PartialReloads.svelte b/packages/svelte/test-app/Pages/Links/PartialReloads.svelte index 8809ba20b..75c1b9f72 100644 --- a/packages/svelte/test-app/Pages/Links/PartialReloads.svelte +++ b/packages/svelte/test-app/Pages/Links/PartialReloads.svelte @@ -1,10 +1,7 @@
diff --git a/packages/svelte/test-app/Pages/Links/PreserveScroll.svelte b/packages/svelte/test-app/Pages/Links/PreserveScroll.svelte index 6cd928701..e7c74c137 100644 --- a/packages/svelte/test-app/Pages/Links/PreserveScroll.svelte +++ b/packages/svelte/test-app/Pages/Links/PreserveScroll.svelte @@ -1,4 +1,4 @@ - @@ -6,7 +6,11 @@ import { inertia } from '@inertiajs/svelte' import type { Page } from '@inertiajs/core' - export let foo: string = 'default' + interface Props { + foo?: string + } + + let { foo = 'default' }: Props = $props() const preserveCallback = (page: Page) => { console.log(JSON.stringify(page)) diff --git a/packages/svelte/test-app/Pages/Links/PreserveScrollFalse.svelte b/packages/svelte/test-app/Pages/Links/PreserveScrollFalse.svelte index ad7bfc78a..c8d89d156 100644 --- a/packages/svelte/test-app/Pages/Links/PreserveScrollFalse.svelte +++ b/packages/svelte/test-app/Pages/Links/PreserveScrollFalse.svelte @@ -1,4 +1,4 @@ - @@ -6,7 +6,11 @@ import { inertia } from '@inertiajs/svelte' import type { Page } from '@inertiajs/core' - export let foo: string = 'default' + interface Props { + foo?: string + } + + let { foo = 'default' }: Props = $props() const preserveCallback = (page: Page) => { console.log(JSON.stringify(page)) diff --git a/packages/svelte/test-app/Pages/Links/PreserveState.svelte b/packages/svelte/test-app/Pages/Links/PreserveState.svelte index 2906139a7..d7b254de2 100644 --- a/packages/svelte/test-app/Pages/Links/PreserveState.svelte +++ b/packages/svelte/test-app/Pages/Links/PreserveState.svelte @@ -1,4 +1,4 @@ - @@ -7,7 +7,11 @@ import { inertia } from '@inertiajs/svelte' import type { Page } from '@inertiajs/core' - export let foo: string = 'default' + interface Props { + foo?: string + } + + let { foo = 'default' }: Props = $props() const preserveCallback = (page: Page) => { alert(page) diff --git a/packages/svelte/test-app/Pages/Links/PreserveUrl.svelte b/packages/svelte/test-app/Pages/Links/PreserveUrl.svelte index 73d66f8d6..614cd41e8 100644 --- a/packages/svelte/test-app/Pages/Links/PreserveUrl.svelte +++ b/packages/svelte/test-app/Pages/Links/PreserveUrl.svelte @@ -1,13 +1,17 @@
- + The Link
diff --git a/packages/svelte/test-app/Pages/Links/Reactivity.svelte b/packages/svelte/test-app/Pages/Links/Reactivity.svelte index b3b585ee1..38f3d8a78 100644 --- a/packages/svelte/test-app/Pages/Links/Reactivity.svelte +++ b/packages/svelte/test-app/Pages/Links/Reactivity.svelte @@ -2,12 +2,12 @@ import { Link } from '@inertiajs/svelte' import type { CacheForOption, LinkPrefetchOption, Method } from '@inertiajs/core' - let method: Method = 'get' - let href = '/dump/get' - let data = { foo: 'bar' } - let headers = { 'X-Custom-Header': 'value' } - let prefetch: boolean | LinkPrefetchOption = false - let cacheFor: CacheForOption = 0 + let method: Method = $state('get') + let href = $state('/dump/get') + let data = $state({ foo: 'bar' }) + let headers = $state({ 'X-Custom-Header': 'value' }) + let prefetch: boolean | LinkPrefetchOption = $state(false) + let cacheFor: CacheForOption = $state(0) function change() { method = 'post' @@ -29,9 +29,9 @@ Submit - + Prefetch Link - +
diff --git a/packages/svelte/test-app/Pages/Links/ScrollRegionList.svelte b/packages/svelte/test-app/Pages/Links/ScrollRegionList.svelte index 3a2d10da6..489ccc6a2 100644 --- a/packages/svelte/test-app/Pages/Links/ScrollRegionList.svelte +++ b/packages/svelte/test-app/Pages/Links/ScrollRegionList.svelte @@ -1,4 +1,4 @@ - @@ -6,7 +6,11 @@ import { router } from '@inertiajs/svelte' import type { VisitHelperOptions } from '@inertiajs/core' - export let user_id: number | undefined = undefined + interface Props { + user_id?: number | undefined + } + + let { user_id = undefined }: Props = $props() const users = Array.from({ length: 10 }, (_, i) => ({ id: i + 1, name: `User ${i + 1}` })) @@ -22,9 +26,9 @@ {#each users as user (user.id)}
{user.name}
- - - + + +
{/each}

diff --git a/packages/svelte/test-app/Pages/Links/UrlFragments.svelte b/packages/svelte/test-app/Pages/Links/UrlFragments.svelte index d8ed516e9..0b45488ef 100644 --- a/packages/svelte/test-app/Pages/Links/UrlFragments.svelte +++ b/packages/svelte/test-app/Pages/Links/UrlFragments.svelte @@ -1,8 +1,8 @@ - +
This is the links page that demonstrates url fragment behaviour
- +
Document scroll position is {documentScrollLeft} & {documentScrollTop}
Basic link Fragment link diff --git a/packages/svelte/test-app/Pages/MatchPropsOnKey.svelte b/packages/svelte/test-app/Pages/MatchPropsOnKey.svelte index 9b0998943..475380a08 100644 --- a/packages/svelte/test-app/Pages/MatchPropsOnKey.svelte +++ b/packages/svelte/test-app/Pages/MatchPropsOnKey.svelte @@ -14,10 +14,15 @@ baz: number[] } - export let foo: ComponentProps['foo'] - export let bar: ComponentProps['bar'] - export let baz: ComponentProps['baz'] + interface Props { + foo: ComponentProps['foo'] + bar: ComponentProps['bar'] + baz: ComponentProps['baz'] + } + + let { foo, bar, baz }: Props = $props() + // svelte-ignore state_referenced_locally let page = foo.page const reloadIt = () => { @@ -55,5 +60,5 @@
foo.page is {foo.page}
foo.per_page is {foo.per_page}
foo.meta.label is {foo.meta.label}
- - + + diff --git a/packages/svelte/test-app/Pages/MergeNestedProps.svelte b/packages/svelte/test-app/Pages/MergeNestedProps.svelte index 5b15ed6b7..e2c525d53 100644 --- a/packages/svelte/test-app/Pages/MergeNestedProps.svelte +++ b/packages/svelte/test-app/Pages/MergeNestedProps.svelte @@ -1,11 +1,17 @@ diff --git a/packages/svelte/test-app/Pages/PersistentLayouts/RenderFunction/Nested/PageB.svelte b/packages/svelte/test-app/Pages/PersistentLayouts/RenderFunction/Nested/PageB.svelte index bb2cc6463..3fad60ab3 100644 --- a/packages/svelte/test-app/Pages/PersistentLayouts/RenderFunction/Nested/PageB.svelte +++ b/packages/svelte/test-app/Pages/PersistentLayouts/RenderFunction/Nested/PageB.svelte @@ -1,12 +1,9 @@ - diff --git a/packages/svelte/test-app/Pages/PersistentLayouts/RenderFunction/Simple/PageA.svelte b/packages/svelte/test-app/Pages/PersistentLayouts/RenderFunction/Simple/PageA.svelte index 045849e49..1cfc1a1d5 100644 --- a/packages/svelte/test-app/Pages/PersistentLayouts/RenderFunction/Simple/PageA.svelte +++ b/packages/svelte/test-app/Pages/PersistentLayouts/RenderFunction/Simple/PageA.svelte @@ -1,11 +1,9 @@ -
diff --git a/packages/svelte/test-app/Pages/PersistentLayouts/Shorthand/Nested/PageB.svelte b/packages/svelte/test-app/Pages/PersistentLayouts/Shorthand/Nested/PageB.svelte index 655b7035f..99d77a732 100644 --- a/packages/svelte/test-app/Pages/PersistentLayouts/Shorthand/Nested/PageB.svelte +++ b/packages/svelte/test-app/Pages/PersistentLayouts/Shorthand/Nested/PageB.svelte @@ -1,4 +1,4 @@ -
diff --git a/packages/svelte/test-app/Pages/PersistentLayouts/Shorthand/Simple/PageA.svelte b/packages/svelte/test-app/Pages/PersistentLayouts/Shorthand/Simple/PageA.svelte index 6eb6f083b..098352baa 100644 --- a/packages/svelte/test-app/Pages/PersistentLayouts/Shorthand/Simple/PageA.svelte +++ b/packages/svelte/test-app/Pages/PersistentLayouts/Shorthand/Simple/PageA.svelte @@ -1,4 +1,4 @@ -
diff --git a/packages/svelte/test-app/Pages/PersistentLayouts/Shorthand/Simple/PageB.svelte b/packages/svelte/test-app/Pages/PersistentLayouts/Shorthand/Simple/PageB.svelte index cdadd08bd..66341bf8b 100644 --- a/packages/svelte/test-app/Pages/PersistentLayouts/Shorthand/Simple/PageB.svelte +++ b/packages/svelte/test-app/Pages/PersistentLayouts/Shorthand/Simple/PageB.svelte @@ -1,4 +1,4 @@ -
diff --git a/packages/svelte/test-app/Pages/Poll/HookManual.svelte b/packages/svelte/test-app/Pages/Poll/HookManual.svelte index 5c1923d58..7018c7f2f 100644 --- a/packages/svelte/test-app/Pages/Poll/HookManual.svelte +++ b/packages/svelte/test-app/Pages/Poll/HookManual.svelte @@ -15,5 +15,5 @@ ) - - + + diff --git a/packages/svelte/test-app/Pages/Poll/RouterManual.svelte b/packages/svelte/test-app/Pages/Poll/RouterManual.svelte index 0c460e0c0..c0f7fa924 100644 --- a/packages/svelte/test-app/Pages/Poll/RouterManual.svelte +++ b/packages/svelte/test-app/Pages/Poll/RouterManual.svelte @@ -15,5 +15,5 @@ ) - - + + diff --git a/packages/svelte/test-app/Pages/Prefetch/AfterError.svelte b/packages/svelte/test-app/Pages/Prefetch/AfterError.svelte index 7e90b3958..00276f06b 100644 --- a/packages/svelte/test-app/Pages/Prefetch/AfterError.svelte +++ b/packages/svelte/test-app/Pages/Prefetch/AfterError.svelte @@ -11,6 +11,6 @@
- - + +
diff --git a/packages/svelte/test-app/Pages/Prefetch/Form.svelte b/packages/svelte/test-app/Pages/Prefetch/Form.svelte index 9f552dbaf..24e26fdab 100644 --- a/packages/svelte/test-app/Pages/Prefetch/Form.svelte +++ b/packages/svelte/test-app/Pages/Prefetch/Form.svelte @@ -4,19 +4,19 @@ const form = useForm({}) const submitToSame = () => { - $form.post('/prefetch/form') + form.post('/prefetch/form') } const submitToOther = () => { - $form.post('/prefetch/redirect-back') + form.post('/prefetch/redirect-back') }

- Random Value: {$page.props.randomValue} + Random Value: {page.props.randomValue}

- - + + Back to Test Page
diff --git a/packages/svelte/test-app/Pages/Prefetch/Page.svelte b/packages/svelte/test-app/Pages/Prefetch/Page.svelte index 2576f75bb..08a7c4989 100644 --- a/packages/svelte/test-app/Pages/Prefetch/Page.svelte +++ b/packages/svelte/test-app/Pages/Prefetch/Page.svelte @@ -1,10 +1,14 @@ -
This is page {pageNumber}
diff --git a/packages/svelte/test-app/Pages/Prefetch/PreserveState.svelte b/packages/svelte/test-app/Pages/Prefetch/PreserveState.svelte index f5e2c4e8c..59344a21b 100644 --- a/packages/svelte/test-app/Pages/Prefetch/PreserveState.svelte +++ b/packages/svelte/test-app/Pages/Prefetch/PreserveState.svelte @@ -1,8 +1,12 @@
This is page {pageNumber}
diff --git a/packages/svelte/test-app/Pages/Prefetch/Tags.svelte b/packages/svelte/test-app/Pages/Prefetch/Tags.svelte index add6a0f14..9c1ab0ec7 100644 --- a/packages/svelte/test-app/Pages/Prefetch/Tags.svelte +++ b/packages/svelte/test-app/Pages/Prefetch/Tags.svelte @@ -1,8 +1,17 @@ @@ -32,5 +62,5 @@

Effect A Count: {effectACount}

Effect B Count: {effectBCount}

Submit and redirect back - +
diff --git a/packages/svelte/test-app/Pages/ProgressComponent.svelte b/packages/svelte/test-app/Pages/ProgressComponent.svelte index acbb70964..d8d9dbace 100644 --- a/packages/svelte/test-app/Pages/ProgressComponent.svelte +++ b/packages/svelte/test-app/Pages/ProgressComponent.svelte @@ -1,4 +1,4 @@ - -
+
This component uses a string 'key' for the remember functionality.