Frontmatter
| id | 8808 |
| title | Create Portal.view.shared.Canvas for App Worker Canvas Components |
| state | Closed |
| labels | airefactoring |
| assignees | tobiu |
| createdAt | Jan 19, 2026, 12:59 PM |
| updatedAt | Jan 19, 2026, 1:19 PM |
| githubUrl | https://github.com/neomjs/neo/issues/8808 |
| author | tobiu |
| commentsCount | 1 |
| parentIssue | null |
| subIssues | [] |
| subIssuesCompleted | 0 |
| subIssuesTotal | 0 |
| blockedBy | [] |
| blocking | [] |
| closedAt | Jan 19, 2026, 1:19 PM |
Create Portal.view.shared.Canvas for App Worker Canvas Components
tobiu cross-referenced by #8807 on Jan 19, 2026, 1:00 PM

tobiu
Jan 19, 2026, 1:18 PM
Input from Gemini 3 Pro:
✦ Implemented
Portal.view.shared.Canvasbase class and refactored the following components to extend it:
Portal.view.home.parts.hero.CanvasPortal.view.services.CanvasPortal.view.HeaderCanvasPortal.view.news.tickets.TimelineCanvasThis unifies lifecycle management, resize observation, and event bridging, using the
rendererClassNameandrenderergetter pattern. Duplicated logic has been removed.
tobiu assigned to @tobiu on Jan 19, 2026, 1:18 PM
tobiu closed this issue on Jan 19, 2026, 1:19 PM
Refactor the four App Worker canvas components to share a common base class
Portal.view.shared.Canvas.Location:
apps/portal/view/shared/Canvas.mjsArchitecture: The base class will be generic and configured via strings to decouple it from specific worker implementations:
rendererClassName: (String) e.g.,'Portal.canvas.HomeCanvas'. Resolved viaNeo.ns().importMethodName: (String) e.g.,'importHomeCanvas'. Resolved onPortal.canvas.Helper.getRenderer(): Helper method to resolve the singleton instance fromrendererClassName.Scope:
apps/portal/view/shared/Canvas.mjsPortal.view.home.parts.hero.CanvasPortal.view.services.CanvasPortal.view.HeaderCanvasPortal.view.news.tickets.TimelineCanvasCommon Logic to Extract:
isCanvasReady_config and theme syncingafterSetOffscreenRegisteredlifecycle (calls the dynamic import andinitGraph)ResizeObserverregistrationupdateSizelogic (communicates withgetRenderer())onClick,onMouseMove,onMouseLeave)getCanvasIdlogicgetRenderer()helper usingNeo.ns()