mirror of
https://github.com/Kpa-clawbot/meshcore-analyzer.git
synced 2026-05-12 17:54:43 +00:00
0a9a4c4223
## Summary Implements #946 — deterministic HSL coloring of packet markers by hash for visual propagation tracing. ### What's new 1. **`public/hash-color.js`** — Pure IIFE (`window.HashColor.hashToHsl(hashHex, theme)`) deriving hue from first 2 bytes of packet hash. Theme-aware lightness with WCAG ≥3.0 contrast against `--content-bg` (`#f4f5f7` light / `#0f0f23` dark, `style.css:32,55`). Green/yellow zone (hue 45°-195°) uses L=30% in light theme to maintain contrast. 2. **Live page dots + contrails** — `drawAnimatedLine` fills the flying dot and tints the contrail polyline with the hash-derived HSL when toggle is ON. Ghost-hop dots remain grey (`#94a3b8`). Matrix mode path (`drawMatrixLine`) is untouched. 3. **Packets table stripe** — `border-left: 4px solid <hsl>` on `<tr>` in both `buildGroupRowHtml` (group + child rows) and `buildFlatRowHtml`. Absent when toggle OFF. 4. **Toggle UI** — "Color by hash" checkbox in `#liveControls` between Realistic and Favorites. Default ON. Persisted to `localStorage('meshcore-color-packets-by-hash')`. Dispatches `storage` event for cross-tab sync. Packets page listens and re-renders. ### Performance - `hashToHsl` is O(1) — two `parseInt` calls + arithmetic. No allocation beyond the result string. - Called once per `drawAnimatedLine` invocation (not per animation frame). - Packets table: called once per visible row during render (existing virtualization applies). ### Tests - `test-hash-color.js`: 16 unit tests — purity, theme split, yellow-zone clamp, sentinel, variability (anti-tautology gate), WCAG sweep (step 15° both themes). - `test-packets.js`: 82 tests still passing (no regression). - `test-e2e-playwright.js`: 4 new E2E tests — toggle presence/default, persistence across reload, table stripe present when ON, absent when OFF. ### Acceptance criteria addressed All items from spec §6 implemented. TYPE_COLORS retained on borders/lines. Ghost hops stay grey. Matrix mode suppressed. Cross-tab storage event dispatched. Closes #946 --------- Co-authored-by: you <you@example.com> Co-authored-by: Kpa-clawbot <bot@example.invalid>