feat(evo-react): add combobox - #911
Conversation
🦋 Changeset detectedLatest commit: 59635a2 The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
There was a problem hiding this comment.
Pull request overview
Adds a new EvoCombobox + EvoComboboxOption implementation to @evo-web/react, including supporting utilities, Storybook documentation, SSR/browser tests, and migration guidance for app-level consumers.
Changes:
- Introduces a reusable
useActiveDescendantutility and wires it into the new combobox for keyboard navigation andaria-activedescendant. - Adds the combobox component, option component, types, context, and Storybook story.
- Adds Vitest SSR snapshots + browser interaction tests, plus a patch changeset and migration docs.
Reviewed changes
Copilot reviewed 17 out of 17 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| packages/evo-react/src/utils/use-active-descendant.ts | New active-descendant registration + navigation utility for listbox-style widgets. |
| packages/evo-react/src/combobox/types.ts | Defines the public prop/types surface for EvoCombobox and EvoComboboxOption. |
| packages/evo-react/src/combobox/test/test.server.tsx | Adds SSR snapshot coverage for key rendering variants. |
| packages/evo-react/src/combobox/test/test.browser.tsx | Adds browser interaction coverage for ARIA, value updates, filtering, keyboard behavior, postfix actions, and refs. |
| packages/evo-react/src/combobox/test/snapshots/test.server.tsx.snap | Stores the SSR snapshot outputs for the new component. |
| packages/evo-react/src/combobox/README.md | Links to Storybook documentation for the new component. |
| packages/evo-react/src/combobox/index.ts | Adds the combobox subpath entrypoint exports. |
| packages/evo-react/src/combobox/context.tsx | Implements context wiring between EvoCombobox and EvoComboboxOption. |
| packages/evo-react/src/combobox/combobox.tsx | Core combobox implementation (state, expander, a11y attributes, keyboard handling, postfix rendering). |
| packages/evo-react/src/combobox/combobox.stories.tsx | Storybook docs + example configuration for EvoCombobox. |
| packages/evo-react/src/combobox/combobox-option.tsx | Option rendering, filtering, registration with active-descendant, and selection handling. |
| agent-feedback/items/2026-08-25-evo-react-lint-baseline.md | Documents pre-existing lint baseline issues to unblock lint-as-gate later. |
| agent-feedback/items/2026-08-25-evo-marko-combobox-option-value.md | Notes a Marko combobox option contract inconsistency for follow-up. |
| agent-feedback/items/2026-08-25-carousel-autoplay-test-flake.md | Documents an unrelated flaky carousel test for follow-up. |
| .claude/skills/evo-app-migrate-react/SKILL.md | Adds ebay-combobox to the migration-skill component list. |
| .claude/skills/evo-app-migrate-react/components/evo-combobox.md | Provides migration guidance from ebay-combobox to evo-combobox. |
| .changeset/calm-comboboxes-listen.md | Patch changeset for publishing the new combobox. |
Suppressed comments (1)
packages/evo-react/src/combobox/combobox.tsx:136
- When switching
listSelectionto "manual", a previously previewedtemporaryValuecan still be committed on focus-out viaupdateValue(preview). Ensure the blur commit logic ignores preview values in manual mode.
setFocused(false);
const preview = temporaryValue;
requestOpen(false);
activeDescendant.reset();
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| if (listSelection === "manual" && temporaryValue !== null) { | ||
| setTemporaryValue(null); | ||
| } | ||
|
|
||
| const displayedValue = temporaryValue ?? currentValue; |
PR Preview DeployedWebsite • commit 59635a2 |
…width Keep keyboard preview tied to the active option so controlled updates cannot leave stale text. Block interaction while disabled. Apply Skin listbox positioning classes like Marko. Co-authored-by: Cursor <cursoragent@cursor.com>
e89338b to
59635a2
Compare
Description
Adds
EvoComboboxandEvoComboboxOptionto@evo-web/reactwith:value,defaultValue, andonValueChangeebay-comboboxand a patch changesetNotes
npm run build -w packages/evo-react, production Evo React Storybook, and rootnpm run build.agent-feedback/items/2026-08-25-evo-react-lint-baseline.md; targeted combobox lint passes.Fixes #reference.Screenshots
Not included; the component is available in the Evo React Storybook.
Checklist