ngx-kit 7.0.0 → 7.1.0

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 (40) hide show
  1. package/angle-selector/README.md +34 -34
  2. package/box-shadow/README.md +33 -33
  3. package/color-picker/README.md +52 -52
  4. package/data-table/README.md +120 -120
  5. package/date-picker/README.md +74 -74
  6. package/dialog/README.md +92 -92
  7. package/drag-resize/README.md +55 -55
  8. package/fesm2022/ngx-kit-color-picker.mjs.map +1 -1
  9. package/fesm2022/ngx-kit-date-picker.mjs.map +1 -1
  10. package/fesm2022/ngx-kit-dialog.mjs.map +1 -1
  11. package/fesm2022/ngx-kit-drag-resize.mjs.map +1 -1
  12. package/fesm2022/ngx-kit-drawer-menu.mjs +2 -2
  13. package/fesm2022/ngx-kit-drawer-menu.mjs.map +1 -1
  14. package/fesm2022/ngx-kit-dropzone.mjs.map +1 -1
  15. package/fesm2022/ngx-kit-form-field.mjs.map +1 -1
  16. package/fesm2022/ngx-kit-gallery.mjs +2 -2
  17. package/fesm2022/ngx-kit-gallery.mjs.map +1 -1
  18. package/fesm2022/ngx-kit-grid-layout.mjs +108 -41
  19. package/fesm2022/ngx-kit-grid-layout.mjs.map +1 -1
  20. package/fesm2022/ngx-kit-infinite-scroll.mjs +467 -0
  21. package/fesm2022/ngx-kit-infinite-scroll.mjs.map +1 -0
  22. package/fesm2022/ngx-kit-shared.mjs.map +1 -1
  23. package/fesm2022/ngx-kit-virtual-scroll.mjs +2 -2
  24. package/fesm2022/ngx-kit-virtual-scroll.mjs.map +1 -1
  25. package/fesm2022/ngx-kit-webflow.mjs +38 -38
  26. package/fesm2022/ngx-kit-webflow.mjs.map +1 -1
  27. package/gallery/README.md +71 -71
  28. package/gradient-picker/README.md +41 -41
  29. package/grid-layout/README.md +64 -64
  30. package/image-editor/README.md +44 -44
  31. package/infinite-scroll/README.md +252 -0
  32. package/menu/README.md +85 -85
  33. package/message/README.md +70 -70
  34. package/notify/README.md +56 -56
  35. package/package.json +5 -1
  36. package/shared/README.md +117 -117
  37. package/time-picker/README.md +89 -89
  38. package/types/ngx-kit-grid-layout.d.ts +21 -20
  39. package/types/ngx-kit-infinite-scroll.d.ts +86 -0
  40. package/virtual-scroll/README.md +199 -199
