Skip to content

Latest commit

 

History

History
114 lines (87 loc) · 3.78 KB

File metadata and controls

114 lines (87 loc) · 3.78 KB

@nano_kit/router

ESM-only package NPM version Dependencies status Install size Build status Coverage status

Four-pointed ring system star logo

A small and powerful router for @nano_kit/store state manager.

  • Small. Around 2 kB (minified & brotlied). Zero dependencies except @nano_kit/store.
  • Type-safe. Full TypeScript support with type inference for routes and parameters.
  • Signal-based. Built on top of @nano_kit/store's reactive signals for automatic UI updates.
  • Flexible. Supports nested layouts, parameterized routes, optional parameters, wildcards, and query parameters.
  • SSR-ready. Works seamlessly with server-side rendering.

Installation

pnpm add @nano_kit/store @nano_kit/router
# or
npm install @nano_kit/store @nano_kit/router
# or
yarn add @nano_kit/store @nano_kit/router

Quick Start

Here is a minimal example demonstrating navigation, routing, and reactive page rendering:

import { effect } from '@nano_kit/store'
import { browserNavigation, router, page, layout, notFound } from '@nano_kit/router'

/* Define your routes */
const routes = {
  home: '/',
  user: '/users/:id',
  userPosts: '/users/:id/posts',
  admin: '/admin/*'
}

/* Setup navigation with browser history */
const [$location, navigation] = browserNavigation(routes)

/* Define page components */
const HomePage = () => 'Welcome Home!'
const UserPage = () => `User ID: ${$location().params.id}`
const UserPostsPage = () => `Posts for User: ${$location().params.id}`
const AdminLayout = ($page) => `Admin Layout: ${$page()}`
const AdminPage = () => `Admin Page: ${$location().params.splat || 'dashboard'}`
const NotFoundPage = () => 'Page Not Found'

/* Create router with pages and layouts */
const $page = router($location, [
  page('home', HomePage),
  page('user', UserPage),
  page('posts', UserPostsPage),
  layout(AdminLayout, [
    page('admin', AdminPage)
  ]),
  notFound(NotFoundPage)
], composeLayoutFunction)

/* React to route changes (mounting $page triggers router) */
const unsub = effect(() => {
  const PageComponent = $page().default

  console.log('Current page:', PageComponent())
  // Render PageComponent in your app
})
// Output: Current page: Welcome Home!

/* Navigate programmatically */
navigation.push('/users/123')
// Output: Current page: User ID: 123

navigation.push('/admin/settings/profile')
// Output: Current page: Admin Layout: Admin Page: settings/profile

navigation.back()
// Output: Current page: User ID: 123

/* Cleanup */
unsub()

Documentation

For comprehensive guides, advanced patterns, and API reference, visit the documentation website.