@vizejs/composable 0.426.3 → 0.428.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,134 @@
1
+ import { computed, toValue } from "vue";
2
+ import type { ComputedRef, MaybeRefOrGetter } from "vue";
3
+
4
+ import { useLocale } from "./locale.ts";
5
+
6
+ /** CLDR plural categories. */
7
+ export type PluralCategory = Intl.LDMLPluralRule;
8
+
9
+ /**
10
+ * One plural message: a template where `{count}` and `#` are replaced by the
11
+ * locale-formatted count, or a function receiving the raw and formatted count.
12
+ */
13
+ export type PluralMessage = string | ((count: number, formatted: string) => string);
14
+
15
+ /**
16
+ * Messages per plural category. `other` is required because every locale
17
+ * falls back to it; exact-value overrides such as `"=0"` take precedence
18
+ * over categories.
19
+ */
20
+ export type PluralMessages = {
21
+ readonly [Category in Exclude<PluralCategory, "other">]?: PluralMessage;
22
+ } & {
23
+ /** Required fallback message. */
24
+ readonly other: PluralMessage;
25
+ } & {
26
+ readonly [exact: `=${number}`]: PluralMessage | undefined;
27
+ };
28
+
29
+ /** Options for {@link usePluralRules}. */
30
+ export interface UsePluralRulesOptions extends Intl.PluralRulesOptions {
31
+ /**
32
+ * Locale used for plural selection and count formatting. Pass it
33
+ * explicitly for hydration-stable server rendering.
34
+ *
35
+ * @default the browser language, otherwise "en"
36
+ */
37
+ readonly locale?: string | Intl.Locale;
38
+ }
39
+
40
+ /** Reactive plural selection returned by {@link usePluralRules}. */
41
+ export interface PluralRulesControls {
42
+ /** Canonical locale in use. */
43
+ readonly locale: ComputedRef<string>;
44
+
45
+ /** Plural rules for the current locale and options. */
46
+ readonly rules: ComputedRef<Intl.PluralRules>;
47
+
48
+ /** Category of the current count. */
49
+ readonly category: ComputedRef<PluralCategory>;
50
+
51
+ /** Message for the current count with `{count}` / `#` interpolated. */
52
+ readonly message: ComputedRef<string>;
53
+
54
+ /**
55
+ * Plural category of any count.
56
+ *
57
+ * @param count Count to classify.
58
+ * @returns The CLDR category.
59
+ */
60
+ readonly select: (count: number) => PluralCategory;
61
+
62
+ /**
63
+ * Message for any count.
64
+ *
65
+ * @param count Count to render.
66
+ * @returns The interpolated message.
67
+ */
68
+ readonly format: (count: number) => string;
69
+ }
70
+
71
+ function browserLanguage(): string | undefined {
72
+ return typeof window === "undefined" ? undefined : window.navigator.language;
73
+ }
74
+
75
+ function renderMessage(message: PluralMessage, count: number, formatted: string): string {
76
+ return typeof message === "function"
77
+ ? message(count, formatted)
78
+ : message.replaceAll("{count}", formatted).replaceAll("#", formatted);
79
+ }
80
+
81
+ /**
82
+ * Choose and render a message by CLDR plural category (`Intl.PluralRules`).
83
+ *
84
+ * Messages are typed per category with a mandatory `other`, plus optional
85
+ * exact overrides (`"=0": "No items"`). Cardinal (`1 item`) and ordinal
86
+ * (`1st`, `2nd`) rules are supported via `type`. The count is formatted
87
+ * with the same locale for interpolation. Everything is derived state:
88
+ * no listeners or timers, deterministic during server rendering when the
89
+ * locale is explicit. Invalid options surface as the platform `RangeError`.
90
+ *
91
+ * @example
92
+ * ```ts
93
+ * const { message } = usePluralRules(count, { "=0": "No files", one: "# file", other: "# files" }, { locale: "en" });
94
+ * ```
95
+ *
96
+ * @param count Reactive count.
97
+ * @param messages Reactive messages per category.
98
+ * @param options Reactive locale and `Intl.PluralRules` options.
99
+ * @default options {}
100
+ * @returns Reactive category, message, and selection helpers.
101
+ */
102
+ export function usePluralRules(
103
+ count: MaybeRefOrGetter<number>,
104
+ messages: MaybeRefOrGetter<PluralMessages>,
105
+ options: MaybeRefOrGetter<UsePluralRulesOptions> = {},
106
+ ): PluralRulesControls {
107
+ const localeControls = useLocale(() => toValue(options).locale, { detect: browserLanguage });
108
+ const rules = computed(() => {
109
+ const { locale: _locale, ...ruleOptions } = toValue(options);
110
+ return new Intl.PluralRules(localeControls.locale.value, ruleOptions);
111
+ });
112
+ const numberFormat = computed(() => {
113
+ const { minimumFractionDigits, maximumFractionDigits } = toValue(options);
114
+ return localeControls.number({
115
+ ...(minimumFractionDigits === undefined ? {} : { minimumFractionDigits }),
116
+ ...(maximumFractionDigits === undefined ? {} : { maximumFractionDigits }),
117
+ });
118
+ });
119
+ const select = (value: number): PluralCategory => rules.value.select(value);
120
+ const format = (value: number): string => {
121
+ const table = toValue(messages);
122
+ const exact: `=${number}` = `=${value}`;
123
+ const message = table[exact] ?? table[select(value)] ?? table.other;
124
+ return renderMessage(message, value, numberFormat.value.format(value));
125
+ };
126
+ return {
127
+ locale: localeControls.locale,
128
+ rules,
129
+ category: computed(() => select(toValue(count))),
130
+ message: computed(() => format(toValue(count))),
131
+ select,
132
+ format,
133
+ };
134
+ }
@@ -0,0 +1,62 @@
1
+ import { shallowRef, toValue, watch } from "vue";
2
+ import type { MaybeRefOrGetter, ShallowRef } from "vue";
3
+
4
+ /**
5
+ * Track the value a reactive source held before its latest change.
6
+ *
7
+ * The semantics are precise and arity-based:
8
+ *
9
+ * - Without an `initial` argument the ref holds `undefined` until the source
10
+ * changes for the first time.
11
+ * - With an `initial` argument (including an explicit `undefined` when
12
+ * `Value` allows it) the ref holds that value until the first change, and
13
+ * the return type never widens with `undefined`.
14
+ * - Every synchronous write is observed (`flush: "sync"`), so a sequence of
15
+ * writes in one tick shifts the previous value step by step instead of
16
+ * collapsing into one batch.
17
+ * - Writes whose value is `Object.is`-equal to the current value do not
18
+ * count as changes, matching Vue's own change detection.
19
+ * - Tracking is shallow: reassignments are observed, in-place mutations of
20
+ * object values are not.
21
+ *
22
+ * Safe during server rendering: no browser globals are read and no timers
23
+ * start. The underlying watcher is bound to the current reactive scope and
24
+ * stops with it; call inside an active scope, or the watcher lives as long
25
+ * as the source. A plain non-reactive source never changes, so the ref stays
26
+ * at its initial value.
27
+ *
28
+ * @example
29
+ * ```ts
30
+ * const route = shallowRef("/home");
31
+ * const previousRoute = usePrevious(route, "/");
32
+ * route.value = "/settings";
33
+ * previousRoute.value; // "/home"
34
+ * ```
35
+ *
36
+ * @param source Reactive source to observe.
37
+ * @param initial Value reported before the first change.
38
+ * @returns Readonly shallow ref holding the previous source value.
39
+ */
40
+ export function usePrevious<Value>(
41
+ source: MaybeRefOrGetter<Value>,
42
+ ): Readonly<ShallowRef<Value | undefined>>;
43
+ export function usePrevious<Value>(
44
+ source: MaybeRefOrGetter<Value>,
45
+ initial: Value,
46
+ ): Readonly<ShallowRef<Value>>;
47
+ export function usePrevious<Value>(
48
+ source: MaybeRefOrGetter<Value>,
49
+ ...initial: readonly [] | readonly [Value]
50
+ ): Readonly<ShallowRef<Value | undefined>> {
51
+ const previous = shallowRef<Value | undefined>(initial.length === 1 ? initial[0] : undefined);
52
+
53
+ watch(
54
+ () => toValue(source),
55
+ (_next, replaced) => {
56
+ previous.value = replaced;
57
+ },
58
+ { flush: "sync" },
59
+ );
60
+
61
+ return previous;
62
+ }
@@ -0,0 +1,352 @@
1
+ import {
2
+ computed,
3
+ hasInjectionContext,
4
+ readonly,
5
+ shallowReadonly,
6
+ shallowRef,
7
+ toValue,
8
+ watch,
9
+ watchPostEffect,
10
+ } from "vue";
11
+ import type { ComputedRef, MaybeRefOrGetter, ShallowRef } from "vue";
12
+
13
+ import { tryOnScopeDispose } from "./scope.ts";
14
+
15
+ /** Push permission states. */
16
+ export type PushPermissionState = "granted" | "denied" | "prompt";
17
+
18
+ /** JSON form of a push subscription (`PushSubscription.toJSON()`). */
19
+ export interface PushSubscriptionJsonLike {
20
+ /** Push service endpoint. */
21
+ readonly endpoint?: string | undefined;
22
+
23
+ /** Expiration time in epoch milliseconds, if any. */
24
+ readonly expirationTime?: number | null | undefined;
25
+
26
+ /** Base64url-encoded keys (`p256dh`, `auth`). */
27
+ readonly keys?: Readonly<Record<string, string>> | undefined;
28
+ }
29
+
30
+ /** Minimal `PushSubscription` consumed by {@link usePushSubscription}. */
31
+ export interface PushSubscriptionLike {
32
+ /** Push service endpoint. */
33
+ readonly endpoint: string;
34
+
35
+ /** Expiration time in epoch milliseconds, if any. */
36
+ readonly expirationTime: number | null;
37
+
38
+ /** Serialize for a server. */
39
+ toJSON(): PushSubscriptionJsonLike;
40
+
41
+ /** Cancel the subscription. */
42
+ unsubscribe(): Promise<boolean>;
43
+ }
44
+
45
+ /** Options forwarded to `PushManager.subscribe`. */
46
+ export interface PushManagerSubscribeOptions {
47
+ /** VAPID public key bytes. */
48
+ readonly applicationServerKey: BufferSource;
49
+
50
+ /** Only user-visible notifications. */
51
+ readonly userVisibleOnly: boolean;
52
+ }
53
+
54
+ /** Minimal `PushManager` consumed by {@link usePushSubscription}. */
55
+ export interface PushManagerLike {
56
+ /** Create (or return the existing) subscription. */
57
+ subscribe(options: PushManagerSubscribeOptions): Promise<PushSubscriptionLike>;
58
+
59
+ /** Current subscription, if any. */
60
+ getSubscription(): Promise<PushSubscriptionLike | null>;
61
+
62
+ /** Permission state for push. */
63
+ permissionState(options?: { readonly userVisibleOnly?: boolean }): Promise<PushPermissionState>;
64
+ }
65
+
66
+ /** Registration-like owner of a push manager. */
67
+ export interface PushRegistrationLike {
68
+ /** The registration's push manager. */
69
+ readonly pushManager: PushManagerLike;
70
+ }
71
+
72
+ /** Options for {@link usePushSubscription}. */
73
+ export interface UsePushSubscriptionOptions {
74
+ /**
75
+ * Service worker registration owning the push manager. `null` while it is
76
+ * not known yet.
77
+ *
78
+ * @default window.navigator.serviceWorker.ready when push is available
79
+ */
80
+ readonly registration?: MaybeRefOrGetter<PushRegistrationLike | null | undefined>;
81
+
82
+ /**
83
+ * Load the existing subscription as soon as a registration is known.
84
+ *
85
+ * @default true
86
+ */
87
+ readonly immediate?: boolean;
88
+ }
89
+
90
+ /** Arguments of {@link PushSubscriptionControls.subscribe}. */
91
+ export interface PushSubscribeOptions {
92
+ /** VAPID public key as a base64url string or raw bytes. */
93
+ readonly applicationServerKey: string | BufferSource;
94
+
95
+ /**
96
+ * Only user-visible notifications (required by most browsers).
97
+ *
98
+ * @default true
99
+ */
100
+ readonly userVisibleOnly?: boolean;
101
+ }
102
+
103
+ /** Serializable snapshot of the current subscription. */
104
+ export interface PushSubscriptionSnapshot {
105
+ /** Push service endpoint. */
106
+ readonly endpoint: string;
107
+
108
+ /** Expiration time in epoch milliseconds, or `null`. */
109
+ readonly expirationTime: number | null;
110
+
111
+ /** Base64url-encoded keys (`p256dh`, `auth`). */
112
+ readonly keys: Readonly<Record<string, string>>;
113
+ }
114
+
115
+ /** Reactive state and actions returned by {@link usePushSubscription}. */
116
+ export interface PushSubscriptionControls {
117
+ /** Whether the Push API is available. */
118
+ readonly supported: ComputedRef<boolean>;
119
+
120
+ /** Current subscription, or `null`. */
121
+ readonly subscription: Readonly<ShallowRef<PushSubscriptionLike | null>>;
122
+
123
+ /** JSON snapshot of the current subscription, or `null`. */
124
+ readonly json: ComputedRef<PushSubscriptionSnapshot | null>;
125
+
126
+ /** Most recent failure, cleared by the next successful action. */
127
+ readonly error: Readonly<ShallowRef<unknown>>;
128
+
129
+ /**
130
+ * Subscribe to push messages. Rejects with a tagged `TypeError` when the
131
+ * key string is not valid base64url.
132
+ *
133
+ * @param options VAPID key and visibility flag.
134
+ * @returns The subscription, or `null` when unsupported or on failure.
135
+ */
136
+ readonly subscribe: (options: PushSubscribeOptions) => Promise<PushSubscriptionLike | null>;
137
+
138
+ /**
139
+ * Cancel the current subscription.
140
+ *
141
+ * @returns Whether a subscription was cancelled.
142
+ */
143
+ readonly unsubscribe: () => Promise<boolean>;
144
+
145
+ /**
146
+ * Re-read the existing subscription.
147
+ *
148
+ * @returns The subscription, or `null`.
149
+ */
150
+ readonly refresh: () => Promise<PushSubscriptionLike | null>;
151
+
152
+ /**
153
+ * Query the push permission state.
154
+ *
155
+ * @param userVisibleOnly Query for user-visible pushes.
156
+ * @default userVisibleOnly true
157
+ * @returns The permission state, or `"unsupported"`.
158
+ */
159
+ readonly permissionState: (
160
+ userVisibleOnly?: boolean,
161
+ ) => Promise<PushPermissionState | "unsupported">;
162
+ }
163
+
164
+ const base64UrlAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
165
+
166
+ function decodeApplicationServerKey(text: string): Uint8Array<ArrayBuffer> {
167
+ const clean = text.trim().replace(/=+$/u, "").replaceAll("+", "-").replaceAll("/", "_");
168
+ const invalid = (): TypeError =>
169
+ new TypeError(
170
+ "[VIZE_COMPOSE_PUSH_INVALID_KEY] applicationServerKey must be a base64url string.",
171
+ );
172
+ if (clean.length % 4 === 1) throw invalid();
173
+ const bytes = new Uint8Array(Math.floor((clean.length * 3) / 4));
174
+ let buffer = 0;
175
+ let bits = 0;
176
+ let offset = 0;
177
+ for (const character of clean) {
178
+ const value = base64UrlAlphabet.indexOf(character);
179
+ if (value === -1) throw invalid();
180
+ buffer = ((buffer << 6) | value) & 0xffffff;
181
+ bits += 6;
182
+ if (bits >= 8) {
183
+ bits -= 8;
184
+ bytes[offset] = (buffer >> bits) & 0xff;
185
+ offset += 1;
186
+ }
187
+ }
188
+ return bytes;
189
+ }
190
+
191
+ interface ReadyContainer {
192
+ readonly ready: Promise<PushRegistrationLike>;
193
+ }
194
+
195
+ function browserContainer(): ReadyContainer | undefined {
196
+ if (typeof window === "undefined" || !("PushManager" in window)) return undefined;
197
+ const { navigator } = window;
198
+ return "serviceWorker" in navigator && navigator.serviceWorker
199
+ ? navigator.serviceWorker
200
+ : undefined;
201
+ }
202
+
203
+ /**
204
+ * Manage a Web Push subscription.
205
+ *
206
+ * Uses the push manager of `options.registration`, or of
207
+ * `navigator.serviceWorker.ready` by default. The existing subscription is
208
+ * loaded when the registration becomes known; `subscribe` accepts the VAPID
209
+ * key as a base64url string. `json` is the snapshot to send to a push server.
210
+ * Nothing needs cleanup; pending results are ignored after the owning
211
+ * reactive scope stops.
212
+ *
213
+ * Server rendering: nothing is read, `supported` is false and the
214
+ * subscription is `null`.
215
+ * Inside a component the host is resolved after mounting, so hydration
216
+ * renders this server state first.
217
+ *
218
+ * @example
219
+ * ```ts
220
+ * const push = usePushSubscription();
221
+ * const enable = async () => {
222
+ * await push.subscribe({ applicationServerKey: VAPID_PUBLIC_KEY });
223
+ * await fetch("/api/push", { method: "POST", body: JSON.stringify(push.json.value) });
224
+ * };
225
+ * ```
226
+ *
227
+ * @param options Registration override and initial read policy.
228
+ * @default options {}
229
+ * @returns Subscription state and actions.
230
+ */
231
+ export function usePushSubscription(
232
+ options: UsePushSubscriptionOptions = {},
233
+ ): PushSubscriptionControls {
234
+ const subscription = shallowRef<PushSubscriptionLike | null>(null);
235
+ const error = shallowRef<unknown>(undefined);
236
+ let active = true;
237
+
238
+ // Inside a component the host is resolved only after mounting, so a
239
+ // hydrating client renders the server's unsupported state first. Outside
240
+ // components it resolves synchronously.
241
+ const hydrated = shallowRef(!hasInjectionContext());
242
+ if (!hydrated.value) {
243
+ watchPostEffect(() => {
244
+ hydrated.value = true;
245
+ });
246
+ }
247
+
248
+ const source = (): PushRegistrationLike | ReadyContainer | undefined => {
249
+ if (!hydrated.value) return undefined;
250
+ return options.registration === undefined
251
+ ? browserContainer()
252
+ : (toValue(options.registration) ?? undefined);
253
+ };
254
+
255
+ const resolveManager = async (): Promise<PushManagerLike | undefined> => {
256
+ const current = source();
257
+ if (!current) return undefined;
258
+ return "pushManager" in current ? current.pushManager : (await current.ready).pushManager;
259
+ };
260
+
261
+ const attempt = async <Value>(
262
+ fallback: Value,
263
+ action: (manager: PushManagerLike) => Promise<Value>,
264
+ ): Promise<Value> => {
265
+ try {
266
+ const manager = await resolveManager();
267
+ if (!manager) return fallback;
268
+ const value = await action(manager);
269
+ if (active) error.value = undefined;
270
+ return value;
271
+ } catch (cause) {
272
+ if (active) error.value = cause;
273
+ return fallback;
274
+ }
275
+ };
276
+
277
+ const refresh = (): Promise<PushSubscriptionLike | null> =>
278
+ attempt(null, async (manager) => {
279
+ const current = await manager.getSubscription();
280
+ if (active) subscription.value = current;
281
+ return current;
282
+ });
283
+
284
+ const subscribe = async ({
285
+ applicationServerKey,
286
+ userVisibleOnly = true,
287
+ }: PushSubscribeOptions): Promise<PushSubscriptionLike | null> => {
288
+ const key =
289
+ typeof applicationServerKey === "string"
290
+ ? decodeApplicationServerKey(applicationServerKey)
291
+ : applicationServerKey;
292
+ return attempt(null, async (manager) => {
293
+ const next = await manager.subscribe({ applicationServerKey: key, userVisibleOnly });
294
+ if (active) subscription.value = next;
295
+ return next;
296
+ });
297
+ };
298
+
299
+ const unsubscribe = async (): Promise<boolean> => {
300
+ const current = subscription.value;
301
+ if (!current) return false;
302
+ try {
303
+ const removed = await current.unsubscribe();
304
+ if (active && removed && subscription.value === current) subscription.value = null;
305
+ if (active) error.value = undefined;
306
+ return removed;
307
+ } catch (cause) {
308
+ if (active) error.value = cause;
309
+ return false;
310
+ }
311
+ };
312
+
313
+ const permissionState = (userVisibleOnly = true): Promise<PushPermissionState | "unsupported"> =>
314
+ attempt<PushPermissionState | "unsupported">("unsupported", (manager) =>
315
+ manager.permissionState({ userVisibleOnly }),
316
+ );
317
+
318
+ if (options.immediate ?? true) {
319
+ watch(
320
+ source,
321
+ (current) => {
322
+ if (current) void refresh();
323
+ else subscription.value = null;
324
+ },
325
+ { immediate: true },
326
+ );
327
+ }
328
+
329
+ tryOnScopeDispose(() => {
330
+ active = false;
331
+ });
332
+
333
+ return {
334
+ supported: computed(() => source() !== undefined),
335
+ subscription: shallowReadonly(subscription),
336
+ json: computed(() => {
337
+ const current = subscription.value;
338
+ if (!current) return null;
339
+ const serialized = current.toJSON();
340
+ return {
341
+ endpoint: serialized.endpoint ?? current.endpoint,
342
+ expirationTime: serialized.expirationTime ?? current.expirationTime,
343
+ keys: serialized.keys ?? {},
344
+ };
345
+ }),
346
+ error: readonly(error),
347
+ subscribe,
348
+ unsubscribe,
349
+ refresh,
350
+ permissionState,
351
+ };
352
+ }