elements-kit 0.0.10 → 0.0.11

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 (310) hide show
  1. package/README.md +3 -4
  2. package/dist/builder/dom.d.mts +1 -1
  3. package/dist/builder/index.d.mts +87 -1
  4. package/dist/builder/index.mjs +1 -1
  5. package/dist/{element-Ddk9YaoE.mjs → element-MXzFk4G2.mjs} +1 -1
  6. package/dist/{index-BtqiEEfc.d.mts → index-Cvdhuy6Y.d.mts} +8 -4
  7. package/dist/index.d.mts +1 -1
  8. package/dist/index.mjs +3 -3
  9. package/dist/{signals/lib → integrations}/react.d.mts +2 -2
  10. package/dist/{signals/lib → integrations}/react.mjs +2 -2
  11. package/dist/jsx-runtime/index.d.mts +2 -2
  12. package/dist/jsx-runtime/index.mjs +3 -3
  13. package/dist/lib-BYJ5jPTG.d.mts +4 -0
  14. package/dist/polyfill-DR5XVnh_.d.mts +9 -0
  15. package/dist/signals/index.d.mts +2 -2
  16. package/dist/signals/index.mjs +2 -2
  17. package/dist/{signals-CLAPw8kk.mjs → signals-DcgXhkU2.mjs} +41 -9
  18. package/dist/slot.d.mts +1 -2
  19. package/dist/{test.BmQO5GaM-CR2qjV1t.mjs → test.BmQO5GaM-ANkhHvbr.mjs} +1 -1
  20. package/dist/utilities/active-element.d.mts +6 -0
  21. package/dist/utilities/active-element.mjs +13 -0
  22. package/dist/utilities/active-element.test.mjs +24 -0
  23. package/dist/{signals/lib → utilities}/debounced.d.mts +3 -3
  24. package/dist/{signals/lib → utilities}/debounced.mjs +7 -6
  25. package/dist/{signals/lib → utilities}/debounced.test.mjs +3 -3
  26. package/dist/{signals/lib → utilities}/element-rect.d.mts +3 -3
  27. package/dist/{signals/lib → utilities}/element-rect.mjs +7 -7
  28. package/dist/{signals/lib → utilities}/element-rect.test.mjs +3 -3
  29. package/dist/utilities/element-scroll.d.mts +16 -0
  30. package/dist/utilities/element-scroll.mjs +52 -0
  31. package/dist/utilities/element-scroll.test.mjs +25 -0
  32. package/dist/{signals/lib → utilities}/event-driven.d.mts +2 -2
  33. package/dist/{signals/lib → utilities}/event-driven.mjs +2 -2
  34. package/dist/utilities/event-listener.d.mts +16 -0
  35. package/dist/{signals/lib → utilities}/event-listener.mjs +4 -4
  36. package/dist/{signals/lib → utilities}/event-listener.test.mjs +8 -8
  37. package/dist/utilities/focus-within.d.mts +10 -0
  38. package/dist/utilities/focus-within.mjs +20 -0
  39. package/dist/{signals/lib/is-focus-within.test.mjs → utilities/focus-within.test.mjs} +10 -11
  40. package/dist/utilities/hover.d.mts +11 -0
  41. package/dist/utilities/hover.mjs +20 -0
  42. package/dist/{signals/lib → utilities}/hover.test.mjs +5 -16
  43. package/dist/utilities/intersection-observer.d.mts +8 -0
  44. package/dist/{signals/lib → utilities}/intersection-observer.mjs +3 -4
  45. package/dist/{signals/lib → utilities}/intersection-observer.test.mjs +3 -3
  46. package/dist/{signals/lib → utilities}/interval.d.mts +2 -2
  47. package/dist/{signals/lib → utilities}/interval.mjs +6 -5
  48. package/dist/{signals/lib → utilities}/interval.test.mjs +3 -3
  49. package/dist/utilities/location.d.mts +24 -0
  50. package/dist/utilities/location.mjs +54 -0
  51. package/dist/utilities/location.test.mjs +60 -0
  52. package/dist/utilities/long-press.d.mts +10 -0
  53. package/dist/utilities/long-press.mjs +27 -0
  54. package/dist/{signals/lib → utilities}/long-press.test.mjs +3 -3
  55. package/dist/{signals/lib → utilities}/media-devices.d.mts +3 -3
  56. package/dist/{signals/lib → utilities}/media-devices.mjs +5 -5
  57. package/dist/{signals/lib → utilities}/media-devices.test.mjs +6 -8
  58. package/dist/utilities/media-player.d.mts +22 -0
  59. package/dist/{signals/lib/video.mjs → utilities/media-player.mjs} +5 -4
  60. package/dist/utilities/media-player.test.mjs +100 -0
  61. package/dist/{signals/lib/media.d.mts → utilities/media-query.d.mts} +4 -4
  62. package/dist/{signals/lib/media.mjs → utilities/media-query.mjs} +6 -6
  63. package/dist/utilities/mutation-observer.d.mts +8 -0
  64. package/dist/{signals/lib → utilities}/mutation-observer.mjs +3 -3
  65. package/dist/{signals/lib → utilities}/mutation-observer.test.mjs +3 -3
  66. package/dist/{signals/lib → utilities}/on-click-outside.d.mts +3 -3
  67. package/dist/utilities/on-click-outside.mjs +17 -0
  68. package/dist/{signals/lib → utilities}/on-click-outside.test.mjs +7 -18
  69. package/dist/utilities/orientation.d.mts +10 -0
  70. package/dist/{signals/lib → utilities}/orientation.mjs +3 -2
  71. package/dist/utilities/previous.d.mts +12 -0
  72. package/dist/utilities/previous.mjs +24 -0
  73. package/dist/utilities/previous.test.mjs +88 -0
  74. package/dist/utilities/resize-observer.d.mts +8 -0
  75. package/dist/{signals/lib → utilities}/resize-observer.mjs +4 -5
  76. package/dist/utilities/routing.d.mts +59 -0
  77. package/dist/utilities/routing.mjs +89 -0
  78. package/dist/utilities/routing.test.mjs +128 -0
  79. package/dist/utilities/search-params.d.mts +13 -0
  80. package/dist/utilities/search-params.mjs +23 -0
  81. package/dist/utilities/search-params.test.mjs +35 -0
  82. package/dist/utilities/storage.d.mts +22 -0
  83. package/dist/utilities/storage.mjs +65 -0
  84. package/dist/utilities/storage.test.mjs +137 -0
  85. package/dist/{signals/lib → utilities}/throttled.d.mts +2 -2
  86. package/dist/utilities/throttled.mjs +36 -0
  87. package/dist/{signals/lib → utilities}/throttled.test.mjs +3 -3
  88. package/dist/{signals/lib → utilities}/timeout.d.mts +6 -5
  89. package/dist/utilities/timeout.mjs +42 -0
  90. package/dist/{signals/lib → utilities}/timeout.test.mjs +7 -7
  91. package/dist/utilities/window-size.d.mts +10 -0
  92. package/dist/utilities/window-size.mjs +22 -0
  93. package/dist/utilities/window-size.test.mjs +42 -0
  94. package/package.json +11 -6
  95. package/dist/index-CKjDUp1B.d.mts +0 -89
  96. package/dist/polyfill-AFIi9kAN.d.mts +0 -14
  97. package/dist/signals/lib/active-element.d.mts +0 -10
  98. package/dist/signals/lib/active-element.mjs +0 -12
  99. package/dist/signals/lib/active-element.test.mjs +0 -39
  100. package/dist/signals/lib/animation-frames.d.mts +0 -18
  101. package/dist/signals/lib/animation-frames.mjs +0 -48
  102. package/dist/signals/lib/animation-frames.test.mjs +0 -52
  103. package/dist/signals/lib/async-retry.d.mts +0 -21
  104. package/dist/signals/lib/async-retry.mjs +0 -57
  105. package/dist/signals/lib/async-retry.test.mjs +0 -57
  106. package/dist/signals/lib/audio.d.mts +0 -21
  107. package/dist/signals/lib/audio.mjs +0 -35
  108. package/dist/signals/lib/audio.test.mjs +0 -57
  109. package/dist/signals/lib/battery.d.mts +0 -17
  110. package/dist/signals/lib/battery.mjs +0 -45
  111. package/dist/signals/lib/battery.test.mjs +0 -38
  112. package/dist/signals/lib/before-unload.d.mts +0 -11
  113. package/dist/signals/lib/before-unload.mjs +0 -20
  114. package/dist/signals/lib/before-unload.test.mjs +0 -29
  115. package/dist/signals/lib/clipboard.d.mts +0 -15
  116. package/dist/signals/lib/clipboard.mjs +0 -25
  117. package/dist/signals/lib/clipboard.test.mjs +0 -53
  118. package/dist/signals/lib/counter.d.mts +0 -18
  119. package/dist/signals/lib/counter.mjs +0 -21
  120. package/dist/signals/lib/counter.test.d.mts +0 -1
  121. package/dist/signals/lib/counter.test.mjs +0 -74
  122. package/dist/signals/lib/document-title.d.mts +0 -10
  123. package/dist/signals/lib/document-title.mjs +0 -15
  124. package/dist/signals/lib/document-title.test.d.mts +0 -1
  125. package/dist/signals/lib/document-title.test.mjs +0 -33
  126. package/dist/signals/lib/element-size.d.mts +0 -16
  127. package/dist/signals/lib/element-size.mjs +0 -32
  128. package/dist/signals/lib/element-size.test.d.mts +0 -1
  129. package/dist/signals/lib/element-size.test.mjs +0 -86
  130. package/dist/signals/lib/event-listener.d.mts +0 -14
  131. package/dist/signals/lib/favicon.d.mts +0 -10
  132. package/dist/signals/lib/favicon.mjs +0 -24
  133. package/dist/signals/lib/favicon.test.d.mts +0 -1
  134. package/dist/signals/lib/favicon.test.mjs +0 -28
  135. package/dist/signals/lib/finite-state-machine.d.mts +0 -22
  136. package/dist/signals/lib/finite-state-machine.mjs +0 -26
  137. package/dist/signals/lib/finite-state-machine.test.d.mts +0 -1
  138. package/dist/signals/lib/finite-state-machine.test.mjs +0 -66
  139. package/dist/signals/lib/fullscreen.d.mts +0 -15
  140. package/dist/signals/lib/fullscreen.mjs +0 -24
  141. package/dist/signals/lib/fullscreen.test.d.mts +0 -1
  142. package/dist/signals/lib/fullscreen.test.mjs +0 -48
  143. package/dist/signals/lib/geolocation.d.mts +0 -15
  144. package/dist/signals/lib/geolocation.mjs +0 -30
  145. package/dist/signals/lib/geolocation.test.d.mts +0 -1
  146. package/dist/signals/lib/geolocation.test.mjs +0 -37
  147. package/dist/signals/lib/hash.d.mts +0 -10
  148. package/dist/signals/lib/hash.mjs +0 -14
  149. package/dist/signals/lib/hash.test.d.mts +0 -1
  150. package/dist/signals/lib/hash.test.mjs +0 -46
  151. package/dist/signals/lib/hover.d.mts +0 -11
  152. package/dist/signals/lib/hover.mjs +0 -23
  153. package/dist/signals/lib/intersection-observer.d.mts +0 -8
  154. package/dist/signals/lib/is-document-visible.d.mts +0 -11
  155. package/dist/signals/lib/is-document-visible.mjs +0 -13
  156. package/dist/signals/lib/is-document-visible.test.d.mts +0 -1
  157. package/dist/signals/lib/is-document-visible.test.mjs +0 -58
  158. package/dist/signals/lib/is-focus-within.d.mts +0 -10
  159. package/dist/signals/lib/is-focus-within.mjs +0 -28
  160. package/dist/signals/lib/is-focus-within.test.d.mts +0 -1
  161. package/dist/signals/lib/is-idle.d.mts +0 -10
  162. package/dist/signals/lib/is-idle.mjs +0 -37
  163. package/dist/signals/lib/is-idle.test.d.mts +0 -1
  164. package/dist/signals/lib/is-idle.test.mjs +0 -50
  165. package/dist/signals/lib/is-in-viewport.d.mts +0 -10
  166. package/dist/signals/lib/is-in-viewport.mjs +0 -16
  167. package/dist/signals/lib/is-in-viewport.test.d.mts +0 -1
  168. package/dist/signals/lib/is-in-viewport.test.mjs +0 -74
  169. package/dist/signals/lib/key-press.d.mts +0 -13
  170. package/dist/signals/lib/key-press.mjs +0 -25
  171. package/dist/signals/lib/key-press.test.d.mts +0 -1
  172. package/dist/signals/lib/key-press.test.mjs +0 -52
  173. package/dist/signals/lib/list.d.mts +0 -19
  174. package/dist/signals/lib/list.mjs +0 -36
  175. package/dist/signals/lib/list.test.d.mts +0 -1
  176. package/dist/signals/lib/list.test.mjs +0 -104
  177. package/dist/signals/lib/lock-body-scroll.d.mts +0 -8
  178. package/dist/signals/lib/lock-body-scroll.mjs +0 -17
  179. package/dist/signals/lib/lock-body-scroll.test.d.mts +0 -1
  180. package/dist/signals/lib/lock-body-scroll.test.mjs +0 -37
  181. package/dist/signals/lib/long-press.d.mts +0 -10
  182. package/dist/signals/lib/long-press.mjs +0 -29
  183. package/dist/signals/lib/map.d.mts +0 -18
  184. package/dist/signals/lib/map.mjs +0 -33
  185. package/dist/signals/lib/map.test.d.mts +0 -1
  186. package/dist/signals/lib/map.test.mjs +0 -60
  187. package/dist/signals/lib/motion.d.mts +0 -15
  188. package/dist/signals/lib/motion.mjs +0 -27
  189. package/dist/signals/lib/motion.test.d.mts +0 -1
  190. package/dist/signals/lib/motion.test.mjs +0 -51
  191. package/dist/signals/lib/mouse-position.d.mts +0 -14
  192. package/dist/signals/lib/mouse-position.mjs +0 -22
  193. package/dist/signals/lib/mouse-position.test.d.mts +0 -1
  194. package/dist/signals/lib/mouse-position.test.mjs +0 -44
  195. package/dist/signals/lib/mouse-wheel.d.mts +0 -10
  196. package/dist/signals/lib/mouse-wheel.mjs +0 -17
  197. package/dist/signals/lib/mouse-wheel.test.d.mts +0 -1
  198. package/dist/signals/lib/mouse-wheel.test.mjs +0 -38
  199. package/dist/signals/lib/mutation-observer.d.mts +0 -8
  200. package/dist/signals/lib/network-state.d.mts +0 -17
  201. package/dist/signals/lib/network-state.mjs +0 -34
  202. package/dist/signals/lib/network-state.test.d.mts +0 -1
  203. package/dist/signals/lib/network-state.test.mjs +0 -61
  204. package/dist/signals/lib/on-click-outside.mjs +0 -20
  205. package/dist/signals/lib/orientation.d.mts +0 -13
  206. package/dist/signals/lib/orientation.test.d.mts +0 -1
  207. package/dist/signals/lib/orientation.test.mjs +0 -43
  208. package/dist/signals/lib/page-leave.d.mts +0 -8
  209. package/dist/signals/lib/page-leave.mjs +0 -12
  210. package/dist/signals/lib/page-leave.test.d.mts +0 -1
  211. package/dist/signals/lib/page-leave.test.mjs +0 -29
  212. package/dist/signals/lib/permission.d.mts +0 -14
  213. package/dist/signals/lib/permission.mjs +0 -26
  214. package/dist/signals/lib/permission.test.d.mts +0 -1
  215. package/dist/signals/lib/permission.test.mjs +0 -50
  216. package/dist/signals/lib/persisted-state.d.mts +0 -11
  217. package/dist/signals/lib/persisted-state.mjs +0 -25
  218. package/dist/signals/lib/persisted-state.test.d.mts +0 -1
  219. package/dist/signals/lib/persisted-state.test.mjs +0 -70
  220. package/dist/signals/lib/pressed-keys.d.mts +0 -10
  221. package/dist/signals/lib/pressed-keys.mjs +0 -32
  222. package/dist/signals/lib/pressed-keys.test.d.mts +0 -1
  223. package/dist/signals/lib/pressed-keys.test.mjs +0 -54
  224. package/dist/signals/lib/previous-distinct.d.mts +0 -10
  225. package/dist/signals/lib/previous-distinct.mjs +0 -22
  226. package/dist/signals/lib/previous-distinct.test.d.mts +0 -1
  227. package/dist/signals/lib/previous-distinct.test.mjs +0 -50
  228. package/dist/signals/lib/previous.d.mts +0 -10
  229. package/dist/signals/lib/previous.mjs +0 -18
  230. package/dist/signals/lib/previous.test.mjs +0 -47
  231. package/dist/signals/lib/queue.d.mts +0 -17
  232. package/dist/signals/lib/queue.mjs +0 -28
  233. package/dist/signals/lib/queue.test.d.mts +0 -1
  234. package/dist/signals/lib/queue.test.mjs +0 -61
  235. package/dist/signals/lib/raf.d.mts +0 -17
  236. package/dist/signals/lib/raf.mjs +0 -38
  237. package/dist/signals/lib/raf.test.d.mts +0 -1
  238. package/dist/signals/lib/raf.test.mjs +0 -58
  239. package/dist/signals/lib/resize-observer.d.mts +0 -8
  240. package/dist/signals/lib/resize-observer.test.d.mts +0 -1
  241. package/dist/signals/lib/resize-observer.test.mjs +0 -44
  242. package/dist/signals/lib/resource.d.mts +0 -23
  243. package/dist/signals/lib/resource.mjs +0 -43
  244. package/dist/signals/lib/resource.test.d.mts +0 -1
  245. package/dist/signals/lib/resource.test.mjs +0 -56
  246. package/dist/signals/lib/scroll-state.d.mts +0 -19
  247. package/dist/signals/lib/scroll-state.mjs +0 -46
  248. package/dist/signals/lib/scroll-state.test.d.mts +0 -1
  249. package/dist/signals/lib/scroll-state.test.mjs +0 -94
  250. package/dist/signals/lib/scrolling.d.mts +0 -12
  251. package/dist/signals/lib/scrolling.mjs +0 -26
  252. package/dist/signals/lib/scrolling.test.d.mts +0 -1
  253. package/dist/signals/lib/scrolling.test.mjs +0 -57
  254. package/dist/signals/lib/search-params.d.mts +0 -16
  255. package/dist/signals/lib/search-params.mjs +0 -37
  256. package/dist/signals/lib/search-params.test.mjs +0 -56
  257. package/dist/signals/lib/set.d.mts +0 -18
  258. package/dist/signals/lib/set.mjs +0 -38
  259. package/dist/signals/lib/set.test.d.mts +0 -1
  260. package/dist/signals/lib/set.test.mjs +0 -70
  261. package/dist/signals/lib/start-typing.d.mts +0 -9
  262. package/dist/signals/lib/start-typing.mjs +0 -39
  263. package/dist/signals/lib/start-typing.test.d.mts +0 -1
  264. package/dist/signals/lib/start-typing.test.mjs +0 -64
  265. package/dist/signals/lib/state-history.d.mts +0 -21
  266. package/dist/signals/lib/state-history.mjs +0 -61
  267. package/dist/signals/lib/state-history.test.d.mts +0 -1
  268. package/dist/signals/lib/state-history.test.mjs +0 -106
  269. package/dist/signals/lib/state-validator.d.mts +0 -16
  270. package/dist/signals/lib/state-validator.mjs +0 -21
  271. package/dist/signals/lib/state-validator.test.d.mts +0 -1
  272. package/dist/signals/lib/state-validator.test.mjs +0 -41
  273. package/dist/signals/lib/throttled.mjs +0 -45
  274. package/dist/signals/lib/timeout.mjs +0 -39
  275. package/dist/signals/lib/toggle.d.mts +0 -12
  276. package/dist/signals/lib/toggle.mjs +0 -12
  277. package/dist/signals/lib/toggle.test.d.mts +0 -1
  278. package/dist/signals/lib/toggle.test.mjs +0 -43
  279. package/dist/signals/lib/video.d.mts +0 -21
  280. package/dist/signals/lib/video.test.d.mts +0 -1
  281. package/dist/signals/lib/video.test.mjs +0 -51
  282. package/dist/signals/lib/watch.d.mts +0 -16
  283. package/dist/signals/lib/watch.mjs +0 -31
  284. package/dist/signals/lib/watch.test.d.mts +0 -1
  285. package/dist/signals/lib/watch.test.mjs +0 -51
  286. package/dist/signals/lib/window-size.d.mts +0 -14
  287. package/dist/signals/lib/window-size.mjs +0 -21
  288. package/dist/signals/lib/window-size.test.mjs +0 -50
  289. /package/dist/{signals/lib → utilities}/active-element.test.d.mts +0 -0
  290. /package/dist/{signals/lib → utilities}/debounced.test.d.mts +0 -0
  291. /package/dist/{signals/lib → utilities}/element-rect.test.d.mts +0 -0
  292. /package/dist/{signals/lib/animation-frames.test.d.mts → utilities/element-scroll.test.d.mts} +0 -0
  293. /package/dist/{signals/lib → utilities}/event-listener.test.d.mts +0 -0
  294. /package/dist/{signals/lib/async-retry.test.d.mts → utilities/focus-within.test.d.mts} +0 -0
  295. /package/dist/{signals/lib → utilities}/hover.test.d.mts +0 -0
  296. /package/dist/{signals/lib → utilities}/intersection-observer.test.d.mts +0 -0
  297. /package/dist/{signals/lib → utilities}/interval.test.d.mts +0 -0
  298. /package/dist/{signals/lib/audio.test.d.mts → utilities/location.test.d.mts} +0 -0
  299. /package/dist/{signals/lib → utilities}/long-press.test.d.mts +0 -0
  300. /package/dist/{signals/lib → utilities}/media-devices.test.d.mts +0 -0
  301. /package/dist/{signals/lib/battery.test.d.mts → utilities/media-player.test.d.mts} +0 -0
  302. /package/dist/{signals/lib → utilities}/mutation-observer.test.d.mts +0 -0
  303. /package/dist/{signals/lib → utilities}/on-click-outside.test.d.mts +0 -0
  304. /package/dist/{signals/lib → utilities}/previous.test.d.mts +0 -0
  305. /package/dist/{signals/lib/before-unload.test.d.mts → utilities/routing.test.d.mts} +0 -0
  306. /package/dist/{signals/lib → utilities}/search-params.test.d.mts +0 -0
  307. /package/dist/{signals/lib/clipboard.test.d.mts → utilities/storage.test.d.mts} +0 -0
  308. /package/dist/{signals/lib → utilities}/throttled.test.d.mts +0 -0
  309. /package/dist/{signals/lib → utilities}/timeout.test.d.mts +0 -0
  310. /package/dist/{signals/lib → utilities}/window-size.test.d.mts +0 -0
