What's new with Fluent UI React v9?
Tags: webdev, react, fluentui, javascript
Published: 2022-08-02 15:18:58

After nearly two years in development, we are proud to announce the release of Fluent UI React v9 to stable version 9.0! Fluent UI React v9 is a collaboration between the Teams and Office team. 

This release provides a stable architecture for teams to build on and a baseline set of components to use. We have more components to build that will be coming in future. Check out what we have so far and give us feedback on our documentation site https://react.fluentui.dev/. And, let us know what components you're looking for on GitHub https://github.com/microsoft/fluentui.

Now, let's take a look at some of the top-level library features.

## Performance

### CSS-in-JS engine provides styling performance improvements
Fluent UI React v9 is leveraging Griffel, (https://aka.ms/griffel) our recently open-sourced CSS-in-JS implementation. It provides near zero runtime, SSR support, and optional build time transforms to improve performance. When using Griffel, partner teams have seen render time improvements over Fluent UI React v0 and v8.

[Griffel](https://griffel.js.org) is a CSS-in-JS with near-zero runtime, SSR support and styles defined with JavaScript objects.

🚀   With a zero config start, Griffel has both runtime & build time implementations
🔥   Optional build time transforms to improve performance
💪   Type-safe styles via csstype
🧩   Uses Atomic CSS to reuse styles and avoid specificity issues with CSS
📝   Experimental CSS extraction with Webpack plugin
🐞   Debug using Griffel DevTools extension

### Lighter weight DOM
When building the components for Fluent UI React v9, DOM node depth was taken into consideration as primitive components are often used in more complex UX. For example, the v9 Avatar component when compared to the v8 Persona and PersonaCoin components has 50% fewer DOM elements to represent the same output. These extra nodes add up as you use them in more complex and repeated scenarios like virtualized lists where every millisecond counts.

![DOM element comparison between v8 and v9](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uxjko76s2u86zm16ur1k.png)
 
## Accessibility
![Design Spec screenshot](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wrkj2uk9h6lkg06s737y.png)
When designing and building the components for Fluent UI React v9, accessibility was also taken into consideration from the start. Here are the ways the product is built to meet WCAG 2.1 specifications today:
- Each component design spec takes into account keyboard, narrator, and high contrast definitions and each component goes through an [extensive manual a11y test pass](https://gist.github.com/smhigley/0f08c38758359e62f06d692a23860e63)
- Where possible components are using native elements to minimize the over use of ARIA
- Components support high contrast out of the box

And here are some new A11y improvements specific in v9:
- Splitbutton automated test errors and screen reader bugs are fixed in v9
- Slider now works across both desktop and mobile screen readers
- v9 includes a select component wrapping the native <select> element
- Support reduced animation user settings 

## Customization

### Slots
Fluent UI React v9 internal parts of a component are called "slots." Think of the icon in a button.

Each component slot is exposed as a top-level prop of the same name. A button has an "icon" prop for working with the icon slot. All anatomies specified in Fluent UI's design and engineering specs are available as slots.

![Slots example in Design Spec](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/552wtzyzqecrbl29ziy1.png)

Fluent UI's component design allows full control over every slot in every component through the slot API. This allows you to customize by:

- Passing content
- Passing props
- Changing the slot type
- Replacing the slot entirely

Check out this deep dive on slots in this previous post:
{% embed https://dev.to/paulgildea/using-slots-with-fluent-ui-react-v9-jf1 %}

## Design to code

### Theming support with design tokens 

Fluent UI React theming is supported by design tokens defined in the Fluent Design System. Design tokens provide a common set of semantic key/value pairs that represent the design language. This includes concepts like color palettes, typography ramps, radius ramps, spacing, etc. These are defined at the design system level allowing UI Kits and UI libraries to easily update the design language into the respective solution.

The core design team has been working with the design community to provide Fluent based components that are designed to meet the needs of M365 products out of the box without the need for many style overrides. This becomes especially helpful when we share and integrate products within each other.

By leveraging these tokens, it's possible to provide a default web and Teams branded themes for:
- Light mode
- Dark mode
- High contrast

![Animated GIF of updating the Theme on the Fluent UI React documentation](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iaocgb2fesaoeycsli2u.gif)

Check out this quick start post on branding light and dark modes: 
{% embed https://dev.to/paulgildea/quick-branded-light-and-dark-modes-with-fluent-ui-react-v9-1pe6 %}

## Migration

As you can see, Fluent UI React v9 is a new UI library that has substantial improvements over v8 and v0 in the areas of performance, accessibility, customization, and design to ode. These improvements couldn't have been accomplished in a simple backwards compatible manner, so migration from v0 or v8 to v9 will take some effort. 

The good news is that we're here to help you with your upgrade, check out the [Upgrading](https://react.fluentui.dev/?path=/docs/concepts-upgrading-overview--page) section of our documentation site for tips on getting started.

![Screenshot the of the Upgrade documentation](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9m9fyituys5kymo29ky6.png)

It covers topics like: 
- Component mapping and renames
- Color mappings between theming interfaces
- Component shims

Note, that in some cases it's not just a straight port of existing style overrides. The goal of the new design updates is minimizing the need of style overrides.

Also, you can find component specific migration documentation within our GitHub repository that's co-located to the source code. So, if you're looking for Avatar specific guidance, you can find it here: https://github.com/microsoft/fluentui/blob/master/packages/react-components/react-avatar/MIGRATION.md

We'd love to hear from you! 
    
If you're reading the bottom of this post, thank you! Our team is very proud of the work put into this release and we want to hear your feedback.

If you have any questions, don't hesitate to reach out on: 
- GitHub: https://github.com/microsoft/fluentui
- Docs: https://react.fluentui.dev
- Twitter: https://twitter.com/fluentui

Enjoy!