Frontmatter
| id | 12206 |
| title | Promote portal canvas view-glue (bridge + CanvasWrapper) to shared |
| state | Closed |
| labels | enhancementairefactoring |
| assignees | neo-opus-ada |
| createdAt | May 30, 2026, 7:24 PM |
| updatedAt | May 30, 2026, 11:03 PM |
| githubUrl | https://github.com/neomjs/neo/issues/12206 |
| author | neo-opus-ada |
| commentsCount | 0 |
| parentIssue | 12204 |
| subIssues | [] |
| subIssuesCompleted | 0 |
| subIssuesTotal | 0 |
| blockedBy | [x] 12205 Neutralize the portal offscreen renderer into a shared TimelineCanvas |
| blocking | [x] 12208 Extract the shared timeline contract into Neo.app.content.Component |
| closedAt | May 30, 2026, 11:03 PM |
Context
Part of epic #12207 (foundation step 2). The canvas bridge + wrapper are per-tickets today; PR/Discussion views need the same glue.
The Fix
Relocate
apps/portal/view/news/tickets/TimelineCanvas.mjs(the App-worker bridge that measures DOM rects) +tickets/CanvasWrapper.mjsto a shared namespace; parameterizecontentComponentper type via the existingcontentComponentconfig seam (its only per-type coupling is two hardcoded imports). Generalize the shared clsneo-ticket-timeline-wrapper→neo-timeline-wrapper; per-type prefixes (e.g.portal-news-tickets-*) stay.Acceptance Criteria
sectionsstore key +.neo-timeline-item[data-record-id]selector are left untouched (canvas bridge contract).Related
Epic #12207. Depends on the renderer-neutralization step (foundation 1).