{"version":3,"file":"index.cjs","names":["L_TERMS: number[][][]","B_TERMS: number[][][]","R_TERMS: number[][][]","Y_TERMS: number[][]","PE_TERMS: number[][]","sum: number[]","alpha: number[]","delta: number[]","mRts: number[]","nuRts: number[]","hPrime: number[]","alphaPrime: number[]","deltaPrime: number[]","hRts: number[]","twilight: TwilightTimes | null"],"sources":["../src/constants.ts","../src/utils/math.ts","../src/utils/time.ts","../src/types.ts","../src/utils/date.ts","../src/calculations/earth.ts","../src/calculations/sun.ts","../src/calculations/nutation.ts","../src/calculations/observer.ts","../src/calculations/rts.ts","../src/spa.ts","../src/index.ts"],"sourcesContent":["/**\n * Solar Position Algorithm Constants\n * Based on NREL's Solar Position Algorithm for Solar Radiation Applications\n */\n\n// Physical constants\nexport const PI = Math.PI;\nexport const SUN_RADIUS = 0.26667; // degrees\nexport const REFRACTION_CORRECTION = 0.5667; // degrees - typical atmospheric refraction\n\n// Periodic term counts\nexport const L_COUNT = 6;\nexport const B_COUNT = 2;\nexport const R_COUNT = 5;\nexport const Y_COUNT = 63;\n\n// Subterm counts for L, B, R series\nexport const L_SUBCOUNT = [64, 34, 20, 7, 3, 1];\nexport const B_SUBCOUNT = [5, 2];\nexport const R_SUBCOUNT = [40, 10, 6, 2, 1];\n\n// Term indices\nexport const TERM_A = 0;\nexport const TERM_B = 1;\nexport const TERM_C = 2;\n\n// X terms for nutation calculation\nexport const TERM_X0 = 0;\nexport const TERM_X1 = 1;\nexport const TERM_X2 = 2;\nexport const TERM_X3 = 3;\nexport const TERM_X4 = 4;\nexport const TERM_X_COUNT = 5;\n\n// PE terms for nutation calculation\nexport const TERM_PSI_A = 0;\nexport const TERM_PSI_B = 1;\nexport const TERM_EPS_C = 2;\nexport const TERM_EPS_D = 3;\n\n// Twilight zenith angles (sun center below horizon)\nexport const ZENITH_SUNRISE_SUNSET = 90.8333; // includes refraction + sun radius\nexport const ZENITH_CIVIL_TWILIGHT = 96.0;    // 6° below horizon\nexport const ZENITH_NAUTICAL_TWILIGHT = 102.0; // 12° below horizon\nexport const ZENITH_ASTRONOMICAL_TWILIGHT = 108.0; // 18° below horizon\nexport const ZENITH_GOLDEN_HOUR = 84.0;         // 6° above horizon (approximate start of golden hour)\nexport const ZENITH_BLUE_HOUR = 94.0;           // 4° below horizon (approximate start of blue hour)\n\n// Invalid value marker for high-latitude cases\nexport const INVALID_VALUE = -99999;\n\n/**\n * Earth Heliocentric Longitude Periodic Terms (L)\n * Each series contains [A, B, C] coefficients\n */\nexport const L_TERMS: number[][][] = [\n  [\n    [175347046.0, 0, 0],\n    [3341656.0, 4.6692568, 6283.07585],\n    [34894.0, 4.6261, 12566.1517],\n    [3497.0, 2.7441, 5753.3849],\n    [3418.0, 2.8289, 3.5231],\n    [3136.0, 3.6277, 77713.7715],\n    [2676.0, 4.4181, 7860.4194],\n    [2343.0, 6.1352, 3930.2097],\n    [1324.0, 0.7425, 11506.7698],\n    [1273.0, 2.0371, 529.691],\n    [1199.0, 1.1096, 1577.3435],\n    [990, 5.233, 5884.927],\n    [902, 2.045, 26.298],\n    [857, 3.508, 398.149],\n    [780, 1.179, 5223.694],\n    [753, 2.533, 5507.553],\n    [505, 4.583, 18849.228],\n    [492, 4.205, 775.523],\n    [357, 2.92, 0.067],\n    [317, 5.849, 11790.629],\n    [284, 1.899, 796.298],\n    [271, 0.315, 10977.079],\n    [243, 0.345, 5486.778],\n    [206, 4.806, 2544.314],\n    [205, 1.869, 5573.143],\n    [202, 2.458, 6069.777],\n    [156, 0.833, 213.299],\n    [132, 3.411, 2942.463],\n    [126, 1.083, 20.775],\n    [115, 0.645, 0.98],\n    [103, 0.636, 4694.003],\n    [102, 0.976, 15720.839],\n    [102, 4.267, 7.114],\n    [99, 6.21, 2146.17],\n    [98, 0.68, 155.42],\n    [86, 5.98, 161000.69],\n    [85, 1.3, 6275.96],\n    [85, 3.67, 71430.7],\n    [80, 1.81, 17260.15],\n    [79, 3.04, 12036.46],\n    [75, 1.76, 5088.63],\n    [74, 3.5, 3154.69],\n    [74, 4.68, 801.82],\n    [70, 0.83, 9437.76],\n    [62, 3.98, 8827.39],\n    [61, 1.82, 7084.9],\n    [57, 2.78, 6286.6],\n    [56, 4.39, 14143.5],\n    [56, 3.47, 6279.55],\n    [52, 0.19, 12139.55],\n    [52, 1.33, 1748.02],\n    [51, 0.28, 5856.48],\n    [49, 0.49, 1194.45],\n    [41, 5.37, 8429.24],\n    [41, 2.4, 19651.05],\n    [39, 6.17, 10447.39],\n    [37, 6.04, 10213.29],\n    [37, 2.57, 1059.38],\n    [36, 1.71, 2352.87],\n    [36, 1.78, 6812.77],\n    [33, 0.59, 17789.85],\n    [30, 0.44, 83996.85],\n    [30, 2.74, 1349.87],\n    [25, 3.16, 4690.48],\n  ],\n  [\n    [628331966747.0, 0, 0],\n    [206059.0, 2.678235, 6283.07585],\n    [4303.0, 2.6351, 12566.1517],\n    [425.0, 1.59, 3.523],\n    [119.0, 5.796, 26.298],\n    [109.0, 2.966, 1577.344],\n    [93, 2.59, 18849.23],\n    [72, 1.14, 529.69],\n    [68, 1.87, 398.15],\n    [67, 4.41, 5507.55],\n    [59, 2.89, 5223.69],\n    [56, 2.17, 155.42],\n    [45, 0.4, 796.3],\n    [36, 0.47, 775.52],\n    [29, 2.65, 7.11],\n    [21, 5.34, 0.98],\n    [19, 1.85, 5486.78],\n    [19, 4.97, 213.3],\n    [17, 2.99, 6275.96],\n    [16, 0.03, 2544.31],\n    [16, 1.43, 2146.17],\n    [15, 1.21, 10977.08],\n    [12, 2.83, 1748.02],\n    [12, 3.26, 5088.63],\n    [12, 5.27, 1194.45],\n    [12, 2.08, 4694],\n    [11, 0.77, 553.57],\n    [10, 1.3, 6286.6],\n    [10, 4.24, 1349.87],\n    [9, 2.7, 242.73],\n    [9, 5.64, 951.72],\n    [8, 5.3, 2352.87],\n    [6, 2.65, 9437.76],\n    [6, 4.67, 4690.48],\n  ],\n  [\n    [52919.0, 0, 0],\n    [8720.0, 1.0721, 6283.0758],\n    [309.0, 0.867, 12566.152],\n    [27, 0.05, 3.52],\n    [16, 5.19, 26.3],\n    [16, 3.68, 155.42],\n    [10, 0.76, 18849.23],\n    [9, 2.06, 77713.77],\n    [7, 0.83, 775.52],\n    [5, 4.66, 1577.34],\n    [4, 1.03, 7.11],\n    [4, 3.44, 5573.14],\n    [3, 5.14, 796.3],\n    [3, 6.05, 5507.55],\n    [3, 1.19, 242.73],\n    [3, 6.12, 529.69],\n    [3, 0.31, 398.15],\n    [3, 2.28, 553.57],\n    [2, 4.38, 5223.69],\n    [2, 3.75, 0.98],\n  ],\n  [\n    [289.0, 5.844, 6283.076],\n    [35, 0, 0],\n    [17, 5.49, 12566.15],\n    [3, 5.2, 155.42],\n    [1, 4.72, 3.52],\n    [1, 5.3, 18849.23],\n    [1, 5.97, 242.73],\n  ],\n  [\n    [114.0, 3.142, 0],\n    [8, 4.13, 6283.08],\n    [1, 3.84, 12566.15],\n  ],\n  [[1, 3.14, 0]],\n];\n\n/**\n * Earth Heliocentric Latitude Periodic Terms (B)\n */\nexport const B_TERMS: number[][][] = [\n  [\n    [280.0, 3.199, 84334.662],\n    [102.0, 5.422, 5507.553],\n    [80, 3.88, 5223.69],\n    [44, 3.7, 2352.87],\n    [32, 4, 1577.34],\n  ],\n  [\n    [9, 3.9, 5507.55],\n    [6, 1.73, 5223.69],\n  ],\n];\n\n/**\n * Earth Radius Vector Periodic Terms (R)\n */\nexport const R_TERMS: number[][][] = [\n  [\n    [100013989.0, 0, 0],\n    [1670700.0, 3.0984635, 6283.07585],\n    [13956.0, 3.05525, 12566.1517],\n    [3084.0, 5.1985, 77713.7715],\n    [1628.0, 1.1739, 5753.3849],\n    [1576.0, 2.8469, 7860.4194],\n    [925.0, 5.453, 11506.77],\n    [542.0, 4.564, 3930.21],\n    [472.0, 3.661, 5884.927],\n    [346.0, 0.964, 5507.553],\n    [329.0, 5.9, 5223.694],\n    [307.0, 0.299, 5573.143],\n    [243.0, 4.273, 11790.629],\n    [212.0, 5.847, 1577.344],\n    [186.0, 5.022, 10977.079],\n    [175.0, 3.012, 18849.228],\n    [110.0, 5.055, 5486.778],\n    [98, 0.89, 6069.78],\n    [86, 5.69, 15720.84],\n    [86, 1.27, 161000.69],\n    [65, 0.27, 17260.15],\n    [63, 0.92, 529.69],\n    [57, 2.01, 83996.85],\n    [56, 5.24, 71430.7],\n    [49, 3.25, 2544.31],\n    [47, 2.58, 775.52],\n    [45, 5.54, 9437.76],\n    [43, 6.01, 6275.96],\n    [39, 5.36, 4694],\n    [38, 2.39, 8827.39],\n    [37, 0.83, 19651.05],\n    [37, 4.9, 12139.55],\n    [36, 1.67, 12036.46],\n    [35, 1.84, 2942.46],\n    [33, 0.24, 7084.9],\n    [32, 0.18, 5088.63],\n    [32, 1.78, 398.15],\n    [28, 1.21, 6286.6],\n    [28, 1.9, 6279.55],\n    [26, 4.59, 10447.39],\n  ],\n  [\n    [103019.0, 1.10749, 6283.07585],\n    [1721.0, 1.0644, 12566.1517],\n    [702.0, 3.142, 0],\n    [32, 1.02, 18849.23],\n    [31, 2.84, 5507.55],\n    [25, 1.32, 5223.69],\n    [18, 1.42, 1577.34],\n    [10, 5.91, 10977.08],\n    [9, 1.42, 6275.96],\n    [9, 0.27, 5486.78],\n  ],\n  [\n    [4359.0, 5.7846, 6283.0758],\n    [124.0, 5.579, 12566.152],\n    [12, 3.14, 0],\n    [9, 3.63, 77713.77],\n    [6, 1.87, 5573.14],\n    [3, 5.47, 18849.23],\n  ],\n  [\n    [145.0, 4.273, 6283.076],\n    [7, 3.92, 12566.15],\n  ],\n  [[4, 2.56, 6283.08]],\n];\n\n/**\n * Nutation Y Terms - coefficients for calculating nutation in longitude and obliquity\n */\nexport const Y_TERMS: number[][] = [\n  [0, 0, 0, 0, 1],\n  [-2, 0, 0, 2, 2],\n  [0, 0, 0, 2, 2],\n  [0, 0, 0, 0, 2],\n  [0, 1, 0, 0, 0],\n  [0, 0, 1, 0, 0],\n  [-2, 1, 0, 2, 2],\n  [0, 0, 0, 2, 1],\n  [0, 0, 1, 2, 2],\n  [-2, -1, 0, 2, 2],\n  [-2, 0, 1, 0, 0],\n  [-2, 0, 0, 2, 1],\n  [0, 0, -1, 2, 2],\n  [2, 0, 0, 0, 0],\n  [0, 0, 1, 0, 1],\n  [2, 0, -1, 2, 2],\n  [0, 0, -1, 0, 1],\n  [0, 0, 1, 2, 1],\n  [-2, 0, 2, 0, 0],\n  [0, 0, -2, 2, 1],\n  [2, 0, 0, 2, 2],\n  [0, 0, 2, 2, 2],\n  [0, 0, 2, 0, 0],\n  [-2, 0, 1, 2, 2],\n  [0, 0, 0, 2, 0],\n  [-2, 0, 0, 2, 0],\n  [0, 0, -1, 2, 1],\n  [0, 2, 0, 0, 0],\n  [2, 0, -1, 0, 1],\n  [-2, 2, 0, 2, 2],\n  [0, 1, 0, 0, 1],\n  [-2, 0, 1, 0, 1],\n  [0, -1, 0, 0, 1],\n  [0, 0, 2, -2, 0],\n  [2, 0, -1, 2, 1],\n  [2, 0, 1, 2, 2],\n  [0, 1, 0, 2, 2],\n  [-2, 1, 1, 0, 0],\n  [0, -1, 0, 2, 2],\n  [2, 0, 0, 2, 1],\n  [2, 0, 1, 0, 0],\n  [-2, 0, 2, 2, 2],\n  [-2, 0, 1, 2, 1],\n  [2, 0, -2, 0, 1],\n  [2, 0, 0, 0, 1],\n  [0, -1, 1, 0, 0],\n  [-2, -1, 0, 2, 1],\n  [-2, 0, 0, 0, 1],\n  [0, 0, 2, 2, 1],\n  [-2, 0, 2, 0, 1],\n  [-2, 1, 0, 2, 1],\n  [0, 0, 1, -2, 0],\n  [-1, 0, 1, 0, 0],\n  [-2, 1, 0, 0, 0],\n  [1, 0, 0, 0, 0],\n  [0, 0, 1, 2, 0],\n  [0, 0, -2, 2, 2],\n  [-1, -1, 1, 0, 0],\n  [0, 1, 1, 0, 0],\n  [0, -1, 1, 2, 2],\n  [2, -1, -1, 2, 2],\n  [0, 0, 3, 2, 2],\n  [2, -1, 0, 2, 2],\n];\n\n/**\n * Periodic Terms for Nutation in Longitude and Obliquity (PE)\n * [PSI_A, PSI_B, EPS_C, EPS_D]\n */\nexport const PE_TERMS: number[][] = [\n  [-171996, -174.2, 92025, 8.9],\n  [-13187, -1.6, 5736, -3.1],\n  [-2274, -0.2, 977, -0.5],\n  [2062, 0.2, -895, 0.5],\n  [1426, -3.4, 54, -0.1],\n  [712, 0.1, -7, 0],\n  [-517, 1.2, 224, -0.6],\n  [-386, -0.4, 200, 0],\n  [-301, 0, 129, -0.1],\n  [217, -0.5, -95, 0.3],\n  [-158, 0, 0, 0],\n  [129, 0.1, -70, 0],\n  [123, 0, -53, 0],\n  [63, 0, 0, 0],\n  [63, 0.1, -33, 0],\n  [-59, 0, 26, 0],\n  [-58, -0.1, 32, 0],\n  [-51, 0, 27, 0],\n  [48, 0, 0, 0],\n  [46, 0, -24, 0],\n  [-38, 0, 16, 0],\n  [-31, 0, 13, 0],\n  [29, 0, 0, 0],\n  [29, 0, -12, 0],\n  [26, 0, 0, 0],\n  [-22, 0, 0, 0],\n  [21, 0, -10, 0],\n  [17, -0.1, 0, 0],\n  [16, 0, -8, 0],\n  [-16, 0.1, 7, 0],\n  [-15, 0, 9, 0],\n  [-13, 0, 7, 0],\n  [-12, 0, 6, 0],\n  [11, 0, 0, 0],\n  [-10, 0, 5, 0],\n  [-8, 0, 3, 0],\n  [7, 0, -3, 0],\n  [-7, 0, 0, 0],\n  [-7, 0, 3, 0],\n  [-7, 0, 3, 0],\n  [6, 0, 0, 0],\n  [6, 0, -3, 0],\n  [6, 0, -3, 0],\n  [-6, 0, 3, 0],\n  [-6, 0, 3, 0],\n  [5, 0, 0, 0],\n  [-5, 0, 3, 0],\n  [-5, 0, 3, 0],\n  [-5, 0, 3, 0],\n  [4, 0, 0, 0],\n  [4, 0, 0, 0],\n  [4, 0, 0, 0],\n  [-4, 0, 0, 0],\n  [-4, 0, 0, 0],\n  [-4, 0, 0, 0],\n  [3, 0, 0, 0],\n  [-3, 0, 0, 0],\n  [-3, 0, 0, 0],\n  [-3, 0, 0, 0],\n  [-3, 0, 0, 0],\n  [-3, 0, 0, 0],\n  [-3, 0, 0, 0],\n  [-3, 0, 0, 0],\n];\n","/**\n * Mathematical utility functions for Solar Position Algorithm\n */\n\nimport { PI } from '../constants';\n\n/**\n * Convert degrees to radians\n */\nexport function deg2rad(degrees: number): number {\n  return (PI / 180.0) * degrees;\n}\n\n/**\n * Convert radians to degrees\n */\nexport function rad2deg(radians: number): number {\n  return (180.0 / PI) * radians;\n}\n\n/**\n * Limit degrees to 0-360 range\n */\nexport function limitDegrees(degrees: number): number {\n  let limited = degrees / 360.0;\n  limited = 360.0 * (limited - Math.floor(limited));\n  if (limited < 0) {\n    limited += 360.0;\n  }\n  return limited;\n}\n\n/**\n * Limit degrees to 0-180 range\n */\nexport function limitDegrees180(degrees: number): number {\n  let limited = degrees / 180.0;\n  limited = 180.0 * (limited - Math.floor(limited));\n  if (limited < 0) {\n    limited += 180.0;\n  }\n  return limited;\n}\n\n/**\n * Limit degrees to -180 to +180 range\n */\nexport function limitDegrees180pm(degrees: number): number {\n  let limited = degrees / 360.0;\n  limited = 360.0 * (limited - Math.floor(limited));\n  if (limited < -180.0) {\n    limited += 360.0;\n  } else if (limited > 180.0) {\n    limited -= 360.0;\n  }\n  return limited;\n}\n\n/**\n * Limit value to 0-1 range (fractional day)\n */\nexport function limitZero2one(value: number): number {\n  let limited = value - Math.floor(value);\n  if (limited < 0) {\n    limited += 1.0;\n  }\n  return limited;\n}\n\n/**\n * Calculate third-order polynomial: ((a*x + b)*x + c)*x + d\n */\nexport function thirdOrderPolynomial(\n  a: number,\n  b: number,\n  c: number,\n  d: number,\n  x: number\n): number {\n  return ((a * x + b) * x + c) * x + d;\n}\n\n/**\n * Limit minutes to -20 to 20 range (for equation of time)\n */\nexport function limitMinutes(minutes: number): number {\n  let limited = minutes;\n  if (limited < -20.0) {\n    limited += 1440.0;\n  } else if (limited > 20.0) {\n    limited -= 1440.0;\n  }\n  return limited;\n}\n","/**\n * Time conversion utilities for Solar Position Algorithm\n */\n\nimport { limitZero2one } from './math';\n\n/**\n * Convert day fraction to local hour\n * @param dayfrac - Day fraction (0-1)\n * @param timezone - Timezone offset in hours\n * @returns Local hour (0-24)\n */\nexport function dayfracToLocalHr(dayfrac: number, timezone: number): number {\n  return 24.0 * limitZero2one(dayfrac + timezone / 24.0);\n}\n\n/**\n * Convert fractional hours to Date object\n * @param date - Base date (used for year, month, day)\n * @param fractionalHour - Hour as fractional value (0-24)\n * @param timezone - Timezone offset in hours (negative west of Greenwich)\n * @returns Date object representing the time\n */\nexport function fractionalHourToDate(\n  date: Date,\n  fractionalHour: number,\n  timezone: number\n): Date {\n  // Handle invalid values (polar day/night)\n  if (fractionalHour < 0 || !isFinite(fractionalHour)) {\n    return new Date(NaN);\n  }\n\n  // Convert fractional hour to milliseconds from midnight UTC\n  const hours = Math.floor(fractionalHour);\n  const minutesDecimal = (fractionalHour - hours) * 60;\n  const minutes = Math.floor(minutesDecimal);\n  const secondsDecimal = (minutesDecimal - minutes) * 60;\n  const seconds = Math.floor(secondsDecimal);\n  const milliseconds = Math.round((secondsDecimal - seconds) * 1000);\n\n  // Create a new date starting from the base date at midnight UTC\n  const result = new Date(\n    Date.UTC(\n      date.getUTCFullYear(),\n      date.getUTCMonth(),\n      date.getUTCDate(),\n      0, 0, 0, 0\n    )\n  );\n\n  // The fractional hour is in local time, so we need to convert to UTC\n  // Local time = UTC + timezone, so UTC = Local - timezone\n  const utcHours = hours - timezone;\n  \n  result.setUTCHours(utcHours, minutes, seconds, milliseconds);\n\n  return result;\n}\n\n/**\n * Convert fractional hours to time string (HH:MM:SS.mmm)\n * @param fractionalHour - Hour as fractional value (0-24)\n * @returns Formatted time string\n */\nexport function fractionalHourToString(fractionalHour: number): string {\n  if (fractionalHour < 0 || !isFinite(fractionalHour)) {\n    return 'N/A';\n  }\n\n  const totalSec = Math.round(fractionalHour * 3600);\n  const H = Math.floor(totalSec / 3600);\n  const rem = totalSec - H * 3600;\n  const M = Math.floor(rem / 60);\n  const S = rem - M * 60;\n  const ms = Math.round(\n    (fractionalHour * 3600 - Math.floor(fractionalHour * 3600)) * 1000\n  );\n\n  return (\n    `${H.toString().padStart(2, '0')}:` +\n    `${M.toString().padStart(2, '0')}:` +\n    `${S.toString().padStart(2, '0')}.` +\n    `${ms.toString().padStart(3, '0')}`\n  );\n}\n","/**\n * Solar Position Algorithm (SPA) Type Definitions\n * Based on NREL's Solar Position Algorithm for Solar Radiation Applications\n */\n\n/**\n * Output calculation modes\n */\nexport enum SpaFunction {\n  /** Calculate only zenith and azimuth */\n  SPA_ZA = 0,\n  /** Calculate zenith, azimuth, and incidence angle */\n  SPA_ZA_INC = 1,\n  /** Calculate zenith, azimuth, and rise/transit/set */\n  SPA_ZA_RTS = 2,\n  /** Calculate all output values */\n  SPA_ALL = 3,\n}\n\n/**\n * Julian Day offset enumeration for RTS calculations\n */\nexport enum JDSign {\n  JD_MINUS = 0,\n  JD_ZERO = 1,\n  JD_PLUS = 2,\n  JD_COUNT = 3,\n}\n\n/**\n * Sun state enumeration for RTS calculations\n */\nexport enum SunState {\n  SUN_TRANSIT = 0,\n  SUN_RISE = 1,\n  SUN_SET = 2,\n  SUN_COUNT = 3,\n}\n\n/**\n * Optional parameters for SPA calculations\n */\nexport interface SpaOptions {\n  /** Observer elevation in meters (default: 0) */\n  elevation?: number;\n  /** Annual average local pressure in millibars (default: 1013) */\n  pressure?: number;\n  /** Annual average local temperature in Celsius (default: 15) */\n  temperature?: number;\n  /** Fractional second difference between UTC and UT (default: 0) */\n  deltaUt1?: number;\n  /** Difference between earth rotation time and terrestrial time in seconds (default: 67) */\n  deltaT?: number;\n  /** Surface slope in degrees (default: 0) */\n  slope?: number;\n  /** Surface azimuth rotation in degrees (default: 0) */\n  azimuthRotation?: number;\n  /** Atmospheric refraction at sunrise/sunset in degrees (default: 0.5667) */\n  atmosphericRefraction?: number;\n  /** Timezone offset in hours from UTC (e.g., -5 for EST) */\n  timezone?: number;\n  /** IANA Timezone ID (e.g., 'America/New_York') */\n  timezoneId?: string;\n}\n\n/**\n * Twilight calculation results\n */\nexport interface TwilightTimes {\n  /** Civil twilight begins (sun 6° below horizon) */\n  civilDawn: Date | null;\n  /** Civil twilight ends (sun 6° below horizon) */\n  civilDusk: Date | null;\n  /** Nautical twilight begins (sun 12° below horizon) */\n  nauticalDawn: Date | null;\n  /** Nautical twilight ends (sun 12° below horizon) */\n  nauticalDusk: Date | null;\n  /** Astronomical twilight begins (sun 18° below horizon) */\n  astronomicalDawn: Date | null;\n  /** Astronomical twilight ends (sun 18° below horizon) */\n  astronomicalDusk: Date | null;\n  /** Golden hour begins/ends (sun 6° above horizon to 4° below horizon) */\n  goldenHour: {\n    morning: { start: Date | null, end: Date | null };\n    evening: { start: Date | null, end: Date | null };\n  } | null;\n  /** Blue hour begins/ends (sun 4° below horizon to 6° below horizon) */\n  blueHour: {\n    morning: { start: Date | null, end: Date | null };\n    evening: { start: Date | null, end: Date | null };\n  } | null;\n}\n\n/**\n * Solar position output\n */\nexport interface SolarPosition {\n  /** Topocentric zenith angle in degrees */\n  zenith: number;\n  /** Topocentric azimuth angle (eastward from north) in degrees */\n  azimuth: number;\n  /** Topocentric azimuth angle (westward from south) in degrees - for astronomers */\n  azimuthAstro: number;\n  /** Topocentric elevation angle in degrees */\n  elevation: number;\n  /** Right ascension in degrees */\n  rightAscension: number;\n  /** Declination in degrees */\n  declination: number;\n  /** Hour angle in degrees */\n  hourAngle: number;\n}\n\n/**\n * Complete SPA data structure containing all input, intermediate, and output values\n */\nexport interface SpaData {\n  // Input values\n  year: number;\n  month: number;\n  day: number;\n  hour: number;\n  minute: number;\n  second: number;\n  deltaUt1: number;\n  deltaT: number;\n  timezone: number;\n  longitude: number;\n  latitude: number;\n  elevation: number;\n  pressure: number;\n  temperature: number;\n  slope: number;\n  azimuthRotation: number;\n  atmosphericRefraction: number;\n  timezoneId: string;\n  function: SpaFunction;\n\n  // Intermediate values\n  jd: number;          // Julian day\n  jc: number;          // Julian century\n  jde: number;         // Julian ephemeris day\n  jce: number;         // Julian ephemeris century\n  jme: number;         // Julian ephemeris millennium\n  l: number;           // Earth heliocentric longitude [degrees]\n  b: number;           // Earth heliocentric latitude [degrees]\n  r: number;           // Earth radius vector [AU]\n  theta: number;       // Geocentric longitude [degrees]\n  beta: number;        // Geocentric latitude [degrees]\n  x0: number;          // Mean elongation (moon-sun) [degrees]\n  x1: number;          // Mean anomaly (sun) [degrees]\n  x2: number;          // Mean anomaly (moon) [degrees]\n  x3: number;          // Argument latitude (moon) [degrees]\n  x4: number;          // Ascending longitude (moon) [degrees]\n  delPsi: number;      // Nutation longitude [degrees]\n  delEpsilon: number;  // Nutation obliquity [degrees]\n  epsilon0: number;    // Ecliptic mean obliquity [arc seconds]\n  epsilon: number;     // Ecliptic true obliquity [degrees]\n  delTau: number;      // Aberration correction [degrees]\n  lamda: number;       // Apparent sun longitude [degrees]\n  nu0: number;         // Greenwich mean sidereal time [degrees]\n  nu: number;          // Greenwich sidereal time [degrees]\n  alpha: number;       // Geocentric sun right ascension [degrees]\n  delta: number;       // Geocentric sun declination [degrees]\n  h: number;           // Observer hour angle [degrees]\n  xi: number;          // Sun equatorial horizontal parallax [degrees]\n  delAlpha: number;    // Sun right ascension parallax [degrees]\n  deltaPrime: number;  // Topocentric sun declination [degrees]\n  alphaPrime: number;  // Topocentric sun right ascension [degrees]\n  hPrime: number;      // Topocentric local hour angle [degrees]\n  e0: number;          // Topocentric elevation angle (uncorrected) [degrees]\n  delE: number;        // Atmospheric refraction correction [degrees]\n  e: number;           // Topocentric elevation angle (corrected) [degrees]\n  eot: number;         // Equation of time [minutes]\n  srha: number;        // Sunrise hour angle [degrees]\n  ssha: number;        // Sunset hour angle [degrees]\n  sta: number;         // Sun transit altitude [degrees]\n\n  // Output values\n  zenith: number;       // Topocentric zenith angle [degrees]\n  azimuthAstro: number; // Topocentric azimuth angle (westward from south)\n  azimuth: number;      // Topocentric azimuth angle (eastward from north)\n  incidence: number;    // Surface incidence angle [degrees]\n  suntransit: number;   // Local sun transit time [fractional hour]\n  sunrise: number;      // Local sunrise time [fractional hour]\n  sunset: number;       // Local sunset time [fractional hour]\n}\n\n/**\n * Parallax calculation result\n */\nexport interface ParallaxResult {\n  deltaAlpha: number;\n  deltaPrime: number;\n}\n","/**\n * Date and Julian day calculation utilities for Solar Position Algorithm\n */\n\n/**\n * Calculate Julian Day from calendar date and time\n * @param year - 4-digit year\n * @param month - Month (1-12)\n * @param day - Day of month (1-31)\n * @param hour - Hour (0-24)\n * @param minute - Minute (0-59)\n * @param second - Second (0-59.999...)\n * @param deltaUt1 - Fractional second difference between UTC and UT\n * @param timezone - Timezone offset in hours (negative west of Greenwich)\n * @returns Julian Day number\n */\nexport function julianDay(\n  year: number,\n  month: number,\n  day: number,\n  hour: number,\n  minute: number,\n  second: number,\n  deltaUt1: number,\n  timezone: number\n): number {\n  let y = year;\n  let m = month;\n\n  const dayDecimal =\n    day + (hour - timezone + (minute + (second + deltaUt1) / 60.0) / 60.0) / 24.0;\n\n  if (m < 3) {\n    m += 12;\n    y--;\n  }\n\n  let jd =\n    Math.floor(365.25 * (y + 4716.0)) +\n    Math.floor(30.6001 * (m + 1)) +\n    dayDecimal -\n    1524.5;\n\n  if (jd > 2299160.0) {\n    const a = Math.floor(y / 100);\n    jd += 2 - a + Math.floor(a / 4);\n  }\n\n  return jd;\n}\n\n/**\n * Calculate Julian Century from Julian Day\n * @param jd - Julian Day\n * @returns Julian Century\n */\nexport function julianCentury(jd: number): number {\n  return (jd - 2451545.0) / 36525.0;\n}\n\n/**\n * Calculate Julian Ephemeris Day\n * @param jd - Julian Day\n * @param deltaT - Difference between earth rotation time and terrestrial time (seconds)\n * @returns Julian Ephemeris Day\n */\nexport function julianEphemerisDay(jd: number, deltaT: number): number {\n  return jd + deltaT / 86400.0;\n}\n\n/**\n * Calculate Julian Ephemeris Century\n * @param jde - Julian Ephemeris Day\n * @returns Julian Ephemeris Century\n */\nexport function julianEphemerisCentury(jde: number): number {\n  return (jde - 2451545.0) / 36525.0;\n}\n\n/**\n * Calculate Julian Ephemeris Millennium\n * @param jce - Julian Ephemeris Century\n * @returns Julian Ephemeris Millennium\n */\nexport function julianEphemerisMillennium(jce: number): number {\n  return jce / 10.0;\n}\n\n/**\n * Extract date components from a JavaScript Date object\n * Returns components in local time\n */\nexport function extractLocalDateComponents(date: Date): {\n  year: number;\n  month: number;\n  day: number;\n  hour: number;\n  minute: number;\n  second: number;\n  timezone: number;\n} {\n  return {\n    year: date.getFullYear(),\n    month: date.getMonth() + 1,\n    day: date.getDate(),\n    hour: date.getHours(),\n    minute: date.getMinutes(),\n    second: date.getSeconds() + date.getMilliseconds() / 1000,\n    timezone: -date.getTimezoneOffset() / 60,\n  };\n}\n\n/**\n * Extract date components from a JavaScript Date object\n * Returns components in UTC\n */\nexport function extractUTCDateComponents(date: Date): {\n  year: number;\n  month: number;\n  day: number;\n  hour: number;\n  minute: number;\n  second: number;\n} {\n  return {\n    year: date.getUTCFullYear(),\n    month: date.getUTCMonth() + 1,\n    day: date.getUTCDate(),\n    hour: date.getUTCHours(),\n    minute: date.getUTCMinutes(),\n    second: date.getUTCSeconds() + date.getUTCMilliseconds() / 1000,\n  };\n}\n","/**\n * Earth position calculations for Solar Position Algorithm\n * Calculates heliocentric longitude, latitude, and radius vector\n */\n\nimport {\n  L_TERMS,\n  B_TERMS,\n  R_TERMS,\n  L_COUNT,\n  B_COUNT,\n  R_COUNT,\n  L_SUBCOUNT,\n  B_SUBCOUNT,\n  R_SUBCOUNT,\n  TERM_A,\n  TERM_B,\n  TERM_C,\n} from '../constants';\nimport { rad2deg, limitDegrees } from '../utils/math';\n\n/**\n * Calculate the sum of periodic terms for a given series\n * @param terms - Array of [A, B, C] coefficients\n * @param count - Number of terms to sum\n * @param jme - Julian Ephemeris Millennium\n * @returns Sum of periodic terms\n */\nfunction earthPeriodicTermSummation(\n  terms: number[][],\n  count: number,\n  jme: number\n): number {\n  let sum = 0;\n  for (let i = 0; i < count; i++) {\n    sum += terms[i][TERM_A] * Math.cos(terms[i][TERM_B] + terms[i][TERM_C] * jme);\n  }\n  return sum;\n}\n\n/**\n * Calculate the value from periodic term sums\n * @param termSum - Array of periodic term sums\n * @param count - Number of series\n * @param jme - Julian Ephemeris Millennium\n * @returns Combined value\n */\nfunction earthValues(termSum: number[], count: number, jme: number): number {\n  let sum = 0;\n  for (let i = 0; i < count; i++) {\n    sum += termSum[i] * Math.pow(jme, i);\n  }\n  sum /= 1.0e8;\n  return sum;\n}\n\n/**\n * Calculate Earth's heliocentric longitude\n * @param jme - Julian Ephemeris Millennium\n * @returns Heliocentric longitude in degrees (0-360)\n */\nexport function earthHeliocentricLongitude(jme: number): number {\n  const sum: number[] = [];\n  for (let i = 0; i < L_COUNT; i++) {\n    sum[i] = earthPeriodicTermSummation(L_TERMS[i], L_SUBCOUNT[i], jme);\n  }\n  return limitDegrees(rad2deg(earthValues(sum, L_COUNT, jme)));\n}\n\n/**\n * Calculate Earth's heliocentric latitude\n * @param jme - Julian Ephemeris Millennium\n * @returns Heliocentric latitude in degrees\n */\nexport function earthHeliocentricLatitude(jme: number): number {\n  const sum: number[] = [];\n  for (let i = 0; i < B_COUNT; i++) {\n    sum[i] = earthPeriodicTermSummation(B_TERMS[i], B_SUBCOUNT[i], jme);\n  }\n  return rad2deg(earthValues(sum, B_COUNT, jme));\n}\n\n/**\n * Calculate Earth's radius vector (distance from Sun)\n * @param jme - Julian Ephemeris Millennium\n * @returns Radius vector in Astronomical Units (AU)\n */\nexport function earthRadiusVector(jme: number): number {\n  const sum: number[] = [];\n  for (let i = 0; i < R_COUNT; i++) {\n    sum[i] = earthPeriodicTermSummation(R_TERMS[i], R_SUBCOUNT[i], jme);\n  }\n  return earthValues(sum, R_COUNT, jme);\n}\n","/**\n * Sun position calculations for Solar Position Algorithm\n * Calculates geocentric position, right ascension, declination\n */\n\nimport { deg2rad, rad2deg, limitDegrees } from '../utils/math';\n\n/**\n * Calculate geocentric longitude from heliocentric longitude\n * @param l - Heliocentric longitude in degrees\n * @returns Geocentric longitude in degrees\n */\nexport function geocentricLongitude(l: number): number {\n  let theta = l + 180.0;\n  if (theta >= 360.0) {\n    theta -= 360.0;\n  }\n  return theta;\n}\n\n/**\n * Calculate geocentric latitude from heliocentric latitude\n * @param b - Heliocentric latitude in degrees\n * @returns Geocentric latitude in degrees\n */\nexport function geocentricLatitude(b: number): number {\n  return -b;\n}\n\n/**\n * Calculate the aberration correction\n * @param r - Earth radius vector in AU\n * @returns Aberration correction in degrees\n */\nexport function aberrationCorrection(r: number): number {\n  return -20.4898 / (3600.0 * r);\n}\n\n/**\n * Calculate the apparent sun longitude\n * @param theta - Geocentric longitude in degrees\n * @param deltaPsi - Nutation in longitude in degrees\n * @param deltaTau - Aberration correction in degrees\n * @returns Apparent sun longitude in degrees\n */\nexport function apparentSunLongitude(\n  theta: number,\n  deltaPsi: number,\n  deltaTau: number\n): number {\n  return theta + deltaPsi + deltaTau;\n}\n\n/**\n * Calculate geocentric sun right ascension\n * @param lamda - Apparent sun longitude in degrees\n * @param epsilon - True obliquity of ecliptic in degrees\n * @param beta - Geocentric latitude in degrees\n * @returns Right ascension in degrees (0-360)\n */\nexport function geocentricRightAscension(\n  lamda: number,\n  epsilon: number,\n  beta: number\n): number {\n  const lamdaRad = deg2rad(lamda);\n  const epsilonRad = deg2rad(epsilon);\n\n  return limitDegrees(\n    rad2deg(\n      Math.atan2(\n        Math.sin(lamdaRad) * Math.cos(epsilonRad) -\n          Math.tan(deg2rad(beta)) * Math.sin(epsilonRad),\n        Math.cos(lamdaRad)\n      )\n    )\n  );\n}\n\n/**\n * Calculate geocentric sun declination\n * @param beta - Geocentric latitude in degrees\n * @param epsilon - True obliquity of ecliptic in degrees\n * @param lamda - Apparent sun longitude in degrees\n * @returns Declination in degrees\n */\nexport function geocentricDeclination(\n  beta: number,\n  epsilon: number,\n  lamda: number\n): number {\n  const betaRad = deg2rad(beta);\n  const epsilonRad = deg2rad(epsilon);\n\n  return rad2deg(\n    Math.asin(\n      Math.sin(betaRad) * Math.cos(epsilonRad) +\n        Math.cos(betaRad) * Math.sin(epsilonRad) * Math.sin(deg2rad(lamda))\n    )\n  );\n}\n\n/**\n * Calculate sun mean longitude\n * @param jme - Julian Ephemeris Millennium\n * @returns Mean longitude in degrees\n */\nexport function sunMeanLongitude(jme: number): number {\n  return limitDegrees(\n    280.4664567 +\n      jme *\n        (360007.6982779 +\n          jme *\n            (0.03032028 +\n              jme * (1 / 49931.0 + jme * (-1 / 15300.0 + jme * (-1 / 2000000.0)))))\n  );\n}\n\n/**\n * Calculate sun equatorial horizontal parallax\n * @param r - Earth radius vector in AU\n * @returns Parallax in degrees\n */\nexport function sunEquatorialHorizontalParallax(r: number): number {\n  return 8.794 / (3600.0 * r);\n}\n","/**\n * Nutation and obliquity calculations for Solar Position Algorithm\n */\n\nimport {\n  Y_TERMS,\n  PE_TERMS,\n  Y_COUNT,\n  TERM_X_COUNT,\n  TERM_PSI_A,\n  TERM_PSI_B,\n  TERM_EPS_C,\n  TERM_EPS_D,\n} from '../constants';\nimport { deg2rad, thirdOrderPolynomial } from '../utils/math';\n\n/**\n * Nutation calculation result\n */\nexport interface NutationResult {\n  /** Nutation in longitude (degrees) */\n  delPsi: number;\n  /** Nutation in obliquity (degrees) */\n  delEpsilon: number;\n}\n\n/**\n * Calculate mean elongation of the Moon from the Sun\n * @param jce - Julian Ephemeris Century\n * @returns Mean elongation in degrees\n */\nexport function meanElongationMoonSun(jce: number): number {\n  return thirdOrderPolynomial(\n    1.0 / 189474.0,\n    -0.0019142,\n    445267.11148,\n    297.85036,\n    jce\n  );\n}\n\n/**\n * Calculate mean anomaly of the Sun\n * @param jce - Julian Ephemeris Century\n * @returns Mean anomaly in degrees\n */\nexport function meanAnomalySun(jce: number): number {\n  return thirdOrderPolynomial(\n    -1.0 / 300000.0,\n    -0.0001603,\n    35999.05034,\n    357.52772,\n    jce\n  );\n}\n\n/**\n * Calculate mean anomaly of the Moon\n * @param jce - Julian Ephemeris Century\n * @returns Mean anomaly in degrees\n */\nexport function meanAnomalyMoon(jce: number): number {\n  return thirdOrderPolynomial(\n    1.0 / 56250.0,\n    0.0086972,\n    477198.867398,\n    134.96298,\n    jce\n  );\n}\n\n/**\n * Calculate argument of latitude of the Moon\n * @param jce - Julian Ephemeris Century\n * @returns Argument of latitude in degrees\n */\nexport function argumentLatitudeMoon(jce: number): number {\n  return thirdOrderPolynomial(\n    1.0 / 327270.0,\n    -0.0036825,\n    483202.017538,\n    93.27191,\n    jce\n  );\n}\n\n/**\n * Calculate ascending node longitude of the Moon\n * @param jce - Julian Ephemeris Century\n * @returns Ascending longitude in degrees\n */\nexport function ascendingLongitudeMoon(jce: number): number {\n  return thirdOrderPolynomial(\n    1.0 / 450000.0,\n    0.0020708,\n    -1934.136261,\n    125.04452,\n    jce\n  );\n}\n\n/**\n * Calculate XY term summation for nutation\n */\nfunction xyTermSummation(i: number, x: number[]): number {\n  let sum = 0;\n  for (let j = 0; j < TERM_X_COUNT; j++) {\n    sum += x[j] * Y_TERMS[i][j];\n  }\n  return sum;\n}\n\n/**\n * Calculate nutation in longitude and obliquity\n * @param jce - Julian Ephemeris Century\n * @param x - Array of X terms [x0, x1, x2, x3, x4]\n * @returns Nutation in longitude and obliquity (degrees)\n */\nexport function nutationLongitudeAndObliquity(\n  jce: number,\n  x: number[]\n): NutationResult {\n  let sumPsi = 0;\n  let sumEpsilon = 0;\n\n  for (let i = 0; i < Y_COUNT; i++) {\n    const xyTermSum = deg2rad(xyTermSummation(i, x));\n    sumPsi +=\n      (PE_TERMS[i][TERM_PSI_A] + jce * PE_TERMS[i][TERM_PSI_B]) *\n      Math.sin(xyTermSum);\n    sumEpsilon +=\n      (PE_TERMS[i][TERM_EPS_C] + jce * PE_TERMS[i][TERM_EPS_D]) *\n      Math.cos(xyTermSum);\n  }\n\n  return {\n    delPsi: sumPsi / 36000000.0,\n    delEpsilon: sumEpsilon / 36000000.0,\n  };\n}\n\n/**\n * Calculate ecliptic mean obliquity\n * @param jme - Julian Ephemeris Millennium\n * @returns Mean obliquity in arc seconds\n */\nexport function eclipticMeanObliquity(jme: number): number {\n  const u = jme / 10.0;\n  return (\n    84381.448 +\n    u *\n      (-4680.93 +\n        u *\n          (-1.55 +\n            u *\n              (1999.25 +\n                u *\n                  (-51.38 +\n                    u *\n                      (-249.67 +\n                        u *\n                          (-39.05 + u * (7.12 + u * (27.87 + u * (5.79 + u * 2.45)))))))))\n  );\n}\n\n/**\n * Calculate ecliptic true obliquity\n * @param deltaEpsilon - Nutation in obliquity (degrees)\n * @param epsilon0 - Mean obliquity (arc seconds)\n * @returns True obliquity in degrees\n */\nexport function eclipticTrueObliquity(\n  deltaEpsilon: number,\n  epsilon0: number\n): number {\n  return deltaEpsilon + epsilon0 / 3600.0;\n}\n","/**\n * Observer position and topocentric calculations for Solar Position Algorithm\n */\n\nimport { SUN_RADIUS } from '../constants';\nimport { deg2rad, rad2deg, limitDegrees } from '../utils/math';\nimport { ParallaxResult } from '../types';\n\n/**\n * Calculate Greenwich mean sidereal time\n * @param jd - Julian Day\n * @param jc - Julian Century\n * @returns Greenwich mean sidereal time in degrees\n */\nexport function greenwichMeanSiderealTime(jd: number, jc: number): number {\n  return limitDegrees(\n    280.46061837 +\n      360.98564736629 * (jd - 2451545.0) +\n      jc * jc * (0.000387933 - jc / 38710000.0)\n  );\n}\n\n/**\n * Calculate Greenwich sidereal time\n * @param nu0 - Greenwich mean sidereal time in degrees\n * @param deltaPsi - Nutation in longitude in degrees\n * @param epsilon - True obliquity in degrees\n * @returns Greenwich sidereal time in degrees\n */\nexport function greenwichSiderealTime(\n  nu0: number,\n  deltaPsi: number,\n  epsilon: number\n): number {\n  return nu0 + deltaPsi * Math.cos(deg2rad(epsilon));\n}\n\n/**\n * Calculate observer hour angle\n * @param nu - Greenwich sidereal time in degrees\n * @param longitude - Observer longitude in degrees\n * @param alphaDeg - Geocentric right ascension in degrees\n * @returns Observer hour angle in degrees\n */\nexport function observerHourAngle(\n  nu: number,\n  longitude: number,\n  alphaDeg: number\n): number {\n  return limitDegrees(nu + longitude - alphaDeg);\n}\n\n/**\n * Calculate right ascension parallax and topocentric declination\n * @param latitude - Observer latitude in degrees\n * @param elevation - Observer elevation in meters\n * @param xi - Sun equatorial horizontal parallax in degrees\n * @param h - Observer hour angle in degrees\n * @param delta - Geocentric declination in degrees\n * @returns Parallax result with deltaAlpha and deltaPrime\n */\nexport function rightAscensionParallaxAndTopocentricDec(\n  latitude: number,\n  elevation: number,\n  xi: number,\n  h: number,\n  delta: number\n): ParallaxResult {\n  const latRad = deg2rad(latitude);\n  const xiRad = deg2rad(xi);\n  const hRad = deg2rad(h);\n  const deltaRad = deg2rad(delta);\n\n  const u = Math.atan(0.99664719 * Math.tan(latRad));\n  const y =\n    0.99664719 * Math.sin(u) + (elevation * Math.sin(latRad)) / 6378140.0;\n  const x = Math.cos(u) + (elevation * Math.cos(latRad)) / 6378140.0;\n\n  const deltaAlphaRad = Math.atan2(\n    -x * Math.sin(xiRad) * Math.sin(hRad),\n    Math.cos(deltaRad) - x * Math.sin(xiRad) * Math.cos(hRad)\n  );\n\n  const deltaPrime = rad2deg(\n    Math.atan2(\n      (Math.sin(deltaRad) - y * Math.sin(xiRad)) * Math.cos(deltaAlphaRad),\n      Math.cos(deltaRad) - x * Math.sin(xiRad) * Math.cos(hRad)\n    )\n  );\n\n  return {\n    deltaAlpha: rad2deg(deltaAlphaRad),\n    deltaPrime,\n  };\n}\n\n/**\n * Calculate topocentric right ascension\n * @param alphaDeg - Geocentric right ascension in degrees\n * @param deltaAlpha - Right ascension parallax in degrees\n * @returns Topocentric right ascension in degrees\n */\nexport function topocentricRightAscension(\n  alphaDeg: number,\n  deltaAlpha: number\n): number {\n  return alphaDeg + deltaAlpha;\n}\n\n/**\n * Calculate topocentric local hour angle\n * @param h - Observer hour angle in degrees\n * @param deltaAlpha - Right ascension parallax in degrees\n * @returns Topocentric local hour angle in degrees\n */\nexport function topocentricLocalHourAngle(\n  h: number,\n  deltaAlpha: number\n): number {\n  return h - deltaAlpha;\n}\n\n/**\n * Calculate topocentric elevation angle (uncorrected)\n * @param latitude - Observer latitude in degrees\n * @param deltaPrime - Topocentric declination in degrees\n * @param hPrime - Topocentric local hour angle in degrees\n * @returns Topocentric elevation angle in degrees\n */\nexport function topocentricElevationAngle(\n  latitude: number,\n  deltaPrime: number,\n  hPrime: number\n): number {\n  const latRad = deg2rad(latitude);\n  const deltaPrimeRad = deg2rad(deltaPrime);\n\n  return rad2deg(\n    Math.asin(\n      Math.sin(latRad) * Math.sin(deltaPrimeRad) +\n        Math.cos(latRad) * Math.cos(deltaPrimeRad) * Math.cos(deg2rad(hPrime))\n    )\n  );\n}\n\n/**\n * Calculate atmospheric refraction correction\n * @param pressure - Atmospheric pressure in millibars\n * @param temperature - Temperature in Celsius\n * @param atmosphericRefraction - Atmospheric refraction at sunrise/sunset in degrees\n * @param e0 - Uncorrected elevation angle in degrees\n * @returns Refraction correction in degrees\n */\nexport function atmosphericRefractionCorrection(\n  pressure: number,\n  temperature: number,\n  atmosphericRefraction: number,\n  e0: number\n): number {\n  let delE = 0;\n  if (e0 >= -1 * (SUN_RADIUS + atmosphericRefraction)) {\n    delE =\n      (pressure / 1010.0) *\n      (283.0 / (273.0 + temperature)) *\n      (1.02 / (60.0 * Math.tan(deg2rad(e0 + 10.3 / (e0 + 5.11)))));\n  }\n  return delE;\n}\n\n/**\n * Calculate topocentric elevation angle (corrected for refraction)\n * @param e0 - Uncorrected elevation angle in degrees\n * @param deltaE - Atmospheric refraction correction in degrees\n * @returns Corrected topocentric elevation angle in degrees\n */\nexport function topocentricElevationAngleCorrected(\n  e0: number,\n  deltaE: number\n): number {\n  return e0 + deltaE;\n}\n\n/**\n * Calculate topocentric zenith angle\n * @param e - Topocentric elevation angle in degrees\n * @returns Topocentric zenith angle in degrees\n */\nexport function topocentricZenithAngle(e: number): number {\n  return 90.0 - e;\n}\n\n/**\n * Calculate topocentric azimuth angle (astronomers' convention - westward from south)\n * @param hPrime - Topocentric local hour angle in degrees\n * @param latitude - Observer latitude in degrees\n * @param deltaPrime - Topocentric declination in degrees\n * @returns Azimuth angle in degrees\n */\nexport function topocentricAzimuthAngleAstro(\n  hPrime: number,\n  latitude: number,\n  deltaPrime: number\n): number {\n  const hPrimeRad = deg2rad(hPrime);\n  const latRad = deg2rad(latitude);\n\n  return limitDegrees(\n    rad2deg(\n      Math.atan2(\n        Math.sin(hPrimeRad),\n        Math.cos(hPrimeRad) * Math.sin(latRad) -\n          Math.tan(deg2rad(deltaPrime)) * Math.cos(latRad)\n      )\n    )\n  );\n}\n\n/**\n * Calculate topocentric azimuth angle (navigators' convention - eastward from north)\n * @param azimuthAstro - Astronomical azimuth in degrees\n * @returns Azimuth angle in degrees\n */\nexport function topocentricAzimuthAngle(azimuthAstro: number): number {\n  return limitDegrees(azimuthAstro + 180.0);\n}\n\n/**\n * Calculate surface incidence angle\n * @param zenith - Topocentric zenith angle in degrees\n * @param azimuthAstro - Astronomical azimuth in degrees\n * @param azimuthRotation - Surface azimuth rotation in degrees\n * @param slope - Surface slope in degrees\n * @returns Surface incidence angle in degrees\n */\nexport function surfaceIncidenceAngle(\n  zenith: number,\n  azimuthAstro: number,\n  azimuthRotation: number,\n  slope: number\n): number {\n  const zenithRad = deg2rad(zenith);\n  const slopeRad = deg2rad(slope);\n\n  return rad2deg(\n    Math.acos(\n      Math.cos(zenithRad) * Math.cos(slopeRad) +\n        Math.sin(slopeRad) *\n          Math.sin(zenithRad) *\n          Math.cos(deg2rad(azimuthAstro - azimuthRotation))\n    )\n  );\n}\n","/**\n * Sunrise, Transit, and Sunset (RTS) calculations for Solar Position Algorithm\n * Handles high-latitude edge cases (polar day/night)\n */\n\nimport { SUN_RADIUS, INVALID_VALUE } from '../constants';\nimport { JDSign, SunState, SpaData } from '../types';\nimport {\n  deg2rad,\n  rad2deg,\n  limitDegrees180,\n  limitDegrees180pm,\n  limitZero2one,\n  limitMinutes,\n} from '../utils/math';\nimport { julianDay } from '../utils/date';\nimport { dayfracToLocalHr } from '../utils/time';\nimport { sunMeanLongitude } from './sun';\n\n/**\n * Calculate sun hour angle at rise/set for a given zenith\n * @param latitude - Observer latitude in degrees\n * @param deltaZero - Geocentric declination at noon in degrees\n * @param h0Prime - Zenith angle for rise/set (negative of elevation at horizon)\n * @returns Hour angle in degrees, or INVALID_VALUE if sun doesn't rise/set (polar day/night)\n */\nexport function sunHourAngleAtRiseSet(\n  latitude: number,\n  deltaZero: number,\n  h0Prime: number\n): number {\n  const latitudeRad = deg2rad(latitude);\n  const deltaZeroRad = deg2rad(deltaZero);\n\n  const argument =\n    (Math.sin(deg2rad(h0Prime)) -\n      Math.sin(latitudeRad) * Math.sin(deltaZeroRad)) /\n    (Math.cos(latitudeRad) * Math.cos(deltaZeroRad));\n\n  if (Math.abs(argument) <= 1) {\n    return limitDegrees180(rad2deg(Math.acos(argument)));\n  }\n\n  // Sun never rises or sets (polar day or polar night)\n  return INVALID_VALUE;\n}\n\n/**\n * Calculate approximate sun transit time\n * @param alphaZero - Right ascension at noon in degrees\n * @param longitude - Observer longitude in degrees\n * @param nu - Greenwich sidereal time in degrees\n * @returns Approximate transit time as day fraction\n */\nexport function approxSunTransitTime(\n  alphaZero: number,\n  longitude: number,\n  nu: number\n): number {\n  return (alphaZero - longitude - nu) / 360.0;\n}\n\n/**\n * Calculate approximate sunrise and sunset times\n * @param mRts - Array to store [transit, rise, set] day fractions (modified in place)\n * @param h0 - Hour angle at rise/set in degrees\n */\nexport function approxSunRiseAndSet(mRts: number[], h0: number): void {\n  const h0Dfrac = h0 / 360.0;\n  mRts[SunState.SUN_RISE] = limitZero2one(mRts[SunState.SUN_TRANSIT] - h0Dfrac);\n  mRts[SunState.SUN_SET] = limitZero2one(mRts[SunState.SUN_TRANSIT] + h0Dfrac);\n  mRts[SunState.SUN_TRANSIT] = limitZero2one(mRts[SunState.SUN_TRANSIT]);\n}\n\n/**\n * Calculate interpolated alpha or delta for RTS\n * @param ad - Array of [yesterday, today, tomorrow] values\n * @param n - Interpolation factor\n * @returns Interpolated value\n */\nexport function rtsAlphaDeltaPrime(ad: number[], n: number): number {\n  let a = ad[JDSign.JD_ZERO] - ad[JDSign.JD_MINUS];\n  let b = ad[JDSign.JD_PLUS] - ad[JDSign.JD_ZERO];\n\n  // Handle wraparound for right ascension\n  if (Math.abs(a) >= 2.0) {\n    a = limitZero2one(a);\n  }\n  if (Math.abs(b) >= 2.0) {\n    b = limitZero2one(b);\n  }\n\n  return ad[JDSign.JD_ZERO] + (n * (a + b + (b - a) * n)) / 2.0;\n}\n\n/**\n * Calculate sun altitude for RTS\n * @param latitude - Observer latitude in degrees\n * @param deltaPrime - Topocentric declination in degrees\n * @param hPrime - Topocentric hour angle in degrees\n * @returns Sun altitude in degrees\n */\nexport function rtsSunAltitude(\n  latitude: number,\n  deltaPrime: number,\n  hPrime: number\n): number {\n  const latitudeRad = deg2rad(latitude);\n  const deltaPrimeRad = deg2rad(deltaPrime);\n\n  return rad2deg(\n    Math.asin(\n      Math.sin(latitudeRad) * Math.sin(deltaPrimeRad) +\n        Math.cos(latitudeRad) *\n          Math.cos(deltaPrimeRad) *\n          Math.cos(deg2rad(hPrime))\n    )\n  );\n}\n\n/**\n * Calculate refined sunrise or sunset time\n * @param mRts - Array of [transit, rise, set] day fractions\n * @param hRts - Array of sun altitudes at [transit, rise, set]\n * @param deltaPrime - Array of topocentric declinations\n * @param latitude - Observer latitude in degrees\n * @param hPrime - Array of topocentric hour angles\n * @param h0Prime - Target elevation at horizon\n * @param sun - SunState indicating which time to calculate\n * @returns Refined day fraction for the requested sun state\n */\nexport function sunRiseAndSet(\n  mRts: number[],\n  hRts: number[],\n  deltaPrime: number[],\n  latitude: number,\n  hPrime: number[],\n  h0Prime: number,\n  sun: SunState\n): number {\n  return (\n    mRts[sun] +\n    (hRts[sun] - h0Prime) /\n      (360.0 *\n        Math.cos(deg2rad(deltaPrime[sun])) *\n        Math.cos(deg2rad(latitude)) *\n        Math.sin(deg2rad(hPrime[sun])))\n  );\n}\n\n/**\n * Calculate equation of time\n * @param m - Sun mean longitude in degrees\n * @param alpha - Geocentric right ascension in degrees\n * @param delPsi - Nutation in longitude in degrees\n * @param epsilon - True obliquity in degrees\n * @returns Equation of time in minutes\n */\nexport function equationOfTime(\n  m: number,\n  alpha: number,\n  delPsi: number,\n  epsilon: number\n): number {\n  return limitMinutes(\n    4.0 * (m - 0.0057183 - alpha + delPsi * Math.cos(deg2rad(epsilon)))\n  );\n}\n\n/**\n * RTS calculation result interface\n */\nexport interface RtsResult {\n  /** Sunrise time in fractional hours (local time) */\n  sunrise: number;\n  /** Solar noon/transit time in fractional hours (local time) */\n  suntransit: number;\n  /** Sunset time in fractional hours (local time) */\n  sunset: number;\n  /** Sunrise hour angle in degrees */\n  srha: number;\n  /** Sunset hour angle in degrees */\n  ssha: number;\n  /** Sun transit altitude in degrees */\n  sta: number;\n  /** Equation of time in minutes */\n  eot: number;\n}\n\n/**\n * Calculate equation of time and sun rise/transit/set times\n * This is the main RTS calculation function that handles high-latitude cases\n * \n * @param spa - SPA data object with all calculated values\n * @param calculateRaDec - Function to calculate RA and Dec for a given Julian Day\n * @returns RTS calculation results\n */\nexport function calculateEotAndSunRiseTransitSet(\n  spa: SpaData,\n  calculateRaDec: (jd: number, deltaT: number) => { alpha: number; delta: number; nu: number }\n): RtsResult {\n  const h0Prime = -1 * (SUN_RADIUS + spa.atmosphericRefraction);\n\n  // Calculate values at midnight UTC\n  const sunRtsJd = julianDay(\n    spa.year,\n    spa.month,\n    spa.day,\n    0, 0, 0, 0, 0\n  );\n\n  // Get RA/Dec at midnight\n  const rtsNoon = calculateRaDec(sunRtsJd, spa.deltaT);\n  const nu = rtsNoon.nu;\n\n  // Calculate equation of time\n  const m = sunMeanLongitude(spa.jme);\n  const eot = equationOfTime(m, spa.alpha, spa.delPsi, spa.epsilon);\n\n  // Calculate RA/Dec for yesterday, today, tomorrow\n  const alpha: number[] = [];\n  const delta: number[] = [];\n\n  for (let i = 0; i < JDSign.JD_COUNT; i++) {\n    const result = calculateRaDec(sunRtsJd + i - 1, spa.deltaT);\n    alpha[i] = result.alpha;\n    delta[i] = result.delta;\n  }\n\n  // Calculate approximate transit time\n  const mRts: number[] = [];\n  mRts[SunState.SUN_TRANSIT] = approxSunTransitTime(\n    alpha[JDSign.JD_ZERO],\n    spa.longitude,\n    nu\n  );\n\n  // Calculate hour angle at rise/set\n  const h0 = sunHourAngleAtRiseSet(spa.latitude, delta[JDSign.JD_ZERO], h0Prime);\n\n  // Handle polar day/night\n  if (h0 === INVALID_VALUE) {\n    return {\n      sunrise: INVALID_VALUE,\n      suntransit: INVALID_VALUE,\n      sunset: INVALID_VALUE,\n      srha: INVALID_VALUE,\n      ssha: INVALID_VALUE,\n      sta: INVALID_VALUE,\n      eot,\n    };\n  }\n\n  // Calculate approximate rise/set times\n  approxSunRiseAndSet(mRts, h0);\n\n  // Refine calculations using interpolation\n  const nuRts: number[] = [];\n  const hPrime: number[] = [];\n  const alphaPrime: number[] = [];\n  const deltaPrime: number[] = [];\n  const hRts: number[] = [];\n\n  for (let i = 0; i < SunState.SUN_COUNT; i++) {\n    nuRts[i] = nu + 360.985647 * mRts[i];\n    const n = mRts[i] + spa.deltaT / 86400.0;\n    alphaPrime[i] = rtsAlphaDeltaPrime(alpha, n);\n    deltaPrime[i] = rtsAlphaDeltaPrime(delta, n);\n    hPrime[i] = limitDegrees180pm(nuRts[i] + spa.longitude - alphaPrime[i]);\n    hRts[i] = rtsSunAltitude(spa.latitude, deltaPrime[i], hPrime[i]);\n  }\n\n  // Calculate final times\n  const srha = hPrime[SunState.SUN_RISE];\n  const ssha = hPrime[SunState.SUN_SET];\n  const sta = hRts[SunState.SUN_TRANSIT];\n\n  const suntransit = dayfracToLocalHr(\n    mRts[SunState.SUN_TRANSIT] - hPrime[SunState.SUN_TRANSIT] / 360.0,\n    spa.timezone\n  );\n\n  const sunrise = dayfracToLocalHr(\n    sunRiseAndSet(mRts, hRts, deltaPrime, spa.latitude, hPrime, h0Prime, SunState.SUN_RISE),\n    spa.timezone\n  );\n\n  const sunset = dayfracToLocalHr(\n    sunRiseAndSet(mRts, hRts, deltaPrime, spa.latitude, hPrime, h0Prime, SunState.SUN_SET),\n    spa.timezone\n  );\n\n  return {\n    sunrise,\n    suntransit,\n    sunset,\n    srha,\n    ssha,\n    sta,\n    eot,\n  };\n}\n\n/**\n * Calculate sunrise/sunset for a custom zenith angle (for twilight calculations)\n * @param latitude - Observer latitude in degrees\n * @param delta - Sun declination in degrees\n * @param suntransit - Solar noon time in fractional hours\n * @param zenithAngle - Custom zenith angle in degrees\n * @returns Object with sunrise and sunset in fractional hours, or null values for polar cases\n */\nexport function calculateCustomZenithTimes(\n  latitude: number,\n  delta: number,\n  suntransit: number,\n  zenithAngle: number\n): { sunrise: number | null; sunset: number | null } {\n  const latRad = deg2rad(latitude);\n  const deltaRad = deg2rad(delta);\n  const zenithRad = deg2rad(zenithAngle);\n\n  const cosH0 =\n    (Math.cos(zenithRad) - Math.sin(latRad) * Math.sin(deltaRad)) /\n    (Math.cos(latRad) * Math.cos(deltaRad));\n\n  // Check for polar day/night at this zenith angle\n  if (cosH0 < -1 || cosH0 > 1) {\n    return { sunrise: null, sunset: null };\n  }\n\n  const H0h = (rad2deg(Math.acos(cosH0))) / 15; // Convert to hours\n\n  return {\n    sunrise: suntransit - H0h,\n    sunset: suntransit + H0h,\n  };\n}\n","/**\n * Solar Position Algorithm (SPA) Main Calculator\n * Based on NREL's Solar Position Algorithm for Solar Radiation Applications\n * \n * This is the core SPA calculation module that orchestrates all sub-calculations\n * to determine precise solar position and rise/transit/set times.\n */\n\nimport { SpaData, SpaFunction, SpaOptions } from './types';\nimport { REFRACTION_CORRECTION, INVALID_VALUE } from './constants';\nimport {\n  julianDay,\n  julianCentury,\n  julianEphemerisDay,\n  julianEphemerisCentury,\n  julianEphemerisMillennium,\n} from './utils/date';\nimport {\n  earthHeliocentricLongitude,\n  earthHeliocentricLatitude,\n  earthRadiusVector,\n} from './calculations/earth';\nimport {\n  geocentricLongitude,\n  geocentricLatitude,\n  aberrationCorrection,\n  apparentSunLongitude,\n  geocentricRightAscension,\n  geocentricDeclination,\n  sunEquatorialHorizontalParallax,\n} from './calculations/sun';\nimport {\n  meanElongationMoonSun,\n  meanAnomalySun,\n  meanAnomalyMoon,\n  argumentLatitudeMoon,\n  ascendingLongitudeMoon,\n  nutationLongitudeAndObliquity,\n  eclipticMeanObliquity,\n  eclipticTrueObliquity,\n} from './calculations/nutation';\nimport {\n  greenwichMeanSiderealTime,\n  greenwichSiderealTime,\n  observerHourAngle,\n  rightAscensionParallaxAndTopocentricDec,\n  topocentricRightAscension,\n  topocentricLocalHourAngle,\n  topocentricElevationAngle,\n  atmosphericRefractionCorrection,\n  topocentricElevationAngleCorrected,\n  topocentricZenithAngle,\n  topocentricAzimuthAngleAstro,\n  topocentricAzimuthAngle,\n  surfaceIncidenceAngle,\n} from './calculations/observer';\nimport { calculateEotAndSunRiseTransitSet } from './calculations/rts';\n\n/**\n * Create a new SpaData object with default values\n */\nexport function createSpaData(): SpaData {\n  return {\n    // Input values\n    year: 0,\n    month: 0,\n    day: 0,\n    hour: 0,\n    minute: 0,\n    second: 0,\n    deltaUt1: 0,\n    deltaT: 67,\n    timezone: 0,\n    longitude: 0,\n    latitude: 0,\n    elevation: 0,\n    pressure: 1013,\n    temperature: 15,\n    slope: 0,\n    azimuthRotation: 0,\n    atmosphericRefraction: REFRACTION_CORRECTION,\n    timezoneId: '',\n    function: SpaFunction.SPA_ALL,\n\n    // Intermediate values\n    jd: 0,\n    jc: 0,\n    jde: 0,\n    jce: 0,\n    jme: 0,\n    l: 0,\n    b: 0,\n    r: 0,\n    theta: 0,\n    beta: 0,\n    x0: 0,\n    x1: 0,\n    x2: 0,\n    x3: 0,\n    x4: 0,\n    delPsi: 0,\n    delEpsilon: 0,\n    epsilon0: 0,\n    epsilon: 0,\n    delTau: 0,\n    lamda: 0,\n    nu0: 0,\n    nu: 0,\n    alpha: 0,\n    delta: 0,\n    h: 0,\n    xi: 0,\n    delAlpha: 0,\n    deltaPrime: 0,\n    alphaPrime: 0,\n    hPrime: 0,\n    e0: 0,\n    delE: 0,\n    e: 0,\n    eot: 0,\n    srha: 0,\n    ssha: 0,\n    sta: 0,\n\n    // Output values\n    zenith: 0,\n    azimuthAstro: 0,\n    azimuth: 0,\n    incidence: 0,\n    suntransit: 0,\n    sunrise: 0,\n    sunset: 0,\n  };\n}\n\n/**\n * Validate SPA input values\n * @returns 0 if valid, error code otherwise\n */\nexport function validateInputs(spa: SpaData): number {\n  if (spa.year < -2000 || spa.year > 6000) return 1;\n  if (spa.month < 1 || spa.month > 12) return 2;\n  if (spa.day < 1 || spa.day > 31) return 3;\n  if (spa.hour < 0 || spa.hour > 24) return 4;\n  if (spa.minute < 0 || spa.minute > 59) return 5;\n  if (spa.second < 0 || spa.second >= 60) return 6;\n  if (spa.pressure < 0 || spa.pressure > 5000) return 12;\n  if (spa.temperature <= -273 || spa.temperature > 6000) return 13;\n  if (spa.deltaUt1 <= -1 || spa.deltaUt1 >= 1) return 17;\n  if (spa.hour === 24 && spa.minute > 0) return 5;\n  if (spa.hour === 24 && spa.second > 0) return 6;\n  if (Math.abs(spa.deltaT) > 8000) return 7;\n  if (Math.abs(spa.timezone) > 18) return 8;\n  if (Math.abs(spa.longitude) > 180) return 9;\n  if (Math.abs(spa.latitude) > 90) return 10;\n  if (Math.abs(spa.atmosphericRefraction) > 5) return 16;\n  if (spa.elevation < -6500000) return 11;\n  return 0;\n}\n\n/**\n * Calculate geocentric sun right ascension and declination\n * This is a core calculation that's reused for RTS calculations\n */\nexport function calculateGeocentricSunRaAndDec(spa: SpaData): void {\n  spa.jc = julianCentury(spa.jd);\n  spa.jde = julianEphemerisDay(spa.jd, spa.deltaT);\n  spa.jce = julianEphemerisCentury(spa.jde);\n  spa.jme = julianEphemerisMillennium(spa.jce);\n\n  spa.l = earthHeliocentricLongitude(spa.jme);\n  spa.b = earthHeliocentricLatitude(spa.jme);\n  spa.r = earthRadiusVector(spa.jme);\n\n  spa.theta = geocentricLongitude(spa.l);\n  spa.beta = geocentricLatitude(spa.b);\n\n  // Calculate X terms for nutation\n  spa.x0 = meanElongationMoonSun(spa.jce);\n  spa.x1 = meanAnomalySun(spa.jce);\n  spa.x2 = meanAnomalyMoon(spa.jce);\n  spa.x3 = argumentLatitudeMoon(spa.jce);\n  spa.x4 = ascendingLongitudeMoon(spa.jce);\n\n  const x = [spa.x0, spa.x1, spa.x2, spa.x3, spa.x4];\n  const nutation = nutationLongitudeAndObliquity(spa.jce, x);\n  spa.delPsi = nutation.delPsi;\n  spa.delEpsilon = nutation.delEpsilon;\n\n  spa.epsilon0 = eclipticMeanObliquity(spa.jme);\n  spa.epsilon = eclipticTrueObliquity(spa.delEpsilon, spa.epsilon0);\n\n  spa.delTau = aberrationCorrection(spa.r);\n  spa.lamda = apparentSunLongitude(spa.theta, spa.delPsi, spa.delTau);\n\n  spa.nu0 = greenwichMeanSiderealTime(spa.jd, spa.jc);\n  spa.nu = greenwichSiderealTime(spa.nu0, spa.delPsi, spa.epsilon);\n\n  spa.alpha = geocentricRightAscension(spa.lamda, spa.epsilon, spa.beta);\n  spa.delta = geocentricDeclination(spa.beta, spa.epsilon, spa.lamda);\n}\n\n/**\n * Helper function to calculate RA/Dec for a given Julian Day\n * Used by RTS calculations\n */\nfunction calculateRaDecForJd(\n  jd: number,\n  deltaT: number\n): { alpha: number; delta: number; nu: number } {\n  const jc = julianCentury(jd);\n  const jde = julianEphemerisDay(jd, deltaT);\n  const jce = julianEphemerisCentury(jde);\n  const jme = julianEphemerisMillennium(jce);\n\n  const l = earthHeliocentricLongitude(jme);\n  const b = earthHeliocentricLatitude(jme);\n  const r = earthRadiusVector(jme);\n\n  const theta = geocentricLongitude(l);\n  const beta = geocentricLatitude(b);\n\n  const x0 = meanElongationMoonSun(jce);\n  const x1 = meanAnomalySun(jce);\n  const x2 = meanAnomalyMoon(jce);\n  const x3 = argumentLatitudeMoon(jce);\n  const x4 = ascendingLongitudeMoon(jce);\n\n  const x = [x0, x1, x2, x3, x4];\n  const nutation = nutationLongitudeAndObliquity(jce, x);\n\n  const epsilon0 = eclipticMeanObliquity(jme);\n  const epsilon = eclipticTrueObliquity(nutation.delEpsilon, epsilon0);\n\n  const delTau = aberrationCorrection(r);\n  const lamda = apparentSunLongitude(theta, nutation.delPsi, delTau);\n\n  const nu0 = greenwichMeanSiderealTime(jd, jc);\n  const nu = greenwichSiderealTime(nu0, nutation.delPsi, epsilon);\n\n  const alpha = geocentricRightAscension(lamda, epsilon, beta);\n  const delta = geocentricDeclination(beta, epsilon, lamda);\n\n  return { alpha, delta, nu };\n}\n\n/**\n * Main SPA calculation function\n * Calculates all solar position values based on input parameters\n * \n * @param spa - SPA data object with input values filled in\n * @returns 0 if successful, error code otherwise\n */\nexport function spaCalculate(spa: SpaData): number {\n  const result = validateInputs(spa);\n  if (result !== 0) {\n    return result;\n  }\n\n  // Calculate Julian Day\n  spa.jd = julianDay(\n    spa.year,\n    spa.month,\n    spa.day,\n    spa.hour,\n    spa.minute,\n    spa.second,\n    spa.deltaUt1,\n    spa.timezone\n  );\n\n  // Calculate geocentric sun position\n  calculateGeocentricSunRaAndDec(spa);\n\n  // Calculate observer-specific values\n  spa.h = observerHourAngle(spa.nu, spa.longitude, spa.alpha);\n  spa.xi = sunEquatorialHorizontalParallax(spa.r);\n\n  const parallax = rightAscensionParallaxAndTopocentricDec(\n    spa.latitude,\n    spa.elevation,\n    spa.xi,\n    spa.h,\n    spa.delta\n  );\n  spa.delAlpha = parallax.deltaAlpha;\n  spa.deltaPrime = parallax.deltaPrime;\n\n  spa.alphaPrime = topocentricRightAscension(spa.alpha, spa.delAlpha);\n  spa.hPrime = topocentricLocalHourAngle(spa.h, spa.delAlpha);\n\n  spa.e0 = topocentricElevationAngle(spa.latitude, spa.deltaPrime, spa.hPrime);\n  spa.delE = atmosphericRefractionCorrection(\n    spa.pressure,\n    spa.temperature,\n    spa.atmosphericRefraction,\n    spa.e0\n  );\n  spa.e = topocentricElevationAngleCorrected(spa.e0, spa.delE);\n\n  spa.zenith = topocentricZenithAngle(spa.e);\n  spa.azimuthAstro = topocentricAzimuthAngleAstro(\n    spa.hPrime,\n    spa.latitude,\n    spa.deltaPrime\n  );\n  spa.azimuth = topocentricAzimuthAngle(spa.azimuthAstro);\n\n  // Calculate incidence angle if requested\n  if (\n    spa.function === SpaFunction.SPA_ZA_INC ||\n    spa.function === SpaFunction.SPA_ALL\n  ) {\n    spa.incidence = surfaceIncidenceAngle(\n      spa.zenith,\n      spa.azimuthAstro,\n      spa.azimuthRotation,\n      spa.slope\n    );\n  }\n\n  // Calculate RTS if requested\n  if (\n    spa.function === SpaFunction.SPA_ZA_RTS ||\n    spa.function === SpaFunction.SPA_ALL\n  ) {\n    const rts = calculateEotAndSunRiseTransitSet(spa, calculateRaDecForJd);\n    spa.sunrise = rts.sunrise;\n    spa.suntransit = rts.suntransit;\n    spa.sunset = rts.sunset;\n    spa.srha = rts.srha;\n    spa.ssha = rts.ssha;\n    spa.sta = rts.sta;\n    spa.eot = rts.eot;\n  }\n\n  return 0;\n}\n\n/**\n * Initialize SPA data from a Date object and coordinates\n */\nexport function initSpaFromDate(\n  date: Date,\n  latitude: number,\n  longitude: number,\n  options: SpaOptions = {}\n): SpaData {\n  const spa = createSpaData();\n\n  // Use local time components\n  spa.year = date.getFullYear();\n  spa.month = date.getMonth() + 1;\n  spa.day = date.getDate();\n  spa.hour = date.getHours();\n  spa.minute = date.getMinutes();\n  spa.second = date.getSeconds() + date.getMilliseconds() / 1000;\n\n  if (options.timezone !== undefined) {\n    spa.timezone = options.timezone;\n  } else {\n    spa.timezone = -date.getTimezoneOffset() / 60;\n  }\n\n  spa.timezoneId = options.timezoneId ?? '';\n\n  spa.latitude = latitude;\n  spa.longitude = longitude;\n\n  // Apply options\n  spa.elevation = options.elevation ?? 0;\n  spa.pressure = options.pressure ?? 1013;\n  spa.temperature = options.temperature ?? 15;\n  spa.deltaUt1 = options.deltaUt1 ?? 0;\n  spa.deltaT = options.deltaT ?? 67;\n  spa.slope = options.slope ?? 0;\n  spa.azimuthRotation = options.azimuthRotation ?? 0;\n  spa.atmosphericRefraction = options.atmosphericRefraction ?? REFRACTION_CORRECTION;\n\n  spa.function = SpaFunction.SPA_ALL;\n\n  return spa;\n}\n\n/**\n * Check if a sunrise/sunset time is valid (not polar day/night)\n */\nexport function isValidSunTime(time: number): boolean {\n  return time !== INVALID_VALUE && isFinite(time) && time >= 0;\n}\n","/**\n * Solar Position Algorithm Constants\n * Based on NREL's Solar Position Algorithm for Solar Radiation Applications\n *\n * @module sunrise-sunset\n */\n\nimport {\n  SpaOptions,\n  SolarPosition,\n  TwilightTimes,\n} from './types';\nimport {\n  ZENITH_CIVIL_TWILIGHT,\n  ZENITH_NAUTICAL_TWILIGHT,\n  ZENITH_ASTRONOMICAL_TWILIGHT,\n  ZENITH_GOLDEN_HOUR,\n  ZENITH_BLUE_HOUR,\n} from './constants';\nimport { fractionalHourToDate } from './utils/time';\nimport {\n  initSpaFromDate,\n  spaCalculate,\n  isValidSunTime,\n} from './spa';\nimport { calculateCustomZenithTimes } from './calculations/rts';\n\n// Re-export types for consumers\nexport type { SpaOptions, SolarPosition, TwilightTimes } from './types';\n\n/**\n * Get the sunrise time for a given location and date\n * \n * @param latitude - Observer latitude in degrees (positive north)\n * @param longitude - Observer longitude in degrees (positive east)\n * @param date - Date for calculation (defaults to current date/time)\n * @param options - Optional SPA calculation options\n * @returns Date object representing sunrise time, or null if sun doesn't rise (polar night)\n * \n * @example\n * ```typescript\n * const sunrise = getSunrise(51.5074, -0.1278); // London\n * console.log(sunrise?.toLocaleTimeString());\n * ```\n */\nexport function getSunrise(\n  latitude: number,\n  longitude: number,\n  date: Date = new Date(),\n  options?: SpaOptions\n): Date | null {\n  const spa = initSpaFromDate(date, latitude, longitude, options);\n  const result = spaCalculate(spa);\n\n  if (result !== 0 || !isValidSunTime(spa.sunrise)) {\n    return null;\n  }\n\n  return fractionalHourToDate(date, spa.sunrise, spa.timezone);\n}\n\n/**\n * Get the sunset time for a given location and date\n * \n * @param latitude - Observer latitude in degrees (positive north)\n * @param longitude - Observer longitude in degrees (positive east)\n * @param date - Date for calculation (defaults to current date/time)\n * @param options - Optional SPA calculation options\n * @returns Date object representing sunset time, or null if sun doesn't set (polar day)\n * \n * @example\n * ```typescript\n * const sunset = getSunset(51.5074, -0.1278); // London\n * console.log(sunset?.toLocaleTimeString());\n * ```\n */\nexport function getSunset(\n  latitude: number,\n  longitude: number,\n  date: Date = new Date(),\n  options?: SpaOptions\n): Date | null {\n  const spa = initSpaFromDate(date, latitude, longitude, options);\n  const result = spaCalculate(spa);\n\n  if (result !== 0 || !isValidSunTime(spa.sunset)) {\n    return null;\n  }\n\n  return fractionalHourToDate(date, spa.sunset, spa.timezone);\n}\n\n/**\n * Get the solar noon (sun transit) time for a given location and date\n * \n * @param latitude - Observer latitude in degrees (positive north)\n * @param longitude - Observer longitude in degrees (positive east)\n * @param date - Date for calculation (defaults to current date/time)\n * @param options - Optional SPA calculation options\n * @returns Date object representing solar noon time, or null on calculation error\n * \n * @example\n * ```typescript\n * const noon = getSolarNoon(51.5074, -0.1278); // London\n * console.log(noon?.toLocaleTimeString());\n * ```\n */\nexport function getSolarNoon(\n  latitude: number,\n  longitude: number,\n  date: Date = new Date(),\n  options?: SpaOptions\n): Date | null {\n  const spa = initSpaFromDate(date, latitude, longitude, options);\n  const result = spaCalculate(spa);\n\n  if (result !== 0 || !isValidSunTime(spa.suntransit)) {\n    return null;\n  }\n\n  return fractionalHourToDate(date, spa.suntransit, spa.timezone);\n}\n\n/**\n * Get the current solar position (zenith, azimuth, elevation, etc.)\n * \n * @param latitude - Observer latitude in degrees (positive north)\n * @param longitude - Observer longitude in degrees (positive east)\n * @param date - Date for calculation (defaults to current date/time)\n * @param options - Optional SPA calculation options\n * @returns Solar position object with zenith, azimuth, elevation, etc.\n * \n * @example\n * ```typescript\n * const position = getSolarPosition(51.5074, -0.1278);\n * console.log(`Sun is at ${position.elevation}° elevation, ${position.azimuth}° azimuth`);\n * ```\n */\nexport function getSolarPosition(\n  latitude: number,\n  longitude: number,\n  date: Date = new Date(),\n  options?: SpaOptions\n): SolarPosition | null {\n  const spa = initSpaFromDate(date, latitude, longitude, options);\n  const result = spaCalculate(spa);\n\n  if (result !== 0) {\n    return null;\n  }\n\n  return {\n    zenith: spa.zenith,\n    azimuth: spa.azimuth,\n    azimuthAstro: spa.azimuthAstro,\n    elevation: spa.e,\n    rightAscension: spa.alpha,\n    declination: spa.delta,\n    hourAngle: spa.h,\n  };\n}\n\n/**\n * Get civil, nautical, and astronomical twilight times\n * \n * Civil twilight: Sun is 6° below the horizon\n * Nautical twilight: Sun is 12° below the horizon\n * Astronomical twilight: Sun is 18° below the horizon\n * \n * @param latitude - Observer latitude in degrees (positive north)\n * @param longitude - Observer longitude in degrees (positive east)\n * @param date - Date for calculation (defaults to current date/time)\n * @param options - Optional SPA calculation options\n * @returns Twilight times object, with null values for polar conditions\n * \n * @example\n * ```typescript\n * const twilight = getTwilight(51.5074, -0.1278);\n * console.log(`Civil dawn: ${twilight.civilDawn?.toLocaleTimeString()}`);\n * console.log(`Civil dusk: ${twilight.civilDusk?.toLocaleTimeString()}`);\n * ```\n */\nexport function getTwilight(\n  latitude: number,\n  longitude: number,\n  date: Date = new Date(),\n  options?: SpaOptions\n): TwilightTimes | null {\n  const spa = initSpaFromDate(date, latitude, longitude, options);\n  const result = spaCalculate(spa);\n\n  if (result !== 0 || !isValidSunTime(spa.suntransit)) {\n    return null;\n  }\n\n  // Calculate twilight times using custom zenith angles\n  const civil = calculateCustomZenithTimes(\n    latitude,\n    spa.delta,\n    spa.suntransit,\n    ZENITH_CIVIL_TWILIGHT\n  );\n\n  const nautical = calculateCustomZenithTimes(\n    latitude,\n    spa.delta,\n    spa.suntransit,\n    ZENITH_NAUTICAL_TWILIGHT\n  );\n\n  const astronomical = calculateCustomZenithTimes(\n    latitude,\n    spa.delta,\n    spa.suntransit,\n    ZENITH_ASTRONOMICAL_TWILIGHT\n  );\n\n  const golden = calculateCustomZenithTimes(\n    latitude,\n    spa.delta,\n    spa.suntransit,\n    ZENITH_GOLDEN_HOUR\n  );\n\n  const blue = calculateCustomZenithTimes(\n    latitude,\n    spa.delta,\n    spa.suntransit,\n    ZENITH_BLUE_HOUR\n  );\n\n  // Convert fractional hours to Date objects\n  const toDate = (hours: number | null): Date | null => {\n    if (hours === null || !isFinite(hours) || hours < 0 || hours > 24) {\n      return null;\n    }\n    return fractionalHourToDate(date, hours, spa.timezone);\n  };\n\n  return {\n    civilDawn: toDate(civil.sunrise),\n    civilDusk: toDate(civil.sunset),\n    nauticalDawn: toDate(nautical.sunrise),\n    nauticalDusk: toDate(nautical.sunset),\n    astronomicalDawn: toDate(astronomical.sunrise),\n    astronomicalDusk: toDate(astronomical.sunset),\n    goldenHour: {\n      morning: { start: toDate(spa.sunrise), end: toDate(golden.sunrise) },\n      evening: { start: toDate(golden.sunset), end: toDate(spa.sunset) },\n    },\n    blueHour: {\n      morning: { start: toDate(blue.sunrise), end: toDate(spa.sunrise) },\n      evening: { start: toDate(spa.sunset), end: toDate(blue.sunset) },\n    },\n  };\n}\n\n/**\n * Get all sun times for a given location and date in a single call\n * More efficient than calling individual functions separately\n * \n * @param latitude - Observer latitude in degrees (positive north)\n * @param longitude - Observer longitude in degrees (positive east)\n * @param date - Date for calculation (defaults to current date/time)\n * @param options - Optional SPA calculation options\n * @returns Object containing sunrise, sunset, solar noon, and twilight times\n * \n * @example\n * ```typescript\n * const times = getSunTimes(51.5074, -0.1278);\n * console.log(`Sunrise: ${times.sunrise?.toLocaleTimeString()}`);\n * console.log(`Sunset: ${times.sunset?.toLocaleTimeString()}`);\n * console.log(`Solar noon: ${times.solarNoon?.toLocaleTimeString()}`);\n * ```\n */\nexport function getSunTimes(\n  latitude: number,\n  longitude: number,\n  date: Date = new Date(),\n  options?: SpaOptions\n): {\n  sunrise: Date | null;\n  sunset: Date | null;\n  solarNoon: Date | null;\n  twilight: TwilightTimes | null;\n} {\n  const spa = initSpaFromDate(date, latitude, longitude, options);\n  const result = spaCalculate(spa);\n\n  if (result !== 0) {\n    return {\n      sunrise: null,\n      sunset: null,\n      solarNoon: null,\n      twilight: null,\n    };\n  }\n\n  const toDate = (hours: number): Date | null => {\n    if (!isValidSunTime(hours)) {\n      return null;\n    }\n    return fractionalHourToDate(date, hours, spa.timezone);\n  };\n\n  // Calculate twilight times\n  let twilight: TwilightTimes | null = null;\n  if (isValidSunTime(spa.suntransit)) {\n    const civil = calculateCustomZenithTimes(\n      latitude,\n      spa.delta,\n      spa.suntransit,\n      ZENITH_CIVIL_TWILIGHT\n    );\n\n    const nautical = calculateCustomZenithTimes(\n      latitude,\n      spa.delta,\n      spa.suntransit,\n      ZENITH_NAUTICAL_TWILIGHT\n    );\n\n    const astronomical = calculateCustomZenithTimes(\n      latitude,\n      spa.delta,\n      spa.suntransit,\n      ZENITH_ASTRONOMICAL_TWILIGHT\n    );\n\n    const golden = calculateCustomZenithTimes(\n      latitude,\n      spa.delta,\n      spa.suntransit,\n      ZENITH_GOLDEN_HOUR\n    );\n\n    const blue = calculateCustomZenithTimes(\n      latitude,\n      spa.delta,\n      spa.suntransit,\n      ZENITH_BLUE_HOUR\n    );\n\n    const twilightToDate = (hours: number | null): Date | null => {\n      if (hours === null || !isFinite(hours) || hours < 0 || hours > 24) {\n        return null;\n      }\n      return fractionalHourToDate(date, hours, spa.timezone);\n    };\n\n    twilight = {\n      civilDawn: twilightToDate(civil.sunrise),\n      civilDusk: twilightToDate(civil.sunset),\n      nauticalDawn: twilightToDate(nautical.sunrise),\n      nauticalDusk: twilightToDate(nautical.sunset),\n      astronomicalDawn: twilightToDate(astronomical.sunrise),\n      astronomicalDusk: twilightToDate(astronomical.sunset),\n      goldenHour: {\n        morning: { start: twilightToDate(spa.sunrise), end: twilightToDate(golden.sunrise) },\n        evening: { start: twilightToDate(golden.sunset), end: twilightToDate(spa.sunset) },\n      },\n      blueHour: {\n        morning: { start: twilightToDate(blue.sunrise), end: twilightToDate(spa.sunrise) },\n        evening: { start: twilightToDate(spa.sunset), end: twilightToDate(blue.sunset) },\n      },\n    };\n  }\n\n  return {\n    sunrise: toDate(spa.sunrise),\n    sunset: toDate(spa.sunset),\n    solarNoon: toDate(spa.suntransit),\n    twilight,\n  };\n}\n\n"],"mappings":"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EAAC;EAAI;EAAG;EAAG;EAAG;EAAE;CAChB;EAAC;EAAG;EAAG;EAAG;EAAG;EAAE;CACf;EAAC;EAAG;EAAG;EAAG;EAAG;EAAE;CACf;EAAC;EAAI;EAAI;EAAG;EAAG;EAAE;CACjB;EAAC;EAAI;EAAG;EAAG;EAAG;EAAE;CAChB;EAAC;EAAI;EAAG;EAAG;EAAG;EAAE;CAChB;EAAC;EAAG;EAAG;EAAI;EAAG;EAAE;CAChB;EAAC;EAAG;EAAG;EAAG;EAAG;EAAE;CACf;EAAC;EAAG;EAAG;EAAG;EAAG;EAAE;CACf;EAAC;EAAG;EAAG;EAAI;EAAG;EAAE;CAChB;EAAC;EAAG;EAAG;EAAI;EAAG;EAAE;CAChB;EAAC;EAAG;EAAG;EAAG;EAAG;EAAE;CACf;EAAC;EAAI;EAAG;EAAG;EAAG;EAAE;CAChB;EAAC;EAAG;EAAG;EAAI;EAAG;EAAE;CAChB;EAAC;EAAG;EAAG;EAAG;EAAG;EAAE;CACf;EAAC;EAAG;EAAG;EAAG;EAAG;EAAE;CACf;EAAC;EAAG;EAAG;EAAG;EAAG;EAAE;CACf;EAAC;EAAI;EAAG;EAAG;EAAG;EAAE;CAChB;EAAC;EAAG;EAAG;EAAG;EAAG;EAAE;CACf;EAAC;EAAI;EAAG;EAAG;EAAG;EAAE;CAChB;EAAC;EAAG;EAAG;EAAI;EAAG;EAAE;CAChB;EAAC;EAAG;EAAG;EAAG;EAAG;EAAE;CACf;EAAC;EAAG;EAAG;EAAI;EAAG;EAAE;CAChB;EAAC;EAAI;EAAG;EAAG;EAAG;EAAE;CAChB;EAAC;EAAG;EAAG;EAAG;EAAG;EAAE;CACf;EAAC;EAAI;EAAG;EAAG;EAAG;EAAE;CAChB;EAAC;EAAG;EAAI;EAAG;EAAG;EAAE;CAChB;EAAC;EAAG;EAAG;EAAG;EAAI;EAAE;CAChB;EAAC;EAAG;EAAG;EAAI;EAAG;EAAE;CAChB;EAAC;EAAG;EAAG;EAAG;EAAG;EAAE;CACf;EAAC;EAAG;EAAG;EAAG;EAAG;EAAE;CACf;EAAC;EAAI;EAAG;EAAG;EAAG;EAAE;CAChB;EAAC;EAAG;EAAI;EAAG;EAAG;EAAE;CAChB;EAAC;EAAG;EAAG;EAAG;EAAG;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"}