{"version":3,"file":"utils.mjs","sources":["../../../../../../packages/components/input/src/utils.ts"],"sourcesContent":["import { isNumber } from '@bigin/utils'\n\nlet hiddenTextarea: HTMLTextAreaElement | undefined = undefined\n\nconst HIDDEN_STYLE = `\n  height:0 !important;\n  visibility:hidden !important;\n  overflow:hidden !important;\n  position:absolute !important;\n  z-index:-1000 !important;\n  top:0 !important;\n  right:0 !important;\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]\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\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(\n    (name) => `${name}:${style.getPropertyValue(name)}`\n  ).join(';')\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    document.body.appendChild(hiddenTextarea)\n  }\n\n  const { paddingSize, borderSize, boxSizing, contextStyle } =\n    calculateNodeStyling(targetElement)\n\n  hiddenTextarea.setAttribute('style', `${contextStyle};${HIDDEN_STYLE}`)\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"],"names":[],"mappings":"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"}