* WIP parking changes, currently created a small helper for notifications which checks if we should defer notifications due to passkey UI
* remove isCredentialRequestInProgress, update tests, early return on null activeRequest in shouldDeferVaultNotification
* preserve isCredentialRequestInProgress
* pass addedElements to checkForNewShadowRoots
* Fix checkForNewShadowRoots latch and nested-shadow traversal
Two bugs in checkForNewShadowRoots, addressed together because they share
the function and the test surface:
1. pageContainsShadowDom resolved at init() and never re-evaluated. On
sites that attach shadow DOM after init (e.g., hbomax.com — SPAs that
boot their custom-element renderers post-LOAD), the short-circuit
blocked all detection for the rest of the session.
2. The narrow scan used el.querySelectorAll("*"), which does not pierce
shadow boundaries. A shadow host nested inside another shadow root was
invisible to the scan even when the latch was on.
Changes:
- Narrow the latch short-circuit: fires only when both
pageContainsShadowDom is false AND addedElements is empty.
- markShadowDomPresent: a named, one-way sticky-ratchet transition that
flips the latch when the narrow scan finds a root post-init.
- scanForNewShadowRootInSubtree: a depth-bounded recursive helper that
pierces nested shadow boundaries (MAX_DEEP_QUERY_RECURSION_DEPTH = 4).
- pendingMutationAddedElements: now Set<Element>; isConnected filter at
the debounced flush skips dead trees.
* Ancestor suppression and set management.
* Swap MutationRecord[][] for el->set<attr>; swap-on-drain, clear maps, clear shadow-root candidate on overflow and expose stats.
* Short-circuit checkMutationsInShadowRoots when pageContainsShadowDom is false
* Narrow requirePageDetailsUpdate to flag-only; schedule in debounce wrapper
* Collapse observedShadowRoots WeakSet into knownShadowRoots Set
* Gate new-shadow-root detection on addedNodes.length > 0
* Reap detached shadow roots from knownShadowRoots in the drain
* Instrument observer hot paths with stopwatch and fieldsReaped counter
* Remove autofill observer instrumentation.
* Reap unconditionally since shadow hosts may obscure mutated nodes.
* De-abbreviate; reap->purge; explanatory comment on cap.
* Revert "Reap unconditionally since shadow hosts may obscure mutated nodes."
This reverts commit 6637bfd65c.
* Unconditionally purge in processMutations.
---------
Co-authored-by: addisonbeck <github@addisonbeck.com>
* [PM-34497] Extend queryDeepSelector to traverse same-origin iframes
* [PM-34497] Adjust focused field rects by iframe offset for DeepSelector traversal
* [PM-34497] Separate iframe and shadow DOM traversal in queryDeepSelector
* [PM-34497] Fix implicit any type error on next variable in queryDeepSelector
* [PM-34497] Route iframe >>> targeting rule selectors to the correct frame to fix field position
* [PM-34497] Use this.sendExtensionMessage for consistency and testability
* [PM-34497] Remove unnecessary updateOverlayCiphers call
* [PM-34497] Use loop index for targeted field opid uniqueness
* [PM-34497] Inline traverseIframeBoundary at its single call site
* [PM-34497] Add deep selector tests for nested shadow roots and iframes
* [PM-34497] Tag-qualify selectors in deep selector iframe tests
* [PM-34497] Add FIXME for authoritative iframe-vs-shadow boundary handling
---------
Signed-off-by: Ben Brooks <bbrooks@bitwarden.com>
* fix(fido2): fall back to browser for hardware/CTAP1 keys not in vault
* fix(fido2): remove vault-lookup fallback, keep transport-only fallback
* refactor(fido2): replace parallel transport array with single allowedCredentials descriptor list
---------
Co-authored-by: kmancusi0105 <kmancusi@bitwarden.com>
* adding bulk actions bar
* responsive bulk actions bar
* allow for custom position of menu
* remove border from compact container
* do not screenshot table story
* supress tooltip showing when a menu is open
* updated docs
* add aria-label to icon only actions
* add aria-label to additional actions button
* fix spec descriptions
* add missing translations
* more grammatically corrrect annoucement
* have consumer provide their own menu
* use data holder components to solve for menu complexities
* use actual icon
* fix trigger being added twice
* rebuild focusKeyManager in case actions change
* address strong agree feedback comments
* update spacing tovisually align dividers
* rename input to avoid collision with popover/coachmark position input
* merge positions
* fix test
* simplify compact mode logic
* more verbose keydown handling for a11y
* remove commented code left in error
* [CL-1046] Add no-bit-dialog-wrapper lint rule
Errors when <bit-dialog> or <bit-simple-dialog> appears inside any
parent HTML element. The dialog selector should be applied as an
attribute on the root element (e.g. <form bit-dialog>) so that the
form receives the dialog's height styling.
* Migrate admin console dialogs to new form pattern
Updates organization member, group, collection, provider, and domain verification dialogs to use <form bit-dialog> pattern following the component library updates.
* Migrate auth settings dialogs to new form pattern
Updates two-factor authentication, WebAuthn, and emergency access dialogs to use <form bit-dialog> pattern following the component library updates.
* Migrate Secrets Manager dialogs to new form pattern
Updates project, service account, access token, and secret dialogs to use <form bit-dialog> pattern following the component library updates.
* Migrate remaining dialogs to new form pattern
Applies the <form bit-dialog> / <form bit-simple-dialog> attribute selector
pattern to the rest of the codebase, satisfying the no-bit-dialog-wrapper
lint rule. 55 templates across auth, admin console, billing, vault,
key management, secrets manager, provider, dirt integrations, importer,
browser, and desktop apps.
* Migrate key rotation dialog to new form pattern
* prune desktop packages
* Fix @napi-rs/cli version mismatch in desktop napi workspace
Aligns package.json declaration with the locked version (3.2.0) to
resolve npm workspace inconsistency that was blocking ng update.
* update Storybook to v10
* update Angular to v21
* override jest in ng builder
* Add jest-environment-jsdom as explicit dependency
Previously installed as a side effect of a jest@29 override; removing
that override caused it to disappear from node_modules.
* Add .claude/worktrees/ to .gitignore
* Restore @napi-rs/cli to 3.5.1 to match main
* Pin jest-environment-jsdom to 29.7.0 and add to renovate config
* Override jest-environment-jsdom to 29.7.0 in build-angular context
* Add isolatedModules to libs/subscription tsconfig.spec.json to fix Angular 21 module resolution
* Change moduleResolution to bundler for Angular 21 subpath export compatibility
* Add isolatedModules to Angular libs with old spec tsconfig pattern
* Disable emitDecoratorMetadata in spec tsconfigs with isolatedModules
* Fix HostListener event parameter types for Angular 21 compiler strictness
* Revert accidental change to access-selector spec
* Remove accidentally generated desktop package-lock.json
* Fix type-only imports/exports caught by Rolldown in Storybook v10/Vite v8
* fix vault-wrapper type error from Angular 21 stricter generic inference
ngComponentOutlet accepts Type<unknown>; annotate computed() explicitly
since VaultComponent is generic and VaultOrigComponent is not, preventing
TypeScript from inferring a compatible union constructor type.
* Fix kitchen-sink interaction tests for Storybook v10
Replace fire-and-forget navigateTo + synchronous getByRole with
navigateAndWaitFor<T>, which sets the hash and retries the ready
callback via waitFor. Storybook v10 starts play functions before
Angular's initial router navigation completes, so synchronous DOM
queries after navigation were failing intermittently.
* Provide ZoneJS change detection scheduler for Storybook stories
Angular 21 no longer sets up the ZoneJS change detection scheduler by
default in bootstrapApplication. Storybook's Angular renderer uses
bootstrapApplication internally and does not add provideZoneChangeDetection
automatically, so Default CD components relying on zone.js to trigger
re-renders after async operations were not updating before Chromatic
snapshots.
* Wait for dialog/side nav to render before Chromatic snapshot
After userEvent.click the dialog and side nav open asynchronously.
Without an explicit waitFor, Chromatic captures the snapshot before the
resulting UI state is present.
* Fix kitchen-sink waitFor: re-query side nav button, use querySelector for dialog
- openSideNav: re-query the toggle button inside waitFor to avoid reading
a stale DOM reference after Angular re-renders the element post-click
- SimpleDialogOpen / VirtualScrollBlockingDialog: replace getByRole("dialog")
with querySelector("cdk-dialog-container") to avoid testing-library's
visibility check failing on a momentarily inaccessible overlay element
* Revert kitchen-sink stories to main
* Bump Angular, Storybook, and ng-select to latest patch versions
* Trigger pre-commit hooks on merge
* Regenerate package-lock.json with --force to fix npm ci sync
* WIP updated tab styles and added responsive behavior
* fixes after converting class properties to readonly signals
* - updated host binding to component definition
- converted static class properties to `readonly`
* fixed overflow more button tabindex
* - named `tw-group` in `tab-list-item.directive`
- exported `tabListContainerGap` px value
* migrated `@Input` to `model`
* added tab ordering behavior when selecting from overflow menu
* - updated tabs mdx and stories
- updated tab header margin
- fixed selected tab bottom border not displaying
- fixed keyboard nav between tabs
* fixed type error
* - added 'preserveContentTabs' and 'keyboardNavigation' stories to mdx
- updated 'preserveContent' jsdoc to fix formatting in story
* renamed to `TAB_LIST_CONTAINER_GAP`
* - removed `tw-border-0`
- added "more" translation
* added "more" translation to desktop and browser
* added new line
* updated navigation tabs to include 'bitLabelDirective', trailing icons, overflow responsive behavior
* - removed horizontal spacing from tab group and tab body content
- updated tabs in dialog story and 'header' component to horizontally align tabs correctly
* added "more" translation to kitchen-sink stories
* fixed 'EmptyTab' story for overflow tab behavior
* fix chromatic build error
* updated to `contentChild()`
* fixing keyboard navigation
* add specs for tabs components
* remove debugging text
* remove unused input
* use signal and update styles
* fix keyboard navigation and misalignment
* fix berry rendering bug
* remove tab role from more button
* remove getters and use inject
* remove disablePadding left in error
* remove obsolete input
* fix broken aria attr
* update trailingIcon to endIcon
* remove label directive and use start icon
* apply gap to host style property
* fix broken exports and imports
* remove active getter
* use anchors for overflow menu
* render start icon in tab link component
* remove unneeded aria attr
* display start icon in list and use correct menu item slots
* fix overflow label not rendering
* minor grammar update
* remove unused imports
* [CL-667] refactor(components): extract reusable overflow-list directive (#20651)
* refactor(components): extract reusable overflow-list directive
* refactor(overflow-list): collapse measurement effect into afterNextRender
The closure-flag effect was working around a timing claim that doesn't hold:
content queries are populated by ngAfterContentInit, well before afterNextRender
runs. A single afterNextRender callback covers measurement, RO attachment, and
cleanup — no mutable flag, no zombie effect re-firing on every items() change.
* fix(overflow-list): drop host overflow:hidden clipping focus rings
The host's overflow:hidden was clipping tab focus rings (and any other
legitimate visual overflow). Items get [hidden] applied synchronously
when they overflow, so the clipping safety net wasn't earning its cost.
* fix(tab-nav-bar): apply roving tabindex to align with tab-group
tab-nav-bar already installs a FocusKeyManager for arrow-key navigation,
but every tab-link was also a natural tab stop — so users tabbing through
the page hit each link individually instead of one stop for the nav.
Push tabindex state down from the parent in updateActiveLink: the active
(or first non-disabled) link gets 0, the rest get -1. Seeded once from
ngAfterViewInit so the initial route lands with correct tab order.
* update tab group
---------
Co-authored-by: Bryan Cunningham <bryan.cunningham@me.com>
Co-authored-by: Will Martin <contact@willmartian.com>
* update icon component to drop trailing slash
* apply same trailing slash logic in notification background and adjust iconServerUrl type
* remove trailing slash simplification, keep downstream normalization behavior
* align iconsServerUrl typing with buildCipherIcon contract
* testing that the current env url is updated
* fix popup width when opening in popped out mode, fix autofill inline menu opening, respect browser size in popped-out mode
* Co-authored-by: capenapplebw <capple@bitwarden.com>
* add passport translations
* add passport to web app
* add date-field-group to combine logic for reuse across cipher types
* implement date field for passport
* Add missing passport model files and integrate into cipher models
* update section heading
* Remove numeric values from month selector
* add copy action for national identification number
* fix tests
* omit linked types
* add placeholder for AC
* fix test
* emit failures to validation from child form
* remove old tests
* update date field component to match drivers license implementation
* fix removed translations that were duplicates between drivers license PR and passport
* add events for passport number viewed
* fix update to bank account to quiet down the diff
* collect number visible event
* add passport getter
* add fixedWith for icon
* reduce prevalence of observer cascades and frequency of shadow DOM detection
* probe closed roots only on valid elements
* add fixmes and doc updates for intentional optimizations
---------
Co-authored-by: Marton Danko <marton.danko@worldline.com>
* add passport and drivers license to cipher for breaking changes
* initial add of drivers license to the web
* fix copy actions and hidden fields for drivers license
* handle events for driver license
* exclude license from filters when feature flag is off
* format dates properly to match designs
* allow for cipher types to not have a nudge associated with them
* fix subtitle to match designs
* update i18n key names to avoid regression
* fix import order
* fix tests
* fix tests
* fix: update i18n key for driver's license in emergency-access dialog
* fix: update i18n keys for driver's license in vault-item-dialog
* fix: remove duplicate keys in cipher test fixture
* fix: correct indentation in permissions ternary operator
* fix: remove redundant ng-container wrapper in vault-cipher-row
* missed a test case fix
* prettier
* add date-field-group to combine logic for reuse across cipher types
* update drivers license components to use new date component
* update strict typing
* fix add-item dialog tests
* Remove passport model files from drivers-license branch
* Remove numeric values from month selector
* update copy actions
* fix tests
* address local code review
* omit linked fields
* Update apps/web/src/app/vault/components/vault-items/vault-cipher-row.component.ts
Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>
* swap order of issuing authority
* surface date errors to parent form
---------
Co-authored-by: claude[bot] <209825114+claude[bot]@users.noreply.github.com>