@timber-js/app 0.2.0-alpha.8 → 0.2.0-alpha.80

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.
Files changed (573) hide show
  1. package/LICENSE +8 -0
  2. package/dist/_chunks/actions-Dg-ANYHb.js +421 -0
  3. package/dist/_chunks/actions-Dg-ANYHb.js.map +1 -0
  4. package/dist/_chunks/{als-registry-B7DbZ2hS.js → als-registry-HS0LGUl2.js} +1 -1
  5. package/dist/_chunks/als-registry-HS0LGUl2.js.map +1 -0
  6. package/dist/_chunks/chunk-DYhsFzuS.js +33 -0
  7. package/dist/_chunks/{debug-gwlJkDuf.js → debug-ECi_61pb.js} +2 -2
  8. package/dist/_chunks/debug-ECi_61pb.js.map +1 -0
  9. package/dist/_chunks/define-C77ScO0m.js +106 -0
  10. package/dist/_chunks/define-C77ScO0m.js.map +1 -0
  11. package/dist/_chunks/define-CZqDwhSu.js +199 -0
  12. package/dist/_chunks/define-CZqDwhSu.js.map +1 -0
  13. package/dist/_chunks/define-cookie-C2IkoFGN.js +94 -0
  14. package/dist/_chunks/define-cookie-C2IkoFGN.js.map +1 -0
  15. package/dist/_chunks/{format-DviM89f0.js → dev-warnings-DpGRGoDi.js} +5 -44
  16. package/dist/_chunks/dev-warnings-DpGRGoDi.js.map +1 -0
  17. package/dist/_chunks/format-CYBGxKtc.js +14 -0
  18. package/dist/_chunks/format-CYBGxKtc.js.map +1 -0
  19. package/dist/_chunks/{interception-BOoWmLUA.js → interception-Dpn_UfAD.js} +171 -97
  20. package/dist/_chunks/interception-Dpn_UfAD.js.map +1 -0
  21. package/dist/_chunks/merge-search-params-Cm_KIWDX.js +41 -0
  22. package/dist/_chunks/merge-search-params-Cm_KIWDX.js.map +1 -0
  23. package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js → metadata-routes-DS3eKNmf.js} +1 -1
  24. package/dist/_chunks/{metadata-routes-Cjmvi3rQ.js.map → metadata-routes-DS3eKNmf.js.map} +1 -1
  25. package/dist/_chunks/request-context-qMsWgy9C.js +478 -0
  26. package/dist/_chunks/request-context-qMsWgy9C.js.map +1 -0
  27. package/dist/_chunks/schema-bridge-C3xl_vfb.js +86 -0
  28. package/dist/_chunks/schema-bridge-C3xl_vfb.js.map +1 -0
  29. package/dist/_chunks/segment-classify-BDNn6EzD.js +65 -0
  30. package/dist/_chunks/segment-classify-BDNn6EzD.js.map +1 -0
  31. package/dist/_chunks/segment-context-fHFLF1PE.js +34 -0
  32. package/dist/_chunks/segment-context-fHFLF1PE.js.map +1 -0
  33. package/dist/_chunks/{ssr-data-MjmprTmO.js → ssr-data-DzuI0bIV.js} +1 -1
  34. package/dist/_chunks/{ssr-data-MjmprTmO.js.map → ssr-data-DzuI0bIV.js.map} +1 -1
  35. package/dist/_chunks/stale-reload-C2plcNtG.js +64 -0
  36. package/dist/_chunks/stale-reload-C2plcNtG.js.map +1 -0
  37. package/dist/_chunks/{tracing-CemImE6h.js → tracing-CCYbKn5n.js} +60 -9
  38. package/dist/_chunks/tracing-CCYbKn5n.js.map +1 -0
  39. package/dist/_chunks/use-params-Br9YSUFV.js +295 -0
  40. package/dist/_chunks/use-params-Br9YSUFV.js.map +1 -0
  41. package/dist/_chunks/{use-query-states-D5KaffOK.js → use-query-states-Lo_s_pw2.js} +4 -4
  42. package/dist/_chunks/use-query-states-Lo_s_pw2.js.map +1 -0
  43. package/dist/_chunks/wrappers-_DTmImGt.js +63 -0
  44. package/dist/_chunks/wrappers-_DTmImGt.js.map +1 -0
  45. package/dist/adapters/cloudflare-dev.d.ts +109 -0
  46. package/dist/adapters/cloudflare-dev.d.ts.map +1 -0
  47. package/dist/adapters/cloudflare-dev.js +73 -0
  48. package/dist/adapters/cloudflare-dev.js.map +1 -0
  49. package/dist/adapters/cloudflare-kv-cache.d.ts +64 -0
  50. package/dist/adapters/cloudflare-kv-cache.d.ts.map +1 -0
  51. package/dist/adapters/cloudflare-kv-cache.js +95 -0
  52. package/dist/adapters/cloudflare-kv-cache.js.map +1 -0
  53. package/dist/adapters/cloudflare.d.ts +148 -12
  54. package/dist/adapters/cloudflare.d.ts.map +1 -1
  55. package/dist/adapters/cloudflare.js +135 -11
  56. package/dist/adapters/cloudflare.js.map +1 -1
  57. package/dist/adapters/compress-module.d.ts.map +1 -1
  58. package/dist/adapters/nitro.d.ts +17 -1
  59. package/dist/adapters/nitro.d.ts.map +1 -1
  60. package/dist/adapters/nitro.js +56 -13
  61. package/dist/adapters/nitro.js.map +1 -1
  62. package/dist/cache/cache-api.d.ts +24 -0
  63. package/dist/cache/cache-api.d.ts.map +1 -0
  64. package/dist/cache/handler-store.d.ts +31 -0
  65. package/dist/cache/handler-store.d.ts.map +1 -0
  66. package/dist/cache/index.d.ts +23 -7
  67. package/dist/cache/index.d.ts.map +1 -1
  68. package/dist/cache/index.js +142 -80
  69. package/dist/cache/index.js.map +1 -1
  70. package/dist/cache/singleflight.d.ts +18 -1
  71. package/dist/cache/singleflight.d.ts.map +1 -1
  72. package/dist/cache/sizeof.d.ts +22 -0
  73. package/dist/cache/sizeof.d.ts.map +1 -0
  74. package/dist/cache/timber-cache.d.ts +1 -1
  75. package/dist/cache/timber-cache.d.ts.map +1 -1
  76. package/dist/cli.d.ts +6 -1
  77. package/dist/cli.d.ts.map +1 -1
  78. package/dist/cli.js +6 -1
  79. package/dist/cli.js.map +1 -1
  80. package/dist/client/browser-dev.d.ts +27 -1
  81. package/dist/client/browser-dev.d.ts.map +1 -1
  82. package/dist/client/browser-entry/action-dispatch.d.ts +17 -0
  83. package/dist/client/browser-entry/action-dispatch.d.ts.map +1 -0
  84. package/dist/client/browser-entry/hmr.d.ts +21 -0
  85. package/dist/client/browser-entry/hmr.d.ts.map +1 -0
  86. package/dist/client/browser-entry/hydrate.d.ts +46 -0
  87. package/dist/client/browser-entry/hydrate.d.ts.map +1 -0
  88. package/dist/client/browser-entry/index.d.ts +30 -0
  89. package/dist/client/browser-entry/index.d.ts.map +1 -0
  90. package/dist/client/browser-entry/post-hydration.d.ts +26 -0
  91. package/dist/client/browser-entry/post-hydration.d.ts.map +1 -0
  92. package/dist/client/browser-entry/router-init.d.ts +23 -0
  93. package/dist/client/browser-entry/router-init.d.ts.map +1 -0
  94. package/dist/client/browser-entry/rsc-stream.d.ts +24 -0
  95. package/dist/client/browser-entry/rsc-stream.d.ts.map +1 -0
  96. package/dist/client/browser-entry/scroll.d.ts +19 -0
  97. package/dist/client/browser-entry/scroll.d.ts.map +1 -0
  98. package/dist/client/error-boundary.d.ts +12 -5
  99. package/dist/client/error-boundary.d.ts.map +1 -1
  100. package/dist/client/error-boundary.js +10 -4
  101. package/dist/client/error-boundary.js.map +1 -1
  102. package/dist/client/error-reconstituter.d.ts +54 -0
  103. package/dist/client/error-reconstituter.d.ts.map +1 -0
  104. package/dist/client/form.d.ts +2 -2
  105. package/dist/client/form.d.ts.map +1 -1
  106. package/dist/client/history.d.ts +19 -4
  107. package/dist/client/history.d.ts.map +1 -1
  108. package/dist/client/index.d.ts +7 -21
  109. package/dist/client/index.d.ts.map +1 -1
  110. package/dist/client/index.js +210 -1017
  111. package/dist/client/index.js.map +1 -1
  112. package/dist/client/internal.d.ts +18 -0
  113. package/dist/client/internal.d.ts.map +1 -0
  114. package/dist/client/internal.js +890 -0
  115. package/dist/client/internal.js.map +1 -0
  116. package/dist/client/link-pending-store.d.ts +63 -0
  117. package/dist/client/link-pending-store.d.ts.map +1 -0
  118. package/dist/client/link.d.ts +90 -32
  119. package/dist/client/link.d.ts.map +1 -1
  120. package/dist/client/nav-link-store.d.ts +36 -0
  121. package/dist/client/nav-link-store.d.ts.map +1 -0
  122. package/dist/client/navigation-api-types.d.ts +90 -0
  123. package/dist/client/navigation-api-types.d.ts.map +1 -0
  124. package/dist/client/navigation-api.d.ts +115 -0
  125. package/dist/client/navigation-api.d.ts.map +1 -0
  126. package/dist/client/navigation-context.d.ts +13 -2
  127. package/dist/client/navigation-context.d.ts.map +1 -1
  128. package/dist/client/{transition-root.d.ts → navigation-root.d.ts} +42 -8
  129. package/dist/client/navigation-root.d.ts.map +1 -0
  130. package/dist/client/nuqs-adapter.d.ts.map +1 -1
  131. package/dist/client/router-ref.d.ts +1 -1
  132. package/dist/client/router.d.ts +70 -4
  133. package/dist/client/router.d.ts.map +1 -1
  134. package/dist/client/rsc-fetch.d.ts +38 -3
  135. package/dist/client/rsc-fetch.d.ts.map +1 -1
  136. package/dist/client/segment-cache.d.ts +1 -1
  137. package/dist/client/segment-cache.d.ts.map +1 -1
  138. package/dist/client/segment-outlet.d.ts +63 -0
  139. package/dist/client/segment-outlet.d.ts.map +1 -0
  140. package/dist/client/ssr-data.d.ts +13 -4
  141. package/dist/client/ssr-data.d.ts.map +1 -1
  142. package/dist/client/stale-reload.d.ts +15 -0
  143. package/dist/client/stale-reload.d.ts.map +1 -1
  144. package/dist/client/top-loader.d.ts +5 -5
  145. package/dist/client/top-loader.d.ts.map +1 -1
  146. package/dist/client/use-link-status.d.ts +5 -5
  147. package/dist/client/use-link-status.d.ts.map +1 -1
  148. package/dist/client/use-params.d.ts +6 -4
  149. package/dist/client/use-params.d.ts.map +1 -1
  150. package/dist/client/{use-navigation-pending.d.ts → use-pending-navigation.d.ts} +4 -4
  151. package/dist/client/use-pending-navigation.d.ts.map +1 -0
  152. package/dist/client/use-query-states.d.ts +1 -1
  153. package/dist/client/use-query-states.d.ts.map +1 -1
  154. package/dist/client/use-router.d.ts +1 -1
  155. package/dist/codec.d.ts +33 -0
  156. package/dist/codec.d.ts.map +1 -0
  157. package/dist/codec.js +2 -0
  158. package/dist/config-types.d.ts +210 -0
  159. package/dist/config-types.d.ts.map +1 -0
  160. package/dist/content/index.d.ts +1 -10
  161. package/dist/content/index.d.ts.map +1 -1
  162. package/dist/content/index.js +0 -2
  163. package/dist/cookies/define-cookie.d.ts +35 -14
  164. package/dist/cookies/define-cookie.d.ts.map +1 -1
  165. package/dist/cookies/index.js +1 -83
  166. package/dist/fonts/css.d.ts +1 -0
  167. package/dist/fonts/css.d.ts.map +1 -1
  168. package/dist/index.d.ts +45 -192
  169. package/dist/index.d.ts.map +1 -1
  170. package/dist/index.js +12296 -11901
  171. package/dist/index.js.map +1 -1
  172. package/dist/plugin-context.d.ts +84 -0
  173. package/dist/plugin-context.d.ts.map +1 -0
  174. package/dist/plugins/adapter-build.d.ts +1 -1
  175. package/dist/plugins/adapter-build.d.ts.map +1 -1
  176. package/dist/plugins/build-manifest.d.ts +2 -2
  177. package/dist/plugins/build-manifest.d.ts.map +1 -1
  178. package/dist/plugins/build-report.d.ts +3 -3
  179. package/dist/plugins/build-report.d.ts.map +1 -1
  180. package/dist/plugins/client-chunks.d.ts +32 -0
  181. package/dist/plugins/client-chunks.d.ts.map +1 -0
  182. package/dist/plugins/content.d.ts +1 -1
  183. package/dist/plugins/content.d.ts.map +1 -1
  184. package/dist/plugins/dev-browser-logs.d.ts +84 -0
  185. package/dist/plugins/dev-browser-logs.d.ts.map +1 -0
  186. package/dist/plugins/dev-error-overlay.d.ts +26 -1
  187. package/dist/plugins/dev-error-overlay.d.ts.map +1 -1
  188. package/dist/plugins/dev-logs.d.ts +1 -1
  189. package/dist/plugins/dev-logs.d.ts.map +1 -1
  190. package/dist/plugins/dev-server.d.ts +1 -1
  191. package/dist/plugins/dev-server.d.ts.map +1 -1
  192. package/dist/plugins/entries.d.ts +1 -1
  193. package/dist/plugins/entries.d.ts.map +1 -1
  194. package/dist/plugins/fonts.d.ts +19 -5
  195. package/dist/plugins/fonts.d.ts.map +1 -1
  196. package/dist/plugins/mdx.d.ts +1 -1
  197. package/dist/plugins/mdx.d.ts.map +1 -1
  198. package/dist/plugins/routing.d.ts +1 -1
  199. package/dist/plugins/routing.d.ts.map +1 -1
  200. package/dist/plugins/server-bundle.d.ts.map +1 -1
  201. package/dist/plugins/shims.d.ts +6 -5
  202. package/dist/plugins/shims.d.ts.map +1 -1
  203. package/dist/plugins/static-build.d.ts +4 -4
  204. package/dist/plugins/static-build.d.ts.map +1 -1
  205. package/dist/routing/codegen.d.ts +2 -2
  206. package/dist/routing/codegen.d.ts.map +1 -1
  207. package/dist/routing/index.d.ts +2 -0
  208. package/dist/routing/index.d.ts.map +1 -1
  209. package/dist/routing/index.js +3 -2
  210. package/dist/routing/scanner.d.ts.map +1 -1
  211. package/dist/routing/segment-classify.d.ts +46 -0
  212. package/dist/routing/segment-classify.d.ts.map +1 -0
  213. package/dist/routing/status-file-lint.d.ts +2 -1
  214. package/dist/routing/status-file-lint.d.ts.map +1 -1
  215. package/dist/routing/types.d.ts +16 -4
  216. package/dist/routing/types.d.ts.map +1 -1
  217. package/dist/rsc-runtime/rsc.d.ts +1 -1
  218. package/dist/rsc-runtime/rsc.d.ts.map +1 -1
  219. package/dist/rsc-runtime/ssr.d.ts +12 -0
  220. package/dist/rsc-runtime/ssr.d.ts.map +1 -1
  221. package/dist/schema-bridge.d.ts +76 -0
  222. package/dist/schema-bridge.d.ts.map +1 -0
  223. package/dist/search-params/define.d.ts +139 -0
  224. package/dist/search-params/define.d.ts.map +1 -0
  225. package/dist/search-params/index.d.ts +4 -7
  226. package/dist/search-params/index.d.ts.map +1 -1
  227. package/dist/search-params/index.js +4 -474
  228. package/dist/search-params/registry.d.ts +2 -2
  229. package/dist/search-params/registry.d.ts.map +1 -1
  230. package/dist/search-params/wrappers.d.ts +53 -0
  231. package/dist/search-params/wrappers.d.ts.map +1 -0
  232. package/dist/segment-params/define.d.ts +78 -0
  233. package/dist/segment-params/define.d.ts.map +1 -0
  234. package/dist/segment-params/index.d.ts +6 -0
  235. package/dist/segment-params/index.d.ts.map +1 -0
  236. package/dist/segment-params/index.js +4 -0
  237. package/dist/server/access-gate.d.ts +4 -0
  238. package/dist/server/access-gate.d.ts.map +1 -1
  239. package/dist/server/action-client.d.ts +12 -1
  240. package/dist/server/action-client.d.ts.map +1 -1
  241. package/dist/server/action-encryption.d.ts +76 -0
  242. package/dist/server/action-encryption.d.ts.map +1 -0
  243. package/dist/server/action-handler.d.ts.map +1 -1
  244. package/dist/server/actions.d.ts +3 -6
  245. package/dist/server/actions.d.ts.map +1 -1
  246. package/dist/server/als-registry.d.ts +32 -4
  247. package/dist/server/als-registry.d.ts.map +1 -1
  248. package/dist/server/build-manifest.d.ts +2 -2
  249. package/dist/server/build-manifest.d.ts.map +1 -1
  250. package/dist/server/debug.d.ts +1 -1
  251. package/dist/server/default-logger.d.ts +22 -0
  252. package/dist/server/default-logger.d.ts.map +1 -0
  253. package/dist/server/deny-page-resolver.d.ts +52 -0
  254. package/dist/server/deny-page-resolver.d.ts.map +1 -0
  255. package/dist/server/deny-renderer.d.ts.map +1 -1
  256. package/dist/server/dev-holding-server.d.ts +52 -0
  257. package/dist/server/dev-holding-server.d.ts.map +1 -0
  258. package/dist/server/dev-warnings.d.ts +1 -21
  259. package/dist/server/dev-warnings.d.ts.map +1 -1
  260. package/dist/server/early-hints.d.ts +13 -5
  261. package/dist/server/early-hints.d.ts.map +1 -1
  262. package/dist/server/error-boundary-wrapper.d.ts +7 -1
  263. package/dist/server/error-boundary-wrapper.d.ts.map +1 -1
  264. package/dist/server/fallback-error.d.ts +4 -3
  265. package/dist/server/fallback-error.d.ts.map +1 -1
  266. package/dist/server/flight-injection-state.d.ts +66 -0
  267. package/dist/server/flight-injection-state.d.ts.map +1 -0
  268. package/dist/server/flight-scripts.d.ts +42 -0
  269. package/dist/server/flight-scripts.d.ts.map +1 -0
  270. package/dist/server/flush.d.ts.map +1 -1
  271. package/dist/server/form-data.d.ts +29 -0
  272. package/dist/server/form-data.d.ts.map +1 -1
  273. package/dist/server/html-injectors.d.ts +51 -11
  274. package/dist/server/html-injectors.d.ts.map +1 -1
  275. package/dist/server/index.d.ts +6 -43
  276. package/dist/server/index.d.ts.map +1 -1
  277. package/dist/server/index.js +38 -2798
  278. package/dist/server/index.js.map +1 -1
  279. package/dist/server/internal.d.ts +46 -0
  280. package/dist/server/internal.d.ts.map +1 -0
  281. package/dist/server/internal.js +2883 -0
  282. package/dist/server/internal.js.map +1 -0
  283. package/dist/server/logger.d.ts +25 -7
  284. package/dist/server/logger.d.ts.map +1 -1
  285. package/dist/server/middleware-runner.d.ts +19 -4
  286. package/dist/server/middleware-runner.d.ts.map +1 -1
  287. package/dist/server/node-stream-transforms.d.ts +113 -0
  288. package/dist/server/node-stream-transforms.d.ts.map +1 -0
  289. package/dist/server/page-deny-boundary.d.ts +31 -0
  290. package/dist/server/page-deny-boundary.d.ts.map +1 -0
  291. package/dist/server/pipeline-interception.d.ts +1 -1
  292. package/dist/server/pipeline-interception.d.ts.map +1 -1
  293. package/dist/server/pipeline-metadata.d.ts +6 -0
  294. package/dist/server/pipeline-metadata.d.ts.map +1 -1
  295. package/dist/server/pipeline.d.ts +42 -10
  296. package/dist/server/pipeline.d.ts.map +1 -1
  297. package/dist/server/primitives.d.ts +69 -18
  298. package/dist/server/primitives.d.ts.map +1 -1
  299. package/dist/server/render-timeout.d.ts +51 -0
  300. package/dist/server/render-timeout.d.ts.map +1 -0
  301. package/dist/server/request-context.d.ts +112 -43
  302. package/dist/server/request-context.d.ts.map +1 -1
  303. package/dist/server/route-element-builder.d.ts +27 -1
  304. package/dist/server/route-element-builder.d.ts.map +1 -1
  305. package/dist/server/route-handler.d.ts.map +1 -1
  306. package/dist/server/route-matcher.d.ts +9 -2
  307. package/dist/server/route-matcher.d.ts.map +1 -1
  308. package/dist/server/rsc-entry/api-handler.d.ts +2 -2
  309. package/dist/server/rsc-entry/api-handler.d.ts.map +1 -1
  310. package/dist/server/rsc-entry/error-renderer.d.ts +26 -13
  311. package/dist/server/rsc-entry/error-renderer.d.ts.map +1 -1
  312. package/dist/server/rsc-entry/helpers.d.ts +48 -5
  313. package/dist/server/rsc-entry/helpers.d.ts.map +1 -1
  314. package/dist/server/rsc-entry/index.d.ts +8 -3
  315. package/dist/server/rsc-entry/index.d.ts.map +1 -1
  316. package/dist/server/rsc-entry/rsc-payload.d.ts +3 -3
  317. package/dist/server/rsc-entry/rsc-payload.d.ts.map +1 -1
  318. package/dist/server/rsc-entry/rsc-stream.d.ts +4 -1
  319. package/dist/server/rsc-entry/rsc-stream.d.ts.map +1 -1
  320. package/dist/server/rsc-entry/ssr-bridge.d.ts +1 -1
  321. package/dist/server/rsc-entry/ssr-bridge.d.ts.map +1 -1
  322. package/dist/server/rsc-entry/ssr-renderer.d.ts +19 -4
  323. package/dist/server/rsc-entry/ssr-renderer.d.ts.map +1 -1
  324. package/dist/server/safe-load.d.ts +46 -0
  325. package/dist/server/safe-load.d.ts.map +1 -0
  326. package/dist/server/sitemap-generator.d.ts +129 -0
  327. package/dist/server/sitemap-generator.d.ts.map +1 -0
  328. package/dist/server/sitemap-handler.d.ts +22 -0
  329. package/dist/server/sitemap-handler.d.ts.map +1 -0
  330. package/dist/server/slot-resolver.d.ts +1 -1
  331. package/dist/server/slot-resolver.d.ts.map +1 -1
  332. package/dist/server/ssr-entry.d.ts +22 -0
  333. package/dist/server/ssr-entry.d.ts.map +1 -1
  334. package/dist/server/ssr-render.d.ts +39 -21
  335. package/dist/server/ssr-render.d.ts.map +1 -1
  336. package/dist/server/ssr-wrappers.d.ts +50 -0
  337. package/dist/server/ssr-wrappers.d.ts.map +1 -0
  338. package/dist/server/status-code-resolver.d.ts +1 -1
  339. package/dist/server/status-code-resolver.d.ts.map +1 -1
  340. package/dist/server/stream-utils.d.ts +36 -0
  341. package/dist/server/stream-utils.d.ts.map +1 -0
  342. package/dist/server/tracing.d.ts +4 -4
  343. package/dist/server/tracing.d.ts.map +1 -1
  344. package/dist/server/tree-builder.d.ts +22 -19
  345. package/dist/server/tree-builder.d.ts.map +1 -1
  346. package/dist/server/types.d.ts +1 -4
  347. package/dist/server/types.d.ts.map +1 -1
  348. package/dist/server/version-skew.d.ts +61 -0
  349. package/dist/server/version-skew.d.ts.map +1 -0
  350. package/dist/shared/merge-search-params.d.ts +22 -0
  351. package/dist/shared/merge-search-params.d.ts.map +1 -0
  352. package/dist/shims/font-google.d.ts +1 -1
  353. package/dist/shims/font-google.d.ts.map +1 -1
  354. package/dist/shims/font-google.js +42 -0
  355. package/dist/shims/font-google.js.map +1 -0
  356. package/dist/shims/font-local.d.ts +26 -0
  357. package/dist/shims/font-local.d.ts.map +1 -0
  358. package/dist/shims/font-local.js +20 -0
  359. package/dist/shims/font-local.js.map +1 -0
  360. package/dist/shims/headers.d.ts +2 -1
  361. package/dist/shims/headers.d.ts.map +1 -1
  362. package/dist/shims/navigation-client.d.ts +1 -1
  363. package/dist/shims/navigation-client.d.ts.map +1 -1
  364. package/dist/shims/navigation.d.ts +3 -2
  365. package/dist/shims/navigation.d.ts.map +1 -1
  366. package/dist/utils/directive-parser.d.ts +5 -2
  367. package/dist/utils/directive-parser.d.ts.map +1 -1
  368. package/dist/utils/state-machine.d.ts +80 -0
  369. package/dist/utils/state-machine.d.ts.map +1 -0
  370. package/package.json +53 -23
  371. package/src/adapters/cloudflare-dev.ts +177 -0
  372. package/src/adapters/cloudflare-kv-cache.ts +142 -0
  373. package/src/adapters/cloudflare.ts +342 -28
  374. package/src/adapters/compress-module.ts +24 -4
  375. package/src/adapters/nitro.ts +52 -8
  376. package/src/adapters/wrangler.d.ts +7 -0
  377. package/src/cache/cache-api.ts +38 -0
  378. package/src/cache/handler-store.ts +68 -0
  379. package/src/cache/index.ts +81 -18
  380. package/src/cache/singleflight.ts +62 -4
  381. package/src/cache/sizeof.ts +31 -0
  382. package/src/cache/timber-cache.ts +24 -20
  383. package/src/cli.ts +6 -1
  384. package/src/client/browser-dev.ts +128 -1
  385. package/src/client/browser-entry/action-dispatch.ts +116 -0
  386. package/src/client/browser-entry/hmr.ts +81 -0
  387. package/src/client/browser-entry/hydrate.ts +145 -0
  388. package/src/client/browser-entry/index.ts +138 -0
  389. package/src/client/browser-entry/post-hydration.ts +119 -0
  390. package/src/client/browser-entry/router-init.ts +193 -0
  391. package/src/client/browser-entry/rsc-stream.ts +157 -0
  392. package/src/client/browser-entry/scroll.ts +27 -0
  393. package/src/client/error-boundary.tsx +48 -16
  394. package/src/client/error-reconstituter.tsx +65 -0
  395. package/src/client/form.tsx +2 -2
  396. package/src/client/history.ts +26 -4
  397. package/src/client/index.ts +19 -38
  398. package/src/client/internal.ts +57 -0
  399. package/src/client/link-pending-store.ts +111 -0
  400. package/src/client/link.tsx +329 -97
  401. package/src/client/nav-link-store.ts +47 -0
  402. package/src/client/navigation-api-types.ts +112 -0
  403. package/src/client/navigation-api.ts +332 -0
  404. package/src/client/navigation-context.ts +31 -6
  405. package/src/client/navigation-root.tsx +342 -0
  406. package/src/client/nuqs-adapter.tsx +16 -3
  407. package/src/client/router-ref.ts +1 -1
  408. package/src/client/router.ts +299 -72
  409. package/src/client/rsc-fetch.ts +97 -8
  410. package/src/client/segment-cache.ts +1 -1
  411. package/src/client/segment-outlet.tsx +86 -0
  412. package/src/client/ssr-data.ts +13 -5
  413. package/src/client/stale-reload.ts +72 -3
  414. package/src/client/top-loader.tsx +16 -8
  415. package/src/client/use-link-status.ts +7 -7
  416. package/src/client/use-params.ts +7 -5
  417. package/src/client/{use-navigation-pending.ts → use-pending-navigation.ts} +6 -6
  418. package/src/client/use-query-states.ts +3 -3
  419. package/src/client/use-router.ts +1 -1
  420. package/src/codec.ts +49 -0
  421. package/src/config-types.ts +208 -0
  422. package/src/content/index.ts +5 -13
  423. package/src/cookies/define-cookie.ts +78 -25
  424. package/src/cookies/index.ts +8 -0
  425. package/src/fonts/css.ts +2 -1
  426. package/src/index.ts +258 -354
  427. package/src/plugin-context.ts +200 -0
  428. package/src/plugins/adapter-build.ts +8 -2
  429. package/src/plugins/build-manifest.ts +13 -2
  430. package/src/plugins/build-report.ts +3 -3
  431. package/src/plugins/client-chunks.ts +65 -0
  432. package/src/plugins/content.ts +1 -1
  433. package/src/plugins/dev-browser-logs.ts +288 -0
  434. package/src/plugins/dev-error-overlay.ts +70 -1
  435. package/src/plugins/dev-logs.ts +1 -1
  436. package/src/plugins/dev-server.ts +70 -9
  437. package/src/plugins/entries.ts +71 -10
  438. package/src/plugins/fonts.ts +168 -61
  439. package/src/plugins/mdx.ts +1 -1
  440. package/src/plugins/routing.ts +57 -17
  441. package/src/plugins/server-action-exports.ts +1 -1
  442. package/src/plugins/server-bundle.ts +32 -1
  443. package/src/plugins/shims.ts +135 -35
  444. package/src/plugins/static-build.ts +17 -11
  445. package/src/routing/codegen.ts +165 -105
  446. package/src/routing/index.ts +2 -0
  447. package/src/routing/scanner.ts +93 -23
  448. package/src/routing/segment-classify.ts +89 -0
  449. package/src/routing/status-file-lint.ts +3 -2
  450. package/src/routing/types.ts +17 -4
  451. package/src/rsc-runtime/rsc.ts +2 -0
  452. package/src/rsc-runtime/ssr.ts +50 -0
  453. package/src/rsc-runtime/vendor-types.d.ts +7 -0
  454. package/src/{search-params/codecs.ts → schema-bridge.ts} +57 -20
  455. package/src/search-params/define.ts +482 -0
  456. package/src/search-params/index.ts +14 -20
  457. package/src/search-params/registry.ts +2 -2
  458. package/src/search-params/wrappers.ts +85 -0
  459. package/src/segment-params/define.ts +279 -0
  460. package/src/segment-params/index.ts +29 -0
  461. package/src/server/access-gate.tsx +70 -29
  462. package/src/server/action-client.ts +21 -2
  463. package/src/server/action-encryption.ts +144 -0
  464. package/src/server/action-handler.ts +21 -4
  465. package/src/server/actions.ts +10 -9
  466. package/src/server/als-registry.ts +34 -6
  467. package/src/server/build-manifest.ts +10 -4
  468. package/src/server/compress.ts +25 -7
  469. package/src/server/debug.ts +1 -1
  470. package/src/server/default-logger.ts +99 -0
  471. package/src/server/deny-page-resolver.ts +154 -0
  472. package/src/server/deny-renderer.ts +24 -38
  473. package/src/server/dev-holding-server.ts +185 -0
  474. package/src/server/dev-warnings.ts +4 -49
  475. package/src/server/early-hints.ts +36 -15
  476. package/src/server/error-boundary-wrapper.ts +74 -22
  477. package/src/server/fallback-error.ts +31 -15
  478. package/src/server/flight-injection-state.ts +113 -0
  479. package/src/server/flight-scripts.ts +62 -0
  480. package/src/server/flush.ts +2 -1
  481. package/src/server/form-data.ts +76 -0
  482. package/src/server/html-injectors.ts +280 -120
  483. package/src/server/index.ts +26 -177
  484. package/src/server/internal.ts +169 -0
  485. package/src/server/logger.ts +44 -36
  486. package/src/server/middleware-runner.ts +31 -4
  487. package/src/server/node-stream-transforms.ts +509 -0
  488. package/src/server/page-deny-boundary.tsx +56 -0
  489. package/src/server/pipeline-interception.ts +17 -16
  490. package/src/server/pipeline-metadata.ts +13 -0
  491. package/src/server/pipeline.ts +227 -62
  492. package/src/server/primitives.ts +111 -28
  493. package/src/server/render-timeout.ts +108 -0
  494. package/src/server/request-context.ts +293 -132
  495. package/src/server/route-element-builder.ts +283 -191
  496. package/src/server/route-handler.ts +24 -4
  497. package/src/server/route-matcher.ts +24 -20
  498. package/src/server/rsc-entry/api-handler.ts +15 -16
  499. package/src/server/rsc-entry/error-renderer.ts +300 -89
  500. package/src/server/rsc-entry/helpers.ts +134 -5
  501. package/src/server/rsc-entry/index.ts +200 -112
  502. package/src/server/rsc-entry/rsc-payload.ts +65 -18
  503. package/src/server/rsc-entry/rsc-stream.ts +65 -13
  504. package/src/server/rsc-entry/ssr-bridge.ts +14 -5
  505. package/src/server/rsc-entry/ssr-renderer.ts +168 -38
  506. package/src/server/safe-load.ts +60 -0
  507. package/src/server/sitemap-generator.ts +338 -0
  508. package/src/server/sitemap-handler.ts +126 -0
  509. package/src/server/slot-resolver.ts +244 -229
  510. package/src/server/ssr-entry.ts +211 -32
  511. package/src/server/ssr-render.ts +289 -67
  512. package/src/server/ssr-wrappers.tsx +139 -0
  513. package/src/server/status-code-resolver.ts +1 -1
  514. package/src/server/stream-utils.ts +213 -0
  515. package/src/server/tracing.ts +20 -9
  516. package/src/server/tree-builder.ts +92 -58
  517. package/src/server/types.ts +3 -6
  518. package/src/server/version-skew.ts +104 -0
  519. package/src/shared/merge-search-params.ts +55 -0
  520. package/src/shims/font-google.ts +1 -1
  521. package/src/shims/font-local.ts +34 -0
  522. package/src/shims/headers.ts +5 -1
  523. package/src/shims/navigation-client.ts +1 -1
  524. package/src/shims/navigation.ts +7 -2
  525. package/src/utils/directive-parser.ts +5 -2
  526. package/src/utils/state-machine.ts +111 -0
  527. package/dist/_chunks/als-registry-B7DbZ2hS.js.map +0 -1
  528. package/dist/_chunks/debug-gwlJkDuf.js.map +0 -1
  529. package/dist/_chunks/format-DviM89f0.js.map +0 -1
  530. package/dist/_chunks/interception-BOoWmLUA.js.map +0 -1
  531. package/dist/_chunks/request-context-DIkVh_jG.js +0 -330
  532. package/dist/_chunks/request-context-DIkVh_jG.js.map +0 -1
  533. package/dist/_chunks/tracing-CemImE6h.js.map +0 -1
  534. package/dist/_chunks/use-cookie-DX-l1_5E.js +0 -91
  535. package/dist/_chunks/use-cookie-DX-l1_5E.js.map +0 -1
  536. package/dist/_chunks/use-query-states-D5KaffOK.js.map +0 -1
  537. package/dist/cache/register-cached-function.d.ts +0 -17
  538. package/dist/cache/register-cached-function.d.ts.map +0 -1
  539. package/dist/client/browser-entry.d.ts +0 -21
  540. package/dist/client/browser-entry.d.ts.map +0 -1
  541. package/dist/client/link-status-provider.d.ts +0 -11
  542. package/dist/client/link-status-provider.d.ts.map +0 -1
  543. package/dist/client/transition-root.d.ts.map +0 -1
  544. package/dist/client/use-navigation-pending.d.ts.map +0 -1
  545. package/dist/cookies/index.js.map +0 -1
  546. package/dist/plugins/cache-transform.d.ts +0 -36
  547. package/dist/plugins/cache-transform.d.ts.map +0 -1
  548. package/dist/plugins/dynamic-transform.d.ts +0 -72
  549. package/dist/plugins/dynamic-transform.d.ts.map +0 -1
  550. package/dist/search-params/analyze.d.ts +0 -54
  551. package/dist/search-params/analyze.d.ts.map +0 -1
  552. package/dist/search-params/builtin-codecs.d.ts +0 -105
  553. package/dist/search-params/builtin-codecs.d.ts.map +0 -1
  554. package/dist/search-params/codecs.d.ts +0 -53
  555. package/dist/search-params/codecs.d.ts.map +0 -1
  556. package/dist/search-params/create.d.ts +0 -106
  557. package/dist/search-params/create.d.ts.map +0 -1
  558. package/dist/search-params/index.js.map +0 -1
  559. package/dist/server/prerender.d.ts +0 -77
  560. package/dist/server/prerender.d.ts.map +0 -1
  561. package/dist/server/response-cache.d.ts +0 -54
  562. package/dist/server/response-cache.d.ts.map +0 -1
  563. package/src/cache/register-cached-function.ts +0 -103
  564. package/src/client/browser-entry.ts +0 -678
  565. package/src/client/link-status-provider.tsx +0 -30
  566. package/src/client/transition-root.tsx +0 -166
  567. package/src/plugins/cache-transform.ts +0 -199
  568. package/src/plugins/dynamic-transform.ts +0 -161
  569. package/src/search-params/analyze.ts +0 -192
  570. package/src/search-params/builtin-codecs.ts +0 -228
  571. package/src/search-params/create.ts +0 -321
  572. package/src/server/prerender.ts +0 -139
  573. package/src/server/response-cache.ts +0 -410
