figspec

Unofficial static Figma frame/file viewer available as HTML CustomElement

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
export function roundTo(x: number, to: number = 0) {
  if (to === 0) {
    return Math.round(x);
  }

  const p = Math.pow(10, to);

  return Math.round(x * p) / p;
}

interface PowerOfTwoOptions {
  min: number;
  max: number;
}

export function nextPowerOfTwo(
  num: number,
  options: PowerOfTwoOptions,
): number {
  const nearest = nearestPowerOfTwo(num, options);
  return Math.min(options.max, nearest > num ? nearest : nearest * 2);
}

export function previousPowerOfTwo(
  num: number,
  options: PowerOfTwoOptions,
): number {
  const nearest = nearestPowerOfTwo(num, options);
  return Math.max(options.min, nearest < num ? nearest : nearest / 2);
}

function nearestPowerOfTwo(num: number, options: PowerOfTwoOptions): number {
  if (num < options.min) {
    return options.min;
  } else if (num > options.max) {
    return options.max;
  }

  if (num < 1) {
    return 1 / nearestPowerOfTwo(1 / num, options);
  }

  const power = Math.round(Math.log(num) / Math.log(2));
  return 2 ** power;
}