@nova-ui/bits
Version:
SolarWinds Nova Framework
110 lines • 14.6 kB
JavaScript
// © 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=