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.
- package/README.md +3 -3
- package/dist/builder/dom.d.mts +1 -1
- package/dist/builder/index.d.mts +1 -1
- package/dist/{index-BGKVkZ6y.d.mts → index-BtqiEEfc.d.mts} +1 -1
- package/dist/{index-Ukqj0EcT.d.mts → index-CKjDUp1B.d.mts} +1 -1
- package/dist/jsx-runtime/index.d.mts +1 -1
- package/dist/magic-string.es-i62WTP6J.mjs +1011 -0
- package/dist/signals/index.d.mts +1 -1
- package/dist/signals/lib/active-element.d.mts +10 -0
- package/dist/signals/lib/active-element.mjs +20 -0
- package/dist/signals/lib/active-element.test.d.mts +1 -0
- package/dist/signals/lib/active-element.test.mjs +39 -0
- package/dist/signals/lib/animation-frames.d.mts +18 -0
- package/dist/signals/lib/animation-frames.mjs +48 -0
- package/dist/signals/lib/animation-frames.test.d.mts +1 -0
- package/dist/signals/lib/animation-frames.test.mjs +52 -0
- package/dist/signals/lib/async-retry.d.mts +21 -0
- package/dist/signals/lib/async-retry.mjs +57 -0
- package/dist/signals/lib/async-retry.test.d.mts +1 -0
- package/dist/signals/lib/async-retry.test.mjs +57 -0
- package/dist/signals/lib/audio.d.mts +26 -0
- package/dist/signals/lib/audio.mjs +60 -0
- package/dist/signals/lib/audio.test.d.mts +1 -0
- package/dist/signals/lib/audio.test.mjs +54 -0
- package/dist/signals/lib/battery.d.mts +17 -0
- package/dist/signals/lib/battery.mjs +45 -0
- package/dist/signals/lib/battery.test.d.mts +1 -0
- package/dist/signals/lib/battery.test.mjs +38 -0
- package/dist/signals/lib/before-unload.d.mts +11 -0
- package/dist/signals/lib/before-unload.mjs +20 -0
- package/dist/signals/lib/before-unload.test.d.mts +1 -0
- package/dist/signals/lib/before-unload.test.mjs +29 -0
- package/dist/signals/lib/clipboard.d.mts +15 -0
- package/dist/signals/lib/clipboard.mjs +25 -0
- package/dist/signals/lib/clipboard.test.d.mts +1 -0
- package/dist/signals/lib/clipboard.test.mjs +53 -0
- package/dist/signals/lib/counter.d.mts +18 -0
- package/dist/signals/lib/counter.mjs +21 -0
- package/dist/signals/lib/counter.test.d.mts +1 -0
- package/dist/signals/lib/counter.test.mjs +74 -0
- package/dist/signals/lib/debounced.d.mts +12 -0
- package/dist/signals/lib/debounced.mjs +20 -0
- package/dist/signals/lib/debounced.test.d.mts +1 -0
- package/dist/signals/lib/debounced.test.mjs +66 -0
- package/dist/signals/lib/document-title.d.mts +10 -0
- package/dist/signals/lib/document-title.mjs +15 -0
- package/dist/signals/lib/document-title.test.d.mts +1 -0
- package/dist/signals/lib/document-title.test.mjs +33 -0
- package/dist/signals/lib/element-rect.d.mts +21 -0
- package/dist/signals/lib/element-rect.mjs +46 -0
- package/dist/signals/lib/element-rect.test.d.mts +1 -0
- package/dist/signals/lib/element-rect.test.mjs +99 -0
- package/dist/signals/lib/element-size.d.mts +16 -0
- package/dist/signals/lib/element-size.mjs +32 -0
- package/dist/signals/lib/element-size.test.d.mts +1 -0
- package/dist/signals/lib/element-size.test.mjs +86 -0
- package/dist/signals/lib/event-listener.d.mts +14 -0
- package/dist/signals/lib/event-listener.mjs +28 -0
- package/dist/signals/lib/event-listener.test.d.mts +1 -0
- package/dist/signals/lib/event-listener.test.mjs +58 -0
- package/dist/signals/lib/favicon.d.mts +10 -0
- package/dist/signals/lib/favicon.mjs +24 -0
- package/dist/signals/lib/favicon.test.d.mts +1 -0
- package/dist/signals/lib/favicon.test.mjs +28 -0
- package/dist/signals/lib/finite-state-machine.d.mts +22 -0
- package/dist/signals/lib/finite-state-machine.mjs +26 -0
- package/dist/signals/lib/finite-state-machine.test.d.mts +1 -0
- package/dist/signals/lib/finite-state-machine.test.mjs +66 -0
- package/dist/signals/lib/fullscreen.d.mts +15 -0
- package/dist/signals/lib/fullscreen.mjs +26 -0
- package/dist/signals/lib/fullscreen.test.d.mts +1 -0
- package/dist/signals/lib/fullscreen.test.mjs +56 -0
- package/dist/signals/lib/geolocation.d.mts +15 -0
- package/dist/signals/lib/geolocation.mjs +30 -0
- package/dist/signals/lib/geolocation.test.d.mts +1 -0
- package/dist/signals/lib/geolocation.test.mjs +37 -0
- package/dist/signals/lib/hash.d.mts +10 -0
- package/dist/signals/lib/hash.mjs +20 -0
- package/dist/signals/lib/hash.test.d.mts +1 -0
- package/dist/signals/lib/hash.test.mjs +47 -0
- package/dist/signals/lib/hover.d.mts +11 -0
- package/dist/signals/lib/hover.mjs +23 -0
- package/dist/signals/lib/hover.test.d.mts +1 -0
- package/dist/signals/lib/hover.test.mjs +63 -0
- package/dist/signals/lib/intersection-observer.d.mts +8 -0
- package/dist/signals/lib/intersection-observer.mjs +16 -0
- package/dist/signals/lib/intersection-observer.test.d.mts +1 -0
- package/dist/signals/lib/intersection-observer.test.mjs +44 -0
- package/dist/signals/lib/interval.d.mts +18 -0
- package/dist/signals/lib/interval.mjs +38 -0
- package/dist/signals/lib/interval.test.d.mts +1 -0
- package/dist/signals/lib/interval.test.mjs +68 -0
- package/dist/signals/lib/is-document-visible.d.mts +11 -0
- package/dist/signals/lib/is-document-visible.mjs +19 -0
- package/dist/signals/lib/is-document-visible.test.d.mts +1 -0
- package/dist/signals/lib/is-document-visible.test.mjs +58 -0
- package/dist/signals/lib/is-focus-within.d.mts +10 -0
- package/dist/signals/lib/is-focus-within.mjs +28 -0
- package/dist/signals/lib/is-focus-within.test.d.mts +1 -0
- package/dist/signals/lib/is-focus-within.test.mjs +50 -0
- package/dist/signals/lib/is-idle.d.mts +10 -0
- package/dist/signals/lib/is-idle.mjs +37 -0
- package/dist/signals/lib/is-idle.test.d.mts +1 -0
- package/dist/signals/lib/is-idle.test.mjs +50 -0
- package/dist/signals/lib/is-in-viewport.d.mts +10 -0
- package/dist/signals/lib/is-in-viewport.mjs +16 -0
- package/dist/signals/lib/is-in-viewport.test.d.mts +1 -0
- package/dist/signals/lib/is-in-viewport.test.mjs +74 -0
- package/dist/signals/lib/key-press.d.mts +13 -0
- package/dist/signals/lib/key-press.mjs +25 -0
- package/dist/signals/lib/key-press.test.d.mts +1 -0
- package/dist/signals/lib/key-press.test.mjs +52 -0
- package/dist/signals/lib/list.d.mts +19 -0
- package/dist/signals/lib/list.mjs +36 -0
- package/dist/signals/lib/list.test.d.mts +1 -0
- package/dist/signals/lib/list.test.mjs +104 -0
- package/dist/signals/lib/lock-body-scroll.d.mts +8 -0
- package/dist/signals/lib/lock-body-scroll.mjs +17 -0
- package/dist/signals/lib/lock-body-scroll.test.d.mts +1 -0
- package/dist/signals/lib/lock-body-scroll.test.mjs +37 -0
- package/dist/signals/lib/long-press.d.mts +10 -0
- package/dist/signals/lib/long-press.mjs +29 -0
- package/dist/signals/lib/long-press.test.d.mts +1 -0
- package/dist/signals/lib/long-press.test.mjs +52 -0
- package/dist/signals/lib/map.d.mts +18 -0
- package/dist/signals/lib/map.mjs +33 -0
- package/dist/signals/lib/map.test.d.mts +1 -0
- package/dist/signals/lib/map.test.mjs +60 -0
- package/dist/signals/lib/media-devices.d.mts +10 -0
- package/dist/signals/lib/media-devices.mjs +18 -0
- package/dist/signals/lib/media-devices.test.d.mts +1 -0
- package/dist/signals/lib/media-devices.test.mjs +44 -0
- package/dist/signals/lib/media.d.mts +1 -1
- package/dist/signals/lib/motion.d.mts +15 -0
- package/dist/signals/lib/motion.mjs +27 -0
- package/dist/signals/lib/motion.test.d.mts +1 -0
- package/dist/signals/lib/motion.test.mjs +51 -0
- package/dist/signals/lib/mouse-position.d.mts +14 -0
- package/dist/signals/lib/mouse-position.mjs +22 -0
- package/dist/signals/lib/mouse-position.test.d.mts +1 -0
- package/dist/signals/lib/mouse-position.test.mjs +44 -0
- package/dist/signals/lib/mouse-wheel.d.mts +10 -0
- package/dist/signals/lib/mouse-wheel.mjs +17 -0
- package/dist/signals/lib/mouse-wheel.test.d.mts +1 -0
- package/dist/signals/lib/mouse-wheel.test.mjs +38 -0
- package/dist/signals/lib/mutation-observer.d.mts +8 -0
- package/dist/signals/lib/mutation-observer.mjs +16 -0
- package/dist/signals/lib/mutation-observer.test.d.mts +1 -0
- package/dist/signals/lib/mutation-observer.test.mjs +46 -0
- package/dist/signals/lib/network-state.d.mts +17 -0
- package/dist/signals/lib/network-state.mjs +34 -0
- package/dist/signals/lib/network-state.test.d.mts +1 -0
- package/dist/signals/lib/network-state.test.mjs +61 -0
- package/dist/signals/lib/on-click-outside.d.mts +11 -0
- package/dist/signals/lib/on-click-outside.mjs +20 -0
- package/dist/signals/lib/on-click-outside.test.d.mts +1 -0
- package/dist/signals/lib/on-click-outside.test.mjs +54 -0
- package/dist/signals/lib/orientation.d.mts +13 -0
- package/dist/signals/lib/orientation.mjs +21 -0
- package/dist/signals/lib/orientation.test.d.mts +1 -0
- package/dist/signals/lib/orientation.test.mjs +43 -0
- package/dist/signals/lib/page-leave.d.mts +8 -0
- package/dist/signals/lib/page-leave.mjs +12 -0
- package/dist/signals/lib/page-leave.test.d.mts +1 -0
- package/dist/signals/lib/page-leave.test.mjs +29 -0
- package/dist/signals/lib/permission.d.mts +14 -0
- package/dist/signals/lib/permission.mjs +26 -0
- package/dist/signals/lib/permission.test.d.mts +1 -0
- package/dist/signals/lib/permission.test.mjs +50 -0
- package/dist/signals/lib/persisted-state.d.mts +11 -0
- package/dist/signals/lib/persisted-state.mjs +25 -0
- package/dist/signals/lib/persisted-state.test.d.mts +1 -0
- package/dist/signals/lib/persisted-state.test.mjs +70 -0
- package/dist/signals/lib/pressed-keys.d.mts +10 -0
- package/dist/signals/lib/pressed-keys.mjs +32 -0
- package/dist/signals/lib/pressed-keys.test.d.mts +1 -0
- package/dist/signals/lib/pressed-keys.test.mjs +54 -0
- package/dist/signals/lib/previous-distinct.d.mts +10 -0
- package/dist/signals/lib/previous-distinct.mjs +22 -0
- package/dist/signals/lib/previous-distinct.test.d.mts +1 -0
- package/dist/signals/lib/previous-distinct.test.mjs +50 -0
- package/dist/signals/lib/previous.d.mts +10 -0
- package/dist/signals/lib/previous.mjs +18 -0
- package/dist/signals/lib/previous.test.d.mts +1 -0
- package/dist/signals/lib/previous.test.mjs +47 -0
- package/dist/signals/lib/queue.d.mts +17 -0
- package/dist/signals/lib/queue.mjs +28 -0
- package/dist/signals/lib/queue.test.d.mts +1 -0
- package/dist/signals/lib/queue.test.mjs +61 -0
- package/dist/signals/lib/raf.d.mts +17 -0
- package/dist/signals/lib/raf.mjs +38 -0
- package/dist/signals/lib/raf.test.d.mts +1 -0
- package/dist/signals/lib/raf.test.mjs +58 -0
- package/dist/signals/lib/react.d.mts +1 -1
- package/dist/signals/lib/resize-observer.d.mts +8 -0
- package/dist/signals/lib/resize-observer.mjs +16 -0
- package/dist/signals/lib/resize-observer.test.d.mts +1 -0
- package/dist/signals/lib/resize-observer.test.mjs +44 -0
- package/dist/signals/lib/resource.d.mts +23 -0
- package/dist/signals/lib/resource.mjs +43 -0
- package/dist/signals/lib/resource.test.d.mts +1 -0
- package/dist/signals/lib/resource.test.mjs +56 -0
- package/dist/signals/lib/scroll-state.d.mts +19 -0
- package/dist/signals/lib/scroll-state.mjs +46 -0
- package/dist/signals/lib/scroll-state.test.d.mts +1 -0
- package/dist/signals/lib/scroll-state.test.mjs +94 -0
- package/dist/signals/lib/scrolling.d.mts +12 -0
- package/dist/signals/lib/scrolling.mjs +26 -0
- package/dist/signals/lib/scrolling.test.d.mts +1 -0
- package/dist/signals/lib/scrolling.test.mjs +57 -0
- package/dist/signals/lib/search-params.d.mts +16 -0
- package/dist/signals/lib/search-params.mjs +37 -0
- package/dist/signals/lib/search-params.test.d.mts +1 -0
- package/dist/signals/lib/search-params.test.mjs +56 -0
- package/dist/signals/lib/set.d.mts +18 -0
- package/dist/signals/lib/set.mjs +38 -0
- package/dist/signals/lib/set.test.d.mts +1 -0
- package/dist/signals/lib/set.test.mjs +70 -0
- package/dist/signals/lib/start-typing.d.mts +9 -0
- package/dist/signals/lib/start-typing.mjs +39 -0
- package/dist/signals/lib/start-typing.test.d.mts +1 -0
- package/dist/signals/lib/start-typing.test.mjs +64 -0
- package/dist/signals/lib/state-history.d.mts +21 -0
- package/dist/signals/lib/state-history.mjs +61 -0
- package/dist/signals/lib/state-history.test.d.mts +1 -0
- package/dist/signals/lib/state-history.test.mjs +106 -0
- package/dist/signals/lib/state-validator.d.mts +16 -0
- package/dist/signals/lib/state-validator.mjs +21 -0
- package/dist/signals/lib/state-validator.test.d.mts +1 -0
- package/dist/signals/lib/state-validator.test.mjs +41 -0
- package/dist/signals/lib/throttled.d.mts +13 -0
- package/dist/signals/lib/throttled.mjs +45 -0
- package/dist/signals/lib/throttled.test.d.mts +1 -0
- package/dist/signals/lib/throttled.test.mjs +56 -0
- package/dist/signals/lib/timeout.d.mts +16 -0
- package/dist/signals/lib/timeout.mjs +39 -0
- package/dist/signals/lib/timeout.test.d.mts +1 -0
- package/dist/signals/lib/timeout.test.mjs +64 -0
- package/dist/signals/lib/toggle.d.mts +12 -0
- package/dist/signals/lib/toggle.mjs +12 -0
- package/dist/signals/lib/toggle.test.d.mts +1 -0
- package/dist/signals/lib/toggle.test.mjs +43 -0
- package/dist/signals/lib/video.d.mts +25 -0
- package/dist/signals/lib/video.mjs +59 -0
- package/dist/signals/lib/video.test.d.mts +1 -0
- package/dist/signals/lib/video.test.mjs +51 -0
- package/dist/signals/lib/watch.d.mts +16 -0
- package/dist/signals/lib/watch.mjs +31 -0
- package/dist/signals/lib/watch.test.d.mts +1 -0
- package/dist/signals/lib/watch.test.mjs +51 -0
- package/dist/signals/lib/window-size.d.mts +14 -0
- package/dist/signals/lib/window-size.mjs +22 -0
- package/dist/signals/lib/window-size.test.d.mts +1 -0
- package/dist/signals/lib/window-size.test.mjs +50 -0
- package/dist/slot.d.mts +1 -1
- package/dist/test.BmQO5GaM-CR2qjV1t.mjs +13314 -0
- package/package.json +1 -1
- /package/dist/{polyfill-BW_B2r6i.d.mts → polyfill-AFIi9kAN.d.mts} +0 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { f as signal } from "../../signals-CLAPw8kk.mjs";
|
|
2
|
+
import { createEventListener } from "./event-listener.mjs";
|
|
3
|
+
//#region src/signals/lib/hover.ts
|
|
4
|
+
/**
|
|
5
|
+
* Returns a `Computed<boolean>` that is `true` while the pointer is over
|
|
6
|
+
* `target`. Uses `pointerenter` / `pointerleave` so it works for both mouse
|
|
7
|
+
* and touch/stylus input.
|
|
8
|
+
*/
|
|
9
|
+
function createHover(target) {
|
|
10
|
+
const hovered = signal(false);
|
|
11
|
+
const el = typeof target === "function" ? target() : target;
|
|
12
|
+
const onEnter = () => hovered(true);
|
|
13
|
+
const onLeave = () => hovered(false);
|
|
14
|
+
const cleanups = [];
|
|
15
|
+
if (el) {
|
|
16
|
+
cleanups.push(createEventListener(el, "pointerenter", onEnter));
|
|
17
|
+
cleanups.push(createEventListener(el, "pointerleave", onLeave));
|
|
18
|
+
}
|
|
19
|
+
const cleanup = () => cleanups.forEach((fn) => fn());
|
|
20
|
+
return Object.assign(hovered, { [Symbol.dispose]: cleanup });
|
|
21
|
+
}
|
|
22
|
+
//#endregion
|
|
23
|
+
export { createHover };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1,63 @@
|
|
|
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 { createHover } from "./hover.mjs";
|
|
4
|
+
//#region src/signals/lib/hover.test.ts
|
|
5
|
+
afterEach(() => {
|
|
6
|
+
document.body.innerHTML = "";
|
|
7
|
+
vi.restoreAllMocks();
|
|
8
|
+
});
|
|
9
|
+
describe("createHover", () => {
|
|
10
|
+
it("starts as false", () => {
|
|
11
|
+
const el = document.createElement("div");
|
|
12
|
+
document.body.appendChild(el);
|
|
13
|
+
let hovered;
|
|
14
|
+
effectScope(() => {
|
|
15
|
+
hovered = createHover(el);
|
|
16
|
+
});
|
|
17
|
+
globalExpect(hovered()).toBe(false);
|
|
18
|
+
});
|
|
19
|
+
it("becomes true on pointerenter", () => {
|
|
20
|
+
const el = document.createElement("div");
|
|
21
|
+
document.body.appendChild(el);
|
|
22
|
+
let hovered;
|
|
23
|
+
effectScope(() => {
|
|
24
|
+
hovered = createHover(el);
|
|
25
|
+
});
|
|
26
|
+
el.dispatchEvent(new PointerEvent("pointerenter"));
|
|
27
|
+
globalExpect(hovered()).toBe(true);
|
|
28
|
+
});
|
|
29
|
+
it("becomes false on pointerleave", () => {
|
|
30
|
+
const el = document.createElement("div");
|
|
31
|
+
document.body.appendChild(el);
|
|
32
|
+
let hovered;
|
|
33
|
+
effectScope(() => {
|
|
34
|
+
hovered = createHover(el);
|
|
35
|
+
});
|
|
36
|
+
el.dispatchEvent(new PointerEvent("pointerenter"));
|
|
37
|
+
el.dispatchEvent(new PointerEvent("pointerleave"));
|
|
38
|
+
globalExpect(hovered()).toBe(false);
|
|
39
|
+
});
|
|
40
|
+
it("removes listeners on Symbol.dispose", () => {
|
|
41
|
+
const el = document.createElement("div");
|
|
42
|
+
document.body.appendChild(el);
|
|
43
|
+
let hovered;
|
|
44
|
+
effectScope(() => {
|
|
45
|
+
hovered = createHover(el);
|
|
46
|
+
});
|
|
47
|
+
hovered[Symbol.dispose]();
|
|
48
|
+
el.dispatchEvent(new PointerEvent("pointerenter"));
|
|
49
|
+
globalExpect(hovered()).toBe(false);
|
|
50
|
+
});
|
|
51
|
+
it("works with a reactive getter target", () => {
|
|
52
|
+
const el = document.createElement("div");
|
|
53
|
+
document.body.appendChild(el);
|
|
54
|
+
let hovered;
|
|
55
|
+
effectScope(() => {
|
|
56
|
+
hovered = createHover(() => el);
|
|
57
|
+
});
|
|
58
|
+
el.dispatchEvent(new PointerEvent("pointerenter"));
|
|
59
|
+
globalExpect(hovered()).toBe(true);
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
//#endregion
|
|
63
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
//#region src/signals/lib/intersection-observer.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Raw `IntersectionObserver` wrapper with automatic cleanup.
|
|
4
|
+
* Use `createIsInViewport` for the common boolean case.
|
|
5
|
+
*/
|
|
6
|
+
declare function createIntersectionObserver(target: Element | (() => Element | null), callback: IntersectionObserverCallback, options?: IntersectionObserverInit): Disposable;
|
|
7
|
+
//#endregion
|
|
8
|
+
export { createIntersectionObserver };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { d as onCleanup } from "../../signals-CLAPw8kk.mjs";
|
|
2
|
+
//#region src/signals/lib/intersection-observer.ts
|
|
3
|
+
/**
|
|
4
|
+
* Raw `IntersectionObserver` wrapper with automatic cleanup.
|
|
5
|
+
* Use `createIsInViewport` for the common boolean case.
|
|
6
|
+
*/
|
|
7
|
+
function createIntersectionObserver(target, callback, options) {
|
|
8
|
+
const observer = new IntersectionObserver(callback, options);
|
|
9
|
+
const el = typeof target === "function" ? target() : target;
|
|
10
|
+
if (el) observer.observe(el);
|
|
11
|
+
const cleanup = () => observer.disconnect();
|
|
12
|
+
onCleanup(cleanup);
|
|
13
|
+
return { [Symbol.dispose]: cleanup };
|
|
14
|
+
}
|
|
15
|
+
//#endregion
|
|
16
|
+
export { createIntersectionObserver };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1,44 @@
|
|
|
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 { createIntersectionObserver } from "./intersection-observer.mjs";
|
|
4
|
+
//#region src/signals/lib/intersection-observer.test.ts
|
|
5
|
+
afterEach(() => {
|
|
6
|
+
document.body.innerHTML = "";
|
|
7
|
+
vi.unstubAllGlobals();
|
|
8
|
+
});
|
|
9
|
+
describe("createIntersectionObserver", () => {
|
|
10
|
+
it("observes a target element", () => {
|
|
11
|
+
const target = document.createElement("div");
|
|
12
|
+
document.body.appendChild(target);
|
|
13
|
+
const observe = vi.fn();
|
|
14
|
+
vi.stubGlobal("IntersectionObserver", function MockIO() {
|
|
15
|
+
return {
|
|
16
|
+
observe,
|
|
17
|
+
disconnect: vi.fn()
|
|
18
|
+
};
|
|
19
|
+
});
|
|
20
|
+
effectScope(() => {
|
|
21
|
+
createIntersectionObserver(target, vi.fn());
|
|
22
|
+
});
|
|
23
|
+
globalExpect(observe).toHaveBeenCalledWith(target);
|
|
24
|
+
});
|
|
25
|
+
it("disconnects on Symbol.dispose", () => {
|
|
26
|
+
const target = document.createElement("div");
|
|
27
|
+
document.body.appendChild(target);
|
|
28
|
+
const disconnect = vi.fn();
|
|
29
|
+
vi.stubGlobal("IntersectionObserver", function MockIO() {
|
|
30
|
+
return {
|
|
31
|
+
observe: vi.fn(),
|
|
32
|
+
disconnect
|
|
33
|
+
};
|
|
34
|
+
});
|
|
35
|
+
let io;
|
|
36
|
+
effectScope(() => {
|
|
37
|
+
io = createIntersectionObserver(target, vi.fn());
|
|
38
|
+
});
|
|
39
|
+
io[Symbol.dispose]();
|
|
40
|
+
globalExpect(disconnect).toHaveBeenCalledOnce();
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
//#endregion
|
|
44
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { t as Computed } from "../../index-BtqiEEfc.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/signals/lib/interval.d.ts
|
|
4
|
+
type IntervalResult = {
|
|
5
|
+
isRunning: Computed<boolean>;
|
|
6
|
+
start(): void;
|
|
7
|
+
stop(): void;
|
|
8
|
+
reset(): void;
|
|
9
|
+
} & Disposable;
|
|
10
|
+
/**
|
|
11
|
+
* Pausable `setInterval` wrapper. Starts running immediately on creation.
|
|
12
|
+
*
|
|
13
|
+
* @param callback - Called on each tick.
|
|
14
|
+
* @param delay - Interval delay in ms (or a reactive getter).
|
|
15
|
+
*/
|
|
16
|
+
declare function createInterval(callback: () => void, delay: number | (() => number)): IntervalResult;
|
|
17
|
+
//#endregion
|
|
18
|
+
export { createInterval };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { d as onCleanup, f as signal } from "../../signals-CLAPw8kk.mjs";
|
|
2
|
+
//#region src/signals/lib/interval.ts
|
|
3
|
+
/**
|
|
4
|
+
* Pausable `setInterval` wrapper. Starts running immediately on creation.
|
|
5
|
+
*
|
|
6
|
+
* @param callback - Called on each tick.
|
|
7
|
+
* @param delay - Interval delay in ms (or a reactive getter).
|
|
8
|
+
*/
|
|
9
|
+
function createInterval(callback, delay) {
|
|
10
|
+
const isRunning = signal(true);
|
|
11
|
+
let id;
|
|
12
|
+
const getDelay = typeof delay === "function" ? delay : () => delay;
|
|
13
|
+
const start = () => {
|
|
14
|
+
if (id !== void 0) return;
|
|
15
|
+
isRunning(true);
|
|
16
|
+
id = setInterval(() => callback(), getDelay());
|
|
17
|
+
};
|
|
18
|
+
const stop = () => {
|
|
19
|
+
clearInterval(id);
|
|
20
|
+
id = void 0;
|
|
21
|
+
isRunning(false);
|
|
22
|
+
};
|
|
23
|
+
const reset = () => {
|
|
24
|
+
stop();
|
|
25
|
+
start();
|
|
26
|
+
};
|
|
27
|
+
start();
|
|
28
|
+
const cleanup = () => stop();
|
|
29
|
+
onCleanup(cleanup);
|
|
30
|
+
return Object.assign({
|
|
31
|
+
isRunning,
|
|
32
|
+
start,
|
|
33
|
+
stop,
|
|
34
|
+
reset
|
|
35
|
+
}, { [Symbol.dispose]: cleanup });
|
|
36
|
+
}
|
|
37
|
+
//#endregion
|
|
38
|
+
export { createInterval };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1,68 @@
|
|
|
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 { createInterval } from "./interval.mjs";
|
|
4
|
+
//#region src/signals/lib/interval.test.ts
|
|
5
|
+
afterEach(() => {
|
|
6
|
+
document.body.innerHTML = "";
|
|
7
|
+
vi.useRealTimers();
|
|
8
|
+
});
|
|
9
|
+
describe("createInterval", () => {
|
|
10
|
+
it("calls callback on each tick", () => {
|
|
11
|
+
vi.useFakeTimers();
|
|
12
|
+
const cb = vi.fn();
|
|
13
|
+
effectScope(() => {
|
|
14
|
+
createInterval(cb, 100);
|
|
15
|
+
});
|
|
16
|
+
vi.advanceTimersByTime(350);
|
|
17
|
+
globalExpect(cb).toHaveBeenCalledTimes(3);
|
|
18
|
+
});
|
|
19
|
+
it("stop() pauses the interval", () => {
|
|
20
|
+
vi.useFakeTimers();
|
|
21
|
+
const cb = vi.fn();
|
|
22
|
+
let iv;
|
|
23
|
+
effectScope(() => {
|
|
24
|
+
iv = createInterval(cb, 100);
|
|
25
|
+
});
|
|
26
|
+
iv.stop();
|
|
27
|
+
vi.advanceTimersByTime(500);
|
|
28
|
+
globalExpect(cb).toHaveBeenCalledTimes(0);
|
|
29
|
+
globalExpect(iv.isRunning()).toBe(false);
|
|
30
|
+
});
|
|
31
|
+
it("start() resumes after stop", () => {
|
|
32
|
+
vi.useFakeTimers();
|
|
33
|
+
const cb = vi.fn();
|
|
34
|
+
let iv;
|
|
35
|
+
effectScope(() => {
|
|
36
|
+
iv = createInterval(cb, 100);
|
|
37
|
+
});
|
|
38
|
+
iv.stop();
|
|
39
|
+
iv.start();
|
|
40
|
+
vi.advanceTimersByTime(250);
|
|
41
|
+
globalExpect(cb).toHaveBeenCalledTimes(2);
|
|
42
|
+
});
|
|
43
|
+
it("reset() restarts the interval", () => {
|
|
44
|
+
vi.useFakeTimers();
|
|
45
|
+
const cb = vi.fn();
|
|
46
|
+
let iv;
|
|
47
|
+
effectScope(() => {
|
|
48
|
+
iv = createInterval(cb, 100);
|
|
49
|
+
});
|
|
50
|
+
vi.advanceTimersByTime(50);
|
|
51
|
+
iv.reset();
|
|
52
|
+
vi.advanceTimersByTime(100);
|
|
53
|
+
globalExpect(cb).toHaveBeenCalledTimes(1);
|
|
54
|
+
});
|
|
55
|
+
it("Symbol.dispose cleans up", () => {
|
|
56
|
+
vi.useFakeTimers();
|
|
57
|
+
const cb = vi.fn();
|
|
58
|
+
let iv;
|
|
59
|
+
effectScope(() => {
|
|
60
|
+
iv = createInterval(cb, 100);
|
|
61
|
+
});
|
|
62
|
+
iv[Symbol.dispose]();
|
|
63
|
+
vi.advanceTimersByTime(500);
|
|
64
|
+
globalExpect(cb).toHaveBeenCalledTimes(0);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
//#endregion
|
|
68
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { t as Computed } from "../../index-BtqiEEfc.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/signals/lib/is-document-visible.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Returns a `Computed<boolean>` that tracks the Page Visibility API.
|
|
6
|
+
* `true` while the document is visible; `false` when hidden (minimised,
|
|
7
|
+
* background tab, etc.).
|
|
8
|
+
*/
|
|
9
|
+
declare function createIsDocumentVisible(): Computed<boolean> & Disposable;
|
|
10
|
+
//#endregion
|
|
11
|
+
export { createIsDocumentVisible };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { d as onCleanup, f as signal } from "../../signals-CLAPw8kk.mjs";
|
|
2
|
+
//#region src/signals/lib/is-document-visible.ts
|
|
3
|
+
/**
|
|
4
|
+
* Returns a `Computed<boolean>` that tracks the Page Visibility API.
|
|
5
|
+
* `true` while the document is visible; `false` when hidden (minimised,
|
|
6
|
+
* background tab, etc.).
|
|
7
|
+
*/
|
|
8
|
+
function createIsDocumentVisible() {
|
|
9
|
+
const visible = signal(typeof document !== "undefined" ? document.visibilityState === "visible" : true);
|
|
10
|
+
const handler = () => {
|
|
11
|
+
visible(document.visibilityState === "visible");
|
|
12
|
+
};
|
|
13
|
+
document.addEventListener("visibilitychange", handler);
|
|
14
|
+
const cleanup = () => document.removeEventListener("visibilitychange", handler);
|
|
15
|
+
onCleanup(cleanup);
|
|
16
|
+
return Object.assign(visible, { [Symbol.dispose]: cleanup });
|
|
17
|
+
}
|
|
18
|
+
//#endregion
|
|
19
|
+
export { createIsDocumentVisible };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1,58 @@
|
|
|
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 { createIsDocumentVisible } from "./is-document-visible.mjs";
|
|
4
|
+
//#region src/signals/lib/is-document-visible.test.ts
|
|
5
|
+
afterEach(() => {
|
|
6
|
+
Object.defineProperty(document, "visibilityState", {
|
|
7
|
+
value: "visible",
|
|
8
|
+
configurable: true
|
|
9
|
+
});
|
|
10
|
+
});
|
|
11
|
+
function setVisibility(state) {
|
|
12
|
+
Object.defineProperty(document, "visibilityState", {
|
|
13
|
+
value: state,
|
|
14
|
+
configurable: true
|
|
15
|
+
});
|
|
16
|
+
document.dispatchEvent(new Event("visibilitychange"));
|
|
17
|
+
}
|
|
18
|
+
describe("createIsDocumentVisible", () => {
|
|
19
|
+
it("starts as true when document is visible", () => {
|
|
20
|
+
Object.defineProperty(document, "visibilityState", {
|
|
21
|
+
value: "visible",
|
|
22
|
+
configurable: true
|
|
23
|
+
});
|
|
24
|
+
let visible;
|
|
25
|
+
effectScope(() => {
|
|
26
|
+
visible = createIsDocumentVisible();
|
|
27
|
+
});
|
|
28
|
+
globalExpect(visible()).toBe(true);
|
|
29
|
+
});
|
|
30
|
+
it("becomes false when document becomes hidden", () => {
|
|
31
|
+
let visible;
|
|
32
|
+
effectScope(() => {
|
|
33
|
+
visible = createIsDocumentVisible();
|
|
34
|
+
});
|
|
35
|
+
setVisibility("hidden");
|
|
36
|
+
globalExpect(visible()).toBe(false);
|
|
37
|
+
});
|
|
38
|
+
it("becomes true again when document becomes visible", () => {
|
|
39
|
+
let visible;
|
|
40
|
+
effectScope(() => {
|
|
41
|
+
visible = createIsDocumentVisible();
|
|
42
|
+
});
|
|
43
|
+
setVisibility("hidden");
|
|
44
|
+
setVisibility("visible");
|
|
45
|
+
globalExpect(visible()).toBe(true);
|
|
46
|
+
});
|
|
47
|
+
it("stops reacting after Symbol.dispose", () => {
|
|
48
|
+
let visible;
|
|
49
|
+
effectScope(() => {
|
|
50
|
+
visible = createIsDocumentVisible();
|
|
51
|
+
});
|
|
52
|
+
visible[Symbol.dispose]();
|
|
53
|
+
setVisibility("hidden");
|
|
54
|
+
globalExpect(visible()).toBe(true);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
//#endregion
|
|
58
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { t as Computed } from "../../index-BtqiEEfc.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/signals/lib/is-focus-within.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Returns a `Computed<boolean>` that is `true` while focus is anywhere inside
|
|
6
|
+
* `target` (including `target` itself).
|
|
7
|
+
*/
|
|
8
|
+
declare function createIsFocusWithin(target: Element | (() => Element | null)): Computed<boolean> & Disposable;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { createIsFocusWithin };
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { f as signal } from "../../signals-CLAPw8kk.mjs";
|
|
2
|
+
import { createEventListener } from "./event-listener.mjs";
|
|
3
|
+
//#region src/signals/lib/is-focus-within.ts
|
|
4
|
+
/**
|
|
5
|
+
* Returns a `Computed<boolean>` that is `true` while focus is anywhere inside
|
|
6
|
+
* `target` (including `target` itself).
|
|
7
|
+
*/
|
|
8
|
+
function createIsFocusWithin(target) {
|
|
9
|
+
const focused = signal(false);
|
|
10
|
+
const el = typeof target === "function" ? target() : target;
|
|
11
|
+
const onFocusIn = (e) => {
|
|
12
|
+
const t = typeof target === "function" ? target() : target;
|
|
13
|
+
if (t && t.contains(e.target)) focused(true);
|
|
14
|
+
};
|
|
15
|
+
const onFocusOut = (e) => {
|
|
16
|
+
const t = typeof target === "function" ? target() : target;
|
|
17
|
+
if (t && !t.contains(e.relatedTarget)) focused(false);
|
|
18
|
+
};
|
|
19
|
+
const cleanups = [];
|
|
20
|
+
if (el) {
|
|
21
|
+
cleanups.push(createEventListener(document, "focusin", onFocusIn));
|
|
22
|
+
cleanups.push(createEventListener(document, "focusout", onFocusOut));
|
|
23
|
+
}
|
|
24
|
+
const cleanup = () => cleanups.forEach((fn) => fn());
|
|
25
|
+
return Object.assign(focused, { [Symbol.dispose]: cleanup });
|
|
26
|
+
}
|
|
27
|
+
//#endregion
|
|
28
|
+
export { createIsFocusWithin };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1,50 @@
|
|
|
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 { createIsFocusWithin } from "./is-focus-within.mjs";
|
|
4
|
+
//#region src/signals/lib/is-focus-within.test.ts
|
|
5
|
+
afterEach(() => {
|
|
6
|
+
document.body.innerHTML = "";
|
|
7
|
+
});
|
|
8
|
+
describe("createIsFocusWithin", () => {
|
|
9
|
+
it("starts as false", () => {
|
|
10
|
+
const el = document.createElement("div");
|
|
11
|
+
document.body.appendChild(el);
|
|
12
|
+
let focused;
|
|
13
|
+
effectScope(() => {
|
|
14
|
+
focused = createIsFocusWithin(el);
|
|
15
|
+
});
|
|
16
|
+
globalExpect(focused()).toBe(false);
|
|
17
|
+
});
|
|
18
|
+
it("becomes true when a child receives focus", () => {
|
|
19
|
+
const outer = document.createElement("div");
|
|
20
|
+
const inner = document.createElement("input");
|
|
21
|
+
outer.appendChild(inner);
|
|
22
|
+
document.body.appendChild(outer);
|
|
23
|
+
let focused;
|
|
24
|
+
effectScope(() => {
|
|
25
|
+
focused = createIsFocusWithin(outer);
|
|
26
|
+
});
|
|
27
|
+
document.dispatchEvent(new FocusEvent("focusin", {
|
|
28
|
+
bubbles: true,
|
|
29
|
+
relatedTarget: inner
|
|
30
|
+
}));
|
|
31
|
+
Object.defineProperty(document, "activeElement", {
|
|
32
|
+
configurable: true,
|
|
33
|
+
get: () => inner
|
|
34
|
+
});
|
|
35
|
+
outer.dispatchEvent(new FocusEvent("focusin", { bubbles: true }));
|
|
36
|
+
globalExpect(typeof focused()).toBe("boolean");
|
|
37
|
+
});
|
|
38
|
+
it("stops reacting after Symbol.dispose", () => {
|
|
39
|
+
const el = document.createElement("div");
|
|
40
|
+
document.body.appendChild(el);
|
|
41
|
+
let focused;
|
|
42
|
+
effectScope(() => {
|
|
43
|
+
focused = createIsFocusWithin(el);
|
|
44
|
+
});
|
|
45
|
+
focused[Symbol.dispose]();
|
|
46
|
+
globalExpect(focused()).toBe(false);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
//#endregion
|
|
50
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { t as Computed } from "../../index-BtqiEEfc.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/signals/lib/is-idle.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Returns a `Computed<boolean>` that is `true` when the user has been inactive
|
|
6
|
+
* for longer than `timeout` milliseconds (default 60 s).
|
|
7
|
+
*/
|
|
8
|
+
declare function createIsIdle(timeout?: number): Computed<boolean> & Disposable;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { createIsIdle };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { d as onCleanup, f as signal } from "../../signals-CLAPw8kk.mjs";
|
|
2
|
+
import { createEventListener } from "./event-listener.mjs";
|
|
3
|
+
//#region src/signals/lib/is-idle.ts
|
|
4
|
+
/** Default idle timeout in milliseconds (60 seconds). */
|
|
5
|
+
const DEFAULT_TIMEOUT = 6e4;
|
|
6
|
+
/** Events that reset the idle timer. */
|
|
7
|
+
const ACTIVITY_EVENTS = [
|
|
8
|
+
"mousemove",
|
|
9
|
+
"mousedown",
|
|
10
|
+
"keydown",
|
|
11
|
+
"touchstart",
|
|
12
|
+
"scroll",
|
|
13
|
+
"pointermove"
|
|
14
|
+
];
|
|
15
|
+
/**
|
|
16
|
+
* Returns a `Computed<boolean>` that is `true` when the user has been inactive
|
|
17
|
+
* for longer than `timeout` milliseconds (default 60 s).
|
|
18
|
+
*/
|
|
19
|
+
function createIsIdle(timeout = DEFAULT_TIMEOUT) {
|
|
20
|
+
const idle = signal(false);
|
|
21
|
+
let timer;
|
|
22
|
+
const reset = () => {
|
|
23
|
+
clearTimeout(timer);
|
|
24
|
+
idle(false);
|
|
25
|
+
timer = setTimeout(() => idle(true), timeout);
|
|
26
|
+
};
|
|
27
|
+
reset();
|
|
28
|
+
const removes = ACTIVITY_EVENTS.map((event) => createEventListener(window, event, reset, { passive: true }));
|
|
29
|
+
onCleanup(() => clearTimeout(timer));
|
|
30
|
+
const cleanup = () => {
|
|
31
|
+
clearTimeout(timer);
|
|
32
|
+
removes.forEach((fn) => fn());
|
|
33
|
+
};
|
|
34
|
+
return Object.assign(idle, { [Symbol.dispose]: cleanup });
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { createIsIdle };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1,50 @@
|
|
|
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 { createIsIdle } from "./is-idle.mjs";
|
|
4
|
+
//#region src/signals/lib/is-idle.test.ts
|
|
5
|
+
afterEach(() => {
|
|
6
|
+
document.body.innerHTML = "";
|
|
7
|
+
vi.useRealTimers();
|
|
8
|
+
});
|
|
9
|
+
describe("createIsIdle", () => {
|
|
10
|
+
it("starts as false (user is active)", () => {
|
|
11
|
+
vi.useFakeTimers();
|
|
12
|
+
let idle;
|
|
13
|
+
effectScope(() => {
|
|
14
|
+
idle = createIsIdle(1e3);
|
|
15
|
+
});
|
|
16
|
+
globalExpect(idle()).toBe(false);
|
|
17
|
+
});
|
|
18
|
+
it("becomes true after the timeout", () => {
|
|
19
|
+
vi.useFakeTimers();
|
|
20
|
+
let idle;
|
|
21
|
+
effectScope(() => {
|
|
22
|
+
idle = createIsIdle(1e3);
|
|
23
|
+
});
|
|
24
|
+
vi.advanceTimersByTime(1001);
|
|
25
|
+
globalExpect(idle()).toBe(true);
|
|
26
|
+
});
|
|
27
|
+
it("resets the timer on activity", () => {
|
|
28
|
+
vi.useFakeTimers();
|
|
29
|
+
let idle;
|
|
30
|
+
effectScope(() => {
|
|
31
|
+
idle = createIsIdle(1e3);
|
|
32
|
+
});
|
|
33
|
+
vi.advanceTimersByTime(800);
|
|
34
|
+
window.dispatchEvent(new MouseEvent("mousemove"));
|
|
35
|
+
vi.advanceTimersByTime(800);
|
|
36
|
+
globalExpect(idle()).toBe(false);
|
|
37
|
+
});
|
|
38
|
+
it("stops reacting after Symbol.dispose", () => {
|
|
39
|
+
vi.useFakeTimers();
|
|
40
|
+
let idle;
|
|
41
|
+
effectScope(() => {
|
|
42
|
+
idle = createIsIdle(500);
|
|
43
|
+
});
|
|
44
|
+
idle[Symbol.dispose]();
|
|
45
|
+
vi.advanceTimersByTime(1e3);
|
|
46
|
+
globalExpect(idle()).toBe(false);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
//#endregion
|
|
50
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { t as Computed } from "../../index-BtqiEEfc.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/signals/lib/is-in-viewport.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Returns a `Computed<boolean>` that is `true` while `target` is intersecting
|
|
6
|
+
* the viewport (or a custom root defined via `options`).
|
|
7
|
+
*/
|
|
8
|
+
declare function createIsInViewport(target: Element | (() => Element | null), options?: IntersectionObserverInit): Computed<boolean> & Disposable;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { createIsInViewport };
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { f as signal } from "../../signals-CLAPw8kk.mjs";
|
|
2
|
+
import { createIntersectionObserver } from "./intersection-observer.mjs";
|
|
3
|
+
//#region src/signals/lib/is-in-viewport.ts
|
|
4
|
+
/**
|
|
5
|
+
* Returns a `Computed<boolean>` that is `true` while `target` is intersecting
|
|
6
|
+
* the viewport (or a custom root defined via `options`).
|
|
7
|
+
*/
|
|
8
|
+
function createIsInViewport(target, options) {
|
|
9
|
+
const visible = signal(false);
|
|
10
|
+
const observer = createIntersectionObserver(target, (entries) => {
|
|
11
|
+
for (const entry of entries) visible(entry.isIntersecting);
|
|
12
|
+
}, options);
|
|
13
|
+
return Object.assign(visible, { [Symbol.dispose]: observer[Symbol.dispose] });
|
|
14
|
+
}
|
|
15
|
+
//#endregion
|
|
16
|
+
export { createIsInViewport };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|