We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
There was an error while loading. Please reload this page.
docs: update Navigation-Plugin for #524 (forceDeactivate default, RouterError sync) Aligns wiki with plugin changes introduced in #524: - Configuration Options table: `forceDeactivate` default flipped from `true` to `false`. Added migration note for apps that relied on the old bypass. Configuration example updated to reflect the new contract. - "CANNOT_DEACTIVATE auto-rollback" edge-case rewritten as "CANNOT_DEACTIVATE / RouterError URL sync" — explains the new syncUrlToRouterState path: on any RouterError the plugin calls browser.navigate(url, {history:"replace"}) to the current router state, keeping URL and state consistent in a single visible transition. Explains why manual sync is used instead of Navigation API's native rollback on intercept rejection (headless/cross-origin reliability). - "Error recovery" entry updated to reflect the shared syncUrlToRouterState helper now used by both paths (RouterError and non-RouterError). From navigation-plugin review (.claude/review-2026-04-23.md, HIGH #1 + #2).
docs: add Desktop Integration guide (#496) - Desktop-Integration.md: plugin × runtime compatibility matrix (10 OS rows × 4 plugins), Electron custom protocol (app://) and file:// + hash fallback setup, Tauri v2 setup with Navigation API caveat and WebKit OS matrix, plugin selection decision tree, three troubleshooting scenarios, links to 5 runnable examples. - _Sidebar.md: +1 link in integration guides group (Ink + Desktop are both non-browser runtime guides). - Navigation-Plugin.md: new Desktop compatibility section explaining the WebView OS matrix + fail-fast factory behavior on unsupported WebKit.
docs: scroll restoration wiki + React-Integration guide (#497) - New page: Scroll-Restoration — behavior matrix, per-framework opt-in snippets, virtual-scroll recipe, "why not a plugin" rationale. - New page: React-Integration — covers three entry points (main/legacy/ink), <Activity> keepAlive, native useSyncExternalStore, memo'd <Link>. Fills the long-standing gap (Sidebar linked to a missing page). - RouterProvider: props table extended with scrollRestoration, per-framework snippets. - 5 Integration guides (Preact/Solid/Svelte/Vue/Angular) + Ink: scrollRestoration section with framework-specific reactivity notes (Solid non-reactive onMount, Svelte $derived+untrack, Vue reactive watch, Angular bootstrap snapshot). - Home: link under Concepts. - Accessibility: new "Relationship to Scroll Restoration" section — ortho interaction. - recipes: existing home-grown scroll-restore recipe marked as reference; points to the builtin utility. - _Sidebar: Scroll Restoration entry under DOM Utilities.
docs: document search-schema-plugin queryParams coercion alignment Add a schema <-> queryParams coercion table: z.boolean() vs booleanFormat, z.number() vs numberFormat, z.array(...) vs arrayFormat. Flag the common gotcha (z.boolean() + booleanFormat:"none" silently failing), recommend z.coerce.* fallback, and point to the params contract in the core README.
docs: document memory-plugin hardening Tighten maxHistoryLength validation (rejects NaN, +/-Infinity, fractional, negative). Document optimistic index updates with revert on guard rejection and goGeneration counter protecting against superseded reverts. Note idempotent teardown and silent no-op for invalid go() deltas.
docs: document plugin DI factory hooks (lifecycle onNavigate, ssr-data loaders) Lifecycle plugin: add onNavigate (fires on every successful navigation to the route -- entry AND param-change), switch hook fields to LifecycleHookFactory (router, getDependency) => hook, document orthogonal dispatch between onEnter/onStay/onNavigate, and add a "recommended default" section. ssr-data-plugin: switch to DataLoaderFactoryMap -- each loader is now a factory (router, getDependency) => (params) => Promise<unknown>. Document plugin-registration-time validation.
docs: document params undefined-strip contract in navigate/buildPath/State/forwardState Document that undefined values in params are stripped at the core boundary (including after forwardState interceptors) while null, "", 0, and false remain distinct defined values. Mark State.transition as required (no longer optional), reorder TransitionMeta fields, and add an onNavigate-style route-entry vs param-change comparison using transition.from.
docs: document @real-router/sources caching and shared error boundary Rewrite sources-package.md and sources-adapter-guide.md around cached vs non-cached factories. Document new shared sources (getTransitionSource, getErrorSource, createDismissableError, createActiveNameSelector), the canonicalJson-based param cache key, and no-op destroy() semantics for cached wrappers. Remove useStableValue references from BaseLink / Solid / Svelte / Vue integration guides -- params stabilization lives in sources now. Note RouterErrorBoundary is unified across all adapters via createDismissableError. Add Solid use:link accessor gotcha, useRouteStore / useRouteNodeStore, routeSelector in RouterContext, and await router.start() fix.
docs: document Angular adapter across the wiki (6-adapter parity) Add Angular integration sections to framework-agnostic pages: imports, hook variants (injectRouter, injectNavigator, injectRoute, injectRouteNode), RouterErrorBoundary / RouteView directive patterns, realLink directive, NavigationAnnouncer component, and provideRealRouter. Update adapter count references (5 -> 6). Also includes useRoute<P> generic for typed params and a [real - router] -> [router] typo fix in RouterProvider.
docs: add Ink (terminal UI) integration guide Cover the `@real-router/react/ink` subpath: InkRouterProvider, InkLink, composing routes via useRouteNode + switch, memory-plugin for history, testing with ink-testing-library, and constraints vs the DOM adapter. Link the new page from _Sidebar.md.
Extend #483 doc coverage: error-codes, plugin-architecture, breaking-changes, start - error-codes.md: ROUTE_NOT_FOUND section now explains strict-mode entry points (start / popstate / navigate) emit the same code via emitTransitionError; added onTransitionError observe recipe - plugin-architecture.md: new "Emitting Errors from a Plugin" section documenting api.emitTransitionError(error) — signature, semantics, when to use (strict-mode unmatched URLs, custom navigation handlers) - breaking-changes.md: new HIGH entry under browser-plugin — strict-mode popstate no longer silently redirects; applies to navigation-plugin and hash-plugin too; includes incidental CANNOT_DEACTIVATE URL-rollback fix and userland migration snippet - start.md: allowNotFound: false behaviour clarified — defaultRoute is not consulted as an implicit fallback, matches popstate / Navigation API events; cross-reference to RouterOptions migration snippet
Sync docs with #483 — strict-mode unified behavior - RouterOptions.md: allowNotFound section rewritten to describe the unified contract across start() / popstate / Navigation API events, with the userland migration snippet. Cross-Field Constraints section updated — the dead-end case `{ allowNotFound: false, defaultRoute: "" }` is resolved because defaultRoute is no longer consulted as an implicit fallback. - browser-plugin.md / Navigation-Plugin.md / hash-plugin.md: Edge Cases section updated with the new strict-mode semantics (emit $$error → URL rollback → router state unchanged). - migration-guide.md: new "Strict Mode no longer silently redirects" section with the userland migration snippet. Files also contain pre-existing in-progress edits to unrelated sections.
Sync docs with #471 cross-field validation + trailingSlash fix - RouterOptions.md: fix rewritePathOnMatch default (false → true), document trailingSlash "preserve" + rewrite interaction, add "Cross-Field Constraints" section summarizing validation-plugin diagnostics (warnListeners>maxListeners, defaultRoute target, callbackIgnoresLevel without callback) - validation-plugin.md: expand "What It Validates" Options row with cross-field checks, retrospective list gains static defaultRoute resolution and cross-field options, explain why callback defaultRoute is runtime-checked instead of registration-probed - navigateToDefault.md: document sync-throw → Promise.reject contract and callback-returns-unknown-route behavior - matchPath.md: correct trailing-slash normalization blurb — "preserve" is the default and keeps the source path's trailing-slash choice
docs: add State Context (state.context.*) across all plugin pages Updated State.md, plugin-architecture.md, Navigation-Plugin.md, ssr-data-plugin.md, browser-plugin.md, memory-plugin.md, persistent-params-plugin.md, ssr.md with claim-based API documentation.
docs: update leave, navigation-lifecycle, subscribe for async subscribeLeave
docs: unify FSM terminology TRANSITIONING → TRANSITION_STARTED
docs: add isLeaveApproved, fix method counts, update adapter tables and examples
docs: deprecate BaseLink/ConnectedLink, fix Link.md props and references
docs: add memory-plugin wiki page - New page: memory-plugin.md — full API reference, history management, guard interaction, comparison table with browser/hash plugins, use cases - _Sidebar.md: add Memory Plugin and Search Schema links
docs: add search-schema-plugin wiki page and cross-references (#333) - New page: search-schema-plugin.md — full API reference, validation pipeline, error recovery, strict mode, defaultParams integration, LIFO ordering - Route.md: add searchSchema to Route interface and properties table - plugin-architecture.md: document forwardState + add interceptor usage - validation-plugin.md: add comparison table with search-schema-plugin
docs: add preload-plugin wiki page
docs: add lifecycle-plugin wiki article (#394) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
docs: document subscribeLeave + LEAVE_APPROVED across wiki (#391) - New article: leave.md — full subscribeLeave() API docs, framework examples, comparison with subscribe() - Rewrite stale atomicity claims in navigation-lifecycle.md - Rewrite "no per-route leave event" in navigation-lifecycle.md - Rewrite "only correct place for per-route leave/enter logic" in plugin-architecture.md - Add onTransitionLeaveApprove to plugin hooks, event tables - Update getNavigator, useNavigator, useRouter with new methods - Add glossary entries, recipes, framework integration examples - Update _Sidebar.md with leave.md link Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
docs(wiki): remove State.meta from framework hooks and migration guide useRoute/useRouterTransition: remove meta from State interface examples. migration-guide: update makeState description in plugin API table.
docs(wiki): remove State.meta from State consumer pages navigateToState: update buildState description in related methods table. areStatesEqual: remove meta from State interface example. shouldUpdateNode: fix reload example to use transition field instead of meta. replaceRoutes: update comment about state revalidation.
docs(wiki): remove State.meta from State builder pages buildState: remove meta.id from comparison table, options from plugin example. buildNavigationState: remove meta from returned State example. matchPath: update signature State<P, MP> → State<P>, remove meta from return example.
docs(wiki): rewrite makeState — remove forceId, document WeakMap storage Remove forceId parameter, meta.id concept, State<P, MP> generic. Update browser-plugin examples to reflect simplified popstate reconstruction without meta.id preservation.
docs(wiki): remove MP generic from State getter pages getState/getPreviousState: State<P, MP> → State<P>, remove meta from type examples.
docs(wiki): remove State.meta from type definition pages State no longer carries a meta field — segment parameter metadata is stored internally in a WeakMap.
docs: add Data Loading guide — architecture, simple plugin, compose yourself, @nanostores/query