Skip to content

History

Revisions

  • Solid-Integration: audit-2026-05-16 follow-up — generics, HttpStatusCode, build output Closes documentation gaps identified in `packages/solid/.claude/review-2026-05-16.md`. - Build output table extended to dual-entry (main + `/ssr`) — adds `ssr.mjs`/`ssr.d.mts`/`ssr.js`/`ssr.d.ts` to match `ARCHITECTURE.md` and the real `rollup.config.mjs` output. - New section "Typed Route Params via Generic (`useRoute<P>`)" with example + mention of `Link<P>` / `LinkDirectiveOptions<P>` generics. - New section "SSR Components & Utilities (`@real-router/solid/ssr`)" in Complete API Reference: per-export descriptions for ClientOnly, ServerOnly, Streamed, Await, HttpStatusCode, HttpStatusProvider, useDeferred, createHttpStatusSink. Includes Streaming SSR caveat for `<HttpStatusCode />` (shell-only or `renderToStringAsync`) and valid HTTP status range note. - `<Await>` falsy-resolved-skip caveat and `useDeferred` NEVER_PROMISE behaviour documented inline. - `useRouteNode` Reactive? description refined: "When the node's slice of state changes (activation, deactivation, params change inside the subtree)" — replaces less precise "Only when node activates/deactivates". - Snippet fixes: `CustomActiveIndicator` adds missing `useRouter` import; `useCustomRouteSignal` drops unused `createTransitionSource` import and adds `import type { Router }`.

    @greydragon888 greydragon888 committed May 17, 2026
    04269ce
  • docs(_Sidebar): link SSR-Cancellation page Adds the new SSR-Cancellation page (introduced alongside the ssr-data-plugin audit closure in c741f18) to two sidebar sections: - Concepts — next to "Streaming SSR", matching the conceptual cluster around server-side rendering pipelines - SSR / SSG — next to "SSR Hydration", matching the operational cluster used by readers wiring per-request scopes Pre-existing unrelated sidebar changes (useRouteStore / useRouteNodeStore entries, new SSR Components & Hooks section) are left for a separate commit by their author.

    @greydragon888 greydragon888 committed May 16, 2026
    5c718db
  • docs(ssr-data-plugin): close audit-2026-05-16 — wiki sync Companion to the main-repo audit closure (test(ssr-data-plugin): close audit-2026-05-16). Wiki side: - New SSR-Cancellation.md: replaces a broken link from packages/ssr-data-plugin/README.md and CLAUDE.md. Covers three signal sources (request-scoped via cloneRouter, per-navigation, per-loader withTimeout deadline), manual wiring vs createRequestScope helper, withTimeout's composed AbortSignal semantics (pre-aborted upstream short-circuit, cooperative cancellation, late-rejection absorption), the robust upfront signal.aborted check pattern, and HTTP 504 mapping via the structural .code discriminator. - ssr-data-plugin.md updates: - §5 Interception Mechanism: subscribeLeave revalidation listener row added (was missing — CSR revalidation channel #605 was hidden). - §5 Data Flow: rewritten to show all 4 namespaces (data / ssrDataMode / ssrDataDeferred / ssrDataDeferredKeys), client-only skip branch, hydration-scratchpad reuse path, and isDeferred() split. Previous diagram only showed `data`, predating #610. - §14 wire format: serialize/serializeError/bootstrap option semantics expanded with defaults + panic-fallback chain for serializeError. - §15 NEW — Composition with @real-router/rsc-server-plugin: side-by- side usage on the same router, namespace separation table, claim independence (invalidate("data") leaves rsc cached and vice versa). _Sidebar.md is intentionally NOT in this commit — it has pre-existing unrelated unstaged changes that should be sorted separately. Add a [SSR Cancellation](./SSR-Cancellation) link under Concepts and SSR/SSG when convenient.

    @greydragon888 greydragon888 committed May 16, 2026
    c741f18
  • docs(ssr-data-plugin): cover invalidate, getSsrDataMode, errors, scratchpad, cancellation The wiki page documented only the original ssrDataPluginFactory + defer(). Everything added on the SSR branches (invalidate(router, "data") + cancellation-aware loaders, getSsrDataMode + per-route SSR mode, the typed loader errors at /errors subpath, and the post-hydration scratchpad skip) lived only in src/ and CLAUDE.md. Restructure: - §3 / §3a — Updated DataLoaderFn signature to include `(params, ctx?: { signal })`, expanded DataRouteEntry with the long form. Added the per-route SSR mode section with the function-form resolver and getSsrDataMode reader. - §3 Validation table — Replaced the 2-row factory-time table with a three-layer breakdown (factory-time / plugin-registration-time / runtime), reflecting the actual error messages the validateLoaders pipeline produces today. - §5 StateContext interface — Added the three new module-augmentation fields (ssrDataMode, ssrDataDeferred, ssrDataDeferredKeys) and a per-namespace purpose table. - §7 SSR-Only Design — Reframed as "SSR-only with explicit CSR revalidation channel" so the new invalidate path is honestly disclosed in the SSR/CSR table. - §8 / §8a — New: Revalidation with invalidate(router, "data") + the flag-preservation contract + cancellation-aware loader pattern with the canonical signal.aborted-upfront snippet. - §9 — New: Typed loader errors (LoaderNotFound / LoaderRedirect / LoaderTimeout) + withTimeout race recipe with HTTP-status mapping. - §10 — New: Post-hydration scratchpad skip (#596). - §11-§14 — Renumbered Data Storage / Error Handling / Teardown / defer.

    @greydragon888 greydragon888 committed May 10, 2026
    aab4e86
  • docs(rsc-integration): cover Server Actions via rscActionPluginFactory The page declared Server Actions out of scope, which was true at time of writing — the plugin only shipped rscServerPluginFactory. Since then the package added rscActionPluginFactory + buildRscPayload + the RscActionResult/RscPayload types specifically to make Server Actions first-class on top of the router state. Add a "Server Actions via rscActionPluginFactory" section between the ssr-data-plugin composition recipe and Per-Request Isolation, with the canonical request-handler threading: decodeAction / decodeFormState for the progressive-enhancement form path, loadServerAction / decodeReply for the hydrated-client path, then rscActionPluginFactory(() => actionResult) closure-capturing the result, then buildRscPayload(state) for the Flight render call. Also update "What This Doesn't Cover" — the Server Actions bullet now says only the *transport primitives* live in the bundler, and links to the new section for the routing-side recipe.

    @greydragon888 greydragon888 committed May 10, 2026
    9507db1
  • docs(rsc-server-plugin): cover invalidate, getSsrRscMode, rscActionPluginFactory, errors, scratchpad The wiki page documented only the original rscServerPluginFactory + 4 gotchas — it predated the cluster of additions shipped on the rsc/ssr branches: invalidate(router, "rsc") + cancellation-aware loaders, getSsrRscMode + per-route SSR mode, rscActionPluginFactory + buildRscPayload, the typed loader errors at /errors subpath, and the post-hydration scratchpad skip. Restructure to surface the new APIs as first-class sections: - §4 / §4a — Updated RscLoaderFn signature to include the cancellation context arg (`(params, ctx?: { signal })`), added per-route SSR mode with the function-form resolver - §8 / §8a — Replaced the single-paragraph "Revalidation" with the full invalidate flow + flag-preservation contract + cancellation-aware loader pattern - §9 / §9a — New: Server Actions via rscActionPluginFactory + the buildRscPayload wire-format helper (root override, omit semantics) - §10 — New: typed loader errors and withTimeout, structural code discriminator, mapping to HTTP statuses - §11 — New: post-hydration scratchpad skip, with the honest caveat that excludeContext: ["rsc"] makes it rare in practice - §13 — Expanded gotchas: getResult validation, invalidate fire-and-forget, scratchpad rarely-fires, coverage skipFull stdout - §12-15 — Renumbered Per-request Isolation / Gotchas / End-to-end / Related to make room for the new sections

    @greydragon888 greydragon888 committed May 10, 2026
    ef98d96
  • docs: defer() formal API + /ssr subpath docs across 8 pages Updates the wiki to reflect the defer() + /ssr work shipped in the main repo's #609 / #610 / #611 branch. Streaming-SSR.md (large rewrite): - Opening removes "Real-Router has no streaming-specific API" — Real- Router now ships defer() + injectDeferredScripts as a formal cross- adapter wire-format. - Loader example replaced: defer({ critical, deferred }) instead of the old "split data manually between loader and component" pattern. - Reviews component example uses <Await name> + <Streamed> from @real-router/react/ssr (with the equivalent inline use(useDeferred(...)) form alongside). - Server entry shows injectDeferredScripts + getDeferBootstrapScript + serializeRouterState({ excludeContext: ["ssrDataDeferred"] }). - Express integration adds <!--defer-bootstrap--> placeholder splice. - Comparison with RR7 reframed: now parity (Real-Router has defer()), with notes on the open framework-agnostic wire format vs RR7's turbo-stream-internal one + cross-adapter support matrix. ssr-data-plugin.md: - New §11 "defer({ critical, deferred }) — critical + streamed split" covering server pipeline (injectDeferredScripts), wire format details (escapeForScript, bootstrap, XSS hardening), per-adapter consumer table, "When NOT to use defer()" matrix (Solid/Vue/Svelte/Angular framework-native rationales). - Teardown section extended to mention all 4 namespace claims (data / ssrDataMode / ssrDataDeferred / ssrDataDeferredKeys). React-Integration.md: - Entry Points: 3 → 5 (added /ssr and /legacy/ssr) plus react-server condition note for Server Components type-only entry. - Decision matrix expanded. Preact-Integration.md: - "Single Entry Point" → "Two Entry Points (main + /ssr)" with note that <Await> implements use(promise) semantics via thenable-throw + .status/.value/.reason tagging. Solid-Integration.md: - Quick Start gains "Two Entry Points: main + /ssr" with note that useDeferred returns Accessor<Promise<T>> + cross-link to Streaming-SSR Solid Counterpart and ssr-data-plugin §11. Vue-Integration.md: - Same two-entry pattern; useDeferred returns Promise<T> for await inside async setup(); <Await v-slot="{ value }"> scoped slot. Svelte-Integration.md: - Same two-entry pattern; useDeferred returns Promise<T> for {#await}; .svelte components <Await>/<Streamed>. Angular-Integration.md: - Two-entry pattern via ng-packagr secondary entry-point at packages/angular/ssr/. - Asymmetric Angular note: no <Await>/<Streamed>; injectDeferred<T>(key) returns Signal<T | undefined>. Stale main-entry imports for SSR-feature symbols verified absent across all wiki pages (grep clean — 0 matches).

    @greydragon888 greydragon888 committed May 9, 2026
    fbfec03
  • docs: cover Vue 3 SSR / streaming / SSG across the SSR guides Adds Vue parity coverage to four pages alongside the existing React-focused content: - Vue-Integration.md — new "Server-Side Rendering" section with server + client entry shapes, links to the three vue/ssr-examples/ packages, and Vue-specific gotchas (per-request createSSRApp, blocking <Suspense>, hydration ordering, SSG dev-mode factory detection) - SSR-Hydration.md — Vue 3 entry-server / entry-client snippets next to the existing React ones; same hydration contract, just different renderer + mount call - Streaming-SSR.md — "Vue Counterpart" comparison table (renderToWebStream, blocking Suspense, no out-of-order placeholders, no selective hydration) with an honest note that true OOO streaming awaits Vapor mode - ssr.md — renames "React Integration" to "Framework Integration" with a new Vue 3 subsection; updates stale react example URLs and adds the three new vue/ssr-examples/ links to the See Also list

    @greydragon888 greydragon888 committed May 3, 2026
    c52e4d1
  • docs: update example paths to ssr-examples/ subgroup After grouping React SSR examples under examples/web/react/ssr-examples/ (mirroring the animation-examples/ pattern), update GitHub `tree/master/` links in: - RSC-Integration.md (2 references) - rsc-server-plugin.md (1 reference) Streaming-SSR.md was already created with the new path layout.

    @greydragon888 greydragon888 committed May 3, 2026
    b3863d6
  • docs: add Streaming SSR guide (#576) New wiki page documenting React 19 native streaming SSR pattern: renderToReadableStream + <Suspense> + use(promise) with ssr-data-plugin for critical data. No router-specific wrapper — pure delegation to React 19 primitives. Covers mental model (critical vs deferred data), minimal three-file setup, per-render memoized promise + server-only setTimeout constraints, Express integration, comparison with React Router 7 defer()/<Await>, when to use vs when not to, and the 5-scenario reference example. Cross-references: - Data-Loading.md: link to Streaming SSR for non-RSC deferred sections - _Sidebar.md: register page under Concepts

    @greydragon888 greydragon888 committed May 3, 2026
    900aa9d
  • docs(rsc): add RSC Integration guide + complete plugin documentation - New: RSC-Integration.md — end-to-end integration guide covering the three-environment runtime model (rsc/ssr/client), two-endpoint architecture (HTML + /__rsc), Server Components in entry.rsc.tsx, Flight streaming via rsc-html-stream, client mount with hydrateRouter + createFromReadableStream, single source of truth in App.tsx, and revalidation pattern. Reference implementation: examples/web/react/ssr-rsc/. - New: rsc-server-plugin.md — plugin reference page (12 sections: overview, sibling-of-ssr-data-plugin comparison, installation, configuration, serialization with excludeContext, ReactNode rationale, SSR-only design, revalidation, per-request isolation, gotchas, e2e integration link, related pages). - Updated: SSR-Hydration.md — document excludeContext option for serializeRouterState + cross-link to rsc-server-plugin. - Updated: plugin-architecture.md — add rsc namespace to built-in context table; list rsc-server-plugin alongside ssr-data-plugin in start-interceptor row; bump count from "Five plugins" to "Six". - Updated: Data-Loading.md — new "Server-Rendered Data" section with ssr-data-plugin vs rsc-server-plugin comparison + cross-link to RSC Integration guide. - Updated: _Sidebar.md — RSC Integration link in Concepts section (next to Data Loading) + RSC Server section (next to plugin page). Closes RFC-A Stage 2 (rfc-rsc-server-plugin.md) wiki announcements + RFC-B Stage 5 (rfc-rsc-vite-example.md) documentation.

    @greydragon888 greydragon888 committed May 2, 2026
    233d9cf
  • docs(scroll-restoration): rename mode `manual` → `native`, document `behavior` and `storageKey` options (#534) - Behavior matrix updated: `manual` row → `native` row, default semantics ("browser default" not "no-op") - `mode` row in options table — clarified that `native` = "utility disabled, browser handles natively" (opposite of DOM `history.scrollRestoration === "manual"`) - New `behavior` row — forwarded to `scrollTo({ behavior })` and `scrollIntoView({ behavior })`. Smooth recommended for top mode / anchor scroll only - New `storageKey` row — sessionStorage key override for namespace-isolation (micro-frontends, embedded widgets, testing setups) API surface: ```ts interface ScrollRestorationOptions { mode?: "restore" | "top" | "native"; behavior?: "auto" | "instant" | "smooth"; anchorScrolling?: boolean; scrollContainer?: () => HTMLElement | null; storageKey?: string; } ``` All 6 adapter `RouterProvider` implementations forward these options. See the [`scroll-restoration` example](https://github.com/greydragon888/real-router/tree/master/examples/web/react/scroll-restoration) for 24 e2e tests covering every behavioral branch (#534).

    @greydragon888 greydragon888 committed Apr 30, 2026
    90435c6
  • docs: hash fragment support — new Hash page + cross-references (#532) Wiki side of #532 stage 4. New `Hash.md` is the public design + API reference; existing pages get cross-references and table widening. - Hash.md (new, ~270 lines): Overview, Architecture (state.context.url namespace, mutual exclusivity), API surface (tri-state opts.hash, buildUrl, replaceHistoryState, hashChanged signal), per-framework <Link hash> snippets, Tab UI walkthrough, Cross-Path preserve, F5 lazy hash read, browser-driven hash-only nav, hash-aware active state & stabilizeState, hash-plugin limitation, scroll-restoration comparison - Link.md: hash row in props table + Hash Fragment Navigation section with all 6 frameworks - State.md: built-in context namespaces table — `url` row alongside navigation/browser/memory/etc. - browser-plugin.md / Navigation-Plugin.md: state.context.url subsection, extension table widening, mutual exclusivity note - hash-plugin.md: limitations bullet (warn-once, structural incompatibility) - Scroll-Restoration.md: anchorScrolling reads from state.context.url.hash with DOM fallback; new "Hash Source Resolution" subsection - _Sidebar.md: Hash link under Concepts

    @greydragon888 greydragon888 committed Apr 29, 2026
    3be2d30
  • docs: backfill pending wiki updates for useRoute non-nullable + adapter integrations Catches up wiki content that was edited locally before this branch — separated from #532 docs to keep that commit focused. - {React,Preact,Solid,Vue,Svelte,Angular}-Integration.md, useRoute.md, useRouteNode.md: useRoute() is now non-nullable (#535) — `route?.x` → `route.x`, with note that useRouteNode keeps nullable shape - memory-plugin.md: minor edits picked up alongside the sweep

    @greydragon888 greydragon888 committed Apr 29, 2026
    de64307
  • docs: align ssr.md + ssr-data-plugin.md + Home.md with #563 hydration helpers Updates downstream of the new serializeRouterState + hydrateRouter API: - ssr.md: "State Serialization" now uses serializeRouterState (transports full State incl. context.data) instead of bespoke serializeState({data}). "Client Hydration" demonstrates hydrateRouter(router, __SSR_STATE__) with fallback to router.start() for dev/no-SSR flows. "Full SSR Flow" diagram + "See Also" updated. - ssr-data-plugin.md: "Full SSR Flow" example now serializes the whole state (server-loaded context.data rides along automatically). "See Also" links to SSR-Hydration. - Home.md: SSR sidebar entry adds SSR-Hydration link.

    @greydragon888 greydragon888 committed Apr 28, 2026
    99c1bc4
  • docs: SSR Hydration page — serializeRouterState + hydrateRouter (#563)

    @greydragon888 greydragon888 committed Apr 28, 2026
    ab47f73
  • docs(preload-plugin): document getPreloadedState extension + FastLink recipe (#562)

    @greydragon888 greydragon888 committed Apr 28, 2026
    be80390
  • docs: add Routing-Animations.md overview page (decision matrix + 4 approaches) Single overview article instead of four peer pages. Rationale: - The 4-approaches comparison table is the central artefact — splitting it across 4 pages dilutes the decision matrix. - Implementation truth lives in 24 example READMEs (4 approaches × 6 adapters); the wiki page should route the choice and link out, not duplicate them. - View-Transitions.md already exists as a peer (it documents a first-class DOM utility shipped with each adapter). The other three approaches are recipes in example code, not library APIs — uneven peer pages would misrepresent the categorisation. Page structure: 1. Why router coordination — `useRouteExit`'s Promise-blocking semantics 2. Four-approaches comparison table 3. Per-approach (~30-50 LOC each) — view-transitions, route-animations, page-animations, motion-animations 4. "How to choose" decision flow + recommended defaults 5. Per-adapter notes — which library each adapter uses for the "library-driven" recipe (motion / solid-motionone / Vue's Transition / Svelte transitions / Angular signals) 6. Common edge cases — skip-initial, same-route, abort, reduced-motion, direction-aware UI 7. See Also Cross-references added so the page is discoverable from the related ones: - View-Transitions.md, useRouteExit.md, useRouteEnter.md → link back to Routing-Animations - _Sidebar.md → new "Patterns" subsection under "DOM Utilities"

    @greydragon888 greydragon888 committed Apr 27, 2026
    79e5046
  • docs: remove migration-guide.md (router5 migration is no longer relevant for new users) Real-router has been published as @real-router/* for several releases. Anyone picking it up today is installing fresh, not migrating from router5. The 1063-line migration-guide.md served the early adoption phase and now mostly adds noise to the wiki sidebar. Per-API migration notes still live inline on individual pages (`## Migration from router5` H2 sections in Link.md, navigate.md, buildPath.md, etc.) — those are independent of the deleted page and remain useful when readers run into a router5-specific reference. Cleanup: - Removed the file. - _Sidebar.md: dropped the entire "Migration" section (now empty after the previous breaking-changes.md removal). - Home.md: dropped the "Migration from router5" section pointing at it. - validation-plugin.md: dropped the See Also link (router5 migration is not central to validation-plugin's docs).

    @greydragon888 greydragon888 committed Apr 27, 2026
    d3959ea
  • docs: remove breaking-changes.md (router5 migration content already lives in migration-guide.md) The breaking-changes.md page (803 lines, severity-tagged: CRITICAL / HIGH / MEDIUM / LOW) duplicates and overlaps significantly with migration-guide.md (1063 lines, organised by removed methods + per-package + checklist). Real-router is pre-1.0 — every change is necessarily a "breaking change" in semver terms, so the severity taxonomy adds no value beyond what migration-guide.md and the changesets already convey. Inline "Breaking Changes" sections still exist on individual API pages where relevant. Cleanup: - Removed the file. - _Sidebar.md: dropped the "Breaking Changes" link under Migration. - migration-guide.md: removed the "See Breaking Changes for complete list" line. - validation-plugin.md: redirected its "Migration notes" link to migration-guide.md. The "Breaking Changes" header rows in API page comparison tables (e.g. in subscribe.md, navigate.md) are independent of the deleted file and stay.

    @greydragon888 greydragon888 committed Apr 27, 2026
    3c378e9
  • docs: actualize wiki for view-transitions / useRouteExit / useRouteEnter / browser direction / isActiveRoute fix Sourced from .changeset files on the feature branch. New pages: - View-Transitions.md — covers `viewTransitions` prop / `provideRealRouter` option, browser-support matrix, CSS customisation (hero morph, direction-aware slides), setTimeout(0) load-bearing detail, Angular-specific applicationRef.tick() workaround, reactivity matrix per adapter, four-recipe comparison. - useRouteExit.md — covers built-in guards (reentrant abort pre-check, same-route skip, latest-handler ref), Promise-blocking semantics, handler-reactivity caveat per non-React adapter, common recipes (animation, autosave, abort, scroll capture, motion library bridge). - useRouteEnter.md — covers skip-initial / skip-same-route / StrictMode immunity, race-safety via post-commit useRoute() snapshot, mount-time context, recipes (analytics, direction-aware entry, focus management, transition metadata). Updated pages: - RouterProvider.md — new `viewTransitions` prop row in props table + per-framework syntax block. - browser-plugin.md — new `direction` field in BrowserContext type + value table + consumer recipes (router.subscribe + useRouteEnter), createDirectionTracker pointer. - isActiveRoute.md — new "Hierarchical Branch — Symmetry Fixes (#536, #537)" section documenting `ignoreQueryParams` symmetry and removal of spurious descendant-of-active matches. - _Sidebar.md — links to useRouteExit, useRouteEnter under Hooks; View Transitions under DOM Utilities. - {React,Preact,Solid,Vue,Svelte,Angular}-Integration.md — added viewTransitions / view-transitions prop docs in Provider section + useRouteExit / useRouteEnter (or injectRouteExit / injectRouteEnter for Angular) rows in Hooks / Composables / Functions tables.

    @greydragon888 greydragon888 committed Apr 27, 2026
    e3a5b11
  • 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).

    @greydragon888 greydragon888 committed Apr 23, 2026
    00df8bd
  • 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.

    @greydragon888 greydragon888 committed Apr 22, 2026
    1a3e5e5
  • 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.

    @greydragon888 greydragon888 committed Apr 21, 2026
    9335369
  • 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.

    @greydragon888 greydragon888 committed Apr 20, 2026
    4d6fc5e
  • 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.

    @greydragon888 greydragon888 committed Apr 20, 2026
    a2c17bb
  • 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.

    @greydragon888 greydragon888 committed Apr 20, 2026
    fe8fd9a
  • 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.

    @greydragon888 greydragon888 committed Apr 20, 2026
    568febf
  • 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.

    @greydragon888 greydragon888 committed Apr 20, 2026
    70c89fe
  • 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.

    @greydragon888 greydragon888 committed Apr 20, 2026
    e0bf82e