feat(timeline): milestone dates, zoom, pan, sorting + profile-gated landing - #3
Conversation
…anding Timeline now models milestones as first-class dated lanes: - Epic gains optional startDate/endDate (parsed mindp:/ekai:-tolerant); undated milestones render as a muted dashed future ghost + INACTIVE badge. - Moving a milestone's first task to In progress stamps its startDate=today in epics.ttl via the pod write backend (setEpicStartDate). - Merged Runtime/Done into one bar: green fill = work done, vertical marker = where elapsed time says we should be (behind/ahead at a glance). - Quarter/Month/Week zoom with a horizontally-scrollable track, frozen label column, prev/Today/next pan, and auto-centring on today. - Lane sorting: by start (default, undated last), by name, by progress. Landing: gate the assistant/partners sections so the default OSS build doesn't advertise Chat or empty partner lists. Callback string moved into the i18n table. Demo seeds (CSS + mind-node) ship three milestones (Discovery/Launch/Audit) so the timeline showcases dated, undated, and completed states. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
Self-review (can't approve own PR) Data model — Auto-start — Timeline — frozen-label pattern (sticky Landing — profile-gating consistent; Eyebrow index numbering shifts correctly when the assistant section is hidden. Typecheck clean, browser-verified end-to-end. |
What
Timeline milestones become first-class dated lanes, plus zoom/pan/sort. All six items came from live discovery feedback and were browser-verified against the local pod.
Timeline
Epicgains optionalstartDate/endDate(parsedmindp:/ekai:-tolerant). Undated milestones render as a muted dashed future ghost with anINACTIVEbadge + legend entry instead of a blank lane.mindp:startDate = todayinepics.ttlvia the pod write backend (setEpicStartDate). Verified live: the lane loses INACTIVE and grows an active bar starting at Today.Landing / i18n
loginCompleting, en + de).Demo seeds
Verification
npx tsc --noEmit→ clean.🤖 Generated with Claude Code