elements-kit 0.0.8 → 0.0.10

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 (261) hide show
  1. package/README.md +3 -3
  2. package/dist/builder/dom.d.mts +1 -1
  3. package/dist/builder/index.d.mts +1 -1
  4. package/dist/{index-BGKVkZ6y.d.mts → index-BtqiEEfc.d.mts} +1 -1
  5. package/dist/{index-Ukqj0EcT.d.mts → index-CKjDUp1B.d.mts} +1 -1
  6. package/dist/jsx-runtime/index.d.mts +1 -1
  7. package/dist/magic-string.es-i62WTP6J.mjs +1011 -0
  8. package/dist/signals/index.d.mts +1 -1
  9. package/dist/signals/lib/active-element.d.mts +10 -0
  10. package/dist/signals/lib/active-element.mjs +12 -0
  11. package/dist/signals/lib/active-element.test.d.mts +1 -0
  12. package/dist/signals/lib/active-element.test.mjs +39 -0
  13. package/dist/signals/lib/animation-frames.d.mts +18 -0
  14. package/dist/signals/lib/animation-frames.mjs +48 -0
  15. package/dist/signals/lib/animation-frames.test.d.mts +1 -0
  16. package/dist/signals/lib/animation-frames.test.mjs +52 -0
  17. package/dist/signals/lib/async-retry.d.mts +21 -0
  18. package/dist/signals/lib/async-retry.mjs +57 -0
  19. package/dist/signals/lib/async-retry.test.d.mts +1 -0
  20. package/dist/signals/lib/async-retry.test.mjs +57 -0
  21. package/dist/signals/lib/audio.d.mts +21 -0
  22. package/dist/signals/lib/audio.mjs +35 -0
  23. package/dist/signals/lib/audio.test.d.mts +1 -0
  24. package/dist/signals/lib/audio.test.mjs +57 -0
  25. package/dist/signals/lib/battery.d.mts +17 -0
  26. package/dist/signals/lib/battery.mjs +45 -0
  27. package/dist/signals/lib/battery.test.d.mts +1 -0
  28. package/dist/signals/lib/battery.test.mjs +38 -0
  29. package/dist/signals/lib/before-unload.d.mts +11 -0
  30. package/dist/signals/lib/before-unload.mjs +20 -0
  31. package/dist/signals/lib/before-unload.test.d.mts +1 -0
  32. package/dist/signals/lib/before-unload.test.mjs +29 -0
  33. package/dist/signals/lib/clipboard.d.mts +15 -0
  34. package/dist/signals/lib/clipboard.mjs +25 -0
  35. package/dist/signals/lib/clipboard.test.d.mts +1 -0
  36. package/dist/signals/lib/clipboard.test.mjs +53 -0
  37. package/dist/signals/lib/counter.d.mts +18 -0
  38. package/dist/signals/lib/counter.mjs +21 -0
  39. package/dist/signals/lib/counter.test.d.mts +1 -0
  40. package/dist/signals/lib/counter.test.mjs +74 -0
  41. package/dist/signals/lib/debounced.d.mts +12 -0
  42. package/dist/signals/lib/debounced.mjs +20 -0
  43. package/dist/signals/lib/debounced.test.d.mts +1 -0
  44. package/dist/signals/lib/debounced.test.mjs +66 -0
  45. package/dist/signals/lib/document-title.d.mts +10 -0
  46. package/dist/signals/lib/document-title.mjs +15 -0
  47. package/dist/signals/lib/document-title.test.d.mts +1 -0
  48. package/dist/signals/lib/document-title.test.mjs +33 -0
  49. package/dist/signals/lib/element-rect.d.mts +21 -0
  50. package/dist/signals/lib/element-rect.mjs +46 -0
  51. package/dist/signals/lib/element-rect.test.d.mts +1 -0
  52. package/dist/signals/lib/element-rect.test.mjs +99 -0
  53. package/dist/signals/lib/element-size.d.mts +16 -0
  54. package/dist/signals/lib/element-size.mjs +32 -0
  55. package/dist/signals/lib/element-size.test.d.mts +1 -0
  56. package/dist/signals/lib/element-size.test.mjs +86 -0
  57. package/dist/signals/lib/event-driven.d.mts +47 -0
  58. package/dist/signals/lib/event-driven.mjs +38 -0
  59. package/dist/signals/lib/event-listener.d.mts +14 -0
  60. package/dist/signals/lib/event-listener.mjs +28 -0
  61. package/dist/signals/lib/event-listener.test.d.mts +1 -0
  62. package/dist/signals/lib/event-listener.test.mjs +58 -0
  63. package/dist/signals/lib/favicon.d.mts +10 -0
  64. package/dist/signals/lib/favicon.mjs +24 -0
  65. package/dist/signals/lib/favicon.test.d.mts +1 -0
  66. package/dist/signals/lib/favicon.test.mjs +28 -0
  67. package/dist/signals/lib/finite-state-machine.d.mts +22 -0
  68. package/dist/signals/lib/finite-state-machine.mjs +26 -0
  69. package/dist/signals/lib/finite-state-machine.test.d.mts +1 -0
  70. package/dist/signals/lib/finite-state-machine.test.mjs +66 -0
  71. package/dist/signals/lib/fullscreen.d.mts +15 -0
  72. package/dist/signals/lib/fullscreen.mjs +24 -0
  73. package/dist/signals/lib/fullscreen.test.d.mts +1 -0
  74. package/dist/signals/lib/fullscreen.test.mjs +48 -0
  75. package/dist/signals/lib/geolocation.d.mts +15 -0
  76. package/dist/signals/lib/geolocation.mjs +30 -0
  77. package/dist/signals/lib/geolocation.test.d.mts +1 -0
  78. package/dist/signals/lib/geolocation.test.mjs +37 -0
  79. package/dist/signals/lib/hash.d.mts +10 -0
  80. package/dist/signals/lib/hash.mjs +14 -0
  81. package/dist/signals/lib/hash.test.d.mts +1 -0
  82. package/dist/signals/lib/hash.test.mjs +46 -0
  83. package/dist/signals/lib/hover.d.mts +11 -0
  84. package/dist/signals/lib/hover.mjs +23 -0
  85. package/dist/signals/lib/hover.test.d.mts +1 -0
  86. package/dist/signals/lib/hover.test.mjs +63 -0
  87. package/dist/signals/lib/intersection-observer.d.mts +8 -0
  88. package/dist/signals/lib/intersection-observer.mjs +16 -0
  89. package/dist/signals/lib/intersection-observer.test.d.mts +1 -0
  90. package/dist/signals/lib/intersection-observer.test.mjs +44 -0
  91. package/dist/signals/lib/interval.d.mts +18 -0
  92. package/dist/signals/lib/interval.mjs +38 -0
  93. package/dist/signals/lib/interval.test.d.mts +1 -0
  94. package/dist/signals/lib/interval.test.mjs +68 -0
  95. package/dist/signals/lib/is-document-visible.d.mts +11 -0
  96. package/dist/signals/lib/is-document-visible.mjs +13 -0
  97. package/dist/signals/lib/is-document-visible.test.d.mts +1 -0
  98. package/dist/signals/lib/is-document-visible.test.mjs +58 -0
  99. package/dist/signals/lib/is-focus-within.d.mts +10 -0
  100. package/dist/signals/lib/is-focus-within.mjs +28 -0
  101. package/dist/signals/lib/is-focus-within.test.d.mts +1 -0
  102. package/dist/signals/lib/is-focus-within.test.mjs +50 -0
  103. package/dist/signals/lib/is-idle.d.mts +10 -0
  104. package/dist/signals/lib/is-idle.mjs +37 -0
  105. package/dist/signals/lib/is-idle.test.d.mts +1 -0
  106. package/dist/signals/lib/is-idle.test.mjs +50 -0
  107. package/dist/signals/lib/is-in-viewport.d.mts +10 -0
  108. package/dist/signals/lib/is-in-viewport.mjs +16 -0
  109. package/dist/signals/lib/is-in-viewport.test.d.mts +1 -0
  110. package/dist/signals/lib/is-in-viewport.test.mjs +74 -0
  111. package/dist/signals/lib/key-press.d.mts +13 -0
  112. package/dist/signals/lib/key-press.mjs +25 -0
  113. package/dist/signals/lib/key-press.test.d.mts +1 -0
  114. package/dist/signals/lib/key-press.test.mjs +52 -0
  115. package/dist/signals/lib/list.d.mts +19 -0
  116. package/dist/signals/lib/list.mjs +36 -0
  117. package/dist/signals/lib/list.test.d.mts +1 -0
  118. package/dist/signals/lib/list.test.mjs +104 -0
  119. package/dist/signals/lib/lock-body-scroll.d.mts +8 -0
  120. package/dist/signals/lib/lock-body-scroll.mjs +17 -0
  121. package/dist/signals/lib/lock-body-scroll.test.d.mts +1 -0
  122. package/dist/signals/lib/lock-body-scroll.test.mjs +37 -0
  123. package/dist/signals/lib/long-press.d.mts +10 -0
  124. package/dist/signals/lib/long-press.mjs +29 -0
  125. package/dist/signals/lib/long-press.test.d.mts +1 -0
  126. package/dist/signals/lib/long-press.test.mjs +52 -0
  127. package/dist/signals/lib/map.d.mts +18 -0
  128. package/dist/signals/lib/map.mjs +33 -0
  129. package/dist/signals/lib/map.test.d.mts +1 -0
  130. package/dist/signals/lib/map.test.mjs +60 -0
  131. package/dist/signals/lib/media-devices.d.mts +10 -0
  132. package/dist/signals/lib/media-devices.mjs +18 -0
  133. package/dist/signals/lib/media-devices.test.d.mts +1 -0
  134. package/dist/signals/lib/media-devices.test.mjs +44 -0
  135. package/dist/signals/lib/media.d.mts +1 -1
  136. package/dist/signals/lib/media.mjs +3 -10
  137. package/dist/signals/lib/motion.d.mts +15 -0
  138. package/dist/signals/lib/motion.mjs +27 -0
  139. package/dist/signals/lib/motion.test.d.mts +1 -0
  140. package/dist/signals/lib/motion.test.mjs +51 -0
  141. package/dist/signals/lib/mouse-position.d.mts +14 -0
  142. package/dist/signals/lib/mouse-position.mjs +22 -0
  143. package/dist/signals/lib/mouse-position.test.d.mts +1 -0
  144. package/dist/signals/lib/mouse-position.test.mjs +44 -0
  145. package/dist/signals/lib/mouse-wheel.d.mts +10 -0
  146. package/dist/signals/lib/mouse-wheel.mjs +17 -0
  147. package/dist/signals/lib/mouse-wheel.test.d.mts +1 -0
  148. package/dist/signals/lib/mouse-wheel.test.mjs +38 -0
  149. package/dist/signals/lib/mutation-observer.d.mts +8 -0
  150. package/dist/signals/lib/mutation-observer.mjs +16 -0
  151. package/dist/signals/lib/mutation-observer.test.d.mts +1 -0
  152. package/dist/signals/lib/mutation-observer.test.mjs +46 -0
  153. package/dist/signals/lib/network-state.d.mts +17 -0
  154. package/dist/signals/lib/network-state.mjs +34 -0
  155. package/dist/signals/lib/network-state.test.d.mts +1 -0
  156. package/dist/signals/lib/network-state.test.mjs +61 -0
  157. package/dist/signals/lib/on-click-outside.d.mts +11 -0
  158. package/dist/signals/lib/on-click-outside.mjs +20 -0
  159. package/dist/signals/lib/on-click-outside.test.d.mts +1 -0
  160. package/dist/signals/lib/on-click-outside.test.mjs +54 -0
  161. package/dist/signals/lib/orientation.d.mts +13 -0
  162. package/dist/signals/lib/orientation.mjs +20 -0
  163. package/dist/signals/lib/orientation.test.d.mts +1 -0
  164. package/dist/signals/lib/orientation.test.mjs +43 -0
  165. package/dist/signals/lib/page-leave.d.mts +8 -0
  166. package/dist/signals/lib/page-leave.mjs +12 -0
  167. package/dist/signals/lib/page-leave.test.d.mts +1 -0
  168. package/dist/signals/lib/page-leave.test.mjs +29 -0
  169. package/dist/signals/lib/permission.d.mts +14 -0
  170. package/dist/signals/lib/permission.mjs +26 -0
  171. package/dist/signals/lib/permission.test.d.mts +1 -0
  172. package/dist/signals/lib/permission.test.mjs +50 -0
  173. package/dist/signals/lib/persisted-state.d.mts +11 -0
  174. package/dist/signals/lib/persisted-state.mjs +25 -0
  175. package/dist/signals/lib/persisted-state.test.d.mts +1 -0
  176. package/dist/signals/lib/persisted-state.test.mjs +70 -0
  177. package/dist/signals/lib/pressed-keys.d.mts +10 -0
  178. package/dist/signals/lib/pressed-keys.mjs +32 -0
  179. package/dist/signals/lib/pressed-keys.test.d.mts +1 -0
  180. package/dist/signals/lib/pressed-keys.test.mjs +54 -0
  181. package/dist/signals/lib/previous-distinct.d.mts +10 -0
  182. package/dist/signals/lib/previous-distinct.mjs +22 -0
  183. package/dist/signals/lib/previous-distinct.test.d.mts +1 -0
  184. package/dist/signals/lib/previous-distinct.test.mjs +50 -0
  185. package/dist/signals/lib/previous.d.mts +10 -0
  186. package/dist/signals/lib/previous.mjs +18 -0
  187. package/dist/signals/lib/previous.test.d.mts +1 -0
  188. package/dist/signals/lib/previous.test.mjs +47 -0
  189. package/dist/signals/lib/queue.d.mts +17 -0
  190. package/dist/signals/lib/queue.mjs +28 -0
  191. package/dist/signals/lib/queue.test.d.mts +1 -0
  192. package/dist/signals/lib/queue.test.mjs +61 -0
  193. package/dist/signals/lib/raf.d.mts +17 -0
  194. package/dist/signals/lib/raf.mjs +38 -0
  195. package/dist/signals/lib/raf.test.d.mts +1 -0
  196. package/dist/signals/lib/raf.test.mjs +58 -0
  197. package/dist/signals/lib/react.d.mts +1 -1
  198. package/dist/signals/lib/resize-observer.d.mts +8 -0
  199. package/dist/signals/lib/resize-observer.mjs +16 -0
  200. package/dist/signals/lib/resize-observer.test.d.mts +1 -0
  201. package/dist/signals/lib/resize-observer.test.mjs +44 -0
  202. package/dist/signals/lib/resource.d.mts +23 -0
  203. package/dist/signals/lib/resource.mjs +43 -0
  204. package/dist/signals/lib/resource.test.d.mts +1 -0
  205. package/dist/signals/lib/resource.test.mjs +56 -0
  206. package/dist/signals/lib/scroll-state.d.mts +19 -0
  207. package/dist/signals/lib/scroll-state.mjs +46 -0
  208. package/dist/signals/lib/scroll-state.test.d.mts +1 -0
  209. package/dist/signals/lib/scroll-state.test.mjs +94 -0
  210. package/dist/signals/lib/scrolling.d.mts +12 -0
  211. package/dist/signals/lib/scrolling.mjs +26 -0
  212. package/dist/signals/lib/scrolling.test.d.mts +1 -0
  213. package/dist/signals/lib/scrolling.test.mjs +57 -0
  214. package/dist/signals/lib/search-params.d.mts +16 -0
  215. package/dist/signals/lib/search-params.mjs +37 -0
  216. package/dist/signals/lib/search-params.test.d.mts +1 -0
  217. package/dist/signals/lib/search-params.test.mjs +56 -0
  218. package/dist/signals/lib/set.d.mts +18 -0
  219. package/dist/signals/lib/set.mjs +38 -0
  220. package/dist/signals/lib/set.test.d.mts +1 -0
  221. package/dist/signals/lib/set.test.mjs +70 -0
  222. package/dist/signals/lib/start-typing.d.mts +9 -0
  223. package/dist/signals/lib/start-typing.mjs +39 -0
  224. package/dist/signals/lib/start-typing.test.d.mts +1 -0
  225. package/dist/signals/lib/start-typing.test.mjs +64 -0
  226. package/dist/signals/lib/state-history.d.mts +21 -0
  227. package/dist/signals/lib/state-history.mjs +61 -0
  228. package/dist/signals/lib/state-history.test.d.mts +1 -0
  229. package/dist/signals/lib/state-history.test.mjs +106 -0
  230. package/dist/signals/lib/state-validator.d.mts +16 -0
  231. package/dist/signals/lib/state-validator.mjs +21 -0
  232. package/dist/signals/lib/state-validator.test.d.mts +1 -0
  233. package/dist/signals/lib/state-validator.test.mjs +41 -0
  234. package/dist/signals/lib/throttled.d.mts +13 -0
  235. package/dist/signals/lib/throttled.mjs +45 -0
  236. package/dist/signals/lib/throttled.test.d.mts +1 -0
  237. package/dist/signals/lib/throttled.test.mjs +56 -0
  238. package/dist/signals/lib/timeout.d.mts +16 -0
  239. package/dist/signals/lib/timeout.mjs +39 -0
  240. package/dist/signals/lib/timeout.test.d.mts +1 -0
  241. package/dist/signals/lib/timeout.test.mjs +64 -0
  242. package/dist/signals/lib/toggle.d.mts +12 -0
  243. package/dist/signals/lib/toggle.mjs +12 -0
  244. package/dist/signals/lib/toggle.test.d.mts +1 -0
  245. package/dist/signals/lib/toggle.test.mjs +43 -0
  246. package/dist/signals/lib/video.d.mts +21 -0
  247. package/dist/signals/lib/video.mjs +35 -0
  248. package/dist/signals/lib/video.test.d.mts +1 -0
  249. package/dist/signals/lib/video.test.mjs +51 -0
  250. package/dist/signals/lib/watch.d.mts +16 -0
  251. package/dist/signals/lib/watch.mjs +31 -0
  252. package/dist/signals/lib/watch.test.d.mts +1 -0
  253. package/dist/signals/lib/watch.test.mjs +51 -0
  254. package/dist/signals/lib/window-size.d.mts +14 -0
  255. package/dist/signals/lib/window-size.mjs +21 -0
  256. package/dist/signals/lib/window-size.test.d.mts +1 -0
  257. package/dist/signals/lib/window-size.test.mjs +50 -0
  258. package/dist/slot.d.mts +1 -1
  259. package/dist/test.BmQO5GaM-CR2qjV1t.mjs +13314 -0
  260. package/package.json +1 -1
  261. /package/dist/{polyfill-BW_B2r6i.d.mts → polyfill-AFIi9kAN.d.mts} +0 -0
