@lightweightform/theme-common
Version:
Common utilities for Lightweightform themes
95 lines • 9.46 kB
JavaScript
import { Injectable } from '@angular/core';
import * as i0 from "@angular/core";
/**
* Service providing scrolling-related utilities.
*/
export class ScrollbarUtils {
/**
* Computes the width/height (in px) of vertical/horizontal scrollbars in the
* user's browser and caches the results. This method should only ever be
* called once.
*/
static computeScrollbarSizes() {
const div = document.createElement('div');
div.innerHTML = `<div style="overflow:auto; position:absolute; top:0;
width:100px; height:100px;">
<div style="width:200px; height:200px;"></div>
</div>`;
const child = div.firstChild;
document.body.appendChild(div);
ScrollbarUtils.scrollbarWidth = child.offsetWidth - child.clientWidth;
ScrollbarUtils.scrollbarHeight = child.offsetHeight - child.clientHeight;
document.body.removeChild(div);
}
/**
* Width (in px) of a vertical scrollbar in the user's browser. This value is
* only computed once and cached for subsequent calls.
* @returns Width of the vertical scrollbar in the user's browser.
*/
get verticalScrollbarWidth() {
if (ScrollbarUtils.scrollbarWidth === undefined) {
ScrollbarUtils.computeScrollbarSizes();
}
return ScrollbarUtils.scrollbarWidth;
}
/**
* Height (in px) of a horizontal scrollbar in the user's browser. This value
* is only computed once and cached for subsequent calls.
* @returns Height of the horizontal scrollbar in the user's browser.
*/
get horizontalScrollbarHeight() {
if (ScrollbarUtils.scrollbarHeight === undefined) {
ScrollbarUtils.computeScrollbarSizes();
}
return ScrollbarUtils.scrollbarHeight;
}
/**
* Whether a given DOM element has a vertical scrollbar.
* @param element Element to check for vertical scrollbar.
* @returns Whether the provided element has a vertical scrollbar.
*/
// FIXME: Unreliable in IE/Edge
hasVerticalOverflow(element) {
return element.scrollHeight > element.clientHeight;
}
/**
* Whether a given DOM element has a horizontal scrollbar.
* @param element Element to check for horizontal scrollbar.
* @returns Whether the provided element has a horizontal scrollbar.
*/
// FIXME: Unreliable in IE/Edge
hasHorizontalOverflow(element) {
return element.scrollWidth > element.clientWidth;
}
}
// Only compute sizes once (this assumes that browser scrollbar sizes don't
// change over time, which seems like a valid assumption)
Object.defineProperty(ScrollbarUtils, "scrollbarWidth", {
enumerable: true,
configurable: true,
writable: true,
value: undefined
});
Object.defineProperty(ScrollbarUtils, "scrollbarHeight", {
enumerable: true,
configurable: true,
writable: true,
value: undefined
});
Object.defineProperty(ScrollbarUtils, "\u0275fac", {
enumerable: true,
configurable: true,
writable: true,
value: i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: ScrollbarUtils, deps: [], target: i0.ɵɵFactoryTarget.Injectable })
});
Object.defineProperty(ScrollbarUtils, "\u0275prov", {
enumerable: true,
configurable: true,
writable: true,
value: i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: ScrollbarUtils, providedIn: 'root' })
});
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.16", ngImport: i0, type: ScrollbarUtils, decorators: [{
type: Injectable,
args: [{ providedIn: 'root' }]
}] });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsYmFyLXV0aWxzLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvc2Nyb2xsYmFyLXV0aWxzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFFM0M7O0dBRUc7QUFFSCxNQUFNLE9BQU8sY0FBYztJQU16Qjs7OztPQUlHO0lBQ0ssTUFBTSxDQUFDLHFCQUFxQjtRQUNsQyxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLEdBQUcsQ0FBQyxTQUFTLEdBQUc7Ozs0QkFHUSxDQUFDO1FBQ3pCLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxVQUE0QixDQUFDO1FBQy9DLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLGNBQWMsQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDO1FBQ3RFLGNBQWMsQ0FBQyxlQUFlLEdBQUcsS0FBSyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQ3pFLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBVyxzQkFBc0I7UUFDL0IsSUFBSSxjQUFjLENBQUMsY0FBYyxLQUFLLFNBQVMsRUFBRTtZQUMvQyxjQUFjLENBQUMscUJBQXFCLEVBQUUsQ0FBQztTQUN4QztRQUNELE9BQU8sY0FBYyxDQUFDLGNBQWUsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQVcseUJBQXlCO1FBQ2xDLElBQUksY0FBYyxDQUFDLGVBQWUsS0FBSyxTQUFTLEVBQUU7WUFDaEQsY0FBYyxDQUFDLHFCQUFxQixFQUFFLENBQUM7U0FDeEM7UUFDRCxPQUFPLGNBQWMsQ0FBQyxlQUFnQixDQUFDO0lBQ3pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsK0JBQStCO0lBQ3hCLG1CQUFtQixDQUFDLE9BQW9CO1FBQzdDLE9BQU8sT0FBTyxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO0lBQ3JELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsK0JBQStCO0lBQ3hCLHFCQUFxQixDQUFDLE9BQW9CO1FBQy9DLE9BQU8sT0FBTyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDO0lBQ25ELENBQUM7O0FBakVELDJFQUEyRTtBQUMzRSx5REFBeUQ7QUFDekQ7Ozs7V0FBeUMsU0FBUztHQUFDO0FBQ25EOzs7O1dBQTBDLFNBQVM7R0FBQzs7Ozs7aUdBSnpDLGNBQWM7Ozs7OztvR0FBZCxjQUFjLGNBREQsTUFBTTs7NEZBQ25CLGNBQWM7a0JBRDFCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG4vKipcbiAqIFNlcnZpY2UgcHJvdmlkaW5nIHNjcm9sbGluZy1yZWxhdGVkIHV0aWxpdGllcy5cbiAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiAncm9vdCcgfSlcbmV4cG9ydCBjbGFzcyBTY3JvbGxiYXJVdGlscyB7XG4gIC8vIE9ubHkgY29tcHV0ZSBzaXplcyBvbmNlICh0aGlzIGFzc3VtZXMgdGhhdCBicm93c2VyIHNjcm9sbGJhciBzaXplcyBkb24ndFxuICAvLyBjaGFuZ2Ugb3ZlciB0aW1lLCB3aGljaCBzZWVtcyBsaWtlIGEgdmFsaWQgYXNzdW1wdGlvbilcbiAgcHJpdmF0ZSBzdGF0aWMgc2Nyb2xsYmFyV2lkdGg/OiBudW1iZXIgPSB1bmRlZmluZWQ7XG4gIHByaXZhdGUgc3RhdGljIHNjcm9sbGJhckhlaWdodD86IG51bWJlciA9IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQ29tcHV0ZXMgdGhlIHdpZHRoL2hlaWdodCAoaW4gcHgpIG9mIHZlcnRpY2FsL2hvcml6b250YWwgc2Nyb2xsYmFycyBpbiB0aGVcbiAgICogdXNlcidzIGJyb3dzZXIgYW5kIGNhY2hlcyB0aGUgcmVzdWx0cy4gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgZXZlciBiZVxuICAgKiBjYWxsZWQgb25jZS5cbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGNvbXB1dGVTY3JvbGxiYXJTaXplcygpOiB2b2lkIHtcbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBkaXYuaW5uZXJIVE1MID0gYDxkaXYgc3R5bGU9XCJvdmVyZmxvdzphdXRvOyBwb3NpdGlvbjphYnNvbHV0ZTsgdG9wOjA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDoxMDBweDsgaGVpZ2h0OjEwMHB4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2lkdGg6MjAwcHg7IGhlaWdodDoyMDBweDtcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgIDwvZGl2PmA7XG4gICAgY29uc3QgY2hpbGQgPSBkaXYuZmlyc3RDaGlsZCBhcyBIVE1MRGl2RWxlbWVudDtcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdik7XG4gICAgU2Nyb2xsYmFyVXRpbHMuc2Nyb2xsYmFyV2lkdGggPSBjaGlsZC5vZmZzZXRXaWR0aCAtIGNoaWxkLmNsaWVudFdpZHRoO1xuICAgIFNjcm9sbGJhclV0aWxzLnNjcm9sbGJhckhlaWdodCA9IGNoaWxkLm9mZnNldEhlaWdodCAtIGNoaWxkLmNsaWVudEhlaWdodDtcbiAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGRpdik7XG4gIH1cblxuICAvKipcbiAgICogV2lkdGggKGluIHB4KSBvZiBhIHZlcnRpY2FsIHNjcm9sbGJhciBpbiB0aGUgdXNlcidzIGJyb3dzZXIuIFRoaXMgdmFsdWUgaXNcbiAgICogb25seSBjb21wdXRlZCBvbmNlIGFuZCBjYWNoZWQgZm9yIHN1YnNlcXVlbnQgY2FsbHMuXG4gICAqIEByZXR1cm5zIFdpZHRoIG9mIHRoZSB2ZXJ0aWNhbCBzY3JvbGxiYXIgaW4gdGhlIHVzZXIncyBicm93c2VyLlxuICAgKi9cbiAgcHVibGljIGdldCB2ZXJ0aWNhbFNjcm9sbGJhcldpZHRoKCk6IG51bWJlciB7XG4gICAgaWYgKFNjcm9sbGJhclV0aWxzLnNjcm9sbGJhcldpZHRoID09PSB1bmRlZmluZWQpIHtcbiAgICAgIFNjcm9sbGJhclV0aWxzLmNvbXB1dGVTY3JvbGxiYXJTaXplcygpO1xuICAgIH1cbiAgICByZXR1cm4gU2Nyb2xsYmFyVXRpbHMuc2Nyb2xsYmFyV2lkdGghO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlaWdodCAoaW4gcHgpIG9mIGEgaG9yaXpvbnRhbCBzY3JvbGxiYXIgaW4gdGhlIHVzZXIncyBicm93c2VyLiBUaGlzIHZhbHVlXG4gICAqIGlzIG9ubHkgY29tcHV0ZWQgb25jZSBhbmQgY2FjaGVkIGZvciBzdWJzZXF1ZW50IGNhbGxzLlxuICAgKiBAcmV0dXJucyBIZWlnaHQgb2YgdGhlIGhvcml6b250YWwgc2Nyb2xsYmFyIGluIHRoZSB1c2VyJ3MgYnJvd3Nlci5cbiAgICovXG4gIHB1YmxpYyBnZXQgaG9yaXpvbnRhbFNjcm9sbGJhckhlaWdodCgpOiBudW1iZXIge1xuICAgIGlmIChTY3JvbGxiYXJVdGlscy5zY3JvbGxiYXJIZWlnaHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgU2Nyb2xsYmFyVXRpbHMuY29tcHV0ZVNjcm9sbGJhclNpemVzKCk7XG4gICAgfVxuICAgIHJldHVybiBTY3JvbGxiYXJVdGlscy5zY3JvbGxiYXJIZWlnaHQhO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSBnaXZlbiBET00gZWxlbWVudCBoYXMgYSB2ZXJ0aWNhbCBzY3JvbGxiYXIuXG4gICAqIEBwYXJhbSBlbGVtZW50IEVsZW1lbnQgdG8gY2hlY2sgZm9yIHZlcnRpY2FsIHNjcm9sbGJhci5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgcHJvdmlkZWQgZWxlbWVudCBoYXMgYSB2ZXJ0aWNhbCBzY3JvbGxiYXIuXG4gICAqL1xuICAvLyBGSVhNRTogVW5yZWxpYWJsZSBpbiBJRS9FZGdlXG4gIHB1YmxpYyBoYXNWZXJ0aWNhbE92ZXJmbG93KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGVsZW1lbnQuc2Nyb2xsSGVpZ2h0ID4gZWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBhIGdpdmVuIERPTSBlbGVtZW50IGhhcyBhIGhvcml6b250YWwgc2Nyb2xsYmFyLlxuICAgKiBAcGFyYW0gZWxlbWVudCBFbGVtZW50IHRvIGNoZWNrIGZvciBob3Jpem9udGFsIHNjcm9sbGJhci5cbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgcHJvdmlkZWQgZWxlbWVudCBoYXMgYSBob3Jpem9udGFsIHNjcm9sbGJhci5cbiAgICovXG4gIC8vIEZJWE1FOiBVbnJlbGlhYmxlIGluIElFL0VkZ2VcbiAgcHVibGljIGhhc0hvcml6b250YWxPdmVyZmxvdyhlbGVtZW50OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBlbGVtZW50LnNjcm9sbFdpZHRoID4gZWxlbWVudC5jbGllbnRXaWR0aDtcbiAgfVxufVxuIl19