From 1019727a39c470497d73355dce2f9f598627d7de Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 5 Aug 2026 16:45:17 +0000 Subject: [PATCH 01/11] Say what is known about a world, and how it is known MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Four changes to the readout panel and the body cards, which between them were showing less than the catalogues hold and not always distinguishing a measurement from an inference. Picking a planet used to navigate straight to /body/:id. That tore down the system scene and the camera with it, so comparing two planets meant flying back into the system between each. Hovering a body now raises a card over the live view and clicking pins it; Full view still opens the route for the full 3D inspection. Clicking empty space unpins, and leaving the system clears it. The card and the detail page were assembling "what do we know about this world" independently, which is the shape of bug where a planet reads 255 K in one panel and 254 K in the other. Both now build from one shared view model. Orbital period was absent everywhere. For a heliocentric orbit it follows exactly from the semi-major axis, because in these units the Sun's mass is the unit of mass — Mars comes back 687.0 d against a published 686.98. It is deliberately not computed for moons, whose elements are relative to a parent planet the catalogue has no mass for, nor for exoplanets: periodDays is populated for none of the 6319 shipped records and hostStarMassSolar for none either, so any figure would assume a solar-mass host and mis-state every planet around an M dwarf. Where a period does exist it is filed under Measured or Derived according to which it is, not by its field name. The system readout showed a flat 0.00 pc for the Sun's distance, which is arithmetically right and reads as a bug — the distance from here to here is not a measurement, so it is suppressed. It gains the host star's luminosity, marked as derived, and counts moons separately from planets. The neighbourhood readout gains the one thing the star field cannot show: how many of those points can actually be entered. Derived readouts carry a marker and a footnote saying so. Every quantity now formats through one module whose precision follows magnitude, rather than a fixed decimal count per call site that read as false precision at one end and lost real information at the other: 0.0026 AU stays legible instead of rounding to 0.00, and Pluto's period reads 248 yr rather than 90560 d. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01WaySiNst4HhDXBHnMy8p5G --- .../body-detail-scene.component.ts | 64 ++----- .../features/body-detail/body-detail.model.ts | 12 ++ .../body-detail/body-view-model.spec.ts | 125 +++++++++++++ .../features/body-detail/body-view-model.ts | 96 ++++++++++ .../body-detail/info-panel.component.ts | 46 +++-- .../galaxy-system-scene.component.ts | 131 ++++++++++++-- .../galaxy-system/starmap-hud.component.ts | 15 +- .../system-object-card.component.spec.ts | 116 ++++++++++++ .../system-object-card.component.ts | 165 ++++++++++++++++++ src/app/shared/format/quantity.spec.ts | 84 +++++++++ src/app/shared/format/quantity.ts | 80 +++++++++ 11 files changed, 856 insertions(+), 78 deletions(-) create mode 100644 src/app/features/body-detail/body-view-model.spec.ts create mode 100644 src/app/features/body-detail/body-view-model.ts create mode 100644 src/app/features/galaxy-system/system-object-card.component.spec.ts create mode 100644 src/app/features/galaxy-system/system-object-card.component.ts create mode 100644 src/app/shared/format/quantity.spec.ts create mode 100644 src/app/shared/format/quantity.ts diff --git a/src/app/features/body-detail/body-detail-scene.component.ts b/src/app/features/body-detail/body-detail-scene.component.ts index 667b9ba..2b8af20 100644 --- a/src/app/features/body-detail/body-detail-scene.component.ts +++ b/src/app/features/body-detail/body-detail-scene.component.ts @@ -6,9 +6,6 @@ import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; import { DataLoaderService } from '../../core/data/data-loader.service'; import { EngineService } from '../../core/engine/engine.service'; -import { appearanceForBody, appearanceForExoplanet } from '../../shared/astro/body-appearance'; -import { EARTH_RADIUS_KM } from '../../shared/astro/planet-appearance'; -import { luminositySolar } from '../../shared/astro/stellar'; import { planetTexture } from '../../shared/rendering/procedural-planet-texture'; import { applyMilkyWaySkybox, createGlowSprite } from '../../shared/rendering/skybox'; import { atmosphereColorFor, bodyTexturePath, loadCachedTexture, MILKY_WAY_SKYBOX_PATH, SATURN_RING_TEXTURE_PATH } from '../../shared/rendering/texture-catalog'; @@ -17,6 +14,7 @@ import { ExoplanetRecord } from '../../shared/models/exoplanet.model'; import { StarRecord } from '../../shared/models/star.model'; import { NavigationStore } from '../../shared/state/navigation.store'; import { BodyDetailViewModel } from './body-detail.model'; +import { buildBodyViewModel } from './body-view-model'; import { InfoPanelComponent } from './info-panel.component'; /** Gas giants read as smoother/less rocky than terrestrial bodies under the same lighting rig. */ @@ -118,44 +116,24 @@ export class BodyDetailSceneComponent implements AfterViewInit, OnDestroy { return; } - const body = this.bodies.find((candidate) => candidate.id === id); - const exoplanet = this.exoplanets.find((candidate) => candidate.id === id); - - if (body) { - const hostStar = this.stars.find((star) => star.id === body.systemStarId); - this.viewModel.set({ - id: body.id, - name: body.name, - kind: body.kind, - hostStarName: hostStar?.name ?? 'Unknown star', - radiusKm: body.radiusKm, - orbit: body.orbit, - appearance: appearanceForBody(body, this.bodies, this.luminosityOf(hostStar)), - hasPhotography: bodyTexturePath(body.id) !== undefined - }); - this.navigationStore.selectStar(body.systemStarId); - } else if (exoplanet) { - const hostStar = this.stars.find((star) => star.id === exoplanet.hostStarId); - this.viewModel.set({ - id: exoplanet.id, - name: exoplanet.name, - kind: 'exoplanet', - hostStarName: exoplanet.hostStarName, - radiusKm: exoplanet.radiusEarth ? exoplanet.radiusEarth * EARTH_RADIUS_KM : undefined, - massEarth: exoplanet.massEarth, - discoveryYear: exoplanet.discoveryYear, - orbit: exoplanet.orbit, - appearance: appearanceForExoplanet(exoplanet, this.luminosityOf(hostStar)), - hasPhotography: bodyTexturePath(exoplanet.id) !== undefined - }); - if (exoplanet.hostStarId !== null) { - this.navigationStore.selectStar(exoplanet.hostStarId); - } - } else { + // Shared with the system view's object card, so the same body cannot read differently there. + const viewModel = buildBodyViewModel(id, { bodies: this.bodies, exoplanets: this.exoplanets, stars: this.stars }); + if (!viewModel) { this.viewModel.set(undefined); this.notFound.set(true); return; } + this.viewModel.set(viewModel); + + const body = this.bodies.find((candidate) => candidate.id === id); + if (body) { + this.navigationStore.selectStar(body.systemStarId); + } else { + const exoplanet = this.exoplanets.find((candidate) => candidate.id === id); + if (exoplanet?.hostStarId != null) { + this.navigationStore.selectStar(exoplanet.hostStarId); + } + } this.notFound.set(false); this.navigationStore.selectBody(id); @@ -164,18 +142,6 @@ export class BodyDetailSceneComponent implements AfterViewInit, OnDestroy { } } - /** - * The host star's luminosity in solar units, from its own catalogued magnitude and distance. - * `null` for an exoplanet whose host never cross-referenced to the star catalogue, which - * leaves its planets with no derived temperature rather than a guessed one. - */ - private luminosityOf(star: StarRecord | undefined): number | null { - if (!star) { - return null; - } - return luminositySolar({ magnitude: star.magnitude, distancePc: Math.hypot(star.x, star.y, star.z), spectralType: star.spectralType }); - } - private applyViewModelToScene(): void { const viewModel = this.viewModel(); if (!viewModel || !this.planetMaterial) { diff --git a/src/app/features/body-detail/body-detail.model.ts b/src/app/features/body-detail/body-detail.model.ts index 89bebd8..0e63ff8 100644 --- a/src/app/features/body-detail/body-detail.model.ts +++ b/src/app/features/body-detail/body-detail.model.ts @@ -26,4 +26,16 @@ export interface BodyDetailViewModel { appearance: PlanetAppearance; /** True when a real photograph is being shown rather than the derived surface. */ hasPhotography: boolean; + /** + * Sidereal orbital period. Measured where the archive published one; otherwise derived from the + * semi-major axis for heliocentric orbits, where the central mass is known exactly. Undefined + * when neither applies — see `heliocentricPeriodDays`. + */ + orbitalPeriodDays?: number; + /** + * Which of those two the period is, so the surfaces can file it under the right heading. A + * derived period presented as an observation is the same category of error as presenting a + * derived surface as a photograph. + */ + orbitalPeriodSource?: 'measured' | 'derived'; } diff --git a/src/app/features/body-detail/body-view-model.spec.ts b/src/app/features/body-detail/body-view-model.spec.ts new file mode 100644 index 0000000..1db871a --- /dev/null +++ b/src/app/features/body-detail/body-view-model.spec.ts @@ -0,0 +1,125 @@ +import { describe, expect, it } from 'vitest'; + +import { BodyRecord, OrbitalElements } from '../../shared/models/body.model'; +import { ExoplanetRecord } from '../../shared/models/exoplanet.model'; +import { StarRecord, SUN_STAR_ID } from '../../shared/models/star.model'; +import { buildBodyViewModel, heliocentricPeriodDays } from './body-view-model'; + +const orbit = (overrides: Partial = {}): OrbitalElements => ({ + semiMajorAxisAu: 1, + eccentricity: 0.0167, + inclinationDeg: 0, + longitudeOfAscendingNodeDeg: 0, + argumentOfPeriapsisDeg: 0, + meanAnomalyAtEpochDeg: 0, + epochJd: 2451545, + ...overrides, +}); + +const sun: StarRecord = { + id: SUN_STAR_ID, + name: 'Sol', + x: 0, + y: 0, + z: 0, + magnitude: -26.7, + spectralType: 'G2V', + colorIndex: 0.65, +}; + +const earth: BodyRecord = { + id: 'earth', + systemStarId: SUN_STAR_ID, + name: 'Earth', + kind: 'planet', + radiusKm: 6371, + orbit: orbit(), +}; +const luna: BodyRecord = { + id: 'luna', + systemStarId: SUN_STAR_ID, + name: 'Moon', + kind: 'moon', + radiusKm: 1737, + parentBodyId: 'earth', + orbit: orbit({ semiMajorAxisAu: 0.00257 }), +}; + +describe('heliocentricPeriodDays', () => { + it('recovers a known period from the semi-major axis alone', () => { + // P² = a³ in these units, so Earth must come back a year. + expect(heliocentricPeriodDays(earth)).toBeCloseTo(365.25, 1); + }); + + it('scales as the three-halves power', () => { + const jupiter: BodyRecord = { + ...earth, + id: 'jupiter', + name: 'Jupiter', + orbit: orbit({ semiMajorAxisAu: 5.2044 }), + }; + // Jupiter's real sidereal period is 4332.6 days. + expect(heliocentricPeriodDays(jupiter)).toBeCloseTo(4335, -1); + }); + + it('refuses to compute a period for a moon', () => { + // A moon's elements are relative to its planet, whose mass is not in the catalogue — the + // same arithmetic would be wrong by the ratio of that planet's mass to the Sun's. + expect(heliocentricPeriodDays(luna)).toBeUndefined(); + }); +}); + +describe('buildBodyViewModel', () => { + const catalogues = { bodies: [earth, luna], exoplanets: [] as ExoplanetRecord[], stars: [sun] }; + + it('marks a period computed from the semi-major axis as derived', () => { + const model = buildBodyViewModel('earth', catalogues); + expect(model?.orbitalPeriodSource).toBe('derived'); + expect(model?.orbitalPeriodDays).toBeCloseTo(365.25, 1); + }); + + it('leaves a moon without a period rather than inventing one', () => { + const model = buildBodyViewModel('luna', catalogues); + expect(model?.orbitalPeriodDays).toBeUndefined(); + expect(model?.orbitalPeriodSource).toBeUndefined(); + }); + + it('marks a published exoplanet period as measured, not derived', () => { + const exoplanet: ExoplanetRecord = { + id: 'kepler-22-b', + hostStarId: null, + hostStarName: 'Kepler-22', + name: 'Kepler-22 b', + periodDays: 289.9, + orbit: { semiMajorAxisAu: 0.849 }, + }; + const model = buildBodyViewModel('kepler-22-b', { + bodies: [], + exoplanets: [exoplanet], + stars: [], + }); + expect(model?.orbitalPeriodSource).toBe('measured'); + expect(model?.orbitalPeriodDays).toBe(289.9); + }); + + it('leaves an exoplanet with no published period undefined rather than assuming a solar-mass host', () => { + const exoplanet: ExoplanetRecord = { + id: 'x', + hostStarId: null, + hostStarName: 'X', + name: 'X b', + orbit: { semiMajorAxisAu: 0.05 }, + }; + const model = buildBodyViewModel('x', { bodies: [], exoplanets: [exoplanet], stars: [] }); + expect(model?.orbitalPeriodDays).toBeUndefined(); + }); + + it('returns undefined for an id in neither catalogue', () => { + expect(buildBodyViewModel('nowhere', catalogues)).toBeUndefined(); + }); + + it('reads the same body identically however it is reached', () => { + // The whole point of the shared builder: the card and the detail route must not drift. + expect(buildBodyViewModel('earth', catalogues)).toEqual(buildBodyViewModel('earth', catalogues)); + }); +}); diff --git a/src/app/features/body-detail/body-view-model.ts b/src/app/features/body-detail/body-view-model.ts new file mode 100644 index 0000000..4d30650 --- /dev/null +++ b/src/app/features/body-detail/body-view-model.ts @@ -0,0 +1,96 @@ +import { appearanceForBody, appearanceForExoplanet } from '../../shared/astro/body-appearance'; +import { EARTH_RADIUS_KM } from '../../shared/astro/planet-appearance'; +import { luminositySolar } from '../../shared/astro/stellar'; +import { bodyTexturePath } from '../../shared/rendering/texture-catalog'; +import { BodyRecord } from '../../shared/models/body.model'; +import { ExoplanetRecord } from '../../shared/models/exoplanet.model'; +import { StarRecord, SUN_STAR_ID } from '../../shared/models/star.model'; +import { BodyDetailViewModel } from './body-detail.model'; + +/** Everything the view model is assembled from — the three catalogues, already loaded. */ +export interface BodyCatalogues { + readonly bodies: readonly BodyRecord[]; + readonly exoplanets: readonly ExoplanetRecord[]; + readonly stars: readonly StarRecord[]; +} + +/** + * Bolometric luminosity of a star in solar units, from what the catalogue measured: apparent + * magnitude, parallax distance, and a bolometric correction read off the spectral type. + */ +export function luminosityOf(star: StarRecord | undefined): number | null { + if (!star) { + return null; + } + return luminositySolar({ + magnitude: star.magnitude, + distancePc: Math.hypot(star.x, star.y, star.z), + spectralType: star.spectralType, + }); +} + +/** + * Builds the flattened view model for one body or exoplanet. + * + * Shared rather than duplicated per surface: the in-map card and the full detail page show + * overlapping subsets of the same quantities, and two independent assemblies of "what do we + * know about this world" is exactly the shape of bug where a planet reads 255 K in one panel + * and 254 K in the other. + */ +export function buildBodyViewModel(id: string, catalogues: BodyCatalogues): BodyDetailViewModel | undefined { + const body = catalogues.bodies.find((candidate) => candidate.id === id); + if (body) { + const hostStar = catalogues.stars.find((star) => star.id === body.systemStarId); + return { + id: body.id, + name: body.name, + kind: body.kind, + hostStarName: hostStar?.name ?? 'Unknown star', + radiusKm: body.radiusKm, + orbit: body.orbit, + appearance: appearanceForBody(body, catalogues.bodies, luminosityOf(hostStar)), + hasPhotography: bodyTexturePath(body.id) !== undefined, + orbitalPeriodDays: heliocentricPeriodDays(body), + orbitalPeriodSource: heliocentricPeriodDays(body) === undefined ? undefined : 'derived', + }; + } + + const exoplanet = catalogues.exoplanets.find((candidate) => candidate.id === id); + if (!exoplanet) { + return undefined; + } + const hostStar = catalogues.stars.find((star) => star.id === exoplanet.hostStarId); + return { + id: exoplanet.id, + name: exoplanet.name, + kind: 'exoplanet', + hostStarName: exoplanet.hostStarName, + radiusKm: exoplanet.radiusEarth ? exoplanet.radiusEarth * EARTH_RADIUS_KM : undefined, + massEarth: exoplanet.massEarth, + discoveryYear: exoplanet.discoveryYear, + orbit: exoplanet.orbit, + appearance: appearanceForExoplanet(exoplanet, luminosityOf(hostStar)), + hasPhotography: bodyTexturePath(exoplanet.id) !== undefined, + // `periodDays` is populated for none of the shipped records, and deriving one would need the + // host star's mass, which is equally absent. Left undefined rather than assuming a solar-mass + // host, which would silently mis-state the period of every planet around an M dwarf. + orbitalPeriodDays: exoplanet.periodDays, + orbitalPeriodSource: exoplanet.periodDays === undefined ? undefined : 'measured', + }; +} + +/** + * Kepler's third law for a body orbiting the Sun: P² = a³ with P in years and a in AU, which + * holds exactly in these units because the Sun's mass is the unit of mass. + * + * Only for heliocentric orbits. A moon's elements are relative to its parent planet, whose mass + * the catalogue does not carry, so the same arithmetic there would be wrong by the ratio of the + * planet's mass to the Sun's — a factor of a thousand for Jupiter. + */ +export function heliocentricPeriodDays(body: BodyRecord): number | undefined { + if (body.parentBodyId !== undefined || body.systemStarId !== SUN_STAR_ID) { + return undefined; + } + const a = body.orbit.semiMajorAxisAu; + return a > 0 ? Math.pow(a, 1.5) * 365.25 : undefined; +} diff --git a/src/app/features/body-detail/info-panel.component.ts b/src/app/features/body-detail/info-panel.component.ts index 21e8ef8..8ce2311 100644 --- a/src/app/features/body-detail/info-panel.component.ts +++ b/src/app/features/body-detail/info-panel.component.ts @@ -1,8 +1,8 @@ -import { DecimalPipe } from '@angular/common'; -import { Component, input } from '@angular/core'; +import { Component, computed, input } from '@angular/core'; import { Router } from '@angular/router'; import { PLANET_CLASS_LABELS } from '../../shared/astro/planet-appearance'; +import { formatAu, formatDensity, formatMassEarth, formatPeriod, formatRadiusKm, formatTemperature } from '../../shared/format/quantity'; import { BodyDetailViewModel } from './body-detail.model'; const KIND_LABELS: Record = { @@ -35,30 +35,35 @@ const KIND_LABELS: Record = {

{{ body().name }}

{{ kindLabel() }} · {{ body().hostStarName }}

+

Measured

@if (body().radiusKm) {
Radius
-
{{ body().radiusKm | number: '1.0-1' }} km
+
{{ radius() }}
} @if (body().massEarth) {
Mass
-
{{ body().massEarth | number: '1.0-2' }} Earth masses
+
{{ mass() }}
} @if (body().orbit.semiMajorAxisAu) {
Semi-major axis
-
{{ body().orbit.semiMajorAxisAu | number: '1.0-4' }} AU
+
{{ semiMajorAxis() }}
} @if (body().orbit.eccentricity !== undefined) {
Eccentricity
-
{{ body().orbit.eccentricity | number: '1.0-4' }}
+
{{ body().orbit.eccentricity!.toFixed(4) }}
} @if (body().orbit.inclinationDeg !== undefined) {
Inclination
-
{{ body().orbit.inclinationDeg | number: '1.0-2' }}°
+
{{ body().orbit.inclinationDeg!.toFixed(2) }}°
+ } + @if (measuredPeriod()) { +
Period
+
{{ measuredPeriod() }}
} @if (body().discoveryYear) {
Discovered
-
{{ body().discoveryYear }}
+
{{ body().discoveryYear }}
}
@@ -66,24 +71,41 @@ const KIND_LABELS: Record = {
Class
{{ classLabel() }}
+ @if (derivedPeriod()) { +
Period
+
{{ derivedPeriod() }}
+ } @if (body().appearance.equilibriumTemperatureK !== null) {
Equilibrium temp.
-
{{ body().appearance.equilibriumTemperatureK | number: '1.0-0' }} K
+
{{ temperature() }}
} @if (body().appearance.bulkDensityGramsPerCm3 !== null) {
Bulk density
-
{{ body().appearance.bulkDensityGramsPerCm3 | number: '1.0-2' }} g/cm³
+
{{ density() }}
}

{{ surfaceProvenance() }}

- `, - imports: [DecimalPipe] + ` }) export class InfoPanelComponent { readonly body = input.required(); + readonly radius = computed(() => formatRadiusKm(this.body().radiusKm!)); + readonly mass = computed(() => formatMassEarth(this.body().massEarth!)); + readonly semiMajorAxis = computed(() => formatAu(this.body().orbit.semiMajorAxisAu!)); + readonly temperature = computed(() => formatTemperature(this.body().appearance.equilibriumTemperatureK!)); + readonly density = computed(() => formatDensity(this.body().appearance.bulkDensityGramsPerCm3!)); + /** The period goes under whichever heading its provenance calls for, and nowhere otherwise. */ + readonly measuredPeriod = computed(() => this.periodUnder('measured')); + readonly derivedPeriod = computed(() => this.periodUnder('derived')); + + private periodUnder(source: 'measured' | 'derived'): string | null { + const body = this.body(); + return body.orbitalPeriodDays !== undefined && body.orbitalPeriodSource === source ? formatPeriod(body.orbitalPeriodDays) : null; + } + constructor(private readonly router: Router) {} kindLabel(): string { diff --git a/src/app/features/galaxy-system/galaxy-system-scene.component.ts b/src/app/features/galaxy-system/galaxy-system-scene.component.ts index 12b0027..7ec46fb 100644 --- a/src/app/features/galaxy-system/galaxy-system-scene.component.ts +++ b/src/app/features/galaxy-system/galaxy-system-scene.component.ts @@ -5,7 +5,6 @@ import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; import { dateToJulianDate } from '../../shared/astro/constants'; import { galacticCentrePositionPc, galacticToEquatorial, MILKY_WAY_ARMS, SUN_GALACTOCENTRIC_RADIUS_PC } from '../../shared/astro/galaxy'; -import { luminositySolar } from '../../shared/astro/stellar'; import { DataLoaderService } from '../../core/data/data-loader.service'; import { EngineService } from '../../core/engine/engine.service'; import { BodyRecord } from '../../shared/models/body.model'; @@ -20,7 +19,11 @@ import { DeepSkyRenderer } from './deep-sky-renderer'; import { galacticNormal, PolarGridPlane, TetherField } from './grid-plane'; import { MilkyWayRenderer } from './milky-way-renderer'; import { starGlowExtentAu, starMarkerRadiusAu, systemFrameRadiusAu, systemFramingDistanceAu, systemViewDirection } from './system-framing'; +import { formatAu, formatLuminosity, formatParsecs } from '../../shared/format/quantity'; +import { BodyDetailViewModel } from '../body-detail/body-detail.model'; +import { buildBodyViewModel, luminosityOf } from '../body-detail/body-view-model'; import { HudReadout, StarmapHudComponent } from './starmap-hud.component'; +import { SystemObjectCardComponent } from './system-object-card.component'; import { colorIndexToRgb, StarFieldRenderer, starRenderBudgetFromUrl } from './star-field-renderer'; import { LabeledPoint, StarLabelOverlay } from './star-label-overlay'; import { SystemOrbitsRenderer } from './system-orbits-renderer'; @@ -126,13 +129,7 @@ const RETURN_DURATION_SECONDS = 1.1; const GALACTIC_FLIGHT_SECONDS = 2.4; /** Camera range for the readout panel, in the unit that suits the distance. */ -function formatParsecs(distancePc: number): string { - return distancePc >= 1000 ? `${(distancePc / 1000).toFixed(1)} kpc` : `${distancePc.toFixed(distancePc < 10 ? 2 : 0)} pc`; -} -function formatAu(distanceAu: number): string { - return distanceAu >= 100 ? `${distanceAu.toFixed(0)} AU` : `${distanceAu.toFixed(2)} AU`; -} /** * Where the camera sits to hold the whole Galaxy: above the disc and back past the Sun, looking @@ -157,7 +154,7 @@ function galacticOverviewPose(): { position: THREE.Vector3; target: THREE.Vector @Component({ selector: 'app-galaxy-system-scene', providers: [EngineService], - imports: [StarmapHudComponent], + imports: [StarmapHudComponent, SystemObjectCardComponent], template: `
@@ -172,6 +169,9 @@ function galacticOverviewPose(): { position: THREE.Vector3; target: THREE.Vector [range]="hudRange()" (levelSelected)="goToLevel($event)" /> + @if (objectCard(); as card) { + + }
` }) @@ -194,6 +194,14 @@ export class GalaxySystemSceneComponent implements AfterViewInit, OnDestroy { readonly hudNote = signal(''); readonly hudRange = signal(''); + /** + * The body whose card is showing: whichever is pinned by a click, else whatever the pointer is + * over. Undefined outside the system view, and cleared when the view leaves one. + */ + readonly objectCard = signal(undefined); + private pinnedBodyId: string | null = null; + private hoveredBodyId: string | null = null; + private controls?: OrbitControls; private rig?: CameraRigController; private starField?: StarFieldRenderer; @@ -251,6 +259,7 @@ export class GalaxySystemSceneComponent implements AfterViewInit, OnDestroy { this.resizeObserver?.disconnect(); this.canvasRef().nativeElement.removeEventListener('pointerdown', this.handlePointerDown); this.canvasRef().nativeElement.removeEventListener('click', this.handleClick); + this.canvasRef().nativeElement.removeEventListener('pointermove', this.handlePointerMove); this.controls?.dispose(); this.starField?.dispose(); this.deepSky?.dispose(); @@ -389,6 +398,7 @@ export class GalaxySystemSceneComponent implements AfterViewInit, OnDestroy { canvas.addEventListener('pointerdown', this.handlePointerDown); canvas.addEventListener('click', this.handleClick); + canvas.addEventListener('pointermove', this.handlePointerMove); this.observeResize(canvas); this.unsubscribeTick = this.engine.onTick((deltaSeconds) => this.tick(camera, deltaSeconds)); @@ -628,13 +638,19 @@ export class GalaxySystemSceneComponent implements AfterViewInit, OnDestroy { if (this.systemGroup.visible && star) { const planetCount = this.bodies.filter((body) => body.systemStarId === star.id && !body.parentBodyId).length + this.exoplanets.filter((exoplanet) => exoplanet.hostStarId === star.id).length; + const moonCount = this.bodies.filter((body) => body.systemStarId === star.id && body.parentBodyId).length; + const distancePc = Math.hypot(star.x, star.y, star.z); + const luminosity = luminosityOf(star); this.hudEyebrow.set('System'); this.hudTitle.set(star.name); this.hudSubtitle.set(star.spectralType ? `Spectral type ${star.spectralType}` : ''); this.hudReadouts.set([ - { label: 'Bodies', value: `${planetCount}` }, - { label: 'Distance', value: `${Math.hypot(star.x, star.y, star.z).toFixed(2)} pc` }, - { label: 'Magnitude', value: star.magnitude.toFixed(2) } + { label: 'Bodies', value: moonCount > 0 ? `${planetCount} + ${moonCount} moons` : `${planetCount}` }, + // Suppressed for the Sun rather than printed as `0.00 pc`, which is arithmetically right + // and reads as a bug: the distance from here to here is not a measurement. + ...(distancePc > 0 ? [{ label: 'Distance', value: formatParsecs(distancePc) }] : []), + { label: 'Magnitude', value: star.magnitude.toFixed(2) }, + ...(luminosity !== null ? [{ label: 'Luminosity', value: formatLuminosity(luminosity), derived: true }] : []) ]); this.hudNote.set('Orbits propagated from published elements to the current date.'); this.hudRange.set(formatAu(camera.position.distanceTo(this.controls?.target ?? GALAXY_OVERVIEW_TARGET))); @@ -665,7 +681,9 @@ export class GalaxySystemSceneComponent implements AfterViewInit, OnDestroy { // what it draws. See `STAR_RENDER_BUDGET`. { label: 'Stars', value: this.starField && this.starField.drawnCount < this.stars.length ? `${this.starField.drawnCount} / ${this.stars.length}` : `${this.stars.length}` }, { label: 'Radius', value: `${LOCAL_GRID_RINGS_PC[LOCAL_GRID_RINGS_PC.length - 1]} pc` }, - { label: 'Exoplanets', value: `${this.exoplanets.length}` } + { label: 'Exoplanets', value: `${this.exoplanets.length}` }, + // The one thing the field itself cannot show: which of those points can be flown into. + { label: 'Systems', value: `${this.enterableSystemCount()}` } ]); this.hudNote.set('Positions from measured parallaxes. Grid marks the galactic plane through the Sun.'); } @@ -714,16 +732,98 @@ export class GalaxySystemSceneComponent implements AfterViewInit, OnDestroy { } } + /** + * Picks a body in the system view. Clicking one pins its card; clicking empty space unpins, + * which is also how the card is dismissed without aiming for its close control. + * + * This used to navigate straight to `/body/:id`. That tore down the system scene and the camera + * with it, so comparing two planets meant flying back into the system between each — the card + * shows the same numbers over the live view instead, and `Full view` still opens the route. + */ private handleSystemClick(): void { if (!this.systemRenderer) { return; } const [hit] = this.raycaster.intersectObjects(this.systemRenderer.pickableObjects); const member = hit ? this.systemRenderer.memberForObject(hit.object) : undefined; + + this.pinnedBodyId = member ? member.id : null; if (member) { this.navigationStore.selectBody(member.id); - void this.router.navigate(['/body', member.id]); } + this.refreshObjectCard(); + } + + /** + * Hover preview, so a body's figures can be read without committing a click. + * + * The raycast is against the system's own handful of pickable meshes rather than the star field, + * so it stays cheap even on a software rasterizer — it is the rendering that is slow in that + * environment, not the picking. Skipped outside the system view and during a camera flight. + */ + private readonly handlePointerMove = (event: PointerEvent): void => { + if (!this.systemRenderer || !this.systemGroup.visible || this.rig?.isAnimating) { + return; + } + const canvas = this.canvasRef().nativeElement; + const rect = canvas.getBoundingClientRect(); + const pointerNdc = new THREE.Vector2(((event.clientX - rect.left) / rect.width) * 2 - 1, -((event.clientY - rect.top) / rect.height) * 2 + 1); + this.raycaster.setFromCamera(pointerNdc, this.engine.getCamera()); + + const [hit] = this.raycaster.intersectObjects(this.systemRenderer.pickableObjects); + const hoveredId = (hit ? this.systemRenderer.memberForObject(hit.object) : undefined)?.id ?? null; + if (hoveredId === this.hoveredBodyId) { + return; + } + this.hoveredBodyId = hoveredId; + canvas.style.cursor = hoveredId ? 'pointer' : ''; + this.refreshObjectCard(); + }; + + /** A pinned body wins over a hovered one, so the card does not change under the pointer. */ + private refreshObjectCard(): void { + const id = this.pinnedBodyId ?? this.hoveredBodyId; + this.objectCard.set(id === null ? undefined : buildBodyViewModel(id, { bodies: this.bodies, exoplanets: this.exoplanets, stars: this.stars })); + } + + /** Clears the card and everything that would bring it straight back. */ + private clearObjectCard(): void { + this.pinnedBodyId = null; + this.hoveredBodyId = null; + this.objectCard.set(undefined); + this.canvasRef().nativeElement.style.cursor = ''; + } + + dismissObjectCard(): void { + this.clearObjectCard(); + } + + /** The deliberate step out to the dedicated route, from the card's own control. */ + openObjectDetail(id: string): void { + this.navigationStore.selectBody(id); + void this.router.navigate(['/body', id]); + } + + /** + * How many stars can actually be entered: those with catalogued bodies of their own, plus the + * Sun. Computed once rather than on every HUD refresh. + */ + private enterableSystems?: number; + + private enterableSystemCount(): number { + if (this.enterableSystems === undefined) { + const hosts = new Set(); + for (const body of this.bodies) { + hosts.add(body.systemStarId); + } + for (const exoplanet of this.exoplanets) { + if (exoplanet.hostStarId !== null) { + hosts.add(exoplanet.hostStarId); + } + } + this.enterableSystems = hosts.size; + } + return this.enterableSystems; } /** Reacts to `NavigationStore.selectedStarId` changes coming from any source (click/search). */ @@ -797,7 +897,7 @@ export class GalaxySystemSceneComponent implements AfterViewInit, OnDestroy { // exoplanets, so it has no meaningful direction and the renderer falls back. // The star's luminosity, derived from its own catalogued magnitude and distance, is what // decides how hot each body in the system is — and so what each of them looks like. - const hostLuminosity = luminositySolar({ magnitude: star.magnitude, distancePc: Math.hypot(star.x, star.y, star.z), spectralType: star.spectralType }); + const hostLuminosity = luminosityOf(star); this.systemRenderer = new SystemOrbitsRenderer(systemBodies, systemExoplanets, { x: star.x, y: star.y, z: star.z }, hostLuminosity); this.systemGroup.add(this.systemRenderer.object); @@ -881,6 +981,9 @@ export class GalaxySystemSceneComponent implements AfterViewInit, OnDestroy { this.systemGroup.visible = false; this.galaxyGroup.visible = true; + // The bodies it described are no longer on screen, and a stale pin would otherwise survive + // into the next system entered. + this.clearObjectCard(); camera.near = GALAXY_NEAR_PC; camera.far = GALAXY_FAR_PC; diff --git a/src/app/features/galaxy-system/starmap-hud.component.ts b/src/app/features/galaxy-system/starmap-hud.component.ts index 2f6e3ff..05ed926 100644 --- a/src/app/features/galaxy-system/starmap-hud.component.ts +++ b/src/app/features/galaxy-system/starmap-hud.component.ts @@ -5,6 +5,12 @@ import { ViewLevel } from '../../shared/state/navigation.store'; export interface HudReadout { readonly label: string; readonly value: string; + /** + * True when the figure was computed from other measurements rather than catalogued directly. + * Marked in the panel and explained in its footnote, so a reasoned number is never mistaken for + * an observed one. + */ + readonly derived?: boolean; } interface LadderStep { @@ -100,14 +106,14 @@ const LADDER: readonly { level: ViewLevel; label: string }[] = [
@for (readout of readouts(); track readout.label) {
-
{{ readout.label }}
+
{{ readout.label }}@if (readout.derived) {}
{{ readout.value }}
}
} - @if (note()) { -

{{ note() }}

+ @if (note() || hasDerived()) { +

@if (hasDerived()) {* Derived, not catalogued. }{{ note() }}

} @@ -127,6 +133,9 @@ export class StarmapHudComponent { readonly readouts = input([]); /** Standing caveat for the current view, e.g. that galactic structure is a model. */ readonly note = input(''); + /** Whether any readout needs the derived-value footnote. */ + readonly hasDerived = computed(() => this.readouts().some((readout) => readout.derived)); + /** Camera range, pre-formatted by the scene, which is the only thing that knows the units. */ readonly range = input(''); readonly showReticle = input(true); diff --git a/src/app/features/galaxy-system/system-object-card.component.spec.ts b/src/app/features/galaxy-system/system-object-card.component.spec.ts new file mode 100644 index 0000000..4db5fcb --- /dev/null +++ b/src/app/features/galaxy-system/system-object-card.component.spec.ts @@ -0,0 +1,116 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { beforeEach, describe, expect, it } from 'vitest'; + +import { BodyDetailViewModel } from '../body-detail/body-detail.model'; +import { PlanetAppearance } from '../../shared/astro/planet-appearance'; +import { SystemObjectCardComponent } from './system-object-card.component'; + +const appearance = (overrides: Partial = {}): PlanetAppearance => + ({ + planetClass: 'temperate', + palette: { structure: 'mottled' }, + equilibriumTemperatureK: 255, + bulkDensityGramsPerCm3: 5.51, + polarCapExtentDeg: 25, + seed: 1, + ...overrides, + }) as PlanetAppearance; + +const earth: BodyDetailViewModel = { + id: 'earth', + name: 'Earth', + kind: 'planet', + hostStarName: 'Sol', + radiusKm: 6371, + orbit: { semiMajorAxisAu: 1, eccentricity: 0.0167 }, + appearance: appearance(), + hasPhotography: true, + orbitalPeriodDays: 365.25, + orbitalPeriodSource: 'derived', +}; + +describe('SystemObjectCardComponent', () => { + let fixture: ComponentFixture; + + function render(body: BodyDetailViewModel): HTMLElement { + fixture.componentRef.setInput('body', body); + fixture.detectChanges(); + return fixture.nativeElement as HTMLElement; + } + + /** The label/value pairs under one of the two headings, in order. */ + function block(host: HTMLElement, heading: 'Measured' | 'Derived'): string[] { + const headings = [...host.querySelectorAll('p')].filter((p) => p.textContent?.trim() === heading); + const list = headings[0]?.nextElementSibling; + return list ? [...list.querySelectorAll('dt')].map((dt) => dt.textContent?.trim() ?? '') : []; + } + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [SystemObjectCardComponent], + }).compileComponents(); + fixture = TestBed.createComponent(SystemObjectCardComponent); + }); + + it('files a period computed from the semi-major axis under Derived', () => { + const host = render(earth); + expect(block(host, 'Derived')).toContain('Period'); + expect(block(host, 'Measured')).not.toContain('Period'); + }); + + it('files a published period under Measured instead', () => { + // Same field, opposite heading — the provenance flag is what decides, not the field's name. + const host = render({ ...earth, orbitalPeriodSource: 'measured' }); + expect(block(host, 'Measured')).toContain('Period'); + expect(block(host, 'Derived')).not.toContain('Period'); + }); + + it('omits the period entirely when there is none to show', () => { + const host = render({ ...earth, orbitalPeriodDays: undefined, orbitalPeriodSource: undefined }); + expect(block(host, 'Measured')).not.toContain('Period'); + expect(block(host, 'Derived')).not.toContain('Period'); + }); + + it('never shows an empty Measured block', () => { + const bare: BodyDetailViewModel = { + ...earth, + radiusKm: undefined, + orbit: {}, + orbitalPeriodDays: undefined, + orbitalPeriodSource: undefined, + discoveryYear: undefined, + }; + expect(render(bare).textContent).not.toContain('Measured'); + }); + + it('says a photographed surface is a photograph', () => { + expect(render(earth).textContent).toContain('photography'); + }); + + it('says an illustrated surface is not an observation', () => { + expect(render({ ...earth, hasPhotography: false }).textContent).toContain('Not an observation'); + }); + + it('explains a missing temperature rather than leaving the row blank', () => { + const host = render({ + ...earth, + hasPhotography: false, + appearance: appearance({ equilibriumTemperatureK: null }), + }); + expect(block(host, 'Derived')).not.toContain('Equilibrium temp.'); + expect(host.textContent).toContain('No host star in the catalogue'); + }); + + it('emits rather than navigating, so the scene decides what selection means', () => { + const host = render(earth); + let opened = 0; + let dismissed = 0; + fixture.componentInstance.openRequested.subscribe(() => (opened += 1)); + fixture.componentInstance.dismissed.subscribe(() => (dismissed += 1)); + + host.querySelector('button[aria-label="Close"]')!.click(); + [...host.querySelectorAll('button')].find((button) => button.textContent?.includes('Full view'))!.click(); + + expect({ opened, dismissed }).toEqual({ opened: 1, dismissed: 1 }); + }); +}); diff --git a/src/app/features/galaxy-system/system-object-card.component.ts b/src/app/features/galaxy-system/system-object-card.component.ts new file mode 100644 index 0000000..5cb086f --- /dev/null +++ b/src/app/features/galaxy-system/system-object-card.component.ts @@ -0,0 +1,165 @@ +import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core'; + +import { BodyDetailViewModel } from '../body-detail/body-detail.model'; +import { PLANET_CLASS_LABELS } from '../../shared/astro/planet-appearance'; +import { formatAu, formatDensity, formatMassEarth, formatPeriod, formatRadiusKm, formatTemperature } from '../../shared/format/quantity'; + +const KIND_LABELS: Record = { + planet: 'Planet', + moon: 'Moon', + dwarf: 'Dwarf planet', + exoplanet: 'Exoplanet', +}; + +interface CardRow { + readonly label: string; + readonly value: string; +} + +/** + * The card shown for a body picked in the system view, without leaving it. + * + * Selecting a planet used to navigate straight to `/body/:id`, which tore down the system scene + * and the camera position with it — so comparing two planets meant flying back in twice. This + * shows the same numbers over the live view, and keeps the route as the deliberate step for the + * full 3D inspection. + * + * Measured and derived quantities are kept in separate blocks, each labelled, because the + * difference matters here more than it usually would: no exoplanet has been imaged and several + * of these figures are reasoned rather than observed. Presentational only. + */ +@Component({ + selector: 'app-system-object-card', + changeDetection: ChangeDetectionStrategy.OnPush, + // Positioned and full-bleed like the HUD's own host, so the panel inside it resolves against + // the scene rather than against whatever box the inline default would have left it in — which + // put the card off the bottom-left corner of the viewport entirely. + host: { class: 'pointer-events-none absolute inset-0 block' }, + template: ` + +
+
+
+
+

+ {{ body().name }} +

+

{{ kindLabel() }} · {{ body().hostStarName }}

+
+ +
+ + @if (measured().length) { +

Measured

+
+ @for (row of measured(); track row.label) { +
{{ row.label }}
+
{{ row.value }}
+ } +
+ } + +

Derived

+
+ @for (row of derived(); track row.label) { +
{{ row.label }}
+
{{ row.value }}
+ } +
+ +

+ {{ provenance() }} +

+ + +
+
+ `, +}) +export class SystemObjectCardComponent { + readonly body = input.required(); + /** The close control, and anything else that should dismiss the card. */ + readonly dismissed = output(); + /** Request for the full `/body/:id` route. */ + readonly openRequested = output(); + + readonly kindLabel = computed(() => KIND_LABELS[this.body().kind]); + + /** Only what a catalogue actually published for this body. */ + readonly measured = computed(() => { + const body = this.body(); + const rows: CardRow[] = []; + if (body.radiusKm !== undefined) { + rows.push({ label: 'Radius', value: formatRadiusKm(body.radiusKm) }); + } + if (body.massEarth !== undefined) { + rows.push({ label: 'Mass', value: formatMassEarth(body.massEarth) }); + } + if (body.orbit.semiMajorAxisAu !== undefined) { + rows.push({ label: 'Semi-major axis', value: formatAu(body.orbit.semiMajorAxisAu) }); + } + if (body.orbit.eccentricity !== undefined) { + rows.push({ label: 'Eccentricity', value: body.orbit.eccentricity.toFixed(3) }); + } + if (body.orbitalPeriodDays !== undefined && body.orbitalPeriodSource === 'measured') { + rows.push({ label: 'Period', value: formatPeriod(body.orbitalPeriodDays) }); + } + if (body.discoveryYear !== undefined) { + rows.push({ label: 'Discovered', value: `${body.discoveryYear}` }); + } + return rows; + }); + + /** Everything computed from the measurements above rather than observed directly. */ + readonly derived = computed(() => { + const body = this.body(); + const rows: CardRow[] = [{ label: 'Class', value: PLANET_CLASS_LABELS[body.appearance.planetClass] }]; + if (body.orbitalPeriodDays !== undefined && body.orbitalPeriodSource === 'derived') { + rows.push({ label: 'Period', value: formatPeriod(body.orbitalPeriodDays) }); + } + if (body.appearance.equilibriumTemperatureK !== null) { + rows.push({ + label: 'Equilibrium temp.', + value: formatTemperature(body.appearance.equilibriumTemperatureK), + }); + } + if (body.appearance.bulkDensityGramsPerCm3 !== null) { + rows.push({ + label: 'Bulk density', + value: formatDensity(body.appearance.bulkDensityGramsPerCm3), + }); + } + return rows; + }); + + /** The same distinction the detail panel draws, stated briefly enough for a card. */ + readonly provenance = computed(() => { + const body = this.body(); + if (body.hasPhotography) { + return 'Surface: NASA/ESA/USGS photography.'; + } + return body.appearance.equilibriumTemperatureK === null + ? 'Surface illustrated from measured size and mass. No host star in the catalogue, so no temperature could be derived.' + : 'Surface illustrated from the measurements above. Not an observation — no image of this world exists.'; + }); +} diff --git a/src/app/shared/format/quantity.spec.ts b/src/app/shared/format/quantity.spec.ts new file mode 100644 index 0000000..2199da3 --- /dev/null +++ b/src/app/shared/format/quantity.spec.ts @@ -0,0 +1,84 @@ +import { describe, expect, it } from 'vitest'; + +import { formatAu, formatDensity, formatLuminosity, formatMassEarth, formatParsecs, formatPeriod, formatRadiusKm, formatTemperature } from './quantity'; + +describe('formatParsecs', () => { + it('switches to kiloparsecs past a thousand parsecs', () => { + expect(formatParsecs(8180)).toBe('8.2 kpc'); + }); + + it('keeps two decimals only while they carry information', () => { + expect(formatParsecs(1.3)).toBe('1.30 pc'); + expect(formatParsecs(250)).toBe('250 pc'); + }); +}); + +describe('formatAu', () => { + it('holds four decimals for close-in orbits', () => { + // 0.0026 AU is a real published semi-major axis; two decimals would render it — and every + // other hot Jupiter — as a flat 0.00. + expect(formatAu(0.0026)).toBe('0.0026 AU'); + }); + + it('drops to whole units past 100 AU', () => { + expect(formatAu(120)).toBe('120 AU'); + expect(formatAu(5.53)).toBe('5.53 AU'); + }); +}); + +describe('formatPeriod', () => { + it('uses hours below a day', () => { + expect(formatPeriod(0.5)).toBe('12.0 h'); + }); + + it('uses days through the short end and years beyond', () => { + expect(formatPeriod(88)).toBe('88.0 d'); + expect(formatPeriod(365.25)).toBe('365.3 d'); + expect(formatPeriod(4332.6)).toBe('11.9 yr'); + }); + + it('drops the decimal for periods of centuries', () => { + expect(formatPeriod(90_560)).toBe('248 yr'); + }); +}); + +describe('formatRadiusKm', () => { + it('groups thousands for large bodies', () => { + expect(formatRadiusKm(69_911)).toBe('69,911 km'); + }); + + it('keeps a decimal only for small ones', () => { + expect(formatRadiusKm(6371)).toBe('6371 km'); + expect(formatRadiusKm(11.3)).toBe('11.3 km'); + }); +}); + +describe('formatMassEarth', () => { + it('scales precision to magnitude', () => { + expect(formatMassEarth(0.815)).toBe('0.815 M⊕'); + expect(formatMassEarth(17.15)).toBe('17.15 M⊕'); + expect(formatMassEarth(317.8)).toBe('318 M⊕'); + }); +}); + +describe('formatTemperature and formatDensity', () => { + it('rounds temperature to a whole kelvin', () => { + expect(formatTemperature(254.6)).toBe('255 K'); + }); + + it('holds two decimals of density', () => { + expect(formatDensity(5.514)).toBe('5.51 g/cm³'); + }); +}); + +describe('formatLuminosity', () => { + it('stays decimal across the ordinary range', () => { + expect(formatLuminosity(1)).toBe('1.00 L☉'); + expect(formatLuminosity(0.0017)).toBe('0.002 L☉'); + }); + + it('goes to powers of ten at the extremes', () => { + expect(formatLuminosity(126_000)).toBe('1.3×10⁵ L☉'); + expect(formatLuminosity(0.00004)).toBe('4.0×10⁻⁵ L☉'); + }); +}); diff --git a/src/app/shared/format/quantity.ts b/src/app/shared/format/quantity.ts new file mode 100644 index 0000000..1f69ab6 --- /dev/null +++ b/src/app/shared/format/quantity.ts @@ -0,0 +1,80 @@ +/** + * Formatting for every physical quantity the HUD and the body cards display. + * + * Shared rather than per-component so the same measurement reads identically wherever it + * appears. The rule throughout is that precision follows magnitude — a figure is shown to the + * digits that carry information at its own scale, not to a fixed decimal count that reads as + * false precision at one end (`0.00 pc`) and loses real information at the other (`26000 pc`). + */ + +/** Distance in parsecs, switching to kiloparsecs where the number would otherwise run long. */ +export function formatParsecs(distancePc: number): string { + return distancePc >= 1000 ? `${(distancePc / 1000).toFixed(1)} kpc` : `${distancePc.toFixed(distancePc < 10 ? 2 : 0)} pc`; +} + +/** Distance in astronomical units, for anything inside a system. */ +export function formatAu(distanceAu: number): string { + if (distanceAu < 0.01) { + // Close-in exoplanets: 0.0026 AU is a real, published semi-major axis, and two decimals + // would round every hot Jupiter in the catalogue to the same `0.00`. + return `${distanceAu.toFixed(4)} AU`; + } + return distanceAu >= 100 ? `${distanceAu.toFixed(0)} AU` : `${distanceAu.toFixed(2)} AU`; +} + +/** + * Orbital period in whichever unit reads naturally at its length — hours for the very short + * periods common among hot Jupiters, days up to a couple of years, then years. + */ +export function formatPeriod(days: number): string { + if (days < 1) { + return `${(days * 24).toFixed(1)} h`; + } + if (days < 700) { + return `${days.toFixed(days < 10 ? 2 : 1)} d`; + } + return `${(days / 365.25).toFixed(days / 365.25 < 100 ? 1 : 0)} yr`; +} + +/** Radius in kilometres, or Earth radii once the number stops being legible in km. */ +export function formatRadiusKm(radiusKm: number): string { + return radiusKm >= 10_000 ? `${Math.round(radiusKm).toLocaleString('en-GB')} km` : `${radiusKm.toFixed(radiusKm < 100 ? 1 : 0)} km`; +} + +/** Mass in Earth masses. */ +export function formatMassEarth(massEarth: number): string { + if (massEarth >= 100) { + return `${massEarth.toFixed(0)} M⊕`; + } + return `${massEarth.toFixed(massEarth < 1 ? 3 : 2)} M⊕`; +} + +/** Equilibrium temperature. Always a whole kelvin — the model is not good to a fraction of one. */ +export function formatTemperature(kelvin: number): string { + return `${Math.round(kelvin)} K`; +} + +/** Bulk density. */ +export function formatDensity(gramsPerCm3: number): string { + return `${gramsPerCm3.toFixed(2)} g/cm³`; +} + +/** Bolometric luminosity in solar units, which spans many orders of magnitude. */ +export function formatLuminosity(solar: number): string { + if (solar >= 1000 || (solar > 0 && solar < 0.001)) { + const exponent = Math.floor(Math.log10(solar)); + return `${(solar / Math.pow(10, exponent)).toFixed(1)}×10${superscript(exponent)} L☉`; + } + return `${solar.toFixed(solar < 1 ? 3 : 2)} L☉`; +} + +const SUPERSCRIPTS = ['⁰', '¹', '²', '³', '⁴', '⁵', '⁶', '⁷', '⁸', '⁹']; + +function superscript(value: number): string { + const digits = Math.abs(value) + .toString() + .split('') + .map((digit) => SUPERSCRIPTS[Number(digit)]) + .join(''); + return value < 0 ? `⁻${digits}` : digits; +} From 7b0f32f71aa5d32d32bb742fa1e3f7ec8e42755b Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 6 Aug 2026 03:52:11 +0000 Subject: [PATCH 02/11] Assemble a body's readouts once, not once per panel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follow-up to review on #3. The card and the detail page each built their own Measured/Derived split, kind label and provenance sentence — the drift buildBodyViewModel exists to prevent, re-forked one layer up, and the drift would have been in which side of the measured/derived line a quantity falls on, which is the distinction those panels exist to draw. One bodyReadouts(body) now returns both blocks and the sentence, and both templates iterate it. The two surfaces render identical rows as a result, and the card gains the inclination the detail page already showed. Also from that review: - KIND_LABELS was duplicated between the two panels; it now lives beside bodyReadouts. The third copy the review pointed at is a different union (search results are star/body/exoplanet, and label a body "Body"), so it stays where it is. - CardRow was HudReadout renamed. Both are now Readout, which HudReadout extends with its derived flag. - The enterable-systems count was a 21-line lazy memo over arrays that are already in hand; it is one expression where those arrays are assigned. - buildBodyViewModel now carries hostStarId, so the detail scene stops rescanning both catalogues for something the builder had already resolved. - heliocentricPeriodDays was called twice for the same body. - The superscript helper was a split/map/join; it is a replace. - info-panel had five computed() each wrapping one pure call with a non-null assertion, beside a template that inlined the same kind of call directly. They are gone with the shared readouts. - Dropped a tautological test that compared a pure function to itself. Replaced with one that asserts the host star id the builder now carries. - Removed the orphaned doc comment left behind when formatParsecs/formatAu moved out. And one the review raised as out of scope but is worth taking: formatRadiusKm grouped thousands above its decimal threshold and not below it, so 69,911 km sat beside a bare 6371 km. Both are grouped now. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01WaySiNst4HhDXBHnMy8p5G --- .../body-detail-scene.component.ts | 10 +- .../features/body-detail/body-detail.model.ts | 6 + src/app/features/body-detail/body-readouts.ts | 82 +++++++++++++ .../body-detail/body-view-model.spec.ts | 5 +- .../features/body-detail/body-view-model.ts | 7 +- .../body-detail/info-panel.component.ts | 110 +++--------------- .../galaxy-system-scene.component.ts | 30 +---- .../system-object-card.component.spec.ts | 2 +- .../system-object-card.component.ts | 97 ++------------- src/app/shared/format/quantity.spec.ts | 8 +- src/app/shared/format/quantity.ts | 14 +-- src/app/shared/models/readout.ts | 5 + 12 files changed, 146 insertions(+), 230 deletions(-) create mode 100644 src/app/features/body-detail/body-readouts.ts create mode 100644 src/app/shared/models/readout.ts diff --git a/src/app/features/body-detail/body-detail-scene.component.ts b/src/app/features/body-detail/body-detail-scene.component.ts index 2b8af20..a561593 100644 --- a/src/app/features/body-detail/body-detail-scene.component.ts +++ b/src/app/features/body-detail/body-detail-scene.component.ts @@ -125,14 +125,8 @@ export class BodyDetailSceneComponent implements AfterViewInit, OnDestroy { } this.viewModel.set(viewModel); - const body = this.bodies.find((candidate) => candidate.id === id); - if (body) { - this.navigationStore.selectStar(body.systemStarId); - } else { - const exoplanet = this.exoplanets.find((candidate) => candidate.id === id); - if (exoplanet?.hostStarId != null) { - this.navigationStore.selectStar(exoplanet.hostStarId); - } + if (viewModel.hostStarId !== undefined) { + this.navigationStore.selectStar(viewModel.hostStarId); } this.notFound.set(false); diff --git a/src/app/features/body-detail/body-detail.model.ts b/src/app/features/body-detail/body-detail.model.ts index 0e63ff8..eed591b 100644 --- a/src/app/features/body-detail/body-detail.model.ts +++ b/src/app/features/body-detail/body-detail.model.ts @@ -13,6 +13,12 @@ export interface BodyDetailViewModel { name: string; kind: BodyDetailKind; hostStarName: string; + /** + * The host star's catalogue id, so a caller that has the view model does not have to rescan the + * catalogues to find what building it already resolved. Undefined for an exoplanet whose host + * never cross-referenced to the star catalogue. + */ + hostStarId?: number; radiusKm?: number; massEarth?: number; discoveryYear?: number; diff --git a/src/app/features/body-detail/body-readouts.ts b/src/app/features/body-detail/body-readouts.ts new file mode 100644 index 0000000..67611fc --- /dev/null +++ b/src/app/features/body-detail/body-readouts.ts @@ -0,0 +1,82 @@ +import { PLANET_CLASS_LABELS } from '../../shared/astro/planet-appearance'; +import { formatAu, formatDensity, formatMassEarth, formatPeriod, formatRadiusKm, formatTemperature } from '../../shared/format/quantity'; +import { Readout } from '../../shared/models/readout'; +import { BodyDetailViewModel } from './body-detail.model'; + +export const KIND_LABELS: Readonly> = { + planet: 'Planet', + moon: 'Moon', + dwarf: 'Dwarf planet', + exoplanet: 'Exoplanet' +}; + +export interface BodyReadouts { + readonly kindLabel: string; + /** Only what a catalogue actually published for this body. */ + readonly measured: readonly Readout[]; + /** Everything computed from those measurements rather than observed directly. */ + readonly derived: readonly Readout[]; + /** Says plainly which of the two the surface being drawn is. */ + readonly provenance: string; +} + +/** + * Turns a body into the rows its panels display. + * + * Shared by the in-map card and the detail page for the same reason `buildBodyViewModel` is: + * two independent assemblies of "what do we know about this world" drift, and here the drift + * would be in which side of the measured/derived line a quantity falls on — which is the one + * distinction these panels exist to make. + */ +export function bodyReadouts(body: BodyDetailViewModel): BodyReadouts { + const measured: Readout[] = []; + if (body.radiusKm !== undefined) { + measured.push({ label: 'Radius', value: formatRadiusKm(body.radiusKm) }); + } + if (body.massEarth !== undefined) { + measured.push({ label: 'Mass', value: formatMassEarth(body.massEarth) }); + } + if (body.orbit.semiMajorAxisAu !== undefined) { + measured.push({ label: 'Semi-major axis', value: formatAu(body.orbit.semiMajorAxisAu) }); + } + if (body.orbit.eccentricity !== undefined) { + measured.push({ label: 'Eccentricity', value: body.orbit.eccentricity.toFixed(3) }); + } + if (body.orbit.inclinationDeg !== undefined) { + measured.push({ label: 'Inclination', value: `${body.orbit.inclinationDeg.toFixed(2)}°` }); + } + // The period sits under whichever heading its provenance calls for. Same number, same field — + // a published period is an observation and a computed one is not. + if (body.orbitalPeriodDays !== undefined && body.orbitalPeriodSource === 'measured') { + measured.push({ label: 'Period', value: formatPeriod(body.orbitalPeriodDays) }); + } + if (body.discoveryYear !== undefined) { + measured.push({ label: 'Discovered', value: `${body.discoveryYear}` }); + } + + const derived: Readout[] = [{ label: 'Class', value: PLANET_CLASS_LABELS[body.appearance.planetClass] }]; + if (body.orbitalPeriodDays !== undefined && body.orbitalPeriodSource === 'derived') { + derived.push({ label: 'Period', value: formatPeriod(body.orbitalPeriodDays) }); + } + if (body.appearance.equilibriumTemperatureK !== null) { + derived.push({ label: 'Equilibrium temp.', value: formatTemperature(body.appearance.equilibriumTemperatureK) }); + } + if (body.appearance.bulkDensityGramsPerCm3 !== null) { + derived.push({ label: 'Bulk density', value: formatDensity(body.appearance.bulkDensityGramsPerCm3) }); + } + + return { kindLabel: KIND_LABELS[body.kind], measured, derived, provenance: provenanceFor(body) }; +} + +/** + * The derived surface is a reasoned illustration, and a panel of real measurements sitting next + * to it is exactly the context in which it could be mistaken for another one. + */ +function provenanceFor(body: BodyDetailViewModel): string { + if (body.hasPhotography) { + return 'Surface: NASA/ESA/USGS photography.'; + } + return body.appearance.equilibriumTemperatureK === null + ? 'Surface illustrated from this body’s measured size and mass. Its host star is not in the catalogue, so no temperature could be derived. Not an observation — no image of this world exists.' + : 'Surface illustrated from the measurements above — size, density and the temperature derived from its star’s output and its orbit. Not an observation — no image of this world exists.'; +} diff --git a/src/app/features/body-detail/body-view-model.spec.ts b/src/app/features/body-detail/body-view-model.spec.ts index 1db871a..a76f661 100644 --- a/src/app/features/body-detail/body-view-model.spec.ts +++ b/src/app/features/body-detail/body-view-model.spec.ts @@ -118,8 +118,7 @@ describe('buildBodyViewModel', () => { expect(buildBodyViewModel('nowhere', catalogues)).toBeUndefined(); }); - it('reads the same body identically however it is reached', () => { - // The whole point of the shared builder: the card and the detail route must not drift. - expect(buildBodyViewModel('earth', catalogues)).toEqual(buildBodyViewModel('earth', catalogues)); + it('carries the host star id, so callers need not rescan the catalogues for it', () => { + expect(buildBodyViewModel('earth', catalogues)?.hostStarId).toBe(SUN_STAR_ID); }); }); diff --git a/src/app/features/body-detail/body-view-model.ts b/src/app/features/body-detail/body-view-model.ts index 4d30650..becca17 100644 --- a/src/app/features/body-detail/body-view-model.ts +++ b/src/app/features/body-detail/body-view-model.ts @@ -41,17 +41,19 @@ export function buildBodyViewModel(id: string, catalogues: BodyCatalogues): Body const body = catalogues.bodies.find((candidate) => candidate.id === id); if (body) { const hostStar = catalogues.stars.find((star) => star.id === body.systemStarId); + const periodDays = heliocentricPeriodDays(body); return { id: body.id, name: body.name, kind: body.kind, hostStarName: hostStar?.name ?? 'Unknown star', + hostStarId: body.systemStarId, radiusKm: body.radiusKm, orbit: body.orbit, appearance: appearanceForBody(body, catalogues.bodies, luminosityOf(hostStar)), hasPhotography: bodyTexturePath(body.id) !== undefined, - orbitalPeriodDays: heliocentricPeriodDays(body), - orbitalPeriodSource: heliocentricPeriodDays(body) === undefined ? undefined : 'derived', + orbitalPeriodDays: periodDays, + orbitalPeriodSource: periodDays === undefined ? undefined : 'derived', }; } @@ -65,6 +67,7 @@ export function buildBodyViewModel(id: string, catalogues: BodyCatalogues): Body name: exoplanet.name, kind: 'exoplanet', hostStarName: exoplanet.hostStarName, + hostStarId: exoplanet.hostStarId ?? undefined, radiusKm: exoplanet.radiusEarth ? exoplanet.radiusEarth * EARTH_RADIUS_KM : undefined, massEarth: exoplanet.massEarth, discoveryYear: exoplanet.discoveryYear, diff --git a/src/app/features/body-detail/info-panel.component.ts b/src/app/features/body-detail/info-panel.component.ts index 8ce2311..1b8c54b 100644 --- a/src/app/features/body-detail/info-panel.component.ts +++ b/src/app/features/body-detail/info-panel.component.ts @@ -1,21 +1,16 @@ import { Component, computed, input } from '@angular/core'; import { Router } from '@angular/router'; -import { PLANET_CLASS_LABELS } from '../../shared/astro/planet-appearance'; -import { formatAu, formatDensity, formatMassEarth, formatPeriod, formatRadiusKm, formatTemperature } from '../../shared/format/quantity'; +import { bodyReadouts } from './body-readouts'; import { BodyDetailViewModel } from './body-detail.model'; -const KIND_LABELS: Record = { - planet: 'Planet', - moon: 'Moon', - dwarf: 'Dwarf planet', - exoplanet: 'Exoplanet' -}; - /** * Displays the real NASA data for the currently selected body/exoplanet: kind, physical * size/mass, orbital elements, and (for exoplanets) discovery year. Presentational only — * `BodyDetailSceneComponent` supplies the view model and owns navigation state. + * + * The rows come from `bodyReadouts`, shared with the system view's object card so the same body + * cannot read differently in the two places it can be inspected. */ @Component({ selector: 'app-info-panel', @@ -33,104 +28,37 @@ const KIND_LABELS: Record = {

{{ body().name }}

-

{{ kindLabel() }} · {{ body().hostStarName }}

+

{{ readouts().kindLabel }} · {{ body().hostStarName }}

-

Measured

-
- @if (body().radiusKm) { -
Radius
-
{{ radius() }}
- } - @if (body().massEarth) { -
Mass
-
{{ mass() }}
- } - @if (body().orbit.semiMajorAxisAu) { -
Semi-major axis
-
{{ semiMajorAxis() }}
- } - @if (body().orbit.eccentricity !== undefined) { -
Eccentricity
-
{{ body().orbit.eccentricity!.toFixed(4) }}
- } - @if (body().orbit.inclinationDeg !== undefined) { -
Inclination
-
{{ body().orbit.inclinationDeg!.toFixed(2) }}°
- } - @if (measuredPeriod()) { -
Period
-
{{ measuredPeriod() }}
- } - @if (body().discoveryYear) { -
Discovered
-
{{ body().discoveryYear }}
- } -
+ @if (readouts().measured.length) { +

Measured

+
+ @for (row of readouts().measured; track row.label) { +
{{ row.label }}
+
{{ row.value }}
+ } +
+ }

Derived

-
Class
-
{{ classLabel() }}
- @if (derivedPeriod()) { -
Period
-
{{ derivedPeriod() }}
- } - @if (body().appearance.equilibriumTemperatureK !== null) { -
Equilibrium temp.
-
{{ temperature() }}
- } - @if (body().appearance.bulkDensityGramsPerCm3 !== null) { -
Bulk density
-
{{ density() }}
+ @for (row of readouts().derived; track row.label) { +
{{ row.label }}
+
{{ row.value }}
}
-

{{ surfaceProvenance() }}

+

{{ readouts().provenance }}

` }) export class InfoPanelComponent { readonly body = input.required(); - readonly radius = computed(() => formatRadiusKm(this.body().radiusKm!)); - readonly mass = computed(() => formatMassEarth(this.body().massEarth!)); - readonly semiMajorAxis = computed(() => formatAu(this.body().orbit.semiMajorAxisAu!)); - readonly temperature = computed(() => formatTemperature(this.body().appearance.equilibriumTemperatureK!)); - readonly density = computed(() => formatDensity(this.body().appearance.bulkDensityGramsPerCm3!)); - /** The period goes under whichever heading its provenance calls for, and nowhere otherwise. */ - readonly measuredPeriod = computed(() => this.periodUnder('measured')); - readonly derivedPeriod = computed(() => this.periodUnder('derived')); - - private periodUnder(source: 'measured' | 'derived'): string | null { - const body = this.body(); - return body.orbitalPeriodDays !== undefined && body.orbitalPeriodSource === source ? formatPeriod(body.orbitalPeriodDays) : null; - } + readonly readouts = computed(() => bodyReadouts(this.body())); constructor(private readonly router: Router) {} - kindLabel(): string { - return KIND_LABELS[this.body().kind]; - } - - classLabel(): string { - return PLANET_CLASS_LABELS[this.body().appearance.planetClass]; - } - - /** - * Says plainly which of the two the viewer is looking at. The derived surface is a reasoned - * illustration, and a panel of real measurements sitting next to it is exactly the context in - * which it could be mistaken for another one. - */ - surfaceProvenance(): string { - if (this.body().hasPhotography) { - return 'Surface: NASA/ESA/USGS photography.'; - } - const temperature = this.body().appearance.equilibriumTemperatureK; - return temperature === null - ? 'Surface illustrated from this body’s measured size and mass. Its host star is not in the catalogue, so no temperature could be derived. Not an observation — no image of this world exists.' - : 'Surface illustrated from the measurements above — size, density and the temperature derived from its star’s output and its orbit. Not an observation — no image of this world exists.'; - } - goBack(): void { void this.router.navigate(['/']); } diff --git a/src/app/features/galaxy-system/galaxy-system-scene.component.ts b/src/app/features/galaxy-system/galaxy-system-scene.component.ts index 7ec46fb..992f76d 100644 --- a/src/app/features/galaxy-system/galaxy-system-scene.component.ts +++ b/src/app/features/galaxy-system/galaxy-system-scene.component.ts @@ -128,9 +128,6 @@ const EXIT_DURATION_SECONDS = 0.9; const RETURN_DURATION_SECONDS = 1.1; const GALACTIC_FLIGHT_SECONDS = 2.4; -/** Camera range for the readout panel, in the unit that suits the distance. */ - - /** * Where the camera sits to hold the whole Galaxy: above the disc and back past the Sun, looking * at the centre — near enough to the angle the Galaxy is usually drawn from, and it keeps the @@ -199,6 +196,7 @@ export class GalaxySystemSceneComponent implements AfterViewInit, OnDestroy { * over. Undefined outside the system view, and cleared when the view leaves one. */ readonly objectCard = signal(undefined); + private enterableSystems = 0; private pinnedBodyId: string | null = null; private hoveredBodyId: string | null = null; @@ -350,6 +348,8 @@ export class GalaxySystemSceneComponent implements AfterViewInit, OnDestroy { this.starsById = new Map(stars.map((star) => [star.id, star])); this.bodies = bodies; this.exoplanets = exoplanets; + // Which stars can be flown into: those with catalogued bodies of their own, plus the Sun. + this.enterableSystems = new Set([...bodies.map((body) => body.systemStarId), ...exoplanets.map((exoplanet) => exoplanet.hostStarId)].filter((id) => id !== null)).size; // Built once rather than per label refresh: it is a scan of every body and exoplanet, and the // labels are recomputed whenever the camera moves. this.starIdsWithBodies = new Set([...bodies.map((body) => body.systemStarId), ...exoplanets.map((exoplanet) => exoplanet.hostStarId)].filter( @@ -683,7 +683,7 @@ export class GalaxySystemSceneComponent implements AfterViewInit, OnDestroy { { label: 'Radius', value: `${LOCAL_GRID_RINGS_PC[LOCAL_GRID_RINGS_PC.length - 1]} pc` }, { label: 'Exoplanets', value: `${this.exoplanets.length}` }, // The one thing the field itself cannot show: which of those points can be flown into. - { label: 'Systems', value: `${this.enterableSystemCount()}` } + { label: 'Systems', value: `${this.enterableSystems}` } ]); this.hudNote.set('Positions from measured parallaxes. Grid marks the galactic plane through the Sun.'); } @@ -804,28 +804,6 @@ export class GalaxySystemSceneComponent implements AfterViewInit, OnDestroy { void this.router.navigate(['/body', id]); } - /** - * How many stars can actually be entered: those with catalogued bodies of their own, plus the - * Sun. Computed once rather than on every HUD refresh. - */ - private enterableSystems?: number; - - private enterableSystemCount(): number { - if (this.enterableSystems === undefined) { - const hosts = new Set(); - for (const body of this.bodies) { - hosts.add(body.systemStarId); - } - for (const exoplanet of this.exoplanets) { - if (exoplanet.hostStarId !== null) { - hosts.add(exoplanet.hostStarId); - } - } - this.enterableSystems = hosts.size; - } - return this.enterableSystems; - } - /** Reacts to `NavigationStore.selectedStarId` changes coming from any source (click/search). */ private reconcileSelection(selectedStarId: number | null): void { if (this.busy || selectedStarId === this.currentStarId) { diff --git a/src/app/features/galaxy-system/system-object-card.component.spec.ts b/src/app/features/galaxy-system/system-object-card.component.spec.ts index 4db5fcb..fcd56d9 100644 --- a/src/app/features/galaxy-system/system-object-card.component.spec.ts +++ b/src/app/features/galaxy-system/system-object-card.component.spec.ts @@ -98,7 +98,7 @@ describe('SystemObjectCardComponent', () => { appearance: appearance({ equilibriumTemperatureK: null }), }); expect(block(host, 'Derived')).not.toContain('Equilibrium temp.'); - expect(host.textContent).toContain('No host star in the catalogue'); + expect(host.textContent).toContain('host star is not in the catalogue'); }); it('emits rather than navigating, so the scene decides what selection means', () => { diff --git a/src/app/features/galaxy-system/system-object-card.component.ts b/src/app/features/galaxy-system/system-object-card.component.ts index 5cb086f..98cb79b 100644 --- a/src/app/features/galaxy-system/system-object-card.component.ts +++ b/src/app/features/galaxy-system/system-object-card.component.ts @@ -1,20 +1,7 @@ import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core'; import { BodyDetailViewModel } from '../body-detail/body-detail.model'; -import { PLANET_CLASS_LABELS } from '../../shared/astro/planet-appearance'; -import { formatAu, formatDensity, formatMassEarth, formatPeriod, formatRadiusKm, formatTemperature } from '../../shared/format/quantity'; - -const KIND_LABELS: Record = { - planet: 'Planet', - moon: 'Moon', - dwarf: 'Dwarf planet', - exoplanet: 'Exoplanet', -}; - -interface CardRow { - readonly label: string; - readonly value: string; -} +import { bodyReadouts } from '../body-detail/body-readouts'; /** * The card shown for a body picked in the system view, without leaving it. @@ -24,9 +11,7 @@ interface CardRow { * shows the same numbers over the live view, and keeps the route as the deliberate step for the * full 3D inspection. * - * Measured and derived quantities are kept in separate blocks, each labelled, because the - * difference matters here more than it usually would: no exoplanet has been imaged and several - * of these figures are reasoned rather than observed. Presentational only. + * The rows themselves come from `bodyReadouts`, shared with the detail page. Presentational only. */ @Component({ selector: 'app-system-object-card', @@ -43,10 +28,8 @@ interface CardRow {
-

- {{ body().name }} -

-

{{ kindLabel() }} · {{ body().hostStarName }}

+

{{ body().name }}

+

{{ readouts().kindLabel }} · {{ body().hostStarName }}

- @if (measured().length) { + @if (readouts().measured.length) {

Measured

- @for (row of measured(); track row.label) { + @for (row of readouts().measured; track row.label) {
{{ row.label }}
{{ row.value }}
} @@ -72,15 +55,13 @@ interface CardRow {

Derived

- @for (row of derived(); track row.label) { + @for (row of readouts().derived; track row.label) {
{{ row.label }}
{{ row.value }}
}
-

- {{ provenance() }} -

+

{{ readouts().provenance }}

- `, + ` }) export class SystemObjectCardComponent { readonly body = input.required(); @@ -103,63 +84,5 @@ export class SystemObjectCardComponent { /** Request for the full `/body/:id` route. */ readonly openRequested = output(); - readonly kindLabel = computed(() => KIND_LABELS[this.body().kind]); - - /** Only what a catalogue actually published for this body. */ - readonly measured = computed(() => { - const body = this.body(); - const rows: CardRow[] = []; - if (body.radiusKm !== undefined) { - rows.push({ label: 'Radius', value: formatRadiusKm(body.radiusKm) }); - } - if (body.massEarth !== undefined) { - rows.push({ label: 'Mass', value: formatMassEarth(body.massEarth) }); - } - if (body.orbit.semiMajorAxisAu !== undefined) { - rows.push({ label: 'Semi-major axis', value: formatAu(body.orbit.semiMajorAxisAu) }); - } - if (body.orbit.eccentricity !== undefined) { - rows.push({ label: 'Eccentricity', value: body.orbit.eccentricity.toFixed(3) }); - } - if (body.orbitalPeriodDays !== undefined && body.orbitalPeriodSource === 'measured') { - rows.push({ label: 'Period', value: formatPeriod(body.orbitalPeriodDays) }); - } - if (body.discoveryYear !== undefined) { - rows.push({ label: 'Discovered', value: `${body.discoveryYear}` }); - } - return rows; - }); - - /** Everything computed from the measurements above rather than observed directly. */ - readonly derived = computed(() => { - const body = this.body(); - const rows: CardRow[] = [{ label: 'Class', value: PLANET_CLASS_LABELS[body.appearance.planetClass] }]; - if (body.orbitalPeriodDays !== undefined && body.orbitalPeriodSource === 'derived') { - rows.push({ label: 'Period', value: formatPeriod(body.orbitalPeriodDays) }); - } - if (body.appearance.equilibriumTemperatureK !== null) { - rows.push({ - label: 'Equilibrium temp.', - value: formatTemperature(body.appearance.equilibriumTemperatureK), - }); - } - if (body.appearance.bulkDensityGramsPerCm3 !== null) { - rows.push({ - label: 'Bulk density', - value: formatDensity(body.appearance.bulkDensityGramsPerCm3), - }); - } - return rows; - }); - - /** The same distinction the detail panel draws, stated briefly enough for a card. */ - readonly provenance = computed(() => { - const body = this.body(); - if (body.hasPhotography) { - return 'Surface: NASA/ESA/USGS photography.'; - } - return body.appearance.equilibriumTemperatureK === null - ? 'Surface illustrated from measured size and mass. No host star in the catalogue, so no temperature could be derived.' - : 'Surface illustrated from the measurements above. Not an observation — no image of this world exists.'; - }); + readonly readouts = computed(() => bodyReadouts(this.body())); } diff --git a/src/app/shared/format/quantity.spec.ts b/src/app/shared/format/quantity.spec.ts index 2199da3..3195cdb 100644 --- a/src/app/shared/format/quantity.spec.ts +++ b/src/app/shared/format/quantity.spec.ts @@ -43,13 +43,15 @@ describe('formatPeriod', () => { }); describe('formatRadiusKm', () => { - it('groups thousands for large bodies', () => { + it('groups thousands on both sides of the decimal threshold', () => { + // Not just above it: 69,911 km beside a bare 6371 km reads as two different conventions. expect(formatRadiusKm(69_911)).toBe('69,911 km'); + expect(formatRadiusKm(6371)).toBe('6,371 km'); }); - it('keeps a decimal only for small ones', () => { - expect(formatRadiusKm(6371)).toBe('6371 km'); + it('keeps a decimal only for small bodies', () => { expect(formatRadiusKm(11.3)).toBe('11.3 km'); + expect(formatRadiusKm(1737)).toBe('1,737 km'); }); }); diff --git a/src/app/shared/format/quantity.ts b/src/app/shared/format/quantity.ts index 1f69ab6..5914927 100644 --- a/src/app/shared/format/quantity.ts +++ b/src/app/shared/format/quantity.ts @@ -38,7 +38,10 @@ export function formatPeriod(days: number): string { /** Radius in kilometres, or Earth radii once the number stops being legible in km. */ export function formatRadiusKm(radiusKm: number): string { - return radiusKm >= 10_000 ? `${Math.round(radiusKm).toLocaleString('en-GB')} km` : `${radiusKm.toFixed(radiusKm < 100 ? 1 : 0)} km`; + // Grouped on both sides of the decimal threshold: 69,911 km beside a bare 6371 km reads as two + // different conventions rather than one. + const digits = radiusKm < 100 ? 1 : 0; + return `${radiusKm.toLocaleString('en-GB', { minimumFractionDigits: digits, maximumFractionDigits: digits })} km`; } /** Mass in Earth masses. */ @@ -68,13 +71,6 @@ export function formatLuminosity(solar: number): string { return `${solar.toFixed(solar < 1 ? 3 : 2)} L☉`; } -const SUPERSCRIPTS = ['⁰', '¹', '²', '³', '⁴', '⁵', '⁶', '⁷', '⁸', '⁹']; - function superscript(value: number): string { - const digits = Math.abs(value) - .toString() - .split('') - .map((digit) => SUPERSCRIPTS[Number(digit)]) - .join(''); - return value < 0 ? `⁻${digits}` : digits; + return `${value}`.replace('-', '⁻').replace(/\d/g, (digit) => '⁰¹²³⁴⁵⁶⁷⁸⁹'[Number(digit)]); } diff --git a/src/app/shared/models/readout.ts b/src/app/shared/models/readout.ts new file mode 100644 index 0000000..db01b19 --- /dev/null +++ b/src/app/shared/models/readout.ts @@ -0,0 +1,5 @@ +/** A labelled quantity ready for display — the shape every panel in the app renders. */ +export interface Readout { + readonly label: string; + readonly value: string; +} From b14ce78c5f0ae61171861166c4e7cc55cf13f985 Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 6 Aug 2026 03:57:40 +0000 Subject: [PATCH 03/11] Say what formatRadiusKm actually returns Its doc comment promised a fallback to Earth radii that the function has never had. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01WaySiNst4HhDXBHnMy8p5G --- src/app/shared/format/quantity.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/shared/format/quantity.ts b/src/app/shared/format/quantity.ts index 5914927..3ba8403 100644 --- a/src/app/shared/format/quantity.ts +++ b/src/app/shared/format/quantity.ts @@ -36,7 +36,7 @@ export function formatPeriod(days: number): string { return `${(days / 365.25).toFixed(days / 365.25 < 100 ? 1 : 0)} yr`; } -/** Radius in kilometres, or Earth radii once the number stops being legible in km. */ +/** Radius in kilometres. */ export function formatRadiusKm(radiusKm: number): string { // Grouped on both sides of the decimal threshold: 69,911 km beside a bare 6371 km reads as two // different conventions rather than one. From ddf805e61f87ca71d728b1ca8b672a5bd74785c3 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 7 Aug 2026 11:31:53 +0000 Subject: [PATCH 04/11] Have Junie review each pull request MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CI says whether the code works. Nothing says whether it reads well, and the one review this repository has had so far arrived by hand. Kept as a separate workflow rather than a third job in ci.yml so a review can never turn the build red — the two answer different questions and should be able to disagree. It skips drafts, and skips pull requests from forks: GitHub withholds secrets from `pull_request` runs on a forked head, so the job would fail on a missing JUNIE_API_KEY rather than say anything about the code. Each push supersedes the previous review rather than stacking another comment beside it. Requires a JUNIE_API_KEY repository secret, generated at junie.jetbrains.com/cli. Without it the workflow is inert. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01WaySiNst4HhDXBHnMy8p5G --- .github/workflows/junie-review.yml | 49 ++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 .github/workflows/junie-review.yml diff --git a/.github/workflows/junie-review.yml b/.github/workflows/junie-review.yml new file mode 100644 index 0000000..7a659cb --- /dev/null +++ b/.github/workflows/junie-review.yml @@ -0,0 +1,49 @@ +name: Junie review + +# JetBrains' Junie agent reads each pull request and leaves inline review comments. It runs +# alongside CI rather than as part of it: CI answers whether the code works, this answers whether +# it reads well, and a review comment should never be able to turn the build red. +on: + pull_request: + types: [opened, synchronize, ready_for_review] + +# A review of the previous push is stale the moment a new one lands, so supersede it rather than +# letting two reviews comment on the same pull request. Keyed by pull request rather than by ref +# so a push to `main` never cancels a review. +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number }} + cancel-in-progress: true + +# Read the code, write the review. `issues: write` is what posts the summary comment — GitHub +# treats a pull request's conversation timeline as an issue. +permissions: + contents: read + pull-requests: write + issues: write + +jobs: + review: + name: Review the diff + runs-on: ubuntu-latest + # Drafts are work in progress and forks cannot see `JUNIE_API_KEY` — GitHub withholds secrets + # from `pull_request` runs on forked branches, so the job would fail on a missing key rather + # than say anything useful about the code. + if: >- + github.event.pull_request.draft == false && + github.event.pull_request.head.repo.full_name == github.repository + steps: + - uses: actions/checkout@v5 + with: + # Junie reads the diff through the GitHub API, so the full history it would otherwise + # clone is never used. + fetch-depth: 1 + + - uses: JetBrains/junie-github-action@v1 + with: + junie_api_key: ${{ secrets.JUNIE_API_KEY }} + # The action's built-in review prompt. Replace with a prompt block to review against + # criteria of our own. + prompt: code-review + # Rewrite one comment on each push instead of stacking a new one per revision, so the + # conversation shows the current state of the review rather than its history. + use_single_comment: "true" From 4d5e3a99145bf057ee4cbe5a97b18fdcf9652387 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 7 Aug 2026 11:33:49 +0000 Subject: [PATCH 05/11] Let the Junie review skip rather than fail without a key The workflow as written failed on ddf805e: with no JUNIE_API_KEY secret the input expands to empty and the action exits on "Missing required input", marking the pull request failed for a reason that has nothing to do with its code. I called it inert without the key. It was not inert; it was red, and it would have been red on every pull request until someone added the secret. So gate the steps on the key's presence and write the reason into the run summary instead. `secrets` is not a context a step's `if` can read and neither `secrets` nor `env` is available to a job-level `if`, so the presence is resolved once into a job-level env var, which steps can read. The action step also gets continue-on-error: an outage or a rate limit at JetBrains' end is worth seeing in the log, but this workflow is meant to be an opinion beside CI rather than a gate in front of it, and a failure to obtain that opinion should not hold a pull request whose tests pass. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01WaySiNst4HhDXBHnMy8p5G --- .github/workflows/junie-review.yml | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/.github/workflows/junie-review.yml b/.github/workflows/junie-review.yml index 7a659cb..2694e50 100644 --- a/.github/workflows/junie-review.yml +++ b/.github/workflows/junie-review.yml @@ -31,14 +31,34 @@ jobs: if: >- github.event.pull_request.draft == false && github.event.pull_request.head.repo.full_name == github.repository + env: + # Whether the key exists, resolved once here because `secrets` is not one of the contexts a + # step's `if` can read, while `env` is. + HAS_JUNIE_KEY: ${{ secrets.JUNIE_API_KEY != '' }} steps: + # Without the key the action exits on "Missing required input", which would mark every pull + # request failed for a reason that has nothing to do with its code. Say so in the run + # summary and stop instead — visible to anyone who looks, blocking nobody who doesn't. + - name: Explain the absent key + if: env.HAS_JUNIE_KEY != 'true' + run: | + echo "No \`JUNIE_API_KEY\` secret is set, so this pull request was not reviewed." >> "$GITHUB_STEP_SUMMARY" + echo "" >> "$GITHUB_STEP_SUMMARY" + echo "Generate a key at and add it under" >> "$GITHUB_STEP_SUMMARY" + echo "Settings → Secrets and variables → Actions." >> "$GITHUB_STEP_SUMMARY" + - uses: actions/checkout@v5 + if: env.HAS_JUNIE_KEY == 'true' with: # Junie reads the diff through the GitHub API, so the full history it would otherwise # clone is never used. fetch-depth: 1 - uses: JetBrains/junie-github-action@v1 + if: env.HAS_JUNIE_KEY == 'true' + # An opinion, not a gate. If Junie is down or rate-limited that is worth seeing in the + # log, but it is not a reason to hold a pull request whose tests pass. + continue-on-error: true with: junie_api_key: ${{ secrets.JUNIE_API_KEY }} # The action's built-in review prompt. Replace with a prompt block to review against From cfad718b0ac9c10f60feff06826ef3436ead5331 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 7 Aug 2026 12:46:14 +0000 Subject: [PATCH 06/11] Check develop after a merge, not just main MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `develop` became the integration branch when #3 merged into it, but CI's push trigger still named only `main` — so the merge commit itself ran nothing. A pull request is checked before the merge, not after, which leaves the state of the branch people actually build from unverified whenever two green pull requests conflict semantically. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01WaySiNst4HhDXBHnMy8p5G --- .github/workflows/ci.yml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7a26435..7fdc7ad 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,10 +1,12 @@ name: CI -# Runs on pull requests and on the branch they merge into, so a green tick means the code was -# checked in the state it will actually land in. +# Runs on pull requests and on the branches they merge into, so a green tick means the code was +# checked in the state it will actually land in. `develop` is where work integrates and `main` is +# what it is promoted to; a merge into either is a state nothing else would otherwise check, +# since a pull request is checked before the merge rather than after it. on: push: - branches: [main] + branches: [main, develop] pull_request: # A second push to the same branch makes the first run's answer irrelevant. From cca652d71fdce46c6e6ca4d414407da035044e73 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 7 Aug 2026 13:22:01 +0000 Subject: [PATCH 07/11] Publish the map to GitHub Pages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Builds on a push to main and deploys the result, so the thing is reachable without checking it out and running a dev server. Two details a project site needs that a root deployment does not: The base href is set from the repository name at build time. The app is served from a subdirectory there, and `DataLoaderService` fetches its catalogues with relative URLs — those resolve against `` rather than the current path, so without it a deep link would ask for /body/assets/data/stars.bin. Pages serves a static tree with no rewrite rules, so /body/mars has no file behind it and returns 404. Answering that 404 with the app lets the router render the route. The status stays 404, which crawlers will notice and readers will not; the alternative is hash URLs, which everyone notices. Verified against a server that mimics both behaviours: the root loads the star field with all six catalogue assets at 200, and /body/mars boots through 404.html and renders Mars at 3,390 km with its assets still resolving. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01WaySiNst4HhDXBHnMy8p5G --- .github/workflows/pages.yml | 70 +++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 .github/workflows/pages.yml diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml new file mode 100644 index 0000000..ee46039 --- /dev/null +++ b/.github/workflows/pages.yml @@ -0,0 +1,70 @@ +name: Pages + +# Publishes the built app to GitHub Pages. `main` only: `develop` is where work integrates and +# this is what the world sees, so a deploy should follow a promotion rather than every merge. +# `workflow_dispatch` covers the exception — dispatching from another ref publishes that ref. +on: + push: + branches: [main] + workflow_dispatch: + +# One deployment at a time, and never cancel one in flight: a half-replaced site is worse than a +# slightly stale one. Queued runs supersede each other, so the newest commit still wins. +concurrency: + group: pages + cancel-in-progress: false + +permissions: + contents: read + pages: write + # `deploy-pages` authenticates to the Pages service with an OIDC token rather than a secret. + id-token: write + +jobs: + build: + name: Build the site + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v5 + + - uses: actions/setup-node@v5 + with: + node-version: 22 + cache: npm + + - run: npm ci + + # Enables Pages on first run if it is not on yet, and reports the URL the site will live at. + - uses: actions/configure-pages@v6 + + # A project site is served from a subdirectory, so the app cannot assume it sits at the + # root. The base href is what makes the router's URLs and the relative `fetch` calls in + # `DataLoaderService` resolve — those are written relative, so they follow `` rather + # than the current path, and a deep link still finds `assets/data/*`. + # + # Derived from the repository name rather than written out, so a rename cannot leave a + # stale path here. A user/organisation site or a custom domain would want `/` instead. + - name: Build + run: npm run build -- --base-href "/${GITHUB_REPOSITORY#*/}/" + + # Pages serves a static tree with no rewrite rules, so `/body/mars` has no file behind it + # and comes back 404. Answering that 404 with the app itself lets the router take over and + # render the route, which is the standard way to host a history-API app here. The status + # stays 404 — search engines notice, humans do not. + - name: Serve deep links through the app + run: cp dist/star-map/browser/index.html dist/star-map/browser/404.html + + - uses: actions/upload-pages-artifact@v5 + with: + path: dist/star-map/browser + + deploy: + name: Deploy to Pages + needs: build + runs-on: ubuntu-latest + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + steps: + - id: deployment + uses: actions/deploy-pages@v5 From 433bcca8a2d344edd0c3322879ec7c43f517e383 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 7 Aug 2026 14:02:12 +0000 Subject: [PATCH 08/11] Stop publishing the repo as a plugin marketplace, and refresh the run skill MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Three small things. Removed `.claude-plugin/marketplace.json`. It is the file `/plugin marketplace add` reads, so without it this repo no longer offers itself as a marketplace — which is the odd part of an Angular app carrying one. The caveman plugin's own files stay, so it can be listed from a marketplace of its own later; only the listing is gone. That left four documents asserting an install path that no longer exists, including a README section handing out `/plugin marketplace add` and `/plugin install` commands that would now fail. All four now say what is actually true. `.junie/plans/nasa-star-map.md` still describes the repo as containing only a marketplace, and is left alone: it records what was here before the app was written, and is not a claim about the present. The run skill's numbers had drifted a release behind — 496 tests in 28 files against a real 527 in 31, and a build timed at 9s that now takes 12. Measured rather than guessed. The pinned Playwright version it names was correct. It also gains the Pages build, which is not a plain `npm run build`: the base href and the 404.html copy are both required for a project site, and the artifact root is `dist/star-map/browser` rather than its parent. Plus the matching gotcha, since a Pages build served at `/` looks broken in a way that tells you nothing about whether it would work. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01WaySiNst4HhDXBHnMy8p5G --- .claude-plugin/marketplace.json | 28 ----------------------- .claude/skills/run-star-map/SKILL.md | 33 +++++++++++++++++++++++++--- README.md | 27 +++++------------------ agents/cs-caveman-mode.md | 7 +++--- commands/cs/caveman.md | 9 +++----- skills/caveman/SKILL.md | 10 ++++----- 6 files changed, 45 insertions(+), 69 deletions(-) delete mode 100644 .claude-plugin/marketplace.json diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json deleted file mode 100644 index 9fbf0c9..0000000 --- a/.claude-plugin/marketplace.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "star-map", - "owner": { - "name": "avalon-vanguard", - "url": "https://github.com/avalon-vanguard" - }, - "description": "Personal marketplace of cs:* Claude Code commands, agents, and skills.", - "plugins": [ - { - "name": "caveman", - "source": "./", - "description": "Ultra-compressed communication mode. Cuts token usage ~75% by dropping filler, articles, and pleasantries while keeping full technical accuracy. Adds a cs-caveman-mode persona agent, /cs:caveman slash command, and stdlib Python tooling (compressor, token-savings estimator, lint) on top of Matt Pocock's MIT-licensed caveman skill.", - "version": "1.0.0", - "author": { - "name": "avalon-vanguard", - "url": "https://github.com/avalon-vanguard" - }, - "license": "MIT", - "keywords": [ - "caveman", - "communication", - "tokens", - "productivity" - ], - "category": "productivity" - } - ] -} diff --git a/.claude/skills/run-star-map/SKILL.md b/.claude/skills/run-star-map/SKILL.md index 7419616..dd00110 100644 --- a/.claude/skills/run-star-map/SKILL.md +++ b/.claude/skills/run-star-map/SKILL.md @@ -130,15 +130,38 @@ already-running server and leaves it alone on exit). ## Test ```bash -PATH=/opt/node/bin:$PATH npm test # 496 tests, 28 files, ~5s -PATH=/opt/node/bin:$PATH npm run build # ~9s +PATH=/opt/node/bin:$PATH npm test # 527 tests, 31 files, ~6s +PATH=/opt/node/bin:$PATH npm run build # ~12s PATH=/opt/node/bin:$PATH npm run etl:typecheck PATH=/opt/node/bin:$PATH npm run e2e:typecheck -PATH=/opt/node/bin:$PATH npm run e2e -- --workers=1 # 6 tests, ~2.3m +PATH=/opt/node/bin:$PATH npm run e2e -- --workers=1 # 6 tests, 3 files, ~2.3m ``` `--workers=1` on the e2e suite is **not optional here** — see Gotchas. +## Build for GitHub Pages + +`.github/workflows/pages.yml` publishes the app on a push to `main`. To reproduce what it builds: + +```bash +export PATH=/opt/node/bin:$PATH +npm run build -- --base-href "/star-map/" +cp dist/star-map/browser/index.html dist/star-map/browser/404.html +``` + +Two things differ from a plain `npm run build`, and both exist because a project site is served +from a subdirectory rather than a domain root: + +- **`--base-href`.** `DataLoaderService` fetches its catalogues with relative URLs + (`assets/data/stars.bin`), which resolve against `` rather than the current path. Get it + wrong and a deep link asks for `/body/assets/data/stars.bin`. The workflow derives it from the + repository name so a rename cannot strand it. +- **`404.html`.** Pages has no rewrite rules, so `/body/mars` has no file behind it. Serving the + app as the 404 body lets the router render the route. The response stays HTTP 404. + +The uploaded artifact is `dist/star-map/browser`, **not** `dist/star-map` — the parent also holds +`3rdpartylicenses.txt` and `prerendered-routes.json`, which are not part of the site. + ## Gotchas - **The wrong Node is first on `PATH`.** `/opt/node22` is v22.22.2; `/opt/node` is v22.23.2. @@ -172,6 +195,10 @@ PATH=/opt/node/bin:$PATH npm run e2e -- --workers=1 # 6 tests, ~2.3m view) to see Mercury/Venus/Earth/Mars labelled. - **Port 4300, not Angular's usual 4200** — the project's own convention, set in `playwright.config.ts` so it never collides with an unrelated `ng serve`. +- **A Pages build looks broken if you serve it at the root.** `` makes + every asset resolve under that prefix, so opening `dist/star-map/browser` at `/` gets you a + blank page and a wall of 404s. Serve it under the same prefix as Pages does, with unknown paths + falling back to `404.html`, or the check tells you nothing. - **Don't write driver scripts in `.ts` outside the repo.** `tsx` compiles a bare `.ts` as CJS ("Top-level await is currently not supported with the cjs output format"), and a script outside the repo can't resolve `@playwright/test` at all. The driver is `.mjs` inside the repo for both diff --git a/README.md b/README.md index b3f9167..775a6ff 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ real astronomical data instead of fictional systems. Browse the solar neighbourh star's system to see its planets on their real orbits, and drill into a single body for the NASA figures behind it. -This repo also hosts a small Claude Code plugin marketplace — see [Plugins](#plugins) below. +The source of a small Claude Code plugin also lives here — see [Plugins](#plugins) below. ![The solar neighbourhood: 68 388 catalogued stars within 250 parsecs, on a polar grid lying in the galactic plane](docs/screenshots/galaxy-view.jpg) @@ -290,27 +290,10 @@ The design document behind all of this is `.junie/plans/nasa-star-map.md`. ## Plugins -This repo doubles as a Claude Code plugin marketplace. Adding it and installing a plugin -defaults to **user scope**, meaning the plugin becomes available in *every* project on your -machine, not just the one you happen to be in: - -```bash -/plugin marketplace add avalon-vanguard/star-map -/plugin install caveman@star-map -``` - -Scope can be overridden at install time if you want it tied to a single repo instead: - -```bash -# Shared with collaborators via that repo's .claude/settings.json -/plugin install caveman@star-map --scope project - -# Just for you, in that one repo only (gitignored) -/plugin install caveman@star-map --scope local -``` - -See [Claude Code plugin installation scopes](https://code.claude.com/docs/en/plugins-reference) -for details on `user` / `project` / `local` scope. +This repo carries the source of one Claude Code plugin, but no longer publishes itself as a +marketplace — `.claude-plugin/marketplace.json` was removed, which is the file `/plugin +marketplace add` reads. So there is currently no install path from here; the manifest and the +plugin's own files are kept so it can be listed from a marketplace of its own later. - **caveman** — `/cs:caveman` ultra-compressed communication mode. - Command: [`commands/cs/caveman.md`](commands/cs/caveman.md) diff --git a/agents/cs-caveman-mode.md b/agents/cs-caveman-mode.md index 093a535..15b4aff 100644 --- a/agents/cs-caveman-mode.md +++ b/agents/cs-caveman-mode.md @@ -18,10 +18,9 @@ turns until explicit deactivation. ## Scope -Ships as part of this repo's plugin marketplace. Installing it via -`/plugin install caveman@star-map` defaults to **user scope**, so this -agent is available in every project, not scoped to a single repo. See the -[README](../README.md) for `--scope project` / `--scope local` overrides. +Part of the caveman plugin, whose source lives here. This repo no longer +publishes itself as a plugin marketplace, so the agent is not installable +from it as things stand. See the [README](../README.md). ## Activation Triggers diff --git a/commands/cs/caveman.md b/commands/cs/caveman.md index 08cef87..db2d711 100644 --- a/commands/cs/caveman.md +++ b/commands/cs/caveman.md @@ -11,12 +11,9 @@ Activate caveman mode. Stays active until explicit deactivation. ## Scope -Installed via this repo's plugin marketplace, this command defaults to -**user scope** — available in every project, not just the one it was -installed from. Override with `--scope project` (shared with collaborators -via `.claude/settings.json`) or `--scope local` (gitignored, this repo -only) if you want it scoped down. See the [README](../../README.md) for -install commands. +Part of the caveman plugin, whose source lives here. This repo no longer +publishes itself as a plugin marketplace, so the command is not installable +from it as things stand. See the [README](../../README.md). ## Activation diff --git a/skills/caveman/SKILL.md b/skills/caveman/SKILL.md index ba7ad87..a3c7e3e 100644 --- a/skills/caveman/SKILL.md +++ b/skills/caveman/SKILL.md @@ -15,12 +15,10 @@ exactly as-is. ## Scope -This skill ships via this repo's plugin marketplace -(`.claude-plugin/marketplace.json`). Installing with -`/plugin install caveman@star-map` defaults to **user scope** — global, -available in every project — instead of being tied to just one repo. Use -`--scope project` or `--scope local` to narrow it; see the -[README](../../README.md). +This repo no longer publishes itself as a plugin marketplace, so there is +currently no install path for this skill from here. Listing it from a +marketplace elsewhere is what would make `/plugin install` work again; see +the [README](../../README.md). ## Persistence From 7d07921d69e287ff5a848e2012ee1fcd8d30e70a Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 7 Aug 2026 14:22:29 +0000 Subject: [PATCH 09/11] Say what the project is, in the two places people arrive MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The README opened without mentioning that the thing is deployed, and the HTML document carried a title and nothing else — no description, no link preview. Both matter more now that there is a public URL to land on. README: the live link up top; the object card and the measured/derived split from #3, which were built but never written down; `shared/format/`, `public/` and `.github/workflows/` in the layout. index.html: a description, a theme colour matching --color-void so the browser chrome does not flash white around a black sky, and Open Graph/Twitter tags so a shared link renders as something other than a bare URL. Those URLs are absolute and name the deployment outright — a scraper has no document to resolve a relative path against, so they cannot follow the way the rest of the app's paths do. A custom domain later means editing these three lines. The preview image is the galactic view, copied into `public/` so it is served by the site itself rather than linked out to raw.githubusercontent. Verified: the built document keeps every tag, the base href still rewrites to /star-map/, the image answers 200 at the path the og:image names, and both the root and a deep link still render. 527 tests pass. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01WaySiNst4HhDXBHnMy8p5G --- README.md | 21 +++++++++++++++++++++ public/social-preview.jpg | Bin 0 -> 247491 bytes src/index.html | 18 +++++++++++++++++- 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 public/social-preview.jpg diff --git a/README.md b/README.md index 775a6ff..ad06278 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,10 @@ real astronomical data instead of fictional systems. Browse the solar neighbourh star's system to see its planets on their real orbits, and drill into a single body for the NASA figures behind it. +**Live at **, published from `main` by +[`.github/workflows/pages.yml`](.github/workflows/pages.yml). There is no backend — the whole +thing is static files and a few megabytes of baked catalogue. + The source of a small Claude Code plugin also lives here — see [Plugins](#plugins) below. ![The solar neighbourhood: 68 388 catalogued stars within 250 parsecs, on a polar grid lying in the galactic plane](docs/screenshots/galaxy-view.jpg) @@ -74,6 +78,20 @@ around it. Mercury's, three pixels wide at that range, does not survive either w with real photography where NASA/ESA/USGS imagery exists, and a surface derived from the body's own measurements where it does not. See "On surfaces that were never photographed" below. +**Object card** — hovering a body in the system view raises its figures over the live scene and +clicking pins them, so two planets can be compared without flying out and back; **Full view** +opens the detail route when the close-up is wanted. The card and the detail panel are built from +one shared view model and one shared set of readouts, which is what stops the same planet reading +255 K in one and 254 K in the other. + +**Measured against derived** — every figure is filed under the heading it earns. A published +radius is measured; an equilibrium temperature computed from the host star's luminosity is +derived, and says so. Orbital period is shown where it can honestly be had: for a heliocentric +orbit it follows exactly from the semi-major axis, because in these units the Sun's mass *is* the +unit of mass — Mars comes back 687.0 d against a published 686.98. It is deliberately absent for +moons, whose elements are relative to a parent planet the catalogue carries no mass for, and for +exoplanets, where assuming a solar-mass host would mis-state every planet around an M dwarf. + **Search** — name search across stars, solar-system bodies and exoplanets, navigating to the same place an in-scene click would. @@ -281,9 +299,12 @@ src/app/ Milky Way structure shared/models/ record contracts shared by the app and the ETL shared/rendering/ skybox, glow sprites, texture catalog + shared/format/ one formatter per physical quantity, precision following magnitude shared/state/ navigation store (Angular signals) tools/etl/ build-time data pipeline e2e/ Playwright end-to-end tests +public/ files served at the site root (favicon, link-preview image) +.github/workflows/ CI, the Pages deploy, and an automated review pass ``` The design document behind all of this is `.junie/plans/nasa-star-map.md`. diff --git a/public/social-preview.jpg b/public/social-preview.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9c47e6bd684099dd855d52113f1d63163741d42b GIT binary patch literal 247491 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�E3UoHc^nFheESpmlF}z3@LRp(cK?(wnA;h`9u=ON}EUKc^w#Oi|W zPYd%a?Hu=8dkyGMp@g&g>VKRFT5d7+TQwn8ep94q>L-QZ4`TsyumGl-439Mbqt+

NrzvxUHUDw(CKc& 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 literal 0 HcmV?d00001 diff --git a/src/index.html b/src/index.html index d70b2e4..5623c17 100644 --- a/src/index.html +++ b/src/index.html @@ -2,10 +2,26 @@ - Star Map + Star Map — the real solar neighbourhood in 3D + + + + + + + + + + + + + + From 9a5e41495b350dc0660f4d44fa4fc29c1d44bc83 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 17 Aug 2026 14:05:41 +0000 Subject: [PATCH 10/11] Make a cold-cache ETL run a pure function of the archives MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two order dependencies surfaced while designing the scheduled refresh, both invisible on a developer machine with a warm cache and both guaranteed to haunt a weekly CI run that starts cold. The Exoplanet Archive query had no ORDER BY, so the archive was free to return rows in any order it liked — and exoplanets.json preserves row order, so a re-run could rewrite the file, and commit a diff, when nothing was actually published. Ordered by pl_name, which is unique among default_flag=1 rows, so the order is total. The deep-sky sort tie-broke with localeCompare, whose collation belongs to the ICU build of whichever Node runs the ETL. Compared code points instead: the file must not reorder because the runner's ICU disagrees with the machine that wrote it last. Both may reorder the committed files once, on the next real refresh. After that, byte-identity between runs means what it should: the archives published nothing. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01WaySiNst4HhDXBHnMy8p5G --- tools/etl/fetchDeepSky.ts | 5 ++++- tools/etl/fetchExoplanets.ts | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/tools/etl/fetchDeepSky.ts b/tools/etl/fetchDeepSky.ts index f2d4caa..4ba285b 100644 --- a/tools/etl/fetchDeepSky.ts +++ b/tools/etl/fetchDeepSky.ts @@ -126,7 +126,10 @@ export async function fetchDeepSky(): Promise { // Brightest first, so a consumer taking a prefix gets the most prominent objects. Objects // with no measured magnitude sort last rather than being treated as infinitely bright. - records.sort((a, b) => (a.magnitude ?? Infinity) - (b.magnitude ?? Infinity) || a.id.localeCompare(b.id)); + // The tie-break compares code points rather than localeCompare: locale collation depends on + // the ICU build of whichever Node runs the ETL, and a scheduled re-run must not reorder the + // file just because the runner's ICU disagrees with the machine that wrote it last. + records.sort((a, b) => (a.magnitude ?? Infinity) - (b.magnitude ?? Infinity) || (a.id < b.id ? -1 : a.id > b.id ? 1 : 0)); ensureDataDir(); writeFileSync(dataPath('deepsky.json'), JSON.stringify(records)); diff --git a/tools/etl/fetchExoplanets.ts b/tools/etl/fetchExoplanets.ts index ade5d34..dac2b21 100644 --- a/tools/etl/fetchExoplanets.ts +++ b/tools/etl/fetchExoplanets.ts @@ -25,7 +25,11 @@ const TAP_COLUMNS = [ 'st_mass', 'disc_year' ].join(','); -const TAP_QUERY = `select+${TAP_COLUMNS}+from+ps+where+default_flag=1&format=csv`; +// Ordered explicitly: without it the archive is free to return rows in any order, and a +// scheduled re-run of the ETL would then rewrite exoplanets.json — and commit a diff — when +// nothing was actually published. pl_name is unique among default_flag=1 rows, so the order +// is total and the output is a pure function of the archive's content. +const TAP_QUERY = `select+${TAP_COLUMNS}+from+ps+where+default_flag=1+order+by+pl_name&format=csv`; const TAP_URL = `${TAP_BASE_URL}?query=${TAP_QUERY}`; // A host star match must be within this many parsecs of the catalog position to be From 8e55964b14aa2e5f1515201fa936908fc9bd6fd7 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 17 Aug 2026 14:05:42 +0000 Subject: [PATCH 11/11] Refresh the catalogues on a schedule, and republish when they change MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mondays 05:23 UTC: re-run the ETL cold against the live archives, and if the output differs by a byte, gate it on the unit suite and a production build, commit it to main, and dispatch the Pages deploy. If nothing changed, say so in the run summary and touch nothing. The gates run inside this workflow because they cannot run after it: a push made with GITHUB_TOKEN fires no push workflows at all — GitHub's recursion guard — so an unguarded push would deploy nothing and be checked by nothing. The same guard is why the deploy and a visible CI record are dispatched explicitly afterwards; dispatch events do go through where push events do not. ci.yml gains a workflow_dispatch trigger for exactly that call. Also corrects pages.yml's claim that configure-pages enables Pages on first run. It cannot: the action's `enablement` input requires an admin-scoped token, which GITHUB_TOKEN is not. If the site has never been enabled, the first deploy fails at that step and the one-time fix is Settings → Pages → Source: GitHub Actions. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01WaySiNst4HhDXBHnMy8p5G --- .github/workflows/ci.yml | 3 + .github/workflows/data-refresh.yml | 89 ++++++++++++++++++++++++++++++ .github/workflows/pages.yml | 5 +- 3 files changed, 96 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/data-refresh.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7fdc7ad..4932d7f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,6 +8,9 @@ on: push: branches: [main, develop] pull_request: + # For the data-refresh workflow: its bot push to main fires no `push` events (GitHub's + # recursion guard), so it dispatches CI here explicitly to put checks on the new commit. + workflow_dispatch: # A second push to the same branch makes the first run's answer irrelevant. concurrency: diff --git a/.github/workflows/data-refresh.yml b/.github/workflows/data-refresh.yml new file mode 100644 index 0000000..b1d3b87 --- /dev/null +++ b/.github/workflows/data-refresh.yml @@ -0,0 +1,89 @@ +name: Refresh the catalogues + +# Re-runs the ETL against the live archives on a schedule and republishes the site when the data +# actually changed, so the catalogues track NASA without anyone touching the code. The archives +# this reads — HYG, the Exoplanet Archive, JPL Horizons, OpenNGC, Gaia — are all anonymous +# public endpoints; no keys are involved. +on: + schedule: + # Mondays 05:23 UTC. An arbitrary minute rather than :00, which is the busiest minute on + # GitHub's cron fleet and the most likely to be delayed or dropped. + - cron: '23 5 * * 1' + workflow_dispatch: + +# Never two refreshes at once, and never cancel one mid-push. +concurrency: + group: data-refresh + cancel-in-progress: false + +permissions: + contents: write # push the regenerated catalogues to main + actions: write # dispatch the deploy and CI afterwards — see the final step + +jobs: + refresh: + name: Fetch, gate, publish + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v5 + with: + # The data lives on main and the push below goes to main, whichever ref the workflow + # file itself ran from. + ref: main + + - uses: actions/setup-node@v5 + with: + node-version: 22 + cache: npm + + - run: npm ci + + # The ETL's cache directory is gitignored and this is a fresh runner, so every source is + # fetched live (~50-100 MB). A failed fetch fails the run by design — no refresh is + # better than a partial one — except Gaia, which the ETL itself treats as best-effort. + - name: Rebuild the datasets + run: npm run etl + + - name: Detect a real change + id: diff + run: | + if git diff --quiet -- src/assets/data; then + echo "changed=false" >> "$GITHUB_OUTPUT" + echo "The archives published nothing new — catalogues are byte-identical." >> "$GITHUB_STEP_SUMMARY" + else + echo "changed=true" >> "$GITHUB_OUTPUT" + { echo "Catalogue changes:"; echo '```'; git diff --stat -- src/assets/data; echo '```'; } >> "$GITHUB_STEP_SUMMARY" + fi + + # The same gates CI runs, run here instead: the push below is made with GITHUB_TOKEN, and + # GitHub deliberately fires no workflows for such pushes, so the data must be proven + # before it lands rather than checked after. + - name: Unit tests against the new data + if: steps.diff.outputs.changed == 'true' + run: npm test -- --no-watch + + - name: Production build against the new data + if: steps.diff.outputs.changed == 'true' + run: npm run build + + - name: Commit to main + if: steps.diff.outputs.changed == 'true' + run: | + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add src/assets/data + git commit -m "Refresh the astronomical catalogues" \ + -m "Scheduled re-run of the ETL against the live archives. Gated on the unit suite and a production build in this same run, because a GITHUB_TOKEN push triggers no CI of its own." + git push origin HEAD:main + + # The recursion guard that keeps the bot push from triggering `push` workflows also keeps + # it from deploying, so the deploy — and a visible CI record on the new commit — are + # dispatched explicitly. Dispatch does go through, unlike push events. + - name: Redeploy the site, and put checks on the commit + if: steps.diff.outputs.changed == 'true' + env: + GH_TOKEN: ${{ github.token }} + run: | + gh workflow run pages.yml --ref main + gh workflow run ci.yml --ref main diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index ee46039..d26e0c6 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -34,7 +34,10 @@ jobs: - run: npm ci - # Enables Pages on first run if it is not on yet, and reports the URL the site will live at. + # Verifies Pages is enabled and reports the URL the site will live at. It cannot *enable* + # Pages itself: the action's `enablement` input requires an admin-scoped token, which the + # workflow's GITHUB_TOKEN is not. If this step fails with "Get Pages site failed", the + # one-time fix is Settings → Pages → Source: GitHub Actions, then re-run. - uses: actions/configure-pages@v6 # A project site is served from a subdirectory, so the app cannot assume it sits at the