@@ -0,0 +1,74 @@
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 { createIsInViewport } from "./is-in-viewport.mjs";
4
+ //#region src/signals/lib/is-in-viewport.test.ts
5
+ afterEach(() => {
6
+ vi.unstubAllGlobals();
7
+ });
8
+ function mockIntersectionObserver() {
9
+ let observerCallback;
10
+ const observe = vi.fn();
11
+ const disconnect = vi.fn();
12
+ const unobserve = vi.fn();
13
+ vi.stubGlobal("IntersectionObserver", function MockIO(cb) {
14
+ observerCallback = cb;
15
+ return {
16
+ observe,
17
+ disconnect,
18
+ unobserve,
19
+ root: null,
20
+ rootMargin: "",
21
+ thresholds: []
22
+ };
23
+ });
24
+ return {
25
+ fire: (isIntersecting) => {
26
+ observerCallback([{ isIntersecting }], {});
27
+ },
28
+ disconnect
29
+ };
30
+ }
31
+ describe("createIsInViewport", () => {
32
+ it("starts as false", () => {
33
+ const { fire: _fire } = mockIntersectionObserver();
34
+ const el = document.createElement("div");
35
+ let visible;
36
+ effectScope(() => {
37
+ visible = createIsInViewport(el);
38
+ });
39
+ globalExpect(visible()).toBe(false);
40
+ });
41
+ it("becomes true when intersection fires with isIntersecting=true", () => {
42
+ const { fire } = mockIntersectionObserver();
43
+ const el = document.createElement("div");
44
+ let visible;
45
+ effectScope(() => {
46
+ visible = createIsInViewport(el);
47
+ });
48
+ fire(true);
49
+ globalExpect(visible()).toBe(true);
50
+ });
51
+ it("becomes false when intersection fires with isIntersecting=false", () => {
52
+ const { fire } = mockIntersectionObserver();
53
+ const el = document.createElement("div");
54
+ let visible;
55
+ effectScope(() => {
56
+ visible = createIsInViewport(el);
57
+ });
58
+ fire(true);
59
+ fire(false);
60
+ globalExpect(visible()).toBe(false);
61
+ });
62
+ it("disconnects on Symbol.dispose", () => {
63
+ const { disconnect } = mockIntersectionObserver();
64
+ const el = document.createElement("div");
65
+ let visible;
66
+ effectScope(() => {
67
+ visible = createIsInViewport(el);
68
+ });
69
+ visible[Symbol.dispose]();
70
+ globalExpect(disconnect).toHaveBeenCalledOnce();
71
+ });
72
+ });
73
+ //#endregion
74
+ export {};
@@ -0,0 +1,13 @@
1
+ import { t as Computed } from "../../index-BtqiEEfc.mjs";
2
+
3
+ //#region src/signals/lib/key-press.d.ts
4
+ type KeyPressResult = {
5
+ pressed: Computed<boolean>;
6
+ } & Disposable;
7
+ /**
8
+ * Returns a reactive boolean that is `true` while the given keyboard `key`
9
+ * is held down.
10
+ */
11
+ declare function createKeyPress(key: string): KeyPressResult;
12
+ //#endregion
13
+ export { createKeyPress };
@@ -0,0 +1,25 @@
1
+ import { f as signal } from "../../signals-CLAPw8kk.mjs";
2
+ import { createEventListener } from "./event-listener.mjs";
3
+ //#region src/signals/lib/key-press.ts
4
+ /**
5
+ * Returns a reactive boolean that is `true` while the given keyboard `key`
6
+ * is held down.
7
+ */
8
+ function createKeyPress(key) {
9
+ const pressed = signal(false);
10
+ const onDown = (e) => {
11
+ if (e.key === key) pressed(true);
12
+ };
13
+ const onUp = (e) => {
14
+ if (e.key === key) pressed(false);
15
+ };
16
+ const r1 = createEventListener(window, "keydown", onDown);
17
+ const r2 = createEventListener(window, "keyup", onUp);
18
+ const cleanup = () => {
19
+ r1();
20
+ r2();
21
+ };
22
+ return Object.assign({ pressed }, { [Symbol.dispose]: cleanup });
23
+ }
24
+ //#endregion
25
+ export { createKeyPress };
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,52 @@
1
+ import { o as effectScope } from "../../signals-CLAPw8kk.mjs";
2
+ import { a as describe, o as it, r as afterEach, t as globalExpect } from "../../test.BmQO5GaM-CR2qjV1t.mjs";
3
+ import { createKeyPress } from "./key-press.mjs";
4
+ //#region src/signals/lib/key-press.test.ts
5
+ afterEach(() => {
6
+ document.body.innerHTML = "";
7
+ });
8
+ describe("createKeyPress", () => {
9
+ it("starts as false", () => {
10
+ let k;
11
+ effectScope(() => {
12
+ k = createKeyPress("a");
13
+ });
14
+ globalExpect(k.pressed()).toBe(false);
15
+ });
16
+ it("becomes true on keydown", () => {
17
+ let k;
18
+ effectScope(() => {
19
+ k = createKeyPress("a");
20
+ });
21
+ window.dispatchEvent(new KeyboardEvent("keydown", { key: "a" }));
22
+ globalExpect(k.pressed()).toBe(true);
23
+ });
24
+ it("becomes false on keyup", () => {
25
+ let k;
26
+ effectScope(() => {
27
+ k = createKeyPress("a");
28
+ });
29
+ window.dispatchEvent(new KeyboardEvent("keydown", { key: "a" }));
30
+ window.dispatchEvent(new KeyboardEvent("keyup", { key: "a" }));
31
+ globalExpect(k.pressed()).toBe(false);
32
+ });
33
+ it("does not react to different keys", () => {
34
+ let k;
35
+ effectScope(() => {
36
+ k = createKeyPress("a");
37
+ });
38
+ window.dispatchEvent(new KeyboardEvent("keydown", { key: "b" }));
39
+ globalExpect(k.pressed()).toBe(false);
40
+ });
41
+ it("stops reacting after Symbol.dispose", () => {
42
+ let k;
43
+ effectScope(() => {
44
+ k = createKeyPress("a");
45
+ });
46
+ k[Symbol.dispose]();
47
+ window.dispatchEvent(new KeyboardEvent("keydown", { key: "a" }));
48
+ globalExpect(k.pressed()).toBe(false);
49
+ });
50
+ });
51
+ //#endregion
52
+ export {};
@@ -0,0 +1,19 @@
1
+ import { t as Computed } from "../../index-BtqiEEfc.mjs";
2
+
3
+ //#region src/signals/lib/list.d.ts
4
+ type ListResult<T> = {
5
+ items: Computed<readonly T[]>;
6
+ push(...items: T[]): void;
7
+ pop(): T | undefined;
8
+ remove(index: number): void;
9
+ filter(fn: (item: T, index: number) => boolean): void;
10
+ set(items: T[]): void;
11
+ clear(): void;
12
+ size: Computed<number>;
13
+ };
14
+ /**
15
+ * Reactive array with mutation helpers.
16
+ */
17
+ declare function createList<T>(initial?: T[]): ListResult<T>;
18
+ //#endregion
19
+ export { createList };
@@ -0,0 +1,36 @@
1
+ import { f as signal } from "../../signals-CLAPw8kk.mjs";
2
+ //#region src/signals/lib/list.ts
3
+ /**
4
+ * Reactive array with mutation helpers.
5
+ */
6
+ function createList(initial = []) {
7
+ const items = signal([...initial]);
8
+ const push = (...newItems) => items([...items(), ...newItems]);
9
+ const pop = () => {
10
+ const arr = [...items()];
11
+ const last = arr.pop();
12
+ items(arr);
13
+ return last;
14
+ };
15
+ const remove = (index) => {
16
+ const arr = [...items()];
17
+ arr.splice(index, 1);
18
+ items(arr);
19
+ };
20
+ const filter = (fn) => items(items().filter(fn));
21
+ const set = (next) => items([...next]);
22
+ const clear = () => items([]);
23
+ const size = () => items().length;
24
+ return {
25
+ items,
26
+ push,
27
+ pop,
28
+ remove,
29
+ filter,
30
+ set,
31
+ clear,
32
+ size
33
+ };
34
+ }
35
+ //#endregion
36
+ export { createList };
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,104 @@
1
+ import { o as effectScope } from "../../signals-CLAPw8kk.mjs";
2
+ import { a as describe, o as it, r as afterEach, t as globalExpect } from "../../test.BmQO5GaM-CR2qjV1t.mjs";
3
+ import { createList } from "./list.mjs";
4
+ //#region src/signals/lib/list.test.ts
5
+ afterEach(() => {
6
+ document.body.innerHTML = "";
7
+ });
8
+ describe("createList", () => {
9
+ it("starts empty by default", () => {
10
+ let l;
11
+ effectScope(() => {
12
+ l = createList();
13
+ });
14
+ globalExpect(l.items()).toEqual([]);
15
+ globalExpect(l.size()).toBe(0);
16
+ });
17
+ it("starts with initial items", () => {
18
+ let l;
19
+ effectScope(() => {
20
+ l = createList([
21
+ 1,
22
+ 2,
23
+ 3
24
+ ]);
25
+ });
26
+ globalExpect(l.items()).toEqual([
27
+ 1,
28
+ 2,
29
+ 3
30
+ ]);
31
+ });
32
+ it("push adds items", () => {
33
+ let l;
34
+ effectScope(() => {
35
+ l = createList();
36
+ });
37
+ l.push(1, 2);
38
+ globalExpect(l.items()).toEqual([1, 2]);
39
+ });
40
+ it("pop removes and returns the last item", () => {
41
+ let l;
42
+ effectScope(() => {
43
+ l = createList([
44
+ 1,
45
+ 2,
46
+ 3
47
+ ]);
48
+ });
49
+ globalExpect(l.pop()).toBe(3);
50
+ globalExpect(l.items()).toEqual([1, 2]);
51
+ });
52
+ it("remove removes by index", () => {
53
+ let l;
54
+ effectScope(() => {
55
+ l = createList([
56
+ 1,
57
+ 2,
58
+ 3
59
+ ]);
60
+ });
61
+ l.remove(1);
62
+ globalExpect(l.items()).toEqual([1, 3]);
63
+ });
64
+ it("filter keeps matching items", () => {
65
+ let l;
66
+ effectScope(() => {
67
+ l = createList([
68
+ 1,
69
+ 2,
70
+ 3,
71
+ 4
72
+ ]);
73
+ });
74
+ l.filter((n) => n % 2 === 0);
75
+ globalExpect(l.items()).toEqual([2, 4]);
76
+ });
77
+ it("set replaces all items", () => {
78
+ let l;
79
+ effectScope(() => {
80
+ l = createList([
81
+ 1,
82
+ 2,
83
+ 3
84
+ ]);
85
+ });
86
+ l.set([10, 20]);
87
+ globalExpect(l.items()).toEqual([10, 20]);
88
+ });
89
+ it("clear empties the list", () => {
90
+ let l;
91
+ effectScope(() => {
92
+ l = createList([
93
+ 1,
94
+ 2,
95
+ 3
96
+ ]);
97
+ });
98
+ l.clear();
99
+ globalExpect(l.items()).toEqual([]);
100
+ globalExpect(l.size()).toBe(0);
101
+ });
102
+ });
103
+ //#endregion
104
+ export {};
@@ -0,0 +1,8 @@
1
+ //#region src/signals/lib/lock-body-scroll.d.ts
2
+ /**
3
+ * Prevents the document body from scrolling while the returned scope is
4
+ * active. Restores the original `overflow` value on cleanup.
5
+ */
6
+ declare function createLockBodyScroll(): Disposable;
7
+ //#endregion
8
+ export { createLockBodyScroll };
@@ -0,0 +1,17 @@
1
+ import { d as onCleanup } from "../../signals-CLAPw8kk.mjs";
2
+ //#region src/signals/lib/lock-body-scroll.ts
3
+ /**
4
+ * Prevents the document body from scrolling while the returned scope is
5
+ * active. Restores the original `overflow` value on cleanup.
6
+ */
7
+ function createLockBodyScroll() {
8
+ const original = document.body.style.overflow;
9
+ document.body.style.overflow = "hidden";
10
+ const cleanup = () => {
11
+ document.body.style.overflow = original;
12
+ };
13
+ onCleanup(cleanup);
14
+ return { [Symbol.dispose]: cleanup };
15
+ }
16
+ //#endregion
17
+ export { createLockBodyScroll };
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,37 @@
1
+ import { o as effectScope } from "../../signals-CLAPw8kk.mjs";
2
+ import { a as describe, o as it, r as afterEach, t as globalExpect } from "../../test.BmQO5GaM-CR2qjV1t.mjs";
3
+ import { createLockBodyScroll } from "./lock-body-scroll.mjs";
4
+ //#region src/signals/lib/lock-body-scroll.test.ts
5
+ afterEach(() => {
6
+ document.body.innerHTML = "";
7
+ document.body.style.overflow = "";
8
+ });
9
+ describe("createLockBodyScroll", () => {
10
+ it("sets body overflow to hidden", () => {
11
+ effectScope(() => {
12
+ createLockBodyScroll();
13
+ });
14
+ globalExpect(document.body.style.overflow).toBe("hidden");
15
+ });
16
+ it("restores original overflow on Symbol.dispose", () => {
17
+ document.body.style.overflow = "scroll";
18
+ let lock;
19
+ effectScope(() => {
20
+ lock = createLockBodyScroll();
21
+ });
22
+ globalExpect(document.body.style.overflow).toBe("hidden");
23
+ lock[Symbol.dispose]();
24
+ globalExpect(document.body.style.overflow).toBe("scroll");
25
+ });
26
+ it("restores empty overflow when no prior style", () => {
27
+ document.body.style.overflow = "";
28
+ let lock;
29
+ effectScope(() => {
30
+ lock = createLockBodyScroll();
31
+ });
32
+ lock[Symbol.dispose]();
33
+ globalExpect(document.body.style.overflow).toBe("");
34
+ });
35
+ });
36
+ //#endregion
37
+ export {};
@@ -0,0 +1,10 @@
1
+ //#region src/signals/lib/long-press.d.ts
2
+ /**
3
+ * Fires `handler` when a pointer is held over `target` for at least `delay`
4
+ * milliseconds (default: 500 ms).
5
+ */
6
+ declare function createLongPress(target: Element | (() => Element | null), handler: (e: PointerEvent) => void, options?: {
7
+ delay?: number;
8
+ }): Disposable;
9
+ //#endregion
10
+ export { createLongPress };
@@ -0,0 +1,29 @@
1
+ import { createEventListener } from "./event-listener.mjs";
2
+ //#region src/signals/lib/long-press.ts
3
+ /**
4
+ * Fires `handler` when a pointer is held over `target` for at least `delay`
5
+ * milliseconds (default: 500 ms).
6
+ */
7
+ function createLongPress(target, handler, options = {}) {
8
+ const { delay = 500 } = options;
9
+ const el = typeof target === "function" ? target() : target;
10
+ let timer;
11
+ const onPointerDown = (e) => {
12
+ timer = setTimeout(() => handler(e), delay);
13
+ };
14
+ const cancel = () => clearTimeout(timer);
15
+ const cleanups = [];
16
+ if (el) {
17
+ cleanups.push(createEventListener(el, "pointerdown", onPointerDown));
18
+ cleanups.push(createEventListener(el, "pointerup", cancel));
19
+ cleanups.push(createEventListener(el, "pointerleave", cancel));
20
+ cleanups.push(createEventListener(el, "pointermove", cancel));
21
+ }
22
+ const cleanup = () => {
23
+ clearTimeout(timer);
24
+ cleanups.forEach((fn) => fn());
25
+ };
26
+ return { [Symbol.dispose]: cleanup };
27
+ }
28
+ //#endregion
29
+ export { createLongPress };
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,52 @@
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 { createLongPress } from "./long-press.mjs";
4
+ //#region src/signals/lib/long-press.test.ts
5
+ afterEach(() => {
6
+ document.body.innerHTML = "";
7
+ vi.useRealTimers();
8
+ });
9
+ describe("createLongPress", () => {
10
+ it("does not fire handler on short press", () => {
11
+ vi.useFakeTimers();
12
+ const el = document.createElement("button");
13
+ document.body.appendChild(el);
14
+ const handler = vi.fn();
15
+ effectScope(() => {
16
+ createLongPress(el, handler, { delay: 500 });
17
+ });
18
+ el.dispatchEvent(new PointerEvent("pointerdown"));
19
+ vi.advanceTimersByTime(200);
20
+ el.dispatchEvent(new PointerEvent("pointerup"));
21
+ vi.advanceTimersByTime(500);
22
+ globalExpect(handler).not.toHaveBeenCalled();
23
+ });
24
+ it("fires handler after delay", () => {
25
+ vi.useFakeTimers();
26
+ const el = document.createElement("button");
27
+ document.body.appendChild(el);
28
+ const handler = vi.fn();
29
+ effectScope(() => {
30
+ createLongPress(el, handler, { delay: 500 });
31
+ });
32
+ el.dispatchEvent(new PointerEvent("pointerdown"));
33
+ vi.advanceTimersByTime(600);
34
+ globalExpect(handler).toHaveBeenCalledOnce();
35
+ });
36
+ it("cancels when pointer moves", () => {
37
+ vi.useFakeTimers();
38
+ const el = document.createElement("button");
39
+ document.body.appendChild(el);
40
+ const handler = vi.fn();
41
+ effectScope(() => {
42
+ createLongPress(el, handler, { delay: 500 });
43
+ });
44
+ el.dispatchEvent(new PointerEvent("pointerdown"));
45
+ vi.advanceTimersByTime(200);
46
+ el.dispatchEvent(new PointerEvent("pointermove"));
47
+ vi.advanceTimersByTime(500);
48
+ globalExpect(handler).not.toHaveBeenCalled();
49
+ });
50
+ });
51
+ //#endregion
52
+ export {};
@@ -0,0 +1,18 @@
1
+ import { t as Computed } from "../../index-BtqiEEfc.mjs";
2
+
3
+ //#region src/signals/lib/map.d.ts
4
+ type ReactiveMapResult<K, V> = {
5
+ entries: Computed<ReadonlyMap<K, V>>;
6
+ get(key: K): V | undefined;
7
+ set(key: K, value: V): void;
8
+ delete(key: K): void;
9
+ has(key: K): boolean;
10
+ clear(): void;
11
+ size: Computed<number>;
12
+ };
13
+ /**
14
+ * Reactive `Map` with mutation helpers.
15
+ */
16
+ declare function createMap<K, V>(initial?: Map<K, V>): ReactiveMapResult<K, V>;
17
+ //#endregion
18
+ export { createMap };
@@ -0,0 +1,33 @@
1
+ import { f as signal } from "../../signals-CLAPw8kk.mjs";
2
+ //#region src/signals/lib/map.ts
3
+ /**
4
+ * Reactive `Map` with mutation helpers.
5
+ */
6
+ function createMap(initial) {
7
+ const s = signal(new Map(initial));
8
+ const get = (key) => s().get(key);
9
+ const set = (key, value) => {
10
+ const next = new Map(s());
11
+ next.set(key, value);
12
+ s(next);
13
+ };
14
+ const del = (key) => {
15
+ const next = new Map(s());
16
+ next.delete(key);
17
+ s(next);
18
+ };
19
+ const has = (key) => s().has(key);
20
+ const clear = () => s(/* @__PURE__ */ new Map());
21
+ const size = () => s().size;
22
+ return {
23
+ entries: s,
24
+ get,
25
+ set,
26
+ delete: del,
27
+ has,
28
+ clear,
29
+ size
30
+ };
31
+ }
32
+ //#endregion
33
+ export { createMap };
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,60 @@
1
+ import { o as effectScope } from "../../signals-CLAPw8kk.mjs";
2
+ import { a as describe, o as it, r as afterEach, t as globalExpect } from "../../test.BmQO5GaM-CR2qjV1t.mjs";
3
+ import { createMap } from "./map.mjs";
4
+ //#region src/signals/lib/map.test.ts
5
+ afterEach(() => {
6
+ document.body.innerHTML = "";
7
+ });
8
+ describe("createMap", () => {
9
+ it("starts empty by default", () => {
10
+ let m;
11
+ effectScope(() => {
12
+ m = createMap();
13
+ });
14
+ globalExpect(m.entries().size).toBe(0);
15
+ globalExpect(m.size()).toBe(0);
16
+ });
17
+ it("initializes from a Map", () => {
18
+ let m;
19
+ effectScope(() => {
20
+ m = createMap(new Map([["a", 1]]));
21
+ });
22
+ globalExpect(m.get("a")).toBe(1);
23
+ });
24
+ it("set adds an entry", () => {
25
+ let m;
26
+ effectScope(() => {
27
+ m = createMap();
28
+ });
29
+ m.set("x", 42);
30
+ globalExpect(m.get("x")).toBe(42);
31
+ globalExpect(m.size()).toBe(1);
32
+ });
33
+ it("delete removes an entry", () => {
34
+ let m;
35
+ effectScope(() => {
36
+ m = createMap(new Map([["a", 1], ["b", 2]]));
37
+ });
38
+ m.delete("a");
39
+ globalExpect(m.has("a")).toBe(false);
40
+ globalExpect(m.size()).toBe(1);
41
+ });
42
+ it("has returns correct boolean", () => {
43
+ let m;
44
+ effectScope(() => {
45
+ m = createMap(new Map([["a", 1]]));
46
+ });
47
+ globalExpect(m.has("a")).toBe(true);
48
+ globalExpect(m.has("z")).toBe(false);
49
+ });
50
+ it("clear empties the map", () => {
51
+ let m;
52
+ effectScope(() => {
53
+ m = createMap(new Map([["a", 1], ["b", 2]]));
54
+ });
55
+ m.clear();
56
+ globalExpect(m.size()).toBe(0);
57
+ });
58
+ });
59
+ //#endregion
60
+ export {};
@@ -0,0 +1,10 @@
1
+ import { t as Computed } from "../../index-BtqiEEfc.mjs";
2
+
3
+ //#region src/signals/lib/media-devices.d.ts
4
+ /**
5
+ * Returns a reactive list of available media devices, refreshed whenever
6
+ * devices are added or removed.
7
+ */
8
+ declare function createMediaDevices(): Computed<MediaDeviceInfo[]> & Disposable;
9
+ //#endregion
10
+ export { createMediaDevices };
@@ -0,0 +1,18 @@
1
+ import { f as signal } from "../../signals-CLAPw8kk.mjs";
2
+ import { createEventListener } from "./event-listener.mjs";
3
+ //#region src/signals/lib/media-devices.ts
4
+ /**
5
+ * Returns a reactive list of available media devices, refreshed whenever
6
+ * devices are added or removed.
7
+ */
8
+ function createMediaDevices() {
9
+ const devices = signal([]);
10
+ const refresh = () => {
11
+ navigator.mediaDevices.enumerateDevices().then((list) => devices(list));
12
+ };
13
+ refresh();
14
+ const cleanup = createEventListener(navigator.mediaDevices, "devicechange", refresh);
15
+ return Object.assign(devices, { [Symbol.dispose]: cleanup });
16
+ }
17
+ //#endregion
18
+ export { createMediaDevices };
@@ -0,0 +1 @@
1
+ export { };