@signality/core 0.0.1-alpha.2

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 (261) hide show
  1. package/README.md +60 -0
  2. package/browser/battery/index.d.ts +34 -0
  3. package/browser/bluetooth/index.d.ts +56 -0
  4. package/browser/breakpoints/index.d.ts +32 -0
  5. package/browser/broadcast-channel/index.d.ts +42 -0
  6. package/browser/browser-language/index.d.ts +34 -0
  7. package/browser/clipboard/index.d.ts +48 -0
  8. package/browser/device-posture/index.d.ts +18 -0
  9. package/browser/display-media/index.d.ts +80 -0
  10. package/browser/eye-dropper/index.d.ts +47 -0
  11. package/browser/favicon/index.d.ts +39 -0
  12. package/browser/fps/index.d.ts +46 -0
  13. package/browser/gamepad/index.d.ts +28 -0
  14. package/browser/geolocation/index.d.ts +64 -0
  15. package/browser/index.d.ts +29 -0
  16. package/browser/input-modality/index.d.ts +26 -0
  17. package/browser/listener/index.d.ts +61 -0
  18. package/browser/media-query/index.d.ts +36 -0
  19. package/browser/network/index.d.ts +44 -0
  20. package/browser/online/index.d.ts +27 -0
  21. package/browser/page-visibility/index.d.ts +27 -0
  22. package/browser/picture-in-picture/index.d.ts +42 -0
  23. package/browser/pointer-lock-element/index.d.ts +22 -0
  24. package/browser/screen-orientation/index.d.ts +29 -0
  25. package/browser/speech-recognition/index.d.ts +77 -0
  26. package/browser/speech-synthesis/index.d.ts +76 -0
  27. package/browser/storage/index.d.ts +142 -0
  28. package/browser/text-direction/index.d.ts +43 -0
  29. package/browser/vibration/index.d.ts +37 -0
  30. package/browser/wake-lock/index.d.ts +37 -0
  31. package/browser/web-notification/index.d.ts +58 -0
  32. package/browser/web-share/index.d.ts +42 -0
  33. package/browser/web-worker/index.d.ts +52 -0
  34. package/elements/active-element/index.d.ts +27 -0
  35. package/elements/dropzone/index.d.ts +61 -0
  36. package/elements/element-focus/index.d.ts +38 -0
  37. package/elements/element-focus-within/index.d.ts +29 -0
  38. package/elements/element-hover/index.d.ts +27 -0
  39. package/elements/element-size/index.d.ts +40 -0
  40. package/elements/element-visibility/index.d.ts +53 -0
  41. package/elements/index.d.ts +16 -0
  42. package/elements/mouse-position/index.d.ts +64 -0
  43. package/elements/on-click-outside/index.d.ts +42 -0
  44. package/elements/on-disconnect/index.d.ts +45 -0
  45. package/elements/on-long-press/index.d.ts +44 -0
  46. package/elements/pointer-swipe/index.d.ts +58 -0
  47. package/elements/scroll-position/index.d.ts +96 -0
  48. package/elements/swipe/index.d.ts +49 -0
  49. package/elements/text-selection/index.d.ts +39 -0
  50. package/elements/window-size/index.d.ts +46 -0
  51. package/fesm2022/signality-core-browser-battery.mjs +80 -0
  52. package/fesm2022/signality-core-browser-battery.mjs.map +1 -0
  53. package/fesm2022/signality-core-browser-bluetooth.mjs +112 -0
  54. package/fesm2022/signality-core-browser-bluetooth.mjs.map +1 -0
  55. package/fesm2022/signality-core-browser-breakpoints.mjs +51 -0
  56. package/fesm2022/signality-core-browser-breakpoints.mjs.map +1 -0
  57. package/fesm2022/signality-core-browser-broadcast-channel.mjs +74 -0
  58. package/fesm2022/signality-core-browser-broadcast-channel.mjs.map +1 -0
  59. package/fesm2022/signality-core-browser-browser-language.mjs +48 -0
  60. package/fesm2022/signality-core-browser-browser-language.mjs.map +1 -0
  61. package/fesm2022/signality-core-browser-clipboard.mjs +102 -0
  62. package/fesm2022/signality-core-browser-clipboard.mjs.map +1 -0
  63. package/fesm2022/signality-core-browser-device-posture.mjs +40 -0
  64. package/fesm2022/signality-core-browser-device-posture.mjs.map +1 -0
  65. package/fesm2022/signality-core-browser-display-media.mjs +121 -0
  66. package/fesm2022/signality-core-browser-display-media.mjs.map +1 -0
  67. package/fesm2022/signality-core-browser-eye-dropper.mjs +82 -0
  68. package/fesm2022/signality-core-browser-eye-dropper.mjs.map +1 -0
  69. package/fesm2022/signality-core-browser-favicon.mjs +100 -0
  70. package/fesm2022/signality-core-browser-favicon.mjs.map +1 -0
  71. package/fesm2022/signality-core-browser-fps.mjs +103 -0
  72. package/fesm2022/signality-core-browser-fps.mjs.map +1 -0
  73. package/fesm2022/signality-core-browser-gamepad.mjs +93 -0
  74. package/fesm2022/signality-core-browser-gamepad.mjs.map +1 -0
  75. package/fesm2022/signality-core-browser-geolocation.mjs +120 -0
  76. package/fesm2022/signality-core-browser-geolocation.mjs.map +1 -0
  77. package/fesm2022/signality-core-browser-input-modality.mjs +64 -0
  78. package/fesm2022/signality-core-browser-input-modality.mjs.map +1 -0
  79. package/fesm2022/signality-core-browser-listener.mjs +132 -0
  80. package/fesm2022/signality-core-browser-listener.mjs.map +1 -0
  81. package/fesm2022/signality-core-browser-media-query.mjs +55 -0
  82. package/fesm2022/signality-core-browser-media-query.mjs.map +1 -0
  83. package/fesm2022/signality-core-browser-network.mjs +76 -0
  84. package/fesm2022/signality-core-browser-network.mjs.map +1 -0
  85. package/fesm2022/signality-core-browser-online.mjs +49 -0
  86. package/fesm2022/signality-core-browser-online.mjs.map +1 -0
  87. package/fesm2022/signality-core-browser-page-visibility.mjs +47 -0
  88. package/fesm2022/signality-core-browser-page-visibility.mjs.map +1 -0
  89. package/fesm2022/signality-core-browser-picture-in-picture.mjs +93 -0
  90. package/fesm2022/signality-core-browser-picture-in-picture.mjs.map +1 -0
  91. package/fesm2022/signality-core-browser-pointer-lock-element.mjs +43 -0
  92. package/fesm2022/signality-core-browser-pointer-lock-element.mjs.map +1 -0
  93. package/fesm2022/signality-core-browser-screen-orientation.mjs +43 -0
  94. package/fesm2022/signality-core-browser-screen-orientation.mjs.map +1 -0
  95. package/fesm2022/signality-core-browser-speech-recognition.mjs +171 -0
  96. package/fesm2022/signality-core-browser-speech-recognition.mjs.map +1 -0
  97. package/fesm2022/signality-core-browser-speech-synthesis.mjs +146 -0
  98. package/fesm2022/signality-core-browser-speech-synthesis.mjs.map +1 -0
  99. package/fesm2022/signality-core-browser-storage.mjs +261 -0
  100. package/fesm2022/signality-core-browser-storage.mjs.map +1 -0
  101. package/fesm2022/signality-core-browser-text-direction.mjs +62 -0
  102. package/fesm2022/signality-core-browser-text-direction.mjs.map +1 -0
  103. package/fesm2022/signality-core-browser-vibration.mjs +94 -0
  104. package/fesm2022/signality-core-browser-vibration.mjs.map +1 -0
  105. package/fesm2022/signality-core-browser-wake-lock.mjs +149 -0
  106. package/fesm2022/signality-core-browser-wake-lock.mjs.map +1 -0
  107. package/fesm2022/signality-core-browser-web-notification.mjs +137 -0
  108. package/fesm2022/signality-core-browser-web-notification.mjs.map +1 -0
  109. package/fesm2022/signality-core-browser-web-share.mjs +92 -0
  110. package/fesm2022/signality-core-browser-web-share.mjs.map +1 -0
  111. package/fesm2022/signality-core-browser-web-worker.mjs +105 -0
  112. package/fesm2022/signality-core-browser-web-worker.mjs.map +1 -0
  113. package/fesm2022/signality-core-browser.mjs +34 -0
  114. package/fesm2022/signality-core-browser.mjs.map +1 -0
  115. package/fesm2022/signality-core-elements-active-element.mjs +88 -0
  116. package/fesm2022/signality-core-elements-active-element.mjs.map +1 -0
  117. package/fesm2022/signality-core-elements-dropzone.mjs +158 -0
  118. package/fesm2022/signality-core-elements-dropzone.mjs.map +1 -0
  119. package/fesm2022/signality-core-elements-element-focus-within.mjs +56 -0
  120. package/fesm2022/signality-core-elements-element-focus-within.mjs.map +1 -0
  121. package/fesm2022/signality-core-elements-element-focus.mjs +54 -0
  122. package/fesm2022/signality-core-elements-element-focus.mjs.map +1 -0
  123. package/fesm2022/signality-core-elements-element-hover.mjs +48 -0
  124. package/fesm2022/signality-core-elements-element-hover.mjs.map +1 -0
  125. package/fesm2022/signality-core-elements-element-size.mjs +73 -0
  126. package/fesm2022/signality-core-elements-element-size.mjs.map +1 -0
  127. package/fesm2022/signality-core-elements-element-visibility.mjs +76 -0
  128. package/fesm2022/signality-core-elements-element-visibility.mjs.map +1 -0
  129. package/fesm2022/signality-core-elements-mouse-position.mjs +109 -0
  130. package/fesm2022/signality-core-elements-mouse-position.mjs.map +1 -0
  131. package/fesm2022/signality-core-elements-on-click-outside.mjs +97 -0
  132. package/fesm2022/signality-core-elements-on-click-outside.mjs.map +1 -0
  133. package/fesm2022/signality-core-elements-on-disconnect.mjs +99 -0
  134. package/fesm2022/signality-core-elements-on-disconnect.mjs.map +1 -0
  135. package/fesm2022/signality-core-elements-on-long-press.mjs +84 -0
  136. package/fesm2022/signality-core-elements-on-long-press.mjs.map +1 -0
  137. package/fesm2022/signality-core-elements-pointer-swipe.mjs +116 -0
  138. package/fesm2022/signality-core-elements-pointer-swipe.mjs.map +1 -0
  139. package/fesm2022/signality-core-elements-scroll-position.mjs +175 -0
  140. package/fesm2022/signality-core-elements-scroll-position.mjs.map +1 -0
  141. package/fesm2022/signality-core-elements-swipe.mjs +107 -0
  142. package/fesm2022/signality-core-elements-swipe.mjs.map +1 -0
  143. package/fesm2022/signality-core-elements-text-selection.mjs +70 -0
  144. package/fesm2022/signality-core-elements-text-selection.mjs.map +1 -0
  145. package/fesm2022/signality-core-elements-window-size.mjs +81 -0
  146. package/fesm2022/signality-core-elements-window-size.mjs.map +1 -0
  147. package/fesm2022/signality-core-elements.mjs +21 -0
  148. package/fesm2022/signality-core-elements.mjs.map +1 -0
  149. package/fesm2022/signality-core-forms-cva.mjs +140 -0
  150. package/fesm2022/signality-core-forms-cva.mjs.map +1 -0
  151. package/fesm2022/signality-core-forms.mjs +6 -0
  152. package/fesm2022/signality-core-forms.mjs.map +1 -0
  153. package/fesm2022/signality-core-internal.mjs +268 -0
  154. package/fesm2022/signality-core-internal.mjs.map +1 -0
  155. package/fesm2022/signality-core-observers-intersection-observer.mjs +70 -0
  156. package/fesm2022/signality-core-observers-intersection-observer.mjs.map +1 -0
  157. package/fesm2022/signality-core-observers-mutation-observer.mjs +77 -0
  158. package/fesm2022/signality-core-observers-mutation-observer.mjs.map +1 -0
  159. package/fesm2022/signality-core-observers-performance-observer.mjs +84 -0
  160. package/fesm2022/signality-core-observers-performance-observer.mjs.map +1 -0
  161. package/fesm2022/signality-core-observers-resize-observer.mjs +69 -0
  162. package/fesm2022/signality-core-observers-resize-observer.mjs.map +1 -0
  163. package/fesm2022/signality-core-observers.mjs +9 -0
  164. package/fesm2022/signality-core-observers.mjs.map +1 -0
  165. package/fesm2022/signality-core-reactivity-debounced.mjs +27 -0
  166. package/fesm2022/signality-core-reactivity-debounced.mjs.map +1 -0
  167. package/fesm2022/signality-core-reactivity-throttled.mjs +27 -0
  168. package/fesm2022/signality-core-reactivity-throttled.mjs.map +1 -0
  169. package/fesm2022/signality-core-reactivity-watcher.mjs +36 -0
  170. package/fesm2022/signality-core-reactivity-watcher.mjs.map +1 -0
  171. package/fesm2022/signality-core-reactivity.mjs +8 -0
  172. package/fesm2022/signality-core-reactivity.mjs.map +1 -0
  173. package/fesm2022/signality-core-router-fragment.mjs +41 -0
  174. package/fesm2022/signality-core-router-fragment.mjs.map +1 -0
  175. package/fesm2022/signality-core-router-params.mjs +45 -0
  176. package/fesm2022/signality-core-router-params.mjs.map +1 -0
  177. package/fesm2022/signality-core-router-query-params.mjs +67 -0
  178. package/fesm2022/signality-core-router-query-params.mjs.map +1 -0
  179. package/fesm2022/signality-core-router-route-data.mjs +46 -0
  180. package/fesm2022/signality-core-router-route-data.mjs.map +1 -0
  181. package/fesm2022/signality-core-router-router-listener.mjs +50 -0
  182. package/fesm2022/signality-core-router-router-listener.mjs.map +1 -0
  183. package/fesm2022/signality-core-router-title.mjs +54 -0
  184. package/fesm2022/signality-core-router-title.mjs.map +1 -0
  185. package/fesm2022/signality-core-router-url.mjs +53 -0
  186. package/fesm2022/signality-core-router-url.mjs.map +1 -0
  187. package/fesm2022/signality-core-router.mjs +12 -0
  188. package/fesm2022/signality-core-router.mjs.map +1 -0
  189. package/fesm2022/signality-core-scheduling-debounce-callback.mjs +59 -0
  190. package/fesm2022/signality-core-scheduling-debounce-callback.mjs.map +1 -0
  191. package/fesm2022/signality-core-scheduling-interval.mjs +110 -0
  192. package/fesm2022/signality-core-scheduling-interval.mjs.map +1 -0
  193. package/fesm2022/signality-core-scheduling-throttle-callback.mjs +66 -0
  194. package/fesm2022/signality-core-scheduling-throttle-callback.mjs.map +1 -0
  195. package/fesm2022/signality-core-scheduling.mjs +8 -0
  196. package/fesm2022/signality-core-scheduling.mjs.map +1 -0
  197. package/fesm2022/signality-core-types.mjs +4 -0
  198. package/fesm2022/signality-core-types.mjs.map +1 -0
  199. package/fesm2022/signality-core.mjs +13 -0
  200. package/fesm2022/signality-core.mjs.map +1 -0
  201. package/forms/cva/index.d.ts +60 -0
  202. package/forms/index.d.ts +1 -0
  203. package/index.d.ts +8 -0
  204. package/internal/constants/index.d.ts +2 -0
  205. package/internal/constants/mobile-regex.d.ts +1 -0
  206. package/internal/constants/stubs.d.ts +32 -0
  207. package/internal/index.d.ts +4 -0
  208. package/internal/providers/index.d.ts +3 -0
  209. package/internal/providers/is-browser.d.ts +2 -0
  210. package/internal/providers/is-mobile.d.ts +2 -0
  211. package/internal/providers/is-server.d.ts +2 -0
  212. package/internal/types/index.d.ts +2 -0
  213. package/internal/types/timer.d.ts +1 -0
  214. package/internal/types/union.d.ts +1 -0
  215. package/internal/utils/bom/index.d.ts +1 -0
  216. package/internal/utils/bom/is-window.d.ts +1 -0
  217. package/internal/utils/const-signal.d.ts +10 -0
  218. package/internal/utils/context.d.ts +18 -0
  219. package/internal/utils/create-token.d.ts +8 -0
  220. package/internal/utils/dom/get-active-element.d.ts +1 -0
  221. package/internal/utils/dom/get-event-target.d.ts +1 -0
  222. package/internal/utils/dom/get-pip-element.d.ts +1 -0
  223. package/internal/utils/dom/get-shadow-root.d.ts +1 -0
  224. package/internal/utils/dom/index.d.ts +6 -0
  225. package/internal/utils/dom/is-element.d.ts +1 -0
  226. package/internal/utils/dom/is-node-within.d.ts +1 -0
  227. package/internal/utils/index.d.ts +10 -0
  228. package/internal/utils/is-plain-object.d.ts +1 -0
  229. package/internal/utils/is-query-signal.d.ts +10 -0
  230. package/internal/utils/proxy-signal.d.ts +18 -0
  231. package/internal/utils/to-element.d.ts +12 -0
  232. package/internal/utils/to-value.d.ts +6 -0
  233. package/observers/index.d.ts +4 -0
  234. package/observers/intersection-observer/index.d.ts +42 -0
  235. package/observers/mutation-observer/index.d.ts +45 -0
  236. package/observers/performance-observer/index.d.ts +58 -0
  237. package/observers/resize-observer/index.d.ts +40 -0
  238. package/package.json +343 -0
  239. package/reactivity/debounced/index.d.ts +50 -0
  240. package/reactivity/index.d.ts +3 -0
  241. package/reactivity/throttled/index.d.ts +53 -0
  242. package/reactivity/watcher/index.d.ts +68 -0
  243. package/router/fragment/index.d.ts +26 -0
  244. package/router/index.d.ts +7 -0
  245. package/router/params/index.d.ts +28 -0
  246. package/router/query-params/index.d.ts +80 -0
  247. package/router/route-data/index.d.ts +28 -0
  248. package/router/router-listener/index.d.ts +83 -0
  249. package/router/title/index.d.ts +29 -0
  250. package/router/url/index.d.ts +32 -0
  251. package/scheduling/debounce-callback/index.d.ts +28 -0
  252. package/scheduling/index.d.ts +3 -0
  253. package/scheduling/interval/index.d.ts +51 -0
  254. package/scheduling/throttle-callback/index.d.ts +30 -0
  255. package/types/index.d.ts +6 -0
  256. package/types/maybe-element-signal.d.ts +2 -0
  257. package/types/maybe-signal.d.ts +2 -0
  258. package/types/signal-value.d.ts +2 -0
  259. package/types/signal-values.d.ts +5 -0
  260. package/types/unref-element.d.ts +2 -0
  261. package/types/with-injector.d.ts +8 -0
