Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
130 commits
Select commit Hold shift + click to select a range
75f67e5
feat(charts): add the uPlot renderer alongside dygraph
novykh Sep 1, 2026
00e5085
docs(charts): correct the stale migration status and the consumer wiring
novykh Sep 4, 2026
0969af9
test: pin the jest timezone to UTC
novykh Sep 30, 2026
013cbde
fix(uplot): read the device pixel ratio from the uPlot constructor
novykh Sep 30, 2026
77e46e7
feat(uplot): calmer grid and axes with a colour-safe palette
novykh Sep 30, 2026
6f00832
docs(charts): modern chart card mockups and redesign plan
novykh Sep 30, 2026
9f1efae
feat(charts): add the modern design flavour foundation
novykh Sep 30, 2026
281bf9d
feat(charts): modern donut for d3pie charts
novykh Sep 30, 2026
4289bcd
feat(charts): modern ranked bars
novykh Sep 30, 2026
64e18c4
feat(gauge): modern SVG gauge with threshold zones and attention pill
novykh Sep 30, 2026
373a97e
feat(filters): modern flavour filter dropdowns
novykh Sep 30, 2026
0b166b5
feat(number): modern stat panel with change vs mean, sparkline and at…
novykh Sep 30, 2026
3d35f66
feat(easyPie): thin SVG ring for the modern flavour
novykh Sep 30, 2026
9a43358
docs(storybook): modern number and rings story
novykh Sep 30, 2026
2fd9e2d
feat(uplot): modern plot overlays for thresholds, annotations and ano…
novykh Sep 30, 2026
fb083aa
feat(uplot): dim unfocused series for the modern legend
novykh Sep 30, 2026
2164feb
feat(charts): adaptive modern legend that doubles as the hover readout
novykh Sep 30, 2026
dbebec1
feat(charts): modern chart card header, More menu and zoom chip
novykh Sep 30, 2026
8efbf14
feat(charts): modern table and group boxes
novykh Sep 30, 2026
6e86d7c
Merge branch 'modern/number' into feat/uplot-renderer
novykh Sep 30, 2026
f58657d
Merge branch 'modern/donut' into feat/uplot-renderer
novykh Sep 30, 2026
3fab935
Merge branch 'modern/table' into feat/uplot-renderer
novykh Sep 30, 2026
e1cf44d
Merge branch 'modern/dropdown' into feat/uplot-renderer
novykh Sep 30, 2026
60c4093
Merge branch 'modern/overlays' into feat/uplot-renderer
novykh Sep 30, 2026
7bbd4ca
Merge branch 'modern/legend' into feat/uplot-renderer
novykh Sep 30, 2026
8ecf0ae
Merge branch 'modern/chrome' into feat/uplot-renderer
novykh Sep 30, 2026
5e2511f
fix(charts): render the filter bar once under the modern header
novykh Sep 30, 2026
48d2584
docs(charts): record the modern flavour implementation tracks
novykh Sep 30, 2026
1a78c68
feat(charts): shared readout formatting for the modern flavour
novykh Sep 30, 2026
dc7d4aa
fix(charts): modern group boxes use one filter bar, the full row widt…
novykh Sep 30, 2026
fff1aab
fix(charts): calm stat and ring readouts and readable attention pills…
novykh Sep 30, 2026
fb66371
fix(charts): show names and compact values in the modern donut legend
novykh Sep 30, 2026
d84fb96
fix(charts): shared readouts and readable annotation pills in modern …
novykh Sep 30, 2026
96289f2
fix(charts): fit the modern gauge readout inside the arc and move att…
novykh Sep 30, 2026
f862e6f
fix(charts): open the settings on the first tab when no tab is requested
novykh Sep 30, 2026
7b9666f
fix(charts): keep reload, filters and legend toggles reachable in the…
novykh Sep 30, 2026
5612304
fix(charts): readable modern plot overlays and unit-free y ticks
novykh Sep 30, 2026
3d8ee8d
fix(charts): scale the modern legend to thousands of dimensions
novykh Sep 30, 2026
0ea44d9
Merge branch 'fix/chrome' into feat/uplot-renderer
novykh Sep 30, 2026
7afde59
Merge branch 'fix/legend' into feat/uplot-renderer
novykh Sep 30, 2026
8b21ab1
Merge branch 'fix/overlays' into feat/uplot-renderer
novykh Sep 30, 2026
f819760
Merge branch 'fix/gauge' into feat/uplot-renderer
novykh Sep 30, 2026
0716e17
Merge branch 'fix/donut' into feat/uplot-renderer
novykh Sep 30, 2026
26b4a2c
Merge branch 'fix/groupboxes' into feat/uplot-renderer
novykh Sep 30, 2026
2ed993b
fix(charts): choose modern readout decimals after rounding
novykh Sep 30, 2026
55b66a0
fix(charts): shared readout decimals in the modern table
novykh Sep 30, 2026
21868c3
docs(charts): overnight status, integration notes and open decisions …
novykh Sep 30, 2026
bdb3d31
docs(charts): modern dashboard tile mockups
novykh Oct 1, 2026
b3907d2
docs(charts): record round 3 decisions for tiles, legend and status
novykh Oct 1, 2026
faf18b2
feat(charts): draw the modern ring arc in the dimension colour
novykh Oct 1, 2026
d3f13a2
feat(charts): size the modern uPlot y-axis gutter to its labels
novykh Oct 1, 2026
64c28c4
feat(charts): live edge legend layout for the modern flavour
novykh Oct 1, 2026
9876a0d
feat(charts): one-line highlight chip in the modern footer
novykh Oct 1, 2026
de373d0
feat(charts): shared modern status indicator for header, number and g…
novykh Oct 1, 2026
0bbba1c
feat(charts): modern tile with hover actions, More menu and readout a…
novykh Oct 1, 2026
7b180e0
docs(charts): Modern/Tiles story with real SDK charts
novykh Oct 1, 2026
a7e9908
Merge branch 'r3/tiles' into feat/uplot-renderer
novykh Oct 1, 2026
81d1ae5
Merge branch 'r3/polish' into feat/uplot-renderer
novykh Oct 1, 2026
8ce81f1
Merge branch 'r3/legend' into feat/uplot-renderer
novykh Oct 1, 2026
dc307f1
fix(charts): one status signal per modern tile
novykh Oct 1, 2026
1ab323e
feat(charts): let consumer toolbox elements know they render in the m…
novykh Oct 1, 2026
61a4f7f
build: stop shipping stories, tests and mockups in dist
novykh Oct 1, 2026
5609a3a
test(charts): modern legend follows legendLayout changes at runtime
novykh Oct 1, 2026
8aeaa43
feat(charts): give modern tile bodies the full height at rest
novykh Oct 1, 2026
63dee16
chore(charts): drop descriptive comments from the redesign code
novykh Oct 1, 2026
3645c99
chore(charts): drop descriptive comments from the uPlot renderer and …
novykh Oct 1, 2026
0602ded
feat(charts): optional timeSeriesRenderer to run dygraph charts on uPlot
novykh Oct 1, 2026
db03b5f
test(charts): modern table fills exactly the cells the default table …
novykh Oct 1, 2026
a6b2b2b
docs(charts): modern table mockup
novykh Oct 1, 2026
f76fa92
feat(charts): one colour-safe palette for dygraph and uPlot
novykh Oct 1, 2026
c0f2311
docs(charts): record cloud-frontend scope exclusion
novykh Oct 1, 2026
6e24ac0
docs(charts): record cloud-frontend rollout decisions
novykh Oct 1, 2026
1e8eed5
feat(charts): modern table card chrome and redesigned cells
novykh Oct 1, 2026
8d0ee4f
docs(charts): modern table story shows the redesigned table
novykh Oct 1, 2026
3ea9ddc
fix(charts): number tiles show units once, skip delta on state metric…
novykh Oct 1, 2026
b212f16
fix(charts): modern table value headers align with numbers and leave …
novykh Oct 1, 2026
2d1e721
fix(charts): palette slot numbers resolve for selected and sparkline …
novykh Oct 1, 2026
af0adf9
fix(charts): tile scope line appears on header hover so it no longer …
novykh Oct 1, 2026
b802f7e
fix(charts): uPlot never pads a non-negative series below zero
novykh Oct 1, 2026
8cd0a9d
feat(charts): modern charts show the compact tooltip on hover with an…
novykh Oct 1, 2026
4cc5ce7
Revert "fix(charts): palette slot numbers resolve for selected and sp…
novykh Oct 1, 2026
1f39625
fix(charts): uPlot rebuilds its series when the payload reorders dime…
novykh Oct 1, 2026
5ba9b09
fix(charts): modern table keeps per-value scaling and units like the …
novykh Oct 1, 2026
00b11f5
feat(charts): modern zoom chip appears on chart hover or focus
novykh Oct 1, 2026
0c6092c
fix(charts): direct and live edge labels show each value's scaled unit
novykh Oct 1, 2026
3d22120
fix(charts): switching a non-time-series chart to a time-series type …
novykh Oct 1, 2026
42f7583
fix(charts): group boxes keep header and filters in default and minim…
novykh Oct 1, 2026
780fdaa
fix(charts): modern readouts use the default digits and per-value uni…
novykh Oct 1, 2026
a8ce52b
fix(charts): modern bars keep the chart dimensionsSort like main
novykh Oct 1, 2026
5370308
test(charts): modern bars follow the default bar order
novykh Oct 1, 2026
64a492a
fix(charts): modern number, easy pie and uPlot request colours in the…
novykh Oct 1, 2026
f88840c
style(charts): format number colour test
novykh Oct 1, 2026
cb7499b
docs(charts): anomaly ribbon mockups
novykh Oct 1, 2026
b35d614
feat(charts): modern anomaly shading, rate-coloured strip and header …
novykh Oct 1, 2026
e82c26f
fix(charts): anomaly shading snaps to pixels; story row for modern an…
novykh Oct 1, 2026
b478129
fix(charts): legend table keeps its header cell on hover and stays ou…
novykh Oct 2, 2026
e35c120
feat(charts): modern anomalies show every non-zero rate; badge only w…
novykh Oct 2, 2026
d4b1c98
docs(charts): anomaly badge mockups
novykh Oct 2, 2026
c1ec345
feat(charts): modern zoom state sits quietly in the header instead of…
novykh Oct 2, 2026
1f3c800
fix(charts): header zoom note shows only while the chart is hovered
novykh Oct 2, 2026
5bbeda2
fix(charts): tile and number readouts keep one size while hovering
novykh Oct 2, 2026
00a91c3
docs(charts): redesign wrap-up plan
novykh Oct 2, 2026
877f062
docs(charts): add external review to the wrap-up plan
novykh Oct 2, 2026
d337053
docs(charts): track the redesign wrap-up and drop the superseded uPlo…
novykh Oct 2, 2026
06dd1b8
chore(charts): declare used deps, drop unused loaders and fix the cov…
novykh Oct 2, 2026
30454d1
fix(charts): harden fetch, listeners and attributes; reset zoom retur…
novykh Oct 2, 2026
1260dc3
feat(charts): calm static skeletons for every chart and reduced-motio…
novykh Oct 2, 2026
75ac903
fix(charts): drawer loading states, accessible icon buttons and theme…
novykh Oct 2, 2026
0c80e77
fix(charts): uPlot range, hover and listener parity; anomaly spotligh…
novykh Oct 2, 2026
533e4a9
feat(charts): modern UI on netdata-ui bases, anomaly badge, and test …
novykh Oct 2, 2026
1f69b9e
docs(charts): add the SRE exploration audit
novykh Oct 2, 2026
2d8a24c
refactor(charts): modern UI shares menu, swatch, dot and numeral comp…
novykh Oct 2, 2026
33db114
v7.0.0-alpha.1
novykh Oct 2, 2026
366d502
feat(charts): per-chart legend layout while the global one is automat…
novykh Oct 5, 2026
b37dc8c
fix(charts): +N more always lists the remaining legend dimensions
novykh Oct 5, 2026
0c893e6
fix(charts): virtualize the +N more legend list
novykh Oct 5, 2026
236c077
Move modern chart header actions into a grouped More menu
novykh Oct 8, 2026
c07d469
Fade the modern filter toolbox in over the scope line, close tile fil…
novykh Oct 9, 2026
e72fae1
fix(charts): modern filter dropdown matches the modern table look; sw…
novykh Oct 12, 2026
a6f4e47
fix(charts): per-chart legend disables live edge where the chart cann…
novykh Oct 12, 2026
3642c23
feat(charts): subtle comet sparkle on loading skeletons
novykh Oct 12, 2026
cb36ef6
feat(charts): modern bars tint the whole row instead of a separate track
novykh Oct 12, 2026
a6bcfe9
chore(charts): skeleton sparkle mockup variants
novykh Oct 12, 2026
aaace1b
feat(charts): modern group boxes as a zoomable treemap with a pinned …
novykh Oct 12, 2026
487dcc9
feat(charts): compact 24px rows in modern bars
novykh Oct 12, 2026
b6e6891
chore(charts): group boxes and bars design mockups
novykh Oct 12, 2026
6561790
fix(charts): keep long treemap card actions and values inside the card
novykh Oct 12, 2026
dd1c82c
feat(charts): skeleton colours ease smoothly from neutral to green wh…
novykh Oct 12, 2026
59b54a3
feat(charts): loading skeletons for modern bars, number, table and th…
novykh Oct 12, 2026
3ada1de
v7.0.0
novykh Oct 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ node_modules
dist
coverage
storybook-static
.perf-results
/.local/
CLAUDE.md
.superpowers
docs/superpowers
.parity-results
15 changes: 0 additions & 15 deletions .storybook/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,21 +56,6 @@ const config = {
fullySpecified: false,
},
},
{
test: /\.(png\?.*|jpg\?.*|jpg|png)$/,
loader: "url-loader",
},
{
test: /\.md$/,
use: [
{
loader: "html-loader",
},
{
loader: "markdown-loader",
},
],
},
{
test: /\.svg$/,
use: [
Expand Down
1 change: 1 addition & 0 deletions .storybook/preview.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import React from "react"
import { ThemeProvider, StyleSheetManager } from "styled-components"
import isPropValid from "@emotion/is-prop-valid"
import { Flex, DefaultTheme, DarkTheme, GlobalStyles } from "@netdata/netdata-ui"
import "uplot/dist/uPlot.min.css"

const shouldForwardProp = (propName, target) => {
if (typeof target === "string") {
Expand Down
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ src/

- **Jest** with jsdom environment
- **Simple unit tests** focused on component rendering
- **Minimal coverage thresholds** (1% for branches/functions)
- **Coverage thresholds**: 50% statements, 40% branches, 47% functions, 50% lines (`jest/config.js`)
- **DOM testing** for rendered elements
- Test files colocated with source: `*.test.js`

Expand Down
307 changes: 307 additions & 0 deletions docs/charting-library-exploration.md

Large diffs are not rendered by default.

138 changes: 138 additions & 0 deletions docs/redesign-wrapup-plan.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
# Redesign wrap-up plan

Working list for closing the redesign branch (`feat/uplot-renderer`) and the cloud-frontend rollout.
Each item is fixed one at a time and checked off with its commit.

Status: `[ ]` todo · `[x]` done · `[-]` dropped / deferred · `[?]` verify first

Sources: four internal reviews (logic parity, cleanup, missing work, tests) on 2026-10-02 and the
external audit `docs/sre-exploration-audit.md` (2026-07-30, branch `explore/uplot-spike`; findings
must be re-verified on the current branch before fixing).

## A. Logic parity with main

Modern design (charts):

- [x] A1 Gauge unit disagrees with per-value scaled value — `modern/gauge/index.js:140,145`
- [x] A2 Tooltip lists dimensions hidden in the legend — `modern/legend/tooltip.js:114`
- [x] A3 Tooltip caps heatmaps at 6 rows (default shows all buckets) — `modern/legend/tooltip.js`
- [x] A4 Filter Reset keeps the edited selection — `filterToolbox/modern/dropdown.js`
- [x] A5 Donut sorts by value and keeps top 5 (d3pie: label-asc + small-segment grouping) — `modern/donut/getDonutData.js:38-55`
- [x] A6 Tile readout falls back to another dimension when the requested one is hidden — `modern/tile/readout.js`

uPlot renderer (opt-in):

- [x] A7 Stacked charts ignore `valueRange` — `uplot/index.js:382-383`
- [x] A8 Bar charts ignore `valueRange` / `includeZero`; static ranges unpadded — `uplot/index.js:377`
- [x] A9 Hover dots on stacked charts at raw value, not stack top — `uplot/index.js:833-837` (audit A2)
- [x] A10 Crosshair not snapped to a data row — `uplot/index.js:551`
- [x] A11 Root-level renderer change only reaches charts on chart-type change — `sdk/makeChart/timeSeriesRenderer.js:23`

## B. Scope decisions

- [x] B1 New palette applies to every chart (default + dygraph). Kept (palette C).
- [x] B2 geoMap cluster colours pinned to the old hex values — `cloud geoMap/constants.js`
- [x] B3 New Modern-only features (More menu toggles, Reload data, Show all dimensions, extra sorts, hidden filter columns). Confirmed.
- [x] B4 Shared chart.js theme (rollout decision 3): `cloud lib/chartjs/theme.js`, merged under each chart's own options in all Chart.js consumers; visual only, for everyone. Open: dark tooltip charts (billing, billingAtc, insights).
- [x] B5 Verified: a renderer toggle wrote `chartLibrary` into card state via spread propagation. Fixed: dygraph↔uplot swaps are not persisted — `cloud dashboards/spread/useSpreadPropagation.js`

## C. Cleanup (no behaviour change)

- [x] C1 Dead code in charts: `getContextUnitAttributes` + `max`/`sampleId` (`modern/table/scale.js`), `AttentionPill` + pill-ink helpers/tests, `badgeSize`, donut `formatWithUnit`, gauge `dotColor` + eslint-disable, redundant `isAnomalous` check, inline column/rate loop in `uplot/plotters/anomaly.js`
- [x] C2 Stale text: table story caption, mockups' 2% noise floor, `traceColor.js` comment
- [x] C3 cloud: single "Last 24 hours" default in the alert table change
- [x] C4 Plan doc `docs/uplot-design-refresh-plan.md`: mark superseded / reverted / deferred and record later decisions
- [x] C5 Test-only payload helpers shipped in dist (`makeWavePayload`, `makeTablePayload`, `makeHeatPayload`). Moved to `fixtures/`.

## D. Tests (high value only)

- [x] D1 Fix tests that cannot fail: `usePlotArea.test.js`, `chartContentWrapper.test.js:55-63`
- [x] D2 Readout keeps one size while hovering (tile + number)
- [x] D3 Sub-1% anomaly shows; calm window has no badge (literal colours)
- [x] D4 uPlot reuses the instance on refresh; rebuilds only when needed
- [x] D5 Modern readouts compared against the real default chart text
- [x] D6 cloud: alert card period ms→s via the real table
- [x] D7 Flaky modern table tests: the mock payload rotates rows by `Date.now()`, so paired renders got different data; tests now use a fixed window (and match rows by `data-id`) — 8 clean runs

## H. Skeletons

- [x] H1 B2 "Horizon" static skeletons for line, gauge (default + modern), easyPie, d3pie, groupBoxes — `components/skeleton`; slow-load colour shift kept
- [x] H2 Modern uPlot anomaly badge: HTML badge in the peak colour (pill with peak on wide plots), summary tooltip, spotlight on hover, click opens Correlate for the whole window (only when the drawer is available) — `modern/anomalyBadge.js`, `uplot/plotters/anomaly.js`

## E. Release

- [ ] E1 Charts release + cloud-frontend version bump (`drag.js` imports a branch-only module; `package.json` pins `^6.12.16`)

## F. External audit (verify on current branch first)

Correctness / reliability:

- [x] F1 Dimensions filter sort bound to `nodesSortBy` — `filterToolbox/dimensions.js:52` (audit C1)
- [x] F2 (reset returns to the last live window via `liveAfter`, fallback -900) Reset zoom hard-codes `moveX(-900)` — `sdk/makeNode.js:169-176` (audit C2)
- [-] F3 (already fixed or not applicable) Flat series render blank on uPlot (`padYRange` zero span) — `uplot/index.js` (audit A1)
- [-] F4 (deferred) No client-side fetch timeout — `fetchAgentData.js`, `fetchCloudData.js` (audit B1)
- [x] F5 Malformed payload wedges a chart — `camelizePayload.js:207-209`, `makeDataFetch.js` (audit B2)
- [x] F6 (cloud `src/charts/index.js` wraps every chart in `CrashBoundary size="inline"`; import cycle broken by importing `TimeseriesDummyChart` directly) No React error boundary per chart (audit C3)
- [x] F7 `errorMessage`-only payloads ignored — `makeDataFetch.js` (audit B4)
- [x] F8 `makeListeners.trigger` once-handling bug (audit B3)
- [x] F9 `makeKeyboardListener` unregister by stale index (audit B7)
- [x] F10 `parseDOM` discards parsed JSON (audit B8)
- [x] F11 `makeContainer.removeChild` emits wrong node/type (audit B6)
- [x] F12 `moveXDebounced` not cancelled on uPlot unmount (audit A4)
- [x] F13 `setTimeout(forceUpdate, 300)` not cleared in `useOnResize`/`usePlotArea` (audit F8)
- [x] F14 dygraph touch listeners not removed on unmount (audit F9)
- [-] F15 (deferred) Interaction state (`enabledHover`) not reset on unmount (audit B9)
- [x] F16 `loading` flickers during replacement fetch (audit B11)
- [-] F17 (already fixed or not applicable) `makeExecuteLatest` keeps fired timeout ids (audit B13)
- [-] F18 (already fixed or not applicable) `deepEqual` drops options on recursion (audit B12)

Performance (uPlot path):

- [-] F19 (already fixed or not applicable) Hover redraw recomputes geometry per mouse move across synced charts (audit F1)
- [x] F20 (returns the payload ids without copying; no caller mutates them) `getPayloadDimensionIds()` allocates per call (audit F2)
- [-] F21 (already fixed or not applicable) Selector layer re-renders with no value bail-out (audit F3)

Build / dependencies / CI:

- [-] F22 (separate PR) CI cannot fail a PR (no `pull_request`, `continue-on-error`, no lint) (audit G2)
- [x] F23 Undeclared deps: `lodash`, `scheduler`, `@testing-library/user-event` (audit G3/G11)
- [x] F24 Unused devDeps `babel-eslint`, `raw-loader`, `sass-loader` (audit G12)
- [x] F25 Storybook config references uninstalled loaders (audit G7)
- [x] F26 Docs claim 1% coverage; jest enforces 50/40/47/50 (audit G8)
- [x] F27 (19 plans deleted; `uplot-design-refresh-plan.md` kept, still referenced) Archive stale `docs/uplot-*.md` plans (audit G15)

UX / accessibility / visual:

- [x] F28 Compare / DrillDown drawers show no loading state (audit C4)
- [-] F29 (already fixed or not applicable) Search disabled on primary filter dropdowns (audit C8)
- [x] F30 Fullscreen has no Esc exit (audit C10)
- [x] F31 Custom compare period form fails silently (audit C12)
- [-] F32 (default flavour unchanged) Error badge does not truncate long messages (audit C17)
- [x] F33 Icon buttons have no accessible name (`withTooltip` drops `aria-label`) (audit E3)
- [x] F34 No visible focus ring on icon buttons (audit E9 / D7)
- [x] F35 (shared `helpers/reducedMotion`; skeleton redesign in `Mockups/Skeletons`) No `prefers-reduced-motion` for infinite animations (audit E8)
- [-] F36 (deferred) Canvas charts have no `role="img"` / `aria-label` (audit E1 partial)
- [x] F37 Hover popover / groupBox popover hardcode light-mode shadow (audit D3)
- [-] F38 (default flavour unchanged) Live values not tabular-nums in the default legend (audit D6)
- [x] F39 (removed `hasYlabel` incl. cloud `nodes/useCharts.js`, `compareData`, Point tab; `toolboxProps` is in use and stays) Dead attributes and commented scaffolding (`hasYlabel`, `toolboxProps`, `compareData`, drawer Point tab) (audit C14/C15)

Already addressed by the redesign (confirm and close): audit D1/D2 palette (replaced), audit A2 (= A9).

## G. External review (2026-10-02)

Redesign items:

- [x] G1 Attention can mix alerts: highest severity from summary/overlay, but value and time from any raised overlay; value formatting bypasses the shared readout — `modern/header/getAttention.js:70`, `modern/header/attention.js:26`
- [x] G2 (cited instances fixed; full modern pass pending decision: 45 `$` props and 56 raw styled elements in `src/components/modern` vs 5 and 9 on main) netdata-ui rule violations in modern UI: raw button with px radius/padding (`modern/header/moreMenu.js:59`), raw elements and px spacing (`modern/bars/index.js:35`), fixed RGB ramps (`modern/anomaly.js:6`), transient `$resizing` prop (`cloud charts/dashboard/item.js:26`), CSS radius instead of `round` (`cloud dashboards/components/cards/container.js:10`). Route through the design system; add tokens where missing.
- [x] G3 Duplicated left-element/status transform in `modern/header/index.js:13` and `modern/tile/index.js:25`; donut `formatWithUnit` (= C1)
- [x] G4 Each uPlot chart adds document mouse listeners and a mouseup timer — `uplot/index.js:1427,1435`. Share one listener.

User's navigation WIP (not redesign; listed so it is not lost):

- [-] G5 Navigation code and tests disagree: `useMenu.js:66` vs `taxonomies.test.js:66`, `sidebar/rail.js:246` vs `sidebar/index.test.js:138`, `menu/footerWidgets.js:60` vs `footerWidgets.test.js:5`
- [-] G6 Rail icon entries lost hover tooltips — `sidebar/rail.js:51` (README expects tooltips)
- [-] G7 `SpaceSortableRow` repeats `SortableSpaceLabel` — `sidebar/header/spaceSortableRow.js:11`

Larger initiatives, out of scope for this wrap-up: audit B14 (dataQuery convergence), F4 (columnar
payload), F7/G10 (drop dygraphs), G1/G4/G5 (test coverage of mocked engine / sync plugins), G13
(type checking), G14 (peer range matrix), E2/E4/E6/E7 (keyboard, dialog, colour-only status, listbox ARIA).
Loading