feat(react-headless-components-preview): add headless Overflow#36305
feat(react-headless-components-preview): add headless Overflow#36305mainframev wants to merge 4 commits into
Conversation
8477420 to
5658487
Compare
📊 Bundle size report
🤖 This report was generated against a90442996224b76904a73761ad77f9b1f68239a3 |
|
Pull request demo site: URL |
| @@ -0,0 +1,7 @@ | |||
| { | |||
There was a problem hiding this comment.
🕵🏾♀️ 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 - RTL.normal.chromium.png | 3 | Changed |
vr-tests-react-components/Charts-DonutChart 1 screenshots
| Image Name | Diff(in Pixels) | Image Type |
|---|---|---|
| vr-tests-react-components/Charts-DonutChart.Dynamic - RTL.default.chromium.png | 2375 | Changed |
vr-tests-react-components/Menu Converged - submenuIndicator slotted content 1 screenshots
| Image Name | Diff(in Pixels) | Image Type |
|---|---|---|
| vr-tests-react-components/Menu Converged - submenuIndicator slotted content.default.submenus open.chromium.png | 413 | Changed |
vr-tests-react-components/Positioning 2 screenshots
| Image Name | Diff(in Pixels) | Image Type |
|---|---|---|
| vr-tests-react-components/Positioning.Positioning end.chromium.png | 883 | Changed |
| vr-tests-react-components/Positioning.Positioning end.updated 2 times.chromium.png | 861 | Changed |
vr-tests-react-components/ProgressBar converged 3 screenshots
| Image Name | Diff(in Pixels) | Image Type |
|---|---|---|
| vr-tests-react-components/ProgressBar converged.Indeterminate + thickness - Dark Mode.default.chromium.png | 48 | Changed |
| vr-tests-react-components/ProgressBar converged.Indeterminate + thickness.default.chromium.png | 187 | Changed |
| vr-tests-react-components/ProgressBar converged.Indeterminate + thickness - High Contrast.default.chromium.png | 171 | Changed |
vr-tests-react-components/TagPicker 1 screenshots
| Image Name | Diff(in Pixels) | Image Type |
|---|---|---|
| vr-tests-react-components/TagPicker.disabled - Dark Mode.chromium.png | 658 | Changed |
There were 3 duplicate changes discarded. Check the build logs for more information.
5658487 to
8270b2b
Compare
| beforeAll(() => { | ||
| // jsdom does not implement ResizeObserver, which the overflow manager observes the container with. | ||
| // https://github.com/jsdom/jsdom/issues/3368 | ||
| global.ResizeObserver = class ResizeObserver { |
There was a problem hiding this comment.
why do we need this? it's done in https://github.com/microsoft/fluentui/blob/master/packages/react-components/react-headless-components-preview/library/config/tests.js#L6
| /** | ||
| * Overflow Props | ||
| */ | ||
| export type OverflowProps = OverflowBaseProps; |
There was a problem hiding this comment.
lets re-export from @fluentui/react-overflow
| import * as React from 'react'; | ||
| import { Overflow, OverflowItem } from '@fluentui/react-headless-components-preview/overflow'; | ||
|
|
||
| import { OverflowMenu } from './OverflowMenu'; |
There was a problem hiding this comment.
this might not work in export to sandbox scenario, can you please double check?
|
|
||
| return ( | ||
| <> | ||
| <button |
There was a problem hiding this comment.
consider using headless menu component
| * reference implementation. | ||
| */ | ||
| const MenuGroupDivider: React.FC<{ groupId: number }> = ({ groupId }) => { | ||
| const groupVisibilities = Object.values(GROUPS).map(group => ({ |
There was a problem hiding this comment.
do we have such complexity in v9 examples as well? can we simplify it somehow?
| const groupVisibilities = Object.values(GROUPS).map(group => ({ | ||
| group, | ||
| // eslint-disable-next-line react-hooks/rules-of-hooks | ||
| visibility: useIsOverflowGroupVisible(group.toString()), |
There was a problem hiding this comment.
we'll also need to fix this
|
@mainframev could you please also add Overflow components to bundle size report |
There was a problem hiding this comment.
Pull request overview
Adds a new headless Overflow primitive to @fluentui/react-headless-components-preview via a dedicated ./overflow entrypoint, primarily by re-exporting the engine/hooks from @fluentui/react-overflow and providing a thin, unstyled Overflow root plus Storybook documentation/examples.
Changes:
- Add
./overflowentrypoint exportingOverflowplus relevant hooks/components/constants, backed by@fluentui/react-overflow. - Add Storybook stories + docs + CSS module demonstrating usage patterns (default, vertical, reverse order, pinned, dividers, priority).
- Add unit tests + API report + Beachball change file, and update package exports/deps.
Reviewed changes
Copilot reviewed 21 out of 21 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
| packages/react-components/react-headless-components-preview/stories/src/Overflow/OverflowVertical.stories.tsx | Adds vertical overflow story example. |
| packages/react-components/react-headless-components-preview/stories/src/Overflow/OverflowReverseDomOrder.stories.tsx | Adds reverse DOM overflow direction story example. |
| packages/react-components/react-headless-components-preview/stories/src/Overflow/OverflowPriorityWithDividers.stories.tsx | Adds priority + divider handling example (advanced scenario). |
| packages/react-components/react-headless-components-preview/stories/src/Overflow/OverflowPinned.stories.tsx | Adds pinned-items example story. |
| packages/react-components/react-headless-components-preview/stories/src/Overflow/OverflowMenu.tsx | Adds shared overflow menu example built from headless hooks. |
| packages/react-components/react-headless-components-preview/stories/src/Overflow/OverflowLargerDividers.stories.tsx | Adds OverflowDivider usage example story. |
| packages/react-components/react-headless-components-preview/stories/src/Overflow/OverflowDescription.md | Documents required data-attribute CSS rules + composition guidance. |
| packages/react-components/react-headless-components-preview/stories/src/Overflow/OverflowDefault.stories.tsx | Adds default overflow story example. |
| packages/react-components/react-headless-components-preview/stories/src/Overflow/overflow.module.css | Provides demo styling + required data-attribute layout rules for stories. |
| packages/react-components/react-headless-components-preview/stories/src/Overflow/index.stories.tsx | Registers the Overflow stories and docs description. |
| packages/react-components/react-headless-components-preview/library/src/overflow.ts | Creates the public overflow entrypoint exports/types. |
| packages/react-components/react-headless-components-preview/library/src/components/Overflow/useOverflowContextValues.ts | Re-exports useOverflowContextValues_unstable under headless entrypoint. |
| packages/react-components/react-headless-components-preview/library/src/components/Overflow/useOverflow.ts | Re-exports useOverflow_unstable under headless entrypoint. |
| packages/react-components/react-headless-components-preview/library/src/components/Overflow/renderOverflow.ts | Re-exports renderOverflow_unstable under headless entrypoint. |
| packages/react-components/react-headless-components-preview/library/src/components/Overflow/Overflow.types.ts | Defines exported headless Overflow types (largely aliases to react-overflow). |
| packages/react-components/react-headless-components-preview/library/src/components/Overflow/Overflow.tsx | Adds thin headless Overflow root (use + context-values + render; no styles hook). |
| packages/react-components/react-headless-components-preview/library/src/components/Overflow/Overflow.test.tsx | Adds conformance + behavioral unit tests for headless Overflow. |
| packages/react-components/react-headless-components-preview/library/src/components/Overflow/index.ts | Exposes Overflow + re-exports advanced hooks/components/constants from react-overflow. |
| packages/react-components/react-headless-components-preview/library/package.json | Adds dependency on @fluentui/react-overflow and export map entry for ./overflow. |
| packages/react-components/react-headless-components-preview/library/etc/overflow.api.md | Adds API Extractor report for the new entrypoint. |
| change/@fluentui-react-headless-components-preview-4bdc7f70-88bc-4b7a-8c35-7ddd600b9a3c.json | Adds Beachball change file for publishing the new entrypoint. |
98b8f52 to
747370f
Compare

Previous Behavior
@fluentui/react-headless-components-previewhad no overflow primitive, so teams building custom design systems had no unstyled Overflow.New Behavior
Adds a headless
Overflowwith a new./overflowentrypoint. It reuses the building blocks exposed by@fluentui/react-overflow(see #36304):Overflow— thin root that provides the overflow context; usesuseOverflow_unstable+renderOverflow_unstableand intentionally skips the styles hook.useOverflow/renderOverflow/useOverflowContextValues— direct re-exports of the_unstablehooks from@fluentui/react-overflow.useOverflowMenu,OverflowItem,OverflowDivider,OverflowReorderObserverand the consumer hooks (useOverflowCount,useIsOverflowItemVisible,useIsOverflowGroupVisible,useOverflowVisibility,useOverflowContext) plus theDATA_*constants are re-exported as-is.Consistent with the package's data-attribute convention, the overflow engine sets
data-overflowing/data-overflow-menuand the consumer styles them — the package ships no CSS. The two layout rules the engine relies on are documented in the story and component description:Note
Depends on #36304