@@ -0,0 +1,175 @@
1
+ import { signal } from '@angular/core';
2
+ import { setupContext, constSignal, isWindow, toElement } from '@signality/core/internal';
3
+ import { throttleCallback } from '@signality/core/scheduling/throttle-callback';
4
+ import { listener } from '@signality/core/browser/listener';
5
+ import { onDisconnect } from '@signality/core/elements/on-disconnect';
6
+
7
+ /**
8
+ * Reactive tracking of scroll position.
9
+ * Track scroll offset of window or any scrollable element.
10
+ *
11
+ * @param options - Optional configuration
12
+ * @returns An object with x, y, isScrolling, arrivedState, and directions signals
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * @Component({
17
+ * template: `
18
+ * <p>Scroll Y: {{ scrollPos.y() }}px</p>
19
+ * @if (scrollPos.isScrolling()) {
20
+ * <p>Scrolling...</p>
21
+ * }
22
+ * @if (scrollPos.arrivedState().bottom) {
23
+ * <p>Reached bottom!</p>
24
+ * }
25
+ * `
26
+ * })
27
+ * class ScrollTracker {
28
+ * readonly scrollPos = scrollPosition();
29
+ * }
30
+ * ```
31
+ *
32
+ * @example
33
+ * ```typescript
34
+ * // Track scroll on a specific element
35
+ * @Component({
36
+ * template: `
37
+ * <div #scrollable style="overflow: auto; height: 200px;">
38
+ * <div style="height: 1000px;">Long content</div>
39
+ * </div>
40
+ * <p>Scroll position: {{ pos.y() }}</p>
41
+ * `
42
+ * })
43
+ * class ScrollableComponent {
44
+ * readonly scrollableEl = viewChild<ElementRef>('scrollable');
45
+ * readonly pos = scrollPosition({ target: this.scrollableEl });
46
+ * }
47
+ * ```
48
+ */
49
+ function scrollPosition(options) {
50
+ const { runInContext } = setupContext(options?.injector, scrollPosition);
51
+ return runInContext(({ isServer, onCleanup }) => {
52
+ if (isServer) {
53
+ return {
54
+ x: constSignal(0),
55
+ y: constSignal(0),
56
+ isScrolling: constSignal(false),
57
+ arrivedState: constSignal(DEFAULT_ARRIVED),
58
+ directions: constSignal(DEFAULT_DIRECTIONS),
59
+ };
60
+ }
61
+ const target = options?.target ?? window;
62
+ const targetIsWindow = isWindow(target);
63
+ const offset = options?.offset ?? {};
64
+ const throttleMs = options?.throttle ?? 0;
65
+ const x = signal(0, ...(ngDevMode ? [{ debugName: "x" }] : []));
66
+ const y = signal(0, ...(ngDevMode ? [{ debugName: "y" }] : []));
67
+ const isScrolling = signal(false, ...(ngDevMode ? [{ debugName: "isScrolling" }] : []));
68
+ const arrivedState = signal(DEFAULT_ARRIVED, ...(ngDevMode ? [{ debugName: "arrivedState" }] : []));
69
+ const directions = signal(DEFAULT_DIRECTIONS, ...(ngDevMode ? [{ debugName: "directions" }] : []));
70
+ let lastX = 0;
71
+ let lastY = 0;
72
+ let scrollingTimeout;
73
+ const getScrollPosition = () => {
74
+ if (targetIsWindow) {
75
+ return { scrollX: target.scrollX, scrollY: target.scrollY };
76
+ }
77
+ const el = toElement(target);
78
+ return {
79
+ scrollX: el?.scrollLeft || 0,
80
+ scrollY: el?.scrollTop || 0,
81
+ };
82
+ };
83
+ const getScrollSize = () => {
84
+ if (targetIsWindow) {
85
+ return {
86
+ scrollWidth: document.documentElement.scrollWidth,
87
+ scrollHeight: document.documentElement.scrollHeight,
88
+ clientWidth: target.innerWidth,
89
+ clientHeight: target.innerHeight,
90
+ };
91
+ }
92
+ const el = toElement(target);
93
+ return {
94
+ scrollWidth: el?.scrollWidth || 0,
95
+ scrollHeight: el?.scrollHeight || 0,
96
+ clientWidth: el?.clientWidth || 0,
97
+ clientHeight: el?.clientHeight || 0,
98
+ };
99
+ };
100
+ const update = () => {
101
+ const { scrollX, scrollY } = getScrollPosition();
102
+ const { scrollWidth, scrollHeight, clientWidth, clientHeight } = getScrollSize();
103
+ directions.set({
104
+ top: scrollY < lastY,
105
+ bottom: scrollY > lastY,
106
+ left: scrollX < lastX,
107
+ right: scrollX > lastX,
108
+ });
109
+ lastX = scrollX;
110
+ lastY = scrollY;
111
+ x.set(scrollX);
112
+ y.set(scrollY);
113
+ const topOffset = offset.top ?? 0;
114
+ const bottomOffset = offset.bottom ?? 0;
115
+ const leftOffset = offset.left ?? 0;
116
+ const rightOffset = offset.right ?? 0;
117
+ arrivedState.set({
118
+ top: scrollY <= topOffset,
119
+ bottom: scrollY + clientHeight >= scrollHeight - bottomOffset,
120
+ left: scrollX <= leftOffset,
121
+ right: scrollX + clientWidth >= scrollWidth - rightOffset,
122
+ });
123
+ isScrolling.set(true);
124
+ if (scrollingTimeout) {
125
+ clearTimeout(scrollingTimeout);
126
+ }
127
+ scrollingTimeout = setTimeout(() => {
128
+ isScrolling.set(false);
129
+ }, SCROLL_IDLE_DELAY);
130
+ };
131
+ listener(target, 'scroll', throttleMs > 0 ? throttleCallback(update, throttleMs) : update);
132
+ if (!targetIsWindow) {
133
+ onDisconnect(target, () => {
134
+ x.set(0);
135
+ y.set(0);
136
+ isScrolling.set(false);
137
+ arrivedState.set(DEFAULT_ARRIVED);
138
+ directions.set(DEFAULT_DIRECTIONS);
139
+ });
140
+ }
141
+ onCleanup(() => {
142
+ if (scrollingTimeout) {
143
+ clearTimeout(scrollingTimeout);
144
+ }
145
+ });
146
+ update();
147
+ return {
148
+ x: x.asReadonly(),
149
+ y: y.asReadonly(),
150
+ isScrolling: isScrolling.asReadonly(),
151
+ arrivedState: arrivedState.asReadonly(),
152
+ directions: directions.asReadonly(),
153
+ };
154
+ });
155
+ }
156
+ const DEFAULT_ARRIVED = {
157
+ top: true,
158
+ bottom: false,
159
+ left: true,
160
+ right: false,
161
+ };
162
+ const DEFAULT_DIRECTIONS = {
163
+ top: false,
164
+ bottom: false,
165
+ left: false,
166
+ right: false,
167
+ };
168
+ const SCROLL_IDLE_DELAY = 150;
169
+
170
+ /**
171
+ * Generated bundle index. Do not edit.
172
+ */
173
+
174
+ export { scrollPosition };
175
+ //# sourceMappingURL=signality-core-elements-scroll-position.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signality-core-elements-scroll-position.mjs","sources":["../../../projects/core/elements/scroll-position/index.ts","../../../projects/core/elements/scroll-position/signality-core-elements-scroll-position.ts"],"sourcesContent":["import { type Signal, signal } from '@angular/core';\nimport {\n constSignal,\n isWindow,\n setupContext,\n type Timer,\n toElement,\n} from '@signality/core/internal';\nimport type { MaybeElementSignal, WithInjector } from '@signality/core/types';\nimport { throttleCallback } from '@signality/core/scheduling/throttle-callback';\nimport { listener } from '@signality/core/browser/listener';\nimport { onDisconnect } from '@signality/core/elements/on-disconnect';\n\n/**\n * State indicating which edges have been reached.\n */\nexport interface ArrivedState {\n readonly top: boolean;\n readonly bottom: boolean;\n readonly left: boolean;\n readonly right: boolean;\n}\n\n/**\n * Current scroll directions.\n */\nexport interface ScrollDirections {\n readonly top: boolean;\n readonly bottom: boolean;\n readonly left: boolean;\n readonly right: boolean;\n}\n\nexport interface ScrollPositionOptions extends WithInjector {\n /**\n * Element or window to track scroll on.\n * @default window\n */\n readonly target?: MaybeElementSignal<Element> | Window;\n\n /**\n * Throttle scroll events in milliseconds.\n * @default 0\n */\n readonly throttle?: number;\n\n /**\n * Offset for arrived detection.\n */\n readonly offset?: {\n readonly top?: number;\n readonly bottom?: number;\n readonly left?: number;\n readonly right?: number;\n };\n}\n\nexport interface ScrollPositionRef {\n /** Horizontal scroll position */\n readonly x: Signal<number>;\n\n /** Vertical scroll position */\n readonly y: Signal<number>;\n\n /** Whether currently scrolling */\n readonly isScrolling: Signal<boolean>;\n\n /** Which edges have been reached */\n readonly arrivedState: Signal<ArrivedState>;\n\n /** Current scroll direction */\n readonly directions: Signal<ScrollDirections>;\n}\n\n/**\n * Reactive tracking of scroll position.\n * Track scroll offset of window or any scrollable element.\n *\n * @param options - Optional configuration\n * @returns An object with x, y, isScrolling, arrivedState, and directions signals\n *\n * @example\n * ```typescript\n * @Component({\n * template: `\n * <p>Scroll Y: {{ scrollPos.y() }}px</p>\n * @if (scrollPos.isScrolling()) {\n * <p>Scrolling...</p>\n * }\n * @if (scrollPos.arrivedState().bottom) {\n * <p>Reached bottom!</p>\n * }\n * `\n * })\n * class ScrollTracker {\n * readonly scrollPos = scrollPosition();\n * }\n * ```\n *\n * @example\n * ```typescript\n * // Track scroll on a specific element\n * @Component({\n * template: `\n * <div #scrollable style=\"overflow: auto; height: 200px;\">\n * <div style=\"height: 1000px;\">Long content</div>\n * </div>\n * <p>Scroll position: {{ pos.y() }}</p>\n * `\n * })\n * class ScrollableComponent {\n * readonly scrollableEl = viewChild<ElementRef>('scrollable');\n * readonly pos = scrollPosition({ target: this.scrollableEl });\n * }\n * ```\n */\nexport function scrollPosition(options?: ScrollPositionOptions): ScrollPositionRef {\n const { runInContext } = setupContext(options?.injector, scrollPosition);\n\n return runInContext(({ isServer, onCleanup }) => {\n if (isServer) {\n return {\n x: constSignal(0),\n y: constSignal(0),\n isScrolling: constSignal(false),\n arrivedState: constSignal(DEFAULT_ARRIVED),\n directions: constSignal(DEFAULT_DIRECTIONS),\n };\n }\n\n const target = options?.target ?? window;\n const targetIsWindow = isWindow(target);\n const offset = options?.offset ?? {};\n const throttleMs = options?.throttle ?? 0;\n\n const x = signal(0);\n const y = signal(0);\n const isScrolling = signal(false);\n const arrivedState = signal(DEFAULT_ARRIVED);\n const directions = signal(DEFAULT_DIRECTIONS);\n\n let lastX = 0;\n let lastY = 0;\n let scrollingTimeout: Timer;\n\n const getScrollPosition = (): { scrollX: number; scrollY: number } => {\n if (targetIsWindow) {\n return { scrollX: target.scrollX, scrollY: target.scrollY };\n }\n\n const el = toElement(target);\n return {\n scrollX: el?.scrollLeft || 0,\n scrollY: el?.scrollTop || 0,\n };\n };\n\n const getScrollSize = (): {\n scrollWidth: number;\n scrollHeight: number;\n clientWidth: number;\n clientHeight: number;\n } => {\n if (targetIsWindow) {\n return {\n scrollWidth: document.documentElement.scrollWidth,\n scrollHeight: document.documentElement.scrollHeight,\n clientWidth: target.innerWidth,\n clientHeight: target.innerHeight,\n };\n }\n\n const el = toElement(target);\n return {\n scrollWidth: el?.scrollWidth || 0,\n scrollHeight: el?.scrollHeight || 0,\n clientWidth: el?.clientWidth || 0,\n clientHeight: el?.clientHeight || 0,\n };\n };\n\n const update = () => {\n const { scrollX, scrollY } = getScrollPosition();\n const { scrollWidth, scrollHeight, clientWidth, clientHeight } = getScrollSize();\n\n directions.set({\n top: scrollY < lastY,\n bottom: scrollY > lastY,\n left: scrollX < lastX,\n right: scrollX > lastX,\n });\n\n lastX = scrollX;\n lastY = scrollY;\n\n x.set(scrollX);\n y.set(scrollY);\n\n const topOffset = offset.top ?? 0;\n const bottomOffset = offset.bottom ?? 0;\n const leftOffset = offset.left ?? 0;\n const rightOffset = offset.right ?? 0;\n\n arrivedState.set({\n top: scrollY <= topOffset,\n bottom: scrollY + clientHeight >= scrollHeight - bottomOffset,\n left: scrollX <= leftOffset,\n right: scrollX + clientWidth >= scrollWidth - rightOffset,\n });\n\n isScrolling.set(true);\n\n if (scrollingTimeout) {\n clearTimeout(scrollingTimeout);\n }\n\n scrollingTimeout = setTimeout(() => {\n isScrolling.set(false);\n }, SCROLL_IDLE_DELAY);\n };\n\n listener(target, 'scroll', throttleMs > 0 ? throttleCallback(update, throttleMs) : update);\n\n if (!targetIsWindow) {\n onDisconnect(target, () => {\n x.set(0);\n y.set(0);\n isScrolling.set(false);\n arrivedState.set(DEFAULT_ARRIVED);\n directions.set(DEFAULT_DIRECTIONS);\n });\n }\n\n onCleanup(() => {\n if (scrollingTimeout) {\n clearTimeout(scrollingTimeout);\n }\n });\n\n update();\n\n return {\n x: x.asReadonly(),\n y: y.asReadonly(),\n isScrolling: isScrolling.asReadonly(),\n arrivedState: arrivedState.asReadonly(),\n directions: directions.asReadonly(),\n };\n });\n}\n\nconst DEFAULT_ARRIVED: ArrivedState = {\n top: true,\n bottom: false,\n left: true,\n right: false,\n};\n\nconst DEFAULT_DIRECTIONS: ScrollDirections = {\n top: false,\n bottom: false,\n left: false,\n right: false,\n};\n\nconst SCROLL_IDLE_DELAY = 150;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,107 @@
1
+ import { signal } from '@angular/core';
2
+ import { setupContext, constSignal } from '@signality/core/internal';
3
+ import { listener } from '@signality/core/browser/listener';
4
+ import { onDisconnect } from '@signality/core/elements/on-disconnect';
5
+
6
+ /**
7
+ * Reactive touch-swipe detection on an element.
8
+ * Uses Touch Events API — for mouse/pen input use PointerSwipe instead.
9
+ * Tracks single-finger swipe gestures and provides direction and distance signals.
10
+ *
11
+ * @param target - Element to detect swipe gestures on
12
+ * @param options - Optional configuration including threshold and injector
13
+ * @returns A SwipeRef with reactive signals for swipe state
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * @Component({
18
+ * template: `
19
+ * <div #area>
20
+ * <p>Swiping: {{ sw.isSwiping() }}</p>
21
+ * <p>Direction: {{ sw.direction() }}</p>
22
+ * </div>
23
+ * `
24
+ * })
25
+ * class SwipeComponent {
26
+ * readonly area = viewChild<ElementRef>('area');
27
+ * readonly sw = swipe(this.area);
28
+ * }
29
+ * ```
30
+ */
31
+ function swipe(target, options) {
32
+ const { runInContext } = setupContext(options?.injector, swipe);
33
+ return runInContext(({ isServer }) => {
34
+ if (isServer) {
35
+ return {
36
+ isSwiping: constSignal(false),
37
+ direction: constSignal('none'),
38
+ distanceX: constSignal(0),
39
+ distanceY: constSignal(0),
40
+ };
41
+ }
42
+ const threshold = options?.threshold ?? 50;
43
+ const isSwiping = signal(false, ...(ngDevMode ? [{ debugName: "isSwiping" }] : []));
44
+ const direction = signal('none', ...(ngDevMode ? [{ debugName: "direction" }] : []));
45
+ const distanceX = signal(0, ...(ngDevMode ? [{ debugName: "distanceX" }] : []));
46
+ const distanceY = signal(0, ...(ngDevMode ? [{ debugName: "distanceY" }] : []));
47
+ let startX = 0;
48
+ let startY = 0;
49
+ listener.passive(target, 'touchstart', (e) => {
50
+ if (e.touches.length !== 1) {
51
+ return;
52
+ }
53
+ startX = e.touches[0].clientX;
54
+ startY = e.touches[0].clientY;
55
+ isSwiping.set(false);
56
+ direction.set('none');
57
+ distanceX.set(0);
58
+ distanceY.set(0);
59
+ });
60
+ listener.passive(target, 'touchmove', (e) => {
61
+ if (e.touches.length !== 1) {
62
+ return;
63
+ }
64
+ const dx = startX - e.touches[0].clientX;
65
+ const dy = startY - e.touches[0].clientY;
66
+ distanceX.set(dx);
67
+ distanceY.set(dy);
68
+ const absDx = Math.abs(dx);
69
+ const absDy = Math.abs(dy);
70
+ if (Math.max(absDx, absDy) >= threshold) {
71
+ if (!isSwiping()) {
72
+ isSwiping.set(true);
73
+ }
74
+ if (absDx > absDy) {
75
+ direction.set(dx > 0 ? 'left' : 'right');
76
+ }
77
+ else {
78
+ direction.set(dy > 0 ? 'up' : 'down');
79
+ }
80
+ }
81
+ });
82
+ const onTouchEnd = () => {
83
+ isSwiping.set(false);
84
+ };
85
+ listener.passive(target, 'touchend', onTouchEnd);
86
+ listener.passive(target, 'touchcancel', onTouchEnd);
87
+ onDisconnect(target, () => {
88
+ isSwiping.set(false);
89
+ direction.set('none');
90
+ distanceX.set(0);
91
+ distanceY.set(0);
92
+ });
93
+ return {
94
+ isSwiping: isSwiping.asReadonly(),
95
+ direction: direction.asReadonly(),
96
+ distanceX: distanceX.asReadonly(),
97
+ distanceY: distanceY.asReadonly(),
98
+ };
99
+ });
100
+ }
101
+
102
+ /**
103
+ * Generated bundle index. Do not edit.
104
+ */
105
+
106
+ export { swipe };
107
+ //# sourceMappingURL=signality-core-elements-swipe.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signality-core-elements-swipe.mjs","sources":["../../../projects/core/elements/swipe/index.ts","../../../projects/core/elements/swipe/signality-core-elements-swipe.ts"],"sourcesContent":["import { type Signal, signal } from '@angular/core';\nimport { constSignal, setupContext } from '@signality/core/internal';\nimport type { MaybeElementSignal, WithInjector } from '@signality/core/types';\nimport { listener } from '@signality/core/browser/listener';\nimport { onDisconnect } from '@signality/core/elements/on-disconnect';\n\n/**\n * Possible swipe direction values.\n */\nexport type SwipeDirection = 'up' | 'down' | 'left' | 'right' | 'none';\n\nexport interface SwipeOptions extends WithInjector {\n /**\n * Minimum distance in pixels before a swipe is recognized.\n * @default 50\n */\n readonly threshold?: number;\n}\n\nexport interface SwipeRef {\n /** Whether a swipe gesture is currently in progress. */\n readonly isSwiping: Signal<boolean>;\n\n /** Current swipe direction, or `'none'` if a threshold has not been exceeded. */\n readonly direction: Signal<SwipeDirection>;\n\n /** Horizontal distance from start (positive = swiped left). */\n readonly distanceX: Signal<number>;\n\n /** Vertical distance from start (positive = swiped up). */\n readonly distanceY: Signal<number>;\n}\n\n/**\n * Reactive touch-swipe detection on an element.\n * Uses Touch Events API — for mouse/pen input use PointerSwipe instead.\n * Tracks single-finger swipe gestures and provides direction and distance signals.\n *\n * @param target - Element to detect swipe gestures on\n * @param options - Optional configuration including threshold and injector\n * @returns A SwipeRef with reactive signals for swipe state\n *\n * @example\n * ```typescript\n * @Component({\n * template: `\n * <div #area>\n * <p>Swiping: {{ sw.isSwiping() }}</p>\n * <p>Direction: {{ sw.direction() }}</p>\n * </div>\n * `\n * })\n * class SwipeComponent {\n * readonly area = viewChild<ElementRef>('area');\n * readonly sw = swipe(this.area);\n * }\n * ```\n */\nexport function swipe(target: MaybeElementSignal<HTMLElement>, options?: SwipeOptions): SwipeRef {\n const { runInContext } = setupContext(options?.injector, swipe);\n\n return runInContext(({ isServer }) => {\n if (isServer) {\n return {\n isSwiping: constSignal(false),\n direction: constSignal('none'),\n distanceX: constSignal(0),\n distanceY: constSignal(0),\n };\n }\n\n const threshold = options?.threshold ?? 50;\n\n const isSwiping = signal(false);\n const direction = signal<SwipeDirection>('none');\n const distanceX = signal(0);\n const distanceY = signal(0);\n\n let startX = 0;\n let startY = 0;\n\n listener.passive(target, 'touchstart', (e: TouchEvent) => {\n if (e.touches.length !== 1) {\n return;\n }\n\n startX = e.touches[0].clientX;\n startY = e.touches[0].clientY;\n\n isSwiping.set(false);\n direction.set('none');\n distanceX.set(0);\n distanceY.set(0);\n });\n\n listener.passive(target, 'touchmove', (e: TouchEvent) => {\n if (e.touches.length !== 1) {\n return;\n }\n\n const dx = startX - e.touches[0].clientX;\n const dy = startY - e.touches[0].clientY;\n\n distanceX.set(dx);\n distanceY.set(dy);\n\n const absDx = Math.abs(dx);\n const absDy = Math.abs(dy);\n\n if (Math.max(absDx, absDy) >= threshold) {\n if (!isSwiping()) {\n isSwiping.set(true);\n }\n\n if (absDx > absDy) {\n direction.set(dx > 0 ? 'left' : 'right');\n } else {\n direction.set(dy > 0 ? 'up' : 'down');\n }\n }\n });\n\n const onTouchEnd = () => {\n isSwiping.set(false);\n };\n\n listener.passive(target, 'touchend', onTouchEnd);\n listener.passive(target, 'touchcancel', onTouchEnd);\n\n onDisconnect(target, () => {\n isSwiping.set(false);\n direction.set('none');\n distanceX.set(0);\n distanceY.set(0);\n });\n\n return {\n isSwiping: isSwiping.asReadonly(),\n direction: direction.asReadonly(),\n distanceX: distanceX.asReadonly(),\n distanceY: distanceY.asReadonly(),\n };\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import { signal, computed } from '@angular/core';
2
+ import { setupContext, NOOP_FN, constSignal, ALWAYS_FALSE_FN, createToken } from '@signality/core/internal';
3
+ import { setupSync, listener } from '@signality/core/browser/listener';
4
+
5
+ /**
6
+ * Signal-based wrapper around the [Selection API](https://developer.mozilla.org/en-US/docs/Web/API/Selection_API).
7
+ *
8
+ * @param options - Optional configuration including injector
9
+ * @returns A TextSelectionRef with reactive signals for text, ranges, rects, and selection
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * @Component({
14
+ * template: `
15
+ * <p>Select some text below:</p>
16
+ * <div>Lorem ipsum dolor sit amet...</div>
17
+ * @if (selection.text(); as text) {
18
+ * <p>Selected: "{{ text }}"</p>
19
+ * }
20
+ * `
21
+ * })
22
+ * class TextSelectionComponent {
23
+ * readonly selection = textSelection();
24
+ * }
25
+ * ```
26
+ */
27
+ function textSelection(options) {
28
+ const { runInContext } = setupContext(options?.injector, textSelection);
29
+ return runInContext(({ isServer }) => {
30
+ if (isServer) {
31
+ return {
32
+ selection: constSignal(null),
33
+ text: constSignal(''),
34
+ ranges: constSignal([]),
35
+ rects: constSignal([]),
36
+ clear: NOOP_FN,
37
+ };
38
+ }
39
+ const selection = signal(window.getSelection(), ...(ngDevMode ? [{ debugName: "selection", equal: ALWAYS_FALSE_FN }] : [{ equal: ALWAYS_FALSE_FN }]));
40
+ const text = computed(() => selection()?.toString() ?? '', ...(ngDevMode ? [{ debugName: "text" }] : []));
41
+ const ranges = computed(() => {
42
+ const sel = selection();
43
+ return sel ? getRangesFromSelection(sel) : [];
44
+ }, ...(ngDevMode ? [{ debugName: "ranges" }] : []));
45
+ const rects = computed(() => ranges().map(range => range.getBoundingClientRect()), ...(ngDevMode ? [{ debugName: "rects" }] : []));
46
+ const clear = () => window.getSelection()?.removeAllRanges();
47
+ setupSync(() => {
48
+ listener(document, 'selectionchange', () => selection.set(window.getSelection()));
49
+ });
50
+ return {
51
+ selection: selection.asReadonly(),
52
+ text,
53
+ ranges,
54
+ rects,
55
+ clear,
56
+ };
57
+ });
58
+ }
59
+ const TEXT_SELECTION = /* @__PURE__ */ createToken(textSelection);
60
+ function getRangesFromSelection(selection) {
61
+ const rangeCount = selection.rangeCount ?? 0;
62
+ return Array.from({ length: rangeCount }, (_, i) => selection.getRangeAt(i));
63
+ }
64
+
65
+ /**
66
+ * Generated bundle index. Do not edit.
67
+ */
68
+
69
+ export { TEXT_SELECTION, textSelection };
70
+ //# sourceMappingURL=signality-core-elements-text-selection.mjs.map
@@ -0,0 +1 @@
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;;;;"}
@@ -0,0 +1,81 @@
1
+ import { signal, afterNextRender } from '@angular/core';
2
+ import { setupContext, constSignal, createToken } from '@signality/core/internal';
3
+ import { listener } from '@signality/core/browser/listener';
4
+ import { watcher } from '@signality/core/reactivity/watcher';
5
+ import { mediaQuery } from '@signality/core/browser/media-query';
6
+
7
+ /**
8
+ * Signal-based wrapper around the [Window API](https://developer.mozilla.org/en-US/docs/Web/API/Window) dimensions.
9
+ *
10
+ * @param options - Optional configuration including initialValue for SSR
11
+ * @returns A signal containing the current window dimensions
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * @Component({
16
+ * template: `
17
+ * <div>
18
+ * Window: {{ size().width }} × {{ size().height }}px
19
+ * @if (size().width < 768) {
20
+ * <p>Mobile view</p>
21
+ * }
22
+ * </div>
23
+ * `
24
+ * })
25
+ * class WindowSizeComponent {
26
+ * readonly size = windowSize();
27
+ * }
28
+ * ```
29
+ */
30
+ function windowSize(options) {
31
+ const { runInContext } = setupContext(options?.injector, windowSize);
32
+ return runInContext(({ isServer }) => {
33
+ const initialValue = options?.initialValue
34
+ ? {
35
+ width: options.initialValue.width,
36
+ height: options.initialValue.height,
37
+ innerWidth: options.initialValue.width,
38
+ innerHeight: options.initialValue.height,
39
+ outerWidth: options.initialValue.width,
40
+ outerHeight: options.initialValue.height,
41
+ }
42
+ : DEFAULT_VALUE;
43
+ if (isServer) {
44
+ return constSignal(initialValue);
45
+ }
46
+ const includeScrollbar = options?.includeScrollbar ?? false;
47
+ const size = signal(initialValue, options);
48
+ const update = () => {
49
+ const width = includeScrollbar ? window.innerWidth : document.documentElement.clientWidth;
50
+ const height = includeScrollbar ? window.innerHeight : document.documentElement.clientHeight;
51
+ size.set({
52
+ width,
53
+ height,
54
+ innerWidth: window.innerWidth,
55
+ innerHeight: window.innerHeight,
56
+ outerWidth: window.outerWidth,
57
+ outerHeight: window.outerHeight,
58
+ });
59
+ };
60
+ listener(window, 'resize', update);
61
+ watcher(mediaQuery('(orientation: portrait)'), update);
62
+ afterNextRender({ read: update });
63
+ return size.asReadonly();
64
+ });
65
+ }
66
+ const WINDOW_SIZE = /* @__PURE__ */ createToken(windowSize);
67
+ const DEFAULT_VALUE = {
68
+ width: 0,
69
+ height: 0,
70
+ innerWidth: 0,
71
+ innerHeight: 0,
72
+ outerWidth: 0,
73
+ outerHeight: 0,
74
+ };
75
+
76
+ /**
77
+ * Generated bundle index. Do not edit.
78
+ */
79
+
80
+ export { WINDOW_SIZE, windowSize };
81
+ //# sourceMappingURL=signality-core-elements-window-size.mjs.map
@@ -0,0 +1 @@
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;;;;"}
@@ -0,0 +1,21 @@
1
+ export * from '@signality/core/elements/active-element';
2
+ export * from '@signality/core/elements/dropzone';
3
+ export * from '@signality/core/elements/element-focus';
4
+ export * from '@signality/core/elements/element-focus-within';
5
+ export * from '@signality/core/elements/element-hover';
6
+ export * from '@signality/core/elements/element-size';
7
+ export * from '@signality/core/elements/element-visibility';
8
+ export * from '@signality/core/elements/on-click-outside';
9
+ export * from '@signality/core/elements/on-long-press';
10
+ export * from '@signality/core/elements/mouse-position';
11
+ export * from '@signality/core/elements/pointer-swipe';
12
+ export * from '@signality/core/elements/on-disconnect';
13
+ export * from '@signality/core/elements/scroll-position';
14
+ export * from '@signality/core/elements/swipe';
15
+ export * from '@signality/core/elements/text-selection';
16
+ export * from '@signality/core/elements/window-size';
17
+
18
+ /**
19
+ * Generated bundle index. Do not edit.
20
+ */
21
+ //# sourceMappingURL=signality-core-elements.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signality-core-elements.mjs","sources":["../../../projects/core/elements/signality-core-elements.ts"],"sourcesContent":["/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA;;AAEG"}