@@ -0,0 +1,22 @@
1
+ import { r as Signal, t as Computed } from "../index-Cvdhuy6Y.mjs";
2
+
3
+ //#region src/utilities/media-player.d.ts
4
+ type MediaPlayerResult<T extends HTMLMediaElement> = {
5
+ element: T;
6
+ playing: Computed<boolean>;
7
+ muted: Signal<boolean>;
8
+ volume: Signal<number>;
9
+ duration: Computed<number>;
10
+ time: Signal<number>;
11
+ ended: Computed<boolean>;
12
+ play(): void;
13
+ pause(): void;
14
+ toggle(): void;
15
+ } & Disposable;
16
+ /**
17
+ * Wraps an `HTMLMediaElement` (`<audio>` or `<video>`) with reactive state
18
+ * and playback controls.
19
+ */
20
+ declare function createMediaPlayer<T extends HTMLMediaElement>(element: T): MediaPlayerResult<T>;
21
+ //#endregion
22
+ export { createMediaPlayer };
@@ -1,9 +1,10 @@
1
1
  import { fromEvent, sync } from "./event-driven.mjs";
2
- //#region src/signals/lib/video.ts
2
+ //#region src/utilities/media-player.ts
3
3
  /**
4
- * Wraps an `HTMLVideoElement` with reactive state and playback controls.
4
+ * Wraps an `HTMLMediaElement` (`<audio>` or `<video>`) with reactive state
5
+ * and playback controls.
5
6
  */
