@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.
Files changed (219) hide show
  1. package/browser/battery/index.d.ts +27 -2
  2. package/browser/bluetooth/index.d.ts +40 -13
  3. package/browser/breakpoints/index.d.ts +22 -9
  4. package/browser/broadcast-channel/index.d.ts +1 -1
  5. package/browser/browser-language/index.d.ts +1 -1
  6. package/browser/clipboard/index.d.ts +22 -6
  7. package/browser/device-posture/index.d.ts +23 -2
  8. package/browser/display-media/index.d.ts +34 -22
  9. package/browser/eye-dropper/index.d.ts +22 -6
  10. package/browser/favicon/index.d.ts +29 -2
  11. package/browser/file-dialog/index.d.ts +97 -0
  12. package/browser/fps/index.d.ts +1 -1
  13. package/browser/fullscreen/index.d.ts +78 -0
  14. package/browser/gamepad/index.d.ts +39 -9
  15. package/browser/geolocation/index.d.ts +44 -13
  16. package/browser/index.d.ts +8 -1
  17. package/browser/input-modality/index.d.ts +1 -1
  18. package/browser/listener/index.d.ts +1 -1
  19. package/browser/media-query/index.d.ts +1 -1
  20. package/browser/network/index.d.ts +37 -9
  21. package/browser/online/index.d.ts +1 -1
  22. package/browser/page-visibility/index.d.ts +1 -1
  23. package/browser/permission-state/index.d.ts +23 -0
  24. package/browser/picture-in-picture/index.d.ts +24 -6
  25. package/browser/screen-orientation/index.d.ts +1 -1
  26. package/browser/speech-recognition/index.d.ts +51 -13
  27. package/browser/speech-synthesis/index.d.ts +82 -42
  28. package/browser/storage/index.d.ts +1 -1
  29. package/browser/text-direction/index.d.ts +2 -5
  30. package/{elements → browser}/text-selection/index.d.ts +1 -1
  31. package/browser/vibration/index.d.ts +38 -9
  32. package/browser/wake-lock/index.d.ts +51 -12
  33. package/browser/web-notification/index.d.ts +35 -9
  34. package/browser/web-share/index.d.ts +19 -5
  35. package/browser/web-worker/index.d.ts +35 -11
  36. package/browser/window-focus/index.d.ts +27 -0
  37. package/{elements → browser}/window-size/index.d.ts +6 -7
  38. package/elements/active-element/index.d.ts +1 -1
  39. package/elements/dropzone/index.d.ts +60 -10
  40. package/elements/element-focus/index.d.ts +1 -1
  41. package/elements/element-focus-within/index.d.ts +1 -1
  42. package/elements/element-hover/index.d.ts +1 -1
  43. package/elements/element-size/index.d.ts +8 -5
  44. package/elements/element-visibility/index.d.ts +25 -7
  45. package/elements/index.d.ts +0 -2
  46. package/elements/mouse-position/index.d.ts +27 -7
  47. package/elements/on-click-outside/index.d.ts +1 -1
  48. package/elements/on-disconnect/index.d.ts +1 -1
  49. package/elements/on-long-press/index.d.ts +1 -1
  50. package/elements/pointer-swipe/index.d.ts +1 -1
  51. package/elements/scroll-position/index.d.ts +2 -2
  52. package/elements/swipe/index.d.ts +1 -1
  53. package/fesm2022/signality-core-browser-battery.mjs +1 -1
  54. package/fesm2022/signality-core-browser-battery.mjs.map +1 -1
  55. package/fesm2022/signality-core-browser-bluetooth.mjs +28 -27
  56. package/fesm2022/signality-core-browser-bluetooth.mjs.map +1 -1
  57. package/fesm2022/signality-core-browser-breakpoints.mjs +19 -10
  58. package/fesm2022/signality-core-browser-breakpoints.mjs.map +1 -1
  59. package/fesm2022/signality-core-browser-broadcast-channel.mjs +1 -1
  60. package/fesm2022/signality-core-browser-broadcast-channel.mjs.map +1 -1
  61. package/fesm2022/signality-core-browser-browser-language.mjs +1 -1
  62. package/fesm2022/signality-core-browser-browser-language.mjs.map +1 -1
  63. package/fesm2022/signality-core-browser-clipboard.mjs +1 -1
  64. package/fesm2022/signality-core-browser-clipboard.mjs.map +1 -1
  65. package/fesm2022/signality-core-browser-device-posture.mjs +13 -0
  66. package/fesm2022/signality-core-browser-device-posture.mjs.map +1 -1
  67. package/fesm2022/signality-core-browser-display-media.mjs +4 -17
  68. package/fesm2022/signality-core-browser-display-media.mjs.map +1 -1
  69. package/fesm2022/signality-core-browser-eye-dropper.mjs +1 -1
  70. package/fesm2022/signality-core-browser-eye-dropper.mjs.map +1 -1
  71. package/fesm2022/signality-core-browser-favicon.mjs +2 -2
  72. package/fesm2022/signality-core-browser-favicon.mjs.map +1 -1
  73. package/fesm2022/signality-core-browser-file-dialog.mjs +109 -0
  74. package/fesm2022/signality-core-browser-file-dialog.mjs.map +1 -0
  75. package/fesm2022/signality-core-browser-fps.mjs +1 -1
  76. package/fesm2022/signality-core-browser-fps.mjs.map +1 -1
  77. package/fesm2022/signality-core-browser-fullscreen.mjs +113 -0
  78. package/fesm2022/signality-core-browser-fullscreen.mjs.map +1 -0
  79. package/fesm2022/signality-core-browser-gamepad.mjs +14 -4
  80. package/fesm2022/signality-core-browser-gamepad.mjs.map +1 -1
  81. package/fesm2022/signality-core-browser-geolocation.mjs +8 -19
  82. package/fesm2022/signality-core-browser-geolocation.mjs.map +1 -1
  83. package/fesm2022/signality-core-browser-input-modality.mjs +1 -1
  84. package/fesm2022/signality-core-browser-input-modality.mjs.map +1 -1
  85. package/fesm2022/signality-core-browser-listener.mjs +18 -6
  86. package/fesm2022/signality-core-browser-listener.mjs.map +1 -1
  87. package/fesm2022/signality-core-browser-media-query.mjs +1 -1
  88. package/fesm2022/signality-core-browser-media-query.mjs.map +1 -1
  89. package/fesm2022/signality-core-browser-network.mjs +2 -2
  90. package/fesm2022/signality-core-browser-network.mjs.map +1 -1
  91. package/fesm2022/signality-core-browser-online.mjs +1 -1
  92. package/fesm2022/signality-core-browser-online.mjs.map +1 -1
  93. package/fesm2022/signality-core-browser-page-visibility.mjs +1 -1
  94. package/fesm2022/signality-core-browser-page-visibility.mjs.map +1 -1
  95. package/fesm2022/signality-core-browser-permission-state.mjs +57 -0
  96. package/fesm2022/signality-core-browser-permission-state.mjs.map +1 -0
  97. package/fesm2022/signality-core-browser-picture-in-picture.mjs +30 -13
  98. package/fesm2022/signality-core-browser-picture-in-picture.mjs.map +1 -1
  99. package/fesm2022/signality-core-browser-screen-orientation.mjs +1 -1
  100. package/fesm2022/signality-core-browser-screen-orientation.mjs.map +1 -1
  101. package/fesm2022/signality-core-browser-speech-recognition.mjs +7 -19
  102. package/fesm2022/signality-core-browser-speech-recognition.mjs.map +1 -1
  103. package/fesm2022/signality-core-browser-speech-synthesis.mjs +14 -16
  104. package/fesm2022/signality-core-browser-speech-synthesis.mjs.map +1 -1
  105. package/fesm2022/signality-core-browser-storage.mjs +1 -1
  106. package/fesm2022/signality-core-browser-storage.mjs.map +1 -1
  107. package/fesm2022/signality-core-browser-text-direction.mjs +1 -4
  108. package/fesm2022/signality-core-browser-text-direction.mjs.map +1 -1
  109. package/fesm2022/{signality-core-elements-text-selection.mjs → signality-core-browser-text-selection.mjs} +2 -2
  110. package/fesm2022/signality-core-browser-text-selection.mjs.map +1 -0
  111. package/fesm2022/signality-core-browser-vibration.mjs +14 -5
  112. package/fesm2022/signality-core-browser-vibration.mjs.map +1 -1
  113. package/fesm2022/signality-core-browser-wake-lock.mjs +33 -16
  114. package/fesm2022/signality-core-browser-wake-lock.mjs.map +1 -1
  115. package/fesm2022/signality-core-browser-web-notification.mjs +5 -7
  116. package/fesm2022/signality-core-browser-web-notification.mjs.map +1 -1
  117. package/fesm2022/signality-core-browser-web-share.mjs +3 -5
  118. package/fesm2022/signality-core-browser-web-share.mjs.map +1 -1
  119. package/fesm2022/signality-core-browser-web-worker.mjs +6 -3
  120. package/fesm2022/signality-core-browser-web-worker.mjs.map +1 -1
  121. package/fesm2022/signality-core-browser-window-focus.mjs +48 -0
  122. package/fesm2022/signality-core-browser-window-focus.mjs.map +1 -0
  123. package/fesm2022/{signality-core-elements-window-size.mjs → signality-core-browser-window-size.mjs} +4 -24
  124. package/fesm2022/signality-core-browser-window-size.mjs.map +1 -0
  125. package/fesm2022/signality-core-browser.mjs +8 -1
  126. package/fesm2022/signality-core-browser.mjs.map +1 -1
  127. package/fesm2022/signality-core-elements-active-element.mjs +1 -1
  128. package/fesm2022/signality-core-elements-active-element.mjs.map +1 -1
  129. package/fesm2022/signality-core-elements-dropzone.mjs +28 -29
  130. package/fesm2022/signality-core-elements-dropzone.mjs.map +1 -1
  131. package/fesm2022/signality-core-elements-element-focus-within.mjs +1 -1
  132. package/fesm2022/signality-core-elements-element-focus-within.mjs.map +1 -1
  133. package/fesm2022/signality-core-elements-element-focus.mjs +1 -1
  134. package/fesm2022/signality-core-elements-element-focus.mjs.map +1 -1
  135. package/fesm2022/signality-core-elements-element-hover.mjs +1 -1
  136. package/fesm2022/signality-core-elements-element-hover.mjs.map +1 -1
  137. package/fesm2022/signality-core-elements-element-size.mjs +19 -24
  138. package/fesm2022/signality-core-elements-element-size.mjs.map +1 -1
  139. package/fesm2022/signality-core-elements-element-visibility.mjs +2 -2
  140. package/fesm2022/signality-core-elements-element-visibility.mjs.map +1 -1
  141. package/fesm2022/signality-core-elements-mouse-position.mjs +3 -3
  142. package/fesm2022/signality-core-elements-mouse-position.mjs.map +1 -1
  143. package/fesm2022/signality-core-elements-on-click-outside.mjs +1 -1
  144. package/fesm2022/signality-core-elements-on-click-outside.mjs.map +1 -1
  145. package/fesm2022/signality-core-elements-on-disconnect.mjs +1 -1
  146. package/fesm2022/signality-core-elements-on-disconnect.mjs.map +1 -1
  147. package/fesm2022/signality-core-elements-on-long-press.mjs +1 -1
  148. package/fesm2022/signality-core-elements-on-long-press.mjs.map +1 -1
  149. package/fesm2022/signality-core-elements-pointer-swipe.mjs +1 -1
  150. package/fesm2022/signality-core-elements-pointer-swipe.mjs.map +1 -1
  151. package/fesm2022/signality-core-elements-scroll-position.mjs +2 -2
  152. package/fesm2022/signality-core-elements-scroll-position.mjs.map +1 -1
  153. package/fesm2022/signality-core-elements-swipe.mjs +1 -1
  154. package/fesm2022/signality-core-elements-swipe.mjs.map +1 -1
  155. package/fesm2022/signality-core-elements.mjs +0 -2
  156. package/fesm2022/signality-core-elements.mjs.map +1 -1
  157. package/fesm2022/signality-core-internal.mjs +54 -7
  158. package/fesm2022/signality-core-internal.mjs.map +1 -1
  159. package/fesm2022/signality-core-observers-intersection-observer.mjs +3 -2
  160. package/fesm2022/signality-core-observers-intersection-observer.mjs.map +1 -1
  161. package/fesm2022/signality-core-observers-mutation-observer.mjs +3 -2
  162. package/fesm2022/signality-core-observers-mutation-observer.mjs.map +1 -1
  163. package/fesm2022/signality-core-observers-resize-observer.mjs +3 -2
  164. package/fesm2022/signality-core-observers-resize-observer.mjs.map +1 -1
  165. package/fesm2022/signality-core-observers.mjs +0 -1
  166. package/fesm2022/signality-core-observers.mjs.map +1 -1
  167. package/fesm2022/signality-core-reactivity-debounced.mjs.map +1 -1
  168. package/fesm2022/signality-core-reactivity-throttled.mjs.map +1 -1
  169. package/fesm2022/signality-core-reactivity-watcher.mjs.map +1 -1
  170. package/fesm2022/signality-core-router-fragment.mjs +1 -1
  171. package/fesm2022/signality-core-router-fragment.mjs.map +1 -1
  172. package/fesm2022/signality-core-router-params.mjs +1 -1
  173. package/fesm2022/signality-core-router-params.mjs.map +1 -1
  174. package/fesm2022/signality-core-router-query-params.mjs.map +1 -1
  175. package/fesm2022/signality-core-router-route-data.mjs +1 -1
  176. package/fesm2022/signality-core-router-route-data.mjs.map +1 -1
  177. package/fesm2022/signality-core-router-router-listener.mjs.map +1 -1
  178. package/fesm2022/signality-core-router-title.mjs +1 -1
  179. package/fesm2022/signality-core-router-title.mjs.map +1 -1
  180. package/fesm2022/signality-core-router-url.mjs +1 -1
  181. package/fesm2022/signality-core-router-url.mjs.map +1 -1
  182. package/fesm2022/signality-core-scheduling-debounce-callback.mjs +1 -1
  183. package/fesm2022/signality-core-scheduling-debounce-callback.mjs.map +1 -1
  184. package/fesm2022/signality-core-scheduling-interval.mjs +27 -72
  185. package/fesm2022/signality-core-scheduling-interval.mjs.map +1 -1
  186. package/internal/utils/assert.d.ts +2 -0
  187. package/internal/utils/dom/index.d.ts +1 -0
  188. package/internal/utils/dom/is-element.d.ts +1 -1
  189. package/internal/utils/dom/is-event-target.d.ts +1 -0
  190. package/internal/utils/files/index.d.ts +1 -0
  191. package/internal/utils/files/is-accepted-file.d.ts +11 -0
  192. package/internal/utils/index.d.ts +3 -0
  193. package/internal/utils/to-element.d.ts +1 -1
  194. package/internal/utils/unref-element.d.ts +2 -0
  195. package/observers/index.d.ts +0 -1
  196. package/observers/intersection-observer/index.d.ts +22 -1
  197. package/observers/mutation-observer/index.d.ts +43 -1
  198. package/observers/resize-observer/index.d.ts +13 -1
  199. package/package.json +25 -17
  200. package/reactivity/debounced/index.d.ts +2 -2
  201. package/reactivity/throttled/index.d.ts +2 -2
  202. package/reactivity/watcher/index.d.ts +2 -2
  203. package/router/fragment/index.d.ts +1 -1
  204. package/router/params/index.d.ts +1 -1
  205. package/router/query-params/index.d.ts +5 -3
  206. package/router/route-data/index.d.ts +1 -1
  207. package/router/router-listener/index.d.ts +1 -1
  208. package/router/title/index.d.ts +1 -1
  209. package/router/url/index.d.ts +1 -1
  210. package/scheduling/debounce-callback/index.d.ts +1 -1
  211. package/scheduling/interval/index.d.ts +19 -27
  212. package/browser/pointer-lock-element/index.d.ts +0 -22
  213. package/fesm2022/signality-core-browser-pointer-lock-element.mjs +0 -43
  214. package/fesm2022/signality-core-browser-pointer-lock-element.mjs.map +0 -1
  215. package/fesm2022/signality-core-elements-text-selection.mjs.map +0 -1
  216. package/fesm2022/signality-core-elements-window-size.mjs.map +0 -1
  217. package/fesm2022/signality-core-observers-performance-observer.mjs +0 -84
  218. package/fesm2022/signality-core-observers-performance-observer.mjs.map +0 -1
  219. 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 CounterComponent {
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 UserComponent {
56
+ * export class UserPreview {
57
57
  * readonly name = signal('John');
58
58
  * readonly age = signal(25);
59
59
  *
@@ -18,7 +18,7 @@ export type FragmentOptions = CreateSignalOptions<string | null> & WithInjector;
18
18
  * }
19
19
  * `
20
20
  * })
21
- * class FragmentComponent {
21
+ * export class FragmentDemo {
22
22
  * readonly currentFragment = fragment();
23
23
  * }
24
24
  * ```
@@ -19,7 +19,7 @@ export type ParamsOptions<T extends Params = Params> = CreateSignalOptions<T> &
19
19
  * </div>
20
20
  * `
21
21
  * })
22
- * class UserComponent {
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
- /** Signal containing validation error, or null if valid */
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 SearchComponent {
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 ValidatedSearchComponent {
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 ProductComponent {
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
  * }
@@ -26,7 +26,7 @@ export type RouterEventType = 'navigationstart' | 'navigationend' | 'navigationc
26
26
  * }
27
27
  * `
28
28
  * })
