Skip to content
Merged
Show file tree
Hide file tree
Changes from 12 commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
2b7eabf
Add aria alert text
edwlmsft Jun 7, 2018
eea962f
Add keypress shortcut to open coachmark
edwlmsft Jun 7, 2018
ec0dad4
Have narrator announce TeachingBubbleContent text upon coachmark open…
edwlmsft Jun 7, 2018
f97afeb
Merge branch 'master' of https://github.com/OfficeDev/office-ui-fabri…
Jun 8, 2018
689018c
Add aria-hidden to beak component
Jun 8, 2018
a4f5f14
Add aria-hidden to ariaAlert container once Coachmark is expanded. C…
Jun 8, 2018
6e9019a
Change back to FocusZone. Add ariaLabelled and ariaDescribedBy props…
Jun 8, 2018
1576232
Remove force focus on coachmark after mounting. Remove console logs
Jun 8, 2018
17ac4d7
Only render elements if ariaLabelledBy and ariaDescribedBy props are …
Jun 8, 2018
4fa9c4d
Update snapshot test for TeachingBubble
edwlmsft Jun 13, 2018
1fd35d6
Merge branch 'master' of https://github.com/OfficeDev/office-ui-fabri…
edwlmsft Jun 14, 2018
752ef79
Add change file
edwlmsft Jun 15, 2018
e4c7b20
Add onKeyDown, change from FocusZone to FocusTrapZone. Remove setTim…
edwlmsft Jun 18, 2018
e70b32b
Merge branch 'coachmarkAccessibility' of https://github.com/leddie24/…
edwlmsft Jun 18, 2018
f2173de
Add escape key handler to TeachingBubbleContent
edwlmsft Jun 18, 2018
f1e86c5
Remove onClick, change from h1 to p
edwlmsft Jun 18, 2018
344167f
Add back in setTimeout for appending ariaAlertText.
edwlmsft Jun 19, 2018
93811cf
Change from aria-hidden to role="presentation" for Beak component.
edwlmsft Jun 19, 2018
32029ac
Merge branch 'master' of https://github.com/OfficeDev/office-ui-fabri…
edwlmsft Jun 19, 2018
ef70ee4
Fix inadvertent change to AppState.tsx file (checkout from master)
edwlmsft Jun 19, 2018
101854f
Update Do's. Edit basic example ariaDescribedByText prop. Add chang…
edwlmsft Jun 20, 2018
7774b0e
Change import path of FocusTrapZone to use relative path. Add alertT…
edwlmsft Jun 26, 2018
3b1c254
Merge branch 'master' of https://github.com/OfficeDev/office-ui-fabri…
edwlmsft Jul 6, 2018
94b7034
Fix bad commits
edwlmsft Jul 6, 2018
413e38d
remove unused css import for Beak
edwlmsft Jul 6, 2018
89b06a9
fix bad commit for package.json in dashboard-grid-layout
edwlmsft Jul 6, 2018
e149c87
remove unused change file
edwlmsft Jul 6, 2018
989b8b7
Fix teachingBubbleRef interface
edwlmsft Jul 7, 2018
4884b00
Add line
edwlmsft Jul 7, 2018
b04c5b3
Remove redundant check for this.props.teachingBubbleRef. Move event …
edwlmsft Jul 9, 2018
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion apps/fabric-website/src/components/App/AppState.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -512,7 +512,10 @@ export const AppState: IAppState = {
title: 'Shimmer',
url: '#/components/shimmer',
component: () => <LoadingComponent title="Shimmer" />,
getComponent: cb => require.ensure([], (require) => cb(require<any>('../../pages/Components/ShimmerComponentPage').ShimmerComponentPage))
getComponent: cb =>
require.ensure([], require =>
cb(require<any>('../../pages/Components/ShimmerComponentPage').ShimmerComponentPage)
)
},
{
title: 'Slider',
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"changes": [
{
"packageName": "office-ui-fabric-react",
"comment": "Coachmark: Add accessibility features to component, ARIA props, narrator support, and keyboarding controls",
"type": "minor"
}
],
"packageName": "office-ui-fabric-react",
"email": "edwl@microsoft.com"
}
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,4 @@
"git add"
]
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ export class Beak extends BaseComponent<IBeakProps, {}> {
});

