Parent: #9. Depends on #48 (B-4).
Scope
Two UI surfaces per design §3.6:
Popup (`create()`)
- `browser.action.openPopup()` on create intent
- Shows: origin, `rp.id`, `rp.name`, user name, entry picker (default: active entry → new sibling)
- "Create passkey here" / "Cancel"
- Preact component, match existing extension UX
In-page overlay (`get()`)
- Injected by content script into closed ShadowRoot
- Shows: origin, `rp.id`, candidate entries (name + last-used date), "Sign in" / "Cancel"
- Closed ShadowRoot + pointer-events isolation + `element.focus()` capture to resist click-jacking from host page
- z-index management against page chrome
Why in-page for get() but popup for create():
- `get()` is in a promise race with the spec timeout — popping a window is jarring and may hit popup blockers
- `create()` is user-initiated by a button click on the page — popup is fine; user expects a prompt
Acceptance
Parent: #9. Depends on #48 (B-4).
Scope
Two UI surfaces per design §3.6:
Popup (`create()`)
In-page overlay (`get()`)
Why in-page for get() but popup for create():
Acceptance