Context
Part of epic #12207 (foundation step 1). The offscreen "Neural Timeline" renderer is behaviorally content-agnostic but named for tickets; the PR + Discussion views will reuse it as-is.
The Fix
Rename Portal.canvas.TicketCanvas → a neutral TimelineCanvas (or relocate to src/canvas/Timeline.mjs — it has zero portal deps and already extends src/canvas/Base.mjs): update className + JSDoc, Helper.importTicketCanvas → importTimelineCanvas (one method, reused by all three types), and the two rendererClassName/rendererImportPath identity strings in the view bridge. Pure rename, zero behavior change. Confirm the single shared singleton is safe across content tabs (tabs unmount on switch — TabContainer unmountConfigs activeIndex:null).
Architectural Reality
apps/portal/canvas/TicketCanvas.mjs:54 (className), :207-224 (updateGraphData consumes only {nodes,startY,reset}), :236-420 (draw loop reads only node.x/y/radius/color). No issue semantics in the renderer.
Acceptance Criteria
Out of Scope
Per-type node-decoration variants (only if PR/Discussion later need different pulse visuals).
Related
Epic #12207. First foundation step (unblocks the view-glue promotion).
Context
Part of epic #12207 (foundation step 1). The offscreen "Neural Timeline" renderer is behaviorally content-agnostic but named for tickets; the PR + Discussion views will reuse it as-is.
The Fix
Rename
Portal.canvas.TicketCanvas→ a neutralTimelineCanvas(or relocate tosrc/canvas/Timeline.mjs— it has zero portal deps and already extendssrc/canvas/Base.mjs): update className + JSDoc,Helper.importTicketCanvas→importTimelineCanvas(one method, reused by all three types), and the tworendererClassName/rendererImportPathidentity strings in the view bridge. Pure rename, zero behavior change. Confirm the single shared singleton is safe across content tabs (tabs unmount on switch —TabContainer unmountConfigs activeIndex:null).Architectural Reality
apps/portal/canvas/TicketCanvas.mjs:54(className),:207-224(updateGraphDataconsumes only{nodes,startY,reset}),:236-420(draw loop reads onlynode.x/y/radius/color). No issue semantics in the renderer.Acceptance Criteria
Out of Scope
Per-type node-decoration variants (only if PR/Discussion later need different pulse visuals).
Related
Epic #12207. First foundation step (unblocks the view-glue promotion).