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
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "elements-kit",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.0.
|
|
4
|
+
"version": "0.0.11",
|
|
5
5
|
"description": "A lightweight reactive UI library that transforms native HTMLElements into reactive components with signals. Ideal for framework-agnostic applications and web components.",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"webcomponents",
|
|
@@ -33,11 +33,6 @@
|
|
|
33
33
|
"import": "./dist/signals/index.mjs",
|
|
34
34
|
"types": "./dist/signals/index.d.ts"
|
|
35
35
|
},
|
|
36
|
-
"./signals/*": {
|
|
37
|
-
"source": "./src/signals/lib/*.ts",
|
|
38
|
-
"import": "./dist/signals/lib/*.mjs",
|
|
39
|
-
"types": "./dist/signals/lib/*.d.ts"
|
|
40
|
-
},
|
|
41
36
|
"./slot": {
|
|
42
37
|
"source": "./src/slot.ts",
|
|
43
38
|
"import": "./dist/slot.mjs",
|
|
@@ -67,6 +62,16 @@
|
|
|
67
62
|
"source": "./src/jsx-runtime/index.ts",
|
|
68
63
|
"import": "./dist/jsx-runtime/index.mjs",
|
|
69
64
|
"types": "./dist/jsx-runtime/index.d.ts"
|
|
65
|
+
},
|
|
66
|
+
"./integrations/*": {
|
|
67
|
+
"source": "./src/integrations/*.ts",
|
|
68
|
+
"import": "./dist/integrations/*.mjs",
|
|
69
|
+
"types": "./dist/integrations/*.d.ts"
|
|
70
|
+
},
|
|
71
|
+
"./utilities/*": {
|
|
72
|
+
"source": "./src/utilities/*.ts",
|
|
73
|
+
"import": "./dist/utilities/*.mjs",
|
|
74
|
+
"types": "./dist/utilities/*.d.ts"
|
|
70
75
|
}
|
|
71
76
|
},
|
|
72
77
|
"scripts": {
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import { t as PrimitiveNodeType } from "./polyfill-AFIi9kAN.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/builder/index.d.ts
|
|
4
|
-
declare const DISPOSABLES: unique symbol;
|
|
5
|
-
declare const DISPOSE: symbol;
|
|
6
|
-
declare const VALUE: unique symbol;
|
|
7
|
-
declare const EFFECT: unique symbol;
|
|
8
|
-
declare class ElementBuilder<T extends Element = Element> {
|
|
9
|
-
/** Dispose the reactive element and run all cleanup functions */
|
|
10
|
-
[DISPOSE]: () => void;
|
|
11
|
-
/** The underlying DOM element */
|
|
12
|
-
private [VALUE];
|
|
13
|
-
/** A set of cleanup functions to run when disposing the element */
|
|
14
|
-
private [DISPOSABLES];
|
|
15
|
-
[EFFECT](fn: () => void): this;
|
|
16
|
-
private constructor();
|
|
17
|
-
static create<T extends Element>(el: T): ReactiveElement<T>;
|
|
18
|
-
children(...children: ValueOrReactive<ElementBuilder | Node | string | number>[]): T;
|
|
19
|
-
ref(): T;
|
|
20
|
-
ref(apply: (ref: T) => void | (() => void)): this;
|
|
21
|
-
on<K extends keyof HTMLElementEventMap>(eventType: K, listener: (ev: HTMLElementEventMap[K]) => void, options?: boolean | AddEventListenerOptions): this;
|
|
22
|
-
}
|
|
23
|
-
declare function toNode(c: ElementBuilder | PrimitiveNodeType): Node;
|
|
24
|
-
declare function builder<T extends Element>(el: T): ReactiveElementOf<T>;
|
|
25
|
-
/**
|
|
26
|
-
* Callable overloads matching the Proxy apply trap → ref() behavior.
|
|
27
|
-
* Calling a reactive element as a function delegates to ref():
|
|
28
|
-
* el() → returns the raw DOM element
|
|
29
|
-
* el((ref) => {}) → applies a side-effect, returns the builder for chaining
|
|
30
|
-
*/
|
|
31
|
-
interface RefCallable<T extends Element> {
|
|
32
|
-
(): T;
|
|
33
|
-
(apply: (ref: T) => void | (() => void)): this;
|
|
34
|
-
}
|
|
35
|
-
type ReactiveElement<T extends Element> = ElementBuilder<T> & RefCallable<T>;
|
|
36
|
-
type ValueOrReactive<T> = (() => T) | T;
|
|
37
|
-
type ValueOrReactiveArray<T extends any[]> = { [K in keyof T]: ValueOrReactive<T[K]> | T[K] };
|
|
38
|
-
/**
|
|
39
|
-
* Filter keys that are writable (exclude readonly and getter-only).
|
|
40
|
-
*/
|
|
41
|
-
type WritableKeys<T> = { [K in keyof T]: (<U>() => U extends { [Q in K]: T[K] } ? 1 : 2) extends (<U>() => U extends { readonly [Q in K]: T[K] } ? 1 : 2) ? never : K }[keyof T];
|
|
42
|
-
/**
|
|
43
|
-
* Extracts the object chaining part of ReactiveBuilder.
|
|
44
|
-
* Used for properties like `style` where you can do both:
|
|
45
|
-
* .style("padding: 20px;") // setter
|
|
46
|
-
* .style.padding("20px") // sub-property chaining
|
|
47
|
-
*/
|
|
48
|
-
type Chain<R, T> = T extends object ? { [K in WritableKeys<T>]: Builder<R, T[K]> } : {};
|
|
49
|
-
type Builder<R, T = R> = T extends ((...args: infer U) => unknown) ? (...value: ValueOrReactiveArray<U>) => R : (value?: ValueOrReactive<T>) => R;
|
|
50
|
-
/**
|
|
51
|
-
* Types eligible for sub-property chaining (e.g., `.style.padding("20px")`).
|
|
52
|
-
*/
|
|
53
|
-
type ChainableType = CSSStyleDeclaration | DOMTokenList | DOMStringMap | StylePropertyMap;
|
|
54
|
-
/**
|
|
55
|
-
* Filters keys to only writable data properties.
|
|
56
|
-
* Excludes methods (function-valued properties) and event handlers (`on*`).
|
|
57
|
-
*/
|
|
58
|
-
type DataPropertyKeys<T> = { [K in keyof T]: K extends `on${string}` ? never : T[K] extends ((...args: any[]) => any) ? never : K }[keyof T];
|
|
59
|
-
/**
|
|
60
|
-
* Reactive setter for a single property.
|
|
61
|
-
* Chainable types (CSSStyleDeclaration, DOMTokenList, etc.) get both
|
|
62
|
-
* sub-property chaining and direct setter support.
|
|
63
|
-
*/
|
|
64
|
-
type ReactiveSetter<R, T> = T extends ChainableType ? Chain<R, T> & ((value: ValueOrReactive<T>) => R) : (value: ValueOrReactive<T>) => R;
|
|
65
|
-
/**
|
|
66
|
-
* A fully-typed reactive element builder for any Element type.
|
|
67
|
-
* Automatically maps all writable data properties into reactive setters.
|
|
68
|
-
*
|
|
69
|
-
* Use this for custom elements instead of needing generated builder interfaces.
|
|
70
|
-
*
|
|
71
|
-
* @example
|
|
72
|
-
* ```ts
|
|
73
|
-
* import { reactive, type ReactiveElementOf } from "elements-kit";
|
|
74
|
-
*
|
|
75
|
-
* class MyElement extends HTMLElement {
|
|
76
|
-
* greeting = "hello";
|
|
77
|
-
* }
|
|
78
|
-
* customElements.define("my-element", MyElement);
|
|
79
|
-
*
|
|
80
|
-
* const myEl = () =>
|
|
81
|
-
* reactive(document.createElement("my-element") as MyElement);
|
|
82
|
-
*
|
|
83
|
-
* // Full type support for both own and inherited properties:
|
|
84
|
-
* myEl().greeting("world").style.padding("20px").id("main");
|
|
85
|
-
* ```
|
|
86
|
-
*/
|
|
87
|
-
type ReactiveElementOf<T extends Element> = ElementBuilder<T> & { [K in WritableKeys<T> & DataPropertyKeys<T> & keyof T]: ReactiveSetter<ReactiveElementOf<T>, T[K]> };
|
|
88
|
-
//#endregion
|
|
89
|
-
export { EFFECT as a, ReactiveElementOf as c, builder as d, toNode as f, DISPOSE as i, VALUE as l, Chain as n, ElementBuilder as o, DISPOSABLES as r, ReactiveElement as s, Builder as t, ValueOrReactive as u };
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
//#region src/lib.d.ts
|
|
2
|
-
type PrimitiveNodeType = Node | string | boolean | number | bigint | symbol | Date | RegExp | null | undefined;
|
|
3
|
-
//#endregion
|
|
4
|
-
//#region src/polyfill.d.ts
|
|
5
|
-
declare global {
|
|
6
|
-
interface SymbolConstructor {
|
|
7
|
-
readonly dispose: symbol;
|
|
8
|
-
}
|
|
9
|
-
interface Disposable {
|
|
10
|
-
[Symbol.dispose](): void;
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
//#endregion
|
|
14
|
-
export { PrimitiveNodeType as t };
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { t as Computed } from "../../index-BtqiEEfc.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/signals/lib/active-element.d.ts
|
|
4
|
-
/**
|
|
5
|
-
* Returns a `Computed` that tracks `document.activeElement`.
|
|
6
|
-
* Updates on every `focusin` / `focusout` event bubbling through the document.
|
|
7
|
-
*/
|
|
8
|
-
declare function createActiveElement(): Computed<Element | null> & Disposable;
|
|
9
|
-
//#endregion
|
|
10
|
-
export { createActiveElement };
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { fromEvent, sync } from "./event-driven.mjs";
|
|
2
|
-
//#region src/signals/lib/active-element.ts
|
|
3
|
-
/**
|
|
4
|
-
* Returns a `Computed` that tracks `document.activeElement`.
|
|
5
|
-
* Updates on every `focusin` / `focusout` event bubbling through the document.
|
|
6
|
-
*/
|
|
7
|
-
function createActiveElement() {
|
|
8
|
-
const [active, cleanup] = sync(fromEvent(document, ["focusin", "focusout"]), () => typeof document !== "undefined" ? document.activeElement : null);
|
|
9
|
-
return Object.assign(active, { [Symbol.dispose]: cleanup });
|
|
10
|
-
}
|
|
11
|
-
//#endregion
|
|
12
|
-
export { createActiveElement };
|
|
@@ -1,39 +0,0 @@
|
|
|
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 { createActiveElement } from "./active-element.mjs";
|
|
4
|
-
//#region src/signals/lib/active-element.test.ts
|
|
5
|
-
afterEach(() => {
|
|
6
|
-
document.body.innerHTML = "";
|
|
7
|
-
});
|
|
8
|
-
describe("createActiveElement", () => {
|
|
9
|
-
it("returns a computed that reads the current activeElement", () => {
|
|
10
|
-
let active;
|
|
11
|
-
effectScope(() => {
|
|
12
|
-
active = createActiveElement();
|
|
13
|
-
});
|
|
14
|
-
globalExpect(active()).toBe(document.activeElement);
|
|
15
|
-
});
|
|
16
|
-
it("updates when focus changes", () => {
|
|
17
|
-
const input = document.createElement("input");
|
|
18
|
-
document.body.appendChild(input);
|
|
19
|
-
let active;
|
|
20
|
-
effectScope(() => {
|
|
21
|
-
active = createActiveElement();
|
|
22
|
-
});
|
|
23
|
-
document.dispatchEvent(new FocusEvent("focusin", { relatedTarget: input }));
|
|
24
|
-
globalExpect(active()).toBe(document.activeElement);
|
|
25
|
-
});
|
|
26
|
-
it("stops updating after Symbol.dispose", () => {
|
|
27
|
-
let active;
|
|
28
|
-
effectScope(() => {
|
|
29
|
-
active = createActiveElement();
|
|
30
|
-
});
|
|
31
|
-
active[Symbol.dispose]();
|
|
32
|
-
const input = document.createElement("input");
|
|
33
|
-
document.body.appendChild(input);
|
|
34
|
-
input.focus();
|
|
35
|
-
globalExpect(typeof active()).not.toBe("undefined");
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
//#endregion
|
|
39
|
-
export {};
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { t as Computed } from "../../index-BtqiEEfc.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/signals/lib/animation-frames.d.ts
|
|
4
|
-
type AnimationFramesResult = {
|
|
5
|
-
isRunning: Computed<boolean>;
|
|
6
|
-
delta: Computed<number>;
|
|
7
|
-
elapsed: Computed<number>;
|
|
8
|
-
start(): void;
|
|
9
|
-
stop(): void;
|
|
10
|
-
} & Disposable;
|
|
11
|
-
/**
|
|
12
|
-
* RAF loop with pause/resume, delta time, and elapsed time tracking.
|
|
13
|
-
*
|
|
14
|
-
* Starts paused — call `start()` to begin.
|
|
15
|
-
*/
|
|
16
|
-
declare function createAnimationFrames(): AnimationFramesResult;
|
|
17
|
-
//#endregion
|
|
18
|
-
export { createAnimationFrames };
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { d as onCleanup, f as signal } from "../../signals-CLAPw8kk.mjs";
|
|
2
|
-
//#region src/signals/lib/animation-frames.ts
|
|
3
|
-
/**
|
|
4
|
-
* RAF loop with pause/resume, delta time, and elapsed time tracking.
|
|
5
|
-
*
|
|
6
|
-
* Starts paused — call `start()` to begin.
|
|
7
|
-
*/
|
|
8
|
-
function createAnimationFrames() {
|
|
9
|
-
const isRunning = signal(false);
|
|
10
|
-
const delta = signal(0);
|
|
11
|
-
const elapsed = signal(0);
|
|
12
|
-
let rafId;
|
|
13
|
-
let lastTime;
|
|
14
|
-
const loop = (time) => {
|
|
15
|
-
if (lastTime !== void 0) {
|
|
16
|
-
const d = time - lastTime;
|
|
17
|
-
delta(d);
|
|
18
|
-
elapsed(elapsed() + d);
|
|
19
|
-
}
|
|
20
|
-
lastTime = time;
|
|
21
|
-
rafId = requestAnimationFrame(loop);
|
|
22
|
-
};
|
|
23
|
-
const start = () => {
|
|
24
|
-
if (isRunning()) return;
|
|
25
|
-
lastTime = void 0;
|
|
26
|
-
isRunning(true);
|
|
27
|
-
rafId = requestAnimationFrame(loop);
|
|
28
|
-
};
|
|
29
|
-
const stop = () => {
|
|
30
|
-
if (rafId !== void 0) {
|
|
31
|
-
cancelAnimationFrame(rafId);
|
|
32
|
-
rafId = void 0;
|
|
33
|
-
}
|
|
34
|
-
lastTime = void 0;
|
|
35
|
-
isRunning(false);
|
|
36
|
-
};
|
|
37
|
-
const cleanup = () => stop();
|
|
38
|
-
onCleanup(cleanup);
|
|
39
|
-
return Object.assign({
|
|
40
|
-
isRunning,
|
|
41
|
-
delta,
|
|
42
|
-
elapsed,
|
|
43
|
-
start,
|
|
44
|
-
stop
|
|
45
|
-
}, { [Symbol.dispose]: cleanup });
|
|
46
|
-
}
|
|
47
|
-
//#endregion
|
|
48
|
-
export { createAnimationFrames };
|
|
@@ -1,52 +0,0 @@
|
|
|
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 { createAnimationFrames } from "./animation-frames.mjs";
|
|
4
|
-
//#region src/signals/lib/animation-frames.test.ts
|
|
5
|
-
afterEach(() => {
|
|
6
|
-
document.body.innerHTML = "";
|
|
7
|
-
vi.unstubAllGlobals();
|
|
8
|
-
});
|
|
9
|
-
describe("createAnimationFrames", () => {
|
|
10
|
-
it("starts paused", () => {
|
|
11
|
-
let af;
|
|
12
|
-
effectScope(() => {
|
|
13
|
-
af = createAnimationFrames();
|
|
14
|
-
});
|
|
15
|
-
globalExpect(af.isRunning()).toBe(false);
|
|
16
|
-
});
|
|
17
|
-
it("start() sets isRunning to true", () => {
|
|
18
|
-
vi.stubGlobal("requestAnimationFrame", vi.fn().mockReturnValue(1));
|
|
19
|
-
vi.stubGlobal("cancelAnimationFrame", vi.fn());
|
|
20
|
-
let af;
|
|
21
|
-
effectScope(() => {
|
|
22
|
-
af = createAnimationFrames();
|
|
23
|
-
});
|
|
24
|
-
af.start();
|
|
25
|
-
globalExpect(af.isRunning()).toBe(true);
|
|
26
|
-
});
|
|
27
|
-
it("stop() sets isRunning to false", () => {
|
|
28
|
-
vi.stubGlobal("requestAnimationFrame", vi.fn().mockReturnValue(1));
|
|
29
|
-
vi.stubGlobal("cancelAnimationFrame", vi.fn());
|
|
30
|
-
let af;
|
|
31
|
-
effectScope(() => {
|
|
32
|
-
af = createAnimationFrames();
|
|
33
|
-
});
|
|
34
|
-
af.start();
|
|
35
|
-
af.stop();
|
|
36
|
-
globalExpect(af.isRunning()).toBe(false);
|
|
37
|
-
});
|
|
38
|
-
it("Symbol.dispose stops the loop", () => {
|
|
39
|
-
const cancel = vi.fn();
|
|
40
|
-
vi.stubGlobal("requestAnimationFrame", vi.fn().mockReturnValue(1));
|
|
41
|
-
vi.stubGlobal("cancelAnimationFrame", cancel);
|
|
42
|
-
let af;
|
|
43
|
-
effectScope(() => {
|
|
44
|
-
af = createAnimationFrames();
|
|
45
|
-
});
|
|
46
|
-
af.start();
|
|
47
|
-
af[Symbol.dispose]();
|
|
48
|
-
globalExpect(cancel).toHaveBeenCalled();
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
//#endregion
|
|
52
|
-
export {};
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { t as Computed } from "../../index-BtqiEEfc.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/signals/lib/async-retry.d.ts
|
|
4
|
-
type AsyncRetryResult<T> = {
|
|
5
|
-
data: Computed<T | undefined>;
|
|
6
|
-
loading: Computed<boolean>;
|
|
7
|
-
error: Computed<unknown>;
|
|
8
|
-
retry(): void;
|
|
9
|
-
attempt: Computed<number>;
|
|
10
|
-
};
|
|
11
|
-
/**
|
|
12
|
-
* Like `createResource` but automatically retries on failure up to
|
|
13
|
-
* `maxRetries` times with an exponential-back-off delay.
|
|
14
|
-
*/
|
|
15
|
-
declare function createAsyncRetry<S, T>(source: () => S, fetcher: (source: S, signal: AbortSignal) => Promise<T>, options?: {
|
|
16
|
-
initialValue?: T;
|
|
17
|
-
maxRetries?: number;
|
|
18
|
-
delay?: number;
|
|
19
|
-
}): AsyncRetryResult<T>;
|
|
20
|
-
//#endregion
|
|
21
|
-
export { createAsyncRetry };
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { a as effect, d as onCleanup, f as signal } from "../../signals-CLAPw8kk.mjs";
|
|
2
|
-
//#region src/signals/lib/async-retry.ts
|
|
3
|
-
/**
|
|
4
|
-
* Like `createResource` but automatically retries on failure up to
|
|
5
|
-
* `maxRetries` times with an exponential-back-off delay.
|
|
6
|
-
*/
|
|
7
|
-
function createAsyncRetry(source, fetcher, options) {
|
|
8
|
-
const { maxRetries = 3, delay = 1e3 } = options ?? {};
|
|
9
|
-
const data = signal(options?.initialValue);
|
|
10
|
-
const loading = signal(false);
|
|
11
|
-
const error = signal(void 0);
|
|
12
|
-
const attempt = signal(0);
|
|
13
|
-
const tick = signal(0);
|
|
14
|
-
effect(() => {
|
|
15
|
-
tick();
|
|
16
|
-
const src = source();
|
|
17
|
-
const controller = new AbortController();
|
|
18
|
-
loading(true);
|
|
19
|
-
error(void 0);
|
|
20
|
-
attempt(0);
|
|
21
|
-
let currentAttempt = 0;
|
|
22
|
-
const run = () => {
|
|
23
|
-
fetcher(src, controller.signal).then((result) => {
|
|
24
|
-
data(result);
|
|
25
|
-
loading(false);
|
|
26
|
-
}, (err) => {
|
|
27
|
-
if (err.name === "AbortError") return;
|
|
28
|
-
if (currentAttempt < maxRetries) {
|
|
29
|
-
currentAttempt++;
|
|
30
|
-
attempt(currentAttempt);
|
|
31
|
-
const retryTimer = setTimeout(run, delay * 2 ** (currentAttempt - 1));
|
|
32
|
-
const orig = cleanup;
|
|
33
|
-
cleanup = () => {
|
|
34
|
-
clearTimeout(retryTimer);
|
|
35
|
-
orig();
|
|
36
|
-
};
|
|
37
|
-
} else {
|
|
38
|
-
error(err);
|
|
39
|
-
loading(false);
|
|
40
|
-
}
|
|
41
|
-
});
|
|
42
|
-
};
|
|
43
|
-
let cleanup = () => controller.abort();
|
|
44
|
-
run();
|
|
45
|
-
onCleanup(() => cleanup());
|
|
46
|
-
});
|
|
47
|
-
const retry = () => tick(tick() + 1);
|
|
48
|
-
return {
|
|
49
|
-
data,
|
|
50
|
-
loading,
|
|
51
|
-
error,
|
|
52
|
-
attempt,
|
|
53
|
-
retry
|
|
54
|
-
};
|
|
55
|
-
}
|
|
56
|
-
//#endregion
|
|
57
|
-
export { createAsyncRetry };
|
|
@@ -1,57 +0,0 @@
|
|
|
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 { createAsyncRetry } from "./async-retry.mjs";
|
|
4
|
-
//#region src/signals/lib/async-retry.test.ts
|
|
5
|
-
afterEach(() => {
|
|
6
|
-
document.body.innerHTML = "";
|
|
7
|
-
vi.useRealTimers();
|
|
8
|
-
});
|
|
9
|
-
describe("createAsyncRetry", () => {
|
|
10
|
-
it("resolves successfully on first try", async () => {
|
|
11
|
-
const src = () => "url";
|
|
12
|
-
let r;
|
|
13
|
-
effectScope(() => {
|
|
14
|
-
r = createAsyncRetry(src, async () => "ok");
|
|
15
|
-
});
|
|
16
|
-
await new Promise((res) => setTimeout(res, 0));
|
|
17
|
-
globalExpect(r.data()).toBe("ok");
|
|
18
|
-
globalExpect(r.loading()).toBe(false);
|
|
19
|
-
});
|
|
20
|
-
it("retries on failure and eventually resolves", async () => {
|
|
21
|
-
vi.useFakeTimers();
|
|
22
|
-
let calls = 0;
|
|
23
|
-
const src = () => "url";
|
|
24
|
-
let r;
|
|
25
|
-
effectScope(() => {
|
|
26
|
-
r = createAsyncRetry(src, async () => {
|
|
27
|
-
calls++;
|
|
28
|
-
if (calls < 3) throw new Error("fail");
|
|
29
|
-
return "success";
|
|
30
|
-
}, {
|
|
31
|
-
maxRetries: 3,
|
|
32
|
-
delay: 100
|
|
33
|
-
});
|
|
34
|
-
});
|
|
35
|
-
await vi.runAllTicks();
|
|
36
|
-
await vi.runAllTimersAsync();
|
|
37
|
-
globalExpect(r.data()).toBe("success");
|
|
38
|
-
}, 1e4);
|
|
39
|
-
it("sets error after exhausting retries", async () => {
|
|
40
|
-
vi.useFakeTimers();
|
|
41
|
-
const src = () => "url";
|
|
42
|
-
let r;
|
|
43
|
-
effectScope(() => {
|
|
44
|
-
r = createAsyncRetry(src, async () => {
|
|
45
|
-
throw new Error("persistent");
|
|
46
|
-
}, {
|
|
47
|
-
maxRetries: 2,
|
|
48
|
-
delay: 50
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
await vi.runAllTimersAsync();
|
|
52
|
-
globalExpect(r.error()).toBeInstanceOf(Error);
|
|
53
|
-
globalExpect(r.loading()).toBe(false);
|
|
54
|
-
}, 1e4);
|
|
55
|
-
});
|
|
56
|
-
//#endregion
|
|
57
|
-
export {};
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { n as Signal, t as Computed } from "../../index-BtqiEEfc.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/signals/lib/audio.d.ts
|
|
4
|
-
type AudioResult = {
|
|
5
|
-
element: HTMLAudioElement;
|
|
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 `HTMLAudioElement` with reactive state and playback controls.
|
|
18
|
-
*/
|
|
19
|
-
declare function createAudio(element: HTMLAudioElement): AudioResult;
|
|
20
|
-
//#endregion
|
|
21
|
-
export { createAudio };
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { fromEvent, sync } from "./event-driven.mjs";
|
|
2
|
-
//#region src/signals/lib/audio.ts
|
|
3
|
-
/**
|
|
4
|
-
* Wraps an `HTMLAudioElement` with reactive state and playback controls.
|
|
5
|
-
*/
|
|
6
|
-
function createAudio(element) {
|
|
7
|
-
const el = element;
|
|
8
|
-
const [playing] = sync(fromEvent(el, ["play", "pause"]), () => !el.paused);
|
|
9
|
-
const [muted] = sync(fromEvent(el, "volumechange"), () => el.muted, (v) => {
|
|
10
|
-
el.muted = v;
|
|
11
|
-
});
|
|
12
|
-
const [volume] = sync(fromEvent(el, "volumechange"), () => el.volume, (v) => {
|
|
13
|
-
el.volume = Math.min(1, Math.max(0, v));
|
|
14
|
-
});
|
|
15
|
-
const [duration] = sync(fromEvent(el, "durationchange"), () => el.duration || 0);
|
|
16
|
-
const [time] = sync(fromEvent(el, "timeupdate"), () => el.currentTime, (v) => {
|
|
17
|
-
el.currentTime = v;
|
|
18
|
-
});
|
|
19
|
-
const [ended] = sync(fromEvent(el, "ended"), () => el.ended);
|
|
20
|
-
return {
|
|
21
|
-
element: el,
|
|
22
|
-
playing,
|
|
23
|
-
muted,
|
|
24
|
-
volume,
|
|
25
|
-
duration,
|
|
26
|
-
time,
|
|
27
|
-
ended,
|
|
28
|
-
play: () => el.play(),
|
|
29
|
-
pause: () => el.pause(),
|
|
30
|
-
toggle: () => el.paused ? el.play() : el.pause(),
|
|
31
|
-
[Symbol.dispose]: () => {}
|
|
32
|
-
};
|
|
33
|
-
}
|
|
34
|
-
//#endregion
|
|
35
|
-
export { createAudio };
|
|
@@ -1,57 +0,0 @@
|
|
|
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 { createAudio } from "./audio.mjs";
|
|
4
|
-
//#region src/signals/lib/audio.test.ts
|
|
5
|
-
afterEach(() => {
|
|
6
|
-
document.body.innerHTML = "";
|
|
7
|
-
vi.restoreAllMocks();
|
|
8
|
-
});
|
|
9
|
-
describe("createAudio", () => {
|
|
10
|
-
it("accepts an HTMLAudioElement", () => {
|
|
11
|
-
const el = new Audio();
|
|
12
|
-
let a;
|
|
13
|
-
effectScope(() => {
|
|
14
|
-
a = createAudio(el);
|
|
15
|
-
});
|
|
16
|
-
globalExpect(a.element).toBe(el);
|
|
17
|
-
});
|
|
18
|
-
it("starts as paused", () => {
|
|
19
|
-
let a;
|
|
20
|
-
effectScope(() => {
|
|
21
|
-
a = createAudio(new Audio());
|
|
22
|
-
});
|
|
23
|
-
globalExpect(a.playing()).toBe(false);
|
|
24
|
-
});
|
|
25
|
-
it("muted(true) sets muted to true", () => {
|
|
26
|
-
let a;
|
|
27
|
-
effectScope(() => {
|
|
28
|
-
a = createAudio(new Audio());
|
|
29
|
-
});
|
|
30
|
-
a.muted(true);
|
|
31
|
-
globalExpect(a.element.muted).toBe(true);
|
|
32
|
-
});
|
|
33
|
-
it("volume() clamps to [0, 1]", () => {
|
|
34
|
-
let a;
|
|
35
|
-
effectScope(() => {
|
|
36
|
-
a = createAudio(new Audio());
|
|
37
|
-
});
|
|
38
|
-
a.volume(2);
|
|
39
|
-
globalExpect(a.element.volume).toBe(1);
|
|
40
|
-
a.volume(-1);
|
|
41
|
-
globalExpect(a.element.volume).toBe(0);
|
|
42
|
-
});
|
|
43
|
-
it("removes event listeners when scope is disposed", () => {
|
|
44
|
-
const removeSpy = vi.fn();
|
|
45
|
-
const el = new Audio();
|
|
46
|
-
let dispose;
|
|
47
|
-
let a;
|
|
48
|
-
dispose = effectScope(() => {
|
|
49
|
-
a = createAudio(el);
|
|
50
|
-
});
|
|
51
|
-
vi.spyOn(a.element, "removeEventListener").mockImplementation(removeSpy);
|
|
52
|
-
dispose();
|
|
53
|
-
globalExpect(removeSpy).toHaveBeenCalled();
|
|
54
|
-
});
|
|
55
|
-
});
|
|
56
|
-
//#endregion
|
|
57
|
-
export {};
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { t as Computed } from "../../index-BtqiEEfc.mjs";
|
|
2
|
-
|
|
3
|
-
//#region src/signals/lib/battery.d.ts
|
|
4
|
-
type BatteryResult = {
|
|
5
|
-
charging: Computed<boolean>;
|
|
6
|
-
level: Computed<number>;
|
|
7
|
-
chargingTime: Computed<number>;
|
|
8
|
-
dischargingTime: Computed<number>;
|
|
9
|
-
supported: Computed<boolean>;
|
|
10
|
-
} & Disposable;
|
|
11
|
-
/**
|
|
12
|
-
* Exposes the Battery Status API as reactive signals.
|
|
13
|
-
* `supported` will be `false` when the API is unavailable.
|
|
14
|
-
*/
|
|
15
|
-
declare function createBattery(): BatteryResult;
|
|
16
|
-
//#endregion
|
|
17
|
-
export { createBattery };
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import { d as onCleanup, f as signal } from "../../signals-CLAPw8kk.mjs";
|
|
2
|
-
//#region src/signals/lib/battery.ts
|
|
3
|
-
/**
|
|
4
|
-
* Exposes the Battery Status API as reactive signals.
|
|
5
|
-
* `supported` will be `false` when the API is unavailable.
|
|
6
|
-
*/
|
|
7
|
-
function createBattery() {
|
|
8
|
-
const supported = signal(typeof navigator !== "undefined" && "getBattery" in navigator);
|
|
9
|
-
const charging = signal(false);
|
|
10
|
-
const level = signal(1);
|
|
11
|
-
const chargingTime = signal(0);
|
|
12
|
-
const dischargingTime = signal(Infinity);
|
|
13
|
-
let battery;
|
|
14
|
-
const update = () => {
|
|
15
|
-
if (!battery) return;
|
|
16
|
-
charging(battery.charging);
|
|
17
|
-
level(battery.level);
|
|
18
|
-
chargingTime(battery.chargingTime);
|
|
19
|
-
dischargingTime(battery.dischargingTime);
|
|
20
|
-
};
|
|
21
|
-
const events = [
|
|
22
|
-
"chargingchange",
|
|
23
|
-
"levelchange",
|
|
24
|
-
"chargingtimechange",
|
|
25
|
-
"dischargingtimechange"
|
|
26
|
-
];
|
|
27
|
-
const cleanup = () => {
|
|
28
|
-
events.forEach((e) => battery?.removeEventListener(e, update));
|
|
29
|
-
};
|
|
30
|
-
if (supported()) navigator.getBattery().then((b) => {
|
|
31
|
-
battery = b;
|
|
32
|
-
update();
|
|
33
|
-
events.forEach((e) => b.addEventListener(e, update));
|
|
34
|
-
});
|
|
35
|
-
onCleanup(cleanup);
|
|
36
|
-
return Object.assign({
|
|
37
|
-
supported,
|
|
38
|
-
charging,
|
|
39
|
-
level,
|
|
40
|
-
chargingTime,
|
|
41
|
-
dischargingTime
|
|
42
|
-
}, { [Symbol.dispose]: cleanup });
|
|
43
|
-
}
|
|
44
|
-
//#endregion
|
|
45
|
-
export { createBattery };
|