{"version":3,"file":"RollingNumber.cjs","names":["createVarsResolver","factory","useProps","useStyles","getRenderSlots","getDigitParts","buildValue","Box","DigitColumn","classes"],"sources":["../../../src/components/RollingNumber/RollingNumber.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport {\n  Box,\n  BoxProps,\n  createVarsResolver,\n  ElementProps,\n  factory,\n  Factory,\n  StylesApiProps,\n  useProps,\n  useStyles,\n} from '../../core';\nimport { buildValue } from './build-value';\nimport { DigitColumn } from './DigitColumn';\nimport { getDigitParts } from './get-digit-parts';\nimport { getRenderSlots } from './get-render-slots';\nimport classes from './RollingNumber.module.css';\n\nexport type RollingNumberStylesNames = 'root' | 'digit' | 'digitColumn' | 'char';\nexport type RollingNumberCssVariables = {\n  root: '--rn-duration' | '--rn-timing-function';\n};\n\nexport interface RollingNumberProps\n  extends BoxProps, StylesApiProps<RollingNumberFactory>, ElementProps<'div'> {\n  /** Number value to display */\n  value: number;\n\n  /** Prefix added before the value */\n  prefix?: string;\n\n  /** Suffix added after the value */\n  suffix?: string;\n\n  /** Character used as a decimal separator @default '.' */\n  decimalSeparator?: string;\n\n  /** Character used to separate thousands, set to `true` for `,` @default false */\n  thousandSeparator?: string | boolean;\n\n  /** Number of decimal places to display */\n  decimalScale?: number;\n\n  /** If set, trailing zeros are added to match `decimalScale` @default false */\n  fixedDecimalScale?: boolean;\n\n  /** Animation duration in milliseconds @default 600 */\n  animationDuration?: number;\n\n  /** CSS timing function for animation @default 'ease' */\n  timingFunction?: string;\n\n  /** If set, use tabular (monospace) numbers @default true */\n  tabularNumbers?: boolean;\n\n  /** If set, the root element acts as an `aria-live=\"polite\"` region (`role=\"status\"`) and screen readers announce every value change. When `false`, the root uses `role=\"img\"` so the current value is still accessible but updates are not announced. @default false */\n  withLiveRegion?: boolean;\n}\n\nexport type RollingNumberFactory = Factory<{\n  props: RollingNumberProps;\n  ref: HTMLDivElement;\n  stylesNames: RollingNumberStylesNames;\n  vars: RollingNumberCssVariables;\n}>;\n\nconst defaultProps = {\n  animationDuration: 600,\n  timingFunction: 'ease',\n  decimalSeparator: '.',\n  tabularNumbers: true,\n} satisfies Partial<RollingNumberProps>;\n\nconst varsResolver = createVarsResolver<RollingNumberFactory>(\n  (_, { animationDuration, timingFunction }) => ({\n    root: {\n      '--rn-duration': `${animationDuration}ms`,\n      '--rn-timing-function': timingFunction,\n    },\n  })\n);\n\nexport const RollingNumber = factory<RollingNumberFactory>((_props) => {\n  const props = useProps('RollingNumber', defaultProps, _props);\n  const {\n    classNames,\n    className,\n    style,\n    styles,\n    unstyled,\n    vars,\n    value,\n    prefix,\n    suffix,\n    decimalSeparator,\n    thousandSeparator,\n    decimalScale,\n    fixedDecimalScale,\n    animationDuration,\n    timingFunction,\n    tabularNumbers,\n    withLiveRegion,\n    mod,\n    attributes,\n    ...others\n  } = props;\n\n  const getStyles = useStyles<RollingNumberFactory>({\n    name: 'RollingNumber',\n    classes,\n    props,\n    className,\n    style,\n    classNames,\n    styles,\n    unstyled,\n    attributes,\n    vars,\n    varsResolver,\n  });\n\n  const previousValueRef = useRef(value);\n  const previousValue = previousValueRef.current;\n\n  useEffect(() => {\n    previousValueRef.current = value;\n  });\n\n  const valueDirection: 'up' | 'down' = value >= previousValue ? 'up' : 'down';\n\n  const current = getDigitParts({ value, decimalScale, fixedDecimalScale });\n  const prev = getDigitParts({ value: previousValue, decimalScale, fixedDecimalScale });\n\n  const slots = getRenderSlots({\n    current,\n    previous: prev,\n    prefix,\n    suffix,\n    decimalSeparator,\n    thousandSeparator,\n  });\n\n  const accessibleValue = buildValue({\n    value,\n    prefix,\n    suffix,\n    decimalSeparator,\n    thousandSeparator,\n    decimalScale,\n    fixedDecimalScale,\n  });\n\n  return (\n    <Box\n      {...getStyles('root')}\n      mod={[{ 'tabular-numbers': tabularNumbers }, mod]}\n      role={withLiveRegion ? 'status' : 'img'}\n      aria-label={accessibleValue}\n      {...others}\n    >\n      {slots.map((slot) => {\n        if (slot.type === 'digit') {\n          return (\n            <DigitColumn\n              key={slot.key}\n              digit={slot.digit}\n              previousDigit={slot.previousDigit}\n              getStyles={getStyles}\n              empty={slot.empty}\n              valueDirection={valueDirection}\n            />\n          );\n        }\n\n        return (\n          <span\n            key={slot.key}\n            {...getStyles('char')}\n            data-empty={slot.empty || undefined}\n            aria-hidden=\"true\"\n          >\n            {slot.char}\n          </span>\n        );\n      })}\n    </Box>\n  );\n});\n\nRollingNumber.classes = classes;\nRollingNumber.varsResolver = varsResolver;\nRollingNumber.displayName = '@mantine/core/RollingNumber';\n"],"mappings":";;;;;;;;;;;;;;;AAkEA,MAAM,eAAe;CACnB,mBAAmB;CACnB,gBAAgB;CAChB,kBAAkB;CAClB,gBAAgB;AAClB;AAEA,MAAM,eAAeA,6BAAAA,oBAClB,GAAG,EAAE,mBAAmB,sBAAsB,EAC7C,MAAM;CACJ,iBAAiB,GAAG,kBAAkB;CACtC,wBAAwB;AAC1B,EACF,EACF;AAEA,MAAa,gBAAgBC,gBAAAA,SAA+B,WAAW;CACrE,MAAM,QAAQC,kBAAAA,SAAS,iBAAiB,cAAc,MAAM;CAC5D,MAAM,EACJ,YACA,WACA,OACA,QACA,UACA,MACA,OACA,QACA,QACA,kBACA,mBACA,cACA,mBACA,mBACA,gBACA,gBACA,gBACA,KACA,YACA,GAAG,WACD;CAEJ,MAAM,YAAYC,mBAAAA,UAAgC;EAChD,MAAM;EACN,SAAA,6BAAA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAED,MAAM,oBAAA,GAAA,MAAA,QAA0B,KAAK;CACrC,MAAM,gBAAgB,iBAAiB;CAEvC,CAAA,GAAA,MAAA,iBAAgB;EACd,iBAAiB,UAAU;CAC7B,CAAC;CAED,MAAM,iBAAgC,SAAS,gBAAgB,OAAO;CAKtE,MAAM,QAAQC,yBAAAA,eAAe;EAC3B,SAJcC,wBAAAA,cAAc;GAAE;GAAO;GAAc;EAAkB,CAI/D;EACN,UAJWA,wBAAAA,cAAc;GAAE,OAAO;GAAe;GAAc;EAAkB,CAIpE;EACb;EACA;EACA;EACA;CACF,CAAC;CAED,MAAM,kBAAkBC,oBAAAA,WAAW;EACjC;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAED,OACE,iBAAA,GAAA,kBAAA,KAACC,YAAAA,KAAD;EACE,GAAI,UAAU,MAAM;EACpB,KAAK,CAAC,EAAE,mBAAmB,eAAe,GAAG,GAAG;EAChD,MAAM,iBAAiB,WAAW;EAClC,cAAY;EACZ,GAAI;YAEH,MAAM,KAAK,SAAS;GACnB,IAAI,KAAK,SAAS,SAChB,OACE,iBAAA,GAAA,kBAAA,KAACC,oBAAAA,aAAD;IAEE,OAAO,KAAK;IACZ,eAAe,KAAK;IACT;IACX,OAAO,KAAK;IACI;GACjB,GANM,KAAK,GAMX;GAIL,OACE,iBAAA,GAAA,kBAAA,KAAC,QAAD;IAEE,GAAI,UAAU,MAAM;IACpB,cAAY,KAAK,SAAS,KAAA;IAC1B,eAAY;cAEX,KAAK;GACF,GANC,KAAK,GAMN;EAEV,CAAC;CACE,CAAA;AAET,CAAC;AAED,cAAc,UAAUC,6BAAAA;AACxB,cAAc,eAAe;AAC7B,cAAc,cAAc"}