@real-router/preact 0.14.0 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -372,12 +372,73 @@ interface ScrollRestorationOptions {
372
372
  storageKey?: string | undefined;
373
373
  }
374
374
  //#endregion
375
+ //#region ../../shared/dom-utils/scroll-spy.d.ts
376
+ /**
377
+ * Router-coordinated scroll spy (#575).
378
+ *
379
+ * On `IntersectionObserver` notifications the utility picks the topmost
380
+ * visible anchor inside the configured scroll container and emits a forced
381
+ * same-route transition with `{ hash, replace: true, force: true, hashChange:
382
+ * true }` through `router.navigate(...)`. The URL plugin
383
+ * (`@real-router/browser-plugin` or `@real-router/navigation-plugin`) updates
384
+ * `state.context.url.hash` so sibling hash-aware `<Link hash>` re-highlights
385
+ * via the standard `createActiveRouteSource` pipeline.
386
+ *
387
+ * **Anti-flicker gates** (RFC §5.2):
388
+ * 1. `getTransitionSource(router).getSnapshot().isTransitioning` — skip emits
389
+ * while a transition is in-flight (re-entrant lock).
390
+ * 2. `coolingDown` — set on a user-driven hash transition (e.g. `<Link hash>`
391
+ * click + smooth `scrollIntoView`). Cleared on `scrollend` or after a
392
+ * 500ms safety timeout. Spy's own emits are excluded via the synchronous
393
+ * `selfEmitting` flag — required so the spy doesn't rate-limit itself.
394
+ *
395
+ * **Self-healing** (RFC §7.3): if the initial URL contains a hash without a
396
+ * matching `id` (e.g. `/page#nonexistent`), the first IO event emitted right
397
+ * after observe()-ing picks the topmost real anchor and corrects the URL.
398
+ *
399
+ * **Hash-only transition pipeline cost** (RFC §5.3): for same-route same-
400
+ * params hash-only navigations, `getTransitionPath` returns empty
401
+ * `toDeactivate` / `toActivate` arrays, so `runGuards` is a no-op. The only
402
+ * work is the URL plugin's `onTransitionSuccess` write and the
403
+ * `getTransitionSource` flip — cheap.
404
+ *
405
+ * **Architecture**: decomposed into 4 private subsystem closure factories
406
+ * (`createUrlPluginDetector`, `createCooldown`, `createDebouncer`,
407
+ * `createObserverPair`). The main `createScrollSpy` wires them together
408
+ * around the shared `silenced` / `destroyed` / `selfEmitting` flags and the
409
+ * `flush()` emit logic. Each subsystem owns its state + cleanup; `destroy()`
410
+ * delegates to each. See section banners below.
411
+ *
412
+ * @returns A `ScrollSpy` handle whose `destroy()` is idempotent.
413
+ */
414
+ interface ScrollSpyOptions {
415
+ /**
416
+ * CSS selector for anchor candidates. Empty string `""` or `undefined`
417
+ * disables the spy (returns a NOOP handle). Common values:
418
+ * `"[id]"`, `"[id]:is(h1,h2,h3)"`, `"section[id]"`.
419
+ */
420
+ selector: string;
421
+ /**
422
+ * `IntersectionObserver` `rootMargin`. Default
423
+ * `"-20% 0px -60% 0px"` — an anchor is considered "active" once it crosses
424
+ * into the top 20 % of the viewport (or scroll container).
425
+ */
426
+ rootMargin?: string | undefined;
427
+ /**
428
+ * Lazy getter for the scrollable container. Resolved on every event.
429
+ * `null` (or missing getter) falls back to the window viewport
430
+ * (`root: null` on the `IntersectionObserver`).
431
+ */
432
+ scrollContainer?: (() => HTMLElement | null) | undefined;
433
+ }
434
+ //#endregion
375
435
  //#region src/RouterProvider.d.ts
376
436
  interface RouteProviderProps {
377
437
  router: Router;
378
438
  children: ComponentChildren;
379
439
  announceNavigation?: boolean;
380
440
  scrollRestoration?: ScrollRestorationOptions;
441
+ scrollSpy?: ScrollSpyOptions;
381
442
  viewTransitions?: boolean;
382
443
  }
