elements-kit 0.0.10 → 0.0.12

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
package/README.md CHANGED
@@ -224,7 +224,7 @@ customElements.define("x-counter", CounterElement);
224
224
  Connect signals and stores to React components via `useSyncExternalStore`:
225
225
 
226
226
  ```tsx
227
- import { useSignal, useScope } from "elements-kit/signals/react";
227
+ import { useSignal, useScope } from "elements-kit/integrations/react";
228
228
  import { cart } from "./cart-store";
229
229
 
230
230
  function CartSummary() {
@@ -245,12 +245,12 @@ The same `cart` store drives custom elements, React trees, and plain scripts —
245
245
 
246
246
  ---
247
247
 
248
- ## Signal Helpers
248
+ ## Utilities
249
249
 
250
250
  Pre-built signal factories for common browser APIs:
251
251
 
252
252
  ```ts
253
- import { createMediaQuery } from "elements-kit/signals/media";
253
+ import { createMediaQuery } from "elements-kit/utilities/media-query";
254
254
 
255
255
  const isDark = createMediaQuery("(prefers-color-scheme: dark)");
256
256
  const isMobile = createMediaQuery("(max-width: 640px)");
@@ -323,7 +323,6 @@ class MyElement extends HTMLElement {
323
323
 
324
324
  ## Roadmap
325
325
 
326
- - [ ] More signal helpers (`localStorage`, `IntersectionObserver`, `ResizeObserver`, …)
327
326
  - [ ] Context — share state across a subtree without prop drilling
328
327
  - [ ] Async signal — `signal.from(promise)`, `signal.from(observable)`
329
328
  - [ ] UI library — pre-built reactive components built on ElementsKit primitives
@@ -1,4 +1,4 @@
1
- import { c as ReactiveElementOf } from "../index-CKjDUp1B.mjs";
1
+ import { ReactiveElementOf } from "./index.mjs";
2
2
 
3
3
  //#region src/builder/dom.d.ts
4
4
  interface Lifecycle {
@@ -1,2 +1,88 @@
1
- import { a as EFFECT, c as ReactiveElementOf, d as builder, f as toNode, i as DISPOSE, l as VALUE, n as Chain, o as ElementBuilder, r as DISPOSABLES, s as ReactiveElement, t as Builder, u as ValueOrReactive } from "../index-CKjDUp1B.mjs";
1
+ import { t as PrimitiveNodeType } from "../lib-BYJ5jPTG.mjs";
2
+ //#region src/builder/index.d.ts
3
+ declare const DISPOSABLES: unique symbol;
4
+ declare const DISPOSE: symbol;
5
+ declare const VALUE: unique symbol;
6
+ declare const EFFECT: unique symbol;
7
+ declare class ElementBuilder<T extends Element = Element> {
8
+ /** Dispose the reactive element and run all cleanup functions */
9
+ [DISPOSE]: () => void;
10
+ /** The underlying DOM element */
11
+ private [VALUE];
12
+ /** A set of cleanup functions to run when disposing the element */
13
+ private [DISPOSABLES];
14
+ [EFFECT](fn: () => void): this;
15
+ private constructor();
16
+ static create<T extends Element>(el: T): ReactiveElement<T>;
17
+ children(...children: ValueOrReactive<ElementBuilder | Node | string | number>[]): T;
18
+ ref(): T;
19
+ ref(apply: (ref: T) => void | (() => void)): this;
20
+ on<K extends keyof HTMLElementEventMap>(eventType: K, listener: (ev: HTMLElementEventMap[K]) => void, options?: boolean | AddEventListenerOptions): this;
21
+ }
22
+ declare function toNode(c: ElementBuilder | PrimitiveNodeType): Node;
23
+ declare function builder<T extends Element>(el: T): ReactiveElementOf<T>;
24
+ /**
25
+ * Callable overloads matching the Proxy apply trap → ref() behavior.
26
+ * Calling a reactive element as a function delegates to ref():
27
+ * el() → returns the raw DOM element
28
+ * el((ref) => {}) → applies a side-effect, returns the builder for chaining
29
+ */
30
+ interface RefCallable<T extends Element> {
31
+ (): T;
32
+ (apply: (ref: T) => void | (() => void)): this;
33
+ }
34
+ type ReactiveElement<T extends Element> = ElementBuilder<T> & RefCallable<T>;
35
+ type ValueOrReactive<T> = (() => T) | T;
36
+ type ValueOrReactiveArray<T extends any[]> = { [K in keyof T]: ValueOrReactive<T[K]> | T[K] };
37
+ /**
38
+ * Filter keys that are writable (exclude readonly and getter-only).
39
+ */
40
+ type WritableKeys<T> = { [K in keyof T]: (<U>() => U extends { [Q in K]: T[K] } ? 1 : 2) extends (<U>() => U extends { readonly [Q in K]: T[K] } ? 1 : 2) ? never : K }[keyof T];
41
+ /**
42
+ * Extracts the object chaining part of ReactiveBuilder.
43
+ * Used for properties like `style` where you can do both:
44
+ * .style("padding: 20px;") // setter
45
+ * .style.padding("20px") // sub-property chaining
46
+ */
47
+ type Chain<R, T> = T extends object ? { [K in WritableKeys<T>]: Builder<R, T[K]> } : {};
48
+ type Builder<R, T = R> = T extends ((...args: infer U) => unknown) ? (...value: ValueOrReactiveArray<U>) => R : (value?: ValueOrReactive<T>) => R;
49
+ /**
50
+ * Types eligible for sub-property chaining (e.g., `.style.padding("20px")`).
51
+ */
52
+ type ChainableType = CSSStyleDeclaration | DOMTokenList | DOMStringMap | StylePropertyMap;
53
+ /**
54
+ * Filters keys to only writable data properties.
55
+ * Excludes methods (function-valued properties) and event handlers (`on*`).
56
+ */
57
+ type DataPropertyKeys<T> = { [K in keyof T]: K extends `on${string}` ? never : T[K] extends ((...args: any[]) => any) ? never : K }[keyof T];
58
+ /**
59
+ * Reactive setter for a single property.
60
+ * Chainable types (CSSStyleDeclaration, DOMTokenList, etc.) get both
61
+ * sub-property chaining and direct setter support.
62
+ */
63
+ type ReactiveSetter<R, T> = T extends ChainableType ? Chain<R, T> & ((value: ValueOrReactive<T>) => R) : (value: ValueOrReactive<T>) => R;
64
+ /**
65
+ * A fully-typed reactive element builder for any Element type.
66
+ * Automatically maps all writable data properties into reactive setters.
67
+ *
68
+ * Use this for custom elements instead of needing generated builder interfaces.
69
+ *
70
+ * @example
71
+ * ```ts
72
+ * import { reactive, type ReactiveElementOf } from "elements-kit";
73
+ *
74
+ * class MyElement extends HTMLElement {
75
+ * greeting = "hello";
76
+ * }
77
+ * customElements.define("my-element", MyElement);
78
+ *
79
+ * const myEl = () =>
80
+ * reactive(document.createElement("my-element") as MyElement);
81
+ *
82
+ * // Full type support for both own and inherited properties:
83
+ * myEl().greeting("world").style.padding("20px").id("main");
84
+ * ```
85
+ */
86
+ type ReactiveElementOf<T extends Element> = ElementBuilder<T> & { [K in WritableKeys<T> & DataPropertyKeys<T> & keyof T]: ReactiveSetter<ReactiveElementOf<T>, T[K]> };
87
+ //#endregion
2
88
  export { Builder, Chain, DISPOSABLES, DISPOSE, EFFECT, ElementBuilder, ReactiveElement, ReactiveElementOf, VALUE, ValueOrReactive, builder, toNode };
@@ -1,4 +1,4 @@
1
- import { a as effect, t as isReactive } from "../signals-CLAPw8kk.mjs";
1
+ import { o as effect, t as isReactive } from "../signals-DcgXhkU2.mjs";
2
2
  import "../polyfill-B1lNNcum.mjs";
3
3
  import { i as resolveNode, n as Slot } from "../slot-Cydy7-0L.mjs";
4
4
  //#region src/builder/index.ts
@@ -1,4 +1,4 @@
1
- import { a as effect, d as onCleanup, m as untracked, o as effectScope, t as isReactive } from "./signals-CLAPw8kk.mjs";
1
+ import { f as onCleanup, h as untracked, o as effect, s as effectScope, t as isReactive } from "./signals-DcgXhkU2.mjs";
2
2
  import "./polyfill-B1lNNcum.mjs";
3
3
  import { i as resolveNode$1, n as Slot, r as Slots, t as $slots } from "./slot-Cydy7-0L.mjs";
4
4
  //#region \0rolldown/runtime.js
@@ -1,5 +1,3 @@
1
- import { u as ValueOrReactive } from "./index-CKjDUp1B.mjs";
2
-
3
1
  //#region src/signals/lib.d.ts
4
2
  /**
5
3
  * Returns `true` if `fn` is a signal handle created by {@link signal}.
@@ -220,7 +218,7 @@ declare function untracked<T>(fn: Computed<T>): T;
220
218
  declare function trigger<T = void>(fn: Computed<T>): void;
221
219
  //#endregion
222
220
  //#region src/signals/index.d.ts
223
- declare function isReactive<T>(value: ValueOrReactive<T>): value is () => T;
221
+ declare function isReactive<T>(value: MaybeReactive<T>): value is () => T;
224
222
  type Updater<T> = (value: T) => void;
225
223
  type Computed<T> = () => T;
226
224
  type Signal<T> = Updater<T> & Computed<T>;
@@ -253,5 +251,11 @@ type Signal<T> = Updater<T> & Computed<T>;
253
251
  * ```
254
252
  */
255
253
  declare function reactive<This extends object, Value>(source?: (self: This) => Signal<Value>): (_target: unknown, context: ClassFieldDecoratorContext<This, Value>) => (this: This, initialValue: Value) => Value;
254
+ type MaybeReactive<T> = T | Computed<T>;
255
+ /**
256
+ * Resolves a MaybeReactive<T> to its current value.
257
+ * If the input is a function, calls it; otherwise returns as-is.
258
+ */
259
+ declare function resolve<T>(value: MaybeReactive<T>): T;
256
260
  //#endregion
257
- export { untracked as _, reactive as a, effect as c, isEffect as d, isEffectScope as f, trigger as g, signal as h, isReactive as i, effectScope as l, onCleanup as m, Signal as n, batch as o, isSignal as p, Updater as r, computed as s, Computed as t, isComputed as u };
261
+ export { signal as _, isReactive as a, batch as c, effectScope as d, isComputed as f, onCleanup as g, isSignal as h, Updater as i, computed as l, isEffectScope as m, MaybeReactive as n, reactive as o, isEffect as p, Signal as r, resolve as s, Computed as t, effect as u, trigger as v, untracked as y };
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- //#region src/components/for.d.ts
1
+ //#region src/jsx-runtime/for.d.ts
2
2
  type KeyFn<T> = (item: T, index: number) => string | number;
3
3
  type RenderFn<T> = (item: T, index: number) => Element | DocumentFragment | null;
4
4
  /**
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
- import { n as disposeElement } from "./element-Ddk9YaoE.mjs";
2
- import { a as effect, d as onCleanup, f as signal, m as untracked, p as trigger } from "./signals-CLAPw8kk.mjs";
3
- //#region src/components/for.ts
1
+ import { n as disposeElement } from "./element-MXzFk4G2.mjs";
2
+ import { f as onCleanup, h as untracked, m as trigger, o as effect, p as signal } from "./signals-DcgXhkU2.mjs";
3
+ //#region src/jsx-runtime/for.ts
4
4
  /**
5
5
  * Keyed list renderer. Reconciles a reactive array into the DOM using a key
6
6
  * function to match existing nodes — minimising create/destroy churn.
@@ -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/react.d.ts
3
+ //#region src/integrations/react.d.ts
4
4
  /**
5
5
  * Subscribe to any readable signal — writable or computed — returning its current value.
6
6
  *
@@ -1,6 +1,6 @@
1
- import { a as effect, f as signal, o as effectScope } from "../../signals-CLAPw8kk.mjs";
1
+ import { o as effect, p as signal, s as effectScope } from "../signals-DcgXhkU2.mjs";
2
2
  import { useEffect, useMemo, useRef, useSyncExternalStore } from "react";
3
- //#region src/signals/lib/react.ts
3
+ //#region src/integrations/react.ts
4
4
  /**
5
5
  * Subscribe to any readable signal — writable or computed — returning its current value.
6
6
  *
@@ -1,4 +1,4 @@
1
- import { t as PrimitiveNodeType } from "../polyfill-AFIi9kAN.mjs";
1
+ import { t as PrimitiveNodeType } from "../lib-BYJ5jPTG.mjs";
2
2
  import { JSX as JSX$1 } from "dom-expressions/src/jsx-h";
3
3
 
4
4
  //#region src/jsx-runtime/types.d.ts
@@ -20,7 +20,7 @@ declare function createElement(type: string | Element | DocumentFragment | Compo
20
20
  //#region src/jsx-runtime/ref.d.ts
21
21
  declare const $ref: unique symbol;
22
22
  //#endregion
23
- //#region src/components/fragment.d.ts
23
+ //#region src/jsx-runtime/fragment.d.ts
24
24
  /**
25
25
  * Used by the JSX transform for `<>...</>` fragments.
26
26
  *
@@ -1,6 +1,6 @@
1
- import { t as createElement } from "../element-Ddk9YaoE.mjs";
2
- import { d as onCleanup } from "../signals-CLAPw8kk.mjs";
3
- //#region src/components/fragment.ts
1
+ import { t as createElement } from "../element-MXzFk4G2.mjs";
2
+ import { f as onCleanup } from "../signals-DcgXhkU2.mjs";
3
+ //#region src/jsx-runtime/fragment.ts
4
4
  /**
5
5
  * Used by the JSX transform for `<>...</>` fragments.
6
6
  *
@@ -0,0 +1,4 @@
1
+ //#region src/lib.d.ts
2
+ type PrimitiveNodeType = Node | string | boolean | number | bigint | symbol | Date | RegExp | null | undefined;
3
+ //#endregion
4
+ export { PrimitiveNodeType as t };
@@ -0,0 +1,9 @@
1
+ //#region src/polyfill.d.ts
2
+ declare global {
3
+ interface SymbolConstructor {
4
+ readonly dispose: symbol;
5
+ }
6
+ interface Disposable {
7
+ [Symbol.dispose](): void;
8
+ }
9
+ }
@@ -1,2 +1,2 @@
1
- import { _ as untracked, a as reactive, c as effect, d as isEffect, f as isEffectScope, g as trigger, h as signal, i as isReactive, l as effectScope, m as onCleanup, n as Signal, o as batch, p as isSignal, r as Updater, s as computed, t as Computed, u as isComputed } from "../index-BtqiEEfc.mjs";
2
- export { Computed, Signal, Updater, batch, computed, effect, effectScope, isComputed, isEffect, isEffectScope, isReactive, isSignal, onCleanup, reactive, signal, trigger, untracked };
1
+ import { _ as signal, a as isReactive, c as batch, d as effectScope, f as isComputed, g as onCleanup, h as isSignal, i as Updater, l as computed, m as isEffectScope, n as MaybeReactive, o as reactive, p as isEffect, r as Signal, s as resolve, t as Computed, u as effect, v as trigger, y as untracked } from "../index-Cvdhuy6Y.mjs";
2
+ export { Computed, MaybeReactive, Signal, Updater, batch, computed, effect, effectScope, isComputed, isEffect, isEffectScope, isReactive, isSignal, onCleanup, reactive, resolve, signal, trigger, untracked };
@@ -1,2 +1,2 @@
1
- import { a as effect, c as isEffect, d as onCleanup, f as signal, i as computed, l as isEffectScope, m as untracked, n as reactive, o as effectScope, p as trigger, r as batch, s as isComputed, t as isReactive, u as isSignal } from "../signals-CLAPw8kk.mjs";
2
- export { batch, computed, effect, effectScope, isComputed, isEffect, isEffectScope, isReactive, isSignal, onCleanup, reactive, signal, trigger, untracked };
1
+ import { a as computed, c as isComputed, d as isSignal, f as onCleanup, h as untracked, i as batch, l as isEffect, m as trigger, n as reactive, o as effect, p as signal, r as resolve, s as effectScope, t as isReactive, u as isEffectScope } from "../signals-DcgXhkU2.mjs";
2
+ export { batch, computed, effect, effectScope, isComputed, isEffect, isEffectScope, isReactive, isSignal, onCleanup, reactive, resolve, signal, trigger, untracked };
@@ -290,6 +290,12 @@ let queuedLength = 0;
290
290
  * link back to this node.
291
291
  */
292
292
  let activeSub;
293
+ /**
294
+ * The innermost effect or effectScope that owns the current execution frame.
295
+ * Unlike `activeSub`, this is **not** cleared by `untracked`, so `onCleanup`
296
+ * can be called from inside an untracked block and still register correctly.
297
+ */
298
+ let activeOwner;
293
299
  /** Ring-buffer of effects waiting to be flushed. */
294
300
  const queued = [];
295
301
  const { link, unlink, propagate, checkDirty, shallowPropagate } = createReactiveSystem({
@@ -471,11 +477,14 @@ function effect(fn) {
471
477
  flags: ReactiveFlags.Watching | ReactiveFlags.RecursedCheck
472
478
  };
473
479
  const prevSub = setActiveSub(e);
480
+ const prevOwner = activeOwner;
481
+ activeOwner = e;
474
482
  if (prevSub !== void 0) link(e, prevSub, 0);
475
483
  try {
476
484
  e.fn();
477
485
  } finally {
478
486
  activeSub = prevSub;
487
+ activeOwner = prevOwner;
479
488
  e.flags &= ~ReactiveFlags.RecursedCheck;
480
489
  }
481
490
  return effectOper.bind(e);
@@ -513,11 +522,14 @@ function effectScope(fn) {
513
522
  flags: ReactiveFlags.None
514
523
  };
515
524
  const prevSub = setActiveSub(e);
525
+ const prevOwner = activeOwner;
526
+ activeOwner = e;
516
527
  if (prevSub !== void 0) link(e, prevSub, 0);
517
528
  try {
518
529
  fn();
519
530
  } finally {
520
531
  activeSub = prevSub;
532
+ activeOwner = prevOwner;
521
533
  }
522
534
  return effectScopeOper.bind(e);
523
535
  }
@@ -560,7 +572,11 @@ function effectScope(fn) {
560
572
  * ```
561
573
  */
562
574
  function onCleanup(fn) {
563
- if (activeSub !== void 0) activeSub.onCleanup = fn;
575
+ if (activeOwner !== void 0) {
576
+ const node = activeOwner;
577
+ if (node.onCleanup === void 0) node.onCleanup = [fn];
578
+ else node.onCleanup.push(fn);
579
+ }
564
580
  }
565
581
  /**
566
582
  * Runs `fn` as a single atomic update: all signal writes inside `fn` are
@@ -698,17 +714,22 @@ function run(e) {
698
714
  if (flags & ReactiveFlags.Dirty || flags & ReactiveFlags.Pending && checkDirty(e.deps, e)) {
699
715
  ++cycle;
700
716
  if (e.onCleanup !== void 0) {
701
- const cleanup = e.onCleanup;
717
+ const cleanups = e.onCleanup;
702
718
  e.onCleanup = void 0;
703
- cleanup();
719
+ untracked(() => {
720
+ for (const fn of cleanups) fn();
721
+ });
704
722
  }
705
723
  e.depsTail = void 0;
706
724
  e.flags = ReactiveFlags.Watching | ReactiveFlags.RecursedCheck;
707
725
  const prevSub = setActiveSub(e);
726
+ const prevOwner = activeOwner;
727
+ activeOwner = e;
708
728
  try {
709
729
  e.fn();
710
730
  } finally {
711
731
  activeSub = prevSub;
732
+ activeOwner = prevOwner;
712
733
  e.flags &= ~ReactiveFlags.RecursedCheck;
713
734
  purgeDeps(e);
714
735
  }
@@ -822,9 +843,11 @@ function signalOper(...value) {
822
843
  */
823
844
  function effectOper() {
824
845
  if (this.onCleanup !== void 0) {
825
- const cleanup = this.onCleanup;
846
+ const cleanups = this.onCleanup;
826
847
  this.onCleanup = void 0;
827
- cleanup();
848
+ untracked(() => {
849
+ for (const fn of cleanups) fn();
850
+ });
828
851
  }
829
852
  effectScopeOper.call(this);
830
853
  }
@@ -847,10 +870,12 @@ function effectOper() {
847
870
  * @internal
848
871
  */
849
872
  function effectScopeOper() {
850
- const cleanup = this.onCleanup;
851
- if (cleanup !== void 0) {
873
+ const cleanups = this.onCleanup;
874
+ if (cleanups !== void 0) {
852
875
  this.onCleanup = void 0;
853
- cleanup();
876
+ untracked(() => {
877
+ for (const fn of cleanups) fn();
878
+ });
854
879
  }
855
880
  this.depsTail = void 0;
856
881
  this.flags = ReactiveFlags.None;
@@ -928,5 +953,12 @@ function reactive(source) {
928
953
  };
929
954
  };
930
955
  }
956
+ /**
957
+ * Resolves a MaybeReactive<T> to its current value.
958
+ * If the input is a function, calls it; otherwise returns as-is.
959
+ */
960
+ function resolve(value) {
961
+ return isReactive(value) ? value() : value;
962
+ }
931
963
  //#endregion
932
- export { effect as a, isEffect as c, onCleanup as d, signal as f, computed as i, isEffectScope as l, untracked as m, reactive as n, effectScope as o, trigger as p, batch as r, isComputed as s, isReactive as t, isSignal as u };
964
+ export { computed as a, isComputed as c, isSignal as d, onCleanup as f, untracked as h, batch as i, isEffect as l, trigger as m, reactive as n, effect as o, signal as p, resolve as r, effectScope as s, isReactive as t, isEffectScope as u };
package/dist/slot.d.mts CHANGED
@@ -1,5 +1,4 @@
1
- import { t as PrimitiveNodeType } from "./polyfill-AFIi9kAN.mjs";
2
-
1
+ import { t as PrimitiveNodeType } from "./lib-BYJ5jPTG.mjs";
3
2
  //#region src/slot.d.ts
4
3
  /**
5
4
  * A lightweight slot that reserves a region in the DOM using comment markers.
@@ -13311,4 +13311,4 @@ Object.defineProperty(globalThis, GLOBAL_EXPECT, {
13311
13311
  configurable: true
13312
13312
  });
13313
13313
  //#endregion
13314
- export { describe as a, beforeEach as i, vi as n, it as o, afterEach as r, globalExpect as t };
13314
+ export { beforeEach as a, beforeAll as i, vi as n, describe as o, afterEach as r, it as s, globalExpect as t };
@@ -0,0 +1,6 @@
1
+ import { t as Computed } from "../index-Cvdhuy6Y.mjs";
2
+
3
+ //#region src/utilities/active-element.d.ts
4
+ declare const activeElement: Computed<Element | null>;
5
+ //#endregion
6
+ export { activeElement };
@@ -0,0 +1,13 @@
1
+ import { fromEvent, sync } from "./event-driven.mjs";
2
+ //#region src/utilities/active-element.ts
3
+ /**
4
+ * Returns a read-only `Computed<Element | null>` bound to `document.activeElement`.
5
+ * Reacts to `focusin` and `focusout` events on the document.
6
+ */
7
+ function createActiveElement() {
8
+ const [active] = sync(fromEvent(document, ["focusin", "focusout"]), () => typeof document !== "undefined" ? document.activeElement : null);
9
+ return active;
10
+ }
11
+ const activeElement = createActiveElement();
12
+ //#endregion
13
+ export { activeElement };
@@ -0,0 +1,24 @@
1
+ import { o as describe, s as it, t as globalExpect } from "../test.BmQO5GaM-ANkhHvbr.mjs";
2
+ import { activeElement } from "./active-element.mjs";
3
+ //#region src/utilities/active-element.test.ts
4
+ describe("activeElement (singleton)", () => {
5
+ it("returns a computed that reads the current activeElement", () => {
6
+ globalExpect(activeElement()).toBe(document.activeElement);
7
+ });
8
+ it("updates when focus changes", () => {
9
+ const input = document.createElement("input");
10
+ document.body.appendChild(input);
11
+ input.focus();
12
+ globalExpect(activeElement()).toBe(input);
13
+ document.body.removeChild(input);
14
+ });
15
+ it("remains reactive after scope disposal", () => {
16
+ const input = document.createElement("input");
17
+ document.body.appendChild(input);
18
+ input.focus();
19
+ globalExpect(activeElement()).toBe(input);
20
+ document.body.removeChild(input);
21
+ });
22
+ });
23
+ //#endregion
24
+ export {};
@@ -1,12 +1,12 @@
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/debounced.d.ts
3
+ //#region src/utilities/debounced.d.ts
4
4
  /**
5
5
  * Returns a `Computed` that mirrors `getter` but only updates after `delay`
6
6
  * milliseconds of silence (i.e. no new values from `getter`).
7
7
  *
8
8
  * The initial value is read synchronously, so the computed is never undefined.
9
9
  */
10
- declare function createDebounced<T>(getter: () => T, delay: number): Computed<T>;
10
+ declare function createDebounced<T>(getter: () => T, delay: number | (() => number)): Computed<T>;
11
11
  //#endregion
12
12
  export { createDebounced };
@@ -1,5 +1,6 @@
1
- import { a as effect, d as onCleanup, f as signal } from "../../signals-CLAPw8kk.mjs";
2
- //#region src/signals/lib/debounced.ts
1
+ import { o as effect, p as signal } from "../signals-DcgXhkU2.mjs";
2
+ import { createTimeout } from "./timeout.mjs";
3
+ //#region src/utilities/debounced.ts
3
4
  /**
4
5
  * Returns a `Computed` that mirrors `getter` but only updates after `delay`
5
6
  * milliseconds of silence (i.e. no new values from `getter`).
@@ -8,11 +9,11 @@ import { a as effect, d as onCleanup, f as signal } from "../../signals-CLAPw8kk
8
9
  */
9
10
  function createDebounced(getter, delay) {
10
11
  const s = signal(getter());
11
- let timer;
12
+ let latest;
13
+ const { reset } = createTimeout(() => s(latest), delay, false);
12
14
  effect(() => {
13
- const latest = getter();
14
- timer = setTimeout(() => s(latest), delay);
15
- onCleanup(() => clearTimeout(timer));
15
+ latest = getter();
16
+ reset();
16
17
  });
17
18
  return s;
18
19
  }
@@ -1,7 +1,7 @@
1
- import { f as signal, o as effectScope } from "../../signals-CLAPw8kk.mjs";
2
- import { a as describe, i as beforeEach, n as vi, o as it, r as afterEach, t as globalExpect } from "../../test.BmQO5GaM-CR2qjV1t.mjs";
1
+ import { p as signal, s as effectScope } from "../signals-DcgXhkU2.mjs";
2
+ import { a as beforeEach, n as vi, o as describe, r as afterEach, s as it, t as globalExpect } from "../test.BmQO5GaM-ANkhHvbr.mjs";
3
3
  import { createDebounced } from "./debounced.mjs";
4
- //#region src/signals/lib/debounced.test.ts
4
+ //#region src/utilities/debounced.test.ts
5
5
  beforeEach(() => {
6
6
  vi.useFakeTimers();
7
7
  });
@@ -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/element-rect.d.ts
3
+ //#region src/utilities/element-rect.d.ts
4
4
  type RectResult = {
5
5
  x: Computed<number>;
6
6
  y: Computed<number>;
@@ -16,6 +16,6 @@ type RectResult = {
16
16
  * fires on size changes) and returns all eight DOMRect properties as reactive
17
17
  * computeds.
18
18
  */
19
- declare function createElementRect(target: Element | (() => Element | null)): RectResult;
19
+ declare function createElementRect(target: Element): RectResult;
20
20
  //#endregion
21
21
  export { createElementRect };
@@ -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 { createResizeObserver } from "./resize-observer.mjs";
3
- //#region src/signals/lib/element-rect.ts
3
+ //#region src/utilities/element-rect.ts
4
4
  /**
5
5
  * Observes the full bounding rect of `target` using a `ResizeObserver` (which
6
6
  * fires on size changes) and returns all eight DOMRect properties as reactive
@@ -29,9 +29,8 @@ function createElementRect(target) {
29
29
  const observer = createResizeObserver(target, (entries) => {
30
30
  for (const entry of entries) updateRect(entry.target);
31
31
  });
32
- const el = typeof target === "function" ? target() : target;
33
- if (el) updateRect(el);
34
- return Object.assign({
32
+ updateRect(target);
33
+ return {
35
34
  x,
36
35
  y,
37
36
  width,
@@ -39,8 +38,9 @@ function createElementRect(target) {
39
38
  top,
40
39
  right,
41
40
  bottom,
42
- left
43
- }, { [Symbol.dispose]: observer[Symbol.dispose] });
41
+ left,
42
+ [Symbol.dispose]: observer[Symbol.dispose]
43
+ };
44
44
  }
45
45
  //#endregion
46
46
  export { createElementRect };
@@ -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 { createElementRect } from "./element-rect.mjs";
4
- //#region src/signals/lib/element-rect.test.ts
4
+ //#region src/utilities/element-rect.test.ts
5
5
  afterEach(() => {
6
6
  document.body.innerHTML = "";
7
7
  vi.restoreAllMocks();
@@ -0,0 +1,16 @@
1
+ import { r as Signal } from "../index-Cvdhuy6Y.mjs";
2
+
3
+ //#region src/utilities/element-scroll.d.ts
4
+ type ElementScrollResult = {
5
+ /** Horizontal scroll position (writable — setting it scrolls the element). */x: Signal<number>; /** Vertical scroll position (writable — setting it scrolls the element). */
6
+ y: Signal<number>;
7
+ } & Disposable;
8
+ /**
9
+ * Returns writable signals for an element's scroll position.
10
+ *
11
+ * Reading `x()` / `y()` returns the current `scrollLeft` / `scrollTop`.
12
+ * Writing `x(100)` or `y(200)` scrolls the element to that position.
13
+ */
14
+ declare function createElementScroll(target: Element): ElementScrollResult;
15
+ //#endregion
16
+ export { createElementScroll };
@@ -0,0 +1,52 @@
1
+ import { f as onCleanup, o as effect, p as signal } from "../signals-DcgXhkU2.mjs";
2
+ import { on } from "./event-listener.mjs";
3
+ //#region src/utilities/element-scroll.ts
4
+ /**
5
+ * Returns writable signals for an element's scroll position.
6
+ *
7
+ * Reading `x()` / `y()` returns the current `scrollLeft` / `scrollTop`.
8
+ * Writing `x(100)` or `y(200)` scrolls the element to that position.
9
+ */
10
+ function createElementScroll(target) {
11
+ const el = target;
12
+ const x = signal(el?.scrollLeft ?? 0);
13
+ const y = signal(el?.scrollTop ?? 0);
14
+ let skipEvent = false;
15
+ const handler = () => {
16
+ if (skipEvent) {
17
+ skipEvent = false;
18
+ return;
19
+ }
20
+ if (!el) return;
21
+ x(el.scrollLeft);
22
+ y(el.scrollTop);
23
+ };
24
+ const cleanup = el ? on(el, "scroll", handler, { passive: true }) : () => {};
25
+ const stopX = effect(() => {
26
+ const val = x();
27
+ if (el && el.scrollLeft !== val) {
28
+ skipEvent = true;
29
+ el.scrollLeft = val;
30
+ }
31
+ });
32
+ const stopY = effect(() => {
33
+ const val = y();
34
+ if (el && el.scrollTop !== val) {
35
+ skipEvent = true;
36
+ el.scrollTop = val;
37
+ }
38
+ });
39
+ const dispose = () => {
40
+ cleanup();
41
+ stopX();
42
+ stopY();
43
+ };
44
+ onCleanup(dispose);
45
+ return {
46
+ x,
47
+ y,
48
+ [Symbol.dispose]: dispose
49
+ };
50
+ }
51
+ //#endregion
52
+ export { createElementScroll };