{"version":3,"file":"calc-textarea-height.mjs","sources":["../../../../../../packages/components/input/src/calc-textarea-height.ts"],"sourcesContent":["import { isNumber } from '@sgui-plus/utils/util'\r\n\r\nlet hiddenTextarea: HTMLTextAreaElement | undefined = undefined\r\n\r\nconst HIDDEN_STYLE = `\r\n  height:0 !important;\r\n  visibility:hidden !important;\r\n  overflow:hidden !important;\r\n  position:absolute !important;\r\n  z-index:-1000 !important;\r\n  top:0 !important;\r\n  right:0 !important;\r\n`\r\n\r\nconst CONTEXT_STYLE = [\r\n  'letter-spacing',\r\n  'line-height',\r\n  'padding-top',\r\n  'padding-bottom',\r\n  'font-family',\r\n  'font-weight',\r\n  'font-size',\r\n  'text-rendering',\r\n  'text-transform',\r\n  'width',\r\n  'text-indent',\r\n  'padding-left',\r\n  'padding-right',\r\n  'border-width',\r\n  'box-sizing',\r\n]\r\n\r\ntype NodeStyle = {\r\n  contextStyle: string\r\n  boxSizing: string\r\n  paddingSize: number\r\n  borderSize: number\r\n}\r\n\r\ntype TextAreaHeight = {\r\n  height: string\r\n  minHeight?: string\r\n}\r\n\r\nfunction calculateNodeStyling(targetElement: Element): NodeStyle {\r\n  const style = window.getComputedStyle(targetElement)\r\n\r\n  const boxSizing = style.getPropertyValue('box-sizing')\r\n\r\n  const paddingSize =\r\n    parseFloat(style.getPropertyValue('padding-bottom')) +\r\n    parseFloat(style.getPropertyValue('padding-top'))\r\n\r\n  const borderSize =\r\n    parseFloat(style.getPropertyValue('border-bottom-width')) +\r\n    parseFloat(style.getPropertyValue('border-top-width'))\r\n\r\n  const contextStyle = CONTEXT_STYLE.map(\r\n    (name) => `${name}:${style.getPropertyValue(name)}`\r\n  ).join(';')\r\n\r\n  return { contextStyle, paddingSize, borderSize, boxSizing }\r\n}\r\n\r\nexport function calcTextareaHeight(\r\n  targetElement: HTMLTextAreaElement,\r\n  minRows = 1,\r\n  maxRows?: number\r\n): TextAreaHeight {\r\n  if (!hiddenTextarea) {\r\n    hiddenTextarea = document.createElement('textarea')\r\n    document.body.appendChild(hiddenTextarea)\r\n  }\r\n\r\n  const { paddingSize, borderSize, boxSizing, contextStyle } =\r\n    calculateNodeStyling(targetElement)\r\n\r\n  hiddenTextarea.setAttribute('style', `${contextStyle};${HIDDEN_STYLE}`)\r\n  hiddenTextarea.value = targetElement.value || targetElement.placeholder || ''\r\n\r\n  let height = hiddenTextarea.scrollHeight\r\n  const result = {} as TextAreaHeight\r\n\r\n  if (boxSizing === 'border-box') {\r\n    height = height + borderSize\r\n  } else if (boxSizing === 'content-box') {\r\n    height = height - paddingSize\r\n  }\r\n\r\n  hiddenTextarea.value = ''\r\n  const singleRowHeight = hiddenTextarea.scrollHeight - paddingSize\r\n\r\n  if (isNumber(minRows)) {\r\n    let minHeight = singleRowHeight * minRows\r\n    if (boxSizing === 'border-box') {\r\n      minHeight = minHeight + paddingSize + borderSize\r\n    }\r\n    height = Math.max(minHeight, height)\r\n    result.minHeight = `${minHeight}px`\r\n  }\r\n  if (isNumber(maxRows)) {\r\n    let maxHeight = singleRowHeight * maxRows\r\n    if (boxSizing === 'border-box') {\r\n      maxHeight = maxHeight + paddingSize + borderSize\r\n    }\r\n    height = Math.min(maxHeight, height)\r\n  }\r\n  result.height = `${height}px`\r\n  hiddenTextarea.parentNode?.removeChild(hiddenTextarea)\r\n  hiddenTextarea = undefined\r\n\r\n  return result\r\n}\r\n"],"names":[],"mappings":"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"}