#300: route icon-only controls through IconButton/IconLink #308
No reviewers
Labels
No Label
area:auth
area:docs
area:export
area:ops
area:storage
area:supply-chain
auth
backend
blocked
collab
deployment
docs
effort:L
effort:M
effort:S
frontend
plugins
qa
vs-nfd
vs-nfd:blocker
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: stwaidele/dorfteich#308
Loading…
Reference in New Issue
Block a user
No description provided.
Delete Branch "issue-300-icon-buttons"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #300.
The bell was misaligned because
.notifications-bell__buttonhad neither flex centring nor an icon size rule, so its svg sat inline on the text baseline and rendered at lucide's 24px default instead of the 1.15rem.icon-buttonenforces. It was bigger as well as higher.Changes
IconLinkadded next toIconButton, sharing one class helper. Three controls navigate (pond settings, graph, trash) and are links, not buttons — without a link twin they would have remained the one group gluing the class on by hand.className="icon-button …"usages across 9 files routed through the components, which is what enforces an accessible name on a control showing only an icon..notifications-bell__buttonremoved; the badge re-fitted to the 2rem box.titleUnread, de+en). The badge sits inside the control, soaria-labelmasked it and a screen reader heard "Notifications" without ever learning how many.icon-buttonon a rawbutton/a/Link, in both string and template-literal form.Deliberately unchanged
.toolbar-button(editor) stays its own visual system.topbar__searchkeeps its raw button — it carries visible text, so it is not an icon-only control.titlethat differs from its accessible name (it explains why a required plugin is locked).IconButtonspreads rest last, so the explicit title still wins.Verification
The ESLint rule was tested against a scratch file containing all three violating forms plus two legitimate ones: 3 errors raised,
other-buttonandIconButton className="icon-button--favorite"passed.pnpm typecheck, fullpnpm lint,pnpm i18n:checkand the web unit suite (131 tests) are green. No e2e locator is affected:social.spec.tsworks through the API, andexport.spec.ts/favorites.spec.tshang on CSS classes the component still emits.Not verified here: the optical result in a running browser. All three controls now resolve to the same CSS rule, so the alignment is structural rather than tuned by eye — but the visual check at default zoom and 200% remains open per the issue's acceptance criteria.
Also drops the graphify block from
CLAUDE.md; it duplicates the workspace-level instructions.