29
- * class NavigationComponent {
29
+ * export class NavigationDemo {
30
30
  * readonly isLoading = signal(false);
31
31
  *
32
32
  * constructor() {
@@ -17,7 +17,7 @@ export type TitleOptions = CreateSignalOptions<string> & WithInjector;
17
17
  * </div>
18
18
  * `
19
19
  * })
20
- * class PageComponent {
20
+ * export class Page {
21
21
  * readonly pageTitle = title();
22
22
  *
23
23
  * updateTitle() {
@@ -23,7 +23,7 @@ export interface UrlOptions extends CreateSignalOptions<string>, WithInjector {
23
23
  * </div>
24
24
  * `
25
25
  * })
26
- * class UrlComponent {
26
+ * export class UrlDemo {
27
27
  * readonly currentUrl = url();
28
28
  * readonly absoluteUrl = url({ absolute: true });
29
29
  * }
@@ -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 SearchComponent {
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
- * Whether to start the interval immediately.
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
- /** Whether the interval is currently active */
12
- readonly isActive: Signal<boolean>;
13
- /** Number of times the callback has been executed */
14
- readonly counter: Signal<number>;
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
- * Creates a reactive interval that executes a callback function at specified intervals.
24
- * Automatically handles cleanup and supports reactive interval duration.
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, receives current counter value
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 including immediate start and injector
29
- * @returns An IntervalRef with control methods and state signals
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>Status: {{ polling.isActive() ? 'Polling' : 'Stopped' }}</p>
36
- * <button (click)="polling.pause()">Stop</button>
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 polling = interval(async () => {
42
- * await this.checkStatus();
43
- * }, 5000);
35
+ * readonly ticks = signal(0);
44
36
  *
45
- * async checkStatus() {
46
- * // async operation
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: (counter: number) => void, intervalMs: MaybeSignal<number>, options?: IntervalOptions): IntervalRef;
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;