wrolpi/app/src/components
Roland eba9bbf7de
review: close the mixed-unit gaps the scale left behind
Seven review comments, all valid.  The common thread is the one the guard was supposed to
catch and did not: geometry converted to rem beside geometry that stayed px.

The guard was narrower than its name.  It missed:

- `transform`, `flex` and `flex-basis`, so `translateX(26px)` and `flex: 1 1 200px` were
  invisible on properties nobody thought to list;
- every NEGATIVE length, because the lookbehind treated the minus sign as part of the
  preceding token -- `left: -7px` and `margin-top: -2.5px` position the eyelet on a tag whose
  diamond HAD been converted, and `right: -3px` / `bottom: -3px` place the corner badge on a
  converted icon.  Each is a piece of geometry that stopped tracking the piece it belongs to.

With both fixed it found nine values, including one no comment mentioned (`flex: 1 1 200px`).
All nine converted, except the three in a dead `.toggle` / `.slider` block: nothing has
referenced those classes since Toggle became a Mantine Switch, and it was ALREADY broken --
track and knob in rem, travel still `translateX(26px)`, so the thumb stopped ~4px short of a
54px track.  Dead CSS that is also wrong is a trap for whoever revives it, so it is deleted.

The tag eyelet is centred with `translateY(-50%)` rather than a negative margin of half its
own height, so the two pieces cannot drift again whatever the scale.

Also from the review:

- A runtime check, which is what the source guards were missing.  Three cases in
  ui-layout.cy.js measure the real thing: the root font-size is the declared multiple of 16,
  our text AND a Mantine control both grow by the same factor when the scale changes, and a
  hairline does not.  The second is the one that catches `theme.scale` being set and silently
  cancelling the root.
- `max-height: max(..., 56.25cqw)` now follows a plain rem declaration.  An engine without
  container query units throws out the whole declaration, which would have left the poster
  with NO cap -- a portrait cover standing as tall as the card is wide.  Older engines clamp;
  newer ones take the second.
- `pxToRem` in components/ui/scale.ts, replacing the `/ 16` written out in CardGroup and
  Placeholder.
- The map overlays: 20 values across the layer panel, add-pin dialog, search panel and
  context menu, whose type had grown 10% while their padding had not.  Left in px on purpose:
  the context menu's `left`/`top` (a real click coordinate), maplibre's own `ScaleControl`
  maxWidth, and the `calc(100% - 100px)` reserve for maplibre's px-sized controls.  The
  `100vh - 120px` reserve DID become rem, since the chrome it reserves for is ours.
- The keyboard-shortcuts spec no longer deletes `.mantine-Notifications-root` from the DOM.
  The reviewer was right that it is brittle; the endpoints are mocked instead, now that the
  probe named them: `/api/tag`, `/api/events/feed`, `/api/files/search` and
  `/api/files/worker_status`.  Two of those were already "mocked" as `/api/tags` and
  `/api/events`, which nothing calls -- the wrong paths were the reason a toast appeared at
  all.  Verified under CI's condition (`forceNetworkError` on everything unmocked): 12
  passing with no DOM surgery.

What is NOT done, deliberately: about 176 numeric geometry values remain in 23 feature files.
The map overlays were the visible ones.  Sweeping the rest is a change to 23 files nobody has
reviewed, so instead the guard's name now says "in our stylesheets" rather than implying the
whole app, and a new ratchet keeps numeric geometry out of the component library so the
eleventh inline `gap: 10` cannot be added there.

