Skip to content

feat(ui): the time helix replaces the twilight gantt — now-centered helical ribbon (PR2)#432

Merged
Jesssullivan merged 1 commit into
mainfrom
feat/time-helix-component
Jun 11, 2026
Merged

feat(ui): the time helix replaces the twilight gantt — now-centered helical ribbon (PR2)#432
Jesssullivan merged 1 commit into
mainfrom
feat/time-helix-component

Conversation

@Jesssullivan

Copy link
Copy Markdown
Owner

The time helix premieres

Replaces EphemerisGantt.svelte with TimeHelix.svelte — the foundational UI element of phasi.space, premiering in darkmap as the twilight bar's successor. PR2 of the cascade (PR1 = #431, the pure math).

What it is

  • One revolution = 24h of local-mean-solar time (daylight always rides the crest, night the trough, at every longitude); the axis = the passage of time.
  • The 24h day-view is a Hann window centered on the cursor — a screen-fixed SVG mask; scrubbing translates the tape underneath it. This is the structural fix for the gantt's mobile defect (UTC-day anchoring meant the daylight band sat mid-strip in the evening with no discernible NOW).
  • Phase-colored 15-min ribbon segments with depth modulation (the dusk limb renders near/bright — darkmap is an evening instrument); sun/moon/twilight-bound nodules with tap popovers; tape-drag + tap-to-jump + keyboard (±15m / Shift ±60m / Home=now) scrub; local-time labels with a UTC affordance (the gantt was UTC-everywhere).
  • orientation prop ships horizontal; the math is orientation-clean for phasi.space's vertical helix.

Contract (smokes pass untouched-by-construction)

Root keeps .gantt (+time-helix); the scrub surface keeps .bar + role=slider + drag-updating aria-valuenow; ribbon segments keep .stripe (+data-phase); the fixed-float CSS block and the dock .dock-gantt-row de-float overrides are preserved. Zero diff under scripts/bazel/.

Spec changes

  • B1→H1 (twilight-compact-webkit.spec.ts): keeps presence/box floors; adds ≥2-distinct-data-phase ribbon assert + the now-centering acceptance ([data-now-marker] centerX within the central third of the bar).
  • overflow.spec: the scrub test seeds darkmap-tour-v1 pre-load (aq-dashboard's idiom) — the helix rail is taller than the gantt bar, so the first-visit tour card overlaid the drag origin; clicking Skip races the tour mount.

Bugs found & fixed during verification

  • rAF-starved scrub drop: headless WebKit doesn't pump rAF during synthetic drags — the throttled scrub silently dropped the gesture's final position (a real fast-flick bug, not just a test artifact). Pointerup now flushes the pending frame synchronously.
  • Stale-bundle gotcha: the e2e webServer reuses build/ when present; verification re-ran against a fresh build.

Verification

just check · //:playwright_mobile_hud_matrix_smoke · just webkit-smoke shell + mobile-hud · H1+overflow e2e 3× green under webkit-mobile and chromium-mobile · capture-breakpoints 14 viewports PASS with visual checks at 375×667 (dock), 1440×900 (WIDE float), 844×390 (landscape float).

PR3 follows: tour copy, Cmd-K keywords, docs prose, stale comments.

…elical ribbon (PR2)

TimeHelix.svelte: one revolution = 24h local-mean-solar time, axis = the
passage of time, 24h Hann window centered on the cursor (the structural fix
for the gantt's UTC-day anchoring — NOW is always the unmistakable center).
Phase-colored 15-min ribbon segments with depth modulation (dusk limb
near/bright), sun/moon/twilight-bound nodules with tap popovers, tape-drag +
tap-to-jump + keyboard scrub, local-time labels with a UTC affordance.

Contract kept from the gantt so every browser smoke passes untouched:
.gantt root, .bar slider (drag-updating aria-valuenow), .stripe segments
(+ data-phase), the fixed-float CSS block, the dock de-float overrides.

- +page.svelte: 2-line swap in ganttBlock; EphemerisGantt.svelte removed
  (its loader/slider/chrome idioms live on in TimeHelix)
- e2e B1→H1: phase-colored ribbon (≥2 distinct data-phase) + now-centering
  acceptance ([data-now-marker] in the central third of the bar)
- overflow.spec: seed darkmap-tour-v1 before the scrub test (the helix rail
  is taller than the gantt bar, so the first-visit tour card overlaid the
  drag origin; clicking Skip races tour mount — aq-dashboard's idiom)
- scrub flushes the pending rAF frame on pointerup (headless WebKit starves
  rAF, silently dropping fast flicks' final position)

Verified: just check; mobile-hud matrix smoke; webkit shell+mobile-hud
smokes; H1+overflow e2e 3x green under webkit-mobile and chromium-mobile;
capture-breakpoints 14 viewports PASS with visual checks at 375x667 /
1440x900 / 844x390. Zero diff under scripts/bazel/.
@Jesssullivan
Jesssullivan merged commit 1af9836 into main Jun 11, 2026
6 checks passed
@Jesssullivan
Jesssullivan deleted the feat/time-helix-component branch June 11, 2026 02:42
Jesssullivan added a commit that referenced this pull request Jun 11, 2026
…elix era (PR3) (#433)

The component swap landed in #432; this sweeps the prose that still said
'twilight gantt' / EphemerisGantt where it described the PRESENT:

- Sky-lens tour step: 'Open the time helix … now sits at the center; drag
  the ribbon' (was 'Open the twilight gantt')
- Cmd-K 'Toggle Twilight strip' keywords gain 'time helix' (gantt kept as
  an alias)
- /docs route: three Sky-lens/ephemeris mentions now say time helix
- docs/ux/command-deck.md: present-tense DOCK prose updated (notes the row
  keeps its .gantt smoke contract); historical W-logs left as history
- 15 stale comments across app.css, viewportGrid, cache/badge, MapToolbar,
  SkyCompass, ResponsiveDock, horizonAwareEvents, twilight-phases,
  +page.svelte — each reworded to be true today (e.g. badge.ts notes the
  cache pill has no consumer while TimeHelix V1 defers it; the TIN-1810
  app.css note records the ~200px figure as gantt-era history and why the
  reserve rule stays)

No behavior change; just check green; the .gantt/.bar/.stripe contract and
ganttRow/ganttBlock/dock-gantt-row names are untouched by design.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant