elements-kit 0.0.8 → 0.0.9

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 (258) 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 +20 -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 +26 -0
  22. package/dist/signals/lib/audio.mjs +60 -0
  23. package/dist/signals/lib/audio.test.d.mts +1 -0
  24. package/dist/signals/lib/audio.test.mjs +54 -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-listener.d.mts +14 -0
  58. package/dist/signals/lib/event-listener.mjs +28 -0
  59. package/dist/signals/lib/event-listener.test.d.mts +1 -0
  60. package/dist/signals/lib/event-listener.test.mjs +58 -0
  61. package/dist/signals/lib/favicon.d.mts +10 -0
  62. package/dist/signals/lib/favicon.mjs +24 -0
  63. package/dist/signals/lib/favicon.test.d.mts +1 -0
  64. package/dist/signals/lib/favicon.test.mjs +28 -0
  65. package/dist/signals/lib/finite-state-machine.d.mts +22 -0
  66. package/dist/signals/lib/finite-state-machine.mjs +26 -0
  67. package/dist/signals/lib/finite-state-machine.test.d.mts +1 -0
  68. package/dist/signals/lib/finite-state-machine.test.mjs +66 -0
  69. package/dist/signals/lib/fullscreen.d.mts +15 -0
  70. package/dist/signals/lib/fullscreen.mjs +26 -0
  71. package/dist/signals/lib/fullscreen.test.d.mts +1 -0
  72. package/dist/signals/lib/fullscreen.test.mjs +56 -0
  73. package/dist/signals/lib/geolocation.d.mts +15 -0
  74. package/dist/signals/lib/geolocation.mjs +30 -0
  75. package/dist/signals/lib/geolocation.test.d.mts +1 -0
  76. package/dist/signals/lib/geolocation.test.mjs +37 -0
  77. package/dist/signals/lib/hash.d.mts +10 -0
  78. package/dist/signals/lib/hash.mjs +20 -0
  79. package/dist/signals/lib/hash.test.d.mts +1 -0
  80. package/dist/signals/lib/hash.test.mjs +47 -0
  81. package/dist/signals/lib/hover.d.mts +11 -0
  82. package/dist/signals/lib/hover.mjs +23 -0
  83. package/dist/signals/lib/hover.test.d.mts +1 -0
  84. package/dist/signals/lib/hover.test.mjs +63 -0
  85. package/dist/signals/lib/intersection-observer.d.mts +8 -0
  86. package/dist/signals/lib/intersection-observer.mjs +16 -0
  87. package/dist/signals/lib/intersection-observer.test.d.mts +1 -0
  88. package/dist/signals/lib/intersection-observer.test.mjs +44 -0
  89. package/dist/signals/lib/interval.d.mts +18 -0
  90. package/dist/signals/lib/interval.mjs +38 -0
  91. package/dist/signals/lib/interval.test.d.mts +1 -0
  92. package/dist/signals/lib/interval.test.mjs +68 -0
  93. package/dist/signals/lib/is-document-visible.d.mts +11 -0
  94. package/dist/signals/lib/is-document-visible.mjs +19 -0
  95. package/dist/signals/lib/is-document-visible.test.d.mts +1 -0
  96. package/dist/signals/lib/is-document-visible.test.mjs +58 -0
  97. package/dist/signals/lib/is-focus-within.d.mts +10 -0
  98. package/dist/signals/lib/is-focus-within.mjs +28 -0
  99. package/dist/signals/lib/is-focus-within.test.d.mts +1 -0
  100. package/dist/signals/lib/is-focus-within.test.mjs +50 -0
  101. package/dist/signals/lib/is-idle.d.mts +10 -0
  102. package/dist/signals/lib/is-idle.mjs +37 -0
  103. package/dist/signals/lib/is-idle.test.d.mts +1 -0
  104. package/dist/signals/lib/is-idle.test.mjs +50 -0
  105. package/dist/signals/lib/is-in-viewport.d.mts +10 -0
  106. package/dist/signals/lib/is-in-viewport.mjs +16 -0
  107. package/dist/signals/lib/is-in-viewport.test.d.mts +1 -0
  108. package/dist/signals/lib/is-in-viewport.test.mjs +74 -0
  109. package/dist/signals/lib/key-press.d.mts +13 -0
  110. package/dist/signals/lib/key-press.mjs +25 -0
  111. package/dist/signals/lib/key-press.test.d.mts +1 -0
  112. package/dist/signals/lib/key-press.test.mjs +52 -0
  113. package/dist/signals/lib/list.d.mts +19 -0
  114. package/dist/signals/lib/list.mjs +36 -0
  115. package/dist/signals/lib/list.test.d.mts +1 -0
  116. package/dist/signals/lib/list.test.mjs +104 -0
  117. package/dist/signals/lib/lock-body-scroll.d.mts +8 -0
  118. package/dist/signals/lib/lock-body-scroll.mjs +17 -0
  119. package/dist/signals/lib/lock-body-scroll.test.d.mts +1 -0
  120. package/dist/signals/lib/lock-body-scroll.test.mjs +37 -0
  121. package/dist/signals/lib/long-press.d.mts +10 -0
  122. package/dist/signals/lib/long-press.mjs +29 -0
  123. package/dist/signals/lib/long-press.test.d.mts +1 -0
  124. package/dist/signals/lib/long-press.test.mjs +52 -0
  125. package/dist/signals/lib/map.d.mts +18 -0
  126. package/dist/signals/lib/map.mjs +33 -0
  127. package/dist/signals/lib/map.test.d.mts +1 -0
  128. package/dist/signals/lib/map.test.mjs +60 -0
  129. package/dist/signals/lib/media-devices.d.mts +10 -0
  130. package/dist/signals/lib/media-devices.mjs +18 -0
  131. package/dist/signals/lib/media-devices.test.d.mts +1 -0
  132. package/dist/signals/lib/media-devices.test.mjs +44 -0
  133. package/dist/signals/lib/media.d.mts +1 -1
  134. package/dist/signals/lib/motion.d.mts +15 -0
  135. package/dist/signals/lib/motion.mjs +27 -0
  136. package/dist/signals/lib/motion.test.d.mts +1 -0
  137. package/dist/signals/lib/motion.test.mjs +51 -0
  138. package/dist/signals/lib/mouse-position.d.mts +14 -0
  139. package/dist/signals/lib/mouse-position.mjs +22 -0
  140. package/dist/signals/lib/mouse-position.test.d.mts +1 -0
  141. package/dist/signals/lib/mouse-position.test.mjs +44 -0
  142. package/dist/signals/lib/mouse-wheel.d.mts +10 -0
  143. package/dist/signals/lib/mouse-wheel.mjs +17 -0
  144. package/dist/signals/lib/mouse-wheel.test.d.mts +1 -0
  145. package/dist/signals/lib/mouse-wheel.test.mjs +38 -0
  146. package/dist/signals/lib/mutation-observer.d.mts +8 -0
  147. package/dist/signals/lib/mutation-observer.mjs +16 -0
  148. package/dist/signals/lib/mutation-observer.test.d.mts +1 -0
  149. package/dist/signals/lib/mutation-observer.test.mjs +46 -0
  150. package/dist/signals/lib/network-state.d.mts +17 -0
  151. package/dist/signals/lib/network-state.mjs +34 -0
  152. package/dist/signals/lib/network-state.test.d.mts +1 -0
  153. package/dist/signals/lib/network-state.test.mjs +61 -0
  154. package/dist/signals/lib/on-click-outside.d.mts +11 -0
  155. package/dist/signals/lib/on-click-outside.mjs +20 -0
  156. package/dist/signals/lib/on-click-outside.test.d.mts +1 -0
  157. package/dist/signals/lib/on-click-outside.test.mjs +54 -0
  158. package/dist/signals/lib/orientation.d.mts +13 -0
  159. package/dist/signals/lib/orientation.mjs +21 -0
  160. package/dist/signals/lib/orientation.test.d.mts +1 -0
  161. package/dist/signals/lib/orientation.test.mjs +43 -0
  162. package/dist/signals/lib/page-leave.d.mts +8 -0
  163. package/dist/signals/lib/page-leave.mjs +12 -0
  164. package/dist/signals/lib/page-leave.test.d.mts +1 -0
  165. package/dist/signals/lib/page-leave.test.mjs +29 -0
  166. package/dist/signals/lib/permission.d.mts +14 -0
  167. package/dist/signals/lib/permission.mjs +26 -0
  168. package/dist/signals/lib/permission.test.d.mts +1 -0
  169. package/dist/signals/lib/permission.test.mjs +50 -0
  170. package/dist/signals/lib/persisted-state.d.mts +11 -0
  171. package/dist/signals/lib/persisted-state.mjs +25 -0
  172. package/dist/signals/lib/persisted-state.test.d.mts +1 -0
  173. package/dist/signals/lib/persisted-state.test.mjs +70 -0
  174. package/dist/signals/lib/pressed-keys.d.mts +10 -0
  175. package/dist/signals/lib/pressed-keys.mjs +32 -0
  176. package/dist/signals/lib/pressed-keys.test.d.mts +1 -0
  177. package/dist/signals/lib/pressed-keys.test.mjs +54 -0
  178. package/dist/signals/lib/previous-distinct.d.mts +10 -0
  179. package/dist/signals/lib/previous-distinct.mjs +22 -0
  180. package/dist/signals/lib/previous-distinct.test.d.mts +1 -0
  181. package/dist/signals/lib/previous-distinct.test.mjs +50 -0
  182. package/dist/signals/lib/previous.d.mts +10 -0
  183. package/dist/signals/lib/previous.mjs +18 -0
  184. package/dist/signals/lib/previous.test.d.mts +1 -0
  185. package/dist/signals/lib/previous.test.mjs +47 -0
  186. package/dist/signals/lib/queue.d.mts +17 -0
  187. package/dist/signals/lib/queue.mjs +28 -0
  188. package/dist/signals/lib/queue.test.d.mts +1 -0
  189. package/dist/signals/lib/queue.test.mjs +61 -0
  190. package/dist/signals/lib/raf.d.mts +17 -0
  191. package/dist/signals/lib/raf.mjs +38 -0
  192. package/dist/signals/lib/raf.test.d.mts +1 -0
  193. package/dist/signals/lib/raf.test.mjs +58 -0
  194. package/dist/signals/lib/react.d.mts +1 -1
  195. package/dist/signals/lib/resize-observer.d.mts +8 -0
  196. package/dist/signals/lib/resize-observer.mjs +16 -0
  197. package/dist/signals/lib/resize-observer.test.d.mts +1 -0
  198. package/dist/signals/lib/resize-observer.test.mjs +44 -0
  199. package/dist/signals/lib/resource.d.mts +23 -0
  200. package/dist/signals/lib/resource.mjs +43 -0
  201. package/dist/signals/lib/resource.test.d.mts +1 -0
  202. package/dist/signals/lib/resource.test.mjs +56 -0
  203. package/dist/signals/lib/scroll-state.d.mts +19 -0
  204. package/dist/signals/lib/scroll-state.mjs +46 -0
  205. package/dist/signals/lib/scroll-state.test.d.mts +1 -0
  206. package/dist/signals/lib/scroll-state.test.mjs +94 -0
  207. package/dist/signals/lib/scrolling.d.mts +12 -0
  208. package/dist/signals/lib/scrolling.mjs +26 -0
  209. package/dist/signals/lib/scrolling.test.d.mts +1 -0
  210. package/dist/signals/lib/scrolling.test.mjs +57 -0
  211. package/dist/signals/lib/search-params.d.mts +16 -0
  212. package/dist/signals/lib/search-params.mjs +37 -0
  213. package/dist/signals/lib/search-params.test.d.mts +1 -0
  214. package/dist/signals/lib/search-params.test.mjs +56 -0
  215. package/dist/signals/lib/set.d.mts +18 -0
  216. package/dist/signals/lib/set.mjs +38 -0
  217. package/dist/signals/lib/set.test.d.mts +1 -0
  218. package/dist/signals/lib/set.test.mjs +70 -0
  219. package/dist/signals/lib/start-typing.d.mts +9 -0
  220. package/dist/signals/lib/start-typing.mjs +39 -0
  221. package/dist/signals/lib/start-typing.test.d.mts +1 -0
  222. package/dist/signals/lib/start-typing.test.mjs +64 -0
  223. package/dist/signals/lib/state-history.d.mts +21 -0
  224. package/dist/signals/lib/state-history.mjs +61 -0
  225. package/dist/signals/lib/state-history.test.d.mts +1 -0
  226. package/dist/signals/lib/state-history.test.mjs +106 -0
  227. package/dist/signals/lib/state-validator.d.mts +16 -0
  228. package/dist/signals/lib/state-validator.mjs +21 -0
  229. package/dist/signals/lib/state-validator.test.d.mts +1 -0
  230. package/dist/signals/lib/state-validator.test.mjs +41 -0
  231. package/dist/signals/lib/throttled.d.mts +13 -0
  232. package/dist/signals/lib/throttled.mjs +45 -0
  233. package/dist/signals/lib/throttled.test.d.mts +1 -0
  234. package/dist/signals/lib/throttled.test.mjs +56 -0
  235. package/dist/signals/lib/timeout.d.mts +16 -0
  236. package/dist/signals/lib/timeout.mjs +39 -0
  237. package/dist/signals/lib/timeout.test.d.mts +1 -0
  238. package/dist/signals/lib/timeout.test.mjs +64 -0
  239. package/dist/signals/lib/toggle.d.mts +12 -0
  240. package/dist/signals/lib/toggle.mjs +12 -0
  241. package/dist/signals/lib/toggle.test.d.mts +1 -0
  242. package/dist/signals/lib/toggle.test.mjs +43 -0
  243. package/dist/signals/lib/video.d.mts +25 -0
  244. package/dist/signals/lib/video.mjs +59 -0
  245. package/dist/signals/lib/video.test.d.mts +1 -0
  246. package/dist/signals/lib/video.test.mjs +51 -0
  247. package/dist/signals/lib/watch.d.mts +16 -0
  248. package/dist/signals/lib/watch.mjs +31 -0
  249. package/dist/signals/lib/watch.test.d.mts +1 -0
  250. package/dist/signals/lib/watch.test.mjs +51 -0
  251. package/dist/signals/lib/window-size.d.mts +14 -0
  252. package/dist/signals/lib/window-size.mjs +22 -0
  253. package/dist/signals/lib/window-size.test.d.mts +1 -0
  254. package/dist/signals/lib/window-size.test.mjs +50 -0
  255. package/dist/slot.d.mts +1 -1
  256. package/dist/test.BmQO5GaM-CR2qjV1t.mjs +13314 -0
  257. package/package.json +1 -1
  258. /package/dist/{polyfill-BW_B2r6i.d.mts → polyfill-AFIi9kAN.d.mts} +0 -0
