@ssv/ngx.ux 2.0.0-dev175 → 2.0.2-dev.7

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 (63) hide show
  1. package/README.md +7 -2
  2. package/esm2020/config.mjs +7 -0
  3. package/esm2020/index.mjs +5 -0
  4. package/esm2020/internal/internal.model.mjs +2 -0
  5. package/esm2020/module.mjs +65 -0
  6. package/esm2020/platform/window.mjs +30 -0
  7. package/esm2020/ssv-ngx.ux.mjs +5 -0
  8. package/esm2020/version.mjs +2 -0
  9. package/esm2020/viewport/index.mjs +9 -0
  10. package/esm2020/viewport/viewport-data/index.mjs +4 -0
  11. package/esm2020/viewport/viewport-data/viewport-data-matcher.mjs +108 -0
  12. package/esm2020/viewport/viewport-data/viewport-data.pipe.mjs +43 -0
  13. package/esm2020/viewport/viewport-data/viewport-data.service.mjs +37 -0
  14. package/esm2020/viewport/viewport-data/viewport-data.utils.mjs +100 -0
  15. package/esm2020/viewport/viewport-matcher-var.directive.mjs +63 -0
  16. package/esm2020/viewport/viewport-matcher.directive.mjs +131 -0
  17. package/esm2020/viewport/viewport-server-size.service.mjs +43 -0
  18. package/esm2020/viewport/viewport.const.mjs +18 -0
  19. package/esm2020/viewport/viewport.model.mjs +31 -0
  20. package/esm2020/viewport/viewport.service.mjs +66 -0
  21. package/esm2020/viewport/viewport.util.mjs +117 -0
  22. package/fesm2015/{ssv-ngx.ux.js → ssv-ngx.ux.mjs} +266 -240
  23. package/fesm2015/ssv-ngx.ux.mjs.map +1 -0
  24. package/fesm2020/ssv-ngx.ux.mjs +822 -0
  25. package/fesm2020/ssv-ngx.ux.mjs.map +1 -0
  26. package/module.d.ts +7 -0
  27. package/package.json +21 -9
  28. package/platform/window.d.ts +3 -0
  29. package/version.d.ts +1 -1
  30. package/viewport/viewport-data/viewport-data.pipe.d.ts +3 -0
  31. package/viewport/viewport-data/viewport-data.service.d.ts +4 -1
  32. package/viewport/viewport-matcher-var.directive.d.ts +3 -0
  33. package/viewport/viewport-matcher.directive.d.ts +3 -0
  34. package/viewport/viewport-server-size.service.d.ts +3 -0
  35. package/viewport/viewport.service.d.ts +11 -2
  36. package/CHANGELOG.md +0 -142
  37. package/bundles/ssv-ngx.ux.umd.js +0 -1213
  38. package/bundles/ssv-ngx.ux.umd.js.map +0 -1
  39. package/bundles/ssv-ngx.ux.umd.min.js +0 -16
  40. package/bundles/ssv-ngx.ux.umd.min.js.map +0 -1
  41. package/esm2015/config.js +0 -7
  42. package/esm2015/index.js +0 -5
  43. package/esm2015/internal/internal.model.js +0 -2
  44. package/esm2015/module.js +0 -50
  45. package/esm2015/platform/window.js +0 -28
  46. package/esm2015/ssv-ngx.ux.js +0 -7
  47. package/esm2015/version.js +0 -2
  48. package/esm2015/viewport/index.js +0 -9
  49. package/esm2015/viewport/viewport-data/index.js +0 -4
  50. package/esm2015/viewport/viewport-data/viewport-data-matcher.js +0 -108
  51. package/esm2015/viewport/viewport-data/viewport-data.pipe.js +0 -43
  52. package/esm2015/viewport/viewport-data/viewport-data.service.js +0 -38
  53. package/esm2015/viewport/viewport-data/viewport-data.utils.js +0 -100
  54. package/esm2015/viewport/viewport-matcher-var.directive.js +0 -64
  55. package/esm2015/viewport/viewport-matcher.directive.js +0 -134
  56. package/esm2015/viewport/viewport-server-size.service.js +0 -38
  57. package/esm2015/viewport/viewport.const.js +0 -18
  58. package/esm2015/viewport/viewport.model.js +0 -31
  59. package/esm2015/viewport/viewport.service.js +0 -64
  60. package/esm2015/viewport/viewport.util.js +0 -117
  61. package/fesm2015/ssv-ngx.ux.js.map +0 -1
  62. package/ssv-ngx.ux.d.ts +0 -6
  63. package/ssv-ngx.ux.metadata.json +0 -1
