{"version":3,"file":"BarsList.mjs","names":["classes"],"sources":["../../src/BarsList/BarsList.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  ElementProps,\n  factory,\n  Factory,\n  getSpacing,\n  getThemeColor,\n  MantineColor,\n  MantineSpacing,\n  rem,\n  StylesApiProps,\n  useMantineTheme,\n  useProps,\n  useStyles,\n} from '@mantine/core';\nimport classes from './BarsList.module.css';\n\nexport type BarsListStylesNames = 'root' | 'bar' | 'barLabel' | 'barValue' | 'labelsRow';\n\nexport type BarsListCssVariables = {\n  root: '--bars-list-gap' | '--bars-list-min-bar-size' | '--bars-list-bar-height';\n};\n\nexport interface BarsListBarData {\n  /** Name of the bar, displayed inside the bar */\n  name: string;\n\n  /** Numeric value of the bar */\n  value: number;\n\n  /** Bar background color */\n  color?: MantineColor;\n\n  /** Bar text color, overrides barTextColor and autoContrast for this specific bar */\n  textColor?: MantineColor;\n\n  /** Bar variant, used to calculate text color when autoContrast is enabled */\n  variant?: 'light' | 'filled';\n}\n\nexport interface BarsListProps\n  extends BoxProps, StylesApiProps<BarsListFactory>, ElementProps<'div'> {\n  /** Data for bars */\n  data: BarsListBarData[];\n\n  /** Function to format value display */\n  valueFormatter?: (value: number) => string;\n\n  /** Label displayed above the bars column */\n  barsLabel?: string;\n\n  /** Label displayed above the values column */\n  valueLabel?: string;\n\n  /** Function to pass props down to the bar depending on the bar data payload */\n  getBarProps?: (data: BarsListBarData) => React.ComponentProps<'div'>;\n\n  /** Function to completely customize bar rendering */\n  renderBar?: (data: BarsListBarData, defaultBar: React.ReactNode) => React.ReactNode;\n\n  /** Controls gap between bars @default 5 */\n  barGap?: MantineSpacing;\n\n  /** Minimum bar width @default 100 */\n  minBarSize?: number | string;\n\n  /** Bar height @default 32 */\n  barHeight?: number | string;\n\n  /** Default bar background color, used when item does not have color specified */\n  barColor?: MantineColor;\n\n  /** Bar text color, overrides autoContrast */\n  barTextColor?: MantineColor;\n\n  /** If set, adjusts text color based on background color */\n  autoContrast?: boolean;\n}\n\nexport type BarsListFactory = Factory<{\n  props: BarsListProps;\n  ref: HTMLDivElement;\n  stylesNames: BarsListStylesNames;\n  vars: BarsListCssVariables;\n}>;\n\nconst defaultProps = {\n  barGap: 5,\n  minBarSize: 0,\n  barHeight: 32,\n} satisfies Partial<BarsListProps>;\n\nconst varsResolver = createVarsResolver<BarsListFactory>(\n  (_theme, { barGap, minBarSize, barHeight }) => ({\n    root: {\n      '--bars-list-gap': getSpacing(barGap),\n      '--bars-list-min-bar-size': rem(minBarSize),\n      '--bars-list-bar-height': rem(barHeight),\n    },\n  })\n);\n\nexport const BarsList = factory<BarsListFactory>((_props) => {\n  const props = useProps('BarsList', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    vars,\n    attributes,\n    data,\n    valueFormatter,\n    barsLabel,\n    valueLabel,\n    getBarProps,\n    renderBar,\n    barGap,\n    minBarSize,\n    barHeight,\n    barColor,\n    barTextColor,\n    autoContrast,\n    variant,\n    ...others\n  } = props;\n\n  const theme = useMantineTheme();\n\n  const getStyles = useStyles<BarsListFactory>({\n    name: 'BarsList',\n    classes,\n    props,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    attributes,\n    vars,\n    varsResolver,\n  });\n\n  const maxValue = useMemo(() => Math.max(...data.map((item) => item.value), 0), [data]);\n\n  const formatValue = (value: number) => {\n    if (valueFormatter) {\n      return valueFormatter(value);\n    }\n    return value.toString();\n  };\n\n  const bars = data.map((item, index) => {\n    const percentage = maxValue > 0 ? (item.value / maxValue) * 100 : 0;\n    const barProps = getBarProps ? getBarProps(item) : {};\n    const { style: barPropsStyle, className: barPropsClassName, ...restBarProps } = barProps;\n\n    const itemBarColor = item.color || barColor || theme.primaryColor;\n    const colors = theme.variantColorResolver({\n      color: itemBarColor,\n      theme,\n      variant: item.variant || variant || 'light',\n      autoContrast,\n    });\n\n    const backgroundColor = colors.background;\n\n    const textColor =\n      item.textColor || barTextColor\n        ? getThemeColor(item.textColor || barTextColor, theme)\n        : colors.color;\n\n    const defaultBar = (\n      <div key={index} {...getStyles('bar')}>\n        <div\n          {...getStyles('barLabel', {\n            className: barPropsClassName,\n            style: {\n              width: `${percentage}%`,\n              backgroundColor,\n              color: textColor,\n              padding: percentage === 0 ? 0 : undefined,\n              ...barPropsStyle,\n            },\n          })}\n          {...restBarProps}\n        >\n          {item.name}\n        </div>\n        <div {...getStyles('barValue')}>{formatValue(item.value)}</div>\n      </div>\n    );\n\n    if (renderBar) {\n      return <div key={index}>{renderBar(item, defaultBar)}</div>;\n    }\n\n    return defaultBar;\n  });\n\n  const labelsRow =\n    barsLabel || valueLabel ? (\n      <div {...getStyles('labelsRow')}>\n        <div>{barsLabel}</div>\n        <div>{valueLabel}</div>\n      </div>\n    ) : null;\n\n  return (\n    <Box {...getStyles('root')} variant={variant} {...others}>\n      {labelsRow}\n      {bars}\n    </Box>\n  );\n});\n\nBarsList.displayName = '@mantine/charts/BarsList';\nBarsList.classes = classes;\nBarsList.varsResolver = varsResolver;\n\nexport namespace BarsList {\n  export type Props = BarsListProps;\n  export type StylesNames = BarsListStylesNames;\n  export type Factory = BarsListFactory;\n  export type BarData = BarsListBarData;\n}\n"],"mappings":";;;;;;AAyFA,MAAM,eAAe;CACnB,QAAQ;CACR,YAAY;CACZ,WAAW;CACZ;AAED,MAAM,eAAe,oBAClB,QAAQ,EAAE,QAAQ,YAAY,iBAAiB,EAC9C,MAAM;CACJ,mBAAmB,WAAW,OAAO;CACrC,4BAA4B,IAAI,WAAW;CAC3C,0BAA0B,IAAI,UAAU;CACzC,EACF,EACF;AAED,MAAa,WAAW,SAA0B,WAAW;CAC3D,MAAM,QAAQ,SAAS,YAAY,cAAc,OAAO;CACxD,MAAM,EACJ,YACA,WACA,OACA,QACA,UACA,MACA,YACA,MACA,gBACA,WACA,YACA,aACA,WACA,QACA,YACA,WACA,UACA,cACA,cACA,SACA,GAAG,WACD;CAEJ,MAAM,QAAQ,iBAAiB;CAE/B,MAAM,YAAY,UAA2B;EAC3C,MAAM;EACN,SAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CAEF,MAAM,WAAW,cAAc,KAAK,IAAI,GAAG,KAAK,KAAK,SAAS,KAAK,MAAM,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC;CAEtF,MAAM,eAAe,UAAkB;AACrC,MAAI,eACF,QAAO,eAAe,MAAM;AAE9B,SAAO,MAAM,UAAU;;CAGzB,MAAM,OAAO,KAAK,KAAK,MAAM,UAAU;EACrC,MAAM,aAAa,WAAW,IAAK,KAAK,QAAQ,WAAY,MAAM;EAElE,MAAM,EAAE,OAAO,eAAe,WAAW,mBAAmB,GAAG,iBAD9C,cAAc,YAAY,KAAK,GAAG,EAAE;EAGrD,MAAM,eAAe,KAAK,SAAS,YAAY,MAAM;EACrD,MAAM,SAAS,MAAM,qBAAqB;GACxC,OAAO;GACP;GACA,SAAS,KAAK,WAAW,WAAW;GACpC;GACD,CAAC;EAEF,MAAM,kBAAkB,OAAO;EAE/B,MAAM,YACJ,KAAK,aAAa,eACd,cAAc,KAAK,aAAa,cAAc,MAAM,GACpD,OAAO;EAEb,MAAM,aACJ,qBAAC,OAAD;GAAiB,GAAI,UAAU,MAAM;aAArC,CACE,oBAAC,OAAD;IACE,GAAI,UAAU,YAAY;KACxB,WAAW;KACX,OAAO;MACL,OAAO,GAAG,WAAW;MACrB;MACA,OAAO;MACP,SAAS,eAAe,IAAI,IAAI,KAAA;MAChC,GAAG;MACJ;KACF,CAAC;IACF,GAAI;cAEH,KAAK;IACF,CAAA,EACN,oBAAC,OAAD;IAAK,GAAI,UAAU,WAAW;cAAG,YAAY,KAAK,MAAM;IAAO,CAAA,CAC3D;KAjBI,MAiBJ;AAGR,MAAI,UACF,QAAO,oBAAC,OAAD,EAAA,UAAkB,UAAU,MAAM,WAAW,EAAO,EAA1C,MAA0C;AAG7D,SAAO;GACP;CAEF,MAAM,YACJ,aAAa,aACX,qBAAC,OAAD;EAAK,GAAI,UAAU,YAAY;YAA/B,CACE,oBAAC,OAAD,EAAA,UAAM,WAAgB,CAAA,EACtB,oBAAC,OAAD,EAAA,UAAM,YAAiB,CAAA,CACnB;MACJ;AAEN,QACE,qBAAC,KAAD;EAAK,GAAI,UAAU,OAAO;EAAW;EAAS,GAAI;YAAlD,CACG,WACA,KACG;;EAER;AAEF,SAAS,cAAc;AACvB,SAAS,UAAUA;AACnB,SAAS,eAAe"}