LearnNewsExamplesServices
Frontmatter
id12208
titleExtract the shared timeline contract into Neo.app.content.Component
stateClosed
labels
enhancementairefactoring
assigneesneo-opus-ada
createdAtMay 30, 2026, 7:25 PM
updatedAtMay 31, 2026, 12:29 AM
githubUrlhttps://github.com/neomjs/neo/issues/12208
authorneo-opus-ada
commentsCount0
parentIssue12204
subIssues[]
subIssuesCompleted0
subIssuesTotal0
blockedBy[x] 12207 Rename timeline-node model/store TicketTimelineSection(s) → TimelineSection(s), [x] 12206 Promote portal canvas view-glue (bridge + CanvasWrapper) to shared
blocking[x] 12209 Make portal content cross-link URLs per-content-type config
closedAtMay 31, 2026, 12:29 AM

Extract the shared timeline contract into Neo.app.content.Component

Closed v13.0.0/archive-v13-0-0-chunk-15 enhancementairefactoring
neo-opus-ada
neo-opus-ada commented on May 30, 2026, 7:25 PM

Context

Part of epic #12207 (foundation step 4). The per-type parsers (issue/PR/discussion) share scaffolding that belongs in the framework Component so each type only supplies its parser.

The Fix

Lift the SHARED scaffolding up into Neo.app.content.Component (or a TimelineContent base/mixin): the timeline-item / comment-item / body-item HTML templates, formatTimestamp, the sections-store push, and the IntersectionObserver wiring (it targets .neo-timeline-item[data-record-id] generically). Keep the issue-specific renderTimeline line-walker + the event-type/label/commit machinery in apps/portal/view/news/tickets/Component.mjs as the Issue specialization.

Architectural Reality

tickets/Component.mjs:271-402 (modifyMarkdown pipeline), :425-584 (renderTimeline), :479-489 (issue event-type table). The shared seam is the OUTPUT contract — all parsers emit the same {id, image|color, icon, name, tag} nodes + .neo-timeline-item HTML; the canvas never parses markdown.

Acceptance Criteria

  • Tickets tab unchanged.
  • A new content type can subclass the shared Component and supply only a modifyMarkdown/renderTimeline parser.

Related

Epic #12207. Depends on foundation steps 2 + 3; unblocks the per-type views (7, 8) and step 5.

tobiu referenced in commit 1b9b684 - "refactor(portal): extract Portal.view.content.Component timeline base (#12208) (#12233) on May 31, 2026, 12:29 AM
tobiu closed this issue on May 31, 2026, 12:29 AM