@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.
- package/README.md +7 -2
- package/esm2020/config.mjs +7 -0
- package/esm2020/index.mjs +5 -0
- package/esm2020/internal/internal.model.mjs +2 -0
- package/esm2020/module.mjs +65 -0
- package/esm2020/platform/window.mjs +30 -0
- package/esm2020/ssv-ngx.ux.mjs +5 -0
- package/esm2020/version.mjs +2 -0
- package/esm2020/viewport/index.mjs +9 -0
- package/esm2020/viewport/viewport-data/index.mjs +4 -0
- package/esm2020/viewport/viewport-data/viewport-data-matcher.mjs +108 -0
- package/esm2020/viewport/viewport-data/viewport-data.pipe.mjs +43 -0
- package/esm2020/viewport/viewport-data/viewport-data.service.mjs +37 -0
- package/esm2020/viewport/viewport-data/viewport-data.utils.mjs +100 -0
- package/esm2020/viewport/viewport-matcher-var.directive.mjs +63 -0
- package/esm2020/viewport/viewport-matcher.directive.mjs +131 -0
- package/esm2020/viewport/viewport-server-size.service.mjs +43 -0
- package/esm2020/viewport/viewport.const.mjs +18 -0
- package/esm2020/viewport/viewport.model.mjs +31 -0
- package/esm2020/viewport/viewport.service.mjs +66 -0
- package/esm2020/viewport/viewport.util.mjs +117 -0
- package/fesm2015/{ssv-ngx.ux.js → ssv-ngx.ux.mjs} +266 -240
- package/fesm2015/ssv-ngx.ux.mjs.map +1 -0
- package/fesm2020/ssv-ngx.ux.mjs +822 -0
- package/fesm2020/ssv-ngx.ux.mjs.map +1 -0
- package/module.d.ts +7 -0
- package/package.json +21 -9
- package/platform/window.d.ts +3 -0
- package/version.d.ts +1 -1
- package/viewport/viewport-data/viewport-data.pipe.d.ts +3 -0
- package/viewport/viewport-data/viewport-data.service.d.ts +4 -1
- package/viewport/viewport-matcher-var.directive.d.ts +3 -0
- package/viewport/viewport-matcher.directive.d.ts +3 -0
- package/viewport/viewport-server-size.service.d.ts +3 -0
- package/viewport/viewport.service.d.ts +11 -2
- package/CHANGELOG.md +0 -142
- package/bundles/ssv-ngx.ux.umd.js +0 -1213
- package/bundles/ssv-ngx.ux.umd.js.map +0 -1
- package/bundles/ssv-ngx.ux.umd.min.js +0 -16
- package/bundles/ssv-ngx.ux.umd.min.js.map +0 -1
- package/esm2015/config.js +0 -7
- package/esm2015/index.js +0 -5
- package/esm2015/internal/internal.model.js +0 -2
- package/esm2015/module.js +0 -50
- package/esm2015/platform/window.js +0 -28
- package/esm2015/ssv-ngx.ux.js +0 -7
- package/esm2015/version.js +0 -2
- package/esm2015/viewport/index.js +0 -9
- package/esm2015/viewport/viewport-data/index.js +0 -4
- package/esm2015/viewport/viewport-data/viewport-data-matcher.js +0 -108
- package/esm2015/viewport/viewport-data/viewport-data.pipe.js +0 -43
- package/esm2015/viewport/viewport-data/viewport-data.service.js +0 -38
- package/esm2015/viewport/viewport-data/viewport-data.utils.js +0 -100
- package/esm2015/viewport/viewport-matcher-var.directive.js +0 -64
- package/esm2015/viewport/viewport-matcher.directive.js +0 -134
- package/esm2015/viewport/viewport-server-size.service.js +0 -38
- package/esm2015/viewport/viewport.const.js +0 -18
- package/esm2015/viewport/viewport.model.js +0 -31
- package/esm2015/viewport/viewport.service.js +0 -64
- package/esm2015/viewport/viewport.util.js +0 -117
- package/fesm2015/ssv-ngx.ux.js.map +0 -1
- package/ssv-ngx.ux.d.ts +0 -6
- package/ssv-ngx.ux.metadata.json +0 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
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
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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.
|
|
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
|
-
|
|
358
|
-
this.
|
|
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.ɵ
|
|
385
|
-
ViewportService
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
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
|
|
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.ɵ
|
|
514
|
-
ViewportDataService
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
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
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
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
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
]
|
|
617
|
-
|
|
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
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
]
|
|
737
|
-
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
]
|
|
744
|
-
|
|
745
|
-
|
|
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
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
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 = "
|
|
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
|
|
802
|
-
//# sourceMappingURL=ssv-ngx.ux.
|
|
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
|