Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions docs/ux/command-deck.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ never occluded, at every breakpoint.
lead value** → support sections (full weight) → "More — N sections ▾"
(collapsed-but-obvious, full contrast) → TOOLS. Deep tools open **inside this
column** (master-detail) or shrink the stage — never as a `bottom:0 z12` sheet.
- **DOCK** (bottom, full width): the twilight gantt as its **own reserved row** at
- **DOCK** (bottom, full width): the time helix (the twilight strip — `TimeHelix.svelte`, née the twilight gantt; the row keeps its `.gantt` smoke contract) as its **own reserved row** at
every breakpoint — so "X floats over the twilight strip" is structurally
impossible. Deletes the ~120 lines of `--field-panel-*` math + `!important`
overrides + the portrait clearance special-case.
Expand Down Expand Up @@ -110,7 +110,7 @@ pre-fills the deep tool with `{lat,lon,et,lens,layers,boresight,horizon}` with z
re-entry. Hover-to-**peek** (ephemeral), click-to-**pin** (commit + enable CTAs);
value + its one CTA share one large target (Fitts).

- ◐ **Sky** "dark window here" — **≤1 click** (hover=0): inspector leads Bortle + tonight's dark-window inline; full gantt always in the DOCK.
- ◐ **Sky** "dark window here" — **≤1 click** (hover=0): inspector leads Bortle + tonight's dark-window inline; the full time helix always in the DOCK.
- ☁ **Air** "AQI here" — **≤1 click**: smog field present on Air-lens entry; inspector leads driving pollutant + NowCast-labeled AQI; AQ summary docked in-inspector.
- 📡 **Links** "link margin" — **≤2 clicks**: click → path-AOD→T→dB line; "Design a link" → boresight + Tx/Rx + loss breakdown expand *into* the inspector.
- 🛰 **Orbit** "next pass" — **≤2 clicks**: next DEM-gated pass on pin regardless of lens; "Plan a pass" → polar az/el track + pass list expand in-inspector.
Expand Down
19 changes: 11 additions & 8 deletions src/app.css
Original file line number Diff line number Diff line change
Expand Up @@ -88,12 +88,15 @@ html {
html {
--field-bottom-reserve: 8.75rem;
--map-toolbar-inset-rem: 5rem;
/* The mobile twilight gantt is ~200px tall — taller than --field-bottom-reserve
(8.75rem ≈ 140px), so a tall readout-only state would dip ~60px into it
(TIN-1810). The readout-only portrait rule clears the gantt by anchoring its
bottom at this reserve instead; the gantt/attribution/toolbar keep
--field-bottom-reserve. Tuned against real-font render (the GF cell is
fontless so the overlap never shows in CI). */
/* TIN-1810 (gantt era): the old mobile twilight gantt was ~200px tall —
taller than --field-bottom-reserve (8.75rem ≈ 140px) — so a tall
readout-only state dipped ~60px into it. The readout-only portrait rule
clears the strip by anchoring its bottom at this reserve instead; the
strip/attribution/toolbar keep --field-bottom-reserve. The TimeHelix
strip is ~100px (comfortably inside the reserve) but the rule stays —
it is the structural guarantee, not a height tweak. Tuned against
real-font render (the GF cell is fontless so the overlap never shows
in CI). */
--gantt-reserve-rem: 13rem;
}
}
Expand Down Expand Up @@ -406,7 +409,7 @@ pre.shiki span {
owns layout. Five named, non-overlapping regions —
'header header header' / 'rail stage inspector' / 'dock dock dock',
tracks [20rem][1fr][22rem] — so overlap is impossible by construction: the
map (grid-area:stage) + the twilight gantt (its own DOCK row) can only be
map (grid-area:stage) + the time helix (its own DOCK row) can only be
SHRUNK, never occluded. The old z4→z13 ladder + the `.field-hud` scrim are
deleted; the surfaces flow into grid cells. The only remaining fixed/absolute
overlays clip to the STAGE cell (toolbar, sky compass, deep-tool sheets,
Expand All @@ -420,7 +423,7 @@ pre.shiki span {
─────── ─────────────────── ─────────────────────────────
5 attribution bottom-left
6 SkyCompass top-right (hidden ≤560px)
6 EphemerisGantt strip bottom, full width (minus toolbar inset)
6 TimeHelix strip bottom, full width (minus toolbar inset)
8 MapToolbar bottom-right
8 MapErrorToast bottom-left
9 LayerRail backdrop full (mobile drawer only)
Expand Down
10 changes: 6 additions & 4 deletions src/lib/cache/badge.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
*
* Field users need to glance at the map and tell whether a given
* overlay is showing fresh data, cached data, stale data, or nothing
* at all. The bottom rail in `EphemerisGantt.svelte` already grew a
* at all. The old `EphemerisGantt.svelte` bottom rail grew a
* one-off `RangeBadge` for the twilight viewport-summary; this module
* generalizes the same idea into a reusable contract so every overlay
* surface — LayerRail health pills, future per-overlay chips, the
Expand Down Expand Up @@ -47,7 +47,8 @@ export interface CacheBadgeInputs {

/**
* Human "… ago" string for a stored/computed timestamp. Exported so the
* EphemerisGantt viewport-summary pill (which this module generalizes) shares
* twilight viewport-summary pill (the old EphemerisGantt surface this
* module generalizes; deferred in TimeHelix V1) shares
* one age formatter — including the >24h day rollover — instead of its own copy.
*/
export const fmtAge = (storedAtMs: number, nowMs: number): string => {
Expand Down Expand Up @@ -136,8 +137,9 @@ export const buildCacheBadge = (inputs: CacheBadgeInputs, nowMs: number = Date.n
};

/**
* Map a `CacheBadgeTone` to the `.cache-pill` modifier classes used by
* `EphemerisGantt.svelte`. Exported so a Svelte component can apply
* Map a `CacheBadgeTone` to the `.cache-pill` modifier classes the old
* `EphemerisGantt.svelte` wore (no consumer while TimeHelix V1 defers the
* cache pill). Exported so a Svelte component can apply
* the right tonal class without re-typing the union.
*/
export const cachePillToneClass = (tone: CacheBadgeTone): string => `cache-pill-${tone}`;
3 changes: 2 additions & 1 deletion src/lib/components/MapToolbar.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
/**
* MapToolbar — vertical stack of map-overlay toggles in the
* bottom-right corner. Replaces the two standalone time / sun-moon
* buttons that fought the EphemerisGantt + TimeDock for the same space.
* buttons that fought the twilight strip (now TimeHelix) + TimeDock for
* the same space.
*
* The toolbar publishes its width via the `--toolbar-w-rem` CSS
* custom property on `:host`. The gantt + dock read that variable
Expand Down
6 changes: 3 additions & 3 deletions src/lib/components/ResponsiveDock.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@
with PEEK / HALF / FULL detents (CSS scroll-snap). The map de-fixes into the
stage behind it (a map strip is ALWAYS visible at the top — FULL ≈ 88vh, never
100%). A [Layers · Readout · Tools] segmented control SWAPS the single sheet's
content; switching never spawns a 2nd panel. The twilight gantt is a thin
content; switching never spawns a 2nd panel. The time helix is a thin
always-present row ABOVE the sheet peek at every detent. Marked
.responsive-dock + data-responsive-dock so W4a's tolerant HUD-overlap assertion
keys off it. -->
Expand Down Expand Up @@ -264,7 +264,7 @@
<div class="dock-lens-row">{@render lensStrip()}</div>
{/if}

<!-- The twilight gantt: its OWN thin row, always present above everything
<!-- The time helix: its OWN thin row, always present above everything
else in the sheet, at every detent. -->
{#if ganttRow}
<div class="dock-gantt-row">{@render ganttRow()}</div>
Expand Down Expand Up @@ -437,7 +437,7 @@
}

/* The gantt's OWN thin row, pinned above the tabs + body — always present. The
EphemerisGantt's COMPACT default is position:fixed at the viewport bottom; here
TimeHelix's COMPACT default is position:fixed at the viewport bottom; here
it must flow inside the sheet as a thin row, so de-float it (it keeps its
.gantt class + aria-label — only positioning changes). */
.dock-gantt-row {
Expand Down
2 changes: 1 addition & 1 deletion src/lib/components/SkyCompass.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -441,7 +441,7 @@
{:else if moonHorizonDelta}
<span class="horizon">h {fmtAlt(moonHorizonDelta.horizonAlt)}</span>
{/if}
<!-- Moon phase/illumination is shown once, in the EphemerisGantt readout
<!-- Moon phase/illumination is shown once, in the TimeHelix moon chip
rendered alongside this compass; the compass row keeps the
position-specific alt/az/horizon and omits the duplicate phase. -->
</div>
Expand Down
2 changes: 1 addition & 1 deletion src/lib/ephemeris/horizonAwareEvents.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
*
* Flat-horizon sunrise = the instant the sun's geocentric altitude
* crosses 0°. That's what astronomy-engine's `SearchAltitude` /
* `SearchRiseSet` return — and it's what the EphemerisGantt shows
* `SearchRiseSet` return — and it's what the TimeHelix shows
* today. For dark-sky / spectroscopy field work the answer that
* actually matters is the instant the sun crosses the *local*
* horizon at its azimuth, which is what a HorizonPolygon encodes.
Expand Down
4 changes: 2 additions & 2 deletions src/lib/ephemeris/twilight-phases.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,8 @@ export interface PhaseDefinition {

/**
* Canonical phase table. Colors mirror the Photographer's Ephemeris
* palette previously inlined in `EphemerisGantt.svelte` so the visual
* appearance does not change.
* palette inlined in the old `EphemerisGantt.svelte` (the TimeHelix ribbon
* consumes it now) so the visual appearance does not change.
*/
export const PHASE_DEFINITIONS: Readonly<Record<PhaseName, PhaseDefinition>> = {
night: {
Expand Down
5 changes: 3 additions & 2 deletions src/lib/viewportGrid.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
/**
* Viewport sampling helpers.
*
* The EphemerisGantt's per-event range pill samples ephemeris at a
* The twilight viewport-summary (born as the EphemerisGantt's range
* pill; its TimeHelix successor defers the pill UI) samples ephemeris at a
* 4×4 grid of points inside the visible viewport. The math is in a
* pure helper here so it can be unit-tested independently from the
* Svelte component — which matters because the bug it fixes (silent
Expand All @@ -28,7 +29,7 @@ const canonicalizeLon = (lon: number): number => ((((lon + 180) % 360) + 360) %
* Returns the empty array for degenerate viewports (zero or negative
* span on either axis).
*
* Caller picks N (the EphemerisGantt uses 4 for ephemeris range
* Caller picks N (the viewport summary uses 4 for ephemeris range
* sampling — 16 calls is cheap and covers the variability that
* matters for state-scale viewports).
*/
Expand Down
8 changes: 4 additions & 4 deletions src/routes/+page.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,7 @@
{
anchor: '[data-tour="toolbar"]',
title: 'Twilight & ephemeris',
body: 'Open the twilight gantt for sun/moon timing and the sky compass — plan the session around the dark hours.',
body: 'Open the time helix for sun/moon timing and the sky compass — now sits at the center; drag the ribbon to plan the session around the dark hours.',
},
],
// Air (weather/smog): atmosphere overlays + PM2.5 field, NowCast vs 24-h, AQ tools.
Expand Down Expand Up @@ -436,7 +436,7 @@
{
id: 'tool-twilight',
label: 'Toggle Twilight strip',
keywords: 'sun moon timing dark window ephemeris gantt',
keywords: 'sun moon timing dark window ephemeris gantt time helix',
run: () => (ephemerisOpen = !ephemerisOpen),
},
{
Expand Down Expand Up @@ -2759,7 +2759,7 @@
{/if}
</aside>

<!-- DOCK region: the twilight gantt as its OWN reserved bottom row at WIDE — so
<!-- DOCK region: the time helix as its OWN reserved bottom row at WIDE — so
"X floats over the twilight strip" is structurally impossible. ≤1023px
display:contents → the gantt keeps its current fixed bottom-strip layout.
W4c — at COMPACT-tall the gantt is the dock sheet's thin top row instead. -->
Expand Down Expand Up @@ -3311,7 +3311,7 @@
}

/* De-fix the region children at MEDIUM+WIDE: the lens chips + geocoder
(HEADER), the PointReadout (INSPECTOR), and the twilight gantt (DOCK) drop
(HEADER), the PointReadout (INSPECTOR), and the time helix (DOCK) drop
their own position:fixed/inset/z-index and flow into their grid cells. Their
own <640px float positioning is untouched (the COMPACT fallback). The stage
overlays (toolbar, sky, sheets) stay fixed at COMPACT; here they clip to the
Expand Down
10 changes: 5 additions & 5 deletions src/routes/docs/+page.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
persona: 'Astro instrumentation & astrophotography',
question: 'When and where is tonight dark, clear, and steady enough for my target?',
tools:
'VIIRS + Falchi radiance → Bortle / SQM · ephemeris & twilight gantt · SkyCompass · DEM horizon · T(λ) extinction',
'VIIRS + Falchi radiance → Bortle / SQM · ephemeris & time helix · SkyCompass · DEM horizon · T(λ) extinction',
cta: 'Open the Sky lens',
},
{
Expand Down Expand Up @@ -121,8 +121,8 @@
</p>
<ul class="mb-3 list-disc space-y-1 pl-6">
<li>
<strong>◐ Sky</strong> — astronomers &amp; astrophotographers: VIIRS + Falchi radiance → Bortle / SQM, the twilight
gantt + sky compass, and the real DEM horizon for a dark-sky site.
<strong>◐ Sky</strong> — astronomers &amp; astrophotographers: VIIRS + Falchi radiance → Bortle / SQM, the time helix
+ sky compass, and the real DEM horizon for a dark-sky site.
</li>
<li>
<strong>☁ Air</strong> — weather, pollen &amp; smog analysts: GIBS cloud / aerosol / water-vapor overlays plus a modeled
Expand Down Expand Up @@ -164,8 +164,8 @@
readout (with Bortle / class mapping)
</li>
<li>
<strong>Per-view ephemeris</strong> — sun + moon position, twilight gantt (astro / nautical / civil), sky compass
with sun trajectory arc + moon position + atmospheric airmass
<strong>Per-view ephemeris</strong> — sun + moon position, the now-centered time helix (astro / nautical / civil twilight),
sky compass with sun trajectory arc + moon position + atmospheric airmass
</li>
<li>
<strong>Real-terrain horizon</strong> — 36-ray, 10-distance raycast over AWS Mapzen Terrarium tiles; sun / moon altitude
Expand Down
Loading