{"version":3,"file":"ButtonBase.cjs","sourceRoot":"","sources":["../../../src/components/ButtonBase/ButtonBase.tsx"],"names":[],"mappings":"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","sourcesContent":["import { ButtonBaseSize, IconName } from '@metamask/design-system-shared';\nimport { Slot, Slottable } from '@radix-ui/react-slot';\nimport React, { forwardRef } from 'react';\n\nimport { twMerge } from '../../utils/tw-merge';\nimport { Icon } from '../Icon';\nimport { Text, FontWeight, TextColor } from '../Text';\n\nimport {\n  MAP_BUTTONBASE_SIZE_ICONSIZE,\n  MAP_BUTTONBASE_SIZE_TEXT_VARIANT,\n  getButtonBaseHorizontalPaddingTwClasses,\n  TWCLASSMAP_BUTTONBASE_SIZE_DIMENSION,\n} from './ButtonBase.constants';\nimport type { ButtonBaseProps } from './ButtonBase.types';\n\nexport const ButtonBase = forwardRef<HTMLButtonElement, ButtonBaseProps>(\n  (\n    {\n      children,\n      className,\n      size = ButtonBaseSize.Lg,\n      isFullWidth,\n      asChild,\n      isDisabled,\n      isLoading,\n      loadingText,\n      loadingIconProps,\n      loadingTextProps,\n      startIconName,\n      startIconProps,\n      startAccessory,\n      endIconName,\n      endIconProps,\n      endAccessory,\n      textProps,\n      style,\n      'aria-label': ariaLabel,\n      'aria-labelledby': ariaLabelledby,\n      'aria-describedby': ariaDescribedby,\n      'aria-pressed': ariaPressed,\n      'aria-expanded': ariaExpanded,\n      'aria-controls': ariaControls,\n      'aria-haspopup': ariaHaspopup,\n      ...props\n    },\n    ref,\n  ) => {\n    const Component = asChild ? Slot : 'button';\n    const isInteractive = !(isDisabled ?? isLoading);\n\n    const finalStartIconName = startIconName ?? startIconProps?.name;\n    const finalEndIconName = endIconName ?? endIconProps?.name;\n    const hasStart = Boolean(finalStartIconName || startAccessory);\n    const hasEnd = Boolean(finalEndIconName || endAccessory);\n    const hasAccessories = hasStart || hasEnd;\n    const iconSize = MAP_BUTTONBASE_SIZE_ICONSIZE[size];\n    const labelTextVariant = MAP_BUTTONBASE_SIZE_TEXT_VARIANT[size];\n\n    // Calculate tabIndex based on asChild and disabled state\n    const getTabIndex = () => {\n      if (asChild) {\n        return undefined;\n      }\n      return isDisabled ? -1 : undefined;\n    };\n\n    const renderLabel = () => {\n      if (children && typeof children === 'string') {\n        return (\n          <Text\n            variant={labelTextVariant}\n            fontWeight={FontWeight.Medium}\n            color={TextColor.Inherit}\n            asChild\n            {...textProps}\n          >\n            <span>{children}</span>\n          </Text>\n        );\n      }\n      return children;\n    };\n\n    const renderLoadingState = () => (\n      <>\n        <span\n          className=\"absolute inline-flex items-center gap-x-1\"\n          aria-hidden=\"true\"\n        >\n          <Icon\n            name={IconName.Loading}\n            size={iconSize}\n            className={twMerge(\n              'animate-spin text-inherit',\n              loadingIconProps?.className,\n            )}\n            {...loadingIconProps}\n          />\n          <Text\n            variant={labelTextVariant}\n            fontWeight={FontWeight.Medium}\n            color={TextColor.Inherit}\n            asChild\n            {...loadingTextProps}\n          >\n            <span>{loadingText}</span>\n          </Text>\n        </span>\n        <span className=\"invisible inline-flex items-center\" aria-hidden=\"true\">\n          {renderLabel()}\n        </span>\n        {/* Screen reader announcement for loading */}\n        <span className=\"sr-only\" aria-live=\"polite\" aria-atomic=\"true\">\n          {loadingText || 'Loading'}\n        </span>\n      </>\n    );\n\n    const renderStartContent = () => {\n      if (finalStartIconName) {\n        return (\n          <Icon\n            name={finalStartIconName}\n            size={iconSize}\n            className={twMerge(\n              'shrink-0 text-inherit',\n              startIconProps?.className,\n            )}\n            aria-hidden=\"true\"\n            {...startIconProps}\n          />\n        );\n      }\n      if (startAccessory) {\n        return <span aria-hidden=\"true\">{startAccessory}</span>;\n      }\n      return null;\n    };\n\n    const renderEndContent = () => {\n      if (finalEndIconName) {\n        return (\n          <Icon\n            name={finalEndIconName}\n            size={iconSize}\n            className={twMerge(\n              'shrink-0 text-inherit',\n              endIconProps?.className,\n            )}\n            aria-hidden=\"true\"\n            {...endIconProps}\n          />\n        );\n      }\n      if (endAccessory) {\n        return <span aria-hidden=\"true\">{endAccessory}</span>;\n      }\n      return null;\n    };\n\n    const renderContent = () => renderLabel();\n\n    const mergedClassName = twMerge(\n      // Base styles\n      'inline-flex items-center justify-center rounded-full',\n      getButtonBaseHorizontalPaddingTwClasses(hasStart, hasEnd),\n      hasAccessories && 'gap-x-1',\n      'font-medium text-default',\n      'bg-muted',\n      'overflow-hidden',\n      // Add relative positioning for loading state\n      'relative',\n      // Size\n      TWCLASSMAP_BUTTONBASE_SIZE_DIMENSION[size],\n      // Full width\n      isFullWidth && 'w-full',\n      // Animation classes - only applied when interactive\n      isInteractive && [\n        'transition-all',\n        'duration-100',\n        'ease-linear',\n        'active:scale-[0.97]',\n        'active:ease-[cubic-bezier(0.3,0.8,0.3,1)]',\n      ],\n      // Disabled state - apply to both isDisabled and isLoading\n      (isDisabled || isLoading) && 'cursor-not-allowed',\n      isDisabled && 'opacity-50',\n      // Custom classes\n      className,\n    );\n\n    return (\n      <Component\n        ref={ref}\n        className={mergedClassName}\n        disabled={asChild ? undefined : (isDisabled ?? isLoading)}\n        aria-disabled={isDisabled ? 'true' : undefined}\n        aria-busy={isLoading ? 'true' : undefined}\n        aria-label={ariaLabel}\n        aria-labelledby={ariaLabelledby}\n        aria-describedby={ariaDescribedby}\n        aria-pressed={ariaPressed}\n        aria-expanded={ariaExpanded}\n        aria-controls={ariaControls}\n        aria-haspopup={ariaHaspopup}\n        role={asChild ? undefined : 'button'}\n        tabIndex={getTabIndex()}\n        style={style}\n        {...props}\n      >\n        {renderStartContent()}\n        <Slottable>\n          {isLoading ? renderLoadingState() : renderContent()}\n        </Slottable>\n        {renderEndContent()}\n      </Component>\n    );\n  },\n);\n\nButtonBase.displayName = 'ButtonBase';\n"]}