{"version":3,"file":"style.mjs","names":[],"sources":["../../../../../packages/utils/dom/style.ts"],"sourcesContent":["import { isNumber, isObject, isString, isStringNumber } from '../types'\nimport { isClient } from '../browser'\nimport { camelize } from '../strings'\nimport { entriesOf, keysOf } from '../objects'\nimport { debugWarn } from '../error'\nimport { isShadowRoot } from './aria'\n\nimport type { CSSProperties } from 'vue'\n\nconst SCOPE = 'utils/dom/style'\n\nexport const classNameToArray = (cls = '') =>\n  cls.split(' ').filter((item) => !!item.trim())\n\nexport const hasClass = (el: Element, cls: string): boolean => {\n  if (!el || !cls) return false\n  if (cls.includes(' ')) throw new Error('className should not contain space.')\n  return el.classList.contains(cls)\n}\n\nexport const addClass = (el: Element, cls: string) => {\n  if (!el || !cls.trim()) return\n  el.classList.add(...classNameToArray(cls))\n}\n\nexport const removeClass = (el: Element, cls: string) => {\n  if (!el || !cls.trim()) return\n  el.classList.remove(...classNameToArray(cls))\n}\n\nexport const getStyle = (\n  element: HTMLElement,\n  styleName: keyof CSSProperties\n): string => {\n  if (!isClient || !element || !styleName || isShadowRoot(element)) return ''\n\n  let key = camelize(styleName)\n  if (key === 'float') key = 'cssFloat'\n  try {\n    const style = (element.style as any)[key]\n    if (style) return style\n    const computed: any = document.defaultView?.getComputedStyle(element, '')\n    return computed ? computed[key] : ''\n  } catch {\n    return (element.style as any)[key]\n  }\n}\n\nexport const setStyle = (\n  element: HTMLElement,\n  styleName: CSSProperties | keyof CSSProperties,\n  value?: string | number\n) => {\n  if (!element || !styleName) return\n\n  if (isObject(styleName)) {\n    entriesOf(styleName).forEach(([prop, value]) =>\n      setStyle(element, prop, value)\n    )\n  } else {\n    const key: any = camelize(styleName)\n    element.style[key] = value as any\n  }\n}\n\nexport const removeStyle = (\n  element: HTMLElement,\n  style: CSSProperties | keyof CSSProperties\n) => {\n  if (!element || !style) return\n\n  if (isObject(style)) {\n    keysOf(style).forEach((prop) => removeStyle(element, prop))\n  } else {\n    setStyle(element, style, '')\n  }\n}\n\nexport function addUnit(value?: string | number, defaultUnit = 'px') {\n  if (!value && value !== 0) return ''\n  if (isNumber(value) || isStringNumber(value)) {\n    return `${value}${defaultUnit}`\n  } else if (isString(value)) {\n    return value\n  }\n  debugWarn(SCOPE, 'binding value must be a string or number')\n}\n"],"mappings":";;;;;;;AASA,MAAM,QAAQ;AAEd,MAAa,oBAAoB,MAAM,OACrC,IAAI,MAAM,GAAG,CAAC,CAAC,QAAQ,SAAS,CAAC,CAAC,KAAK,KAAK,CAAC;AAE/C,MAAa,YAAY,IAAa,QAAyB;CAC7D,IAAI,CAAC,MAAM,CAAC,KAAK,OAAO;CACxB,IAAI,IAAI,SAAS,GAAG,GAAG,MAAM,IAAI,MAAM,qCAAqC;CAC5E,OAAO,GAAG,UAAU,SAAS,GAAG;AAClC;AAEA,MAAa,YAAY,IAAa,QAAgB;CACpD,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,GAAG;CACxB,GAAG,UAAU,IAAI,GAAG,iBAAiB,GAAG,CAAC;AAC3C;AAEA,MAAa,eAAe,IAAa,QAAgB;CACvD,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,GAAG;CACxB,GAAG,UAAU,OAAO,GAAG,iBAAiB,GAAG,CAAC;AAC9C;AAEA,MAAa,YACX,SACA,cACW;CACX,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,aAAa,aAAa,OAAO,GAAG,OAAO;CAEzE,IAAI,MAAM,SAAS,SAAS;CAC5B,IAAI,QAAQ,SAAS,MAAM;CAC3B,IAAI;EACF,MAAM,QAAS,QAAQ,MAAc;EACrC,IAAI,OAAO,OAAO;EAClB,MAAM,WAAgB,SAAS,aAAa,iBAAiB,SAAS,EAAE;EACxE,OAAO,WAAW,SAAS,OAAO;CACpC,QAAQ;EACN,OAAQ,QAAQ,MAAc;CAChC;AACF;AAEA,MAAa,YACX,SACA,WACA,UACG;CACH,IAAI,CAAC,WAAW,CAAC,WAAW;CAE5B,IAAI,SAAS,SAAS,GACpB,UAAU,SAAS,CAAC,CAAC,SAAS,CAAC,MAAM,WACnC,SAAS,SAAS,MAAM,KAAK,CAC/B;MACK;EACL,MAAM,MAAW,SAAS,SAAS;EACnC,QAAQ,MAAM,OAAO;CACvB;AACF;AAEA,MAAa,eACX,SACA,UACG;CACH,IAAI,CAAC,WAAW,CAAC,OAAO;CAExB,IAAI,SAAS,KAAK,GAChB,OAAO,KAAK,CAAC,CAAC,SAAS,SAAS,YAAY,SAAS,IAAI,CAAC;MAE1D,SAAS,SAAS,OAAO,EAAE;AAE/B;AAEA,SAAgB,QAAQ,OAAyB,cAAc,MAAM;CACnE,IAAI,CAAC,SAAS,UAAU,GAAG,OAAO;CAClC,IAAI,SAAS,KAAK,KAAK,eAAe,KAAK,GACzC,OAAO,GAAG,QAAQ;MACb,IAAI,SAAS,KAAK,GACvB,OAAO;CAET,UAAU,OAAO,0CAA0C;AAC7D"}