UNPKG

@nova-ui/bits

Version:

SolarWinds Nova Framework

110 lines 14.6 kB
// © 2023 SolarWinds Worldwide, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import { Inject, Injectable } from "@angular/core"; import { WindowToken } from "./window"; import * as i0 from "@angular/core"; const properties = [ "boxSizing", "width", "height", "overflowX", "overflowY", "borderTopWidth", "borderRightWidth", "borderBottomWidth", "borderLeftWidth", "paddingTop", "paddingRight", "paddingBottom", "paddingLeft", "fontStyle", "fontVariant", "fontWeight", "fontStretch", "fontSize", "lineHeight", "fontFamily", "textAlign", "textTransform", "textIndent", "textDecoration", "letterSpacing", "wordSpacing", ]; export class FreeTypeQueryUtilsService { constructor(window) { this.window = window; } getTextareaCaretCoordinates(element, position) { const isFirefox = !(this.window.mozInnerScreenX == null); let mirrorDiv = this.window.document.getElementById(element.nodeName + "--mirror-div"); if (!mirrorDiv) { mirrorDiv = this.window.document.createElement("div"); mirrorDiv.id = element.nodeName + "--mirror-div"; this.window.document.body.appendChild(mirrorDiv); } const style = mirrorDiv.style; const computed = getComputedStyle(element); style.whiteSpace = "pre-wrap"; style.position = "absolute"; style.top = element.offsetTop + parseInt(computed.borderTopWidth, 10) + "px"; style.left = "-400px"; properties.forEach((prop) => { style[prop] = computed[prop]; }); if (isFirefox) { style.width = parseInt(computed.width, 10) - 2 + "px"; // Firefox adds 2 pixels to the padding - https://bugzilla.mozilla.org/show_bug.cgi?id=753662 // Firefox lies about the overflow property for textareas: // https://bugzilla.mozilla.org/show_bug.cgi?id=984275 if (element.scrollHeight > parseInt(computed.height, 10)) { style.overflowY = "scroll"; } } else { style.overflow = "hidden"; } mirrorDiv.textContent = element.value.substring(0, position); const span = this.window.document.createElement("span"); span.textContent = element.value.substring(position) || "."; span.style.backgroundColor = "lightgrey"; mirrorDiv.appendChild(span); const scrollTop = element.scrollTop; const coordinates = { top: span.offsetTop + parseInt(computed["borderTopWidth"], 10) - scrollTop, left: span.offsetLeft + parseInt(computed["borderLeftWidth"], 10), scrollTop, }; this.window.document.body.removeChild(mirrorDiv); return coordinates; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FreeTypeQueryUtilsService, deps: [{ token: WindowToken }], target: i0.ɵɵFactoryTarget.Injectable }); } static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FreeTypeQueryUtilsService }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FreeTypeQueryUtilsService, decorators: [{ type: Injectable }], ctorParameters: () => [{ type: undefined, decorators: [{ type: Inject, args: [WindowToken] }] }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJlZXR5cGUtcXVlcnktdXRpbHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZnJlZXR5cGUtcXVlcnktYnVpbGRlci9oZWxwZXJzL2ZyZWV0eXBlLXF1ZXJ5LXV0aWxzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseURBQXlEO0FBQ3pELEVBQUU7QUFDRiwrRUFBK0U7QUFDL0UsNEVBQTRFO0FBQzVFLDhFQUE4RTtBQUM5RSwrRUFBK0U7QUFDL0UsOEVBQThFO0FBQzlFLDREQUE0RDtBQUM1RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLHVEQUF1RDtBQUN2RCxFQUFFO0FBQ0YsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUM1RSwrRUFBK0U7QUFDL0UsMEVBQTBFO0FBQzFFLGlGQUFpRjtBQUNqRiw2RUFBNkU7QUFDN0UsaUJBQWlCO0FBRWpCLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7O0FBR3ZDLE1BQU0sVUFBVSxHQUFHO0lBQ2YsV0FBVztJQUNYLE9BQU87SUFDUCxRQUFRO0lBQ1IsV0FBVztJQUNYLFdBQVc7SUFFWCxnQkFBZ0I7SUFDaEIsa0JBQWtCO0lBQ2xCLG1CQUFtQjtJQUNuQixpQkFBaUI7SUFFakIsWUFBWTtJQUNaLGNBQWM7SUFDZCxlQUFlO0lBQ2YsYUFBYTtJQUViLFdBQVc7SUFDWCxhQUFhO0lBQ2IsWUFBWTtJQUNaLGFBQWE7SUFDYixVQUFVO0lBQ1YsWUFBWTtJQUNaLFlBQVk7SUFFWixXQUFXO0lBQ1gsZUFBZTtJQUNmLFlBQVk7SUFDWixnQkFBZ0I7SUFFaEIsZUFBZTtJQUNmLGFBQWE7Q0FDaEIsQ0FBQztBQUtGLE1BQU0sT0FBTyx5QkFBeUI7SUFFbEMsWUFBaUMsTUFBVztRQUN4QyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQWdC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LENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFakQsT0FBTyxXQUFXLENBQUM7SUFDdkIsQ0FBQzsrR0FsRVEseUJBQXlCLGtCQUVkLFdBQVc7bUhBRnRCLHlCQUF5Qjs7NEZBQXpCLHlCQUF5QjtrQkFEckMsVUFBVTs7MEJBR00sTUFBTTsyQkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiLy8gwqkgMjAyMyBTb2xhcldpbmRzIFdvcmxkd2lkZSwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyAgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vICBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5cbmltcG9ydCB7IFdpbmRvd1Rva2VuIH0gZnJvbSBcIi4vd2luZG93XCI7XG5pbXBvcnQgeyBDYXJldENvb3JkaW5hdGVzIH0gZnJvbSBcIi4uL21vZGVsc1wiO1xuXG5jb25zdCBwcm9wZXJ0aWVzID0gW1xuICAgIFwiYm94U2l6aW5nXCIsXG4gICAgXCJ3aWR0aFwiLFxuICAgIFwiaGVpZ2h0XCIsXG4gICAgXCJvdmVyZmxvd1hcIixcbiAgICBcIm92ZXJmbG93WVwiLFxuXG4gICAgXCJib3JkZXJUb3BXaWR0aFwiLFxuICAgIFwiYm9yZGVyUmlnaHRXaWR0aFwiLFxuICAgIFwiYm9yZGVyQm90dG9tV2lkdGhcIixcbiAgICBcImJvcmRlckxlZnRXaWR0aFwiLFxuXG4gICAgXCJwYWRkaW5nVG9wXCIsXG4gICAgXCJwYWRkaW5nUmlnaHRcIixcbiAgICBcInBhZGRpbmdCb3R0b21cIixcbiAgICBcInBhZGRpbmdMZWZ0XCIsXG5cbiAgICBcImZvbnRTdHlsZVwiLFxuICAgIFwiZm9udFZhcmlhbnRcIixcbiAgICBcImZvbnRXZWlnaHRcIixcbiAgICBcImZvbnRTdHJldGNoXCIsXG4gICAgXCJmb250U2l6ZVwiLFxuICAgIFwibGluZUhlaWdodFwiLFxuICAgIFwiZm9udEZhbWlseVwiLFxuXG4gICAgXCJ0ZXh0QWxpZ25cIixcbiAgICBcInRleHRUcmFuc2Zvcm1cIixcbiAgICBcInRleHRJbmRlbnRcIixcbiAgICBcInRleHREZWNvcmF0aW9uXCIsXG5cbiAgICBcImxldHRlclNwYWNpbmdcIixcbiAgICBcIndvcmRTcGFjaW5nXCIsXG5dO1xuXG50eXBlIE91ckNTUyA9IENTU1N0eWxlRGVjbGFyYXRpb24gJiB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRnJlZVR5cGVRdWVyeVV0aWxzU2VydmljZSB7XG4gICAgcHJpdmF0ZSB3aW5kb3c6IFdpbmRvdztcbiAgICBjb25zdHJ1Y3RvcihASW5qZWN0KFdpbmRvd1Rva2VuKSB3aW5kb3c6IGFueSkge1xuICAgICAgICB0aGlzLndpbmRvdyA9IHdpbmRvdyBhcyBXaW5kb3c7XG4gICAgfVxuXG4gICAgZ2V0VGV4dGFyZWFDYXJldENvb3JkaW5hdGVzKFxuICAgICAgICBlbGVtZW50OiBIVE1MVGV4dEFyZWFFbGVtZW50LFxuICAgICAgICBwb3NpdGlvbjogbnVtYmVyXG4gICAgKTogQ2FyZXRDb29yZGluYXRlcyB7XG4gICAgICAgIGNvbnN0IGlzRmlyZWZveDogYm9vbGVhbiA9ICEoXG4gICAgICAgICAgICAodGhpcy53aW5kb3cgYXMgYW55KS5tb3pJbm5lclNjcmVlblggPT0gbnVsbFxuICAgICAgICApO1xuXG4gICAgICAgIGxldCBtaXJyb3JEaXYgPSB0aGlzLndpbmRvdy5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcbiAgICAgICAgICAgIGVsZW1lbnQubm9kZU5hbWUgKyBcIi0tbWlycm9yLWRpdlwiXG4gICAgICAgICk7XG4gICAgICAgIGlmICghbWlycm9yRGl2KSB7XG4gICAgICAgICAgICBtaXJyb3JEaXYgPSB0aGlzLndpbmRvdy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICAgICAgbWlycm9yRGl2LmlkID0gZWxlbWVudC5ub2RlTmFtZSArIFwiLS1taXJyb3ItZGl2XCI7XG4gICAgICAgICAgICB0aGlzLndpbmRvdy5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKG1pcnJvckRpdik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdHlsZTogT3VyQ1NTID0gbWlycm9yRGl2LnN0eWxlO1xuICAgICAgICBjb25zdCBjb21wdXRlZDogT3VyQ1NTID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTtcblxuICAgICAgICBzdHlsZS53aGl0ZVNwYWNlID0gXCJwcmUtd3JhcFwiO1xuICAgICAgICBzdHlsZS5wb3NpdGlvbiA9IFwiYWJzb2x1dGVcIjtcbiAgICAgICAgc3R5bGUudG9wID1cbiAgICAgICAgICAgIGVsZW1lbnQub2Zmc2V0VG9wICsgcGFyc2VJbnQoY29tcHV0ZWQuYm9yZGVyVG9wV2lkdGgsIDEwKSArIFwicHhcIjtcbiAgICAgICAgc3R5bGUubGVmdCA9IFwiLTQwMHB4XCI7XG5cbiAgICAgICAgcHJvcGVydGllcy5mb3JFYWNoKChwcm9wKSA9PiB7XG4gICAgICAgICAgICBzdHlsZVtwcm9wIGFzIGtleW9mIHR5cGVvZiBDU1NTdHlsZURlY2xhcmF0aW9uXSA9IGNvbXB1dGVkW3Byb3BdO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoaXNGaXJlZm94KSB7XG4gICAgICAgICAgICBzdHlsZS53aWR0aCA9IHBhcnNlSW50KGNvbXB1dGVkLndpZHRoLCAxMCkgLSAyICsgXCJweFwiO1xuICAgICAgICAgICAgLy8gRmlyZWZveCBhZGRzIDIgcGl4ZWxzIHRvIHRoZSBwYWRkaW5nIC0gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzUzNjYyXG4gICAgICAgICAgICAvLyBGaXJlZm94IGxpZXMgYWJvdXQgdGhlIG92ZXJmbG93IHByb3BlcnR5IGZvciB0ZXh0YXJlYXM6XG4gICAgICAgICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD05ODQyNzVcbiAgICAgICAgICAgIGlmIChlbGVtZW50LnNjcm9sbEhlaWdodCA+IHBhcnNlSW50KGNvbXB1dGVkLmhlaWdodCwgMTApKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUub3ZlcmZsb3dZID0gXCJzY3JvbGxcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN0eWxlLm92ZXJmbG93ID0gXCJoaWRkZW5cIjtcbiAgICAgICAgfVxuXG4gICAgICAgIG1pcnJvckRpdi50ZXh0Q29udGVudCA9IGVsZW1lbnQudmFsdWUuc3Vic3RyaW5nKDAsIHBvc2l0aW9uKTtcbiAgICAgICAgY29uc3Qgc3BhbiA9IHRoaXMud2luZG93LmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgICBzcGFuLnRleHRDb250ZW50ID0gZWxlbWVudC52YWx1ZS5zdWJzdHJpbmcocG9zaXRpb24pIHx8IFwiLlwiO1xuICAgICAgICBzcGFuLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IFwibGlnaHRncmV5XCI7XG4gICAgICAgIG1pcnJvckRpdi5hcHBlbmRDaGlsZChzcGFuKTtcblxuICAgICAgICBjb25zdCBzY3JvbGxUb3AgPSBlbGVtZW50LnNjcm9sbFRvcDtcbiAgICAgICAgY29uc3QgY29vcmRpbmF0ZXMgPSB7XG4gICAgICAgICAgICB0b3A6XG4gICAgICAgICAgICAgICAgc3Bhbi5vZmZzZXRUb3AgK1xuICAgICAgICAgICAgICAgIHBhcnNlSW50KGNvbXB1dGVkW1wiYm9yZGVyVG9wV2lkdGhcIl0sIDEwKSAtXG4gICAgICAgICAgICAgICAgc2Nyb2xsVG9wLFxuICAgICAgICAgICAgbGVmdDogc3Bhbi5vZmZzZXRMZWZ0ICsgcGFyc2VJbnQoY29tcHV0ZWRbXCJib3JkZXJMZWZ0V2lkdGhcIl0sIDEwKSxcbiAgICAgICAgICAgIHNjcm9sbFRvcCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy53aW5kb3cuZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChtaXJyb3JEaXYpO1xuXG4gICAgICAgIHJldHVybiBjb29yZGluYXRlcztcbiAgICB9XG59XG4iXX0=