Conversation
Co-authored-by: Kyle McDonald <kylemcd@users.noreply.github.com>
Co-authored-by: Kyle McDonald <kylemcd@users.noreply.github.com>
Co-authored-by: Kyle McDonald <kylemcd@users.noreply.github.com>
Co-authored-by: Kyle McDonald <kylemcd@users.noreply.github.com>
Co-authored-by: Kyle McDonald <kylemcd@users.noreply.github.com>
Co-authored-by: Kyle McDonald <kylemcd@users.noreply.github.com>
Co-authored-by: Kyle McDonald <kylemcd@users.noreply.github.com>
Co-authored-by: Kyle McDonald <kylemcd@users.noreply.github.com>
|
Cursor Agent can help with this pull request. Just |
|
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Package size differencesThe following packages have size differences greater than 20 KB
All package size differences
|
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 2 potential issues.
Bugbot Autofix is OFF. To automatically fix reported issues with Cloud Agents, enable Autofix in the Cursor dashboard.
| } | ||
| onValueChange={handleBaseValueChange} | ||
| multiple={isMultipleSelectValue} | ||
| modal={modal && false} |
There was a problem hiding this comment.
Modal prop always forced to false
Medium Severity
The expression modal={modal && false} always evaluates to a falsy value regardless of the modal prop's input. When modal is true (the default, set on line 119), the expression yields false. When modal is false or undefined, it yields that falsy value. This makes the modal prop on the public API completely inert — consumers passing modal={true} will silently get non-modal behavior. If the intent is to always disable modal mode, the expression can just be false with a comment explaining why.
| }); | ||
|
|
||
| return () => observer.disconnect(); | ||
| }, []); |
There was a problem hiding this comment.
Global MutationObserver per combobox instance is wasteful
Medium Severity
Each Root instance creates a MutationObserver on document.body with childList: true, subtree: true, firing on every DOM addition/removal anywhere on the page for the component's entire lifetime. Multiple combobox instances multiply this cost. Additionally, the same focus-guard labeling logic is duplicated in the Content component (lines 610–619), making the Content effect redundant given the persistent observer already covers all mutations.
Additional Locations (1)
Co-authored-by: Kyle McDonald <kylemcd@users.noreply.github.com>


Migrate the Combobox component to use Base UI while maintaining its existing public API and behavior, backed by hardened regression tests.
This migration was executed in two phases:
closeOnSelect,Createbehavior,defaultScrollToValue) and assertions for critical DOM/data attributes to lock in the existing behavior.Combobox.Root,Trigger,Content,Options, andOptionwith Base UI primitives. A compatibility layer was introduced to ensure the public API, compound components, styling, custom behaviors (like clear button, tag rendering, search-in-popup, legacy object values), and accessibility contract remain identical.