UNPKG

tdesign-vue-next

Version:
1 lines 6.95 kB
{"version":3,"file":"calcTextareaHeight.mjs","sources":["../../../../components/textarea/utils/calcTextareaHeight.ts"],"sourcesContent":["/**\n * Thanks to https://github.com/ElemeFE/element/blob/dev/packages/input/src/calcTextareaHeight.js\n */\n\nimport { CSSProperties } from 'vue';\n\ntype RowsType = number | null;\n\nlet hiddenTextarea: HTMLTextAreaElement;\n\nconst HIDDEN_TEXTAREA_STYLE = `\n min-height:0 !important;\n max-height:none !important;\n height:0 !important;\n visibility:hidden !important;\n overflow-y:hidden !important;\n position:absolute !important;\n z-index:-1000 !important;\n top:0 !important;\n right:0 !important\n`;\n\nconst SIZING_PROPS = [\n 'letter-spacing',\n 'line-height',\n 'padding-top',\n 'padding-bottom',\n 'font-family',\n 'font-weight',\n 'font-size',\n 'font-variant',\n 'text-rendering',\n 'text-transform',\n 'width',\n 'text-indent',\n 'padding-left',\n 'padding-right',\n 'border-width',\n 'box-sizing',\n];\n\nfunction calculateNodeStyling(targetElement: HTMLTextAreaElement) {\n if (typeof window === 'undefined' || !targetElement) return;\n\n const style = window.getComputedStyle(targetElement);\n\n const boxSizing =\n style.getPropertyValue('box-sizing') ||\n style.getPropertyValue('-moz-box-sizing') ||\n style.getPropertyValue('-webkit-box-sizing');\n\n const paddingSize =\n parseFloat(style.getPropertyValue('padding-bottom')) + parseFloat(style.getPropertyValue('padding-top'));\n\n const borderSize =\n parseFloat(style.getPropertyValue('border-bottom-width')) + parseFloat(style.getPropertyValue('border-top-width'));\n\n const sizingStyle = SIZING_PROPS.map((name) => `${name}:${style.getPropertyValue(name)}`).join(';');\n\n return {\n sizingStyle,\n paddingSize,\n borderSize,\n boxSizing,\n };\n}\n\nexport function calcTextareaHeight(\n targetElement: HTMLTextAreaElement,\n minRows: RowsType = 1,\n maxRows: RowsType = null,\n) {\n if (!hiddenTextarea) {\n hiddenTextarea = document.createElement('textarea');\n document.body.appendChild(hiddenTextarea);\n }\n\n const { paddingSize, borderSize, boxSizing, sizingStyle } = calculateNodeStyling(targetElement);\n\n hiddenTextarea.setAttribute('style', `${sizingStyle};${HIDDEN_TEXTAREA_STYLE}`);\n hiddenTextarea.value = targetElement.value || targetElement.placeholder || '';\n\n let height = hiddenTextarea.scrollHeight;\n const result: CSSProperties = {};\n\n if (boxSizing === 'border-box') {\n height += borderSize;\n } else if (boxSizing === 'content-box') {\n height -= paddingSize;\n }\n\n hiddenTextarea.value = '';\n const singleRowHeight = hiddenTextarea.scrollHeight - paddingSize;\n\n if (minRows !== null) {\n let minHeight = singleRowHeight * minRows;\n if (boxSizing === 'border-box') {\n minHeight = minHeight + paddingSize + borderSize;\n }\n height = Math.max(minHeight, height);\n result.minHeight = `${minHeight}px`;\n }\n if (maxRows !== null) {\n let maxHeight = singleRowHeight * maxRows;\n if (boxSizing === 'border-box') {\n maxHeight = maxHeight + paddingSize + borderSize;\n }\n height = Math.min(maxHeight, height);\n }\n result.height = `${height}px`;\n hiddenTextarea.parentNode && hiddenTextarea.parentNode.removeChild(hiddenTextarea);\n hiddenTextarea = null;\n return result;\n}\n"],"names":["hiddenTextarea","HIDDEN_TEXTAREA_STYLE","SIZING_PROPS","calculateNodeStyling","targetElement","window","style","getComputedStyle","boxSizing","getPropertyValue","paddingSize","parseFloat","borderSize","sizingStyle","map","name","concat","join","calcTextareaHeight","minRows","arguments","length","undefined","maxRows","document","createElement","body","appendChild","_calculateNodeStyling","setAttribute","value","placeholder","height","scrollHeight","result","singleRowHeight","minHeight","Math","max","maxHeight","min","parentNode","removeChild"],"mappings":"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"}