383
444
  declare const RouterProvider: FunctionComponent<RouteProviderProps>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/components/RouteView/types.ts","../../src/components/RouteView/components.tsx","../../src/components/RouteView/RouteView.tsx","../../src/types.ts","../../src/components/Link.tsx","../../src/components/RouterErrorBoundary.tsx","../../src/hooks/useRouter.tsx","../../src/hooks/useNavigator.tsx","../../src/hooks/useRouteUtils.tsx","../../src/hooks/useRoute.tsx","../../src/hooks/useRouteNode.tsx","../../src/hooks/useRouterTransition.tsx","../../src/hooks/useRouteExit.tsx","../../src/hooks/useRouteEnter.tsx","../../../../shared/dom-utils/scroll-restore.ts","../../src/RouterProvider.tsx","../../src/context.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../src/components/RouteView/types.ts","../../src/components/RouteView/components.tsx","../../src/components/RouteView/RouteView.tsx","../../src/types.ts","../../src/components/Link.tsx","../../src/components/RouterErrorBoundary.tsx","../../src/hooks/useRouter.tsx","../../src/hooks/useNavigator.tsx","../../src/hooks/useRouteUtils.tsx","../../src/hooks/useRoute.tsx","../../src/hooks/useRouteNode.tsx","../../src/hooks/useRouterTransition.tsx","../../src/hooks/useRouteExit.tsx","../../src/hooks/useRouteEnter.tsx","../../../../shared/dom-utils/scroll-restore.ts","../../../../shared/dom-utils/scroll-spy.ts","../../src/RouterProvider.tsx","../../src/context.ts"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{a as e,i as t,n,r,t as i}from"./useRoute-BSPVVbLz.mjs";import{useEffect as a,useLayoutEffect as o,useMemo as s,useRef as c,useState as l}from"preact/hooks";import{UNKNOWN_ROUTE as u,getNavigator as d}from"@real-router/core";import{getRouteUtils as f,startsWithSegment as p}from"@real-router/route-utils";import{Fragment as m,isValidElement as h,toChildArray as g}from"preact";import{Suspense as _,memo as v}from"preact/compat";import{Fragment as y,jsx as b,jsxs as x}from"preact/jsx-runtime";import{createActiveRouteSource as S,createDismissableError as ee,createRouteNodeSource as te,createRouteSource as C,getTransitionSource as w}from"@real-router/sources";import{getPluginApi as T}from"@real-router/core/api";function E(e){return null}E.displayName=`RouteView.Match`;function D(e){return null}D.displayName=`RouteView.Self`;function O(e){return null}O.displayName=`RouteView.NotFound`;function k(e,t,n){return t===``?!1:n?e===t:p(e,t)}function A(e,t){for(let n of g(e))h(n)&&(n.type===E||n.type===D||n.type===O?t.push(n):A(n.props.children,t))}function j(e,t,n){return b(m,{children:n===void 0?e:b(_,{fallback:n,children:e})},t)}function M(e){return e.type===O||e.type===D}function N(e,t){if(e.type===O){t.notFoundChildren=e.props.children;return}t.selfFound||=(t.selfChildren=e.props.children,t.selfFallback=e.props.fallback,!0)}function ne(e,t,n,r){let{segment:i,exact:a=!1,fallback:o,children:s}=e.props,c=n?`${n}.${i}`:i;return!r&&k(t,c,a)?j(s,c,o):null}function re(e,t,n,r){if(r.selfFound&&t===n){e.push(j(r.selfChildren,`__route-view-self__`,r.selfFallback));return}t===u&&r.notFoundChildren!==null&&e.push(b(m,{children:r.notFoundChildren},`__route-view-not-found__`))}function ie(e,t,n){let r={selfChildren:null,selfFallback:void 0,selfFound:!1,notFoundChildren:null},i=!1,a=[];for(let o of e){if(M(o)){N(o,r);continue}let e=ne(o,t,n,i);e!==null&&(i=!0,a.push(e))}return i||re(a,t,n,r),{rendered:a,activeMatchFound:i}}function P(e,t,n){let[r,i]=l(t);return a(()=>{let n=()=>{i(e=>{let n=t();return Object.is(e,n)?e:n})};return n(),e(n)},[e,t]),r}const F=e(n,`useNavigator`),I=e(t,`useRouter`);function L(e){let t=I(),n=F(),r=te(t,e),{route:i,previousRoute:a}=P(r.subscribe,r.getSnapshot,r.getSnapshot);return s(()=>({navigator:n,route:i,previousRoute:a}),[n,i,a])}function R({nodeName:e,children:t}){let{route:n}=L(e),r=s(()=>{let e=[];return A(t,e),e},[t]),i=n?.name,a=s(()=>i===void 0?[]:ie(r,i,e).rendered,[r,i,e]);return a.length>0?b(y,{children:a}):null}R.displayName=`RouteView`;const z=Object.assign(R,{Match:E,Self:D,NotFound:O}),B=Object.freeze({}),V=Object.freeze({}),H=`data-real-router-announcer`,U=Object.freeze({destroy:()=>{}});function W(e,t){if(typeof document>`u`)return U;let n=t?.prefix??`Navigated to `,r=t?.getAnnouncementText,i=!0,a=!1,o=!1,s=``,c=null,l,u=G(),d=(e,t)=>{s=e,clearTimeout(l),u.textContent=e,l=setTimeout(()=>{u.textContent=``,s=``},7e3),J(t)},f=setTimeout(()=>{if(a=!0,c!==null&&!o){let e=c;c=null,d(e,document.querySelector(`h1`))}},100),p=e.subscribe(({route:e})=>{if(i){i=!1;return}requestAnimationFrame(()=>{requestAnimationFrame(()=>{if(o)return;let t=document.querySelector(`h1`),i=q(e,n,r,t);if(!(!i||i===s)){if(!a){c=i;return}d(i,t)}})})});return{destroy(){o=!0,p(),clearTimeout(l),clearTimeout(f),K()}}}function G(){let e=document.querySelector(`[${H}]`);if(e)return e;let t=document.createElement(`div`);return t.setAttribute(`style`,`position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);clip-path:inset(50%);white-space:nowrap;border:0`),t.setAttribute(`aria-live`,`assertive`),t.setAttribute(`aria-atomic`,`true`),t.setAttribute(H,``),(document.body??document.documentElement).prepend(t),t}function K(){document.querySelector(`[${H}]`)?.remove()}function q(e,t,n,r){if(n)try{let t=n(e);if(t)return t}catch(e){console.error(`[real-router] getAnnouncementText threw; falling back to default resolution.`,e)}let i=(r?.textContent??``).trim(),a=e.name.startsWith(`@@`)?``:e.name;return`${t}${i||document.title||a||globalThis.location.pathname}`}function J(e){e&&(e.hasAttribute(`tabindex`)||e.setAttribute(`tabindex`,`-1`),e.focus({preventScroll:!0}))}const Y=Object.freeze({destroy:()=>{}});function ae(e,t){if(globalThis.window===void 0)return Y;let n=t?.mode??`restore`;if(n===`native`)return Y;let r=t?.anchorScrolling??!0,i=t?.scrollContainer,a=t?.behavior??`auto`,o=t?.storageKey??`real-router:scroll`,s,c=()=>{if(s!==void 0)return s;try{let e=sessionStorage.getItem(o);s=e?JSON.parse(e):{}}catch{s={}}return s},l=(e,t)=>{try{let n=c();if(n[e]===t)return;n[e]=t,sessionStorage.setItem(o,JSON.stringify(n))}catch{}},u=history.scrollRestoration;try{history.scrollRestoration=`manual`}catch{}let d=()=>{let e=i?.();return e?e.scrollTop:globalThis.scrollY},f=e=>{let t=i?.();t?t.scrollTo({top:e,left:0,behavior:a}):globalThis.scrollTo({top:e,left:0,behavior:a})},p=e=>{let t=e.context?.url?.hash;if(t!==void 0){if(r&&t.length>0){let e=document.getElementById(t);if(e){e.scrollIntoView({behavior:a});return}}f(0);return}let n=globalThis.location.hash;if(r&&n.length>1){let e;try{e=decodeURIComponent(n.slice(1))}catch{e=n.slice(1)}let t=document.getElementById(e);if(t){t.scrollIntoView({behavior:a});return}}f(0)},m=!1,h=!1,g=e=>{try{return oe(e)}catch{return h||(h=!0,console.error(`[real-router] scroll-restore: route "${e.name}" has params that cannot be canonicalized (e.g. BigInt or cyclic structure). Scroll position will not be captured or restored for this route.`)),null}},_=e.subscribe(({route:e,previousRoute:t})=>{let r=e.context.navigation;if(t){let e=g(t);e!==null&&l(e,d())}requestAnimationFrame(()=>{if(!m){if(n===`top`){p(e);return}if(!(e.transition.replace||r?.navigationType===`replace`)){if(e.transition.reload||r?.navigationType===`reload`){let t=g(e);f(t===null?0:c()[t]??0);return}if(r?.direction===`back`||r?.navigationType===`traverse`){let t=g(e);f(t===null?0:c()[t]??0);return}p(e)}}})}),v=()=>{let t=e.getState();if(t){let e=g(t);e!==null&&l(e,d())}};return globalThis.addEventListener(`pagehide`,v),{destroy:()=>{if(!m){m=!0,_(),globalThis.removeEventListener(`pagehide`,v);try{history.scrollRestoration=u}catch{}}}}}const X=new WeakMap;function oe(e){let t=X.get(e);if(t!==void 0)return t;let n=`${e.name}:${se(e.params)}`;return X.set(e,n),n}function se(e){return JSON.stringify(e,ce)}function ce(e,t){if(typeof t==`function`)return`<fn>`;if(typeof t==`symbol`)return`<sym>`;if(typeof t==`object`&&t&&!Array.isArray(t)){let e=Object.create(null),n=Object.keys(t).sort((e,t)=>e.localeCompare(t));for(let r of n)e[r]=t[r];return e}return t}const le=Object.freeze({destroy:()=>{}});function ue(e){if(typeof document>`u`||typeof document.startViewTransition!=`function`)return le;let t=null,n=null,r=!1,i=()=>{t?.(),t=null},a=e.subscribeLeave(({signal:e})=>{if(!e.aborted)return r=!1,i(),new Promise(a=>{let o=new Promise(e=>{t=e});e.addEventListener(`abort`,()=>{r||(i(),n?.skipTransition?.(),a())},{once:!0});try{n=document.startViewTransition(()=>(a(),o))}catch{i(),a()}})}),o=e.subscribe(()=>{let e=t;r=!0,t=null,e===null?n=null:setTimeout(()=>{e(),n=null},0)});return{destroy:()=>{a(),o(),n?.skipTransition?.(),n=null,i()}}}function de(e){return e.button===0&&!e.metaKey&&!e.altKey&&!e.ctrlKey&&!e.shiftKey}const fe=/%[\dA-Fa-f]{2}/;function pe(e){if(fe.test(e))try{return encodeURI(decodeURIComponent(e)).replaceAll(`#`,`%23`)}catch{}return encodeURI(e).replaceAll(`#`,`%23`)}function me(e,t,n,r){try{let i=r?.hash,a;i!==void 0&&(a=i.startsWith(`#`)?i.slice(1):i);let o=e.buildUrl;if(o){let e=o(t,n,a===void 0?void 0:{hash:a});if(typeof e==`string`&&e.length>0)return e}let s=e.buildPath(t,n);if(typeof s!=`string`||s.length===0){console.error(`[real-router] Route "${t}" yielded an empty path. The element will render without an href attribute.`);return}return a?`${s}#${pe(a)}`:s}catch{console.error(`[real-router] Route "${t}" is not defined. The element will render without an href attribute.`);return}}function he(e,t,n,r,i){let a={...i};r!==void 0&&(a.hash=r);let o=e.getState();if(o?.name===t&&Q(o.params,n)){let e=o.context?.url?.hash??``;e!==(r??e)&&(a.force=!0,a.hashChange=!0)}return e.navigate(t,n,a)}const ge=/\s/,_e=/\S+/g;function Z(e){return e?ge.test(e)?e.match(_e)??[]:[e]:[]}function ve(e,t,n){if(e&&t){let e=Z(t);if(e.length===0)return n??void 0;if(!n)return e.join(` `);let r=Z(n),i=new Set(r);for(let t of e)i.has(t)||(i.add(t),r.push(t));return r.join(` `)}return n??void 0}function Q(e,t){if(Object.is(e,t))return!0;if(!e||!t)return!1;let n=Object.keys(e);if(n.length!==Object.keys(t).length)return!1;let r=e,i=t;for(let e of n)if(!Object.prototype.hasOwnProperty.call(t,e)||!Object.is(r[e],i[e]))return!1;return!0}function ye(e,t,n=!1,r=!0,i){let a=I(),o=s(()=>i===void 0?{strict:n,ignoreQueryParams:r}:{strict:n,ignoreQueryParams:r,hash:i},[n,r,i]),c=s(()=>S(a,e,t,o),[a,e,t,o]);return P(c.subscribe,c.getSnapshot,c.getSnapshot)}function be(e,t){return e.routeName===t.routeName&&e.className===t.className&&e.activeClassName===t.activeClassName&&e.activeStrict===t.activeStrict&&e.ignoreQueryParams===t.ignoreQueryParams&&e.onClick===t.onClick&&e.target===t.target&&e.style===t.style&&e.children===t.children&&e.hash===t.hash&&Q(e.routeParams,t.routeParams)&&Q(e.routeOptions,t.routeOptions)}const $=v(({routeName:e,routeParams:t=B,routeOptions:n=V,className:r,activeClassName:i=`active`,activeStrict:a=!1,ignoreQueryParams:o=!0,hash:s,onClick:c,target:l,children:u,...d})=>{let f=I(),p=ye(e,t,a,o,s),m=me(f,e,t,s===void 0?void 0:{hash:s}),h=r=>{c&&(c(r),r.defaultPrevented)||!de(r)||l===`_blank`||(r.preventDefault(),he(f,e,t,s,n).catch(()=>{}))},g=ve(p,i,r);return b(`a`,{...d,href:m,className:g,onClick:h,children:u})},be);$.displayName=`Link`;function xe({children:e,fallback:t,onError:n}){let r=ee(I()),i=P(r.subscribe,r.getSnapshot,r.getSnapshot),s=c(n);return o(()=>{s.current=n}),a(()=>{i.error&&s.current?.(i.error,i.toRoute,i.fromRoute)},[i.version]),x(m,{children:[e,i.error?t(i.error,i.resetError):null]})}const Se=()=>f(T(I()).getTree());function Ce(){let e=w(I());return P(e.subscribe,e.getSnapshot,e.getSnapshot)}function we(e,t){let n=I(),r=c(e),i=t?.skipSameRoute??!0;o(()=>{r.current=e}),a(()=>n.subscribeLeave(({route:e,nextRoute:t,signal:n})=>{if(!(i&&e.name===t.name)&&!n.aborted)return r.current({route:e,nextRoute:t,signal:n})}),[n,i])}function Te(e,t){let{route:n,previousRoute:r}=i(),s=c(e),l=c(null),u=t?.skipSameRoute??!0;o(()=>{s.current=e}),a(()=>{n.transition.from&&(u&&n.transition.from===n.name||l.current===n||!r||(l.current=n,s.current({route:n,previousRoute:r})))},[n,r,u])}const Ee=({router:e,children:i,announceNavigation:o,scrollRestoration:c,viewTransitions:l})=>{a(()=>{if(!o)return;let t=W(e);return()=>{t.destroy()}},[o,e]);let u=c?.mode,f=c?.anchorScrolling,p=c?.behavior,m=c?.storageKey,h=c!==void 0;a(()=>{if(!h)return;let t=ae(e,{mode:u,anchorScrolling:f,behavior:p,storageKey:m,scrollContainer:c.scrollContainer});return()=>{t.destroy()}},[e,h,u,f,p,m]),a(()=>{if(!l)return;let t=ue(e);return()=>{t.destroy()}},[e,l]);let g=d(e),_=s(()=>C(e),[e]),{route:v,previousRoute:y}=P(_.subscribe,_.getSnapshot,_.getSnapshot),x=s(()=>({navigator:g,route:v,previousRoute:y}),[g,v,y]);return b(t.Provider,{value:e,children:b(n.Provider,{value:g,children:b(r.Provider,{value:x,children:i})})})};export{$ as Link,n as NavigatorContext,r as RouteContext,z as RouteView,t as RouterContext,xe as RouterErrorBoundary,Ee as RouterProvider,F as useNavigator,i as useRoute,Te as useRouteEnter,we as useRouteExit,L as useRouteNode,Se as useRouteUtils,I as useRouter,Ce as useRouterTransition};
