Skip to content

History

Revisions

  • docs: add Scroll Spy page + cross-link across hash, scroll-restoration, 6 adapters (#575) NEW Scroll-Spy.md — flagship page (~350 lines) symmetric with Scroll-Restoration.md and View-Transitions.md: * Why not a plugin (DOM-agnostic core, IntersectionObserver = DOM) * Opt-in syntax for all 5 web adapters + Angular DI * Options table (selector / rootMargin / scrollContainer) + hardcoded internals (threshold, debounce, cooldown) * Behavior matrix per event (user scroll, Link hash click, F5, stale hash, same-hash skip, self-emit guard) * Anti-flicker architecture deep-dive (isTransitioning + coolingDown + selfEmitting; scrollend Baseline 2026; 500ms fallback timeout) * Plugin compatibility (browser/navigation full; hash/memory/no-URL warn-once + NOOP) * Self-healing on init for stale hashes (/page#nonexistent) * Filtering hash-only transitions idiom (RFC §13 user-land filter pattern + pipeline cost table) * Three recipes (Custom IO alongside spy, Per-route config, TOC sidebar in ~30 LOC) * 8 edge cases / known limitations * Comparison table with Link hash and Scroll-Restoration anchor scrolling UPDATED Hash.md — expanded "Comparison: Hash Features" into a 3-column table (Link hash / anchorScrolling / createScrollSpy) + new "Filtering Hash-only Transitions" section documenting the user-land filter that applies to all three sources of hashChanged: true (clicks, popstate, spy emits). Lists which pipeline phases fire on hash-only transitions (subscribe yes, onStay/onNavigate yes, guards no, onLeave/onEnter no). UPDATED Scroll-Restoration.md — added scroll-spy emit row to the "Behaviour change under browser-plugin" matrix (replace: true → skip, no magnetic snap) + cross-link in See Also. Foundation #648 closure now applies to spy emits. UPDATED RouterProvider.md — added scrollSpy row to the props table + full subsection between scrollRestoration and viewTransitions (options table, per-framework code, plugin compatibility note). UPDATED 6 adapter integration pages (React, Preact, Solid, Vue, Svelte, Angular) — scrollSpy mention in the Components table + per- framework code block with reactivity notes specific to that adapter (React/Preact useEffect with primitive deps, Solid dedicated onMount block, Vue watchToggleableUtility now four utilities, Svelte $effect + $derived + untrack, Angular bootstrap-time snapshot via provideEnvironmentInitializer + installScrollSpy). UPDATED Navigation-Plugin.md — expanded "Router-driven mutations re- enter the navigate handler" edge case to document the event.intercept({ scroll: "manual" }) override that closes the scroll-spy + slow user scroll viewport-jump bug. Cross-links to Hash, Scroll-Restoration, and Scroll-Spy in See Also. UPDATED Home.md — added Scroll Spy bullet alongside Scroll Restoration in the concept overview. UPDATED Ink-Integration.md — added scrollSpy row to the "feature unavailable in terminal" table (symmetric with scrollRestoration: DOM-only, no terminal equivalent). UPDATED recipes.md — added companion blockquote in Scroll Restoration section pointing to Scroll Spy for the opposite direction (scroll → URL) with TOC sidebar pattern hint. UPDATED _Sidebar.md — added Scroll Spy link in DOM Utilities section (alphabetically between Scroll Restoration and View Transitions). Closes destination-404 gap: README/CLAUDE/IMPLEMENTATION_NOTES across 17 files in the main monorepo already link to wiki/Scroll-Spy. UPDATED Link.md — retargeted link-hash example URL to its new location in hash-examples/ subgroup (aligns with PR #695 commit chore(react): move link-hash + scroll-restoration into hash-examples). Total: 1 new flagship page + 15 cross-linked updates. Companion to real-router monorepo PR #695 — scroll-spy implementation, examples, docs, and adapter wiring. Refs greydragon888/real-router#575

    @greydragon888 greydragon888 committed Jun 2, 2026
    5895f2d
  • docs: duplicate-registration contract for subscribe / subscribeLeave / addEventListener (#662) Add explicit "Duplicate Registration — Independent" section to subscribe.md and leave.md, with cross-link to addEventListener.md's new "Strict Contract" callout. Documents the asymmetry that has been implicit since the start: end-user subscribe / subscribeLeave silently accept duplicates (UI bindings legitimately re-register); plugin-author addEventListener throws on same-reference duplicate. leave.md also gains a "Payload Immutability" note matching the `Object.freeze` landed in core (#662). Mirrors the JSDoc in `EventBusNamespace.subscribe` / `.subscribeLeave` / `.addEventListener`.

    @greydragon888 greydragon888 committed May 23, 2026
    a0ebfaf
  • docs: cloneRouter shallow-merge SSR safety section (#664) Add a dedicated "SSR multi-tenancy — dependency reference sharing" section to clone.md with the singletons-vs-per-request lifecycle table and the correct pattern example. ssr.md gets an inline safety callout pointing back at the new section. Mirrors the JSDoc + IMPLEMENTATION_NOTES entries committed in the main repo (#664 doc-only PR).

    @greydragon888 greydragon888 committed May 23, 2026
    103c4a3
  • docs(core-concepts): note STARTING --> DISPOSED safety-net transition (#660) The orchestrated dispose path (`stop() → IDLE → dispose()`) cannot reach IDLE from STARTING because `stop()` is a no-op while the router is initializing. The direct STARTING → DISPOSED transition added in #660 keeps dispose() working even when a start-pipeline throw leaves the FSM stuck mid-init.

    @greydragon888 greydragon888 committed May 23, 2026
    d3af913
  • docs: lift `state.transition.replace` for portable push/replace discrimination (#657) Sync wiki with core change that adds `replace?: boolean` to `TransitionMeta`, symmetric with the existing `reload` / `redirected` flags. Subscribers under any URL plugin (browser, hash, navigation, memory, none) can now portably discriminate replace transitions. - `State.md` — TransitionMeta interface gains `replace?: boolean`; new paragraph on portable cross-plugin discrimination with link to Core-vs-plugin-signals in Navigation-Plugin - `NavigationOptions.md` — `replace` section adds note about subscriber visibility via `state.transition.replace`, with an example and cross-link to State#TransitionMeta - `navigateToNotFound.md` — Side Effects gains the subscriber-visibility parity bullet (symmetric with the existing `opts.replace === true` plugin visibility) - `Scroll-Restoration.md` — Behavior Matrix prefix updated for portable disambiguation, F5 explanation extended to cover both signals (core arm + navigation-plugin priming arm), new "Behaviour change under browser-plugin" subsection with before/after table and opt-out via `mode: "top"`

    @greydragon888 greydragon888 committed May 21, 2026
    09a8720
  • docs(_Sidebar): link SSR-feature surface + Solid-only store hooks - New "SSR Components & Hooks" section linking Await, Streamed, ClientOnly, ServerOnly, Lazy, HttpStatusCode, HttpStatusProvider, useDeferred - Hooks section: link useRouteStore and useRouteNodeStore (Solid only)

    @greydragon888 greydragon888 committed May 18, 2026
    e2ca366
  • docs: tune existing pages — Link / RouteView / sources / transition - Link: document framework-specific class vs className spelling, add style prop row - RouteView: add RouteView.Self section, document keepAlive adapter matrix (React 19.2+ / Vue only), spell out Match/Self/NotFound precedence - RouterErrorBoundary (Vue): clarify fallback is a render-function prop, not a #fallback slot - RouterProvider: rename scroll mode "manual" -> "native" - useRouterTransition: document eager per-router cached source — mount mid-transition now sees the current snapshot - sources-package: add hash option to createActiveRouteSource, extend transition lifecycle table with TRANSITION_LEAVE_APPROVE / isLeaveApproved - sources-adapter-guide: align with the seven create*/two get* factory layout

    @greydragon888 greydragon888 committed May 18, 2026
    a46294c
  • docs(solid): add Solid-only useRouteStore / useRouteNodeStore pages Document the createStore-based variants exposed by @real-router/solid. Cross-link from useRoute / useRouteNode pages for the adapter parity matrix.

    @greydragon888 greydragon888 committed May 18, 2026
    2c64ad5
  • docs(integrations): sync adapter guides with SSR-feature surface - React/Preact/Solid/Vue/Svelte/Angular: align imports and API tables with the /ssr subpath (ClientOnly, ServerOnly, Await, Streamed, useDeferred, HttpStatusCode, HttpStatusProvider, createHttpStatusSink) - Tighten typing (Params from @real-router/core), expose RouterContextValue re-exports, clarify framework-specific gotchas

    @greydragon888 greydragon888 committed May 18, 2026
    b7410f0
  • docs(ssr): add SSR-feature surface pages + extend Hydration guide - New pages for /ssr subpath components and hooks: Await, ClientOnly, ServerOnly, Streamed, Lazy, useDeferred, HttpStatusCode, HttpStatusProvider - SSR-Hydration: cover Solid (generateHydrationScript) and Vue SSR flow, document options.serialize / options.deserialize for devalue / superjson - rsc-server-plugin: update example e2e suite to 27 scenarios

    @greydragon888 greydragon888 committed May 18, 2026
    05fc1ba
  • docs(navigation-plugin): same-URL guard + PLUGIN_SYNC_INFO sentinel (#580) Replace the SyncingFlag / wrapNavigationBrowserWithSyncing / isSyncingFromRouter bullet in Edge Cases with the new identity-based mechanism (PLUGIN_SYNC_INFO on event.info), and add a separate bullet documenting the same-URL guard behavioural consequence: same-URL transitions no longer fire navigate events; consumers branching on those for state-only changes must use router.subscribe instead. Includes the WKWebView cross-document reload context that motivated the fix and the URL canonical-equivalence rule (scheme://host ≡ scheme://host/).

    @greydragon888 greydragon888 committed May 18, 2026
    2c82d1c
  • 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