@@ -1,5 +1,6 @@
1
- import { InjectionToken, ɵɵdefineInjectable, ɵɵinject, Injectable, Inject, Optional, Pipe, ChangeDetectorRef, Directive, ViewContainerRef, TemplateRef, Input, Renderer2, NgModule } from '@angular/core';
2
- import { map, auditTime, share, startWith, distinctUntilChanged, shareReplay, tap, takeUntil, filter, pairwise } from 'rxjs/operators';
1
+ import * as i0 from '@angular/core';
2
+ import { InjectionToken, Injectable, Inject, Optional, Pipe, Directive, Input, NgModule } from '@angular/core';
3
+ import { map, share, auditTime, startWith, distinctUntilChanged, shareReplay, tap, takeUntil, filter, pairwise } from 'rxjs/operators';
3
4
  import { fromEvent, of, Subscription, Subject, ReplaySubject, combineLatest } from 'rxjs';
4
5
 
5
6
  var ViewportDataMatchStrategy;
@@ -26,7 +27,7 @@ var ViewportDataMatchStrategy;
26
27
  * @returns Returns the matched data value.
27
28
  */
28
29
  function matchViewportData(dataConfig, sizeType, strategy, sizeTypes, sizeTypeMap) {
29
- const matchFn = matchStrategyHandlerMap[strategy];
30
+ const matchFn = matchStrategyHandlerMap$1[strategy];
30
31
  if (!matchFn) {
31
32
  throw Error(`matchViewportData: Viewport Data strategy not implemented. Strategy: '${strategy}'`);
32
33
  }
@@ -36,7 +37,7 @@ function matchViewportData(dataConfig, sizeType, strategy, sizeTypes, sizeTypeMa
36
37
  }
37
38
  return dataConfig.default;
38
39
  }
