diff --git a/demo/browser/astronomy.browser.js b/demo/browser/astronomy.browser.js
index 8dfb1edd..b6804c25 100644
--- a/demo/browser/astronomy.browser.js
+++ b/demo/browser/astronomy.browser.js
@@ -7302,7 +7302,7 @@ exports.Constellation = Constellation;
* Returned by {@link SearchLunarEclipse} or {@link NextLunarEclipse}
* to report information about a lunar eclipse event.
* When a lunar eclipse is found, it is classified as penumbral, partial, or total.
- * Penumbral eclipses are difficult to observe, because the moon is only slightly dimmed
+ * Penumbral eclipses are difficult to observe, because the Moon is only slightly dimmed
* by the Earth's penumbra; no part of the Moon touches the Earth's umbra.
* Partial eclipses occur when part, but not all, of the Moon touches the Earth's umbra.
* Total eclipses occur when the entire Moon passes into the Earth's umbra.
diff --git a/demo/nodejs/astronomy.js b/demo/nodejs/astronomy.js
index 6a50104a..33d9503d 100644
--- a/demo/nodejs/astronomy.js
+++ b/demo/nodejs/astronomy.js
@@ -7301,7 +7301,7 @@ exports.Constellation = Constellation;
* Returned by {@link SearchLunarEclipse} or {@link NextLunarEclipse}
* to report information about a lunar eclipse event.
* When a lunar eclipse is found, it is classified as penumbral, partial, or total.
- * Penumbral eclipses are difficult to observe, because the moon is only slightly dimmed
+ * Penumbral eclipses are difficult to observe, because the Moon is only slightly dimmed
* by the Earth's penumbra; no part of the Moon touches the Earth's umbra.
* Partial eclipses occur when part, but not all, of the Moon touches the Earth's umbra.
* Total eclipses occur when the entire Moon passes into the Earth's umbra.
diff --git a/demo/nodejs/calendar/astronomy.ts b/demo/nodejs/calendar/astronomy.ts
index bd0741a6..ffb74540 100644
--- a/demo/nodejs/calendar/astronomy.ts
+++ b/demo/nodejs/calendar/astronomy.ts
@@ -7518,7 +7518,7 @@ export function Constellation(ra: number, dec: number): ConstellationInfo {
* Returned by {@link SearchLunarEclipse} or {@link NextLunarEclipse}
* to report information about a lunar eclipse event.
* When a lunar eclipse is found, it is classified as penumbral, partial, or total.
- * Penumbral eclipses are difficult to observe, because the moon is only slightly dimmed
+ * Penumbral eclipses are difficult to observe, because the Moon is only slightly dimmed
* by the Earth's penumbra; no part of the Moon touches the Earth's umbra.
* Partial eclipses occur when part, but not all, of the Moon touches the Earth's umbra.
* Total eclipses occur when the entire Moon passes into the Earth's umbra.
diff --git a/demo/python/astronomy.py b/demo/python/astronomy.py
index 7f7c87ea..c6945c05 100644
--- a/demo/python/astronomy.py
+++ b/demo/python/astronomy.py
@@ -8199,7 +8199,7 @@ class LunarEclipseInfo:
Returned by #SearchLunarEclipse or #NextLunarEclipse
to report information about a lunar eclipse event.
When a lunar eclipse is found, it is classified as penumbral, partial, or total.
- Penumbral eclipses are difficult to observe, because the moon is only slightly dimmed
+ Penumbral eclipses are difficult to observe, because the Moon is only slightly dimmed
by the Earth's penumbra; no part of the Moon touches the Earth's umbra.
Partial eclipses occur when part, but not all, of the Moon touches the Earth's umbra.
Total eclipses occur when the entire Moon passes into the Earth's umbra.
diff --git a/generate/template/astronomy.cs b/generate/template/astronomy.cs
index 2880dc3e..7d41a780 100644
--- a/generate/template/astronomy.cs
+++ b/generate/template/astronomy.cs
@@ -1129,7 +1129,7 @@ namespace CosineKitty
}
}
- /// different kinds of lunar/solar eclipses.
+ /// The different kinds of lunar/solar eclipses.
public enum EclipseKind
{
/// No eclipse found.
@@ -1155,7 +1155,7 @@ namespace CosineKitty
/// Returned by #Astronomy.SearchLunarEclipse or #Astronomy.NextLunarEclipse
/// to report information about a lunar eclipse event.
/// When a lunar eclipse is found, it is classified as penumbral, partial, or total.
- /// Penumbral eclipses are difficult to observe, because the moon is only slightly dimmed
+ /// Penumbral eclipses are difficult to observe, because the Moon is only slightly dimmed
/// by the Earth's penumbra; no part of the Moon touches the Earth's umbra.
/// Partial eclipses occur when part, but not all, of the Moon touches the Earth's umbra.
/// Total eclipses occur when the entire Moon passes into the Earth's umbra.
diff --git a/generate/template/astronomy.kt b/generate/template/astronomy.kt
index 5366e2fb..9ec80bc0 100644
--- a/generate/template/astronomy.kt
+++ b/generate/template/astronomy.kt
@@ -936,6 +936,330 @@ class Equatorial(
)
+/**
+ * Ecliptic angular and Cartesian coordinates.
+ *
+ * Coordinates of a celestial body as seen from the center of the Sun (heliocentric),
+ * oriented with respect to the plane of the Earth's orbit around the Sun (the ecliptic).
+ */
+data class Ecliptic(
+ /**
+ * Cartesian ecliptic vector, with components as follows:
+ * x: the direction of the equinox along the ecliptic plane.
+ * y: in the ecliptic plane 90 degrees prograde from the equinox.
+ * z: perpendicular to the ecliptic plane. Positive is north.
+ */
+ val vec: AstroVector,
+
+ /**
+ * Latitude in degrees north (positive) or south (negative) of the ecliptic plane.
+ */
+ val elat: Double,
+
+ /**
+ * Longitude in degrees around the ecliptic plane prograde from the equinox.
+ */
+ val elon: Double
+)
+
+
+/**
+ * Coordinates of a celestial body as seen by a topocentric observer.
+ *
+ * Horizontal and equatorial coordinates seen by an observer on or near
+ * the surface of the Earth (a topocentric observer).
+ * Optionally corrected for atmospheric refraction.
+ */
+data class Topocentric(
+ /**
+ * Compass direction around the horizon in degrees. 0=North, 90=East, 180=South, 270=West.
+ */
+ val azimuth: Double,
+
+ /**
+ * Angle in degrees above (positive) or below (negative) the observer's horizon.
+ */
+ val altitude: Double,
+
+ /**
+ * Right ascension in sidereal hours.
+ */
+ val ra: Double,
+
+ /**
+ * Declination in degrees.
+ */
+ val dec: Double
+)
+
+
+/**
+ * The dates and times of changes of season for a given calendar year.
+ *
+ * Call #Astronomy.seasons to calculate this data structure for a given year.
+ */
+class SeasonsInfo(
+ /**
+ * The date and time of the March equinox for the specified year.
+ */
+ mar_equinox: AstroTime,
+
+ /**
+ * The date and time of the June soltice for the specified year.
+ */
+ jun_solstice: AstroTime,
+
+ /**
+ * The date and time of the September equinox for the specified year.
+ */
+ sep_equinox: AstroTime,
+
+ /**
+ * The date and time of the December solstice for the specified year.
+ */
+ dec_solstice: AstroTime
+)
+
+
+/**
+ * A lunar quarter event (new moon, first quarter, full moon, or third quarter) along with its date and time.
+ */
+class MoonQuarterInfo(
+ /**
+ * 0=new moon, 1=first quarter, 2=full moon, 3=third quarter.
+ */
+ val quarter: Int,
+
+ /**
+ * The date and time of the lunar quarter.
+ */
+ val time: AstroTime
+)
+
+
+/**
+ * Lunar libration angles, returned by #Astronomy.libration.
+ */
+data class LibrationInfo(
+ /**
+ * Sub-Earth libration ecliptic latitude angle, in degrees.
+ */
+ val elat: Double,
+
+ /**
+ * Sub-Earth libration ecliptic longitude angle, in degrees.
+ */
+ val elon: Double,
+
+ /**
+ * Moon's geocentric ecliptic latitude.
+ */
+ val mlat: Double,
+
+ /**
+ * Moon's geocentric ecliptic longitude.
+ */
+ val mlon: Double,
+
+ /**
+ * Distance between the centers of the Earth and Moon in kilometers.
+ */
+ val dist_km: Double,
+
+ /**
+ * The apparent angular diameter of the Moon, in degrees, as seen from the center of the Earth.
+ */
+ val diam_deg: Double
+)
+
+
+/**
+ * Information about a celestial body crossing a specific hour angle.
+ *
+ * Returned by the function #Astronomy.searchHourAngle to report information about
+ * a celestial body crossing a certain hour angle as seen by a specified topocentric observer.
+ */
+class HourAngleInfo(
+ /**
+ * The date and time when the body crosses the specified hour angle.
+ */
+ val time: AstroTime,
+
+ /**
+ * Apparent coordinates of the body at the time it crosses the specified hour angle.
+ */
+ val hor: Topocentric
+)
+
+
+/**
+ * Contains information about the visibility of a celestial body at a given date and time.
+ *
+ * See #Astronomy.elongation for more detailed information about the members of this class.
+ * See also #Astronomy.searchMaxElongation for how to search for maximum elongation events.
+ */
+class ElongationInfo(
+ /**
+ * The date and time of the observation.
+ */
+ val time: AstroTime,
+
+ /**
+ * Whether the body is best seen in the morning or the evening.
+ */
+ val visibility: Visibility,
+
+ /**
+ * The angle in degrees between the body and the Sun, as seen from the Earth.
+ */
+ val elongation: Double,
+
+ /**
+ * The difference between the ecliptic longitudes of the body and the Sun, as seen from the Earth.
+ */
+ val eclipticSeparation: Double
+)
+
+
+/**
+ * The type of apsis: pericenter (closest approach) or apocenter (farthest distance).
+ */
+enum class ApsisKind {
+ /**
+ * The body is at its closest approach to the object it orbits.
+ */
+ Pericenter,
+
+ /**
+ * The body is at its farthest distance from the object it orbits.
+ */
+ Apocenter,
+}
+
+
+/**
+ * An apsis event: pericenter (closest approach) or apocenter (farthest distance).
+ *
+ * For the Moon orbiting the Earth, or a planet orbiting the Sun, an *apsis* is an
+ * event where the orbiting body reaches its closest or farthest point from the primary body.
+ * The closest approach is called *pericenter* and the farthest point is *apocenter*.
+ *
+ * More specific terminology is common for particular orbiting bodies.
+ * The Moon's closest approach to the Earth is called *perigee* and its farthest
+ * point is called *apogee*. The closest approach of a planet to the Sun is called
+ * *perihelion* and the furthest point is called *aphelion*.
+ *
+ * This data structure is returned by #Astronomy.searchLunarApsis and #Astronomy.nextLunarApsis
+ * to iterate through consecutive alternating perigees and apogees.
+ */
+class ApsisInfo(
+ /**
+ * The date and time of the apsis.
+ */
+ val time: AstroTime,
+
+ /**
+ * Whether this is a pericenter or apocenter event.
+ */
+ val kind: ApsisKind,
+
+ /**
+ * The distance between the centers of the bodies in astronomical units.
+ */
+ val dist_au: Double,
+
+ /**
+ * The distance between the centers of the bodies in kilometers.
+ */
+ val dist_km: Double
+)
+
+
+/**
+ * The different kinds of lunar/solar eclipses.
+ */
+enum class EclipseKind {
+ /**
+ * No eclipse found.
+ */
+ None,
+
+ /**
+ * A penumbral lunar eclipse. (Never used for a solar eclipse.)
+ */
+ Penumbral,
+
+ /**
+ * A partial lunar/solar eclipse.
+ */
+ Partial,
+
+ /**
+ * An annular solar eclipse. (Never used for a lunar eclipse.)
+ */
+ Annular,
+
+ /**
+ * A total lunar/solar eclipse.
+ */
+ Total,
+}
+
+
+/**
+ * Information about a lunar eclipse.
+ *
+ * Returned by #Astronomy.searchLunarEclipse or #Astronomy.nextLunarEclipse
+ * to report information about a lunar eclipse event.
+ * When a lunar eclipse is found, it is classified as penumbral, partial, or total.
+ * Penumbral eclipses are difficult to observe, because the Moon is only slightly dimmed
+ * by the Earth's penumbra; no part of the Moon touches the Earth's umbra.
+ * Partial eclipses occur when part, but not all, of the Moon touches the Earth's umbra.
+ * Total eclipses occur when the entire Moon passes into the Earth's umbra.
+ *
+ * The `kind` field thus holds `EclipseKind.Penumbral`, `EclipseKind.Partial`,
+ * or `EclipseKind.Total`, depending on the kind of lunar eclipse found.
+ *
+ * Field `peak` holds the date and time of the center of the eclipse, when it is at its peak.
+ *
+ * Fields `sd_penum`, `sd_partial`, and `sd_total` hold the semi-duration of each phase
+ * of the eclipse, which is half of the amount of time the eclipse spends in each
+ * phase (expressed in minutes), or 0.0 if the eclipse never reaches that phase.
+ * By converting from minutes to days, and subtracting/adding with `peak`, the caller
+ * may determine the date and time of the beginning/end of each eclipse phase.
+ */
+class LunarEclipseInfo(
+
+ /**
+ * The type of lunar eclipse found.
+ */
+ val kind: EclipseKind,
+
+ /**
+ * The time of the eclipse at its peak.
+ */
+ val peak: AstroTime,
+
+ /**
+ * The semi-duration of the penumbral phase in minutes.
+ */
+ val sd_penum: Double,
+
+ /**
+ * The semi-duration of the partial phase in minutes, or 0.0 if none.
+ */
+ val sd_partial: Double,
+
+ /**
+ * The semi-duration of the total phase in minutes, or 0.0 if none.
+ */
+ val sd_total: Double
+)
+
+
+/**
+ * The main container of astronomy calculation functions.
+ */
object Astronomy {
private const val SECONDS_PER_DAY = 24 * 3600
internal fun terrestrialTime(ut: Double): Double = ut + deltaT(ut) / SECONDS_PER_DAY
diff --git a/generate/template/astronomy.py b/generate/template/astronomy.py
index d3f74f2d..89df0085 100644
--- a/generate/template/astronomy.py
+++ b/generate/template/astronomy.py
@@ -5706,7 +5706,7 @@ class LunarEclipseInfo:
Returned by #SearchLunarEclipse or #NextLunarEclipse
to report information about a lunar eclipse event.
When a lunar eclipse is found, it is classified as penumbral, partial, or total.
- Penumbral eclipses are difficult to observe, because the moon is only slightly dimmed
+ Penumbral eclipses are difficult to observe, because the Moon is only slightly dimmed
by the Earth's penumbra; no part of the Moon touches the Earth's umbra.
Partial eclipses occur when part, but not all, of the Moon touches the Earth's umbra.
Total eclipses occur when the entire Moon passes into the Earth's umbra.
diff --git a/generate/template/astronomy.ts b/generate/template/astronomy.ts
index 37ebc58a..b5cfd9e0 100644
--- a/generate/template/astronomy.ts
+++ b/generate/template/astronomy.ts
@@ -6061,7 +6061,7 @@ export function Constellation(ra: number, dec: number): ConstellationInfo {
* Returned by {@link SearchLunarEclipse} or {@link NextLunarEclipse}
* to report information about a lunar eclipse event.
* When a lunar eclipse is found, it is classified as penumbral, partial, or total.
- * Penumbral eclipses are difficult to observe, because the moon is only slightly dimmed
+ * Penumbral eclipses are difficult to observe, because the Moon is only slightly dimmed
* by the Earth's penumbra; no part of the Moon touches the Earth's umbra.
* Partial eclipses occur when part, but not all, of the Moon touches the Earth's umbra.
* Total eclipses occur when the entire Moon passes into the Earth's umbra.
diff --git a/source/c/README.md b/source/c/README.md
index d5e43594..1ce8e190 100644
--- a/source/c/README.md
+++ b/source/c/README.md
@@ -3958,7 +3958,7 @@ There are 5 "event" fields, each of which contains a time and a solar altitude.
Returned by [`Astronomy_SearchLunarEclipse`](#Astronomy_SearchLunarEclipse) or [`Astronomy_NextLunarEclipse`](#Astronomy_NextLunarEclipse) to report information about a lunar eclipse event. If a lunar eclipse is found, `status` holds `ASTRO_SUCCESS` and the other fields are set. If `status` holds any other value, it is an error code and the other fields are undefined.
-When a lunar eclipse is found, it is classified as penumbral, partial, or total. Penumbral eclipses are difficult to observe, because the moon is only slightly dimmed by the Earth's penumbra; no part of the Moon touches the Earth's umbra. Partial eclipses occur when part, but not all, of the Moon touches the Earth's umbra. Total eclipses occur when the entire Moon passes into the Earth's umbra.
+When a lunar eclipse is found, it is classified as penumbral, partial, or total. Penumbral eclipses are difficult to observe, because the Moon is only slightly dimmed by the Earth's penumbra; no part of the Moon touches the Earth's umbra. Partial eclipses occur when part, but not all, of the Moon touches the Earth's umbra. Total eclipses occur when the entire Moon passes into the Earth's umbra.
The `kind` field thus holds `ECLIPSE_PENUMBRAL`, `ECLIPSE_PARTIAL`, or `ECLIPSE_TOTAL`, depending on the kind of lunar eclipse found.
diff --git a/source/c/astronomy.h b/source/c/astronomy.h
index fe7a852e..f73ac1e2 100644
--- a/source/c/astronomy.h
+++ b/source/c/astronomy.h
@@ -737,7 +737,7 @@ astro_eclipse_kind_t;
* If `status` holds any other value, it is an error code and the other fields are undefined.
*
* When a lunar eclipse is found, it is classified as penumbral, partial, or total.
- * Penumbral eclipses are difficult to observe, because the moon is only slightly dimmed
+ * Penumbral eclipses are difficult to observe, because the Moon is only slightly dimmed
* by the Earth's penumbra; no part of the Moon touches the Earth's umbra.
* Partial eclipses occur when part, but not all, of the Moon touches the Earth's umbra.
* Total eclipses occur when the entire Moon passes into the Earth's umbra.
diff --git a/source/csharp/README.md b/source/csharp/README.md
index 90a18fb9..39f9b83d 100644
--- a/source/csharp/README.md
+++ b/source/csharp/README.md
@@ -2369,7 +2369,7 @@ atmospheric interference (sunrise or sunset conditions).
## `enum EclipseKind`
-**different kinds of lunar/solar eclipses.**
+**The different kinds of lunar/solar eclipses.**
| Value | Description |
| --- | --- |
@@ -2617,7 +2617,7 @@ See [`EclipseEvent`](#EclipseEvent) for more information.
Returned by [`Astronomy.SearchLunarEclipse`](#Astronomy.SearchLunarEclipse) or [`Astronomy.NextLunarEclipse`](#Astronomy.NextLunarEclipse)
to report information about a lunar eclipse event.
When a lunar eclipse is found, it is classified as penumbral, partial, or total.
-Penumbral eclipses are difficult to observe, because the moon is only slightly dimmed
+Penumbral eclipses are difficult to observe, because the Moon is only slightly dimmed
by the Earth's penumbra; no part of the Moon touches the Earth's umbra.
Partial eclipses occur when part, but not all, of the Moon touches the Earth's umbra.
Total eclipses occur when the entire Moon passes into the Earth's umbra.
diff --git a/source/csharp/astronomy.cs b/source/csharp/astronomy.cs
index df3dd3f7..4b80109b 100644
--- a/source/csharp/astronomy.cs
+++ b/source/csharp/astronomy.cs
@@ -1129,7 +1129,7 @@ namespace CosineKitty
}
}
- /// different kinds of lunar/solar eclipses.
+ /// The different kinds of lunar/solar eclipses.
public enum EclipseKind
{
/// No eclipse found.
@@ -1155,7 +1155,7 @@ namespace CosineKitty
/// Returned by #Astronomy.SearchLunarEclipse or #Astronomy.NextLunarEclipse
/// to report information about a lunar eclipse event.
/// When a lunar eclipse is found, it is classified as penumbral, partial, or total.
- /// Penumbral eclipses are difficult to observe, because the moon is only slightly dimmed
+ /// Penumbral eclipses are difficult to observe, because the Moon is only slightly dimmed
/// by the Earth's penumbra; no part of the Moon touches the Earth's umbra.
/// Partial eclipses occur when part, but not all, of the Moon touches the Earth's umbra.
/// Total eclipses occur when the entire Moon passes into the Earth's umbra.
diff --git a/source/js/README.md b/source/js/README.md
index 90d5e65f..f3ec2abb 100644
--- a/source/js/README.md
+++ b/source/js/README.md
@@ -593,7 +593,7 @@ For the Moon orbiting the Earth, apsis is a perigee or apogee, respectively.
Returned by [SearchLunarEclipse](#SearchLunarEclipse) or [NextLunarEclipse](#NextLunarEclipse)
to report information about a lunar eclipse event.
When a lunar eclipse is found, it is classified as penumbral, partial, or total.
-Penumbral eclipses are difficult to observe, because the moon is only slightly dimmed
+Penumbral eclipses are difficult to observe, because the Moon is only slightly dimmed
by the Earth's penumbra; no part of the Moon touches the Earth's umbra.
Partial eclipses occur when part, but not all, of the Moon touches the Earth's umbra.
Total eclipses occur when the entire Moon passes into the Earth's umbra.
diff --git a/source/js/astronomy.browser.js b/source/js/astronomy.browser.js
index 8dfb1edd..b6804c25 100644
--- a/source/js/astronomy.browser.js
+++ b/source/js/astronomy.browser.js
@@ -7302,7 +7302,7 @@ exports.Constellation = Constellation;
* Returned by {@link SearchLunarEclipse} or {@link NextLunarEclipse}
* to report information about a lunar eclipse event.
* When a lunar eclipse is found, it is classified as penumbral, partial, or total.
- * Penumbral eclipses are difficult to observe, because the moon is only slightly dimmed
+ * Penumbral eclipses are difficult to observe, because the Moon is only slightly dimmed
* by the Earth's penumbra; no part of the Moon touches the Earth's umbra.
* Partial eclipses occur when part, but not all, of the Moon touches the Earth's umbra.
* Total eclipses occur when the entire Moon passes into the Earth's umbra.
diff --git a/source/js/astronomy.d.ts b/source/js/astronomy.d.ts
index 9ebb42cb..26902ff8 100644
--- a/source/js/astronomy.d.ts
+++ b/source/js/astronomy.d.ts
@@ -2337,7 +2337,7 @@ export declare function Constellation(ra: number, dec: number): ConstellationInf
* Returned by {@link SearchLunarEclipse} or {@link NextLunarEclipse}
* to report information about a lunar eclipse event.
* When a lunar eclipse is found, it is classified as penumbral, partial, or total.
- * Penumbral eclipses are difficult to observe, because the moon is only slightly dimmed
+ * Penumbral eclipses are difficult to observe, because the Moon is only slightly dimmed
* by the Earth's penumbra; no part of the Moon touches the Earth's umbra.
* Partial eclipses occur when part, but not all, of the Moon touches the Earth's umbra.
* Total eclipses occur when the entire Moon passes into the Earth's umbra.
diff --git a/source/js/astronomy.js b/source/js/astronomy.js
index 6a50104a..33d9503d 100644
--- a/source/js/astronomy.js
+++ b/source/js/astronomy.js
@@ -7301,7 +7301,7 @@ exports.Constellation = Constellation;
* Returned by {@link SearchLunarEclipse} or {@link NextLunarEclipse}
* to report information about a lunar eclipse event.
* When a lunar eclipse is found, it is classified as penumbral, partial, or total.
- * Penumbral eclipses are difficult to observe, because the moon is only slightly dimmed
+ * Penumbral eclipses are difficult to observe, because the Moon is only slightly dimmed
* by the Earth's penumbra; no part of the Moon touches the Earth's umbra.
* Partial eclipses occur when part, but not all, of the Moon touches the Earth's umbra.
* Total eclipses occur when the entire Moon passes into the Earth's umbra.
diff --git a/source/js/astronomy.ts b/source/js/astronomy.ts
index bd0741a6..ffb74540 100644
--- a/source/js/astronomy.ts
+++ b/source/js/astronomy.ts
@@ -7518,7 +7518,7 @@ export function Constellation(ra: number, dec: number): ConstellationInfo {
* Returned by {@link SearchLunarEclipse} or {@link NextLunarEclipse}
* to report information about a lunar eclipse event.
* When a lunar eclipse is found, it is classified as penumbral, partial, or total.
- * Penumbral eclipses are difficult to observe, because the moon is only slightly dimmed
+ * Penumbral eclipses are difficult to observe, because the Moon is only slightly dimmed
* by the Earth's penumbra; no part of the Moon touches the Earth's umbra.
* Partial eclipses occur when part, but not all, of the Moon touches the Earth's umbra.
* Total eclipses occur when the entire Moon passes into the Earth's umbra.
diff --git a/source/js/esm/astronomy.js b/source/js/esm/astronomy.js
index 2f7c0591..1a54e255 100644
--- a/source/js/esm/astronomy.js
+++ b/source/js/esm/astronomy.js
@@ -7202,7 +7202,7 @@ export function Constellation(ra, dec) {
* Returned by {@link SearchLunarEclipse} or {@link NextLunarEclipse}
* to report information about a lunar eclipse event.
* When a lunar eclipse is found, it is classified as penumbral, partial, or total.
- * Penumbral eclipses are difficult to observe, because the moon is only slightly dimmed
+ * Penumbral eclipses are difficult to observe, because the Moon is only slightly dimmed
* by the Earth's penumbra; no part of the Moon touches the Earth's umbra.
* Partial eclipses occur when part, but not all, of the Moon touches the Earth's umbra.
* Total eclipses occur when the entire Moon passes into the Earth's umbra.
diff --git a/source/kotlin/README.md b/source/kotlin/README.md
index cb5319ba..b6e36fbf 100644
--- a/source/kotlin/README.md
+++ b/source/kotlin/README.md
@@ -62,19 +62,30 @@ these are used in function and type names.
| Name | Summary |
|---|---|
| [Aberration](doc/-aberration/index.md) | [jvm]
enum [Aberration](doc/-aberration/index.md) : [Enum](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-enum/index.html)<[Aberration](doc/-aberration/index.md)>
Aberration calculation options. |
-| [Astronomy](doc/-astronomy/index.md) | [jvm]
object [Astronomy](doc/-astronomy/index.md) |
+| [ApsisInfo](doc/-apsis-info/index.md) | [jvm]
class [ApsisInfo](doc/-apsis-info/index.md)(time: [AstroTime](doc/-astro-time/index.md), kind: [ApsisKind](doc/-apsis-kind/index.md), dist_au: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), dist_km: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html))
An apsis event: pericenter (closest approach) or apocenter (farthest distance). |
+| [ApsisKind](doc/-apsis-kind/index.md) | [jvm]
enum [ApsisKind](doc/-apsis-kind/index.md) : [Enum](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-enum/index.html)<[ApsisKind](doc/-apsis-kind/index.md)>
The type of apsis: pericenter (closest approach) or apocenter (farthest distance). |
+| [Astronomy](doc/-astronomy/index.md) | [jvm]
object [Astronomy](doc/-astronomy/index.md)
The main container of astronomy calculation functions. |
| [AstroTime](doc/-astro-time/index.md) | [jvm]
class [AstroTime](doc/-astro-time/index.md)
A date and time used for astronomical calculations. |
| [AstroVector](doc/-astro-vector/index.md) | [jvm]
data class [AstroVector](doc/-astro-vector/index.md)(x: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), y: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), z: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), t: [AstroTime](doc/-astro-time/index.md)) |
| [Body](doc/-body/index.md) | [jvm]
enum [Body](doc/-body/index.md) : [Enum](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-enum/index.html)<[Body](doc/-body/index.md)>
The enumeration of celestial bodies supported by Astronomy Engine. |
| [Direction](doc/-direction/index.md) | [jvm]
enum [Direction](doc/-direction/index.md) : [Enum](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-enum/index.html)<[Direction](doc/-direction/index.md)>
Selects whether to search for a rising event or a setting event for a celestial body. |
+| [EclipseKind](doc/-eclipse-kind/index.md) | [jvm]
enum [EclipseKind](doc/-eclipse-kind/index.md) : [Enum](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-enum/index.html)<[EclipseKind](doc/-eclipse-kind/index.md)>
The different kinds of lunar/solar eclipses. |
+| [Ecliptic](doc/-ecliptic/index.md) | [jvm]
data class [Ecliptic](doc/-ecliptic/index.md)(vec: [AstroVector](doc/-astro-vector/index.md), elat: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), elon: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html))
Ecliptic angular and Cartesian coordinates. |
+| [ElongationInfo](doc/-elongation-info/index.md) | [jvm]
class [ElongationInfo](doc/-elongation-info/index.md)(time: [AstroTime](doc/-astro-time/index.md), visibility: [Visibility](doc/-visibility/index.md), elongation: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), eclipticSeparation: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html))
Contains information about the visibility of a celestial body at a given date and time. |
| [EquatorEpoch](doc/-equator-epoch/index.md) | [jvm]
enum [EquatorEpoch](doc/-equator-epoch/index.md) : [Enum](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-enum/index.html)<[EquatorEpoch](doc/-equator-epoch/index.md)>
Selects the date for which the Earth's equator is to be used for representing equatorial coordinates. |
| [Equatorial](doc/-equatorial/index.md) | [jvm]
class [Equatorial](doc/-equatorial/index.md)(ra: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), dec: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), dist: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), vec: [AstroVector](doc/-astro-vector/index.md))
Equatorial angular and cartesian coordinates. |
+| [HourAngleInfo](doc/-hour-angle-info/index.md) | [jvm]
class [HourAngleInfo](doc/-hour-angle-info/index.md)(time: [AstroTime](doc/-astro-time/index.md), hor: [Topocentric](doc/-topocentric/index.md))
Information about a celestial body crossing a specific hour angle. |
| [JupiterMoonsInfo](doc/-jupiter-moons-info/index.md) | [jvm]
class [JupiterMoonsInfo](doc/-jupiter-moons-info/index.md)(moon: [Array](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-array/index.html)<[StateVector](doc/-state-vector/index.md)>)
Holds the positions and velocities of Jupiter's major 4 moons. |
+| [LibrationInfo](doc/-libration-info/index.md) | [jvm]
data class [LibrationInfo](doc/-libration-info/index.md)(elat: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), elon: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), mlat: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), mlon: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), dist_km: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), diam_deg: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html))
Lunar libration angles, returned by #Astronomy.libration. |
+| [LunarEclipseInfo](doc/-lunar-eclipse-info/index.md) | [jvm]
class [LunarEclipseInfo](doc/-lunar-eclipse-info/index.md)(kind: [EclipseKind](doc/-eclipse-kind/index.md), peak: [AstroTime](doc/-astro-time/index.md), sd_penum: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), sd_partial: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), sd_total: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html))
Information about a lunar eclipse. |
+| [MoonQuarterInfo](doc/-moon-quarter-info/index.md) | [jvm]
class [MoonQuarterInfo](doc/-moon-quarter-info/index.md)(quarter: [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html), time: [AstroTime](doc/-astro-time/index.md))
A lunar quarter event (new moon, first quarter, full moon, or third quarter) along with its date and time. |
| [Observer](doc/-observer/index.md) | [jvm]
data class [Observer](doc/-observer/index.md)(latitude: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), longitude: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), height: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html))
The location of an observer on (or near) the surface of the Earth. |
| [Refraction](doc/-refraction/index.md) | [jvm]
enum [Refraction](doc/-refraction/index.md) : [Enum](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-enum/index.html)<[Refraction](doc/-refraction/index.md)>
Selects whether to correct for atmospheric refraction, and if so, how. |
| [RotationMatrix](doc/-rotation-matrix/index.md) | [jvm]
class [RotationMatrix](doc/-rotation-matrix/index.md)(rot: [Array](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-array/index.html)<[DoubleArray](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double-array/index.html)>)
A rotation matrix that can be used to transform one coordinate system to another. |
+| [SeasonsInfo](doc/-seasons-info/index.md) | [jvm]
class [SeasonsInfo](doc/-seasons-info/index.md)(mar_equinox: [AstroTime](doc/-astro-time/index.md), jun_solstice: [AstroTime](doc/-astro-time/index.md), sep_equinox: [AstroTime](doc/-astro-time/index.md), dec_solstice: [AstroTime](doc/-astro-time/index.md))
The dates and times of changes of season for a given calendar year. |
| [Spherical](doc/-spherical/index.md) | [jvm]
data class [Spherical](doc/-spherical/index.md)(lat: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), lon: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), dist: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html))
Spherical coordinates: latitude, longitude, distance. |
| [StateVector](doc/-state-vector/index.md) | [jvm]
data class [StateVector](doc/-state-vector/index.md)(x: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), y: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), z: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), vx: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), vy: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), vz: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), t: [AstroTime](doc/-astro-time/index.md)) |
+| [Topocentric](doc/-topocentric/index.md) | [jvm]
data class [Topocentric](doc/-topocentric/index.md)(azimuth: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), altitude: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), ra: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), dec: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html))
Coordinates of a celestial body as seen by a topocentric observer. |
| [Visibility](doc/-visibility/index.md) | [jvm]
enum [Visibility](doc/-visibility/index.md) : [Enum](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-enum/index.html)<[Visibility](doc/-visibility/index.md)>
Indicates whether a body (especially Mercury or Venus) is best seen in the morning or evening. |
## Functions
diff --git a/source/kotlin/doc/-aberration/-corrected/index.md b/source/kotlin/doc/-aberration/-corrected/index.md
index 4bf0551b..77cc7014 100644
--- a/source/kotlin/doc/-aberration/-corrected/index.md
+++ b/source/kotlin/doc/-aberration/-corrected/index.md
@@ -11,5 +11,5 @@ Request correction for aberration.
| Name | Summary |
|---|---|
-| [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-aberration/-none/index.md b/source/kotlin/doc/-aberration/-none/index.md
index 78ae1ab7..accbd391 100644
--- a/source/kotlin/doc/-aberration/-none/index.md
+++ b/source/kotlin/doc/-aberration/-none/index.md
@@ -11,5 +11,5 @@ Do not correct for aberration.
| Name | Summary |
|---|---|
-| [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-aberration/index.md b/source/kotlin/doc/-aberration/index.md
index 910de010..ef7181b4 100644
--- a/source/kotlin/doc/-aberration/index.md
+++ b/source/kotlin/doc/-aberration/index.md
@@ -24,5 +24,5 @@ Aberration correction is useful to improve accuracy of coordinates of apparent l
| Name | Summary |
|---|---|
-| [name](../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-apsis-info/-apsis-info.md b/source/kotlin/doc/-apsis-info/-apsis-info.md
new file mode 100644
index 00000000..b9f2f38d
--- /dev/null
+++ b/source/kotlin/doc/-apsis-info/-apsis-info.md
@@ -0,0 +1,6 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[ApsisInfo](index.md)/[ApsisInfo](-apsis-info.md)
+
+# ApsisInfo
+
+[jvm]\
+fun [ApsisInfo](-apsis-info.md)(time: [AstroTime](../-astro-time/index.md), kind: [ApsisKind](../-apsis-kind/index.md), dist_au: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), dist_km: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html))
diff --git a/source/kotlin/doc/-apsis-info/dist_au.md b/source/kotlin/doc/-apsis-info/dist_au.md
new file mode 100644
index 00000000..fa4b342b
--- /dev/null
+++ b/source/kotlin/doc/-apsis-info/dist_au.md
@@ -0,0 +1,8 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[ApsisInfo](index.md)/[dist_au](dist_au.md)
+
+# dist_au
+
+[jvm]\
+val [dist_au](dist_au.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
+
+The distance between the centers of the bodies in astronomical units.
diff --git a/source/kotlin/doc/-apsis-info/dist_km.md b/source/kotlin/doc/-apsis-info/dist_km.md
new file mode 100644
index 00000000..2fe6dc4d
--- /dev/null
+++ b/source/kotlin/doc/-apsis-info/dist_km.md
@@ -0,0 +1,8 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[ApsisInfo](index.md)/[dist_km](dist_km.md)
+
+# dist_km
+
+[jvm]\
+val [dist_km](dist_km.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
+
+The distance between the centers of the bodies in kilometers.
diff --git a/source/kotlin/doc/-apsis-info/index.md b/source/kotlin/doc/-apsis-info/index.md
new file mode 100644
index 00000000..d9b0db9d
--- /dev/null
+++ b/source/kotlin/doc/-apsis-info/index.md
@@ -0,0 +1,29 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[ApsisInfo](index.md)
+
+# ApsisInfo
+
+[jvm]\
+class [ApsisInfo](index.md)(time: [AstroTime](../-astro-time/index.md), kind: [ApsisKind](../-apsis-kind/index.md), dist_au: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), dist_km: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html))
+
+An apsis event: pericenter (closest approach) or apocenter (farthest distance).
+
+For the Moon orbiting the Earth, or a planet orbiting the Sun, an *apsis* is an event where the orbiting body reaches its closest or farthest point from the primary body. The closest approach is called *pericenter* and the farthest point is *apocenter*.
+
+More specific terminology is common for particular orbiting bodies. The Moon's closest approach to the Earth is called *perigee* and its farthest point is called *apogee*. The closest approach of a planet to the Sun is called *perihelion* and the furthest point is called *aphelion*.
+
+This data structure is returned by #Astronomy.searchLunarApsis and #Astronomy.nextLunarApsis to iterate through consecutive alternating perigees and apogees.
+
+## Constructors
+
+| | |
+|---|---|
+| [ApsisInfo](-apsis-info.md) | [jvm]
fun [ApsisInfo](-apsis-info.md)(time: [AstroTime](../-astro-time/index.md), kind: [ApsisKind](../-apsis-kind/index.md), dist_au: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), dist_km: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)) |
+
+## Properties
+
+| Name | Summary |
+|---|---|
+| [dist_au](dist_au.md) | [jvm]
val [dist_au](dist_au.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
The distance between the centers of the bodies in astronomical units. |
+| [dist_km](dist_km.md) | [jvm]
val [dist_km](dist_km.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
The distance between the centers of the bodies in kilometers. |
+| [kind](kind.md) | [jvm]
val [kind](kind.md): [ApsisKind](../-apsis-kind/index.md)
Whether this is a pericenter or apocenter event. |
+| [time](time.md) | [jvm]
val [time](time.md): [AstroTime](../-astro-time/index.md)
The date and time of the apsis. |
diff --git a/source/kotlin/doc/-apsis-info/kind.md b/source/kotlin/doc/-apsis-info/kind.md
new file mode 100644
index 00000000..102dfab8
--- /dev/null
+++ b/source/kotlin/doc/-apsis-info/kind.md
@@ -0,0 +1,8 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[ApsisInfo](index.md)/[kind](kind.md)
+
+# kind
+
+[jvm]\
+val [kind](kind.md): [ApsisKind](../-apsis-kind/index.md)
+
+Whether this is a pericenter or apocenter event.
diff --git a/source/kotlin/doc/-apsis-info/time.md b/source/kotlin/doc/-apsis-info/time.md
new file mode 100644
index 00000000..5e1758aa
--- /dev/null
+++ b/source/kotlin/doc/-apsis-info/time.md
@@ -0,0 +1,8 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[ApsisInfo](index.md)/[time](time.md)
+
+# time
+
+[jvm]\
+val [time](time.md): [AstroTime](../-astro-time/index.md)
+
+The date and time of the apsis.
diff --git a/source/kotlin/doc/-apsis-kind/-apocenter/index.md b/source/kotlin/doc/-apsis-kind/-apocenter/index.md
new file mode 100644
index 00000000..00dd6a5b
--- /dev/null
+++ b/source/kotlin/doc/-apsis-kind/-apocenter/index.md
@@ -0,0 +1,15 @@
+//[astronomy](../../../../index.md)/[io.github.cosinekitty.astronomy](../../index.md)/[ApsisKind](../index.md)/[Apocenter](index.md)
+
+# Apocenter
+
+[jvm]\
+[Apocenter](index.md)()
+
+The body is at its farthest distance from the object it orbits.
+
+## Properties
+
+| Name | Summary |
+|---|---|
+| [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-apsis-kind/-pericenter/index.md b/source/kotlin/doc/-apsis-kind/-pericenter/index.md
new file mode 100644
index 00000000..3417e5ba
--- /dev/null
+++ b/source/kotlin/doc/-apsis-kind/-pericenter/index.md
@@ -0,0 +1,15 @@
+//[astronomy](../../../../index.md)/[io.github.cosinekitty.astronomy](../../index.md)/[ApsisKind](../index.md)/[Pericenter](index.md)
+
+# Pericenter
+
+[jvm]\
+[Pericenter](index.md)()
+
+The body is at its closest approach to the object it orbits.
+
+## Properties
+
+| Name | Summary |
+|---|---|
+| [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-apsis-kind/index.md b/source/kotlin/doc/-apsis-kind/index.md
new file mode 100644
index 00000000..5fa59034
--- /dev/null
+++ b/source/kotlin/doc/-apsis-kind/index.md
@@ -0,0 +1,22 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[ApsisKind](index.md)
+
+# ApsisKind
+
+[jvm]\
+enum [ApsisKind](index.md) : [Enum](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-enum/index.html)<[ApsisKind](index.md)>
+
+The type of apsis: pericenter (closest approach) or apocenter (farthest distance).
+
+## Entries
+
+| | |
+|---|---|
+| [Apocenter](-apocenter/index.md) | [jvm]
[Apocenter](-apocenter/index.md)()
The body is at its farthest distance from the object it orbits. |
+| [Pericenter](-pericenter/index.md) | [jvm]
[Pericenter](-pericenter/index.md)()
The body is at its closest approach to the object it orbits. |
+
+## Properties
+
+| Name | Summary |
+|---|---|
+| [name](../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-astronomy/index.md b/source/kotlin/doc/-astronomy/index.md
index c94c2474..709856ce 100644
--- a/source/kotlin/doc/-astronomy/index.md
+++ b/source/kotlin/doc/-astronomy/index.md
@@ -5,6 +5,8 @@
[jvm]\
object [Astronomy](index.md)
+The main container of astronomy calculation functions.
+
## Functions
| Name | Summary |
diff --git a/source/kotlin/doc/-body/-e-m-b/index.md b/source/kotlin/doc/-body/-e-m-b/index.md
index 2fccbb04..3748c571 100644
--- a/source/kotlin/doc/-body/-e-m-b/index.md
+++ b/source/kotlin/doc/-body/-e-m-b/index.md
@@ -11,5 +11,5 @@ The Earth/Moon Barycenter.
| Name | Summary |
|---|---|
-| [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-body/-earth/index.md b/source/kotlin/doc/-body/-earth/index.md
index 639cb870..051609d8 100644
--- a/source/kotlin/doc/-body/-earth/index.md
+++ b/source/kotlin/doc/-body/-earth/index.md
@@ -11,5 +11,5 @@ The planet Earth. Some functions that accept a Body parameter will fail if passe
| Name | Summary |
|---|---|
-| [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-body/-invalid/index.md b/source/kotlin/doc/-body/-invalid/index.md
index 06e55998..6d24215b 100644
--- a/source/kotlin/doc/-body/-invalid/index.md
+++ b/source/kotlin/doc/-body/-invalid/index.md
@@ -11,5 +11,5 @@ A placeholder value representing an invalid or unknown celestial body.
| Name | Summary |
|---|---|
-| [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-body/-jupiter/index.md b/source/kotlin/doc/-body/-jupiter/index.md
index a67a3954..4c85f268 100644
--- a/source/kotlin/doc/-body/-jupiter/index.md
+++ b/source/kotlin/doc/-body/-jupiter/index.md
@@ -11,5 +11,5 @@ The planet Jupiter.
| Name | Summary |
|---|---|
-| [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-body/-mars/index.md b/source/kotlin/doc/-body/-mars/index.md
index d1567777..a152ddea 100644
--- a/source/kotlin/doc/-body/-mars/index.md
+++ b/source/kotlin/doc/-body/-mars/index.md
@@ -11,5 +11,5 @@ The planet Mars.
| Name | Summary |
|---|---|
-| [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-body/-mercury/index.md b/source/kotlin/doc/-body/-mercury/index.md
index 67182e9a..0b04ec0d 100644
--- a/source/kotlin/doc/-body/-mercury/index.md
+++ b/source/kotlin/doc/-body/-mercury/index.md
@@ -11,5 +11,5 @@ The planet Mercury.
| Name | Summary |
|---|---|
-| [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-body/-moon/index.md b/source/kotlin/doc/-body/-moon/index.md
index 65252437..22d20150 100644
--- a/source/kotlin/doc/-body/-moon/index.md
+++ b/source/kotlin/doc/-body/-moon/index.md
@@ -11,5 +11,5 @@ The Earth's natural satellite, the Moon.
| Name | Summary |
|---|---|
-| [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-body/-neptune/index.md b/source/kotlin/doc/-body/-neptune/index.md
index 4df756de..0a726083 100644
--- a/source/kotlin/doc/-body/-neptune/index.md
+++ b/source/kotlin/doc/-body/-neptune/index.md
@@ -11,5 +11,5 @@ The planet Neptune.
| Name | Summary |
|---|---|
-| [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-body/-pluto/index.md b/source/kotlin/doc/-body/-pluto/index.md
index a071827b..e1a044ac 100644
--- a/source/kotlin/doc/-body/-pluto/index.md
+++ b/source/kotlin/doc/-body/-pluto/index.md
@@ -11,5 +11,5 @@ The planet Pluto.
| Name | Summary |
|---|---|
-| [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-body/-s-s-b/index.md b/source/kotlin/doc/-body/-s-s-b/index.md
index 3ed54a2e..e5944861 100644
--- a/source/kotlin/doc/-body/-s-s-b/index.md
+++ b/source/kotlin/doc/-body/-s-s-b/index.md
@@ -11,5 +11,5 @@ The Solar System Barycenter.
| Name | Summary |
|---|---|
-| [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-body/-saturn/index.md b/source/kotlin/doc/-body/-saturn/index.md
index 4f6c9de0..432efd01 100644
--- a/source/kotlin/doc/-body/-saturn/index.md
+++ b/source/kotlin/doc/-body/-saturn/index.md
@@ -11,5 +11,5 @@ The planet Saturn.
| Name | Summary |
|---|---|
-| [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-body/-sun/index.md b/source/kotlin/doc/-body/-sun/index.md
index 6f2cefb0..d35d5f72 100644
--- a/source/kotlin/doc/-body/-sun/index.md
+++ b/source/kotlin/doc/-body/-sun/index.md
@@ -11,5 +11,5 @@ The Sun.
| Name | Summary |
|---|---|
-| [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-body/-uranus/index.md b/source/kotlin/doc/-body/-uranus/index.md
index c5d248f5..1b2b30f8 100644
--- a/source/kotlin/doc/-body/-uranus/index.md
+++ b/source/kotlin/doc/-body/-uranus/index.md
@@ -11,5 +11,5 @@ The planet Uranus.
| Name | Summary |
|---|---|
-| [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-body/-venus/index.md b/source/kotlin/doc/-body/-venus/index.md
index 25e83d52..e4a381be 100644
--- a/source/kotlin/doc/-body/-venus/index.md
+++ b/source/kotlin/doc/-body/-venus/index.md
@@ -11,5 +11,5 @@ The planet Venus.
| Name | Summary |
|---|---|
-| [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-body/index.md b/source/kotlin/doc/-body/index.md
index d06bac61..77249fd7 100644
--- a/source/kotlin/doc/-body/index.md
+++ b/source/kotlin/doc/-body/index.md
@@ -30,5 +30,5 @@ The enumeration of celestial bodies supported by Astronomy Engine.
| Name | Summary |
|---|---|
-| [name](../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-direction/-rise/index.md b/source/kotlin/doc/-direction/-rise/index.md
index 6fe1dc58..f25817ac 100644
--- a/source/kotlin/doc/-direction/-rise/index.md
+++ b/source/kotlin/doc/-direction/-rise/index.md
@@ -11,5 +11,5 @@ Indicates a rising event: a celestial body is observed to rise above the horizon
| Name | Summary |
|---|---|
-| [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-direction/-set/index.md b/source/kotlin/doc/-direction/-set/index.md
index 45675442..2acddb62 100644
--- a/source/kotlin/doc/-direction/-set/index.md
+++ b/source/kotlin/doc/-direction/-set/index.md
@@ -11,5 +11,5 @@ Indicates a setting event: a celestial body is observed to sink below the horizo
| Name | Summary |
|---|---|
-| [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-direction/index.md b/source/kotlin/doc/-direction/index.md
index e3482df5..8aa83940 100644
--- a/source/kotlin/doc/-direction/index.md
+++ b/source/kotlin/doc/-direction/index.md
@@ -18,5 +18,5 @@ Selects whether to search for a rising event or a setting event for a celestial
| Name | Summary |
|---|---|
-| [name](../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-eclipse-kind/-annular/index.md b/source/kotlin/doc/-eclipse-kind/-annular/index.md
new file mode 100644
index 00000000..d540f759
--- /dev/null
+++ b/source/kotlin/doc/-eclipse-kind/-annular/index.md
@@ -0,0 +1,15 @@
+//[astronomy](../../../../index.md)/[io.github.cosinekitty.astronomy](../../index.md)/[EclipseKind](../index.md)/[Annular](index.md)
+
+# Annular
+
+[jvm]\
+[Annular](index.md)()
+
+An annular solar eclipse. (Never used for a lunar eclipse.)
+
+## Properties
+
+| Name | Summary |
+|---|---|
+| [name](../-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-eclipse-kind/-none/index.md b/source/kotlin/doc/-eclipse-kind/-none/index.md
new file mode 100644
index 00000000..985133fd
--- /dev/null
+++ b/source/kotlin/doc/-eclipse-kind/-none/index.md
@@ -0,0 +1,15 @@
+//[astronomy](../../../../index.md)/[io.github.cosinekitty.astronomy](../../index.md)/[EclipseKind](../index.md)/[None](index.md)
+
+# None
+
+[jvm]\
+[None](index.md)()
+
+No eclipse found.
+
+## Properties
+
+| Name | Summary |
+|---|---|
+| [name](index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-eclipse-kind/-partial/index.md b/source/kotlin/doc/-eclipse-kind/-partial/index.md
new file mode 100644
index 00000000..1a46c537
--- /dev/null
+++ b/source/kotlin/doc/-eclipse-kind/-partial/index.md
@@ -0,0 +1,15 @@
+//[astronomy](../../../../index.md)/[io.github.cosinekitty.astronomy](../../index.md)/[EclipseKind](../index.md)/[Partial](index.md)
+
+# Partial
+
+[jvm]\
+[Partial](index.md)()
+
+A partial lunar/solar eclipse.
+
+## Properties
+
+| Name | Summary |
+|---|---|
+| [name](../-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-eclipse-kind/-penumbral/index.md b/source/kotlin/doc/-eclipse-kind/-penumbral/index.md
new file mode 100644
index 00000000..d92fdc74
--- /dev/null
+++ b/source/kotlin/doc/-eclipse-kind/-penumbral/index.md
@@ -0,0 +1,15 @@
+//[astronomy](../../../../index.md)/[io.github.cosinekitty.astronomy](../../index.md)/[EclipseKind](../index.md)/[Penumbral](index.md)
+
+# Penumbral
+
+[jvm]\
+[Penumbral](index.md)()
+
+A penumbral lunar eclipse. (Never used for a solar eclipse.)
+
+## Properties
+
+| Name | Summary |
+|---|---|
+| [name](../-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-eclipse-kind/-total/index.md b/source/kotlin/doc/-eclipse-kind/-total/index.md
new file mode 100644
index 00000000..dc4406f6
--- /dev/null
+++ b/source/kotlin/doc/-eclipse-kind/-total/index.md
@@ -0,0 +1,15 @@
+//[astronomy](../../../../index.md)/[io.github.cosinekitty.astronomy](../../index.md)/[EclipseKind](../index.md)/[Total](index.md)
+
+# Total
+
+[jvm]\
+[Total](index.md)()
+
+A total lunar/solar eclipse.
+
+## Properties
+
+| Name | Summary |
+|---|---|
+| [name](../-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-eclipse-kind/index.md b/source/kotlin/doc/-eclipse-kind/index.md
new file mode 100644
index 00000000..9deebdd5
--- /dev/null
+++ b/source/kotlin/doc/-eclipse-kind/index.md
@@ -0,0 +1,25 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[EclipseKind](index.md)
+
+# EclipseKind
+
+[jvm]\
+enum [EclipseKind](index.md) : [Enum](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-enum/index.html)<[EclipseKind](index.md)>
+
+The different kinds of lunar/solar eclipses.
+
+## Entries
+
+| | |
+|---|---|
+| [Total](-total/index.md) | [jvm]
[Total](-total/index.md)()
A total lunar/solar eclipse. |
+| [Annular](-annular/index.md) | [jvm]
[Annular](-annular/index.md)()
An annular solar eclipse. (Never used for a lunar eclipse.) |
+| [Partial](-partial/index.md) | [jvm]
[Partial](-partial/index.md)()
A partial lunar/solar eclipse. |
+| [Penumbral](-penumbral/index.md) | [jvm]
[Penumbral](-penumbral/index.md)()
A penumbral lunar eclipse. (Never used for a solar eclipse.) |
+| [None](-none/index.md) | [jvm]
[None](-none/index.md)()
No eclipse found. |
+
+## Properties
+
+| Name | Summary |
+|---|---|
+| [name](-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-ecliptic/-ecliptic.md b/source/kotlin/doc/-ecliptic/-ecliptic.md
new file mode 100644
index 00000000..eb403e8f
--- /dev/null
+++ b/source/kotlin/doc/-ecliptic/-ecliptic.md
@@ -0,0 +1,6 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[Ecliptic](index.md)/[Ecliptic](-ecliptic.md)
+
+# Ecliptic
+
+[jvm]\
+fun [Ecliptic](-ecliptic.md)(vec: [AstroVector](../-astro-vector/index.md), elat: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), elon: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html))
diff --git a/source/kotlin/doc/-ecliptic/elat.md b/source/kotlin/doc/-ecliptic/elat.md
new file mode 100644
index 00000000..d2bc502b
--- /dev/null
+++ b/source/kotlin/doc/-ecliptic/elat.md
@@ -0,0 +1,8 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[Ecliptic](index.md)/[elat](elat.md)
+
+# elat
+
+[jvm]\
+val [elat](elat.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
+
+Latitude in degrees north (positive) or south (negative) of the ecliptic plane.
diff --git a/source/kotlin/doc/-ecliptic/elon.md b/source/kotlin/doc/-ecliptic/elon.md
new file mode 100644
index 00000000..64a6df95
--- /dev/null
+++ b/source/kotlin/doc/-ecliptic/elon.md
@@ -0,0 +1,8 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[Ecliptic](index.md)/[elon](elon.md)
+
+# elon
+
+[jvm]\
+val [elon](elon.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
+
+Longitude in degrees around the ecliptic plane prograde from the equinox.
diff --git a/source/kotlin/doc/-ecliptic/index.md b/source/kotlin/doc/-ecliptic/index.md
new file mode 100644
index 00000000..f4371458
--- /dev/null
+++ b/source/kotlin/doc/-ecliptic/index.md
@@ -0,0 +1,24 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[Ecliptic](index.md)
+
+# Ecliptic
+
+[jvm]\
+data class [Ecliptic](index.md)(vec: [AstroVector](../-astro-vector/index.md), elat: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), elon: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html))
+
+Ecliptic angular and Cartesian coordinates.
+
+Coordinates of a celestial body as seen from the center of the Sun (heliocentric), oriented with respect to the plane of the Earth's orbit around the Sun (the ecliptic).
+
+## Constructors
+
+| | |
+|---|---|
+| [Ecliptic](-ecliptic.md) | [jvm]
fun [Ecliptic](-ecliptic.md)(vec: [AstroVector](../-astro-vector/index.md), elat: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), elon: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)) |
+
+## Properties
+
+| Name | Summary |
+|---|---|
+| [elat](elat.md) | [jvm]
val [elat](elat.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
Latitude in degrees north (positive) or south (negative) of the ecliptic plane. |
+| [elon](elon.md) | [jvm]
val [elon](elon.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
Longitude in degrees around the ecliptic plane prograde from the equinox. |
+| [vec](vec.md) | [jvm]
val [vec](vec.md): [AstroVector](../-astro-vector/index.md)
Cartesian ecliptic vector, with components as follows: x: the direction of the equinox along the ecliptic plane. y: in the ecliptic plane 90 degrees prograde from the equinox. z: perpendicular to the ecliptic plane. Positive is north. |
diff --git a/source/kotlin/doc/-ecliptic/vec.md b/source/kotlin/doc/-ecliptic/vec.md
new file mode 100644
index 00000000..5d1d4867
--- /dev/null
+++ b/source/kotlin/doc/-ecliptic/vec.md
@@ -0,0 +1,8 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[Ecliptic](index.md)/[vec](vec.md)
+
+# vec
+
+[jvm]\
+val [vec](vec.md): [AstroVector](../-astro-vector/index.md)
+
+Cartesian ecliptic vector, with components as follows: x: the direction of the equinox along the ecliptic plane. y: in the ecliptic plane 90 degrees prograde from the equinox. z: perpendicular to the ecliptic plane. Positive is north.
diff --git a/source/kotlin/doc/-elongation-info/-elongation-info.md b/source/kotlin/doc/-elongation-info/-elongation-info.md
new file mode 100644
index 00000000..0fb29e5b
--- /dev/null
+++ b/source/kotlin/doc/-elongation-info/-elongation-info.md
@@ -0,0 +1,6 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[ElongationInfo](index.md)/[ElongationInfo](-elongation-info.md)
+
+# ElongationInfo
+
+[jvm]\
+fun [ElongationInfo](-elongation-info.md)(time: [AstroTime](../-astro-time/index.md), visibility: [Visibility](../-visibility/index.md), elongation: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), eclipticSeparation: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html))
diff --git a/source/kotlin/doc/-elongation-info/ecliptic-separation.md b/source/kotlin/doc/-elongation-info/ecliptic-separation.md
new file mode 100644
index 00000000..5c7f09a4
--- /dev/null
+++ b/source/kotlin/doc/-elongation-info/ecliptic-separation.md
@@ -0,0 +1,8 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[ElongationInfo](index.md)/[eclipticSeparation](ecliptic-separation.md)
+
+# eclipticSeparation
+
+[jvm]\
+val [eclipticSeparation](ecliptic-separation.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
+
+The difference between the ecliptic longitudes of the body and the Sun, as seen from the Earth.
diff --git a/source/kotlin/doc/-elongation-info/elongation.md b/source/kotlin/doc/-elongation-info/elongation.md
new file mode 100644
index 00000000..72df6e8d
--- /dev/null
+++ b/source/kotlin/doc/-elongation-info/elongation.md
@@ -0,0 +1,8 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[ElongationInfo](index.md)/[elongation](elongation.md)
+
+# elongation
+
+[jvm]\
+val [elongation](elongation.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
+
+The angle in degrees between the body and the Sun, as seen from the Earth.
diff --git a/source/kotlin/doc/-elongation-info/index.md b/source/kotlin/doc/-elongation-info/index.md
new file mode 100644
index 00000000..eb64376b
--- /dev/null
+++ b/source/kotlin/doc/-elongation-info/index.md
@@ -0,0 +1,25 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[ElongationInfo](index.md)
+
+# ElongationInfo
+
+[jvm]\
+class [ElongationInfo](index.md)(time: [AstroTime](../-astro-time/index.md), visibility: [Visibility](../-visibility/index.md), elongation: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), eclipticSeparation: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html))
+
+Contains information about the visibility of a celestial body at a given date and time.
+
+See #Astronomy.elongation for more detailed information about the members of this class. See also #Astronomy.searchMaxElongation for how to search for maximum elongation events.
+
+## Constructors
+
+| | |
+|---|---|
+| [ElongationInfo](-elongation-info.md) | [jvm]
fun [ElongationInfo](-elongation-info.md)(time: [AstroTime](../-astro-time/index.md), visibility: [Visibility](../-visibility/index.md), elongation: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), eclipticSeparation: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)) |
+
+## Properties
+
+| Name | Summary |
+|---|---|
+| [eclipticSeparation](ecliptic-separation.md) | [jvm]
val [eclipticSeparation](ecliptic-separation.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
The difference between the ecliptic longitudes of the body and the Sun, as seen from the Earth. |
+| [elongation](elongation.md) | [jvm]
val [elongation](elongation.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
The angle in degrees between the body and the Sun, as seen from the Earth. |
+| [time](time.md) | [jvm]
val [time](time.md): [AstroTime](../-astro-time/index.md)
The date and time of the observation. |
+| [visibility](visibility.md) | [jvm]
val [visibility](visibility.md): [Visibility](../-visibility/index.md)
Whether the body is best seen in the morning or the evening. |
diff --git a/source/kotlin/doc/-elongation-info/time.md b/source/kotlin/doc/-elongation-info/time.md
new file mode 100644
index 00000000..f2a360c1
--- /dev/null
+++ b/source/kotlin/doc/-elongation-info/time.md
@@ -0,0 +1,8 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[ElongationInfo](index.md)/[time](time.md)
+
+# time
+
+[jvm]\
+val [time](time.md): [AstroTime](../-astro-time/index.md)
+
+The date and time of the observation.
diff --git a/source/kotlin/doc/-elongation-info/visibility.md b/source/kotlin/doc/-elongation-info/visibility.md
new file mode 100644
index 00000000..e0530820
--- /dev/null
+++ b/source/kotlin/doc/-elongation-info/visibility.md
@@ -0,0 +1,8 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[ElongationInfo](index.md)/[visibility](visibility.md)
+
+# visibility
+
+[jvm]\
+val [visibility](visibility.md): [Visibility](../-visibility/index.md)
+
+Whether the body is best seen in the morning or the evening.
diff --git a/source/kotlin/doc/-equator-epoch/-j2000/index.md b/source/kotlin/doc/-equator-epoch/-j2000/index.md
index f9ae52da..38e08ad4 100644
--- a/source/kotlin/doc/-equator-epoch/-j2000/index.md
+++ b/source/kotlin/doc/-equator-epoch/-j2000/index.md
@@ -11,5 +11,5 @@ Represent equatorial coordinates in the J2000 epoch.
| Name | Summary |
|---|---|
-| [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-equator-epoch/-of-date/index.md b/source/kotlin/doc/-equator-epoch/-of-date/index.md
index 28473bb8..6513cff0 100644
--- a/source/kotlin/doc/-equator-epoch/-of-date/index.md
+++ b/source/kotlin/doc/-equator-epoch/-of-date/index.md
@@ -11,5 +11,5 @@ Represent equatorial coordinates using the Earth's equator at the given date and
| Name | Summary |
|---|---|
-| [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-equator-epoch/index.md b/source/kotlin/doc/-equator-epoch/index.md
index fb1d68d9..a1d42b52 100644
--- a/source/kotlin/doc/-equator-epoch/index.md
+++ b/source/kotlin/doc/-equator-epoch/index.md
@@ -24,5 +24,5 @@ For some other purposes, it is more helpful to represent coordinates using the E
| Name | Summary |
|---|---|
-| [name](../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-hour-angle-info/-hour-angle-info.md b/source/kotlin/doc/-hour-angle-info/-hour-angle-info.md
new file mode 100644
index 00000000..385e2b23
--- /dev/null
+++ b/source/kotlin/doc/-hour-angle-info/-hour-angle-info.md
@@ -0,0 +1,6 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[HourAngleInfo](index.md)/[HourAngleInfo](-hour-angle-info.md)
+
+# HourAngleInfo
+
+[jvm]\
+fun [HourAngleInfo](-hour-angle-info.md)(time: [AstroTime](../-astro-time/index.md), hor: [Topocentric](../-topocentric/index.md))
diff --git a/source/kotlin/doc/-hour-angle-info/hor.md b/source/kotlin/doc/-hour-angle-info/hor.md
new file mode 100644
index 00000000..188011fc
--- /dev/null
+++ b/source/kotlin/doc/-hour-angle-info/hor.md
@@ -0,0 +1,8 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[HourAngleInfo](index.md)/[hor](hor.md)
+
+# hor
+
+[jvm]\
+val [hor](hor.md): [Topocentric](../-topocentric/index.md)
+
+Apparent coordinates of the body at the time it crosses the specified hour angle.
diff --git a/source/kotlin/doc/-hour-angle-info/index.md b/source/kotlin/doc/-hour-angle-info/index.md
new file mode 100644
index 00000000..87fe8c4c
--- /dev/null
+++ b/source/kotlin/doc/-hour-angle-info/index.md
@@ -0,0 +1,23 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[HourAngleInfo](index.md)
+
+# HourAngleInfo
+
+[jvm]\
+class [HourAngleInfo](index.md)(time: [AstroTime](../-astro-time/index.md), hor: [Topocentric](../-topocentric/index.md))
+
+Information about a celestial body crossing a specific hour angle.
+
+Returned by the function #Astronomy.searchHourAngle to report information about a celestial body crossing a certain hour angle as seen by a specified topocentric observer.
+
+## Constructors
+
+| | |
+|---|---|
+| [HourAngleInfo](-hour-angle-info.md) | [jvm]
fun [HourAngleInfo](-hour-angle-info.md)(time: [AstroTime](../-astro-time/index.md), hor: [Topocentric](../-topocentric/index.md)) |
+
+## Properties
+
+| Name | Summary |
+|---|---|
+| [hor](hor.md) | [jvm]
val [hor](hor.md): [Topocentric](../-topocentric/index.md)
Apparent coordinates of the body at the time it crosses the specified hour angle. |
+| [time](time.md) | [jvm]
val [time](time.md): [AstroTime](../-astro-time/index.md)
The date and time when the body crosses the specified hour angle. |
diff --git a/source/kotlin/doc/-hour-angle-info/time.md b/source/kotlin/doc/-hour-angle-info/time.md
new file mode 100644
index 00000000..47bee325
--- /dev/null
+++ b/source/kotlin/doc/-hour-angle-info/time.md
@@ -0,0 +1,8 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[HourAngleInfo](index.md)/[time](time.md)
+
+# time
+
+[jvm]\
+val [time](time.md): [AstroTime](../-astro-time/index.md)
+
+The date and time when the body crosses the specified hour angle.
diff --git a/source/kotlin/doc/-libration-info/-libration-info.md b/source/kotlin/doc/-libration-info/-libration-info.md
new file mode 100644
index 00000000..7f4858ac
--- /dev/null
+++ b/source/kotlin/doc/-libration-info/-libration-info.md
@@ -0,0 +1,6 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[LibrationInfo](index.md)/[LibrationInfo](-libration-info.md)
+
+# LibrationInfo
+
+[jvm]\
+fun [LibrationInfo](-libration-info.md)(elat: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), elon: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), mlat: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), mlon: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), dist_km: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), diam_deg: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html))
diff --git a/source/kotlin/doc/-libration-info/diam_deg.md b/source/kotlin/doc/-libration-info/diam_deg.md
new file mode 100644
index 00000000..932e491a
--- /dev/null
+++ b/source/kotlin/doc/-libration-info/diam_deg.md
@@ -0,0 +1,8 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[LibrationInfo](index.md)/[diam_deg](diam_deg.md)
+
+# diam_deg
+
+[jvm]\
+val [diam_deg](diam_deg.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
+
+The apparent angular diameter of the Moon, in degrees, as seen from the center of the Earth.
diff --git a/source/kotlin/doc/-libration-info/dist_km.md b/source/kotlin/doc/-libration-info/dist_km.md
new file mode 100644
index 00000000..f4902410
--- /dev/null
+++ b/source/kotlin/doc/-libration-info/dist_km.md
@@ -0,0 +1,8 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[LibrationInfo](index.md)/[dist_km](dist_km.md)
+
+# dist_km
+
+[jvm]\
+val [dist_km](dist_km.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
+
+Distance between the centers of the Earth and Moon in kilometers.
diff --git a/source/kotlin/doc/-libration-info/elat.md b/source/kotlin/doc/-libration-info/elat.md
new file mode 100644
index 00000000..1b1dfa7e
--- /dev/null
+++ b/source/kotlin/doc/-libration-info/elat.md
@@ -0,0 +1,8 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[LibrationInfo](index.md)/[elat](elat.md)
+
+# elat
+
+[jvm]\
+val [elat](elat.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
+
+Sub-Earth libration ecliptic latitude angle, in degrees.
diff --git a/source/kotlin/doc/-libration-info/elon.md b/source/kotlin/doc/-libration-info/elon.md
new file mode 100644
index 00000000..7f80ea81
--- /dev/null
+++ b/source/kotlin/doc/-libration-info/elon.md
@@ -0,0 +1,8 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[LibrationInfo](index.md)/[elon](elon.md)
+
+# elon
+
+[jvm]\
+val [elon](elon.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
+
+Sub-Earth libration ecliptic longitude angle, in degrees.
diff --git a/source/kotlin/doc/-libration-info/index.md b/source/kotlin/doc/-libration-info/index.md
new file mode 100644
index 00000000..d7ad67a2
--- /dev/null
+++ b/source/kotlin/doc/-libration-info/index.md
@@ -0,0 +1,25 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[LibrationInfo](index.md)
+
+# LibrationInfo
+
+[jvm]\
+data class [LibrationInfo](index.md)(elat: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), elon: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), mlat: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), mlon: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), dist_km: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), diam_deg: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html))
+
+Lunar libration angles, returned by #Astronomy.libration.
+
+## Constructors
+
+| | |
+|---|---|
+| [LibrationInfo](-libration-info.md) | [jvm]
fun [LibrationInfo](-libration-info.md)(elat: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), elon: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), mlat: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), mlon: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), dist_km: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), diam_deg: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)) |
+
+## Properties
+
+| Name | Summary |
+|---|---|
+| [diam_deg](diam_deg.md) | [jvm]
val [diam_deg](diam_deg.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
The apparent angular diameter of the Moon, in degrees, as seen from the center of the Earth. |
+| [dist_km](dist_km.md) | [jvm]
val [dist_km](dist_km.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
Distance between the centers of the Earth and Moon in kilometers. |
+| [elat](elat.md) | [jvm]
val [elat](elat.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
Sub-Earth libration ecliptic latitude angle, in degrees. |
+| [elon](elon.md) | [jvm]
val [elon](elon.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
Sub-Earth libration ecliptic longitude angle, in degrees. |
+| [mlat](mlat.md) | [jvm]
val [mlat](mlat.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
Moon's geocentric ecliptic latitude. |
+| [mlon](mlon.md) | [jvm]
val [mlon](mlon.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
Moon's geocentric ecliptic longitude. |
diff --git a/source/kotlin/doc/-libration-info/mlat.md b/source/kotlin/doc/-libration-info/mlat.md
new file mode 100644
index 00000000..b62002ac
--- /dev/null
+++ b/source/kotlin/doc/-libration-info/mlat.md
@@ -0,0 +1,8 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[LibrationInfo](index.md)/[mlat](mlat.md)
+
+# mlat
+
+[jvm]\
+val [mlat](mlat.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
+
+Moon's geocentric ecliptic latitude.
diff --git a/source/kotlin/doc/-libration-info/mlon.md b/source/kotlin/doc/-libration-info/mlon.md
new file mode 100644
index 00000000..c7955870
--- /dev/null
+++ b/source/kotlin/doc/-libration-info/mlon.md
@@ -0,0 +1,8 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[LibrationInfo](index.md)/[mlon](mlon.md)
+
+# mlon
+
+[jvm]\
+val [mlon](mlon.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
+
+Moon's geocentric ecliptic longitude.
diff --git a/source/kotlin/doc/-lunar-eclipse-info/-lunar-eclipse-info.md b/source/kotlin/doc/-lunar-eclipse-info/-lunar-eclipse-info.md
new file mode 100644
index 00000000..375956d6
--- /dev/null
+++ b/source/kotlin/doc/-lunar-eclipse-info/-lunar-eclipse-info.md
@@ -0,0 +1,6 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[LunarEclipseInfo](index.md)/[LunarEclipseInfo](-lunar-eclipse-info.md)
+
+# LunarEclipseInfo
+
+[jvm]\
+fun [LunarEclipseInfo](-lunar-eclipse-info.md)(kind: [EclipseKind](../-eclipse-kind/index.md), peak: [AstroTime](../-astro-time/index.md), sd_penum: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), sd_partial: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), sd_total: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html))
diff --git a/source/kotlin/doc/-lunar-eclipse-info/index.md b/source/kotlin/doc/-lunar-eclipse-info/index.md
new file mode 100644
index 00000000..7e99129b
--- /dev/null
+++ b/source/kotlin/doc/-lunar-eclipse-info/index.md
@@ -0,0 +1,32 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[LunarEclipseInfo](index.md)
+
+# LunarEclipseInfo
+
+[jvm]\
+class [LunarEclipseInfo](index.md)(kind: [EclipseKind](../-eclipse-kind/index.md), peak: [AstroTime](../-astro-time/index.md), sd_penum: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), sd_partial: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), sd_total: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html))
+
+Information about a lunar eclipse.
+
+Returned by #Astronomy.searchLunarEclipse or #Astronomy.nextLunarEclipse to report information about a lunar eclipse event. When a lunar eclipse is found, it is classified as penumbral, partial, or total. Penumbral eclipses are difficult to observe, because the Moon is only slightly dimmed by the Earth's penumbra; no part of the Moon touches the Earth's umbra. Partial eclipses occur when part, but not all, of the Moon touches the Earth's umbra. Total eclipses occur when the entire Moon passes into the Earth's umbra.
+
+The kind field thus holds EclipseKind.Penumbral, EclipseKind.Partial, or EclipseKind.Total, depending on the kind of lunar eclipse found.
+
+Field peak holds the date and time of the center of the eclipse, when it is at its peak.
+
+Fields sd_penum, sd_partial, and sd_total hold the semi-duration of each phase of the eclipse, which is half of the amount of time the eclipse spends in each phase (expressed in minutes), or 0.0 if the eclipse never reaches that phase. By converting from minutes to days, and subtracting/adding with peak, the caller may determine the date and time of the beginning/end of each eclipse phase.
+
+## Constructors
+
+| | |
+|---|---|
+| [LunarEclipseInfo](-lunar-eclipse-info.md) | [jvm]
fun [LunarEclipseInfo](-lunar-eclipse-info.md)(kind: [EclipseKind](../-eclipse-kind/index.md), peak: [AstroTime](../-astro-time/index.md), sd_penum: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), sd_partial: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), sd_total: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)) |
+
+## Properties
+
+| Name | Summary |
+|---|---|
+| [kind](kind.md) | [jvm]
val [kind](kind.md): [EclipseKind](../-eclipse-kind/index.md)
The type of lunar eclipse found. |
+| [peak](peak.md) | [jvm]
val [peak](peak.md): [AstroTime](../-astro-time/index.md)
The time of the eclipse at its peak. |
+| [sd_partial](sd_partial.md) | [jvm]
val [sd_partial](sd_partial.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
The semi-duration of the partial phase in minutes, or 0.0 if none. |
+| [sd_penum](sd_penum.md) | [jvm]
val [sd_penum](sd_penum.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
The semi-duration of the penumbral phase in minutes. |
+| [sd_total](sd_total.md) | [jvm]
val [sd_total](sd_total.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
The semi-duration of the total phase in minutes, or 0.0 if none. |
diff --git a/source/kotlin/doc/-lunar-eclipse-info/kind.md b/source/kotlin/doc/-lunar-eclipse-info/kind.md
new file mode 100644
index 00000000..5cac32b5
--- /dev/null
+++ b/source/kotlin/doc/-lunar-eclipse-info/kind.md
@@ -0,0 +1,8 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[LunarEclipseInfo](index.md)/[kind](kind.md)
+
+# kind
+
+[jvm]\
+val [kind](kind.md): [EclipseKind](../-eclipse-kind/index.md)
+
+The type of lunar eclipse found.
diff --git a/source/kotlin/doc/-lunar-eclipse-info/peak.md b/source/kotlin/doc/-lunar-eclipse-info/peak.md
new file mode 100644
index 00000000..7846bb2a
--- /dev/null
+++ b/source/kotlin/doc/-lunar-eclipse-info/peak.md
@@ -0,0 +1,8 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[LunarEclipseInfo](index.md)/[peak](peak.md)
+
+# peak
+
+[jvm]\
+val [peak](peak.md): [AstroTime](../-astro-time/index.md)
+
+The time of the eclipse at its peak.
diff --git a/source/kotlin/doc/-lunar-eclipse-info/sd_partial.md b/source/kotlin/doc/-lunar-eclipse-info/sd_partial.md
new file mode 100644
index 00000000..5517129a
--- /dev/null
+++ b/source/kotlin/doc/-lunar-eclipse-info/sd_partial.md
@@ -0,0 +1,8 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[LunarEclipseInfo](index.md)/[sd_partial](sd_partial.md)
+
+# sd_partial
+
+[jvm]\
+val [sd_partial](sd_partial.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
+
+The semi-duration of the partial phase in minutes, or 0.0 if none.
diff --git a/source/kotlin/doc/-lunar-eclipse-info/sd_penum.md b/source/kotlin/doc/-lunar-eclipse-info/sd_penum.md
new file mode 100644
index 00000000..3bb2f733
--- /dev/null
+++ b/source/kotlin/doc/-lunar-eclipse-info/sd_penum.md
@@ -0,0 +1,8 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[LunarEclipseInfo](index.md)/[sd_penum](sd_penum.md)
+
+# sd_penum
+
+[jvm]\
+val [sd_penum](sd_penum.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
+
+The semi-duration of the penumbral phase in minutes.
diff --git a/source/kotlin/doc/-lunar-eclipse-info/sd_total.md b/source/kotlin/doc/-lunar-eclipse-info/sd_total.md
new file mode 100644
index 00000000..f8d1505d
--- /dev/null
+++ b/source/kotlin/doc/-lunar-eclipse-info/sd_total.md
@@ -0,0 +1,8 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[LunarEclipseInfo](index.md)/[sd_total](sd_total.md)
+
+# sd_total
+
+[jvm]\
+val [sd_total](sd_total.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
+
+The semi-duration of the total phase in minutes, or 0.0 if none.
diff --git a/source/kotlin/doc/-moon-quarter-info/-moon-quarter-info.md b/source/kotlin/doc/-moon-quarter-info/-moon-quarter-info.md
new file mode 100644
index 00000000..b14867e5
--- /dev/null
+++ b/source/kotlin/doc/-moon-quarter-info/-moon-quarter-info.md
@@ -0,0 +1,6 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[MoonQuarterInfo](index.md)/[MoonQuarterInfo](-moon-quarter-info.md)
+
+# MoonQuarterInfo
+
+[jvm]\
+fun [MoonQuarterInfo](-moon-quarter-info.md)(quarter: [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html), time: [AstroTime](../-astro-time/index.md))
diff --git a/source/kotlin/doc/-moon-quarter-info/index.md b/source/kotlin/doc/-moon-quarter-info/index.md
new file mode 100644
index 00000000..a7ab5320
--- /dev/null
+++ b/source/kotlin/doc/-moon-quarter-info/index.md
@@ -0,0 +1,21 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[MoonQuarterInfo](index.md)
+
+# MoonQuarterInfo
+
+[jvm]\
+class [MoonQuarterInfo](index.md)(quarter: [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html), time: [AstroTime](../-astro-time/index.md))
+
+A lunar quarter event (new moon, first quarter, full moon, or third quarter) along with its date and time.
+
+## Constructors
+
+| | |
+|---|---|
+| [MoonQuarterInfo](-moon-quarter-info.md) | [jvm]
fun [MoonQuarterInfo](-moon-quarter-info.md)(quarter: [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html), time: [AstroTime](../-astro-time/index.md)) |
+
+## Properties
+
+| Name | Summary |
+|---|---|
+| [quarter](quarter.md) | [jvm]
val [quarter](quarter.md): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html)
0=new moon, 1=first quarter, 2=full moon, 3=third quarter. |
+| [time](time.md) | [jvm]
val [time](time.md): [AstroTime](../-astro-time/index.md)
The date and time of the lunar quarter. |
diff --git a/source/kotlin/doc/-moon-quarter-info/quarter.md b/source/kotlin/doc/-moon-quarter-info/quarter.md
new file mode 100644
index 00000000..f335c067
--- /dev/null
+++ b/source/kotlin/doc/-moon-quarter-info/quarter.md
@@ -0,0 +1,8 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[MoonQuarterInfo](index.md)/[quarter](quarter.md)
+
+# quarter
+
+[jvm]\
+val [quarter](quarter.md): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html)
+
+0=new moon, 1=first quarter, 2=full moon, 3=third quarter.
diff --git a/source/kotlin/doc/-moon-quarter-info/time.md b/source/kotlin/doc/-moon-quarter-info/time.md
new file mode 100644
index 00000000..836b1056
--- /dev/null
+++ b/source/kotlin/doc/-moon-quarter-info/time.md
@@ -0,0 +1,8 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[MoonQuarterInfo](index.md)/[time](time.md)
+
+# time
+
+[jvm]\
+val [time](time.md): [AstroTime](../-astro-time/index.md)
+
+The date and time of the lunar quarter.
diff --git a/source/kotlin/doc/-refraction/-jpl-hor/index.md b/source/kotlin/doc/-refraction/-jpl-hor/index.md
index de823c16..762716b0 100644
--- a/source/kotlin/doc/-refraction/-jpl-hor/index.md
+++ b/source/kotlin/doc/-refraction/-jpl-hor/index.md
@@ -11,5 +11,5 @@ Used only for compatibility testing with JPL Horizons online tool.
| Name | Summary |
|---|---|
-| [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-refraction/-none/index.md b/source/kotlin/doc/-refraction/-none/index.md
index 0bdb7248..3aaaa6f4 100644
--- a/source/kotlin/doc/-refraction/-none/index.md
+++ b/source/kotlin/doc/-refraction/-none/index.md
@@ -11,5 +11,5 @@ No atmospheric refraction correction (airless).
| Name | Summary |
|---|---|
-| [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-refraction/-normal/index.md b/source/kotlin/doc/-refraction/-normal/index.md
index e1114a8a..0375fae9 100644
--- a/source/kotlin/doc/-refraction/-normal/index.md
+++ b/source/kotlin/doc/-refraction/-normal/index.md
@@ -11,5 +11,5 @@ Recommended correction for standard atmospheric refraction.
| Name | Summary |
|---|---|
-| [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-refraction/index.md b/source/kotlin/doc/-refraction/index.md
index e528cf9f..946c6947 100644
--- a/source/kotlin/doc/-refraction/index.md
+++ b/source/kotlin/doc/-refraction/index.md
@@ -19,5 +19,5 @@ Selects whether to correct for atmospheric refraction, and if so, how.
| Name | Summary |
|---|---|
-| [name](../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../-visibility/-morning/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../-visibility/-morning/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-seasons-info/-seasons-info.md b/source/kotlin/doc/-seasons-info/-seasons-info.md
new file mode 100644
index 00000000..0f6a53dd
--- /dev/null
+++ b/source/kotlin/doc/-seasons-info/-seasons-info.md
@@ -0,0 +1,6 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[SeasonsInfo](index.md)/[SeasonsInfo](-seasons-info.md)
+
+# SeasonsInfo
+
+[jvm]\
+fun [SeasonsInfo](-seasons-info.md)(mar_equinox: [AstroTime](../-astro-time/index.md), jun_solstice: [AstroTime](../-astro-time/index.md), sep_equinox: [AstroTime](../-astro-time/index.md), dec_solstice: [AstroTime](../-astro-time/index.md))
diff --git a/source/kotlin/doc/-seasons-info/index.md b/source/kotlin/doc/-seasons-info/index.md
new file mode 100644
index 00000000..2837328c
--- /dev/null
+++ b/source/kotlin/doc/-seasons-info/index.md
@@ -0,0 +1,16 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[SeasonsInfo](index.md)
+
+# SeasonsInfo
+
+[jvm]\
+class [SeasonsInfo](index.md)(mar_equinox: [AstroTime](../-astro-time/index.md), jun_solstice: [AstroTime](../-astro-time/index.md), sep_equinox: [AstroTime](../-astro-time/index.md), dec_solstice: [AstroTime](../-astro-time/index.md))
+
+The dates and times of changes of season for a given calendar year.
+
+Call #Astronomy.seasons to calculate this data structure for a given year.
+
+## Constructors
+
+| | |
+|---|---|
+| [SeasonsInfo](-seasons-info.md) | [jvm]
fun [SeasonsInfo](-seasons-info.md)(mar_equinox: [AstroTime](../-astro-time/index.md), jun_solstice: [AstroTime](../-astro-time/index.md), sep_equinox: [AstroTime](../-astro-time/index.md), dec_solstice: [AstroTime](../-astro-time/index.md)) |
diff --git a/source/kotlin/doc/-topocentric/-topocentric.md b/source/kotlin/doc/-topocentric/-topocentric.md
new file mode 100644
index 00000000..641c98ae
--- /dev/null
+++ b/source/kotlin/doc/-topocentric/-topocentric.md
@@ -0,0 +1,6 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[Topocentric](index.md)/[Topocentric](-topocentric.md)
+
+# Topocentric
+
+[jvm]\
+fun [Topocentric](-topocentric.md)(azimuth: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), altitude: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), ra: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), dec: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html))
diff --git a/source/kotlin/doc/-topocentric/altitude.md b/source/kotlin/doc/-topocentric/altitude.md
new file mode 100644
index 00000000..849eed62
--- /dev/null
+++ b/source/kotlin/doc/-topocentric/altitude.md
@@ -0,0 +1,8 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[Topocentric](index.md)/[altitude](altitude.md)
+
+# altitude
+
+[jvm]\
+val [altitude](altitude.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
+
+Angle in degrees above (positive) or below (negative) the observer's horizon.
diff --git a/source/kotlin/doc/-topocentric/azimuth.md b/source/kotlin/doc/-topocentric/azimuth.md
new file mode 100644
index 00000000..0c028914
--- /dev/null
+++ b/source/kotlin/doc/-topocentric/azimuth.md
@@ -0,0 +1,8 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[Topocentric](index.md)/[azimuth](azimuth.md)
+
+# azimuth
+
+[jvm]\
+val [azimuth](azimuth.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
+
+Compass direction around the horizon in degrees. 0=North, 90=East, 180=South, 270=West.
diff --git a/source/kotlin/doc/-topocentric/dec.md b/source/kotlin/doc/-topocentric/dec.md
new file mode 100644
index 00000000..2b0b5abc
--- /dev/null
+++ b/source/kotlin/doc/-topocentric/dec.md
@@ -0,0 +1,8 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[Topocentric](index.md)/[dec](dec.md)
+
+# dec
+
+[jvm]\
+val [dec](dec.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
+
+Declination in degrees.
diff --git a/source/kotlin/doc/-topocentric/index.md b/source/kotlin/doc/-topocentric/index.md
new file mode 100644
index 00000000..d57ac935
--- /dev/null
+++ b/source/kotlin/doc/-topocentric/index.md
@@ -0,0 +1,25 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[Topocentric](index.md)
+
+# Topocentric
+
+[jvm]\
+data class [Topocentric](index.md)(azimuth: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), altitude: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), ra: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), dec: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html))
+
+Coordinates of a celestial body as seen by a topocentric observer.
+
+Horizontal and equatorial coordinates seen by an observer on or near the surface of the Earth (a topocentric observer). Optionally corrected for atmospheric refraction.
+
+## Constructors
+
+| | |
+|---|---|
+| [Topocentric](-topocentric.md) | [jvm]
fun [Topocentric](-topocentric.md)(azimuth: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), altitude: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), ra: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), dec: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)) |
+
+## Properties
+
+| Name | Summary |
+|---|---|
+| [altitude](altitude.md) | [jvm]
val [altitude](altitude.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
Angle in degrees above (positive) or below (negative) the observer's horizon. |
+| [azimuth](azimuth.md) | [jvm]
val [azimuth](azimuth.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
Compass direction around the horizon in degrees. 0=North, 90=East, 180=South, 270=West. |
+| [dec](dec.md) | [jvm]
val [dec](dec.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
Declination in degrees. |
+| [ra](ra.md) | [jvm]
val [ra](ra.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
Right ascension in sidereal hours. |
diff --git a/source/kotlin/doc/-topocentric/ra.md b/source/kotlin/doc/-topocentric/ra.md
new file mode 100644
index 00000000..87c4e47a
--- /dev/null
+++ b/source/kotlin/doc/-topocentric/ra.md
@@ -0,0 +1,8 @@
+//[astronomy](../../../index.md)/[io.github.cosinekitty.astronomy](../index.md)/[Topocentric](index.md)/[ra](ra.md)
+
+# ra
+
+[jvm]\
+val [ra](ra.md): [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html)
+
+Right ascension in sidereal hours.
diff --git a/source/kotlin/doc/-visibility/-evening/index.md b/source/kotlin/doc/-visibility/-evening/index.md
index 428a771f..ce9abcd5 100644
--- a/source/kotlin/doc/-visibility/-evening/index.md
+++ b/source/kotlin/doc/-visibility/-evening/index.md
@@ -11,5 +11,5 @@ The body is best visible in the evening, after sunset.
| Name | Summary |
|---|---|
-| [name](../-morning/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../-morning/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](../-morning/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../-morning/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-visibility/-morning/index.md b/source/kotlin/doc/-visibility/-morning/index.md
index 317a0594..dc8aece5 100644
--- a/source/kotlin/doc/-visibility/-morning/index.md
+++ b/source/kotlin/doc/-visibility/-morning/index.md
@@ -11,5 +11,5 @@ The body is best visible in the morning, before sunrise.
| Name | Summary |
|---|---|
-| [name](index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/-visibility/index.md b/source/kotlin/doc/-visibility/index.md
index 5848b760..1fae0c2f 100644
--- a/source/kotlin/doc/-visibility/index.md
+++ b/source/kotlin/doc/-visibility/index.md
@@ -18,5 +18,5 @@ Indicates whether a body (especially Mercury or Venus) is best seen in the morni
| Name | Summary |
|---|---|
-| [name](-morning/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](-morning/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
-| [ordinal](-morning/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](-morning/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
+| [name](../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040) | [jvm]
val [name](../-eclipse-kind/-none/index.md#-372974862%2FProperties%2F-1216412040): [String](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-string/index.html) |
+| [ordinal](../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040) | [jvm]
val [ordinal](../-eclipse-kind/-none/index.md#-739389684%2FProperties%2F-1216412040): [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html) |
diff --git a/source/kotlin/doc/index.md b/source/kotlin/doc/index.md
index 14492438..110848c2 100644
--- a/source/kotlin/doc/index.md
+++ b/source/kotlin/doc/index.md
@@ -7,19 +7,30 @@
| Name | Summary |
|---|---|
| [Aberration](-aberration/index.md) | [jvm]
enum [Aberration](-aberration/index.md) : [Enum](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-enum/index.html)<[Aberration](-aberration/index.md)>
Aberration calculation options. |
-| [Astronomy](-astronomy/index.md) | [jvm]
object [Astronomy](-astronomy/index.md) |
+| [ApsisInfo](-apsis-info/index.md) | [jvm]
class [ApsisInfo](-apsis-info/index.md)(time: [AstroTime](-astro-time/index.md), kind: [ApsisKind](-apsis-kind/index.md), dist_au: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), dist_km: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html))
An apsis event: pericenter (closest approach) or apocenter (farthest distance). |
+| [ApsisKind](-apsis-kind/index.md) | [jvm]
enum [ApsisKind](-apsis-kind/index.md) : [Enum](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-enum/index.html)<[ApsisKind](-apsis-kind/index.md)>
The type of apsis: pericenter (closest approach) or apocenter (farthest distance). |
+| [Astronomy](-astronomy/index.md) | [jvm]
object [Astronomy](-astronomy/index.md)
The main container of astronomy calculation functions. |
| [AstroTime](-astro-time/index.md) | [jvm]
class [AstroTime](-astro-time/index.md)
A date and time used for astronomical calculations. |
| [AstroVector](-astro-vector/index.md) | [jvm]
data class [AstroVector](-astro-vector/index.md)(x: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), y: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), z: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), t: [AstroTime](-astro-time/index.md)) |
| [Body](-body/index.md) | [jvm]
enum [Body](-body/index.md) : [Enum](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-enum/index.html)<[Body](-body/index.md)>
The enumeration of celestial bodies supported by Astronomy Engine. |
| [Direction](-direction/index.md) | [jvm]
enum [Direction](-direction/index.md) : [Enum](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-enum/index.html)<[Direction](-direction/index.md)>
Selects whether to search for a rising event or a setting event for a celestial body. |
+| [EclipseKind](-eclipse-kind/index.md) | [jvm]
enum [EclipseKind](-eclipse-kind/index.md) : [Enum](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-enum/index.html)<[EclipseKind](-eclipse-kind/index.md)>
The different kinds of lunar/solar eclipses. |
+| [Ecliptic](-ecliptic/index.md) | [jvm]
data class [Ecliptic](-ecliptic/index.md)(vec: [AstroVector](-astro-vector/index.md), elat: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), elon: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html))
Ecliptic angular and Cartesian coordinates. |
+| [ElongationInfo](-elongation-info/index.md) | [jvm]
class [ElongationInfo](-elongation-info/index.md)(time: [AstroTime](-astro-time/index.md), visibility: [Visibility](-visibility/index.md), elongation: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), eclipticSeparation: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html))
Contains information about the visibility of a celestial body at a given date and time. |
| [EquatorEpoch](-equator-epoch/index.md) | [jvm]
enum [EquatorEpoch](-equator-epoch/index.md) : [Enum](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-enum/index.html)<[EquatorEpoch](-equator-epoch/index.md)>
Selects the date for which the Earth's equator is to be used for representing equatorial coordinates. |
| [Equatorial](-equatorial/index.md) | [jvm]
class [Equatorial](-equatorial/index.md)(ra: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), dec: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), dist: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), vec: [AstroVector](-astro-vector/index.md))
Equatorial angular and cartesian coordinates. |
+| [HourAngleInfo](-hour-angle-info/index.md) | [jvm]
class [HourAngleInfo](-hour-angle-info/index.md)(time: [AstroTime](-astro-time/index.md), hor: [Topocentric](-topocentric/index.md))
Information about a celestial body crossing a specific hour angle. |
| [JupiterMoonsInfo](-jupiter-moons-info/index.md) | [jvm]
class [JupiterMoonsInfo](-jupiter-moons-info/index.md)(moon: [Array](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-array/index.html)<[StateVector](-state-vector/index.md)>)
Holds the positions and velocities of Jupiter's major 4 moons. |
+| [LibrationInfo](-libration-info/index.md) | [jvm]
data class [LibrationInfo](-libration-info/index.md)(elat: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), elon: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), mlat: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), mlon: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), dist_km: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), diam_deg: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html))
Lunar libration angles, returned by #Astronomy.libration. |
+| [LunarEclipseInfo](-lunar-eclipse-info/index.md) | [jvm]
class [LunarEclipseInfo](-lunar-eclipse-info/index.md)(kind: [EclipseKind](-eclipse-kind/index.md), peak: [AstroTime](-astro-time/index.md), sd_penum: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), sd_partial: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), sd_total: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html))
Information about a lunar eclipse. |
+| [MoonQuarterInfo](-moon-quarter-info/index.md) | [jvm]
class [MoonQuarterInfo](-moon-quarter-info/index.md)(quarter: [Int](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-int/index.html), time: [AstroTime](-astro-time/index.md))
A lunar quarter event (new moon, first quarter, full moon, or third quarter) along with its date and time. |
| [Observer](-observer/index.md) | [jvm]
data class [Observer](-observer/index.md)(latitude: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), longitude: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), height: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html))
The location of an observer on (or near) the surface of the Earth. |
| [Refraction](-refraction/index.md) | [jvm]
enum [Refraction](-refraction/index.md) : [Enum](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-enum/index.html)<[Refraction](-refraction/index.md)>
Selects whether to correct for atmospheric refraction, and if so, how. |
| [RotationMatrix](-rotation-matrix/index.md) | [jvm]
class [RotationMatrix](-rotation-matrix/index.md)(rot: [Array](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-array/index.html)<[DoubleArray](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double-array/index.html)>)
A rotation matrix that can be used to transform one coordinate system to another. |
+| [SeasonsInfo](-seasons-info/index.md) | [jvm]
class [SeasonsInfo](-seasons-info/index.md)(mar_equinox: [AstroTime](-astro-time/index.md), jun_solstice: [AstroTime](-astro-time/index.md), sep_equinox: [AstroTime](-astro-time/index.md), dec_solstice: [AstroTime](-astro-time/index.md))
The dates and times of changes of season for a given calendar year. |
| [Spherical](-spherical/index.md) | [jvm]
data class [Spherical](-spherical/index.md)(lat: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), lon: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), dist: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html))
Spherical coordinates: latitude, longitude, distance. |
| [StateVector](-state-vector/index.md) | [jvm]
data class [StateVector](-state-vector/index.md)(x: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), y: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), z: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), vx: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), vy: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), vz: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), t: [AstroTime](-astro-time/index.md)) |
+| [Topocentric](-topocentric/index.md) | [jvm]
data class [Topocentric](-topocentric/index.md)(azimuth: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), altitude: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), ra: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html), dec: [Double](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-double/index.html))
Coordinates of a celestial body as seen by a topocentric observer. |
| [Visibility](-visibility/index.md) | [jvm]
enum [Visibility](-visibility/index.md) : [Enum](https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-enum/index.html)<[Visibility](-visibility/index.md)>
Indicates whether a body (especially Mercury or Venus) is best seen in the morning or evening. |
## Functions
diff --git a/source/kotlin/src/main/kotlin/io/github/cosinekitty/astronomy/astronomy.kt b/source/kotlin/src/main/kotlin/io/github/cosinekitty/astronomy/astronomy.kt
index 5366e2fb..9ec80bc0 100644
--- a/source/kotlin/src/main/kotlin/io/github/cosinekitty/astronomy/astronomy.kt
+++ b/source/kotlin/src/main/kotlin/io/github/cosinekitty/astronomy/astronomy.kt
@@ -936,6 +936,330 @@ class Equatorial(
)
+/**
+ * Ecliptic angular and Cartesian coordinates.
+ *
+ * Coordinates of a celestial body as seen from the center of the Sun (heliocentric),
+ * oriented with respect to the plane of the Earth's orbit around the Sun (the ecliptic).
+ */
+data class Ecliptic(
+ /**
+ * Cartesian ecliptic vector, with components as follows:
+ * x: the direction of the equinox along the ecliptic plane.
+ * y: in the ecliptic plane 90 degrees prograde from the equinox.
+ * z: perpendicular to the ecliptic plane. Positive is north.
+ */
+ val vec: AstroVector,
+
+ /**
+ * Latitude in degrees north (positive) or south (negative) of the ecliptic plane.
+ */
+ val elat: Double,
+
+ /**
+ * Longitude in degrees around the ecliptic plane prograde from the equinox.
+ */
+ val elon: Double
+)
+
+
+/**
+ * Coordinates of a celestial body as seen by a topocentric observer.
+ *
+ * Horizontal and equatorial coordinates seen by an observer on or near
+ * the surface of the Earth (a topocentric observer).
+ * Optionally corrected for atmospheric refraction.
+ */
+data class Topocentric(
+ /**
+ * Compass direction around the horizon in degrees. 0=North, 90=East, 180=South, 270=West.
+ */
+ val azimuth: Double,
+
+ /**
+ * Angle in degrees above (positive) or below (negative) the observer's horizon.
+ */
+ val altitude: Double,
+
+ /**
+ * Right ascension in sidereal hours.
+ */
+ val ra: Double,
+
+ /**
+ * Declination in degrees.
+ */
+ val dec: Double
+)
+
+
+/**
+ * The dates and times of changes of season for a given calendar year.
+ *
+ * Call #Astronomy.seasons to calculate this data structure for a given year.
+ */
+class SeasonsInfo(
+ /**
+ * The date and time of the March equinox for the specified year.
+ */
+ mar_equinox: AstroTime,
+
+ /**
+ * The date and time of the June soltice for the specified year.
+ */
+ jun_solstice: AstroTime,
+
+ /**
+ * The date and time of the September equinox for the specified year.
+ */
+ sep_equinox: AstroTime,
+
+ /**
+ * The date and time of the December solstice for the specified year.
+ */
+ dec_solstice: AstroTime
+)
+
+
+/**
+ * A lunar quarter event (new moon, first quarter, full moon, or third quarter) along with its date and time.
+ */
+class MoonQuarterInfo(
+ /**
+ * 0=new moon, 1=first quarter, 2=full moon, 3=third quarter.
+ */
+ val quarter: Int,
+
+ /**
+ * The date and time of the lunar quarter.
+ */
+ val time: AstroTime
+)
+
+
+/**
+ * Lunar libration angles, returned by #Astronomy.libration.
+ */
+data class LibrationInfo(
+ /**
+ * Sub-Earth libration ecliptic latitude angle, in degrees.
+ */
+ val elat: Double,
+
+ /**
+ * Sub-Earth libration ecliptic longitude angle, in degrees.
+ */
+ val elon: Double,
+
+ /**
+ * Moon's geocentric ecliptic latitude.
+ */
+ val mlat: Double,
+
+ /**
+ * Moon's geocentric ecliptic longitude.
+ */
+ val mlon: Double,
+
+ /**
+ * Distance between the centers of the Earth and Moon in kilometers.
+ */
+ val dist_km: Double,
+
+ /**
+ * The apparent angular diameter of the Moon, in degrees, as seen from the center of the Earth.
+ */
+ val diam_deg: Double
+)
+
+
+/**
+ * Information about a celestial body crossing a specific hour angle.
+ *
+ * Returned by the function #Astronomy.searchHourAngle to report information about
+ * a celestial body crossing a certain hour angle as seen by a specified topocentric observer.
+ */
+class HourAngleInfo(
+ /**
+ * The date and time when the body crosses the specified hour angle.
+ */
+ val time: AstroTime,
+
+ /**
+ * Apparent coordinates of the body at the time it crosses the specified hour angle.
+ */
+ val hor: Topocentric
+)
+
+
+/**
+ * Contains information about the visibility of a celestial body at a given date and time.
+ *
+ * See #Astronomy.elongation for more detailed information about the members of this class.
+ * See also #Astronomy.searchMaxElongation for how to search for maximum elongation events.
+ */
+class ElongationInfo(
+ /**
+ * The date and time of the observation.
+ */
+ val time: AstroTime,
+
+ /**
+ * Whether the body is best seen in the morning or the evening.
+ */
+ val visibility: Visibility,
+
+ /**
+ * The angle in degrees between the body and the Sun, as seen from the Earth.
+ */
+ val elongation: Double,
+
+ /**
+ * The difference between the ecliptic longitudes of the body and the Sun, as seen from the Earth.
+ */
+ val eclipticSeparation: Double
+)
+
+
+/**
+ * The type of apsis: pericenter (closest approach) or apocenter (farthest distance).
+ */
+enum class ApsisKind {
+ /**
+ * The body is at its closest approach to the object it orbits.
+ */
+ Pericenter,
+
+ /**
+ * The body is at its farthest distance from the object it orbits.
+ */
+ Apocenter,
+}
+
+
+/**
+ * An apsis event: pericenter (closest approach) or apocenter (farthest distance).
+ *
+ * For the Moon orbiting the Earth, or a planet orbiting the Sun, an *apsis* is an
+ * event where the orbiting body reaches its closest or farthest point from the primary body.
+ * The closest approach is called *pericenter* and the farthest point is *apocenter*.
+ *
+ * More specific terminology is common for particular orbiting bodies.
+ * The Moon's closest approach to the Earth is called *perigee* and its farthest
+ * point is called *apogee*. The closest approach of a planet to the Sun is called
+ * *perihelion* and the furthest point is called *aphelion*.
+ *
+ * This data structure is returned by #Astronomy.searchLunarApsis and #Astronomy.nextLunarApsis
+ * to iterate through consecutive alternating perigees and apogees.
+ */
+class ApsisInfo(
+ /**
+ * The date and time of the apsis.
+ */
+ val time: AstroTime,
+
+ /**
+ * Whether this is a pericenter or apocenter event.
+ */
+ val kind: ApsisKind,
+
+ /**
+ * The distance between the centers of the bodies in astronomical units.
+ */
+ val dist_au: Double,
+
+ /**
+ * The distance between the centers of the bodies in kilometers.
+ */
+ val dist_km: Double
+)
+
+
+/**
+ * The different kinds of lunar/solar eclipses.
+ */
+enum class EclipseKind {
+ /**
+ * No eclipse found.
+ */
+ None,
+
+ /**
+ * A penumbral lunar eclipse. (Never used for a solar eclipse.)
+ */
+ Penumbral,
+
+ /**
+ * A partial lunar/solar eclipse.
+ */
+ Partial,
+
+ /**
+ * An annular solar eclipse. (Never used for a lunar eclipse.)
+ */
+ Annular,
+
+ /**
+ * A total lunar/solar eclipse.
+ */
+ Total,
+}
+
+
+/**
+ * Information about a lunar eclipse.
+ *
+ * Returned by #Astronomy.searchLunarEclipse or #Astronomy.nextLunarEclipse
+ * to report information about a lunar eclipse event.
+ * When a lunar eclipse is found, it is classified as penumbral, partial, or total.
+ * Penumbral eclipses are difficult to observe, because the Moon is only slightly dimmed
+ * by the Earth's penumbra; no part of the Moon touches the Earth's umbra.
+ * Partial eclipses occur when part, but not all, of the Moon touches the Earth's umbra.
+ * Total eclipses occur when the entire Moon passes into the Earth's umbra.
+ *
+ * The `kind` field thus holds `EclipseKind.Penumbral`, `EclipseKind.Partial`,
+ * or `EclipseKind.Total`, depending on the kind of lunar eclipse found.
+ *
+ * Field `peak` holds the date and time of the center of the eclipse, when it is at its peak.
+ *
+ * Fields `sd_penum`, `sd_partial`, and `sd_total` hold the semi-duration of each phase
+ * of the eclipse, which is half of the amount of time the eclipse spends in each
+ * phase (expressed in minutes), or 0.0 if the eclipse never reaches that phase.
+ * By converting from minutes to days, and subtracting/adding with `peak`, the caller
+ * may determine the date and time of the beginning/end of each eclipse phase.
+ */
+class LunarEclipseInfo(
+
+ /**
+ * The type of lunar eclipse found.
+ */
+ val kind: EclipseKind,
+
+ /**
+ * The time of the eclipse at its peak.
+ */
+ val peak: AstroTime,
+
+ /**
+ * The semi-duration of the penumbral phase in minutes.
+ */
+ val sd_penum: Double,
+
+ /**
+ * The semi-duration of the partial phase in minutes, or 0.0 if none.
+ */
+ val sd_partial: Double,
+
+ /**
+ * The semi-duration of the total phase in minutes, or 0.0 if none.
+ */
+ val sd_total: Double
+)
+
+
+/**
+ * The main container of astronomy calculation functions.
+ */
object Astronomy {
private const val SECONDS_PER_DAY = 24 * 3600
internal fun terrestrialTime(ut: Double): Double = ut + deltaT(ut) / SECONDS_PER_DAY
diff --git a/source/python/README.md b/source/python/README.md
index 45b38039..3a65d238 100644
--- a/source/python/README.md
+++ b/source/python/README.md
@@ -573,7 +573,7 @@ See [`EclipseEvent`](#EclipseEvent) for more information.
Returned by [`SearchLunarEclipse`](#SearchLunarEclipse) or [`NextLunarEclipse`](#NextLunarEclipse)
to report information about a lunar eclipse event.
When a lunar eclipse is found, it is classified as penumbral, partial, or total.
-Penumbral eclipses are difficult to observe, because the moon is only slightly dimmed
+Penumbral eclipses are difficult to observe, because the Moon is only slightly dimmed
by the Earth's penumbra; no part of the Moon touches the Earth's umbra.
Partial eclipses occur when part, but not all, of the Moon touches the Earth's umbra.
Total eclipses occur when the entire Moon passes into the Earth's umbra.
diff --git a/source/python/astronomy/astronomy.py b/source/python/astronomy/astronomy.py
index 7f7c87ea..c6945c05 100644
--- a/source/python/astronomy/astronomy.py
+++ b/source/python/astronomy/astronomy.py
@@ -8199,7 +8199,7 @@ class LunarEclipseInfo:
Returned by #SearchLunarEclipse or #NextLunarEclipse
to report information about a lunar eclipse event.
When a lunar eclipse is found, it is classified as penumbral, partial, or total.
- Penumbral eclipses are difficult to observe, because the moon is only slightly dimmed
+ Penumbral eclipses are difficult to observe, because the Moon is only slightly dimmed
by the Earth's penumbra; no part of the Moon touches the Earth's umbra.
Partial eclipses occur when part, but not all, of the Moon touches the Earth's umbra.
Total eclipses occur when the entire Moon passes into the Earth's umbra.