diff --git a/docs/CURRENT-STATE.md b/docs/CURRENT-STATE.md
index 2d585d8dc..ce2c9e635 100644
--- a/docs/CURRENT-STATE.md
+++ b/docs/CURRENT-STATE.md
@@ -1441,7 +1441,7 @@ Ordinary sliders share the native range component in `ui/slider.js` and the
`gev-quantitative-slider` surface in `ui/styles/slider.css`. Display, shader
parameters, volume, replay speed, weather settings/history, imagery opacity and
Street View's date filter use the same rail, thumb, value styling, keyboard focus and disabled state.
-Generated controls use `createSlider`; static templates apply the same class.
+Generated controls use `createSlider`; static templates and components apply the same class.
Feature owners retain bounds, steps, formatted values, input/change timing and
listener cleanup. The radio tuning dial, imagery comparison divider and event
comparison/progression controls keep their specialized presentation and behavior.
diff --git a/docs/VUE-MIGRATION.md b/docs/VUE-MIGRATION.md
index 1a7586052..529c0d697 100644
--- a/docs/VUE-MIGRATION.md
+++ b/docs/VUE-MIGRATION.md
@@ -78,9 +78,9 @@ They contain no application state.
`v-for`, because re-rendering it would bring back the English; component
text uses `t()` instead. Shared builders become components first and
keep their imperative entry points until their owners are components:
- the rail cards and card blocks (`src/ui/rail/`) render through Vue's
- synchronous `render()` behind `createRailCards()` and
- `createRailCardBlocks()`. Order: Scenes (done: `SceneOptions` and
+ the rail cards, card blocks and timeline (`src/ui/rail/`) render through
+ Vue's synchronous `render()` behind `createRailCards()`,
+ `createRailCardBlocks()` and `createRailTimeline()`. Order: Scenes (done: `SceneOptions` and
`SceneShotList` over the `gev-scenes` store), Weather, Recent imagery,
Street level, CCTV, Layers, Display, Context and Radio, the command dock,
the phone shell, then Cockpit. Layers that write into the right rail
diff --git a/scripts/package-boundaries.json b/scripts/package-boundaries.json
index 3ddef5cc7..73a3a95d6 100644
--- a/scripts/package-boundaries.json
+++ b/scripts/package-boundaries.json
@@ -573,6 +573,8 @@
"src/ui/rail/RailCardBlocks.vue",
"src/ui/rail/RailCard.vue",
"src/ui/rail/RailCards.vue",
+ "src/ui/rail/utcClock.js",
+ "src/ui/rail/RailTimeline.vue",
"src/ui/rail/rangeValue.js"
],
"external": ["vue"]
@@ -938,6 +940,8 @@
"src/ui/rail/RailCardBlocks.vue",
"src/ui/rail/RailCard.vue",
"src/ui/rail/RailCards.vue",
+ "src/ui/rail/utcClock.js",
+ "src/ui/rail/RailTimeline.vue",
"src/ui/rail/rangeValue.js"
],
"external": ["cesium", "vue", "pinia"]
@@ -2898,6 +2902,8 @@
"src/ui/rail/RailCard.vue",
"src/ui/rail/RailCards.vue",
"src/ui/rail/RailCardBlocks.vue",
+ "src/ui/rail/utcClock.js",
+ "src/ui/rail/RailTimeline.vue",
"src/ui/rail/rangeValue.js"
],
"external": [
diff --git a/src/ui/rail/RailTimeline.vue b/src/ui/rail/RailTimeline.vue
new file mode 100644
index 000000000..604780394
--- /dev/null
+++ b/src/ui/rail/RailTimeline.vue
@@ -0,0 +1,170 @@
+
+
+
+