---
# System prepended metadata

title: Button Fit-Finish

---

# Button Fit-Finish

## What's left?

- [ ] Go over `IButtonProps` one by one and list of the ones that are removed and ones that we still need to implement
- [ ] Run comprehensive screener tests to compare V7/V8 button and make sure no unexpected styling changes
    - https://github.com/microsoft/fluentui/pull/14653
    - https://screener.io/v2/dashboard/Skgr32fUL.microsoft-fluentui/xgao%2Fbutton-fit-finish
- [ ] some of the missing functionality
  - [ ] menu expand keycode (recommend not doing this)
  - [ ] menu persistence
- [ ] typings
- [ ] styling
  - [ ] align with v7
  - [ ] make sure high contrast styling is correct
  - [ ] RTL - use mixins
- [ ] tests
  - [ ] Test button as anchor
- [ ] Documentation updates
  - [ ] New styling approach for Buttons
    - [ ] Button tokens and variants
  - [ ] Recomposition (useButton hook) 
  - [ ] migration plans for removed props
- [ ] V0 side
    - [ ] chidren/as change from Levi
    - [ ] P2: v0 theme -> new theme converter
- [ ] SCSS problem
    - [ ] contextual RTL
    - [ ] loading order (specificity issue) when working with `merge-styles`
    - [ ] SSR / child window scenario

## Button props


| V7 Button | Description | V8 Button |
| -------- | -------- | -------- | -------- |
| componentRef | | ref |
| href     |  If provided, this component will be rendered as an anchor.   | [Has bug](https://codesandbox.io/s/musing-solomon-8dvjw?file=/src/App.tsx)    |
| primary     |   |  Same  |
| uniqueId     | Unique id to identify the item. Typically a duplicate of key value.  | Removed   |
| disabled | | Same |
| allowDisabledFocus | | Removed; https://codesandbox.io/s/button-disabled-focusable-forked-xgz47?file=/src/App.tsx |
| primaryDisabled | If set to true and if this is a splitButton (split == true) then the primary action of a split button is disabled. | Removed, use item.disabled instead  |
| styles | | Removed; needs documentation |
| theme | | Removed |
| checked | | only work on `ToggleButton`. |
| toggle | | use `ToggleButton` |
| className | | Same |
| ariaLabel | | aria-label |
| ariaDescription | | aria-description |
| ariaHidden || aria-hidden |
| text | Text to render button label. If text is supplied, it will override any string in button children. Other children components will be passed through after the text. | Removed. use content |
| iconProps | | use `icon` shorthand |
| menuProps | | use `menu` shorthand (can pass as is) |
| menuIconProps | | use `menuIcon` shorthand |
| split | | use`SplitButton` |
| splitButtonAriaLabel | | use `menu` shorthand | 
| splitButtonMenuProps| | use `menu` shorthand |
| primaryActionButtonProps | Optional props to be applied only to the primary action button of SplitButton |  |
| onAfterMenuDismiss | | Renamed to `onMenuDismiss`  |
| onMenuClick | | use menu shorthand |
| onRenderIcon | | use icon shorthand |
| onRenderText | | use content shorthand |
| onRenderDescription | Custom render function for the desciption text. | use `secondaryText` shorthand on `CompoundButton`|
| onRenderAriaDescription | Custom render function for the aria description element. |  |
| onRenderChildren | | |
| onRenderMenuIcon | | use `menuIcon` shorthand |
| menuAs | Render a custom menu in place of the normal one. | use `menu` shorthand |
| secondaryText | Only used for compound buttons | |
| keytipProps | | Removed; need documentation |
| menuTriggerKeyCode | a custom KeyCode that can be used to open the button menu. | |
| persistMenu | Menu will not be created or destroyed when opened or closed, instead it | create `ContextualMenu` wrapper (pass hidden) and use as default slot |


Obsolete:
```
  /**
   * Deprecated at v1.2.3, to be removed at \>= v2.0.0. Use specific button component instead.
   * @defaultvalue ButtonType.default
   * @deprecated Use specific button component instead.
   */

  buttonType?: ButtonType;

  /**
   * Deprecated at v0.56.2, to be removed at \>= v1.0.0. Just pass in button props instead.
   * they will be mixed into the button/anchor element rendered by the component.
   * @deprecated Use button props instead.
   */
  rootProps?: React.ButtonHTMLAttributes<HTMLButtonElement> | React.AnchorHTMLAttributes<HTMLAnchorElement>;

  /**
   * Any custom data the developer wishes to associate with the menu item.
   * Deprecated, use `checked` if setting state.
   * @deprecated unused, use `checked` if setting state.
   */
  toggled?: boolean;

  /**
   * Any custom data the developer wishes to associate with the menu item.
   */
  data?: any;

  /**
   * Method to provide the classnames to style a button.
   * The default value for this prop is the getClassnames func
   * defined in BaseButton.classnames.
   * @defaultvalue getBaseButtonClassNames
   */
  getClassNames?: (
    theme: ITheme,
    className: string,
    variantClassName: string,
    iconClassName: string | undefined,
    menuIconClassName: string | undefined,
    disabled: boolean,
    checked: boolean,
    expanded: boolean,
    hasMenu: boolean,
    isSplit: boolean | undefined,
    allowDisabledFocus: boolean,
  ) => IButtonClassNames;

  /**
   * Method to provide the classnames to style a button.
   * The default value for this prop is the getClassnames func
   * defined in BaseButton.classnames.
   * @defaultvalue getBaseSplitButtonClassNames
   */
  getSplitButtonClassNames?: (
    disabled: boolean,
    expanded: boolean,
    checked: boolean,
    allowDisabledFocus: boolean,
  ) => ISplitButtonClassNames;


  /**
   * If true, the persisted menu is rendered hidden when the button
   * initially mounts. Non-persisted menus will
   * not be in the component tree unless they are being shown
   *
   * Note: This increases the time the button will take to mount, but
   * can improve perceived menu open perf. when the user opens the menu.
   *
   * @defaultvalue undefined, equivalent to false
   *
   * @deprecated There is known bug in Edge when this prop is true where scrollbars
   * overlap with the content when a menu is first rendered hidden.
   * See: https://github.com/microsoft/fluentui/issues/9034
   * Please do not start using this. If you are already using this,
   * please make sure that you are doing so only in non-Edge browsers
   */
  renderPersistedMenuHiddenOnMount?: boolean;


  /**
   * Style for the description text if applicable (for compound buttons.)
   * Deprecated, use `secondaryText` instead.
   * @deprecated Use `secondaryText` instead.
   */
  description?: IStyle;

  /**
   * yet unknown docs
   */
  defaultRender?: any;

```