Skip to content

feat(react-spinner): add useSpinnerBase_unstable hook#35818

Draft
dmytrokirpa wants to merge 3 commits intomasterfrom
feat/react-spinner-base-hooks
Draft

feat(react-spinner): add useSpinnerBase_unstable hook#35818
dmytrokirpa wants to merge 3 commits intomasterfrom
feat/react-spinner-base-hooks

Conversation

@dmytrokirpa
Copy link
Contributor

Summary

  • Adds useSpinnerBase_unstable hook to react-spinner that extracts pure component logic without design props
  • Adds SpinnerBaseProps type omitting appearance and size (design-related props)
  • Adds SpinnerBaseState type omitting appearance and size
  • Refactors useSpinner_unstable to call useSpinnerBase_unstable internally
  • Exports new types and hook from package index.ts

What base hooks include

The base hook preserves:

  • role="progressbar" ARIA attribute
  • aria-labelledby association linking root to label slot
  • delay behavioral prop (controls when spinner becomes visible)
  • shouldRenderSpinner derived state (delay-based visibility logic)
  • labelPosition structural prop (determines slot layout)
  • All slot setup: root, spinner, spinnerTail, label
  • Field integration context

The base hook excludes:

  • appearance prop (primary/inverted - design concern)
  • size prop (extra-tiny through huge - design concern)

Test plan

  • Verify useSpinnerBase_unstable can be imported from @fluentui/react-spinner
  • Verify SpinnerBaseProps and SpinnerBaseState types are exported
  • Verify existing useSpinner_unstable behavior is unchanged
  • Verify delay prop still controls spinner visibility correctly via base hook
  • Verify aria-labelledby is set correctly when label is provided

🤖 Generated with Claude Code

dmytrokirpa and others added 2 commits March 5, 2026 11:59
Adds a base state hook for Spinner component that extracts pure component logic
(ARIA, slot structure, delay-based visibility) without design-related props
(appearance, size).

- Add SpinnerBaseProps type omitting appearance and size (design props)
- Add SpinnerBaseState type omitting appearance and size
- Add useSpinnerBase_unstable hook preserving:
  - role=progressbar ARIA attribute
  - aria-labelledby association with label slot
  - delay-based visibility logic (shouldRenderSpinner)
  - labelPosition structural prop
  - All slot setup (root, spinner, spinnerTail, label)
- Refactor useSpinner_unstable to call useSpinnerBase_unstable internally
- Export new types and hook from package index.ts

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@dmytrokirpa dmytrokirpa changed the base branch from experimental/component-base-hooks to master March 5, 2026 11:00
@dmytrokirpa dmytrokirpa force-pushed the feat/react-spinner-base-hooks branch from a02567c to aa43e92 Compare March 5, 2026 11:00
@github-actions
Copy link

github-actions bot commented Mar 5, 2026

Pull request demo site: URL

@@ -0,0 +1,7 @@
{
Copy link

@github-actions github-actions bot Mar 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/CalendarCompat 4 screenshots
Image Name Diff(in Pixels) Image Type
vr-tests-react-components/CalendarCompat.multiDayView - High Contrast.default.chromium.png 1236 Changed
vr-tests-react-components/CalendarCompat.multiDayView - RTL.default.chromium.png 495 Changed
vr-tests-react-components/CalendarCompat.multiDayView.default.chromium_1.png 403 Changed
vr-tests-react-components/CalendarCompat.multiDayView - Dark Mode.default.chromium.png 1107 Changed
vr-tests-react-components/Charts-DonutChart 1 screenshots
Image Name Diff(in Pixels) Image Type
vr-tests-react-components/Charts-DonutChart.Dynamic - Dark Mode.default.chromium.png 7530 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 - 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.chromium.png 131 Changed
vr-tests-react-components/Positioning.Positioning end.updated 2 times.chromium.png 497 Changed
vr-tests-react-components/TagPicker 2 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.chromium.png 677 Changed

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

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

github-actions bot commented Mar 5, 2026

📊 Bundle size report

Package & Exports Baseline (minified/GZIP) PR Change
react-components
react-components: entire library
1.292 MB
323.107 kB
1.292 MB
323.122 kB
36 B
15 B
react-spinner
Spinner
23.503 kB
7.812 kB
23.539 kB
7.815 kB
36 B
3 B
Unchanged fixtures
Package & Exports Size (minified/GZIP)
react-components
react-components: Button, FluentProvider & webLightTheme
70.397 kB
19.96 kB
react-components
react-components: Accordion, Button, FluentProvider, Image, Menu, Popover
236.537 kB
68.697 kB
react-components
react-components: FluentProvider & webLightTheme
43.612 kB
14.022 kB
react-portal-compat
PortalCompatProvider
8.386 kB
2.624 kB
react-timepicker-compat
TimePicker
108.174 kB
35.695 kB
🤖 This report was generated against ace36179073ac4600a3635304a0941bd7dcda21d

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