@@ -0,0 +1,467 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, output, inject, ElementRef, NgZone, DestroyRef, PLATFORM_ID, signal, effect, Directive } from '@angular/core';
3
+ import { isPlatformBrowser } from '@angular/common';
4
+
5
+ const DEFAULT_DISTANCE = 200;
6
+ const DEFAULT_MIN_INTERVAL = 100;
7
+ const PREPEND_MAX_WAIT_MS = 5000;
8
+ const MANUAL_CHECK_DELAY_MS = 0;
9
+ class NgxInfiniteScroll {
10
+ infiniteScrollDistance = input(DEFAULT_DISTANCE, { ...(ngDevMode ? { debugName: "infiniteScrollDistance" } : /* istanbul ignore next */ {}), alias: 'infiniteScrollDistance',
11
+ transform: numberInput });
12
+ infiniteScrollDisabled = input(false, { ...(ngDevMode ? { debugName: "infiniteScrollDisabled" } : /* istanbul ignore next */ {}), alias: 'infiniteScrollDisabled',
13
+ transform: booleanInput });
14
+ infiniteScrollImmediateCheck = input(true, { ...(ngDevMode ? { debugName: "infiniteScrollImmediateCheck" } : /* istanbul ignore next */ {}), alias: 'infiniteScrollImmediateCheck',
15
+ transform: booleanInput });
16
+ infiniteScrollMinInterval = input(DEFAULT_MIN_INTERVAL, { ...(ngDevMode ? { debugName: "infiniteScrollMinInterval" } : /* istanbul ignore next */ {}), alias: 'infiniteScrollMinInterval',
17
+ transform: numberInput });
18
+ infiniteScrollUpDistance = input(null, { ...(ngDevMode ? { debugName: "infiniteScrollUpDistance" } : /* istanbul ignore next */ {}), alias: 'infiniteScrollUpDistance',
19
+ transform: nullableNumberInput });
20
+ infiniteScrollDownDistance = input(null, { ...(ngDevMode ? { debugName: "infiniteScrollDownDistance" } : /* istanbul ignore next */ {}), alias: 'infiniteScrollDownDistance',
21
+ transform: nullableNumberInput });
22
+ infiniteScrollDirection = input('down', { ...(ngDevMode ? { debugName: "infiniteScrollDirection" } : /* istanbul ignore next */ {}), alias: 'infiniteScrollDirection' });
23
+ infiniteScrollContainer = input(null, { ...(ngDevMode ? { debugName: "infiniteScrollContainer" } : /* istanbul ignore next */ {}), alias: 'infiniteScrollContainer' });
24
+ infiniteScrollRoot = input(null, { ...(ngDevMode ? { debugName: "infiniteScrollRoot" } : /* istanbul ignore next */ {}), alias: 'infiniteScrollRoot' });
25
+ scrollWindow = input(true, { ...(ngDevMode ? { debugName: "scrollWindow" } : /* istanbul ignore next */ {}), alias: 'scrollWindow',
26
+ transform: booleanInput });
27
+ fromRoot = input(false, { ...(ngDevMode ? { debugName: "fromRoot" } : /* istanbul ignore next */ {}), alias: 'fromRoot',
28
+ transform: booleanInput });
29
+ /** Preserve the visual scroll position when older content is prepended. */
30
+ infiniteScrollMaintainScrollPosition = input(true, { ...(ngDevMode ? { debugName: "infiniteScrollMaintainScrollPosition" } : /* istanbul ignore next */ {}), alias: 'infiniteScrollMaintainScrollPosition',
31
+ transform: booleanInput });
32
+ /** Optional CSS scroll behavior used while compensating a prepend. */
33
+ infiniteScrollPreserveScrollBehavior = input('auto', { ...(ngDevMode ? { debugName: "infiniteScrollPreserveScrollBehavior" } : /* istanbul ignore next */ {}), alias: 'infiniteScrollPreserveScrollBehavior' });
34
+ scrolled = output();
35
+ scrolledUp = output();
36
+ scrolledDown = output();
37
+ scrollStartReached = output();
38
+ scrollEndReached = output();
39
+ hostRef = inject((ElementRef));
40
+ zone = inject(NgZone);
41
+ destroyRef = inject(DestroyRef);
42
+ platformId = inject(PLATFORM_ID);
43
+ ready = signal(false, /* @ts-ignore */
44
+ ...(ngDevMode ? [{ debugName: "ready" }] : /* istanbul ignore next */ []));
45
+ previousConfiguration;
46
+ observer;
47
+ resizeObserver;
48
+ mutationObserver;
49
+ topSentinel;
50
+ bottomSentinel;
51
+ root = null;
52
+ lastTriggerAt = Number.NEGATIVE_INFINITY;
53
+ armedUp = true;
54
+ armedDown = true;
55
+ destroyRequested = false;
56
+ prependFrame = 0;
57
+ prependSnapshot;
58
+ constructor() {
59
+ effect(() => {
60
+ const disabled = this.infiniteScrollDisabled();
61
+ const configuration = {
62
+ distance: this.infiniteScrollDistance(),
63
+ upDistance: this.infiniteScrollUpDistance(),
64
+ downDistance: this.infiniteScrollDownDistance(),
65
+ direction: this.infiniteScrollDirection(),
66
+ scrollWindow: this.scrollWindow(),
67
+ fromRoot: this.fromRoot(),
68
+ container: this.infiniteScrollContainer(),
69
+ root: this.infiniteScrollRoot(),
70
+ };
71
+ if (!this.ready() || !isPlatformBrowser(this.platformId)) {
72
+ return;
73
+ }
74
+ this.zone.runOutsideAngular(() => {
75
+ if (!this.sameConfiguration(configuration)) {
76
+ this.previousConfiguration = configuration;
77
+ this.setup();
78
+ }
79
+ if (disabled) {
80
+ this.armedUp = true;
81
+ this.armedDown = true;
82
+ return;
83
+ }
84
+ this.armedUp = true;
85
+ this.armedDown = true;
86
+ if (this.infiniteScrollImmediateCheck()) {
87
+ this.scheduleCheck();
88
+ }
89
+ });
90
+ });
91
+ this.destroyRef.onDestroy(() => {
92
+ this.destroyRequested = true;
93
+ this.destroyObserver();
94
+ this.clearSentinels();
95
+ this.cancelPrependWatcher();
96
+ });
97
+ }
98
+ ngAfterViewInit() {
99
+ this.ready.set(true);
100
+ if (!isPlatformBrowser(this.platformId)) {
101
+ return;
102
+ }
103
+ this.zone.runOutsideAngular(() => {
104
+ this.previousConfiguration = undefined;
105
+ this.setup();
106
+ if (this.infiniteScrollImmediateCheck()) {
107
+ this.scheduleCheck();
108
+ }
109
+ });
110
+ }
111
+ /**
112
+ * Re-check the sentinels after application code has appended/prepended data.
113
+ * Usually not needed, but useful for custom rendering pipelines.
114
+ */
115
+ check() {
116
+ if (!this.ready() || !isPlatformBrowser(this.platformId)) {
117
+ return;
118
+ }
119
+ this.armedUp = true;
120
+ this.armedDown = true;
121
+ this.scheduleCheck();
122
+ }
123
+ /**
124
+ * Explicitly finish a pending prepend operation.
125
+ * Useful when an application knows exactly when its async batch has rendered.
126
+ */
127
+ completePrepend() {
128
+ this.tryCompensatePrepend(true);
129
+ }
130
+ sameConfiguration(next) {
131
+ const previous = this.previousConfiguration;
132
+ if (!previous)
133
+ return false;
134
+ return (previous.distance === next.distance &&
135
+ previous.upDistance === next.upDistance &&
136
+ previous.downDistance === next.downDistance &&
137
+ previous.direction === next.direction &&
138
+ previous.scrollWindow === next.scrollWindow &&
139
+ previous.fromRoot === next.fromRoot &&
140
+ previous.container === next.container &&
141
+ previous.root === next.root);
142
+ }
143
+ setup() {
144
+ this.destroyObserver();
145
+ this.clearSentinels();
146
+ this.root = this.resolveRoot();
147
+ this.topSentinel = this.createSentinel('top');
148
+ this.bottomSentinel = this.createSentinel('bottom');
149
+ const host = this.hostRef.nativeElement;
150
+ host.prepend(this.topSentinel);
151
+ host.append(this.bottomSentinel);
152
+ this.observer = new IntersectionObserver((entries) => {
153
+ for (const entry of entries) {
154
+ if (!entry.isIntersecting) {
155
+ if (entry.target === this.topSentinel)
156
+ this.armedUp = true;
157
+ if (entry.target === this.bottomSentinel)
158
+ this.armedDown = true;
159
+ continue;
160
+ }
161
+ if (entry.target === this.topSentinel && this.allowsDirection('up')) {
162
+ this.trigger('up');
163
+ }
164
+ if (entry.target === this.bottomSentinel && this.allowsDirection('down')) {
165
+ this.trigger('down');
166
+ }
167
+ }
168
+ }, {
169
+ root: this.root,
170
+ rootMargin: this.buildRootMargin(),
171
+ threshold: 0,
172
+ });
173
+ this.observer.observe(this.topSentinel);
174
+ this.observer.observe(this.bottomSentinel);
175
+ this.resizeObserver = new ResizeObserver(() => {
176
+ if (this.destroyRequested)
177
+ return;
178
+ if (this.prependSnapshot) {
179
+ this.tryCompensatePrepend(false);
180
+ }
181
+ if (!this.infiniteScrollDisabled() && this.infiniteScrollImmediateCheck()) {
182
+ this.scheduleCheck();
183
+ }
184
+ });
185
+ const observedRoot = this.root ?? this.getDocumentScroller();
186
+ if (observedRoot) {
187
+ this.resizeObserver.observe(observedRoot);
188
+ }
189
+ this.resizeObserver.observe(host);
190
+ this.mutationObserver = new MutationObserver(() => {
191
+ if (this.destroyRequested)
192
+ return;
193
+ if (this.prependSnapshot) {
194
+ this.tryCompensatePrepend(false);
195
+ }
196
+ if (!this.infiniteScrollDisabled() && this.infiniteScrollImmediateCheck()) {
197
+ this.scheduleCheck();
198
+ }
199
+ });
200
+ this.mutationObserver.observe(host, {
201
+ childList: true,
202
+ subtree: true,
203
+ });
204
+ }
205
+ trigger(direction) {
206
+ if (this.infiniteScrollDisabled()) {
207
+ return;
208
+ }
209
+ const armed = direction === 'up' ? this.armedUp : this.armedDown;
210
+ if (!armed) {
211
+ return;
212
+ }
213
+ const now = performance.now();
214
+ if (now - this.lastTriggerAt < Math.max(0, this.infiniteScrollMinInterval())) {
215
+ return;
216
+ }
217
+ const target = this.hostRef.nativeElement;
218
+ const event = {
219
+ direction,
220
+ distance: this.distanceFor(direction),
221
+ target,
222
+ root: this.root,
223
+ };
224
+ this.lastTriggerAt = now;
225
+ if (direction === 'up') {
226
+ this.armedUp = false;
227
+ if (this.infiniteScrollMaintainScrollPosition()) {
228
+ this.capturePrependSnapshot();
229
+ }
230
+ }
231
+ else {
232
+ this.armedDown = false;
233
+ }
234
+ this.zone.run(() => {
235
+ this.scrolled.emit(event);
236
+ if (direction === 'up') {
237
+ this.scrolledUp.emit(event);
238
+ this.scrollStartReached.emit(event);
239
+ }
240
+ else {
241
+ this.scrolledDown.emit(event);
242
+ this.scrollEndReached.emit(event);
243
+ }
244
+ });
245
+ }
246
+ allowsDirection(direction) {
247
+ const configured = this.infiniteScrollDirection();
248
+ return configured === 'both' || configured === direction;
249
+ }
250
+ resolveRoot() {
251
+ if (this.scrollWindow()) {
252
+ return null;
253
+ }
254
+ const explicit = this.infiniteScrollRoot();
255
+ if (explicit) {
256
+ return explicit;
257
+ }
258
+ const container = this.infiniteScrollContainer();
259
+ if (container instanceof HTMLElement) {
260
+ return container;
261
+ }
262
+ if (typeof container === 'string' && container.trim()) {
263
+ const scope = this.fromRoot() ? document : this.hostRef.nativeElement;
264
+ return scope.querySelector(container) ?? this.hostRef.nativeElement;
265
+ }
266
+ return this.hostRef.nativeElement;
267
+ }
268
+ buildRootMargin() {
269
+ const up = this.distanceFor('up');
270
+ const down = this.distanceFor('down');
271
+ const direction = this.infiniteScrollDirection();
272
+ if (direction === 'up') {
273
+ return `${up}px 0px 0px 0px`;
274
+ }
275
+ if (direction === 'down') {
276
+ return `0px 0px ${down}px 0px`;
277
+ }
278
+ return `${up}px 0px ${down}px 0px`;
279
+ }
280
+ createSentinel(position) {
281
+ const node = document.createElement('span');
282
+ node.dataset['ngxInfiniteScrollSentinel'] = position;
283
+ node.setAttribute('aria-hidden', 'true');
284
+ node.style.display = 'block';
285
+ node.style.width = '1px';
286
+ node.style.height = '1px';
287
+ node.style.margin = '0';
288
+ node.style.padding = '0';
289
+ node.style.border = '0';
290
+ node.style.pointerEvents = 'none';
291
+ node.style.visibility = 'hidden';
292
+ return node;
293
+ }
294
+ scheduleCheck() {
295
+ window.setTimeout(() => {
296
+ if (this.destroyRequested || this.infiniteScrollDisabled())
297
+ return;
298
+ this.checkVisibilityDirectly();
299
+ }, MANUAL_CHECK_DELAY_MS);
300
+ }
301
+ checkVisibilityDirectly() {
302
+ if (!this.topSentinel || !this.bottomSentinel || this.infiniteScrollDisabled()) {
303
+ return;
304
+ }
305
+ const rootRect = this.root
306
+ ? this.root.getBoundingClientRect()
307
+ : { top: 0, bottom: window.innerHeight };
308
+ const rootTop = rootRect.top;
309
+ const rootBottom = rootRect.bottom;
310
+ const upDistance = this.distanceFor('up');
311
+ const downDistance = this.distanceFor('down');
312
+ if (this.allowsDirection('up') && this.armedUp) {
313
+ const rect = this.topSentinel.getBoundingClientRect();
314
+ if (rect.bottom >= rootTop - upDistance && rect.top <= rootBottom) {
315
+ this.trigger('up');
316
+ }
317
+ }
318
+ if (this.allowsDirection('down') && this.armedDown) {
319
+ const rect = this.bottomSentinel.getBoundingClientRect();
320
+ if (rect.top <= rootBottom + downDistance && rect.bottom >= rootTop) {
321
+ this.trigger('down');
322
+ }
323
+ }
324
+ }
325
+ distanceFor(direction) {
326
+ const override = direction === 'up' ? this.infiniteScrollUpDistance() : this.infiniteScrollDownDistance();
327
+ return Math.max(0, override ?? this.infiniteScrollDistance());
328
+ }
329
+ getDocumentScroller() {
330
+ if (typeof document === 'undefined')
331
+ return null;
332
+ return document.scrollingElement instanceof HTMLElement ? document.scrollingElement : null;
333
+ }
334
+ getScrollMetrics() {
335
+ const element = this.root ?? this.getDocumentScroller();
336
+ if (element) {
337
+ return {
338
+ element,
339
+ scrollTop: element.scrollTop,
340
+ scrollHeight: element.scrollHeight,
341
+ };
342
+ }
343
+ return {
344
+ element: null,
345
+ scrollTop: window.scrollY,
346
+ scrollHeight: Math.max(document.documentElement.scrollHeight, document.body?.scrollHeight ?? 0),
347
+ };
348
+ }
349
+ capturePrependSnapshot() {
350
+ const metrics = this.getScrollMetrics();
351
+ this.prependSnapshot = {
352
+ scrollTop: metrics.scrollTop,
353
+ scrollHeight: metrics.scrollHeight,
354
+ };
355
+ this.watchPrepend();
356
+ }
357
+ watchPrepend() {
358
+ this.cancelPrependWatcher();
359
+ const startedAt = performance.now();
360
+ const frame = () => {
361
+ if (!this.prependSnapshot || this.destroyRequested) {
362
+ this.prependFrame = 0;
363
+ return;
364
+ }
365
+ const compensated = this.tryCompensatePrepend(false);
366
+ if (compensated || performance.now() - startedAt >= PREPEND_MAX_WAIT_MS) {
367
+ this.prependFrame = 0;
368
+ return;
369
+ }
370
+ this.prependFrame = window.requestAnimationFrame(frame);
371
+ };
372
+ this.prependFrame = window.requestAnimationFrame(frame);
373
+ }
374
+ tryCompensatePrepend(force) {
375
+ const snapshot = this.prependSnapshot;
376
+ if (!snapshot)
377
+ return true;
378
+ const metrics = this.getScrollMetrics();
379
+ const delta = metrics.scrollHeight - snapshot.scrollHeight;
380
+ if (delta <= 0) {
381
+ if (force) {
382
+ this.prependSnapshot = undefined;
383
+ this.cancelPrependWatcher();
384
+ }
385
+ return false;
386
+ }
387
+ /*
388
+ * Do not fight an intentional user scroll while the request is in-flight.
389
+ * A tiny tolerance absorbs layout rounding and browser scroll anchoring.
390
+ */
391
+ const currentTop = metrics.scrollTop;
392
+ const movedByUser = Math.abs(currentTop - snapshot.scrollTop) > 4;
393
+ if (!movedByUser || force) {
394
+ const nextTop = snapshot.scrollTop + delta;
395
+ if (metrics.element) {
396
+ metrics.element.scrollTo({
397
+ top: nextTop,
398
+ behavior: this.infiniteScrollPreserveScrollBehavior(),
399
+ });
400
+ }
401
+ else {
402
+ window.scrollTo({
403
+ top: nextTop,
404
+ behavior: this.infiniteScrollPreserveScrollBehavior(),
405
+ });
406
+ }
407
+ this.prependSnapshot = undefined;
408
+ this.cancelPrependWatcher();
409
+ return true;
410
+ }
411
+ return false;
412
+ }
413
+ cancelPrependWatcher() {
414
+ if (this.prependFrame) {
415
+ window.cancelAnimationFrame(this.prependFrame);
416
+ this.prependFrame = 0;
417
+ }
418
+ }
419
+ destroyObserver() {
420
+ this.observer?.disconnect();
421
+ this.resizeObserver?.disconnect();
422
+ this.mutationObserver?.disconnect();
423
+ this.observer = undefined;
424
+ this.resizeObserver = undefined;
425
+ this.mutationObserver = undefined;
426
+ }
427
+ clearSentinels() {
428
+ this.topSentinel?.remove();
429
+ this.bottomSentinel?.remove();
430
+ this.topSentinel = undefined;
431
+ this.bottomSentinel = undefined;
432
+ }
433
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxInfiniteScroll, deps: [], target: i0.ɵɵFactoryTarget.Directive });
434
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "22.0.4", type: NgxInfiniteScroll, isStandalone: true, selector: "[infiniteScroll]", inputs: { infiniteScrollDistance: { classPropertyName: "infiniteScrollDistance", publicName: "infiniteScrollDistance", isSignal: true, isRequired: false, transformFunction: null }, infiniteScrollDisabled: { classPropertyName: "infiniteScrollDisabled", publicName: "infiniteScrollDisabled", isSignal: true, isRequired: false, transformFunction: null }, infiniteScrollImmediateCheck: { classPropertyName: "infiniteScrollImmediateCheck", publicName: "infiniteScrollImmediateCheck", isSignal: true, isRequired: false, transformFunction: null }, infiniteScrollMinInterval: { classPropertyName: "infiniteScrollMinInterval", publicName: "infiniteScrollMinInterval", isSignal: true, isRequired: false, transformFunction: null }, infiniteScrollUpDistance: { classPropertyName: "infiniteScrollUpDistance", publicName: "infiniteScrollUpDistance", isSignal: true, isRequired: false, transformFunction: null }, infiniteScrollDownDistance: { classPropertyName: "infiniteScrollDownDistance", publicName: "infiniteScrollDownDistance", isSignal: true, isRequired: false, transformFunction: null }, infiniteScrollDirection: { classPropertyName: "infiniteScrollDirection", publicName: "infiniteScrollDirection", isSignal: true, isRequired: false, transformFunction: null }, infiniteScrollContainer: { classPropertyName: "infiniteScrollContainer", publicName: "infiniteScrollContainer", isSignal: true, isRequired: false, transformFunction: null }, infiniteScrollRoot: { classPropertyName: "infiniteScrollRoot", publicName: "infiniteScrollRoot", isSignal: true, isRequired: false, transformFunction: null }, scrollWindow: { classPropertyName: "scrollWindow", publicName: "scrollWindow", isSignal: true, isRequired: false, transformFunction: null }, fromRoot: { classPropertyName: "fromRoot", publicName: "fromRoot", isSignal: true, isRequired: false, transformFunction: null }, infiniteScrollMaintainScrollPosition: { classPropertyName: "infiniteScrollMaintainScrollPosition", publicName: "infiniteScrollMaintainScrollPosition", isSignal: true, isRequired: false, transformFunction: null }, infiniteScrollPreserveScrollBehavior: { classPropertyName: "infiniteScrollPreserveScrollBehavior", publicName: "infiniteScrollPreserveScrollBehavior", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { scrolled: "scrolled", scrolledUp: "scrolledUp", scrolledDown: "scrolledDown", scrollStartReached: "scrollStartReached", scrollEndReached: "scrollEndReached" }, exportAs: ["infiniteScroll"], ngImport: i0 });
435
+ }
436
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.4", ngImport: i0, type: NgxInfiniteScroll, decorators: [{
437
+ type: Directive,
438
+ args: [{
439
+ selector: '[infiniteScroll]',
440
+ standalone: true,
441
+ exportAs: 'infiniteScroll',
442
+ }]
443
+ }], ctorParameters: () => [], propDecorators: { infiniteScrollDistance: [{ type: i0.Input, args: [{ isSignal: true, alias: "infiniteScrollDistance", required: false }] }], infiniteScrollDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "infiniteScrollDisabled", required: false }] }], infiniteScrollImmediateCheck: [{ type: i0.Input, args: [{ isSignal: true, alias: "infiniteScrollImmediateCheck", required: false }] }], infiniteScrollMinInterval: [{ type: i0.Input, args: [{ isSignal: true, alias: "infiniteScrollMinInterval", required: false }] }], infiniteScrollUpDistance: [{ type: i0.Input, args: [{ isSignal: true, alias: "infiniteScrollUpDistance", required: false }] }], infiniteScrollDownDistance: [{ type: i0.Input, args: [{ isSignal: true, alias: "infiniteScrollDownDistance", required: false }] }], infiniteScrollDirection: [{ type: i0.Input, args: [{ isSignal: true, alias: "infiniteScrollDirection", required: false }] }], infiniteScrollContainer: [{ type: i0.Input, args: [{ isSignal: true, alias: "infiniteScrollContainer", required: false }] }], infiniteScrollRoot: [{ type: i0.Input, args: [{ isSignal: true, alias: "infiniteScrollRoot", required: false }] }], scrollWindow: [{ type: i0.Input, args: [{ isSignal: true, alias: "scrollWindow", required: false }] }], fromRoot: [{ type: i0.Input, args: [{ isSignal: true, alias: "fromRoot", required: false }] }], infiniteScrollMaintainScrollPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "infiniteScrollMaintainScrollPosition", required: false }] }], infiniteScrollPreserveScrollBehavior: [{ type: i0.Input, args: [{ isSignal: true, alias: "infiniteScrollPreserveScrollBehavior", required: false }] }], scrolled: [{ type: i0.Output, args: ["scrolled"] }], scrolledUp: [{ type: i0.Output, args: ["scrolledUp"] }], scrolledDown: [{ type: i0.Output, args: ["scrolledDown"] }], scrollStartReached: [{ type: i0.Output, args: ["scrollStartReached"] }], scrollEndReached: [{ type: i0.Output, args: ["scrollEndReached"] }] } });
444
+ function numberInput(value) {
445
+ const parsed = Number(value);
446
+ return Number.isFinite(parsed) ? parsed : 0;
447
+ }
448
+ function nullableNumberInput(value) {
449
+ if (value == null || value === '')
450
+ return null;
451
+ const parsed = Number(value);
452
+ return Number.isFinite(parsed) ? parsed : null;
453
+ }
454
+ function booleanInput(value) {
455
+ if (value === '' || value === true)
456
+ return true;
457
+ if (value === 'false' || value === false || value == null)
458
+ return false;
459
+ return Boolean(value);
460
+ }
461
+
462
+ /**
463
+ * Generated bundle index. Do not edit.
464
+ */
465
+
466
+ export { NgxInfiniteScroll as InfiniteScroll, NgxInfiniteScroll };
467
+ //# sourceMappingURL=ngx-kit-infinite-scroll.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ngx-kit-infinite-scroll.mjs","sources":["../../../projects/libs/infinite-scroll/directives/infinite-scroll.directive.ts","../../../projects/libs/infinite-scroll/ngx-kit-infinite-scroll.ts"],"sourcesContent":["import {\n AfterViewInit,\n DestroyRef,\n Directive,\n ElementRef,\n NgZone,\n PLATFORM_ID,\n input,\n output,\n inject,\n signal,\n effect,\n} from '@angular/core';\nimport { isPlatformBrowser } from '@angular/common';\nimport { NgxInfiniteScrollDirection, NgxInfiniteScrollEvent } from '../types/infinite-scroll.types';\n\nconst DEFAULT_DISTANCE = 200;\nconst DEFAULT_MIN_INTERVAL = 100;\nconst PREPEND_MAX_WAIT_MS = 5000;\nconst MANUAL_CHECK_DELAY_MS = 0;\n\n@Directive({\n selector: '[infiniteScroll]',\n standalone: true,\n exportAs: 'infiniteScroll',\n})\nexport class NgxInfiniteScroll implements AfterViewInit {\n readonly infiniteScrollDistance = input(DEFAULT_DISTANCE, {\n alias: 'infiniteScrollDistance',\n transform: numberInput,\n });\n\n readonly infiniteScrollDisabled = input(false, {\n alias: 'infiniteScrollDisabled',\n transform: booleanInput,\n });\n\n readonly infiniteScrollImmediateCheck = input(true, {\n alias: 'infiniteScrollImmediateCheck',\n transform: booleanInput,\n });\n\n readonly infiniteScrollMinInterval = input(DEFAULT_MIN_INTERVAL, {\n alias: 'infiniteScrollMinInterval',\n transform: numberInput,\n });\n\n readonly infiniteScrollUpDistance = input<number | null>(null, {\n alias: 'infiniteScrollUpDistance',\n transform: nullableNumberInput,\n });\n\n readonly infiniteScrollDownDistance = input<number | null>(null, {\n alias: 'infiniteScrollDownDistance',\n transform: nullableNumberInput,\n });\n\n readonly infiniteScrollDirection = input<NgxInfiniteScrollDirection>('down', {\n alias: 'infiniteScrollDirection',\n });\n\n readonly infiniteScrollContainer = input<string | HTMLElement | null>(null, {\n alias: 'infiniteScrollContainer',\n });\n\n readonly infiniteScrollRoot = input<HTMLElement | null>(null, {\n alias: 'infiniteScrollRoot',\n });\n\n readonly scrollWindow = input(true, {\n alias: 'scrollWindow',\n transform: booleanInput,\n });\n\n readonly fromRoot = input(false, {\n alias: 'fromRoot',\n transform: booleanInput,\n });\n\n /** Preserve the visual scroll position when older content is prepended. */\n readonly infiniteScrollMaintainScrollPosition = input(true, {\n alias: 'infiniteScrollMaintainScrollPosition',\n transform: booleanInput,\n });\n\n /** Optional CSS scroll behavior used while compensating a prepend. */\n readonly infiniteScrollPreserveScrollBehavior = input<ScrollBehavior>('auto', {\n alias: 'infiniteScrollPreserveScrollBehavior',\n });\n\n readonly scrolled = output<NgxInfiniteScrollEvent>();\n readonly scrolledUp = output<NgxInfiniteScrollEvent>();\n readonly scrolledDown = output<NgxInfiniteScrollEvent>();\n readonly scrollStartReached = output<NgxInfiniteScrollEvent>();\n readonly scrollEndReached = output<NgxInfiniteScrollEvent>();\n\n private readonly hostRef = inject(ElementRef<HTMLElement>);\n private readonly zone = inject(NgZone);\n private readonly destroyRef = inject(DestroyRef);\n private readonly platformId = inject(PLATFORM_ID);\n\n private readonly ready = signal(false);\n private previousConfiguration?: {\n distance: number;\n upDistance: number | null;\n downDistance: number | null;\n direction: NgxInfiniteScrollDirection;\n scrollWindow: boolean;\n fromRoot: boolean;\n container: string | HTMLElement | null;\n root: HTMLElement | null;\n };\n private observer?: IntersectionObserver;\n private resizeObserver?: ResizeObserver;\n private mutationObserver?: MutationObserver;\n private topSentinel?: HTMLElement;\n private bottomSentinel?: HTMLElement;\n private root: HTMLElement | null = null;\n private lastTriggerAt = Number.NEGATIVE_INFINITY;\n private armedUp = true;\n private armedDown = true;\n private destroyRequested = false;\n private prependFrame = 0;\n\n private prependSnapshot?: {\n scrollTop: number;\n scrollHeight: number;\n };\n\n constructor() {\n effect(() => {\n const disabled = this.infiniteScrollDisabled();\n const configuration = {\n distance: this.infiniteScrollDistance(),\n upDistance: this.infiniteScrollUpDistance(),\n downDistance: this.infiniteScrollDownDistance(),\n direction: this.infiniteScrollDirection(),\n scrollWindow: this.scrollWindow(),\n fromRoot: this.fromRoot(),\n container: this.infiniteScrollContainer(),\n root: this.infiniteScrollRoot(),\n };\n\n if (!this.ready() || !isPlatformBrowser(this.platformId)) {\n return;\n }\n\n this.zone.runOutsideAngular(() => {\n if (!this.sameConfiguration(configuration)) {\n this.previousConfiguration = configuration;\n this.setup();\n }\n\n if (disabled) {\n this.armedUp = true;\n this.armedDown = true;\n return;\n }\n\n this.armedUp = true;\n this.armedDown = true;\n if (this.infiniteScrollImmediateCheck()) {\n this.scheduleCheck();\n }\n });\n });\n\n this.destroyRef.onDestroy(() => {\n this.destroyRequested = true;\n this.destroyObserver();\n this.clearSentinels();\n this.cancelPrependWatcher();\n });\n }\n\n ngAfterViewInit(): void {\n this.ready.set(true);\n\n if (!isPlatformBrowser(this.platformId)) {\n return;\n }\n\n this.zone.runOutsideAngular(() => {\n this.previousConfiguration = undefined;\n this.setup();\n if (this.infiniteScrollImmediateCheck()) {\n this.scheduleCheck();\n }\n });\n }\n\n /**\n * Re-check the sentinels after application code has appended/prepended data.\n * Usually not needed, but useful for custom rendering pipelines.\n */\n check(): void {\n if (!this.ready() || !isPlatformBrowser(this.platformId)) {\n return;\n }\n\n this.armedUp = true;\n this.armedDown = true;\n this.scheduleCheck();\n }\n\n /**\n * Explicitly finish a pending prepend operation.\n * Useful when an application knows exactly when its async batch has rendered.\n */\n completePrepend(): void {\n this.tryCompensatePrepend(true);\n }\n\n private sameConfiguration(next: NonNullable<typeof this.previousConfiguration>): boolean {\n const previous = this.previousConfiguration;\n if (!previous) return false;\n\n return (\n previous.distance === next.distance &&\n previous.upDistance === next.upDistance &&\n previous.downDistance === next.downDistance &&\n previous.direction === next.direction &&\n previous.scrollWindow === next.scrollWindow &&\n previous.fromRoot === next.fromRoot &&\n previous.container === next.container &&\n previous.root === next.root\n );\n }\n\n private setup(): void {\n this.destroyObserver();\n this.clearSentinels();\n\n this.root = this.resolveRoot();\n\n this.topSentinel = this.createSentinel('top');\n this.bottomSentinel = this.createSentinel('bottom');\n\n const host = this.hostRef.nativeElement;\n\n host.prepend(this.topSentinel);\n host.append(this.bottomSentinel);\n\n this.observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (!entry.isIntersecting) {\n if (entry.target === this.topSentinel) this.armedUp = true;\n if (entry.target === this.bottomSentinel) this.armedDown = true;\n continue;\n }\n\n if (entry.target === this.topSentinel && this.allowsDirection('up')) {\n this.trigger('up');\n }\n\n if (entry.target === this.bottomSentinel && this.allowsDirection('down')) {\n this.trigger('down');\n }\n }\n },\n {\n root: this.root,\n rootMargin: this.buildRootMargin(),\n threshold: 0,\n },\n );\n\n this.observer.observe(this.topSentinel);\n this.observer.observe(this.bottomSentinel);\n\n this.resizeObserver = new ResizeObserver(() => {\n if (this.destroyRequested) return;\n if (this.prependSnapshot) {\n this.tryCompensatePrepend(false);\n }\n if (!this.infiniteScrollDisabled() && this.infiniteScrollImmediateCheck()) {\n this.scheduleCheck();\n }\n });\n\n const observedRoot = this.root ?? this.getDocumentScroller();\n if (observedRoot) {\n this.resizeObserver.observe(observedRoot);\n }\n this.resizeObserver.observe(host);\n\n this.mutationObserver = new MutationObserver(() => {\n if (this.destroyRequested) return;\n if (this.prependSnapshot) {\n this.tryCompensatePrepend(false);\n }\n if (!this.infiniteScrollDisabled() && this.infiniteScrollImmediateCheck()) {\n this.scheduleCheck();\n }\n });\n\n this.mutationObserver.observe(host, {\n childList: true,\n subtree: true,\n });\n }\n\n private trigger(direction: 'up' | 'down'): void {\n if (this.infiniteScrollDisabled()) {\n return;\n }\n\n const armed = direction === 'up' ? this.armedUp : this.armedDown;\n if (!armed) {\n return;\n }\n\n const now = performance.now();\n if (now - this.lastTriggerAt < Math.max(0, this.infiniteScrollMinInterval())) {\n return;\n }\n\n const target = this.hostRef.nativeElement;\n const event: NgxInfiniteScrollEvent = {\n direction,\n distance: this.distanceFor(direction),\n target,\n root: this.root,\n };\n\n this.lastTriggerAt = now;\n\n if (direction === 'up') {\n this.armedUp = false;\n if (this.infiniteScrollMaintainScrollPosition()) {\n this.capturePrependSnapshot();\n }\n } else {\n this.armedDown = false;\n }\n\n this.zone.run(() => {\n this.scrolled.emit(event);\n if (direction === 'up') {\n this.scrolledUp.emit(event);\n this.scrollStartReached.emit(event);\n } else {\n this.scrolledDown.emit(event);\n this.scrollEndReached.emit(event);\n }\n });\n }\n\n private allowsDirection(direction: 'up' | 'down'): boolean {\n const configured = this.infiniteScrollDirection();\n return configured === 'both' || configured === direction;\n }\n\n private resolveRoot(): HTMLElement | null {\n if (this.scrollWindow()) {\n return null;\n }\n\n const explicit = this.infiniteScrollRoot();\n if (explicit) {\n return explicit;\n }\n\n const container = this.infiniteScrollContainer();\n\n if (container instanceof HTMLElement) {\n return container;\n }\n\n if (typeof container === 'string' && container.trim()) {\n const scope: ParentNode = this.fromRoot() ? document : this.hostRef.nativeElement;\n return scope.querySelector<HTMLElement>(container) ?? this.hostRef.nativeElement;\n }\n\n return this.hostRef.nativeElement;\n }\n\n private buildRootMargin(): string {\n const up = this.distanceFor('up');\n const down = this.distanceFor('down');\n const direction = this.infiniteScrollDirection();\n\n if (direction === 'up') {\n return `${up}px 0px 0px 0px`;\n }\n\n if (direction === 'down') {\n return `0px 0px ${down}px 0px`;\n }\n\n return `${up}px 0px ${down}px 0px`;\n }\n\n private createSentinel(position: 'top' | 'bottom'): HTMLElement {\n const node = document.createElement('span');\n node.dataset['ngxInfiniteScrollSentinel'] = position;\n node.setAttribute('aria-hidden', 'true');\n node.style.display = 'block';\n node.style.width = '1px';\n node.style.height = '1px';\n node.style.margin = '0';\n node.style.padding = '0';\n node.style.border = '0';\n node.style.pointerEvents = 'none';\n node.style.visibility = 'hidden';\n return node;\n }\n\n private scheduleCheck(): void {\n window.setTimeout(() => {\n if (this.destroyRequested || this.infiniteScrollDisabled()) return;\n this.checkVisibilityDirectly();\n }, MANUAL_CHECK_DELAY_MS);\n }\n\n private checkVisibilityDirectly(): void {\n if (!this.topSentinel || !this.bottomSentinel || this.infiniteScrollDisabled()) {\n return;\n }\n\n const rootRect = this.root\n ? this.root.getBoundingClientRect()\n : { top: 0, bottom: window.innerHeight };\n\n const rootTop = rootRect.top;\n const rootBottom = rootRect.bottom;\n const upDistance = this.distanceFor('up');\n const downDistance = this.distanceFor('down');\n\n if (this.allowsDirection('up') && this.armedUp) {\n const rect = this.topSentinel.getBoundingClientRect();\n if (rect.bottom >= rootTop - upDistance && rect.top <= rootBottom) {\n this.trigger('up');\n }\n }\n\n if (this.allowsDirection('down') && this.armedDown) {\n const rect = this.bottomSentinel.getBoundingClientRect();\n if (rect.top <= rootBottom + downDistance && rect.bottom >= rootTop) {\n this.trigger('down');\n }\n }\n }\n\n private distanceFor(direction: 'up' | 'down'): number {\n const override =\n direction === 'up' ? this.infiniteScrollUpDistance() : this.infiniteScrollDownDistance();\n return Math.max(0, override ?? this.infiniteScrollDistance());\n }\n\n private getDocumentScroller(): HTMLElement | null {\n if (typeof document === 'undefined') return null;\n return document.scrollingElement instanceof HTMLElement ? document.scrollingElement : null;\n }\n\n private getScrollMetrics(): {\n element: HTMLElement | null;\n scrollTop: number;\n scrollHeight: number;\n } {\n const element = this.root ?? this.getDocumentScroller();\n if (element) {\n return {\n element,\n scrollTop: element.scrollTop,\n scrollHeight: element.scrollHeight,\n };\n }\n\n return {\n element: null,\n scrollTop: window.scrollY,\n scrollHeight: Math.max(\n document.documentElement.scrollHeight,\n document.body?.scrollHeight ?? 0,\n ),\n };\n }\n\n private capturePrependSnapshot(): void {\n const metrics = this.getScrollMetrics();\n this.prependSnapshot = {\n scrollTop: metrics.scrollTop,\n scrollHeight: metrics.scrollHeight,\n };\n\n this.watchPrepend();\n }\n\n private watchPrepend(): void {\n this.cancelPrependWatcher();\n\n const startedAt = performance.now();\n\n const frame = () => {\n if (!this.prependSnapshot || this.destroyRequested) {\n this.prependFrame = 0;\n return;\n }\n\n const compensated = this.tryCompensatePrepend(false);\n if (compensated || performance.now() - startedAt >= PREPEND_MAX_WAIT_MS) {\n this.prependFrame = 0;\n return;\n }\n\n this.prependFrame = window.requestAnimationFrame(frame);\n };\n\n this.prependFrame = window.requestAnimationFrame(frame);\n }\n\n private tryCompensatePrepend(force: boolean): boolean {\n const snapshot = this.prependSnapshot;\n if (!snapshot) return true;\n\n const metrics = this.getScrollMetrics();\n const delta = metrics.scrollHeight - snapshot.scrollHeight;\n\n if (delta <= 0) {\n if (force) {\n this.prependSnapshot = undefined;\n this.cancelPrependWatcher();\n }\n return false;\n }\n\n /*\n * Do not fight an intentional user scroll while the request is in-flight.\n * A tiny tolerance absorbs layout rounding and browser scroll anchoring.\n */\n const currentTop = metrics.scrollTop;\n const movedByUser = Math.abs(currentTop - snapshot.scrollTop) > 4;\n\n if (!movedByUser || force) {\n const nextTop = snapshot.scrollTop + delta;\n\n if (metrics.element) {\n metrics.element.scrollTo({\n top: nextTop,\n behavior: this.infiniteScrollPreserveScrollBehavior(),\n });\n } else {\n window.scrollTo({\n top: nextTop,\n behavior: this.infiniteScrollPreserveScrollBehavior(),\n });\n }\n\n this.prependSnapshot = undefined;\n this.cancelPrependWatcher();\n return true;\n }\n\n return false;\n }\n\n private cancelPrependWatcher(): void {\n if (this.prependFrame) {\n window.cancelAnimationFrame(this.prependFrame);\n this.prependFrame = 0;\n }\n }\n\n private destroyObserver(): void {\n this.observer?.disconnect();\n this.resizeObserver?.disconnect();\n this.mutationObserver?.disconnect();\n this.observer = undefined;\n this.resizeObserver = undefined;\n this.mutationObserver = undefined;\n }\n\n private clearSentinels(): void {\n this.topSentinel?.remove();\n this.bottomSentinel?.remove();\n this.topSentinel = undefined;\n this.bottomSentinel = undefined;\n }\n}\n\nfunction numberInput(value: number | string | null | undefined): number {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n\nfunction nullableNumberInput(value: number | string | null | undefined | unknown): number | null {\n if (value == null || value === '') return null;\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction booleanInput(value: boolean | string | null | undefined): boolean {\n if (value === '' || value === true) return true;\n if (value === 'false' || value === false || value == null) return false;\n return Boolean(value);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}