specnav-next 0.2.1 → 0.2.2

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @specnav/next
2
2
 
3
+ ## 0.2.2
4
+
5
+ ### Patch Changes
6
+
7
+ - Fix build output to generate .mjs files for ESM instead of .js files, matching package.json exports configuration
8
+ - Updated dependencies
9
+ - specnav-core@0.2.1
10
+
3
11
  ## 0.2.0
4
12
 
5
13
  ### Minor Changes
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 specnav contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/dist/index.js CHANGED
@@ -1,6 +1,8 @@
1
- import { createContext, useState, useRef, useEffect, useContext } from 'react';
2
- import { createAdaptiveMode, createCacheManager, createMorpher, createSpeculativeRenderer, createNavigationGraphLearner, createTrajectoryEngine } from 'specnav-core';
3
- import { jsxs, jsx } from 'react/jsx-runtime';
1
+ 'use strict';
2
+
3
+ var react = require('react');
4
+ var specnavCore = require('specnav-core');
5
+ var jsxRuntime = require('react/jsx-runtime');
4
6
 
5
7
  var __defProp = Object.defineProperty;
6
8
  var __getOwnPropNames = Object.getOwnPropertyNames;
@@ -46,9 +48,9 @@ var init_prefetch = __esm({
46
48
  inflightRequests = /* @__PURE__ */ new Map();
47
49
  }
48
50
  });
49
- var NavigationContext = createContext(null);
51
+ var NavigationContext = react.createContext(null);
50
52
  function useNavigationContext() {
51
- const ctx = useContext(NavigationContext);
53
+ const ctx = react.useContext(NavigationContext);
52
54
  if (!ctx) throw new Error("useNavigationContext must be used within NavigateProvider");
53
55
  return ctx;
54
56
  }
