element-plus
Version:
A Component Library for Vue 3
1 lines • 5.2 kB
Source Map (JSON)
{"version":3,"file":"utils.mjs","names":[],"sources":["../../../../../../packages/components/input/src/utils.ts"],"sourcesContent":["import { isFirefox, isNumber } from '@element-plus/utils'\n\nlet hiddenTextarea: HTMLTextAreaElement | undefined = undefined\n\nconst HIDDEN_STYLE = {\n height: '0',\n visibility: 'hidden',\n overflow: isFirefox() ? '' : 'hidden',\n position: 'absolute',\n 'z-index': '-1000',\n top: '0',\n right: '0',\n}\n\nconst CONTEXT_STYLE = [\n 'letter-spacing',\n 'line-height',\n 'padding-top',\n 'padding-bottom',\n 'font-family',\n 'font-weight',\n 'font-size',\n 'text-rendering',\n 'text-transform',\n 'width',\n 'text-indent',\n 'padding-left',\n 'padding-right',\n 'border-width',\n 'box-sizing',\n 'word-break',\n]\n\ntype NodeStyle = {\n contextStyle: string[][]\n boxSizing: string\n paddingSize: number\n borderSize: number\n}\n\ntype TextAreaHeight = {\n height: string\n minHeight?: string\n}\n\nexport const looseToNumber = (val: any): any => {\n const n = Number.parseFloat(val)\n return Number.isNaN(n) ? val : n\n}\n\nfunction calculateNodeStyling(targetElement: Element): NodeStyle {\n const style = window.getComputedStyle(targetElement)\n\n const boxSizing = style.getPropertyValue('box-sizing')\n\n const paddingSize =\n Number.parseFloat(style.getPropertyValue('padding-bottom')) +\n Number.parseFloat(style.getPropertyValue('padding-top'))\n\n const borderSize =\n Number.parseFloat(style.getPropertyValue('border-bottom-width')) +\n Number.parseFloat(style.getPropertyValue('border-top-width'))\n\n const contextStyle = CONTEXT_STYLE.map((name) => [\n name,\n style.getPropertyValue(name),\n ])\n\n return { contextStyle, paddingSize, borderSize, boxSizing }\n}\n\nexport function calcTextareaHeight(\n targetElement: HTMLTextAreaElement,\n minRows = 1,\n maxRows?: number\n): TextAreaHeight {\n if (!hiddenTextarea) {\n hiddenTextarea = document.createElement('textarea')\n let hostNode = document.body\n // #23575\n if (!isFirefox() && targetElement.parentNode) {\n hostNode = targetElement.parentNode as HTMLElement\n }\n hostNode.appendChild(hiddenTextarea)\n }\n\n const { paddingSize, borderSize, boxSizing, contextStyle } =\n calculateNodeStyling(targetElement)\n\n contextStyle.forEach(([key, value]) =>\n hiddenTextarea?.style.setProperty(key, value)\n )\n\n Object.entries(HIDDEN_STYLE).forEach(([key, value]) =>\n hiddenTextarea?.style.setProperty(key, value, 'important')\n )\n\n hiddenTextarea.value = targetElement.value || targetElement.placeholder || ''\n\n let height = hiddenTextarea.scrollHeight\n const result = {} as TextAreaHeight\n\n if (boxSizing === 'border-box') {\n height = height + borderSize\n } else if (boxSizing === 'content-box') {\n height = height - paddingSize\n }\n\n hiddenTextarea.value = ''\n const singleRowHeight = hiddenTextarea.scrollHeight - paddingSize\n\n if (isNumber(minRows)) {\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 (isNumber(maxRows)) {\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?.removeChild(hiddenTextarea)\n hiddenTextarea = undefined\n\n return result\n}\n"],"mappings":";;;;AAEA,IAAI,iBAAkD;AAEtD,MAAM,eAAe;CACnB,QAAQ;CACR,YAAY;CACZ,UAAU,WAAW,GAAG,KAAK;CAC7B,UAAU;CACV,WAAW;CACX,KAAK;CACL,OAAO;CACR;AAED,MAAM,gBAAgB;CACpB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAcD,MAAa,iBAAiB,QAAkB;CAC9C,MAAM,IAAI,OAAO,WAAW,IAAI;AAChC,QAAO,OAAO,MAAM,EAAE,GAAG,MAAM;;AAGjC,SAAS,qBAAqB,eAAmC;CAC/D,MAAM,QAAQ,OAAO,iBAAiB,cAAc;CAEpD,MAAM,YAAY,MAAM,iBAAiB,aAAa;CAEtD,MAAM,cACJ,OAAO,WAAW,MAAM,iBAAiB,iBAAiB,CAAC,GAC3D,OAAO,WAAW,MAAM,iBAAiB,cAAc,CAAC;CAE1D,MAAM,aACJ,OAAO,WAAW,MAAM,iBAAiB,sBAAsB,CAAC,GAChE,OAAO,WAAW,MAAM,iBAAiB,mBAAmB,CAAC;AAO/D,QAAO;EAAE,cALY,cAAc,KAAK,SAAS,CAC/C,MACA,MAAM,iBAAiB,KAAK,CAC7B,CAAC;EAEqB;EAAa;EAAY;EAAW;;AAG7D,SAAgB,mBACd,eACA,UAAU,GACV,SACgB;AAChB,KAAI,CAAC,gBAAgB;AACnB,mBAAiB,SAAS,cAAc,WAAW;EACnD,IAAI,WAAW,SAAS;AAExB,MAAI,CAAC,WAAW,IAAI,cAAc,WAChC,YAAW,cAAc;AAE3B,WAAS,YAAY,eAAe;;CAGtC,MAAM,EAAE,aAAa,YAAY,WAAW,iBAC1C,qBAAqB,cAAc;AAErC,cAAa,SAAS,CAAC,KAAK,WAC1B,gBAAgB,MAAM,YAAY,KAAK,MAAM,CAC9C;AAED,QAAO,QAAQ,aAAa,CAAC,SAAS,CAAC,KAAK,WAC1C,gBAAgB,MAAM,YAAY,KAAK,OAAO,YAAY,CAC3D;AAED,gBAAe,QAAQ,cAAc,SAAS,cAAc,eAAe;CAE3E,IAAI,SAAS,eAAe;CAC5B,MAAM,SAAS,EAAE;AAEjB,KAAI,cAAc,aAChB,UAAS,SAAS;UACT,cAAc,cACvB,UAAS,SAAS;AAGpB,gBAAe,QAAQ;CACvB,MAAM,kBAAkB,eAAe,eAAe;AAEtD,KAAI,SAAS,QAAQ,EAAE;EACrB,IAAI,YAAY,kBAAkB;AAClC,MAAI,cAAc,aAChB,aAAY,YAAY,cAAc;AAExC,WAAS,KAAK,IAAI,WAAW,OAAO;AACpC,SAAO,YAAY,GAAG,UAAU;;AAElC,KAAI,SAAS,QAAQ,EAAE;EACrB,IAAI,YAAY,kBAAkB;AAClC,MAAI,cAAc,aAChB,aAAY,YAAY,cAAc;AAExC,WAAS,KAAK,IAAI,WAAW,OAAO;;AAEtC,QAAO,SAAS,GAAG,OAAO;AAC1B,gBAAe,YAAY,YAAY,eAAe;AACtD,kBAAiB;AAEjB,QAAO"}