@@ -0,0 +1,15 @@
1
+ import { t as Computed } from "../../index-BtqiEEfc.mjs";
2
+
3
+ //#region src/signals/lib/clipboard.d.ts
4
+ type ClipboardResult = {
5
+ copied: Computed<boolean>;
6
+ value: Computed<string | null>;
7
+ copy(text: string): Promise<void>;
8
+ };
9
+ /**
10
+ * Provides a `copy(text)` helper that writes to the clipboard.
11
+ * `copied` is `true` for 1 500 ms after a successful copy.
12
+ */
13
+ declare function createClipboard(resetDelay?: number): ClipboardResult;
14
+ //#endregion
15
+ export { createClipboard };
@@ -0,0 +1,25 @@
1
+ import { f as signal } from "../../signals-CLAPw8kk.mjs";
2
+ //#region src/signals/lib/clipboard.ts
3
+ /**
4
+ * Provides a `copy(text)` helper that writes to the clipboard.
5
+ * `copied` is `true` for 1 500 ms after a successful copy.
6
+ */
7
+ function createClipboard(resetDelay = 1500) {
8
+ const copied = signal(false);
9
+ const value = signal(null);
10
+ let timer;
11
+ const copy = async (text) => {
12
+ await navigator.clipboard.writeText(text);
13
+ clearTimeout(timer);
14
+ value(text);
15
+ copied(true);
16
+ timer = setTimeout(() => copied(false), resetDelay);
17
+ };
18
+ return {
19
+ copied,
20
+ value,
21
+ copy
22
+ };
23
+ }
24
+ //#endregion
25
+ export { createClipboard };
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,53 @@
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 { createClipboard } from "./clipboard.mjs";
4
+ //#region src/signals/lib/clipboard.test.ts
5
+ afterEach(() => {
6
+ document.body.innerHTML = "";
7
+ vi.useRealTimers();
8
+ vi.unstubAllGlobals();
9
+ });
10
+ describe("createClipboard", () => {
11
+ it("starts as not copied", () => {
12
+ vi.stubGlobal("navigator", {
13
+ ...navigator,
14
+ clipboard: { writeText: vi.fn().mockResolvedValue(void 0) }
15
+ });
16
+ let cb;
17
+ effectScope(() => {
18
+ cb = createClipboard();
19
+ });
20
+ globalExpect(cb.copied()).toBe(false);
21
+ globalExpect(cb.value()).toBeNull();
22
+ });
23
+ it("sets copied and value after copy()", async () => {
24
+ vi.useFakeTimers();
25
+ vi.stubGlobal("navigator", {
26
+ ...navigator,
27
+ clipboard: { writeText: vi.fn().mockResolvedValue(void 0) }
28
+ });
29
+ let cb;
30
+ effectScope(() => {
31
+ cb = createClipboard();
32
+ });
33
+ await cb.copy("hello");
34
+ globalExpect(cb.copied()).toBe(true);
35
+ globalExpect(cb.value()).toBe("hello");
36
+ });
37
+ it("resets copied after resetDelay", async () => {
38
+ vi.useFakeTimers();
39
+ vi.stubGlobal("navigator", {
40
+ ...navigator,
41
+ clipboard: { writeText: vi.fn().mockResolvedValue(void 0) }
42
+ });
43
+ let cb;
44
+ effectScope(() => {
45
+ cb = createClipboard(500);
46
+ });
47
+ await cb.copy("text");
48
+ vi.advanceTimersByTime(600);
49
+ globalExpect(cb.copied()).toBe(false);
50
+ });
51
+ });
52
+ //#endregion
53
+ export {};
@@ -0,0 +1,18 @@
1
+ import { n as Signal } from "../../index-BtqiEEfc.mjs";
2
+
3
+ //#region src/signals/lib/counter.d.ts
4
+ type CounterResult = Signal<number> & {
5
+ increment(step?: number): void;
6
+ decrement(step?: number): void;
7
+ reset(): void;
8
+ };
9
+ /**
10
+ * Returns a numeric `Signal` with `increment`, `decrement`, and `reset`
11
+ * helpers. Optionally clamp to `[min, max]`.
12
+ */
13
+ declare function createCounter(initial?: number, options?: {
14
+ min?: number;
15
+ max?: number;
16
+ }): CounterResult;
17
+ //#endregion
18
+ export { createCounter };
@@ -0,0 +1,21 @@
1
+ import { f as signal } from "../../signals-CLAPw8kk.mjs";
2
+ //#region src/signals/lib/counter.ts
3
+ /**
4
+ * Returns a numeric `Signal` with `increment`, `decrement`, and `reset`
5
+ * helpers. Optionally clamp to `[min, max]`.
6
+ */
7
+ function createCounter(initial = 0, options) {
8
+ const { min = -Infinity, max = Infinity } = options ?? {};
9
+ const clamp = (v) => Math.min(max, Math.max(min, v));
10
+ const s = signal(clamp(initial));
11
+ const increment = (step = 1) => s(clamp(s() + step));
12
+ const decrement = (step = 1) => s(clamp(s() - step));
13
+ const reset = () => s(clamp(initial));
14
+ return Object.assign(s, {
15
+ increment,
16
+ decrement,
17
+ reset
18
+ });
19
+ }
20
+ //#endregion
21
+ export { createCounter };
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,74 @@
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 { createCounter } from "./counter.mjs";
4
+ //#region src/signals/lib/counter.test.ts
5
+ afterEach(() => {
6
+ document.body.innerHTML = "";
7
+ });
8
+ describe("createCounter", () => {
9
+ it("starts at 0 by default", () => {
10
+ let c;
11
+ effectScope(() => {
12
+ c = createCounter();
13
+ });
14
+ globalExpect(c()).toBe(0);
15
+ });
16
+ it("starts at a provided initial value", () => {
17
+ let c;
18
+ effectScope(() => {
19
+ c = createCounter(10);
20
+ });
21
+ globalExpect(c()).toBe(10);
22
+ });
23
+ it("increments by 1", () => {
24
+ let c;
25
+ effectScope(() => {
26
+ c = createCounter(0);
27
+ });
28
+ c.increment();
29
+ globalExpect(c()).toBe(1);
30
+ });
31
+ it("increments by step", () => {
32
+ let c;
33
+ effectScope(() => {
34
+ c = createCounter(0);
35
+ });
36
+ c.increment(5);
37
+ globalExpect(c()).toBe(5);
38
+ });
39
+ it("decrements by 1", () => {
40
+ let c;
41
+ effectScope(() => {
42
+ c = createCounter(5);
43
+ });
44
+ c.decrement();
45
+ globalExpect(c()).toBe(4);
46
+ });
47
+ it("resets to initial value", () => {
48
+ let c;
49
+ effectScope(() => {
50
+ c = createCounter(3);
51
+ });
52
+ c.increment(10);
53
+ c.reset();
54
+ globalExpect(c()).toBe(3);
55
+ });
56
+ it("clamps to max", () => {
57
+ let c;
58
+ effectScope(() => {
59
+ c = createCounter(0, { max: 5 });
60
+ });
61
+ c.increment(100);
62
+ globalExpect(c()).toBe(5);
63
+ });
64
+ it("clamps to min", () => {
65
+ let c;
66
+ effectScope(() => {
67
+ c = createCounter(0, { min: -3 });
68
+ });
69
+ c.decrement(100);
70
+ globalExpect(c()).toBe(-3);
71
+ });
72
+ });
73
+ //#endregion
74
+ export {};
@@ -0,0 +1,12 @@
1
+ import { t as Computed } from "../../index-BtqiEEfc.mjs";
2
+
3
+ //#region src/signals/lib/debounced.d.ts
4
+ /**
5
+ * Returns a `Computed` that mirrors `getter` but only updates after `delay`
6
+ * milliseconds of silence (i.e. no new values from `getter`).
7
+ *
8
+ * The initial value is read synchronously, so the computed is never undefined.
9
+ */
10
+ declare function createDebounced<T>(getter: () => T, delay: number): Computed<T>;
11
+ //#endregion
12
+ export { createDebounced };
@@ -0,0 +1,20 @@
1
+ import { a as effect, d as onCleanup, f as signal } from "../../signals-CLAPw8kk.mjs";
2
+ //#region src/signals/lib/debounced.ts
3
+ /**
4
+ * Returns a `Computed` that mirrors `getter` but only updates after `delay`
5
+ * milliseconds of silence (i.e. no new values from `getter`).
6
+ *
7
+ * The initial value is read synchronously, so the computed is never undefined.
8
+ */
9
+ function createDebounced(getter, delay) {
10
+ const s = signal(getter());
11
+ let timer;
12
+ effect(() => {
13
+ const latest = getter();
14
+ timer = setTimeout(() => s(latest), delay);
15
+ onCleanup(() => clearTimeout(timer));
16
+ });
17
+ return s;
18
+ }
19
+ //#endregion
20
+ export { createDebounced };
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,66 @@
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";
3
+ import { createDebounced } from "./debounced.mjs";
4
+ //#region src/signals/lib/debounced.test.ts
5
+ beforeEach(() => {
6
+ vi.useFakeTimers();
7
+ });
8
+ afterEach(() => {
9
+ vi.useRealTimers();
10
+ });
11
+ describe("createDebounced", () => {
12
+ it("returns the initial value synchronously", () => {
13
+ const s = signal(42);
14
+ let d;
15
+ effectScope(() => {
16
+ d = createDebounced(() => s(), 100);
17
+ });
18
+ globalExpect(d()).toBe(42);
19
+ });
20
+ it("does not update before the delay elapses", () => {
21
+ const s = signal(0);
22
+ let d;
23
+ effectScope(() => {
24
+ d = createDebounced(() => s(), 100);
25
+ });
26
+ s(1);
27
+ vi.advanceTimersByTime(50);
28
+ globalExpect(d()).toBe(0);
29
+ });
30
+ it("updates after the delay elapses", () => {
31
+ const s = signal(0);
32
+ let d;
33
+ effectScope(() => {
34
+ d = createDebounced(() => s(), 100);
35
+ });
36
+ s(1);
37
+ vi.advanceTimersByTime(100);
38
+ globalExpect(d()).toBe(1);
39
+ });
40
+ it("resets the timer on each rapid change", () => {
41
+ const s = signal(0);
42
+ let d;
43
+ effectScope(() => {
44
+ d = createDebounced(() => s(), 100);
45
+ });
46
+ s(1);
47
+ vi.advanceTimersByTime(50);
48
+ s(2);
49
+ vi.advanceTimersByTime(50);
50
+ globalExpect(d()).toBe(0);
51
+ vi.advanceTimersByTime(50);
52
+ globalExpect(d()).toBe(2);
53
+ });
54
+ it("stops updating after scope disposal", () => {
55
+ const s = signal(0);
56
+ let d;
57
+ effectScope(() => {
58
+ d = createDebounced(() => s(), 100);
59
+ })();
60
+ s(99);
61
+ vi.advanceTimersByTime(200);
62
+ globalExpect(d()).toBe(0);
63
+ });
64
+ });
65
+ //#endregion
66
+ export {};
@@ -0,0 +1,10 @@
1
+ import { n as Signal } from "../../index-BtqiEEfc.mjs";
2
+
3
+ //#region src/signals/lib/document-title.d.ts
4
+ /**
5
+ * Returns a writable `Signal<string>` synced to `document.title`.
6
+ * Writing the signal immediately updates the browser tab title.
7
+ */
8
+ declare function createDocumentTitle(initial?: string): Signal<string>;
9
+ //#endregion
10
+ export { createDocumentTitle };
@@ -0,0 +1,15 @@
1
+ import { a as effect, f as signal } from "../../signals-CLAPw8kk.mjs";
2
+ //#region src/signals/lib/document-title.ts
3
+ /**
4
+ * Returns a writable `Signal<string>` synced to `document.title`.
5
+ * Writing the signal immediately updates the browser tab title.
6
+ */
7
+ function createDocumentTitle(initial) {
8
+ const title = signal(initial ?? (typeof document !== "undefined" ? document.title : ""));
9
+ effect(() => {
10
+ if (typeof document !== "undefined") document.title = title();
11
+ });
12
+ return title;
13
+ }
14
+ //#endregion
15
+ export { createDocumentTitle };
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,33 @@
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 { createDocumentTitle } from "./document-title.mjs";
4
+ //#region src/signals/lib/document-title.test.ts
5
+ afterEach(() => {
6
+ document.body.innerHTML = "";
7
+ });
8
+ describe("createDocumentTitle", () => {
9
+ it("sets document.title from initial value", () => {
10
+ effectScope(() => {
11
+ createDocumentTitle("My App");
12
+ });
13
+ globalExpect(document.title).toBe("My App");
14
+ });
15
+ it("updates document.title when signal is written", () => {
16
+ let title;
17
+ effectScope(() => {
18
+ title = createDocumentTitle("Initial");
19
+ });
20
+ title("Updated");
21
+ globalExpect(document.title).toBe("Updated");
22
+ });
23
+ it("reads from document.title if no initial value given", () => {
24
+ document.title = "Existing Title";
25
+ let title;
26
+ effectScope(() => {
27
+ title = createDocumentTitle();
28
+ });
29
+ globalExpect(title()).toBe("Existing Title");
30
+ });
31
+ });
32
+ //#endregion
33
+ export {};
@@ -0,0 +1,21 @@
1
+ import { t as Computed } from "../../index-BtqiEEfc.mjs";
2
+
3
+ //#region src/signals/lib/element-rect.d.ts
4
+ type RectResult = {
5
+ x: Computed<number>;
6
+ y: Computed<number>;
7
+ width: Computed<number>;
8
+ height: Computed<number>;
9
+ top: Computed<number>;
10
+ right: Computed<number>;
11
+ bottom: Computed<number>;
12
+ left: Computed<number>;
13
+ } & Disposable;
14
+ /**
15
+ * Observes the full bounding rect of `target` using a `ResizeObserver` (which
16
+ * fires on size changes) and returns all eight DOMRect properties as reactive
17
+ * computeds.
18
+ */
19
+ declare function createElementRect(target: Element | (() => Element | null)): RectResult;
20
+ //#endregion
21
+ export { createElementRect };
@@ -0,0 +1,46 @@
1
+ import { f as signal } from "../../signals-CLAPw8kk.mjs";
2
+ import { createResizeObserver } from "./resize-observer.mjs";
3
+ //#region src/signals/lib/element-rect.ts
4
+ /**
5
+ * Observes the full bounding rect of `target` using a `ResizeObserver` (which
6
+ * fires on size changes) and returns all eight DOMRect properties as reactive
7
+ * computeds.
8
+ */
9
+ function createElementRect(target) {
10
+ const x = signal(0);
11
+ const y = signal(0);
12
+ const width = signal(0);
13
+ const height = signal(0);
14
+ const top = signal(0);
15
+ const right = signal(0);
16
+ const bottom = signal(0);
17
+ const left = signal(0);
18
+ const updateRect = (el) => {
19
+ const rect = el.getBoundingClientRect();
20
+ x(rect.x);
21
+ y(rect.y);
22
+ width(rect.width);
23
+ height(rect.height);
24
+ top(rect.top);
25
+ right(rect.right);
26
+ bottom(rect.bottom);
27
+ left(rect.left);
28
+ };
29
+ const observer = createResizeObserver(target, (entries) => {
30
+ for (const entry of entries) updateRect(entry.target);
31
+ });
32
+ const el = typeof target === "function" ? target() : target;
33
+ if (el) updateRect(el);
34
+ return Object.assign({
35
+ x,
36
+ y,
37
+ width,
38
+ height,
39
+ top,
40
+ right,
41
+ bottom,
42
+ left
43
+ }, { [Symbol.dispose]: observer[Symbol.dispose] });
44
+ }
45
+ //#endregion
46
+ export { createElementRect };
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,99 @@
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 { createElementRect } from "./element-rect.mjs";
4
+ //#region src/signals/lib/element-rect.test.ts
5
+ afterEach(() => {
6
+ document.body.innerHTML = "";
7
+ vi.restoreAllMocks();
8
+ vi.unstubAllGlobals();
9
+ });
10
+ describe("createElementRect", () => {
11
+ it("returns initial rect values from getBoundingClientRect", () => {
12
+ const el = document.createElement("div");
13
+ document.body.appendChild(el);
14
+ vi.spyOn(el, "getBoundingClientRect").mockReturnValue({
15
+ x: 10,
16
+ y: 20,
17
+ width: 100,
18
+ height: 50,
19
+ top: 20,
20
+ right: 110,
21
+ bottom: 70,
22
+ left: 10,
23
+ toJSON: () => ({})
24
+ });
25
+ let rect;
26
+ effectScope(() => {
27
+ rect = createElementRect(el);
28
+ });
29
+ globalExpect(rect.x()).toBe(10);
30
+ globalExpect(rect.y()).toBe(20);
31
+ globalExpect(rect.width()).toBe(100);
32
+ globalExpect(rect.height()).toBe(50);
33
+ globalExpect(rect.top()).toBe(20);
34
+ globalExpect(rect.right()).toBe(110);
35
+ globalExpect(rect.bottom()).toBe(70);
36
+ globalExpect(rect.left()).toBe(10);
37
+ });
38
+ it("updates all rect properties when ResizeObserver fires", () => {
39
+ const el = document.createElement("div");
40
+ document.body.appendChild(el);
41
+ vi.spyOn(el, "getBoundingClientRect").mockReturnValueOnce({
42
+ x: 0,
43
+ y: 0,
44
+ width: 0,
45
+ height: 0,
46
+ top: 0,
47
+ right: 0,
48
+ bottom: 0,
49
+ left: 0,
50
+ toJSON: () => ({})
51
+ }).mockReturnValueOnce({
52
+ x: 5,
53
+ y: 15,
54
+ width: 200,
55
+ height: 80,
56
+ top: 15,
57
+ right: 205,
58
+ bottom: 95,
59
+ left: 5,
60
+ toJSON: () => ({})
61
+ });
62
+ let observerCallback;
63
+ vi.stubGlobal("ResizeObserver", function MockRO(cb) {
64
+ observerCallback = cb;
65
+ return {
66
+ observe: vi.fn(),
67
+ disconnect: vi.fn(),
68
+ unobserve: vi.fn()
69
+ };
70
+ });
71
+ let rect;
72
+ effectScope(() => {
73
+ rect = createElementRect(el);
74
+ });
75
+ observerCallback([{ target: el }], {});
76
+ globalExpect(rect.width()).toBe(200);
77
+ globalExpect(rect.height()).toBe(80);
78
+ globalExpect(rect.top()).toBe(15);
79
+ });
80
+ it("disconnects on Symbol.dispose", () => {
81
+ const disconnect = vi.fn();
82
+ vi.stubGlobal("ResizeObserver", function MockRO() {
83
+ return {
84
+ observe: vi.fn(),
85
+ disconnect,
86
+ unobserve: vi.fn()
87
+ };
88
+ });
89
+ const el = document.createElement("div");
90
+ let rect;
91
+ effectScope(() => {
92
+ rect = createElementRect(el);
93
+ });
94
+ rect[Symbol.dispose]();
95
+ globalExpect(disconnect).toHaveBeenCalledOnce();
96
+ });
97
+ });
98
+ //#endregion
99
+ export {};
@@ -0,0 +1,16 @@
1
+ import { t as Computed } from "../../index-BtqiEEfc.mjs";
2
+
3
+ //#region src/signals/lib/element-size.d.ts
4
+ /**
5
+ * Observes the content-box size of `target` using a `ResizeObserver` and
6
+ * returns reactive `width` and `height` computeds.
7
+ *
8
+ * Supports a reactive getter — pass `() => element` when the target element
9
+ * is not known at call time.
10
+ */
11
+ declare function createElementSize(target: Element | (() => Element | null)): {
12
+ width: Computed<number>;
13
+ height: Computed<number>;
14
+ } & Disposable;
15
+ //#endregion
16
+ export { createElementSize };
@@ -0,0 +1,32 @@
1
+ import { f as signal } from "../../signals-CLAPw8kk.mjs";
2
+ import { createResizeObserver } from "./resize-observer.mjs";
3
+ //#region src/signals/lib/element-size.ts
4
+ /**
5
+ * Observes the content-box size of `target` using a `ResizeObserver` and
6
+ * returns reactive `width` and `height` computeds.
7
+ *
8
+ * Supports a reactive getter — pass `() => element` when the target element
9
+ * is not known at call time.
10
+ */
11
+ function createElementSize(target) {
12
+ const w = signal(0);
13
+ const h = signal(0);
14
+ const observer = createResizeObserver(target, (entries) => {
15
+ for (const entry of entries) {
16
+ w(entry.contentRect.width);
17
+ h(entry.contentRect.height);
18
+ }
19
+ });
20
+ const el = typeof target === "function" ? target() : target;
21
+ if (el) {
22
+ const rect = el.getBoundingClientRect();
23
+ w(rect.width);
24
+ h(rect.height);
25
+ }
26
+ return Object.assign({
27
+ width: w,
28
+ height: h
29
+ }, { [Symbol.dispose]: observer[Symbol.dispose] });
30
+ }
31
+ //#endregion
32
+ export { createElementSize };
@@ -0,0 +1 @@
1
+ export { };