panchang-ts 0.5.1 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -72,7 +72,7 @@ console.log(result.rahuKalam); // { start: Date, end: Date }
72
72
 
73
73
  // Choghadiya — 8 daytime slots
74
74
  result.choghadiya.day.forEach(slot => {
75
- console.log(slot.name, slot.quality); // "Amrit", "auspicious"
75
+ console.log(slot.name, slot.qualityName); // "Amrit", "Auspicious"
76
76
  });
77
77
 
78
78
  // Panchaka
@@ -95,7 +95,7 @@ result.festivals.forEach(f => {
95
95
 
96
96
  // Gowri Panchangam — 8 daytime slots
97
97
  result.gowriPanchangam.day.forEach(slot => {
98
- console.log(slot.name, slot.quality); // "Amrit", "auspicious"
98
+ console.log(slot.name, slot.qualityName); // "Amrit", "Auspicious"
99
99
  });
100
100
 
101
101
 
@@ -239,7 +239,7 @@ console.log(result.panchaka); // false
239
239
  |--------|------|---------|-------------|
240
240
  | `timezone` | `number \| string` | **required** | UTC offset in minutes (330 for IST). Use a number on Hermes — IANA strings require `Intl`. |
241
241
  | `ayanamsa` | `'lahiri' \| 'raman' \| 'krishnamurti'` | `'lahiri'` | Ayanamsa system |
242
- | `language` | `'en' \| 'sa' \| 'hi'` | `'en'` | Language for element names. `'hi'` currently uses the same Devanagari names as `'sa'`. |
242
+ | `language` | `'en' \| 'sa' \| 'hi'` | `'en'` | Language for all element names (tithi, paksha, masa, etc.). `'sa'` = classical Sanskrit Devanagari, `'hi'` = modern Hindi Devanagari. |
243
243
  | `computeEndTimes` | `boolean` | `true` | Set `false` for ~5× faster, names-only output |
244
244
  | `precision` | `'standard' \| 'high'` | `'standard'` | Binary-search iterations (15 vs 25). High precision is rarely needed. |
245
245
 
@@ -293,6 +293,7 @@ const brahma = computeBrahmaMuhurta(sunrise, sunset); // { start, end }
293
293
  // Gowri Panchangam (varaIndex: 0=Sun … 6=Sat)
294
294
  const gowri = computeGowriPanchangam(sunrise, sunset, nextSunrise, varaIndex,
295
295
  (i) => ['Udyog','Amrit','Roga','Laabh','Shubh','Kaal','Dhan','Chal'][i]!,
296
+ (q) => ({ auspicious: 'Auspicious', inauspicious: 'Inauspicious', neutral: 'Neutral' })[q],
296
297
  );
297
298
  // gowri.day → 8 GowriSlot (sunrise → sunset)
298
299
  // gowri.night → 8 GowriSlot (sunset → next sunrise)
@@ -331,7 +332,7 @@ interface TimePeriod {
331
332
  interface TithiInfo {
332
333
  index: number; // 0–29
333
334
  name: string; // e.g. "Shukla Pratipada"
334
- paksha: 'Shukla' | 'Krishna';
335
+ paksha: string; // "Shukla"/"Krishna" (en), "शुक्ल"/"कृष्ण" (sa/hi) — localized
335
336
  number: number; // 1–15 within the paksha
336
337
  completionPercentage: number;
337
338
  endTime: Date | null;
@@ -406,8 +407,9 @@ type ChoghadiyaQuality = 'auspicious' | 'inauspicious' | 'neutral';
406
407
 
407
408
  interface ChoghadiyaSlot extends TimePeriod {
408
409
  index: number;
409
- name: string; // e.g. "Amrit", "Kaal", "Shubh"
410
- quality: ChoghadiyaQuality;
410
+ name: string; // e.g. "Amrit", "Kaal", "Shubh" (localized)
411
+ quality: ChoghadiyaQuality; // programmatic key: 'auspicious' | 'inauspicious' | 'neutral'
412
+ qualityName: string; // localized display name (e.g. "Auspicious", "शुभ", "शुभम्")
411
413
  }
412
414
 
413
415
  interface ChoghadiyaInfo {
@@ -418,9 +420,10 @@ interface ChoghadiyaInfo {
418
420
  // ── Gowri Panchangam ─────────────────────────────────────────────────────────
419
421
 
420
422
  interface GowriSlot extends TimePeriod {
421
- index: number; // 0–7 within the 8-name cycle
422
- name: string; // e.g. "Amrit", "Kaal", "Shubh"
423
- quality: ChoghadiyaQuality;
423
+ index: number; // 0–7 within the 8-name cycle
424
+ name: string; // e.g. "Amrit", "Kaal", "Shubh" (localized)
425
+ quality: ChoghadiyaQuality; // programmatic key: 'auspicious' | 'inauspicious' | 'neutral'
426
+ qualityName: string; // localized display name (e.g. "Auspicious", "शुभ", "शुभम्")
424
427
  }
425
428
 
426
429
  interface GowriInfo {
@@ -452,7 +455,7 @@ interface SpecialYogaInfo {
452
455
  interface FestivalInfo {
453
456
  name: string; // e.g. "Diwali", "Ekadashi"
454
457
  type: 'major' | 'minor' | 'ekadashi' | 'pradosha' | 'sankranti';
455
- description?: string; // For sankranti: "Rashi 3" — the numeric rashi index as a string; look up name from masaNames
458
+ description?: string; // For sankranti: localized rashi name (e.g. "Makara", "मकर")
456
459
  }
457
460
 
458
461
  // Detection rules:
package/dist/index.cjs CHANGED
@@ -2789,12 +2789,11 @@ function validateOffset(offset) {
2789
2789
  }
2790
2790
 
2791
2791
  // src/core/tithi.ts
2792
- function computeTithiFromLongitudes(siderealMoon, siderealSun, name) {
2792
+ function computeTithiFromLongitudes(siderealMoon, siderealSun, name, paksha) {
2793
2793
  const angle = normalize360(siderealMoon - siderealSun);
2794
2794
  const index = Math.floor(angle / TITHI_SPAN);
2795
2795
  const elapsed = angle - index * TITHI_SPAN;
2796
2796
  const completionPercentage = elapsed / TITHI_SPAN * 100;
2797
- const paksha = index < 15 ? "Shukla" : "Krishna";
2798
2797
  const number = index < 15 ? index + 1 : index - 14;
2799
2798
  return {
2800
2799
  index,
@@ -2949,50 +2948,38 @@ var GOWRI_QUALITY = [
2949
2948
  ];
2950
2949
  var DAY_START_INDEX = [6, 5, 4, 3, 2, 1, 0];
2951
2950
  var NIGHT_START_INDEX = [2, 1, 0, 7, 6, 5, 4];
2952
- function buildSlots(reference, durationMs, startIndex, nameFn) {
2951
+ function buildSlots(reference, durationMs, startIndex, nameFn, qualityNameFn) {
2953
2952
  const slotMs = durationMs / 8;
2954
2953
  const slots = [];
2955
2954
  for (let i = 0; i < 8; i++) {
2956
2955
  const idx = (startIndex + i) % 8;
2956
+ const quality = GOWRI_QUALITY[idx];
2957
2957
  slots.push({
2958
2958
  start: new Date(reference.getTime() + i * slotMs),
2959
2959
  end: new Date(reference.getTime() + (i + 1) * slotMs),
2960
2960
  index: idx,
2961
2961
  name: nameFn(idx),
2962
- quality: GOWRI_QUALITY[idx]
2962
+ quality,
2963
+ qualityName: qualityNameFn(quality)
2963
2964
  });
2964
2965
  }
2965
2966
  return slots;
2966
2967
  }
2967
- function computeGowriPanchangam(sunrise, sunset, nextSunrise, varaIndex, nameFn) {
2968
+ function computeGowriPanchangam(sunrise, sunset, nextSunrise, varaIndex, nameFn, qualityNameFn) {
2968
2969
  const dayMs = sunset.getTime() - sunrise.getTime();
2969
2970
  const nightMs = nextSunrise.getTime() - sunset.getTime();
2970
2971
  return {
2971
- day: buildSlots(sunrise, dayMs, DAY_START_INDEX[varaIndex], nameFn),
2972
- night: buildSlots(sunset, nightMs, NIGHT_START_INDEX[varaIndex], nameFn)
2972
+ day: buildSlots(sunrise, dayMs, DAY_START_INDEX[varaIndex], nameFn, qualityNameFn),
2973
+ night: buildSlots(sunset, nightMs, NIGHT_START_INDEX[varaIndex], nameFn, qualityNameFn)
2973
2974
  };
2974
2975
  }
2975
2976
 
2976
2977
  // src/core/masa.ts
2977
- var MASA_NAMES_EN = [
2978
- "Mesha",
2979
- "Vrishabha",
2980
- "Mithuna",
2981
- "Karka",
2982
- "Simha",
2983
- "Kanya",
2984
- "Tula",
2985
- "Vrischika",
2986
- "Dhanus",
2987
- "Makara",
2988
- "Kumbha",
2989
- "Meena"
2990
- ];
2991
- function computeMasa(siderealSunLon) {
2978
+ function computeMasa(siderealSunLon, nameResolver) {
2992
2979
  const index = Math.floor(siderealSunLon / 30);
2993
2980
  return {
2994
2981
  index,
2995
- name: MASA_NAMES_EN[index]
2982
+ name: nameResolver(index)
2996
2983
  };
2997
2984
  }
2998
2985
 
@@ -3055,27 +3042,29 @@ var CHOGHADIYA_QUALITY = [
3055
3042
  ];
3056
3043
  var DAY_START_INDEX2 = [0, 3, 6, 2, 5, 1, 4];
3057
3044
  var NIGHT_START_INDEX2 = [5, 1, 4, 6, 0, 3, 2];
3058
- function buildSlots2(reference, durationMs, startIndex, nameFn, count) {
3045
+ function buildSlots2(reference, durationMs, startIndex, nameFn, qualityNameFn, count) {
3059
3046
  const slotMs = durationMs / count;
3060
3047
  const slots = [];
3061
3048
  for (let i = 0; i < count; i++) {
3062
3049
  const idx = (startIndex + i) % 7;
3050
+ const quality = CHOGHADIYA_QUALITY[idx];
3063
3051
  slots.push({
3064
3052
  start: new Date(reference.getTime() + i * slotMs),
3065
3053
  end: new Date(reference.getTime() + (i + 1) * slotMs),
3066
3054
  index: idx,
3067
3055
  name: nameFn(idx),
3068
- quality: CHOGHADIYA_QUALITY[idx]
3056
+ quality,
3057
+ qualityName: qualityNameFn(quality)
3069
3058
  });
3070
3059
  }
3071
3060
  return slots;
3072
3061
  }
3073
- function computeChoghadiya(sunrise, sunset, nextSunrise, varaIndex, nameFn) {
3062
+ function computeChoghadiya(sunrise, sunset, nextSunrise, varaIndex, nameFn, qualityNameFn) {
3074
3063
  const dayMs = sunset.getTime() - sunrise.getTime();
3075
3064
  const nightMs = nextSunrise.getTime() - sunset.getTime();
3076
3065
  return {
3077
- day: buildSlots2(sunrise, dayMs, DAY_START_INDEX2[varaIndex], nameFn, 8),
3078
- night: buildSlots2(sunset, nightMs, NIGHT_START_INDEX2[varaIndex], nameFn, 8)
3066
+ day: buildSlots2(sunrise, dayMs, DAY_START_INDEX2[varaIndex], nameFn, qualityNameFn, 8),
3067
+ night: buildSlots2(sunset, nightMs, NIGHT_START_INDEX2[varaIndex], nameFn, qualityNameFn, 8)
3079
3068
  };
3080
3069
  }
3081
3070
 
@@ -3234,7 +3223,7 @@ var FESTIVAL_REGISTRY = [
3234
3223
  // Bhadrapada (5) — end of Pitru Paksha
3235
3224
  { key: "mahalaya_amavasya", masa: 5, tithi: 29, type: "major" }
3236
3225
  ];
3237
- function computeFestivals(tithiIndex, _nakshatraIndex, chandraMasaIndex, isAdhika, _varaIndex, siderealSun, nameResolver) {
3226
+ function computeFestivals(tithiIndex, _nakshatraIndex, chandraMasaIndex, isAdhika, _varaIndex, siderealSun, nameResolver, rashiNameResolver) {
3238
3227
  const results = [];
3239
3228
  if (!isAdhika) {
3240
3229
  for (const rule of FESTIVAL_REGISTRY) {
@@ -3261,10 +3250,11 @@ function computeFestivals(tithiIndex, _nakshatraIndex, chandraMasaIndex, isAdhik
3261
3250
  const degInRashi = siderealSun % 30;
3262
3251
  if (degInRashi < 1) {
3263
3252
  const rashiIndex = Math.floor(siderealSun / 30) % 12;
3253
+ const rashiName = rashiNameResolver ? rashiNameResolver(rashiIndex) : `Rashi ${rashiIndex}`;
3264
3254
  results.push({
3265
3255
  name: nameResolver("sankranti"),
3266
3256
  type: "sankranti",
3267
- description: `Rashi ${rashiIndex}`
3257
+ description: rashiName
3268
3258
  });
3269
3259
  }
3270
3260
  return results;
@@ -3413,6 +3403,7 @@ var en = {
3413
3403
  choghadiyaNames: ["Udveg", "Char", "Labh", "Amrit", "Kaal", "Shubh", "Rog"],
3414
3404
  gowriNames: ["Udyog", "Amrit", "Roga", "Laabh", "Shubh", "Kaal", "Dhan", "Chal"],
3415
3405
  grahaNames: ["Sun", "Venus", "Mercury", "Moon", "Saturn", "Jupiter", "Mars"],
3406
+ qualityNames: { auspicious: "Auspicious", inauspicious: "Inauspicious", neutral: "Neutral" },
3416
3407
  specialYogaNames: {
3417
3408
  amrit_siddhi: "Amrit Siddhi Yoga",
3418
3409
  sarvartha_siddhi: "Sarvartha Siddhi Yoga",
@@ -3576,6 +3567,7 @@ var sa = {
3576
3567
  choghadiyaNames: ["\u0909\u0926\u094D\u0935\u0947\u0917", "\u091A\u0930", "\u0932\u093E\u092D", "\u0905\u092E\u0943\u0924", "\u0915\u093E\u0932", "\u0936\u0941\u092D", "\u0930\u094B\u0917"],
3577
3568
  gowriNames: ["\u0909\u0926\u094D\u092F\u094B\u0917", "\u0905\u092E\u0943\u0924", "\u0930\u094B\u0917", "\u0932\u093E\u092D", "\u0936\u0941\u092D", "\u0915\u093E\u0932", "\u0927\u0928", "\u091A\u0932"],
3578
3569
  grahaNames: ["\u0938\u0942\u0930\u094D\u092F", "\u0936\u0941\u0915\u094D\u0930", "\u092C\u0941\u0927", "\u091A\u0928\u094D\u0926\u094D\u0930", "\u0936\u0928\u093F", "\u0917\u0941\u0930\u0941", "\u092E\u0919\u094D\u0917\u0932"],
3570
+ qualityNames: { auspicious: "\u0936\u0941\u092D\u092E\u094D", inauspicious: "\u0905\u0936\u0941\u092D\u092E\u094D", neutral: "\u0938\u093E\u092E\u093E\u0928\u094D\u092F\u092E\u094D" },
3579
3571
  specialYogaNames: {
3580
3572
  amrit_siddhi: "\u0905\u092E\u0943\u0924 \u0938\u093F\u0926\u094D\u0927\u093F \u092F\u094B\u0917",
3581
3573
  sarvartha_siddhi: "\u0938\u0930\u094D\u0935\u093E\u0930\u094D\u0925 \u0938\u093F\u0926\u094D\u0927\u093F \u092F\u094B\u0917",
@@ -3619,13 +3611,178 @@ var sa = {
3619
3611
  };
3620
3612
 
3621
3613
  // src/i18n/hi.ts
3622
- var hi = { ...sa };
3614
+ var hi = {
3615
+ tithiNames: [
3616
+ "\u092A\u094D\u0930\u0924\u093F\u092A\u0926\u093E",
3617
+ "\u0926\u094D\u0935\u093F\u0924\u0940\u092F\u093E",
3618
+ "\u0924\u0943\u0924\u0940\u092F\u093E",
3619
+ "\u091A\u0924\u0941\u0930\u094D\u0925\u0940",
3620
+ "\u092A\u0902\u091A\u092E\u0940",
3621
+ "\u0937\u0937\u094D\u0920\u0940",
3622
+ "\u0938\u092A\u094D\u0924\u092E\u0940",
3623
+ "\u0905\u0937\u094D\u091F\u092E\u0940",
3624
+ "\u0928\u0935\u092E\u0940",
3625
+ "\u0926\u0936\u092E\u0940",
3626
+ "\u090F\u0915\u093E\u0926\u0936\u0940",
3627
+ "\u0926\u094D\u0935\u093E\u0926\u0936\u0940",
3628
+ "\u0924\u094D\u0930\u092F\u094B\u0926\u0936\u0940",
3629
+ "\u091A\u0924\u0941\u0930\u094D\u0926\u0936\u0940"
3630
+ ],
3631
+ nakshatraNames: [
3632
+ "\u0905\u0936\u094D\u0935\u093F\u0928\u0940",
3633
+ "\u092D\u0930\u0923\u0940",
3634
+ "\u0915\u0943\u0924\u094D\u0924\u093F\u0915\u093E",
3635
+ "\u0930\u094B\u0939\u093F\u0923\u0940",
3636
+ "\u092E\u0943\u0917\u0936\u093F\u0930\u093E",
3637
+ "\u0906\u0930\u094D\u0926\u094D\u0930\u093E",
3638
+ "\u092A\u0941\u0928\u0930\u094D\u0935\u0938\u0941",
3639
+ "\u092A\u0941\u0937\u094D\u092F",
3640
+ "\u0906\u0936\u094D\u0932\u0947\u0937\u093E",
3641
+ "\u092E\u0918\u093E",
3642
+ "\u092A\u0942\u0930\u094D\u0935\u093E \u092B\u093E\u0932\u094D\u0917\u0941\u0928\u0940",
3643
+ "\u0909\u0924\u094D\u0924\u0930\u093E \u092B\u093E\u0932\u094D\u0917\u0941\u0928\u0940",
3644
+ "\u0939\u0938\u094D\u0924",
3645
+ "\u091A\u093F\u0924\u094D\u0930\u093E",
3646
+ "\u0938\u094D\u0935\u093E\u0924\u093F",
3647
+ "\u0935\u093F\u0936\u093E\u0916\u093E",
3648
+ "\u0905\u0928\u0941\u0930\u093E\u0927\u093E",
3649
+ "\u091C\u094D\u092F\u0947\u0937\u094D\u0920\u093E",
3650
+ "\u092E\u0942\u0932",
3651
+ "\u092A\u0942\u0930\u094D\u0935\u093E\u0937\u093E\u0922\u093C\u093E",
3652
+ "\u0909\u0924\u094D\u0924\u0930\u093E\u0937\u093E\u0922\u093C\u093E",
3653
+ "\u0936\u094D\u0930\u0935\u0923",
3654
+ "\u0927\u0928\u093F\u0937\u094D\u0920\u093E",
3655
+ "\u0936\u0924\u092D\u093F\u0937\u093E",
3656
+ "\u092A\u0942\u0930\u094D\u0935\u093E \u092D\u093E\u0926\u094D\u0930\u092A\u0926",
3657
+ "\u0909\u0924\u094D\u0924\u0930\u093E \u092D\u093E\u0926\u094D\u0930\u092A\u0926",
3658
+ "\u0930\u0947\u0935\u0924\u0940"
3659
+ ],
3660
+ yogaNames: [
3661
+ "\u0935\u093F\u0937\u094D\u0915\u092E\u094D\u092D",
3662
+ "\u092A\u094D\u0930\u0940\u0924\u093F",
3663
+ "\u0906\u092F\u0941\u0937\u094D\u092E\u093E\u0928",
3664
+ "\u0938\u094C\u092D\u093E\u0917\u094D\u092F",
3665
+ "\u0936\u094B\u092D\u0928",
3666
+ "\u0905\u0924\u093F\u0917\u0902\u0921",
3667
+ "\u0938\u0941\u0915\u0930\u094D\u092E\u093E",
3668
+ "\u0927\u0943\u0924\u093F",
3669
+ "\u0936\u0942\u0932",
3670
+ "\u0917\u0902\u0921",
3671
+ "\u0935\u0943\u0926\u094D\u0927\u093F",
3672
+ "\u0927\u094D\u0930\u0941\u0935",
3673
+ "\u0935\u094D\u092F\u093E\u0918\u093E\u0924",
3674
+ "\u0939\u0930\u094D\u0937\u0923",
3675
+ "\u0935\u091C\u094D\u0930",
3676
+ "\u0938\u093F\u0926\u094D\u0927\u093F",
3677
+ "\u0935\u094D\u092F\u0924\u0940\u092A\u093E\u0924",
3678
+ "\u0935\u0930\u0940\u092F\u093E\u0928",
3679
+ "\u092A\u0930\u093F\u0918",
3680
+ "\u0936\u093F\u0935",
3681
+ "\u0938\u093F\u0926\u094D\u0927",
3682
+ "\u0938\u093E\u0927\u094D\u092F",
3683
+ "\u0936\u0941\u092D",
3684
+ "\u0936\u0941\u0915\u094D\u0932",
3685
+ "\u092C\u094D\u0930\u0939\u094D\u092E",
3686
+ "\u0907\u0902\u0926\u094D\u0930",
3687
+ "\u0935\u0948\u0927\u0943\u0924\u093F"
3688
+ ],
3689
+ karanaNames: {
3690
+ movable: ["\u092C\u0935", "\u092C\u093E\u0932\u0935", "\u0915\u094C\u0932\u0935", "\u0924\u0948\u0924\u093F\u0932", "\u0917\u0930", "\u0935\u0923\u093F\u091C", "\u0935\u093F\u0937\u094D\u091F\u093F"],
3691
+ fixed: ["\u0915\u093F\u0902\u0938\u094D\u0924\u0941\u0918\u094D\u0928", "\u0936\u0915\u0941\u0928\u093F", "\u091A\u0924\u0941\u0937\u094D\u092A\u0926", "\u0928\u093E\u0917"]
3692
+ },
3693
+ varaNames: [
3694
+ { name: "\u0930\u0935\u093F\u0935\u093E\u0930", short: "\u0930\u0935\u093F" },
3695
+ { name: "\u0938\u094B\u092E\u0935\u093E\u0930", short: "\u0938\u094B\u092E" },
3696
+ { name: "\u092E\u0902\u0917\u0932\u0935\u093E\u0930", short: "\u092E\u0902\u0917\u0932" },
3697
+ { name: "\u092C\u0941\u0927\u0935\u093E\u0930", short: "\u092C\u0941\u0927" },
3698
+ { name: "\u0917\u0941\u0930\u0941\u0935\u093E\u0930", short: "\u0917\u0941\u0930\u0941" },
3699
+ { name: "\u0936\u0941\u0915\u094D\u0930\u0935\u093E\u0930", short: "\u0936\u0941\u0915\u094D\u0930" },
3700
+ { name: "\u0936\u0928\u093F\u0935\u093E\u0930", short: "\u0936\u0928\u093F" }
3701
+ ],
3702
+ pakshaNames: { shukla: "\u0936\u0941\u0915\u094D\u0932", krishna: "\u0915\u0943\u0937\u094D\u0923" },
3703
+ masaNames: [
3704
+ "\u092E\u0947\u0937",
3705
+ "\u0935\u0943\u0937\u092D",
3706
+ "\u092E\u093F\u0925\u0941\u0928",
3707
+ "\u0915\u0930\u094D\u0915",
3708
+ "\u0938\u093F\u0902\u0939",
3709
+ "\u0915\u0928\u094D\u092F\u093E",
3710
+ "\u0924\u0941\u0932\u093E",
3711
+ "\u0935\u0943\u0936\u094D\u091A\u093F\u0915",
3712
+ "\u0927\u0928\u0941",
3713
+ "\u092E\u0915\u0930",
3714
+ "\u0915\u0941\u0902\u092D",
3715
+ "\u092E\u0940\u0928"
3716
+ ],
3717
+ chandraMasaNames: [
3718
+ "\u091A\u0948\u0924\u094D\u0930",
3719
+ "\u0935\u0948\u0936\u093E\u0916",
3720
+ "\u091C\u094D\u092F\u0947\u0937\u094D\u0920",
3721
+ "\u0906\u0937\u093E\u0922\u093C",
3722
+ "\u0936\u094D\u0930\u093E\u0935\u0923",
3723
+ "\u092D\u093E\u0926\u094D\u0930\u092A\u0926",
3724
+ "\u0906\u0936\u094D\u0935\u093F\u0928",
3725
+ "\u0915\u093E\u0930\u094D\u0924\u093F\u0915",
3726
+ "\u092E\u093E\u0930\u094D\u0917\u0936\u0940\u0930\u094D\u0937",
3727
+ "\u092A\u094C\u0937",
3728
+ "\u092E\u093E\u0918",
3729
+ "\u092B\u093E\u0932\u094D\u0917\u0941\u0928"
3730
+ ],
3731
+ choghadiyaNames: ["\u0909\u0926\u094D\u0935\u0947\u0917", "\u091A\u0930", "\u0932\u093E\u092D", "\u0905\u092E\u0943\u0924", "\u0915\u093E\u0932", "\u0936\u0941\u092D", "\u0930\u094B\u0917"],
3732
+ gowriNames: ["\u0909\u0926\u094D\u092F\u094B\u0917", "\u0905\u092E\u0943\u0924", "\u0930\u094B\u0917", "\u0932\u093E\u092D", "\u0936\u0941\u092D", "\u0915\u093E\u0932", "\u0927\u0928", "\u091A\u0932"],
3733
+ grahaNames: ["\u0938\u0942\u0930\u094D\u092F", "\u0936\u0941\u0915\u094D\u0930", "\u092C\u0941\u0927", "\u091A\u0902\u0926\u094D\u0930", "\u0936\u0928\u093F", "\u0917\u0941\u0930\u0941", "\u092E\u0902\u0917\u0932"],
3734
+ qualityNames: { auspicious: "\u0936\u0941\u092D", inauspicious: "\u0905\u0936\u0941\u092D", neutral: "\u0938\u093E\u092E\u093E\u0928\u094D\u092F" },
3735
+ specialYogaNames: {
3736
+ amrit_siddhi: "\u0905\u092E\u0943\u0924 \u0938\u093F\u0926\u094D\u0927\u093F \u092F\u094B\u0917",
3737
+ sarvartha_siddhi: "\u0938\u0930\u094D\u0935\u093E\u0930\u094D\u0925 \u0938\u093F\u0926\u094D\u0927\u093F \u092F\u094B\u0917",
3738
+ ravi_pushya: "\u0930\u0935\u093F \u092A\u0941\u0937\u094D\u092F \u092F\u094B\u0917",
3739
+ guru_pushya: "\u0917\u0941\u0930\u0941 \u092A\u0941\u0937\u094D\u092F \u092F\u094B\u0917"
3740
+ },
3741
+ festivalNames: {
3742
+ ugadi: "\u0909\u0917\u093E\u0926\u0940",
3743
+ rama_navami: "\u0930\u093E\u092E \u0928\u0935\u092E\u0940",
3744
+ hanuman_jayanti: "\u0939\u0928\u0941\u092E\u093E\u0928 \u091C\u092F\u0902\u0924\u0940",
3745
+ akshaya_tritiya: "\u0905\u0915\u094D\u0937\u092F \u0924\u0943\u0924\u0940\u092F\u093E",
3746
+ guru_purnima: "\u0917\u0941\u0930\u0941 \u092A\u0942\u0930\u094D\u0923\u093F\u092E\u093E",
3747
+ nag_panchami: "\u0928\u093E\u0917 \u092A\u0902\u091A\u092E\u0940",
3748
+ raksha_bandhan: "\u0930\u0915\u094D\u0937\u093E \u092C\u0902\u0927\u0928",
3749
+ krishna_janmashtami: "\u0915\u0943\u0937\u094D\u0923 \u091C\u0928\u094D\u092E\u093E\u0937\u094D\u091F\u092E\u0940",
3750
+ ganesh_chaturthi: "\u0917\u0923\u0947\u0936 \u091A\u0924\u0941\u0930\u094D\u0925\u0940",
3751
+ anant_chaturdashi: "\u0905\u0928\u0902\u0924 \u091A\u0924\u0941\u0930\u094D\u0926\u0936\u0940",
3752
+ navaratri: "\u0936\u0930\u0926 \u0928\u0935\u0930\u093E\u0924\u094D\u0930\u093F",
3753
+ durga_ashtami: "\u0926\u0941\u0930\u094D\u0917\u093E \u0905\u0937\u094D\u091F\u092E\u0940",
3754
+ maha_navami: "\u092E\u0939\u093E \u0928\u0935\u092E\u0940",
3755
+ dussehra: "\u0926\u0936\u0939\u0930\u093E",
3756
+ sharad_purnima: "\u0936\u0930\u0926 \u092A\u0942\u0930\u094D\u0923\u093F\u092E\u093E",
3757
+ karva_chauth: "\u0915\u0930\u0935\u093E \u091A\u094C\u0925",
3758
+ dhanteras: "\u0927\u0928\u0924\u0947\u0930\u0938",
3759
+ narak_chaturdashi: "\u0928\u0930\u0915 \u091A\u0924\u0941\u0930\u094D\u0926\u0936\u0940",
3760
+ diwali: "\u0926\u093F\u0935\u093E\u0932\u0940",
3761
+ vasant_panchami: "\u0935\u0938\u0902\u0924 \u092A\u0902\u091A\u092E\u0940",
3762
+ maha_shivaratri: "\u092E\u0939\u093E \u0936\u093F\u0935\u0930\u093E\u0924\u094D\u0930\u093F",
3763
+ holi: "\u0939\u094B\u0932\u0940",
3764
+ mahalaya_amavasya: "\u092E\u0939\u093E\u0932\u092F \u0905\u092E\u093E\u0935\u0938\u094D\u092F\u093E",
3765
+ kartika_purnima: "\u0915\u093E\u0930\u094D\u0924\u093F\u0915 \u092A\u0942\u0930\u094D\u0923\u093F\u092E\u093E"
3766
+ },
3767
+ misc: {
3768
+ purnima: "\u092A\u0942\u0930\u094D\u0923\u093F\u092E\u093E",
3769
+ amavasya: "\u0905\u092E\u093E\u0935\u0938\u094D\u092F\u093E",
3770
+ adhika: "\u0905\u0927\u093F\u0915",
3771
+ ekadashi: "\u090F\u0915\u093E\u0926\u0936\u0940",
3772
+ pradosha: "\u092A\u094D\u0930\u0926\u094B\u0937 \u0935\u094D\u0930\u0924",
3773
+ sankranti: "\u0938\u0902\u0915\u094D\u0930\u093E\u0902\u0924\u093F"
3774
+ }
3775
+ };
3623
3776
 
3624
3777
  // src/i18n/resolver.ts
3625
3778
  var TRANSLATIONS = { en, sa, hi };
3626
3779
  function getTranslations(lang) {
3627
3780
  return TRANSLATIONS[lang] ?? en;
3628
3781
  }
3782
+ function resolvePakshaName(index, lang) {
3783
+ const t = getTranslations(lang);
3784
+ return index < 15 ? t.pakshaNames.shukla : t.pakshaNames.krishna;
3785
+ }
3629
3786
  function resolveTithiName(index, lang) {
3630
3787
  const t = getTranslations(lang);
3631
3788
  if (index === 14) return t.misc.purnima;
@@ -3669,10 +3826,12 @@ function getInstantPanchang(date, location, options) {
3669
3826
  const siderealMoon = getMoon(date);
3670
3827
  const siderealSun = getSun(date);
3671
3828
  const ayanamsaValue = computeAyanamsa(date, ayanamsaType);
3829
+ const tithiIdx = getTithiIndexFromLons(siderealMoon, siderealSun);
3672
3830
  const tithi = computeTithiFromLongitudes(
3673
3831
  siderealMoon,
3674
3832
  siderealSun,
3675
- resolveTithiName(getTithiIndexFromLons(siderealMoon, siderealSun), lang)
3833
+ resolveTithiName(tithiIdx, lang),
3834
+ resolvePakshaName(tithiIdx, lang)
3676
3835
  );
3677
3836
  const nakshatra = computeNakshatraFromLongitude(
3678
3837
  siderealMoon,
@@ -3751,7 +3910,8 @@ function getInstantPanchang(date, location, options) {
3751
3910
  chandramasa.isAdhika,
3752
3911
  vara.index,
3753
3912
  siderealSun,
3754
- (key) => t.festivalNames[key] ?? t.misc[key] ?? key
3913
+ (key) => t.festivalNames[key] ?? t.misc[key] ?? key,
3914
+ (idx) => resolveMasaName(idx, lang)
3755
3915
  );
3756
3916
  return {
3757
3917
  timestamp: date,
@@ -3791,10 +3951,12 @@ function getDailyPanchang(date, location, options) {
3791
3951
  const siderealMoonAtSunrise = getMoon(sunriseUtc);
3792
3952
  const siderealSunAtSunrise = getSun(sunriseUtc);
3793
3953
  const ayanamsaValue = computeAyanamsa(sunriseUtc, ayanamsaType);
3954
+ const tithiIdxAtSunrise = getTithiIndexFromLons(siderealMoonAtSunrise, siderealSunAtSunrise);
3794
3955
  const tithiAtSunrise = computeTithiFromLongitudes(
3795
3956
  siderealMoonAtSunrise,
3796
3957
  siderealSunAtSunrise,
3797
- resolveTithiName(getTithiIndexFromLons(siderealMoonAtSunrise, siderealSunAtSunrise), lang)
3958
+ resolveTithiName(tithiIdxAtSunrise, lang),
3959
+ resolvePakshaName(tithiIdxAtSunrise, lang)
3798
3960
  );
3799
3961
  const nakshatraAtSunrise = computeNakshatraFromLongitude(
3800
3962
  siderealMoonAtSunrise,
@@ -3811,7 +3973,7 @@ function getDailyPanchang(date, location, options) {
3811
3973
  resolveKaranaName(getKaranaIndex(siderealMoonAtSunrise, siderealSunAtSunrise), lang)
3812
3974
  );
3813
3975
  const vara = computeVara(sunriseUtc, sunriseUtc, getTranslations(lang).varaNames);
3814
- const masa = computeMasa(siderealSunAtSunrise);
3976
+ const masa = computeMasa(siderealSunAtSunrise, (idx) => resolveMasaName(idx, lang));
3815
3977
  const chandramasa = computeChandraMasa(
3816
3978
  siderealSunAtSunrise,
3817
3979
  siderealMoonAtSunrise,
@@ -3827,12 +3989,14 @@ function getDailyPanchang(date, location, options) {
3827
3989
  (idx) => resolveNakshatraName(idx, lang)
3828
3990
  );
3829
3991
  const brahmaMuhurta = computeBrahmaMuhurta(sunriseUtc, sunsetUtc);
3992
+ const qualityNameFn = (q) => getTranslations(lang).qualityNames[q];
3830
3993
  const choghadiya = computeChoghadiya(
3831
3994
  sunriseUtc,
3832
3995
  sunsetUtc,
3833
3996
  nextSunriseUtc,
3834
3997
  vara.index,
3835
- (idx) => getTranslations(lang).choghadiyaNames[idx]
3998
+ (idx) => getTranslations(lang).choghadiyaNames[idx],
3999
+ qualityNameFn
3836
4000
  );
3837
4001
  const hora = computeHora(
3838
4002
  sunriseUtc,
@@ -3846,7 +4010,8 @@ function getDailyPanchang(date, location, options) {
3846
4010
  sunsetUtc,
3847
4011
  nextSunriseUtc,
3848
4012
  vara.index,
3849
- (idx) => getTranslations(lang).gowriNames[idx]
4013
+ (idx) => getTranslations(lang).gowriNames[idx],
4014
+ qualityNameFn
3850
4015
  );
3851
4016
  const moonriseUtc = getMoonrise(localMidnightUtc, location);
3852
4017
  const moonsetUtc = getMoonset(localMidnightUtc, location);
@@ -3866,7 +4031,8 @@ function getDailyPanchang(date, location, options) {
3866
4031
  chandramasa.isAdhika,
3867
4032
  vara.index,
3868
4033
  siderealSunAtSunrise,
3869
- (key) => t.festivalNames[key] ?? t.misc[key] ?? key
4034
+ (key) => t.festivalNames[key] ?? t.misc[key] ?? key,
4035
+ (idx) => resolveMasaName(idx, lang)
3870
4036
  );
3871
4037
  let tithis;
3872
4038
  let nakshatras;
@@ -3880,7 +4046,8 @@ function getDailyPanchang(date, location, options) {
3880
4046
  (d) => getTithiIndexAtTime(d, getMoon, getSun),
3881
4047
  (d) => {
3882
4048
  const moon = getMoon(d), sun = getSun(d);
3883
- return computeTithiFromLongitudes(moon, sun, resolveTithiName(getTithiIndexFromLons(moon, sun), lang));
4049
+ const idx = getTithiIndexFromLons(moon, sun);
4050
+ return computeTithiFromLongitudes(moon, sun, resolveTithiName(idx, lang), resolvePakshaName(idx, lang));
3884
4051
  },
3885
4052
  30,
3886
4053
  36,
package/dist/index.d.cts CHANGED
@@ -35,7 +35,7 @@ interface ElementBase {
35
35
  endTime: Date | null;
36
36
  }
37
37
  interface TithiInfo extends ElementBase {
38
- paksha: 'Shukla' | 'Krishna';
38
+ paksha: string;
39
39
  number: number;
40
40
  }
41
41
  interface NakshatraInfo extends ElementBase {
@@ -88,6 +88,8 @@ interface ChoghadiyaSlot extends TimePeriod {
88
88
  index: number;
89
89
  name: string;
90
90
  quality: ChoghadiyaQuality;
91
+ /** Localized display name for the quality (e.g. "शुभ" in Hindi) */
92
+ qualityName: string;
91
93
  }
92
94
  interface ChoghadiyaInfo {
93
95
  /** 8 equal slots from sunrise to sunset */
@@ -100,6 +102,8 @@ interface GowriSlot extends TimePeriod {
100
102
  index: number;
101
103
  name: string;
102
104
  quality: ChoghadiyaQuality;
105
+ /** Localized display name for the quality (e.g. "शुभ" in Hindi) */
106
+ qualityName: string;
103
107
  }
104
108
  interface GowriInfo {
105
109
  /** 8 equal slots from sunrise to sunset */
@@ -502,8 +506,9 @@ declare function computeBrahmaMuhurta(sunrise: Date, sunset: Date): TimePeriod;
502
506
  * @param nextSunrise UTC next-day sunrise Date.
503
507
  * @param varaIndex Weekday index: 0 = Sunday, 6 = Saturday.
504
508
  * @param nameFn Callback returning translated Gowri slot name for index 0–7.
509
+ * @param qualityNameFn Callback returning translated quality name.
505
510
  */
506
- declare function computeGowriPanchangam(sunrise: Date, sunset: Date, nextSunrise: Date, varaIndex: number, nameFn: (index: number) => string): GowriInfo;
511
+ declare function computeGowriPanchangam(sunrise: Date, sunset: Date, nextSunrise: Date, varaIndex: number, nameFn: (index: number) => string, qualityNameFn: (quality: ChoghadiyaQuality) => string): GowriInfo;
507
512
 
508
513
  type PanchangErrorCode = 'INVALID_LATITUDE' | 'INVALID_LONGITUDE' | 'INVALID_ELEVATION' | 'INVALID_DATE' | 'INVALID_TIMEZONE' | 'INVALID_AYANAMSA' | 'TIMEZONE_RESOLUTION_FAILED' | 'NO_SUNRISE' | 'NO_SUNSET' | 'SEARCH_DIVERGED';
509
514
  declare class PanchangError extends Error {
package/dist/index.d.ts CHANGED
@@ -35,7 +35,7 @@ interface ElementBase {
35
35
  endTime: Date | null;
36
36
  }
37
37
  interface TithiInfo extends ElementBase {
38
- paksha: 'Shukla' | 'Krishna';
38
+ paksha: string;
39
39
  number: number;
40
40
  }
41
41
  interface NakshatraInfo extends ElementBase {
@@ -88,6 +88,8 @@ interface ChoghadiyaSlot extends TimePeriod {
88
88
  index: number;
89
89
  name: string;
90
90
  quality: ChoghadiyaQuality;
91
+ /** Localized display name for the quality (e.g. "शुभ" in Hindi) */
92
+ qualityName: string;
91
93
  }
92
94
  interface ChoghadiyaInfo {
93
95
  /** 8 equal slots from sunrise to sunset */
@@ -100,6 +102,8 @@ interface GowriSlot extends TimePeriod {
100
102
  index: number;
101
103
  name: string;
102
104
  quality: ChoghadiyaQuality;
105
+ /** Localized display name for the quality (e.g. "शुभ" in Hindi) */
106
+ qualityName: string;
103
107
  }
104
108
  interface GowriInfo {
105
109
  /** 8 equal slots from sunrise to sunset */
@@ -502,8 +506,9 @@ declare function computeBrahmaMuhurta(sunrise: Date, sunset: Date): TimePeriod;
502
506
  * @param nextSunrise UTC next-day sunrise Date.
503
507
  * @param varaIndex Weekday index: 0 = Sunday, 6 = Saturday.
504
508
  * @param nameFn Callback returning translated Gowri slot name for index 0–7.
509
+ * @param qualityNameFn Callback returning translated quality name.
505
510
  */
506
- declare function computeGowriPanchangam(sunrise: Date, sunset: Date, nextSunrise: Date, varaIndex: number, nameFn: (index: number) => string): GowriInfo;
511
+ declare function computeGowriPanchangam(sunrise: Date, sunset: Date, nextSunrise: Date, varaIndex: number, nameFn: (index: number) => string, qualityNameFn: (quality: ChoghadiyaQuality) => string): GowriInfo;
507
512
 
508
513
  type PanchangErrorCode = 'INVALID_LATITUDE' | 'INVALID_LONGITUDE' | 'INVALID_ELEVATION' | 'INVALID_DATE' | 'INVALID_TIMEZONE' | 'INVALID_AYANAMSA' | 'TIMEZONE_RESOLUTION_FAILED' | 'NO_SUNRISE' | 'NO_SUNSET' | 'SEARCH_DIVERGED';
509
514
  declare class PanchangError extends Error {
package/dist/index.js CHANGED
@@ -2787,12 +2787,11 @@ function validateOffset(offset) {
2787
2787
  }
2788
2788
 
2789
2789
  // src/core/tithi.ts
2790
- function computeTithiFromLongitudes(siderealMoon, siderealSun, name) {
2790
+ function computeTithiFromLongitudes(siderealMoon, siderealSun, name, paksha) {
2791
2791
  const angle = normalize360(siderealMoon - siderealSun);
2792
2792
  const index = Math.floor(angle / TITHI_SPAN);
2793
2793
  const elapsed = angle - index * TITHI_SPAN;
2794
2794
  const completionPercentage = elapsed / TITHI_SPAN * 100;
2795
- const paksha = index < 15 ? "Shukla" : "Krishna";
2796
2795
  const number = index < 15 ? index + 1 : index - 14;
2797
2796
  return {
2798
2797
  index,
@@ -2947,50 +2946,38 @@ var GOWRI_QUALITY = [
2947
2946
  ];
2948
2947
  var DAY_START_INDEX = [6, 5, 4, 3, 2, 1, 0];
2949
2948
  var NIGHT_START_INDEX = [2, 1, 0, 7, 6, 5, 4];
2950
- function buildSlots(reference, durationMs, startIndex, nameFn) {
2949
+ function buildSlots(reference, durationMs, startIndex, nameFn, qualityNameFn) {
2951
2950
  const slotMs = durationMs / 8;
2952
2951
  const slots = [];
2953
2952
  for (let i = 0; i < 8; i++) {
2954
2953
  const idx = (startIndex + i) % 8;
2954
+ const quality = GOWRI_QUALITY[idx];
2955
2955
  slots.push({
2956
2956
  start: new Date(reference.getTime() + i * slotMs),
2957
2957
  end: new Date(reference.getTime() + (i + 1) * slotMs),
2958
2958
  index: idx,
2959
2959
  name: nameFn(idx),
2960
- quality: GOWRI_QUALITY[idx]
2960
+ quality,
2961
+ qualityName: qualityNameFn(quality)
2961
2962
  });
2962
2963
  }
2963
2964
  return slots;
2964
2965
  }
2965
- function computeGowriPanchangam(sunrise, sunset, nextSunrise, varaIndex, nameFn) {
2966
+ function computeGowriPanchangam(sunrise, sunset, nextSunrise, varaIndex, nameFn, qualityNameFn) {
2966
2967
  const dayMs = sunset.getTime() - sunrise.getTime();
2967
2968
  const nightMs = nextSunrise.getTime() - sunset.getTime();
2968
2969
  return {
2969
- day: buildSlots(sunrise, dayMs, DAY_START_INDEX[varaIndex], nameFn),
2970
- night: buildSlots(sunset, nightMs, NIGHT_START_INDEX[varaIndex], nameFn)
2970
+ day: buildSlots(sunrise, dayMs, DAY_START_INDEX[varaIndex], nameFn, qualityNameFn),
2971
+ night: buildSlots(sunset, nightMs, NIGHT_START_INDEX[varaIndex], nameFn, qualityNameFn)
2971
2972
  };
2972
2973
  }
2973
2974
 
2974
2975
  // src/core/masa.ts
2975
- var MASA_NAMES_EN = [
2976
- "Mesha",
2977
- "Vrishabha",
2978
- "Mithuna",
2979
- "Karka",
2980
- "Simha",
2981
- "Kanya",
2982
- "Tula",
2983
- "Vrischika",
2984
- "Dhanus",
2985
- "Makara",
2986
- "Kumbha",
2987
- "Meena"
2988
- ];
2989
- function computeMasa(siderealSunLon) {
2976
+ function computeMasa(siderealSunLon, nameResolver) {
2990
2977
  const index = Math.floor(siderealSunLon / 30);
2991
2978
  return {
2992
2979
  index,
2993
- name: MASA_NAMES_EN[index]
2980
+ name: nameResolver(index)
2994
2981
  };
2995
2982
  }
2996
2983
 
@@ -3053,27 +3040,29 @@ var CHOGHADIYA_QUALITY = [
3053
3040
  ];
3054
3041
  var DAY_START_INDEX2 = [0, 3, 6, 2, 5, 1, 4];
3055
3042
  var NIGHT_START_INDEX2 = [5, 1, 4, 6, 0, 3, 2];
3056
- function buildSlots2(reference, durationMs, startIndex, nameFn, count) {
3043
+ function buildSlots2(reference, durationMs, startIndex, nameFn, qualityNameFn, count) {
3057
3044
  const slotMs = durationMs / count;
3058
3045
  const slots = [];
3059
3046
  for (let i = 0; i < count; i++) {
3060
3047
  const idx = (startIndex + i) % 7;
3048
+ const quality = CHOGHADIYA_QUALITY[idx];
3061
3049
  slots.push({
3062
3050
  start: new Date(reference.getTime() + i * slotMs),
3063
3051
  end: new Date(reference.getTime() + (i + 1) * slotMs),
3064
3052
  index: idx,
3065
3053
  name: nameFn(idx),
3066
- quality: CHOGHADIYA_QUALITY[idx]
3054
+ quality,
3055
+ qualityName: qualityNameFn(quality)
3067
3056
  });
3068
3057
  }
3069
3058
  return slots;
3070
3059
  }
3071
- function computeChoghadiya(sunrise, sunset, nextSunrise, varaIndex, nameFn) {
3060
+ function computeChoghadiya(sunrise, sunset, nextSunrise, varaIndex, nameFn, qualityNameFn) {
3072
3061
  const dayMs = sunset.getTime() - sunrise.getTime();
3073
3062
  const nightMs = nextSunrise.getTime() - sunset.getTime();
3074
3063
  return {
3075
- day: buildSlots2(sunrise, dayMs, DAY_START_INDEX2[varaIndex], nameFn, 8),
3076
- night: buildSlots2(sunset, nightMs, NIGHT_START_INDEX2[varaIndex], nameFn, 8)
3064
+ day: buildSlots2(sunrise, dayMs, DAY_START_INDEX2[varaIndex], nameFn, qualityNameFn, 8),
3065
+ night: buildSlots2(sunset, nightMs, NIGHT_START_INDEX2[varaIndex], nameFn, qualityNameFn, 8)
3077
3066
  };
3078
3067
  }
3079
3068
 
@@ -3232,7 +3221,7 @@ var FESTIVAL_REGISTRY = [
3232
3221
  // Bhadrapada (5) — end of Pitru Paksha
3233
3222
  { key: "mahalaya_amavasya", masa: 5, tithi: 29, type: "major" }
3234
3223
  ];
3235
- function computeFestivals(tithiIndex, _nakshatraIndex, chandraMasaIndex, isAdhika, _varaIndex, siderealSun, nameResolver) {
3224
+ function computeFestivals(tithiIndex, _nakshatraIndex, chandraMasaIndex, isAdhika, _varaIndex, siderealSun, nameResolver, rashiNameResolver) {
3236
3225
  const results = [];
3237
3226
  if (!isAdhika) {
3238
3227
  for (const rule of FESTIVAL_REGISTRY) {
@@ -3259,10 +3248,11 @@ function computeFestivals(tithiIndex, _nakshatraIndex, chandraMasaIndex, isAdhik
3259
3248
  const degInRashi = siderealSun % 30;
3260
3249
  if (degInRashi < 1) {
3261
3250
  const rashiIndex = Math.floor(siderealSun / 30) % 12;
3251
+ const rashiName = rashiNameResolver ? rashiNameResolver(rashiIndex) : `Rashi ${rashiIndex}`;
3262
3252
  results.push({
3263
3253
  name: nameResolver("sankranti"),
3264
3254
  type: "sankranti",
3265
- description: `Rashi ${rashiIndex}`
3255
+ description: rashiName
3266
3256
  });
3267
3257
  }
3268
3258
  return results;
@@ -3411,6 +3401,7 @@ var en = {
3411
3401
  choghadiyaNames: ["Udveg", "Char", "Labh", "Amrit", "Kaal", "Shubh", "Rog"],
3412
3402
  gowriNames: ["Udyog", "Amrit", "Roga", "Laabh", "Shubh", "Kaal", "Dhan", "Chal"],
3413
3403
  grahaNames: ["Sun", "Venus", "Mercury", "Moon", "Saturn", "Jupiter", "Mars"],
3404
+ qualityNames: { auspicious: "Auspicious", inauspicious: "Inauspicious", neutral: "Neutral" },
3414
3405
  specialYogaNames: {
3415
3406
  amrit_siddhi: "Amrit Siddhi Yoga",
3416
3407
  sarvartha_siddhi: "Sarvartha Siddhi Yoga",
@@ -3574,6 +3565,7 @@ var sa = {
3574
3565
  choghadiyaNames: ["\u0909\u0926\u094D\u0935\u0947\u0917", "\u091A\u0930", "\u0932\u093E\u092D", "\u0905\u092E\u0943\u0924", "\u0915\u093E\u0932", "\u0936\u0941\u092D", "\u0930\u094B\u0917"],
3575
3566
  gowriNames: ["\u0909\u0926\u094D\u092F\u094B\u0917", "\u0905\u092E\u0943\u0924", "\u0930\u094B\u0917", "\u0932\u093E\u092D", "\u0936\u0941\u092D", "\u0915\u093E\u0932", "\u0927\u0928", "\u091A\u0932"],
3576
3567
  grahaNames: ["\u0938\u0942\u0930\u094D\u092F", "\u0936\u0941\u0915\u094D\u0930", "\u092C\u0941\u0927", "\u091A\u0928\u094D\u0926\u094D\u0930", "\u0936\u0928\u093F", "\u0917\u0941\u0930\u0941", "\u092E\u0919\u094D\u0917\u0932"],
3568
+ qualityNames: { auspicious: "\u0936\u0941\u092D\u092E\u094D", inauspicious: "\u0905\u0936\u0941\u092D\u092E\u094D", neutral: "\u0938\u093E\u092E\u093E\u0928\u094D\u092F\u092E\u094D" },
3577
3569
  specialYogaNames: {
3578
3570
  amrit_siddhi: "\u0905\u092E\u0943\u0924 \u0938\u093F\u0926\u094D\u0927\u093F \u092F\u094B\u0917",
3579
3571
  sarvartha_siddhi: "\u0938\u0930\u094D\u0935\u093E\u0930\u094D\u0925 \u0938\u093F\u0926\u094D\u0927\u093F \u092F\u094B\u0917",
@@ -3617,13 +3609,178 @@ var sa = {
3617
3609
  };
3618
3610
 
3619
3611
  // src/i18n/hi.ts
3620
- var hi = { ...sa };
3612
+ var hi = {
3613
+ tithiNames: [
3614
+ "\u092A\u094D\u0930\u0924\u093F\u092A\u0926\u093E",
3615
+ "\u0926\u094D\u0935\u093F\u0924\u0940\u092F\u093E",
3616
+ "\u0924\u0943\u0924\u0940\u092F\u093E",
3617
+ "\u091A\u0924\u0941\u0930\u094D\u0925\u0940",
3618
+ "\u092A\u0902\u091A\u092E\u0940",
3619
+ "\u0937\u0937\u094D\u0920\u0940",
3620
+ "\u0938\u092A\u094D\u0924\u092E\u0940",
3621
+ "\u0905\u0937\u094D\u091F\u092E\u0940",
3622
+ "\u0928\u0935\u092E\u0940",
3623
+ "\u0926\u0936\u092E\u0940",
3624
+ "\u090F\u0915\u093E\u0926\u0936\u0940",
3625
+ "\u0926\u094D\u0935\u093E\u0926\u0936\u0940",
3626
+ "\u0924\u094D\u0930\u092F\u094B\u0926\u0936\u0940",
3627
+ "\u091A\u0924\u0941\u0930\u094D\u0926\u0936\u0940"
3628
+ ],
3629
+ nakshatraNames: [
3630
+ "\u0905\u0936\u094D\u0935\u093F\u0928\u0940",
3631
+ "\u092D\u0930\u0923\u0940",
3632
+ "\u0915\u0943\u0924\u094D\u0924\u093F\u0915\u093E",
3633
+ "\u0930\u094B\u0939\u093F\u0923\u0940",
3634
+ "\u092E\u0943\u0917\u0936\u093F\u0930\u093E",
3635
+ "\u0906\u0930\u094D\u0926\u094D\u0930\u093E",
3636
+ "\u092A\u0941\u0928\u0930\u094D\u0935\u0938\u0941",
3637
+ "\u092A\u0941\u0937\u094D\u092F",
3638
+ "\u0906\u0936\u094D\u0932\u0947\u0937\u093E",
3639
+ "\u092E\u0918\u093E",
3640
+ "\u092A\u0942\u0930\u094D\u0935\u093E \u092B\u093E\u0932\u094D\u0917\u0941\u0928\u0940",
3641
+ "\u0909\u0924\u094D\u0924\u0930\u093E \u092B\u093E\u0932\u094D\u0917\u0941\u0928\u0940",
3642
+ "\u0939\u0938\u094D\u0924",
3643
+ "\u091A\u093F\u0924\u094D\u0930\u093E",
3644
+ "\u0938\u094D\u0935\u093E\u0924\u093F",
3645
+ "\u0935\u093F\u0936\u093E\u0916\u093E",
3646
+ "\u0905\u0928\u0941\u0930\u093E\u0927\u093E",
3647
+ "\u091C\u094D\u092F\u0947\u0937\u094D\u0920\u093E",
3648
+ "\u092E\u0942\u0932",
3649
+ "\u092A\u0942\u0930\u094D\u0935\u093E\u0937\u093E\u0922\u093C\u093E",
3650
+ "\u0909\u0924\u094D\u0924\u0930\u093E\u0937\u093E\u0922\u093C\u093E",
3651
+ "\u0936\u094D\u0930\u0935\u0923",
3652
+ "\u0927\u0928\u093F\u0937\u094D\u0920\u093E",
3653
+ "\u0936\u0924\u092D\u093F\u0937\u093E",
3654
+ "\u092A\u0942\u0930\u094D\u0935\u093E \u092D\u093E\u0926\u094D\u0930\u092A\u0926",
3655
+ "\u0909\u0924\u094D\u0924\u0930\u093E \u092D\u093E\u0926\u094D\u0930\u092A\u0926",
3656
+ "\u0930\u0947\u0935\u0924\u0940"
3657
+ ],
3658
+ yogaNames: [
3659
+ "\u0935\u093F\u0937\u094D\u0915\u092E\u094D\u092D",
3660
+ "\u092A\u094D\u0930\u0940\u0924\u093F",
3661
+ "\u0906\u092F\u0941\u0937\u094D\u092E\u093E\u0928",
3662
+ "\u0938\u094C\u092D\u093E\u0917\u094D\u092F",
3663
+ "\u0936\u094B\u092D\u0928",
3664
+ "\u0905\u0924\u093F\u0917\u0902\u0921",
3665
+ "\u0938\u0941\u0915\u0930\u094D\u092E\u093E",
3666
+ "\u0927\u0943\u0924\u093F",
3667
+ "\u0936\u0942\u0932",
3668
+ "\u0917\u0902\u0921",
3669
+ "\u0935\u0943\u0926\u094D\u0927\u093F",
3670
+ "\u0927\u094D\u0930\u0941\u0935",
3671
+ "\u0935\u094D\u092F\u093E\u0918\u093E\u0924",
3672
+ "\u0939\u0930\u094D\u0937\u0923",
3673
+ "\u0935\u091C\u094D\u0930",
3674
+ "\u0938\u093F\u0926\u094D\u0927\u093F",
3675
+ "\u0935\u094D\u092F\u0924\u0940\u092A\u093E\u0924",
3676
+ "\u0935\u0930\u0940\u092F\u093E\u0928",
3677
+ "\u092A\u0930\u093F\u0918",
3678
+ "\u0936\u093F\u0935",
3679
+ "\u0938\u093F\u0926\u094D\u0927",
3680
+ "\u0938\u093E\u0927\u094D\u092F",
3681
+ "\u0936\u0941\u092D",
3682
+ "\u0936\u0941\u0915\u094D\u0932",
3683
+ "\u092C\u094D\u0930\u0939\u094D\u092E",
3684
+ "\u0907\u0902\u0926\u094D\u0930",
3685
+ "\u0935\u0948\u0927\u0943\u0924\u093F"
3686
+ ],
3687
+ karanaNames: {
3688
+ movable: ["\u092C\u0935", "\u092C\u093E\u0932\u0935", "\u0915\u094C\u0932\u0935", "\u0924\u0948\u0924\u093F\u0932", "\u0917\u0930", "\u0935\u0923\u093F\u091C", "\u0935\u093F\u0937\u094D\u091F\u093F"],
3689
+ fixed: ["\u0915\u093F\u0902\u0938\u094D\u0924\u0941\u0918\u094D\u0928", "\u0936\u0915\u0941\u0928\u093F", "\u091A\u0924\u0941\u0937\u094D\u092A\u0926", "\u0928\u093E\u0917"]
3690
+ },
3691
+ varaNames: [
3692
+ { name: "\u0930\u0935\u093F\u0935\u093E\u0930", short: "\u0930\u0935\u093F" },
3693
+ { name: "\u0938\u094B\u092E\u0935\u093E\u0930", short: "\u0938\u094B\u092E" },
3694
+ { name: "\u092E\u0902\u0917\u0932\u0935\u093E\u0930", short: "\u092E\u0902\u0917\u0932" },
3695
+ { name: "\u092C\u0941\u0927\u0935\u093E\u0930", short: "\u092C\u0941\u0927" },
3696
+ { name: "\u0917\u0941\u0930\u0941\u0935\u093E\u0930", short: "\u0917\u0941\u0930\u0941" },
3697
+ { name: "\u0936\u0941\u0915\u094D\u0930\u0935\u093E\u0930", short: "\u0936\u0941\u0915\u094D\u0930" },
3698
+ { name: "\u0936\u0928\u093F\u0935\u093E\u0930", short: "\u0936\u0928\u093F" }
3699
+ ],
3700
+ pakshaNames: { shukla: "\u0936\u0941\u0915\u094D\u0932", krishna: "\u0915\u0943\u0937\u094D\u0923" },
3701
+ masaNames: [
3702
+ "\u092E\u0947\u0937",
3703
+ "\u0935\u0943\u0937\u092D",
3704
+ "\u092E\u093F\u0925\u0941\u0928",
3705
+ "\u0915\u0930\u094D\u0915",
3706
+ "\u0938\u093F\u0902\u0939",
3707
+ "\u0915\u0928\u094D\u092F\u093E",
3708
+ "\u0924\u0941\u0932\u093E",
3709
+ "\u0935\u0943\u0936\u094D\u091A\u093F\u0915",
3710
+ "\u0927\u0928\u0941",
3711
+ "\u092E\u0915\u0930",
3712
+ "\u0915\u0941\u0902\u092D",
3713
+ "\u092E\u0940\u0928"
3714
+ ],
3715
+ chandraMasaNames: [
3716
+ "\u091A\u0948\u0924\u094D\u0930",
3717
+ "\u0935\u0948\u0936\u093E\u0916",
3718
+ "\u091C\u094D\u092F\u0947\u0937\u094D\u0920",
3719
+ "\u0906\u0937\u093E\u0922\u093C",
3720
+ "\u0936\u094D\u0930\u093E\u0935\u0923",
3721
+ "\u092D\u093E\u0926\u094D\u0930\u092A\u0926",
3722
+ "\u0906\u0936\u094D\u0935\u093F\u0928",
3723
+ "\u0915\u093E\u0930\u094D\u0924\u093F\u0915",
3724
+ "\u092E\u093E\u0930\u094D\u0917\u0936\u0940\u0930\u094D\u0937",
3725
+ "\u092A\u094C\u0937",
3726
+ "\u092E\u093E\u0918",
3727
+ "\u092B\u093E\u0932\u094D\u0917\u0941\u0928"
3728
+ ],
3729
+ choghadiyaNames: ["\u0909\u0926\u094D\u0935\u0947\u0917", "\u091A\u0930", "\u0932\u093E\u092D", "\u0905\u092E\u0943\u0924", "\u0915\u093E\u0932", "\u0936\u0941\u092D", "\u0930\u094B\u0917"],
3730
+ gowriNames: ["\u0909\u0926\u094D\u092F\u094B\u0917", "\u0905\u092E\u0943\u0924", "\u0930\u094B\u0917", "\u0932\u093E\u092D", "\u0936\u0941\u092D", "\u0915\u093E\u0932", "\u0927\u0928", "\u091A\u0932"],
3731
+ grahaNames: ["\u0938\u0942\u0930\u094D\u092F", "\u0936\u0941\u0915\u094D\u0930", "\u092C\u0941\u0927", "\u091A\u0902\u0926\u094D\u0930", "\u0936\u0928\u093F", "\u0917\u0941\u0930\u0941", "\u092E\u0902\u0917\u0932"],
3732
+ qualityNames: { auspicious: "\u0936\u0941\u092D", inauspicious: "\u0905\u0936\u0941\u092D", neutral: "\u0938\u093E\u092E\u093E\u0928\u094D\u092F" },
3733
+ specialYogaNames: {
3734
+ amrit_siddhi: "\u0905\u092E\u0943\u0924 \u0938\u093F\u0926\u094D\u0927\u093F \u092F\u094B\u0917",
3735
+ sarvartha_siddhi: "\u0938\u0930\u094D\u0935\u093E\u0930\u094D\u0925 \u0938\u093F\u0926\u094D\u0927\u093F \u092F\u094B\u0917",
3736
+ ravi_pushya: "\u0930\u0935\u093F \u092A\u0941\u0937\u094D\u092F \u092F\u094B\u0917",
3737
+ guru_pushya: "\u0917\u0941\u0930\u0941 \u092A\u0941\u0937\u094D\u092F \u092F\u094B\u0917"
3738
+ },
3739
+ festivalNames: {
3740
+ ugadi: "\u0909\u0917\u093E\u0926\u0940",
3741
+ rama_navami: "\u0930\u093E\u092E \u0928\u0935\u092E\u0940",
3742
+ hanuman_jayanti: "\u0939\u0928\u0941\u092E\u093E\u0928 \u091C\u092F\u0902\u0924\u0940",
3743
+ akshaya_tritiya: "\u0905\u0915\u094D\u0937\u092F \u0924\u0943\u0924\u0940\u092F\u093E",
3744
+ guru_purnima: "\u0917\u0941\u0930\u0941 \u092A\u0942\u0930\u094D\u0923\u093F\u092E\u093E",
3745
+ nag_panchami: "\u0928\u093E\u0917 \u092A\u0902\u091A\u092E\u0940",
3746
+ raksha_bandhan: "\u0930\u0915\u094D\u0937\u093E \u092C\u0902\u0927\u0928",
3747
+ krishna_janmashtami: "\u0915\u0943\u0937\u094D\u0923 \u091C\u0928\u094D\u092E\u093E\u0937\u094D\u091F\u092E\u0940",
3748
+ ganesh_chaturthi: "\u0917\u0923\u0947\u0936 \u091A\u0924\u0941\u0930\u094D\u0925\u0940",
3749
+ anant_chaturdashi: "\u0905\u0928\u0902\u0924 \u091A\u0924\u0941\u0930\u094D\u0926\u0936\u0940",
3750
+ navaratri: "\u0936\u0930\u0926 \u0928\u0935\u0930\u093E\u0924\u094D\u0930\u093F",
3751
+ durga_ashtami: "\u0926\u0941\u0930\u094D\u0917\u093E \u0905\u0937\u094D\u091F\u092E\u0940",
3752
+ maha_navami: "\u092E\u0939\u093E \u0928\u0935\u092E\u0940",
3753
+ dussehra: "\u0926\u0936\u0939\u0930\u093E",
3754
+ sharad_purnima: "\u0936\u0930\u0926 \u092A\u0942\u0930\u094D\u0923\u093F\u092E\u093E",
3755
+ karva_chauth: "\u0915\u0930\u0935\u093E \u091A\u094C\u0925",
3756
+ dhanteras: "\u0927\u0928\u0924\u0947\u0930\u0938",
3757
+ narak_chaturdashi: "\u0928\u0930\u0915 \u091A\u0924\u0941\u0930\u094D\u0926\u0936\u0940",
3758
+ diwali: "\u0926\u093F\u0935\u093E\u0932\u0940",
3759
+ vasant_panchami: "\u0935\u0938\u0902\u0924 \u092A\u0902\u091A\u092E\u0940",
3760
+ maha_shivaratri: "\u092E\u0939\u093E \u0936\u093F\u0935\u0930\u093E\u0924\u094D\u0930\u093F",
3761
+ holi: "\u0939\u094B\u0932\u0940",
3762
+ mahalaya_amavasya: "\u092E\u0939\u093E\u0932\u092F \u0905\u092E\u093E\u0935\u0938\u094D\u092F\u093E",
3763
+ kartika_purnima: "\u0915\u093E\u0930\u094D\u0924\u093F\u0915 \u092A\u0942\u0930\u094D\u0923\u093F\u092E\u093E"
3764
+ },
3765
+ misc: {
3766
+ purnima: "\u092A\u0942\u0930\u094D\u0923\u093F\u092E\u093E",
3767
+ amavasya: "\u0905\u092E\u093E\u0935\u0938\u094D\u092F\u093E",
3768
+ adhika: "\u0905\u0927\u093F\u0915",
3769
+ ekadashi: "\u090F\u0915\u093E\u0926\u0936\u0940",
3770
+ pradosha: "\u092A\u094D\u0930\u0926\u094B\u0937 \u0935\u094D\u0930\u0924",
3771
+ sankranti: "\u0938\u0902\u0915\u094D\u0930\u093E\u0902\u0924\u093F"
3772
+ }
3773
+ };
3621
3774
 
3622
3775
  // src/i18n/resolver.ts
3623
3776
  var TRANSLATIONS = { en, sa, hi };
3624
3777
  function getTranslations(lang) {
3625
3778
  return TRANSLATIONS[lang] ?? en;
3626
3779
  }
3780
+ function resolvePakshaName(index, lang) {
3781
+ const t = getTranslations(lang);
3782
+ return index < 15 ? t.pakshaNames.shukla : t.pakshaNames.krishna;
3783
+ }
3627
3784
  function resolveTithiName(index, lang) {
3628
3785
  const t = getTranslations(lang);
3629
3786
  if (index === 14) return t.misc.purnima;
@@ -3667,10 +3824,12 @@ function getInstantPanchang(date, location, options) {
3667
3824
  const siderealMoon = getMoon(date);
3668
3825
  const siderealSun = getSun(date);
3669
3826
  const ayanamsaValue = computeAyanamsa(date, ayanamsaType);
3827
+ const tithiIdx = getTithiIndexFromLons(siderealMoon, siderealSun);
3670
3828
  const tithi = computeTithiFromLongitudes(
3671
3829
  siderealMoon,
3672
3830
  siderealSun,
3673
- resolveTithiName(getTithiIndexFromLons(siderealMoon, siderealSun), lang)
3831
+ resolveTithiName(tithiIdx, lang),
3832
+ resolvePakshaName(tithiIdx, lang)
3674
3833
  );
3675
3834
  const nakshatra = computeNakshatraFromLongitude(
3676
3835
  siderealMoon,
@@ -3749,7 +3908,8 @@ function getInstantPanchang(date, location, options) {
3749
3908
  chandramasa.isAdhika,
3750
3909
  vara.index,
3751
3910
  siderealSun,
3752
- (key) => t.festivalNames[key] ?? t.misc[key] ?? key
3911
+ (key) => t.festivalNames[key] ?? t.misc[key] ?? key,
3912
+ (idx) => resolveMasaName(idx, lang)
3753
3913
  );
3754
3914
  return {
3755
3915
  timestamp: date,
@@ -3789,10 +3949,12 @@ function getDailyPanchang(date, location, options) {
3789
3949
  const siderealMoonAtSunrise = getMoon(sunriseUtc);
3790
3950
  const siderealSunAtSunrise = getSun(sunriseUtc);
3791
3951
  const ayanamsaValue = computeAyanamsa(sunriseUtc, ayanamsaType);
3952
+ const tithiIdxAtSunrise = getTithiIndexFromLons(siderealMoonAtSunrise, siderealSunAtSunrise);
3792
3953
  const tithiAtSunrise = computeTithiFromLongitudes(
3793
3954
  siderealMoonAtSunrise,
3794
3955
  siderealSunAtSunrise,
3795
- resolveTithiName(getTithiIndexFromLons(siderealMoonAtSunrise, siderealSunAtSunrise), lang)
3956
+ resolveTithiName(tithiIdxAtSunrise, lang),
3957
+ resolvePakshaName(tithiIdxAtSunrise, lang)
3796
3958
  );
3797
3959
  const nakshatraAtSunrise = computeNakshatraFromLongitude(
3798
3960
  siderealMoonAtSunrise,
@@ -3809,7 +3971,7 @@ function getDailyPanchang(date, location, options) {
3809
3971
  resolveKaranaName(getKaranaIndex(siderealMoonAtSunrise, siderealSunAtSunrise), lang)
3810
3972
  );
3811
3973
  const vara = computeVara(sunriseUtc, sunriseUtc, getTranslations(lang).varaNames);
3812
- const masa = computeMasa(siderealSunAtSunrise);
3974
+ const masa = computeMasa(siderealSunAtSunrise, (idx) => resolveMasaName(idx, lang));
3813
3975
  const chandramasa = computeChandraMasa(
3814
3976
  siderealSunAtSunrise,
3815
3977
  siderealMoonAtSunrise,
@@ -3825,12 +3987,14 @@ function getDailyPanchang(date, location, options) {
3825
3987
  (idx) => resolveNakshatraName(idx, lang)
3826
3988
  );
3827
3989
  const brahmaMuhurta = computeBrahmaMuhurta(sunriseUtc, sunsetUtc);
3990
+ const qualityNameFn = (q) => getTranslations(lang).qualityNames[q];
3828
3991
  const choghadiya = computeChoghadiya(
3829
3992
  sunriseUtc,
3830
3993
  sunsetUtc,
3831
3994
  nextSunriseUtc,
3832
3995
  vara.index,
3833
- (idx) => getTranslations(lang).choghadiyaNames[idx]
3996
+ (idx) => getTranslations(lang).choghadiyaNames[idx],
3997
+ qualityNameFn
3834
3998
  );
3835
3999
  const hora = computeHora(
3836
4000
  sunriseUtc,
@@ -3844,7 +4008,8 @@ function getDailyPanchang(date, location, options) {
3844
4008
  sunsetUtc,
3845
4009
  nextSunriseUtc,
3846
4010
  vara.index,
3847
- (idx) => getTranslations(lang).gowriNames[idx]
4011
+ (idx) => getTranslations(lang).gowriNames[idx],
4012
+ qualityNameFn
3848
4013
  );
3849
4014
  const moonriseUtc = getMoonrise(localMidnightUtc, location);
3850
4015
  const moonsetUtc = getMoonset(localMidnightUtc, location);
@@ -3864,7 +4029,8 @@ function getDailyPanchang(date, location, options) {
3864
4029
  chandramasa.isAdhika,
3865
4030
  vara.index,
3866
4031
  siderealSunAtSunrise,
3867
- (key) => t.festivalNames[key] ?? t.misc[key] ?? key
4032
+ (key) => t.festivalNames[key] ?? t.misc[key] ?? key,
4033
+ (idx) => resolveMasaName(idx, lang)
3868
4034
  );
3869
4035
  let tithis;
3870
4036
  let nakshatras;
@@ -3878,7 +4044,8 @@ function getDailyPanchang(date, location, options) {
3878
4044
  (d) => getTithiIndexAtTime(d, getMoon, getSun),
3879
4045
  (d) => {
3880
4046
  const moon = getMoon(d), sun = getSun(d);
3881
- return computeTithiFromLongitudes(moon, sun, resolveTithiName(getTithiIndexFromLons(moon, sun), lang));
4047
+ const idx = getTithiIndexFromLons(moon, sun);
4048
+ return computeTithiFromLongitudes(moon, sun, resolveTithiName(idx, lang), resolvePakshaName(idx, lang));
3882
4049
  },
3883
4050
  30,
3884
4051
  36,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "panchang-ts",
3
- "version": "0.5.1",
3
+ "version": "0.6.1",
4
4
  "description": "Pure TypeScript Hindu Panchang calculations. Tithi, Nakshatra, Yoga, Karana, Vara, and more. Offline-first, React Native compatible.",
5
5
  "author": "Ishank",
6
6
  "license": "MIT",