39
- const matchStrategyHandlerMap = {
40
+ const matchStrategyHandlerMap$1 = {
40
41
  [ViewportDataMatchStrategy.exact]: matchWithExact,
41
42
  [ViewportDataMatchStrategy.larger]: matchWithLargerMatch,
42
43
  [ViewportDataMatchStrategy.smaller]: matchWithSmallerMatch,
@@ -132,31 +133,104 @@ const UX_DEFAULT_CONFIG = {
132
133
  };
133
134
  const UX_CONFIG = new InjectionToken("@ssv/ngx.ux-config");
134
135
 
135
- const WINDOW = new InjectionToken("Window");
136
- class WindowRef {
137
- constructor(
138
- // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types
139
- window) {
140
- this.window = window;
136
+ /**
137
+ * Utility function to generate rules based on strategies.
138
+ *
139
+ * @param dataConfig Data config to generate rules based on.
140
+ * @param strategy Strategy to use when building rules.
141
+ * @param sizeTypes Available size types ordered by index type. (Can be obtained from `ViewportService`)
142
+ * @param sizeTypeMap Available size type map. (Can be obtained from `ViewportService`)
143
+ * @returns Returns a collection of rules (ordered).
144
+ */
145
+ function generateViewportRulesRangeFromDataMatcher(dataConfig, strategy, sizeTypes, sizeTypeMap) {
146
+ const ruleBuilderFn = matchStrategyHandlerMap[strategy];
147
+ if (!ruleBuilderFn) {
148
+ throw Error(`generateViewportRulesRangeFromDataMatcher: Viewport Data strategy not implemented. Strategy: '${strategy}'`);
141
149
  }
142
- /** Window underlying native object. */
143
- get native() {
144
- return this.window;
150
+ let dataSizes = [];
151
+ for (const key in dataConfig) {
152
+ if (Object.prototype.hasOwnProperty.call(dataConfig, key)) {
153
+ const data = dataConfig[key];
154
+ if (data === undefined) {
155
+ continue;
156
+ }
157
+ const size = sizeTypeMap[key];
158
+ if (size) {
159
+ dataSizes.push(size);
160
+ }
161
+ }
145
162
  }
146
- /** Determines whether native element is supported or not. Generally `false` when executing in SSR. */
147
- get hasNative() {
148
- return !!this.native.window;
163
+ dataSizes = dataSizes.sort(({ type: typeA }, { type: typeB }) => typeA - typeB);
164
+ const rules = [];
165
+ if (dataConfig.default) {
166
+ rules.push({ value: dataConfig.default, min: undefined, max: undefined });
167
+ }
168
+ let prevRule;
169
+ for (let index = 0; index < dataSizes.length; index++) {
170
+ const prevDataSize = dataSizes[index - 1];
171
+ const nextDataSize = dataSizes[index + 1];
172
+ const dataSize = dataSizes[index];
173
+ const prevSize = sizeTypes[dataSize.type - 1];
174
+ // const nextSize = sizeTypes[dataSize.type + 1];
175
+ const data = dataConfig[dataSize.name];
176
+ const rule = {
177
+ value: data,
178
+ min: undefined,
179
+ max: undefined,
180
+ };
181
+ ruleBuilderFn(rule, dataSize, nextDataSize, prevDataSize, prevSize, prevRule, sizeTypes);
182
+ prevRule = rule;
183
+ rules.push(rule);
149
184
  }
185
+ return rules;
186
+ }
187
+ const matchStrategyHandlerMap = {
188
+ [ViewportDataMatchStrategy.exact]: (rule, dataSize, _nextDataSize, _prevDataSize, prevSize) => {
189
+ rule.max = dataSize.widthThreshold;
190
+ if (prevSize) {
191
+ rule.min = prevSize.widthThreshold + 1;
192
+ }
193
+ },
194
+ [ViewportDataMatchStrategy.smaller]: (rule, dataSize, nextDataSize, _prevDataSize, prevSize) => {
195
+ if (nextDataSize) {
196
+ rule.max = dataSize.widthThreshold;
197
+ }
198
+ if (prevSize) {
199
+ rule.min = prevSize.widthThreshold + 1;
200
+ }
201
+ },
202
+ [ViewportDataMatchStrategy.larger]: (rule, dataSize, _nextDataSize, prevDataSize) => {
203
+ if (dataSize) {
204
+ rule.max = dataSize.widthThreshold;
205
+ }
206
+ if (prevDataSize) {
207
+ rule.min = prevDataSize.widthThreshold + 1;
208
+ }
209
+ },
210
+ [ViewportDataMatchStrategy.closestSmallerFirst]: (rule, dataSize, nextDataSize, _prevDataSize, _prevSize, prevRule, sizeTypes) => {
211
+ if (nextDataSize) {
212
+ rule.max = calculateClosestWidthThreshold(nextDataSize, dataSize, sizeTypes, true);
213
+ }
214
+ if (prevRule === null || prevRule === void 0 ? void 0 : prevRule.max) {
215
+ rule.min = prevRule.max + 1;
216
+ }
217
+ },
218
+ [ViewportDataMatchStrategy.closestLargerFirst]: (rule, dataSize, nextDataSize, _prevDataSize, _prevSize, prevRule, sizeTypes) => {
219
+ if (nextDataSize) {
220
+ rule.max = calculateClosestWidthThreshold(nextDataSize, dataSize, sizeTypes, false);
221
+ }
222
+ if (prevRule === null || prevRule === void 0 ? void 0 : prevRule.max) {
223
+ rule.min = prevRule.max + 1;
224
+ }
225
+ },
226
+ };
227
+ function calculateClosestWidthThreshold(nextDataSize, dataSize, sizeTypes, isSmallerPreferred) {
228
+ const fn = isSmallerPreferred ? Math.ceil : Math.floor;
229
+ // get closest between curr and next
230
+ const diffIndex = fn((nextDataSize.type - dataSize.type - 1) / 2);
231
+ const diffNextSize = sizeTypes[dataSize.type + diffIndex];
232
+ return (diffNextSize || dataSize).widthThreshold;
150
233
  }
151
- WindowRef.ɵprov = ɵɵdefineInjectable({ factory: function WindowRef_Factory() { return new WindowRef(ɵɵinject(WINDOW)); }, token: WindowRef, providedIn: "root" });
152
- WindowRef.decorators = [
153
- { type: Injectable, args: [{
154
- providedIn: "root",
155
- },] }
156
- ];
157
- WindowRef.ctorParameters = () => [
158
- { type: undefined, decorators: [{ type: Inject, args: [WINDOW,] }] }
159
- ];
160
234
 
161
235
  /**
162
236
  * The indices of each breakpoint provided based on the `UX_VIEWPORT_DEFAULT_BREAKPOINTS`.
@@ -189,41 +263,6 @@ var DeviceType;
189
263
  DeviceType["tablet"] = "tablet";
190
264
  })(DeviceType || (DeviceType = {}));
191
265
 
192
- // todo: make this configurable
193
- /** Viewport size for SSR. */
194
- const viewportSizeSSR = {
195
- [DeviceType.desktop]: {
196
- width: 1366,
197
- height: 768,
198
- },
199
- [DeviceType.tablet]: {
200
- width: 768,
201
- height: 1024,
202
- },
203
- [DeviceType.mobile]: {
204
- width: 414,
205
- height: 736,
206
- },
207
- };
208
- const UX_VIEWPORT_SSR_DEVICE = new InjectionToken("@ssv/ngx.ux-config/viewport/ssr-device");
209
- class ViewportServerSizeService {
210
- constructor(deviceType) {
211
- this.deviceType = deviceType;
212
- }
213
- get() {
214
- return viewportSizeSSR[this.deviceType] || viewportSizeSSR[DeviceType.desktop];
215
- }
216
- }
217
- ViewportServerSizeService.ɵprov = ɵɵdefineInjectable({ factory: function ViewportServerSizeService_Factory() { return new ViewportServerSizeService(ɵɵinject(UX_VIEWPORT_SSR_DEVICE, 8)); }, token: ViewportServerSizeService, providedIn: "root" });
218
- ViewportServerSizeService.decorators = [
219
- { type: Injectable, args: [{
220
- providedIn: "root",
221
- },] }
222
- ];
223
- ViewportServerSizeService.ctorParameters = () => [
224
- { type: DeviceType, decorators: [{ type: Optional }, { type: Inject, args: [UX_VIEWPORT_SSR_DEVICE,] }] }
225
- ];
226
-
227
266
  function isViewportSizeMatcherExpression(value) {
228
267
  if (typeof value !== "object" || !value) {
229
268
  return false;
@@ -340,6 +379,77 @@ function generateViewportSizeTypeInfoRefs(breakpointList) {
340
379
  }, {}));
341
380
  }
342
381
 
382
+ const WINDOW = new InjectionToken("Window");
383
+ class WindowRef {
384
+ constructor(
385
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types
386
+ window) {
387
+ this.window = window;
388
+ }
389
+ /** Window underlying native object. */
390
+ get native() {
391
+ return this.window;
392
+ }
393
+ /** Determines whether native element is supported or not. Generally `false` when executing in SSR. */
394
+ get hasNative() {
395
+ return !!this.native.window;
396
+ }
397
+ }
398
+ WindowRef.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: WindowRef, deps: [{ token: WINDOW }], target: i0.ɵɵFactoryTarget.Injectable });
399
+ WindowRef.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: WindowRef, providedIn: "root" });
400
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: WindowRef, decorators: [{
401
+ type: Injectable,
402
+ args: [{
403
+ providedIn: "root",
404
+ }]
405
+ }], ctorParameters: function () {
406
+ return [{ type: undefined, decorators: [{
407
+ type: Inject,
408
+ args: [WINDOW]
409
+ }] }];
410
+ } });
411
+
412
+ // todo: make this configurable
413
+ /** Viewport size for SSR. */
414
+ const viewportSizeSSR = {
415
+ [DeviceType.desktop]: {
416
+ width: 1366,
417
+ height: 768,
418
+ },
419
+ [DeviceType.tablet]: {
420
+ width: 768,
421
+ height: 1024,
422
+ },
423
+ [DeviceType.mobile]: {
424
+ width: 414,
425
+ height: 736,
426
+ },
427
+ };
428
+ const UX_VIEWPORT_SSR_DEVICE = new InjectionToken("@ssv/ngx.ux-config/viewport/ssr-device");
429
+ class ViewportServerSizeService {
430
+ constructor(deviceType) {
431
+ this.deviceType = deviceType;
432
+ }
433
+ get() {
434
+ return viewportSizeSSR[this.deviceType] || viewportSizeSSR[DeviceType.desktop];
435
+ }
436
+ }
437
+ ViewportServerSizeService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ViewportServerSizeService, deps: [{ token: UX_VIEWPORT_SSR_DEVICE, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
438
+ ViewportServerSizeService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ViewportServerSizeService, providedIn: "root" });
439
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ViewportServerSizeService, decorators: [{
440
+ type: Injectable,
441
+ args: [{
442
+ providedIn: "root",
443
+ }]
444
+ }], ctorParameters: function () {
445
+ return [{ type: DeviceType, decorators: [{
446
+ type: Optional
447
+ }, {
448
+ type: Inject,
449
+ args: [UX_VIEWPORT_SSR_DEVICE]
450
+ }] }];
451
+ } });
452
+
343
453
  class ViewportService {
344
454
  constructor(windowRef, viewportServerSize, config) {
345
455
  this.windowRef = windowRef;
@@ -347,15 +457,20 @@ class ViewportService {
347
457
  this._sizeTypes = generateViewportSizeTypeInfoList(config.viewport.breakpoints);
348
458
  this._sizeTypeMap = generateViewportSizeTypeInfoRefs(this._sizeTypes);
349
459
  if (windowRef.hasNative) {
350
- this.resize$ = fromEvent(window, "resize").pipe(map(() => this.getViewportSize()), auditTime(config.viewport.resizePollingSpeed), share());
460
+ this.resizeSnap$ = fromEvent(window, "resize").pipe(map(() => this.getViewportSize()), share());
461
+ this.resize$ = this.resizeSnap$.pipe(auditTime(config.viewport.resizePollingSpeed), share());
351
462
  }
352
463
  else {
353
- this.resize$ = of(viewportServerSize.get());
464
+ this.resizeSnap$ = this.resize$ = of(viewportServerSize.get());
354
465
  }
355
466
  const size = this.getViewportSize();
356
467
  this._sizeTypeSnapshot = getSizeTypeInfo(size.width, this.sizeTypes);
357
- this.size$ = this.resize$.pipe(startWith(size), distinctUntilChanged((a, b) => a.width === b.width && a.height === b.height), shareReplay(1));
358
- this.sizeType$ = this.size$.pipe(distinctUntilChanged((a, b) => a.width === b.width), map(x => getSizeTypeInfo(x.width, this.sizeTypes)), distinctUntilChanged(), tap(x => this._sizeTypeSnapshot = x), shareReplay(1));
468
+ const sizeFn = (obs$) => obs$.pipe(startWith(size), distinctUntilChanged((a, b) => a.width === b.width && a.height === b.height), shareReplay(1));
469
+ this.sizeSnap$ = sizeFn(this.resizeSnap$);
470
+ this.size$ = sizeFn(this.resize$);
471
+ const sizeTypeFn = (obs$) => obs$.pipe(distinctUntilChanged((a, b) => a.width === b.width), map(x => getSizeTypeInfo(x.width, this.sizeTypes)), distinctUntilChanged(), tap(x => this._sizeTypeSnapshot = x), shareReplay(1));
472
+ this.sizeType$ = sizeTypeFn(this.size$);
473
+ this.sizeTypeSnap$ = sizeTypeFn(this.sizeSnap$);
359
474
  }
360
475
  /** Viewport size type snapshot of the last value. (Prefer use `sizeType$` observable when possible.) */
361
476
  get sizeTypeSnapshot() { return this._sizeTypeSnapshot; }
@@ -381,116 +496,19 @@ class ViewportService {
381
496
  };
382
497
  }
383
498
  }
