Completes the IconButton extraction by adding `size` and `radius` props and
converting the two remaining outliers that were left out of the first pass:
the desktop header logout button (+layout) and the home search submit button
(+page), both 36px with the medium radius.
IconButton now drives every icon button in the app (except profile/history's,
which the shared-HistoryList change removes separately). Defaults stay 32px /
small radius, so the four already-converted sites are untouched. Rendered
size, radius, and variant match the old markup — no behaviour change, no
version bump.
This also sets up applying the --tap-min touch floor in one place once the
touch-target change lands.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Five files hand-rolled a near-identical 32px `.icon-btn` (same size, hover,
and primary/danger variants). Extract a single IconButton.svelte component
so the treatment lives in one place. Converts the four sites with the
standard 32px form: collections detail, manga edit, upload, and the
chapter-pages editor.
The component takes a `variant` (plain/primary/danger) and spreads any
button attributes (onclick, disabled, aria-label, title, data-testid)
straight through; `type="button"` defaults but a caller can override. The
rendered button keeps the same class, styles, and DOM position, so layout
and behaviour are unchanged — no version bump.
Three icon-button sites are intentionally left out:
- The header (+layout) and home search button are 36px / different radius —
size outliers that need a size/radius prop before folding in.
- profile/history's copy is being removed in the shared-HistoryList change;
touching it here would just conflict.
A component (not a global class) avoids colliding with those remaining
local `.icon-btn` definitions.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>