1
+ import{a as e,i as t,n,r,t as i}from"./useRoute-BSPVVbLz.mjs";import{useEffect as a,useLayoutEffect as o,useMemo as s,useRef as c,useState as l}from"preact/hooks";import{UNKNOWN_ROUTE as u,getNavigator as d}from"@real-router/core";import{getRouteUtils as f,startsWithSegment as p}from"@real-router/route-utils";import{Fragment as m,isValidElement as h,toChildArray as g}from"preact";import{Suspense as _,memo as v}from"preact/compat";import{Fragment as y,jsx as b,jsxs as x}from"preact/jsx-runtime";import{createActiveRouteSource as S,createDismissableError as C,createRouteNodeSource as w,createRouteSource as ee,getTransitionSource as T}from"@real-router/sources";import{getPluginApi as te}from"@real-router/core/api";function E(e){return null}E.displayName=`RouteView.Match`;function D(e){return null}D.displayName=`RouteView.Self`;function O(e){return null}O.displayName=`RouteView.NotFound`;function ne(e,t,n){return t===``?!1:n?e===t:p(e,t)}function k(e,t){for(let n of g(e))h(n)&&(n.type===E||n.type===D||n.type===O?t.push(n):k(n.props.children,t))}function A(e,t,n){return b(m,{children:n===void 0?e:b(_,{fallback:n,children:e})},t)}function re(e){return e.type===O||e.type===D}function ie(e,t){if(e.type===O){t.notFoundChildren=e.props.children;return}t.selfFound||=(t.selfChildren=e.props.children,t.selfFallback=e.props.fallback,!0)}function j(e,t,n,r){let{segment:i,exact:a=!1,fallback:o,children:s}=e.props,c=n?`${n}.${i}`:i;return!r&&ne(t,c,a)?A(s,c,o):null}function M(e,t,n,r){if(r.selfFound&&t===n){e.push(A(r.selfChildren,`__route-view-self__`,r.selfFallback));return}t===u&&r.notFoundChildren!==null&&e.push(b(m,{children:r.notFoundChildren},`__route-view-not-found__`))}function ae(e,t,n){let r={selfChildren:null,selfFallback:void 0,selfFound:!1,notFoundChildren:null},i=!1,a=[];for(let o of e){if(re(o)){ie(o,r);continue}let e=j(o,t,n,i);e!==null&&(i=!0,a.push(e))}return i||M(a,t,n,r),{rendered:a,activeMatchFound:i}}function N(e,t,n){let[r,i]=l(t);return a(()=>{let n=()=>{i(e=>{let n=t();return Object.is(e,n)?e:n})};return n(),e(n)},[e,t]),r}const P=e(n,`useNavigator`),F=e(t,`useRouter`);function I(e){let t=F(),n=P(),r=w(t,e),{route:i,previousRoute:a}=N(r.subscribe,r.getSnapshot,r.getSnapshot);return s(()=>({navigator:n,route:i,previousRoute:a}),[n,i,a])}function L({nodeName:e,children:t}){let{route:n}=I(e),r=s(()=>{let e=[];return k(t,e),e},[t]),i=n?.name,a=s(()=>i===void 0?[]:ae(r,i,e).rendered,[r,i,e]);return a.length>0?b(y,{children:a}):null}L.displayName=`RouteView`;const oe=Object.assign(L,{Match:E,Self:D,NotFound:O}),se=Object.freeze({}),R=Object.freeze({}),z=`data-real-router-announcer`,B=Object.freeze({destroy:()=>{}});function V(e,t){if(typeof document>`u`)return B;let n=t?.prefix??`Navigated to `,r=t?.getAnnouncementText,i=!0,a=!1,o=!1,s=``,c=null,l,u=H(),d=(e,t)=>{s=e,clearTimeout(l),u.textContent=e,l=setTimeout(()=>{u.textContent=``,s=``},7e3),G(t)},f=setTimeout(()=>{if(a=!0,c!==null&&!o){let e=c;c=null,d(e,document.querySelector(`h1`))}},100),p=e.subscribe(({route:e})=>{if(i){i=!1;return}requestAnimationFrame(()=>{requestAnimationFrame(()=>{if(o)return;let t=document.querySelector(`h1`),i=W(e,n,r,t);if(!(!i||i===s)){if(!a){c=i;return}d(i,t)}})})});return{destroy(){o=!0,p(),clearTimeout(l),clearTimeout(f),U()}}}function H(){let e=document.querySelector(`[${z}]`);if(e)return e;let t=document.createElement(`div`);return t.setAttribute(`style`,`position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);clip-path:inset(50%);white-space:nowrap;border:0`),t.setAttribute(`aria-live`,`assertive`),t.setAttribute(`aria-atomic`,`true`),t.setAttribute(z,``),(document.body??document.documentElement).prepend(t),t}function U(){document.querySelector(`[${z}]`)?.remove()}function W(e,t,n,r){if(n)try{let t=n(e);if(t)return t}catch(e){console.error(`[real-router] getAnnouncementText threw; falling back to default resolution.`,e)}let i=(r?.textContent??``).trim(),a=e.name.startsWith(`@@`)?``:e.name;return`${t}${i||document.title||a||globalThis.location.pathname}`}function G(e){e&&(e.hasAttribute(`tabindex`)||e.setAttribute(`tabindex`,`-1`),e.focus({preventScroll:!0}))}const K=Object.freeze({destroy:()=>{}});function ce(e,t){if(globalThis.window===void 0)return K;let n=t?.mode??`restore`;if(n===`native`)return K;let r=t?.anchorScrolling??!0,i=t?.scrollContainer,a=t?.behavior??`auto`,o=t?.storageKey??`real-router:scroll`,s,c=()=>{if(s!==void 0)return s;try{let e=sessionStorage.getItem(o);s=e?JSON.parse(e):{}}catch{s={}}return s},l=(e,t)=>{try{let n=c();if(n[e]===t)return;n[e]=t,sessionStorage.setItem(o,JSON.stringify(n))}catch{}},u=history.scrollRestoration;try{history.scrollRestoration=`manual`}catch{}let d=()=>{let e=i?.();return e?e.scrollTop:globalThis.scrollY},f=e=>{let t=i?.();t?t.scrollTo({top:e,left:0,behavior:a}):globalThis.scrollTo({top:e,left:0,behavior:a})},p=e=>{if(!i){globalThis.scrollTo({top:e,left:0,behavior:a});return}let t=0,n=()=>{if(h)return;let r=i();if(r){if(r.scrollTo({top:e,left:0,behavior:a}),a!==`smooth`&&Math.abs(r.scrollTop-e)<=1)return}else globalThis.scrollTo({top:e,left:0,behavior:a});t>=10||(t+=1,requestAnimationFrame(n))};n()},m=e=>{let t=e.context?.url?.hash;if(t!==void 0){if(r&&t.length>0){let e=document.getElementById(t);if(e){e.scrollIntoView({behavior:a});return}}f(0);return}let n=globalThis.location.hash;if(r&&n.length>1){let e;try{e=decodeURIComponent(n.slice(1))}catch{e=n.slice(1)}let t=document.getElementById(e);if(t){t.scrollIntoView({behavior:a});return}}f(0)},h=!1,g=!1,_=e=>{try{return le(e)}catch{return g||(g=!0,console.error(`[real-router] scroll-restore: route "${e.name}" has params that cannot be canonicalized (e.g. BigInt or cyclic structure). Scroll position will not be captured or restored for this route.`)),null}},v=e.subscribe(({route:e,previousRoute:t})=>{let r=e.context.navigation;if(t){let e=_(t);e!==null&&l(e,d())}requestAnimationFrame(()=>{if(!h){if(n===`top`){m(e);return}if(e.transition.reload||r?.navigationType===`reload`){let t=_(e);p(t===null?0:c()[t]??0);return}if(r?.direction===`back`||r?.navigationType===`traverse`){let t=_(e);p(t===null?0:c()[t]??0);return}e.transition.replace||r?.navigationType===`replace`||m(e)}})}),y=()=>{let t=e.getState();if(t){let e=_(t);e!==null&&l(e,d())}};return globalThis.addEventListener(`pagehide`,y),{destroy:()=>{if(!h){h=!0,v(),globalThis.removeEventListener(`pagehide`,y);try{history.scrollRestoration=u}catch{}}}}}const q=new WeakMap;function le(e){let t=q.get(e);if(t!==void 0)return t;let n=`${e.name}:${ue(e.params)}`;return q.set(e,n),n}function ue(e){return JSON.stringify(e,de)}function de(e,t){if(typeof t==`function`)return`<fn>`;if(typeof t==`symbol`)return`<sym>`;if(typeof t==`object`&&t&&!Array.isArray(t)){let e=Object.create(null),n=Object.keys(t).sort((e,t)=>e.localeCompare(t));for(let r of n)e[r]=t[r];return e}return t}const J=Object.freeze({destroy:()=>{}}),Y=e=>e.context?.url,fe=e=>{let t=null,n=1/0,r=null,i=-1/0;for(let a of e){if(!a.isIntersecting)continue;let e=a.rootBounds?.top??0,o=a.boundingClientRect.top-e;o>=0?o<n&&(t=a,n=o):o>i&&(r=a,i=o)}return t??r},pe=(e,t)=>{let n=null,r=e=>{let n=e.context;n&&n.url===void 0&&(console.warn(`[real-router] scroll-spy: state.context.url is not claimed. Spy requires browser-plugin or navigation-plugin. Disabling.`),t())},i=e.getState();if(i)r(i);else{let t=!1;n=e.subscribe(({route:e})=>{t||(t=!0,r(e),n?.(),n=null)})}return{destroy(){n?.(),n=null}}},me=e=>{let t=!1,n=null,r=null,i=null,a=()=>{n!==null&&(clearTimeout(n),n=null),i&&(r??globalThis).removeEventListener(`scrollend`,i),i=null,r=null,t=!1};return{get active(){return t},start(){a(),t=!0;let o=()=>{a()};i=o,r=e(),(r??globalThis).addEventListener(`scrollend`,o,{once:!0}),n=setTimeout(o,500)},destroy(){a()}}},he=(e,t)=>{let n=null,r=null;return{schedule(){n===null&&(n=requestAnimationFrame(()=>{n=null,r!==null&&clearTimeout(r),r=setTimeout(()=>{r=null,e()},t)}))},destroy(){n!==null&&(cancelAnimationFrame(n),n=null),r!==null&&(clearTimeout(r),r=null)}}},ge=(e,t,n,r,i,a)=>{let o=new Set,s=new Map,c=!1,l=null,u=new IntersectionObserver(e=>{if(!a()){for(let t of e)s.set(t.target,t);r()}},{root:n(),rootMargin:t,threshold:0}),d=()=>{let t=n()??document,r;try{r=t.querySelectorAll(e)}catch{i();return}let a=new Set;for(let e of r){let t=e.id;t&&!c&&(a.has(t)&&(c=!0,console.warn(`[real-router] scroll-spy: duplicate id "${t}" observed. Selection picks the topmost visible match deterministically.`)),a.add(t)),!o.has(e)&&(u.observe(e),o.add(e))}},f=()=>{for(let e of o)e.isConnected||(u.unobserve(e),o.delete(e),s.delete(e));d()};d();let p=n()??document.body,m=new MutationObserver(()=>{l!==null&&clearTimeout(l),l=setTimeout(()=>{l=null,f()},250)});return m.observe(p,{childList:!0,subtree:!0,attributes:!0,attributeFilter:[`id`]}),{pending:s,destroy(){u.disconnect(),m.disconnect(),l!==null&&(clearTimeout(l),l=null),o.clear(),s.clear()}}};function _e(e,t){if(typeof document>`u`||typeof IntersectionObserver>`u`)return J;let{selector:n}=t;if(!n)return J;let r=t.rootMargin??`-20% 0px -60% 0px`,i=t.scrollContainer,a=()=>i?.()??null,o=!1,s=!1,c=!1,l=()=>s||o,u=null,d=T(e),f=pe(e,()=>{s=!0}),p=me(a),m=he(()=>{u?.()},150),h=ge(n,r,a,()=>{m.schedule()},()=>{s||(s=!0,console.warn(`[real-router] scroll-spy: invalid selector "${n}". Disabling.`))},l);u=()=>{if(o||s){h.pending.clear();return}if(d.getSnapshot().isTransitioning||p.active||h.pending.size===0)return;let t=fe(h.pending.values());if(h.pending.clear(),!t)return;let n=t.target.id;if(!n)return;let r=e.getState();if(!r||n===(Y(r)?.hash??``))return;let i={hash:n,replace:!0,force:!0,hashChange:!0};c=!0,e.navigate(r.name,r.params,i).catch(()=>{}).finally(()=>{c=!1})};let g=e.subscribe(({route:e})=>{c||Y(e)?.hashChanged&&p.start()});return{destroy(){o||(o=!0,g(),h.destroy(),m.destroy(),p.destroy(),f.destroy())}}}const ve=Object.freeze({destroy:()=>{}});function ye(e){if(typeof document>`u`||typeof document.startViewTransition!=`function`)return ve;let t=null,n=null,r=!1,i=()=>{t?.(),t=null},a=e.subscribeLeave(({signal:e})=>{if(!e.aborted)return r=!1,i(),new Promise(a=>{let o=new Promise(e=>{t=e});e.addEventListener(`abort`,()=>{r||(i(),n?.skipTransition?.(),a())},{once:!0});try{n=document.startViewTransition(()=>(a(),o))}catch{i(),a()}})}),o=e.subscribe(()=>{let e=t;r=!0,t=null,e===null?n=null:setTimeout(()=>{e(),n=null},0)});return{destroy:()=>{a(),o(),n?.skipTransition?.(),n=null,i()}}}function be(e){return e.button===0&&!e.metaKey&&!e.altKey&&!e.ctrlKey&&!e.shiftKey}const xe=/%[\dA-Fa-f]{2}/;function Se(e){if(xe.test(e))try{return encodeURI(decodeURIComponent(e)).replaceAll(`#`,`%23`)}catch{}return encodeURI(e).replaceAll(`#`,`%23`)}function Ce(e,t,n,r){try{let i=r?.hash,a;i!==void 0&&(a=i.startsWith(`#`)?i.slice(1):i);let o=e.buildUrl;if(o){let e=o(t,n,a===void 0?void 0:{hash:a});if(typeof e==`string`&&e.length>0)return e}let s=e.buildPath(t,n);if(typeof s!=`string`||s.length===0){console.error(`[real-router] Route "${t}" yielded an empty path. The element will render without an href attribute.`);return}return a?`${s}#${Se(a)}`:s}catch{console.error(`[real-router] Route "${t}" is not defined. The element will render without an href attribute.`);return}}function we(e,t,n,r,i){let a={...i};r!==void 0&&(a.hash=r);let o=e.getState();if(o?.name===t&&Z(o.params,n)){let e=o.context?.url?.hash??``;e!==(r??e)&&(a.force=!0,a.hashChange=!0)}return e.navigate(t,n,a)}const Te=/\s/,Ee=/\S+/g;function X(e){return e?Te.test(e)?e.match(Ee)??[]:[e]:[]}function De(e,t,n){if(e&&t){let e=X(t);if(e.length===0)return n??void 0;if(!n)return e.join(` `);let r=X(n),i=new Set(r);for(let t of e)i.has(t)||(i.add(t),r.push(t));return r.join(` `)}return n??void 0}function Z(e,t){if(Object.is(e,t))return!0;if(!e||!t)return!1;let n=Object.keys(e);if(n.length!==Object.keys(t).length)return!1;let r=e,i=t;for(let e of n)if(!Object.prototype.hasOwnProperty.call(t,e)||!Object.is(r[e],i[e]))return!1;return!0}function Oe(e,t,n=!1,r=!0,i){let a=F(),o=s(()=>i===void 0?{strict:n,ignoreQueryParams:r}:{strict:n,ignoreQueryParams:r,hash:i},[n,r,i]),c=s(()=>S(a,e,t,o),[a,e,t,o]);return N(c.subscribe,c.getSnapshot,c.getSnapshot)}function ke(e,t){return e.routeName===t.routeName&&e.className===t.className&&e.activeClassName===t.activeClassName&&e.activeStrict===t.activeStrict&&e.ignoreQueryParams===t.ignoreQueryParams&&e.onClick===t.onClick&&e.target===t.target&&e.style===t.style&&e.children===t.children&&e.hash===t.hash&&Z(e.routeParams,t.routeParams)&&Z(e.routeOptions,t.routeOptions)}const Q=v(({routeName:e,routeParams:t=se,routeOptions:n=R,className:r,activeClassName:i=`active`,activeStrict:a=!1,ignoreQueryParams:o=!0,hash:s,onClick:c,target:l,children:u,...d})=>{let f=F(),p=Oe(e,t,a,o,s),m=Ce(f,e,t,s===void 0?void 0:{hash:s}),h=r=>{c&&(c(r),r.defaultPrevented)||!be(r)||l===`_blank`||(r.preventDefault(),we(f,e,t,s,n).catch(()=>{}))},g=De(p,i,r);return b(`a`,{...d,href:m,className:g,onClick:h,children:u})},ke);Q.displayName=`Link`;function Ae({children:e,fallback:t,onError:n}){let r=C(F()),i=N(r.subscribe,r.getSnapshot,r.getSnapshot),s=c(n);return o(()=>{s.current=n}),a(()=>{i.error&&s.current?.(i.error,i.toRoute,i.fromRoute)},[i.version]),x(m,{children:[e,i.error?t(i.error,i.resetError):null]})}const $=()=>f(te(F()).getTree());function je(){let e=T(F());return N(e.subscribe,e.getSnapshot,e.getSnapshot)}function Me(e,t){let n=F(),r=c(e),i=t?.skipSameRoute??!0;o(()=>{r.current=e}),a(()=>n.subscribeLeave(({route:e,nextRoute:t,signal:n})=>{if(!(i&&e.name===t.name)&&!n.aborted)return r.current({route:e,nextRoute:t,signal:n})}),[n,i])}function Ne(e,t){let{route:n,previousRoute:r}=i(),s=c(e),l=c(null),u=t?.skipSameRoute??!0;o(()=>{s.current=e}),a(()=>{n.transition.from&&(u&&n.transition.from===n.name||l.current===n||!r||(l.current=n,s.current({route:n,previousRoute:r})))},[n,r,u])}const Pe=({router:e,children:i,announceNavigation:o,scrollRestoration:c,scrollSpy:l,viewTransitions:u})=>{a(()=>{if(!o)return;let t=V(e);return()=>{t.destroy()}},[o,e]);let f=c?.mode,p=c?.anchorScrolling,m=c?.behavior,h=c?.storageKey,g=c!==void 0;a(()=>{if(!g)return;let t=ce(e,{mode:f,anchorScrolling:p,behavior:m,storageKey:h,scrollContainer:c.scrollContainer});return()=>{t.destroy()}},[e,g,f,p,m,h]);let _=l?.selector,v=l?.rootMargin,y=l!==void 0&&_!==void 0&&_!==``;a(()=>{if(!y)return;let t=_e(e,{selector:_,rootMargin:v,scrollContainer:l.scrollContainer});return()=>{t.destroy()}},[e,y,_,v]),a(()=>{if(!u)return;let t=ye(e);return()=>{t.destroy()}},[e,u]);let x=d(e),S=s(()=>ee(e),[e]),{route:C,previousRoute:w}=N(S.subscribe,S.getSnapshot,S.getSnapshot),T=s(()=>({navigator:x,route:C,previousRoute:w}),[x,C,w]);return b(t.Provider,{value:e,children:b(n.Provider,{value:x,children:b(r.Provider,{value:T,children:i})})})};export{Q as Link,n as NavigatorContext,r as RouteContext,oe as RouteView,t as RouterContext,Ae as RouterErrorBoundary,Pe as RouterProvider,P as useNavigator,i as useRoute,Ne as useRouteEnter,Me as useRouteExit,I as useRouteNode,$ as useRouteUtils,F as useRouter,je as useRouterTransition};
2
2
  //# sourceMappingURL=index.mjs.map