specnav-next 0.2.1 → 0.2.3

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,19 @@
1
1
  # @specnav/next
2
2
 
3
+ ## 0.2.3
4
+
5
+ ### Patch Changes
6
+
7
+ - Fix blank screen issue by morphing #\_\_next container instead of entire document.body to preserve React hydration state
8
+
9
+ ## 0.2.2
10
+
11
+ ### Patch Changes
12
+
13
+ - Fix build output to generate .mjs files for ESM instead of .js files, matching package.json exports configuration
14
+ - Updated dependencies
15
+ - specnav-core@0.2.1
16
+
3
17
  ## 0.2.0
4
18
 
5
19
  ### 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));
@@ -134,8 +136,9 @@ function NavigateProvider({
134
136
  setProgress(0.7);
135
137
  const parser = new DOMParser();
136
138
  const doc = parser.parseFromString(html, "text/html");
137
- const newContent = doc.body;
138
- morpher.morph(document.body, newContent);
139
+ const targetContainer = document.querySelector("#__next") || document.body;
140
+ const newContainer = doc.querySelector("#__next") || doc.body;
141
+ morpher.morph(targetContainer, newContainer);
139
142
  setProgress(1);
140
143
  setTimeout(() => wrappedSetNavigating(null), 100);
141
144
  } else {
@@ -170,8 +173,8 @@ function NavigateProvider({
170
173
  setProgress,
171
174
  incrementCacheMiss: () => setCacheMisses((prev) => prev + 1)
172
175
  };
173
- return /* @__PURE__ */ jsxs(NavigationContext.Provider, { value, children: [
174
- progressConfig?.enabled !== false && /* @__PURE__ */ jsx(ProgressBar, { config: progressConfig, progress, isNavigating }),
176
+ return /* @__PURE__ */ jsxRuntime.jsxs(NavigationContext.Provider, { value, children: [
177
+ progressConfig?.enabled !== false && /* @__PURE__ */ jsxRuntime.jsx(ProgressBar, { config: progressConfig, progress, isNavigating }),
175
178
  children
176
179
  ] });
177
180
  }
@@ -183,7 +186,7 @@ function ProgressBar({
183
186
  const color = config?.color ?? "#6366f1";
184
187
  const height = config?.height ?? 3;
185
188
  const position = config?.position ?? "top";
186
- return /* @__PURE__ */ jsx(
189
+ return /* @__PURE__ */ jsxRuntime.jsx(
187
190
  "div",
188
191
  {
189
192
  style: {
@@ -195,7 +198,7 @@ function ProgressBar({
195
198
  zIndex: 9999,
196
199
  pointerEvents: "none"
197
200
  },
198
- children: /* @__PURE__ */ jsx(
201
+ children: /* @__PURE__ */ jsxRuntime.jsx(
199
202
  "div",
200
203
  {
201
204
  style: {
@@ -222,8 +225,8 @@ function Link({
222
225
  ...props
223
226
  }) {
224
227
  const ctx = useNavigationContext();
225
- const linkRef = useRef(null);
226
- const abortControllerRef = useRef(null);
228
+ const linkRef = react.useRef(null);
229
+ const abortControllerRef = react.useRef(null);
227
230
  const isSafeUrl = (url) => {
228
231
  try {
229
232
  const parsed = new URL(url, window.location.origin);
@@ -232,7 +235,7 @@ function Link({
232
235
  return false;
233
236
  }
234
237
  };
235
- useEffect(() => {
238
+ react.useEffect(() => {
236
239
  if (!linkRef.current || !ctx.trajectory || prefetch === false) return;
237
240
  const element = linkRef.current;
238
241
  ctx.trajectory.registerLink(href, element);
@@ -332,12 +335,14 @@ function Link({
332
335
  newContent = doc.body;
333
336
  }
334
337
  ctx.setProgress(0.9);
338
+ const targetContainer = document.querySelector("#__next") || document.body;
339
+ const newContainer = newContent.querySelector("#__next") || newContent;
335
340
  if ("startViewTransition" in document && ctx.adaptive?.shouldUseTransitions()) {
336
341
  await document.startViewTransition(() => {
337
- ctx.morpher?.morph(document.body, newContent);
342
+ ctx.morpher?.morph(targetContainer, newContainer);
338
343
  }).finished;
339
344
  } else {
340
- ctx.morpher?.morph(document.body, newContent);
345
+ ctx.morpher?.morph(targetContainer, newContainer);
341
346
  }
342
347
  const currentHref = window.location.pathname;
343
348
  if (replace) {
@@ -359,7 +364,7 @@ function Link({
359
364
  window.location.href = href;
360
365
  }
361
366
  };
362
- return /* @__PURE__ */ jsx(
367
+ return /* @__PURE__ */ jsxRuntime.jsx(
363
368
  "a",
364
369
  {
365
370
  ref: linkRef,
@@ -513,16 +518,16 @@ function useNavigate() {
513
518
  }
514
519
  function useNavigationState() {
515
520
  const ctx = useNavigationContext();
516
- const [previousHref, setPreviousHref] = useState(null);
517
- const [lastNavigationMs, setLastNavigationMs] = useState(0);
518
- const [startTime, setStartTime] = useState(null);
519
- useEffect(() => {
521
+ const [previousHref, setPreviousHref] = react.useState(null);
522
+ const [lastNavigationMs, setLastNavigationMs] = react.useState(0);
523
+ const [startTime, setStartTime] = react.useState(null);
524
+ react.useEffect(() => {
520
525
  if (ctx.isNavigating && ctx.pendingHref) {
521
526
  setPreviousHref(window.location.pathname);
522
527
  setStartTime(Date.now());
523
528
  }
524
529
  }, [ctx.isNavigating, ctx.pendingHref]);
525
- useEffect(() => {
530
+ react.useEffect(() => {
526
531
  if (!ctx.isNavigating && startTime !== null) {
527
532
  setLastNavigationMs(Date.now() - startTime);
528
533
  setStartTime(null);
@@ -542,6 +547,9 @@ function useNavigationState() {
542
547
  };
543
548
  }
544
549
 
545
- export { Link, NavigateProvider, useNavigate, useNavigationState };
550
+ exports.Link = Link;
551
+ exports.NavigateProvider = NavigateProvider;
552
+ exports.useNavigate = useNavigate;
553
+ exports.useNavigationState = useNavigationState;
546
554
  //# sourceMappingURL=index.js.map
547
555
  //# 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 \n // Target Next.js container instead of entire body\n const targetContainer = document.querySelector(\"#__next\") || document.body;\n const newContainer = doc.querySelector(\"#__next\") || doc.body;\n\n morpher.morph(targetContainer, newContainer);\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 // Find the main content container (Next.js uses different IDs)\n const targetContainer = document.querySelector(\"#__next\") || document.body;\n const newContainer = newContent.querySelector(\"#__next\") || newContent;\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(targetContainer, newContainer);\n }).finished;\n } else {\n ctx.morpher?.morph(targetContainer, newContainer);\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));
@@ -136,8 +134,9 @@ function NavigateProvider({
136
134
  setProgress(0.7);
137
135
  const parser = new DOMParser();
138
136
  const doc = parser.parseFromString(html, "text/html");
139
- const newContent = doc.body;
140
- morpher.morph(document.body, newContent);
137
+ const targetContainer = document.querySelector("#__next") || document.body;
138
+ const newContainer = doc.querySelector("#__next") || doc.body;
139
+ morpher.morph(targetContainer, newContainer);
141
140
  setProgress(1);
142
141
  setTimeout(() => wrappedSetNavigating(null), 100);
143
142
  } else {
@@ -172,8 +171,8 @@ function NavigateProvider({
172
171
  setProgress,
173
172
  incrementCacheMiss: () => setCacheMisses((prev) => prev + 1)
174
173
  };
175
- return /* @__PURE__ */ jsxRuntime.jsxs(NavigationContext.Provider, { value, children: [
176
- progressConfig?.enabled !== false && /* @__PURE__ */ jsxRuntime.jsx(ProgressBar, { config: progressConfig, progress, isNavigating }),
174
+ return /* @__PURE__ */ jsxs(NavigationContext.Provider, { value, children: [
175
+ progressConfig?.enabled !== false && /* @__PURE__ */ jsx(ProgressBar, { config: progressConfig, progress, isNavigating }),
177
176
  children
178
177
  ] });
179
178
  }
@@ -185,7 +184,7 @@ function ProgressBar({
185
184
  const color = config?.color ?? "#6366f1";
186
185
  const height = config?.height ?? 3;
187
186
  const position = config?.position ?? "top";
188
- return /* @__PURE__ */ jsxRuntime.jsx(
187
+ return /* @__PURE__ */ jsx(
189
188
  "div",
190
189
  {
191
190
  style: {
@@ -197,7 +196,7 @@ function ProgressBar({
197
196
  zIndex: 9999,
198
197
  pointerEvents: "none"
199
198
  },
200
- children: /* @__PURE__ */ jsxRuntime.jsx(
199
+ children: /* @__PURE__ */ jsx(
201
200
  "div",
202
201
  {
203
202
  style: {
@@ -224,8 +223,8 @@ function Link({
224
223
  ...props
225
224
  }) {
226
225
  const ctx = useNavigationContext();
227
- const linkRef = react.useRef(null);
228
- const abortControllerRef = react.useRef(null);
226
+ const linkRef = useRef(null);
227
+ const abortControllerRef = useRef(null);
229
228
  const isSafeUrl = (url) => {
230
229
  try {
231
230
  const parsed = new URL(url, window.location.origin);
@@ -234,7 +233,7 @@ function Link({
234
233
  return false;
235
234
  }
236
235
  };
237
- react.useEffect(() => {
236
+ useEffect(() => {
238
237
  if (!linkRef.current || !ctx.trajectory || prefetch === false) return;
239
238
  const element = linkRef.current;
240
239
  ctx.trajectory.registerLink(href, element);
@@ -334,12 +333,14 @@ function Link({
334
333
  newContent = doc.body;
335
334
  }
336
335
  ctx.setProgress(0.9);
336
+ const targetContainer = document.querySelector("#__next") || document.body;
337
+ const newContainer = newContent.querySelector("#__next") || newContent;
337
338
  if ("startViewTransition" in document && ctx.adaptive?.shouldUseTransitions()) {
338
339
  await document.startViewTransition(() => {
339
- ctx.morpher?.morph(document.body, newContent);
340
+ ctx.morpher?.morph(targetContainer, newContainer);
340
341
  }).finished;
341
342
  } else {
342
- ctx.morpher?.morph(document.body, newContent);
343
+ ctx.morpher?.morph(targetContainer, newContainer);
343
344
  }
344
345
  const currentHref = window.location.pathname;
345
346
  if (replace) {
@@ -361,7 +362,7 @@ function Link({
361
362
  window.location.href = href;
362
363
  }
363
364
  };
364
- return /* @__PURE__ */ jsxRuntime.jsx(
365
+ return /* @__PURE__ */ jsx(
365
366
  "a",
366
367
  {
367
368
  ref: linkRef,
@@ -515,16 +516,16 @@ function useNavigate() {
515
516
  }
516
517
  function useNavigationState() {
517
518
  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(() => {
519
+ const [previousHref, setPreviousHref] = useState(null);
520
+ const [lastNavigationMs, setLastNavigationMs] = useState(0);
521
+ const [startTime, setStartTime] = useState(null);
522
+ useEffect(() => {
522
523
  if (ctx.isNavigating && ctx.pendingHref) {
523
524
  setPreviousHref(window.location.pathname);
524
525
  setStartTime(Date.now());
525
526
  }
526
527
  }, [ctx.isNavigating, ctx.pendingHref]);
527
- react.useEffect(() => {
528
+ useEffect(() => {
528
529
  if (!ctx.isNavigating && startTime !== null) {
529
530
  setLastNavigationMs(Date.now() - startTime);
530
531
  setStartTime(null);
@@ -544,9 +545,6 @@ function useNavigationState() {
544
545
  };
545
546
  }
546
547
 
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
548
+ export { Link, NavigateProvider, useNavigate, useNavigationState };
549
+ //# sourceMappingURL=index.mjs.map
550
+ //# 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 \n // Target Next.js container instead of entire body\n const targetContainer = document.querySelector(\"#__next\") || document.body;\n const newContainer = doc.querySelector(\"#__next\") || doc.body;\n\n morpher.morph(targetContainer, newContainer);\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 // Find the main content container (Next.js uses different IDs)\n const targetContainer = document.querySelector(\"#__next\") || document.body;\n const newContainer = newContent.querySelector(\"#__next\") || newContent;\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(targetContainer, newContainer);\n }).finished;\n } else {\n ctx.morpher?.morph(targetContainer, newContainer);\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.3",
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"]}