@@ -64,18 +66,18 @@ function NavigateProvider({
64
66
  onNavigateEnd,
65
67
  onCacheHit
66
68
  }) {
67
- const [isNavigating, setIsNavigating] = useState(false);
68
- const [pendingHref, setPendingHref] = useState(null);
69
- const [progress, setProgress] = useState(0);
70
- const [cacheHits, setCacheHits] = useState(0);
71
- const [cacheMisses, setCacheMisses] = useState(0);
72
- const navigationStartTime = useRef(null);
73
- const [trajectory, setTrajectory] = useState(null);
74
- const [cache, setCache] = useState(null);
75
- const [morpher, setMorpher] = useState(null);
76
- const [speculator, setSpeculator] = useState(null);
77
- const [graph, setGraph] = useState(null);
78
- const [adaptive, setAdaptive] = useState(null);
69
+ const [isNavigating, setIsNavigating] = react.useState(false);
70
+ const [pendingHref, setPendingHref] = react.useState(null);
71
+ const [progress, setProgress] = react.useState(0);
72
+ const [cacheHits, setCacheHits] = react.useState(0);
73
+ const [cacheMisses, setCacheMisses] = react.useState(0);
74
+ const navigationStartTime = react.useRef(null);
75
+ const [trajectory, setTrajectory] = react.useState(null);
76
+ const [cache, setCache] = react.useState(null);
77
+ const [morpher, setMorpher] = react.useState(null);
78
+ const [speculator, setSpeculator] = react.useState(null);
79
+ const [graph, setGraph] = react.useState(null);
80
+ const [adaptive, setAdaptive] = react.useState(null);
79
81
  const wrappedSetNavigating = (href) => {
80
82
  if (href) {
81
83
  navigationStartTime.current = Date.now();
@@ -90,17 +92,17 @@ function NavigateProvider({
90
92
  setIsNavigating(!!href);
91
93
  setPendingHref(href);
92
94
  };
93
- useEffect(() => {
94
- const adaptiveEngine = createAdaptiveMode();
95
- const cacheEngine = createCacheManager(cacheConfig, {
95
+ react.useEffect(() => {
96
+ const adaptiveEngine = specnavCore.createAdaptiveMode();
97
+ const cacheEngine = specnavCore.createCacheManager(cacheConfig, {
96
98
  onCacheHit: (href, layer) => {
97
99
  setCacheHits((prev) => prev + 1);
98
100
  onCacheHit?.(href, layer);
99
101
  }
100
102
  });
101
- const morpherEngine = createMorpher(morphConfig);
102
- const speculatorEngine = createSpeculativeRenderer(3);
103
- const graphEngine = createNavigationGraphLearner(graphConfig);
103
+ const morpherEngine = specnavCore.createMorpher(morphConfig);
104
+ const speculatorEngine = specnavCore.createSpeculativeRenderer(3);
105
+ const graphEngine = specnavCore.createNavigationGraphLearner(graphConfig);
104
106
  adaptiveEngine.waitForInit().then(() => {
105
107
  setAdaptive(adaptiveEngine);
106
108
  setCache(cacheEngine);
@@ -109,7 +111,7 @@ function NavigateProvider({
109
111
  setGraph(graphEngine);
110
112
  const effectiveStrategy = adaptiveEngine.getStrategy(strategy);
111
113
  if (effectiveStrategy !== "off" && prefetchConfig?.mode === "trajectory") {
112
- const trajectoryEngine = createTrajectoryEngine(prefetchConfig.trajectory, {
114
+ const trajectoryEngine = specnavCore.createTrajectoryEngine(prefetchConfig.trajectory, {
113
115
  onPrediction: async (href) => {
114
116
  if (!adaptiveEngine?.shouldPrefetch()) return;
115
117
  const { prefetchPage: prefetchPage2 } = await Promise.resolve().then(() => (init_prefetch(), prefetch_exports));
@@ -170,8 +172,8 @@ function NavigateProvider({
170
172
  setProgress,
171
173
  incrementCacheMiss: () => setCacheMisses((prev) => prev + 1)
172
174
  };
173
- return /* @__PURE__ */ jsxs(NavigationContext.Provider, { value, children: [
174
- progressConfig?.enabled !== false && /* @__PURE__ */ jsx(ProgressBar, { config: progressConfig, progress, isNavigating }),
175
+ return /* @__PURE__ */ jsxRuntime.jsxs(NavigationContext.Provider, { value, children: [
176
+ progressConfig?.enabled !== false && /* @__PURE__ */ jsxRuntime.jsx(ProgressBar, { config: progressConfig, progress, isNavigating }),
175
177
  children
176
178
  ] });
177
179
  }
@@ -183,7 +185,7 @@ function ProgressBar({
183
185
  const color = config?.color ?? "#6366f1";
184
186
  const height = config?.height ?? 3;
185
187
  const position = config?.position ?? "top";
186
- return /* @__PURE__ */ jsx(
188
+ return /* @__PURE__ */ jsxRuntime.jsx(
187
189
  "div",
188
190
  {
189
191
  style: {
@@ -195,7 +197,7 @@ function ProgressBar({
195
197
  zIndex: 9999,
196
198
  pointerEvents: "none"
197
199
  },
198
- children: /* @__PURE__ */ jsx(
200
+ children: /* @__PURE__ */ jsxRuntime.jsx(
199
201
  "div",
200
202
  {
201
203
  style: {
@@ -222,8 +224,8 @@ function Link({
222
224
  ...props
223
225
  }) {
224
226
  const ctx = useNavigationContext();
225
- const linkRef = useRef(null);
226
- const abortControllerRef = useRef(null);
227
+ const linkRef = react.useRef(null);
228
+ const abortControllerRef = react.useRef(null);
227
229
  const isSafeUrl = (url) => {
228
230
  try {
229
231
  const parsed = new URL(url, window.location.origin);
@@ -232,7 +234,7 @@ function Link({
232
234
  return false;
233
235
  }
234
236
  };
235
- useEffect(() => {
237
+ react.useEffect(() => {
236
238
  if (!linkRef.current || !ctx.trajectory || prefetch === false) return;
237
239
  const element = linkRef.current;
238
240
  ctx.trajectory.registerLink(href, element);
@@ -359,7 +361,7 @@ function Link({
359
361
  window.location.href = href;
360
362
  }
361
363
  };
362
- return /* @__PURE__ */ jsx(
364
+ return /* @__PURE__ */ jsxRuntime.jsx(
363
365
  "a",
364
366
  {
365
367
  ref: linkRef,
@@ -513,16 +515,16 @@ function useNavigate() {
513
515
  }
514
516
  function useNavigationState() {
515
517
  const ctx = useNavigationContext();
516
- const [previousHref, setPreviousHref] = useState(null);
517
- const [lastNavigationMs, setLastNavigationMs] = useState(0);
518
- const [startTime, setStartTime] = useState(null);
519
- useEffect(() => {
518
+ const [previousHref, setPreviousHref] = react.useState(null);
519
+ const [lastNavigationMs, setLastNavigationMs] = react.useState(0);
520
+ const [startTime, setStartTime] = react.useState(null);
521
+ react.useEffect(() => {
520
522
  if (ctx.isNavigating && ctx.pendingHref) {
521
523
  setPreviousHref(window.location.pathname);
522
524
  setStartTime(Date.now());
523
525
  }
524
526
  }, [ctx.isNavigating, ctx.pendingHref]);
525
- useEffect(() => {
527
+ react.useEffect(() => {
526
528
  if (!ctx.isNavigating && startTime !== null) {
527
529
  setLastNavigationMs(Date.now() - startTime);
528
530
  setStartTime(null);
@@ -542,6 +544,9 @@ function useNavigationState() {
542
544
  };
543
545
  }
544
546
 
545
- export { Link, NavigateProvider, useNavigate, useNavigationState };
547
+ exports.Link = Link;
548
+ exports.NavigateProvider = NavigateProvider;
549
+ exports.useNavigate = useNavigate;
550
+ exports.useNavigationState = useNavigationState;
546
551
  //# sourceMappingURL=index.js.map
547
552
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/prefetch.ts","../src/NavigateProvider.tsx","../src/Link.tsx","../src/useNavigate.ts","../src/useNavigationState.ts"],"names":["prefetchPage","useRef","useEffect","jsx","useState"],"mappings":"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","file":"index.js","sourcesContent":["// Shared prefetch logic and request deduplication\n\nexport const inflightRequests = new Map<string, Promise<string>>();\n\nexport async function prefetchPage(\n href: string,\n cache: any,\n speculator: any\n): Promise<void> {\n if (inflightRequests.has(href)) {\n await inflightRequests.get(href);\n return;\n }\n\n const controller = new AbortController();\n const fetchPromise = fetch(href, {\n headers: { \"x-specnav\": \"1\" },\n signal: controller.signal,\n })\n .then((res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.text();\n })\n .then((html) => {\n if (cache) cache.set(href, html);\n if (speculator) speculator.speculate(href, html);\n return html;\n })\n .finally(() => {\n inflightRequests.delete(href);\n });\n\n inflightRequests.set(href, fetchPromise);\n await fetchPromise;\n}\n","\"use client\";\n\nimport { createContext, useContext, useEffect, useState, useRef } from \"react\";\nimport {\n createTrajectoryEngine,\n createCacheManager,\n createMorpher,\n createSpeculativeRenderer,\n createNavigationGraphLearner,\n createAdaptiveMode,\n type TrajectoryEngine,\n type CacheManager,\n type DOMmorpher,\n type SpeculativeRenderer,\n type NavigationGraphLearner,\n type AdaptiveMode,\n} from \"specnav-core\";\nimport type { NavigateProviderProps } from \"./types\";\n\ninterface NavigationContextValue {\n trajectory: TrajectoryEngine | null;\n cache: CacheManager | null;\n morpher: DOMmorpher | null;\n speculator: SpeculativeRenderer | null;\n graph: NavigationGraphLearner | null;\n adaptive: AdaptiveMode | null;\n isNavigating: boolean;\n pendingHref: string | null;\n progress: number;\n cacheHits: number;\n cacheMisses: number;\n setNavigating: (href: string | null) => void;\n setProgress: (progress: number) => void;\n incrementCacheMiss: () => void;\n}\n\nconst NavigationContext = createContext<NavigationContextValue | null>(null);\n\nexport function useNavigationContext() {\n const ctx = useContext(NavigationContext);\n if (!ctx) throw new Error(\"useNavigationContext must be used within NavigateProvider\");\n return ctx;\n}\n\nexport function NavigateProvider({\n children,\n strategy = \"auto\",\n cache: cacheConfig,\n prefetch: prefetchConfig,\n progress: progressConfig,\n morph: morphConfig,\n graph: graphConfig,\n onNavigateStart,\n onNavigateEnd,\n onCacheHit,\n}: NavigateProviderProps) {\n const [isNavigating, setIsNavigating] = useState(false);\n const [pendingHref, setPendingHref] = useState<string | null>(null);\n const [progress, setProgress] = useState(0);\n const [cacheHits, setCacheHits] = useState(0);\n const [cacheMisses, setCacheMisses] = useState(0);\n const navigationStartTime = useRef<number | null>(null);\n\n const [trajectory, setTrajectory] = useState<TrajectoryEngine | null>(null);\n const [cache, setCache] = useState<CacheManager | null>(null);\n const [morpher, setMorpher] = useState<DOMmorpher | null>(null);\n const [speculator, setSpeculator] = useState<SpeculativeRenderer | null>(null);\n const [graph, setGraph] = useState<NavigationGraphLearner | null>(null);\n const [adaptive, setAdaptive] = useState<AdaptiveMode | null>(null);\n\n const wrappedSetNavigating = (href: string | null) => {\n if (href) {\n navigationStartTime.current = Date.now();\n onNavigateStart?.(href);\n } else if (navigationStartTime.current) {\n const duration = Date.now() - navigationStartTime.current;\n if (pendingHref) {\n onNavigateEnd?.(pendingHref, duration);\n }\n navigationStartTime.current = null;\n }\n setIsNavigating(!!href);\n setPendingHref(href);\n };\n\n useEffect(() => {\n // Initialize engines\n const adaptiveEngine = createAdaptiveMode();\n \n const cacheEngine = createCacheManager(cacheConfig, {\n onCacheHit: (href, layer) => {\n setCacheHits(prev => prev + 1);\n onCacheHit?.(href, layer);\n },\n });\n\n const morpherEngine = createMorpher(morphConfig);\n const speculatorEngine = createSpeculativeRenderer(3);\n const graphEngine = createNavigationGraphLearner(graphConfig);\n\n // Wait for adaptive to initialize before setting state\n adaptiveEngine.waitForInit().then(() => {\n setAdaptive(adaptiveEngine);\n setCache(cacheEngine);\n setMorpher(morpherEngine);\n setSpeculator(speculatorEngine);\n setGraph(graphEngine);\n\n const effectiveStrategy = adaptiveEngine.getStrategy(strategy);\n\n if (effectiveStrategy !== \"off\" && prefetchConfig?.mode === \"trajectory\") {\n const trajectoryEngine = createTrajectoryEngine(prefetchConfig.trajectory, {\n onPrediction: async (href: string) => {\n if (!adaptiveEngine?.shouldPrefetch()) return;\n const { prefetchPage } = await import(\"./prefetch\");\n await prefetchPage(href, cacheEngine, speculatorEngine);\n },\n onCancel: (href) => {\n speculatorEngine?.cancel(href);\n },\n });\n\n trajectoryEngine.start();\n setTrajectory(trajectoryEngine);\n }\n });\n\n // Handle browser back/forward\n const handlePopState = async (e: PopStateEvent) => {\n if (!e.state?.specnav) return;\n\n const href = window.location.pathname;\n wrappedSetNavigating(href);\n setProgress(0.3);\n\n try {\n // Try cache first (should be instant)\n const html = await cache?.get(href);\n \n if (html && morpher) {\n setProgress(0.7);\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n const newContent = doc.body;\n\n morpher.morph(document.body, newContent);\n setProgress(1);\n setTimeout(() => wrappedSetNavigating(null), 100);\n } else {\n // Fallback to full reload\n window.location.reload();\n }\n } catch (error) {\n console.error(\"Popstate navigation failed:\", error);\n window.location.reload();\n }\n };\n\n window.addEventListener(\"popstate\", handlePopState);\n\n return () => {\n trajectory?.stop();\n cache?.destroy();\n speculator?.cancelAll();\n window.removeEventListener(\"popstate\", handlePopState);\n };\n }, [strategy, cacheConfig, prefetchConfig, morphConfig, graphConfig, onCacheHit, onNavigateEnd]);\n\n const value: NavigationContextValue = {\n trajectory,\n cache,\n morpher,\n speculator,\n graph,\n adaptive,\n isNavigating,\n pendingHref,\n progress,\n cacheHits,\n cacheMisses,\n setNavigating: wrappedSetNavigating,\n setProgress,\n incrementCacheMiss: () => setCacheMisses(prev => prev + 1),\n };\n\n return (\n <NavigationContext.Provider value={value}>\n {progressConfig?.enabled !== false && (\n <ProgressBar config={progressConfig} progress={progress} isNavigating={isNavigating} />\n )}\n {children}\n </NavigationContext.Provider>\n );\n}\n\nfunction ProgressBar({\n config,\n progress,\n isNavigating,\n}: {\n config: any;\n progress: number;\n isNavigating: boolean;\n}) {\n const color = config?.color ?? \"#6366f1\";\n const height = config?.height ?? 3;\n const position = config?.position ?? \"top\";\n\n return (\n <div\n style={{\n position: \"fixed\",\n [position]: 0,\n left: 0,\n right: 0,\n height: `${height}px`,\n zIndex: 9999,\n pointerEvents: \"none\",\n }}\n >\n <div\n style={{\n height: \"100%\",\n width: `${progress * 100}%`,\n background: color,\n transition: isNavigating ? \"width 200ms ease\" : \"opacity 200ms ease\",\n opacity: isNavigating ? 1 : 0,\n }}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useRef } from \"react\";\nimport { useNavigationContext } from \"./NavigateProvider\";\nimport type { LinkProps } from \"./types\";\nimport { inflightRequests } from \"./prefetch\";\n\nexport function Link({\n href,\n prefetch = \"trajectory\",\n morph = true,\n cache = true,\n replace = false,\n scroll = true,\n children,\n ...props\n}: LinkProps) {\n const ctx = useNavigationContext();\n const linkRef = useRef<HTMLAnchorElement>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n // Validate URL is same-origin for security\n const isSafeUrl = (url: string): boolean => {\n try {\n const parsed = new URL(url, window.location.origin);\n return parsed.origin === window.location.origin;\n } catch {\n return false;\n }\n };\n\n useEffect(() => {\n if (!linkRef.current || !ctx.trajectory || prefetch === false) return;\n\n const element = linkRef.current;\n ctx.trajectory.registerLink(href, element);\n\n return () => {\n ctx.trajectory?.unregisterLink(element);\n abortControllerRef.current?.abort();\n };\n }, [href, ctx.trajectory, prefetch]);\n\n // Hover prefetch\n const handleMouseEnter = async () => {\n if (prefetch === \"hover\" && ctx.adaptive?.shouldPrefetch()) {\n await prefetchPage(href);\n }\n };\n\n const handleMouseLeave = () => {\n // Cleanup if needed\n };\n\n // Focus prefetch (keyboard navigation)\n const handleFocus = async () => {\n if (ctx.adaptive?.shouldPrefetch()) {\n await prefetchPage(href);\n }\n };\n\n const prefetchPage = async (url: string): Promise<void> => {\n if (!isSafeUrl(url) || !ctx.cache) return;\n\n // Check if already cached\n const cached = await ctx.cache.get(url);\n if (cached) return;\n\n // Check if already in-flight\n if (inflightRequests.has(url)) {\n await inflightRequests.get(url);\n return;\n }\n\n // Start new request\n abortControllerRef.current = new AbortController();\n const fetchPromise = fetch(url, {\n headers: { \"x-specnav\": \"1\" },\n signal: abortControllerRef.current.signal,\n })\n .then((res) => res.text())\n .then((html) => {\n ctx.cache?.set(url, html);\n // Speculative render if enabled\n if (ctx.speculator && ctx.adaptive?.shouldSpeculate()) {\n ctx.speculator.speculate(url, html);\n }\n return html;\n })\n .catch((err) => {\n if (err.name !== \"AbortError\") {\n console.warn(\"Prefetch failed:\", err);\n }\n throw err;\n })\n .finally(() => {\n inflightRequests.delete(url);\n });\n\n inflightRequests.set(url, fetchPromise);\n await fetchPromise;\n };\n\n const handleClick = async (e: React.MouseEvent<HTMLAnchorElement>) => {\n // Allow default behavior for modified clicks\n if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;\n \n e.preventDefault();\n\n if (!isSafeUrl(href)) {\n window.location.href = href;\n return;\n }\n\n if (!morph || !ctx.morpher || !ctx.cache) {\n window.location.href = href;\n return;\n }\n\n ctx.setNavigating(href);\n ctx.setProgress(0.3);\n\n // Timeout to prevent infinite hangs\n const timeoutId = setTimeout(() => {\n console.error(\"Navigation timeout\");\n ctx.setNavigating(null);\n window.location.href = href;\n }, 10000); // 10 second timeout\n\n try {\n // Check speculative render first\n let newContent = ctx.speculator?.get(href);\n \n if (!newContent) {\n // Check cache\n let html = cache ? await ctx.cache.get(href) : null;\n\n if (!html) {\n ctx.incrementCacheMiss();\n ctx.setProgress(0.5);\n // Deduplicate requests\n if (inflightRequests.has(href)) {\n html = await inflightRequests.get(href)!;\n } else {\n const controller = new AbortController();\n const fetchPromise = fetch(href, {\n headers: { \"x-specnav\": \"1\" },\n signal: controller.signal,\n }).then((res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.text();\n });\n \n inflightRequests.set(href, fetchPromise);\n html = await fetchPromise;\n inflightRequests.delete(href);\n }\n\n if (cache) {\n await ctx.cache.set(href, html);\n }\n }\n\n ctx.setProgress(0.7);\n\n // Parse HTML\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n newContent = doc.body;\n }\n\n ctx.setProgress(0.9);\n\n // Morph DOM with optional View Transitions\n if (\n \"startViewTransition\" in document &&\n ctx.adaptive?.shouldUseTransitions()\n ) {\n await (document as any).startViewTransition(() => {\n ctx.morpher?.morph(document.body, newContent!);\n }).finished;\n } else {\n ctx.morpher?.morph(document.body, newContent);\n }\n\n // Record navigation in graph (capture before URL change)\n const currentHref = window.location.pathname;\n\n // Update URL\n if (replace) {\n window.history.replaceState({ specnav: true }, \"\", href);\n } else {\n window.history.pushState({ specnav: true }, \"\", href);\n }\n\n ctx.graph?.recordNavigation(currentHref, href);\n\n // Scroll to top if requested\n if (scroll) {\n window.scrollTo(0, 0);\n }\n\n clearTimeout(timeoutId);\n ctx.setProgress(1);\n setTimeout(() => ctx.setNavigating(null), 200);\n } catch (error) {\n clearTimeout(timeoutId);\n console.error(\"Navigation failed:\", error);\n ctx.setNavigating(null);\n window.location.href = href;\n }\n };\n\n return (\n <a\n ref={linkRef}\n href={href}\n onClick={handleClick}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onFocus={handleFocus}\n {...props}\n >\n {children}\n </a>\n );\n}\n","\"use client\";\n\nimport { useNavigationContext } from \"./NavigateProvider\";\nimport type { UseNavigateReturn, NavigateOptions } from \"./types\";\nimport { inflightRequests } from \"./prefetch\";\n\nexport function useNavigate(): UseNavigateReturn {\n const ctx = useNavigationContext();\n\n const isSafeUrl = (url: string): boolean => {\n try {\n const parsed = new URL(url, window.location.origin);\n return parsed.origin === window.location.origin;\n } catch {\n return false;\n }\n };\n\n const navigate = async (href: string, options: NavigateOptions = {}) => {\n const {\n replace = false,\n scroll = true,\n morph = true,\n cache: useCache = true,\n } = options;\n\n if (!isSafeUrl(href)) {\n window.location.href = href;\n return;\n }\n\n if (!morph || !ctx.morpher || !ctx.cache) {\n window.location.href = href;\n return;\n }\n\n ctx.setNavigating(href);\n ctx.setProgress(0.3);\n\n try {\n // Check speculative render first\n let newContent = ctx.speculator?.get(href);\n\n if (!newContent) {\n let html = useCache ? await ctx.cache.get(href) : null;\n\n if (!html) {\n ctx.setProgress(0.5);\n \n // Deduplicate requests\n if (inflightRequests.has(href)) {\n html = await inflightRequests.get(href)!;\n } else {\n const controller = new AbortController();\n const fetchPromise = fetch(href, {\n headers: { \"x-specnav\": \"1\" },\n signal: controller.signal,\n }).then((res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.text();\n });\n\n inflightRequests.set(href, fetchPromise);\n html = await fetchPromise;\n inflightRequests.delete(href);\n }\n\n if (useCache) {\n await ctx.cache.set(href, html);\n }\n }\n\n ctx.setProgress(0.7);\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n newContent = doc.body;\n }\n\n ctx.setProgress(0.9);\n\n if (\n \"startViewTransition\" in document &&\n ctx.adaptive?.shouldUseTransitions()\n ) {\n await (document as any).startViewTransition(() => {\n ctx.morpher?.morph(document.body, newContent!);\n }).finished;\n } else {\n ctx.morpher?.morph(document.body, newContent);\n }\n\n const currentHref = window.location.pathname;\n\n if (replace) {\n window.history.replaceState({ specnav: true }, \"\", href);\n } else {\n window.history.pushState({ specnav: true }, \"\", href);\n }\n\n ctx.graph?.recordNavigation(currentHref, href);\n\n if (scroll) {\n window.scrollTo(0, 0);\n }\n\n ctx.setProgress(1);\n setTimeout(() => ctx.setNavigating(null), 200);\n } catch (error) {\n console.error(\"Navigation failed:\", error);\n ctx.setNavigating(null);\n window.location.href = href;\n }\n };\n\n const back = () => {\n window.history.back();\n };\n\n const forward = () => {\n window.history.forward();\n };\n\n const prefetch = async (href: string) => {\n if (!ctx.cache || !isSafeUrl(href)) return;\n\n try {\n // Check if already in-flight\n if (inflightRequests.has(href)) {\n await inflightRequests.get(href);\n return;\n }\n\n const controller = new AbortController();\n const fetchPromise = fetch(href, {\n headers: { \"x-specnav\": \"1\" },\n signal: controller.signal,\n })\n .then((res) => res.text())\n .then((html) => {\n ctx.cache?.set(href, html);\n // Speculative render if enabled\n if (ctx.speculator && ctx.adaptive?.shouldSpeculate()) {\n ctx.speculator.speculate(href, html);\n }\n return html;\n })\n .finally(() => {\n inflightRequests.delete(href);\n });\n\n inflightRequests.set(href, fetchPromise);\n await fetchPromise;\n } catch (error) {\n if ((error as Error).name !== \"AbortError\") {\n console.warn(\"Prefetch failed:\", error);\n }\n }\n };\n\n const clearCache = (href?: string) => {\n ctx.cache?.clear(href);\n if (href) {\n ctx.speculator?.cancel(href);\n } else {\n ctx.speculator?.cancelAll();\n }\n };\n\n return {\n navigate,\n back,\n forward,\n prefetch,\n clearCache,\n isNavigating: ctx.isNavigating,\n pendingHref: ctx.pendingHref,\n };\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { useNavigationContext } from \"./NavigateProvider\";\nimport type { UseNavigationStateReturn } from \"./types\";\n\nexport function useNavigationState(): UseNavigationStateReturn {\n const ctx = useNavigationContext();\n const [previousHref, setPreviousHref] = useState<string | null>(null);\n const [lastNavigationMs, setLastNavigationMs] = useState(0);\n const [startTime, setStartTime] = useState<number | null>(null);\n\n // Track navigation start\n useEffect(() => {\n if (ctx.isNavigating && ctx.pendingHref) {\n setPreviousHref(window.location.pathname);\n setStartTime(Date.now());\n }\n }, [ctx.isNavigating, ctx.pendingHref]);\n\n // Track navigation end (event-driven)\n useEffect(() => {\n if (!ctx.isNavigating && startTime !== null) {\n setLastNavigationMs(Date.now() - startTime);\n setStartTime(null);\n }\n }, [ctx.isNavigating, startTime]);\n\n const cacheSize = ctx.cache?.getSize() ?? 0;\n const totalRequests = ctx.cacheHits + ctx.cacheMisses;\n const cacheHitRate = totalRequests > 0 ? ctx.cacheHits / totalRequests : 0;\n\n return {\n isNavigating: ctx.isNavigating,\n pendingHref: ctx.pendingHref,\n previousHref,\n cacheSize,\n cacheHitRate,\n lastNavigationMs,\n progress: ctx.progress,\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/prefetch.ts","../src/NavigateProvider.tsx","../src/Link.tsx","../src/useNavigate.ts","../src/useNavigationState.ts"],"names":["createContext","useContext","useState","useRef","useEffect","createAdaptiveMode","createCacheManager","createMorpher","createSpeculativeRenderer","createNavigationGraphLearner","createTrajectoryEngine","prefetchPage","jsxs","jsx"],"mappings":"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","file":"index.js","sourcesContent":["// Shared prefetch logic and request deduplication\n\nexport const inflightRequests = new Map<string, Promise<string>>();\n\nexport async function prefetchPage(\n href: string,\n cache: any,\n speculator: any\n): Promise<void> {\n if (inflightRequests.has(href)) {\n await inflightRequests.get(href);\n return;\n }\n\n const controller = new AbortController();\n const fetchPromise = fetch(href, {\n headers: { \"x-specnav\": \"1\" },\n signal: controller.signal,\n })\n .then((res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.text();\n })\n .then((html) => {\n if (cache) cache.set(href, html);\n if (speculator) speculator.speculate(href, html);\n return html;\n })\n .finally(() => {\n inflightRequests.delete(href);\n });\n\n inflightRequests.set(href, fetchPromise);\n await fetchPromise;\n}\n","\"use client\";\n\nimport { createContext, useContext, useEffect, useState, useRef } from \"react\";\nimport {\n createTrajectoryEngine,\n createCacheManager,\n createMorpher,\n createSpeculativeRenderer,\n createNavigationGraphLearner,\n createAdaptiveMode,\n type TrajectoryEngine,\n type CacheManager,\n type DOMmorpher,\n type SpeculativeRenderer,\n type NavigationGraphLearner,\n type AdaptiveMode,\n} from \"specnav-core\";\nimport type { NavigateProviderProps } from \"./types\";\n\ninterface NavigationContextValue {\n trajectory: TrajectoryEngine | null;\n cache: CacheManager | null;\n morpher: DOMmorpher | null;\n speculator: SpeculativeRenderer | null;\n graph: NavigationGraphLearner | null;\n adaptive: AdaptiveMode | null;\n isNavigating: boolean;\n pendingHref: string | null;\n progress: number;\n cacheHits: number;\n cacheMisses: number;\n setNavigating: (href: string | null) => void;\n setProgress: (progress: number) => void;\n incrementCacheMiss: () => void;\n}\n\nconst NavigationContext = createContext<NavigationContextValue | null>(null);\n\nexport function useNavigationContext() {\n const ctx = useContext(NavigationContext);\n if (!ctx) throw new Error(\"useNavigationContext must be used within NavigateProvider\");\n return ctx;\n}\n\nexport function NavigateProvider({\n children,\n strategy = \"auto\",\n cache: cacheConfig,\n prefetch: prefetchConfig,\n progress: progressConfig,\n morph: morphConfig,\n graph: graphConfig,\n onNavigateStart,\n onNavigateEnd,\n onCacheHit,\n}: NavigateProviderProps) {\n const [isNavigating, setIsNavigating] = useState(false);\n const [pendingHref, setPendingHref] = useState<string | null>(null);\n const [progress, setProgress] = useState(0);\n const [cacheHits, setCacheHits] = useState(0);\n const [cacheMisses, setCacheMisses] = useState(0);\n const navigationStartTime = useRef<number | null>(null);\n\n const [trajectory, setTrajectory] = useState<TrajectoryEngine | null>(null);\n const [cache, setCache] = useState<CacheManager | null>(null);\n const [morpher, setMorpher] = useState<DOMmorpher | null>(null);\n const [speculator, setSpeculator] = useState<SpeculativeRenderer | null>(null);\n const [graph, setGraph] = useState<NavigationGraphLearner | null>(null);\n const [adaptive, setAdaptive] = useState<AdaptiveMode | null>(null);\n\n const wrappedSetNavigating = (href: string | null) => {\n if (href) {\n navigationStartTime.current = Date.now();\n onNavigateStart?.(href);\n } else if (navigationStartTime.current) {\n const duration = Date.now() - navigationStartTime.current;\n if (pendingHref) {\n onNavigateEnd?.(pendingHref, duration);\n }\n navigationStartTime.current = null;\n }\n setIsNavigating(!!href);\n setPendingHref(href);\n };\n\n useEffect(() => {\n // Initialize engines\n const adaptiveEngine = createAdaptiveMode();\n \n const cacheEngine = createCacheManager(cacheConfig, {\n onCacheHit: (href, layer) => {\n setCacheHits(prev => prev + 1);\n onCacheHit?.(href, layer);\n },\n });\n\n const morpherEngine = createMorpher(morphConfig);\n const speculatorEngine = createSpeculativeRenderer(3);\n const graphEngine = createNavigationGraphLearner(graphConfig);\n\n // Wait for adaptive to initialize before setting state\n adaptiveEngine.waitForInit().then(() => {\n setAdaptive(adaptiveEngine);\n setCache(cacheEngine);\n setMorpher(morpherEngine);\n setSpeculator(speculatorEngine);\n setGraph(graphEngine);\n\n const effectiveStrategy = adaptiveEngine.getStrategy(strategy);\n\n if (effectiveStrategy !== \"off\" && prefetchConfig?.mode === \"trajectory\") {\n const trajectoryEngine = createTrajectoryEngine(prefetchConfig.trajectory, {\n onPrediction: async (href: string) => {\n if (!adaptiveEngine?.shouldPrefetch()) return;\n const { prefetchPage } = await import(\"./prefetch\");\n await prefetchPage(href, cacheEngine, speculatorEngine);\n },\n onCancel: (href) => {\n speculatorEngine?.cancel(href);\n },\n });\n\n trajectoryEngine.start();\n setTrajectory(trajectoryEngine);\n }\n });\n\n // Handle browser back/forward\n const handlePopState = async (e: PopStateEvent) => {\n if (!e.state?.specnav) return;\n\n const href = window.location.pathname;\n wrappedSetNavigating(href);\n setProgress(0.3);\n\n try {\n // Try cache first (should be instant)\n const html = await cache?.get(href);\n \n if (html && morpher) {\n setProgress(0.7);\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n const newContent = doc.body;\n\n morpher.morph(document.body, newContent);\n setProgress(1);\n setTimeout(() => wrappedSetNavigating(null), 100);\n } else {\n // Fallback to full reload\n window.location.reload();\n }\n } catch (error) {\n console.error(\"Popstate navigation failed:\", error);\n window.location.reload();\n }\n };\n\n window.addEventListener(\"popstate\", handlePopState);\n\n return () => {\n trajectory?.stop();\n cache?.destroy();\n speculator?.cancelAll();\n window.removeEventListener(\"popstate\", handlePopState);\n };\n }, [strategy, cacheConfig, prefetchConfig, morphConfig, graphConfig, onCacheHit, onNavigateEnd]);\n\n const value: NavigationContextValue = {\n trajectory,\n cache,\n morpher,\n speculator,\n graph,\n adaptive,\n isNavigating,\n pendingHref,\n progress,\n cacheHits,\n cacheMisses,\n setNavigating: wrappedSetNavigating,\n setProgress,\n incrementCacheMiss: () => setCacheMisses(prev => prev + 1),\n };\n\n return (\n <NavigationContext.Provider value={value}>\n {progressConfig?.enabled !== false && (\n <ProgressBar config={progressConfig} progress={progress} isNavigating={isNavigating} />\n )}\n {children}\n </NavigationContext.Provider>\n );\n}\n\nfunction ProgressBar({\n config,\n progress,\n isNavigating,\n}: {\n config: any;\n progress: number;\n isNavigating: boolean;\n}) {\n const color = config?.color ?? \"#6366f1\";\n const height = config?.height ?? 3;\n const position = config?.position ?? \"top\";\n\n return (\n <div\n style={{\n position: \"fixed\",\n [position]: 0,\n left: 0,\n right: 0,\n height: `${height}px`,\n zIndex: 9999,\n pointerEvents: \"none\",\n }}\n >\n <div\n style={{\n height: \"100%\",\n width: `${progress * 100}%`,\n background: color,\n transition: isNavigating ? \"width 200ms ease\" : \"opacity 200ms ease\",\n opacity: isNavigating ? 1 : 0,\n }}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useRef } from \"react\";\nimport { useNavigationContext } from \"./NavigateProvider\";\nimport type { LinkProps } from \"./types\";\nimport { inflightRequests } from \"./prefetch\";\n\nexport function Link({\n href,\n prefetch = \"trajectory\",\n morph = true,\n cache = true,\n replace = false,\n scroll = true,\n children,\n ...props\n}: LinkProps) {\n const ctx = useNavigationContext();\n const linkRef = useRef<HTMLAnchorElement>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n // Validate URL is same-origin for security\n const isSafeUrl = (url: string): boolean => {\n try {\n const parsed = new URL(url, window.location.origin);\n return parsed.origin === window.location.origin;\n } catch {\n return false;\n }\n };\n\n useEffect(() => {\n if (!linkRef.current || !ctx.trajectory || prefetch === false) return;\n\n const element = linkRef.current;\n ctx.trajectory.registerLink(href, element);\n\n return () => {\n ctx.trajectory?.unregisterLink(element);\n abortControllerRef.current?.abort();\n };\n }, [href, ctx.trajectory, prefetch]);\n\n // Hover prefetch\n const handleMouseEnter = async () => {\n if (prefetch === \"hover\" && ctx.adaptive?.shouldPrefetch()) {\n await prefetchPage(href);\n }\n };\n\n const handleMouseLeave = () => {\n // Cleanup if needed\n };\n\n // Focus prefetch (keyboard navigation)\n const handleFocus = async () => {\n if (ctx.adaptive?.shouldPrefetch()) {\n await prefetchPage(href);\n }\n };\n\n const prefetchPage = async (url: string): Promise<void> => {\n if (!isSafeUrl(url) || !ctx.cache) return;\n\n // Check if already cached\n const cached = await ctx.cache.get(url);\n if (cached) return;\n\n // Check if already in-flight\n if (inflightRequests.has(url)) {\n await inflightRequests.get(url);\n return;\n }\n\n // Start new request\n abortControllerRef.current = new AbortController();\n const fetchPromise = fetch(url, {\n headers: { \"x-specnav\": \"1\" },\n signal: abortControllerRef.current.signal,\n })\n .then((res) => res.text())\n .then((html) => {\n ctx.cache?.set(url, html);\n // Speculative render if enabled\n if (ctx.speculator && ctx.adaptive?.shouldSpeculate()) {\n ctx.speculator.speculate(url, html);\n }\n return html;\n })\n .catch((err) => {\n if (err.name !== \"AbortError\") {\n console.warn(\"Prefetch failed:\", err);\n }\n throw err;\n })\n .finally(() => {\n inflightRequests.delete(url);\n });\n\n inflightRequests.set(url, fetchPromise);\n await fetchPromise;\n };\n\n const handleClick = async (e: React.MouseEvent<HTMLAnchorElement>) => {\n // Allow default behavior for modified clicks\n if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;\n \n e.preventDefault();\n\n if (!isSafeUrl(href)) {\n window.location.href = href;\n return;\n }\n\n if (!morph || !ctx.morpher || !ctx.cache) {\n window.location.href = href;\n return;\n }\n\n ctx.setNavigating(href);\n ctx.setProgress(0.3);\n\n // Timeout to prevent infinite hangs\n const timeoutId = setTimeout(() => {\n console.error(\"Navigation timeout\");\n ctx.setNavigating(null);\n window.location.href = href;\n }, 10000); // 10 second timeout\n\n try {\n // Check speculative render first\n let newContent = ctx.speculator?.get(href);\n \n if (!newContent) {\n // Check cache\n let html = cache ? await ctx.cache.get(href) : null;\n\n if (!html) {\n ctx.incrementCacheMiss();\n ctx.setProgress(0.5);\n // Deduplicate requests\n if (inflightRequests.has(href)) {\n html = await inflightRequests.get(href)!;\n } else {\n const controller = new AbortController();\n const fetchPromise = fetch(href, {\n headers: { \"x-specnav\": \"1\" },\n signal: controller.signal,\n }).then((res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.text();\n });\n \n inflightRequests.set(href, fetchPromise);\n html = await fetchPromise;\n inflightRequests.delete(href);\n }\n\n if (cache) {\n await ctx.cache.set(href, html);\n }\n }\n\n ctx.setProgress(0.7);\n\n // Parse HTML\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n newContent = doc.body;\n }\n\n ctx.setProgress(0.9);\n\n // Morph DOM with optional View Transitions\n if (\n \"startViewTransition\" in document &&\n ctx.adaptive?.shouldUseTransitions()\n ) {\n await (document as any).startViewTransition(() => {\n ctx.morpher?.morph(document.body, newContent!);\n }).finished;\n } else {\n ctx.morpher?.morph(document.body, newContent);\n }\n\n // Record navigation in graph (capture before URL change)\n const currentHref = window.location.pathname;\n\n // Update URL\n if (replace) {\n window.history.replaceState({ specnav: true }, \"\", href);\n } else {\n window.history.pushState({ specnav: true }, \"\", href);\n }\n\n ctx.graph?.recordNavigation(currentHref, href);\n\n // Scroll to top if requested\n if (scroll) {\n window.scrollTo(0, 0);\n }\n\n clearTimeout(timeoutId);\n ctx.setProgress(1);\n setTimeout(() => ctx.setNavigating(null), 200);\n } catch (error) {\n clearTimeout(timeoutId);\n console.error(\"Navigation failed:\", error);\n ctx.setNavigating(null);\n window.location.href = href;\n }\n };\n\n return (\n <a\n ref={linkRef}\n href={href}\n onClick={handleClick}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onFocus={handleFocus}\n {...props}\n >\n {children}\n </a>\n );\n}\n","\"use client\";\n\nimport { useNavigationContext } from \"./NavigateProvider\";\nimport type { UseNavigateReturn, NavigateOptions } from \"./types\";\nimport { inflightRequests } from \"./prefetch\";\n\nexport function useNavigate(): UseNavigateReturn {\n const ctx = useNavigationContext();\n\n const isSafeUrl = (url: string): boolean => {\n try {\n const parsed = new URL(url, window.location.origin);\n return parsed.origin === window.location.origin;\n } catch {\n return false;\n }\n };\n\n const navigate = async (href: string, options: NavigateOptions = {}) => {\n const {\n replace = false,\n scroll = true,\n morph = true,\n cache: useCache = true,\n } = options;\n\n if (!isSafeUrl(href)) {\n window.location.href = href;\n return;\n }\n\n if (!morph || !ctx.morpher || !ctx.cache) {\n window.location.href = href;\n return;\n }\n\n ctx.setNavigating(href);\n ctx.setProgress(0.3);\n\n try {\n // Check speculative render first\n let newContent = ctx.speculator?.get(href);\n\n if (!newContent) {\n let html = useCache ? await ctx.cache.get(href) : null;\n\n if (!html) {\n ctx.setProgress(0.5);\n \n // Deduplicate requests\n if (inflightRequests.has(href)) {\n html = await inflightRequests.get(href)!;\n } else {\n const controller = new AbortController();\n const fetchPromise = fetch(href, {\n headers: { \"x-specnav\": \"1\" },\n signal: controller.signal,\n }).then((res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.text();\n });\n\n inflightRequests.set(href, fetchPromise);\n html = await fetchPromise;\n inflightRequests.delete(href);\n }\n\n if (useCache) {\n await ctx.cache.set(href, html);\n }\n }\n\n ctx.setProgress(0.7);\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n newContent = doc.body;\n }\n\n ctx.setProgress(0.9);\n\n if (\n \"startViewTransition\" in document &&\n ctx.adaptive?.shouldUseTransitions()\n ) {\n await (document as any).startViewTransition(() => {\n ctx.morpher?.morph(document.body, newContent!);\n }).finished;\n } else {\n ctx.morpher?.morph(document.body, newContent);\n }\n\n const currentHref = window.location.pathname;\n\n if (replace) {\n window.history.replaceState({ specnav: true }, \"\", href);\n } else {\n window.history.pushState({ specnav: true }, \"\", href);\n }\n\n ctx.graph?.recordNavigation(currentHref, href);\n\n if (scroll) {\n window.scrollTo(0, 0);\n }\n\n ctx.setProgress(1);\n setTimeout(() => ctx.setNavigating(null), 200);\n } catch (error) {\n console.error(\"Navigation failed:\", error);\n ctx.setNavigating(null);\n window.location.href = href;\n }\n };\n\n const back = () => {\n window.history.back();\n };\n\n const forward = () => {\n window.history.forward();\n };\n\n const prefetch = async (href: string) => {\n if (!ctx.cache || !isSafeUrl(href)) return;\n\n try {\n // Check if already in-flight\n if (inflightRequests.has(href)) {\n await inflightRequests.get(href);\n return;\n }\n\n const controller = new AbortController();\n const fetchPromise = fetch(href, {\n headers: { \"x-specnav\": \"1\" },\n signal: controller.signal,\n })\n .then((res) => res.text())\n .then((html) => {\n ctx.cache?.set(href, html);\n // Speculative render if enabled\n if (ctx.speculator && ctx.adaptive?.shouldSpeculate()) {\n ctx.speculator.speculate(href, html);\n }\n return html;\n })\n .finally(() => {\n inflightRequests.delete(href);\n });\n\n inflightRequests.set(href, fetchPromise);\n await fetchPromise;\n } catch (error) {\n if ((error as Error).name !== \"AbortError\") {\n console.warn(\"Prefetch failed:\", error);\n }\n }\n };\n\n const clearCache = (href?: string) => {\n ctx.cache?.clear(href);\n if (href) {\n ctx.speculator?.cancel(href);\n } else {\n ctx.speculator?.cancelAll();\n }\n };\n\n return {\n navigate,\n back,\n forward,\n prefetch,\n clearCache,\n isNavigating: ctx.isNavigating,\n pendingHref: ctx.pendingHref,\n };\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { useNavigationContext } from \"./NavigateProvider\";\nimport type { UseNavigationStateReturn } from \"./types\";\n\nexport function useNavigationState(): UseNavigationStateReturn {\n const ctx = useNavigationContext();\n const [previousHref, setPreviousHref] = useState<string | null>(null);\n const [lastNavigationMs, setLastNavigationMs] = useState(0);\n const [startTime, setStartTime] = useState<number | null>(null);\n\n // Track navigation start\n useEffect(() => {\n if (ctx.isNavigating && ctx.pendingHref) {\n setPreviousHref(window.location.pathname);\n setStartTime(Date.now());\n }\n }, [ctx.isNavigating, ctx.pendingHref]);\n\n // Track navigation end (event-driven)\n useEffect(() => {\n if (!ctx.isNavigating && startTime !== null) {\n setLastNavigationMs(Date.now() - startTime);\n setStartTime(null);\n }\n }, [ctx.isNavigating, startTime]);\n\n const cacheSize = ctx.cache?.getSize() ?? 0;\n const totalRequests = ctx.cacheHits + ctx.cacheMisses;\n const cacheHitRate = totalRequests > 0 ? ctx.cacheHits / totalRequests : 0;\n\n return {\n isNavigating: ctx.isNavigating,\n pendingHref: ctx.pendingHref,\n previousHref,\n cacheSize,\n cacheHitRate,\n lastNavigationMs,\n progress: ctx.progress,\n };\n}\n"]}
@@ -1,8 +1,6 @@
1
- 'use strict';
2
-
3
- var react = require('react');
4
- var specnavCore = require('specnav-core');
5
- var jsxRuntime = require('react/jsx-runtime');
1
+ import { createContext, useState, useRef, useEffect, useContext } from 'react';
2
+ import { createAdaptiveMode, createCacheManager, createMorpher, createSpeculativeRenderer, createNavigationGraphLearner, createTrajectoryEngine } from 'specnav-core';
3
+ import { jsxs, jsx } from 'react/jsx-runtime';
6
4
 
7
5
  var __defProp = Object.defineProperty;
8
6
  var __getOwnPropNames = Object.getOwnPropertyNames;
@@ -48,9 +46,9 @@ var init_prefetch = __esm({
48
46
  inflightRequests = /* @__PURE__ */ new Map();
49
47
  }
50
48
  });
51
- var NavigationContext = react.createContext(null);
49
+ var NavigationContext = createContext(null);
52
50
  function useNavigationContext() {
53
- const ctx = react.useContext(NavigationContext);
51
+ const ctx = useContext(NavigationContext);
54
52
  if (!ctx) throw new Error("useNavigationContext must be used within NavigateProvider");
55
53
  return ctx;
56
54
  }
@@ -66,18 +64,18 @@ function NavigateProvider({
66
64
  onNavigateEnd,
67
65
  onCacheHit
68
66
  }) {
69
- const [isNavigating, setIsNavigating] = react.useState(false);
70
- const [pendingHref, setPendingHref] = react.useState(null);
71
- const [progress, setProgress] = react.useState(0);
72
- const [cacheHits, setCacheHits] = react.useState(0);
73
- const [cacheMisses, setCacheMisses] = react.useState(0);
74
- const navigationStartTime = react.useRef(null);
75
- const [trajectory, setTrajectory] = react.useState(null);
76
- const [cache, setCache] = react.useState(null);
77
- const [morpher, setMorpher] = react.useState(null);
78
- const [speculator, setSpeculator] = react.useState(null);
79
- const [graph, setGraph] = react.useState(null);
80
- const [adaptive, setAdaptive] = react.useState(null);
67
+ const [isNavigating, setIsNavigating] = useState(false);
68
+ const [pendingHref, setPendingHref] = useState(null);
69
+ const [progress, setProgress] = useState(0);
70
+ const [cacheHits, setCacheHits] = useState(0);
71
+ const [cacheMisses, setCacheMisses] = useState(0);
72
+ const navigationStartTime = useRef(null);
73
+ const [trajectory, setTrajectory] = useState(null);
74
+ const [cache, setCache] = useState(null);
75
+ const [morpher, setMorpher] = useState(null);
76
+ const [speculator, setSpeculator] = useState(null);
77
+ const [graph, setGraph] = useState(null);
78
+ const [adaptive, setAdaptive] = useState(null);
81
79
  const wrappedSetNavigating = (href) => {
82
80
  if (href) {
83
81
  navigationStartTime.current = Date.now();
@@ -92,17 +90,17 @@ function NavigateProvider({
92
90
  setIsNavigating(!!href);
93
91
  setPendingHref(href);
94
92
  };
95
- react.useEffect(() => {
96
- const adaptiveEngine = specnavCore.createAdaptiveMode();
97
- const cacheEngine = specnavCore.createCacheManager(cacheConfig, {
93
+ useEffect(() => {
94
+ const adaptiveEngine = createAdaptiveMode();
95
+ const cacheEngine = createCacheManager(cacheConfig, {
98
96
  onCacheHit: (href, layer) => {
99
97
  setCacheHits((prev) => prev + 1);
100
98
  onCacheHit?.(href, layer);
101
99
  }
102
100
  });
103
- const morpherEngine = specnavCore.createMorpher(morphConfig);
104
- const speculatorEngine = specnavCore.createSpeculativeRenderer(3);
105
- const graphEngine = specnavCore.createNavigationGraphLearner(graphConfig);
101
+ const morpherEngine = createMorpher(morphConfig);
102
+ const speculatorEngine = createSpeculativeRenderer(3);
103
+ const graphEngine = createNavigationGraphLearner(graphConfig);
106
104
  adaptiveEngine.waitForInit().then(() => {
107
105
  setAdaptive(adaptiveEngine);
108
106
  setCache(cacheEngine);
@@ -111,7 +109,7 @@ function NavigateProvider({
111
109
  setGraph(graphEngine);
112
110
  const effectiveStrategy = adaptiveEngine.getStrategy(strategy);
113
111
  if (effectiveStrategy !== "off" && prefetchConfig?.mode === "trajectory") {
114
- const trajectoryEngine = specnavCore.createTrajectoryEngine(prefetchConfig.trajectory, {
112
+ const trajectoryEngine = createTrajectoryEngine(prefetchConfig.trajectory, {
115
113
  onPrediction: async (href) => {
116
114
  if (!adaptiveEngine?.shouldPrefetch()) return;
117
115
  const { prefetchPage: prefetchPage2 } = await Promise.resolve().then(() => (init_prefetch(), prefetch_exports));
@@ -172,8 +170,8 @@ function NavigateProvider({
172
170
  setProgress,
173
171
  incrementCacheMiss: () => setCacheMisses((prev) => prev + 1)
174
172
  };
175
- return /* @__PURE__ */ jsxRuntime.jsxs(NavigationContext.Provider, { value, children: [
176
- progressConfig?.enabled !== false && /* @__PURE__ */ jsxRuntime.jsx(ProgressBar, { config: progressConfig, progress, isNavigating }),
173
+ return /* @__PURE__ */ jsxs(NavigationContext.Provider, { value, children: [
174
+ progressConfig?.enabled !== false && /* @__PURE__ */ jsx(ProgressBar, { config: progressConfig, progress, isNavigating }),
177
175
  children
178
176
  ] });
179
177
  }
@@ -185,7 +183,7 @@ function ProgressBar({
185
183
  const color = config?.color ?? "#6366f1";
186
184
  const height = config?.height ?? 3;
187
185
  const position = config?.position ?? "top";
188
- return /* @__PURE__ */ jsxRuntime.jsx(
186
+ return /* @__PURE__ */ jsx(
189
187
  "div",
190
188
  {
191
189
  style: {
@@ -197,7 +195,7 @@ function ProgressBar({
197
195
  zIndex: 9999,
198
196
  pointerEvents: "none"
199
197
  },
200
- children: /* @__PURE__ */ jsxRuntime.jsx(
198
+ children: /* @__PURE__ */ jsx(
201
199
  "div",
202
200
  {
203
201
  style: {
@@ -224,8 +222,8 @@ function Link({
224
222
  ...props
225
223
  }) {
226
224
  const ctx = useNavigationContext();
227
- const linkRef = react.useRef(null);
228
- const abortControllerRef = react.useRef(null);
225
+ const linkRef = useRef(null);
226
+ const abortControllerRef = useRef(null);
229
227
  const isSafeUrl = (url) => {
230
228
  try {
231
229
  const parsed = new URL(url, window.location.origin);
@@ -234,7 +232,7 @@ function Link({
234
232
  return false;
235
233
  }
236
234
  };
237
- react.useEffect(() => {
235
+ useEffect(() => {
238
236
  if (!linkRef.current || !ctx.trajectory || prefetch === false) return;
239
237
  const element = linkRef.current;
240
238
  ctx.trajectory.registerLink(href, element);
@@ -361,7 +359,7 @@ function Link({
361
359
  window.location.href = href;
362
360
  }
363
361
  };
364
- return /* @__PURE__ */ jsxRuntime.jsx(
362
+ return /* @__PURE__ */ jsx(
365
363
  "a",
366
364
  {
367
365
  ref: linkRef,
@@ -515,16 +513,16 @@ function useNavigate() {
515
513
  }
516
514
  function useNavigationState() {
517
515
  const ctx = useNavigationContext();
518
- const [previousHref, setPreviousHref] = react.useState(null);
519
- const [lastNavigationMs, setLastNavigationMs] = react.useState(0);
520
- const [startTime, setStartTime] = react.useState(null);
521
- react.useEffect(() => {
516
+ const [previousHref, setPreviousHref] = useState(null);
517
+ const [lastNavigationMs, setLastNavigationMs] = useState(0);
518
+ const [startTime, setStartTime] = useState(null);
519
+ useEffect(() => {
522
520
  if (ctx.isNavigating && ctx.pendingHref) {
523
521
  setPreviousHref(window.location.pathname);
524
522
  setStartTime(Date.now());
525
523
  }
526
524
  }, [ctx.isNavigating, ctx.pendingHref]);
527
- react.useEffect(() => {
525
+ useEffect(() => {
528
526
  if (!ctx.isNavigating && startTime !== null) {
529
527
  setLastNavigationMs(Date.now() - startTime);
530
528
  setStartTime(null);
@@ -544,9 +542,6 @@ function useNavigationState() {
544
542
  };
545
543
  }
546
544
 
547
- exports.Link = Link;
548
- exports.NavigateProvider = NavigateProvider;
549
- exports.useNavigate = useNavigate;
550
- exports.useNavigationState = useNavigationState;
551
- //# sourceMappingURL=index.cjs.map
552
- //# sourceMappingURL=index.cjs.map
545
+ export { Link, NavigateProvider, useNavigate, useNavigationState };
546
+ //# sourceMappingURL=index.mjs.map
547
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/prefetch.ts","../src/NavigateProvider.tsx","../src/Link.tsx","../src/useNavigate.ts","../src/useNavigationState.ts"],"names":["prefetchPage","useRef","useEffect","jsx","useState"],"mappings":"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","file":"index.mjs","sourcesContent":["// Shared prefetch logic and request deduplication\n\nexport const inflightRequests = new Map<string, Promise<string>>();\n\nexport async function prefetchPage(\n href: string,\n cache: any,\n speculator: any\n): Promise<void> {\n if (inflightRequests.has(href)) {\n await inflightRequests.get(href);\n return;\n }\n\n const controller = new AbortController();\n const fetchPromise = fetch(href, {\n headers: { \"x-specnav\": \"1\" },\n signal: controller.signal,\n })\n .then((res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.text();\n })\n .then((html) => {\n if (cache) cache.set(href, html);\n if (speculator) speculator.speculate(href, html);\n return html;\n })\n .finally(() => {\n inflightRequests.delete(href);\n });\n\n inflightRequests.set(href, fetchPromise);\n await fetchPromise;\n}\n","\"use client\";\n\nimport { createContext, useContext, useEffect, useState, useRef } from \"react\";\nimport {\n createTrajectoryEngine,\n createCacheManager,\n createMorpher,\n createSpeculativeRenderer,\n createNavigationGraphLearner,\n createAdaptiveMode,\n type TrajectoryEngine,\n type CacheManager,\n type DOMmorpher,\n type SpeculativeRenderer,\n type NavigationGraphLearner,\n type AdaptiveMode,\n} from \"specnav-core\";\nimport type { NavigateProviderProps } from \"./types\";\n\ninterface NavigationContextValue {\n trajectory: TrajectoryEngine | null;\n cache: CacheManager | null;\n morpher: DOMmorpher | null;\n speculator: SpeculativeRenderer | null;\n graph: NavigationGraphLearner | null;\n adaptive: AdaptiveMode | null;\n isNavigating: boolean;\n pendingHref: string | null;\n progress: number;\n cacheHits: number;\n cacheMisses: number;\n setNavigating: (href: string | null) => void;\n setProgress: (progress: number) => void;\n incrementCacheMiss: () => void;\n}\n\nconst NavigationContext = createContext<NavigationContextValue | null>(null);\n\nexport function useNavigationContext() {\n const ctx = useContext(NavigationContext);\n if (!ctx) throw new Error(\"useNavigationContext must be used within NavigateProvider\");\n return ctx;\n}\n\nexport function NavigateProvider({\n children,\n strategy = \"auto\",\n cache: cacheConfig,\n prefetch: prefetchConfig,\n progress: progressConfig,\n morph: morphConfig,\n graph: graphConfig,\n onNavigateStart,\n onNavigateEnd,\n onCacheHit,\n}: NavigateProviderProps) {\n const [isNavigating, setIsNavigating] = useState(false);\n const [pendingHref, setPendingHref] = useState<string | null>(null);\n const [progress, setProgress] = useState(0);\n const [cacheHits, setCacheHits] = useState(0);\n const [cacheMisses, setCacheMisses] = useState(0);\n const navigationStartTime = useRef<number | null>(null);\n\n const [trajectory, setTrajectory] = useState<TrajectoryEngine | null>(null);\n const [cache, setCache] = useState<CacheManager | null>(null);\n const [morpher, setMorpher] = useState<DOMmorpher | null>(null);\n const [speculator, setSpeculator] = useState<SpeculativeRenderer | null>(null);\n const [graph, setGraph] = useState<NavigationGraphLearner | null>(null);\n const [adaptive, setAdaptive] = useState<AdaptiveMode | null>(null);\n\n const wrappedSetNavigating = (href: string | null) => {\n if (href) {\n navigationStartTime.current = Date.now();\n onNavigateStart?.(href);\n } else if (navigationStartTime.current) {\n const duration = Date.now() - navigationStartTime.current;\n if (pendingHref) {\n onNavigateEnd?.(pendingHref, duration);\n }\n navigationStartTime.current = null;\n }\n setIsNavigating(!!href);\n setPendingHref(href);\n };\n\n useEffect(() => {\n // Initialize engines\n const adaptiveEngine = createAdaptiveMode();\n \n const cacheEngine = createCacheManager(cacheConfig, {\n onCacheHit: (href, layer) => {\n setCacheHits(prev => prev + 1);\n onCacheHit?.(href, layer);\n },\n });\n\n const morpherEngine = createMorpher(morphConfig);\n const speculatorEngine = createSpeculativeRenderer(3);\n const graphEngine = createNavigationGraphLearner(graphConfig);\n\n // Wait for adaptive to initialize before setting state\n adaptiveEngine.waitForInit().then(() => {\n setAdaptive(adaptiveEngine);\n setCache(cacheEngine);\n setMorpher(morpherEngine);\n setSpeculator(speculatorEngine);\n setGraph(graphEngine);\n\n const effectiveStrategy = adaptiveEngine.getStrategy(strategy);\n\n if (effectiveStrategy !== \"off\" && prefetchConfig?.mode === \"trajectory\") {\n const trajectoryEngine = createTrajectoryEngine(prefetchConfig.trajectory, {\n onPrediction: async (href: string) => {\n if (!adaptiveEngine?.shouldPrefetch()) return;\n const { prefetchPage } = await import(\"./prefetch\");\n await prefetchPage(href, cacheEngine, speculatorEngine);\n },\n onCancel: (href) => {\n speculatorEngine?.cancel(href);\n },\n });\n\n trajectoryEngine.start();\n setTrajectory(trajectoryEngine);\n }\n });\n\n // Handle browser back/forward\n const handlePopState = async (e: PopStateEvent) => {\n if (!e.state?.specnav) return;\n\n const href = window.location.pathname;\n wrappedSetNavigating(href);\n setProgress(0.3);\n\n try {\n // Try cache first (should be instant)\n const html = await cache?.get(href);\n \n if (html && morpher) {\n setProgress(0.7);\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n const newContent = doc.body;\n\n morpher.morph(document.body, newContent);\n setProgress(1);\n setTimeout(() => wrappedSetNavigating(null), 100);\n } else {\n // Fallback to full reload\n window.location.reload();\n }\n } catch (error) {\n console.error(\"Popstate navigation failed:\", error);\n window.location.reload();\n }\n };\n\n window.addEventListener(\"popstate\", handlePopState);\n\n return () => {\n trajectory?.stop();\n cache?.destroy();\n speculator?.cancelAll();\n window.removeEventListener(\"popstate\", handlePopState);\n };\n }, [strategy, cacheConfig, prefetchConfig, morphConfig, graphConfig, onCacheHit, onNavigateEnd]);\n\n const value: NavigationContextValue = {\n trajectory,\n cache,\n morpher,\n speculator,\n graph,\n adaptive,\n isNavigating,\n pendingHref,\n progress,\n cacheHits,\n cacheMisses,\n setNavigating: wrappedSetNavigating,\n setProgress,\n incrementCacheMiss: () => setCacheMisses(prev => prev + 1),\n };\n\n return (\n <NavigationContext.Provider value={value}>\n {progressConfig?.enabled !== false && (\n <ProgressBar config={progressConfig} progress={progress} isNavigating={isNavigating} />\n )}\n {children}\n </NavigationContext.Provider>\n );\n}\n\nfunction ProgressBar({\n config,\n progress,\n isNavigating,\n}: {\n config: any;\n progress: number;\n isNavigating: boolean;\n}) {\n const color = config?.color ?? \"#6366f1\";\n const height = config?.height ?? 3;\n const position = config?.position ?? \"top\";\n\n return (\n <div\n style={{\n position: \"fixed\",\n [position]: 0,\n left: 0,\n right: 0,\n height: `${height}px`,\n zIndex: 9999,\n pointerEvents: \"none\",\n }}\n >\n <div\n style={{\n height: \"100%\",\n width: `${progress * 100}%`,\n background: color,\n transition: isNavigating ? \"width 200ms ease\" : \"opacity 200ms ease\",\n opacity: isNavigating ? 1 : 0,\n }}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useRef } from \"react\";\nimport { useNavigationContext } from \"./NavigateProvider\";\nimport type { LinkProps } from \"./types\";\nimport { inflightRequests } from \"./prefetch\";\n\nexport function Link({\n href,\n prefetch = \"trajectory\",\n morph = true,\n cache = true,\n replace = false,\n scroll = true,\n children,\n ...props\n}: LinkProps) {\n const ctx = useNavigationContext();\n const linkRef = useRef<HTMLAnchorElement>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n // Validate URL is same-origin for security\n const isSafeUrl = (url: string): boolean => {\n try {\n const parsed = new URL(url, window.location.origin);\n return parsed.origin === window.location.origin;\n } catch {\n return false;\n }\n };\n\n useEffect(() => {\n if (!linkRef.current || !ctx.trajectory || prefetch === false) return;\n\n const element = linkRef.current;\n ctx.trajectory.registerLink(href, element);\n\n return () => {\n ctx.trajectory?.unregisterLink(element);\n abortControllerRef.current?.abort();\n };\n }, [href, ctx.trajectory, prefetch]);\n\n // Hover prefetch\n const handleMouseEnter = async () => {\n if (prefetch === \"hover\" && ctx.adaptive?.shouldPrefetch()) {\n await prefetchPage(href);\n }\n };\n\n const handleMouseLeave = () => {\n // Cleanup if needed\n };\n\n // Focus prefetch (keyboard navigation)\n const handleFocus = async () => {\n if (ctx.adaptive?.shouldPrefetch()) {\n await prefetchPage(href);\n }\n };\n\n const prefetchPage = async (url: string): Promise<void> => {\n if (!isSafeUrl(url) || !ctx.cache) return;\n\n // Check if already cached\n const cached = await ctx.cache.get(url);\n if (cached) return;\n\n // Check if already in-flight\n if (inflightRequests.has(url)) {\n await inflightRequests.get(url);\n return;\n }\n\n // Start new request\n abortControllerRef.current = new AbortController();\n const fetchPromise = fetch(url, {\n headers: { \"x-specnav\": \"1\" },\n signal: abortControllerRef.current.signal,\n })\n .then((res) => res.text())\n .then((html) => {\n ctx.cache?.set(url, html);\n // Speculative render if enabled\n if (ctx.speculator && ctx.adaptive?.shouldSpeculate()) {\n ctx.speculator.speculate(url, html);\n }\n return html;\n })\n .catch((err) => {\n if (err.name !== \"AbortError\") {\n console.warn(\"Prefetch failed:\", err);\n }\n throw err;\n })\n .finally(() => {\n inflightRequests.delete(url);\n });\n\n inflightRequests.set(url, fetchPromise);\n await fetchPromise;\n };\n\n const handleClick = async (e: React.MouseEvent<HTMLAnchorElement>) => {\n // Allow default behavior for modified clicks\n if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;\n \n e.preventDefault();\n\n if (!isSafeUrl(href)) {\n window.location.href = href;\n return;\n }\n\n if (!morph || !ctx.morpher || !ctx.cache) {\n window.location.href = href;\n return;\n }\n\n ctx.setNavigating(href);\n ctx.setProgress(0.3);\n\n // Timeout to prevent infinite hangs\n const timeoutId = setTimeout(() => {\n console.error(\"Navigation timeout\");\n ctx.setNavigating(null);\n window.location.href = href;\n }, 10000); // 10 second timeout\n\n try {\n // Check speculative render first\n let newContent = ctx.speculator?.get(href);\n \n if (!newContent) {\n // Check cache\n let html = cache ? await ctx.cache.get(href) : null;\n\n if (!html) {\n ctx.incrementCacheMiss();\n ctx.setProgress(0.5);\n // Deduplicate requests\n if (inflightRequests.has(href)) {\n html = await inflightRequests.get(href)!;\n } else {\n const controller = new AbortController();\n const fetchPromise = fetch(href, {\n headers: { \"x-specnav\": \"1\" },\n signal: controller.signal,\n }).then((res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.text();\n });\n \n inflightRequests.set(href, fetchPromise);\n html = await fetchPromise;\n inflightRequests.delete(href);\n }\n\n if (cache) {\n await ctx.cache.set(href, html);\n }\n }\n\n ctx.setProgress(0.7);\n\n // Parse HTML\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n newContent = doc.body;\n }\n\n ctx.setProgress(0.9);\n\n // Morph DOM with optional View Transitions\n if (\n \"startViewTransition\" in document &&\n ctx.adaptive?.shouldUseTransitions()\n ) {\n await (document as any).startViewTransition(() => {\n ctx.morpher?.morph(document.body, newContent!);\n }).finished;\n } else {\n ctx.morpher?.morph(document.body, newContent);\n }\n\n // Record navigation in graph (capture before URL change)\n const currentHref = window.location.pathname;\n\n // Update URL\n if (replace) {\n window.history.replaceState({ specnav: true }, \"\", href);\n } else {\n window.history.pushState({ specnav: true }, \"\", href);\n }\n\n ctx.graph?.recordNavigation(currentHref, href);\n\n // Scroll to top if requested\n if (scroll) {\n window.scrollTo(0, 0);\n }\n\n clearTimeout(timeoutId);\n ctx.setProgress(1);\n setTimeout(() => ctx.setNavigating(null), 200);\n } catch (error) {\n clearTimeout(timeoutId);\n console.error(\"Navigation failed:\", error);\n ctx.setNavigating(null);\n window.location.href = href;\n }\n };\n\n return (\n <a\n ref={linkRef}\n href={href}\n onClick={handleClick}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onFocus={handleFocus}\n {...props}\n >\n {children}\n </a>\n );\n}\n","\"use client\";\n\nimport { useNavigationContext } from \"./NavigateProvider\";\nimport type { UseNavigateReturn, NavigateOptions } from \"./types\";\nimport { inflightRequests } from \"./prefetch\";\n\nexport function useNavigate(): UseNavigateReturn {\n const ctx = useNavigationContext();\n\n const isSafeUrl = (url: string): boolean => {\n try {\n const parsed = new URL(url, window.location.origin);\n return parsed.origin === window.location.origin;\n } catch {\n return false;\n }\n };\n\n const navigate = async (href: string, options: NavigateOptions = {}) => {\n const {\n replace = false,\n scroll = true,\n morph = true,\n cache: useCache = true,\n } = options;\n\n if (!isSafeUrl(href)) {\n window.location.href = href;\n return;\n }\n\n if (!morph || !ctx.morpher || !ctx.cache) {\n window.location.href = href;\n return;\n }\n\n ctx.setNavigating(href);\n ctx.setProgress(0.3);\n\n try {\n // Check speculative render first\n let newContent = ctx.speculator?.get(href);\n\n if (!newContent) {\n let html = useCache ? await ctx.cache.get(href) : null;\n\n if (!html) {\n ctx.setProgress(0.5);\n \n // Deduplicate requests\n if (inflightRequests.has(href)) {\n html = await inflightRequests.get(href)!;\n } else {\n const controller = new AbortController();\n const fetchPromise = fetch(href, {\n headers: { \"x-specnav\": \"1\" },\n signal: controller.signal,\n }).then((res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.text();\n });\n\n inflightRequests.set(href, fetchPromise);\n html = await fetchPromise;\n inflightRequests.delete(href);\n }\n\n if (useCache) {\n await ctx.cache.set(href, html);\n }\n }\n\n ctx.setProgress(0.7);\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n newContent = doc.body;\n }\n\n ctx.setProgress(0.9);\n\n if (\n \"startViewTransition\" in document &&\n ctx.adaptive?.shouldUseTransitions()\n ) {\n await (document as any).startViewTransition(() => {\n ctx.morpher?.morph(document.body, newContent!);\n }).finished;\n } else {\n ctx.morpher?.morph(document.body, newContent);\n }\n\n const currentHref = window.location.pathname;\n\n if (replace) {\n window.history.replaceState({ specnav: true }, \"\", href);\n } else {\n window.history.pushState({ specnav: true }, \"\", href);\n }\n\n ctx.graph?.recordNavigation(currentHref, href);\n\n if (scroll) {\n window.scrollTo(0, 0);\n }\n\n ctx.setProgress(1);\n setTimeout(() => ctx.setNavigating(null), 200);\n } catch (error) {\n console.error(\"Navigation failed:\", error);\n ctx.setNavigating(null);\n window.location.href = href;\n }\n };\n\n const back = () => {\n window.history.back();\n };\n\n const forward = () => {\n window.history.forward();\n };\n\n const prefetch = async (href: string) => {\n if (!ctx.cache || !isSafeUrl(href)) return;\n\n try {\n // Check if already in-flight\n if (inflightRequests.has(href)) {\n await inflightRequests.get(href);\n return;\n }\n\n const controller = new AbortController();\n const fetchPromise = fetch(href, {\n headers: { \"x-specnav\": \"1\" },\n signal: controller.signal,\n })\n .then((res) => res.text())\n .then((html) => {\n ctx.cache?.set(href, html);\n // Speculative render if enabled\n if (ctx.speculator && ctx.adaptive?.shouldSpeculate()) {\n ctx.speculator.speculate(href, html);\n }\n return html;\n })\n .finally(() => {\n inflightRequests.delete(href);\n });\n\n inflightRequests.set(href, fetchPromise);\n await fetchPromise;\n } catch (error) {\n if ((error as Error).name !== \"AbortError\") {\n console.warn(\"Prefetch failed:\", error);\n }\n }\n };\n\n const clearCache = (href?: string) => {\n ctx.cache?.clear(href);\n if (href) {\n ctx.speculator?.cancel(href);\n } else {\n ctx.speculator?.cancelAll();\n }\n };\n\n return {\n navigate,\n back,\n forward,\n prefetch,\n clearCache,\n isNavigating: ctx.isNavigating,\n pendingHref: ctx.pendingHref,\n };\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { useNavigationContext } from \"./NavigateProvider\";\nimport type { UseNavigationStateReturn } from \"./types\";\n\nexport function useNavigationState(): UseNavigationStateReturn {\n const ctx = useNavigationContext();\n const [previousHref, setPreviousHref] = useState<string | null>(null);\n const [lastNavigationMs, setLastNavigationMs] = useState(0);\n const [startTime, setStartTime] = useState<number | null>(null);\n\n // Track navigation start\n useEffect(() => {\n if (ctx.isNavigating && ctx.pendingHref) {\n setPreviousHref(window.location.pathname);\n setStartTime(Date.now());\n }\n }, [ctx.isNavigating, ctx.pendingHref]);\n\n // Track navigation end (event-driven)\n useEffect(() => {\n if (!ctx.isNavigating && startTime !== null) {\n setLastNavigationMs(Date.now() - startTime);\n setStartTime(null);\n }\n }, [ctx.isNavigating, startTime]);\n\n const cacheSize = ctx.cache?.getSize() ?? 0;\n const totalRequests = ctx.cacheHits + ctx.cacheMisses;\n const cacheHitRate = totalRequests > 0 ? ctx.cacheHits / totalRequests : 0;\n\n return {\n isNavigating: ctx.isNavigating,\n pendingHref: ctx.pendingHref,\n previousHref,\n cacheSize,\n cacheHitRate,\n lastNavigationMs,\n progress: ctx.progress,\n };\n}\n"]}
package/dist/server.js CHANGED
@@ -1,14 +1,20 @@
1
- import React from 'react';
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+
5
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
6
+
7
+ var React__default = /*#__PURE__*/_interopDefault(React);
2
8
 
3
9
  function prefetchHint(hrefs) {
4
10
  const hrefArray = Array.isArray(hrefs) ? hrefs : [hrefs];
5
- return React.createElement("meta", {
11
+ return React__default.default.createElement("meta", {
6
12
  name: "specnav-prefetch",
7
13
  content: JSON.stringify(hrefArray),
8
14
  "data-specnav-hint": "true"
9
15
  });
10
16
  }
11
17
 
12
- export { prefetchHint };
18
+ exports.prefetchHint = prefetchHint;
13
19
  //# sourceMappingURL=server.js.map
14
20
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server.ts"],"names":[],"mappings":";;AAEO,SAAS,aAAa,KAAA,EAA8C;AACzE,EAAA,MAAM,YAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AAEvD,EAAA,OAAO,KAAA,CAAM,cAAc,MAAA,EAAQ;AAAA,IACjC,IAAA,EAAM,kBAAA;AAAA,IACN,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAAA,IACjC,mBAAA,EAAqB;AAAA,GACtB,CAAA;AACH","file":"server.js","sourcesContent":["import React from \"react\";\n\nexport function prefetchHint(hrefs: string | string[]): React.ReactElement {\n const hrefArray = Array.isArray(hrefs) ? hrefs : [hrefs];\n\n return React.createElement(\"meta\", {\n name: \"specnav-prefetch\",\n content: JSON.stringify(hrefArray),\n \"data-specnav-hint\": \"true\",\n });\n}\n"]}
1
+ {"version":3,"sources":["../src/server.ts"],"names":["React"],"mappings":";;;;;;;;AAEO,SAAS,aAAa,KAAA,EAA8C;AACzE,EAAA,MAAM,YAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AAEvD,EAAA,OAAOA,sBAAA,CAAM,cAAc,MAAA,EAAQ;AAAA,IACjC,IAAA,EAAM,kBAAA;AAAA,IACN,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAAA,IACjC,mBAAA,EAAqB;AAAA,GACtB,CAAA;AACH","file":"server.js","sourcesContent":["import React from \"react\";\n\nexport function prefetchHint(hrefs: string | string[]): React.ReactElement {\n const hrefArray = Array.isArray(hrefs) ? hrefs : [hrefs];\n\n return React.createElement(\"meta\", {\n name: \"specnav-prefetch\",\n content: JSON.stringify(hrefArray),\n \"data-specnav-hint\": \"true\",\n });\n}\n"]}
@@ -0,0 +1,14 @@
1
+ import React from 'react';
2
+
3
+ function prefetchHint(hrefs) {
4
+ const hrefArray = Array.isArray(hrefs) ? hrefs : [hrefs];
5
+ return React.createElement("meta", {
6
+ name: "specnav-prefetch",
7
+ content: JSON.stringify(hrefArray),
8
+ "data-specnav-hint": "true"
9
+ });
10
+ }
11
+
12
+ export { prefetchHint };
13
+ //# sourceMappingURL=server.mjs.map
14
+ //# sourceMappingURL=server.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server.ts"],"names":[],"mappings":";;AAEO,SAAS,aAAa,KAAA,EAA8C;AACzE,EAAA,MAAM,YAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AAEvD,EAAA,OAAO,KAAA,CAAM,cAAc,MAAA,EAAQ;AAAA,IACjC,IAAA,EAAM,kBAAA;AAAA,IACN,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAAA,IACjC,mBAAA,EAAqB;AAAA,GACtB,CAAA;AACH","file":"server.mjs","sourcesContent":["import React from \"react\";\n\nexport function prefetchHint(hrefs: string | string[]): React.ReactElement {\n const hrefArray = Array.isArray(hrefs) ? hrefs : [hrefs];\n\n return React.createElement(\"meta\", {\n name: \"specnav-prefetch\",\n content: JSON.stringify(hrefArray),\n \"data-specnav-hint\": \"true\",\n });\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "specnav-next",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "Next.js adapter for specnav — drop-in replacement for next/link with 0-16ms perceived navigation latency",
5
5
  "license": "MIT",
6
6
  "author": "Abraham",
@@ -46,20 +46,13 @@
46
46
  "LICENSE",
47
47
  "CHANGELOG.md"
48
48
  ],
49
- "scripts": {
50
- "build": "tsup",
51
- "dev": "tsup --watch",
52
- "test": "vitest run",
53
- "test:watch": "vitest",
54
- "typecheck": "tsc --noEmit"
55
- },
56
49
  "peerDependencies": {
57
50
  "next": ">=14.0.0",
58
51
  "react": ">=18.0.0",
59
52
  "react-dom": ">=18.0.0"
60
53
  },
61
54
  "dependencies": {
62
- "specnav-core": "^0.2.0"
55
+ "specnav-core": "^0.2.1"
63
56
  },
64
57
  "devDependencies": {
65
58
  "@types/node": "^22.0.0",
@@ -78,5 +71,12 @@
78
71
  "publishConfig": {
79
72
  "access": "public",
80
73
  "registry": "https://registry.npmjs.org"
74
+ },
75
+ "scripts": {
76
+ "build": "tsup",
77
+ "dev": "tsup --watch",
78
+ "test": "vitest run",
79
+ "test:watch": "vitest",
80
+ "typecheck": "tsc --noEmit"
81
81
  }
82
- }
82
+ }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/prefetch.ts","../src/NavigateProvider.tsx","../src/Link.tsx","../src/useNavigate.ts","../src/useNavigationState.ts"],"names":["createContext","useContext","useState","useRef","useEffect","createAdaptiveMode","createCacheManager","createMorpher","createSpeculativeRenderer","createNavigationGraphLearner","createTrajectoryEngine","prefetchPage","jsxs","jsx"],"mappings":"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","file":"index.cjs","sourcesContent":["// Shared prefetch logic and request deduplication\n\nexport const inflightRequests = new Map<string, Promise<string>>();\n\nexport async function prefetchPage(\n href: string,\n cache: any,\n speculator: any\n): Promise<void> {\n if (inflightRequests.has(href)) {\n await inflightRequests.get(href);\n return;\n }\n\n const controller = new AbortController();\n const fetchPromise = fetch(href, {\n headers: { \"x-specnav\": \"1\" },\n signal: controller.signal,\n })\n .then((res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.text();\n })\n .then((html) => {\n if (cache) cache.set(href, html);\n if (speculator) speculator.speculate(href, html);\n return html;\n })\n .finally(() => {\n inflightRequests.delete(href);\n });\n\n inflightRequests.set(href, fetchPromise);\n await fetchPromise;\n}\n","\"use client\";\n\nimport { createContext, useContext, useEffect, useState, useRef } from \"react\";\nimport {\n createTrajectoryEngine,\n createCacheManager,\n createMorpher,\n createSpeculativeRenderer,\n createNavigationGraphLearner,\n createAdaptiveMode,\n type TrajectoryEngine,\n type CacheManager,\n type DOMmorpher,\n type SpeculativeRenderer,\n type NavigationGraphLearner,\n type AdaptiveMode,\n} from \"specnav-core\";\nimport type { NavigateProviderProps } from \"./types\";\n\ninterface NavigationContextValue {\n trajectory: TrajectoryEngine | null;\n cache: CacheManager | null;\n morpher: DOMmorpher | null;\n speculator: SpeculativeRenderer | null;\n graph: NavigationGraphLearner | null;\n adaptive: AdaptiveMode | null;\n isNavigating: boolean;\n pendingHref: string | null;\n progress: number;\n cacheHits: number;\n cacheMisses: number;\n setNavigating: (href: string | null) => void;\n setProgress: (progress: number) => void;\n incrementCacheMiss: () => void;\n}\n\nconst NavigationContext = createContext<NavigationContextValue | null>(null);\n\nexport function useNavigationContext() {\n const ctx = useContext(NavigationContext);\n if (!ctx) throw new Error(\"useNavigationContext must be used within NavigateProvider\");\n return ctx;\n}\n\nexport function NavigateProvider({\n children,\n strategy = \"auto\",\n cache: cacheConfig,\n prefetch: prefetchConfig,\n progress: progressConfig,\n morph: morphConfig,\n graph: graphConfig,\n onNavigateStart,\n onNavigateEnd,\n onCacheHit,\n}: NavigateProviderProps) {\n const [isNavigating, setIsNavigating] = useState(false);\n const [pendingHref, setPendingHref] = useState<string | null>(null);\n const [progress, setProgress] = useState(0);\n const [cacheHits, setCacheHits] = useState(0);\n const [cacheMisses, setCacheMisses] = useState(0);\n const navigationStartTime = useRef<number | null>(null);\n\n const [trajectory, setTrajectory] = useState<TrajectoryEngine | null>(null);\n const [cache, setCache] = useState<CacheManager | null>(null);\n const [morpher, setMorpher] = useState<DOMmorpher | null>(null);\n const [speculator, setSpeculator] = useState<SpeculativeRenderer | null>(null);\n const [graph, setGraph] = useState<NavigationGraphLearner | null>(null);\n const [adaptive, setAdaptive] = useState<AdaptiveMode | null>(null);\n\n const wrappedSetNavigating = (href: string | null) => {\n if (href) {\n navigationStartTime.current = Date.now();\n onNavigateStart?.(href);\n } else if (navigationStartTime.current) {\n const duration = Date.now() - navigationStartTime.current;\n if (pendingHref) {\n onNavigateEnd?.(pendingHref, duration);\n }\n navigationStartTime.current = null;\n }\n setIsNavigating(!!href);\n setPendingHref(href);\n };\n\n useEffect(() => {\n // Initialize engines\n const adaptiveEngine = createAdaptiveMode();\n \n const cacheEngine = createCacheManager(cacheConfig, {\n onCacheHit: (href, layer) => {\n setCacheHits(prev => prev + 1);\n onCacheHit?.(href, layer);\n },\n });\n\n const morpherEngine = createMorpher(morphConfig);\n const speculatorEngine = createSpeculativeRenderer(3);\n const graphEngine = createNavigationGraphLearner(graphConfig);\n\n // Wait for adaptive to initialize before setting state\n adaptiveEngine.waitForInit().then(() => {\n setAdaptive(adaptiveEngine);\n setCache(cacheEngine);\n setMorpher(morpherEngine);\n setSpeculator(speculatorEngine);\n setGraph(graphEngine);\n\n const effectiveStrategy = adaptiveEngine.getStrategy(strategy);\n\n if (effectiveStrategy !== \"off\" && prefetchConfig?.mode === \"trajectory\") {\n const trajectoryEngine = createTrajectoryEngine(prefetchConfig.trajectory, {\n onPrediction: async (href: string) => {\n if (!adaptiveEngine?.shouldPrefetch()) return;\n const { prefetchPage } = await import(\"./prefetch\");\n await prefetchPage(href, cacheEngine, speculatorEngine);\n },\n onCancel: (href) => {\n speculatorEngine?.cancel(href);\n },\n });\n\n trajectoryEngine.start();\n setTrajectory(trajectoryEngine);\n }\n });\n\n // Handle browser back/forward\n const handlePopState = async (e: PopStateEvent) => {\n if (!e.state?.specnav) return;\n\n const href = window.location.pathname;\n wrappedSetNavigating(href);\n setProgress(0.3);\n\n try {\n // Try cache first (should be instant)\n const html = await cache?.get(href);\n \n if (html && morpher) {\n setProgress(0.7);\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n const newContent = doc.body;\n\n morpher.morph(document.body, newContent);\n setProgress(1);\n setTimeout(() => wrappedSetNavigating(null), 100);\n } else {\n // Fallback to full reload\n window.location.reload();\n }\n } catch (error) {\n console.error(\"Popstate navigation failed:\", error);\n window.location.reload();\n }\n };\n\n window.addEventListener(\"popstate\", handlePopState);\n\n return () => {\n trajectory?.stop();\n cache?.destroy();\n speculator?.cancelAll();\n window.removeEventListener(\"popstate\", handlePopState);\n };\n }, [strategy, cacheConfig, prefetchConfig, morphConfig, graphConfig, onCacheHit, onNavigateEnd]);\n\n const value: NavigationContextValue = {\n trajectory,\n cache,\n morpher,\n speculator,\n graph,\n adaptive,\n isNavigating,\n pendingHref,\n progress,\n cacheHits,\n cacheMisses,\n setNavigating: wrappedSetNavigating,\n setProgress,\n incrementCacheMiss: () => setCacheMisses(prev => prev + 1),\n };\n\n return (\n <NavigationContext.Provider value={value}>\n {progressConfig?.enabled !== false && (\n <ProgressBar config={progressConfig} progress={progress} isNavigating={isNavigating} />\n )}\n {children}\n </NavigationContext.Provider>\n );\n}\n\nfunction ProgressBar({\n config,\n progress,\n isNavigating,\n}: {\n config: any;\n progress: number;\n isNavigating: boolean;\n}) {\n const color = config?.color ?? \"#6366f1\";\n const height = config?.height ?? 3;\n const position = config?.position ?? \"top\";\n\n return (\n <div\n style={{\n position: \"fixed\",\n [position]: 0,\n left: 0,\n right: 0,\n height: `${height}px`,\n zIndex: 9999,\n pointerEvents: \"none\",\n }}\n >\n <div\n style={{\n height: \"100%\",\n width: `${progress * 100}%`,\n background: color,\n transition: isNavigating ? \"width 200ms ease\" : \"opacity 200ms ease\",\n opacity: isNavigating ? 1 : 0,\n }}\n />\n </div>\n );\n}\n","\"use client\";\n\nimport React, { useEffect, useRef } from \"react\";\nimport { useNavigationContext } from \"./NavigateProvider\";\nimport type { LinkProps } from \"./types\";\nimport { inflightRequests } from \"./prefetch\";\n\nexport function Link({\n href,\n prefetch = \"trajectory\",\n morph = true,\n cache = true,\n replace = false,\n scroll = true,\n children,\n ...props\n}: LinkProps) {\n const ctx = useNavigationContext();\n const linkRef = useRef<HTMLAnchorElement>(null);\n const abortControllerRef = useRef<AbortController | null>(null);\n\n // Validate URL is same-origin for security\n const isSafeUrl = (url: string): boolean => {\n try {\n const parsed = new URL(url, window.location.origin);\n return parsed.origin === window.location.origin;\n } catch {\n return false;\n }\n };\n\n useEffect(() => {\n if (!linkRef.current || !ctx.trajectory || prefetch === false) return;\n\n const element = linkRef.current;\n ctx.trajectory.registerLink(href, element);\n\n return () => {\n ctx.trajectory?.unregisterLink(element);\n abortControllerRef.current?.abort();\n };\n }, [href, ctx.trajectory, prefetch]);\n\n // Hover prefetch\n const handleMouseEnter = async () => {\n if (prefetch === \"hover\" && ctx.adaptive?.shouldPrefetch()) {\n await prefetchPage(href);\n }\n };\n\n const handleMouseLeave = () => {\n // Cleanup if needed\n };\n\n // Focus prefetch (keyboard navigation)\n const handleFocus = async () => {\n if (ctx.adaptive?.shouldPrefetch()) {\n await prefetchPage(href);\n }\n };\n\n const prefetchPage = async (url: string): Promise<void> => {\n if (!isSafeUrl(url) || !ctx.cache) return;\n\n // Check if already cached\n const cached = await ctx.cache.get(url);\n if (cached) return;\n\n // Check if already in-flight\n if (inflightRequests.has(url)) {\n await inflightRequests.get(url);\n return;\n }\n\n // Start new request\n abortControllerRef.current = new AbortController();\n const fetchPromise = fetch(url, {\n headers: { \"x-specnav\": \"1\" },\n signal: abortControllerRef.current.signal,\n })\n .then((res) => res.text())\n .then((html) => {\n ctx.cache?.set(url, html);\n // Speculative render if enabled\n if (ctx.speculator && ctx.adaptive?.shouldSpeculate()) {\n ctx.speculator.speculate(url, html);\n }\n return html;\n })\n .catch((err) => {\n if (err.name !== \"AbortError\") {\n console.warn(\"Prefetch failed:\", err);\n }\n throw err;\n })\n .finally(() => {\n inflightRequests.delete(url);\n });\n\n inflightRequests.set(url, fetchPromise);\n await fetchPromise;\n };\n\n const handleClick = async (e: React.MouseEvent<HTMLAnchorElement>) => {\n // Allow default behavior for modified clicks\n if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;\n \n e.preventDefault();\n\n if (!isSafeUrl(href)) {\n window.location.href = href;\n return;\n }\n\n if (!morph || !ctx.morpher || !ctx.cache) {\n window.location.href = href;\n return;\n }\n\n ctx.setNavigating(href);\n ctx.setProgress(0.3);\n\n // Timeout to prevent infinite hangs\n const timeoutId = setTimeout(() => {\n console.error(\"Navigation timeout\");\n ctx.setNavigating(null);\n window.location.href = href;\n }, 10000); // 10 second timeout\n\n try {\n // Check speculative render first\n let newContent = ctx.speculator?.get(href);\n \n if (!newContent) {\n // Check cache\n let html = cache ? await ctx.cache.get(href) : null;\n\n if (!html) {\n ctx.incrementCacheMiss();\n ctx.setProgress(0.5);\n // Deduplicate requests\n if (inflightRequests.has(href)) {\n html = await inflightRequests.get(href)!;\n } else {\n const controller = new AbortController();\n const fetchPromise = fetch(href, {\n headers: { \"x-specnav\": \"1\" },\n signal: controller.signal,\n }).then((res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.text();\n });\n \n inflightRequests.set(href, fetchPromise);\n html = await fetchPromise;\n inflightRequests.delete(href);\n }\n\n if (cache) {\n await ctx.cache.set(href, html);\n }\n }\n\n ctx.setProgress(0.7);\n\n // Parse HTML\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n newContent = doc.body;\n }\n\n ctx.setProgress(0.9);\n\n // Morph DOM with optional View Transitions\n if (\n \"startViewTransition\" in document &&\n ctx.adaptive?.shouldUseTransitions()\n ) {\n await (document as any).startViewTransition(() => {\n ctx.morpher?.morph(document.body, newContent!);\n }).finished;\n } else {\n ctx.morpher?.morph(document.body, newContent);\n }\n\n // Record navigation in graph (capture before URL change)\n const currentHref = window.location.pathname;\n\n // Update URL\n if (replace) {\n window.history.replaceState({ specnav: true }, \"\", href);\n } else {\n window.history.pushState({ specnav: true }, \"\", href);\n }\n\n ctx.graph?.recordNavigation(currentHref, href);\n\n // Scroll to top if requested\n if (scroll) {\n window.scrollTo(0, 0);\n }\n\n clearTimeout(timeoutId);\n ctx.setProgress(1);\n setTimeout(() => ctx.setNavigating(null), 200);\n } catch (error) {\n clearTimeout(timeoutId);\n console.error(\"Navigation failed:\", error);\n ctx.setNavigating(null);\n window.location.href = href;\n }\n };\n\n return (\n <a\n ref={linkRef}\n href={href}\n onClick={handleClick}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onFocus={handleFocus}\n {...props}\n >\n {children}\n </a>\n );\n}\n","\"use client\";\n\nimport { useNavigationContext } from \"./NavigateProvider\";\nimport type { UseNavigateReturn, NavigateOptions } from \"./types\";\nimport { inflightRequests } from \"./prefetch\";\n\nexport function useNavigate(): UseNavigateReturn {\n const ctx = useNavigationContext();\n\n const isSafeUrl = (url: string): boolean => {\n try {\n const parsed = new URL(url, window.location.origin);\n return parsed.origin === window.location.origin;\n } catch {\n return false;\n }\n };\n\n const navigate = async (href: string, options: NavigateOptions = {}) => {\n const {\n replace = false,\n scroll = true,\n morph = true,\n cache: useCache = true,\n } = options;\n\n if (!isSafeUrl(href)) {\n window.location.href = href;\n return;\n }\n\n if (!morph || !ctx.morpher || !ctx.cache) {\n window.location.href = href;\n return;\n }\n\n ctx.setNavigating(href);\n ctx.setProgress(0.3);\n\n try {\n // Check speculative render first\n let newContent = ctx.speculator?.get(href);\n\n if (!newContent) {\n let html = useCache ? await ctx.cache.get(href) : null;\n\n if (!html) {\n ctx.setProgress(0.5);\n \n // Deduplicate requests\n if (inflightRequests.has(href)) {\n html = await inflightRequests.get(href)!;\n } else {\n const controller = new AbortController();\n const fetchPromise = fetch(href, {\n headers: { \"x-specnav\": \"1\" },\n signal: controller.signal,\n }).then((res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.text();\n });\n\n inflightRequests.set(href, fetchPromise);\n html = await fetchPromise;\n inflightRequests.delete(href);\n }\n\n if (useCache) {\n await ctx.cache.set(href, html);\n }\n }\n\n ctx.setProgress(0.7);\n\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n newContent = doc.body;\n }\n\n ctx.setProgress(0.9);\n\n if (\n \"startViewTransition\" in document &&\n ctx.adaptive?.shouldUseTransitions()\n ) {\n await (document as any).startViewTransition(() => {\n ctx.morpher?.morph(document.body, newContent!);\n }).finished;\n } else {\n ctx.morpher?.morph(document.body, newContent);\n }\n\n const currentHref = window.location.pathname;\n\n if (replace) {\n window.history.replaceState({ specnav: true }, \"\", href);\n } else {\n window.history.pushState({ specnav: true }, \"\", href);\n }\n\n ctx.graph?.recordNavigation(currentHref, href);\n\n if (scroll) {\n window.scrollTo(0, 0);\n }\n\n ctx.setProgress(1);\n setTimeout(() => ctx.setNavigating(null), 200);\n } catch (error) {\n console.error(\"Navigation failed:\", error);\n ctx.setNavigating(null);\n window.location.href = href;\n }\n };\n\n const back = () => {\n window.history.back();\n };\n\n const forward = () => {\n window.history.forward();\n };\n\n const prefetch = async (href: string) => {\n if (!ctx.cache || !isSafeUrl(href)) return;\n\n try {\n // Check if already in-flight\n if (inflightRequests.has(href)) {\n await inflightRequests.get(href);\n return;\n }\n\n const controller = new AbortController();\n const fetchPromise = fetch(href, {\n headers: { \"x-specnav\": \"1\" },\n signal: controller.signal,\n })\n .then((res) => res.text())\n .then((html) => {\n ctx.cache?.set(href, html);\n // Speculative render if enabled\n if (ctx.speculator && ctx.adaptive?.shouldSpeculate()) {\n ctx.speculator.speculate(href, html);\n }\n return html;\n })\n .finally(() => {\n inflightRequests.delete(href);\n });\n\n inflightRequests.set(href, fetchPromise);\n await fetchPromise;\n } catch (error) {\n if ((error as Error).name !== \"AbortError\") {\n console.warn(\"Prefetch failed:\", error);\n }\n }\n };\n\n const clearCache = (href?: string) => {\n ctx.cache?.clear(href);\n if (href) {\n ctx.speculator?.cancel(href);\n } else {\n ctx.speculator?.cancelAll();\n }\n };\n\n return {\n navigate,\n back,\n forward,\n prefetch,\n clearCache,\n isNavigating: ctx.isNavigating,\n pendingHref: ctx.pendingHref,\n };\n}\n","\"use client\";\n\nimport { useState, useEffect } from \"react\";\nimport { useNavigationContext } from \"./NavigateProvider\";\nimport type { UseNavigationStateReturn } from \"./types\";\n\nexport function useNavigationState(): UseNavigationStateReturn {\n const ctx = useNavigationContext();\n const [previousHref, setPreviousHref] = useState<string | null>(null);\n const [lastNavigationMs, setLastNavigationMs] = useState(0);\n const [startTime, setStartTime] = useState<number | null>(null);\n\n // Track navigation start\n useEffect(() => {\n if (ctx.isNavigating && ctx.pendingHref) {\n setPreviousHref(window.location.pathname);\n setStartTime(Date.now());\n }\n }, [ctx.isNavigating, ctx.pendingHref]);\n\n // Track navigation end (event-driven)\n useEffect(() => {\n if (!ctx.isNavigating && startTime !== null) {\n setLastNavigationMs(Date.now() - startTime);\n setStartTime(null);\n }\n }, [ctx.isNavigating, startTime]);\n\n const cacheSize = ctx.cache?.getSize() ?? 0;\n const totalRequests = ctx.cacheHits + ctx.cacheMisses;\n const cacheHitRate = totalRequests > 0 ? ctx.cacheHits / totalRequests : 0;\n\n return {\n isNavigating: ctx.isNavigating,\n pendingHref: ctx.pendingHref,\n previousHref,\n cacheSize,\n cacheHitRate,\n lastNavigationMs,\n progress: ctx.progress,\n };\n}\n"]}
package/dist/server.cjs DELETED
@@ -1,20 +0,0 @@
1
- 'use strict';
2
-
3
- var React = require('react');
4
-
5
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
6
-
7
- var React__default = /*#__PURE__*/_interopDefault(React);
8
-
9
- function prefetchHint(hrefs) {
10
- const hrefArray = Array.isArray(hrefs) ? hrefs : [hrefs];
11
- return React__default.default.createElement("meta", {
12
- name: "specnav-prefetch",
13
- content: JSON.stringify(hrefArray),
14
- "data-specnav-hint": "true"
15
- });
16
- }
17
-
18
- exports.prefetchHint = prefetchHint;
19
- //# sourceMappingURL=server.cjs.map
20
- //# sourceMappingURL=server.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/server.ts"],"names":["React"],"mappings":";;;;;;;;AAEO,SAAS,aAAa,KAAA,EAA8C;AACzE,EAAA,MAAM,YAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,GAAQ,CAAC,KAAK,CAAA;AAEvD,EAAA,OAAOA,sBAAA,CAAM,cAAc,MAAA,EAAQ;AAAA,IACjC,IAAA,EAAM,kBAAA;AAAA,IACN,OAAA,EAAS,IAAA,CAAK,SAAA,CAAU,SAAS,CAAA;AAAA,IACjC,mBAAA,EAAqB;AAAA,GACtB,CAAA;AACH","file":"server.cjs","sourcesContent":["import React from \"react\";\n\nexport function prefetchHint(hrefs: string | string[]): React.ReactElement {\n const hrefArray = Array.isArray(hrefs) ? hrefs : [hrefs];\n\n return React.createElement(\"meta\", {\n name: \"specnav-prefetch\",\n content: JSON.stringify(hrefArray),\n \"data-specnav-hint\": \"true\",\n });\n}\n"]}