{"version":3,"file":"index.cjs","sources":["../src/index.ts"],"sourcesContent":["/**\n * Fast cubic Bezier easing implementation using analytical solutions\n *\n * Based on the algorithm from EasingCubicBezier by Łukasz Izdebski\n * Original repository: https://github.com/jurgus/EasingCubicBezier\n * Original code Copyright (c) 2025 Łukasz Izdebski, MIT License\n *\n * TypeScript port by Robert Penner\n * Provides the same API as the popular bezier-easing NPM package\n */\n\nexport type EasingFunction = (t: number) => number;\n\n/**\n * Creates a cubic Bezier easing evaluator using analytical solutions\n *\n * Optimization notes:\n * - fastAsinh and fastAcosh are inlined since they're used only once each\n * - fastAcos and fastSinh remain as functions due to multiple usage or complexity\n */\nfunction createEasingFunction(\n  x1: number,\n  y1: number,\n  x2: number,\n  y2: number,\n): EasingFunction {\n  // Default epsilon for numerical comparisons\n  const DEFAULT_EPSILON = 2.22e-15;\n  // Numerical values calculated once on startup\n  const halfPi = Math.PI / 2;\n\n  // Utility function moved inside for better minification\n  const isZero = (x: number): boolean => Math.abs(x) < DEFAULT_EPSILON;\n\n  // Fast math functions: kept as functions since they're used multiple times or are complex\n  const fastAcos = (x: number): number => {\n    const sign = Math.sign(x);\n    const absX = x * sign;\n    return (\n      ((((-0.0213937064144441 * absX + 0.0775512555929659) * absX +\n        -0.2131465851945004) *\n        absX +\n        halfPi) *\n        Math.sqrt(1 - absX) -\n        halfPi) *\n        sign +\n      halfPi\n    );\n  };\n\n  const fastSinh = (x: number): number => {\n    // For small values (common in X3SINH for CSS ease), use Taylor series approximation\n    if (Math.abs(x) < 1) {\n      const x2 = x * x;\n      const x3 = x2 * x;\n      const x5 = x3 * x2;\n      // sinh(x) ≈ x + x³/6 + x⁵/120 for small x\n      return x + x3 / 6 + x5 / 120;\n    }\n    // For larger values, fall back to native implementation\n    return Math.sinh(x);\n  };\n\n  // Optimized polynomial coefficients with common sub-expressions factored out\n  // Given: P = [0, p1, p2, 1], x0 = 0, x3 = 1, xRange = 1\n\n  // Factor common sub-expressions for better performance and smaller code\n  const dx = x1 - x2; // Common difference term\n  const dy = y1 - y2; // Common difference term\n  const x3 = 3 * x1; // Reused 3*x1 term\n  const y3 = 3 * y1; // Reused 3*y1 term\n\n  // For pX = [0, x1, x2, 1] - using factored expressions:\n  const polyX0 = 3 * dx + 1; // 3*(x1-x2) + 1\n  const polyX1 = -x3 - 3 * dx; // -3*x1 - 3*(x1-x2) = -3*(2*x1-x2)\n  const polyX2 = x3; // 3*x1\n  // polyX3 = 0 (always zero from matrix calculation)\n\n  // For pY = [0, y1, y2, 1] - using factored expressions:\n  const polyY0 = 3 * dy + 1; // 3*(y1-y2) + 1\n  const polyY1 = -y3 - 3 * dy; // -3*y1 - 3*(y1-y2) = -3*(2*y1-y2)\n  const polyY2 = y3; // 3*y1\n  // polyY3 = 0 (always zero from matrix calculation)\n\n  // Pre-compute common division factor to avoid repeated division\n  const invPolyX0 = 1 / polyX0;\n\n  const b_a = polyX1 * invPolyX0;\n  const c_a = polyX2 * invPolyX0;\n  // d_a = polyX3 / polyX0 = 0 (eliminated)\n  const p = (b_a / -3) * b_a + c_a;\n  const b_a3 = b_a / 3; // Simplified b_a2 calculation\n  const q = (2 * b_a3 * b_a3 - c_a) * b_a3; // + d_a term removed (d_a = 0)\n  const signP = Math.sign(p);\n  const signB = Math.sign(polyX1);\n\n  // Inline calculateType logic and combine with curve type handling\n  let A = 1;\n  let B = 1;\n  let extra = 1;\n  let type: number;\n  let l: number, k: number;\n\n  if (isZero(polyX0) && isZero(polyX1)) {\n    type = 1; // P3: Linear polynomial case\n    A = 1 / polyX2;\n    B = 0; // -(polyX3 / polyX2) = -(0 / polyX2) = 0\n    l = 1;\n    k = 0;\n  } else if (isZero(polyX0)) {\n    type = 2; // X2: Quadratic case\n    A = signB;\n    B = -(polyX2 / (2 * polyX1));\n    l = 1 / polyX1;\n    k = B * B; // - polyX3 / polyX1 = - 0 / polyX1 = 0\n  } else if (isZero(p)) {\n    type = 3; // X3P0: Cubic with zero discriminant\n    B = -b_a3;\n    l = invPolyX0; // 1 / polyX0 (pre-computed)\n    k = -q;\n  } else {\n    // Common logic for X3COS, X3SINH, and X3COSH cases\n    if (polyX0 < 0) {\n      type = 4; // X3COS: Trigonometric cosine case\n    } else if (p > 0) {\n      type = 5; // X3SINH: Hyperbolic sine case\n    } else if (p < 0) {\n      type = 6; // X3COSH: Hyperbolic cosine case\n      extra = signB; // Only difference for X3COSH\n    } else {\n      throw new Error('Invalid curve type');\n    }\n\n    // Common calculations for all three cubic cases\n    A = -2 * signP * extra * Math.sqrt(Math.abs(p) / 3);\n    B = -b_a3;\n    l = (3 * signP * invPolyX0) / (p * A); // Factored out polyX0 division\n    k = 3 * signP * (-q / p / A);\n  }\n\n  // Pre-compute coefficients\n  const a = polyY0 * A * A * A;\n  const b = (3 * polyY0 * B + polyY1) * A * A;\n  const c = ((3 * polyY0 * B + 2 * polyY1) * B + polyY2) * A;\n  const d = ((polyY0 * B + polyY1) * B + polyY2) * B; // + polyY3 = + 0 (removed)\n\n  // Return evaluation function\n  return (x: number): number => {\n    let phi = l * x + k;\n\n    switch (type) {\n      case 1: // P3: Linear polynomial case\n        break;\n\n      case 2: // X2: Quadratic case\n        phi = Math.sqrt(Math.max(0, phi));\n        break;\n\n      case 3: // X3P0: Cubic with zero discriminant\n        phi = Math.cbrt(phi);\n        break;\n\n      case 4: // X3COS: Trigonometric cosine case\n        // -2/3 * π\n        phi = Math.cos(\n          fastAcos(Math.max(-1, Math.min(1, phi))) / 3 - 2.094395102393195,\n        );\n        break;\n\n      case 5: // X3SINH: Hyperbolic sine case\n        // Inlined fastAsinh: Math.asinh(phi) would be Math.log(phi + Math.sqrt(phi * phi + 1))\n        phi = fastSinh(Math.log(phi + Math.sqrt(phi * phi + 1)) / 3);\n        break;\n\n      case 6: // X3COSH: Hyperbolic cosine case\n        phi =\n          phi >= 1\n            ? // Inlined fastAcosh: Math.acosh(phi) would be Math.log(phi + Math.sqrt(phi * phi - 1))\n              Math.cosh(Math.log(phi + Math.sqrt(phi * phi - 1)) / 3)\n            : Math.cos(fastAcos(Math.max(-1, phi)) / 3);\n        break;\n\n      default:\n        throw new Error('Invalid curve type');\n    }\n\n    return ((a * phi + b) * phi + c) * phi + d;\n  };\n}\n\n/**\n * Creates a cubic Bezier easing function with analytical solutions for performance\n *\n * @param x1 - First control point X coordinate (0 to 1)\n * @param y1 - First control point Y coordinate (can be outside 0-1)\n * @param x2 - Second control point X coordinate (0 to 1)\n * @param y2 - Second control point Y coordinate (can be outside 0-1)\n * @returns An easing function that takes time t (0 to 1) and returns interpolated value\n */\nexport default function bezierEasing(\n  x1: number,\n  y1: number,\n  x2: number,\n  y2: number,\n): EasingFunction {\n  // Validate control points - X coordinates must be in [0, 1]\n  if (x1 < 0 || x1 > 1 || x2 < 0 || x2 > 1) {\n    throw new Error('bezier x values must be in [0, 1] range');\n  }\n\n  // Handle linear cases for performance\n  if (x1 === y1 && x2 === y2) {\n    return (t: number) => t;\n  }\n\n  // Create the analytical easing function\n  const evaluate = createEasingFunction(x1, y1, x2, y2);\n\n  // Return the easing function\n  return (t: number): number => {\n    // Handle edge cases\n    if (t <= 0) return 0;\n    if (t >= 1) return 1;\n\n    // Use analytical evaluation\n    return evaluate(t);\n  };\n}\n\n// Named export for compatibility\nexport { bezierEasing };\n"],"names":["createEasingFunction","x1","y1","x2","y2","halfPi","isZero","x","fastAcos","sign","absX","fastSinh","x3","x5","dx","dy","y3","polyX0","polyX1","polyX2","polyY0","polyY1","polyY2","invPolyX0","b_a","c_a","p","b_a3","q","signP","signB","A","B","extra","type","l","k","a","b","c","d","phi","bezierEasing","t","evaluate"],"mappings":"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"}