Both new guards planted against.  Verified: 1142 jest / 65 suites, 251 ui-layout + 10
modal-stack component tests, all 50 e2e specs, clean build, map overlays measured to track the
scale (panel minWidth 200 -> 220, search 320 -> 352) and screenshotted.
2026-08-08 18:05:51 -06:00
..
admin ui: only the top modal answers Escape, and the audited widths 2026-08-08 18:05:49 -06:00
calculators ui: scale the whole interface by 10%, off the root font-size 2026-08-08 18:05:51 -06:00
collections ui: only the top modal answers Escape, and the audited widths 2026-08-08 18:05:49 -06:00
inventory ui: only the top modal answers Escape, and the audited widths 2026-08-08 18:05:49 -06:00
ui review: close the mixed-unit gaps the scale left behind 2026-08-08 18:05:51 -06:00
AddToPlaylist.js ui: Common.js and thirteen more files off Semantic 2026-08-08 18:04:00 -06:00
Apps.js fix: break the import cycle that put useCalculators in the TDZ 2026-08-08 18:05:47 -06:00
Archive.js ui: cards get legible titles, contained posters, and meta beside the title 2026-08-08 18:05:47 -06:00
ArchivePreview.js ui: Common.js and thirteen more files off Semantic 2026-08-08 18:04:00 -06:00
BulkTagModal.js ui: only the top modal answers Escape, and the audited widths 2026-08-08 18:05:49 -06:00
BulkTagModal.test.js ui: migrate Downloads, Upload, and BulkTagModal off Semantic 2026-08-08 18:04:02 -06:00
Calculators.js ui: fix the cypress failures, and two real defects behind them 2026-08-08 18:04:01 -06:00
CbzViewer.js ui: Common.js and thirteen more files off Semantic 2026-08-08 18:04:00 -06:00
Channels.cy.js Moving form fields. 2025-12-06 15:11:37 -07:00
Channels.js ui: only the top modal answers Escape, and the audited widths 2026-08-08 18:05:49 -06:00
Common.js style: spell it "color" everywhere 2026-08-08 18:05:50 -06:00
Common.test.js style: spell it "color" everywhere 2026-08-08 18:05:50 -06:00
DatesSelector.js ui: thirty-five files off Semantic, leaving fifteen 2026-08-08 18:04:01 -06:00
DesktopToggle.test.js ui: Common.js and thirteen more files off Semantic 2026-08-08 18:04:00 -06:00
Docs.js ui: migrate Docs.js and Zim.js off Semantic UI React 2026-08-08 18:04:01 -06:00
DomainEditPage.test.js app: handle form fetch failures without unhandled rejection 2026-07-16 19:40:28 -06:00
DomainsPage.test.js Reformatting code. 2025-12-06 15:11:37 -07:00
DomainTagging.test.js test: one place for fixtures, real providers instead of mocked context modules 2026-08-08 18:04:04 -06:00
DonatePage.js ui: only the top modal answers Escape, and the audited widths 2026-08-08 18:05:49 -06:00
Download.cy.js build: uninstall Semantic UI 2026-08-08 18:04:03 -06:00
Download.js ui: thirty-five files off Semantic, leaving fifteen 2026-08-08 18:04:01 -06:00
Download.test.js Reformatting code. 2025-12-06 15:11:37 -07:00
ErrorBoundary.js ui: nine leaf files off Semantic, and the components they needed 2026-08-08 18:04:00 -06:00
FileBrowser.js review: record why make-directory is wider than rename 2026-08-08 18:05:51 -06:00
FileBrowser.test.js test: the theme drives the colour scheme, and mockModule takes the module 2026-08-08 18:04:04 -06:00
FilePreview.js ui: only the top modal answers Escape, and the audited widths 2026-08-08 18:05:49 -06:00
FilePreview.test.js File preview: Open in Slicer button for STL/3MF files. 2026-07-05 13:31:40 -06:00
Files.js ui: scale the whole interface by 10%, off the root font-size 2026-08-08 18:05:51 -06:00
Flasher.js ui: scale the whole interface by 10%, off the root font-size 2026-08-08 18:05:51 -06:00
Flasher.test.js ui: migrate Flasher.js off Semantic UI React 2026-08-08 18:04:02 -06:00
Headline.js ui: nine leaf files off Semantic, and the components they needed 2026-08-08 18:04:00 -06:00
HelpModal.js ui: thirty-five files off Semantic, leaving fifteen 2026-08-08 18:04:01 -06:00
KeyboardShortcutsProvider.js ui: only the top modal answers Escape, and the audited widths 2026-08-08 18:05:49 -06:00
Map.js ui: scale the whole interface by 10%, off the root font-size 2026-08-08 18:05:51 -06:00
Map.test.js review: name the icon-only controls, and make two guards mean what they say 2026-08-08 18:05:50 -06:00
MapSearchView.js ui: centre the pagination strip 2026-08-08 18:05:47 -06:00
MapViewer.js review: close the mixed-unit gaps the scale left behind 2026-08-08 18:05:51 -06:00
Nav.js style: spell it "color" everywhere 2026-08-08 18:05:50 -06:00
otp.js Move One-Time Pad encryption to the browser (#479) 2026-06-13 13:52:34 -06:00
otp.test.js Move One-Time Pad encryption to the browser (#479) 2026-06-13 13:52:34 -06:00
Placeholder.js ui: Common.js and thirteen more files off Semantic 2026-08-08 18:04:00 -06:00
Playlists.js ui: Channels.js and Playlists.js off Semantic 2026-08-08 18:04:01 -06:00
Playlists.test.js Add ordered collections (playlists): polymorphic items + item API (#475) 2026-06-11 19:46:34 -06:00
Search.js ui: the corner triggers, the More button, and the search modal 2026-08-08 18:05:49 -06:00
SearchFilterModal.test.js ui: thirty-five files off Semantic, leaving fifteen 2026-08-08 18:04:01 -06:00
Share.js ui: only the top modal answers Escape, and the audited widths 2026-08-08 18:05:49 -06:00
ShortcutHint.js Displaying cmd+k/ctrl+k global search keyboard shortcut suggestion. 2026-02-23 16:07:22 -07:00
SortableTable.js ui: nine leaf files off Semantic, and the components they needed 2026-08-08 18:04:00 -06:00
Tables.js ui: nine leaf files off Semantic, and the components they needed 2026-08-08 18:04:00 -06:00
TaggedDeleteConfirmModal.js ui: let a confirmation choose its width 2026-08-08 18:05:51 -06:00
TaggedDeleteConfirmModal.test.js ui: let a confirmation choose its width 2026-08-08 18:05:51 -06:00
Theme.tsx ui: toasts move to the top right, get readable titles, and get tests 2026-08-08 18:05:44 -06:00
ThemeProvider.test.js test: act on review — observe the wiring, and stop the soft assertions 2026-08-08 18:05:45 -06:00
ThemeSamplePage.js ui: scale the whole interface by 10%, off the root font-size 2026-08-08 18:05:51 -06:00
Upload.js ui: migrate Downloads, Upload, and BulkTagModal off Semantic 2026-08-08 18:04:02 -06:00
Vars.js Restore "Most Views" download order 2026-07-07 16:34:50 -06:00
VideoPlayer.js ui: migrate VideoPlayer.js off Semantic UI React 2026-08-08 18:04:01 -06:00
VideoPlayer.test.js videos: address review — tighten auto-caption detection 2026-07-16 18:29:18 -06:00
Videos.js ui: scale the whole interface by 10%, off the root font-size 2026-08-08 18:05:51 -06:00
VncToggle.test.js ui: Common.js and thirteen more files off Semantic 2026-08-08 18:04:00 -06:00
Zim.js fix: an unnamed language code took down the whole Zim manage page 2026-08-08 18:05:49 -06:00
Zim.test.js fix: an unnamed language code took down the whole Zim manage page 2026-08-08 18:05:49 -06:00