return (
<div className={css('ms-Beak', classNames.root)}>
<div className={css('ms-Beak', classNames.root)} aria-hidden="true">

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there a strict need for aria-hidden? I'm curious since this element doesn't have an explicit role

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure here. Is aria-hidden only required if an element has a role attribute? I haven't done a lot of accessibility work before, so advice is appreciated here. It looks like narrator focuses on the Beak and reads aloud as "image" if it's in scan mode, which I don't think is desirable.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Aria-hidden hides all the subelements so it won't try to read the svg. Seems reasonable.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you try role='presentation' and see if that solves the issue? aria-hidden is kinda like a last resort hack.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sure, updated to role="presentation"

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You likely need it on the svg itself.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of the root element, or both?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I thought it needed to be on the element and wasn't inherited. Give it a try w/ narrator+edge

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can leave it on the root element only. We have a FocusTrapZone on Coachmark anyways, so we can't tab out to the Beak element.

<svg height={svgHeight} width={svgWidth} className={classNames.beak}>
<polygon points={pointOne + ' ' + pointTwo + ' ' + pointThree} />
</svg>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,11 @@ export interface ICoachmarkStyles {
* The styles applied when the coachmark has collapsed.
*/
collapsed?: IStyle;

/**
* The styles applied to the ARIA attribute container
*/
ariaContainer?: IStyle;
}

export const translateOne: string = keyframes({
Expand Down Expand Up @@ -353,6 +358,10 @@ export function getStyles(props: ICoachmarkStyleProps, theme: ITheme = getTheme(
!props.isMeasuring && {
visibility: 'visible'
}
]
],
ariaContainer: {
position: 'fixed',
opacity: 0
}
};
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
// Utilities
import * as React from 'react';
import { BaseComponent, IRectangle, classNamesFunction, createRef, shallowCompare } from '../../Utilities';
import { BaseComponent, classNamesFunction, createRef, IRectangle, KeyCodes, shallowCompare } from '../../Utilities';
import { DefaultPalette } from '../../Styling';
import { IPositionedData, RectangleEdge, getOppositeEdge } from 'office-ui-fabric-react/lib/utilities/positioning';

// Component Dependencies
import { PositioningContainer, IPositioningContainer } from './PositioningContainer/index';
import { Beak, BEAK_HEIGHT, BEAK_WIDTH } from './Beak/Beak';
import { DirectionalHint } from 'office-ui-fabric-react/lib/common/DirectionalHint';
import { FocusZone } from '../../FocusZone';

// Coachmark
import { ICoachmarkTypes } from './Coachmark.types';
Expand All @@ -18,7 +19,6 @@ import {
ICoachmarkStyles,
ICoachmarkStyleProps
} from './Coachmark.styles';
import { FocusZone } from '../../FocusZone';

const getClassNames = classNamesFunction<ICoachmarkStyleProps, ICoachmarkStyles>();

Expand Down Expand Up @@ -115,6 +115,7 @@ export class Coachmark extends BaseComponent<ICoachmarkTypes, ICoachmarkState> {
*/
private _entityInnerHostElement = createRef<HTMLDivElement>();
private _translateAnimationContainer = createRef<HTMLDivElement>();
private _ariaAlertContainer = createRef<HTMLDivElement>();
private _positioningContainer = createRef<IPositioningContainer>();

/**
Expand Down Expand Up @@ -149,7 +150,17 @@ export class Coachmark extends BaseComponent<ICoachmarkTypes, ICoachmarkState> {
}

public render(): JSX.Element {
const { children, target, color, positioningContainerProps } = this.props;
const {
children,
target,
color,
positioningContainerProps,
ariaDescribedBy,
ariaDescribedByText,
ariaLabelledBy,
ariaLabelledByText,
ariaAlertText
} = this.props;

const {
beakLeft,
Expand Down Expand Up @@ -188,6 +199,14 @@ export class Coachmark extends BaseComponent<ICoachmarkTypes, ICoachmarkState> {
{...positioningContainerProps}
>
<div className={classNames.root}>
{ariaAlertText && (
<div
className={classNames.ariaContainer}
aria-live="assertive"

@cschlechty cschlechty Jun 18, 2018

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If you used role="alert" will it read? We could then remove the timeout, or is the timeout to focus the dialog content?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I reverted the change back to a setTimeout and appending a textNode. It doesn't seem to work unless it's one of these hacky methods:

https://developer.paciellogroup.com/blog/2012/06/html5-accessibility-chops-aria-rolealert-browser-support/

ref={this._ariaAlertContainer}
aria-hidden={!isCollapsed}
/>
)}
<div className={classNames.pulsingBeacon} />
<div className={classNames.translateAnimationContainer} ref={this._translateAnimationContainer}>
<div className={classNames.scaleAnimationLayer}>
Expand All @@ -203,8 +222,32 @@ export class Coachmark extends BaseComponent<ICoachmarkTypes, ICoachmarkState> {
/>
)}
<FocusZone>
<div className={classNames.entityHost} data-is-focusable={true} onFocus={this._onFocusHandler}>
<div className={classNames.entityInnerHost} ref={this._entityInnerHostElement}>
<div
className={classNames.entityHost}
tabIndex={-1}
data-is-focusable={true}
onClick={this._onFocusHandler}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need a click?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed onClick

role="dialog"
aria-labelledby={ariaLabelledBy}
aria-describedby={ariaDescribedBy}
>
{isCollapsed &&
ariaLabelledBy && (
<h1 id={ariaLabelledBy} className={classNames.ariaContainer}>

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why H1? I thought we decided to not use a header

@leddie24 leddie24 Jun 19, 2018

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changed to a <p> element

{ariaLabelledByText}
</h1>
)}
{isCollapsed &&
ariaDescribedBy && (
<p id={ariaDescribedBy} className={classNames.ariaContainer}>

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You can move this up to the other isCollapsed section so you don't need to evaluate twice. You might need to make it an array if it complains about needing a single parent but I don't believe you'll need to do that.

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in latest commit

{ariaDescribedByText}
</p>
)}
<div
className={classNames.entityInnerHost}
ref={this._entityInnerHostElement}
aria-hidden={isCollapsed}
>
{children}
</div>
</div>
Expand Down Expand Up @@ -255,14 +298,37 @@ export class Coachmark extends BaseComponent<ICoachmarkTypes, ICoachmarkState> {
this.forceUpdate();
}

document.addEventListener('keydown', this._onKeyDown, true);

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BaseComponent provides _events that should be used for these.. it automatically takes care of a lot of housekeeping for you. For example in KeytipLayer.base.tsx:

this._events.on(window, 'keydown', this._onKeyDown, true);


// We dont want to the user to immediatley trigger the coachmark when it's opened
this._async.setTimeout(() => {
this._addProximityHandler(this.props.mouseProximityOffset);
}, this.props.delayBeforeMouseOpen!);

// SetTimeout is hacky solution. ARIA text doesn't read aloud unless it is appended or changed after the component
// is mounted

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What would be the fix for this? Is this an issue with ARIA spec or with Narrator?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It looks like it's behaving correctly now? I removed the hacky solution and just had the text render directly inside of the <div>

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

False alarm, I tested this incorrectly. I switched to using setTimeout and appending a textNode. See here:

https://developer.paciellogroup.com/blog/2012/06/html5-accessibility-chops-aria-rolealert-browser-support/

if (this.props.ariaAlertText) {
this._async.setTimeout(() => {
if (this._ariaAlertContainer.current && this.props.ariaAlertText) {
this._ariaAlertContainer.current.innerText = this.props.ariaAlertText;
}
}, 2000);
}
}
);
}

public componentWillUnmount(): void {
document.removeEventListener('keydown', this._onKeyDown);
}

private _onKeyDown = (e: KeyboardEvent): void => {
// Open coachmark if user presses ALT + C (arbitrary keypress for now, will change later)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This answers a question I had.. how a user selects or activates the coachmark. It appears there is not a clearly defined role for this in ARIA. I'm curious what this could be changed to? Is there a standard of behavior for coachmarks that you know of?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you elaborate here? Not entirely sure what your ask is. Are you asking if we can/should customize the shortcut to open Coachmark? @cschlechty , can you chime in here if you have a chance please?

@JasonGore JasonGore Jun 18, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, I'm asking how a user using Narrator actually enters and highlights the Coachmark using keyboard navigation. Tabbing seems to go past it. In the ARIA standard, I couldn't find a specified way to highlight a non-modal dialog.

Alt+C highlights it, but I'm curious how a user using assistive technology would know this.. is it standardized anywhere?

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's not a stand control or pattern. We're inventing it, and pushing its usage instructions via embedded usage string. @leddie24 be sure this is included in the examples.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is that embedded usage string in this PR? I'm assuming it informs users about hitting ALT+C. I couldn't find it.. thanks

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It'll be included in the prop for the control.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So it will only be set from outside the control? The default selection behavior is embedded in the control, so I'm wondering if the default notification on usage should be as well. (Similar to how "A coachmark has appeared" is.)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"A coachmark has appeared" and the usage instructions need to be localize-able, so they'll need to be passed in.

@JasonGore JasonGore Jun 18, 2018

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand that, but some are defaulted to English within the component and others are not. I feel like the navigation info is probably the most important one to be present (if any will be.)

if (e.altKey && e.which === KeyCodes.c) {
this._onFocusHandler();
}
};

private _onFocusHandler = (): void => {
if (this.state.isCollapsed) {
this._openCoachmark();
Expand Down Expand Up @@ -403,6 +469,13 @@ export class Coachmark extends BaseComponent<ICoachmarkTypes, ICoachmarkState> {
this._entityInnerHostElement.current.addEventListener(
'transitionend',
(): void => {
// Need setTimeout to trigger narrator
this._async.setTimeout(() => {
if (this.props.teachingBubbleRef && this.props.teachingBubbleRef.current) {
this.props.teachingBubbleRef.current.focus();
}
}, 500);

if (this.props.onAnimationOpenEnd) {
this.props.onAnimationOpenEnd();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { Coachmark } from './Coachmark';
import { ICoachmarkStyles, ICoachmarkStyleProps } from './Coachmark.styles';
import { IPositioningContainerTypes } from './PositioningContainer/PositioningContainer.types';
import { IStyleFunctionOrObject } from '../../Utilities';
import { ITeachingBubble } from '../../TeachingBubble';

export interface ICoachmark {}

Expand Down Expand Up @@ -114,4 +115,39 @@ export interface ICoachmarkTypes extends React.Props<Coachmark> {
* Beacon color two.
*/
beaconColorTwo?: string;

/**
* Text to announce to screen reader / narrator when Coachmark is displayed
*/
ariaAlertText?: string;

/**

@leddie24 leddie24 Jul 6, 2018

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@JasonGore Any suggestions here? I'm not quite sure how make the interface for teachingBubbleRef look nicer.

* Ref for TeachingBubble
* @todo Fix interface here

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What needs to be fixed about this interface?

*/
teachingBubbleRef?: {
(component: ITeachingBubble | null): void;
current: ITeachingBubble | null;
value: ITeachingBubble | null;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This seems like a weird flattened mixing of componentRef and and createRef, did you mean to do this?

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes, not entirely sure what the right interface is. If I set it to teachingBubbleRef?: (component: ITeachingBubble | null) => void; then I don't have access to this.props.teachingBubbleRef.current in Coachmark.tsx (line 487). Do you know what's the correct way to implement this?

};

/**
* Defines the element id referencing the element containing label text for Coachmark.
*/
ariaLabelledBy?: string;

/**
* Defines the element id referencing the element containing the description for the Coachmark.
*/
ariaDescribedBy?: string;

/**
* Defines the text content for the ariaLabelledBy element
*/
ariaLabelledByText?: string;

/**
* Defines the text content for the ariaDescribedBy element
*/
ariaDescribedByText?: string;
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import * as React from 'react';
import { Coachmark } from '../Coachmark';
import { TeachingBubbleContent } from 'office-ui-fabric-react/lib/TeachingBubble';
import { ITeachingBubble, TeachingBubbleContent } from 'office-ui-fabric-react/lib/TeachingBubble';
import { DefaultButton, IButtonProps } from 'office-ui-fabric-react/lib/Button';
import { DirectionalHint } from 'office-ui-fabric-react/lib/common/DirectionalHint';
import { IStyle } from '../../../Styling';
Expand Down Expand Up @@ -31,6 +31,7 @@ export interface ICoachmarkBasicExampleStyles {

export class CoachmarkBasicExample extends BaseComponent<{}, ICoachmarkBasicExampleState> {
private _targetButton = createRef<HTMLDivElement>();
private _teachingBubbleContent = createRef<ITeachingBubble>();

public constructor(props: {}) {
super(props);
Expand Down Expand Up @@ -104,14 +105,23 @@ export class CoachmarkBasicExample extends BaseComponent<{}, ICoachmarkBasicExam
positioningContainerProps={{
directionalHint: this.state.coachmarkPosition
}}
ariaAlertText="A Coachmark has appeared"
teachingBubbleRef={this._teachingBubbleContent}
ariaDescribedBy={'coachmark-desc1'}
ariaLabelledBy={'coachmark-label1'}
ariaDescribedByText={'Press enter for more information'}
ariaLabelledByText={'Coachmark notification'}
>
<TeachingBubbleContent
componentRef={this._teachingBubbleContent}
headline="Example Title"
hasCloseIcon={true}
closeButtonAriaLabel="Close"
primaryButtonProps={buttonProps}
secondaryButtonProps={buttonProps2}
onDismiss={this._onDismiss}
ariaDescribedBy={'example-description1'}
ariaLabelledBy={'example-label1'}
>
Welcome to the land of Coachmarks!
</TeachingBubbleContent>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ export class DetailsListCustomGroupHeadersExample extends React.Component {
<div className="DetailsListExample-customHeader">
<div className="DetailsListExample-customHeaderTitle">{`I am a custom header for: ${
props!.group!.name
}`}</div>
}`}</div>
<div className="DetailsListExample-customHeaderLinkSet">
<Link className="DetailsListExample-customHeaderLink" onClick={this._onToggleSelectGroup(props!)}>
{props!.isSelected ? 'Remove selection' : 'Select group'}
Expand All @@ -44,7 +44,7 @@ export class DetailsListCustomGroupHeadersExample extends React.Component {
<div className="DetailsListExample-customHeader">
<div className="DetailsListExample-customHeaderTitle">{`I'm a custom footer for: ${
props!.group!.name
}`}</div>
}`}</div>
</div>
)
}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ export class DetailsListDragDropExample extends React.Component<
items: {}[];
selectionDetails?: string;
}
> {
> {
private _selection: Selection;

constructor(props: {}) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,15 @@ export const ExtendedPeoplePickerPageProps: IDocPageProps = {
],
overview: require<
string
>('!raw-loader!office-ui-fabric-react/src/components/ExtendedPicker/docs/ExtendedPeoplePickerOverview.md'),
>('!raw-loader!office-ui-fabric-react/src/components/ExtendedPicker/docs/ExtendedPeoplePickerOverview.md'),
bestPractices: require<
string
>('!raw-loader!office-ui-fabric-react/src/components/ExtendedPicker/docs/ExtendedPeoplePickerBestPractices.md'),
>('!raw-loader!office-ui-fabric-react/src/components/ExtendedPicker/docs/ExtendedPeoplePickerBestPractices.md'),
dos: require<
string
>('!raw-loader!office-ui-fabric-react/src/components/ExtendedPicker/docs/ExtendedPeoplePickerDos.md'),
>('!raw-loader!office-ui-fabric-react/src/components/ExtendedPicker/docs/ExtendedPeoplePickerDos.md'),
donts: require<
string
>('!raw-loader!office-ui-fabric-react/src/components/ExtendedPicker/docs/ExtendedPeoplePickerDonts.md'),
>('!raw-loader!office-ui-fabric-react/src/components/ExtendedPicker/docs/ExtendedPeoplePickerDonts.md'),
isHeaderVisible: true
};
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,15 @@ export const FloatingPeoplePickerPageProps: IDocPageProps = {
],
overview: require<
string
>('!raw-loader!office-ui-fabric-react/src/components/FloatingPicker/PeoplePicker/docs/FloatingPeoplePickerOverview.md'),
>('!raw-loader!office-ui-fabric-react/src/components/FloatingPicker/PeoplePicker/docs/FloatingPeoplePickerOverview.md'),
bestPractices: require<
string
>('!raw-loader!office-ui-fabric-react/src/components/FloatingPicker/PeoplePicker/docs/FloatingPeoplePickerBestPractices.md'),
>('!raw-loader!office-ui-fabric-react/src/components/FloatingPicker/PeoplePicker/docs/FloatingPeoplePickerBestPractices.md'),
dos: require<
string
>('!raw-loader!office-ui-fabric-react/src/components/FloatingPicker/PeoplePicker/docs/FloatingPeoplePickerDos.md'),
>('!raw-loader!office-ui-fabric-react/src/components/FloatingPicker/PeoplePicker/docs/FloatingPeoplePickerDos.md'),
donts: require<
string
>('!raw-loader!office-ui-fabric-react/src/components/FloatingPicker/PeoplePicker/docs/FloatingPeoplePickerDonts.md'),
>('!raw-loader!office-ui-fabric-react/src/components/FloatingPicker/PeoplePicker/docs/FloatingPeoplePickerDonts.md'),
isHeaderVisible: true
};
Loading