@vizejs/composable 0.426.2 → 0.427.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (544) hide show
  1. package/dist/abort-signal.d.mts +1 -1
  2. package/dist/active-element.d.mts +37 -0
  3. package/dist/active-element.mjs +56 -0
  4. package/dist/animate.d.mts +114 -0
  5. package/dist/animate.mjs +157 -0
  6. package/dist/battery.d.mts +61 -0
  7. package/dist/battery.mjs +90 -0
  8. package/dist/breakpoints.d.mts +82 -0
  9. package/dist/breakpoints.mjs +91 -0
  10. package/dist/catalog-BeTXFKxF.d.mts +4188 -0
  11. package/dist/catalog-r4Z5nptX.mjs +5144 -0
  12. package/dist/catalog.d.mts +1 -1
  13. package/dist/catalog.mjs +1 -1
  14. package/dist/color-mode.d.mts +131 -0
  15. package/dist/color-mode.mjs +133 -0
  16. package/dist/computed-async.d.mts +63 -0
  17. package/dist/computed-async.mjs +43 -0
  18. package/dist/computed-with-control.d.mts +44 -0
  19. package/dist/computed-with-control.mjs +54 -0
  20. package/dist/create-event-hook.d.mts +77 -0
  21. package/dist/create-event-hook.mjs +66 -0
  22. package/dist/create-global-state.d.mts +24 -0
  23. package/dist/create-global-state.mjs +34 -0
  24. package/dist/create-injection-state.d.mts +51 -0
  25. package/dist/create-injection-state.mjs +19 -0
  26. package/dist/create-shared-composable.d.mts +38 -0
  27. package/dist/create-shared-composable.mjs +54 -0
  28. package/dist/device-motion.d.mts +71 -0
  29. package/dist/device-motion.mjs +75 -0
  30. package/dist/device-orientation.d.mts +82 -0
  31. package/dist/device-orientation.mjs +86 -0
  32. package/dist/device-pixel-ratio.d.mts +45 -0
  33. package/dist/device-pixel-ratio.mjs +50 -0
  34. package/dist/document-visibility.mjs +6 -2
  35. package/dist/draggable.d.mts +121 -0
  36. package/dist/draggable.mjs +153 -0
  37. package/dist/element-bounding.d.mts +87 -0
  38. package/dist/element-bounding.mjs +95 -0
  39. package/dist/element-by-point.d.mts +70 -0
  40. package/dist/element-by-point.mjs +69 -0
  41. package/dist/element-hover.d.mts +42 -0
  42. package/dist/element-hover.mjs +70 -0
  43. package/dist/element-ref.d.mts +34 -0
  44. package/dist/element-ref.mjs +23 -0
  45. package/dist/element-target-Crpxl4D9.d.mts +60 -0
  46. package/dist/element-target.d.mts +2 -0
  47. package/dist/element-target.mjs +58 -0
  48. package/dist/event-listener.mjs +7 -3
  49. package/dist/focus.d.mts +69 -0
  50. package/dist/focus.mjs +124 -0
  51. package/dist/fps.d.mts +59 -0
  52. package/dist/fps.mjs +64 -0
  53. package/dist/geolocation.d.mts +98 -0
  54. package/dist/geolocation.mjs +86 -0
  55. package/dist/i18n.d.mts +237 -0
  56. package/dist/i18n.mjs +215 -0
  57. package/dist/icu-message.d.mts +235 -0
  58. package/dist/icu-message.mjs +343 -0
  59. package/dist/idle.d.mts +79 -0
  60. package/dist/idle.mjs +90 -0
  61. package/dist/index.d.mts +172 -6
  62. package/dist/index.mjs +173 -7
  63. package/dist/infinite-scroll.d.mts +56 -0
  64. package/dist/infinite-scroll.mjs +72 -0
  65. package/dist/intersection-observer.d.mts +122 -0
  66. package/dist/intersection-observer.mjs +117 -0
  67. package/dist/magic-keys.d.mts +121 -0
  68. package/dist/magic-keys.mjs +163 -0
  69. package/dist/math.d.mts +96 -0
  70. package/dist/math.mjs +84 -0
  71. package/dist/media-query.d.mts +3 -1
  72. package/dist/media-query.mjs +5 -3
  73. package/dist/mouse-in-element.d.mts +49 -0
  74. package/dist/mouse-in-element.mjs +66 -0
  75. package/dist/mouse.d.mts +77 -0
  76. package/dist/mouse.mjs +100 -0
  77. package/dist/mutation-observer.d.mts +98 -0
  78. package/dist/mutation-observer.mjs +69 -0
  79. package/dist/network.d.mts +96 -0
  80. package/dist/network.mjs +117 -0
  81. package/dist/on-click-outside.d.mts +69 -0
  82. package/dist/on-click-outside.mjs +115 -0
  83. package/dist/on-key-stroke.d.mts +71 -0
  84. package/dist/on-key-stroke.mjs +79 -0
  85. package/dist/on-long-press.d.mts +82 -0
  86. package/dist/on-long-press.mjs +105 -0
  87. package/dist/on-start-typing.d.mts +44 -0
  88. package/dist/on-start-typing.mjs +61 -0
  89. package/dist/page-leave.d.mts +26 -0
  90. package/dist/page-leave.mjs +40 -0
  91. package/dist/parent-element.d.mts +16 -0
  92. package/dist/parent-element.mjs +27 -0
  93. package/dist/pinch.d.mts +73 -0
  94. package/dist/pinch.mjs +138 -0
  95. package/dist/pointer-lock.d.mts +79 -0
  96. package/dist/pointer-lock.mjs +126 -0
  97. package/dist/pointer.d.mts +78 -0
  98. package/dist/pointer.mjs +95 -0
  99. package/dist/preferences.d.mts +55 -0
  100. package/dist/preferences.mjs +63 -0
  101. package/dist/preferred-languages.d.mts +43 -0
  102. package/dist/preferred-languages.mjs +44 -0
  103. package/dist/reactify.d.mts +28 -0
  104. package/dist/reactify.mjs +7 -0
  105. package/dist/ref-auto-reset.d.mts +47 -0
  106. package/dist/ref-auto-reset.mjs +70 -0
  107. package/dist/ref-debounced.d.mts +29 -0
  108. package/dist/ref-debounced.mjs +29 -0
  109. package/dist/ref-default.d.mts +27 -0
  110. package/dist/ref-default.mjs +33 -0
  111. package/dist/resize-observer.d.mts +96 -0
  112. package/dist/resize-observer.mjs +111 -0
  113. package/dist/resolver.d.mts +124 -0
  114. package/dist/resolver.mjs +138 -0
  115. package/dist/retry-async.d.mts +2 -2
  116. package/dist/retry-delay-DYsdq4SE.d.mts +73 -0
  117. package/dist/retry-delay.d.mts +1 -72
  118. package/dist/screen-orientation.d.mts +77 -0
  119. package/dist/screen-orientation.mjs +74 -0
  120. package/dist/scroll-lock.d.mts +37 -0
  121. package/dist/scroll-lock.mjs +50 -0
  122. package/dist/scroll.d.mts +158 -0
  123. package/dist/scroll.mjs +172 -0
  124. package/dist/standard-schema-DmNgFVK5.d.mts +107 -0
  125. package/dist/standard-schema.d.mts +2 -0
  126. package/dist/standard-schema.mjs +60 -0
  127. package/dist/swipe.d.mts +125 -0
  128. package/dist/swipe.mjs +225 -0
  129. package/dist/sync-ref.d.mts +80 -0
  130. package/dist/sync-ref.mjs +43 -0
  131. package/dist/text-selection.d.mts +46 -0
  132. package/dist/text-selection.mjs +62 -0
  133. package/dist/textarea-autosize.d.mts +58 -0
  134. package/dist/textarea-autosize.mjs +54 -0
  135. package/dist/timeout-scheduler-CI8RVLZs.d.mts +18 -0
  136. package/dist/timeout-scheduler.d.mts +1 -17
  137. package/dist/to-reactive.d.mts +26 -0
  138. package/dist/to-reactive.mjs +46 -0
  139. package/dist/transition.d.mts +125 -0
  140. package/dist/transition.mjs +266 -0
  141. package/dist/until.d.mts +177 -0
  142. package/dist/until.mjs +111 -0
  143. package/dist/use-array.d.mts +112 -0
  144. package/dist/use-array.mjs +90 -0
  145. package/dist/use-async-queue.d.mts +109 -0
  146. package/dist/use-async-queue.mjs +96 -0
  147. package/dist/use-async-state.d.mts +86 -0
  148. package/dist/use-async-state.mjs +41 -0
  149. package/dist/use-barcode-detector.d.mts +159 -0
  150. package/dist/use-barcode-detector.mjs +143 -0
  151. package/dist/use-bluetooth.d.mts +164 -0
  152. package/dist/use-bluetooth.mjs +183 -0
  153. package/dist/use-broadcast-channel.d.mts +115 -0
  154. package/dist/use-broadcast-channel.mjs +121 -0
  155. package/dist/use-builtin-ai.d.mts +342 -0
  156. package/dist/use-builtin-ai.mjs +261 -0
  157. package/dist/use-clipboard.d.mts +169 -0
  158. package/dist/use-clipboard.mjs +226 -0
  159. package/dist/use-compression-stream.d.mts +173 -0
  160. package/dist/use-compression-stream.mjs +166 -0
  161. package/dist/use-confirm-dialog.d.mts +70 -0
  162. package/dist/use-confirm-dialog.mjs +57 -0
  163. package/dist/use-contact-picker.d.mts +117 -0
  164. package/dist/use-contact-picker.mjs +103 -0
  165. package/dist/use-cookie.d.mts +196 -0
  166. package/dist/use-cookie.mjs +259 -0
  167. package/dist/use-countdown.d.mts +85 -0
  168. package/dist/use-countdown.mjs +74 -0
  169. package/dist/use-css-var.d.mts +96 -0
  170. package/dist/use-css-var.mjs +104 -0
  171. package/dist/use-cycle-list.d.mts +76 -0
  172. package/dist/use-cycle-list.mjs +39 -0
  173. package/dist/use-date-format.d.mts +103 -0
  174. package/dist/use-date-format.mjs +147 -0
  175. package/dist/use-date-time-format.d.mts +75 -0
  176. package/dist/use-date-time-format.mjs +53 -0
  177. package/dist/use-debounced.d.mts +1 -1
  178. package/dist/use-display-media.d.mts +62 -0
  179. package/dist/use-display-media.mjs +46 -0
  180. package/dist/use-display-names.d.mts +75 -0
  181. package/dist/use-display-names.mjs +52 -0
  182. package/dist/use-document-title.d.mts +88 -0
  183. package/dist/use-document-title.mjs +100 -0
  184. package/dist/use-drop-zone.d.mts +128 -0
  185. package/dist/use-drop-zone.mjs +154 -0
  186. package/dist/use-event-source.d.mts +184 -0
  187. package/dist/use-event-source.mjs +226 -0
  188. package/dist/use-eye-dropper.d.mts +79 -0
  189. package/dist/use-eye-dropper.mjs +68 -0
  190. package/dist/use-favicon.d.mts +78 -0
  191. package/dist/use-favicon.mjs +68 -0
  192. package/dist/use-fetch.d.mts +230 -0
  193. package/dist/use-fetch.mjs +263 -0
  194. package/dist/use-field.d.mts +107 -0
  195. package/dist/use-field.mjs +117 -0
  196. package/dist/use-file-dialog.d.mts +139 -0
  197. package/dist/use-file-dialog.mjs +101 -0
  198. package/dist/use-file-system-access.d.mts +184 -0
  199. package/dist/use-file-system-access.mjs +151 -0
  200. package/dist/use-form-field-props.d.mts +235 -0
  201. package/dist/use-form-field-props.mjs +164 -0
  202. package/dist/use-form.d.mts +324 -0
  203. package/dist/use-form.mjs +482 -0
  204. package/dist/use-fullscreen.d.mts +104 -0
  205. package/dist/use-fullscreen.mjs +95 -0
  206. package/dist/use-gamepad.d.mts +242 -0
  207. package/dist/use-gamepad.mjs +218 -0
  208. package/dist/use-hid.d.mts +160 -0
  209. package/dist/use-hid.mjs +156 -0
  210. package/dist/use-id-generator.d.mts +44 -0
  211. package/dist/use-id-generator.mjs +38 -0
  212. package/dist/use-image.d.mts +125 -0
  213. package/dist/use-image.mjs +109 -0
  214. package/dist/use-indexed-db.d.mts +207 -0
  215. package/dist/use-indexed-db.mjs +251 -0
  216. package/dist/use-interval-BA55gTHT.d.mts +140 -0
  217. package/dist/use-interval.d.mts +2 -0
  218. package/dist/use-interval.mjs +100 -0
  219. package/dist/use-list-format.d.mts +60 -0
  220. package/dist/use-list-format.mjs +40 -0
  221. package/dist/use-machine.d.mts +90 -0
  222. package/dist/use-machine.mjs +78 -0
  223. package/dist/use-map.d.mts +90 -0
  224. package/dist/use-map.mjs +70 -0
  225. package/dist/use-media-controls.d.mts +198 -0
  226. package/dist/use-media-controls.mjs +264 -0
  227. package/dist/use-memoize.d.mts +73 -0
  228. package/dist/use-memoize.mjs +28 -0
  229. package/dist/use-mounted.d.mts +24 -0
  230. package/dist/use-mounted.mjs +29 -0
  231. package/dist/use-navigation-api.d.mts +360 -0
  232. package/dist/use-navigation-api.mjs +231 -0
  233. package/dist/use-notification.d.mts +139 -0
  234. package/dist/use-notification.mjs +131 -0
  235. package/dist/use-now.d.mts +137 -0
  236. package/dist/use-now.mjs +44 -0
  237. package/dist/use-number-format.d.mts +73 -0
  238. package/dist/use-number-format.mjs +58 -0
  239. package/dist/use-object-url.d.mts +47 -0
  240. package/dist/use-object-url.mjs +54 -0
  241. package/dist/use-offset-pagination.d.mts +91 -0
  242. package/dist/use-offset-pagination.mjs +80 -0
  243. package/dist/use-payment-request.d.mts +239 -0
  244. package/dist/use-payment-request.mjs +206 -0
  245. package/dist/use-performance-observer.d.mts +285 -0
  246. package/dist/use-performance-observer.mjs +132 -0
  247. package/dist/use-permission.d.mts +99 -0
  248. package/dist/use-permission.mjs +92 -0
  249. package/dist/use-plural-rules.d.mts +79 -0
  250. package/dist/use-plural-rules.mjs +59 -0
  251. package/dist/use-push-subscription.d.mts +154 -0
  252. package/dist/use-push-subscription.mjs +146 -0
  253. package/dist/use-queue.d.mts +89 -0
  254. package/dist/use-queue.mjs +116 -0
  255. package/dist/use-raf-fn.d.mts +87 -0
  256. package/dist/use-raf-fn.mjs +99 -0
  257. package/dist/use-relative-time-format.d.mts +111 -0
  258. package/dist/use-relative-time-format.mjs +119 -0
  259. package/dist/use-request-idle-callback.d.mts +122 -0
  260. package/dist/use-request-idle-callback.mjs +147 -0
  261. package/dist/use-route-query.d.mts +149 -0
  262. package/dist/use-route-query.mjs +86 -0
  263. package/dist/use-scheduler-post-task.d.mts +156 -0
  264. package/dist/use-scheduler-post-task.mjs +182 -0
  265. package/dist/use-screen-details.d.mts +205 -0
  266. package/dist/use-screen-details.mjs +188 -0
  267. package/dist/use-script-tag.d.mts +162 -0
  268. package/dist/use-script-tag.mjs +171 -0
  269. package/dist/use-segmenter.d.mts +78 -0
  270. package/dist/use-segmenter.mjs +66 -0
  271. package/dist/use-selection.d.mts +125 -0
  272. package/dist/use-selection.mjs +77 -0
  273. package/dist/use-serial.d.mts +165 -0
  274. package/dist/use-serial.mjs +205 -0
  275. package/dist/use-service-worker.d.mts +177 -0
  276. package/dist/use-service-worker.mjs +178 -0
  277. package/dist/use-set.d.mts +96 -0
  278. package/dist/use-set.mjs +74 -0
  279. package/dist/use-share.d.mts +92 -0
  280. package/dist/use-share.mjs +99 -0
  281. package/dist/use-sorted-locale.d.mts +62 -0
  282. package/dist/use-sorted-locale.mjs +52 -0
  283. package/dist/use-sorted.d.mts +29 -0
  284. package/dist/use-sorted.mjs +14 -0
  285. package/dist/use-speech-recognition.d.mts +150 -0
  286. package/dist/use-speech-recognition.mjs +168 -0
  287. package/dist/use-speech-synthesis.d.mts +148 -0
  288. package/dist/use-speech-synthesis.mjs +152 -0
  289. package/dist/use-stack.d.mts +83 -0
  290. package/dist/use-stack.mjs +93 -0
  291. package/dist/use-stepper.d.mts +79 -0
  292. package/dist/use-stepper.mjs +52 -0
  293. package/dist/use-storage-estimate.d.mts +151 -0
  294. package/dist/use-storage-estimate.mjs +170 -0
  295. package/dist/use-storage.d.mts +214 -0
  296. package/dist/use-storage.mjs +415 -0
  297. package/dist/use-style-tag.d.mts +102 -0
  298. package/dist/use-style-tag.mjs +91 -0
  299. package/dist/use-supported.d.mts +23 -0
  300. package/dist/use-supported.mjs +26 -0
  301. package/dist/use-throttled.d.mts +1 -1
  302. package/dist/use-time-ago.d.mts +163 -0
  303. package/dist/use-time-ago.mjs +95 -0
  304. package/dist/use-timeout.d.mts +122 -0
  305. package/dist/use-timeout.mjs +65 -0
  306. package/dist/use-url-hash.d.mts +88 -0
  307. package/dist/use-url-hash.mjs +145 -0
  308. package/dist/use-url-search-params.d.mts +223 -0
  309. package/dist/use-url-search-params.mjs +295 -0
  310. package/dist/use-usb.d.mts +212 -0
  311. package/dist/use-usb.mjs +137 -0
  312. package/dist/use-user-activation.d.mts +83 -0
  313. package/dist/use-user-activation.mjs +113 -0
  314. package/dist/use-user-media.d.mts +194 -0
  315. package/dist/use-user-media.mjs +214 -0
  316. package/dist/use-v-model.d.mts +113 -0
  317. package/dist/use-v-model.mjs +40 -0
  318. package/dist/use-vibrate.d.mts +81 -0
  319. package/dist/use-vibrate.mjs +90 -0
  320. package/dist/use-view-transition.d.mts +106 -0
  321. package/dist/use-view-transition.mjs +101 -0
  322. package/dist/use-visual-viewport.d.mts +105 -0
  323. package/dist/use-visual-viewport.mjs +104 -0
  324. package/dist/use-wake-lock.d.mts +96 -0
  325. package/dist/use-wake-lock.mjs +106 -0
  326. package/dist/use-web-authn.d.mts +404 -0
  327. package/dist/use-web-authn.mjs +323 -0
  328. package/dist/use-web-locks.d.mts +180 -0
  329. package/dist/use-web-locks.mjs +136 -0
  330. package/dist/use-web-midi.d.mts +148 -0
  331. package/dist/use-web-midi.mjs +140 -0
  332. package/dist/use-web-vitals.d.mts +142 -0
  333. package/dist/use-web-vitals.mjs +248 -0
  334. package/dist/use-websocket.d.mts +218 -0
  335. package/dist/use-websocket.mjs +257 -0
  336. package/dist/use-worker-fn.d.mts +119 -0
  337. package/dist/use-worker-fn.mjs +162 -0
  338. package/dist/virtual-list.d.mts +105 -0
  339. package/dist/virtual-list.mjs +128 -0
  340. package/dist/watch-debounced.d.mts +84 -0
  341. package/dist/watch-debounced.mjs +84 -0
  342. package/dist/watch-ignorable.d.mts +47 -0
  343. package/dist/watch-ignorable.mjs +61 -0
  344. package/dist/watch-once.d.mts +29 -0
  345. package/dist/watch-once.mjs +10 -0
  346. package/dist/watch-pausable.d.mts +51 -0
  347. package/dist/watch-pausable.mjs +23 -0
  348. package/dist/watch-source.d.mts +29 -0
  349. package/dist/watch-source.mjs +1 -0
  350. package/dist/watch-throttled.d.mts +70 -0
  351. package/dist/watch-throttled.mjs +94 -0
  352. package/dist/whenever.d.mts +39 -0
  353. package/dist/whenever.mjs +41 -0
  354. package/dist/window-size.d.mts +87 -0
  355. package/dist/window-size.mjs +65 -0
  356. package/package.json +846 -5
  357. package/registry/files/abort-signal.ts +292 -0
  358. package/registry/files/active-element.ts +93 -0
  359. package/registry/files/animate.ts +322 -0
  360. package/registry/files/async-resource.ts +190 -0
  361. package/registry/files/battery.ts +166 -0
  362. package/registry/files/breakpoints.ts +166 -0
  363. package/registry/files/capability.ts +171 -0
  364. package/registry/files/color-mode.ts +274 -0
  365. package/registry/files/computed-async.ts +123 -0
  366. package/registry/files/computed-with-control.ts +80 -0
  367. package/registry/files/create-event-hook.ts +139 -0
  368. package/registry/files/create-global-state.ts +34 -0
  369. package/registry/files/create-injection-state.ts +75 -0
  370. package/registry/files/create-shared-composable.ts +74 -0
  371. package/registry/files/device-motion.ts +152 -0
  372. package/registry/files/device-orientation.ts +168 -0
  373. package/registry/files/device-pixel-ratio.ts +100 -0
  374. package/registry/files/disposal-scope.ts +201 -0
  375. package/registry/files/document-visibility.ts +152 -0
  376. package/registry/files/draggable.ts +273 -0
  377. package/registry/files/element-bounding.ts +175 -0
  378. package/registry/files/element-by-point.ts +149 -0
  379. package/registry/files/element-hover.ts +104 -0
  380. package/registry/files/element-ref.ts +58 -0
  381. package/registry/files/element-target.ts +99 -0
  382. package/registry/files/event-listener.ts +188 -0
  383. package/registry/files/focus.ts +181 -0
  384. package/registry/files/fps.ts +133 -0
  385. package/registry/files/geolocation.ts +214 -0
  386. package/registry/files/i18n.ts +524 -0
  387. package/registry/files/icu-message.ts +701 -0
  388. package/registry/files/idle.ts +176 -0
  389. package/registry/files/infinite-scroll.ts +135 -0
  390. package/registry/files/intersection-observer.ts +261 -0
  391. package/registry/files/locale.ts +148 -0
  392. package/registry/files/magic-keys.ts +298 -0
  393. package/registry/files/math.ts +175 -0
  394. package/registry/files/media-query.ts +102 -0
  395. package/registry/files/mouse-in-element.ts +107 -0
  396. package/registry/files/mouse.ts +167 -0
  397. package/registry/files/mutation-observer.ts +183 -0
  398. package/registry/files/network.ts +229 -0
  399. package/registry/files/on-click-outside.ts +178 -0
  400. package/registry/files/on-key-stroke.ts +135 -0
  401. package/registry/files/on-long-press.ts +188 -0
  402. package/registry/files/on-start-typing.ts +88 -0
  403. package/registry/files/page-leave.ts +57 -0
  404. package/registry/files/parent-element.ts +29 -0
  405. package/registry/files/pinch.ts +187 -0
  406. package/registry/files/pointer-lock.ts +232 -0
  407. package/registry/files/pointer.ts +153 -0
  408. package/registry/files/preferences.ts +98 -0
  409. package/registry/files/preferred-languages.ts +88 -0
  410. package/registry/files/reactify.ts +39 -0
  411. package/registry/files/ref-auto-reset.ts +102 -0
  412. package/registry/files/ref-debounced.ts +34 -0
  413. package/registry/files/ref-default.ts +35 -0
  414. package/registry/files/resize-observer.ts +220 -0
  415. package/registry/files/retry-async.ts +261 -0
  416. package/registry/files/retry-delay.ts +132 -0
  417. package/registry/files/scope.ts +21 -0
  418. package/registry/files/screen-orientation.ts +165 -0
  419. package/registry/files/scroll-lock.ts +80 -0
  420. package/registry/files/scroll.ts +338 -0
  421. package/registry/files/standard-schema.ts +163 -0
  422. package/registry/files/swipe.ts +321 -0
  423. package/registry/files/sync-ref.ts +166 -0
  424. package/registry/files/temporal.ts +182 -0
  425. package/registry/files/text-selection.ts +110 -0
  426. package/registry/files/textarea-autosize.ts +114 -0
  427. package/registry/files/timeout-scheduler.ts +16 -0
  428. package/registry/files/to-reactive.ts +44 -0
  429. package/registry/files/transition.ts +271 -0
  430. package/registry/files/until.ts +352 -0
  431. package/registry/files/use-array.ts +201 -0
  432. package/registry/files/use-async-queue.ts +278 -0
  433. package/registry/files/use-async-state.ts +139 -0
  434. package/registry/files/use-barcode-detector.ts +321 -0
  435. package/registry/files/use-bluetooth.ts +409 -0
  436. package/registry/files/use-broadcast-channel.ts +250 -0
  437. package/registry/files/use-builtin-ai.ts +674 -0
  438. package/registry/files/use-clipboard.ts +425 -0
  439. package/registry/files/use-compression-stream.ts +364 -0
  440. package/registry/files/use-confirm-dialog.ts +137 -0
  441. package/registry/files/use-contact-picker.ts +246 -0
  442. package/registry/files/use-cookie.ts +500 -0
  443. package/registry/files/use-countdown.ts +161 -0
  444. package/registry/files/use-counter.ts +147 -0
  445. package/registry/files/use-css-var.ts +191 -0
  446. package/registry/files/use-cycle-list.ts +136 -0
  447. package/registry/files/use-date-format.ts +281 -0
  448. package/registry/files/use-date-time-format.ts +113 -0
  449. package/registry/files/use-debounced.ts +163 -0
  450. package/registry/files/use-display-media.ts +89 -0
  451. package/registry/files/use-display-names.ts +122 -0
  452. package/registry/files/use-document-title.ts +196 -0
  453. package/registry/files/use-drop-zone.ts +287 -0
  454. package/registry/files/use-event-source.ts +470 -0
  455. package/registry/files/use-eye-dropper.ts +134 -0
  456. package/registry/files/use-favicon.ts +140 -0
  457. package/registry/files/use-fetch.ts +578 -0
  458. package/registry/files/use-field.ts +247 -0
  459. package/registry/files/use-file-dialog.ts +257 -0
  460. package/registry/files/use-file-system-access.ts +383 -0
  461. package/registry/files/use-form-field-props.ts +381 -0
  462. package/registry/files/use-form.ts +980 -0
  463. package/registry/files/use-fullscreen.ts +214 -0
  464. package/registry/files/use-gamepad.ts +463 -0
  465. package/registry/files/use-hid.ts +359 -0
  466. package/registry/files/use-history.ts +231 -0
  467. package/registry/files/use-id-generator.ts +61 -0
  468. package/registry/files/use-image.ts +253 -0
  469. package/registry/files/use-indexed-db.ts +508 -0
  470. package/registry/files/use-interval.ts +253 -0
  471. package/registry/files/use-list-format.ts +85 -0
  472. package/registry/files/use-machine.ts +171 -0
  473. package/registry/files/use-map.ts +145 -0
  474. package/registry/files/use-media-controls.ts +545 -0
  475. package/registry/files/use-memoize.ts +118 -0
  476. package/registry/files/use-mounted.ts +30 -0
  477. package/registry/files/use-navigation-api.ts +641 -0
  478. package/registry/files/use-notification.ts +285 -0
  479. package/registry/files/use-now.ts +194 -0
  480. package/registry/files/use-number-format.ts +120 -0
  481. package/registry/files/use-object-url.ts +87 -0
  482. package/registry/files/use-offset-pagination.ts +168 -0
  483. package/registry/files/use-payment-request.ts +465 -0
  484. package/registry/files/use-performance-observer.ts +469 -0
  485. package/registry/files/use-permission.ts +220 -0
  486. package/registry/files/use-plural-rules.ts +134 -0
  487. package/registry/files/use-previous.ts +62 -0
  488. package/registry/files/use-push-subscription.ts +352 -0
  489. package/registry/files/use-queue.ts +197 -0
  490. package/registry/files/use-raf-fn.ts +176 -0
  491. package/registry/files/use-relative-time-format.ts +201 -0
  492. package/registry/files/use-request-idle-callback.ts +278 -0
  493. package/registry/files/use-route-query.ts +300 -0
  494. package/registry/files/use-scheduler-post-task.ts +397 -0
  495. package/registry/files/use-screen-details.ts +393 -0
  496. package/registry/files/use-script-tag.ts +341 -0
  497. package/registry/files/use-segmenter.ts +147 -0
  498. package/registry/files/use-selection.ts +233 -0
  499. package/registry/files/use-serial.ts +404 -0
  500. package/registry/files/use-service-worker.ts +413 -0
  501. package/registry/files/use-set.ts +154 -0
  502. package/registry/files/use-share.ts +168 -0
  503. package/registry/files/use-sorted-locale.ts +130 -0
  504. package/registry/files/use-sorted.ts +49 -0
  505. package/registry/files/use-speech-recognition.ts +357 -0
  506. package/registry/files/use-speech-synthesis.ts +333 -0
  507. package/registry/files/use-stack.ts +164 -0
  508. package/registry/files/use-stepper.ts +166 -0
  509. package/registry/files/use-storage-estimate.ts +352 -0
  510. package/registry/files/use-storage.ts +635 -0
  511. package/registry/files/use-style-tag.ts +200 -0
  512. package/registry/files/use-supported.ts +26 -0
  513. package/registry/files/use-throttled.ts +215 -0
  514. package/registry/files/use-time-ago.ts +276 -0
  515. package/registry/files/use-timeout.ts +218 -0
  516. package/registry/files/use-toggle.ts +54 -0
  517. package/registry/files/use-url-hash.ts +280 -0
  518. package/registry/files/use-url-search-params.ts +497 -0
  519. package/registry/files/use-usb.ts +395 -0
  520. package/registry/files/use-user-activation.ts +215 -0
  521. package/registry/files/use-user-media.ts +422 -0
  522. package/registry/files/use-v-model.ts +210 -0
  523. package/registry/files/use-vibrate.ts +174 -0
  524. package/registry/files/use-view-transition.ts +229 -0
  525. package/registry/files/use-visual-viewport.ts +228 -0
  526. package/registry/files/use-wake-lock.ts +206 -0
  527. package/registry/files/use-web-authn.ts +793 -0
  528. package/registry/files/use-web-locks.ts +363 -0
  529. package/registry/files/use-web-midi.ts +306 -0
  530. package/registry/files/use-web-vitals.ts +409 -0
  531. package/registry/files/use-websocket.ts +553 -0
  532. package/registry/files/use-worker-fn.ts +306 -0
  533. package/registry/files/virtual-list.ts +230 -0
  534. package/registry/files/watch-debounced.ts +206 -0
  535. package/registry/files/watch-ignorable.ts +128 -0
  536. package/registry/files/watch-once.ts +46 -0
  537. package/registry/files/watch-pausable.ts +93 -0
  538. package/registry/files/watch-source.ts +51 -0
  539. package/registry/files/watch-throttled.ts +201 -0
  540. package/registry/files/whenever.ts +70 -0
  541. package/registry/files/window-size.ts +151 -0
  542. package/registry/registry.json +5792 -0
  543. package/dist/catalog-D2AL3xYl.d.mts +0 -523
  544. package/dist/catalog-D5SYCsgW.mjs +0 -549
