Skip to content

feat(evo-react): add combobox - #911

Open
HenriqueLimas wants to merge 2 commits into
mainfrom
evo-combobox-react
Open

feat(evo-react): add combobox#911
HenriqueLimas wants to merge 2 commits into
mainfrom
evo-combobox-react

Conversation

@HenriqueLimas

@HenriqueLimas HenriqueLimas commented Aug 26, 2026

Copy link
Copy Markdown
Member

Description

Adds EvoCombobox and EvoComboboxOption to @evo-web/react with:

  • controlled and uncontrolled textbox values via value, defaultValue, and onValueChange
  • controlled and uncontrolled listbox visibility
  • text filtering, sticky options, keyboard navigation, and active-descendant management
  • floating labels, postfix actions, React 19 refs, and Skin combobox styling
  • browser tests, SSR snapshots, and a Storybook example
  • migration guidance from ebay-combobox and a patch changeset

Notes

  • Validation passed: focused combobox tests, npm run build -w packages/evo-react, production Evo React Storybook, and root npm run build.
  • The package-wide Evo React lint baseline has unrelated existing failures documented in agent-feedback/items/2026-08-25-evo-react-lint-baseline.md; targeted combobox lint passes.
  • No issue number was provided for the required Fixes # reference.

Screenshots

Not included; the component is available in the Evo React Storybook.

Checklist

  • I verify the linked issue has been triaged ("Needs Triage" label removed)
  • I verify all changes are within scope of the linked issue
  • I added/updated/removed testing (Storybook in Skin) coverage as appropriate

Copilot AI lite review requested due to automatic review settings August 26, 2026 22:00
@changeset-bot

changeset-bot Bot commented Aug 26, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 59635a2

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@evo-web/react Patch

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

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 useActiveDescendant utility and wires it into the new combobox for keyboard navigation and aria-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 listSelection to "manual", a previously previewed temporaryValue can still be committed on focus-out via updateValue(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.

Comment on lines +56 to +60
if (listSelection === "manual" && temporaryValue !== null) {
setTemporaryValue(null);
}

const displayedValue = temporaryValue ?? currentValue;
@github-actions

github-actions Bot commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

PR Preview Deployed

Websiteevo-markoevo-reactebayui-coreebayui-core-reactskin

commit 59635a2

@HenriqueLimas
HenriqueLimas marked this pull request as draft August 29, 2026 00:04
HenriqueLimas and others added 2 commits September 3, 2026 16:16
…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>
@HenriqueLimas
HenriqueLimas marked this pull request as ready for review September 3, 2026 23:18
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.

evo-react: migrate ebay-combobox

2 participants