A row plays only with a timeline to play; the speed shown follows the world clock; mark labels merge whole and cut by character

A weather row's play started the world clock even with no time to show,
where there is no timeline; it now does nothing then, as the timeline's
own Play cannot be reached. A weather layer made without a weather clock
does nothing once destroyed, so enabling it after builds no clock.

The timeline's speed follows the world clock's rate whoever set it, and
its Play runs at that rate, so it and a row's play never run at different
rates; a rate not offered shows as the nearest offered speed. Choosing a
speed sets the clock's rate first, also while a driver steps.

Marks merge on their whole label and are cut for showing after, so two
whose labels only differ past the cut stay two, and the cut counts
graphemes (code points where the runtime cannot tell them), so an emoji is
never split.

Tests that compared a DOM element with null built an assertion message
from the element when they failed, which hung the run; they compare plain
values now, so they fail at once. The timeline tests put the clock back to
real time after each.
This commit is contained in:
Sameh Khamis committed 2026-11-14 21:12:43 -08:00
1 parent 1dc2dbe4ea
commit ac04812db2
26 files changed
+274 -108

No files matched your search

@@ -6,11 +6,12 @@
mark, and the handle then tells the mark's label with the time to screen
readers and shows it over the track while focused. A layer's world clock
coverage may give each mark as `{ time, label, id, kind }` as well as a
bare time (a label over 60 characters, `WORLD_CLOCK_MARK_LABEL_LENGTH`, is
cut, ending in `…`); `worldClock.coverage()` keeps `marks` as the sorted
times and adds `markDetails`, the merged marks themselves. A zoom or a pan clears the
hovered label, and a label is never wider than the track (samehkhamis,
#1745).
bare time. `worldClock.coverage()` keeps `marks` as the sorted times and
adds `markDetails`, the merged marks themselves, merged on their whole
label; a label longer than `WORLD_CLOCK_MARK_LABEL_LENGTH` (60 characters,
exported from `gods-eye-view/time`) is then cut, ending in `…`, never
splitting an emoji. A zoom or a pan clears the hovered label, and a label
is never wider than the track (samehkhamis, #1745).
- The timeline marks only events: launches, and earthquakes of magnitude 6
and up while the Earthquakes layer is on (about one every two days
worldwide). It no longer draws a tick for every weather frame, which came
@@ -36,11 +37,13 @@
first. A weather row's `play` and `latest` params move the world clock as
the timeline does: `play` runs at the timeline's chosen speed, from the
start when live or at the end, and does nothing while every product the
row shows is suspended. The world clock keeps a chosen rate while paused
and live (`goLive()` no longer sets it back to 1), so any play runs at it.
A weather layer made without a weather clock builds its own when first
enabled, and destroying it leaves the world clock's time where it is
(`createWeatherClock({ shared: false })`). **Breaking:** the catalog's
row shows is suspended or while there is no time to show. The world clock
keeps a chosen rate while paused and live (`goLive()` no longer sets it
back to 1), so any play runs at it, and the timeline's speed shows the
clock's rate whoever set it (the nearest offered speed for another rate).
A weather layer made without a weather clock leaves the world clock alone
until it is first enabled, does nothing once destroyed, and destroying it
leaves the world clock's time where it is. **Breaking:** the catalog's
`weatherClock` (`gods-eye-view/application/layers`) no longer has
`setTarget`, `step`, `latest`, `play`, `pause` or `togglePlay`, its state
no longer has `playing`, and it no longer attaches itself to the world