UNPKG

ivue-material-plus

Version:

A high quality UI components Library with Vue.js

115 lines (111 loc) 3.63 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); const HIDDEN_TEXTAREA_STYLE = ` min-height:0 !important; max-height:none !important; height:0 !important; visibility:hidden !important; overflow:hidden !important; position:absolute !important; z-index:-1000 !important; top:0 !important; right:0 !important `; const SIZING_STYLE = [ "letter-spacing", "line-height", "padding-top", "padding-bottom", "font-family", "font-weight", "font-size", "text-rendering", "text-transform", "width", "text-indent", "padding-left", "padding-right", "border-width", "box-sizing" ]; const computedStyleCache = {}; let hiddenTextarea; function calculateNodeStyling(node, useCache = false) { const nodeRef = node.getAttribute("id") || node.getAttribute("data-reactid") || node.getAttribute("name"); if (useCache && computedStyleCache[nodeRef]) { return computedStyleCache[nodeRef]; } const style = window.getComputedStyle(node); const boxSizing = style.getPropertyValue("box-sizing") || style.getPropertyValue("-moz-box-sizing") || style.getPropertyValue("-webkit-box-sizing"); const paddingSize = parseFloat(style.getPropertyValue("padding-bottom")) + parseFloat(style.getPropertyValue("padding-top")); const borderSize = parseFloat(style.getPropertyValue("border-bottom-width")) + parseFloat(style.getPropertyValue("border-top-width")); const sizingStyle = SIZING_STYLE.map( (name) => `${name}:${style.getPropertyValue(name)}` ).join(";"); const nodeInfo = { sizingStyle, paddingSize, borderSize, boxSizing }; if (useCache && nodeRef) { computedStyleCache[nodeRef] = nodeInfo; } return nodeInfo; } const calcTextareaHeight = (uiTextNode, minRows = null, maxRows = null, useCache = false) => { if (!hiddenTextarea) { hiddenTextarea = document.createElement("textarea"); document.body.appendChild(hiddenTextarea); } if (uiTextNode.getAttribute("wrap")) { hiddenTextarea.setAttribute("wrap", uiTextNode.getAttribute("wrap")); } else { hiddenTextarea.removeAttribute("wrap"); } const { paddingSize, borderSize, boxSizing, sizingStyle } = calculateNodeStyling(uiTextNode, useCache); hiddenTextarea.setAttribute( "style", `${sizingStyle};${HIDDEN_TEXTAREA_STYLE}` ); hiddenTextarea.value = uiTextNode.value || uiTextNode.placeholder || ""; let minHeight = Number.MIN_SAFE_INTEGER; let maxHeight = Number.MAX_SAFE_INTEGER; let height = hiddenTextarea.scrollHeight; let overflowY; if (boxSizing === "border-box") { height = height + borderSize; } else if (boxSizing === "content-box") { height = height - paddingSize; } if (minRows !== null || maxRows !== null) { hiddenTextarea.value = " "; const singleRowHeight = hiddenTextarea.scrollHeight - paddingSize; if (minRows !== null) { minHeight = singleRowHeight * minRows; if (boxSizing === "border-box") { minHeight = minHeight + paddingSize + borderSize; } height = Math.max(minHeight, height); } if (maxRows !== null) { maxHeight = singleRowHeight * maxRows; if (boxSizing === "border-box") { maxHeight = maxHeight + paddingSize + borderSize; } overflowY = height > maxHeight ? "" : "hidden"; height = Math.min(maxHeight, height); } } if (!maxRows) { overflowY = "hidden"; } return { height: `${height}px`, minHeight: `${minHeight}px`, maxHeight: `${maxHeight}px`, overflowY }; }; exports.calcTextareaHeight = calcTextareaHeight; //# sourceMappingURL=calc-textarea-height.js.map