384
- ViewportService.ɵprov = ɵɵdefineInjectable({ factory: function ViewportService_Factory() { return new ViewportService(ɵɵinject(WindowRef), ɵɵinject(ViewportServerSizeService), ɵɵinject(UX_CONFIG)); }, token: ViewportService, providedIn: "root" });
385
- ViewportService.decorators = [
386
- { type: Injectable, args: [{
387
- providedIn: "root",
388
- },] }
389
- ];
390
- ViewportService.ctorParameters = () => [
391
- { type: WindowRef },
392
- { type: ViewportServerSizeService },
393
- { type: undefined, decorators: [{ type: Inject, args: [UX_CONFIG,] }] }
394
- ];
395
-
396
- /**
397
- * Utility function to generate rules based on strategies.
398
- *
399
- * @param dataConfig Data config to generate rules based on.
400
- * @param strategy Strategy to use when building rules.
401
- * @param sizeTypes Available size types ordered by index type. (Can be obtained from `ViewportService`)
402
- * @param sizeTypeMap Available size type map. (Can be obtained from `ViewportService`)
403
- * @returns Returns a collection of rules (ordered).
404
- */
405
- function generateViewportRulesRangeFromDataMatcher(dataConfig, strategy, sizeTypes, sizeTypeMap) {
406
- const ruleBuilderFn = matchStrategyHandlerMap$1[strategy];
407
- if (!ruleBuilderFn) {
408
- throw Error(`generateViewportRulesRangeFromDataMatcher: Viewport Data strategy not implemented. Strategy: '${strategy}'`);
409
- }
410
- let dataSizes = [];
411
- for (const key in dataConfig) {
412
- if (Object.prototype.hasOwnProperty.call(dataConfig, key)) {
413
- const data = dataConfig[key];
414
- if (data === undefined) {
415
- continue;
416
- }
417
- const size = sizeTypeMap[key];
418
- if (size) {
419
- dataSizes.push(size);
420
- }
421
- }
422
- }
423
- dataSizes = dataSizes.sort(({ type: typeA }, { type: typeB }) => typeA - typeB);
424
- const rules = [];
425
- if (dataConfig.default) {
426
- rules.push({ value: dataConfig.default, min: undefined, max: undefined });
427
- }
428
- let prevRule;
429
- for (let index = 0; index < dataSizes.length; index++) {
430
- const prevDataSize = dataSizes[index - 1];
431
- const nextDataSize = dataSizes[index + 1];
432
- const dataSize = dataSizes[index];
433
- const prevSize = sizeTypes[dataSize.type - 1];
434
- // const nextSize = sizeTypes[dataSize.type + 1];
435
- const data = dataConfig[dataSize.name];
436
- const rule = {
437
- value: data,
438
- min: undefined,
439
- max: undefined,
440
- };
441
- ruleBuilderFn(rule, dataSize, nextDataSize, prevDataSize, prevSize, prevRule, sizeTypes);
442
- prevRule = rule;
443
- rules.push(rule);
444
- }
445
- return rules;
446
- }
447
- const matchStrategyHandlerMap$1 = {
448
- [ViewportDataMatchStrategy.exact]: (rule, dataSize, _nextDataSize, _prevDataSize, prevSize) => {
449
- rule.max = dataSize.widthThreshold;
450
- if (prevSize) {
451
- rule.min = prevSize.widthThreshold + 1;
452
- }
453
- },
454
- [ViewportDataMatchStrategy.smaller]: (rule, dataSize, nextDataSize, _prevDataSize, prevSize) => {
455
- if (nextDataSize) {
456
- rule.max = dataSize.widthThreshold;
457
- }
458
- if (prevSize) {
459
- rule.min = prevSize.widthThreshold + 1;
460
- }
461
- },
462
- [ViewportDataMatchStrategy.larger]: (rule, dataSize, _nextDataSize, prevDataSize) => {
463
- if (dataSize) {
464
- rule.max = dataSize.widthThreshold;
465
- }
466
- if (prevDataSize) {
467
- rule.min = prevDataSize.widthThreshold + 1;
468
- }
469
- },
470
- [ViewportDataMatchStrategy.closestSmallerFirst]: (rule, dataSize, nextDataSize, _prevDataSize, _prevSize, prevRule, sizeTypes) => {
471
- if (nextDataSize) {
472
- rule.max = calculateClosestWidthThreshold(nextDataSize, dataSize, sizeTypes, true);
473
- }
474
- if (prevRule === null || prevRule === void 0 ? void 0 : prevRule.max) {
475
- rule.min = prevRule.max + 1;
476
- }
477
- },
478
- [ViewportDataMatchStrategy.closestLargerFirst]: (rule, dataSize, nextDataSize, _prevDataSize, _prevSize, prevRule, sizeTypes) => {
479
- if (nextDataSize) {
480
- rule.max = calculateClosestWidthThreshold(nextDataSize, dataSize, sizeTypes, false);
481
- }
482
- if (prevRule === null || prevRule === void 0 ? void 0 : prevRule.max) {
483
- rule.min = prevRule.max + 1;
484
- }
485
- },
486
- };
487
- function calculateClosestWidthThreshold(nextDataSize, dataSize, sizeTypes, isSmallerPreferred) {
488
- const fn = isSmallerPreferred ? Math.ceil : Math.floor;
489
- // get closest between curr and next
490
- const diffIndex = fn((nextDataSize.type - dataSize.type - 1) / 2);
491
- const diffNextSize = sizeTypes[dataSize.type + diffIndex];
492
- return (diffNextSize || dataSize).widthThreshold;
493
- }
499
+ ViewportService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ViewportService, deps: [{ token: WindowRef }, { token: ViewportServerSizeService }, { token: UX_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable });
500
+ ViewportService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ViewportService, providedIn: "root" });
501
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ViewportService, decorators: [{
502
+ type: Injectable,
503
+ args: [{
504
+ providedIn: "root",
505
+ }]
506
+ }], ctorParameters: function () {
507
+ return [{ type: WindowRef }, { type: ViewportServerSizeService }, { type: undefined, decorators: [{
508
+ type: Inject,
509
+ args: [UX_CONFIG]
510
+ }] }];
511
+ } });
494
512
 
