{"version":3,"sources":["../src/animatednumber/index.native.tsx"],"names":["motion","useState","useRef","useReducedMotion","useEffect","jsx","RNText"],"mappings":";;;;;;;;;AAwBA,SAAS,cAAc,CAAA,EAAmB;AACxC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,CAAE,QAAA,EAAS;AAChC;AAGA,SAAS,QAAQ,CAAA,EAAmB;AAClC,EAAA,OAAO,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,GAAG,CAAC,CAAA;AAC9B;AAEO,SAAS,cAAA,CAAe;AAAA,EAC7B,KAAA;AAAA,EACA,QAAA,GAAWA,YAAO,SAAA,CAAU,QAAA;AAAA,EAC5B,MAAA,GAAS,aAAA;AAAA,EACT;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,CAAC,OAAA,EAAS,UAAU,CAAA,GAAIC,eAAiB,KAAK,CAAA;AACpD,EAAA,MAAM,UAAA,GAAaC,aAAO,KAAK,CAAA;AAC/B,EAAA,UAAA,CAAW,OAAA,GAAU,OAAA;AACrB,EAAA,MAAM,UAAUC,sBAAA,EAAiB;AAEjC,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,UAAA,CAAW,YAAY,KAAA,EAAO;AAClC,IAAA,IAAI,OAAA,IAAW,YAAY,CAAA,EAAG;AAC5B,MAAA,UAAA,CAAW,KAAK,CAAA;AAChB,MAAA;AAAA,IACF;AACA,IAAA,MAAM,QAAQ,UAAA,CAAW,OAAA;AACzB,IAAA,MAAM,QAAQ,KAAA,GAAQ,KAAA;AACtB,IAAA,MAAM,EAAA,GAAK,KAAK,GAAA,EAAI;AACpB,IAAA,IAAI,GAAA,GAAM,CAAA;AACV,IAAA,MAAM,OAAO,MAAM;AACjB,MAAA,MAAM,CAAA,GAAI,KAAK,GAAA,CAAA,CAAK,IAAA,CAAK,KAAI,GAAI,EAAA,IAAM,UAAU,CAAC,CAAA;AAClD,MAAA,UAAA,CAAW,KAAA,GAAQ,KAAA,GAAQ,OAAA,CAAQ,CAAC,CAAC,CAAA;AACrC,MAAA,IAAI,CAAA,GAAI,CAAA,EAAG,GAAA,GAAM,qBAAA,CAAsB,IAAI,CAAA;AAAA,IAC7C,CAAA;AACA,IAAA,GAAA,GAAM,sBAAsB,IAAI,CAAA;AAChC,IAAA,OAAO,MAAM,qBAAqB,GAAG,CAAA;AAAA,EACvC,CAAA,EAAG,CAAC,KAAA,EAAO,QAAA,EAAU,OAAO,CAAC,CAAA;AAE7B,EAAA,uBAAOC,cAAA,CAACC,gBAAA,EAAA,EAAO,KAAA,EAAO,CAAC,EAAE,WAAA,EAAa,CAAC,cAAc,CAAA,EAAE,EAAG,KAAK,CAAA,EAAI,QAAA,EAAA,MAAA,CAAO,OAAO,CAAA,EAAE,CAAA;AACrF","file":"animatednumber.native.cjs","sourcesContent":["/**\n * AnimatedNumber (native). Same count-up/down contract as web — rAF works\n * fine in React Native, so the interpolation logic is identical. Renders\n * an RN Text with fontVariant tabular-nums so digits don't wobble.\n *\n *   <AnimatedNumber value={score} />\n *   <AnimatedNumber value={total} format={(n) => `$${n.toFixed(2)}`} />\n *\n * Reduced motion (AccessibilityInfo) snaps to the value instantly.\n */\nimport { useEffect, useRef, useState } from \"react\";\nimport { Text as RNText, type TextStyle } from \"react-native\";\nimport { motion } from \"@plyxui/core\";\nimport { useReducedMotion } from \"@plyxui/hooks\";\n\nexport interface AnimatedNumberProps {\n  value: number;\n  /** Count duration in ms. Default motion.celebrate (500). */\n  duration?: number;\n  /** Render the interpolated value. Default rounds to an integer string. */\n  format?: (n: number) => string;\n  style?: TextStyle;\n}\n\nfunction defaultFormat(n: number): string {\n  return Math.round(n).toString();\n}\n\n// easeOutCubic — fast start, gentle landing on the final digit.\nfunction easeOut(t: number): number {\n  return 1 - Math.pow(1 - t, 3);\n}\n\nexport function AnimatedNumber({\n  value,\n  duration = motion.celebrate.duration,\n  format = defaultFormat,\n  style,\n}: AnimatedNumberProps) {\n  const [display, setDisplay] = useState<number>(value);\n  const displayRef = useRef(value);\n  displayRef.current = display;\n  const reduced = useReducedMotion();\n\n  useEffect(() => {\n    if (displayRef.current === value) return;\n    if (reduced || duration <= 0) {\n      setDisplay(value);\n      return;\n    }\n    const start = displayRef.current;\n    const delta = value - start;\n    const t0 = Date.now();\n    let raf = 0;\n    const tick = () => {\n      const t = Math.min((Date.now() - t0) / duration, 1);\n      setDisplay(start + delta * easeOut(t));\n      if (t < 1) raf = requestAnimationFrame(tick);\n    };\n    raf = requestAnimationFrame(tick);\n    return () => cancelAnimationFrame(raf);\n  }, [value, duration, reduced]);\n\n  return <RNText style={[{ fontVariant: [\"tabular-nums\"] }, style]}>{format(display)}</RNText>;\n}\n"]}