@vizejs/composable 0.426.3 → 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,190 @@
1
+ import { computed, shallowRef } from "vue";
2
+ import type { ComputedRef, Ref, ShallowRef } from "vue";
3
+
4
+ import { tryOnScopeDispose } from "./scope.ts";
5
+
6
+ /** Lifecycle state of an asynchronous resource. */
7
+ export type AsyncResourceStatus = "idle" | "pending" | "success" | "error" | "cancelled";
8
+
9
+ /** Context supplied to an asynchronous resource loader. */
10
+ export interface AsyncResourceContext {
11
+ /** Signal aborted by cancellation, reset, scope disposal, or a newer execution. */
12
+ readonly signal: AbortSignal;
13
+ }
14
+
15
+ /** Explicit result of one asynchronous resource execution. */
16
+ export type AsyncResourceExecution<Data, Failure> =
17
+ | { readonly status: "success"; readonly data: Data }
18
+ | { readonly status: "error"; readonly error: Failure }
19
+ | { readonly status: "cancelled"; readonly reason: unknown }
20
+ | { readonly status: "superseded" };
21
+
22
+ /** Options for {@link useAsyncResource}. */
23
+ export interface UseAsyncResourceOptions<Data> {
24
+ /**
25
+ * Initial data restored by {@link AsyncResource.reset}.
26
+ *
27
+ * @default undefined
28
+ */
29
+ readonly initialData?: Data;
30
+
31
+ /**
32
+ * Abort the active execution when a newer execution starts.
33
+ *
34
+ * @default true
35
+ */
36
+ readonly cancelPrevious?: boolean;
37
+
38
+ /**
39
+ * Retain the current data while a new execution is pending.
40
+ *
41
+ * @default true
42
+ */
43
+ readonly keepData?: boolean;
44
+
45
+ /**
46
+ * Cancel an active execution when the current reactive scope is disposed.
47
+ *
48
+ * @default true
49
+ */
50
+ readonly scope?: boolean;
51
+ }
52
+
53
+ /** Reactive state and controls for an asynchronous loader. */
54
+ export interface AsyncResource<Data, Arguments extends readonly unknown[], Failure> {
55
+ /** Data of the newest successful execution, retained according to `keepData`. */
56
+ readonly data: Readonly<ShallowRef<Data | undefined>>;
57
+
58
+ /** Failure of the newest settled execution, cleared when a new one starts. */
59
+ readonly error: Readonly<ShallowRef<Failure | undefined>>;
60
+
61
+ /** Current lifecycle status, driven only by the newest execution. */
62
+ readonly status: Readonly<Ref<AsyncResourceStatus>>;
63
+
64
+ /** Whether an execution is currently pending. */
65
+ readonly pending: ComputedRef<boolean>;
66
+
67
+ /**
68
+ * Run the loader. The returned promise never rejects: loader failures,
69
+ * cancellation, and supersession are reported as the discriminated result,
70
+ * and stale executions leave the reactive state untouched.
71
+ */
72
+ readonly execute: (...arguments_: Arguments) => Promise<AsyncResourceExecution<Data, Failure>>;
73
+
74
+ /**
75
+ * Abort the active execution and mark the resource cancelled.
76
+ *
77
+ * @param reason Abort reason forwarded to the loader's signal.
78
+ * @default reason DOMException("AbortError")
79
+ * @returns Whether an active execution was cancelled.
80
+ */
81
+ readonly cancel: (reason?: unknown) => boolean;
82
+
83
+ /** Cancel any active execution and restore the initial idle state. */
84
+ readonly reset: () => void;
85
+ }
86
+
87
+ interface ActiveExecution {
88
+ readonly generation: number;
89
+ readonly controller: AbortController;
90
+ superseded: boolean;
91
+ }
92
+
93
+ /**
94
+ * Create a scoped, abortable asynchronous resource with latest-result-wins
95
+ * state. Every execution returns a discriminated result, so cancellation,
96
+ * supersession, loader failure, and successful `undefined` data stay distinct.
97
+ *
98
+ * When created inside an active reactive scope (and `scope` is enabled), the
99
+ * active execution is aborted when that scope stops; outside a scope,
100
+ * cancellation ownership stays with the caller. The execute promise never
101
+ * rejects — synchronous and asynchronous loader failures both settle into
102
+ * the `"error"` result. Safe during server rendering: no browser globals are
103
+ * read and abort reasons use the runtime-native `DOMException`.
104
+ *
105
+ * @param loader Asynchronous loader receiving the abort context first.
106
+ * @param options Data retention, supersession, and scope behavior.
107
+ * @default options {}
108
+ * @returns Reactive state and controls for the loader.
109
+ */
110
+ export function useAsyncResource<Data, Arguments extends readonly unknown[], Failure = unknown>(
111
+ loader: (context: AsyncResourceContext, ...arguments_: Arguments) => Promise<Data>,
112
+ options: UseAsyncResourceOptions<Data> = {},
113
+ ): AsyncResource<Data, Arguments, Failure> {
114
+ const data = shallowRef<Data | undefined>(options.initialData);
115
+ const error = shallowRef<Failure | undefined>(undefined);
116
+ const status = shallowRef<AsyncResourceStatus>("idle");
117
+ const pending = computed(() => status.value === "pending");
118
+ let generation = 0;
119
+ let active: ActiveExecution | undefined;
120
+
121
+ const cancel = (reason: unknown = createAbortReason("The execution was cancelled.")) => {
122
+ if (active === undefined) return false;
123
+ generation += 1;
124
+ active.controller.abort(reason);
125
+ active = undefined;
126
+ status.value = "cancelled";
127
+ return true;
128
+ };
129
+
130
+ const execute = async (
131
+ ...arguments_: Arguments
132
+ ): Promise<AsyncResourceExecution<Data, Failure>> => {
133
+ if ((options.cancelPrevious ?? true) && active !== undefined) {
134
+ active.superseded = true;
135
+ active.controller.abort(createAbortReason("A newer execution started."));
136
+ }
137
+ const record: ActiveExecution = {
138
+ generation: ++generation,
139
+ controller: new AbortController(),
140
+ superseded: false,
141
+ };
142
+ active = record;
143
+ error.value = undefined;
144
+ status.value = "pending";
145
+ if (!(options.keepData ?? true)) data.value = undefined;
146
+
147
+ try {
148
+ const result = await loader({ signal: record.controller.signal }, ...arguments_);
149
+ if (record.generation !== generation) return executionAfterInvalidation(record);
150
+ data.value = result;
151
+ status.value = "success";
152
+ return { status: "success", data: result } as const;
153
+ } catch (cause) {
154
+ if (record.generation !== generation || record.controller.signal.aborted) {
155
+ return executionAfterInvalidation(record);
156
+ }
157
+ error.value = cause as Failure;
158
+ status.value = "error";
159
+ return { status: "error", error: cause as Failure } as const;
160
+ } finally {
161
+ if (active === record) active = undefined;
162
+ }
163
+ };
164
+
165
+ const reset = () => {
166
+ cancel(createAbortReason("The resource was reset."));
167
+ data.value = options.initialData;
168
+ error.value = undefined;
169
+ status.value = "idle";
170
+ };
171
+
172
+ if (options.scope ?? true) {
173
+ tryOnScopeDispose(() => cancel(createAbortReason("The reactive scope was disposed.")));
174
+ }
175
+
176
+ return { data, error, status, pending, execute, cancel, reset };
177
+ }
178
+
179
+ function executionAfterInvalidation<Data, Failure>(
180
+ execution: ActiveExecution,
181
+ ): AsyncResourceExecution<Data, Failure> {
182
+ if (execution.superseded || !execution.controller.signal.aborted) {
183
+ return { status: "superseded" };
184
+ }
185
+ return { status: "cancelled", reason: execution.controller.signal.reason };
186
+ }
187
+
188
+ function createAbortReason(message: string): DOMException {
189
+ return new DOMException(message, "AbortError");
190
+ }
@@ -0,0 +1,166 @@
1
+ import { hasInjectionContext, onMounted, readonly, ref, shallowRef, toValue, watch } from "vue";
2
+ import type { MaybeRefOrGetter, Ref, ShallowRef } from "vue";
3
+
4
+ import { tryOnScopeDispose } from "./scope.ts";
5
+
6
+ /** Subset of the Battery Status API `BatteryManager`. */
7
+ export interface BatteryManagerLike extends EventTarget {
8
+ /** Whether the battery is charging. */
9
+ readonly charging: boolean;
10
+ /** Seconds until fully charged (`Infinity` when discharging). */
11
+ readonly chargingTime: number;
12
+ /** Seconds until empty (`Infinity` when charging). */
13
+ readonly dischargingTime: number;
14
+ /** Charge level in `[0, 1]`. */
15
+ readonly level: number;
16
+ }
17
+
18
+ /** Navigator-like capability used by {@link useBattery}. */
19
+ export interface BatteryHost {
20
+ /** Resolve the battery manager, where supported. */
21
+ readonly getBattery?: () => Promise<BatteryManagerLike>;
22
+ }
23
+
24
+ /** Options for {@link useBattery}. */
25
+ export interface UseBatteryOptions {
26
+ /**
27
+ * Reactive navigator capability for alternate runtimes and tests.
28
+ *
29
+ * @default globalThis.window.navigator when available
30
+ */
31
+ readonly host?: MaybeRefOrGetter<BatteryHost | null | undefined>;
32
+ }
33
+
34
+ /** Reactive battery state returned by {@link useBattery}. */
35
+ export interface BatteryControls {
36
+ /** Whether the host exposes `getBattery`. `false` during server rendering. */
37
+ readonly isSupported: Readonly<Ref<boolean>>;
38
+ /** Whether the battery manager has resolved. */
39
+ readonly isReady: Readonly<Ref<boolean>>;
40
+ /** Whether the battery is charging. */
41
+ readonly charging: Readonly<Ref<boolean>>;
42
+ /** Seconds until fully charged. */
43
+ readonly chargingTime: Readonly<Ref<number>>;
44
+ /** Seconds until empty. */
45
+ readonly dischargingTime: Readonly<Ref<number>>;
46
+ /** Charge level in `[0, 1]`. */
47
+ readonly level: Readonly<Ref<number>>;
48
+ /** Rejection from `getBattery`, if any (for example a permissions policy). */
49
+ readonly error: Readonly<ShallowRef<unknown>>;
50
+ }
51
+
52
+ const batteryEvents = [
53
+ "chargingchange",
54
+ "chargingtimechange",
55
+ "dischargingtimechange",
56
+ "levelchange",
57
+ ] as const;
58
+
59
+ /**
60
+ * Track the device battery with the Battery Status API.
61
+ *
62
+ * Server renders (and unsupported browsers) expose a full, charging battery
63
+ * (`level: 1`, `charging: true`, times `0`/`Infinity`), which is the
64
+ * least alarming deterministic default. Late resolutions after the host
65
+ * changed or the scope stopped are ignored, and listeners are removed with
66
+ * the owning reactive scope.
67
+ *
68
+ * @param options Navigator capability.
69
+ * @default options {}
70
+ * @returns Reactive battery state.
71
+ */
72
+ export function useBattery(options: UseBatteryOptions = {}): BatteryControls {
73
+ const isSupported = ref(false);
74
+ const isReady = ref(false);
75
+ const charging = ref(true);
76
+ const chargingTime = ref(0);
77
+ const dischargingTime = ref(Number.POSITIVE_INFINITY);
78
+ const level = ref(1);
79
+ const error = shallowRef<unknown>(undefined);
80
+ // Inside a component the host is read once it has mounted, so a hydrating
81
+ // client first renders the same fallback as the server. `hasInjectionContext`
82
+ // also detects Vapor components (unlike `getCurrentInstance`).
83
+ const mounted = shallowRef(!hasInjectionContext());
84
+ if (!mounted.value) {
85
+ onMounted(() => {
86
+ mounted.value = true;
87
+ });
88
+ }
89
+
90
+ const stop = watch(
91
+ () =>
92
+ !mounted.value
93
+ ? undefined
94
+ : options.host === undefined
95
+ ? browserBatteryHost()
96
+ : toValue(options.host),
97
+ (host, _previous, onCleanup) => {
98
+ const getBattery = host?.getBattery;
99
+ isSupported.value = typeof getBattery === "function";
100
+ isReady.value = false;
101
+ if (!host || typeof getBattery !== "function") return;
102
+ let cancelled = false;
103
+ let release = (): void => undefined;
104
+ onCleanup(() => {
105
+ cancelled = true;
106
+ release();
107
+ });
108
+ getBattery.call(host).then(
109
+ (battery) => {
110
+ if (cancelled) return;
111
+ const update = (): void => {
112
+ charging.value = battery.charging;
113
+ chargingTime.value = battery.chargingTime;
114
+ dischargingTime.value = battery.dischargingTime;
115
+ level.value = battery.level;
116
+ };
117
+ update();
118
+ isReady.value = true;
119
+ for (const type of batteryEvents) battery.addEventListener(type, update);
120
+ release = () => {
121
+ for (const type of batteryEvents) battery.removeEventListener(type, update);
122
+ };
123
+ },
124
+ (cause: unknown) => {
125
+ if (!cancelled) error.value = cause;
126
+ },
127
+ );
128
+ },
129
+ { immediate: true },
130
+ );
131
+ tryOnScopeDispose(() => stop.stop());
132
+
133
+ return {
134
+ isSupported: readonly(isSupported),
135
+ isReady: readonly(isReady),
136
+ charging: readonly(charging),
137
+ chargingTime: readonly(chargingTime),
138
+ dischargingTime: readonly(dischargingTime),
139
+ level: readonly(level),
140
+ error,
141
+ };
142
+ }
143
+
144
+ function browserBatteryHost(): BatteryHost | undefined {
145
+ if (typeof window === "undefined") return undefined;
146
+ const navigator: object = window.navigator;
147
+ if (!("getBattery" in navigator) || typeof navigator.getBattery !== "function") return {};
148
+ const request = navigator.getBattery;
149
+ return {
150
+ getBattery: async () => {
151
+ const battery: unknown = await Reflect.apply(request, navigator, []);
152
+ if (isBatteryManager(battery)) return battery;
153
+ throw new TypeError("navigator.getBattery() resolved to an unexpected value.");
154
+ },
155
+ };
156
+ }
157
+
158
+ function isBatteryManager(value: unknown): value is BatteryManagerLike {
159
+ return (
160
+ typeof value === "object" &&
161
+ value !== null &&
162
+ "level" in value &&
163
+ "charging" in value &&
164
+ "addEventListener" in value
165
+ );
166
+ }
@@ -0,0 +1,166 @@
1
+ import { computed } from "vue";
2
+ import type { ComputedRef, Ref } from "vue";
3
+
4
+ import { useMediaQuery } from "./media-query.ts";
5
+ import type { UseMediaQueryOptions } from "./media-query.ts";
6
+
7
+ /** Breakpoint width: pixels as a number, or a CSS length in `px`, `rem`, or `em`. */
8
+ export type BreakpointValue = number | `${number}px` | `${number}rem` | `${number}em`;
9
+
10
+ /** Named breakpoint map. */
11
+ export type Breakpoints<Name extends string = string> = Readonly<Record<Name, BreakpointValue>>;
12
+
13
+ /** Tailwind CSS default breakpoints. */
14
+ export const breakpointsTailwind = {
15
+ sm: 640,
16
+ md: 768,
17
+ lg: 1024,
18
+ xl: 1280,
19
+ "2xl": 1536,
20
+ } as const satisfies Breakpoints;
21
+
22
+ /** Bootstrap 5 default breakpoints. */
23
+ export const breakpointsBootstrapV5 = {
24
+ xs: 0,
25
+ sm: 576,
26
+ md: 768,
27
+ lg: 992,
28
+ xl: 1200,
29
+ xxl: 1400,
30
+ } as const satisfies Breakpoints;
31
+
32
+ /** Names reserved for the helper methods returned by {@link useBreakpoints}. */
33
+ export type ReservedBreakpointName =
34
+ | "greaterOrEqual"
35
+ | "greater"
36
+ | "smaller"
37
+ | "smallerOrEqual"
38
+ | "between"
39
+ | "current"
40
+ | "active";
41
+
42
+ /** Options for {@link useBreakpoints}. */
43
+ export interface UseBreakpointsOptions extends Omit<UseMediaQueryOptions, "ssrValue"> {
44
+ /**
45
+ * Viewport width assumed during server rendering (and whenever no media
46
+ * capability exists). Queries are evaluated against it arithmetically, so
47
+ * the server output matches a client of that width.
48
+ *
49
+ * @default undefined (every query is `false` on the server)
50
+ */
51
+ readonly ssrWidth?: number;
52
+
53
+ /**
54
+ * Root font size used to convert `rem`/`em` values for `ssrWidth`.
55
+ *
56
+ * @default 16
57
+ */
58
+ readonly rootFontSize?: number;
59
+ }
60
+
61
+ /** Reactive breakpoint helpers returned by {@link useBreakpoints}. */
62
+ export type BreakpointsControls<Name extends string> = {
63
+ /** `true` when the viewport is at least this breakpoint (mobile-first). */
64
+ readonly [Key in Name]: Readonly<Ref<boolean>>;
65
+ } & {
66
+ /** Viewport width ≥ breakpoint. */
67
+ readonly greaterOrEqual: (name: Name) => Readonly<Ref<boolean>>;
68
+ /** Viewport width > breakpoint. */
69
+ readonly greater: (name: Name) => Readonly<Ref<boolean>>;
70
+ /** Viewport width < breakpoint. */
71
+ readonly smaller: (name: Name) => Readonly<Ref<boolean>>;
72
+ /** Viewport width ≤ breakpoint. */
73
+ readonly smallerOrEqual: (name: Name) => Readonly<Ref<boolean>>;
74
+ /** `lower` ≤ width < `upper`. */
75
+ readonly between: (lower: Name, upper: Name) => ComputedRef<boolean>;
76
+ /** Every breakpoint currently matched (mobile-first), in ascending order. */
77
+ readonly current: ComputedRef<readonly Name[]>;
78
+ /** Largest matched breakpoint, or `null` below the smallest one. */
79
+ readonly active: ComputedRef<Name | null>;
80
+ };
81
+
82
+ /**
83
+ * Reactive, typed breakpoint helpers built on media queries.
84
+ *
85
+ * Breakpoint names are inferred from the map, so typos are compile errors.
86
+ * `greater` and `smaller` use fractional offsets (`width > 767.98px`) so
87
+ * adjacent breakpoints never overlap. With `ssrWidth`, the server evaluates
88
+ * each query arithmetically for deterministic, hydration-stable output.
89
+ * Subscriptions are released with the owning reactive scope.
90
+ *
91
+ * @param breakpoints Named breakpoint map, e.g. {@link breakpointsTailwind}.
92
+ * @param options SSR width, font size, and media capability.
93
+ * @default options {}
94
+ * @returns Per-breakpoint refs plus comparison helpers.
95
+ */
96
+ export function useBreakpoints<const Name extends string>(
97
+ breakpoints: Breakpoints<Name> & { readonly [Reserved in ReservedBreakpointName]?: never },
98
+ options: UseBreakpointsOptions = {},
99
+ ): BreakpointsControls<Name> {
100
+ const rootFontSize = options.rootFontSize ?? 16;
101
+ const isName = (key: string): key is Name => Object.hasOwn(breakpoints, key);
102
+ const names = Object.keys(breakpoints).filter(isName);
103
+ names.sort(
104
+ (left, right) =>
105
+ toPixels(breakpoints[left], rootFontSize) - toPixels(breakpoints[right], rootFontSize),
106
+ );
107
+ const cache = new Map<string, Readonly<Ref<boolean>>>();
108
+
109
+ const query = (feature: "min-width" | "max-width", pixels: number): Readonly<Ref<boolean>> => {
110
+ const text = `(${feature}: ${pixels}px)`;
111
+ const cached = cache.get(text);
112
+ if (cached) return cached;
113
+ const ssrWidth = options.ssrWidth;
114
+ const ssrValue =
115
+ ssrWidth === undefined
116
+ ? false
117
+ : feature === "min-width"
118
+ ? ssrWidth >= pixels
119
+ : ssrWidth <= pixels;
120
+ const matches = useMediaQuery(
121
+ text,
122
+ options.host === undefined ? { ssrValue } : { ssrValue, host: options.host },
123
+ );
124
+ cache.set(text, matches);
125
+ return matches;
126
+ };
127
+ const px = (name: Name): number => toPixels(breakpoints[name], rootFontSize);
128
+ const greaterOrEqual = (name: Name): Readonly<Ref<boolean>> => query("min-width", px(name));
129
+ const greater = (name: Name): Readonly<Ref<boolean>> => query("min-width", px(name) + 0.02);
130
+ const smaller = (name: Name): Readonly<Ref<boolean>> => query("max-width", px(name) - 0.02);
131
+ const smallerOrEqual = (name: Name): Readonly<Ref<boolean>> => query("max-width", px(name));
132
+
133
+ // Every key is assigned by the loop below before the record is read.
134
+ const perName = {} as Record<Name, Readonly<Ref<boolean>>>;
135
+ for (const name of names) perName[name] = greaterOrEqual(name);
136
+ const current = computed<readonly Name[]>(() => names.filter((name) => perName[name].value));
137
+
138
+ return {
139
+ ...perName,
140
+ greaterOrEqual,
141
+ greater,
142
+ smaller,
143
+ smallerOrEqual,
144
+ between: (lower, upper) => {
145
+ const above = greaterOrEqual(lower);
146
+ const below = smaller(upper);
147
+ return computed(() => above.value && below.value);
148
+ },
149
+ current,
150
+ active: computed(() => current.value.at(-1) ?? null),
151
+ };
152
+ }
153
+
154
+ /**
155
+ * Convert a {@link BreakpointValue} to CSS pixels.
156
+ *
157
+ * @param value Number of pixels or a `px`/`rem`/`em` length.
158
+ * @param rootFontSize Pixels per `rem`/`em`.
159
+ * @default rootFontSize 16
160
+ * @returns Width in CSS pixels.
161
+ */
162
+ export function toPixels(value: BreakpointValue, rootFontSize = 16): number {
163
+ if (typeof value === "number") return value;
164
+ const amount = Number.parseFloat(value);
165
+ return value.endsWith("px") ? amount : amount * rootFontSize;
166
+ }
@@ -0,0 +1,171 @@
1
+ /** Runtime families understood by composable capability metadata and adapters. */
2
+ export type CapabilityTarget = "web" | "server" | "worker" | "native" | "desktop" | "terminal";
3
+
4
+ /** Built-in origins from which a capability value can be resolved. */
5
+ export type CapabilitySource = "runtime" | "adapter" | "fallback";
6
+
7
+ /**
8
+ * Standard reasons why a capability cannot currently provide a value.
9
+ *
10
+ * Adapters may extend this vocabulary with a narrower string-literal union;
11
+ * consumers should preserve unknown extension reasons when crossing process
12
+ * or version boundaries.
13
+ */
14
+ export type CapabilityUnavailableReason =
15
+ | "unsupported"
16
+ | "unavailable"
17
+ | "permission-denied"
18
+ | "insecure-context"
19
+ | "not-active"
20
+ | "not-ready"
21
+ | "cancelled"
22
+ | "adapter-missing"
23
+ | "adapter-error";
24
+
25
+ /** A capability value that is ready for use. */
26
+ export interface AvailableCapability<Value, Source extends string = CapabilitySource> {
27
+ /** Stable discriminant for serialization and exhaustive matching. */
28
+ readonly status: "available";
29
+
30
+ /** Boolean discriminant for ergonomic guards in templates and JavaScript. */
31
+ readonly available: true;
32
+
33
+ /** Resolved capability implementation or value. */
34
+ readonly value: Value;
35
+
36
+ /** Origin that supplied the value, preserved as a string literal. */
37
+ readonly source: Source;
38
+ }
39
+
40
+ /** A capability that cannot currently provide a value. */
41
+ export interface UnavailableCapability<
42
+ Reason extends string = CapabilityUnavailableReason,
43
+ Details = undefined,
44
+ > {
45
+ /** Stable discriminant for serialization and exhaustive matching. */
46
+ readonly status: "unavailable";
47
+
48
+ /** Boolean discriminant for ergonomic guards in templates and JavaScript. */
49
+ readonly available: false;
50
+
51
+ /** Typed, machine-readable explanation of the unavailable state. */
52
+ readonly reason: Reason;
53
+
54
+ /** Structured diagnostic or recovery information supplied by the adapter. */
55
+ readonly details: Details;
56
+ }
57
+
58
+ /** Explicit result of capability discovery or adapter negotiation. */
59
+ export type CapabilityResult<
60
+ Value,
61
+ Reason extends string = CapabilityUnavailableReason,
62
+ Details = undefined,
63
+ Source extends string = CapabilitySource,
64
+ > = AvailableCapability<Value, Source> | UnavailableCapability<Reason, Details>;
65
+
66
+ /**
67
+ * Create an available capability supplied directly by the current runtime.
68
+ *
69
+ * The value and source retain literal types. The helper performs no global
70
+ * access and is safe during server rendering and module evaluation.
71
+ *
72
+ * @param value Resolved capability implementation or value.
73
+ * @returns An available result whose source is `"runtime"`.
74
+ */
75
+ export function availableCapability<const Value>(
76
+ value: Value,
77
+ ): AvailableCapability<Value, "runtime">;
78
+
79
+ /**
80
+ * Create an available capability with an explicit, literal-preserving source.
81
+ *
82
+ * @param value Resolved capability implementation or value.
83
+ * @param source Runtime, adapter, fallback, or adapter-specific source name.
84
+ * @returns An available capability result.
85
+ */
86
+ export function availableCapability<const Value, const Source extends string>(
87
+ value: Value,
88
+ source: Source,
89
+ ): AvailableCapability<Value, Source>;
90
+
91
+ export function availableCapability<const Value, const Source extends string>(
92
+ value: Value,
93
+ source?: Source,
94
+ ): AvailableCapability<Value, Source | "runtime"> {
95
+ return {
96
+ status: "available",
97
+ available: true,
98
+ value,
99
+ source: source ?? "runtime",
100
+ };
101
+ }
102
+
103
+ /**
104
+ * Create an unavailable capability without additional details.
105
+ *
106
+ * The reason retains its string-literal type. Capability absence is returned
107
+ * as data rather than thrown, making unsupported server, worker, native,
108
+ * desktop, and terminal environments deterministic.
109
+ *
110
+ * @param reason Machine-readable unavailability reason.
111
+ * @returns An unavailable result with `undefined` details.
112
+ */
113
+ export function unavailableCapability<const Reason extends string>(
114
+ reason: Reason,
115
+ ): UnavailableCapability<Reason, undefined>;
116
+
117
+ /**
118
+ * Create an unavailable capability with typed recovery or diagnostic details.
119
+ *
120
+ * Passing `undefined` explicitly is distinct at the call boundary and still
121
+ * preserves the exact `undefined` details type.
122
+ *
123
+ * @param reason Machine-readable unavailability reason.
124
+ * @param details Structured diagnostic or recovery information.
125
+ * @returns An unavailable capability result.
126
+ */
127
+ export function unavailableCapability<const Reason extends string, const Details>(
128
+ reason: Reason,
129
+ details: Details,
130
+ ): UnavailableCapability<Reason, Details>;
131
+
132
+ export function unavailableCapability<const Reason extends string, const Details>(
133
+ reason: Reason,
134
+ details?: Details,
135
+ ): UnavailableCapability<Reason, Details | undefined> {
136
+ return {
137
+ status: "unavailable",
138
+ available: false,
139
+ reason,
140
+ details,
141
+ };
142
+ }
143
+
144
+ /**
145
+ * Narrow a capability result to its available branch.
146
+ *
147
+ * @param result Capability discovery or negotiation result.
148
+ * @returns Whether `result.value` is ready for use.
149
+ */
150
+ export function isCapabilityAvailable<Value, Reason extends string, Details, Source extends string>(
151
+ result: CapabilityResult<Value, Reason, Details, Source>,
152
+ ): result is AvailableCapability<Value, Source> {
153
+ return result.available;
154
+ }
155
+
156
+ /**
157
+ * Narrow a capability result to its unavailable branch.
158
+ *
159
+ * @param result Capability discovery or negotiation result.
160
+ * @returns Whether the capability has a typed unavailability reason.
161
+ */
162
+ export function isCapabilityUnavailable<
163
+ Value,
164
+ Reason extends string,
165
+ Details,
166
+ Source extends string,
167
+ >(
168
+ result: CapabilityResult<Value, Reason, Details, Source>,
169
+ ): result is UnavailableCapability<Reason, Details> {
170
+ return !result.available;
171
+ }