6
- function createVideo(element) {
7
+ function createMediaPlayer(element) {
7
8
  const el = element;
8
9
  const [playing] = sync(fromEvent(el, ["play", "pause"]), () => !el.paused);
9
10
  const [muted] = sync(fromEvent(el, "volumechange"), () => el.muted, (v) => {
@@ -32,4 +33,4 @@ function createVideo(element) {
32
33
  };
33
34
  }
34
35
  //#endregion
35
- export { createVideo };
36
+ export { createMediaPlayer };
@@ -0,0 +1,100 @@
1
+ import { s as effectScope } from "../signals-DcgXhkU2.mjs";
2
+ import { n as vi, o as describe, r as afterEach, s as it, t as globalExpect } from "../test.BmQO5GaM-ANkhHvbr.mjs";
3
+ import { createMediaPlayer } from "./media-player.mjs";
4
+ //#region src/utilities/media-player.test.ts
5
+ afterEach(() => {
6
+ document.body.innerHTML = "";
7
+ vi.restoreAllMocks();
8
+ });
9
+ describe("createMediaPlayer", () => {
10
+ describe("with <audio>", () => {
11
+ it("accepts an HTMLAudioElement", () => {
12
+ const el = new Audio();
13
+ let a;
14
+ effectScope(() => {
15
+ a = createMediaPlayer(el);
16
+ });
17
+ globalExpect(a.element).toBe(el);
18
+ });
19
+ it("starts as paused", () => {
20
+ let a;
21
+ effectScope(() => {
22
+ a = createMediaPlayer(new Audio());
23
+ });
24
+ globalExpect(a.playing()).toBe(false);
25
+ });
26
+ it("muted(true) sets muted to true", () => {
27
+ let a;
28
+ effectScope(() => {
29
+ a = createMediaPlayer(new Audio());
30
+ });
31
+ a.muted(true);
32
+ globalExpect(a.element.muted).toBe(true);
33
+ });
34
+ it("volume() clamps to [0, 1]", () => {
35
+ let a;
36
+ effectScope(() => {
37
+ a = createMediaPlayer(new Audio());
38
+ });
39
+ a.volume(2);
40
+ globalExpect(a.element.volume).toBe(1);
41
+ a.volume(-1);
42
+ globalExpect(a.element.volume).toBe(0);
43
+ });
44
+ it("removes event listeners when scope is disposed", () => {
45
+ const removeSpy = vi.fn();
46
+ const el = new Audio();
47
+ let dispose;
48
+ let a;
49
+ dispose = effectScope(() => {
50
+ a = createMediaPlayer(el);
51
+ });
52
+ vi.spyOn(a.element, "removeEventListener").mockImplementation(removeSpy);
53
+ dispose();
54
+ globalExpect(removeSpy).toHaveBeenCalled();
55
+ });
56
+ });
57
+ describe("with <video>", () => {
58
+ it("accepts an HTMLVideoElement", () => {
59
+ const el = document.createElement("video");
60
+ document.body.appendChild(el);
61
+ let v;
62
+ effectScope(() => {
63
+ v = createMediaPlayer(el);
64
+ });
65
+ globalExpect(v.element).toBe(el);
66
+ });
67
+ it("starts as paused", () => {
68
+ const el = document.createElement("video");
69
+ document.body.appendChild(el);
70
+ let v;
71
+ effectScope(() => {
72
+ v = createMediaPlayer(el);
73
+ });
74
+ globalExpect(v.playing()).toBe(false);
75
+ });
76
+ it("time(v) updates currentTime", () => {
77
+ const el = document.createElement("video");
78
+ document.body.appendChild(el);
79
+ let v;
80
+ effectScope(() => {
81
+ v = createMediaPlayer(el);
82
+ });
83
+ v.time(30);
84
+ globalExpect(el.currentTime).toBe(30);
85
+ });
86
+ it("removes event listeners when scope is disposed", () => {
87
+ const el = document.createElement("video");
88
+ document.body.appendChild(el);
89
+ let dispose;
90
+ dispose = effectScope(() => {
91
+ createMediaPlayer(el);
92
+ });
93
+ const removeSpy = vi.spyOn(el, "removeEventListener");
94
+ dispose();
95
+ globalExpect(removeSpy).toHaveBeenCalled();
96
+ });
97
+ });
98
+ });
99
+ //#endregion
100
+ export {};
@@ -1,6 +1,6 @@
1
- import { t as Computed } from "../../index-BtqiEEfc.mjs";
1
+ import { t as Computed } from "../index-Cvdhuy6Y.mjs";
2
2
 
3
- //#region src/signals/lib/media.d.ts
3
+ //#region src/utilities/media-query.d.ts
4
4
  declare const isBrowser: boolean;
5
5
  /**
6
6
  * Creates a signal that tracks a CSS media query.
@@ -9,6 +9,6 @@ declare const isBrowser: boolean;
9
9
  * @param defaultState The default value (for SSR/hydration)
10
10
  * @returns Computed<boolean> that is true if the query matches
11
11
  */
12
- declare function createMediaSignal(query: string, defaultState?: boolean): Computed<boolean>;
12
+ declare function createMediaQuery(query: string, defaultState?: boolean): Computed<boolean>;
13
13
  //#endregion
14
- export { createMediaSignal, isBrowser };
14
+ export { createMediaQuery, isBrowser };
@@ -1,6 +1,6 @@
1
- import { f as signal } from "../../signals-CLAPw8kk.mjs";
1
+ import { p as signal } from "../signals-DcgXhkU2.mjs";
2
2
  import { fromEvent, sync } from "./event-driven.mjs";
3
- //#region src/signals/lib/media.ts
3
+ //#region src/utilities/media-query.ts
4
4
  const isBrowser = typeof window !== "undefined";
5
5
  /**
6
6
  * Creates a signal that tracks a CSS media query.
@@ -9,11 +9,11 @@ const isBrowser = typeof window !== "undefined";
9
9
  * @param defaultState The default value (for SSR/hydration)
10
10
  * @returns Computed<boolean> that is true if the query matches
11
11
  */
12
- function createMediaSignal(query, defaultState) {
12
+ function createMediaQuery(query, defaultState) {
13
13
  if (!isBrowser) return signal(defaultState ?? false);
14
14
  const mql = window.matchMedia(query);
15
- const [state, cleanup] = sync(fromEvent(mql, "change"), () => mql.matches);
16
- return Object.assign(state, { [Symbol.dispose]: cleanup });
15
+ const [state] = sync(fromEvent(mql, "change"), () => mql.matches);
16
+ return state;
17
17
  }
18
18
  //#endregion
19
- export { createMediaSignal, isBrowser };
19
+ export { createMediaQuery, isBrowser };
@@ -0,0 +1,8 @@
1
+ //#region src/utilities/mutation-observer.d.ts
2
+ /**
3
+ * Watches `target` for DOM mutations and calls `callback` with each batch of
4
+ * `MutationRecord`s.
5
+ */
6
+ declare function createMutationObserver(target: Element, options: MutationObserverInit, callback: (records: MutationRecord[]) => void): Disposable;
7
+ //#endregion
8
+ export { createMutationObserver };
@@ -1,12 +1,12 @@
1
- import { d as onCleanup } from "../../signals-CLAPw8kk.mjs";
2
- //#region src/signals/lib/mutation-observer.ts
1
+ import { f as onCleanup } from "../signals-DcgXhkU2.mjs";
2
+ //#region src/utilities/mutation-observer.ts
3
3
  /**
4
4
  * Watches `target` for DOM mutations and calls `callback` with each batch of
5
5
  * `MutationRecord`s.
6
6
  */
7
7
  function createMutationObserver(target, options, callback) {
8
8
  const observer = new MutationObserver((records) => callback(records));
9
- const el = typeof target === "function" ? target() : target;
9
+ const el = target;
10
10
  if (el) observer.observe(el, options);
11
11
  const cleanup = () => observer.disconnect();
12
12
  onCleanup(cleanup);
@@ -1,7 +1,7 @@
1
- import { o as effectScope } from "../../signals-CLAPw8kk.mjs";
2
- import { a as describe, n as vi, o as it, r as afterEach, t as globalExpect } from "../../test.BmQO5GaM-CR2qjV1t.mjs";
1
+ import { s as effectScope } from "../signals-DcgXhkU2.mjs";
2
+ import { n as vi, o as describe, r as afterEach, s as it, t as globalExpect } from "../test.BmQO5GaM-ANkhHvbr.mjs";
3
3
  import { createMutationObserver } from "./mutation-observer.mjs";
4
- //#region src/signals/lib/mutation-observer.test.ts
4
+ //#region src/utilities/mutation-observer.test.ts
5
5
  afterEach(() => {
6
6
  document.body.innerHTML = "";
7
7
  vi.unstubAllGlobals();
@@ -1,4 +1,4 @@
1
- //#region src/signals/lib/on-click-outside.d.ts
1
+ //#region src/utilities/on-click-outside.d.ts
2
2
  /**
3
3
  * Fires `handler` whenever a pointer-down event occurs outside `target`.
4
4
  *
@@ -6,6 +6,6 @@
6
6
  * touch input. Cleanup is registered automatically when called inside an
7
7
  * effect or scope.
8
8
  */
9
- declare function createOnClickOutside(target: Element | (() => Element | null), handler: (e: PointerEvent) => void): void;
9
+ declare function onClickOutside(target: Element, handler: (e: PointerEvent) => void): () => void;
10
10
  //#endregion
11
- export { createOnClickOutside };
11
+ export { onClickOutside };
@@ -0,0 +1,17 @@
1
+ import { on } from "./event-listener.mjs";
2
+ //#region src/utilities/on-click-outside.ts
3
+ /**
4
+ * Fires `handler` whenever a pointer-down event occurs outside `target`.
5
+ *
6
+ * Built on a `document` `pointerdown` listener so it works for both mouse and
7
+ * touch input. Cleanup is registered automatically when called inside an
8
+ * effect or scope.
9
+ */
10
+ function onClickOutside(target, handler) {
11
+ const listener = (e) => {
12
+ if (!target.contains(e.target)) handler(e);
13
+ };
14
+ return on(document, "pointerdown", listener);
15
+ }
16
+ //#endregion
17
+ export { onClickOutside };
@@ -1,7 +1,7 @@
1
- import { o as effectScope } from "../../signals-CLAPw8kk.mjs";
2
- import { a as describe, n as vi, o as it, r as afterEach, t as globalExpect } from "../../test.BmQO5GaM-CR2qjV1t.mjs";
3
- import { createOnClickOutside } from "./on-click-outside.mjs";
4
- //#region src/signals/lib/on-click-outside.test.ts
1
+ import { s as effectScope } from "../signals-DcgXhkU2.mjs";
2
+ import { n as vi, o as describe, r as afterEach, s as it, t as globalExpect } from "../test.BmQO5GaM-ANkhHvbr.mjs";
3
+ import { onClickOutside } from "./on-click-outside.mjs";
4
+ //#region src/utilities/on-click-outside.test.ts
5
5
  afterEach(() => {
6
6
  document.body.innerHTML = "";
7
7
  });
@@ -12,7 +12,7 @@ describe("createOnClickOutside", () => {
12
12
  document.body.append(inside, outside);
13
13
  const handler = vi.fn();
14
14
  effectScope(() => {
15
- createOnClickOutside(inside, handler);
15
+ onClickOutside(inside, handler);
16
16
  });
17
17
  outside.dispatchEvent(new PointerEvent("pointerdown", { bubbles: true }));
18
18
  globalExpect(handler).toHaveBeenCalledOnce();
@@ -22,7 +22,7 @@ describe("createOnClickOutside", () => {
22
22
  document.body.appendChild(el);
23
23
  const handler = vi.fn();
24
24
  effectScope(() => {
25
- createOnClickOutside(el, handler);
25
+ onClickOutside(el, handler);
26
26
  });
27
27
  el.dispatchEvent(new PointerEvent("pointerdown", { bubbles: true }));
28
28
  globalExpect(handler).not.toHaveBeenCalled();
@@ -33,22 +33,11 @@ describe("createOnClickOutside", () => {
33
33
  document.body.append(inside, outside);
34
34
  const handler = vi.fn();
35
35
  effectScope(() => {
36
- createOnClickOutside(inside, handler);
36
+ onClickOutside(inside, handler);
37
37
  })();
38
38
  outside.dispatchEvent(new PointerEvent("pointerdown", { bubbles: true }));
39
39
  globalExpect(handler).not.toHaveBeenCalled();
40
40
  });
41
- it("works with a reactive target getter", () => {
42
- const el = document.createElement("div");
43
- const outside = document.createElement("span");
44
- document.body.append(el, outside);
45
- const handler = vi.fn();
46
- effectScope(() => {
47
- createOnClickOutside(() => el, handler);
48
- });
49
- outside.dispatchEvent(new PointerEvent("pointerdown", { bubbles: true }));
50
- globalExpect(handler).toHaveBeenCalledOnce();
51
- });
52
41
  });
53
42
  //#endregion
54
43
  export {};
@@ -0,0 +1,10 @@
1
+ import { t as Computed } from "../index-Cvdhuy6Y.mjs";
2
+
3
+ //#region src/utilities/orientation.d.ts
4
+ type OrientationResult = {
5
+ angle: Computed<number>;
6
+ type: Computed<OrientationType>;
7
+ } & Disposable;
8
+ declare const orientation: OrientationResult;
9
+ //#endregion
10
+ export { orientation };
@@ -1,5 +1,5 @@
1
1
  import { fromEvent, sync } from "./event-driven.mjs";
2
- //#region src/signals/lib/orientation.ts
2
+ //#region src/utilities/orientation.ts
3
3
  /**
4
4
  * Returns reactive signals for the screen orientation.
5
5
  */
@@ -16,5 +16,6 @@ function createOrientation() {
16
16
  }
17
17
  };
18
18
  }
19
+ const orientation = createOrientation();
19
20
  //#endregion
20
- export { createOrientation };
21
+ export { orientation };
@@ -0,0 +1,12 @@
1
+ import { t as Computed } from "../index-Cvdhuy6Y.mjs";
2
+
3
+ //#region src/utilities/previous.d.ts
4
+ /**
5
+ * Returns a `Computed` that always holds the *previous* value of `source`.
6
+ * Starts as `undefined` until the source changes for the first time.
7
+ *
8
+ * When `ignore` is provided, the previous value only updates when the ignore check fails.
9
+ */
10
+ declare function createPrevious<T>(source: Computed<T>, ignore?: (a: T, b: T) => boolean): Computed<T | undefined>;
11
+ //#endregion
12
+ export { createPrevious };
@@ -0,0 +1,24 @@
1
+ import { o as effect, p as signal } from "../signals-DcgXhkU2.mjs";
2
+ //#region src/utilities/previous.ts
3
+ /**
4
+ * Returns a `Computed` that always holds the *previous* value of `source`.
5
+ * Starts as `undefined` until the source changes for the first time.
6
+ *
7
+ * When `ignore` is provided, the previous value only updates when the ignore check fails.
8
+ */
9
+ function createPrevious(source, ignore) {
10
+ const prev = signal(void 0);
11
+ let current;
12
+ let initialized = false;
13
+ effect(() => {
14
+ const next = source();
15
+ if (!initialized || !ignore || !ignore(next, current)) {
16
+ prev(current);
17
+ current = next;
18
+ initialized = true;
19
+ }
20
+ });
21
+ return prev;
22
+ }
23
+ //#endregion
24
+ export { createPrevious };
@@ -0,0 +1,88 @@
1
+ import { p as signal, s as effectScope } from "../signals-DcgXhkU2.mjs";
2
+ import { o as describe, s as it, t as globalExpect } from "../test.BmQO5GaM-ANkhHvbr.mjs";
3
+ import { createPrevious } from "./previous.mjs";
4
+ //#region src/utilities/previous.test.ts
5
+ describe("createPrevious", () => {
6
+ it("starts as undefined", () => {
7
+ const s = signal(1);
8
+ let p;
9
+ effectScope(() => {
10
+ p = createPrevious(s);
11
+ });
12
+ globalExpect(p()).toBeUndefined();
13
+ });
14
+ it("returns the previous value after a change", () => {
15
+ const s = signal(1);
16
+ let p;
17
+ effectScope(() => {
18
+ p = createPrevious(s);
19
+ });
20
+ s(2);
21
+ globalExpect(p()).toBe(1);
22
+ });
23
+ it("tracks each successive previous value", () => {
24
+ const s = signal("a");
25
+ let p;
26
+ effectScope(() => {
27
+ p = createPrevious(s);
28
+ });
29
+ s("b");
30
+ globalExpect(p()).toBe("a");
31
+ s("c");
32
+ globalExpect(p()).toBe("b");
33
+ });
34
+ it("does not update after scope disposal", () => {
35
+ const s = signal(10);
36
+ let p;
37
+ const stop = effectScope(() => {
38
+ p = createPrevious(s);
39
+ });
40
+ s(20);
41
+ stop();
42
+ s(30);
43
+ globalExpect(p()).toBe(10);
44
+ });
45
+ });
46
+ describe("createPrevious with isEqual (distinct mode)", () => {
47
+ it("starts as undefined", () => {
48
+ const s = signal(0);
49
+ let prev;
50
+ effectScope(() => {
51
+ prev = createPrevious(s, Object.is);
52
+ });
53
+ globalExpect(prev()).toBeUndefined();
54
+ });
55
+ it("updates previous when value changes", () => {
56
+ const s = signal(0);
57
+ let prev;
58
+ effectScope(() => {
59
+ prev = createPrevious(s, Object.is);
60
+ });
61
+ s(1);
62
+ globalExpect(prev()).toBe(0);
63
+ });
64
+ it("does not update previous when value is the same", () => {
65
+ const s = signal(0);
66
+ let prev;
67
+ effectScope(() => {
68
+ prev = createPrevious(s, Object.is);
69
+ });
70
+ s(1);
71
+ globalExpect(prev()).toBe(0);
72
+ s(1);
73
+ globalExpect(prev()).toBe(0);
74
+ });
75
+ it("uses a custom equality function", () => {
76
+ const s = signal({ id: 1 });
77
+ let prev;
78
+ effectScope(() => {
79
+ prev = createPrevious(s, (a, b) => a.id === b.id);
80
+ });
81
+ s({ id: 1 });
82
+ globalExpect(prev()).toBeUndefined();
83
+ s({ id: 2 });
84
+ globalExpect(prev()?.id).toBe(1);
85
+ });
86
+ });
87
+ //#endregion
88
+ export {};
@@ -0,0 +1,8 @@
1
+ //#region src/utilities/resize-observer.d.ts
2
+ /**
3
+ * Raw `ResizeObserver` wrapper with automatic cleanup.
4
+ * Use `createElementRect` for the common case.
5
+ */
6
+ declare function createResizeObserver(target: Element, callback: ResizeObserverCallback): Disposable;
7
+ //#endregion
8
+ export { createResizeObserver };
@@ -1,13 +1,12 @@
1
- import { d as onCleanup } from "../../signals-CLAPw8kk.mjs";
2
- //#region src/signals/lib/resize-observer.ts
1
+ import { f as onCleanup } from "../signals-DcgXhkU2.mjs";
2
+ //#region src/utilities/resize-observer.ts
3
3
  /**
4
4
  * Raw `ResizeObserver` wrapper with automatic cleanup.
5
- * Use `createElementSize` / `createElementRect` for the common cases.
5
+ * Use `createElementRect` for the common case.
6
6
  */
7
7
  function createResizeObserver(target, callback) {
8
8
  const observer = new ResizeObserver(callback);
9
- const el = typeof target === "function" ? target() : target;
10
- if (el) observer.observe(el);
9
+ if (target) observer.observe(target);
11
10
  const cleanup = () => observer.disconnect();
12
11
  onCleanup(cleanup);
13
12
  return { [Symbol.dispose]: cleanup };
@@ -0,0 +1,59 @@
1
+ import { t as Computed } from "../index-Cvdhuy6Y.mjs";
2
+
3
+ //#region src/utilities/routing.d.ts
4
+ declare function patchHistory(): void;
5
+ type NavigateOptions = {
6
+ replace?: boolean;
7
+ state?: unknown;
8
+ };
9
+ /**
10
+ * Navigates to `url` via `history.pushState` (or `replaceState` when
11
+ * `replace` is `true`).
12
+ *
13
+ * `history.pushState` / `replaceState` are patched once at module load so
14
+ * all navigation — including third-party router calls — dispatches the
15
+ * `pushstate` / `replacestate` events that `currentLocation` signals react to.
16
+ */
17
+ declare function navigate(url: string | URL, {
18
+ replace,
19
+ state
20
+ }?: NavigateOptions): void;
21
+ /**
22
+ * Returns `true` when a click event on an `<a>` element should be handled
23
+ * client-side — same origin, primary button, no modifier keys, no download,
24
+ * no `_blank` target. Walks up to the nearest anchor via `closest("a")`.
25
+ *
26
+ * Use alongside `navigate()` to intercept anchor clicks:
27
+ *
28
+ * ```ts
29
+ * el.addEventListener("click", (e) => {
30
+ * if (isLocalNavigationEvent(e)) { e.preventDefault(); navigate(el.href); }
31
+ * });
32
+ * ```
33
+ */
34
+ declare function isLocalNavigationEvent(e: MouseEvent): boolean;
35
+ /**
36
+ * Returns `Computed<boolean>` — `true` when the current URL matches `input`.
37
+ * Uses `URLPattern.test()` — faster than `match` when you don't need
38
+ * captured groups.
39
+ *
40
+ * Use object form: `{ pathname: "/users/:id" }`. Relative string patterns
41
+ * require a base URL and will throw.
42
+ *
43
+ * Requires `urlpattern-polyfill` for Safari < 26 and Firefox < 142.
44
+ */
45
+ declare function matches(input: URLPatternInput, options?: URLPatternOptions): Computed<boolean>;
46
+ /**
47
+ * Returns `Computed<URLPatternResult | null>` — the full match result when
48
+ * the current URL matches `input`, `null` when it does not.
49
+ * Use when you need captured groups (params). For a boolean gate,
50
+ * prefer `matches()` which is faster.
51
+ *
52
+ * Use object form: `{ pathname: "/users/:id" }`. Relative string patterns
53
+ * require a base URL and will throw.
54
+ *
55
+ * Requires `urlpattern-polyfill` for Safari < 26 and Firefox < 142.
56
+ */
57
+ declare function match(input: URLPatternInput, options?: URLPatternOptions): Computed<URLPatternResult | null>;
58
+ //#endregion
59
+ export { isLocalNavigationEvent, match, matches, navigate, patchHistory };
@@ -0,0 +1,89 @@
1
+ import { a as computed } from "../signals-DcgXhkU2.mjs";
2
+ import { currentLocation } from "./location.mjs";
3
+ //#region src/utilities/routing.ts
4
+ const patchHistoryMethod = (method) => {
5
+ const original = history[method];
6
+ history[method] = function(data, unused, url) {
7
+ const result = original.apply(this, [
8
+ data,
9
+ unused,
10
+ url
11
+ ]);
12
+ const event = new Event(method.toLowerCase());
13
+ event.state = data;
14
+ window.dispatchEvent(event);
15
+ return result;
16
+ };
17
+ };
18
+ function patchHistory() {
19
+ if (typeof window !== "undefined" && typeof history !== "undefined") {
20
+ patchHistoryMethod("pushState");
21
+ patchHistoryMethod("replaceState");
22
+ }
23
+ }
24
+ /**
25
+ * Navigates to `url` via `history.pushState` (or `replaceState` when
26
+ * `replace` is `true`).
27
+ *
28
+ * `history.pushState` / `replaceState` are patched once at module load so
29
+ * all navigation — including third-party router calls — dispatches the
30
+ * `pushstate` / `replacestate` events that `currentLocation` signals react to.
31
+ */
32
+ function navigate(url, { replace = false, state = null } = {}) {
33
+ if (replace) history.replaceState(state, "", url);
34
+ else history.pushState(state, "", url);
35
+ }
36
+ /**
37
+ * Returns `true` when a click event on an `<a>` element should be handled
38
+ * client-side — same origin, primary button, no modifier keys, no download,
39
+ * no `_blank` target. Walks up to the nearest anchor via `closest("a")`.
40
+ *
41
+ * Use alongside `navigate()` to intercept anchor clicks:
42
+ *
43
+ * ```ts
44
+ * el.addEventListener("click", (e) => {
45
+ * if (isLocalNavigationEvent(e)) { e.preventDefault(); navigate(el.href); }
46
+ * });
47
+ * ```
48
+ */
49
+ function isLocalNavigationEvent(e) {
50
+ if (e.button !== 0) return false;
51
+ if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return false;
52
+ const el = e.currentTarget?.closest("a") ?? e.target?.closest("a");
53
+ if (!el) return false;
54
+ if (el.hasAttribute("download")) return false;
55
+ if (el.getAttribute("target") === "_blank") return false;
56
+ if (new URL(el.href, location.href).origin !== location.origin) return false;
57
+ return true;
58
+ }
59
+ /**
60
+ * Returns `Computed<boolean>` — `true` when the current URL matches `input`.
61
+ * Uses `URLPattern.test()` — faster than `match` when you don't need
62
+ * captured groups.
63
+ *
64
+ * Use object form: `{ pathname: "/users/:id" }`. Relative string patterns
65
+ * require a base URL and will throw.
66
+ *
67
+ * Requires `urlpattern-polyfill` for Safari < 26 and Firefox < 142.
68
+ */
69
+ function matches(input, options) {
70
+ const pattern = options ? new URLPattern(input, options) : new URLPattern(input);
71
+ return computed(() => pattern.test(currentLocation.href()));
72
+ }
73
+ /**
74
+ * Returns `Computed<URLPatternResult | null>` — the full match result when
75
+ * the current URL matches `input`, `null` when it does not.
76
+ * Use when you need captured groups (params). For a boolean gate,
77
+ * prefer `matches()` which is faster.
78
+ *
79
+ * Use object form: `{ pathname: "/users/:id" }`. Relative string patterns
80
+ * require a base URL and will throw.
81
+ *
82
+ * Requires `urlpattern-polyfill` for Safari < 26 and Firefox < 142.
83
+ */
84
+ function match(input, options) {
85
+ const pattern = options ? new URLPattern(input, options) : new URLPattern(input);
86
+ return computed(() => pattern.exec(currentLocation.href()));
87
+ }
88
+ //#endregion
89
+ export { isLocalNavigationEvent, match, matches, navigate, patchHistory };