@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,635 @@
1
+ import { hasInjectionContext, readonly, ref, shallowRef, toValue, watch } from "vue";
2
+ import type { MaybeRefOrGetter, Ref, ShallowRef } from "vue";
3
+
4
+ import { tryOnScopeDispose } from "./scope.ts";
5
+
6
+ /** Minimal synchronous key-value store compatible with the Web Storage API. */
7
+ export interface StorageLike {
8
+ /** Read the raw string stored for `key`, or `null` when absent. */
9
+ readonly getItem: (key: string) => string | null;
10
+
11
+ /** Store `value` under `key`. May throw (for example on quota exhaustion). */
12
+ readonly setItem: (key: string, value: string) => void;
13
+
14
+ /** Remove `key`. Removing an absent key is a no-op. */
15
+ readonly removeItem: (key: string) => void;
16
+ }
17
+
18
+ /** Converts one value type to and from its stored string representation. */
19
+ export interface StorageSerializer<Value> {
20
+ /** Decode a stored string. Throwing marks the stored value as unreadable. */
21
+ readonly read: (raw: string) => Value;
22
+
23
+ /** Encode a value for storage. */
24
+ readonly write: (value: Value) => string;
25
+ }
26
+
27
+ /** Built-in serializers selected by {@link inferStorageSerializerKind}. */
28
+ export type StorageSerializerKind =
29
+ | "bigint"
30
+ | "boolean"
31
+ | "date"
32
+ | "map"
33
+ | "number"
34
+ | "object"
35
+ | "set"
36
+ | "string";
37
+
38
+ /** Stable machine-readable failure codes reported by {@link useStorage}. */
39
+ export type StorageErrorCode = "read-failed" | "invalid-value" | "write-failed" | "remove-failed";
40
+
41
+ /** Failure observed while synchronizing a value with storage. */
42
+ export interface StorageFailure {
43
+ /** Which synchronization step failed. */
44
+ readonly code: StorageErrorCode;
45
+
46
+ /** Storage key involved in the failure. */
47
+ readonly key: string;
48
+
49
+ /** Exact thrown value, or the rejected candidate for `"invalid-value"`. */
50
+ readonly cause: unknown;
51
+ }
52
+
53
+ /**
54
+ * Validate a decoded candidate before it replaces the reactive value.
55
+ *
56
+ * Return `true` to accept the candidate. A type guard narrows `unknown` to
57
+ * the value type; plug schema libraries in here (for example
58
+ * `(candidate) => schema.safeParse(candidate).success`).
59
+ */
60
+ export type StorageValidator<Value> = (candidate: unknown) => candidate is Value;
61
+
62
+ /** Options for {@link useStorage}. */
63
+ export interface UseStorageOptions<Value> {
64
+ /**
65
+ * Reactive storage backend. `null`/`undefined` keeps the composable on its
66
+ * default value, which is also what happens during server rendering.
67
+ *
68
+ * @default window.localStorage when a browser window exists
69
+ */
70
+ readonly storage?: MaybeRefOrGetter<StorageLike | null | undefined>;
71
+
72
+ /**
73
+ * Event target receiving cross-document `storage` events and same-document
74
+ * synchronization events between instances sharing a key.
75
+ *
76
+ * @default window when a browser window exists
77
+ */
78
+ readonly eventTarget?: MaybeRefOrGetter<EventTarget | null | undefined>;
79
+
80
+ /**
81
+ * Explicit serializer. When omitted the serializer is inferred from the
82
+ * default value (see {@link inferStorageSerializerKind}).
83
+ *
84
+ * @default inferred from the default value
85
+ */
86
+ readonly serializer?: StorageSerializer<Value>;
87
+
88
+ /**
89
+ * Schema validation hook applied to every decoded value. Rejected values
90
+ * fall back to the default and report an `"invalid-value"` failure.
91
+ *
92
+ * @default a structural check that the stored value has the default's kind
93
+ */
94
+ readonly validate?: StorageValidator<Value>;
95
+
96
+ /**
97
+ * Merge a stored object with the default so newly added default keys are
98
+ * present. `true` performs a shallow merge; a function merges explicitly.
99
+ *
100
+ * @default false
101
+ */
102
+ readonly mergeDefaults?: boolean | ((stored: Value, defaults: Value) => Value);
103
+
104
+ /**
105
+ * Persist the default value when the key is absent.
106
+ *
107
+ * @default true
108
+ */
109
+ readonly writeDefaults?: boolean;
110
+
111
+ /**
112
+ * Follow changes made by other documents and other instances.
113
+ *
114
+ * @default true
115
+ */
116
+ readonly listenToStorageChanges?: boolean;
117
+
118
+ /**
119
+ * Watch nested mutations of object values.
120
+ *
121
+ * @default true
122
+ */
123
+ readonly deep?: boolean;
124
+
125
+ /**
126
+ * Write timing relative to component rendering.
127
+ *
128
+ * @default "pre"
129
+ */
130
+ readonly flush?: "pre" | "post" | "sync";
131
+
132
+ /**
133
+ * When the stored value is first read. `"post-flush"` keeps the default
134
+ * through the first render so server-rendered markup hydrates without a
135
+ * mismatch, then reads storage after mounting.
136
+ *
137
+ * @default "post-flush" inside a component, "sync" otherwise
138
+ */
139
+ readonly initialRead?: "sync" | "post-flush";
140
+
141
+ /**
142
+ * Observe read, validation, write, and removal failures. Failures never
143
+ * throw out of the composable.
144
+ *
145
+ * @default undefined
146
+ */
147
+ readonly onError?: (failure: StorageFailure) => void;
148
+ }
149
+
150
+ /** Reactive state and controls returned by {@link useStorage}. */
151
+ export interface StorageControls<Value> {
152
+ /** Writable value synchronized with storage. */
153
+ readonly state: Ref<Value>;
154
+
155
+ /** Whether a storage backend is currently attached. */
156
+ readonly supported: Readonly<Ref<boolean>>;
157
+
158
+ /** Most recent synchronization failure, cleared by the next success. */
159
+ readonly error: Readonly<ShallowRef<StorageFailure | undefined>>;
160
+
161
+ /** Re-read the stored value, replacing the reactive value. */
162
+ readonly refresh: () => void;
163
+
164
+ /** Remove the key from storage and restore the default value. */
165
+ readonly remove: () => void;
166
+ }
167
+
168
+ const SAME_DOCUMENT_EVENT = "vize:storage";
169
+
170
+ interface StorageCodec {
171
+ readonly read: (raw: string) => unknown;
172
+ readonly write: (value: unknown) => string;
173
+ }
174
+
175
+ function jsonRead(raw: string): unknown {
176
+ return JSON.parse(raw);
177
+ }
178
+
179
+ const codecs: Readonly<Record<StorageSerializerKind, StorageCodec>> = {
180
+ bigint: { read: (raw) => BigInt(raw), write: (value) => String(value) },
181
+ boolean: { read: (raw) => raw === "true", write: (value) => String(value) },
182
+ date: {
183
+ read: (raw) => new Date(raw),
184
+ write: (value) => (value instanceof Date ? value.toISOString() : String(value)),
185
+ },
186
+ map: {
187
+ read: (raw) => {
188
+ const entries = jsonRead(raw);
189
+ return new Map(Array.isArray(entries) ? entries.filter(isEntry) : []);
190
+ },
191
+ write: (value) => JSON.stringify(value instanceof Map ? [...value.entries()] : []),
192
+ },
193
+ number: { read: (raw) => Number.parseFloat(raw), write: (value) => String(value) },
194
+ object: { read: jsonRead, write: (value) => JSON.stringify(value) },
195
+ set: {
196
+ read: (raw) => {
197
+ const values = jsonRead(raw);
198
+ return new Set(Array.isArray(values) ? values : []);
199
+ },
200
+ write: (value) => JSON.stringify(value instanceof Set ? [...value] : []),
201
+ },
202
+ string: { read: (raw) => raw, write: (value) => String(value) },
203
+ };
204
+
205
+ function isEntry(candidate: unknown): candidate is readonly [unknown, unknown] {
206
+ return Array.isArray(candidate) && candidate.length === 2;
207
+ }
208
+
209
+ /**
210
+ * Typed built-in serializers, usable directly as the `serializer` option.
211
+ *
212
+ * `object` round-trips JSON-compatible values; `map` and `set` store their
213
+ * entries as JSON arrays; `date` stores an ISO-8601 string.
214
+ */
215
+ export const storageSerializers: {
216
+ /** Decimal `bigint` text. */
217
+ readonly bigint: StorageSerializer<bigint>;
218
+ /** `"true"` / `"false"`. */
219
+ readonly boolean: StorageSerializer<boolean>;
220
+ /** ISO-8601 timestamp. */
221
+ readonly date: StorageSerializer<Date>;
222
+ /** JSON array of `[key, value]` entries. */
223
+ readonly map: StorageSerializer<Map<unknown, unknown>>;
224
+ /** Decimal number text. */
225
+ readonly number: StorageSerializer<number>;
226
+ /** JSON text. */
227
+ readonly object: StorageSerializer<unknown>;
228
+ /** JSON array of members. */
229
+ readonly set: StorageSerializer<Set<unknown>>;
230
+ /** Raw string. */
231
+ readonly string: StorageSerializer<string>;
232
+ } = {
233
+ bigint: {
234
+ read: (raw) => BigInt(raw),
235
+ write: (value) => value.toString(),
236
+ },
237
+ boolean: { read: (raw) => raw === "true", write: (value) => String(value) },
238
+ date: { read: (raw) => new Date(raw), write: (value) => value.toISOString() },
239
+ map: {
240
+ read: (raw) => {
241
+ const entries = jsonRead(raw);
242
+ return new Map(Array.isArray(entries) ? entries.filter(isEntry) : []);
243
+ },
244
+ write: (value) => JSON.stringify([...value.entries()]),
245
+ },
246
+ number: { read: (raw) => Number.parseFloat(raw), write: (value) => String(value) },
247
+ object: { read: jsonRead, write: (value) => JSON.stringify(value) },
248
+ set: {
249
+ read: (raw) => {
250
+ const values = jsonRead(raw);
251
+ return new Set(Array.isArray(values) ? values : []);
252
+ },
253
+ write: (value) => JSON.stringify([...value]),
254
+ },
255
+ string: { read: (raw) => raw, write: (value) => value },
256
+ };
257
+
258
+ /**
259
+ * Select the built-in serializer kind for a default value.
260
+ *
261
+ * `null`, arrays, and plain objects use JSON (`"object"`); `Map`, `Set`, and
262
+ * `Date` use their dedicated kinds; primitives use their `typeof`.
263
+ * Functions and symbols cannot be stored and fall back to `"string"`.
264
+ *
265
+ * @param value Default value supplied to {@link useStorage}.
266
+ * @returns The inferred serializer kind.
267
+ */
268
+ export function inferStorageSerializerKind(value: unknown): StorageSerializerKind {
269
+ if (value instanceof Map) return "map";
270
+ if (value instanceof Set) return "set";
271
+ if (value instanceof Date) return "date";
272
+ switch (typeof value) {
273
+ case "bigint":
274
+ return "bigint";
275
+ case "boolean":
276
+ return "boolean";
277
+ case "number":
278
+ return "number";
279
+ case "object":
280
+ return "object";
281
+ default:
282
+ return "string";
283
+ }
284
+ }
285
+
286
+ function sameKind<Value>(defaults: Value, candidate: unknown): candidate is Value {
287
+ const kind = inferStorageSerializerKind(defaults);
288
+ if (kind === "object") {
289
+ if (defaults === null) return true;
290
+ if (Array.isArray(defaults)) return Array.isArray(candidate);
291
+ return typeof candidate === "object" && candidate !== null && !Array.isArray(candidate);
292
+ }
293
+ if (kind === "number") return typeof candidate === "number" && !Number.isNaN(candidate);
294
+ if (kind === "date") return candidate instanceof Date && !Number.isNaN(candidate.getTime());
295
+ return inferStorageSerializerKind(candidate) === kind;
296
+ }
297
+
298
+ function isPlainObject(value: unknown): value is Record<string, unknown> {
299
+ return typeof value === "object" && value !== null && !Array.isArray(value);
300
+ }
301
+
302
+ function shallowMerge<Value>(stored: Value, defaults: Value): Value {
303
+ if (!isPlainObject(stored) || !isPlainObject(defaults)) return stored;
304
+ const merged: unknown = { ...defaults, ...stored };
305
+ return sameKind(defaults, merged) ? merged : stored;
306
+ }
307
+
308
+ function browserWindow(): (Window & typeof globalThis) | undefined {
309
+ return typeof window !== "undefined" ? window : undefined;
310
+ }
311
+
312
+ function defaultStorage(area: "localStorage" | "sessionStorage"): StorageLike | undefined {
313
+ try {
314
+ return browserWindow()?.[area] ?? undefined;
315
+ } catch {
316
+ // Accessing Web Storage throws when it is disabled (for example in
317
+ // sandboxed iframes or with third-party storage blocked).
318
+ return undefined;
319
+ }
320
+ }
321
+
322
+ interface SameDocumentDetail {
323
+ readonly storage: StorageLike;
324
+ readonly key: string;
325
+ readonly raw: string | null;
326
+ readonly source: object;
327
+ }
328
+
329
+ function isSameDocumentDetail(detail: unknown): detail is SameDocumentDetail {
330
+ return isPlainObject(detail) && typeof detail.key === "string" && "storage" in detail;
331
+ }
332
+
333
+ /**
334
+ * Synchronize a typed reactive value with a Web Storage compatible backend.
335
+ *
336
+ * The serializer is inferred from `defaultValue` (numbers stay numbers,
337
+ * `Map`/`Set`/`Date` round-trip), and every decoded value passes the
338
+ * `validate` hook before it is accepted, so corrupted or foreign data falls
339
+ * back to the default instead of leaking the wrong type. Writes follow the
340
+ * reactive value; changes from other tabs (`storage` events) and from other
341
+ * instances in the same document using the same key are applied live.
342
+ *
343
+ * Server rendering: without a browser `window` no storage is touched and
344
+ * `state` holds the default. Node's global `localStorage` is intentionally
345
+ * ignored because it would be shared between requests. Inside a component
346
+ * `initialRead` defaults to `"post-flush"`, so hydrating markup that rendered
347
+ * the default matches before switching to the stored value.
348
+ *
349
+ * Failures (quota, disabled storage, malformed data) never throw; they are
350
+ * exposed through `error` and `onError`.
351
+ *
352
+ * @example
353
+ * ```ts
354
+ * const { state: theme } = useStorage("theme", "light" as "light" | "dark");
355
+ * theme.value = "dark"; // persisted
356
+ * ```
357
+ *
358
+ * @typeParam Value Stored value type, inferred from `defaultValue`.
359
+ * @param key Reactive storage key; changing it re-reads the new key.
360
+ * @param defaultValue Value used when the key is absent or unreadable.
361
+ * @param options Backend, serialization, validation, and timing options.
362
+ * @default options {}
363
+ * @returns The synchronized value and its controls.
364
+ */
365
+ export function useStorage<Value>(
366
+ key: MaybeRefOrGetter<string>,
367
+ defaultValue: MaybeRefOrGetter<Value>,
368
+ options: UseStorageOptions<Value> = {},
369
+ ): StorageControls<Value> {
370
+ const initial = toValue(defaultValue);
371
+ // Stored values are plain serializable data, for which `UnwrapRef<Value>`
372
+ // and `Value` coincide; `ref` (not `shallowRef`) keeps nested mutations of
373
+ // objects, maps, and sets observable so they are persisted too.
374
+ const state = ref(initial) as Ref<Value>;
375
+ const supported = ref(false);
376
+ const error = shallowRef<StorageFailure | undefined>(undefined);
377
+ const identity = {};
378
+ const codec: StorageCodec | StorageSerializer<Value> =
379
+ options.serializer ?? codecs[inferStorageSerializerKind(initial)];
380
+ const validate: StorageValidator<Value> =
381
+ options.validate ?? ((candidate): candidate is Value => sameKind(initial, candidate));
382
+ const listen = options.listenToStorageChanges ?? true;
383
+ let ready = false;
384
+ // Encoded form of `state` that needs no write: the raw value most recently
385
+ // read from or written to storage, or the default after a fallback/removal.
386
+ let syncedRaw: string | undefined;
387
+
388
+ const resolveStorage = (): StorageLike | undefined =>
389
+ options.storage === undefined
390
+ ? defaultStorage("localStorage")
391
+ : (toValue(options.storage) ?? undefined);
392
+ const resolveEvents = (): EventTarget | undefined =>
393
+ options.eventTarget === undefined
394
+ ? browserWindow()
395
+ : (toValue(options.eventTarget) ?? undefined);
396
+
397
+ const fail = (code: StorageErrorCode, cause: unknown): void => {
398
+ const failure: StorageFailure = { code, key: toValue(key), cause };
399
+ error.value = failure;
400
+ options.onError?.(failure);
401
+ };
402
+
403
+ const encode = (value: Value): string | undefined => {
404
+ try {
405
+ return codec.write(value);
406
+ } catch (cause) {
407
+ fail("write-failed", cause);
408
+ return undefined;
409
+ }
410
+ };
411
+
412
+ const assign = (value: Value, raw: string | undefined): void => {
413
+ syncedRaw = raw ?? encode(value);
414
+ state.value = value;
415
+ };
416
+
417
+ const decode = (raw: string): { readonly value: Value; readonly accepted: boolean } => {
418
+ const defaults = toValue(defaultValue);
419
+ let candidate: unknown;
420
+ try {
421
+ candidate = codec.read(raw);
422
+ } catch (cause) {
423
+ fail("read-failed", cause);
424
+ return { value: defaults, accepted: false };
425
+ }
426
+ if (!validate(candidate)) {
427
+ fail("invalid-value", candidate);
428
+ return { value: defaults, accepted: false };
429
+ }
430
+ const merge = options.mergeDefaults ?? false;
431
+ if (merge === false) return { value: candidate, accepted: true };
432
+ const value = merge === true ? shallowMerge(candidate, defaults) : merge(candidate, defaults);
433
+ return { value, accepted: true };
434
+ };
435
+
436
+ const notify = (storage: StorageLike, raw: string | null): void => {
437
+ const events = resolveEvents();
438
+ if (!events || !listen) return;
439
+ const detail: SameDocumentDetail = { storage, key: toValue(key), raw, source: identity };
440
+ events.dispatchEvent(new CustomEvent(SAME_DOCUMENT_EVENT, { detail }));
441
+ };
442
+
443
+ const write = (storage: StorageLike, value: Value): void => {
444
+ const raw = encode(value);
445
+ if (raw === undefined) return;
446
+ try {
447
+ storage.setItem(toValue(key), raw);
448
+ } catch (cause) {
449
+ fail("write-failed", cause);
450
+ return;
451
+ }
452
+ syncedRaw = raw;
453
+ error.value = undefined;
454
+ notify(storage, raw);
455
+ };
456
+
457
+ const applyRaw = (raw: string | null): void => {
458
+ if (raw === null) {
459
+ assign(toValue(defaultValue), undefined);
460
+ return;
461
+ }
462
+ const decoded = decode(raw);
463
+ // A rejected value keeps the stored data untouched until the next write.
464
+ assign(decoded.value, decoded.accepted ? raw : undefined);
465
+ };
466
+
467
+ const refresh = (): void => {
468
+ const storage = resolveStorage();
469
+ supported.value = storage !== undefined;
470
+ if (!storage) {
471
+ assign(toValue(defaultValue), undefined);
472
+ return;
473
+ }
474
+ let raw: string | null;
475
+ try {
476
+ raw = storage.getItem(toValue(key));
477
+ } catch (cause) {
478
+ fail("read-failed", cause);
479
+ assign(toValue(defaultValue), undefined);
480
+ return;
481
+ }
482
+ error.value = undefined;
483
+ applyRaw(raw);
484
+ if (raw === null && (options.writeDefaults ?? true)) write(storage, state.value);
485
+ };
486
+
487
+ const remove = (): void => {
488
+ const storage = resolveStorage();
489
+ if (storage) {
490
+ try {
491
+ storage.removeItem(toValue(key));
492
+ notify(storage, null);
493
+ } catch (cause) {
494
+ fail("remove-failed", cause);
495
+ }
496
+ }
497
+ assign(toValue(defaultValue), undefined);
498
+ };
499
+
500
+ const applyExternal = (storage: StorageLike, changedKey: string | null, raw: string | null) => {
501
+ if (!ready || storage !== resolveStorage()) return;
502
+ if (changedKey === null) applyRaw(null);
503
+ else if (changedKey === toValue(key)) applyRaw(raw);
504
+ };
505
+
506
+ const onStorageEvent = (event: Event): void => {
507
+ if (!("storageArea" in event) || !("key" in event) || !("newValue" in event)) return;
508
+ const { storageArea, key: changedKey, newValue } = event;
509
+ if (typeof changedKey !== "string" && changedKey !== null) return;
510
+ if (typeof newValue !== "string" && newValue !== null) return;
511
+ const storage = resolveStorage();
512
+ if (storage === undefined || storageArea !== storage) return;
513
+ applyExternal(storage, changedKey, newValue);
514
+ };
515
+
516
+ const onSameDocumentEvent = (event: Event): void => {
517
+ if (!(event instanceof CustomEvent)) return;
518
+ const detail: unknown = event.detail;
519
+ if (!isSameDocumentDetail(detail) || detail.source === identity) return;
520
+ applyExternal(detail.storage, detail.key, detail.raw);
521
+ };
522
+
523
+ const stopSource = watch(
524
+ [() => toValue(key), resolveStorage],
525
+ () => {
526
+ if (ready) refresh();
527
+ },
528
+ { flush: "sync" },
529
+ );
530
+
531
+ const stopEvents = watch(
532
+ resolveEvents,
533
+ (events, _previous, onCleanup) => {
534
+ if (!events || !listen) return;
535
+ events.addEventListener("storage", onStorageEvent);
536
+ events.addEventListener(SAME_DOCUMENT_EVENT, onSameDocumentEvent);
537
+ onCleanup(() => {
538
+ events.removeEventListener("storage", onStorageEvent);
539
+ events.removeEventListener(SAME_DOCUMENT_EVENT, onSameDocumentEvent);
540
+ });
541
+ },
542
+ { immediate: true, flush: "sync" },
543
+ );
544
+
545
+ const stopWrite = watch(
546
+ state,
547
+ (value) => {
548
+ if (!ready) return;
549
+ const storage = resolveStorage();
550
+ if (!storage) return;
551
+ const raw = encode(value);
552
+ if (raw === undefined || raw === syncedRaw) return;
553
+ write(storage, value);
554
+ },
555
+ { deep: options.deep ?? true, flush: options.flush ?? "pre" },
556
+ );
557
+
558
+ const start = (): void => {
559
+ ready = true;
560
+ refresh();
561
+ };
562
+ let stopDeferred: (() => void) | undefined;
563
+ if ((options.initialRead ?? (hasInjectionContext() ? "post-flush" : "sync")) === "sync") {
564
+ start();
565
+ } else {
566
+ // A post-flush job runs after the owning component mounted (so hydration
567
+ // saw the default), or on the next microtask outside components.
568
+ const trigger = ref(0);
569
+ stopDeferred = watch(
570
+ trigger,
571
+ () => {
572
+ stopDeferred?.();
573
+ start();
574
+ },
575
+ { flush: "post" },
576
+ );
577
+ trigger.value += 1;
578
+ }
579
+
580
+ tryOnScopeDispose(() => {
581
+ ready = false;
582
+ stopDeferred?.();
583
+ stopSource();
584
+ stopEvents();
585
+ stopWrite();
586
+ });
587
+
588
+ return {
589
+ state,
590
+ supported: readonly(supported),
591
+ error: readonly(error),
592
+ refresh,
593
+ remove,
594
+ };
595
+ }
596
+
597
+ /**
598
+ * {@link useStorage} bound to `window.localStorage` by default.
599
+ *
600
+ * @typeParam Value Stored value type, inferred from `defaultValue`.
601
+ * @param key Reactive storage key.
602
+ * @param defaultValue Value used when the key is absent or unreadable.
603
+ * @param options Serialization, validation, and timing options.
604
+ * @default options {}
605
+ * @returns The synchronized value and its controls.
606
+ */
607
+ export function useLocalStorage<Value>(
608
+ key: MaybeRefOrGetter<string>,
609
+ defaultValue: MaybeRefOrGetter<Value>,
610
+ options: UseStorageOptions<Value> = {},
611
+ ): StorageControls<Value> {
612
+ return useStorage(key, defaultValue, options);
613
+ }
614
+
615
+ /**
616
+ * {@link useStorage} bound to `window.sessionStorage` by default.
617
+ *
618
+ * @typeParam Value Stored value type, inferred from `defaultValue`.
619
+ * @param key Reactive storage key.
620
+ * @param defaultValue Value used when the key is absent or unreadable.
621
+ * @param options Serialization, validation, and timing options.
622
+ * @default options {}
623
+ * @returns The synchronized value and its controls.
624
+ */
625
+ export function useSessionStorage<Value>(
626
+ key: MaybeRefOrGetter<string>,
627
+ defaultValue: MaybeRefOrGetter<Value>,
628
+ options: UseStorageOptions<Value> = {},
629
+ ): StorageControls<Value> {
630
+ return useStorage(key, defaultValue, {
631
+ ...options,
632
+ storage:
633
+ options.storage === undefined ? () => defaultStorage("sessionStorage") : options.storage,
634
+ });
635
+ }