495
513
  class ViewportDataService {
496
514
  constructor(viewport, config) {
@@ -502,24 +520,27 @@ class ViewportDataService {
502
520
  return matchViewportData(dataConfig, sizeType, strategy, this.viewport.sizeTypes, this.viewport.sizeTypeMap);
503
521
  }
504
522
  /** Get data for match as observable. */
505
- get$(dataConfig, strategy) {
506
- return this.viewport.sizeType$.pipe(map(sizeType => this.get(dataConfig, strategy, sizeType)), distinctUntilChanged());
523
+ get$(dataConfig, strategy, throttle = true) {
524
+ return (throttle ? this.viewport.sizeType$ : this.viewport.sizeTypeSnap$).pipe(map(sizeType => this.get(dataConfig, strategy, sizeType)), distinctUntilChanged());
507
525
  }
508
526
  /** Generate rules based on strategies for data. */
509
527
  generateRules(dataConfig, strategy = this.config.viewport.defaultDataMatchStrategy) {
510
528
  return generateViewportRulesRangeFromDataMatcher(dataConfig, strategy, this.viewport.sizeTypes, this.viewport.sizeTypeMap);
511
529
  }
512
530
  }
513
- ViewportDataService.ɵprov = ɵɵdefineInjectable({ factory: function ViewportDataService_Factory() { return new ViewportDataService(ɵɵinject(ViewportService), ɵɵinject(UX_CONFIG)); }, token: ViewportDataService, providedIn: "root" });
514
- ViewportDataService.decorators = [
515
- { type: Injectable, args: [{
516
- providedIn: "root",
517
- },] }
518
- ];
519
- ViewportDataService.ctorParameters = () => [
520
- { type: ViewportService },
521
- { type: undefined, decorators: [{ type: Inject, args: [UX_CONFIG,] }] }
522
- ];
531
+ ViewportDataService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ViewportDataService, deps: [{ token: ViewportService }, { token: UX_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable });
532
+ ViewportDataService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ViewportDataService, providedIn: "root" });
533
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ViewportDataService, decorators: [{
534
+ type: Injectable,
535
+ args: [{
536
+ providedIn: "root",
537
+ }]
538
+ }], ctorParameters: function () {
539
+ return [{ type: ViewportService }, { type: undefined, decorators: [{
540
+ type: Inject,
541
+ args: [UX_CONFIG]
542
+ }] }];
543
+ } });
523
544
 
