@signality/core 0.0.1-alpha.2 → 0.0.1-alpha.3
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/browser/battery/index.d.ts +27 -2
- package/browser/bluetooth/index.d.ts +40 -13
- package/browser/breakpoints/index.d.ts +22 -9
- package/browser/broadcast-channel/index.d.ts +1 -1
- package/browser/browser-language/index.d.ts +1 -1
- package/browser/clipboard/index.d.ts +22 -6
- package/browser/device-posture/index.d.ts +23 -2
- package/browser/display-media/index.d.ts +34 -22
- package/browser/eye-dropper/index.d.ts +22 -6
- package/browser/favicon/index.d.ts +29 -2
- package/browser/file-dialog/index.d.ts +97 -0
- package/browser/fps/index.d.ts +1 -1
- package/browser/fullscreen/index.d.ts +78 -0
- package/browser/gamepad/index.d.ts +39 -9
- package/browser/geolocation/index.d.ts +44 -13
- package/browser/index.d.ts +8 -1
- package/browser/input-modality/index.d.ts +1 -1
- package/browser/listener/index.d.ts +1 -1
- package/browser/media-query/index.d.ts +1 -1
- package/browser/network/index.d.ts +37 -9
- package/browser/online/index.d.ts +1 -1
- package/browser/page-visibility/index.d.ts +1 -1
- package/browser/permission-state/index.d.ts +23 -0
- package/browser/picture-in-picture/index.d.ts +24 -6
- package/browser/screen-orientation/index.d.ts +1 -1
- package/browser/speech-recognition/index.d.ts +51 -13
- package/browser/speech-synthesis/index.d.ts +82 -42
- package/browser/storage/index.d.ts +1 -1
- package/browser/text-direction/index.d.ts +2 -5
- package/{elements → browser}/text-selection/index.d.ts +1 -1
- package/browser/vibration/index.d.ts +38 -9
- package/browser/wake-lock/index.d.ts +51 -12
- package/browser/web-notification/index.d.ts +35 -9
- package/browser/web-share/index.d.ts +19 -5
- package/browser/web-worker/index.d.ts +35 -11
- package/browser/window-focus/index.d.ts +27 -0
- package/{elements → browser}/window-size/index.d.ts +6 -7
- package/elements/active-element/index.d.ts +1 -1
- package/elements/dropzone/index.d.ts +60 -10
- package/elements/element-focus/index.d.ts +1 -1
- package/elements/element-focus-within/index.d.ts +1 -1
- package/elements/element-hover/index.d.ts +1 -1
- package/elements/element-size/index.d.ts +8 -5
- package/elements/element-visibility/index.d.ts +25 -7
- package/elements/index.d.ts +0 -2
- package/elements/mouse-position/index.d.ts +27 -7
- package/elements/on-click-outside/index.d.ts +1 -1
- package/elements/on-disconnect/index.d.ts +1 -1
- package/elements/on-long-press/index.d.ts +1 -1
- package/elements/pointer-swipe/index.d.ts +1 -1
- package/elements/scroll-position/index.d.ts +2 -2
- package/elements/swipe/index.d.ts +1 -1
- package/fesm2022/signality-core-browser-battery.mjs +1 -1
- package/fesm2022/signality-core-browser-battery.mjs.map +1 -1
- package/fesm2022/signality-core-browser-bluetooth.mjs +28 -27
- package/fesm2022/signality-core-browser-bluetooth.mjs.map +1 -1
- package/fesm2022/signality-core-browser-breakpoints.mjs +19 -10
- package/fesm2022/signality-core-browser-breakpoints.mjs.map +1 -1
- package/fesm2022/signality-core-browser-broadcast-channel.mjs +1 -1
- package/fesm2022/signality-core-browser-broadcast-channel.mjs.map +1 -1
- package/fesm2022/signality-core-browser-browser-language.mjs +1 -1
- package/fesm2022/signality-core-browser-browser-language.mjs.map +1 -1
- package/fesm2022/signality-core-browser-clipboard.mjs +1 -1
- package/fesm2022/signality-core-browser-clipboard.mjs.map +1 -1
- package/fesm2022/signality-core-browser-device-posture.mjs +13 -0
- package/fesm2022/signality-core-browser-device-posture.mjs.map +1 -1
- package/fesm2022/signality-core-browser-display-media.mjs +4 -17
- package/fesm2022/signality-core-browser-display-media.mjs.map +1 -1
- package/fesm2022/signality-core-browser-eye-dropper.mjs +1 -1
- package/fesm2022/signality-core-browser-eye-dropper.mjs.map +1 -1
- package/fesm2022/signality-core-browser-favicon.mjs +2 -2
- package/fesm2022/signality-core-browser-favicon.mjs.map +1 -1
- package/fesm2022/signality-core-browser-file-dialog.mjs +109 -0
- package/fesm2022/signality-core-browser-file-dialog.mjs.map +1 -0
- package/fesm2022/signality-core-browser-fps.mjs +1 -1
- package/fesm2022/signality-core-browser-fps.mjs.map +1 -1
- package/fesm2022/signality-core-browser-fullscreen.mjs +113 -0
- package/fesm2022/signality-core-browser-fullscreen.mjs.map +1 -0
- package/fesm2022/signality-core-browser-gamepad.mjs +14 -4
- package/fesm2022/signality-core-browser-gamepad.mjs.map +1 -1
- package/fesm2022/signality-core-browser-geolocation.mjs +8 -19
- package/fesm2022/signality-core-browser-geolocation.mjs.map +1 -1
- package/fesm2022/signality-core-browser-input-modality.mjs +1 -1
- package/fesm2022/signality-core-browser-input-modality.mjs.map +1 -1
- package/fesm2022/signality-core-browser-listener.mjs +18 -6
- package/fesm2022/signality-core-browser-listener.mjs.map +1 -1
- package/fesm2022/signality-core-browser-media-query.mjs +1 -1
- package/fesm2022/signality-core-browser-media-query.mjs.map +1 -1
- package/fesm2022/signality-core-browser-network.mjs +2 -2
- package/fesm2022/signality-core-browser-network.mjs.map +1 -1
- package/fesm2022/signality-core-browser-online.mjs +1 -1
- package/fesm2022/signality-core-browser-online.mjs.map +1 -1
- package/fesm2022/signality-core-browser-page-visibility.mjs +1 -1
- package/fesm2022/signality-core-browser-page-visibility.mjs.map +1 -1
- package/fesm2022/signality-core-browser-permission-state.mjs +57 -0
- package/fesm2022/signality-core-browser-permission-state.mjs.map +1 -0
- package/fesm2022/signality-core-browser-picture-in-picture.mjs +30 -13
- package/fesm2022/signality-core-browser-picture-in-picture.mjs.map +1 -1
- package/fesm2022/signality-core-browser-screen-orientation.mjs +1 -1
- package/fesm2022/signality-core-browser-screen-orientation.mjs.map +1 -1
- package/fesm2022/signality-core-browser-speech-recognition.mjs +7 -19
- package/fesm2022/signality-core-browser-speech-recognition.mjs.map +1 -1
- package/fesm2022/signality-core-browser-speech-synthesis.mjs +14 -16
- package/fesm2022/signality-core-browser-speech-synthesis.mjs.map +1 -1
- package/fesm2022/signality-core-browser-storage.mjs +1 -1
- package/fesm2022/signality-core-browser-storage.mjs.map +1 -1
- package/fesm2022/signality-core-browser-text-direction.mjs +1 -4
- package/fesm2022/signality-core-browser-text-direction.mjs.map +1 -1
- package/fesm2022/{signality-core-elements-text-selection.mjs → signality-core-browser-text-selection.mjs} +2 -2
- package/fesm2022/signality-core-browser-text-selection.mjs.map +1 -0
- package/fesm2022/signality-core-browser-vibration.mjs +14 -5
- package/fesm2022/signality-core-browser-vibration.mjs.map +1 -1
- package/fesm2022/signality-core-browser-wake-lock.mjs +33 -16
- package/fesm2022/signality-core-browser-wake-lock.mjs.map +1 -1
- package/fesm2022/signality-core-browser-web-notification.mjs +5 -7
- package/fesm2022/signality-core-browser-web-notification.mjs.map +1 -1
- package/fesm2022/signality-core-browser-web-share.mjs +3 -5
- package/fesm2022/signality-core-browser-web-share.mjs.map +1 -1
- package/fesm2022/signality-core-browser-web-worker.mjs +6 -3
- package/fesm2022/signality-core-browser-web-worker.mjs.map +1 -1
- package/fesm2022/signality-core-browser-window-focus.mjs +48 -0
- package/fesm2022/signality-core-browser-window-focus.mjs.map +1 -0
- package/fesm2022/{signality-core-elements-window-size.mjs → signality-core-browser-window-size.mjs} +4 -24
- package/fesm2022/signality-core-browser-window-size.mjs.map +1 -0
- package/fesm2022/signality-core-browser.mjs +8 -1
- package/fesm2022/signality-core-browser.mjs.map +1 -1
- package/fesm2022/signality-core-elements-active-element.mjs +1 -1
- package/fesm2022/signality-core-elements-active-element.mjs.map +1 -1
- package/fesm2022/signality-core-elements-dropzone.mjs +28 -29
- package/fesm2022/signality-core-elements-dropzone.mjs.map +1 -1
- package/fesm2022/signality-core-elements-element-focus-within.mjs +1 -1
- package/fesm2022/signality-core-elements-element-focus-within.mjs.map +1 -1
- package/fesm2022/signality-core-elements-element-focus.mjs +1 -1
- package/fesm2022/signality-core-elements-element-focus.mjs.map +1 -1
- package/fesm2022/signality-core-elements-element-hover.mjs +1 -1
- package/fesm2022/signality-core-elements-element-hover.mjs.map +1 -1
- package/fesm2022/signality-core-elements-element-size.mjs +19 -24
- package/fesm2022/signality-core-elements-element-size.mjs.map +1 -1
- package/fesm2022/signality-core-elements-element-visibility.mjs +2 -2
- package/fesm2022/signality-core-elements-element-visibility.mjs.map +1 -1
- package/fesm2022/signality-core-elements-mouse-position.mjs +3 -3
- package/fesm2022/signality-core-elements-mouse-position.mjs.map +1 -1
- package/fesm2022/signality-core-elements-on-click-outside.mjs +1 -1
- package/fesm2022/signality-core-elements-on-click-outside.mjs.map +1 -1
- package/fesm2022/signality-core-elements-on-disconnect.mjs +1 -1
- package/fesm2022/signality-core-elements-on-disconnect.mjs.map +1 -1
- package/fesm2022/signality-core-elements-on-long-press.mjs +1 -1
- package/fesm2022/signality-core-elements-on-long-press.mjs.map +1 -1
- package/fesm2022/signality-core-elements-pointer-swipe.mjs +1 -1
- package/fesm2022/signality-core-elements-pointer-swipe.mjs.map +1 -1
- package/fesm2022/signality-core-elements-scroll-position.mjs +2 -2
- package/fesm2022/signality-core-elements-scroll-position.mjs.map +1 -1
- package/fesm2022/signality-core-elements-swipe.mjs +1 -1
- package/fesm2022/signality-core-elements-swipe.mjs.map +1 -1
- package/fesm2022/signality-core-elements.mjs +0 -2
- package/fesm2022/signality-core-elements.mjs.map +1 -1
- package/fesm2022/signality-core-internal.mjs +54 -7
- package/fesm2022/signality-core-internal.mjs.map +1 -1
- package/fesm2022/signality-core-observers-intersection-observer.mjs +3 -2
- package/fesm2022/signality-core-observers-intersection-observer.mjs.map +1 -1
- package/fesm2022/signality-core-observers-mutation-observer.mjs +3 -2
- package/fesm2022/signality-core-observers-mutation-observer.mjs.map +1 -1
- package/fesm2022/signality-core-observers-resize-observer.mjs +3 -2
- package/fesm2022/signality-core-observers-resize-observer.mjs.map +1 -1
- package/fesm2022/signality-core-observers.mjs +0 -1
- package/fesm2022/signality-core-observers.mjs.map +1 -1
- package/fesm2022/signality-core-reactivity-debounced.mjs.map +1 -1
- package/fesm2022/signality-core-reactivity-throttled.mjs.map +1 -1
- package/fesm2022/signality-core-reactivity-watcher.mjs.map +1 -1
- package/fesm2022/signality-core-router-fragment.mjs +1 -1
- package/fesm2022/signality-core-router-fragment.mjs.map +1 -1
- package/fesm2022/signality-core-router-params.mjs +1 -1
- package/fesm2022/signality-core-router-params.mjs.map +1 -1
- package/fesm2022/signality-core-router-query-params.mjs.map +1 -1
- package/fesm2022/signality-core-router-route-data.mjs +1 -1
- package/fesm2022/signality-core-router-route-data.mjs.map +1 -1
- package/fesm2022/signality-core-router-router-listener.mjs.map +1 -1
- package/fesm2022/signality-core-router-title.mjs +1 -1
- package/fesm2022/signality-core-router-title.mjs.map +1 -1
- package/fesm2022/signality-core-router-url.mjs +1 -1
- package/fesm2022/signality-core-router-url.mjs.map +1 -1
- package/fesm2022/signality-core-scheduling-debounce-callback.mjs +1 -1
- package/fesm2022/signality-core-scheduling-debounce-callback.mjs.map +1 -1
- package/fesm2022/signality-core-scheduling-interval.mjs +27 -72
- package/fesm2022/signality-core-scheduling-interval.mjs.map +1 -1
- package/internal/utils/assert.d.ts +2 -0
- package/internal/utils/dom/index.d.ts +1 -0
- package/internal/utils/dom/is-element.d.ts +1 -1
- package/internal/utils/dom/is-event-target.d.ts +1 -0
- package/internal/utils/files/index.d.ts +1 -0
- package/internal/utils/files/is-accepted-file.d.ts +11 -0
- package/internal/utils/index.d.ts +3 -0
- package/internal/utils/to-element.d.ts +1 -1
- package/internal/utils/unref-element.d.ts +2 -0
- package/observers/index.d.ts +0 -1
- package/observers/intersection-observer/index.d.ts +22 -1
- package/observers/mutation-observer/index.d.ts +43 -1
- package/observers/resize-observer/index.d.ts +13 -1
- package/package.json +25 -17
- package/reactivity/debounced/index.d.ts +2 -2
- package/reactivity/throttled/index.d.ts +2 -2
- package/reactivity/watcher/index.d.ts +2 -2
- package/router/fragment/index.d.ts +1 -1
- package/router/params/index.d.ts +1 -1
- package/router/query-params/index.d.ts +5 -3
- package/router/route-data/index.d.ts +1 -1
- package/router/router-listener/index.d.ts +1 -1
- package/router/title/index.d.ts +1 -1
- package/router/url/index.d.ts +1 -1
- package/scheduling/debounce-callback/index.d.ts +1 -1
- package/scheduling/interval/index.d.ts +19 -27
- package/browser/pointer-lock-element/index.d.ts +0 -22
- package/fesm2022/signality-core-browser-pointer-lock-element.mjs +0 -43
- package/fesm2022/signality-core-browser-pointer-lock-element.mjs.map +0 -1
- package/fesm2022/signality-core-elements-text-selection.mjs.map +0 -1
- package/fesm2022/signality-core-elements-window-size.mjs.map +0 -1
- package/fesm2022/signality-core-observers-performance-observer.mjs +0 -84
- package/fesm2022/signality-core-observers-performance-observer.mjs.map +0 -1
- package/observers/performance-observer/index.d.ts +0 -58
|
@@ -20,7 +20,7 @@ export type ThrottledOptions<T> = CreateSignalOptions<T> & WithInjector;
|
|
|
20
20
|
* </div>
|
|
21
21
|
* `
|
|
22
22
|
* })
|
|
23
|
-
* class ScrollTracker {
|
|
23
|
+
* export class ScrollTracker {
|
|
24
24
|
* readonly scrollY = signal(0);
|
|
25
25
|
* readonly throttledScrollY = throttled(this.scrollY, 100);
|
|
26
26
|
* }
|
|
@@ -45,7 +45,7 @@ export declare function throttled<S extends Signal<any>>(source: S, timeMs: Mayb
|
|
|
45
45
|
* </div>
|
|
46
46
|
* `
|
|
47
47
|
* })
|
|
48
|
-
* class MouseTracker {
|
|
48
|
+
* export class MouseTracker {
|
|
49
49
|
* readonly mousePosition = throttled({ x: 0, y: 0 }, 16);
|
|
50
50
|
* }
|
|
51
51
|
* ```
|
|
@@ -24,7 +24,7 @@ export type WatcherRef = EffectRef;
|
|
|
24
24
|
* <button (click)="count.set(count() + 1)">Count: {{ count() }}</button>
|
|
25
25
|
* `
|
|
26
26
|
* })
|
|
27
|
-
* class
|
|
27
|
+
* export class Counter {
|
|
28
28
|
* readonly count = signal(0);
|
|
29
29
|
*
|
|
30
30
|
* constructor() {
|
|
@@ -53,7 +53,7 @@ export declare function watcher<V>(source: Signal<V>, fn: (curr: V, prev: V, onC
|
|
|
53
53
|
* <input [(ngModel)]="age" type="number" />
|
|
54
54
|
* `
|
|
55
55
|
* })
|
|
56
|
-
* class
|
|
56
|
+
* export class UserPreview {
|
|
57
57
|
* readonly name = signal('John');
|
|
58
58
|
* readonly age = signal(25);
|
|
59
59
|
*
|
package/router/params/index.d.ts
CHANGED
|
@@ -19,7 +19,7 @@ export type ParamsOptions<T extends Params = Params> = CreateSignalOptions<T> &
|
|
|
19
19
|
* </div>
|
|
20
20
|
* `
|
|
21
21
|
* })
|
|
22
|
-
* class
|
|
22
|
+
* export class UserPreview {
|
|
23
23
|
* // Route: /user/:id/:slug
|
|
24
24
|
* readonly routeParams = params<{ id: string; slug: string }>();
|
|
25
25
|
* }
|
|
@@ -18,7 +18,9 @@ export interface QueryParamsRef<T> {
|
|
|
18
18
|
* Returns `true` when validation succeeded, `false` when validation failed.
|
|
19
19
|
*/
|
|
20
20
|
readonly isValid: Signal<boolean>;
|
|
21
|
-
/**
|
|
21
|
+
/**
|
|
22
|
+
* Signal containing validation error, or null if valid.
|
|
23
|
+
*/
|
|
22
24
|
readonly error: Signal<unknown | null>;
|
|
23
25
|
}
|
|
24
26
|
export type QueryParamsOptions<T extends Params = Params> = CreateSignalOptions<T> & WithInjector;
|
|
@@ -42,7 +44,7 @@ export type QueryParamsWithSchemaOptions<T extends Params = Params> = QueryParam
|
|
|
42
44
|
* </div>
|
|
43
45
|
* `
|
|
44
46
|
* })
|
|
45
|
-
* class
|
|
47
|
+
* export class SearchParamsDemo {
|
|
46
48
|
* // Route: /search?q=angular&sort=name
|
|
47
49
|
* readonly searchParams = queryParams<{ q: string; sort: string }>();
|
|
48
50
|
* }
|
|
@@ -67,7 +69,7 @@ export declare function queryParams<T extends Params = Params>(options?: QueryPa
|
|
|
67
69
|
* }
|
|
68
70
|
* `
|
|
69
71
|
* })
|
|
70
|
-
* class
|
|
72
|
+
* export class ValidatedSearchParamsDemo {
|
|
71
73
|
* readonly schema = z.object({
|
|
72
74
|
* q: z.string().min(1).optional(),
|
|
73
75
|
* page: z.coerce.number().int().positive().default(1),
|
|
@@ -19,7 +19,7 @@ export type RouteDataOptions<T = unknown> = CreateSignalOptions<T> & WithInjecto
|
|
|
19
19
|
* </div>
|
|
20
20
|
* `
|
|
21
21
|
* })
|
|
22
|
-
* class
|
|
22
|
+
* export class ProductPreview {
|
|
23
23
|
* // Route with data: { name: 'Product Page', showBreadcrumbs: true }
|
|
24
24
|
* readonly data = routeData<{ name: string; showBreadcrumbs: boolean }>();
|
|
25
25
|
* }
|
package/router/title/index.d.ts
CHANGED
package/router/url/index.d.ts
CHANGED
|
@@ -15,7 +15,7 @@ import type { MaybeSignal, WithInjector } from '@signality/core/types';
|
|
|
15
15
|
* <input (input)="handleInput($event.target.value)" />
|
|
16
16
|
* `,
|
|
17
17
|
* })
|
|
18
|
-
* export class
|
|
18
|
+
* export class SearchInput {
|
|
19
19
|
* readonly debounceTime = input(300);
|
|
20
20
|
* readonly searchChange = output<string>();
|
|
21
21
|
*
|
|
@@ -1,51 +1,43 @@
|
|
|
1
|
-
import { type Signal } from '@angular/core';
|
|
2
1
|
import type { MaybeSignal, WithInjector } from '@signality/core/types';
|
|
3
2
|
export interface IntervalOptions extends WithInjector {
|
|
4
3
|
/**
|
|
5
|
-
*
|
|
4
|
+
* Call the callback immediately, without waiting for the first tick.
|
|
5
|
+
*
|
|
6
6
|
* @default false
|
|
7
7
|
*/
|
|
8
8
|
readonly immediate?: boolean;
|
|
9
9
|
}
|
|
10
10
|
export interface IntervalRef {
|
|
11
|
-
/**
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
readonly
|
|
15
|
-
/** Pause the interval */
|
|
16
|
-
readonly pause: () => void;
|
|
17
|
-
/** Resume the interval */
|
|
18
|
-
readonly resume: () => void;
|
|
19
|
-
/** Reset the counter to 0 */
|
|
20
|
-
readonly reset: () => void;
|
|
11
|
+
/**
|
|
12
|
+
* Stop the interval permanently.
|
|
13
|
+
*/
|
|
14
|
+
readonly destroy: () => void;
|
|
21
15
|
}
|
|
22
16
|
/**
|
|
23
|
-
*
|
|
24
|
-
*
|
|
17
|
+
* Signal-based wrapper around [`setInterval`](https://developer.mozilla.org/en-US/docs/Web/API/Window/setInterval).
|
|
18
|
+
* Creates a reactive interval that executes a callback at specified intervals.
|
|
19
|
+
* The interval starts immediately upon creation and can be stopped with `destroy()`.
|
|
25
20
|
*
|
|
26
|
-
* @param callback - Function to execute on each interval tick
|
|
21
|
+
* @param callback - Function to execute on each interval tick
|
|
27
22
|
* @param intervalMs - Interval duration in milliseconds (can be a reactive signal)
|
|
28
|
-
* @param options - Optional configuration
|
|
29
|
-
* @returns An IntervalRef with
|
|
23
|
+
* @param options - Optional configuration
|
|
24
|
+
* @returns An IntervalRef with a `destroy` method to stop the interval
|
|
30
25
|
*
|
|
31
26
|
* @example
|
|
32
27
|
* ```typescript
|
|
33
28
|
* @Component({
|
|
34
29
|
* template: `
|
|
35
|
-
* <p>
|
|
36
|
-
* <button (click)="polling.
|
|
37
|
-
* <button (click)="polling.resume()">Start</button>
|
|
30
|
+
* <p>Ticks: {{ ticks() }}</p>
|
|
31
|
+
* <button (click)="polling.destroy()">Stop</button>
|
|
38
32
|
* `,
|
|
39
33
|
* })
|
|
40
34
|
* export class PeriodicTask {
|
|
41
|
-
* readonly
|
|
42
|
-
* await this.checkStatus();
|
|
43
|
-
* }, 5000);
|
|
35
|
+
* readonly ticks = signal(0);
|
|
44
36
|
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
* }
|
|
37
|
+
* readonly polling = interval(() => {
|
|
38
|
+
* this.ticks.update(n => n + 1);
|
|
39
|
+
* }, 5000);
|
|
48
40
|
* }
|
|
49
41
|
* ```
|
|
50
42
|
*/
|
|
51
|
-
export declare function interval(callback: (
|
|
43
|
+
export declare function interval(callback: () => void, intervalMs: MaybeSignal<number>, options?: IntervalOptions): IntervalRef;
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { type CreateSignalOptions, type Signal } from '@angular/core';
|
|
2
|
-
import type { WithInjector } from '@signality/core/types';
|
|
3
|
-
export type PointerLockElementOptions = CreateSignalOptions<Element | null> & WithInjector;
|
|
4
|
-
/**
|
|
5
|
-
* Reactive wrapper around the [Pointer Lock API](https://developer.mozilla.org/en-US/docs/Web/API/Pointer_Lock_API).
|
|
6
|
-
* Returns a signal that tracks the element that currently has pointer lock.
|
|
7
|
-
*
|
|
8
|
-
* @param options - Optional configuration including signal options and injector
|
|
9
|
-
* @returns A signal containing the element with pointer lock, or `null` if no element has lock
|
|
10
|
-
*
|
|
11
|
-
* @example
|
|
12
|
-
* ```typescript
|
|
13
|
-
* const lockedElement = pointerLockElement();
|
|
14
|
-
*
|
|
15
|
-
* effect(() => {
|
|
16
|
-
* if (lockedElement()) {
|
|
17
|
-
* console.log('Pointer locked on:', lockedElement());
|
|
18
|
-
* }
|
|
19
|
-
* });
|
|
20
|
-
* ```
|
|
21
|
-
*/
|
|
22
|
-
export declare function pointerLockElement(options?: PointerLockElementOptions): Signal<Element | null>;
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { signal } from '@angular/core';
|
|
2
|
-
import { setupContext, constSignal } from '@signality/core/internal';
|
|
3
|
-
import { setupSync, listener } from '@signality/core/browser/listener';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Reactive wrapper around the [Pointer Lock API](https://developer.mozilla.org/en-US/docs/Web/API/Pointer_Lock_API).
|
|
7
|
-
* Returns a signal that tracks the element that currently has pointer lock.
|
|
8
|
-
*
|
|
9
|
-
* @param options - Optional configuration including signal options and injector
|
|
10
|
-
* @returns A signal containing the element with pointer lock, or `null` if no element has lock
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* ```typescript
|
|
14
|
-
* const lockedElement = pointerLockElement();
|
|
15
|
-
*
|
|
16
|
-
* effect(() => {
|
|
17
|
-
* if (lockedElement()) {
|
|
18
|
-
* console.log('Pointer locked on:', lockedElement());
|
|
19
|
-
* }
|
|
20
|
-
* });
|
|
21
|
-
* ```
|
|
22
|
-
*/
|
|
23
|
-
function pointerLockElement(options) {
|
|
24
|
-
const { runInContext } = setupContext(options?.injector, pointerLockElement);
|
|
25
|
-
return runInContext(({ isServer }) => {
|
|
26
|
-
if (isServer) {
|
|
27
|
-
return constSignal(null);
|
|
28
|
-
}
|
|
29
|
-
const element = signal(document.pointerLockElement, options);
|
|
30
|
-
setupSync(() => {
|
|
31
|
-
listener(document, 'pointerlockchange', () => element.set(document.pointerLockElement));
|
|
32
|
-
listener(document, 'pointerlockerror', () => element.set(null));
|
|
33
|
-
});
|
|
34
|
-
return element.asReadonly();
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Generated bundle index. Do not edit.
|
|
40
|
-
*/
|
|
41
|
-
|
|
42
|
-
export { pointerLockElement };
|
|
43
|
-
//# sourceMappingURL=signality-core-browser-pointer-lock-element.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"signality-core-browser-pointer-lock-element.mjs","sources":["../../../projects/core/browser/pointer-lock-element/index.ts","../../../projects/core/browser/pointer-lock-element/signality-core-browser-pointer-lock-element.ts"],"sourcesContent":["import { type CreateSignalOptions, type Signal, signal } from '@angular/core';\nimport { constSignal, setupContext } from '@signality/core/internal';\nimport type { WithInjector } from '@signality/core/types';\nimport { listener, setupSync } from '@signality/core/browser/listener';\n\nexport type PointerLockElementOptions = CreateSignalOptions<Element | null> & WithInjector;\n\n/**\n * Reactive wrapper around the [Pointer Lock API](https://developer.mozilla.org/en-US/docs/Web/API/Pointer_Lock_API).\n * Returns a signal that tracks the element that currently has pointer lock.\n *\n * @param options - Optional configuration including signal options and injector\n * @returns A signal containing the element with pointer lock, or `null` if no element has lock\n *\n * @example\n * ```typescript\n * const lockedElement = pointerLockElement();\n *\n * effect(() => {\n * if (lockedElement()) {\n * console.log('Pointer locked on:', lockedElement());\n * }\n * });\n * ```\n */\nexport function pointerLockElement(options?: PointerLockElementOptions): Signal<Element | null> {\n const { runInContext } = setupContext(options?.injector, pointerLockElement);\n\n return runInContext(({ isServer }) => {\n if (isServer) {\n return constSignal(null);\n }\n\n const element = signal(document.pointerLockElement, options);\n\n setupSync(() => {\n listener(document, 'pointerlockchange', () => element.set(document.pointerLockElement));\n listener(document, 'pointerlockerror', () => element.set(null));\n });\n\n return element.asReadonly();\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AAOA;;;;;;;;;;;;;;;;;AAiBG;AACG,SAAU,kBAAkB,CAAC,OAAmC,EAAA;AACpE,IAAA,MAAM,EAAE,YAAY,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,kBAAkB,CAAC;AAE5E,IAAA,OAAO,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAI;QACnC,IAAI,QAAQ,EAAE;AACZ,YAAA,OAAO,WAAW,CAAC,IAAI,CAAC;QAC1B;QAEA,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;QAE5D,SAAS,CAAC,MAAK;AACb,YAAA,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;AACvF,YAAA,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACjE,QAAA,CAAC,CAAC;AAEF,QAAA,OAAO,OAAO,CAAC,UAAU,EAAE;AAC7B,IAAA,CAAC,CAAC;AACJ;;AC1CA;;AAEG;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"signality-core-elements-text-selection.mjs","sources":["../../../projects/core/elements/text-selection/index.ts","../../../projects/core/elements/text-selection/signality-core-elements-text-selection.ts"],"sourcesContent":["import { computed, type Signal, signal } from '@angular/core';\nimport {\n ALWAYS_FALSE_FN,\n constSignal,\n createToken,\n NOOP_FN,\n setupContext,\n} from '@signality/core/internal';\nimport type { WithInjector } from '@signality/core/types';\nimport { listener, setupSync } from '@signality/core/browser/listener';\n\nexport type TextSelectionOptions = WithInjector;\n\nexport interface TextSelectionRef {\n /** The selected text content */\n readonly text: Signal<string>;\n\n /** Array of Range objects */\n readonly ranges: Signal<Range[]>;\n\n /** Bounding rectangles of selection */\n readonly rects: Signal<DOMRect[]>;\n\n /** The raw Selection object */\n readonly selection: Signal<Selection | null>;\n\n /** Clear the current text selection */\n readonly clear: () => void;\n}\n\n/**\n * Signal-based wrapper around the [Selection API](https://developer.mozilla.org/en-US/docs/Web/API/Selection_API).\n *\n * @param options - Optional configuration including injector\n * @returns A TextSelectionRef with reactive signals for text, ranges, rects, and selection\n *\n * @example\n * ```typescript\n * @Component({\n * template: `\n * <p>Select some text below:</p>\n * <div>Lorem ipsum dolor sit amet...</div>\n * @if (selection.text(); as text) {\n * <p>Selected: \"{{ text }}\"</p>\n * }\n * `\n * })\n * class TextSelectionComponent {\n * readonly selection = textSelection();\n * }\n * ```\n */\nexport function textSelection(options?: TextSelectionOptions): TextSelectionRef {\n const { runInContext } = setupContext(options?.injector, textSelection);\n\n return runInContext(({ isServer }) => {\n if (isServer) {\n return {\n selection: constSignal(null),\n text: constSignal(''),\n ranges: constSignal([]),\n rects: constSignal([]),\n clear: NOOP_FN,\n };\n }\n\n const selection = signal<Selection | null>(window.getSelection(), { equal: ALWAYS_FALSE_FN });\n const text = computed(() => selection()?.toString() ?? '');\n const ranges = computed<Range[]>(() => {\n const sel = selection();\n return sel ? getRangesFromSelection(sel) : [];\n });\n const rects = computed(() => ranges().map(range => range.getBoundingClientRect()));\n\n const clear = () => window.getSelection()?.removeAllRanges();\n\n setupSync(() => {\n listener(document, 'selectionchange', () => selection.set(window.getSelection()));\n });\n\n return {\n selection: selection.asReadonly(),\n text,\n ranges,\n rects,\n clear,\n };\n });\n}\n\nexport const TEXT_SELECTION = /* @__PURE__ */ createToken(textSelection);\n\nfunction getRangesFromSelection(selection: Selection): Range[] {\n const rangeCount = selection.rangeCount ?? 0;\n return Array.from({ length: rangeCount }, (_, i) => selection.getRangeAt(i));\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;AA8BA;;;;;;;;;;;;;;;;;;;;;AAqBG;AACG,SAAU,aAAa,CAAC,OAA8B,EAAA;AAC1D,IAAA,MAAM,EAAE,YAAY,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,aAAa,CAAC;AAEvE,IAAA,OAAO,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAI;QACnC,IAAI,QAAQ,EAAE;YACZ,OAAO;AACL,gBAAA,SAAS,EAAE,WAAW,CAAC,IAAI,CAAC;AAC5B,gBAAA,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC;AACrB,gBAAA,MAAM,EAAE,WAAW,CAAC,EAAE,CAAC;AACvB,gBAAA,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC;AACtB,gBAAA,KAAK,EAAE,OAAO;aACf;QACH;AAEA,QAAA,MAAM,SAAS,GAAG,MAAM,CAAmB,MAAM,CAAC,YAAY,EAAE,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,WAAA,EAAI,KAAK,EAAE,eAAe,OAAxB,EAAE,KAAK,EAAE,eAAe,EAAE,GAAC;AAC7F,QAAA,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,gDAAC;AAC1D,QAAA,MAAM,MAAM,GAAG,QAAQ,CAAU,MAAK;AACpC,YAAA,MAAM,GAAG,GAAG,SAAS,EAAE;AACvB,YAAA,OAAO,GAAG,GAAG,sBAAsB,CAAC,GAAG,CAAC,GAAG,EAAE;AAC/C,QAAA,CAAC,kDAAC;QACF,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,MAAM,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,qBAAqB,EAAE,CAAC,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,OAAA,EAAA,CAAA,GAAA,EAAA,CAAA,CAAC;AAElF,QAAA,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,YAAY,EAAE,EAAE,eAAe,EAAE;QAE5D,SAAS,CAAC,MAAK;AACb,YAAA,QAAQ,CAAC,QAAQ,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;AACnF,QAAA,CAAC,CAAC;QAEF,OAAO;AACL,YAAA,SAAS,EAAE,SAAS,CAAC,UAAU,EAAE;YACjC,IAAI;YACJ,MAAM;YACN,KAAK;YACL,KAAK;SACN;AACH,IAAA,CAAC,CAAC;AACJ;AAEO,MAAM,cAAc,mBAAmB,WAAW,CAAC,aAAa;AAEvE,SAAS,sBAAsB,CAAC,SAAoB,EAAA;AAClD,IAAA,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,IAAI,CAAC;IAC5C,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAC9E;;AC/FA;;AAEG;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"signality-core-elements-window-size.mjs","sources":["../../../projects/core/elements/window-size/index.ts","../../../projects/core/elements/window-size/signality-core-elements-window-size.ts"],"sourcesContent":["import { afterNextRender, type CreateSignalOptions, type Signal, signal } from '@angular/core';\nimport { constSignal, createToken, setupContext } from '@signality/core/internal';\nimport type { WithInjector } from '@signality/core/types';\nimport { listener } from '@signality/core/browser/listener';\nimport { watcher } from '@signality/core/reactivity/watcher';\nimport { mediaQuery } from '@signality/core/browser/media-query';\n\nexport interface WindowSizeOptions extends CreateSignalOptions<WindowSizeValue>, WithInjector {\n /**\n * Include scrollbar in dimensions calculation.\n * @default false\n */\n readonly includeScrollbar?: boolean;\n\n /**\n * Initial dimensions for SSR.\n */\n readonly initialValue?: Pick<WindowSizeValue, 'width' | 'height'>;\n}\n\nexport interface WindowSizeValue {\n readonly width: number;\n readonly height: number;\n readonly innerWidth: number;\n readonly innerHeight: number;\n readonly outerWidth: number;\n readonly outerHeight: number;\n}\n\n/**\n * Signal-based wrapper around the [Window API](https://developer.mozilla.org/en-US/docs/Web/API/Window) dimensions.\n *\n * @param options - Optional configuration including initialValue for SSR\n * @returns A signal containing the current window dimensions\n *\n * @example\n * ```typescript\n * @Component({\n * template: `\n * <div>\n * Window: {{ size().width }} × {{ size().height }}px\n * @if (size().width < 768) {\n * <p>Mobile view</p>\n * }\n * </div>\n * `\n * })\n * class WindowSizeComponent {\n * readonly size = windowSize();\n * }\n * ```\n */\nexport function windowSize(options?: WindowSizeOptions): Signal<WindowSizeValue> {\n const { runInContext } = setupContext(options?.injector, windowSize);\n\n return runInContext(({ isServer }) => {\n const initialValue: WindowSizeValue = options?.initialValue\n ? {\n width: options.initialValue.width,\n height: options.initialValue.height,\n innerWidth: options.initialValue.width,\n innerHeight: options.initialValue.height,\n outerWidth: options.initialValue.width,\n outerHeight: options.initialValue.height,\n }\n : DEFAULT_VALUE;\n\n if (isServer) {\n return constSignal(initialValue);\n }\n\n const includeScrollbar = options?.includeScrollbar ?? false;\n\n const size = signal<WindowSizeValue>(initialValue, options);\n\n const update = () => {\n const width = includeScrollbar ? window.innerWidth : document.documentElement.clientWidth;\n const height = includeScrollbar ? window.innerHeight : document.documentElement.clientHeight;\n\n size.set({\n width,\n height,\n innerWidth: window.innerWidth,\n innerHeight: window.innerHeight,\n outerWidth: window.outerWidth,\n outerHeight: window.outerHeight,\n });\n };\n\n listener(window, 'resize', update);\n\n watcher(mediaQuery('(orientation: portrait)'), update);\n\n afterNextRender({ read: update });\n\n return size.asReadonly();\n });\n}\n\nexport const WINDOW_SIZE = /* @__PURE__ */ createToken(windowSize);\n\nconst DEFAULT_VALUE: WindowSizeValue = {\n width: 0,\n height: 0,\n innerWidth: 0,\n innerHeight: 0,\n outerWidth: 0,\n outerHeight: 0,\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;AA6BA;;;;;;;;;;;;;;;;;;;;;;AAsBG;AACG,SAAU,UAAU,CAAC,OAA2B,EAAA;AACpD,IAAA,MAAM,EAAE,YAAY,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC;AAEpE,IAAA,OAAO,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAI;AACnC,QAAA,MAAM,YAAY,GAAoB,OAAO,EAAE;AAC7C,cAAE;AACE,gBAAA,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK;AACjC,gBAAA,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,MAAM;AACnC,gBAAA,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK;AACtC,gBAAA,WAAW,EAAE,OAAO,CAAC,YAAY,CAAC,MAAM;AACxC,gBAAA,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK;AACtC,gBAAA,WAAW,EAAE,OAAO,CAAC,YAAY,CAAC,MAAM;AACzC;cACD,aAAa;QAEjB,IAAI,QAAQ,EAAE;AACZ,YAAA,OAAO,WAAW,CAAC,YAAY,CAAC;QAClC;AAEA,QAAA,MAAM,gBAAgB,GAAG,OAAO,EAAE,gBAAgB,IAAI,KAAK;QAE3D,MAAM,IAAI,GAAG,MAAM,CAAkB,YAAY,EAAE,OAAO,CAAC;QAE3D,MAAM,MAAM,GAAG,MAAK;AAClB,YAAA,MAAM,KAAK,GAAG,gBAAgB,GAAG,MAAM,CAAC,UAAU,GAAG,QAAQ,CAAC,eAAe,CAAC,WAAW;AACzF,YAAA,MAAM,MAAM,GAAG,gBAAgB,GAAG,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC,eAAe,CAAC,YAAY;YAE5F,IAAI,CAAC,GAAG,CAAC;gBACP,KAAK;gBACL,MAAM;gBACN,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;gBAC7B,WAAW,EAAE,MAAM,CAAC,WAAW;AAChC,aAAA,CAAC;AACJ,QAAA,CAAC;AAED,QAAA,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC;QAElC,OAAO,CAAC,UAAU,CAAC,yBAAyB,CAAC,EAAE,MAAM,CAAC;AAEtD,QAAA,eAAe,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAEjC,QAAA,OAAO,IAAI,CAAC,UAAU,EAAE;AAC1B,IAAA,CAAC,CAAC;AACJ;AAEO,MAAM,WAAW,mBAAmB,WAAW,CAAC,UAAU;AAEjE,MAAM,aAAa,GAAoB;AACrC,IAAA,KAAK,EAAE,CAAC;AACR,IAAA,MAAM,EAAE,CAAC;AACT,IAAA,UAAU,EAAE,CAAC;AACb,IAAA,WAAW,EAAE,CAAC;AACd,IAAA,UAAU,EAAE,CAAC;AACb,IAAA,WAAW,EAAE,CAAC;CACf;;AC5GD;;AAEG;;;;"}
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import { afterRenderEffect } from '@angular/core';
|
|
2
|
-
import { setupContext, NOOP_EFFECT_REF, toValue } from '@signality/core/internal';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Low-level utility for observing performance measurement events using the [Performance Observer API](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceObserver).
|
|
6
|
-
* Provides reactive access to performance entries as they are recorded in the browser's performance timeline.
|
|
7
|
-
*
|
|
8
|
-
* @param callback - Callback function called when performance entries are recorded
|
|
9
|
-
* @param options - Optional configuration (see {@link PerformanceObserverInitOptions})
|
|
10
|
-
* @returns PerformanceObserverRef with a `destroy()` method to stop observing
|
|
11
|
-
*
|
|
12
|
-
* @example
|
|
13
|
-
* ```typescript
|
|
14
|
-
* @Component({
|
|
15
|
-
* template: `
|
|
16
|
-
* <div>LCP: {{ lcp() }}ms</div>
|
|
17
|
-
* `
|
|
18
|
-
* })
|
|
19
|
-
* class PerformanceComponent {
|
|
20
|
-
* readonly lcp = signal(0);
|
|
21
|
-
*
|
|
22
|
-
* constructor() {
|
|
23
|
-
* performanceObserver(entries => {
|
|
24
|
-
* const lcpEntry = entries.find(e => e.entryType === 'largest-contentful-paint');
|
|
25
|
-
* if (lcpEntry) {
|
|
26
|
-
* this.lcp.set(Math.round(lcpEntry.startTime));
|
|
27
|
-
* }
|
|
28
|
-
* }, { entryTypes: ['largest-contentful-paint'] });
|
|
29
|
-
* }
|
|
30
|
-
* }
|
|
31
|
-
* ```
|
|
32
|
-
*
|
|
33
|
-
* @example
|
|
34
|
-
* ```typescript
|
|
35
|
-
* // Track long tasks
|
|
36
|
-
* performanceObserver(entries => {
|
|
37
|
-
* entries.forEach(entry => {
|
|
38
|
-
* console.log('Long task:', entry.duration);
|
|
39
|
-
* });
|
|
40
|
-
* }, { entryTypes: ['longtask'] });
|
|
41
|
-
* ```
|
|
42
|
-
*
|
|
43
|
-
* @example
|
|
44
|
-
* ```typescript
|
|
45
|
-
* // Using type (single entry type, legacy API)
|
|
46
|
-
* performanceObserver(entries => {
|
|
47
|
-
* console.log('Navigation timing:', entries[0]);
|
|
48
|
-
* }, { type: 'navigation', buffered: true });
|
|
49
|
-
* ```
|
|
50
|
-
*/
|
|
51
|
-
function performanceObserver(callback, options) {
|
|
52
|
-
const { runInContext } = setupContext(options?.injector, performanceObserver);
|
|
53
|
-
return runInContext(({ isServer }) => {
|
|
54
|
-
if (isServer) {
|
|
55
|
-
return NOOP_EFFECT_REF;
|
|
56
|
-
}
|
|
57
|
-
const setupObserver = (onCleanup) => {
|
|
58
|
-
const entryTypes = toValue(options?.entryTypes);
|
|
59
|
-
const type = toValue(options?.type);
|
|
60
|
-
const buffered = toValue(options?.buffered);
|
|
61
|
-
if (!entryTypes && !type) {
|
|
62
|
-
console.warn('[PerformanceObserver] Either entryTypes or type must be provided. ' +
|
|
63
|
-
'See https://developer.mozilla.org/en-US/docs/Web/API/PerformanceObserver/observe');
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
const observer = new PerformanceObserver(callback);
|
|
67
|
-
observer.observe({
|
|
68
|
-
entryTypes,
|
|
69
|
-
type,
|
|
70
|
-
buffered,
|
|
71
|
-
});
|
|
72
|
-
onCleanup(observer.disconnect.bind(observer));
|
|
73
|
-
};
|
|
74
|
-
const effectRef = afterRenderEffect({ read: setupObserver }, options);
|
|
75
|
-
return { destroy: () => effectRef.destroy() };
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Generated bundle index. Do not edit.
|
|
81
|
-
*/
|
|
82
|
-
|
|
83
|
-
export { performanceObserver };
|
|
84
|
-
//# sourceMappingURL=signality-core-observers-performance-observer.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"signality-core-observers-performance-observer.mjs","sources":["../../../projects/core/observers/performance-observer/index.ts","../../../projects/core/observers/performance-observer/signality-core-observers-performance-observer.ts"],"sourcesContent":["import {\n afterRenderEffect,\n type CreateEffectOptions,\n type EffectCleanupRegisterFn,\n} from '@angular/core';\nimport { NOOP_EFFECT_REF, setupContext, toValue } from '@signality/core/internal';\nimport type { MaybeSignal } from '@signality/core/types';\n\nexport interface PerformanceObserverInitOptions\n extends Omit<CreateEffectOptions, 'allowSignalWrites'> {\n readonly entryTypes?: MaybeSignal<string[]>;\n readonly type?: MaybeSignal<string>;\n readonly buffered?: MaybeSignal<boolean>;\n}\n\nexport interface PerformanceObserverRef {\n readonly destroy: () => void;\n}\n\n/**\n * Low-level utility for observing performance measurement events using the [Performance Observer API](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceObserver).\n * Provides reactive access to performance entries as they are recorded in the browser's performance timeline.\n *\n * @param callback - Callback function called when performance entries are recorded\n * @param options - Optional configuration (see {@link PerformanceObserverInitOptions})\n * @returns PerformanceObserverRef with a `destroy()` method to stop observing\n *\n * @example\n * ```typescript\n * @Component({\n * template: `\n * <div>LCP: {{ lcp() }}ms</div>\n * `\n * })\n * class PerformanceComponent {\n * readonly lcp = signal(0);\n *\n * constructor() {\n * performanceObserver(entries => {\n * const lcpEntry = entries.find(e => e.entryType === 'largest-contentful-paint');\n * if (lcpEntry) {\n * this.lcp.set(Math.round(lcpEntry.startTime));\n * }\n * }, { entryTypes: ['largest-contentful-paint'] });\n * }\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Track long tasks\n * performanceObserver(entries => {\n * entries.forEach(entry => {\n * console.log('Long task:', entry.duration);\n * });\n * }, { entryTypes: ['longtask'] });\n * ```\n *\n * @example\n * ```typescript\n * // Using type (single entry type, legacy API)\n * performanceObserver(entries => {\n * console.log('Navigation timing:', entries[0]);\n * }, { type: 'navigation', buffered: true });\n * ```\n */\nexport function performanceObserver(\n callback: PerformanceObserverCallback,\n options?: PerformanceObserverInitOptions\n): PerformanceObserverRef {\n const { runInContext } = setupContext(options?.injector, performanceObserver);\n\n return runInContext(({ isServer }) => {\n if (isServer) {\n return NOOP_EFFECT_REF;\n }\n\n const setupObserver = (onCleanup: EffectCleanupRegisterFn) => {\n const entryTypes = toValue(options?.entryTypes);\n const type = toValue(options?.type);\n const buffered = toValue(options?.buffered);\n\n if (!entryTypes && !type) {\n console.warn(\n '[PerformanceObserver] Either entryTypes or type must be provided. ' +\n 'See https://developer.mozilla.org/en-US/docs/Web/API/PerformanceObserver/observe'\n );\n return;\n }\n\n const observer = new PerformanceObserver(callback);\n\n observer.observe({\n entryTypes,\n type,\n buffered,\n });\n\n onCleanup(observer.disconnect.bind(observer));\n };\n\n const effectRef = afterRenderEffect({ read: setupObserver }, options);\n\n return { destroy: () => effectRef.destroy() };\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;AAmBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CG;AACG,SAAU,mBAAmB,CACjC,QAAqC,EACrC,OAAwC,EAAA;AAExC,IAAA,MAAM,EAAE,YAAY,EAAE,GAAG,YAAY,CAAC,OAAO,EAAE,QAAQ,EAAE,mBAAmB,CAAC;AAE7E,IAAA,OAAO,YAAY,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAI;QACnC,IAAI,QAAQ,EAAE;AACZ,YAAA,OAAO,eAAe;QACxB;AAEA,QAAA,MAAM,aAAa,GAAG,CAAC,SAAkC,KAAI;YAC3D,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC;YAC/C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;YACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC;AAE3C,YAAA,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,EAAE;gBACxB,OAAO,CAAC,IAAI,CACV,oEAAoE;AAClE,oBAAA,kFAAkF,CACrF;gBACD;YACF;AAEA,YAAA,MAAM,QAAQ,GAAG,IAAI,mBAAmB,CAAC,QAAQ,CAAC;YAElD,QAAQ,CAAC,OAAO,CAAC;gBACf,UAAU;gBACV,IAAI;gBACJ,QAAQ;AACT,aAAA,CAAC;YAEF,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAC/C,QAAA,CAAC;AAED,QAAA,MAAM,SAAS,GAAG,iBAAiB,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,OAAO,CAAC;QAErE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC,OAAO,EAAE,EAAE;AAC/C,IAAA,CAAC,CAAC;AACJ;;ACzGA;;AAEG;;;;"}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { type CreateEffectOptions } from '@angular/core';
|
|
2
|
-
import type { MaybeSignal } from '@signality/core/types';
|
|
3
|
-
export interface PerformanceObserverInitOptions extends Omit<CreateEffectOptions, 'allowSignalWrites'> {
|
|
4
|
-
readonly entryTypes?: MaybeSignal<string[]>;
|
|
5
|
-
readonly type?: MaybeSignal<string>;
|
|
6
|
-
readonly buffered?: MaybeSignal<boolean>;
|
|
7
|
-
}
|
|
8
|
-
export interface PerformanceObserverRef {
|
|
9
|
-
readonly destroy: () => void;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Low-level utility for observing performance measurement events using the [Performance Observer API](https://developer.mozilla.org/en-US/docs/Web/API/PerformanceObserver).
|
|
13
|
-
* Provides reactive access to performance entries as they are recorded in the browser's performance timeline.
|
|
14
|
-
*
|
|
15
|
-
* @param callback - Callback function called when performance entries are recorded
|
|
16
|
-
* @param options - Optional configuration (see {@link PerformanceObserverInitOptions})
|
|
17
|
-
* @returns PerformanceObserverRef with a `destroy()` method to stop observing
|
|
18
|
-
*
|
|
19
|
-
* @example
|
|
20
|
-
* ```typescript
|
|
21
|
-
* @Component({
|
|
22
|
-
* template: `
|
|
23
|
-
* <div>LCP: {{ lcp() }}ms</div>
|
|
24
|
-
* `
|
|
25
|
-
* })
|
|
26
|
-
* class PerformanceComponent {
|
|
27
|
-
* readonly lcp = signal(0);
|
|
28
|
-
*
|
|
29
|
-
* constructor() {
|
|
30
|
-
* performanceObserver(entries => {
|
|
31
|
-
* const lcpEntry = entries.find(e => e.entryType === 'largest-contentful-paint');
|
|
32
|
-
* if (lcpEntry) {
|
|
33
|
-
* this.lcp.set(Math.round(lcpEntry.startTime));
|
|
34
|
-
* }
|
|
35
|
-
* }, { entryTypes: ['largest-contentful-paint'] });
|
|
36
|
-
* }
|
|
37
|
-
* }
|
|
38
|
-
* ```
|
|
39
|
-
*
|
|
40
|
-
* @example
|
|
41
|
-
* ```typescript
|
|
42
|
-
* // Track long tasks
|
|
43
|
-
* performanceObserver(entries => {
|
|
44
|
-
* entries.forEach(entry => {
|
|
45
|
-
* console.log('Long task:', entry.duration);
|
|
46
|
-
* });
|
|
47
|
-
* }, { entryTypes: ['longtask'] });
|
|
48
|
-
* ```
|
|
49
|
-
*
|
|
50
|
-
* @example
|
|
51
|
-
* ```typescript
|
|
52
|
-
* // Using type (single entry type, legacy API)
|
|
53
|
-
* performanceObserver(entries => {
|
|
54
|
-
* console.log('Navigation timing:', entries[0]);
|
|
55
|
-
* }, { type: 'navigation', buffered: true });
|
|
56
|
-
* ```
|
|
57
|
-
*/
|
|
58
|
-
export declare function performanceObserver(callback: PerformanceObserverCallback, options?: PerformanceObserverInitOptions): PerformanceObserverRef;
|