Skip to content

Svelte Integration

routeit already matches Svelte's readable-store contract because router.subscribe() returns an unsubscribe function and pushes state updates.

That means you can use $router directly with no extra state helper.

ts
// router.ts
import { createRouter } from '@vielzeug/routeit';

export const router = createRouter({
  routes: {
    home: { component: HomePage, path: '/' },
    settings: { component: SettingsPage, path: '/settings' },
    notFound: { component: NotFoundPage, path: '*' },
  },
});
svelte
<!-- RouterView.svelte -->
<script lang="ts">
  import { router } from './router';

  $: component = $router.matches.at(-1)?.component;
</script>

{#if component}
  <svelte:component this={component} />
{/if}
svelte
<!-- RouterLink.svelte -->
<script lang="ts">
  import { router } from './router';

  export let name: 'home' | 'settings' | 'notFound';

  $: void $router;
  $: href = router.url(name);
  $: active = router.isActive(name);

  function go(event: MouseEvent) {
    event.preventDefault();
    void router.navigate({ name });
  }
</script>

<a aria-current={active ? 'page' : undefined} href={href} on:click={go}>
  <slot />
</a>

For Svelte apps, this is already router-like out of the box: links, active state, and route-driven component rendering without additional glue.