@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,99 @@
1
+ import { MaybeRefOrGetter, Ref } from "vue";
2
+
3
+ //#region src/use-permission.d.ts
4
+ /**
5
+ * Permission names understood by at least one major browser.
6
+ *
7
+ * The `(string & {})` member keeps autocompletion for the well-known names
8
+ * while still accepting names that browsers add later.
9
+ */
10
+ type WellKnownPermissionName = "accelerometer" | "background-fetch" | "background-sync" | "bluetooth" | "camera" | "clipboard-read" | "clipboard-write" | "display-capture" | "geolocation" | "gyroscope" | "idle-detection" | "local-fonts" | "magnetometer" | "microphone" | "midi" | "nfc" | "notifications" | "payment-handler" | "periodic-background-sync" | "persistent-storage" | "push" | "screen-wake-lock" | "speaker-selection" | "storage-access" | "window-management" | (string & {});
11
+ /** Descriptor passed to `navigator.permissions.query`. */
12
+ interface PermissionDescriptorLike {
13
+ /** Permission name. */
14
+ readonly name: WellKnownPermissionName;
15
+ /** Push: only user-visible notifications (required `true` by most browsers). */
16
+ readonly userVisibleOnly?: boolean;
17
+ /** MIDI: request system-exclusive message access. */
18
+ readonly sysex?: boolean;
19
+ /** Camera: request pan-tilt-zoom control. */
20
+ readonly panTiltZoom?: boolean;
21
+ /** Clipboard (Chromium): allow access without a user gesture. */
22
+ readonly allowWithoutGesture?: boolean;
23
+ }
24
+ /** Browser permission state, plus the capability states added by this package. */
25
+ type PermissionQueryState = "granted" | "denied" | "prompt" | "unsupported" | "unknown";
26
+ /** Minimal `PermissionStatus` shape consumed by {@link usePermission}. */
27
+ interface PermissionStatusLike extends EventTarget {
28
+ /** Current state reported by the browser. */
29
+ readonly state: string;
30
+ }
31
+ /** Minimal `Permissions` shape consumed by {@link usePermission}. */
32
+ interface PermissionsHost {
33
+ /**
34
+ * Query one permission. Rejects (TypeError) for names the browser does not
35
+ * know. Declared with method syntax so the DOM `Permissions` object, whose
36
+ * descriptor names are a narrower union, satisfies this interface.
37
+ */
38
+ query(descriptor: PermissionDescriptorLike): Promise<PermissionStatusLike>;
39
+ }
40
+ /** Options for {@link usePermission}. */
41
+ interface UsePermissionOptions {
42
+ /**
43
+ * Permissions capability for alternate runtimes and tests.
44
+ *
45
+ * @default window.navigator.permissions when a browser window exists
46
+ */
47
+ readonly host?: MaybeRefOrGetter<PermissionsHost | null | undefined>;
48
+ /**
49
+ * State exposed before the first query settles and during server rendering.
50
+ *
51
+ * @default "unknown"
52
+ */
53
+ readonly initialState?: PermissionQueryState;
54
+ }
55
+ /** Reactive state returned by {@link usePermission}. */
56
+ interface PermissionControls {
57
+ /**
58
+ * Current permission state. `"unsupported"` means the Permissions API (or
59
+ * this permission name) is unavailable; `"unknown"` means no answer yet.
60
+ */
61
+ readonly state: Readonly<Ref<PermissionQueryState>>;
62
+ /** Whether a Permissions capability is attached. */
63
+ readonly supported: Readonly<Ref<boolean>>;
64
+ /**
65
+ * Query the permission again and resubscribe to its changes.
66
+ *
67
+ * @returns The settled state.
68
+ */
69
+ readonly query: () => Promise<PermissionQueryState>;
70
+ }
71
+ /**
72
+ * Observe a browser permission reactively.
73
+ *
74
+ * The permission is queried when the composable is created and whenever
75
+ * the reactive name/descriptor or host changes; the `change` event of the
76
+ * returned `PermissionStatus` keeps `state` current (for example after the
77
+ * user revokes camera access in the site settings). The subscription is
78
+ * removed when the name changes and when the owning reactive scope stops.
79
+ *
80
+ * Server rendering: no browser window exists, so nothing is queried and
81
+ * `state` stays at `initialState` (`"unknown"`) with `supported` false.
82
+ * Unknown names (the browser rejects the query) report `"unsupported"`.
83
+ * Inside a component the first query runs after mounting, so hydration
84
+ * renders `initialState` exactly like the server did.
85
+ *
86
+ * @example
87
+ * ```ts
88
+ * const { state } = usePermission("camera");
89
+ * const canUseCamera = computed(() => state.value === "granted");
90
+ * ```
91
+ *
92
+ * @param name Reactive permission name or full descriptor.
93
+ * @param options Capability host and initial state.
94
+ * @default options {}
95
+ * @returns The reactive permission state and a re-query control.
96
+ */
97
+ declare function usePermission(name: MaybeRefOrGetter<WellKnownPermissionName | PermissionDescriptorLike>, options?: UsePermissionOptions): PermissionControls;
98
+ //#endregion
99
+ export { PermissionControls, PermissionDescriptorLike, PermissionQueryState, PermissionStatusLike, PermissionsHost, UsePermissionOptions, WellKnownPermissionName, usePermission };
@@ -0,0 +1,92 @@
1
+ import { tryOnScopeDispose } from "./scope.mjs";
2
+ import { hasInjectionContext, readonly, ref, toValue, watchEffect } from "vue";
3
+ //#region src/use-permission.ts
4
+ function normalizeState(state) {
5
+ return state === "granted" || state === "denied" || state === "prompt" ? state : "unknown";
6
+ }
7
+ function browserPermissions() {
8
+ if (typeof window === "undefined") return void 0;
9
+ return window.navigator.permissions ?? void 0;
10
+ }
11
+ function toDescriptor(name) {
12
+ return typeof name === "string" ? { name } : name;
13
+ }
14
+ /**
15
+ * Observe a browser permission reactively.
16
+ *
17
+ * The permission is queried when the composable is created and whenever
18
+ * the reactive name/descriptor or host changes; the `change` event of the
19
+ * returned `PermissionStatus` keeps `state` current (for example after the
20
+ * user revokes camera access in the site settings). The subscription is
21
+ * removed when the name changes and when the owning reactive scope stops.
22
+ *
23
+ * Server rendering: no browser window exists, so nothing is queried and
24
+ * `state` stays at `initialState` (`"unknown"`) with `supported` false.
25
+ * Unknown names (the browser rejects the query) report `"unsupported"`.
26
+ * Inside a component the first query runs after mounting, so hydration
27
+ * renders `initialState` exactly like the server did.
28
+ *
29
+ * @example
30
+ * ```ts
31
+ * const { state } = usePermission("camera");
32
+ * const canUseCamera = computed(() => state.value === "granted");
33
+ * ```
34
+ *
35
+ * @param name Reactive permission name or full descriptor.
36
+ * @param options Capability host and initial state.
37
+ * @default options {}
38
+ * @returns The reactive permission state and a re-query control.
39
+ */
40
+ function usePermission(name, options = {}) {
41
+ const initialState = options.initialState ?? "unknown";
42
+ const state = ref(initialState);
43
+ const supported = ref(false);
44
+ let generation = 0;
45
+ let unsubscribe;
46
+ let active = true;
47
+ const resolveHost = () => options.host === void 0 ? browserPermissions() : toValue(options.host) ?? void 0;
48
+ const release = () => {
49
+ unsubscribe?.();
50
+ unsubscribe = void 0;
51
+ };
52
+ const query = async () => {
53
+ const current = ++generation;
54
+ release();
55
+ const host = resolveHost();
56
+ supported.value = host !== void 0;
57
+ if (!host) {
58
+ state.value = typeof window === "undefined" ? initialState : "unsupported";
59
+ return state.value;
60
+ }
61
+ let status;
62
+ try {
63
+ status = await host.query(toDescriptor(toValue(name)));
64
+ } catch {
65
+ if (current === generation) state.value = "unsupported";
66
+ return "unsupported";
67
+ }
68
+ if (current !== generation || !active) return normalizeState(status.state);
69
+ const update = () => {
70
+ state.value = normalizeState(status.state);
71
+ };
72
+ update();
73
+ status.addEventListener("change", update);
74
+ unsubscribe = () => status.removeEventListener("change", update);
75
+ return state.value;
76
+ };
77
+ if (typeof window !== "undefined" || options.host !== void 0) watchEffect(() => {
78
+ query();
79
+ }, { flush: hasInjectionContext() ? "post" : "sync" });
80
+ tryOnScopeDispose(() => {
81
+ active = false;
82
+ generation += 1;
83
+ release();
84
+ });
85
+ return {
86
+ state: readonly(state),
87
+ supported: readonly(supported),
88
+ query
89
+ };
90
+ }
91
+ //#endregion
92
+ export { usePermission };
@@ -0,0 +1,79 @@
1
+ import { ComputedRef, MaybeRefOrGetter } from "vue";
2
+
3
+ //#region src/use-plural-rules.d.ts
4
+ /** CLDR plural categories. */
5
+ type PluralCategory = Intl.LDMLPluralRule;
6
+ /**
7
+ * One plural message: a template where `{count}` and `#` are replaced by the
8
+ * locale-formatted count, or a function receiving the raw and formatted count.
9
+ */
10
+ type PluralMessage = string | ((count: number, formatted: string) => string);
11
+ /**
12
+ * Messages per plural category. `other` is required because every locale
13
+ * falls back to it; exact-value overrides such as `"=0"` take precedence
14
+ * over categories.
15
+ */
16
+ type PluralMessages = { readonly [Category in Exclude<PluralCategory, "other">]?: PluralMessage } & {
17
+ /** Required fallback message. */readonly other: PluralMessage;
18
+ } & {
19
+ readonly [exact: `=${number}`]: PluralMessage | undefined;
20
+ };
21
+ /** Options for {@link usePluralRules}. */
22
+ interface UsePluralRulesOptions extends Intl.PluralRulesOptions {
23
+ /**
24
+ * Locale used for plural selection and count formatting. Pass it
25
+ * explicitly for hydration-stable server rendering.
26
+ *
27
+ * @default the browser language, otherwise "en"
28
+ */
29
+ readonly locale?: string | Intl.Locale;
30
+ }
31
+ /** Reactive plural selection returned by {@link usePluralRules}. */
32
+ interface PluralRulesControls {
33
+ /** Canonical locale in use. */
34
+ readonly locale: ComputedRef<string>;
35
+ /** Plural rules for the current locale and options. */
36
+ readonly rules: ComputedRef<Intl.PluralRules>;
37
+ /** Category of the current count. */
38
+ readonly category: ComputedRef<PluralCategory>;
39
+ /** Message for the current count with `{count}` / `#` interpolated. */
40
+ readonly message: ComputedRef<string>;
41
+ /**
42
+ * Plural category of any count.
43
+ *
44
+ * @param count Count to classify.
45
+ * @returns The CLDR category.
46
+ */
47
+ readonly select: (count: number) => PluralCategory;
48
+ /**
49
+ * Message for any count.
50
+ *
51
+ * @param count Count to render.
52
+ * @returns The interpolated message.
53
+ */
54
+ readonly format: (count: number) => string;
55
+ }
56
+ /**
57
+ * Choose and render a message by CLDR plural category (`Intl.PluralRules`).
58
+ *
59
+ * Messages are typed per category with a mandatory `other`, plus optional
60
+ * exact overrides (`"=0": "No items"`). Cardinal (`1 item`) and ordinal
61
+ * (`1st`, `2nd`) rules are supported via `type`. The count is formatted
62
+ * with the same locale for interpolation. Everything is derived state:
63
+ * no listeners or timers, deterministic during server rendering when the
64
+ * locale is explicit. Invalid options surface as the platform `RangeError`.
65
+ *
66
+ * @example
67
+ * ```ts
68
+ * const { message } = usePluralRules(count, { "=0": "No files", one: "# file", other: "# files" }, { locale: "en" });
69
+ * ```
70
+ *
71
+ * @param count Reactive count.
72
+ * @param messages Reactive messages per category.
73
+ * @param options Reactive locale and `Intl.PluralRules` options.
74
+ * @default options {}
75
+ * @returns Reactive category, message, and selection helpers.
76
+ */
77
+ declare function usePluralRules(count: MaybeRefOrGetter<number>, messages: MaybeRefOrGetter<PluralMessages>, options?: MaybeRefOrGetter<UsePluralRulesOptions>): PluralRulesControls;
78
+ //#endregion
79
+ export { PluralCategory, PluralMessage, PluralMessages, PluralRulesControls, UsePluralRulesOptions, usePluralRules };
@@ -0,0 +1,59 @@
1
+ import { useLocale } from "./locale.mjs";
2
+ import { computed, toValue } from "vue";
3
+ //#region src/use-plural-rules.ts
4
+ function browserLanguage() {
5
+ return typeof window === "undefined" ? void 0 : window.navigator.language;
6
+ }
7
+ function renderMessage(message, count, formatted) {
8
+ return typeof message === "function" ? message(count, formatted) : message.replaceAll("{count}", formatted).replaceAll("#", formatted);
9
+ }
10
+ /**
11
+ * Choose and render a message by CLDR plural category (`Intl.PluralRules`).
12
+ *
13
+ * Messages are typed per category with a mandatory `other`, plus optional
14
+ * exact overrides (`"=0": "No items"`). Cardinal (`1 item`) and ordinal
15
+ * (`1st`, `2nd`) rules are supported via `type`. The count is formatted
16
+ * with the same locale for interpolation. Everything is derived state:
17
+ * no listeners or timers, deterministic during server rendering when the
18
+ * locale is explicit. Invalid options surface as the platform `RangeError`.
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * const { message } = usePluralRules(count, { "=0": "No files", one: "# file", other: "# files" }, { locale: "en" });
23
+ * ```
24
+ *
25
+ * @param count Reactive count.
26
+ * @param messages Reactive messages per category.
27
+ * @param options Reactive locale and `Intl.PluralRules` options.
28
+ * @default options {}
29
+ * @returns Reactive category, message, and selection helpers.
30
+ */
31
+ function usePluralRules(count, messages, options = {}) {
32
+ const localeControls = useLocale(() => toValue(options).locale, { detect: browserLanguage });
33
+ const rules = computed(() => {
34
+ const { locale: _locale, ...ruleOptions } = toValue(options);
35
+ return new Intl.PluralRules(localeControls.locale.value, ruleOptions);
36
+ });
37
+ const numberFormat = computed(() => {
38
+ const { minimumFractionDigits, maximumFractionDigits } = toValue(options);
39
+ return localeControls.number({
40
+ ...minimumFractionDigits === void 0 ? {} : { minimumFractionDigits },
41
+ ...maximumFractionDigits === void 0 ? {} : { maximumFractionDigits }
42
+ });
43
+ });
44
+ const select = (value) => rules.value.select(value);
45
+ const format = (value) => {
46
+ const table = toValue(messages);
47
+ return renderMessage(table[`=${value}`] ?? table[select(value)] ?? table.other, value, numberFormat.value.format(value));
48
+ };
49
+ return {
50
+ locale: localeControls.locale,
51
+ rules,
52
+ category: computed(() => select(toValue(count))),
53
+ message: computed(() => format(toValue(count))),
54
+ select,
55
+ format
56
+ };
57
+ }
58
+ //#endregion
59
+ export { usePluralRules };
@@ -0,0 +1,154 @@
1
+ import { ComputedRef, MaybeRefOrGetter, ShallowRef } from "vue";
2
+
3
+ //#region src/use-push-subscription.d.ts
4
+ /** Push permission states. */
5
+ type PushPermissionState = "granted" | "denied" | "prompt";
6
+ /** JSON form of a push subscription (`PushSubscription.toJSON()`). */
7
+ interface PushSubscriptionJsonLike {
8
+ /** Push service endpoint. */
9
+ readonly endpoint?: string | undefined;
10
+ /** Expiration time in epoch milliseconds, if any. */
11
+ readonly expirationTime?: number | null | undefined;
12
+ /** Base64url-encoded keys (`p256dh`, `auth`). */
13
+ readonly keys?: Readonly<Record<string, string>> | undefined;
14
+ }
15
+ /** Minimal `PushSubscription` consumed by {@link usePushSubscription}. */
16
+ interface PushSubscriptionLike {
17
+ /** Push service endpoint. */
18
+ readonly endpoint: string;
19
+ /** Expiration time in epoch milliseconds, if any. */
20
+ readonly expirationTime: number | null;
21
+ /** Serialize for a server. */
22
+ toJSON(): PushSubscriptionJsonLike;
23
+ /** Cancel the subscription. */
24
+ unsubscribe(): Promise<boolean>;
25
+ }
26
+ /** Options forwarded to `PushManager.subscribe`. */
27
+ interface PushManagerSubscribeOptions {
28
+ /** VAPID public key bytes. */
29
+ readonly applicationServerKey: BufferSource;
30
+ /** Only user-visible notifications. */
31
+ readonly userVisibleOnly: boolean;
32
+ }
33
+ /** Minimal `PushManager` consumed by {@link usePushSubscription}. */
34
+ interface PushManagerLike {
35
+ /** Create (or return the existing) subscription. */
36
+ subscribe(options: PushManagerSubscribeOptions): Promise<PushSubscriptionLike>;
37
+ /** Current subscription, if any. */
38
+ getSubscription(): Promise<PushSubscriptionLike | null>;
39
+ /** Permission state for push. */
40
+ permissionState(options?: {
41
+ readonly userVisibleOnly?: boolean;
42
+ }): Promise<PushPermissionState>;
43
+ }
44
+ /** Registration-like owner of a push manager. */
45
+ interface PushRegistrationLike {
46
+ /** The registration's push manager. */
47
+ readonly pushManager: PushManagerLike;
48
+ }
49
+ /** Options for {@link usePushSubscription}. */
50
+ interface UsePushSubscriptionOptions {
51
+ /**
52
+ * Service worker registration owning the push manager. `null` while it is
53
+ * not known yet.
54
+ *
55
+ * @default window.navigator.serviceWorker.ready when push is available
56
+ */
57
+ readonly registration?: MaybeRefOrGetter<PushRegistrationLike | null | undefined>;
58
+ /**
59
+ * Load the existing subscription as soon as a registration is known.
60
+ *
61
+ * @default true
62
+ */
63
+ readonly immediate?: boolean;
64
+ }
65
+ /** Arguments of {@link PushSubscriptionControls.subscribe}. */
66
+ interface PushSubscribeOptions {
67
+ /** VAPID public key as a base64url string or raw bytes. */
68
+ readonly applicationServerKey: string | BufferSource;
69
+ /**
70
+ * Only user-visible notifications (required by most browsers).
71
+ *
72
+ * @default true
73
+ */
74
+ readonly userVisibleOnly?: boolean;
75
+ }
76
+ /** Serializable snapshot of the current subscription. */
77
+ interface PushSubscriptionSnapshot {
78
+ /** Push service endpoint. */
79
+ readonly endpoint: string;
80
+ /** Expiration time in epoch milliseconds, or `null`. */
81
+ readonly expirationTime: number | null;
82
+ /** Base64url-encoded keys (`p256dh`, `auth`). */
83
+ readonly keys: Readonly<Record<string, string>>;
84
+ }
85
+ /** Reactive state and actions returned by {@link usePushSubscription}. */
86
+ interface PushSubscriptionControls {
87
+ /** Whether the Push API is available. */
88
+ readonly supported: ComputedRef<boolean>;
89
+ /** Current subscription, or `null`. */
90
+ readonly subscription: Readonly<ShallowRef<PushSubscriptionLike | null>>;
91
+ /** JSON snapshot of the current subscription, or `null`. */
92
+ readonly json: ComputedRef<PushSubscriptionSnapshot | null>;
93
+ /** Most recent failure, cleared by the next successful action. */
94
+ readonly error: Readonly<ShallowRef<unknown>>;
95
+ /**
96
+ * Subscribe to push messages. Rejects with a tagged `TypeError` when the
97
+ * key string is not valid base64url.
98
+ *
99
+ * @param options VAPID key and visibility flag.
100
+ * @returns The subscription, or `null` when unsupported or on failure.
101
+ */
102
+ readonly subscribe: (options: PushSubscribeOptions) => Promise<PushSubscriptionLike | null>;
103
+ /**
104
+ * Cancel the current subscription.
105
+ *
106
+ * @returns Whether a subscription was cancelled.
107
+ */
108
+ readonly unsubscribe: () => Promise<boolean>;
109
+ /**
110
+ * Re-read the existing subscription.
111
+ *
112
+ * @returns The subscription, or `null`.
113
+ */
114
+ readonly refresh: () => Promise<PushSubscriptionLike | null>;
115
+ /**
116
+ * Query the push permission state.
117
+ *
118
+ * @param userVisibleOnly Query for user-visible pushes.
119
+ * @default userVisibleOnly true
120
+ * @returns The permission state, or `"unsupported"`.
121
+ */
122
+ readonly permissionState: (userVisibleOnly?: boolean) => Promise<PushPermissionState | "unsupported">;
123
+ }
124
+ /**
125
+ * Manage a Web Push subscription.
126
+ *
127
+ * Uses the push manager of `options.registration`, or of
128
+ * `navigator.serviceWorker.ready` by default. The existing subscription is
129
+ * loaded when the registration becomes known; `subscribe` accepts the VAPID
130
+ * key as a base64url string. `json` is the snapshot to send to a push server.
131
+ * Nothing needs cleanup; pending results are ignored after the owning
132
+ * reactive scope stops.
133
+ *
134
+ * Server rendering: nothing is read, `supported` is false and the
135
+ * subscription is `null`.
136
+ * Inside a component the host is resolved after mounting, so hydration
137
+ * renders this server state first.
138
+ *
139
+ * @example
140
+ * ```ts
141
+ * const push = usePushSubscription();
142
+ * const enable = async () => {
143
+ * await push.subscribe({ applicationServerKey: VAPID_PUBLIC_KEY });
144
+ * await fetch("/api/push", { method: "POST", body: JSON.stringify(push.json.value) });
145
+ * };
146
+ * ```
147
+ *
148
+ * @param options Registration override and initial read policy.
149
+ * @default options {}
150
+ * @returns Subscription state and actions.
151
+ */
152
+ declare function usePushSubscription(options?: UsePushSubscriptionOptions): PushSubscriptionControls;
153
+ //#endregion
154
+ export { PushManagerLike, PushManagerSubscribeOptions, PushPermissionState, PushRegistrationLike, PushSubscribeOptions, PushSubscriptionControls, PushSubscriptionJsonLike, PushSubscriptionLike, PushSubscriptionSnapshot, UsePushSubscriptionOptions, usePushSubscription };
@@ -0,0 +1,146 @@
1
+ import { tryOnScopeDispose } from "./scope.mjs";
2
+ import { computed, hasInjectionContext, readonly, shallowReadonly, shallowRef, toValue, watch, watchPostEffect } from "vue";
3
+ //#region src/use-push-subscription.ts
4
+ const base64UrlAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
5
+ function decodeApplicationServerKey(text) {
6
+ const clean = text.trim().replace(/=+$/u, "").replaceAll("+", "-").replaceAll("/", "_");
7
+ const invalid = () => /* @__PURE__ */ new TypeError("[VIZE_COMPOSE_PUSH_INVALID_KEY] applicationServerKey must be a base64url string.");
8
+ if (clean.length % 4 === 1) throw invalid();
9
+ const bytes = new Uint8Array(Math.floor(clean.length * 3 / 4));
10
+ let buffer = 0;
11
+ let bits = 0;
12
+ let offset = 0;
13
+ for (const character of clean) {
14
+ const value = base64UrlAlphabet.indexOf(character);
15
+ if (value === -1) throw invalid();
16
+ buffer = (buffer << 6 | value) & 16777215;
17
+ bits += 6;
18
+ if (bits >= 8) {
19
+ bits -= 8;
20
+ bytes[offset] = buffer >> bits & 255;
21
+ offset += 1;
22
+ }
23
+ }
24
+ return bytes;
25
+ }
26
+ function browserContainer() {
27
+ if (typeof window === "undefined" || !("PushManager" in window)) return void 0;
28
+ const { navigator } = window;
29
+ return "serviceWorker" in navigator && navigator.serviceWorker ? navigator.serviceWorker : void 0;
30
+ }
31
+ /**
32
+ * Manage a Web Push subscription.
33
+ *
34
+ * Uses the push manager of `options.registration`, or of
35
+ * `navigator.serviceWorker.ready` by default. The existing subscription is
36
+ * loaded when the registration becomes known; `subscribe` accepts the VAPID
37
+ * key as a base64url string. `json` is the snapshot to send to a push server.
38
+ * Nothing needs cleanup; pending results are ignored after the owning
39
+ * reactive scope stops.
40
+ *
41
+ * Server rendering: nothing is read, `supported` is false and the
42
+ * subscription is `null`.
43
+ * Inside a component the host is resolved after mounting, so hydration
44
+ * renders this server state first.
45
+ *
46
+ * @example
47
+ * ```ts
48
+ * const push = usePushSubscription();
49
+ * const enable = async () => {
50
+ * await push.subscribe({ applicationServerKey: VAPID_PUBLIC_KEY });
51
+ * await fetch("/api/push", { method: "POST", body: JSON.stringify(push.json.value) });
52
+ * };
53
+ * ```
54
+ *
55
+ * @param options Registration override and initial read policy.
56
+ * @default options {}
57
+ * @returns Subscription state and actions.
58
+ */
59
+ function usePushSubscription(options = {}) {
60
+ const subscription = shallowRef(null);
61
+ const error = shallowRef(void 0);
62
+ let active = true;
63
+ const hydrated = shallowRef(!hasInjectionContext());
64
+ if (!hydrated.value) watchPostEffect(() => {
65
+ hydrated.value = true;
66
+ });
67
+ const source = () => {
68
+ if (!hydrated.value) return void 0;
69
+ return options.registration === void 0 ? browserContainer() : toValue(options.registration) ?? void 0;
70
+ };
71
+ const resolveManager = async () => {
72
+ const current = source();
73
+ if (!current) return void 0;
74
+ return "pushManager" in current ? current.pushManager : (await current.ready).pushManager;
75
+ };
76
+ const attempt = async (fallback, action) => {
77
+ try {
78
+ const manager = await resolveManager();
79
+ if (!manager) return fallback;
80
+ const value = await action(manager);
81
+ if (active) error.value = void 0;
82
+ return value;
83
+ } catch (cause) {
84
+ if (active) error.value = cause;
85
+ return fallback;
86
+ }
87
+ };
88
+ const refresh = () => attempt(null, async (manager) => {
89
+ const current = await manager.getSubscription();
90
+ if (active) subscription.value = current;
91
+ return current;
92
+ });
93
+ const subscribe = async ({ applicationServerKey, userVisibleOnly = true }) => {
94
+ const key = typeof applicationServerKey === "string" ? decodeApplicationServerKey(applicationServerKey) : applicationServerKey;
95
+ return attempt(null, async (manager) => {
96
+ const next = await manager.subscribe({
97
+ applicationServerKey: key,
98
+ userVisibleOnly
99
+ });
100
+ if (active) subscription.value = next;
101
+ return next;
102
+ });
103
+ };
104
+ const unsubscribe = async () => {
105
+ const current = subscription.value;
106
+ if (!current) return false;
107
+ try {
108
+ const removed = await current.unsubscribe();
109
+ if (active && removed && subscription.value === current) subscription.value = null;
110
+ if (active) error.value = void 0;
111
+ return removed;
112
+ } catch (cause) {
113
+ if (active) error.value = cause;
114
+ return false;
115
+ }
116
+ };
117
+ const permissionState = (userVisibleOnly = true) => attempt("unsupported", (manager) => manager.permissionState({ userVisibleOnly }));
118
+ if (options.immediate ?? true) watch(source, (current) => {
119
+ if (current) refresh();
120
+ else subscription.value = null;
121
+ }, { immediate: true });
122
+ tryOnScopeDispose(() => {
123
+ active = false;
124
+ });
125
+ return {
126
+ supported: computed(() => source() !== void 0),
127
+ subscription: shallowReadonly(subscription),
128
+ json: computed(() => {
129
+ const current = subscription.value;
130
+ if (!current) return null;
131
+ const serialized = current.toJSON();
132
+ return {
133
+ endpoint: serialized.endpoint ?? current.endpoint,
134
+ expirationTime: serialized.expirationTime ?? current.expirationTime,
135
+ keys: serialized.keys ?? {}
136
+ };
137
+ }),
138
+ error: readonly(error),
139
+ subscribe,
140
+ unsubscribe,
141
+ refresh,
142
+ permissionState
143
+ };
144
+ }
145
+ //#endregion
146
+ export { usePushSubscription };