@@ -0,0 +1,332 @@
1
+ /**
2
+ * Navigation API integration — progressive enhancement for client navigation.
3
+ *
4
+ * When the Navigation API (`window.navigation`) is available, this module
5
+ * provides an intercept-based navigation model that replaces the separate
6
+ * popstate + click handler approach with a single navigate event listener.
7
+ *
8
+ * Key benefits:
9
+ * - Intercepts ALL navigations (link clicks, form submissions, back/forward)
10
+ * - Built-in AbortSignal per navigation (auto-aborts in-flight fetches)
11
+ * - Per-entry state via NavigationHistoryEntry.getState()
12
+ * - navigation.transition for progress tracking
13
+ *
14
+ * When unavailable, all functions are no-ops and the History API fallback
15
+ * in browser-entry.ts handles navigation.
16
+ *
17
+ * See design/19-client-navigation.md
18
+ */
19
+
20
+ import type { NavigationApi, NavigateEvent } from './navigation-api-types.js';
21
+ import { consumeNavLinkMetadata } from './nav-link-store.js';
22
+ import { isHardNavigating } from './navigation-root.js';
23
+
24
+ // ─── Feature Detection ───────────────────────────────────────────
25
+
26
+ /**
27
+ * Returns true if the Navigation API is available in the current environment.
28
+ * Feature-detected at runtime — no polyfill.
29
+ */
30
+ export function hasNavigationApi(): boolean {
31
+ return (
32
+ typeof window !== 'undefined' &&
33
+ 'navigation' in window &&
34
+ (window as unknown as { navigation: unknown }).navigation != null
35
+ );
36
+ }
37
+
38
+ /**
39
+ * Get the Navigation API instance. Returns null if unavailable.
40
+ * Uses type assertion — we never import Navigation API types unconditionally.
41
+ */
42
+ export function getNavigationApi(): NavigationApi | null {
43
+ if (!hasNavigationApi()) return null;
44
+ return (window as unknown as { navigation: NavigationApi }).navigation;
45
+ }
46
+
47
+ // ─── Navigation API Controller ───────────────────────────────────
48
+
49
+ /**
50
+ * Callbacks for the Navigation API event handler.
51
+ *
52
+ * When the Navigation API intercepts a navigation, it delegates to these
53
+ * callbacks which run the RSC fetch + render pipeline.
54
+ */
55
+ export interface NavigationApiCallbacks {
56
+ /**
57
+ * Handle a push/replace navigation intercepted by the Navigation API.
58
+ * This covers both Link <a> clicks (user-initiated, with metadata from
59
+ * nav-link-store) and external navigations (plain <a> tags, programmatic).
60
+ * The Navigation API handles the URL update via event.intercept().
61
+ */
62
+ onExternalNavigate: (
63
+ url: string,
64
+ options: { replace: boolean; signal: AbortSignal; scroll?: boolean }
65
+ ) => Promise<void>;
66
+
67
+ /**
68
+ * Handle a traversal (back/forward button). The Navigation API intercepts
69
+ * the traversal and delegates to us for RSC replay/fetch.
70
+ */
71
+ onTraverse: (url: string, scrollY: number, signal: AbortSignal) => Promise<void>;
72
+ }
73
+
74
+ /**
75
+ * Controller returned by setupNavigationApi. Provides methods to
76
+ * coordinate between the router and the navigate event listener.
77
+ */
78
+ export interface NavigationApiController {
79
+ /**
80
+ * Set the router-navigating flag. When `true`, the next navigate event
81
+ * (from pushState/replaceState) is recognized as router-initiated. The
82
+ * handler still intercepts it — but ties the browser's native loading
83
+ * state to a deferred promise instead of running the RSC pipeline again.
84
+ *
85
+ * This means `navigation.transition` is active for the full duration of
86
+ * every router-initiated navigation, giving the browser a native loading
87
+ * indicator (tab spinner, address bar) aligned with the TopLoader.
88
+ *
89
+ * Must be called synchronously around pushState/replaceState:
90
+ * controller.setRouterNavigating(true);
91
+ * history.pushState(...); // navigate event fires, intercepted
92
+ * controller.setRouterNavigating(false); // flag off, deferred stays open
93
+ */
94
+ setRouterNavigating: (value: boolean) => void;
95
+
96
+ /**
97
+ * Resolve the deferred promise created by setRouterNavigating(true),
98
+ * clearing the browser's native loading state. Call this when the
99
+ * navigation fully completes — aligned with when the TopLoader's
100
+ * pendingUrl clears (same finally block in router.navigate).
101
+ */
102
+ completeRouterNavigation: () => void;
103
+
104
+ /**
105
+ * Initiate a navigation via the Navigation API (`navigation.navigate()`).
106
+ * Unlike `history.pushState()`, this fires the navigate event BEFORE
107
+ * committing the URL — allowing Chrome to show its native loading
108
+ * indicator while the intercept handler runs.
109
+ *
110
+ * Must be called with setRouterNavigating(true) active so the handler
111
+ * recognizes it as router-initiated and uses the deferred promise.
112
+ */
113
+ navigate: (url: string, replace: boolean) => void;
114
+
115
+ /**
116
+ * Save scroll position into the current navigation entry's state.
117
+ * Uses navigation.updateCurrentEntry() for per-entry scroll storage.
118
+ */
119
+ saveScrollPosition: (scrollY: number) => void;
120
+
121
+ /**
122
+ * Check if the Navigation API has an active transition.
123
+ * Returns the transition object if available, null otherwise.
124
+ */
125
+ hasActiveTransition: () => boolean;
126
+
127
+ /** Remove the navigate event listener. */
128
+ cleanup: () => void;
129
+ }
130
+
131
+ /**
132
+ * Set up the Navigation API navigate event listener.
133
+ *
134
+ * Intercepts same-origin navigations and delegates to the provided callbacks.
135
+ * Router-initiated navigations (pushState from router.navigate) are detected
136
+ * via a synchronous flag and NOT intercepted — the router already handles them.
137
+ *
138
+ * Returns a controller for coordinating with the router.
139
+ */
140
+ export function setupNavigationApi(callbacks: NavigationApiCallbacks): NavigationApiController {
141
+ const nav = getNavigationApi()!;
142
+
143
+ let routerNavigating = false;
144
+
145
+ // Deferred promise for router-initiated navigations. Created when
146
+ // setRouterNavigating(true) is called, resolved by completeRouterNavigation().
147
+ // The navigate event handler intercepts with this promise so the browser's
148
+ // native loading state (tab spinner) stays active until the navigation
149
+ // completes — aligned with TopLoader's pendingUrl lifecycle.
150
+ let routerNavDeferred: { promise: Promise<void>; resolve: () => void } | null = null;
151
+
152
+ function handleNavigate(event: NavigateEvent): void {
153
+ // Skip non-interceptable navigations (cross-origin, etc.)
154
+ if (!event.canIntercept) return;
155
+
156
+ // Hard navigation guard: when the router has triggered a full page
157
+ // load (500 error, version skew), skip interception entirely so the
158
+ // browser performs the MPA navigation. Without this guard, setting
159
+ // window.location.href fires a navigate event that we'd intercept,
160
+ // running the RSC pipeline again → 500 → window.location.href →
161
+ // navigate event → infinite loop.
162
+ // See design/19-client-navigation.md §"Hard Navigation Guard"
163
+ if (isHardNavigating()) return;
164
+
165
+ // Skip download requests
166
+ if (event.downloadRequest) return;
167
+
168
+ // Skip hash-only changes — let the browser handle scroll-to-anchor
169
+ if (event.hashChange) return;
170
+
171
+ // Shallow URL updates (e.g., nuqs search param changes). The navigation
172
+ // only changes the URL — no server round trip needed. Intercept with a
173
+ // no-op handler so the Navigation API commits the URL change without
174
+ // triggering a full page navigation (which is the default if we don't
175
+ // intercept). The info property is the Navigation API's built-in
176
+ // per-navigation metadata — no side-channel flags needed.
177
+ const info = event.info as { shallow?: boolean } | null | undefined;
178
+ if (info?.shallow) {
179
+ event.intercept({
180
+ handler: () => Promise.resolve(),
181
+ focusReset: 'manual',
182
+ scroll: 'manual',
183
+ });
184
+ return;
185
+ }
186
+
187
+ // Skip form submissions with a body (POST/PUT/etc.). These need the
188
+ // browser's native form handling to send the request body to the server.
189
+ // Intercepting would convert them into GET RSC navigations, dropping
190
+ // the form data. Server actions use fetch() directly (not form navigation),
191
+ // so they are unaffected by this check.
192
+ if (event.formData) return;
193
+
194
+ // Skip cross-origin (defense-in-depth — canIntercept covers this)
195
+ const destUrl = new URL(event.destination.url);
196
+ if (destUrl.origin !== location.origin) return;
197
+
198
+ // Router-initiated navigation (Link click → router.navigate → pushState).
199
+ // The router is already running the RSC pipeline — don't run it again.
200
+ // Instead, intercept with the deferred promise so the browser's native
201
+ // loading state tracks the navigation's full lifecycle. This aligns the
202
+ // tab spinner / address bar indicator with the TopLoader.
203
+ if (routerNavigating && routerNavDeferred) {
204
+ event.intercept({
205
+ scroll: 'manual',
206
+ focusReset: 'manual',
207
+ handler: () => routerNavDeferred!.promise,
208
+ });
209
+ return;
210
+ }
211
+
212
+ // Skip reload navigations — let the browser handle full page reload
213
+ if (event.navigationType === 'reload') return;
214
+
215
+ const url = destUrl.pathname + destUrl.search;
216
+
217
+ if (event.navigationType === 'traverse') {
218
+ // Back/forward button — intercept and delegate to router.
219
+ // Read scroll position from the destination entry's state.
220
+ const entryState = event.destination.getState() as
221
+ | { scrollY?: number; timber?: boolean }
222
+ | null
223
+ | undefined;
224
+ const scrollY = entryState && typeof entryState.scrollY === 'number' ? entryState.scrollY : 0;
225
+
226
+ event.intercept({
227
+ // Manual scroll — we handle scroll restoration ourselves
228
+ // via afterPaint (same as the History API path).
229
+ scroll: 'manual',
230
+ focusReset: 'manual',
231
+ async handler() {
232
+ await callbacks.onTraverse(url, scrollY, event.signal);
233
+ },
234
+ });
235
+ } else if (event.navigationType === 'push' || event.navigationType === 'replace') {
236
+ // Push/replace — either a Link <a> click (with metadata in
237
+ // nav-link-store) or an external navigation (plain <a>, programmatic).
238
+ // Consume link metadata if present — tells us scroll preference
239
+ // and which Link component to track pending state for.
240
+ const linkMeta = consumeNavLinkMetadata();
241
+
242
+ // Save the departing page's scroll position BEFORE event.intercept()
243
+ // commits the URL change. Once intercept() is called, currentEntry
244
+ // switches to the new (destination) entry — any updateCurrentEntry()
245
+ // call after that would save to the wrong entry.
246
+ // See: router.navigate() also calls saveNavigationEntryScroll(), but
247
+ // for Navigation API <a> click navigations (where Link does NOT call
248
+ // router.navigate directly), the router's save runs inside the
249
+ // intercept handler — too late, currentEntry has already switched.
250
+ try {
251
+ const currentState = (nav.currentEntry?.getState() ?? {}) as Record<string, unknown>;
252
+ nav.updateCurrentEntry({
253
+ state: { ...currentState, timber: true, scrollY: window.scrollY },
254
+ });
255
+ } catch {
256
+ // Ignore — entry may be disposed
257
+ }
258
+
259
+ event.intercept({
260
+ scroll: 'manual',
261
+ focusReset: 'manual',
262
+ async handler() {
263
+ await callbacks.onExternalNavigate(url, {
264
+ replace: event.navigationType === 'replace',
265
+ signal: event.signal,
266
+ scroll: linkMeta?.scroll,
267
+ });
268
+ },
269
+ });
270
+ }
271
+ }
272
+
273
+ nav.addEventListener('navigate', handleNavigate as EventListener);
274
+
275
+ return {
276
+ setRouterNavigating(value: boolean): void {
277
+ routerNavigating = value;
278
+ if (value) {
279
+ // Create a new deferred promise. The navigate event handler will
280
+ // intercept and tie the browser's loading state to this promise.
281
+ let resolve!: () => void;
282
+ const promise = new Promise<void>((r) => {
283
+ resolve = r;
284
+ });
285
+ routerNavDeferred = { promise, resolve };
286
+ } else {
287
+ // Flag off — but DON'T resolve the deferred here. The navigation
288
+ // is still in flight (RSC fetch + render). completeRouterNavigation()
289
+ // resolves it when the navigation fully completes.
290
+ routerNavigating = false;
291
+ }
292
+ },
293
+
294
+ completeRouterNavigation(): void {
295
+ if (routerNavDeferred) {
296
+ routerNavDeferred.resolve();
297
+ routerNavDeferred = null;
298
+ }
299
+ },
300
+
301
+ navigate(url: string, replace: boolean): void {
302
+ // Use navigation.navigate() instead of history.pushState().
303
+ // This fires the navigate event BEFORE committing the URL,
304
+ // which lets Chrome show its native loading indicator while
305
+ // the intercept handler (deferred promise) is pending.
306
+ // history.pushState() commits the URL synchronously, so Chrome
307
+ // sees the navigation as already complete and skips the indicator.
308
+ nav.navigate(url, {
309
+ history: replace ? 'replace' : 'push',
310
+ });
311
+ },
312
+
313
+ saveScrollPosition(scrollY: number): void {
314
+ try {
315
+ const currentState = (nav.currentEntry?.getState() ?? {}) as Record<string, unknown>;
316
+ nav.updateCurrentEntry({
317
+ state: { ...currentState, timber: true, scrollY },
318
+ });
319
+ } catch {
320
+ // Ignore errors — updateCurrentEntry may throw if entry is disposed
321
+ }
322
+ },
323
+
324
+ hasActiveTransition(): boolean {
325
+ return nav.transition != null;
326
+ },
327
+
328
+ cleanup(): void {
329
+ nav.removeEventListener('navigate', handleNavigate as EventListener);
330
+ },
331
+ };
332
+ }
@@ -5,7 +5,7 @@
5
5
  *