524
545
  /* eslint-disable @angular-eslint/no-pipe-impure */
525
546
  class ViewportDataPipe {
@@ -548,16 +569,15 @@ class ViewportDataPipe {
548
569
  this.data$$.unsubscribe();
549
570
  }
550
571
  }
551
- ViewportDataPipe.decorators = [
552
- { type: Pipe, args: [{
553
- name: "ssvViewportData",
554
- pure: false
555
- },] }
556
- ];
557
- ViewportDataPipe.ctorParameters = () => [
558
- { type: ViewportDataService },
559
- { type: ChangeDetectorRef }
560
- ];
572
+ ViewportDataPipe.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ViewportDataPipe, deps: [{ token: ViewportDataService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Pipe });
573
+ ViewportDataPipe.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: ViewportDataPipe, name: "ssvViewportData", pure: false });
574
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: ViewportDataPipe, decorators: [{
575
+ type: Pipe,
576
+ args: [{
577
+ name: "ssvViewportData",
578
+ pure: false
579
+ }]
580
+ }], ctorParameters: function () { return [{ type: ViewportDataService }, { type: i0.ChangeDetectorRef }]; } });
561
581
 
562
582
  const NAME_CAMEL = "ssvViewportMatcherVar";
563
583
  class SsvViewportMatcherVarContext {
@@ -604,19 +624,17 @@ class SsvViewportMatcherVarDirective {
604
624
  this._viewRef = this.viewContainer.createEmbeddedView(this.templateRef, this._context);
605
625
  }
606
626
  }
