Skip to content

fix(ui): suppress password-manager autofill icons on form inputs#210

Open
patrickrb wants to merge 5 commits into
mainfrom
fix/suppress-password-manager-icons
Open

fix(ui): suppress password-manager autofill icons on form inputs#210
patrickrb wants to merge 5 commits into
mainfrom
fix/suppress-password-manager-icons

Conversation

@patrickrb
Copy link
Copy Markdown
Owner

Summary

  • Password managers (LastPass, 1Password) were attaching their autofill UI to ham-radio data fields — callsign, RST, datetime, table search, etc. — none of which are credentials.
  • Set autoComplete="off" plus data-lpignore / data-1p-ignore / data-form-type="other" as defaults on the shared Input component and the Combobox search input.
  • Patched the five raw <input> elements that bypass the shared component (new-contact callsign + RST sent/received, dashboard table search, combobox internal search).
  • Auth/credential forms (login, register, LoTW password, station password) keep working because they pass explicit autoComplete values like "email" / "current-password" / "new-password", which override the new default via prop spread.

Test plan

  • With LastPass installed: open /new-contact, /search, /dashboard, /profile, /stations/<id>/edit, and the edit-contact dialog from the dashboard — no LP icons should appear on data fields (callsign, RST, datetime, name, city, club callsign, operator name, table search).
  • /login, /register, the LoTW password field, and the station password field still show the password-manager autofill UI (since they pass explicit autoComplete values).
  • npm run typecheck clean
  • npm run lint clean

🤖 Generated with Claude Code

Password managers (LastPass, 1Password) were attaching their autofill UI
to ham-radio data fields like callsign, RST, datetime, etc. — fields
that have nothing to do with credentials.

Set autoComplete="off" and the per-manager opt-out data attributes
(data-lpignore, data-1p-ignore, data-form-type="other") as defaults on
the shared Input component and the combobox search input. Patched the
five raw <input> elements that bypass the shared component too
(new-contact callsign + RST sent/received, dashboard table search,
combobox). Auth forms (login/register, LoTW password, station password)
already pass explicit autoComplete values, which still override.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@vercel
Copy link
Copy Markdown

vercel Bot commented May 12, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
nodelog Ready Ready Preview, Comment May 12, 2026 3:23am

Request Review

…nore

LastPass ignores data-lpignore on the search page callsign input because
the filter fields aren't inside a <form> — LP treats standalone inputs
more aggressively than form-bound ones. Wrapping the filters in a form
with autoComplete="off" gives LP a form context to bind to, and it then
honors the per-input opt-out attrs.

Search is debounced on filter change, so the form has no real submit
action — onSubmit calls preventDefault to keep Enter from triggering a
page navigation.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
LastPass keeps attaching its autofill icon to the search-page callsign
input despite data-lpignore being set and the fields being wrapped in
a <form>. Switching the text filters to type="search" tells LP these
are search inputs, which it skips entirely.

Applied to callsign, name, qth, and gridLocator — the four free-text
filter fields. Semantically these are search inputs anyway, so the
type change matches their actual role. (Browser-default styling of
search inputs is suppressed by the shared Input component's own CSS.)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The data-lpignore / data-1p-ignore attrs we set as defaults on the
shared Input component aren't honored on every field — LP keeps
attaching its icon to fields like profile name, station-edit city /
operator-name / club-callsign, and the new-contact datetime picker.

Adding a global CSS rule that:
- Hides the LP/1P icon overlay sibling elements that get injected
  next to inputs already opted out via the data-* attrs.
- Resets background-image on opted-out inputs (covers the inline-
  injection variant some LP versions use).
- Hides the WebKit credentials-auto-fill pseudo-element as a backup.

This is the catch-all for fields where type="search" isn't a fit
(date/datetime, plain text inputs that need normal browser behavior).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The CSS selectors in the previous attempt were guesses for an older LP
variant — the actual injection is <svg data-lastpass-icon="true">
positioned absolutely over the input, ignoring data-lpignore.

Replacing the speculative selectors with the real one. Also adding
parity selectors for 1Password / Dashlane / Bitwarden so any future
manager that injects its standard marker is also suppressed.

Tradeoff: hides LP's in-field icon on the auth forms too. The forms
still autofill correctly — users trigger LP via the extension's
keyboard shortcut or the dropdown that appears when focused. Only
the in-field icon overlay is hidden.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant