Use nldd-icon-button for the outgoing-post row actions #242

Closed
robbertbos wants to merge 1 commit from style/outbox-row-icon-buttons into main
Owner

The three outgoing-post actions - Bewerken, Verzend nu, Annuleren - appear twice, in QueuedRow and in ScheduledStrip, and the two copies had drifted apart:

Box Icon Colour
QueuedRow 32x28 (not square) 16px --semantics-content-secondary-color
ScheduledStrip 26x26 16px same
Card rows (after #236) 24x24 16px NLDD's neutral-transparent

QueuedRow's was not even square: a 16px icon plus 16px of horizontal padding exceeds the 28px min-width.

Both are now nldd-icon-button size="sm", so 32x32 in both places, measured. The rows grow accordingly - accepted deliberately, in favour of one reusable control over per-surface bespoke.

22 lines of dead CSS go from ScheduledStrip. QueuedRow keeps .btn, which still serves its two labelled buttons ("Opnieuw", "Zet terug naar concept") - those are an nldd-button case, not an icon button, and are left for a separate step.

Two things a mechanical swap would have got wrong

The danger hover. .btnDanger:hover turned the trash icon red, and a document-level rule cannot reach into a shadow root. variant="critical-transparent" would fix that but paints the trash red at rest, which it never was. Scoping the component's own --semantics-buttons-neutral-transparent-is-hovered-content-color on the host keeps today's behaviour through a public token.

The tests. Every selector in QueuedRow.test.ts was button[title=...] or button[aria-label=...], and NLDD sets neither on the host. Two tests failed loudly; the ones asserting .toBe(false) would have stayed green while matching nothing at all. They now go through one iconBtn() helper targeting nldd-icon-button[accessible-label^=...], with a comment saying why. ScheduledStrip has no spec at all, which is worth knowing.

display: flex on the hosts for the same reason as in #236: :host is inline-block and rendered the buttons 32x33.

Verification

vue-tsc, eslint (0 errors), vitest 689 in 94 files, vite build. Box size and colour measured in Chromium on the built bundle: 32x32 on both surfaces, all icons on the same colour as the card rows.

The three outgoing-post actions - Bewerken, Verzend nu, Annuleren - appear twice, in `QueuedRow` and in `ScheduledStrip`, and the two copies had drifted apart: | | Box | Icon | Colour | |---|---|---|---| | `QueuedRow` | 32x28 (not square) | 16px | `--semantics-content-secondary-color` | | `ScheduledStrip` | 26x26 | 16px | same | | Card rows (after #236) | 24x24 | 16px | NLDD's neutral-transparent | `QueuedRow`'s was not even square: a 16px icon plus 16px of horizontal padding exceeds the 28px `min-width`. Both are now `nldd-icon-button size="sm"`, so **32x32 in both places**, measured. The rows grow accordingly - accepted deliberately, in favour of one reusable control over per-surface bespoke. 22 lines of dead CSS go from `ScheduledStrip`. `QueuedRow` keeps `.btn`, which still serves its two labelled buttons ("Opnieuw", "Zet terug naar concept") - those are an `nldd-button` case, not an icon button, and are left for a separate step. ## Two things a mechanical swap would have got wrong **The danger hover.** `.btnDanger:hover` turned the trash icon red, and a document-level rule cannot reach into a shadow root. `variant="critical-transparent"` would fix that but paints the trash red *at rest*, which it never was. Scoping the component's own `--semantics-buttons-neutral-transparent-is-hovered-content-color` on the host keeps today's behaviour through a public token. **The tests.** Every selector in `QueuedRow.test.ts` was `button[title=...]` or `button[aria-label=...]`, and NLDD sets neither on the host. Two tests failed loudly; the ones asserting `.toBe(false)` would have stayed green while matching nothing at all. They now go through one `iconBtn()` helper targeting `nldd-icon-button[accessible-label^=...]`, with a comment saying why. `ScheduledStrip` has no spec at all, which is worth knowing. `display: flex` on the hosts for the same reason as in #236: `:host` is `inline-block` and rendered the buttons 32x33. ## Verification `vue-tsc`, eslint (0 errors), vitest 689 in 94 files, `vite build`. Box size and colour measured in Chromium on the built bundle: 32x32 on both surfaces, all icons on the same colour as the card rows.
Use nldd-icon-button for the outgoing-post row actions
All checks were successful
CI / release-scripts (pull_request) Successful in 7s
security-scan / SBOM (trivy) (pull_request) Successful in 11s
security-scan / Filesystem scan (trivy fs) (pull_request) Successful in 14s
security-scan / JS SCA (npm audit) (pull_request) Successful in 16s
security-scan / Python SAST (bandit) (pull_request) Successful in 23s
CI / pre-commit (pull_request) Successful in 27s
security-scan / Python SCA (pip-audit) (pull_request) Successful in 43s
test-build / build (frontend) (pull_request) Successful in 56s
test-build / build (backend) (pull_request) Successful in 58s
test-build / build (pull_request) Successful in 0s
CI / frontend-test (pull_request) Successful in 1m10s
CI / backend-test (pull_request) Successful in 1m43s
CI / e2e (pull_request) Successful in 3m58s
271ed8ddac
Bewerken, Verzend nu and Annuleren appear twice, in QueuedRow and in
ScheduledStrip, and the two had drifted to different sizes: 32x28 (not even
square, because a 16px icon plus 16px of padding exceeds the 28px min-width) and
26x26. Both are now nldd-icon-button size="sm", so 32x32 in both places, and the
rows grow accordingly. 22 lines of dead CSS go from ScheduledStrip; QueuedRow
keeps .btn for the two labelled buttons, which are an nldd-button case.

Two things the mechanical swap would have got wrong.

The danger hover. .btnDanger:hover turned the trash icon red, and a document
rule cannot reach into a shadow root. critical-transparent would fix that but
paints the trash red at rest, which it never was. Scoping the component's own
--semantics-buttons-neutral-transparent-is-hovered-content-color on the host
keeps today's behaviour with a public token.

The tests. Every selector in QueuedRow.test.ts was button[title=...] or
button[aria-label=...], and NLDD sets neither on the host - so two tests failed
loudly and the ones asserting .toBe(false) would have gone green while matching
nothing. They now target nldd-icon-button[accessible-label^=...] through one
helper, with a comment saying why.

display:flex on the hosts for the same reason as in CardRow: :host is
inline-block and rendered the buttons 32x33. Measured 32x32 on both surfaces.
robbertbos force-pushed style/outbox-row-icon-buttons from 271ed8ddac
All checks were successful
CI / release-scripts (pull_request) Successful in 7s
security-scan / SBOM (trivy) (pull_request) Successful in 11s
security-scan / Filesystem scan (trivy fs) (pull_request) Successful in 14s
security-scan / JS SCA (npm audit) (pull_request) Successful in 16s
security-scan / Python SAST (bandit) (pull_request) Successful in 23s
CI / pre-commit (pull_request) Successful in 27s
security-scan / Python SCA (pip-audit) (pull_request) Successful in 43s
test-build / build (frontend) (pull_request) Successful in 56s
test-build / build (backend) (pull_request) Successful in 58s
test-build / build (pull_request) Successful in 0s
CI / frontend-test (pull_request) Successful in 1m10s
CI / backend-test (pull_request) Successful in 1m43s
CI / e2e (pull_request) Successful in 3m58s
to ff1ddc527d
All checks were successful
CI / release-scripts (pull_request) Successful in 7s
security-scan / SBOM (trivy) (pull_request) Successful in 9s
security-scan / Filesystem scan (trivy fs) (pull_request) Successful in 13s
security-scan / Python SAST (bandit) (pull_request) Successful in 21s
security-scan / JS SCA (npm audit) (pull_request) Successful in 18s
CI / pre-commit (pull_request) Successful in 27s
security-scan / Python SCA (pip-audit) (pull_request) Successful in 42s
test-build / build (frontend) (pull_request) Successful in 54s
test-build / build (backend) (pull_request) Successful in 57s
test-build / build (pull_request) Successful in 0s
CI / frontend-test (pull_request) Successful in 1m12s
CI / backend-test (pull_request) Successful in 2m27s
CI / e2e (pull_request) Successful in 4m26s
2026-08-06 18:19:23 +00:00
Compare
Author
Owner

Closing: handled elsewhere, like #236 and #239.

What was in here: Bewerken, Verzend nu and Annuleren exist twice, in QueuedRow and ScheduledStrip, and the two copies had drifted to 32x28 (not even square - a 16px icon plus 16px padding exceeds the 28px min-width) and 26x26. Both went to nldd-icon-button size="sm", so 32x32 in both places, and 22 lines of dead CSS left ScheduledStrip.

Two traps for whoever redoes it:

  • The danger hover. .btnDanger:hover turned the trash red, and a document rule cannot reach a shadow root. critical-transparent fixes that but paints the trash red at rest, which it never was. Scoping the component's own --semantics-buttons-neutral-transparent-is-hovered-content-color on the host keeps today's behaviour with a public token.
  • The tests. Every selector in QueuedRow.test.ts was button[title=...] or button[aria-label=...], and NLDD sets neither on the host. Two failed loudly; the ones asserting .toBe(false) would have stayed green while matching nothing. They need to target nldd-icon-button[accessible-label^=...]. ScheduledStrip has no spec at all.

Also: display: flex on the hosts, or :host { display: inline-block } renders them 32x33.

Closing: handled elsewhere, like #236 and #239. What was in here: Bewerken, Verzend nu and Annuleren exist twice, in `QueuedRow` and `ScheduledStrip`, and the two copies had drifted to 32x28 (not even square - a 16px icon plus 16px padding exceeds the 28px min-width) and 26x26. Both went to `nldd-icon-button size="sm"`, so 32x32 in both places, and 22 lines of dead CSS left `ScheduledStrip`. Two traps for whoever redoes it: - **The danger hover.** `.btnDanger:hover` turned the trash red, and a document rule cannot reach a shadow root. `critical-transparent` fixes that but paints the trash red *at rest*, which it never was. Scoping the component's own `--semantics-buttons-neutral-transparent-is-hovered-content-color` on the host keeps today's behaviour with a public token. - **The tests.** Every selector in `QueuedRow.test.ts` was `button[title=...]` or `button[aria-label=...]`, and NLDD sets neither on the host. Two failed loudly; the ones asserting `.toBe(false)` would have stayed **green while matching nothing**. They need to target `nldd-icon-button[accessible-label^=...]`. `ScheduledStrip` has no spec at all. Also: `display: flex` on the hosts, or `:host { display: inline-block }` renders them 32x33.
robbertbos closed this pull request 2026-08-06 18:24:49 +00:00
Author
Owner

Opgegaan in #245, samen met #236 en #239. De commit is ongewijzigd overgenomen; #245 wijzigt daarbovenop het icoon van 'Verzend nu' (media-forward-end in plaats van de terugdraaiende klok) en van 'Opnieuw' (arrow-clockwise in plaats van het sync-icoon).

Opgegaan in #245, samen met #236 en #239. De commit is ongewijzigd overgenomen; #245 wijzigt daarbovenop het icoon van 'Verzend nu' (media-forward-end in plaats van de terugdraaiende klok) en van 'Opnieuw' (arrow-clockwise in plaats van het sync-icoon).
All checks were successful
CI / release-scripts (pull_request) Successful in 7s
Required
Details
security-scan / SBOM (trivy) (pull_request) Successful in 9s
Required
Details
security-scan / Filesystem scan (trivy fs) (pull_request) Successful in 13s
Required
Details
security-scan / Python SAST (bandit) (pull_request) Successful in 21s
Required
Details
security-scan / JS SCA (npm audit) (pull_request) Successful in 18s
Required
Details
CI / pre-commit (pull_request) Successful in 27s
Required
Details
security-scan / Python SCA (pip-audit) (pull_request) Successful in 42s
Required
Details
test-build / build (frontend) (pull_request) Successful in 54s
test-build / build (backend) (pull_request) Successful in 57s
test-build / build (pull_request) Successful in 0s
CI / frontend-test (pull_request) Successful in 1m12s
Required
Details
CI / backend-test (pull_request) Successful in 2m27s
Required
Details
CI / e2e (pull_request) Successful in 4m26s
Required
Details

Pull request closed

Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
robbertbos/waggle!242
No description provided.