607
- SsvViewportMatcherVarDirective.decorators = [
608
- { type: Directive, args: [{
609
- selector: `[${NAME_CAMEL}]`,
610
- },] }
611
- ];
612
- SsvViewportMatcherVarDirective.ctorParameters = () => [
613
- { type: ViewportService },
614
- { type: ViewContainerRef },
615
- { type: TemplateRef }
616
- ];
617
- SsvViewportMatcherVarDirective.propDecorators = {
618
- condition: [{ type: Input, args: [`${NAME_CAMEL}When`,] }]
619
- };
627
+ SsvViewportMatcherVarDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SsvViewportMatcherVarDirective, deps: [{ token: ViewportService }, { token: i0.ViewContainerRef }, { token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
628
+ SsvViewportMatcherVarDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: SsvViewportMatcherVarDirective, selector: "[ssvViewportMatcherVar]", inputs: { condition: ["ssvViewportMatcherVarWhen", "condition"] }, ngImport: i0 });
629
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SsvViewportMatcherVarDirective, decorators: [{
630
+ type: Directive,
631
+ args: [{
632
+ selector: `[${NAME_CAMEL}]`,
633
+ }]
634
+ }], ctorParameters: function () { return [{ type: ViewportService }, { type: i0.ViewContainerRef }, { type: i0.TemplateRef }]; }, propDecorators: { condition: [{
635
+ type: Input,
636
+ args: [`${NAME_CAMEL}When`]
637
+ }] } });
620
638
 
621
639
  class SsvViewportMatcherContext {
622
640
  constructor() {
@@ -728,24 +746,21 @@ class SsvViewportMatcherDirective {
728
746
  }
729
747
  }
730
748
  }
731
- SsvViewportMatcherDirective.decorators = [
732
- { type: Directive, args: [{
733
- selector: "[ssvViewportMatcher]",
734
- exportAs: "ssvViewportMatcher",
735
- },] }
736
- ];
737
- SsvViewportMatcherDirective.ctorParameters = () => [
738
- { type: ViewportService },
739
- { type: Renderer2 },
740
- { type: ViewContainerRef },
741
- { type: ChangeDetectorRef },
742
- { type: TemplateRef }
743
- ];
744
- SsvViewportMatcherDirective.propDecorators = {
745
- ssvViewportMatcher: [{ type: Input }],
746
- ssvViewportMatcherExclude: [{ type: Input }],
747
- ssvViewportMatcherElse: [{ type: Input }]
748
- };
749
+ SsvViewportMatcherDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SsvViewportMatcherDirective, deps: [{ token: ViewportService }, { token: i0.Renderer2 }, { token: i0.ViewContainerRef }, { token: i0.ChangeDetectorRef }, { token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
750
+ SsvViewportMatcherDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: SsvViewportMatcherDirective, selector: "[ssvViewportMatcher]", inputs: { ssvViewportMatcher: "ssvViewportMatcher", ssvViewportMatcherExclude: "ssvViewportMatcherExclude", ssvViewportMatcherElse: "ssvViewportMatcherElse" }, exportAs: ["ssvViewportMatcher"], ngImport: i0 });
751
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SsvViewportMatcherDirective, decorators: [{
752
+ type: Directive,
753
+ args: [{
754
+ selector: "[ssvViewportMatcher]",
755
+ exportAs: "ssvViewportMatcher",
756
+ }]
757
+ }], ctorParameters: function () { return [{ type: ViewportService }, { type: i0.Renderer2 }, { type: i0.ViewContainerRef }, { type: i0.ChangeDetectorRef }, { type: i0.TemplateRef }]; }, propDecorators: { ssvViewportMatcher: [{
758
+ type: Input
759
+ }], ssvViewportMatcherExclude: [{
760
+ type: Input
761
+ }], ssvViewportMatcherElse: [{
762
+ type: Input
763
+ }] } });
749
764
 
