wrolpi/app/src
Roland 37e3dfd132 ui: route genuine success and failure through the roles
Sixteen call sites, chosen by reading each one rather than by grepping for a
hue.  Four sub-agents judged them independently against one rule: convert only
what genuinely means success or failure; identification, category and
decoration stay hue-named.

Converted:
  SMART drive health (all four branches -- PASS/WARN/FAIL/unknown)
  config validity: valid / invalid / empty
  "Failed to load preview"
  the two "Download error" triggers
  expired inventory items, desktop and mobile
  the refresh phases: complete / active / not reached
  a refresh Progress bar in its error state
  cookie status: Unlocked / Locked
  a chip-mismatch label on the flasher
  CPU load thresholds (LoadStatistic)
  the outcome of an API call in useAPIButton
  the gallery's "Danger zone" heading and its load readings

Left alone, deliberately:
  the file browser toolbar -- every action has its own colour to be told apart,
    and delete already uses role='danger' (Roland's ruling)
  diff add/remove in the config and inventory import previews.  Adding is not a
    success and removing is not a failure; in Overwrite mode the removals are
    exactly what the user asked for, and painting them danger would report their
    intended action as broken
  seasons in DatesSelector, the uploader star and favourite heart, TagIcon,
  downloader category buttons, "Recommended to Keep"

Three sites were wrong in a way worth naming.  Both "Download error" triggers
guard on the same condition and render the same modal, but one was `orange` and
the other `red` -- and `orange` is the single worst choice, byte-identical to
`--text` in night, so that error button was indistinguishable from an ordinary
control.  Config validity drew its valid state in `--violet`, which no user
parses as "valid".  And `LoadStatistic` -- the thing users actually watch on the
Status page -- rendered its warning threshold in that same invisible orange.

Also fixed a stale comment in Videos.js that claimed no token existed for these.

Two notes on the tests:

The first LoadStatistic test I wrote rendered the component and asserted the
inline colour.  jsdom REJECTS `color: var(--danger)` as an invalid declaration
and drops it, so every colour reads back as the empty string -- two of the four
assertions passed for that reason alone and would have kept passing with the
hues restored.  It is a source guard now, with the painted result asserted in
the browser instead.

That browser test then found something real: an uncoloured reading inherits
`--text`, which in night is 4.98:1 against `--warning`'s 4.91:1, so a machine
under load is marginally QUIETER than one that is fine.  Not fixed here.  The
only way up on a dark panel is lightness, and night's danger would desaturate
from #ff3e3e to about #ff5d5d -- trading the theme's "red only" character for
loudness.  That is a palette decision, so the test documents it and asserts what
does hold rather than quietly making it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-01 18:22:42 -06:00
..
api controller: VNC toggle, gated on the Desktop running 2026-07-29 18:10:05 -06:00
components ui: route genuine success and failure through the roles 2026-08-01 18:22:42 -06:00
contexts test: one place for fixtures, real providers instead of mocked context modules 2026-07-30 16:44:40 -06:00
hooks build: uninstall Semantic UI 2026-07-30 14:50:47 -06:00
themes test: act on review — and correct an overstated claim about the toast bug 2026-08-01 17:54:22 -06:00
types ui: the last Semantic UI file, and the stylesheet with it 2026-07-30 13:41:05 -06:00
api.js ui: thirty-five files off Semantic, leaving fifteen 2026-07-30 12:54:24 -06:00
App.css ui: give tables a real header, drop the column grid, quiet the row rules 2026-08-01 17:10:03 -06:00
App.js ui: the last Semantic UI file, and the stylesheet with it 2026-07-30 13:41:05 -06:00
DashboardPage.js ui: thirty-five files off Semantic, leaving fifteen 2026-07-30 12:54:24 -06:00
DashboardPage.test.js ui: thirty-five files off Semantic, leaving fifteen 2026-07-30 12:54:24 -06:00
Events.js ui: thirty-five files off Semantic, leaving fifteen 2026-07-30 12:54:24 -06:00
index.css ui: the last Semantic UI file, and the stylesheet with it 2026-07-30 13:41:05 -06:00
index.js Fixing changes before merge. 2023-02-08 21:18:51 -07:00
logo.svg Renaming examples to avoid grouping of pdf with ebooks. Reworking URLs for media files to avoid escaping url safe characters. 2023-03-29 13:46:39 -06:00
reportWebVitals.js Renaming examples to avoid grouping of pdf with ebooks. Reworking URLs for media files to avoid escaping url safe characters. 2023-03-29 13:46:39 -06:00
semantic-baseline.json ui: the last Semantic UI file, and the stylesheet with it 2026-07-30 13:41:05 -06:00
semantic-baseline.test.js build: uninstall Semantic UI 2026-07-30 14:50:47 -06:00
setupTests.js ui: Common.js and thirteen more files off Semantic 2026-07-30 11:55:39 -06:00
Tags.cy.js Video downloads have many more options. Downloads are migrated. 2024-11-28 09:48:57 -07:00
Tags.js ui: map the twelve icon names that were rendering as question marks 2026-08-01 16:30:20 -06:00
Tags.test.js ui: tags look like tags, and stay readable in every theme 2026-08-01 14:35:35 -06:00
test-fixtures.js test: check declared types, not just field names, and fix the three that were wrong 2026-07-30 17:34:36 -06:00
test-fixtures.test.js test: one place for fixtures, real providers instead of mocked context modules 2026-07-30 16:44:40 -06:00
test-utils.js test: the theme drives the colour scheme, and mockModule takes the module 2026-07-30 16:44:40 -06:00
test-utils.test.js test: the theme drives the colour scheme, and mockModule takes the module 2026-07-30 16:44:40 -06:00