ngx-slice-kit
Version:
[](https://badge.fury.io/js/ngx-slice-kit)
101 lines • 13.5 kB
JavaScript
import { Inject, Injectable } from '@angular/core';
import { getSupportedInputTypes, supportsPassiveEventListeners, supportsScrollBehavior } from '@angular/cdk/platform';
import { BehaviorSubject, of } from 'rxjs';
import { DOCUMENT } from '@angular/common';
import * as i0 from "@angular/core";
import * as i1 from "@angular/cdk/platform";
const DEFAULT_MOBILE_LAYOUT_WIDTH = 1024;
const CHAR_STRING = '1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
const LOWER_INDEX = 1000;
export class LayoutControlService {
constructor(document, platform) {
this.document = document;
this.platform = platform;
this.supportedInputTypes = Array.from(getSupportedInputTypes()).join(', ');
this.supportsPassiveEventListeners = supportsPassiveEventListeners();
this.supportsScrollBehavior = supportsScrollBehavior();
/**
* simple bool behaviorSubject which returns is mobileLayout active or not
*/
this.$mobileLayoutWidth = new BehaviorSubject(DEFAULT_MOBILE_LAYOUT_WIDTH);
this.$focusTrap = new BehaviorSubject([]);
}
get trapped() {
const elements = this.$focusTrap.getValue();
return elements.length ? elements[0] : undefined;
}
get focusTrap() {
return this.$focusTrap.getValue();
}
get isMobileLayout() {
const { width = 0 } = this.getViewport();
return width <= this.mobileLayoutWidth;
}
get mobileLayoutObservable() {
return of(this.isMobileLayout);
}
get mobileLayoutDetectionEnabled() {
return this.isMobileLayout !== null ? this.isMobileLayout : false;
}
get mobileLayoutWidth() {
return this.$mobileLayoutWidth.getValue();
}
set mobileLayoutWidth(w) {
this.$mobileLayoutWidth.next(w);
}
focus(elem) {
this.$focusTrap.next([elem, ...this.$focusTrap.getValue()]);
}
getPlatformClass() {
return this.platform.IOS ? 'ios' :
this.platform.ANDROID ? 'android' : 'browser';
}
generateLayoutElementHash() {
let result = '';
for (let i = 0; i < 32; i++) {
result += CHAR_STRING.charAt(Math.floor(Math.random() * CHAR_STRING.length));
}
return result;
}
catch(elem) {
this.$focusTrap.next([elem, ...this.$focusTrap.getValue()]);
}
getViewport() {
if (!this.platform.isBrowser) {
return;
}
const win = window;
const d = this.document;
const e = d.documentElement;
const g = d.body;
const w = win.innerWidth || e.clientWidth || g.clientWidth;
const h = win.innerHeight || e.clientHeight || g.clientHeight;
return { width: w, height: h };
}
getWindowScrollTop() {
if (!this.platform.isBrowser) {
return;
}
const doc = this.document.documentElement;
return (window.pageYOffset || doc.scrollTop) - (doc.clientTop || 0);
}
getWindowScrollLeft() {
if (!this.platform.isBrowser) {
return;
}
const doc = this.document.documentElement;
return (window.pageXOffset || doc.scrollLeft) - (doc.clientLeft || 0);
}
}
LayoutControlService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: LayoutControlService, deps: [{ token: DOCUMENT }, { token: i1.Platform }], target: i0.ɵɵFactoryTarget.Injectable });
LayoutControlService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: LayoutControlService, providedIn: 'root' });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: LayoutControlService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root'
}]
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }, { type: i1.Platform }]; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LWNvbnRyb2wuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbmd4LXNsaWNlLWtpdC9zcmMvbGliL2NvcmUvbGF5b3V0LWNvbnRyb2wvbGF5b3V0LWNvbnRyb2wuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRCxPQUFPLEVBQUUsc0JBQXNCLEVBQVksNkJBQTZCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNoSSxPQUFPLEVBQUUsZUFBZSxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7OztBQUUzQyxNQUFNLDJCQUEyQixHQUFHLElBQUksQ0FBQztBQUV6QyxNQUFNLFdBQVcsR0FBRyxnRUFBZ0UsQ0FBQztBQUNyRixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUM7QUFLekIsTUFBTSxPQUFPLG9CQUFvQjtJQVk3QixZQUM4QixRQUFhLEVBQ3ZCLFFBQWtCO1FBRFIsYUFBUSxHQUFSLFFBQVEsQ0FBSztRQUN2QixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBWnRCLHdCQUFtQixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0RSxrQ0FBNkIsR0FBRyw2QkFBNkIsRUFBRSxDQUFDO1FBQ2hFLDJCQUFzQixHQUFHLHNCQUFzQixFQUFFLENBQUM7UUFFbEU7O1dBRUc7UUFDSyx1QkFBa0IsR0FBNEIsSUFBSSxlQUFlLENBQVMsMkJBQTJCLENBQUMsQ0FBQztRQUN2RyxlQUFVLEdBQTJCLElBQUksZUFBZSxDQUFLLEVBQUUsQ0FBQyxDQUFDO0lBTXpFLENBQUM7SUFFRCxJQUFXLE9BQU87UUFD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T0FBTyxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBQyxDQUFDO0lBQ2pDLENBQUM7SUFFTSxrQkFBa0I7UUFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFO1lBQzFCLE9BQU87U0FDVjtRQUVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDO1FBQzFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQUVNLG1CQUFtQjtRQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUU7WUFDMUIsT0FBTztTQUNWO1FBRUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUM7UUFDMUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMxRSxDQUFDOztpSEFwR1Esb0JBQW9CLGtCQWFqQixRQUFRO3FIQWJYLG9CQUFvQixjQUZqQixNQUFNOzJGQUVULG9CQUFvQjtrQkFIaEMsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckI7OzBCQWNRLE1BQU07MkJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVsZW1lbnRSZWYsIEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZ2V0U3VwcG9ydGVkSW5wdXRUeXBlcywgUGxhdGZvcm0sIHN1cHBvcnRzUGFzc2l2ZUV2ZW50TGlzdGVuZXJzLCBzdXBwb3J0c1Njcm9sbEJlaGF2aW9yIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BsYXRmb3JtJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuY29uc3QgREVGQVVMVF9NT0JJTEVfTEFZT1VUX1dJRFRIID0gMTAyNDtcblxuY29uc3QgQ0hBUl9TVFJJTkcgPSAnMTIzNDU2Nzg5MEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXonO1xuY29uc3QgTE9XRVJfSU5ERVggPSAxMDAwO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIExheW91dENvbnRyb2xTZXJ2aWNlIHtcblxuICAgIHB1YmxpYyByZWFkb25seSBzdXBwb3J0ZWRJbnB1dFR5cGVzID0gQXJyYXkuZnJvbShnZXRTdXBwb3J0ZWRJbnB1dFR5cGVzKCkpLmpvaW4oJywgJyk7XG4gICAgcHVibGljIHJlYWRvbmx5IHN1cHBvcnRzUGFzc2l2ZUV2ZW50TGlzdGVuZXJzID0gc3VwcG9ydHNQYXNzaXZlRXZlbnRMaXN0ZW5lcnMoKTtcbiAgICBwdWJsaWMgcmVhZG9ubHkgc3VwcG9ydHNTY3JvbGxCZWhhdmlvciA9IHN1cHBvcnRzU2Nyb2xsQmVoYXZpb3IoKTtcblxuICAgIC8qKlxuICAgICAqIHNpbXBsZSBib29sIGJlaGF2aW9yU3ViamVjdCB3aGljaCByZXR1cm5zIGlzIG1vYmlsZUxheW91dCBhY3RpdmUgb3Igbm90XG4gICAgICovXG4gICAgcHJpdmF0ZSAkbW9iaWxlTGF5b3V0V2lkdGg6IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KERFRkFVTFRfTU9CSUxFX0xBWU9VVF9XSURUSCk7XG4gICAgcHJpdmF0ZSAkZm9jdXNUcmFwOiBCZWhhdmlvclN1YmplY3Q8YW55W10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxbXT4oW10pO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jdW1lbnQ6IGFueSxcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IHBsYXRmb3JtOiBQbGF0Zm9ybSxcbiAgICApIHtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHRyYXBwZWQoKTogYW55IHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLiRmb2N1c1RyYXAuZ2V0VmFsdWUoKTtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRzLmxlbmd0aCA/IGVsZW1lbnRzWzBdIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZm9jdXNUcmFwKCk6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuJGZvY3VzVHJhcC5nZXRWYWx1ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaXNNb2JpbGVMYXlvdXQoKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IHt3aWR0aCA9IDB9ID0gdGhpcy5nZXRWaWV3cG9ydCgpO1xuICAgICAgICByZXR1cm4gd2lkdGggPD0gdGhpcy5tb2JpbGVMYXlvdXRXaWR0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1vYmlsZUxheW91dE9ic2VydmFibGUoKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XG4gICAgICAgIHJldHVybiBvZih0aGlzLmlzTW9iaWxlTGF5b3V0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1vYmlsZUxheW91dERldGVjdGlvbkVuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzTW9iaWxlTGF5b3V0ICE9PSBudWxsID8gdGhpcy5pc01vYmlsZUxheW91dCA6IGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgbW9iaWxlTGF5b3V0V2lkdGgoKTogbnVtYmVyIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuJG1vYmlsZUxheW91dFdpZHRoLmdldFZhbHVlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHNldCBtb2JpbGVMYXlvdXRXaWR0aCh3OiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy4kbW9iaWxlTGF5b3V0V2lkdGgubmV4dCh3KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZm9jdXMoZWxlbTogYW55KTogdm9pZCB7XG4gICAgICAgIHRoaXMuJGZvY3VzVHJhcC5uZXh0KFtlbGVtLCAuLi50aGlzLiRmb2N1c1RyYXAuZ2V0VmFsdWUoKV0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRQbGF0Zm9ybUNsYXNzKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnBsYXRmb3JtLklPUyA/ICdpb3MnIDpcbiAgICAgICAgICAgIHRoaXMucGxhdGZvcm0uQU5EUk9JRCA/ICdhbmRyb2lkJyA6ICdicm93c2VyJztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2VuZXJhdGVMYXlvdXRFbGVtZW50SGFzaCgpOiBzdHJpbmcge1xuICAgICAgICBsZXQgcmVzdWx0ID0gJyc7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMzI7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0ICs9IENIQVJfU1RSSU5HLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBDSEFSX1NUUklORy5sZW5ndGgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBjYXRjaChlbGVtOiBFbGVtZW50UmVmKTogdm9pZCB7XG4gICAgICAgIHRoaXMuJGZvY3VzVHJhcC5uZXh0KFtlbGVtLCAuLi50aGlzLiRmb2N1c1RyYXAuZ2V0VmFsdWUoKV0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRWaWV3cG9ydCgpOiBhbnkge1xuICAgICAgICBpZiAoIXRoaXMucGxhdGZvcm0uaXNCcm93c2VyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB3aW4gPSB3aW5kb3c7XG4gICAgICAgIGNvbnN0IGQgPSB0aGlzLmRvY3VtZW50O1xuICAgICAgICBjb25zdCBlID0gZC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGcgPSBkLmJvZHk7XG4gICAgICAgIGNvbnN0IHcgPSB3aW4uaW5uZXJXaWR0aCB8fCBlLmNsaWVudFdpZHRoIHx8IGcuY2xpZW50V2lkdGg7XG4gICAgICAgIGNvbnN0IGggPSB3aW4uaW5uZXJIZWlnaHQgfHwgZS5jbGllbnRIZWlnaHQgfHwgZy5jbGllbnRIZWlnaHQ7XG5cbiAgICAgICAgcmV0dXJuIHt3aWR0aDogdywgaGVpZ2h0OiBofTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0V2luZG93U2Nyb2xsVG9wKCk6IG51bWJlciB7XG4gICAgICAgIGlmICghdGhpcy5wbGF0Zm9ybS5pc0Jyb3dzZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRvYyA9IHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICByZXR1cm4gKHdpbmRvdy5wYWdlWU9mZnNldCB8fCBkb2Muc2Nyb2xsVG9wKSAtIChkb2MuY2xpZW50VG9wIHx8IDApO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRXaW5kb3dTY3JvbGxMZWZ0KCk6IG51bWJlciB7XG4gICAgICAgIGlmICghdGhpcy5wbGF0Zm9ybS5pc0Jyb3dzZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRvYyA9IHRoaXMuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgICAgICByZXR1cm4gKHdpbmRvdy5wYWdlWE9mZnNldCB8fCBkb2Muc2Nyb2xsTGVmdCkgLSAoZG9jLmNsaWVudExlZnQgfHwgMCk7XG4gICAgfVxufVxuIl19