6
6
  * Holds the current route params and pathname, updated atomically
7
7
  * with the RSC tree on each navigation. This replaces the previous
8
- * useSyncExternalStore approach for useParams() and usePathname(),
8
+ * useSyncExternalStore approach for useSegmentParams() and usePathname(),
9
9
  * which suffered from a timing gap: the new tree could commit before
10
10
  * the external store re-renders fired, causing a frame where both
11
11
  * old and new active states were visible simultaneously.
@@ -62,11 +62,15 @@ export interface NavigationState {
62
62
  * Context instances are stored on globalThis (NOT in module-level
63
63
  * variables) because the ESM bundler can duplicate this module across
64
64
  * chunks. Module-level variables would create separate instances per
65
- * chunk — the provider in TransitionRoot (index chunk) would use
66
- * context A while the consumer in LinkStatusProvider (shared chunk)
65
+ * chunk — the provider in NavigationRoot (index chunk) would use
66
+ * context A while the consumer in usePendingNavigation (shared chunk)
67
67
  * reads from context B. globalThis guarantees a single instance.
68
68
  *
69
69
  * See design/27-chunking-strategy.md §"Singleton Safety"
70
+ *
71
+ * NOTE: Despite similar naming, `usePendingNavigationUrl()` here is an
72
+ * internal helper — the public hook is `usePendingNavigation()` in
73
+ * use-pending-navigation.ts.
70
74
  */
71
75
 
72
76
  // Symbol keys for globalThis storage — prevents collisions with user code
@@ -90,7 +94,7 @@ function getOrCreateContext(): React.Context<NavigationState | null> | undefined
90
94
  /**
91
95
  * Read the navigation context. Returns null during SSR (no provider)
92
96
  * or in the RSC environment (no context available).
93
- * Internal — used by useParams() and usePathname().
97
+ * Internal — used by useSegmentParams() and usePathname().
94
98
  */
95
99
  export function useNavigationContext(): NavigationState | null {
96
100
  const ctx = getOrCreateContext();
@@ -168,8 +172,9 @@ export function getNavigationState(): NavigationState {
168
172
 
169
173
  /**
170
174
  * Separate context for the in-flight navigation URL. Provided by
171
- * TransitionRoot (urgent useState), consumed by LinkStatusProvider
172
- * and useNavigationPending.
175
+ * NavigationRoot (urgent useState), consumed by usePendingNavigation
176
+ * and TopLoader. Per-link pending state uses useOptimistic instead
177
+ * (see link-pending-store.ts).
173
178
  *
174
179
  * Uses globalThis via Symbol.for for the same reason as NavigationContext
175
180
  * above — the bundler may duplicate this module across chunks, and module-
@@ -217,3 +222,23 @@ export function PendingNavigationProvider({
217
222
  }
218
223
  return createElement(ctx.Provider, { value }, children);
219
224
  }
225
+
226
+ // ---------------------------------------------------------------------------
227
+ // Navigation API transition state (optional progressive enhancement)
228
+ // ---------------------------------------------------------------------------
229
+
230
+ /**
231
+ * Check if the browser's Navigation API has an active transition.
232
+ *
233
+ * When the Navigation API is available and a navigation has been intercepted
234
+ * via event.intercept(), `navigation.transition` is non-null until the
235
+ * handler resolves. This provides browser-native progress tracking that
236
+ * can be used alongside the existing pendingUrl mechanism.
237
+ *
238
+ * Returns false when Navigation API is unavailable or no transition is active.
239
+ */
240
+ export function hasNativeNavigationTransition(): boolean {
241
+ if (typeof window === 'undefined') return false;
242
+ const nav = (window as unknown as { navigation?: { transition?: unknown } }).navigation;
243
+ return nav?.transition != null;
244
+ }