750
765
  /** @internal */
751
766
  const MODULE_CONFIG_DATA = new InjectionToken("@ssv/ngx.ux/configData");
@@ -765,16 +780,27 @@ class SsvUxModule {
765
780
  };
766
781
  }
767
782
  }
768
- SsvUxModule.decorators = [
769
- { type: NgModule, args: [{
770
- declarations: [components],
771
- providers: [
772
- { provide: UX_CONFIG, useFactory: _moduleConfigFactory, deps: [[MODULE_CONFIG_DATA, new Optional()]] },
773
- { provide: WINDOW, useFactory: _window },
774
- ],
775
- exports: [...components],
776
- },] }
777
- ];
783
+ SsvUxModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SsvUxModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
784
+ SsvUxModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.9", ngImport: i0, type: SsvUxModule, declarations: [SsvViewportMatcherDirective,
785
+ SsvViewportMatcherVarDirective,
786
+ ViewportDataPipe], exports: [SsvViewportMatcherDirective,
787
+ SsvViewportMatcherVarDirective,
788
+ ViewportDataPipe] });
789
+ SsvUxModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SsvUxModule, providers: [
790
+ { provide: UX_CONFIG, useFactory: _moduleConfigFactory, deps: [[MODULE_CONFIG_DATA, new Optional()]] },
791
+ { provide: WINDOW, useFactory: _window },
792
+ ] });
793
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: SsvUxModule, decorators: [{
794
+ type: NgModule,
795
+ args: [{
796
+ declarations: [components],
797
+ providers: [
798
+ { provide: UX_CONFIG, useFactory: _moduleConfigFactory, deps: [[MODULE_CONFIG_DATA, new Optional()]] },
799
+ { provide: WINDOW, useFactory: _window },
800
+ ],
801
+ exports: [...components],
802
+ }]
803
+ }] });
778
804
  /** @internal */
779
805
  function _moduleConfigFactory(config) {
780
806
  if (!config) {
@@ -792,11 +818,11 @@ function _window() {
792
818
  return {};
793
819
  }
794
820
 
795
- const VERSION = "2.0.0-dev175";
821
+ const VERSION = "0.0.0-PLACEHOLDER";
796
822
 
797
823
  /**
798
824
  * Generated bundle index. Do not edit.
799
825
  */
800
826
 
801
- export { ComparisonOperation, DeviceType, MODULE_CONFIG_DATA, SsvUxModule, SsvViewportMatcherContext, SsvViewportMatcherDirective, SsvViewportMatcherVarContext, SsvViewportMatcherVarDirective, UX_CONFIG, UX_DEFAULT_CONFIG, UX_VIEWPORT_DEFAULT_BREAKPOINTS, UX_VIEWPORT_SSR_DEVICE, VERSION, ViewportDataMatchStrategy, ViewportDataPipe, ViewportDataService, ViewportServerSizeService, ViewportService, ViewportSizeType, _moduleConfigFactory, _window, generateViewportSizeType, UX_VIEWPORT_DEFAULT_CONFIG as ɵa, WINDOW as ɵb, WindowRef as ɵc };
802
- //# sourceMappingURL=ssv-ngx.ux.js.map
827
+ export { ComparisonOperation, DeviceType, MODULE_CONFIG_DATA, SsvUxModule, SsvViewportMatcherContext, SsvViewportMatcherDirective, SsvViewportMatcherVarContext, SsvViewportMatcherVarDirective, UX_CONFIG, UX_DEFAULT_CONFIG, UX_VIEWPORT_DEFAULT_BREAKPOINTS, UX_VIEWPORT_SSR_DEVICE, VERSION, ViewportDataMatchStrategy, ViewportDataPipe, ViewportDataService, ViewportServerSizeService, ViewportService, ViewportSizeType, _moduleConfigFactory, _window, generateViewportSizeType };
828
+ //# sourceMappingURL=ssv-ngx.ux.mjs.map