Skip to content

feat(react-headless-components-preview): add headless Toast component family#36059

Draft
dmytrokirpa wants to merge 5 commits intomicrosoft:masterfrom
dmytrokirpa:feat/headless-toast
Draft

feat(react-headless-components-preview): add headless Toast component family#36059
dmytrokirpa wants to merge 5 commits intomicrosoft:masterfrom
dmytrokirpa:feat/headless-toast

Conversation

@dmytrokirpa
Copy link
Copy Markdown
Contributor

Summary

Adds headless wrappers for the react-toast component surface to @fluentui/react-headless-components-preview, built on top of the base hooks from #35914.

Depends on #35914 — review/merge that PR first. The diff here includes those changes because this branch was created from it.

Component Hook used Key difference vs styled
Toast useToastBase_unstable No BackgroundAppearanceProvider wrapper; appearance prop omitted
ToastTitle useToastTitleBase_unstable media slot has no automatic intent icon; consumers supply their own
ToastBody useToastBodyBase_unstable No backgroundAppearance state
ToastFooter useToastFooter_unstable No design-only props — uses regular hook

Toaster and ToastContainer are omitted — their state management is infrastructure-level with no design-only props to strip.

How renderToast works

renderToast_unstable wraps output in <BackgroundAppearanceProvider>. The headless renderToast passes backgroundAppearance: undefined, which is equivalent to no provider — subcomponents receive no appearance context, which is the correct headless behaviour.

Test plan

  • Toast renders without any appearance styling applied
  • ToastTitle renders media slot empty by default (no icon); consumers can pass their own via the media slot prop
  • ToastBody renders correctly without background appearance context
  • ToastFooter renders as a plain div
  • All four components accept arbitrary className/style

🤖 Generated with Claude Code

dmytrokirpa and others added 5 commits March 26, 2026 11:20
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… family

Adds headless wrappers for the react-toast component surface built on top
of the base hooks introduced in feat(react-toast): add base hooks (microsoft#35914).

- Toast — useToast (useToastBase_unstable) + renderToast (no BackgroundAppearanceProvider)
- ToastTitle — useToastTitle (useToastTitleBase_unstable); media slot without automatic intent icons
- ToastBody — useToastBody (useToastBodyBase_unstable); no backgroundAppearance state
- ToastFooter — useToastFooter_unstable (no design-only state, base hook not needed)

Toaster and ToastContainer are omitted — their state management is
infrastructure-level and has no design-only props to strip.

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

Pull request demo site: URL

@@ -0,0 +1,7 @@
{
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.default.chromium_1.png 654 Changed
vr-tests-react-components/CalendarCompat.multiDayView - Dark Mode.default.chromium.png 2172 Changed
vr-tests-react-components/Charts-DonutChart 2 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 - RTL.default.chromium.png 5570 Changed
vr-tests-react-components/Menu 1 screenshots
Image Name Diff(in Pixels) Image Type
vr-tests-react-components/Menu.Nested Submenus Small Viewport Flipped.nested menu.chromium.png 712 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.submenus open.chromium.png 413 Changed
vr-tests-react-components/Menu Converged - submenuIndicator slotted content.default - RTL.submenus open.chromium.png 404 Changed
vr-tests-react-components/Positioning 2 screenshots
Image Name Diff(in Pixels) Image Type
vr-tests-react-components/Positioning.Positioning end.updated 2 times.chromium.png 858 Changed
vr-tests-react-components/Positioning.Positioning end.chromium.png 878 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 74 Changed
vr-tests-react-components/ProgressBar converged.Indeterminate + thickness - High Contrast.default.chromium.png 224 Changed
vr-tests-react-components/ProgressBar converged.Indeterminate + thickness.default.chromium.png 149 Changed

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