Skip to content

feat(react-headless-components-preview): add Dropdown component and stories#36101

Draft
dmytrokirpa wants to merge 13 commits intomasterfrom
feat/headless-dropdown-stories
Draft

feat(react-headless-components-preview): add Dropdown component and stories#36101
dmytrokirpa wants to merge 13 commits intomasterfrom
feat/headless-dropdown-stories

Conversation

@dmytrokirpa
Copy link
Copy Markdown
Contributor

Summary

  • Adds a headless Dropdown component (with Listbox, Option, OptionGroup) to react-headless-components-preview
  • Converts Tailwind classes to CSS modules (dropdown.module.css) using shared design tokens (CSS variables)
  • Ports 6 stories from react-combobox covering the behaviors that matter for headless usage: Default, Multiselect, Controlled, Grouped, ControllingOpenAndClose, Disabled

Stories

Story What it shows
Default Basic single-select with expand/clear icon toggle
Multiselect multiselect prop — comma-separated value, checkmarks on all options
Controlled value + selectedOptions + onOptionSelect fully controlled
Grouped OptionGroup with labels and separators
ControllingOpenAndClose open + onOpenChange driven by an external checkbox
Disabled Native disabled on the trigger button

Test plan

  • Open Storybook for react-headless-components-preview and verify all 6 Dropdown stories render
  • Keyboard-navigate each story to confirm active-descendant focus ring and scroll-margin-block keep items visible
  • Toggle dark theme and verify CSS variables resolve correctly
  • Verify clear button shows only when a value is selected (Default, Controlled, Grouped, ControllingOpenAndClose)
  • Verify multiselect checkmarks appear/hide on selection

🤖 Generated with Claude Code

…tories

Adds a headless Dropdown component (with Listbox, Option, OptionGroup) to
react-headless-components-preview, along with CSS-module-based Storybook
stories covering: Default, Multiselect, Controlled, Grouped,
ControllingOpenAndClose, and Disabled variants.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 5, 2026

📊 Bundle size report

Package & Exports Baseline (minified/GZIP) PR Change
react-combobox
Combobox (including child components)
102.637 kB
33.966 kB
102.655 kB
33.8 kB
18 B
-166 B
react-combobox
Dropdown (including child components)
102.407 kB
33.704 kB
102.423 kB
33.59 kB
16 B
-114 B
react-components
react-components: entire library
1.291 MB
323.824 kB
1.291 MB
324.443 kB
-16 B
619 B
react-headless-components-preview
react-headless-components-preview: entire library
107.577 kB
31.646 kB
129.115 kB
37.792 kB
21.538 kB
6.146 kB
react-tag-picker
@fluentui/react-tag-picker - package
174.502 kB
54.377 kB
174.546 kB
54.381 kB
44 B
4 B
react-timepicker-compat
TimePicker
105.595 kB
35.567 kB
105.613 kB
35.351 kB
18 B
-216 B
Unchanged fixtures
Package & Exports Size (minified/GZIP)
react-components
react-components: Button, FluentProvider & webLightTheme
67.61 kB
19.536 kB
react-components
react-components: Accordion, Button, FluentProvider, Image, Menu, Popover
226.203 kB
67.961 kB
react-components
react-components: FluentProvider & webLightTheme
40.806 kB
13.616 kB
react-portal-compat
PortalCompatProvider
5.567 kB
2.237 kB
🤖 This report was generated against df3355d99ceb03774b9a93ddee5b2db40aba2b2a

@github-actions
Copy link
Copy Markdown

github-actions Bot commented May 5, 2026

Pull request demo site: URL

@@ -19,7 +19,6 @@ import type { ListboxProps, ListboxState } from './Listbox.types';
import { getDropdownActionFromKey } from '../../utils/dropdownKeyActions';
Copy link
Copy Markdown

@github-actions github-actions Bot May 5, 2026

Choose a reason for hiding this comment

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

🕵🏾‍♀️ visual changes to review in the Visual Change Report

vr-tests-react-components/Avatar Converged 1 screenshots
Image Name Diff(in Pixels) Image Type
vr-tests-react-components/Avatar Converged.badgeMask.normal.chromium.png 5 Changed
vr-tests-react-components/Charts-DonutChart 3 screenshots
Image Name Diff(in Pixels) Image Type
vr-tests-react-components/Charts-DonutChart.Dynamic.default.chromium.png 5581 Changed
vr-tests-react-components/Charts-DonutChart.Dynamic - Dark Mode.default.chromium.png 7530 Changed
vr-tests-react-components/Charts-DonutChart.Dynamic - RTL.default.chromium.png 5570 Changed
vr-tests-react-components/Menu Converged - submenuIndicator slotted content 2 screenshots
Image Name Diff(in Pixels) Image Type
vr-tests-react-components/Menu Converged - submenuIndicator slotted content.default - RTL.submenus open.chromium.png 599 Changed
vr-tests-react-components/Menu Converged - submenuIndicator slotted content.default.submenus open.chromium.png 605 Changed
vr-tests-react-components/Positioning 2 screenshots
Image Name Diff(in Pixels) Image Type
vr-tests-react-components/Positioning.Positioning end.chromium.png 911 Changed
vr-tests-react-components/Positioning.Positioning end.updated 2 times.chromium.png 724 Changed
vr-tests-react-components/ProgressBar converged 2 screenshots
Image Name Diff(in Pixels) Image Type
vr-tests-react-components/ProgressBar converged.Indeterminate + thickness - High Contrast.default.chromium.png 67 Changed
vr-tests-react-components/ProgressBar converged.Indeterminate + thickness.default.chromium.png 41 Changed
vr-tests-react-components/TagPicker 2 screenshots
Image Name Diff(in Pixels) Image Type
vr-tests-react-components/TagPicker.disabled - High Contrast.disabled input hover.chromium.png 1319 Changed
vr-tests-react-components/TagPicker.disabled.disabled input hover.chromium.png 677 Changed

There were 2 duplicate changes discarded. Check the build logs for more information.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant