elements-kit 0.0.10 → 0.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -4
- package/dist/builder/dom.d.mts +1 -1
- package/dist/builder/index.d.mts +87 -1
- package/dist/builder/index.mjs +1 -1
- package/dist/{element-Ddk9YaoE.mjs → element-MXzFk4G2.mjs} +1 -1
- package/dist/{index-BtqiEEfc.d.mts → index-Cvdhuy6Y.d.mts} +8 -4
- package/dist/index.d.mts +1 -1
- package/dist/index.mjs +3 -3
- package/dist/{signals/lib → integrations}/react.d.mts +2 -2
- package/dist/{signals/lib → integrations}/react.mjs +2 -2
- package/dist/jsx-runtime/index.d.mts +2 -2
- package/dist/jsx-runtime/index.mjs +3 -3
- package/dist/lib-BYJ5jPTG.d.mts +4 -0
- package/dist/polyfill-DR5XVnh_.d.mts +9 -0
- package/dist/signals/index.d.mts +2 -2
- package/dist/signals/index.mjs +2 -2
- package/dist/{signals-CLAPw8kk.mjs → signals-DcgXhkU2.mjs} +41 -9
- package/dist/slot.d.mts +1 -2
- package/dist/{test.BmQO5GaM-CR2qjV1t.mjs → test.BmQO5GaM-ANkhHvbr.mjs} +1 -1
- package/dist/utilities/active-element.d.mts +6 -0
- package/dist/utilities/active-element.mjs +13 -0
- package/dist/utilities/active-element.test.mjs +24 -0
- package/dist/{signals/lib → utilities}/debounced.d.mts +3 -3
- package/dist/{signals/lib → utilities}/debounced.mjs +7 -6
- package/dist/{signals/lib → utilities}/debounced.test.mjs +3 -3
- package/dist/{signals/lib → utilities}/element-rect.d.mts +3 -3
- package/dist/{signals/lib → utilities}/element-rect.mjs +7 -7
- package/dist/{signals/lib → utilities}/element-rect.test.mjs +3 -3
- package/dist/utilities/element-scroll.d.mts +16 -0
- package/dist/utilities/element-scroll.mjs +52 -0
- package/dist/utilities/element-scroll.test.mjs +25 -0
- package/dist/{signals/lib → utilities}/event-driven.d.mts +2 -2
- package/dist/{signals/lib → utilities}/event-driven.mjs +2 -2
- package/dist/utilities/event-listener.d.mts +16 -0
- package/dist/{signals/lib → utilities}/event-listener.mjs +4 -4
- package/dist/{signals/lib → utilities}/event-listener.test.mjs +8 -8
- package/dist/utilities/focus-within.d.mts +10 -0
- package/dist/utilities/focus-within.mjs +20 -0
- package/dist/{signals/lib/is-focus-within.test.mjs → utilities/focus-within.test.mjs} +10 -11
- package/dist/utilities/hover.d.mts +11 -0
- package/dist/utilities/hover.mjs +20 -0
- package/dist/{signals/lib → utilities}/hover.test.mjs +5 -16
- package/dist/utilities/intersection-observer.d.mts +8 -0
- package/dist/{signals/lib → utilities}/intersection-observer.mjs +3 -4
- package/dist/{signals/lib → utilities}/intersection-observer.test.mjs +3 -3
- package/dist/{signals/lib → utilities}/interval.d.mts +2 -2
- package/dist/{signals/lib → utilities}/interval.mjs +6 -5
- package/dist/{signals/lib → utilities}/interval.test.mjs +3 -3
- package/dist/utilities/location.d.mts +24 -0
- package/dist/utilities/location.mjs +54 -0
- package/dist/utilities/location.test.mjs +60 -0
- package/dist/utilities/long-press.d.mts +10 -0
- package/dist/utilities/long-press.mjs +27 -0
- package/dist/{signals/lib → utilities}/long-press.test.mjs +3 -3
- package/dist/{signals/lib → utilities}/media-devices.d.mts +3 -3
- package/dist/{signals/lib → utilities}/media-devices.mjs +5 -5
- package/dist/{signals/lib → utilities}/media-devices.test.mjs +6 -8
- package/dist/utilities/media-player.d.mts +22 -0
- package/dist/{signals/lib/video.mjs → utilities/media-player.mjs} +5 -4
- package/dist/utilities/media-player.test.mjs +100 -0
- package/dist/{signals/lib/media.d.mts → utilities/media-query.d.mts} +4 -4
- package/dist/{signals/lib/media.mjs → utilities/media-query.mjs} +6 -6
- package/dist/utilities/mutation-observer.d.mts +8 -0
- package/dist/{signals/lib → utilities}/mutation-observer.mjs +3 -3
- package/dist/{signals/lib → utilities}/mutation-observer.test.mjs +3 -3
- package/dist/{signals/lib → utilities}/on-click-outside.d.mts +3 -3
- package/dist/utilities/on-click-outside.mjs +17 -0
- package/dist/{signals/lib → utilities}/on-click-outside.test.mjs +7 -18
- package/dist/utilities/orientation.d.mts +10 -0
- package/dist/{signals/lib → utilities}/orientation.mjs +3 -2
- package/dist/utilities/previous.d.mts +12 -0
- package/dist/utilities/previous.mjs +24 -0
- package/dist/utilities/previous.test.mjs +88 -0
- package/dist/utilities/resize-observer.d.mts +8 -0
- package/dist/{signals/lib → utilities}/resize-observer.mjs +4 -5
- package/dist/utilities/routing.d.mts +59 -0
- package/dist/utilities/routing.mjs +89 -0
- package/dist/utilities/routing.test.mjs +128 -0
- package/dist/utilities/search-params.d.mts +13 -0
- package/dist/utilities/search-params.mjs +23 -0
- package/dist/utilities/search-params.test.mjs +35 -0
- package/dist/utilities/storage.d.mts +22 -0
- package/dist/utilities/storage.mjs +65 -0
- package/dist/utilities/storage.test.mjs +137 -0
- package/dist/{signals/lib → utilities}/throttled.d.mts +2 -2
- package/dist/utilities/throttled.mjs +36 -0
- package/dist/{signals/lib → utilities}/throttled.test.mjs +3 -3
- package/dist/{signals/lib → utilities}/timeout.d.mts +6 -5
- package/dist/utilities/timeout.mjs +42 -0
- package/dist/{signals/lib → utilities}/timeout.test.mjs +7 -7
- package/dist/utilities/window-size.d.mts +10 -0
- package/dist/utilities/window-size.mjs +22 -0
- package/dist/utilities/window-size.test.mjs +42 -0
- package/package.json +11 -6
- package/dist/index-CKjDUp1B.d.mts +0 -89
- package/dist/polyfill-AFIi9kAN.d.mts +0 -14
- package/dist/signals/lib/active-element.d.mts +0 -10
- package/dist/signals/lib/active-element.mjs +0 -12
- package/dist/signals/lib/active-element.test.mjs +0 -39
- package/dist/signals/lib/animation-frames.d.mts +0 -18
- package/dist/signals/lib/animation-frames.mjs +0 -48
- package/dist/signals/lib/animation-frames.test.mjs +0 -52
- package/dist/signals/lib/async-retry.d.mts +0 -21
- package/dist/signals/lib/async-retry.mjs +0 -57
- package/dist/signals/lib/async-retry.test.mjs +0 -57
- package/dist/signals/lib/audio.d.mts +0 -21
- package/dist/signals/lib/audio.mjs +0 -35
- package/dist/signals/lib/audio.test.mjs +0 -57
- package/dist/signals/lib/battery.d.mts +0 -17
- package/dist/signals/lib/battery.mjs +0 -45
- package/dist/signals/lib/battery.test.mjs +0 -38
- package/dist/signals/lib/before-unload.d.mts +0 -11
- package/dist/signals/lib/before-unload.mjs +0 -20
- package/dist/signals/lib/before-unload.test.mjs +0 -29
- package/dist/signals/lib/clipboard.d.mts +0 -15
- package/dist/signals/lib/clipboard.mjs +0 -25
- package/dist/signals/lib/clipboard.test.mjs +0 -53
- package/dist/signals/lib/counter.d.mts +0 -18
- package/dist/signals/lib/counter.mjs +0 -21
- package/dist/signals/lib/counter.test.d.mts +0 -1
- package/dist/signals/lib/counter.test.mjs +0 -74
- package/dist/signals/lib/document-title.d.mts +0 -10
- package/dist/signals/lib/document-title.mjs +0 -15
- package/dist/signals/lib/document-title.test.d.mts +0 -1
- package/dist/signals/lib/document-title.test.mjs +0 -33
- package/dist/signals/lib/element-size.d.mts +0 -16
- package/dist/signals/lib/element-size.mjs +0 -32
- package/dist/signals/lib/element-size.test.d.mts +0 -1
- package/dist/signals/lib/element-size.test.mjs +0 -86
- package/dist/signals/lib/event-listener.d.mts +0 -14
- package/dist/signals/lib/favicon.d.mts +0 -10
- package/dist/signals/lib/favicon.mjs +0 -24
- package/dist/signals/lib/favicon.test.d.mts +0 -1
- package/dist/signals/lib/favicon.test.mjs +0 -28
- package/dist/signals/lib/finite-state-machine.d.mts +0 -22
- package/dist/signals/lib/finite-state-machine.mjs +0 -26
- package/dist/signals/lib/finite-state-machine.test.d.mts +0 -1
- package/dist/signals/lib/finite-state-machine.test.mjs +0 -66
- package/dist/signals/lib/fullscreen.d.mts +0 -15
- package/dist/signals/lib/fullscreen.mjs +0 -24
- package/dist/signals/lib/fullscreen.test.d.mts +0 -1
- package/dist/signals/lib/fullscreen.test.mjs +0 -48
- package/dist/signals/lib/geolocation.d.mts +0 -15
- package/dist/signals/lib/geolocation.mjs +0 -30
- package/dist/signals/lib/geolocation.test.d.mts +0 -1
- package/dist/signals/lib/geolocation.test.mjs +0 -37
- package/dist/signals/lib/hash.d.mts +0 -10
- package/dist/signals/lib/hash.mjs +0 -14
- package/dist/signals/lib/hash.test.d.mts +0 -1
- package/dist/signals/lib/hash.test.mjs +0 -46
- package/dist/signals/lib/hover.d.mts +0 -11
- package/dist/signals/lib/hover.mjs +0 -23
- package/dist/signals/lib/intersection-observer.d.mts +0 -8
- package/dist/signals/lib/is-document-visible.d.mts +0 -11
- package/dist/signals/lib/is-document-visible.mjs +0 -13
- package/dist/signals/lib/is-document-visible.test.d.mts +0 -1
- package/dist/signals/lib/is-document-visible.test.mjs +0 -58
- package/dist/signals/lib/is-focus-within.d.mts +0 -10
- package/dist/signals/lib/is-focus-within.mjs +0 -28
- package/dist/signals/lib/is-focus-within.test.d.mts +0 -1
- package/dist/signals/lib/is-idle.d.mts +0 -10
- package/dist/signals/lib/is-idle.mjs +0 -37
- package/dist/signals/lib/is-idle.test.d.mts +0 -1
- package/dist/signals/lib/is-idle.test.mjs +0 -50
- package/dist/signals/lib/is-in-viewport.d.mts +0 -10
- package/dist/signals/lib/is-in-viewport.mjs +0 -16
- package/dist/signals/lib/is-in-viewport.test.d.mts +0 -1
- package/dist/signals/lib/is-in-viewport.test.mjs +0 -74
- package/dist/signals/lib/key-press.d.mts +0 -13
- package/dist/signals/lib/key-press.mjs +0 -25
- package/dist/signals/lib/key-press.test.d.mts +0 -1
- package/dist/signals/lib/key-press.test.mjs +0 -52
- package/dist/signals/lib/list.d.mts +0 -19
- package/dist/signals/lib/list.mjs +0 -36
- package/dist/signals/lib/list.test.d.mts +0 -1
- package/dist/signals/lib/list.test.mjs +0 -104
- package/dist/signals/lib/lock-body-scroll.d.mts +0 -8
- package/dist/signals/lib/lock-body-scroll.mjs +0 -17
- package/dist/signals/lib/lock-body-scroll.test.d.mts +0 -1
- package/dist/signals/lib/lock-body-scroll.test.mjs +0 -37
- package/dist/signals/lib/long-press.d.mts +0 -10
- package/dist/signals/lib/long-press.mjs +0 -29
- package/dist/signals/lib/map.d.mts +0 -18
- package/dist/signals/lib/map.mjs +0 -33
- package/dist/signals/lib/map.test.d.mts +0 -1
- package/dist/signals/lib/map.test.mjs +0 -60
- package/dist/signals/lib/motion.d.mts +0 -15
- package/dist/signals/lib/motion.mjs +0 -27
- package/dist/signals/lib/motion.test.d.mts +0 -1
- package/dist/signals/lib/motion.test.mjs +0 -51
- package/dist/signals/lib/mouse-position.d.mts +0 -14
- package/dist/signals/lib/mouse-position.mjs +0 -22
- package/dist/signals/lib/mouse-position.test.d.mts +0 -1
- package/dist/signals/lib/mouse-position.test.mjs +0 -44
- package/dist/signals/lib/mouse-wheel.d.mts +0 -10
- package/dist/signals/lib/mouse-wheel.mjs +0 -17
- package/dist/signals/lib/mouse-wheel.test.d.mts +0 -1
- package/dist/signals/lib/mouse-wheel.test.mjs +0 -38
- package/dist/signals/lib/mutation-observer.d.mts +0 -8
- package/dist/signals/lib/network-state.d.mts +0 -17
- package/dist/signals/lib/network-state.mjs +0 -34
- package/dist/signals/lib/network-state.test.d.mts +0 -1
- package/dist/signals/lib/network-state.test.mjs +0 -61
- package/dist/signals/lib/on-click-outside.mjs +0 -20
- package/dist/signals/lib/orientation.d.mts +0 -13
- package/dist/signals/lib/orientation.test.d.mts +0 -1
- package/dist/signals/lib/orientation.test.mjs +0 -43
- package/dist/signals/lib/page-leave.d.mts +0 -8
- package/dist/signals/lib/page-leave.mjs +0 -12
- package/dist/signals/lib/page-leave.test.d.mts +0 -1
- package/dist/signals/lib/page-leave.test.mjs +0 -29
- package/dist/signals/lib/permission.d.mts +0 -14
- package/dist/signals/lib/permission.mjs +0 -26
- package/dist/signals/lib/permission.test.d.mts +0 -1
- package/dist/signals/lib/permission.test.mjs +0 -50
- package/dist/signals/lib/persisted-state.d.mts +0 -11
- package/dist/signals/lib/persisted-state.mjs +0 -25
- package/dist/signals/lib/persisted-state.test.d.mts +0 -1
- package/dist/signals/lib/persisted-state.test.mjs +0 -70
- package/dist/signals/lib/pressed-keys.d.mts +0 -10
- package/dist/signals/lib/pressed-keys.mjs +0 -32
- package/dist/signals/lib/pressed-keys.test.d.mts +0 -1
- package/dist/signals/lib/pressed-keys.test.mjs +0 -54
- package/dist/signals/lib/previous-distinct.d.mts +0 -10
- package/dist/signals/lib/previous-distinct.mjs +0 -22
- package/dist/signals/lib/previous-distinct.test.d.mts +0 -1
- package/dist/signals/lib/previous-distinct.test.mjs +0 -50
- package/dist/signals/lib/previous.d.mts +0 -10
- package/dist/signals/lib/previous.mjs +0 -18
- package/dist/signals/lib/previous.test.mjs +0 -47
- package/dist/signals/lib/queue.d.mts +0 -17
- package/dist/signals/lib/queue.mjs +0 -28
- package/dist/signals/lib/queue.test.d.mts +0 -1
- package/dist/signals/lib/queue.test.mjs +0 -61
- package/dist/signals/lib/raf.d.mts +0 -17
- package/dist/signals/lib/raf.mjs +0 -38
- package/dist/signals/lib/raf.test.d.mts +0 -1
- package/dist/signals/lib/raf.test.mjs +0 -58
- package/dist/signals/lib/resize-observer.d.mts +0 -8
- package/dist/signals/lib/resize-observer.test.d.mts +0 -1
- package/dist/signals/lib/resize-observer.test.mjs +0 -44
- package/dist/signals/lib/resource.d.mts +0 -23
- package/dist/signals/lib/resource.mjs +0 -43
- package/dist/signals/lib/resource.test.d.mts +0 -1
- package/dist/signals/lib/resource.test.mjs +0 -56
- package/dist/signals/lib/scroll-state.d.mts +0 -19
- package/dist/signals/lib/scroll-state.mjs +0 -46
- package/dist/signals/lib/scroll-state.test.d.mts +0 -1
- package/dist/signals/lib/scroll-state.test.mjs +0 -94
- package/dist/signals/lib/scrolling.d.mts +0 -12
- package/dist/signals/lib/scrolling.mjs +0 -26
- package/dist/signals/lib/scrolling.test.d.mts +0 -1
- package/dist/signals/lib/scrolling.test.mjs +0 -57
- package/dist/signals/lib/search-params.d.mts +0 -16
- package/dist/signals/lib/search-params.mjs +0 -37
- package/dist/signals/lib/search-params.test.mjs +0 -56
- package/dist/signals/lib/set.d.mts +0 -18
- package/dist/signals/lib/set.mjs +0 -38
- package/dist/signals/lib/set.test.d.mts +0 -1
- package/dist/signals/lib/set.test.mjs +0 -70
- package/dist/signals/lib/start-typing.d.mts +0 -9
- package/dist/signals/lib/start-typing.mjs +0 -39
- package/dist/signals/lib/start-typing.test.d.mts +0 -1
- package/dist/signals/lib/start-typing.test.mjs +0 -64
- package/dist/signals/lib/state-history.d.mts +0 -21
- package/dist/signals/lib/state-history.mjs +0 -61
- package/dist/signals/lib/state-history.test.d.mts +0 -1
- package/dist/signals/lib/state-history.test.mjs +0 -106
- package/dist/signals/lib/state-validator.d.mts +0 -16
- package/dist/signals/lib/state-validator.mjs +0 -21
- package/dist/signals/lib/state-validator.test.d.mts +0 -1
- package/dist/signals/lib/state-validator.test.mjs +0 -41
- package/dist/signals/lib/throttled.mjs +0 -45
- package/dist/signals/lib/timeout.mjs +0 -39
- package/dist/signals/lib/toggle.d.mts +0 -12
- package/dist/signals/lib/toggle.mjs +0 -12
- package/dist/signals/lib/toggle.test.d.mts +0 -1
- package/dist/signals/lib/toggle.test.mjs +0 -43
- package/dist/signals/lib/video.d.mts +0 -21
- package/dist/signals/lib/video.test.d.mts +0 -1
- package/dist/signals/lib/video.test.mjs +0 -51
- package/dist/signals/lib/watch.d.mts +0 -16
- package/dist/signals/lib/watch.mjs +0 -31
- package/dist/signals/lib/watch.test.d.mts +0 -1
- package/dist/signals/lib/watch.test.mjs +0 -51
- package/dist/signals/lib/window-size.d.mts +0 -14
- package/dist/signals/lib/window-size.mjs +0 -21
- package/dist/signals/lib/window-size.test.mjs +0 -50
- /package/dist/{signals/lib → utilities}/active-element.test.d.mts +0 -0
- /package/dist/{signals/lib → utilities}/debounced.test.d.mts +0 -0
- /package/dist/{signals/lib → utilities}/element-rect.test.d.mts +0 -0
- /package/dist/{signals/lib/animation-frames.test.d.mts → utilities/element-scroll.test.d.mts} +0 -0
- /package/dist/{signals/lib → utilities}/event-listener.test.d.mts +0 -0
- /package/dist/{signals/lib/async-retry.test.d.mts → utilities/focus-within.test.d.mts} +0 -0
- /package/dist/{signals/lib → utilities}/hover.test.d.mts +0 -0
- /package/dist/{signals/lib → utilities}/intersection-observer.test.d.mts +0 -0
- /package/dist/{signals/lib → utilities}/interval.test.d.mts +0 -0
- /package/dist/{signals/lib/audio.test.d.mts → utilities/location.test.d.mts} +0 -0
- /package/dist/{signals/lib → utilities}/long-press.test.d.mts +0 -0
- /package/dist/{signals/lib → utilities}/media-devices.test.d.mts +0 -0
- /package/dist/{signals/lib/battery.test.d.mts → utilities/media-player.test.d.mts} +0 -0
- /package/dist/{signals/lib → utilities}/mutation-observer.test.d.mts +0 -0
- /package/dist/{signals/lib → utilities}/on-click-outside.test.d.mts +0 -0
- /package/dist/{signals/lib → utilities}/previous.test.d.mts +0 -0
- /package/dist/{signals/lib/before-unload.test.d.mts → utilities/routing.test.d.mts} +0 -0
- /package/dist/{signals/lib → utilities}/search-params.test.d.mts +0 -0
- /package/dist/{signals/lib/clipboard.test.d.mts → utilities/storage.test.d.mts} +0 -0
- /package/dist/{signals/lib → utilities}/throttled.test.d.mts +0 -0
- /package/dist/{signals/lib → utilities}/timeout.test.d.mts +0 -0
- /package/dist/{signals/lib → utilities}/window-size.test.d.mts +0 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { r as Signal, t as Computed } from "../index-Cvdhuy6Y.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/utilities/media-player.d.ts
|
|
4
|
+
type MediaPlayerResult<T extends HTMLMediaElement> = {
|
|
5
|
+
element: T;
|
|
6
|
+
playing: Computed<boolean>;
|
|
7
|
+
muted: Signal<boolean>;
|
|
8
|
+
volume: Signal<number>;
|
|
9
|
+
duration: Computed<number>;
|
|
10
|
+
time: Signal<number>;
|
|
11
|
+
ended: Computed<boolean>;
|
|
12
|
+
play(): void;
|
|
13
|
+
pause(): void;
|
|
14
|
+
toggle(): void;
|
|
15
|
+
} & Disposable;
|
|
16
|
+
/**
|
|
17
|
+
* Wraps an `HTMLMediaElement` (`<audio>` or `<video>`) with reactive state
|
|
18
|
+
* and playback controls.
|
|
19
|
+
*/
|
|
20
|
+
declare function createMediaPlayer<T extends HTMLMediaElement>(element: T): MediaPlayerResult<T>;
|
|
21
|
+
//#endregion
|
|
22
|
+
export { createMediaPlayer };
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { fromEvent, sync } from "./event-driven.mjs";
|
|
2
|
-
//#region src/
|
|
2
|
+
//#region src/utilities/media-player.ts
|
|
3
3
|
/**
|
|
4
|
-
* Wraps an `
|
|
4
|
+
* Wraps an `HTMLMediaElement` (`<audio>` or `<video>`) with reactive state
|
|
5
|
+
* and playback controls.
|
|
5
6
|
*/
|
|
6
|
-
function
|
|
7
|
+
function createMediaPlayer(element) {
|
|
7
8
|
const el = element;
|
|
8
9
|
const [playing] = sync(fromEvent(el, ["play", "pause"]), () => !el.paused);
|
|
9
10
|
const [muted] = sync(fromEvent(el, "volumechange"), () => el.muted, (v) => {
|
|
@@ -32,4 +33,4 @@ function createVideo(element) {
|
|
|
32
33
|
};
|
|
33
34
|
}
|
|
34
35
|
//#endregion
|
|
35
|
-
export {
|
|
36
|
+
export { createMediaPlayer };
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { s as effectScope } from "../signals-DcgXhkU2.mjs";
|
|
2
|
+
import { n as vi, o as describe, r as afterEach, s as it, t as globalExpect } from "../test.BmQO5GaM-ANkhHvbr.mjs";
|
|
3
|
+
import { createMediaPlayer } from "./media-player.mjs";
|
|
4
|
+
//#region src/utilities/media-player.test.ts
|
|
5
|
+
afterEach(() => {
|
|
6
|
+
document.body.innerHTML = "";
|
|
7
|
+
vi.restoreAllMocks();
|
|
8
|
+
});
|
|
9
|
+
describe("createMediaPlayer", () => {
|
|
10
|
+
describe("with <audio>", () => {
|
|
11
|
+
it("accepts an HTMLAudioElement", () => {
|
|
12
|
+
const el = new Audio();
|
|
13
|
+
let a;
|
|
14
|
+
effectScope(() => {
|
|
15
|
+
a = createMediaPlayer(el);
|
|
16
|
+
});
|
|
17
|
+
globalExpect(a.element).toBe(el);
|
|
18
|
+
});
|
|
19
|
+
it("starts as paused", () => {
|
|
20
|
+
let a;
|
|
21
|
+
effectScope(() => {
|
|
22
|
+
a = createMediaPlayer(new Audio());
|
|
23
|
+
});
|
|
24
|
+
globalExpect(a.playing()).toBe(false);
|
|
25
|
+
});
|
|
26
|
+
it("muted(true) sets muted to true", () => {
|
|
27
|
+
let a;
|
|
28
|
+
effectScope(() => {
|
|
29
|
+
a = createMediaPlayer(new Audio());
|
|
30
|
+
});
|
|
31
|
+
a.muted(true);
|
|
32
|
+
globalExpect(a.element.muted).toBe(true);
|
|
33
|
+
});
|
|
34
|
+
it("volume() clamps to [0, 1]", () => {
|
|
35
|
+
let a;
|
|
36
|
+
effectScope(() => {
|
|
37
|
+
a = createMediaPlayer(new Audio());
|
|
38
|
+
});
|
|
39
|
+
a.volume(2);
|
|
40
|
+
globalExpect(a.element.volume).toBe(1);
|
|
41
|
+
a.volume(-1);
|
|
42
|
+
globalExpect(a.element.volume).toBe(0);
|
|
43
|
+
});
|
|
44
|
+
it("removes event listeners when scope is disposed", () => {
|
|
45
|
+
const removeSpy = vi.fn();
|
|
46
|
+
const el = new Audio();
|
|
47
|
+
let dispose;
|
|
48
|
+
let a;
|
|
49
|
+
dispose = effectScope(() => {
|
|
50
|
+
a = createMediaPlayer(el);
|
|
51
|
+
});
|
|
52
|
+
vi.spyOn(a.element, "removeEventListener").mockImplementation(removeSpy);
|
|
53
|
+
dispose();
|
|
54
|
+
globalExpect(removeSpy).toHaveBeenCalled();
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
describe("with <video>", () => {
|
|
58
|
+
it("accepts an HTMLVideoElement", () => {
|
|
59
|
+
const el = document.createElement("video");
|
|
60
|
+
document.body.appendChild(el);
|
|
61
|
+
let v;
|
|
62
|
+
effectScope(() => {
|
|
63
|
+
v = createMediaPlayer(el);
|
|
64
|
+
});
|
|
65
|
+
globalExpect(v.element).toBe(el);
|
|
66
|
+
});
|
|
67
|
+
it("starts as paused", () => {
|
|
68
|
+
const el = document.createElement("video");
|
|
69
|
+
document.body.appendChild(el);
|
|
70
|
+
let v;
|
|
71
|
+
effectScope(() => {
|
|
72
|
+
v = createMediaPlayer(el);
|
|
73
|
+
});
|
|
74
|
+
globalExpect(v.playing()).toBe(false);
|
|
75
|
+
});
|
|
76
|
+
it("time(v) updates currentTime", () => {
|
|
77
|
+
const el = document.createElement("video");
|
|
78
|
+
document.body.appendChild(el);
|
|
79
|
+
let v;
|
|
80
|
+
effectScope(() => {
|
|
81
|
+
v = createMediaPlayer(el);
|
|
82
|
+
});
|
|
83
|
+
v.time(30);
|
|
84
|
+
globalExpect(el.currentTime).toBe(30);
|
|
85
|
+
});
|
|
86
|
+
it("removes event listeners when scope is disposed", () => {
|
|
87
|
+
const el = document.createElement("video");
|
|
88
|
+
document.body.appendChild(el);
|
|
89
|
+
let dispose;
|
|
90
|
+
dispose = effectScope(() => {
|
|
91
|
+
createMediaPlayer(el);
|
|
92
|
+
});
|
|
93
|
+
const removeSpy = vi.spyOn(el, "removeEventListener");
|
|
94
|
+
dispose();
|
|
95
|
+
globalExpect(removeSpy).toHaveBeenCalled();
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
//#endregion
|
|
100
|
+
export {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { t as Computed } from "
|
|
1
|
+
import { t as Computed } from "../index-Cvdhuy6Y.mjs";
|
|
2
2
|
|
|
3
|
-
//#region src/
|
|
3
|
+
//#region src/utilities/media-query.d.ts
|
|
4
4
|
declare const isBrowser: boolean;
|
|
5
5
|
/**
|
|
6
6
|
* Creates a signal that tracks a CSS media query.
|
|
@@ -9,6 +9,6 @@ declare const isBrowser: boolean;
|
|
|
9
9
|
* @param defaultState The default value (for SSR/hydration)
|
|
10
10
|
* @returns Computed<boolean> that is true if the query matches
|
|
11
11
|
*/
|
|
12
|
-
declare function
|
|
12
|
+
declare function createMediaQuery(query: string, defaultState?: boolean): Computed<boolean>;
|
|
13
13
|
//#endregion
|
|
14
|
-
export {
|
|
14
|
+
export { createMediaQuery, isBrowser };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { p as signal } from "../signals-DcgXhkU2.mjs";
|
|
2
2
|
import { fromEvent, sync } from "./event-driven.mjs";
|
|
3
|
-
//#region src/
|
|
3
|
+
//#region src/utilities/media-query.ts
|
|
4
4
|
const isBrowser = typeof window !== "undefined";
|
|
5
5
|
/**
|
|
6
6
|
* Creates a signal that tracks a CSS media query.
|
|
@@ -9,11 +9,11 @@ const isBrowser = typeof window !== "undefined";
|
|
|
9
9
|
* @param defaultState The default value (for SSR/hydration)
|
|
10
10
|
* @returns Computed<boolean> that is true if the query matches
|
|
11
11
|
*/
|
|
12
|
-
function
|
|
12
|
+
function createMediaQuery(query, defaultState) {
|
|
13
13
|
if (!isBrowser) return signal(defaultState ?? false);
|
|
14
14
|
const mql = window.matchMedia(query);
|
|
15
|
-
const [state
|
|
16
|
-
return
|
|
15
|
+
const [state] = sync(fromEvent(mql, "change"), () => mql.matches);
|
|
16
|
+
return state;
|
|
17
17
|
}
|
|
18
18
|
//#endregion
|
|
19
|
-
export {
|
|
19
|
+
export { createMediaQuery, isBrowser };
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
//#region src/utilities/mutation-observer.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Watches `target` for DOM mutations and calls `callback` with each batch of
|
|
4
|
+
* `MutationRecord`s.
|
|
5
|
+
*/
|
|
6
|
+
declare function createMutationObserver(target: Element, options: MutationObserverInit, callback: (records: MutationRecord[]) => void): Disposable;
|
|
7
|
+
//#endregion
|
|
8
|
+
export { createMutationObserver };
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
//#region src/
|
|
1
|
+
import { f as onCleanup } from "../signals-DcgXhkU2.mjs";
|
|
2
|
+
//#region src/utilities/mutation-observer.ts
|
|
3
3
|
/**
|
|
4
4
|
* Watches `target` for DOM mutations and calls `callback` with each batch of
|
|
5
5
|
* `MutationRecord`s.
|
|
6
6
|
*/
|
|
7
7
|
function createMutationObserver(target, options, callback) {
|
|
8
8
|
const observer = new MutationObserver((records) => callback(records));
|
|
9
|
-
const el =
|
|
9
|
+
const el = target;
|
|
10
10
|
if (el) observer.observe(el, options);
|
|
11
11
|
const cleanup = () => observer.disconnect();
|
|
12
12
|
onCleanup(cleanup);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { s as effectScope } from "../signals-DcgXhkU2.mjs";
|
|
2
|
+
import { n as vi, o as describe, r as afterEach, s as it, t as globalExpect } from "../test.BmQO5GaM-ANkhHvbr.mjs";
|
|
3
3
|
import { createMutationObserver } from "./mutation-observer.mjs";
|
|
4
|
-
//#region src/
|
|
4
|
+
//#region src/utilities/mutation-observer.test.ts
|
|
5
5
|
afterEach(() => {
|
|
6
6
|
document.body.innerHTML = "";
|
|
7
7
|
vi.unstubAllGlobals();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//#region src/
|
|
1
|
+
//#region src/utilities/on-click-outside.d.ts
|
|
2
2
|
/**
|
|
3
3
|
* Fires `handler` whenever a pointer-down event occurs outside `target`.
|
|
4
4
|
*
|
|
@@ -6,6 +6,6 @@
|
|
|
6
6
|
* touch input. Cleanup is registered automatically when called inside an
|
|
7
7
|
* effect or scope.
|
|
8
8
|
*/
|
|
9
|
-
declare function
|
|
9
|
+
declare function onClickOutside(target: Element, handler: (e: PointerEvent) => void): () => void;
|
|
10
10
|
//#endregion
|
|
11
|
-
export {
|
|
11
|
+
export { onClickOutside };
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { on } from "./event-listener.mjs";
|
|
2
|
+
//#region src/utilities/on-click-outside.ts
|
|
3
|
+
/**
|
|
4
|
+
* Fires `handler` whenever a pointer-down event occurs outside `target`.
|
|
5
|
+
*
|
|
6
|
+
* Built on a `document` `pointerdown` listener so it works for both mouse and
|
|
7
|
+
* touch input. Cleanup is registered automatically when called inside an
|
|
8
|
+
* effect or scope.
|
|
9
|
+
*/
|
|
10
|
+
function onClickOutside(target, handler) {
|
|
11
|
+
const listener = (e) => {
|
|
12
|
+
if (!target.contains(e.target)) handler(e);
|
|
13
|
+
};
|
|
14
|
+
return on(document, "pointerdown", listener);
|
|
15
|
+
}
|
|
16
|
+
//#endregion
|
|
17
|
+
export { onClickOutside };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
//#region src/
|
|
1
|
+
import { s as effectScope } from "../signals-DcgXhkU2.mjs";
|
|
2
|
+
import { n as vi, o as describe, r as afterEach, s as it, t as globalExpect } from "../test.BmQO5GaM-ANkhHvbr.mjs";
|
|
3
|
+
import { onClickOutside } from "./on-click-outside.mjs";
|
|
4
|
+
//#region src/utilities/on-click-outside.test.ts
|
|
5
5
|
afterEach(() => {
|
|
6
6
|
document.body.innerHTML = "";
|
|
7
7
|
});
|
|
@@ -12,7 +12,7 @@ describe("createOnClickOutside", () => {
|
|
|
12
12
|
document.body.append(inside, outside);
|
|
13
13
|
const handler = vi.fn();
|
|
14
14
|
effectScope(() => {
|
|
15
|
-
|
|
15
|
+
onClickOutside(inside, handler);
|
|
16
16
|
});
|
|
17
17
|
outside.dispatchEvent(new PointerEvent("pointerdown", { bubbles: true }));
|
|
18
18
|
globalExpect(handler).toHaveBeenCalledOnce();
|
|
@@ -22,7 +22,7 @@ describe("createOnClickOutside", () => {
|
|
|
22
22
|
document.body.appendChild(el);
|
|
23
23
|
const handler = vi.fn();
|
|
24
24
|
effectScope(() => {
|
|
25
|
-
|
|
25
|
+
onClickOutside(el, handler);
|
|
26
26
|
});
|
|
27
27
|
el.dispatchEvent(new PointerEvent("pointerdown", { bubbles: true }));
|
|
28
28
|
globalExpect(handler).not.toHaveBeenCalled();
|
|
@@ -33,22 +33,11 @@ describe("createOnClickOutside", () => {
|
|
|
33
33
|
document.body.append(inside, outside);
|
|
34
34
|
const handler = vi.fn();
|
|
35
35
|
effectScope(() => {
|
|
36
|
-
|
|
36
|
+
onClickOutside(inside, handler);
|
|
37
37
|
})();
|
|
38
38
|
outside.dispatchEvent(new PointerEvent("pointerdown", { bubbles: true }));
|
|
39
39
|
globalExpect(handler).not.toHaveBeenCalled();
|
|
40
40
|
});
|
|
41
|
-
it("works with a reactive target getter", () => {
|
|
42
|
-
const el = document.createElement("div");
|
|
43
|
-
const outside = document.createElement("span");
|
|
44
|
-
document.body.append(el, outside);
|
|
45
|
-
const handler = vi.fn();
|
|
46
|
-
effectScope(() => {
|
|
47
|
-
createOnClickOutside(() => el, handler);
|
|
48
|
-
});
|
|
49
|
-
outside.dispatchEvent(new PointerEvent("pointerdown", { bubbles: true }));
|
|
50
|
-
globalExpect(handler).toHaveBeenCalledOnce();
|
|
51
|
-
});
|
|
52
41
|
});
|
|
53
42
|
//#endregion
|
|
54
43
|
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { t as Computed } from "../index-Cvdhuy6Y.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/utilities/orientation.d.ts
|
|
4
|
+
type OrientationResult = {
|
|
5
|
+
angle: Computed<number>;
|
|
6
|
+
type: Computed<OrientationType>;
|
|
7
|
+
} & Disposable;
|
|
8
|
+
declare const orientation: OrientationResult;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { orientation };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { fromEvent, sync } from "./event-driven.mjs";
|
|
2
|
-
//#region src/
|
|
2
|
+
//#region src/utilities/orientation.ts
|
|
3
3
|
/**
|
|
4
4
|
* Returns reactive signals for the screen orientation.
|
|
5
5
|
*/
|
|
@@ -16,5 +16,6 @@ function createOrientation() {
|
|
|
16
16
|
}
|
|
17
17
|
};
|
|
18
18
|
}
|
|
19
|
+
const orientation = createOrientation();
|
|
19
20
|
//#endregion
|
|
20
|
-
export {
|
|
21
|
+
export { orientation };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { t as Computed } from "../index-Cvdhuy6Y.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/utilities/previous.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Returns a `Computed` that always holds the *previous* value of `source`.
|
|
6
|
+
* Starts as `undefined` until the source changes for the first time.
|
|
7
|
+
*
|
|
8
|
+
* When `ignore` is provided, the previous value only updates when the ignore check fails.
|
|
9
|
+
*/
|
|
10
|
+
declare function createPrevious<T>(source: Computed<T>, ignore?: (a: T, b: T) => boolean): Computed<T | undefined>;
|
|
11
|
+
//#endregion
|
|
12
|
+
export { createPrevious };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { o as effect, p as signal } from "../signals-DcgXhkU2.mjs";
|
|
2
|
+
//#region src/utilities/previous.ts
|
|
3
|
+
/**
|
|
4
|
+
* Returns a `Computed` that always holds the *previous* value of `source`.
|
|
5
|
+
* Starts as `undefined` until the source changes for the first time.
|
|
6
|
+
*
|
|
7
|
+
* When `ignore` is provided, the previous value only updates when the ignore check fails.
|
|
8
|
+
*/
|
|
9
|
+
function createPrevious(source, ignore) {
|
|
10
|
+
const prev = signal(void 0);
|
|
11
|
+
let current;
|
|
12
|
+
let initialized = false;
|
|
13
|
+
effect(() => {
|
|
14
|
+
const next = source();
|
|
15
|
+
if (!initialized || !ignore || !ignore(next, current)) {
|
|
16
|
+
prev(current);
|
|
17
|
+
current = next;
|
|
18
|
+
initialized = true;
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
return prev;
|
|
22
|
+
}
|
|
23
|
+
//#endregion
|
|
24
|
+
export { createPrevious };
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { p as signal, s as effectScope } from "../signals-DcgXhkU2.mjs";
|
|
2
|
+
import { o as describe, s as it, t as globalExpect } from "../test.BmQO5GaM-ANkhHvbr.mjs";
|
|
3
|
+
import { createPrevious } from "./previous.mjs";
|
|
4
|
+
//#region src/utilities/previous.test.ts
|
|
5
|
+
describe("createPrevious", () => {
|
|
6
|
+
it("starts as undefined", () => {
|
|
7
|
+
const s = signal(1);
|
|
8
|
+
let p;
|
|
9
|
+
effectScope(() => {
|
|
10
|
+
p = createPrevious(s);
|
|
11
|
+
});
|
|
12
|
+
globalExpect(p()).toBeUndefined();
|
|
13
|
+
});
|
|
14
|
+
it("returns the previous value after a change", () => {
|
|
15
|
+
const s = signal(1);
|
|
16
|
+
let p;
|
|
17
|
+
effectScope(() => {
|
|
18
|
+
p = createPrevious(s);
|
|
19
|
+
});
|
|
20
|
+
s(2);
|
|
21
|
+
globalExpect(p()).toBe(1);
|
|
22
|
+
});
|
|
23
|
+
it("tracks each successive previous value", () => {
|
|
24
|
+
const s = signal("a");
|
|
25
|
+
let p;
|
|
26
|
+
effectScope(() => {
|
|
27
|
+
p = createPrevious(s);
|
|
28
|
+
});
|
|
29
|
+
s("b");
|
|
30
|
+
globalExpect(p()).toBe("a");
|
|
31
|
+
s("c");
|
|
32
|
+
globalExpect(p()).toBe("b");
|
|
33
|
+
});
|
|
34
|
+
it("does not update after scope disposal", () => {
|
|
35
|
+
const s = signal(10);
|
|
36
|
+
let p;
|
|
37
|
+
const stop = effectScope(() => {
|
|
38
|
+
p = createPrevious(s);
|
|
39
|
+
});
|
|
40
|
+
s(20);
|
|
41
|
+
stop();
|
|
42
|
+
s(30);
|
|
43
|
+
globalExpect(p()).toBe(10);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
describe("createPrevious with isEqual (distinct mode)", () => {
|
|
47
|
+
it("starts as undefined", () => {
|
|
48
|
+
const s = signal(0);
|
|
49
|
+
let prev;
|
|
50
|
+
effectScope(() => {
|
|
51
|
+
prev = createPrevious(s, Object.is);
|
|
52
|
+
});
|
|
53
|
+
globalExpect(prev()).toBeUndefined();
|
|
54
|
+
});
|
|
55
|
+
it("updates previous when value changes", () => {
|
|
56
|
+
const s = signal(0);
|
|
57
|
+
let prev;
|
|
58
|
+
effectScope(() => {
|
|
59
|
+
prev = createPrevious(s, Object.is);
|
|
60
|
+
});
|
|
61
|
+
s(1);
|
|
62
|
+
globalExpect(prev()).toBe(0);
|
|
63
|
+
});
|
|
64
|
+
it("does not update previous when value is the same", () => {
|
|
65
|
+
const s = signal(0);
|
|
66
|
+
let prev;
|
|
67
|
+
effectScope(() => {
|
|
68
|
+
prev = createPrevious(s, Object.is);
|
|
69
|
+
});
|
|
70
|
+
s(1);
|
|
71
|
+
globalExpect(prev()).toBe(0);
|
|
72
|
+
s(1);
|
|
73
|
+
globalExpect(prev()).toBe(0);
|
|
74
|
+
});
|
|
75
|
+
it("uses a custom equality function", () => {
|
|
76
|
+
const s = signal({ id: 1 });
|
|
77
|
+
let prev;
|
|
78
|
+
effectScope(() => {
|
|
79
|
+
prev = createPrevious(s, (a, b) => a.id === b.id);
|
|
80
|
+
});
|
|
81
|
+
s({ id: 1 });
|
|
82
|
+
globalExpect(prev()).toBeUndefined();
|
|
83
|
+
s({ id: 2 });
|
|
84
|
+
globalExpect(prev()?.id).toBe(1);
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
//#endregion
|
|
88
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
//#region src/utilities/resize-observer.d.ts
|
|
2
|
+
/**
|
|
3
|
+
* Raw `ResizeObserver` wrapper with automatic cleanup.
|
|
4
|
+
* Use `createElementRect` for the common case.
|
|
5
|
+
*/
|
|
6
|
+
declare function createResizeObserver(target: Element, callback: ResizeObserverCallback): Disposable;
|
|
7
|
+
//#endregion
|
|
8
|
+
export { createResizeObserver };
|
|
@@ -1,13 +1,12 @@
|
|
|
1
|
-
import {
|
|
2
|
-
//#region src/
|
|
1
|
+
import { f as onCleanup } from "../signals-DcgXhkU2.mjs";
|
|
2
|
+
//#region src/utilities/resize-observer.ts
|
|
3
3
|
/**
|
|
4
4
|
* Raw `ResizeObserver` wrapper with automatic cleanup.
|
|
5
|
-
* Use `
|
|
5
|
+
* Use `createElementRect` for the common case.
|
|
6
6
|
*/
|
|
7
7
|
function createResizeObserver(target, callback) {
|
|
8
8
|
const observer = new ResizeObserver(callback);
|
|
9
|
-
|
|
10
|
-
if (el) observer.observe(el);
|
|
9
|
+
if (target) observer.observe(target);
|
|
11
10
|
const cleanup = () => observer.disconnect();
|
|
12
11
|
onCleanup(cleanup);
|
|
13
12
|
return { [Symbol.dispose]: cleanup };
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { t as Computed } from "../index-Cvdhuy6Y.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/utilities/routing.d.ts
|
|
4
|
+
declare function patchHistory(): void;
|
|
5
|
+
type NavigateOptions = {
|
|
6
|
+
replace?: boolean;
|
|
7
|
+
state?: unknown;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Navigates to `url` via `history.pushState` (or `replaceState` when
|
|
11
|
+
* `replace` is `true`).
|
|
12
|
+
*
|
|
13
|
+
* `history.pushState` / `replaceState` are patched once at module load so
|
|
14
|
+
* all navigation — including third-party router calls — dispatches the
|
|
15
|
+
* `pushstate` / `replacestate` events that `currentLocation` signals react to.
|
|
16
|
+
*/
|
|
17
|
+
declare function navigate(url: string | URL, {
|
|
18
|
+
replace,
|
|
19
|
+
state
|
|
20
|
+
}?: NavigateOptions): void;
|
|
21
|
+
/**
|
|
22
|
+
* Returns `true` when a click event on an `<a>` element should be handled
|
|
23
|
+
* client-side — same origin, primary button, no modifier keys, no download,
|
|
24
|
+
* no `_blank` target. Walks up to the nearest anchor via `closest("a")`.
|
|
25
|
+
*
|
|
26
|
+
* Use alongside `navigate()` to intercept anchor clicks:
|
|
27
|
+
*
|
|
28
|
+
* ```ts
|
|
29
|
+
* el.addEventListener("click", (e) => {
|
|
30
|
+
* if (isLocalNavigationEvent(e)) { e.preventDefault(); navigate(el.href); }
|
|
31
|
+
* });
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
declare function isLocalNavigationEvent(e: MouseEvent): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* Returns `Computed<boolean>` — `true` when the current URL matches `input`.
|
|
37
|
+
* Uses `URLPattern.test()` — faster than `match` when you don't need
|
|
38
|
+
* captured groups.
|
|
39
|
+
*
|
|
40
|
+
* Use object form: `{ pathname: "/users/:id" }`. Relative string patterns
|
|
41
|
+
* require a base URL and will throw.
|
|
42
|
+
*
|
|
43
|
+
* Requires `urlpattern-polyfill` for Safari < 26 and Firefox < 142.
|
|
44
|
+
*/
|
|
45
|
+
declare function matches(input: URLPatternInput, options?: URLPatternOptions): Computed<boolean>;
|
|
46
|
+
/**
|
|
47
|
+
* Returns `Computed<URLPatternResult | null>` — the full match result when
|
|
48
|
+
* the current URL matches `input`, `null` when it does not.
|
|
49
|
+
* Use when you need captured groups (params). For a boolean gate,
|
|
50
|
+
* prefer `matches()` which is faster.
|
|
51
|
+
*
|
|
52
|
+
* Use object form: `{ pathname: "/users/:id" }`. Relative string patterns
|
|
53
|
+
* require a base URL and will throw.
|
|
54
|
+
*
|
|
55
|
+
* Requires `urlpattern-polyfill` for Safari < 26 and Firefox < 142.
|
|
56
|
+
*/
|
|
57
|
+
declare function match(input: URLPatternInput, options?: URLPatternOptions): Computed<URLPatternResult | null>;
|
|
58
|
+
//#endregion
|
|
59
|
+
export { isLocalNavigationEvent, match, matches, navigate, patchHistory };
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { a as computed } from "../signals-DcgXhkU2.mjs";
|
|
2
|
+
import { currentLocation } from "./location.mjs";
|
|
3
|
+
//#region src/utilities/routing.ts
|
|
4
|
+
const patchHistoryMethod = (method) => {
|
|
5
|
+
const original = history[method];
|
|
6
|
+
history[method] = function(data, unused, url) {
|
|
7
|
+
const result = original.apply(this, [
|
|
8
|
+
data,
|
|
9
|
+
unused,
|
|
10
|
+
url
|
|
11
|
+
]);
|
|
12
|
+
const event = new Event(method.toLowerCase());
|
|
13
|
+
event.state = data;
|
|
14
|
+
window.dispatchEvent(event);
|
|
15
|
+
return result;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
function patchHistory() {
|
|
19
|
+
if (typeof window !== "undefined" && typeof history !== "undefined") {
|
|
20
|
+
patchHistoryMethod("pushState");
|
|
21
|
+
patchHistoryMethod("replaceState");
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Navigates to `url` via `history.pushState` (or `replaceState` when
|
|
26
|
+
* `replace` is `true`).
|
|
27
|
+
*
|
|
28
|
+
* `history.pushState` / `replaceState` are patched once at module load so
|
|
29
|
+
* all navigation — including third-party router calls — dispatches the
|
|
30
|
+
* `pushstate` / `replacestate` events that `currentLocation` signals react to.
|
|
31
|
+
*/
|
|
32
|
+
function navigate(url, { replace = false, state = null } = {}) {
|
|
33
|
+
if (replace) history.replaceState(state, "", url);
|
|
34
|
+
else history.pushState(state, "", url);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Returns `true` when a click event on an `<a>` element should be handled
|
|
38
|
+
* client-side — same origin, primary button, no modifier keys, no download,
|
|
39
|
+
* no `_blank` target. Walks up to the nearest anchor via `closest("a")`.
|
|
40
|
+
*
|
|
41
|
+
* Use alongside `navigate()` to intercept anchor clicks:
|
|
42
|
+
*
|
|
43
|
+
* ```ts
|
|
44
|
+
* el.addEventListener("click", (e) => {
|
|
45
|
+
* if (isLocalNavigationEvent(e)) { e.preventDefault(); navigate(el.href); }
|
|
46
|
+
* });
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
function isLocalNavigationEvent(e) {
|
|
50
|
+
if (e.button !== 0) return false;
|
|
51
|
+
if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return false;
|
|
52
|
+
const el = e.currentTarget?.closest("a") ?? e.target?.closest("a");
|
|
53
|
+
if (!el) return false;
|
|
54
|
+
if (el.hasAttribute("download")) return false;
|
|
55
|
+
if (el.getAttribute("target") === "_blank") return false;
|
|
56
|
+
if (new URL(el.href, location.href).origin !== location.origin) return false;
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Returns `Computed<boolean>` — `true` when the current URL matches `input`.
|
|
61
|
+
* Uses `URLPattern.test()` — faster than `match` when you don't need
|
|
62
|
+
* captured groups.
|
|
63
|
+
*
|
|
64
|
+
* Use object form: `{ pathname: "/users/:id" }`. Relative string patterns
|
|
65
|
+
* require a base URL and will throw.
|
|
66
|
+
*
|
|
67
|
+
* Requires `urlpattern-polyfill` for Safari < 26 and Firefox < 142.
|
|
68
|
+
*/
|
|
69
|
+
function matches(input, options) {
|
|
70
|
+
const pattern = options ? new URLPattern(input, options) : new URLPattern(input);
|
|
71
|
+
return computed(() => pattern.test(currentLocation.href()));
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Returns `Computed<URLPatternResult | null>` — the full match result when
|
|
75
|
+
* the current URL matches `input`, `null` when it does not.
|
|
76
|
+
* Use when you need captured groups (params). For a boolean gate,
|
|
77
|
+
* prefer `matches()` which is faster.
|
|
78
|
+
*
|
|
79
|
+
* Use object form: `{ pathname: "/users/:id" }`. Relative string patterns
|
|
80
|
+
* require a base URL and will throw.
|
|
81
|
+
*
|
|
82
|
+
* Requires `urlpattern-polyfill` for Safari < 26 and Firefox < 142.
|
|
83
|
+
*/
|
|
84
|
+
function match(input, options) {
|
|
85
|
+
const pattern = options ? new URLPattern(input, options) : new URLPattern(input);
|
|
86
|
+
return computed(() => pattern.exec(currentLocation.href()));
|
|
87
|
+
}
|
|
88
|
+
//#endregion
|
|
89
|
+
export { isLocalNavigationEvent, match, matches, navigate, patchHistory };
|