Skip to content

feat(react-headless-components-preview): add headless Tree component family#36058

Draft
dmytrokirpa wants to merge 3 commits intomicrosoft:masterfrom
dmytrokirpa:feat/headless-tree
Draft

feat(react-headless-components-preview): add headless Tree component family#36058
dmytrokirpa wants to merge 3 commits intomicrosoft:masterfrom
dmytrokirpa:feat/headless-tree

Conversation

@dmytrokirpa
Copy link
Copy Markdown
Contributor

Summary

Adds headless wrappers for the complete react-tree component surface to @fluentui/react-headless-components-preview. All components delegate to @fluentui/react-tree hooks and render functions — no Griffel styling, no design tokens.

Tree family (6 components):

Component Pattern Notes
Tree context values useTree + useTreeContextValues
FlatTree context values useFlatTree + useFlatTreeContextValues
FlatTreeItem re-export typed alias of TreeItem (same as in react-tree)
TreeItem context values useTreeItem + useTreeItemContextValues
TreeItemLayout simple no context values
TreeItemPersonaLayout context values useTreeItemPersonaLayout + useTreeItemPersonaLayoutContextValues

Also re-exports useHeadlessFlatTree and related types (HeadlessFlatTree, HeadlessFlatTreeItem, HeadlessFlatTreeOptions) for consumers building virtualized flat trees.

Stack order (review in this order)

  1. test(react-tree): hook unit tests (test(react-tree): add unit tests for useTree_unstable, useFlatTree_unstable and useTreeItem_unstable hooks #36056)
  2. feat(react-tree): base hook exports (feat(react-tree): export useTreeItemPersonaLayoutContextValues_unstable and TreeItemPersonaLayoutContextValues #36057)
  3. This PR — headless Tree family ← you are here

Test plan

  • All 6 components render without any applied styling
  • Context values propagate correctly (Tree, FlatTree, TreeItem, TreeItemPersonaLayout)
  • FlatTreeItem accepts required aria-level / aria-setsize / aria-posinset props
  • useHeadlessFlatTree works end-to-end for virtualized scenarios
  • Consumers can apply arbitrary className/style

🤖 Generated with Claude Code

dmytrokirpa and others added 3 commits April 26, 2026 22:20
…stable and useTreeItem_unstable hooks

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
…le and TreeItemPersonaLayoutContextValues

Required for the headless layer to compose avatar context values without
importing internal module paths.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
…family

Adds headless wrappers for the full react-tree component surface:

- Tree (context values via useTree + useTreeContextValues)
- FlatTree (context values via useFlatTree + useFlatTreeContextValues)
- FlatTreeItem (re-export of FlatTreeItem — a typed alias for TreeItem)
- TreeItem (context values via useTreeItem + useTreeItemContextValues)
- TreeItemLayout (simple single-arg render, no context values)
- TreeItemPersonaLayout (context values via useTreeItemPersonaLayout + useTreeItemPersonaLayoutContextValues)

Also re-exports useHeadlessFlatTree and related types for consumers
building virtualized flat trees.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
@github-actions
Copy link
Copy Markdown

Pull request demo site: URL

@@ -0,0 +1,8 @@
{
Copy link
Copy Markdown

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/CalendarCompat 4 screenshots
Image Name Diff(in Pixels) Image Type
vr-tests-react-components/CalendarCompat.multiDayView.default.chromium.png 654 Changed
vr-tests-react-components/CalendarCompat.multiDayView - High Contrast.default.chromium.png 2243 Changed
vr-tests-react-components/CalendarCompat.multiDayView - Dark Mode.default.chromium.png 2172 Changed
vr-tests-react-components/CalendarCompat.multiDayView.default.chromium_1.png 654 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 5570 Changed
vr-tests-react-components/Positioning 2 screenshots
Image Name Diff(in Pixels) Image Type
vr-tests-react-components/Positioning.Positioning end.chromium.png 962 Changed
vr-tests-react-components/Positioning.Positioning end.updated 2 times.chromium.png 623 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 84 Changed
vr-tests-react-components/ProgressBar converged.Indeterminate + thickness.default.chromium.png 67 Changed
vr-tests-react-components/TagPicker 3 screenshots
Image Name Diff(in Pixels) Image Type
vr-tests-react-components/TagPicker.disabled - RTL.disabled input hover.chromium.png 635 Changed
vr-tests-react-components/TagPicker.disabled - High Contrast.chromium.png 1319 Changed
vr-tests-react-components/TagPicker.disabled.disabled input hover.chromium.png 677 Changed

There were 4 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