@@ -0,0 +1,641 @@
1
+ import {
2
+ computed,
3
+ hasInjectionContext,
4
+ readonly,
5
+ shallowRef,
6
+ toValue,
7
+ watch,
8
+ watchPostEffect,
9
+ } from "vue";
10
+ import type { ComputedRef, MaybeRefOrGetter, ShallowRef } from "vue";
11
+
12
+ import { tryOnScopeDispose } from "./scope.ts";
13
+
14
+ /** Navigation types of the Navigation API. */
15
+ export type NavigationTypeName = "push" | "replace" | "reload" | "traverse";
16
+
17
+ /** History handling requested by `navigate`. */
18
+ export type NavigationHistoryMode = "auto" | "push" | "replace";
19
+
20
+ /** Events of the Navigation API observed by {@link useNavigationApi}. */
21
+ export type NavigationEventName =
22
+ | "navigate"
23
+ | "navigatesuccess"
24
+ | "navigateerror"
25
+ | "currententrychange";
26
+
27
+ /** Minimal `NavigationHistoryEntry`. */
28
+ export interface NavigationHistoryEntryLike {
29
+ /** Entry URL, or null when hidden (cross-origin). */
30
+ readonly url: string | null;
31
+ /** Key identifying the history slot. */
32
+ readonly key: string;
33
+ /** Unique identifier of the entry. */
34
+ readonly id: string;
35
+ /** Index in the entry list, or -1. */
36
+ readonly index: number;
37
+ /** Whether the entry belongs to the current document. */
38
+ readonly sameDocument: boolean;
39
+ /** Developer-defined state. */
40
+ getState(): unknown;
41
+ }
42
+
43
+ /** Minimal `NavigationDestination`. */
44
+ export interface NavigationDestinationLike {
45
+ /** Destination URL. */
46
+ readonly url: string;
47
+ /** Index of the destination entry for traversals, otherwise -1. */
48
+ readonly index: number;
49
+ /** Whether the destination is the current document. */
50
+ readonly sameDocument: boolean;
51
+ /** State of the destination. */
52
+ getState(): unknown;
53
+ }
54
+
55
+ /** Options accepted by {@link NavigateEventLike.intercept}. */
56
+ export interface NavigationInterceptInit {
57
+ /** Performs the same-document navigation. */
58
+ readonly handler?: () => Promise<void>;
59
+ /** Focus behavior after the navigation. */
60
+ readonly focusReset?: "after-transition" | "manual";
61
+ /** Scroll behavior after the navigation. */
62
+ readonly scroll?: "after-transition" | "manual";
63
+ }
64
+
65
+ /** Minimal `NavigateEvent`. */
66
+ export interface NavigateEventLike {
67
+ /** Navigation type. */
68
+ readonly navigationType: NavigationTypeName;
69
+ /** Where the navigation goes. */
70
+ readonly destination: NavigationDestinationLike;
71
+ /** Whether `intercept` may be called. */
72
+ readonly canIntercept: boolean;
73
+ /** Whether the user initiated the navigation. */
74
+ readonly userInitiated: boolean;
75
+ /** Whether only the fragment changes. */
76
+ readonly hashChange: boolean;
77
+ /** Download file name for `<a download>` navigations, else null. */
78
+ readonly downloadRequest: string | null;
79
+ /** Aborted when the navigation is cancelled. */
80
+ readonly signal: AbortSignal;
81
+ /** Info passed by the initiator. */
82
+ readonly info: unknown;
83
+ /** Convert the navigation into a same-document navigation. */
84
+ intercept(options?: NavigationInterceptInit): void;
85
+ /** Cancel the navigation when cancelable. */
86
+ preventDefault(): void;
87
+ }
88
+
89
+ /** Minimal result of a Navigation API action. */
90
+ export interface NavigationResultLike {
91
+ /** Resolves when the URL and entry changed. */
92
+ readonly committed?: Promise<NavigationHistoryEntryLike>;
93
+ /** Resolves when the navigation finished (handlers settled). */
94
+ readonly finished?: Promise<NavigationHistoryEntryLike>;
95
+ }
96
+
97
+ /** Minimal `window.navigation`. */
98
+ export interface NavigationHost {
99
+ /** Current entry. */
100
+ readonly currentEntry: NavigationHistoryEntryLike | null;
101
+ /** Ongoing intercepted navigation. */
102
+ readonly transition: {
103
+ /** Navigation type. */
104
+ readonly navigationType: NavigationTypeName;
105
+ /** Entry navigated away from. */
106
+ readonly from: NavigationHistoryEntryLike;
107
+ } | null;
108
+ /** Whether `back` is possible. */
109
+ readonly canGoBack: boolean;
110
+ /** Whether `forward` is possible. */
111
+ readonly canGoForward: boolean;
112
+ /** Same-origin entries of the session history. */
113
+ entries(): readonly NavigationHistoryEntryLike[];
114
+ /** Navigate to `url`. */
115
+ navigate(
116
+ url: string,
117
+ options?: { state?: unknown; history?: NavigationHistoryMode; info?: unknown },
118
+ ): NavigationResultLike;
119
+ /** Traverse one entry back. */
120
+ back(options?: { info?: unknown }): NavigationResultLike;
121
+ /** Traverse one entry forward. */
122
+ forward(options?: { info?: unknown }): NavigationResultLike;
123
+ /** Traverse to the entry with `key`. */
124
+ traverseTo(key: string, options?: { info?: unknown }): NavigationResultLike;
125
+ /** Reload the current entry. */
126
+ reload(options?: { state?: unknown; info?: unknown }): NavigationResultLike;
127
+ /** Replace the current entry's state without navigating. */
128
+ updateCurrentEntry(options: { state: unknown }): void;
129
+ /** Subscribe to a navigation event. */
130
+ addEventListener(type: NavigationEventName, listener: (event: Event) => void): void;
131
+ /** Unsubscribe from a navigation event. */
132
+ removeEventListener(type: NavigationEventName, listener: (event: Event) => void): void;
133
+ }
134
+
135
+ /** Plain snapshot of a history entry. */
136
+ export interface NavigationEntrySnapshot {
137
+ /** Entry URL, or null when hidden. */
138
+ readonly url: string | null;
139
+ /** Key identifying the history slot. */
140
+ readonly key: string;
141
+ /** Unique identifier of the entry. */
142
+ readonly id: string;
143
+ /** Index in the entry list. */
144
+ readonly index: number;
145
+ /** Whether the entry belongs to the current document. */
146
+ readonly sameDocument: boolean;
147
+ }
148
+
149
+ /** Plain snapshot of the ongoing navigation. */
150
+ export interface NavigationTransitionSnapshot {
151
+ /** Navigation type. */
152
+ readonly navigationType: NavigationTypeName;
153
+ /** Entry navigated away from. */
154
+ readonly from: NavigationEntrySnapshot;
155
+ }
156
+
157
+ /** Details passed to `onCurrentEntryChange` listeners. */
158
+ export interface NavigationEntryChange {
159
+ /** Navigation type, or null for `updateCurrentEntry`. */
160
+ readonly navigationType: NavigationTypeName | null;
161
+ /** Previous entry. */
162
+ readonly from: NavigationEntrySnapshot;
163
+ }
164
+
165
+ /** Discriminated outcome of a navigation action. */
166
+ export type NavigationOutcome =
167
+ | {
168
+ /** The navigation finished. */
169
+ readonly status: "success";
170
+ /** Entry navigated to. */
171
+ readonly entry: NavigationEntrySnapshot;
172
+ }
173
+ | {
174
+ /** The Navigation API is missing. */
175
+ readonly status: "unsupported";
176
+ }
177
+ | {
178
+ /** The navigation failed or was aborted. */
179
+ readonly status: "error";
180
+ /** Error thrown or rejected by the host. */
181
+ readonly error: unknown;
182
+ };
183
+
184
+ /** Options of {@link NavigationApiControls.navigate}. */
185
+ export interface NavigationNavigateOptions<State> {
186
+ /**
187
+ * State stored on the new entry.
188
+ *
189
+ * @default undefined
190
+ */
191
+ readonly state?: State;
192
+ /**
193
+ * History handling.
194
+ *
195
+ * @default "auto"
196
+ */
197
+ readonly history?: NavigationHistoryMode;
198
+ /**
199
+ * Info handed to `navigate` listeners.
200
+ *
201
+ * @default undefined
202
+ */
203
+ readonly info?: unknown;
204
+ }
205
+
206
+ /** Options of {@link NavigationApiControls.intercept}. */
207
+ export interface NavigationInterceptOptions {
208
+ /**
209
+ * Runs the same-document navigation.
210
+ *
211
+ * @default undefined (commit the URL only)
212
+ */
213
+ readonly handler?: (event: NavigateEventLike) => Promise<void> | void;
214
+ /**
215
+ * Focus behavior after the navigation.
216
+ *
217
+ * @default "after-transition"
218
+ */
219
+ readonly focusReset?: "after-transition" | "manual";
220
+ /**
221
+ * Scroll behavior after the navigation.
222
+ *
223
+ * @default "after-transition"
224
+ */
225
+ readonly scroll?: "after-transition" | "manual";
226
+ }
227
+
228
+ /** Options for {@link useNavigationApi}. */
229
+ export interface UseNavigationApiOptions<State = unknown> {
230
+ /**
231
+ * Navigation API capability for alternate runtimes and tests.
232
+ *
233
+ * @default window.navigation when it exists
234
+ */
235
+ readonly navigation?: MaybeRefOrGetter<NavigationHost | null | undefined>;
236
+
237
+ /**
238
+ * Validate or convert raw entry state into `State`; return undefined for
239
+ * foreign state.
240
+ *
241
+ * @default the raw state, trusted as `State`
242
+ */
243
+ readonly parseState?: (raw: unknown) => State | undefined;
244
+ }
245
+
246
+ /** Reactive state and actions returned by {@link useNavigationApi}. */
247
+ export interface NavigationApiControls<State> {
248
+ /** Whether the Navigation API is available. */
249
+ readonly supported: ComputedRef<boolean>;
250
+ /** Snapshot of the current entry. */
251
+ readonly currentEntry: Readonly<ShallowRef<NavigationEntrySnapshot | null>>;
252
+ /** Snapshots of the same-origin session entries. */
253
+ readonly entries: Readonly<ShallowRef<readonly NavigationEntrySnapshot[]>>;
254
+ /** Whether `back` is possible. */
255
+ readonly canGoBack: Readonly<ShallowRef<boolean>>;
256
+ /** Whether `forward` is possible. */
257
+ readonly canGoForward: Readonly<ShallowRef<boolean>>;
258
+ /** Ongoing intercepted navigation. */
259
+ readonly transition: Readonly<ShallowRef<NavigationTransitionSnapshot | null>>;
260
+ /** State of the current entry (not proxied), refreshed with the entry. */
261
+ readonly state: ComputedRef<State | undefined>;
262
+ /** Most recent failed action or `navigateerror`, cleared on success. */
263
+ readonly error: Readonly<ShallowRef<unknown>>;
264
+
265
+ /**
266
+ * Read the current entry's state now.
267
+ *
268
+ * @returns The parsed state.
269
+ */
270
+ readonly getState: () => State | undefined;
271
+
272
+ /**
273
+ * Listen to `navigate`.
274
+ *
275
+ * @param listener Receives the navigate event.
276
+ * @returns Removes the listener.
277
+ */
278
+ readonly onNavigate: (listener: (event: NavigateEventLike) => void) => () => void;
279
+
280
+ /**
281
+ * Listen to `navigatesuccess`.
282
+ *
283
+ * @param listener Called after a navigation finished.
284
+ * @returns Removes the listener.
285
+ */
286
+ readonly onNavigateSuccess: (listener: () => void) => () => void;
287
+
288
+ /**
289
+ * Listen to `navigateerror`.
290
+ *
291
+ * @param listener Receives the navigation error.
292
+ * @returns Removes the listener.
293
+ */
294
+ readonly onNavigateError: (listener: (error: unknown) => void) => () => void;
295
+
296
+ /**
297
+ * Listen to `currententrychange`.
298
+ *
299
+ * @param listener Receives the navigation type and previous entry.
300
+ * @returns Removes the listener.
301
+ */
302
+ readonly onCurrentEntryChange: (listener: (change: NavigationEntryChange) => void) => () => void;
303
+
304
+ /**
305
+ * Intercept interceptable, same-origin, non-download, non-hash navigations
306
+ * whose destination matches `predicate`.
307
+ *
308
+ * @param predicate Receives the destination URL and the event.
309
+ * @param options Handler, focus and scroll behavior.
310
+ * @default options {}
311
+ * @returns Removes the interceptor.
312
+ */
313
+ readonly intercept: (
314
+ predicate: (url: URL, event: NavigateEventLike) => boolean,
315
+ options?: NavigationInterceptOptions,
316
+ ) => () => void;
317
+
318
+ /**
319
+ * Navigate to `url`.
320
+ *
321
+ * @param url Destination.
322
+ * @param options State, history mode and info.
323
+ * @default options {}
324
+ * @returns The outcome once finished.
325
+ */
326
+ readonly navigate: (
327
+ url: string,
328
+ options?: NavigationNavigateOptions<State>,
329
+ ) => Promise<NavigationOutcome>;
330
+
331
+ /**
332
+ * Go back one entry.
333
+ *
334
+ * @param info Info handed to `navigate` listeners.
335
+ * @returns The outcome once finished.
336
+ */
337
+ readonly back: (info?: unknown) => Promise<NavigationOutcome>;
338
+
339
+ /**
340
+ * Go forward one entry.
341
+ *
342
+ * @param info Info handed to `navigate` listeners.
343
+ * @returns The outcome once finished.
344
+ */
345
+ readonly forward: (info?: unknown) => Promise<NavigationOutcome>;
346
+
347
+ /**
348
+ * Traverse to the entry with `key`.
349
+ *
350
+ * @param key Entry key.
351
+ * @param info Info handed to `navigate` listeners.
352
+ * @returns The outcome once finished.
353
+ */
354
+ readonly traverseTo: (key: string, info?: unknown) => Promise<NavigationOutcome>;
355
+
356
+ /**
357
+ * Reload the current entry, optionally replacing its state.
358
+ *
359
+ * @param options New state and info.
360
+ * @default options {}
361
+ * @returns The outcome once finished.
362
+ */
363
+ readonly reload: (options?: {
364
+ readonly state?: State;
365
+ readonly info?: unknown;
366
+ }) => Promise<NavigationOutcome>;
367
+
368
+ /**
369
+ * Replace the current entry's state without navigating.
370
+ *
371
+ * @param options New state.
372
+ * @returns Whether the state was updated.
373
+ */
374
+ readonly updateCurrentEntry: (options: { readonly state: State }) => boolean;
375
+ }
376
+
377
+ function isNavigationHost(candidate: unknown): candidate is NavigationHost {
378
+ return (
379
+ typeof candidate === "object" &&
380
+ candidate !== null &&
381
+ typeof Reflect.get(candidate, "navigate") === "function" &&
382
+ typeof Reflect.get(candidate, "addEventListener") === "function"
383
+ );
384
+ }
385
+
386
+ function browserNavigation(): NavigationHost | undefined {
387
+ if (typeof window === "undefined") return undefined;
388
+ const candidate: unknown = Reflect.get(window, "navigation");
389
+ return isNavigationHost(candidate) ? candidate : undefined;
390
+ }
391
+
392
+ function isNavigateEvent(event: Event): event is Event & NavigateEventLike {
393
+ return "destination" in event && "canIntercept" in event && "intercept" in event;
394
+ }
395
+
396
+ function isEntryChangeEvent(event: Event): event is Event & {
397
+ readonly navigationType: NavigationTypeName | null;
398
+ readonly from: NavigationHistoryEntryLike;
399
+ } {
400
+ return "from" in event && "navigationType" in event;
401
+ }
402
+
403
+ function snapshot(entry: NavigationHistoryEntryLike): NavigationEntrySnapshot {
404
+ return {
405
+ url: entry.url,
406
+ key: entry.key,
407
+ id: entry.id,
408
+ index: entry.index,
409
+ sameDocument: entry.sameDocument,
410
+ };
411
+ }
412
+
413
+ function ignore(): void {
414
+ // `finished` carries the outcome.
415
+ }
416
+
417
+ /**
418
+ * Reactive access to the Navigation API (`window.navigation`).
419
+ *
420
+ * Entry snapshots refresh on `currententrychange`, `navigatesuccess` and
421
+ * `navigateerror`. Actions resolve to a {@link NavigationOutcome} and never
422
+ * reject; failures also land in `error`. Listeners (including interceptors)
423
+ * are removed when the owning reactive scope stops; outside a scope the
424
+ * caller removes them with the returned functions.
425
+ *
426
+ * Server rendering: nothing is read or subscribed; `supported` is false,
427
+ * `currentEntry` null, `entries` empty, and actions resolve to
428
+ * `{ status: "unsupported" }`.
429
+ * Inside a component the host is resolved after mounting, so hydration
430
+ * renders this server state first.
431
+ *
432
+ * @example
433
+ * ```ts
434
+ * const nav = useNavigationApi<{ tab: string }>();
435
+ * nav.intercept((url) => url.pathname.startsWith("/app/"), {
436
+ * handler: async () => renderRoute(location.pathname),
437
+ * });
438
+ * ```
439
+ *
440
+ * @param options Navigation host and state parser.
441
+ * @default options {}
442
+ * @returns Navigation state, hooks and actions.
443
+ */
444
+ export function useNavigationApi<State = unknown>(
445
+ options: UseNavigationApiOptions<State> = {},
446
+ ): NavigationApiControls<State> {
447
+ const currentEntry = shallowRef<NavigationEntrySnapshot | null>(null);
448
+ const entries = shallowRef<readonly NavigationEntrySnapshot[]>([]);
449
+ const canGoBack = shallowRef(false);
450
+ const canGoForward = shallowRef(false);
451
+ const transition = shallowRef<NavigationTransitionSnapshot | null>(null);
452
+ const state = shallowRef<State | undefined>(undefined);
453
+ const error = shallowRef<unknown>(undefined);
454
+
455
+ const navigateListeners = new Set<(event: NavigateEventLike) => void>();
456
+ const successListeners = new Set<() => void>();
457
+ const errorListeners = new Set<(error: unknown) => void>();
458
+ const changeListeners = new Set<(change: NavigationEntryChange) => void>();
459
+
460
+ // Inside a component the host is resolved only after mounting, so a
461
+ // hydrating client renders the server's unsupported state first. Outside
462
+ // components it resolves synchronously.
463
+ const hydrated = shallowRef(!hasInjectionContext());
464
+ if (!hydrated.value) {
465
+ watchPostEffect(() => {
466
+ hydrated.value = true;
467
+ });
468
+ }
469
+
470
+ const resolveHost = (): NavigationHost | undefined => {
471
+ if (!hydrated.value) return undefined;
472
+ if (options.navigation === undefined) return browserNavigation();
473
+ return toValue(options.navigation) ?? undefined;
474
+ };
475
+
476
+ const parse = (raw: unknown): State | undefined => {
477
+ if (options.parseState) return options.parseState(raw);
478
+ // Without a parser the caller vouches for the stored state's type.
479
+ return raw as State | undefined;
480
+ };
481
+
482
+ const getState = (): State | undefined => {
483
+ const entry = resolveHost()?.currentEntry;
484
+ return entry ? parse(entry.getState()) : undefined;
485
+ };
486
+
487
+ const refresh = (host: NavigationHost | undefined): void => {
488
+ const entry = host?.currentEntry ?? null;
489
+ currentEntry.value = entry ? snapshot(entry) : null;
490
+ entries.value = host ? host.entries().map(snapshot) : [];
491
+ canGoBack.value = host?.canGoBack ?? false;
492
+ canGoForward.value = host?.canGoForward ?? false;
493
+ const active = host?.transition ?? null;
494
+ transition.value = active
495
+ ? { navigationType: active.navigationType, from: snapshot(active.from) }
496
+ : null;
497
+ state.value = entry ? parse(entry.getState()) : undefined;
498
+ };
499
+
500
+ const add = <Listener>(set: Set<Listener>, listener: Listener): (() => void) => {
501
+ set.add(listener);
502
+ return () => {
503
+ set.delete(listener);
504
+ };
505
+ };
506
+
507
+ const stopWatch = watch(
508
+ resolveHost,
509
+ (host, _previous, onCleanup) => {
510
+ refresh(host);
511
+ if (!host) return;
512
+ const onNavigate = (event: Event): void => {
513
+ if (!isNavigateEvent(event)) return;
514
+ for (const listener of Array.from(navigateListeners)) listener(event);
515
+ };
516
+ const onSuccess = (): void => {
517
+ refresh(host);
518
+ for (const listener of Array.from(successListeners)) listener();
519
+ };
520
+ const onError = (event: Event): void => {
521
+ refresh(host);
522
+ const cause: unknown = Reflect.get(event, "error");
523
+ error.value = cause;
524
+ for (const listener of Array.from(errorListeners)) listener(cause);
525
+ };
526
+ const onChange = (event: Event): void => {
527
+ refresh(host);
528
+ if (!isEntryChangeEvent(event)) return;
529
+ const change = { navigationType: event.navigationType, from: snapshot(event.from) };
530
+ for (const listener of Array.from(changeListeners)) listener(change);
531
+ };
532
+ host.addEventListener("navigate", onNavigate);
533
+ host.addEventListener("navigatesuccess", onSuccess);
534
+ host.addEventListener("navigateerror", onError);
535
+ host.addEventListener("currententrychange", onChange);
536
+ onCleanup(() => {
537
+ host.removeEventListener("navigate", onNavigate);
538
+ host.removeEventListener("navigatesuccess", onSuccess);
539
+ host.removeEventListener("navigateerror", onError);
540
+ host.removeEventListener("currententrychange", onChange);
541
+ });
542
+ },
543
+ { immediate: true, flush: "sync" },
544
+ );
545
+
546
+ const perform = async (
547
+ action: (host: NavigationHost) => NavigationResultLike,
548
+ ): Promise<NavigationOutcome> => {
549
+ const host = resolveHost();
550
+ if (!host) return { status: "unsupported" };
551
+ try {
552
+ const result = action(host);
553
+ result.committed?.catch(ignore);
554
+ const entry = (await result.finished) ?? host.currentEntry;
555
+ error.value = undefined;
556
+ refresh(host);
557
+ return entry
558
+ ? { status: "success", entry: snapshot(entry) }
559
+ : { status: "error", error: undefined };
560
+ } catch (cause) {
561
+ error.value = cause;
562
+ return { status: "error", error: cause };
563
+ }
564
+ };
565
+
566
+ const intercept = (
567
+ predicate: (url: URL, event: NavigateEventLike) => boolean,
568
+ interceptOptions: NavigationInterceptOptions = {},
569
+ ): (() => void) =>
570
+ add(navigateListeners, (event: NavigateEventLike) => {
571
+ if (!event.canIntercept || event.hashChange || event.downloadRequest !== null) return;
572
+ const url = new URL(event.destination.url);
573
+ const current = resolveHost()?.currentEntry?.url;
574
+ if (current && new URL(current).origin !== url.origin) return;
575
+ if (!predicate(url, event)) return;
576
+ const { handler, focusReset, scroll } = interceptOptions;
577
+ event.intercept({
578
+ ...(handler ? { handler: async () => handler(event) } : {}),
579
+ ...(focusReset ? { focusReset } : {}),
580
+ ...(scroll ? { scroll } : {}),
581
+ });
582
+ });
583
+
584
+ const infoOption = (info: unknown): { info?: unknown } => (info === undefined ? {} : { info });
585
+
586
+ tryOnScopeDispose(() => {
587
+ stopWatch();
588
+ navigateListeners.clear();
589
+ successListeners.clear();
590
+ errorListeners.clear();
591
+ changeListeners.clear();
592
+ });
593
+
594
+ return {
595
+ supported: computed(() => resolveHost() !== undefined),
596
+ currentEntry: readonly(currentEntry),
597
+ entries: readonly(entries),
598
+ canGoBack: readonly(canGoBack),
599
+ canGoForward: readonly(canGoForward),
600
+ transition: readonly(transition),
601
+ state: computed(() => state.value),
602
+ error: readonly(error),
603
+ getState,
604
+ onNavigate: (listener) => add(navigateListeners, listener),
605
+ onNavigateSuccess: (listener) => add(successListeners, listener),
606
+ onNavigateError: (listener) => add(errorListeners, listener),
607
+ onCurrentEntryChange: (listener) => add(changeListeners, listener),
608
+ intercept,
609
+ navigate: (url, navigateOptions = {}) =>
610
+ perform((host) =>
611
+ host.navigate(url, {
612
+ ...("state" in navigateOptions ? { state: navigateOptions.state } : {}),
613
+ ...(navigateOptions.history ? { history: navigateOptions.history } : {}),
614
+ ...infoOption(navigateOptions.info),
615
+ }),
616
+ ),
617
+ back: (info) => perform((host) => host.back(infoOption(info))),
618
+ forward: (info) => perform((host) => host.forward(infoOption(info))),
619
+ traverseTo: (key, info) => perform((host) => host.traverseTo(key, infoOption(info))),
620
+ reload: (reloadOptions = {}) =>
621
+ perform((host) =>
622
+ host.reload({
623
+ ...("state" in reloadOptions ? { state: reloadOptions.state } : {}),
624
+ ...infoOption(reloadOptions.info),
625
+ }),
626
+ ),
627
+ updateCurrentEntry: ({ state: next }) => {
628
+ const host = resolveHost();
629
+ if (!host) return false;
630
+ try {
631
+ host.updateCurrentEntry({ state: next });
632
+ error.value = undefined;
633
+ refresh(host);
634
+ return true;
635
+ } catch (cause) {
636
+ error.value = cause;
637
+ return false;
638
+ }
639
+ },
640
+ };
641
+ }