BREAKING CHANGE: Encapsulate Popper API#22586
Conversation
Updates `@fluentui/react-positioning` so that none of the popper API and types leak anymore
|
This pull request is automatically built and testable in CodeSandbox. To see build info of the built libraries, click here or the icon next to each commit SHA. Latest deployment of this branch, based on commit d5505bf:
|
📊 Bundle size reportUnchanged fixtures
|
Perf Analysis (
|
| Scenario | Render type | Master Ticks | PR Ticks | Iterations | Status |
|---|---|---|---|---|---|
| FluentProviderWithTheme | mount | 388 | 384 | 10 | Possible regression |
| FluentProviderWithTheme | virtual-rerender | 359 | 346 | 10 | Possible regression |
| FluentProviderWithTheme | virtual-rerender-with-unmount | 405 | 428 | 10 | Possible regression |
All results
| Scenario | Render type | Master Ticks | PR Ticks | Iterations | Status |
|---|---|---|---|---|---|
| Avatar | mount | 1265 | 1249 | 5000 | |
| Button | mount | 760 | 793 | 5000 | |
| FluentProvider | mount | 2305 | 2375 | 5000 | |
| FluentProviderWithTheme | mount | 388 | 384 | 10 | Possible regression |
| FluentProviderWithTheme | virtual-rerender | 359 | 346 | 10 | Possible regression |
| FluentProviderWithTheme | virtual-rerender-with-unmount | 405 | 428 | 10 | Possible regression |
| MakeStyles | mount | 2031 | 1980 | 50000 |
Asset size changesSize Auditor did not detect a change in bundle size for any component! Baseline commit: 51777323141411ce197a6314e211c326af180c60 (build) |
| @@ -0,0 +1,7 @@ | |||
| { | |||
| "type": "prerelease", | |||
| "comment": "BREAKING CHANGE: Encapsulate Popper API", | |||
There was a problem hiding this comment.
| "comment": "BREAKING CHANGE: Encapsulate Popper API", | |
| "comment": "BREAKING: Rename types and APIs to avoid references to third party API", |
?
| positionedElement: Rect; | ||
| target: Rect; | ||
| position: Position; | ||
| alignment?: Alignment; |
There was a problem hiding this comment.
yes, by default our alignment is center
spmonahan
left a comment
There was a problem hiding this comment.
Just putting a block here so we can coordinate merging breaking changes.
behowell
left a comment
There was a problem hiding this comment.
The react-combobox and react-tooltip changes look good, just a few nitpicks. I only skimmed the rest.
| @@ -55,7 +55,7 @@ export const useCombobox_unstable = (props: ComboboxProps, ref: React.Ref<HTMLBu | |||
| const popperOptions = { | |||
There was a problem hiding this comment.
(nit) rename popperOptions to positioningOptions
There was a problem hiding this comment.
Ditto in other places that have a local popperOptions or popperState
…ox/useCombobox.ts Co-authored-by: Ben Howell <[email protected]>
…/useTooltip.tsx Co-authored-by: Ben Howell <[email protected]>
| export type Boundary = HTMLElement | Array<HTMLElement> | 'clippingParents' | 'scrollParent' | 'window'; | ||
|
|
||
| export type PopperRefHandle = { | ||
| export type PositioningImperativeRef = { |
There was a problem hiding this comment.
Nit: Consider PositioningRef. Is the word imperative necessary? Aren't all ref's imperative? :) Do you think there will be other kinds of positioning refs that we'll need to distinguish between?
| position: 'below' as const, | ||
| align: 'start' as const, | ||
| offset: [0, 2] as Offset, | ||
| offset: 2, |
There was a problem hiding this comment.
Should this change be to use the crossAxis, mainAxis offset instead of the single number?
|
|
||
| export type { PositioningProps, PositioningShorthand, PositioningShorthandValue } from '@fluentui/react-positioning'; | ||
| export type { | ||
| PositioningProps, |
There was a problem hiding this comment.
Do you also want to export the types used within these types such as Offset, Alignment, Position?
| import * as PopperJs from '@popperjs/core'; | ||
| import * as React from 'react'; | ||
|
|
||
| type Rect = { |
There was a problem hiding this comment.
Consider if you DOMRect would be a good structure to use here. It has x, y, width, and height, but also top, left, right, and bottom. It can be annoying to create instances of a DOMRect because of the fromRect method, but might fit well with positioning.
| */ | ||
| export function parsePopperPlacement(placement: Placement): { basePlacement: BasePlacement; alignment: Variation } { | ||
| const tokens = placement.split('-'); | ||
| return { |
There was a problem hiding this comment.
Is there any way that the placement could be malformed and not have 2 tokens? If so, consider a check here to either throw a specific error, provide a default, or return null.
| ['top', undefined, 'above'], | ||
| ['bottom', undefined, 'below'], | ||
| ['left', undefined, 'before'], | ||
| ['right', undefined, 'after'], |
There was a problem hiding this comment.
Consider adding invalid input tests.
| [ | ||
| [0, 0], | ||
| [0, 1], | ||
| { crossAxis: 0, mainAxis: 0 }, |
There was a problem hiding this comment.
Can offsets be negative? What is the expected result if they are?
| offset[1] += arrowHeight; | ||
| } else { | ||
| offset[1] = arrowHeight; | ||
| const addArrowOffset = (offset: OffsetObject | number, arrowHeight: number): OffsetObject => { |
There was a problem hiding this comment.
Nit: While typescript will handle it, it is generally better js practice to always put method declarations before you use them when possible.
* BREAKING CHANGE: Encapsulate Popper API Updates `@fluentui/react-positioning` so that none of the popper API and types leak anymore * changefiles * update test * update stories * positioned to positionedElement * update api * remove getBasePlacement * add tests * virtual element and boundary * fix types * PR fixes * update md * fix type * changefile * Update packages/react-components/react-combobox/src/components/Combobox/useCombobox.ts Co-authored-by: Ben Howell <[email protected]> * Update packages/react-components/react-tooltip/src/components/Tooltip/useTooltip.tsx Co-authored-by: Ben Howell <[email protected]> * rename popperOptions to positioningOptions Co-authored-by: Ben Howell <[email protected]>
* react-button: Removing deprecated block prop from all button components (#23071) * react-button: Removing deprecated block prop from all button components. * Removing block stories. * Adding changefile. * Removing block prop from migration guide and vr tests. * fix(react-text): Update typography wrappers to latest naming (#22934) * fix: change Headline to Subtitle1 * fix: change Subheadline to Subtitle2 * fix: change Body to Body1 * fix: change Caption to Caption1 * feat: add Caption2 * chore: use better vr story name * chore: add change files * chore: update api * fix: rename components in missing story * feat: removed unused `caption2ClassName` * chore: disable classname conformance test * chore: remove deprecated className * chore: add conformance test exception * BREAKING: Removing deprecated `<componentName>ClassName` exports from v9 packages (#23026) * removing single static classnames * api files * change files * disabling component-has-static-classname-exported test in react-image * preparing to merge master * disabling export tests * removing change file for text * change file * disabling test in Dialog * disabling more tests * remove react-text class names Co-authored-by: Sean Monahan <[email protected]> * BREAKING: Update string unions to `spinal-case` (#23001) * react-avatar: update unions to use spinal-case BREAKING Per #22596 all string unions are being updated to use spinal-case * react-input: update unions to use spinal-case BREAKING Per #22596 all string unions are being updated to use spinal-case * react-radio: update unions to use spinal-case BREAKING Per #22596 all string unions are being updated to use spinal-case * react-select: update unions to use spinal-case BREAKING Per #22596 all string unions are being updated to use spinal-case * react-spinbutton: update unions to use spinal-case BREAKING Per #22596 all string unions are being updated to use spinal-case * react-tabster: update unions to use spinal-case BREAKING Per #22596 all string unions are being updated to use spinal-case * react-textarea: update unions to use spinal-case BREAKING Per #22596 all string unions are being updated to use spinal-case * react-badge: update unions to use spinal-case BREAKING Per #22596 all string unions are being updated to use spinal-case * react-combobox: update unions to use spinal-case BREAKING Per #22596 all string unions are being updated to use spinal-case * add change files for spinal-case update * react-card: update tabster tab behaviors Updates the `useCard()` implementation after the `react-tabster` spinal-case breaking change. * vr-tests: update types for v9 tests * react-avatar: update badge types in stories Avatar stories were using the old, camelCase PresenceBadge types. * react-badge: fix style that broke with spinal-case change One of the "doNotDisturb" cases was missed due to the non-typesafe way we tested the PresenceBadge status in styles. This test has been changed to a typesafe function call instead. * react-combobox: update props in appearance story Change filledDarker and filledLighter to filled-darker and filled-lighter respectively. * react-badge: update camelCase to spinal-case for strings * fix: missing inputClassName in merge conflict resolution * react-select: update api snapshot * react-alert: update conformance tests * fix: update react-components api snapshot * BREAKING CHANGE: Encapsulate Popper API (#22586) * BREAKING CHANGE: Encapsulate Popper API Updates `@fluentui/react-positioning` so that none of the popper API and types leak anymore * changefiles * update test * update stories * positioned to positionedElement * update api * remove getBasePlacement * add tests * virtual element and boundary * fix types * PR fixes * update md * fix type * changefile * Update packages/react-components/react-combobox/src/components/Combobox/useCombobox.ts Co-authored-by: Ben Howell <[email protected]> * Update packages/react-components/react-tooltip/src/components/Tooltip/useTooltip.tsx Co-authored-by: Ben Howell <[email protected]> * rename popperOptions to positioningOptions Co-authored-by: Ben Howell <[email protected]> * BREAKING: Remove context exports from react-components (#23085) * BREAKING: Remove context exports from react-components In order to provider proper encapsulation and allow us to change internals more easily, this PR removes exports of context objects from react-components. In cases where contexts were removed, the export was replaced with a specific provider component and hook to use the context value. Follows from #22300 * changefile * stop exporting menu contexts * changefile * update md Co-authored-by: Sean Monahan <[email protected]> * react-popover: update api snapshot * BREAKING(react-theme): remove webHighContrastTheme (#23083) * fix(react-theme): Remove webHighContrast theme Co-authored-by: Makoto Morimoto <[email protected]> Co-authored-by: André Dias (he/him) <[email protected]> Co-authored-by: Esteban Munoz Facusse <[email protected]> Co-authored-by: ling1726 <[email protected]> Co-authored-by: Ben Howell <[email protected]> Co-authored-by: Miroslav Stastny <[email protected]>
* react-button: Removing deprecated block prop from all button components (microsoft#23071) * react-button: Removing deprecated block prop from all button components. * Removing block stories. * Adding changefile. * Removing block prop from migration guide and vr tests. * fix(react-text): Update typography wrappers to latest naming (microsoft#22934) * fix: change Headline to Subtitle1 * fix: change Subheadline to Subtitle2 * fix: change Body to Body1 * fix: change Caption to Caption1 * feat: add Caption2 * chore: use better vr story name * chore: add change files * chore: update api * fix: rename components in missing story * feat: removed unused `caption2ClassName` * chore: disable classname conformance test * chore: remove deprecated className * chore: add conformance test exception * BREAKING: Removing deprecated `<componentName>ClassName` exports from v9 packages (microsoft#23026) * removing single static classnames * api files * change files * disabling component-has-static-classname-exported test in react-image * preparing to merge master * disabling export tests * removing change file for text * change file * disabling test in Dialog * disabling more tests * remove react-text class names Co-authored-by: Sean Monahan <[email protected]> * BREAKING: Update string unions to `spinal-case` (microsoft#23001) * react-avatar: update unions to use spinal-case BREAKING Per microsoft#22596 all string unions are being updated to use spinal-case * react-input: update unions to use spinal-case BREAKING Per microsoft#22596 all string unions are being updated to use spinal-case * react-radio: update unions to use spinal-case BREAKING Per microsoft#22596 all string unions are being updated to use spinal-case * react-select: update unions to use spinal-case BREAKING Per microsoft#22596 all string unions are being updated to use spinal-case * react-spinbutton: update unions to use spinal-case BREAKING Per microsoft#22596 all string unions are being updated to use spinal-case * react-tabster: update unions to use spinal-case BREAKING Per microsoft#22596 all string unions are being updated to use spinal-case * react-textarea: update unions to use spinal-case BREAKING Per microsoft#22596 all string unions are being updated to use spinal-case * react-badge: update unions to use spinal-case BREAKING Per microsoft#22596 all string unions are being updated to use spinal-case * react-combobox: update unions to use spinal-case BREAKING Per microsoft#22596 all string unions are being updated to use spinal-case * add change files for spinal-case update * react-card: update tabster tab behaviors Updates the `useCard()` implementation after the `react-tabster` spinal-case breaking change. * vr-tests: update types for v9 tests * react-avatar: update badge types in stories Avatar stories were using the old, camelCase PresenceBadge types. * react-badge: fix style that broke with spinal-case change One of the "doNotDisturb" cases was missed due to the non-typesafe way we tested the PresenceBadge status in styles. This test has been changed to a typesafe function call instead. * react-combobox: update props in appearance story Change filledDarker and filledLighter to filled-darker and filled-lighter respectively. * react-badge: update camelCase to spinal-case for strings * fix: missing inputClassName in merge conflict resolution * react-select: update api snapshot * react-alert: update conformance tests * fix: update react-components api snapshot * BREAKING CHANGE: Encapsulate Popper API (microsoft#22586) * BREAKING CHANGE: Encapsulate Popper API Updates `@fluentui/react-positioning` so that none of the popper API and types leak anymore * changefiles * update test * update stories * positioned to positionedElement * update api * remove getBasePlacement * add tests * virtual element and boundary * fix types * PR fixes * update md * fix type * changefile * Update packages/react-components/react-combobox/src/components/Combobox/useCombobox.ts Co-authored-by: Ben Howell <[email protected]> * Update packages/react-components/react-tooltip/src/components/Tooltip/useTooltip.tsx Co-authored-by: Ben Howell <[email protected]> * rename popperOptions to positioningOptions Co-authored-by: Ben Howell <[email protected]> * BREAKING: Remove context exports from react-components (microsoft#23085) * BREAKING: Remove context exports from react-components In order to provider proper encapsulation and allow us to change internals more easily, this PR removes exports of context objects from react-components. In cases where contexts were removed, the export was replaced with a specific provider component and hook to use the context value. Follows from microsoft#22300 * changefile * stop exporting menu contexts * changefile * update md Co-authored-by: Sean Monahan <[email protected]> * react-popover: update api snapshot * BREAKING(react-theme): remove webHighContrastTheme (microsoft#23083) * fix(react-theme): Remove webHighContrast theme Co-authored-by: Makoto Morimoto <[email protected]> Co-authored-by: André Dias (he/him) <[email protected]> Co-authored-by: Esteban Munoz Facusse <[email protected]> Co-authored-by: ling1726 <[email protected]> Co-authored-by: Ben Howell <[email protected]> Co-authored-by: Miroslav Stastny <[email protected]>

Offset array -> Offset object
Use the same API as Floating UI
Before
After
Offset function argument
Stops using third party library naming and concepts in the offset function. Instead of using Popper placement, uses
positionandalignconcepts from the library:Before
After
PopperVirtualElement->PositioningVirtualElementFollows the Floating UI virtual element type. The only difference is that
x&yare now required.TS playground with example
popperRef->positioningRefRemoves
Popperinstances from our APIBefore
After
PopperVirtualElement->PositioningVirtualElementType was renamed.
Fixes #22585