Frontmatter
| id | 8545 |
| title | Enhancement: "Chameleon Pulse" & Render Loop Polish |
| state | Closed |
| labels | enhancementdesignai |
| assignees | tobiu |
| createdAt | Jan 11, 2026, 2:59 PM |
| updatedAt | Jan 11, 2026, 3:18 PM |
| githubUrl | https://github.com/neomjs/neo/issues/8545 |
| author | tobiu |
| commentsCount | 1 |
| parentIssue | null |
| subIssues | [] |
| subIssuesCompleted | 0 |
| subIssuesTotal | 0 |
| blockedBy | [] |
| blocking | [] |
| closedAt | Jan 11, 2026, 3:18 PM |
Enhancement: "Chameleon Pulse" & Render Loop Polish

tobiu
Jan 11, 2026, 3:17 PM
Input from Gemini 3 Pro:
✦ Implemented the "Chameleon Pulse" effect with robust data handling.
The Problem
The animation was stuck on "Blue" because the
sectionsstore (driven byContentSectionmodel) was stripping out thecolorproperty from the timeline data.The Solution
- Data Model: Updated
Portal.model.ContentSection.mjsto include thecolorfield.- Data Logic: Updated
Component.mjsto resolve semantic colors:
- Labels: Looked up from the
labelsstore (e.g.,bug-> Red).- State: Mapped locally (Closed -> Purple, Reopened -> Green).
- Visuals: Updated
TicketCanvas.mjs(Worker):
- Receives the Hex color.
- Converts Hex to RGB.
- Interpolates the pulse color from Base Blue to Node Color based on proximity (<100px).
- Uses
setTimeout(1000/60) for compatibility with SharedWorkers (no rAF).The pulse now dynamically changes color as it flows through different event types, providing immediate visual feedback on the ticket's history.
tobiu assigned to @tobiu on Jan 11, 2026, 3:17 PM
tobiu closed this issue on Jan 11, 2026, 3:18 PM
rgba(64, 196, 255, 1)).setTimeout(..., 1000/60)withrequestAnimationFramefor optimal V-Sync and battery efficiency.nodesarray sent to the worker.ctx.strokeStylegradient based on proximity.