{"version":3,"file":"index.mjs","sources":[""],"sourcesContent":["import \"./style.pcss\";\r\nimport type {\r\n  ButtonHTMLAttributes,\r\n  MouseEvent,\r\n  ReactElement,\r\n  FC,\r\n} from \"react\";\r\nimport {\r\n  useEffect,\r\n  useState,\r\n} from \"react\";\r\nimport type { IBtn } from \"./config/types\";\r\nimport { constants } from \"../../constants\";\r\nimport type { IComponentBaseProps } from \"../../types/components\";\r\nimport { getExtraSizes } from \"../../utils/getExtraSizes\";\r\nimport { useCN } from \"../../utils/react/useCN\";\r\nimport { Icon } from \"../icon/index\";\r\n\r\nconst fallbackSize = constants.defaultSizes[2];\r\n\r\n/**\r\n * Компонент кнопки\r\n * @returns {ReactElement}\r\n */\r\nconst Btn: FC<IBtn & IComponentBaseProps> = ({\r\n  baseClass = \"btn\",\r\n  href,\r\n  type = \"button\",\r\n  label = \"Кнопка\",\r\n  title,\r\n  isDisabled = false,\r\n  isOutline = false,\r\n  isLight = false,\r\n  extraClasses = {},\r\n  onClick,\r\n  extraAttrs = {},\r\n  icon = null,\r\n  iconPosition = \"left\",\r\n  iconSize,\r\n  iconType,\r\n  iconStyle,\r\n  children,\r\n  size = fallbackSize,\r\n  form,\r\n  target,\r\n  id,\r\n}): ReactElement => {\r\n\r\n  const { getCN } = useCN(baseClass);\r\n\r\n  const [ isDisabledState, setIsDisabledState ] = useState<boolean>(isDisabled);\r\n  const [ btnLabel, setBtnLabel ] = useState<string | null>(label);\r\n  const [ btnIcon, setBtnIcon ] = useState<string | null>(icon);\r\n\r\n  useEffect(() => {\r\n    setBtnIcon(icon as string);\r\n  }, [ icon ]);\r\n\r\n  useEffect(() => {\r\n    setIsDisabledState(isDisabled as boolean);\r\n  }, [ isDisabled ]);\r\n\r\n  useEffect(() => {\r\n    setBtnLabel(label as string);\r\n  }, [ label ]);\r\n\r\n  const iconLayout = !!btnIcon && <span className={getCN(\"icon\")} {...(process.env.NODE_ENV === \"test\" ? { \"data-testid\": \"btn-icon\" } : {})}>\r\n    <Icon src={btnIcon} size={iconSize || size} type={iconType} style={iconStyle} />\r\n  </span>;\r\n\r\n  const labelLayout = !!btnLabel && <span className={getCN(\"label\")}>{btnLabel}</span>;\r\n\r\n  const bodyLayout = children || ((iconPosition === \"left\") ? <>{iconLayout} {labelLayout}</> : <>{labelLayout} {iconLayout}</>);\r\n\r\n  const classMods = getExtraSizes({\r\n    size,\r\n    extraClasses: {\r\n      isOutline: isLight ? false : isOutline,\r\n      isLight: isOutline ? false : isLight,\r\n      isOnlyIcon: !btnLabel,\r\n      ...extraClasses,\r\n    },\r\n  });\r\n\r\n  const onLinkClick = (event: MouseEvent<HTMLAnchorElement>) => {\r\n    if (isDisabled) {\r\n      event.preventDefault();\r\n      event.stopPropagation();\r\n      return;\r\n    }\r\n    if (onClick) {\r\n      onClick(event);\r\n    }\r\n  };\r\n\r\n  const hasVisibleText = !!btnLabel || !!children;\r\n  const computedAriaLabel = (!hasVisibleText && typeof title === \"string\" && title.length)\r\n    ? title\r\n    : undefined;\r\n  const linkRole = href ? undefined : \"button\";\r\n\r\n  return type === \"link\" ?\r\n    <a title={title} id={id} role={linkRole} target={target} onClick={onLinkClick} href={isDisabled ? undefined : href}\r\n      aria-disabled={isDisabled || undefined}\r\n      aria-label={computedAriaLabel}\r\n      tabIndex={isDisabled ? -1 : undefined}\r\n      className={`${getCN(\"\", classMods)} ${isDisabled ? constants.stateClasses.disabled : \"\"}`} {...extraAttrs}>\r\n      {bodyLayout}\r\n    </a> :\r\n    <button title={title} id={id} form={form} draggable={false} onClick={onClick} type={type as ButtonHTMLAttributes<[]>[\"type\"]}\r\n      aria-label={computedAriaLabel}\r\n      className={getCN(\"\", classMods)}\r\n      disabled={isDisabledState} {...extraAttrs}>\r\n      {bodyLayout}\r\n    </button>;\r\n};\r\n\r\nexport type {\r\n  IBtn,\r\n};\r\n\r\nexport {\r\n  Btn,\r\n};\r\n\r\n"],"names":["fallbackSize","constants","defaultSizes","Btn","baseClass","href","type","label","title","isDisabled","isOutline","isLight","extraClasses","onClick","extraAttrs","icon","iconPosition","iconSize","iconType","iconStyle","children","size","form","target","id","getCN","useCN","isDisabledState","setIsDisabledState","useState","btnLabel","setBtnLabel","btnIcon","setBtnIcon","useEffect","iconLayout","_jsx","className","process","env","NODE_ENV","Icon","src","style","labelLayout","bodyLayout","_jsxs","_Fragment","classMods","getExtraSizes","isOnlyIcon","onLinkClick","event","preventDefault","stopPropagation","hasVisibleText","computedAriaLabel","length","undefined","linkRole","role","tabIndex","stateClasses","disabled","draggable"],"mappings":"oRAkBA,MAAMA,aAAeC,UAAUC,aAAa;;;;GAM5C,MAAMC,IAAsC,EAC1CC,oBAAY,MACZC,UACAC,UAAO,SACPC,YAAQ,SACRC,YACAC,sBAAa,MACbC,oBAAY,MACZC,gBAAU,MACVC,0BAAe,CAAA,EACfC,gBACAC,sBAAa,CAAA,EACbC,UAAO,KACPC,0BAAe,OACfC,kBACAC,kBACAC,oBACAC,kBACAC,UAAOrB,aACPsB,UACAC,cACAC,UAGA,MAAMC,MAAEA,OAAUC,MAAMtB,WAExB,MAAQuB,gBAAiBC,oBAAuBC,SAAkBpB,YAClE,MAAQqB,SAAUC,aAAgBF,SAAwBtB,OAC1D,MAAQyB,QAASC,YAAeJ,SAAwBd,MAExDmB,UAAU,KACRD,WAAWlB,OACV,CAAEA,OAELmB,UAAU,KACRN,mBAAmBnB,aAClB,CAAEA,aAELyB,UAAU,KACRH,YAAYxB,QACX,CAAEA,QAEL,MAAM4B,aAAeH,SAAWI,IAAA,OAAA,CAAMC,UAAWZ,MAAM,WAAca,QAAQC,IAAIC,WAAa,OAAS,CAAE,cAAe,YAAe,GAAEpB,SACvIgB,IAACK,KAAI,CAACC,IAAKV,QAASX,KAAMJ,UAAYI,KAAMf,KAAMY,SAAUyB,MAAOxB,cAGrE,MAAMyB,cAAgBd,UAAYM,IAAA,OAAA,CAAMC,UAAWZ,MAAM,SAASL,SAAEU,WAEpE,MAAMe,WAAazB,WAAcJ,eAAiB,OAAU8B,KAAAC,SAAA,CAAA3B,SAAA,CAAGe,WAAW,IAAES,eAAkBE,KAAAC,SAAA,CAAA3B,SAAA,CAAGwB,YAAY,IAAET,eAE/G,MAAMa,UAAYC,cAAc,CAC9B5B,UACAT,aAAc,CACZF,UAAWC,QAAU,MAAQD,UAC7BC,QAASD,UAAY,MAAQC,QAC7BuC,YAAapB,YACVlB,gBAIP,MAAMuC,YAAeC,QACnB,GAAI3C,WAAY,CACd2C,MAAMC,iBACND,MAAME,kBACN,MACF,CACA,GAAIzC,QACFA,QAAQuC,QAIZ,MAAMG,iBAAmBzB,YAAcV,SACvC,MAAMoC,mBAAsBD,uBAAyB/C,QAAU,UAAYA,MAAMiD,OAC7EjD,WACAkD,EACJ,MAAMC,SAAWtD,UAAOqD,EAAY,SAEpC,OAAOpD,OAAS,OACd8B,IAAA,IAAA,CAAG5B,MAAOA,MAAOgB,GAAIA,GAAIoC,KAAMD,SAAUpC,OAAQA,OAAQV,QAASsC,YAAa9C,KAAMI,gBAAaiD,EAAYrD,KAC5G,gBAAeI,iBAAciD,EAC7B,aAAYF,kBACZK,SAAUpD,YAAa,OAAKiD,EAC5BrB,UAAW,GAAGZ,MAAM,GAAIuB,cAAcvC,WAAaR,UAAU6D,aAAaC,SAAW,QAAUjD,WAAUM,SACxGyB,aAEHT,IAAA,SAAA,CAAQ5B,MAAOA,MAAOgB,GAAIA,GAAIF,KAAMA,KAAM0C,UAAW,MAAOnD,QAASA,QAASP,KAAMA,KAClF,aAAYkD,kBACZnB,UAAWZ,MAAM,GAAIuB,WACrBe,SAAUpC,mBAAqBb,WAAUM,SACxCyB"}