diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 853c516dad689..7b8cb59f31cd8 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -86,7 +86,7 @@ OverflowSet/ @micahgodbolt # Overlay/ # Panel/ # Persona/ -Persona/PersonaCoin.tsx @mtennoe @jakob101 +Persona/PersonaCoin/ @mtennoe @jakob101 Persona/PersonaConsts.tsx @mtennoe @jakob101 pickers/ @joschect # Pivot/ @@ -105,4 +105,59 @@ TeachingBubble/ @micahgodbolt Toggle/ @phkuo Tooltip/ @micahgodbolt +## Docs +# ActivityItem/docs/ +# Breadcrumb/docs/ +# Button/docs/ +Calendar/docs/ @lorejoh12 @sathi23 +Callout/docs/ @joschect +# Check/docs/ +# Checkbox/docs/ +ChoiceGroup/docs/ @srideshpande +# ColorPicker/docs/ +# ComboBox/docs/ +CommandBar/docs/ @micahgodbolt +ContextualMenu/docs/ @joschect +DatePicker/docs/ @lorejoh12 @sathi23 +# DetailsList/docs/ +# Dialog/docs/ +DocumentCard/docs/ @yiminwu @mikewheaton +# Dropdown/docs/ +# Fabric/docs/ +# FacePile/docs/ +# FocusTrapZone/docs/ +# FocusZone/docs/ +GroupedList/docs/ @aditima +HoverCard/docs/ @atneik @Jahnp +# Icon/docs/ +# Image/docs/ +# Label/docs/ +Layer/docs/ @ThomasMichon +# Link/docs/ +List/docs/ @cschleiden +# MarqueeSelection/docs/ +# MessageBar/docs/ +# Modal/docs/ +# Nav/docs/ +OverflowSet/docs/ @micahgodbolt +# Overlay/docs/ +# Panel/docs/ +# Persona/docs/ +pickers/docs/ @joschect +# Pivot/docs/ +# Popup/docs/ +# ProgressIndicator/docs/ +Rating/docs/ @cschleiden +ResizeGroup/docs/ @micahgodbolt +# SearchBox/docs/ +# Slider/docs/ +# SpinButton/docs/ +# Spinner/docs/ +# SwatchColorPicker/docs/ +TeachingBubble/docs/ @micahgodbolt +# TextField/docs/ +# Theme/docs/ +Toggle/docs/ @phkuo +Tooltip/docs/ @micahgodbolt + diff --git a/.npm-version b/.npm-version index ad98597185fb2..4cc0e35cb30cf 100644 --- a/.npm-version +++ b/.npm-version @@ -1 +1 @@ -2.x \ No newline at end of file +5.6.0 \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 03a88d5329b50..37768f45f9542 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,4 +7,4 @@ script: fi - npm run buildfast - npm run bundlesize - - npm run vrtest + - npm run vrtest \ No newline at end of file diff --git a/README.md b/README.md index 756d6f9893cc3..e353e806ae318 100644 --- a/README.md +++ b/README.md @@ -127,7 +127,7 @@ In Jest: For advanced usage including info about module vs. path-based imports, using an AMD bundler like Require, and deployment features, see our [advanced documentation](./ghdocs/BestPractices/Advanced.md). -## Contribute to Office UI Fabric React +## Contribute to Fabric React Please take a look at our [contribution guidelines](./ghdocs/Contributing/Contributing.md) for more info. Also read [Contribute Bug fixes](./ghdocs/Contributing/BugFixes.md) and [Contribute New component](./ghdocs/Contributing/NewComponent.md). diff --git a/apps/fabric-website/CHANGELOG.json b/apps/fabric-website/CHANGELOG.json index ec6015e7ba8ae..549326a38cd41 100644 --- a/apps/fabric-website/CHANGELOG.json +++ b/apps/fabric-website/CHANGELOG.json @@ -1,6 +1,44 @@ { "name": "@uifabric/fabric-website", "entries": [ + { + "version": "5.7.0", + "tag": "@uifabric/fabric-website_v5.7.0", + "date": "Tue, 17 Apr 2018 18:47:11 GMT", + "comments": { + "minor": [ + { + "author": "lynamemi ", + "commit": "8829b1fde1bbe2e6920b5e619727835184a15b45", + "comment": "GetStarted page: Give titles links to their corresponding pages." + } + ], + "dependency": [ + { + "comment": "Updating dependency \"office-ui-fabric-react\" from `>=5.82.1 <6.0.0` to `>=5.82.2 <6.0.0`" + } + ] + } + }, + { + "version": "5.6.1", + "tag": "@uifabric/fabric-website_v5.6.1", + "date": "Mon, 16 Apr 2018 10:23:26 GMT", + "comments": { + "patch": [ + { + "author": "David Zearing ", + "commit": "6f8a180ae2ecca66d09be97e48e8e03cc17d4d9e", + "comment": "Updating build to React 16.3.1." + } + ], + "dependency": [ + { + "comment": "Updating dependency \"office-ui-fabric-react\" from `>=5.81.1 <6.0.0` to `>=5.82.0 <6.0.0`" + } + ] + } + }, { "version": "5.6.0", "tag": "@uifabric/fabric-website_v5.6.0", diff --git a/apps/fabric-website/CHANGELOG.md b/apps/fabric-website/CHANGELOG.md index d9d87e339be9d..2cb7da3dab9aa 100644 --- a/apps/fabric-website/CHANGELOG.md +++ b/apps/fabric-website/CHANGELOG.md @@ -1,6 +1,20 @@ # Change Log - @uifabric/fabric-website -This log was last generated on Thu, 05 Apr 2018 10:15:39 GMT and should not be manually modified. +This log was last generated on Tue, 17 Apr 2018 18:47:11 GMT and should not be manually modified. + +## 5.7.0 +Tue, 17 Apr 2018 18:47:11 GMT + +### Minor changes + +- GetStarted page: Give titles links to their corresponding pages. + +## 5.6.1 +Mon, 16 Apr 2018 10:23:26 GMT + +### Patches + +- Updating build to React 16.3.1. ## 5.6.0 Thu, 05 Apr 2018 10:15:39 GMT diff --git a/apps/fabric-website/index.html b/apps/fabric-website/index.html index 4a0ec3a93ccfa..9d6ea18b80e52 100644 --- a/apps/fabric-website/index.html +++ b/apps/fabric-website/index.html @@ -45,8 +45,8 @@ } var scripts = [ - '//cdnjs.cloudflare.com/ajax/libs/react/16.2.0/umd/react.production.min.js', - '//cdnjs.cloudflare.com/ajax/libs/react-dom/16.2.0/umd/react-dom.production.min.js', + '//cdnjs.cloudflare.com/ajax/libs/react/16.3.1/umd/react.production.min.js', + '//cdnjs.cloudflare.com/ajax/libs/react-dom/16.3.1/umd/react-dom.production.min.js', '/fabric-sitev5.js' ]; diff --git a/apps/fabric-website/package.json b/apps/fabric-website/package.json index 9cf173dfe5965..a0bad07864595 100644 --- a/apps/fabric-website/package.json +++ b/apps/fabric-website/package.json @@ -1,6 +1,6 @@ { "name": "@uifabric/fabric-website", - "version": "5.6.0", + "version": "5.7.0", "description": "Reusable React components for building experiences for Office 365.", "main": "lib/index.js", "typings": "lib/index.d.ts", @@ -22,16 +22,16 @@ "@types/node": "8.0.26", "@types/prop-types": "15.5.2", "@types/resemblejs": "~1.3.28", - "@types/react": "16.0.25", - "@types/react-dom": "16.0.3", + "@types/react": "16.3.10", + "@types/react-dom": "16.0.5", "@types/webpack-env": "1.13.0", "es6-promise": "^4.1.0", "es6-weak-map": "^2.0.2", "highlight.js": "^9.12.0", "office-ui-fabric-core": ">=9.0.0 <10.0.0", "office-ui-fabric-react-tslint": ">=5.0.0 <6.0.0", - "react": "^16.2.0", - "react-dom": "^16.2.0", + "react": "^16.3.1", + "react-dom": "^16.3.1", "react-highlight": "^0.10.0", "write-file-webpack-plugin": "^4.1.0" }, @@ -39,7 +39,7 @@ "@microsoft/load-themed-styles": "^1.7.13", "color-functions": "1.1.0", "json-loader": "^0.5.7", - "office-ui-fabric-react": ">=5.81.1 <6.0.0", + "office-ui-fabric-react": ">=5.85.0 <6.0.0", "tslib": "^1.7.1" } } \ No newline at end of file diff --git a/apps/fabric-website/src/components/App/App.tsx b/apps/fabric-website/src/components/App/App.tsx index 38b5c98c5e03a..103875380d1d9 100644 --- a/apps/fabric-website/src/components/App/App.tsx +++ b/apps/fabric-website/src/components/App/App.tsx @@ -27,7 +27,7 @@ export class App extends React.Component { }; } - public componentDidMount() { + public componentDidMount(): void { window.addEventListener('scroll', this._handleNavPositioning); window.addEventListener('resize', this._handleNavPositioning); @@ -35,12 +35,12 @@ export class App extends React.Component { this._handleNavPositioning(); } - public componentWillUnmount() { + public componentWillUnmount(): void { window.removeEventListener('scroll', this._handleNavPositioning); window.removeEventListener('resize', this._handleNavPositioning); } - public render() { + public render(): JSX.Element { let { navHeight } = this.state; let navPosition: 'fixed' | 'absolute' = this.state.isAttached ? 'fixed' : 'absolute'; let navStyle = { diff --git a/apps/fabric-website/src/components/CodeBlock/CodeBlock.tsx b/apps/fabric-website/src/components/CodeBlock/CodeBlock.tsx index e5d8ce6a6f775..4856de58c4112 100644 --- a/apps/fabric-website/src/components/CodeBlock/CodeBlock.tsx +++ b/apps/fabric-website/src/components/CodeBlock/CodeBlock.tsx @@ -49,7 +49,7 @@ export class CodeBlock extends React.Component this._onToggleClicked = this._onToggleClicked.bind(this); } - public render() { + public render(): JSX.Element { let { language, isCollapsible, isLightTheme, children } = this.props; let { isOpen } = this.state; diff --git a/apps/fabric-website/src/components/ColorTable/ColorTable.tsx b/apps/fabric-website/src/components/ColorTable/ColorTable.tsx index ed7c3d59482b0..c8668c67451a7 100644 --- a/apps/fabric-website/src/components/ColorTable/ColorTable.tsx +++ b/apps/fabric-website/src/components/ColorTable/ColorTable.tsx @@ -14,7 +14,7 @@ export interface IColorTableState { } export class ColorTable extends React.Component { - public render() { + public render(): JSX.Element { let { content } = this.props; return ( diff --git a/apps/fabric-website/src/components/DOIcon/DOIcon.tsx b/apps/fabric-website/src/components/DOIcon/DOIcon.tsx index e212f0f6c8a38..631ad9ced549a 100644 --- a/apps/fabric-website/src/components/DOIcon/DOIcon.tsx +++ b/apps/fabric-website/src/components/DOIcon/DOIcon.tsx @@ -12,7 +12,7 @@ export class DOIcon extends React.Component { ariaHidden: true }; - public render() { + public render(): JSX.Element { return (
@@ -174,7 +174,7 @@ export class DONavigation extends React.Component { - public static defaultProps = { - role: 'menuitem' - }; + public static defaultProps = { + role: 'menuitem' + }; - public render() { - return ( - - { this._getIcon() } - { this.props.label } - - ); - } + public render(): JSX.Element { + return ( + + { this._getIcon() } + { this.props.label } + + ); + } - private _getIcon() { - if (this.props.icon) { - return ; - } + private _getIcon() { + if (this.props.icon) { + return ; } + } } \ No newline at end of file diff --git a/apps/fabric-website/src/components/DOSearchBox/DOSearchBox.tsx b/apps/fabric-website/src/components/DOSearchBox/DOSearchBox.tsx index 8ffd0bba48942..0400353f9881d 100644 --- a/apps/fabric-website/src/components/DOSearchBox/DOSearchBox.tsx +++ b/apps/fabric-website/src/components/DOSearchBox/DOSearchBox.tsx @@ -2,17 +2,17 @@ import * as React from 'react'; import './DOSearchBox.scss'; export class DOSearchBox extends React.Component<{}, {}> { - public render() { + public render(): JSX.Element { return (
-
-
- - - -
-
-
+
+
+ + + +
+
+
); } } \ No newline at end of file diff --git a/apps/fabric-website/src/components/IconGrid/IconGrid.tsx b/apps/fabric-website/src/components/IconGrid/IconGrid.tsx index 08879b64d9e0d..3a317fd721b66 100644 --- a/apps/fabric-website/src/components/IconGrid/IconGrid.tsx +++ b/apps/fabric-website/src/components/IconGrid/IconGrid.tsx @@ -26,7 +26,7 @@ export class IconGrid extends React.Component { }; } - public render() { + public render(): JSX.Element { let { icons } = this.props; let { searchQuery } = this.state; @@ -57,7 +57,7 @@ export class IconGrid extends React.Component { ); } - private _onSearchQueryChanged(newValue) { + private _onSearchQueryChanged(newValue): void { this.setState({ 'searchQuery': newValue }); diff --git a/apps/fabric-website/src/components/Nav/Nav.tsx b/apps/fabric-website/src/components/Nav/Nav.tsx index df836511d6eab..04b96ff55fa1e 100644 --- a/apps/fabric-website/src/components/Nav/Nav.tsx +++ b/apps/fabric-website/src/components/Nav/Nav.tsx @@ -14,7 +14,7 @@ export interface INavState { export class Nav extends React.Component { - public render() { + public render(): JSX.Element { let { pages } = this.props; if (!pages) { diff --git a/apps/fabric-website/src/components/PageHeader/PageHeader.tsx b/apps/fabric-website/src/components/PageHeader/PageHeader.tsx index bafc2d4ce182d..d63bd6bfd626c 100644 --- a/apps/fabric-website/src/components/PageHeader/PageHeader.tsx +++ b/apps/fabric-website/src/components/PageHeader/PageHeader.tsx @@ -71,7 +71,7 @@ export class PageHeader extends BaseComponent { link?: HTMLAnchorElement } = {}; - public componentDidMount() { + public componentDidMount(): void { this._eventListener = this._eventListener.bind(this); this._getBreakpoint = this._getBreakpoint.bind(this); this._els.link.addEventListener('click', this._eventListener); @@ -23,7 +23,7 @@ export class PageHeaderLink extends React.Component { this._getBreakpoint(); } - public render() { + public render(): JSX.Element { return ( { this._els.link = a; } } href={ this.props.href } data-title={ this.props.text }>{ this.props.text } ); @@ -41,7 +41,7 @@ export class PageHeaderLink extends React.Component { } } - private _eventListener(event) { + private _eventListener(event): void { event.preventDefault(); history.pushState({}, '', this._els.link.getAttribute('href')); let navigatorUserAgent = navigator.userAgent.toLowerCase(); diff --git a/apps/fabric-website/src/components/Table/AnimationCell/AnimationCell.tsx b/apps/fabric-website/src/components/Table/AnimationCell/AnimationCell.tsx index f2f143e825b2b..4870ddee18ca0 100644 --- a/apps/fabric-website/src/components/Table/AnimationCell/AnimationCell.tsx +++ b/apps/fabric-website/src/components/Table/AnimationCell/AnimationCell.tsx @@ -10,7 +10,7 @@ export class AnimationCell extends React.Component { super(props); } - public render() { + public render(): JSX.Element { const name = this.props.data[0].value; const animClass = this.props.data[1].value; diff --git a/apps/fabric-website/src/components/Table/Table.tsx b/apps/fabric-website/src/components/Table/Table.tsx index a9bcf0d2b8edb..0dd67f4f21d28 100644 --- a/apps/fabric-website/src/components/Table/Table.tsx +++ b/apps/fabric-website/src/components/Table/Table.tsx @@ -31,7 +31,7 @@ export class Table extends React.Component { this._windowEventHandler(); } - public render() { + public render(): JSX.Element { let { content } = this.props; return (this.state.currentBreakpoint === 'mobile' && this.props.responsive) ? this._renderMobile(content) : this._renderDesktop(content); } diff --git a/apps/fabric-website/src/pages/BlogPage/BlogItem.tsx b/apps/fabric-website/src/pages/BlogPage/BlogItem.tsx index 5012d58ed50d8..263ed46fa1d84 100644 --- a/apps/fabric-website/src/pages/BlogPage/BlogItem.tsx +++ b/apps/fabric-website/src/pages/BlogPage/BlogItem.tsx @@ -12,7 +12,7 @@ export interface IBlogItem { } export class BlogItem extends React.Component { - public render() { + public render(): JSX.Element { return (
@@ -33,7 +33,7 @@ export class BlogItem extends React.Component { { this.props.title }

- Posted by {this.props.author} + Posted by { this.props.author }

{ this.props.previewDescription } diff --git a/apps/fabric-website/src/pages/BlogPage/BlogPage.tsx b/apps/fabric-website/src/pages/BlogPage/BlogPage.tsx index 686d320b7d8ca..0e70557dfb12d 100644 --- a/apps/fabric-website/src/pages/BlogPage/BlogPage.tsx +++ b/apps/fabric-website/src/pages/BlogPage/BlogPage.tsx @@ -7,7 +7,7 @@ const styles: any = stylesImport; const blogData = require('../../data/blog-posts.json'); export class BlogPage extends React.Component { - public render() { + public render(): JSX.Element { return (

diff --git a/apps/fabric-website/src/pages/BlogPage/BlogPost.tsx b/apps/fabric-website/src/pages/BlogPage/BlogPost.tsx index 9e93ead4f9383..f2eb361ac72ad 100644 --- a/apps/fabric-website/src/pages/BlogPage/BlogPost.tsx +++ b/apps/fabric-website/src/pages/BlogPage/BlogPost.tsx @@ -11,7 +11,7 @@ export class BlogPost extends React.Component<{}, {}> { this._postId = this._getParameterByName('id'); } - public render() { + public render(): JSX.Element { return (
@@ -31,7 +31,7 @@ export class BlogPost extends React.Component<{}, {}> { ); } - private _getParameterByName(name: string, url?: string) { + private _getParameterByName(name: string, url?: string): string { if (!url) { url = window.location.href; } diff --git a/apps/fabric-website/src/pages/Components/ActivityItemComponentPage.tsx b/apps/fabric-website/src/pages/Components/ActivityItemComponentPage.tsx index 9f998585a05c8..d5a8b62c7b95e 100644 --- a/apps/fabric-website/src/pages/Components/ActivityItemComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/ActivityItemComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class ActivityItemComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/BreadcrumbComponentPage.tsx b/apps/fabric-website/src/pages/Components/BreadcrumbComponentPage.tsx index f4f9be714e055..1f5c650f113be 100644 --- a/apps/fabric-website/src/pages/Components/BreadcrumbComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/BreadcrumbComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class BreadcrumbComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/ButtonComponentPage.tsx b/apps/fabric-website/src/pages/Components/ButtonComponentPage.tsx index 6a3232b9b1f1b..ddbd8862a50a4 100644 --- a/apps/fabric-website/src/pages/Components/ButtonComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/ButtonComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class ButtonComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/CalendarComponentPage.tsx b/apps/fabric-website/src/pages/Components/CalendarComponentPage.tsx index 50bf399d2ee0f..e69e275909926 100644 --- a/apps/fabric-website/src/pages/Components/CalendarComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/CalendarComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class CalendarComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/CalloutComponentPage.tsx b/apps/fabric-website/src/pages/Components/CalloutComponentPage.tsx index dfe53b8634548..0f61628ccf9e2 100644 --- a/apps/fabric-website/src/pages/Components/CalloutComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/CalloutComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class CalloutComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/CheckboxComponentPage.tsx b/apps/fabric-website/src/pages/Components/CheckboxComponentPage.tsx index 0175c42a03ed8..187ecf596d44c 100644 --- a/apps/fabric-website/src/pages/Components/CheckboxComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/CheckboxComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class CheckboxComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/ChoiceGroupComponentPage.tsx b/apps/fabric-website/src/pages/Components/ChoiceGroupComponentPage.tsx index 4182b09dfb1a4..53a58a52cad6e 100644 --- a/apps/fabric-website/src/pages/Components/ChoiceGroupComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/ChoiceGroupComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class ChoiceGroupComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/CoachmarkComponentPage.tsx b/apps/fabric-website/src/pages/Components/CoachmarkComponentPage.tsx index 6096e06988736..ee8ad6e087fac 100644 --- a/apps/fabric-website/src/pages/Components/CoachmarkComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/CoachmarkComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class CoachmarkComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/ColorPickerComponentPage.tsx b/apps/fabric-website/src/pages/Components/ColorPickerComponentPage.tsx index 4c9bd0ba38106..864849d170daa 100644 --- a/apps/fabric-website/src/pages/Components/ColorPickerComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/ColorPickerComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class ColorPickerComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/ComboBoxComponentPage.tsx b/apps/fabric-website/src/pages/Components/ComboBoxComponentPage.tsx index d28667aeabcd0..b4c2fdebd414a 100644 --- a/apps/fabric-website/src/pages/Components/ComboBoxComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/ComboBoxComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class ComboBoxComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/CommandBarComponentPage.tsx b/apps/fabric-website/src/pages/Components/CommandBarComponentPage.tsx index 25be30d714a4f..28b68e2bdf393 100644 --- a/apps/fabric-website/src/pages/Components/CommandBarComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/CommandBarComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class CommandBarComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/ComponentUtilitiesPage.tsx b/apps/fabric-website/src/pages/Components/ComponentUtilitiesPage.tsx index bf17459fd3717..a92bb1ac7e117 100644 --- a/apps/fabric-website/src/pages/Components/ComponentUtilitiesPage.tsx +++ b/apps/fabric-website/src/pages/Components/ComponentUtilitiesPage.tsx @@ -4,7 +4,7 @@ import { ComponentPage, IComponentPageProps } from '../../components/ComponentPa const pageStyles: any = require('../PageStyles.module.scss'); export class ComponentUtilitiesPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/ContextualMenuComponentPage.tsx b/apps/fabric-website/src/pages/Components/ContextualMenuComponentPage.tsx index 1532af2aed26a..dcc0d0f29ba73 100644 --- a/apps/fabric-website/src/pages/Components/ContextualMenuComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/ContextualMenuComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class ContextualMenuComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/DatePickerComponentPage.tsx b/apps/fabric-website/src/pages/Components/DatePickerComponentPage.tsx index 204c5dec1575f..7528ff1215d4a 100644 --- a/apps/fabric-website/src/pages/Components/DatePickerComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/DatePickerComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class DatePickerComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/DetailsListComponentPage.tsx b/apps/fabric-website/src/pages/Components/DetailsListComponentPage.tsx index 2ac9254e714f8..76d78ee67c44c 100644 --- a/apps/fabric-website/src/pages/Components/DetailsListComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/DetailsListComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class DetailsListComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/DialogComponentPage.tsx b/apps/fabric-website/src/pages/Components/DialogComponentPage.tsx index b3bf165e8e8d7..37429d48ddf42 100644 --- a/apps/fabric-website/src/pages/Components/DialogComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/DialogComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class DialogComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/DocumentCardComponentPage.tsx b/apps/fabric-website/src/pages/Components/DocumentCardComponentPage.tsx index b1bae3dc7b2a9..5e5b0eef3d4cd 100644 --- a/apps/fabric-website/src/pages/Components/DocumentCardComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/DocumentCardComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class DocumentCardComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/DropdownComponentPage.tsx b/apps/fabric-website/src/pages/Components/DropdownComponentPage.tsx index dac02d95e18f8..ca5e93aab2208 100644 --- a/apps/fabric-website/src/pages/Components/DropdownComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/DropdownComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class DropdownComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/FacepileComponentPage.tsx b/apps/fabric-website/src/pages/Components/FacepileComponentPage.tsx index 3ed0df6639a62..3917a6b67f35b 100644 --- a/apps/fabric-website/src/pages/Components/FacepileComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/FacepileComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class FacepileComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/FocusTrapZoneUtilityPage.tsx b/apps/fabric-website/src/pages/Components/FocusTrapZoneUtilityPage.tsx index c7e9b107a45f6..56124bb35f906 100644 --- a/apps/fabric-website/src/pages/Components/FocusTrapZoneUtilityPage.tsx +++ b/apps/fabric-website/src/pages/Components/FocusTrapZoneUtilityPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class FocusTrapZoneUtilityPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/FocusZoneUtilityPage.tsx b/apps/fabric-website/src/pages/Components/FocusZoneUtilityPage.tsx index 961cdec0c6c04..4f19fe75087cd 100644 --- a/apps/fabric-website/src/pages/Components/FocusZoneUtilityPage.tsx +++ b/apps/fabric-website/src/pages/Components/FocusZoneUtilityPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class FocusZoneUtilityPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/GroupedListComponentPage.tsx b/apps/fabric-website/src/pages/Components/GroupedListComponentPage.tsx index 9208478fa3ef9..65e087c4b323e 100644 --- a/apps/fabric-website/src/pages/Components/GroupedListComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/GroupedListComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class GroupedListComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/HoverCardComponentPage.tsx b/apps/fabric-website/src/pages/Components/HoverCardComponentPage.tsx index 78139437bee79..cb46a0a86369d 100644 --- a/apps/fabric-website/src/pages/Components/HoverCardComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/HoverCardComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class HoverCardComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/IconComponentPage.tsx b/apps/fabric-website/src/pages/Components/IconComponentPage.tsx index 0357bd7b5cdc8..ed4bb74cfa756 100644 --- a/apps/fabric-website/src/pages/Components/IconComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/IconComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class IconComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/ImageComponentPage.tsx b/apps/fabric-website/src/pages/Components/ImageComponentPage.tsx index f8af3614d787e..799e9db3e3cdc 100644 --- a/apps/fabric-website/src/pages/Components/ImageComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/ImageComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class ImageComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/LabelComponentPage.tsx b/apps/fabric-website/src/pages/Components/LabelComponentPage.tsx index f576070430911..d3918096fc4e3 100644 --- a/apps/fabric-website/src/pages/Components/LabelComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/LabelComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class LabelComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/LayerComponentPage.tsx b/apps/fabric-website/src/pages/Components/LayerComponentPage.tsx index 21a3374c8f20b..05813321385c9 100644 --- a/apps/fabric-website/src/pages/Components/LayerComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/LayerComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class LayerComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/LinkComponentPage.tsx b/apps/fabric-website/src/pages/Components/LinkComponentPage.tsx index 2e09a43deffda..2973b8d378c30 100644 --- a/apps/fabric-website/src/pages/Components/LinkComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/LinkComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class LinkComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/ListComponentPage.tsx b/apps/fabric-website/src/pages/Components/ListComponentPage.tsx index 991a8a3c799e2..2d61c08e87496 100644 --- a/apps/fabric-website/src/pages/Components/ListComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/ListComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class ListComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/MarqueeSelectionUtilityPage.tsx b/apps/fabric-website/src/pages/Components/MarqueeSelectionUtilityPage.tsx index 9dde9e1fb0ee5..364d4fc5052bd 100644 --- a/apps/fabric-website/src/pages/Components/MarqueeSelectionUtilityPage.tsx +++ b/apps/fabric-website/src/pages/Components/MarqueeSelectionUtilityPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class MarqueeSelectionUtilityPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/MessageBarComponentPage.tsx b/apps/fabric-website/src/pages/Components/MessageBarComponentPage.tsx index d215e845f2ecf..7099ae35adf87 100644 --- a/apps/fabric-website/src/pages/Components/MessageBarComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/MessageBarComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class MessageBarComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/ModalComponentPage.tsx b/apps/fabric-website/src/pages/Components/ModalComponentPage.tsx index a407a065e0a9a..be0793d2b2eb1 100644 --- a/apps/fabric-website/src/pages/Components/ModalComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/ModalComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class ModalComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/NavComponentPage.tsx b/apps/fabric-website/src/pages/Components/NavComponentPage.tsx index dd0e8f5f59b2a..dee5dec8a0d43 100644 --- a/apps/fabric-website/src/pages/Components/NavComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/NavComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class NavComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/OverflowSetComponentPage.tsx b/apps/fabric-website/src/pages/Components/OverflowSetComponentPage.tsx index 7c21183bd950a..7cae17323a227 100644 --- a/apps/fabric-website/src/pages/Components/OverflowSetComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/OverflowSetComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class OverflowSetComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/OverlayComponentPage.tsx b/apps/fabric-website/src/pages/Components/OverlayComponentPage.tsx index 36e654cc461c8..050161847c3fa 100644 --- a/apps/fabric-website/src/pages/Components/OverlayComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/OverlayComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class OverlayComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/PanelComponentPage.tsx b/apps/fabric-website/src/pages/Components/PanelComponentPage.tsx index 9e158348e4bfb..991071864bd81 100644 --- a/apps/fabric-website/src/pages/Components/PanelComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/PanelComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class PanelComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/PeoplePickerComponentPage.tsx b/apps/fabric-website/src/pages/Components/PeoplePickerComponentPage.tsx index a6570e9a22f00..5c4a48a32ce80 100644 --- a/apps/fabric-website/src/pages/Components/PeoplePickerComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/PeoplePickerComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class PeoplePickerComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/PersonaComponentPage.tsx b/apps/fabric-website/src/pages/Components/PersonaComponentPage.tsx index 6207c0bcaf109..1bf3aab5a22bb 100644 --- a/apps/fabric-website/src/pages/Components/PersonaComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/PersonaComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class PersonaComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/PickersComponentPage.tsx b/apps/fabric-website/src/pages/Components/PickersComponentPage.tsx index f94833f6f8e1d..a3143da8bdd98 100644 --- a/apps/fabric-website/src/pages/Components/PickersComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/PickersComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class PickersComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/PivotComponentPage.tsx b/apps/fabric-website/src/pages/Components/PivotComponentPage.tsx index a991a20e89881..1ed9a5c4ec33a 100644 --- a/apps/fabric-website/src/pages/Components/PivotComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/PivotComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class PivotComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/ProgressIndicatorComponentPage.tsx b/apps/fabric-website/src/pages/Components/ProgressIndicatorComponentPage.tsx index 3d756d2edbc24..4e5a7c942ee85 100644 --- a/apps/fabric-website/src/pages/Components/ProgressIndicatorComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/ProgressIndicatorComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class ProgressIndicatorComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/RatingComponentPage.tsx b/apps/fabric-website/src/pages/Components/RatingComponentPage.tsx index 268f915e2603b..ea2119d9a1265 100644 --- a/apps/fabric-website/src/pages/Components/RatingComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/RatingComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class RatingComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/ResizeGroupComponentPage.tsx b/apps/fabric-website/src/pages/Components/ResizeGroupComponentPage.tsx index 5a11a629e2ce4..da320c2385ce0 100644 --- a/apps/fabric-website/src/pages/Components/ResizeGroupComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/ResizeGroupComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class ResizeGroupComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/ScrollablePaneComponentPage.tsx b/apps/fabric-website/src/pages/Components/ScrollablePaneComponentPage.tsx index 9c3f68da7568d..9a6e4ac8f1e6d 100644 --- a/apps/fabric-website/src/pages/Components/ScrollablePaneComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/ScrollablePaneComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class ScrollablePaneComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/SearchBoxComponentPage.tsx b/apps/fabric-website/src/pages/Components/SearchBoxComponentPage.tsx index 3ee30b89ea0a5..c1ac5e2ca8d6d 100644 --- a/apps/fabric-website/src/pages/Components/SearchBoxComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/SearchBoxComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class SearchBoxComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/SelectionUtilityPage.tsx b/apps/fabric-website/src/pages/Components/SelectionUtilityPage.tsx index 17e72e6f9ecff..02fd6b09c5ec7 100644 --- a/apps/fabric-website/src/pages/Components/SelectionUtilityPage.tsx +++ b/apps/fabric-website/src/pages/Components/SelectionUtilityPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class SelectionUtilityPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/SliderComponentPage.tsx b/apps/fabric-website/src/pages/Components/SliderComponentPage.tsx index 962688361f6bd..ced2bb935516f 100644 --- a/apps/fabric-website/src/pages/Components/SliderComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/SliderComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class SliderComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/SpinButtonComponentPage.tsx b/apps/fabric-website/src/pages/Components/SpinButtonComponentPage.tsx index a43701393039a..86398034c23b7 100644 --- a/apps/fabric-website/src/pages/Components/SpinButtonComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/SpinButtonComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class SpinButtonComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/SpinnerComponentPage.tsx b/apps/fabric-website/src/pages/Components/SpinnerComponentPage.tsx index a68576a591830..18570a9f0f672 100644 --- a/apps/fabric-website/src/pages/Components/SpinnerComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/SpinnerComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class SpinnerComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/SwatchColorPickerComponentPage.tsx b/apps/fabric-website/src/pages/Components/SwatchColorPickerComponentPage.tsx index e0377f11c6009..c3028cb972049 100644 --- a/apps/fabric-website/src/pages/Components/SwatchColorPickerComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/SwatchColorPickerComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class SwatchColorPickerComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/TeachingBubbleComponentPage.tsx b/apps/fabric-website/src/pages/Components/TeachingBubbleComponentPage.tsx index 750ccff7c794f..a524b400189b5 100644 --- a/apps/fabric-website/src/pages/Components/TeachingBubbleComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/TeachingBubbleComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class TeachingBubbleComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/TextFieldComponentPage.tsx b/apps/fabric-website/src/pages/Components/TextFieldComponentPage.tsx index 481664c191be8..a46d5f2871c29 100644 --- a/apps/fabric-website/src/pages/Components/TextFieldComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/TextFieldComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class TextFieldComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/ThemesUtilityPage.tsx b/apps/fabric-website/src/pages/Components/ThemesUtilityPage.tsx index 81b0c766b8ee9..e5962ebab25e7 100644 --- a/apps/fabric-website/src/pages/Components/ThemesUtilityPage.tsx +++ b/apps/fabric-website/src/pages/Components/ThemesUtilityPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class ThemesUtilityPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/ToggleComponentPage.tsx b/apps/fabric-website/src/pages/Components/ToggleComponentPage.tsx index a9dd35ef26705..bc7d60d8b27c2 100644 --- a/apps/fabric-website/src/pages/Components/ToggleComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/ToggleComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class ToggleComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Components/TooltipComponentPage.tsx b/apps/fabric-website/src/pages/Components/TooltipComponentPage.tsx index 13fdb3ac613b9..e0174926854af 100644 --- a/apps/fabric-website/src/pages/Components/TooltipComponentPage.tsx +++ b/apps/fabric-website/src/pages/Components/TooltipComponentPage.tsx @@ -5,7 +5,7 @@ import { ComponentPage } from '../../components/ComponentPage/ComponentPage'; const pageStyles: any = require('../PageStyles.module.scss'); export class TooltipComponentPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/GetStarted/GetStartedPage.module.scss b/apps/fabric-website/src/pages/GetStarted/GetStartedPage.module.scss index ec7fb9aa58d2b..4885114e6360f 100644 --- a/apps/fabric-website/src/pages/GetStarted/GetStartedPage.module.scss +++ b/apps/fabric-website/src/pages/GetStarted/GetStartedPage.module.scss @@ -47,11 +47,15 @@ background-color:$color-getStarted-darker; color: $ms-color-neutralLighter; - a, a:visited, + a:not(.title), a:visited, a:hover.title, .getStartedLink { border-bottom: 1px solid $ms-color-neutralLight; } + a.title { + border-bottom: 1px solid transparent; + } + a, a:hover, a:active, .getStartedLink { color: $ms-color-neutralLight; @@ -59,11 +63,15 @@ } .feature { - align-items: center; - display: flex; - flex-direction: column; margin-bottom: 32px; + .featureImage { + align-items: center; + display: flex; + flex-direction: column; + width: 100%; + } + img { height: 100%; margin-bottom: 8px; @@ -91,7 +99,7 @@ font-size: $font-size-big; font-weight: $ms-font-weight-semilight; margin-bottom: $contentMargin-vertical; - width: 100%; + display: table; } @media screen and (max-width: $uhf-screen-max-mobile) { diff --git a/apps/fabric-website/src/pages/GetStarted/GetStartedPage.tsx b/apps/fabric-website/src/pages/GetStarted/GetStartedPage.tsx index 7841a5f4ecd70..3fed74a80af96 100644 --- a/apps/fabric-website/src/pages/GetStarted/GetStartedPage.tsx +++ b/apps/fabric-website/src/pages/GetStarted/GetStartedPage.tsx @@ -12,7 +12,7 @@ const corePackageData = require('../../../node_modules/office-ui-fabric-core/pac const corePackageVersion: string = corePackageData && corePackageData.version || '9.2.0'; export class GetStartedPage extends React.Component { - public render() { + public render(): JSX.Element { return (
{
- Illustration of Typography and color swatches. -
Styles
+
+ Illustration of Typography and color swatches. +
+ Styles
Fabric gives you access to Segoe, Microsoft’s official typeface, along with the color palette, type ramp, icons, and responsive grid for Office 365.
- Illustration of Icons -
Icons
+
+ Illustration of Icons +
+ Icons
Fabric includes Office’s official product icons. Fabric also provides a suite of product and document symbols, so you can use the same metaphors we use.
- Illustration of Components -
Components
+
+ Illustration of Components +
+ Components
Components are the building blocks of your UI. Fabric has a variety of components, including navigation, commands, containers, and content.
- Design Toolkit + Design Toolkit The Fabric design toolkit is built with Adobe XD and provides controls and layout templates that enable you to create seamless, beautiful Office experiences. - Learn more
diff --git a/apps/fabric-website/src/pages/HomePage/HomePage.tsx b/apps/fabric-website/src/pages/HomePage/HomePage.tsx index 83cf6348f9074..b16d12b01cd38 100644 --- a/apps/fabric-website/src/pages/HomePage/HomePage.tsx +++ b/apps/fabric-website/src/pages/HomePage/HomePage.tsx @@ -7,7 +7,7 @@ const corePackageData = require('../../../node_modules/office-ui-fabric-core/pac const reactPackageData = require('../../../node_modules/office-ui-fabric-react/package.json'); export class HomePage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Interstitials/AngularJSPage.tsx b/apps/fabric-website/src/pages/Interstitials/AngularJSPage.tsx index 0f2371b9ef90e..ff14f47e1a4d1 100644 --- a/apps/fabric-website/src/pages/Interstitials/AngularJSPage.tsx +++ b/apps/fabric-website/src/pages/Interstitials/AngularJSPage.tsx @@ -5,7 +5,7 @@ const styles: any = stylesImport; const pageStyles: any = require('../PageStyles.module.scss'); export class AngularJSPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Interstitials/FabricIOSPage.tsx b/apps/fabric-website/src/pages/Interstitials/FabricIOSPage.tsx index a54ec3b47229e..000f457820c06 100644 --- a/apps/fabric-website/src/pages/Interstitials/FabricIOSPage.tsx +++ b/apps/fabric-website/src/pages/Interstitials/FabricIOSPage.tsx @@ -4,7 +4,7 @@ const styles: any = stylesImport; const pageStyles: any = require('../PageStyles.module.scss'); export class FabricIOSPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Interstitials/FabricJSPage.tsx b/apps/fabric-website/src/pages/Interstitials/FabricJSPage.tsx index c46e45ddacf0f..1ad71bac88314 100644 --- a/apps/fabric-website/src/pages/Interstitials/FabricJSPage.tsx +++ b/apps/fabric-website/src/pages/Interstitials/FabricJSPage.tsx @@ -4,7 +4,7 @@ import * as stylesImport from './Interstitials.module.scss'; const styles: any = stylesImport; export class FabricJSPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Overviews/ComponentsPage.tsx b/apps/fabric-website/src/pages/Overviews/ComponentsPage.tsx index 1c1662094b730..2936b7836c785 100644 --- a/apps/fabric-website/src/pages/Overviews/ComponentsPage.tsx +++ b/apps/fabric-website/src/pages/Overviews/ComponentsPage.tsx @@ -5,7 +5,7 @@ import * as stylesImport from './Overviews.module.scss'; const styles: any = stylesImport; export class ComponentsPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/Overviews/StylesPage.tsx b/apps/fabric-website/src/pages/Overviews/StylesPage.tsx index e1351d495aba6..ac995196cf9c7 100644 --- a/apps/fabric-website/src/pages/Overviews/StylesPage.tsx +++ b/apps/fabric-website/src/pages/Overviews/StylesPage.tsx @@ -5,7 +5,7 @@ import * as stylesImport from './Overviews.module.scss'; const styles: any = stylesImport; export class StylesPage extends React.Component { - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/pages/ResourcesPage/ResourcesPage.tsx b/apps/fabric-website/src/pages/ResourcesPage/ResourcesPage.tsx index cfc7cbd4d1046..352163683d80f 100644 --- a/apps/fabric-website/src/pages/ResourcesPage/ResourcesPage.tsx +++ b/apps/fabric-website/src/pages/ResourcesPage/ResourcesPage.tsx @@ -6,7 +6,7 @@ const styles: any = stylesImport; const pageStyles: any = require('../PageStyles.module.scss'); export class ResourcesPage extends React.Component { - public render() { + public render(): JSX.Element { return (
{ - public render() { + public render(): JSX.Element { return (
{ - public render() { + public render(): JSX.Element { let productIcons = productIconsData; let documentIcons = documentIconsData; diff --git a/apps/fabric-website/src/pages/Styles/ColorsPage/ColorsPage.tsx b/apps/fabric-website/src/pages/Styles/ColorsPage/ColorsPage.tsx index 62125bd95e092..37c8d07121183 100644 --- a/apps/fabric-website/src/pages/Styles/ColorsPage/ColorsPage.tsx +++ b/apps/fabric-website/src/pages/Styles/ColorsPage/ColorsPage.tsx @@ -13,7 +13,7 @@ const neutralColorsData = require('../../../data/colors-neutral.json'); const themeColorsData = require('../../../data/colors-theme.json'); export class ColorsPage extends React.Component { - public render() { + public render(): JSX.Element { return (
{ - public render() { + public render(): JSX.Element { return (
{ - public render() { + public render(): JSX.Element { return (
{ - public render() { + public render(): JSX.Element { return (
{ - public render() { + public render(): JSX.Element { return (
{ - public render() { + public render(): JSX.Element { return (
{ - public render() { + public render(): JSX.Element { return (
diff --git a/apps/fabric-website/src/root.tsx b/apps/fabric-website/src/root.tsx index ed574ac555f43..50406003b832d 100644 --- a/apps/fabric-website/src/root.tsx +++ b/apps/fabric-website/src/root.tsx @@ -59,7 +59,7 @@ function _hasAnchorLink(path: string): boolean { return (path.match(/#/g) || []).length > 1; } -function _extractAnchorLink(path) { +function _extractAnchorLink(path): string { let split = path.split('#'); let cleanedSplit = split.filter((value) => { if (value === '') { @@ -136,7 +136,7 @@ if (isReady) { window.onunload = _onUnload; -function addCSSToHeader(fileName: string) { +function addCSSToHeader(fileName: string): void { let headEl = document.head; let linkEl = document.createElement('link'); diff --git a/apps/fabric-website/src/utilities/data.ts b/apps/fabric-website/src/utilities/data.ts index 0966eb30aff80..0cdf67f593ad0 100644 --- a/apps/fabric-website/src/utilities/data.ts +++ b/apps/fabric-website/src/utilities/data.ts @@ -5,9 +5,9 @@ const LOREM_IPSUM = ('Lorem ipsum dolor sit amet, consectetur adipiscing elit, s 'mollit anim id est laborum').split(' '); const DATA = { - 'color' : [ 'red', 'blue', 'green', 'yellow' ], - 'shape' : [ 'circle', 'square', 'triangle' ], - 'location' : [ 'Seattle', 'New York', 'Chicago', 'Los Angeles', 'Portland' ] + 'color': ['red', 'blue', 'green', 'yellow'], + 'shape': ['circle', 'square', 'triangle'], + 'location': ['Seattle', 'New York', 'Chicago', 'Los Angeles', 'Portland'] }; export function createListItems(count: number, startIndex = 0): any { @@ -17,7 +17,7 @@ export function createListItems(count: number, startIndex = 0): any { let aspectRatio = width / height; return { - thumbnail: `//placekitten.com/${ Math.round(75 * aspectRatio) }/${ 75 }`, + thumbnail: `//placekitten.com/${Math.round(75 * aspectRatio)}/${75}`, key: 'item-' + (index + startIndex) + ' ' + lorem(4), name: lorem(5), description: lorem(10 + Math.round(Math.random() * 50)), @@ -42,7 +42,7 @@ export function isGroupable(key: string): boolean { key === 'location'; } -function _randWord(array: string[]) { +function _randWord(array: string[]): string { let index = Math.floor(Math.random() * array.length); return array[index]; } diff --git a/apps/ssr-tests/package.json b/apps/ssr-tests/package.json index a608cefca9924..c3775d2408632 100644 --- a/apps/ssr-tests/package.json +++ b/apps/ssr-tests/package.json @@ -21,10 +21,10 @@ "@types/mocha": "2.2.39", "@types/webpack-env": "1.13.0", "mocha": "^3.3.0", - "office-ui-fabric-react": ">=5.81.1 <6.0.0", + "office-ui-fabric-react": ">=5.85.0 <6.0.0", "raw-loader": "^0.5.1", - "react": "^16.2.0", - "react-dom": "^16.2.0", + "react": "^16.3.1", + "react-dom": "^16.3.1", "webpack": "^4.2.0" }, "dependencies": { diff --git a/apps/test-bundle-button/index.html b/apps/test-bundle-button/index.html index 1c5cb1fc4a2a5..46f4e4fea7a0b 100644 --- a/apps/test-bundle-button/index.html +++ b/apps/test-bundle-button/index.html @@ -7,8 +7,8 @@ Button example - - + + diff --git a/apps/test-bundle-button/package.json b/apps/test-bundle-button/package.json index c2a0f5e246df6..ccb4a9b9ce860 100644 --- a/apps/test-bundle-button/package.json +++ b/apps/test-bundle-button/package.json @@ -16,8 +16,8 @@ "start": "node ../../scripts/start.js" }, "devDependencies": { - "@types/react": "16.0.25", - "@types/react-dom": "16.0.3", + "@types/react": "16.3.10", + "@types/react-dom": "16.0.5", "@types/webpack-env": "1.13.0", "@types/prop-types": "15.5.2", "office-ui-fabric-react-tslint": ">=5.0.0 <6.0.0" @@ -25,7 +25,7 @@ "dependencies": { "react": "^0.14 || ^15.0.1-0 || ^16.0.0-0", "react-dom": "^0.14 || ^15.0.1-0 || ^16.0.0-0", - "office-ui-fabric-react": ">=5.81.1 <6.0.0", + "office-ui-fabric-react": ">=5.85.0 <6.0.0", "tslib": "^1.7.1" } } \ No newline at end of file diff --git a/apps/todo-app/index.html b/apps/todo-app/index.html index 3932e81f74413..fb0fd203a4a91 100644 --- a/apps/todo-app/index.html +++ b/apps/todo-app/index.html @@ -7,8 +7,8 @@ Todo App - - + + diff --git a/apps/todo-app/package.json b/apps/todo-app/package.json index 587e2647ad3fc..05bff760addb7 100644 --- a/apps/todo-app/package.json +++ b/apps/todo-app/package.json @@ -10,8 +10,8 @@ }, "devDependencies": { "@types/es6-promise": "0.0.32", - "@types/react": "16.0.25", - "@types/react-dom": "16.0.3", + "@types/react": "16.3.10", + "@types/react-dom": "16.0.5", "@types/webpack-env": "1.13.0", "office-ui-fabric-react-tslint": ">=5.0.0 <6.0.0" }, @@ -19,10 +19,10 @@ "@microsoft/load-themed-styles": "^1.7.13", "es6-promise": "^4.1.0", "immutability-helper": "^2.6.4", - "office-ui-fabric-react": ">=5.81.1 <6.0.0", - "react": "^16.2.0", - "react-dom": "^16.2.0", - "typescript": "2.7.2", + "office-ui-fabric-react": ">=5.85.0 <6.0.0", + "react": "^16.3.1", + "react-dom": "^16.3.1", + "typescript": "2.8.1", "tslib": "^1.7.1" } } \ No newline at end of file diff --git a/apps/todo-app/src/components/TodoForm.tsx b/apps/todo-app/src/components/TodoForm.tsx index c381a5fd8980a..57a5d51148bab 100644 --- a/apps/todo-app/src/components/TodoForm.tsx +++ b/apps/todo-app/src/components/TodoForm.tsx @@ -81,7 +81,7 @@ export default class TodoForm extends BaseComponent): void => { event.preventDefault(); - const { value: textField } = this._textField; + const { current: textField } = this._textField; if (!textField) { return; } diff --git a/apps/vr-tests/index.html b/apps/vr-tests/index.html index 3932e81f74413..fb0fd203a4a91 100644 --- a/apps/vr-tests/index.html +++ b/apps/vr-tests/index.html @@ -7,8 +7,8 @@ Todo App - - + + diff --git a/apps/vr-tests/package.json b/apps/vr-tests/package.json index 291c49ae4ae73..b440aed208348 100644 --- a/apps/vr-tests/package.json +++ b/apps/vr-tests/package.json @@ -13,8 +13,8 @@ "devDependencies": { "@storybook/addon-options": "=3.2.3", "@storybook/react": "^3.2.3", - "@types/react": "16.0.25", - "@types/react-dom": "16.0.3", + "@types/react": "16.3.10", + "@types/react-dom": "16.0.5", "@types/storybook__react": "3.0.5", "css-loader": "^0.28.7", "file-loader": "^0.11.1", @@ -23,15 +23,15 @@ "style-loader": "^0.19.0", "awesome-typescript-loader": "^3.2.3", "office-ui-fabric-react-tslint": ">=5.0.0 <6.0.0", - "screener-storybook": "^0.11.1", + "screener-storybook": "^0.12.5", "screener-runner": "^0.6.19", "storybook-readme": "=3.0.6" }, "dependencies": { - "office-ui-fabric-react": ">=5.81.1 <6.0.0", - "react": "^16.2.0", - "react-dom": "^16.2.0", - "typescript": "2.7.2", + "office-ui-fabric-react": ">=5.85.0 <6.0.0", + "react": "^16.3.1", + "react-dom": "^16.3.1", + "typescript": "2.8.1", "tslib": "^1.7.1" } } \ No newline at end of file diff --git a/common/changes/office-ui-fabric-react/ivdijan-onRenderInitials_2018-04-20-13-44.json b/common/changes/office-ui-fabric-react/ivdijan-onRenderInitials_2018-04-20-13-44.json new file mode 100644 index 0000000000000..9afcec63ee64a --- /dev/null +++ b/common/changes/office-ui-fabric-react/ivdijan-onRenderInitials_2018-04-20-13-44.json @@ -0,0 +1,11 @@ +{ + "changes": [ + { + "packageName": "office-ui-fabric-react", + "comment": "Propagate onRenderInitials correctly from Persona to PersonaCoin", + "type": "patch" + } + ], + "packageName": "office-ui-fabric-react", + "email": "ivdijan@microsoft.com" +} \ No newline at end of file diff --git a/common/config/rush/npm-shrinkwrap.json b/common/config/rush/npm-shrinkwrap.json index dbd254d3001e1..bb7886a232192 100644 --- a/common/config/rush/npm-shrinkwrap.json +++ b/common/config/rush/npm-shrinkwrap.json @@ -88,14 +88,14 @@ }, "@rush-temp/build": { "version": "file:projects/build.tgz", - "integrity": "sha1-DK1ColuW1Q4JQCLR2jSXntHFIfY=", + "integrity": "sha1-T3Z8HKKujQsa0eU2LZzotfg3L4g=", "requires": { "@microsoft/api-extractor": "4.3.7", "@microsoft/load-themed-styles": "1.7.50", "@microsoft/loader-load-themed-styles": "1.7.32", "autoprefixer": "7.2.6", "bundlesize": "0.15.3", - "chalk": "2.3.2", + "chalk": "2.4.0", "command-line-args": "4.0.7", "cpx": "1.5.0", "css-loader": "0.28.11", @@ -109,7 +109,7 @@ "node-sass": "4.8.3", "open": "0.0.5", "postcss": "6.0.21", - "postcss-loader": "2.1.3", + "postcss-loader": "2.1.4", "postcss-modules": "0.8.0", "raf": "3.4.0", "raw-loader": "0.5.1", @@ -120,7 +120,7 @@ "ts-loader": "4.2.0", "tslint": "5.9.1", "tslint-microsoft-contrib": "5.0.3", - "typescript": "2.7.2", + "typescript": "2.8.1", "webpack": "4.5.0", "webpack-bundle-analyzer": "2.11.1", "webpack-cli": "2.0.14", @@ -502,7 +502,7 @@ "acorn-dynamic-import": "3.0.0", "ajv": "6.4.0", "ajv-keywords": "3.1.0", - "chrome-trace-event": "0.1.2", + "chrome-trace-event": "0.1.3", "enhanced-resolve": "4.0.0", "eslint-scope": "3.7.1", "loader-runner": "2.3.0", @@ -510,7 +510,7 @@ "memory-fs": "0.4.1", "micromatch": "3.1.10", "mkdirp": "0.5.1", - "neo-async": "2.5.0", + "neo-async": "2.5.1", "node-libs-browser": "2.1.0", "schema-utils": "0.4.5", "tapable": "1.0.0", @@ -548,7 +548,7 @@ "sockjs-client": "1.1.4", "spdy": "3.4.7", "strip-ansi": "3.0.1", - "supports-color": "5.3.0", + "supports-color": "5.4.0", "webpack-dev-middleware": "3.1.2", "webpack-log": "1.2.0", "yargs": "11.0.0" @@ -595,28 +595,28 @@ }, "@rush-temp/example-app-base": { "version": "file:projects/example-app-base.tgz", - "integrity": "sha1-mzqaG3bInaTfpy2r2OK0zxtz4z4=", + "integrity": "sha1-DkUcfRVaa8xwsxbZRsRwvrr9KbU=", "requires": { "@types/es6-promise": "0.0.32", "@types/highlight.js": "9.12.2", - "@types/react": "16.0.25", - "@types/react-dom": "16.0.3", + "@types/react": "16.3.10", + "@types/react-dom": "16.0.5", "@types/webpack-env": "1.13.0", "es6-map": "0.1.5", "es6-promise": "4.2.4", "es6-weak-map": "2.0.2", "highlight.js": "9.12.0", "markdown-to-jsx": "6.6.1", - "office-ui-fabric-react": "5.80.0", - "react": "16.3.1", - "react-dom": "16.3.1", + "office-ui-fabric-react": "5.82.1", + "react": "16.3.2", + "react-dom": "16.3.2", "react-syntax-highlighter": "7.0.2", "tslib": "1.9.0" } }, "@rush-temp/experiments": { "version": "file:projects/experiments.tgz", - "integrity": "sha1-n1XrrabkK4C8Je/zMVeZkaXvveM=", + "integrity": "sha1-daarXQdKu4kkuBeXhStW7KW9YK8=", "requires": { "@microsoft/load-themed-styles": "1.7.50", "@types/enzyme": "3.1.5", @@ -624,9 +624,9 @@ "@types/es6-promise": "0.0.32", "@types/jest": "21.1.8", "@types/prop-types": "15.5.2", - "@types/react": "16.0.25", + "@types/react": "16.3.10", "@types/react-addons-test-utils": "0.14.18", - "@types/react-dom": "16.0.3", + "@types/react-dom": "16.0.5", "@types/react-test-renderer": "16.0.1", "@types/resemblejs": "1.3.28", "@types/sinon": "2.2.2", @@ -635,24 +635,24 @@ "enzyme-adapter-react-16": "1.1.1", "es6-weak-map": "2.0.2", "prop-types": "15.6.1", - "react": "16.3.1", - "react-dom": "16.3.1", + "react": "16.3.2", + "react-dom": "16.3.2", "react-highlight": "0.10.0", - "react-test-renderer": "16.3.1", + "react-test-renderer": "16.3.2", "sinon": "4.5.0", "tslib": "1.9.0" } }, "@rush-temp/fabric-website": { "version": "file:projects/fabric-website.tgz", - "integrity": "sha1-z9zYMqFmDZavRRfxeO5hOEncG7A=", + "integrity": "sha1-a1mHbvDvXnWaXuyFJEIvClcuHpI=", "requires": { "@microsoft/load-themed-styles": "1.7.50", "@types/es6-promise": "0.0.32", "@types/node": "8.0.26", "@types/prop-types": "15.5.2", - "@types/react": "16.0.25", - "@types/react-dom": "16.0.3", + "@types/react": "16.3.10", + "@types/react-dom": "16.0.5", "@types/resemblejs": "1.3.28", "@types/webpack-env": "1.13.0", "color-functions": "1.1.0", @@ -661,8 +661,8 @@ "highlight.js": "9.12.0", "json-loader": "0.5.7", "office-ui-fabric-core": "9.6.0", - "react": "16.3.1", - "react-dom": "16.3.1", + "react": "16.3.2", + "react-dom": "16.3.2", "react-highlight": "0.10.0", "tslib": "1.9.0", "write-file-webpack-plugin": "4.2.0" @@ -670,32 +670,32 @@ }, "@rush-temp/file-type-icons": { "version": "file:projects/file-type-icons.tgz", - "integrity": "sha1-4UiegaJadsdU6rgx9sAoRpIBEf8=", + "integrity": "sha1-Yn+JPy99YoMSgbFnw5ID2WktWNs=", "requires": { - "@types/react": "16.0.25", - "@types/react-dom": "16.0.3", - "react": "16.3.1", - "react-dom": "16.3.1", + "@types/react": "16.3.10", + "@types/react-dom": "16.0.5", + "react": "16.3.2", + "react-dom": "16.3.2", "tslib": "1.9.0" } }, "@rush-temp/icons": { "version": "file:projects/icons.tgz", - "integrity": "sha1-+vuz/OdKJ0ifwR7pY/XYZ+MhEg0=", + "integrity": "sha1-pVQHHai8Itvqt9Yu8AHEDXB1BRs=", "requires": { "tslib": "1.9.0" } }, "@rush-temp/jest-serializer-merge-styles": { "version": "file:projects/jest-serializer-merge-styles.tgz", - "integrity": "sha1-TMlpUDb8hYpqunQTlY1iJ+kJL5M=", + "integrity": "sha1-n+RTd+E26yjhauT284rh4gXLfzo=", "requires": { "@types/jest": "21.1.8" } }, "@rush-temp/merge-styles": { "version": "file:projects/merge-styles.tgz", - "integrity": "sha1-33wnGujsSOIWiCMoJa4k//NYbDw=", + "integrity": "sha1-KQC+5a/Yux9UOIoWq7SnCXAGbYI=", "requires": { "@types/jest": "21.1.8", "tslib": "1.9.0" @@ -703,7 +703,7 @@ }, "@rush-temp/office-ui-fabric-react": { "version": "file:projects/office-ui-fabric-react.tgz", - "integrity": "sha1-CK24mttDldAqgBrdHrygr5Cs+8M=", + "integrity": "sha1-15D4XJwcbRk65so2L5a1u+DEUCU=", "requires": { "@microsoft/load-themed-styles": "1.7.50", "@types/enzyme": "3.1.5", @@ -711,8 +711,8 @@ "@types/es6-promise": "0.0.32", "@types/jest": "21.1.8", "@types/prop-types": "15.5.2", - "@types/react": "16.0.25", - "@types/react-dom": "16.0.3", + "@types/react": "16.3.10", + "@types/react-dom": "16.0.5", "@types/react-test-renderer": "16.0.1", "@types/resemblejs": "1.3.28", "@types/sinon": "2.2.2", @@ -725,10 +725,10 @@ "highlight.js": "9.12.0", "office-ui-fabric-core": "9.6.0", "prop-types": "15.6.1", - "react": "16.3.1", - "react-dom": "16.3.1", + "react": "16.3.2", + "react-dom": "16.3.2", "react-highlight": "0.10.0", - "react-test-renderer": "16.3.1", + "react-test-renderer": "16.3.2", "resemblejs": "2.2.6", "sinon": "4.5.0", "tslib": "1.9.0" @@ -736,14 +736,14 @@ }, "@rush-temp/office-ui-fabric-react-tslint": { "version": "file:projects/office-ui-fabric-react-tslint.tgz", - "integrity": "sha1-WG5UESr1Ffk13PQG/PMp0jJPeUc=", + "integrity": "sha1-Lpw29kpo8XYUjrbjk3AiOmKBc2I=", "requires": { "tslint-react": "3.5.1" } }, "@rush-temp/ssr-tests": { "version": "file:projects/ssr-tests.tgz", - "integrity": "sha1-vWutbnoo/7XgmR78LljUDDIPmFg=", + "integrity": "sha1-ApHvumLVdD5xovN/qT2v5tac+0M=", "requires": { "@microsoft/load-themed-styles": "1.7.50", "@types/es6-promise": "0.0.32", @@ -752,8 +752,8 @@ "es6-promise": "4.2.4", "mocha": "3.5.3", "raw-loader": "0.5.1", - "react": "16.3.1", - "react-dom": "16.3.1", + "react": "16.3.2", + "react-dom": "16.3.2", "tslib": "1.9.0", "webpack": "4.5.0" }, @@ -1039,7 +1039,7 @@ "acorn-dynamic-import": "3.0.0", "ajv": "6.4.0", "ajv-keywords": "3.1.0", - "chrome-trace-event": "0.1.2", + "chrome-trace-event": "0.1.3", "enhanced-resolve": "4.0.0", "eslint-scope": "3.7.1", "loader-runner": "2.3.0", @@ -1047,7 +1047,7 @@ "memory-fs": "0.4.1", "micromatch": "3.1.10", "mkdirp": "0.5.1", - "neo-async": "2.5.0", + "neo-async": "2.5.1", "node-libs-browser": "2.1.0", "schema-utils": "0.4.5", "tapable": "1.0.0", @@ -1060,73 +1060,72 @@ }, "@rush-temp/styling": { "version": "file:projects/styling.tgz", - "integrity": "sha1-rQykPDUcHw+sWmX5GkCZjWYWgi8=", + "integrity": "sha1-oCh2p/rfJ1hLnsJ+kA4etUwi93s=", "requires": { "@microsoft/load-themed-styles": "1.7.50", "@types/jest": "21.1.8", - "@types/react": "16.0.25", + "@types/react": "16.3.10", "@types/webpack-env": "1.13.0", "es6-map": "0.1.5", "es6-weak-map": "2.0.2", - "react": "16.3.1", - "react-dom": "16.3.1", + "react": "16.3.2", + "react-dom": "16.3.2", "tslib": "1.9.0" } }, "@rush-temp/test-bundle-button": { "version": "file:projects/test-bundle-button.tgz", - "integrity": "sha1-ZffflitaT3ZCsM7IZCJofZxarwo=", + "integrity": "sha1-DEKsr3vPRqOJSyHa++oqhlnkt9Q=", "requires": { "@types/prop-types": "15.5.2", - "@types/react": "16.0.25", - "@types/react-dom": "16.0.3", + "@types/react": "16.3.10", + "@types/react-dom": "16.0.5", "@types/webpack-env": "1.13.0", - "react": "16.3.1", - "react-dom": "16.3.1", + "react": "16.3.2", + "react-dom": "16.3.2", "tslib": "1.9.0" } }, "@rush-temp/todo-app": { "version": "file:projects/todo-app.tgz", - "integrity": "sha1-x939qwrOfgjkqjaFAMzyMY8D9cc=", + "integrity": "sha1-g+j/qa8VUW7jubOkemtdrdiWsRM=", "requires": { "@microsoft/load-themed-styles": "1.7.50", "@types/es6-promise": "0.0.32", - "@types/react": "16.0.25", - "@types/react-dom": "16.0.3", + "@types/react": "16.3.10", + "@types/react-dom": "16.0.5", "@types/webpack-env": "1.13.0", "es6-promise": "4.2.4", "immutability-helper": "2.6.6", - "react": "16.3.1", - "react-dom": "16.3.1", + "react": "16.3.2", + "react-dom": "16.3.2", "tslib": "1.9.0", - "typescript": "2.7.2" + "typescript": "2.8.1" } }, "@rush-temp/utilities": { "version": "file:projects/utilities.tgz", - "integrity": "sha1-pvAT2xnO05UmlRpI7Zly47XNZOU=", + "integrity": "sha1-/OUe7tPLUU+ih/KZ/03w8cRa5L0=", "requires": { - "@microsoft/load-themed-styles": "1.7.50", "@types/enzyme": "3.1.5", "@types/enzyme-adapter-react-16": "1.0.1", "@types/jest": "21.1.8", "@types/prop-types": "15.5.2", - "@types/react": "16.0.25", - "@types/react-dom": "16.0.3", + "@types/react": "16.3.10", + "@types/react-dom": "16.0.5", "@types/sinon": "2.2.2", "enzyme": "3.3.0", "enzyme-adapter-react-16": "1.1.1", "prop-types": "15.6.1", - "react": "16.3.1", - "react-dom": "16.3.1", + "react": "16.3.2", + "react-dom": "16.3.2", "sinon": "4.5.0", "tslib": "1.9.0" } }, "@rush-temp/variants": { "version": "file:projects/variants.tgz", - "integrity": "sha1-7XU+B+JPbV7J2rPWZfxIyyXP1UQ=", + "integrity": "sha1-8x6mkzR8vS0Ro1fs0Ctch++yuY8=", "requires": { "@types/jest": "21.1.8", "tslib": "1.9.0" @@ -1134,26 +1133,26 @@ }, "@rush-temp/vr-tests": { "version": "file:projects/vr-tests.tgz", - "integrity": "sha1-RF38TZcnr6jscnhihDb+xO2Lbg0=", + "integrity": "sha1-km3rck0pwUcIkwCcmzEE5OtXAtU=", "requires": { "@storybook/addon-options": "3.2.3", - "@storybook/react": "3.4.0", - "@types/react": "16.0.25", - "@types/react-dom": "16.0.3", + "@storybook/react": "3.4.1", + "@types/react": "16.3.10", + "@types/react-dom": "16.0.5", "@types/storybook__react": "3.0.5", "awesome-typescript-loader": "3.5.0", "css-loader": "0.28.11", "file-loader": "0.11.2", - "postcss-loader": "2.1.3", + "postcss-loader": "2.1.4", "raw-loader": "0.5.1", - "react": "16.3.1", - "react-dom": "16.3.1", + "react": "16.3.2", + "react-dom": "16.3.2", "screener-runner": "0.6.19", - "screener-storybook": "0.11.5", + "screener-storybook": "0.12.5", "storybook-readme": "3.0.6", "style-loader": "0.19.1", "tslib": "1.9.0", - "typescript": "2.7.2" + "typescript": "2.8.1" } }, "@sindresorhus/is": { @@ -1170,15 +1169,15 @@ } }, "@storybook/addon-actions": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-3.4.0.tgz", - "integrity": "sha512-Nsc80JisODvbvyHPR+OEnrPMWkdBpu5W2CmzGgKeVnsov8CGw7oeQIOmLY7zhX2aEof6plidUgCoU5p3Uh92wA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-3.4.1.tgz", + "integrity": "sha512-mCpEbzex7WYkyIHn9QUnIz83IwMO9Zi4D2LC6c/0u42HzQdkmTJWnyEg4NY5Az/1WZZTtwe9aep/pLc+Zzokdw==", "requires": { - "@storybook/components": "3.4.0", + "@storybook/components": "3.4.1", "babel-runtime": "6.26.0", "deep-equal": "1.0.1", "glamor": "2.20.40", - "glamorous": "4.12.2", + "glamorous": "4.12.3", "global": "4.3.2", "make-error": "1.3.4", "prop-types": "15.6.1", @@ -1187,11 +1186,11 @@ } }, "@storybook/addon-links": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-3.4.0.tgz", - "integrity": "sha512-cLg/hX6dTeRXApmL0XcDEMDzFGZMcUJIXgl5bsNCSC9geKNzDHz6LdWeLQAHuQgaVxZJ1wmS1ZjYySGpIj3gEA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-3.4.1.tgz", + "integrity": "sha512-yOVStezQO/VTTlxoqDdVu6CCI2kHBNdLD6lY9w1ly20b6J4hg2Cgy/d/VyPUKfM3fTkdAHeBFayg41KmR9lrMQ==", "requires": { - "@storybook/components": "3.4.0", + "@storybook/components": "3.4.1", "babel-runtime": "6.26.0", "global": "4.3.2", "prop-types": "15.6.1" @@ -1202,57 +1201,57 @@ "resolved": "https://registry.npmjs.org/@storybook/addon-options/-/addon-options-3.2.3.tgz", "integrity": "sha1-6jdA0onUKc52fpaZvzpkfddBWS0=", "requires": { - "@storybook/addons": "3.4.0" + "@storybook/addons": "3.4.1" } }, "@storybook/addons": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-3.4.0.tgz", - "integrity": "sha512-l/UAyvjkmWwMPOUBRNBLDeueVHdUg04rCXzRAO/mqAyg+HorOqIVCmOMccgR9LXjKYGf+OBWkv0DZIj9a5I41g==" + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@storybook/addons/-/addons-3.4.1.tgz", + "integrity": "sha512-WFHwVnJq6zItotj89fGFtEJ/MPdbUaOXu0QsNUbM1Muqw/kVX7gVAwXDPllBJ5y1/42aAzsJCQ/WMdrD2M9Tcg==" }, "@storybook/channel-postmessage": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-3.4.0.tgz", - "integrity": "sha512-HQldvfSp/LiqD8Ey3uavkmKqEQEmlLQW3Y+FWVzqNInYrONVDCf/oGbpqY6m9T9gKzXo7vrlSgDx9UYKeHE3Ww==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@storybook/channel-postmessage/-/channel-postmessage-3.4.1.tgz", + "integrity": "sha512-3LhieYOBJFPi5JRFUCc0axSj28GWAJjnXSNKRsWoRy+oSnj/Ux56ywkGLuh20Mze9NoA45MIKvtrsTPq2UiEkw==", "requires": { - "@storybook/channels": "3.4.0", + "@storybook/channels": "3.4.1", "global": "4.3.2", "json-stringify-safe": "5.0.1" } }, "@storybook/channels": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-3.4.0.tgz", - "integrity": "sha512-C3lBo33C91/yQjJjQuaRjdjh/xntQ5q+QhUlU1N4IdQxykHu455C3f8K/mWDAGK7MFF+x7Pq1OLQ5eoJgSd67g==" + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-3.4.1.tgz", + "integrity": "sha512-D8q64LsAmjZ+MeMUr/j0r+a2M9mm5y1yXBGkbEzucI2e48RP4zcc9ZVNB8yqCDPwtQLDU6w2idFWcaJaZNHXQw==" }, "@storybook/client-logger": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-3.4.0.tgz", - "integrity": "sha512-7XhNeHdLyYsyxvm8g1eZeGqlT+85CRpDJZ55JkNuPikVsVpoXALCUCKC1heyUQ74qvMeTSbo8Ck2yOxb35Uyrg==" + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-3.4.1.tgz", + "integrity": "sha512-wGIdo9GxxZ8iRzjTD9IrOk5UycOm8cnxJfe1Pfw9G5pisthASsxBYeqSVI44K9WchV1fMSRZ4AKUPmpoJ1H+ww==" }, "@storybook/components": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-3.4.0.tgz", - "integrity": "sha512-qpozgneXRGppAcD4Nx78nFTyRj6GlSrtLmAwuaRzM4oN0lYDBuEvDSkgeDYmNcQuHkOUf6hsCLJrl/M0KdvaSA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-3.4.1.tgz", + "integrity": "sha512-STu4EkkUWZgMb/Cbpdf3YUKcQVTqIpg+kEP9zG7519/Eg0OuBgRZ4qRr5jiDbLQMsaGS8oxwjhCoHufG903oZw==", "requires": { "glamor": "2.20.40", - "glamorous": "4.12.2", + "glamorous": "4.12.3", "prop-types": "15.6.1" } }, "@storybook/core": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@storybook/core/-/core-3.4.0.tgz", - "integrity": "sha512-rwIoOrLsSSArc7V6XDBP0jeDwmPAg0chPmcH2ygkbPv2GE8LuJ6J56Q83xvbShOhTlqANFf4v8FTO9Fq9tbb8w==", - "requires": { - "@storybook/addons": "3.4.0", - "@storybook/channel-postmessage": "3.4.0", - "@storybook/client-logger": "3.4.0", - "@storybook/node-logger": "3.4.0", - "@storybook/ui": "3.4.0", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-3.4.1.tgz", + "integrity": "sha512-LGfJFaOjKKP2WQfVMcjxJ+Abv1DBJYmWcMXF1w5nt3sua/GYcidgFVj5txu6Ib44UZubp1iXXQAKr35T+iSNOg==", + "requires": { + "@storybook/addons": "3.4.1", + "@storybook/channel-postmessage": "3.4.1", + "@storybook/client-logger": "3.4.1", + "@storybook/node-logger": "3.4.1", + "@storybook/ui": "3.4.1", "autoprefixer": "7.2.6", "babel-runtime": "6.26.0", - "chalk": "2.3.2", + "chalk": "2.4.0", "commander": "2.15.1", "css-loader": "0.28.11", "dotenv": "5.0.1", @@ -1262,18 +1261,16 @@ "global": "4.3.2", "json-loader": "0.5.7", "postcss-flexbugs-fixes": "3.3.0", - "postcss-loader": "2.1.3", + "postcss-loader": "2.1.4", "prop-types": "15.6.1", "qs": "6.5.1", - "react": "16.3.1", - "react-dom": "16.3.1", "serve-favicon": "2.5.0", "shelljs": "0.8.1", "style-loader": "0.20.3", "url-loader": "0.6.2", "webpack": "3.11.0", "webpack-dev-middleware": "1.12.2", - "webpack-hot-middleware": "2.22.0" + "webpack-hot-middleware": "2.21.2" }, "dependencies": { "events": { @@ -1324,9 +1321,9 @@ } }, "@storybook/node-logger": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-3.4.0.tgz", - "integrity": "sha512-iC1z9ipoHxHGAZXdS6zu+Gxq+wMfmQialWcuExZvol+wdKq57syovoC/NOnFQIhVqYj38GOQH1xZnM8j9UuX7Q==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-3.4.1.tgz", + "integrity": "sha512-vnM2+TIubLLsU5pcqydjnbPnska6zYvPSKIOO7lKTsGV0DdmDy7myvUn+oSRPubVyMh8+uno1J+XTHzdRkhsXQ==", "requires": { "npmlog": "4.1.2" } @@ -1341,18 +1338,18 @@ } }, "@storybook/react": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@storybook/react/-/react-3.4.0.tgz", - "integrity": "sha512-pL5iam3uNY+lYVkVwzzY2Ivxm1r/hn8EpCORPEK088yJlI9vM3YoNwaAeAZwYXVz+znyDVHHzo+ax5hfTYUxTQ==", - "requires": { - "@storybook/addon-actions": "3.4.0", - "@storybook/addon-links": "3.4.0", - "@storybook/addons": "3.4.0", - "@storybook/channel-postmessage": "3.4.0", - "@storybook/client-logger": "3.4.0", - "@storybook/core": "3.4.0", - "@storybook/node-logger": "3.4.0", - "@storybook/ui": "3.4.0", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@storybook/react/-/react-3.4.1.tgz", + "integrity": "sha512-fBeHDwQPmsLcEPjEEDrOzBJMjbcidNms9aAtv8yo+pf8uvLMbe4nOxwt5/goKrj994wpqUrZ0gXXzarcQW59Vg==", + "requires": { + "@storybook/addon-actions": "3.4.1", + "@storybook/addon-links": "3.4.1", + "@storybook/addons": "3.4.1", + "@storybook/channel-postmessage": "3.4.1", + "@storybook/client-logger": "3.4.1", + "@storybook/core": "3.4.1", + "@storybook/node-logger": "3.4.1", + "@storybook/ui": "3.4.1", "airbnb-js-shims": "1.4.1", "babel-loader": "7.1.4", "babel-plugin-macros": "2.2.0", @@ -1370,7 +1367,7 @@ "dotenv-webpack": "1.5.5", "find-cache-dir": "1.0.0", "glamor": "2.20.40", - "glamorous": "4.12.2", + "glamorous": "4.12.3", "global": "4.3.2", "html-loader": "0.5.5", "html-webpack-plugin": "2.30.1", @@ -1383,7 +1380,7 @@ "uglifyjs-webpack-plugin": "1.2.4", "util-deprecate": "1.0.2", "webpack": "3.11.0", - "webpack-hot-middleware": "2.22.0" + "webpack-hot-middleware": "2.21.2" } }, "@storybook/react-komposer": { @@ -1418,11 +1415,11 @@ } }, "@storybook/ui": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-3.4.0.tgz", - "integrity": "sha512-fqVCno/Uo6yaohpDfjCx/Q+KjC93jy8+i+6ZSwEjJIDK+1HW1lrhqycv/vV4+OkXRwsG+y2GOw3MVPdXX3f1yA==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@storybook/ui/-/ui-3.4.1.tgz", + "integrity": "sha512-OX/mnl3jQwZwt1wltFcmO+8yPJlZgeQ4sksKy/jmMqfnk4GFP+UVmg2KIDYhh6Xl2/H1xi14iAdH9Z36losrpw==", "requires": { - "@storybook/components": "3.4.0", + "@storybook/components": "3.4.1", "@storybook/mantra-core": "1.7.2", "@storybook/podda": "1.2.3", "@storybook/react-komposer": "2.0.4", @@ -1468,7 +1465,7 @@ "integrity": "sha512-f1HnxoBnHsK+mcjF6xAofaewv+vPrMtBdxAQuRyO4MltIJV20nf9EVILPBJqfl6/9Gbf9ygbxv4bmwCY9CFsnQ==", "requires": { "@types/cheerio": "0.22.7", - "@types/react": "16.0.25" + "@types/react": "16.3.10" } }, "@types/enzyme-adapter-react-16": { @@ -1518,25 +1515,28 @@ "integrity": "sha512-pQRkAVoxiuUrLq8+CDwiQX4pTCep/PmmNgBbjIwnnsd/HoYjGpR81+FFPE030lvNXgR0haaAU6eoRtztWDE4Xw==" }, "@types/react": { - "version": "16.0.25", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.0.25.tgz", - "integrity": "sha512-K79zMwWRzQ2db+nPoKpi3gA/KmLo6ZQgT4iO2QPEUdBO7as0PcgrmU9KHYzIO3V6lbD7gRjOM0/nUch6xBfOvQ==" + "version": "16.3.10", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.3.10.tgz", + "integrity": "sha512-NGqrP0qhgn8hlFMO3I1w7vwT8KIcdEg1D1AFtYaNBhp1Uo4SZgUpNcbOBfrvgAPRr1nn+Ail/0VoPLI2n4SNMw==", + "requires": { + "csstype": "2.2.0" + } }, "@types/react-addons-test-utils": { "version": "0.14.18", "resolved": "https://registry.npmjs.org/@types/react-addons-test-utils/-/react-addons-test-utils-0.14.18.tgz", "integrity": "sha1-g+EK8dvl7CU1vC3FNz17w7gv3uE=", "requires": { - "@types/react": "16.0.25" + "@types/react": "16.3.10" } }, "@types/react-dom": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.0.3.tgz", - "integrity": "sha512-xAvZiGhQlEhjStoKktoai8CelXVFBaSN6JX4vy1UQioRba3c2vum1TGzR0thHoEauZtIwzWg8mos0AHu2ne4jw==", + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.0.5.tgz", + "integrity": "sha512-ony2hEYlGXCLWNAWWgbsHR7qVvDbeMRFc5b43+7dhj3n+zXzxz81HV9Yjpc3JD8vLCiwYoSLqFCI6bD0+0zG2Q==", "requires": { "@types/node": "8.0.26", - "@types/react": "16.0.25" + "@types/react": "16.3.10" } }, "@types/react-test-renderer": { @@ -1544,7 +1544,7 @@ "resolved": "https://registry.npmjs.org/@types/react-test-renderer/-/react-test-renderer-16.0.1.tgz", "integrity": "sha512-kmNh8g67Ck/y/vp6KX+4JTJXiTGLZBylNhu+R7sm7zcvsrnIGVO6J1zew5inVg428j9f8yHpl68RcYOZXVborQ==", "requires": { - "@types/react": "16.0.25" + "@types/react": "16.3.10" } }, "@types/resemblejs": { @@ -1562,7 +1562,7 @@ "resolved": "https://registry.npmjs.org/@types/storybook__react/-/storybook__react-3.0.5.tgz", "integrity": "sha512-febLx40iQWoQKVaEMpxdzkJnqncPHoRivlilc3JhHJiRuBY1Mqa1yTKcvQ5RiFAYFIuv4x+bRuSIXErk5v41Bg==", "requires": { - "@types/react": "16.0.25", + "@types/react": "16.3.10", "@types/webpack-env": "1.13.0" } }, @@ -1577,40 +1577,39 @@ "integrity": "sha1-LrHQCl5Ow/pYx2r94S4YK2bcXBw=" }, "@uifabric/icons": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/@uifabric/icons/-/icons-5.7.0.tgz", - "integrity": "sha512-3aYM53nPq+nAftXK3bN6ozjsTon0ms/yn5OW6Ht0fFDrhkx88At1i4rQXNJxECglM37VCAPRHVtb486dRaUZzA==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/@uifabric/icons/-/icons-5.7.1.tgz", + "integrity": "sha512-UwfDU6A0bj/QAdTsO20g9mrKXo3zxvumkBWx0F0sEHn1DF/IQDiq4zYVBjRZ3NikQe2o7koWe3Gb0NR84Qr2Sg==", "requires": { - "@uifabric/styling": "5.23.0", + "@uifabric/styling": "5.23.1", "tslib": "1.9.0" } }, "@uifabric/merge-styles": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/@uifabric/merge-styles/-/merge-styles-5.15.0.tgz", - "integrity": "sha512-VwUaVBKbqVbmpcaaKoLbv02B5v7BXhRvsnHOmmnOjSUrKyeZzg1lOwKbk0aoZCpH57lWkdf0RGMZN66imfyaSg==", + "version": "5.15.1", + "resolved": "https://registry.npmjs.org/@uifabric/merge-styles/-/merge-styles-5.15.1.tgz", + "integrity": "sha512-Uk9+80TEXlAYOE3eqRUPMnGYG8XMLYOpv3lSPcBK3suS7nBFWJdwpQlbuCMyCGVlxKPhHGOAaUU6bKgRs02+Gw==", "requires": { "tslib": "1.9.0" } }, "@uifabric/styling": { - "version": "5.23.0", - "resolved": "https://registry.npmjs.org/@uifabric/styling/-/styling-5.23.0.tgz", - "integrity": "sha512-X/hye1euUUosGEPWY878yiyfIIvkw9YCADfU6N0slMcmb205ePbCPUs8ehgVDnZ97zdGHn8cYweK5aO+UTh6SA==", + "version": "5.23.1", + "resolved": "https://registry.npmjs.org/@uifabric/styling/-/styling-5.23.1.tgz", + "integrity": "sha512-u+DPLjz9YJIsxexqEogLcrHgvIvtz92sUKqlGHpVrcQdYuwD+wMmxdg/Bem671aXgGywfH5ypplXJ8+4Lix3qQ==", "requires": { "@microsoft/load-themed-styles": "1.7.50", - "@uifabric/merge-styles": "5.15.0", - "@uifabric/utilities": "5.23.0", + "@uifabric/merge-styles": "5.15.1", + "@uifabric/utilities": "5.24.0", "tslib": "1.9.0" } }, "@uifabric/utilities": { - "version": "5.23.0", - "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-5.23.0.tgz", - "integrity": "sha512-qd1V2ZofVeTFZsNQ2+RmUSSIbxLBg1MmjhJQWeeXPZ3DexJ7aNlL+RgW6uUKSlzbq5F9WFgTA7SCRtQmBQdHpw==", + "version": "5.24.0", + "resolved": "https://registry.npmjs.org/@uifabric/utilities/-/utilities-5.24.0.tgz", + "integrity": "sha512-SiAfpvncj68RrxvceBCGr1QtFXXVc7gtd2RBMkoLj3GTYSum5ZywMEcksa4BHyyY5haJYvQspkFiV9sIPDtX2w==", "requires": { - "@microsoft/load-themed-styles": "1.7.50", - "@uifabric/merge-styles": "5.15.0", + "@uifabric/merge-styles": "5.15.1", "prop-types": "15.6.1", "tslib": "1.9.0" } @@ -1940,7 +1939,7 @@ "requires": { "bn.js": "4.11.8", "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "minimalistic-assert": "1.0.1" } }, "assert": { @@ -2015,7 +2014,7 @@ "integrity": "sha512-Iq8TRIB+/9eQ8rbGhcP7ct5cYb/3qjNYAR2SnzLCEcwF6rvVOax8+9+fccgXk4bEhQGjOZd5TLhsksmAdsbGqQ==", "requires": { "browserslist": "2.11.3", - "caniuse-lite": "1.0.30000827", + "caniuse-lite": "1.0.30000830", "normalize-range": "0.1.2", "num2fraction": "1.2.2", "postcss": "6.0.21", @@ -2027,7 +2026,7 @@ "resolved": "https://registry.npmjs.org/awesome-typescript-loader/-/awesome-typescript-loader-3.5.0.tgz", "integrity": "sha512-qzgm9SEvodVkSi9QY7Me1/rujg+YBNMjayNSAyzNghwTEez++gXoPCwMvpbHRG7wrOkDCiF6dquvv9ESmUBAuw==", "requires": { - "chalk": "2.3.2", + "chalk": "2.4.0", "enhanced-resolve": "3.3.0", "loader-utils": "1.1.0", "lodash": "4.17.5", @@ -3908,6 +3907,11 @@ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=" }, + "browser-process-hrtime": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz", + "integrity": "sha1-Ql1opY00R/AqBKqJQYf86K+Le44=" + }, "browser-resolve": { "version": "1.11.2", "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.2.tgz", @@ -3935,26 +3939,26 @@ "requires": { "buffer-xor": "1.0.3", "cipher-base": "1.0.4", - "create-hash": "1.1.3", + "create-hash": "1.2.0", "evp_bytestokey": "1.0.3", "inherits": "2.0.3", "safe-buffer": "5.1.1" } }, "browserify-cipher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "requires": { "browserify-aes": "1.2.0", - "browserify-des": "1.0.0", + "browserify-des": "1.0.1", "evp_bytestokey": "1.0.3" } }, "browserify-des": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.1.tgz", + "integrity": "sha512-zy0Cobe3hhgpiOM32Tj7KQ3Vl91m0njwsjzZQK1L+JDf11dzP9qIvjreVinsvXrgfjhStXwUWAEpB9D7Gwmayw==", "requires": { "cipher-base": "1.0.4", "des.js": "1.0.0", @@ -3977,11 +3981,11 @@ "requires": { "bn.js": "4.11.8", "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", "elliptic": "6.4.0", "inherits": "2.0.3", - "parse-asn1": "5.1.0" + "parse-asn1": "5.1.1" } }, "browserify-zlib": { @@ -3997,7 +4001,7 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", "requires": { - "caniuse-lite": "1.0.30000827", + "caniuse-lite": "1.0.30000830", "electron-to-chromium": "1.3.42" } }, @@ -4227,7 +4231,7 @@ "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", "requires": { "browserslist": "1.7.7", - "caniuse-db": "1.0.30000827", + "caniuse-db": "1.0.30000830", "lodash.memoize": "4.1.2", "lodash.uniq": "4.5.0" }, @@ -4237,21 +4241,21 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "requires": { - "caniuse-db": "1.0.30000827", + "caniuse-db": "1.0.30000830", "electron-to-chromium": "1.3.42" } } } }, "caniuse-db": { - "version": "1.0.30000827", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000827.tgz", - "integrity": "sha1-vSg53Rlgk7RMKMF/k1ExQMnZJYg=" + "version": "1.0.30000830", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000830.tgz", + "integrity": "sha1-bkUlWzRWSf0V/1kHLaHhK7PeLxM=" }, "caniuse-lite": { - "version": "1.0.30000827", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000827.tgz", - "integrity": "sha512-j9Q9hP5AhqOARNP6fLdctr3XrGhF921sBSycudf4E+8RCWpFT3rJdTfp/5o8LDp6p0NJTpYWEpBFiM+QEDzA6g==" + "version": "1.0.30000830", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000830.tgz", + "integrity": "sha512-yMqGkujkoOIZfvOYiWdqPALgY/PVGiqCHUJb6yNq7xhI/pR+gQO0U2K6lRDqAiJv4+CIU3CtTLblNGw0QGnr6g==" }, "case-sensitive-paths-webpack-plugin": { "version": "2.1.2", @@ -4272,11 +4276,6 @@ "lazy-cache": "1.0.4" } }, - "chain-function": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/chain-function/-/chain-function-1.0.0.tgz", - "integrity": "sha1-DUqzfn4Y6tC9xHuSB2QRjOWHM9w=" - }, "chainsaw": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", @@ -4286,13 +4285,13 @@ } }, "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.0.tgz", + "integrity": "sha512-Wr/w0f4o9LuE7K53cD0qmbAMM+2XNLzR29vFn5hqko4sxGlUsyy363NvmyGIyk5tpe9cjTr9SJYbysEyPkRnFw==", "requires": { "ansi-styles": "3.2.1", "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "supports-color": "5.4.0" } }, "chardet": { @@ -4339,9 +4338,9 @@ "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" }, "chrome-trace-event": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-0.1.2.tgz", - "integrity": "sha1-kPNohdU0WlBiEzLwcXtZWIPV2YI=" + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-0.1.3.tgz", + "integrity": "sha512-sjndyZHrrWiu4RY7AkHgjn80GfAM2ZSzUkZLV/Js59Ldmh6JDThf0SUmOHU53rFu2rVxxfCzJ30Ukcfch3Gb/A==" }, "ci-env": { "version": "1.6.0", @@ -4678,9 +4677,9 @@ } }, "comma-separated-tokens": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.4.tgz", - "integrity": "sha1-cgg+WNSkYvAYZvZhf02Yo807ikY=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.5.tgz", + "integrity": "sha512-Cg90/fcK93n0ecgYTAz1jaA3zvnQ0ExlmKY1rdbyHqAx6BHxwoJc+J7HDu0iuQ7ixEs1qaa+WyQ6oeuBpYP1iA==", "requires": { "trim": "0.0.1" } @@ -4926,39 +4925,40 @@ "glob2base": "0.0.12", "minimatch": "3.0.4", "mkdirp": "0.5.1", - "resolve": "1.7.0", + "resolve": "1.7.1", "safe-buffer": "5.1.1", "shell-quote": "1.6.1", "subarg": "1.0.0" } }, "create-ecdh": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", - "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.1.tgz", + "integrity": "sha512-iZvCCg8XqHQZ1ioNBTzXS/cQSkqkqcPs8xSX4upNB+DAk9Ht3uzQf2J32uAHNCne8LDmKr29AgZrEs4oIrwLuQ==", "requires": { "bn.js": "4.11.8", "elliptic": "6.4.0" } }, "create-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "requires": { "cipher-base": "1.0.4", "inherits": "2.0.3", + "md5.js": "1.3.4", "ripemd160": "2.0.1", "sha.js": "2.4.11" } }, "create-hmac": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "requires": { "cipher-base": "1.0.4", - "create-hash": "1.1.3", + "create-hash": "1.2.0", "inherits": "2.0.3", "ripemd160": "2.0.1", "safe-buffer": "5.1.1", @@ -5008,15 +5008,15 @@ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "requires": { - "browserify-cipher": "1.0.0", + "browserify-cipher": "1.0.1", "browserify-sign": "4.0.4", - "create-ecdh": "4.0.0", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "diffie-hellman": "5.0.2", + "create-ecdh": "4.0.1", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", + "diffie-hellman": "5.0.3", "inherits": "2.0.3", "pbkdf2": "3.0.14", - "public-encrypt": "4.0.0", + "public-encrypt": "4.0.2", "randombytes": "2.0.6", "randomfill": "1.0.4" } @@ -5274,7 +5274,7 @@ "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", "requires": { "browserslist": "1.7.7", - "caniuse-db": "1.0.30000827", + "caniuse-db": "1.0.30000830", "normalize-range": "0.1.2", "num2fraction": "1.2.2", "postcss": "5.2.18", @@ -5286,7 +5286,7 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "requires": { - "caniuse-db": "1.0.30000827", + "caniuse-db": "1.0.30000830", "electron-to-chromium": "1.3.42" } }, @@ -5369,6 +5369,11 @@ "cssom": "0.3.2" } }, + "csstype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.2.0.tgz", + "integrity": "sha512-5YHWQgAtzKIA8trr2AVg6Jq5Fs5eAR1UqKbRJjgQQevNx3IAhD3S9wajvqJdmO7bgIxy0MA5lFVPzJYjmMlNeQ==" + }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", @@ -5403,6 +5408,41 @@ "assert-plus": "1.0.0" } }, + "data-urls": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.0.0.tgz", + "integrity": "sha512-ai40PPQR0Fn1lD2PPie79CibnlMN2AYiDhwFX/rZHVsxbs5kNJSjegqXIprhouGXlRdEnfybva7kqRGnB6mypA==", + "requires": { + "abab": "1.0.4", + "whatwg-mimetype": "2.1.0", + "whatwg-url": "6.4.0" + }, + "dependencies": { + "punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=" + }, + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "requires": { + "punycode": "2.1.0" + } + }, + "whatwg-url": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz", + "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==", + "requires": { + "lodash.sortby": "4.7.0", + "tr46": "1.0.1", + "webidl-conversions": "4.0.2" + } + } + } + }, "date-fns": { "version": "1.29.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz", @@ -5609,7 +5649,7 @@ "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", "requires": { "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "minimalistic-assert": "1.0.1" } }, "destroy": { @@ -5660,9 +5700,9 @@ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" }, "diffie-hellman": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", - "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "requires": { "bn.js": "4.11.8", "miller-rabin": "4.0.1", @@ -5755,6 +5795,14 @@ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "requires": { + "webidl-conversions": "4.0.2" + } + }, "domhandler": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", @@ -5841,7 +5889,7 @@ "hash.js": "1.1.3", "hmac-drbg": "1.0.1", "inherits": "2.0.3", - "minimalistic-assert": "1.0.0", + "minimalistic-assert": "1.0.1", "minimalistic-crypto-utils": "1.0.1" } }, @@ -5932,7 +5980,7 @@ "object.values": "1.0.4", "prop-types": "15.6.1", "react-reconciler": "0.7.0", - "react-test-renderer": "16.3.1" + "react-test-renderer": "16.3.2" }, "dependencies": { "lodash": { @@ -6588,9 +6636,9 @@ "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=" }, "flow-parser": { - "version": "0.69.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.69.0.tgz", - "integrity": "sha1-N4tRKNbQtVSosvFqTKPhq5ZJ8A4=" + "version": "0.70.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.70.0.tgz", + "integrity": "sha512-gGdyVUZWswG5jcINrVDHd3RY4nJptBTAx9mR9thGsrGGmAUR7omgJXQSpR+fXrLtxSTAea3HpAZNU/yzRJc2Cg==" }, "flush-write-stream": { "version": "1.0.3", @@ -6645,7 +6693,7 @@ "lodash.isstring": "4.0.1", "lodash.startswith": "4.2.1", "minimatch": "3.0.4", - "resolve": "1.7.0", + "resolve": "1.7.1", "tapable": "1.0.0", "vue-parser": "1.1.6" }, @@ -7013,11 +7061,12 @@ } }, "glamorous": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/glamorous/-/glamorous-4.12.2.tgz", - "integrity": "sha512-+jGoFgY+Czd/WFXDE4HszXJlYUks2xawlzNx+5rtkwjpc9M36QtgI7YXIq+X7rg1t8sc+0o/PJsO1A9T9atcVA==", + "version": "4.12.3", + "resolved": "https://registry.npmjs.org/glamorous/-/glamorous-4.12.3.tgz", + "integrity": "sha512-7p2IitkzbEx6oB0CO3EkSgyCgponfGrFKmyRSK6amV8gUBLne6Nw3RsASPpVw5zx/jsivYACTpWeixySpSbNNw==", "requires": { "brcast": "3.0.1", + "csstype": "2.2.0", "fast-memoize": "2.3.2", "html-tag-names": "1.1.2", "is-function": "1.0.1", @@ -7389,11 +7438,12 @@ } }, "hash-base": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "requires": { - "inherits": "2.0.3" + "inherits": "2.0.3", + "safe-buffer": "5.1.1" } }, "hash.js": { @@ -7402,7 +7452,7 @@ "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", "requires": { "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "minimalistic-assert": "1.0.1" } }, "hast-util-parse-selector": { @@ -7416,10 +7466,10 @@ "integrity": "sha512-8V34dMSDT1Ik+ZSgTzCLdyp89MrWxcxctXPxhmb72GQj1Xkw1aHPM9UaHCWewvH2Q+PVkYUm4ZJVw4T0dgEGNA==", "requires": { "camelcase": "3.0.0", - "comma-separated-tokens": "1.0.4", + "comma-separated-tokens": "1.0.5", "hast-util-parse-selector": "2.1.0", "property-information": "3.2.0", - "space-separated-tokens": "1.1.1" + "space-separated-tokens": "1.1.2" }, "dependencies": { "camelcase": { @@ -7456,7 +7506,7 @@ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "requires": { "hash.js": "1.1.3", - "minimalistic-assert": "1.0.0", + "minimalistic-assert": "1.0.1", "minimalistic-crypto-utils": "1.0.1" } }, @@ -7509,9 +7559,9 @@ "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=" }, "html-element-attributes": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/html-element-attributes/-/html-element-attributes-1.3.0.tgz", - "integrity": "sha1-8G69/OIt6XnbggICZcrFQfsX1Pw=" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/html-element-attributes/-/html-element-attributes-1.3.1.tgz", + "integrity": "sha512-UrRKgp5sQmRnDy4TEwAUsu14XBUlzKB8U3hjIYDjcZ3Hbp86Jtftzxfgrv6E/ii/h78tsaZwAnAE8HwnHr0dPA==" }, "html-encoding-sniffer": { "version": "1.0.2", @@ -7533,15 +7583,15 @@ "requires": { "es6-templates": "0.2.3", "fastparse": "1.1.1", - "html-minifier": "3.5.14", + "html-minifier": "3.5.15", "loader-utils": "1.1.0", "object-assign": "4.1.1" } }, "html-minifier": { - "version": "3.5.14", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.14.tgz", - "integrity": "sha512-sZjw6zhQgyUnIlIPU+W80XpRjWjdxHtNcxjfyOskOsCTDKytcfLY04wsQY/83Yqb4ndoiD2FtauiL7Yg6uUQFQ==", + "version": "3.5.15", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.15.tgz", + "integrity": "sha512-OZa4rfb6tZOZ3Z8Xf0jKxXkiDcFWldQePGYFDcgKqES2sXeWaEv9y6QQvWUtX3ySI3feApQi5uCsHLINQ6NoAw==", "requires": { "camel-case": "3.0.0", "clean-css": "4.1.11", @@ -7549,13 +7599,13 @@ "he": "1.1.1", "param-case": "2.1.1", "relateurl": "0.2.7", - "uglify-js": "3.3.20" + "uglify-js": "3.3.21" }, "dependencies": { "uglify-js": { - "version": "3.3.20", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.20.tgz", - "integrity": "sha512-WpLkWCf9sGvGZnIvBV0PNID9BATQNT/IXKAmqegfKzIPcTmTV3FP8NQpoogQkt/Y402x2sOFdaHUmqFY9IZp+g==", + "version": "3.3.21", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.21.tgz", + "integrity": "sha512-uy82472lH8tshK3jS3c5IFb5MmNKd/5qyBd0ih8sM42L3jWvxnE339U9gZU1zufnLVs98Stib9twq8dLm2XYCA==", "requires": { "commander": "2.15.1", "source-map": "0.6.1" @@ -7574,7 +7624,7 @@ "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", "requires": { "bluebird": "3.5.1", - "html-minifier": "3.5.14", + "html-minifier": "3.5.15", "loader-utils": "0.2.17", "lodash": "4.17.5", "pretty-error": "2.1.1", @@ -8721,7 +8771,7 @@ "integrity": "sha512-T1BzrbFxDIW/LLYQqVfo94y/hhaj1NzVQkZgBumAC+sxbjMROI7VkihOdxNR758iYbQykL2ZOWUBurFgkQrzdg==", "requires": { "ansi-escapes": "3.1.0", - "chalk": "2.3.2", + "chalk": "2.4.0", "glob": "7.1.2", "graceful-fs": "4.1.11", "is-ci": "1.1.0", @@ -8794,7 +8844,7 @@ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-21.2.1.tgz", "integrity": "sha512-fJru5HtlD/5l2o25eY9xT0doK3t2dlglrqoGpbktduyoI0T5CwuB++2YfoNZCrgZipTwPuAGonYv0q7+8yDc/A==", "requires": { - "chalk": "2.3.2", + "chalk": "2.4.0", "glob": "7.1.2", "jest-environment-jsdom": "21.2.1", "jest-environment-node": "21.2.1", @@ -8812,7 +8862,7 @@ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-21.2.1.tgz", "integrity": "sha512-E5fu6r7PvvPr5qAWE1RaUwIh/k6Zx/3OOkZ4rk5dBJkEWRrUuSgbMt2EO8IUTPTd6DOqU3LW6uTIwX5FRvXoFA==", "requires": { - "chalk": "2.3.2", + "chalk": "2.4.0", "diff": "3.5.0", "jest-get-type": "21.2.0", "pretty-format": "21.2.1" @@ -8865,7 +8915,7 @@ "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-21.2.1.tgz", "integrity": "sha512-lw8FXXIEekD+jYNlStfgNsUHpfMWhWWCgHV7n0B7mA/vendH7vBFs8xybjQsDzJSduptBZJHqQX9SMssya9+3A==", "requires": { - "chalk": "2.3.2", + "chalk": "2.4.0", "expect": "21.2.1", "graceful-fs": "4.1.11", "jest-diff": "21.2.1", @@ -8880,7 +8930,7 @@ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-21.2.1.tgz", "integrity": "sha512-kn56My+sekD43dwQPrXBl9Zn9tAqwoy25xxe7/iY4u+mG8P3ALj5IK7MLHZ4Mi3xW7uWVCjGY8cm4PqgbsqMCg==", "requires": { - "chalk": "2.3.2", + "chalk": "2.4.0", "jest-get-type": "21.2.0", "pretty-format": "21.2.1" } @@ -8890,7 +8940,7 @@ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-21.2.1.tgz", "integrity": "sha512-EbC1X2n0t9IdeMECJn2BOg7buOGivCvVNjqKMXTzQOu7uIfLml+keUfCALDh8o4rbtndIeyGU8/BKfoTr/LVDQ==", "requires": { - "chalk": "2.3.2", + "chalk": "2.4.0", "micromatch": "2.3.11", "slash": "1.0.0" } @@ -8911,7 +8961,7 @@ "integrity": "sha512-vefQ/Lr+VdNvHUZFQXWtOqHX3HEdOc2MtSahBO89qXywEbUxGPB9ZLP9+BHinkxb60UT2Q/tTDOS6rYc6Mwigw==", "requires": { "browser-resolve": "1.11.2", - "chalk": "2.3.2", + "chalk": "2.4.0", "is-builtin-module": "1.0.0" } }, @@ -8948,7 +8998,7 @@ "babel-core": "6.26.0", "babel-jest": "21.2.0", "babel-plugin-istanbul": "4.1.6", - "chalk": "2.3.2", + "chalk": "2.4.0", "convert-source-map": "1.5.1", "graceful-fs": "4.1.11", "jest-config": "21.2.1", @@ -8991,7 +9041,7 @@ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-21.2.1.tgz", "integrity": "sha512-bpaeBnDpdqaRTzN8tWg0DqOTo2DvD3StOemxn67CUd1p1Po+BUpvePAp44jdJ7Pxcjfg+42o4NHw1SxdCA2rvg==", "requires": { - "chalk": "2.3.2", + "chalk": "2.4.0", "jest-diff": "21.2.1", "jest-matcher-utils": "21.2.1", "mkdirp": "0.5.1", @@ -9005,7 +9055,7 @@ "integrity": "sha512-r20W91rmHY3fnCoO7aOAlyfC51x2yeV3xF+prGsJAUsYhKeV670ZB8NO88Lwm7ASu8SdH0S+U+eFf498kjhA4g==", "requires": { "callsites": "2.0.0", - "chalk": "2.3.2", + "chalk": "2.4.0", "graceful-fs": "4.1.11", "jest-message-util": "21.2.1", "jest-mock": "21.2.0", @@ -9018,7 +9068,7 @@ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-21.2.1.tgz", "integrity": "sha512-k4HLI1rZQjlU+EC682RlQ6oZvLrE5SCh3brseQc24vbZTxzT/k/3urar5QMCVgjadmSO7lECeGdc6YxnM3yEGg==", "requires": { - "chalk": "2.3.2", + "chalk": "2.4.0", "jest-get-type": "21.2.0", "leven": "2.1.0", "pretty-format": "21.2.1" @@ -9037,7 +9087,7 @@ "hoek": "4.2.1", "isemail": "2.2.1", "items": "2.1.1", - "moment": "2.22.0", + "moment": "2.22.1", "topo": "2.0.2" } }, @@ -9071,10 +9121,10 @@ "babel-register": "6.26.0", "babylon": "7.0.0-beta.44", "colors": "1.1.2", - "flow-parser": "0.69.0", + "flow-parser": "0.70.0", "lodash": "4.15.0", "micromatch": "2.3.11", - "neo-async": "2.5.0", + "neo-async": "2.5.1", "node-dir": "0.1.8", "nomnom": "1.8.1", "recast": "0.14.7", @@ -9266,6 +9316,11 @@ "invert-kv": "1.0.0" } }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==" + }, "leven": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", @@ -9299,7 +9354,7 @@ "log-update": "1.0.2", "ora": "0.2.3", "p-map": "1.2.0", - "rxjs": "5.5.8", + "rxjs": "5.5.10", "stream-to-observable": "0.2.0", "strip-ansi": "3.0.1" }, @@ -9698,7 +9753,7 @@ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "requires": { - "chalk": "2.3.2" + "chalk": "2.4.0" } }, "log-update": { @@ -9877,17 +9932,6 @@ "requires": { "hash-base": "3.0.4", "inherits": "2.0.3" - }, - "dependencies": { - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" - } - } } }, "media-typer": { @@ -10140,9 +10184,9 @@ } }, "minimalistic-assert": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "minimalistic-crypto-utils": { "version": "1.0.1", @@ -10303,9 +10347,9 @@ } }, "moment": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.0.tgz", - "integrity": "sha512-1muXCh8jb1N/gHRbn9VDUBr0GYb8A/aVcHlII9QSB68a50spqEVLIGN6KVmCOnSvJrUhC0edGgKU5ofnGXdYdg==" + "version": "2.22.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.1.tgz", + "integrity": "sha512-shJkRTSebXvsVqk56I+lkb2latjBs8I+pc2TzWc545y2iFnSjm7Wg0QMh+ZWcdSLQyGEau5jI8ocnmkyTgr9YQ==" }, "move-concurrently": { "version": "1.0.1", @@ -10444,9 +10488,9 @@ "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, "neo-async": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.0.tgz", - "integrity": "sha512-nJmSswG4As/MkRq7QZFuH/sf/yuv8ODdMZrY4Bedjp77a5MK4A6s7YbBB64c9u79EBUOfXUXBvArmvzTD0X+6g==" + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.5.1.tgz", + "integrity": "sha512-3KL3fvuRkZ7s4IFOMfztb7zJp3QaVWnBeGoJlgB38XnCRPj/0tLzzLG5IB8NYOHbJ8g8UGrgZv44GLDk6CxTxA==" }, "netrc": { "version": "0.1.4", @@ -10585,7 +10629,7 @@ "stream-browserify": "2.0.1", "stream-http": "2.8.1", "string_decoder": "1.1.1", - "timers-browserify": "2.0.6", + "timers-browserify": "2.0.7", "tty-browserify": "0.0.0", "url": "0.11.0", "util": "0.10.3", @@ -11038,15 +11082,15 @@ "integrity": "sha1-KhZgU8ye+wlWUGPn/Td8yKywNBw=" }, "office-ui-fabric-react": { - "version": "5.80.0", - "resolved": "https://registry.npmjs.org/office-ui-fabric-react/-/office-ui-fabric-react-5.80.0.tgz", - "integrity": "sha512-5UlHTFdBlZMIs3rbys9Pb/Em+NbsTBsusuagFcpxIYihVjEPJ3po++qAOBtxCUrYD3GvOgh5YJjOOuLf/CIr1g==", + "version": "5.82.1", + "resolved": "https://registry.npmjs.org/office-ui-fabric-react/-/office-ui-fabric-react-5.82.1.tgz", + "integrity": "sha512-ChqMfWuUWir7Xlt4szC5ysOwJwz9Ja67+j3w4PsHz94YVZDyLRexuLw5ALvNDlhF0OtIlONNdte5lv74HDcpMg==", "requires": { "@microsoft/load-themed-styles": "1.7.50", - "@uifabric/icons": "5.7.0", - "@uifabric/merge-styles": "5.15.0", - "@uifabric/styling": "5.23.0", - "@uifabric/utilities": "5.23.0", + "@uifabric/icons": "5.7.1", + "@uifabric/merge-styles": "5.15.1", + "@uifabric/styling": "5.23.1", + "@uifabric/utilities": "5.24.0", "prop-types": "15.6.1", "tslib": "1.9.0" } @@ -11373,13 +11417,13 @@ } }, "parse-asn1": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", - "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", + "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", "requires": { "asn1.js": "4.10.1", "browserify-aes": "1.2.0", - "create-hash": "1.1.3", + "create-hash": "1.2.0", "evp_bytestokey": "1.0.3", "pbkdf2": "3.0.14" } @@ -11486,8 +11530,8 @@ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", "requires": { - "create-hash": "1.1.3", - "create-hmac": "1.1.6", + "create-hash": "1.2.0", + "create-hmac": "1.1.7", "ripemd160": "2.0.1", "safe-buffer": "5.1.1", "sha.js": "2.4.11" @@ -11524,6 +11568,11 @@ "find-up": "2.1.0" } }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==" + }, "portfinder": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", @@ -11559,9 +11608,9 @@ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.21.tgz", "integrity": "sha512-y/bKfbQz2Nn/QBC08bwvYUxEFOVGfPIUOTsJ2CK5inzlXW9SdYR1x4pEsG9blRAF/PX+wRNdOah+gx/hv4q7dw==", "requires": { - "chalk": "2.3.2", + "chalk": "2.4.0", "source-map": "0.6.1", - "supports-color": "5.3.0" + "supports-color": "5.4.0" } }, "postcss-calc": { @@ -12176,9 +12225,9 @@ } }, "postcss-loader": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.3.tgz", - "integrity": "sha512-RuBcNE8rjCkIB0IsbmkGFRmQJTeQJfCI88E0VTarPNTvaNSv9OFv1DvTwgtAN/qlzyiELsmmmtX/tEzKp/cdug==", + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.4.tgz", + "integrity": "sha512-L2p654oK945B/gDFUGgOhh7uzj19RWoY1SVMeJVoKno1H2MdbQ0RppR/28JGju4pMb22iRC7BJ9aDzbxXSLf4A==", "requires": { "loader-utils": "1.1.0", "postcss": "6.0.21", @@ -12336,7 +12385,7 @@ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", "requires": { - "caniuse-db": "1.0.30000827", + "caniuse-db": "1.0.30000830", "electron-to-chromium": "1.3.42" } }, @@ -13314,9 +13363,9 @@ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" }, "prettier": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.11.1.tgz", - "integrity": "sha512-T/KD65Ot0PB97xTrG8afQ46x3oiVhnfGjGESSI9NWYcG92+OUPZKkwHqGWXH2t9jK1crnQjubECW0FuOth+hxw==" + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.12.1.tgz", + "integrity": "sha1-wa0g6APndJ+vkFpAnSNn4Gu+cyU=" }, "pretty-bytes": { "version": "4.0.2", @@ -13382,9 +13431,9 @@ } }, "prismjs": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.13.0.tgz", - "integrity": "sha512-0/1Fiyg3MCzepo6t6Wzx2Ef4nftGKeQIv+Z6LO38RcYJN5QV2ePHh8W41ZkFn57B++6BnglF6fCiJ9b80YlzkQ==" + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.14.0.tgz", + "integrity": "sha512-sa2s4m60bXs+kU3jcuUwx3ZCrUH7o0kuqnOOINbODqlRrDB7KY8SRx+xR/D7nHLlgfDdG7zXbRO8wJ+su5Ls0A==" }, "private": { "version": "0.1.8", @@ -13459,14 +13508,14 @@ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, "public-encrypt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", - "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", + "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", "requires": { "bn.js": "4.11.8", "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "parse-asn1": "5.1.0", + "create-hash": "1.2.0", + "parse-asn1": "5.1.1", "randombytes": "2.0.6" } }, @@ -13676,9 +13725,9 @@ "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=" }, "react": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/react/-/react-16.3.1.tgz", - "integrity": "sha512-NbkxN9jsZ6+G+ICsLdC7/wUD26uNbvKU/RAxEWgc9kcdKvROt+5d5j2cNQm5PSFTQ4WNGsR3pa4qL2Q0/WSy1w==", + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/react/-/react-16.3.2.tgz", + "integrity": "sha512-o5GPdkhciQ3cEph6qgvYB7LTOHw/GB0qRI6ZFNugj49qJCFfgHwVNjZ5u+b7nif4vOeMIOuYj3CeYe2IBD74lg==", "requires": { "fbjs": "0.8.16", "loose-envify": "1.3.1", @@ -13749,7 +13798,7 @@ "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", "requires": { "ansi-escapes": "3.1.0", - "chalk": "2.3.2", + "chalk": "2.4.0", "cli-cursor": "2.1.0", "cli-width": "2.2.0", "external-editor": "2.2.0", @@ -13773,13 +13822,13 @@ } }, "chalk": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.2.tgz", - "integrity": "sha512-ZM4j2/ld/YZDc3Ma8PgN7gyAk+kHMMMyzLNryCPGhWrsfAuDVeuid5bpRFTDgMH9JBK2lA4dyyAkkZYF/WcqDQ==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.0.tgz", + "integrity": "sha512-Wr/w0f4o9LuE7K53cD0qmbAMM+2XNLzR29vFn5hqko4sxGlUsyy363NvmyGIyk5tpe9cjTr9SJYbysEyPkRnFw==", "requires": { "ansi-styles": "3.2.1", "escape-string-regexp": "1.0.5", - "supports-color": "5.3.0" + "supports-color": "5.4.0" } }, "strip-ansi": { @@ -13791,9 +13840,9 @@ } }, "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "requires": { "has-flag": "3.0.0" } @@ -13867,9 +13916,9 @@ } }, "react-dom": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.3.1.tgz", - "integrity": "sha512-2Infg89vzahq8nfVi1GkjPqq0vrBvf0f3T0+dTtyjq4f6HKOqKixAK25Vr593O3QTx4kw/vmUtAJwerlevNWOA==", + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.3.2.tgz", + "integrity": "sha512-MMPko3zYncNrz/7gG17wJWUREZDvskZHXOwbttzl0F0L3wDmToyuETuo/r8Y5yvDejwYcRyWI1lvVBjLJWFwKA==", "requires": { "fbjs": "0.8.16", "loose-envify": "1.3.1", @@ -13933,7 +13982,7 @@ "resolved": "https://registry.npmjs.org/react-html-attributes/-/react-html-attributes-1.4.1.tgz", "integrity": "sha1-l7XscQ2miDNZjIvm+JrENiFoQKU=", "requires": { - "html-element-attributes": "1.3.0" + "html-element-attributes": "1.3.1" } }, "react-icon-base": { @@ -13959,9 +14008,9 @@ } }, "react-is": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.3.1.tgz", - "integrity": "sha512-3XpazGqS5DEOLiuR6JQ2Sg6URq/33d1BHJVaUvtMz579KRhd2D0pqabNEe5czv785yzKBPZimOf0UNIXa3jw1A==" + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.3.2.tgz", + "integrity": "sha512-ybEM7YOr4yBgFd6w8dJqwxegqZGJNBZl6U27HnGKuTZmDvVrD5quWOK/wAnMywiZzW+Qsk+l4X2c70+thp/A8Q==" }, "react-modal": { "version": "3.3.2", @@ -14018,31 +14067,29 @@ "babel-runtime": "6.26.0", "highlight.js": "9.12.0", "lowlight": "1.9.1", - "prismjs": "1.13.0", + "prismjs": "1.14.0", "refractor": "2.3.0" } }, "react-test-renderer": { - "version": "16.3.1", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.3.1.tgz", - "integrity": "sha512-emEcIPUowMjT5EQ+rrb0FAwVCzuJ+LKDweoYDh073v2/jHxrBDPUk8nzI5dofG3R+140+Bb9TMcT2Ez5OP6pQw==", + "version": "16.3.2", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.3.2.tgz", + "integrity": "sha512-lL8WHIpCTMdSe+CRkt0rfMxBkJFyhVrpdQ54BaJRIrXf9aVmbeHbRA8GFRpTvohPN5tPzMabmrzW2PUfWCfWwQ==", "requires": { "fbjs": "0.8.16", "object-assign": "4.1.1", "prop-types": "15.6.1", - "react-is": "16.3.1" + "react-is": "16.3.2" } }, "react-transition-group": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-1.2.1.tgz", - "integrity": "sha512-CWaL3laCmgAFdxdKbhhps+c0HRGF4c+hdM4H23+FI1QBNUyx/AMeIJGWorehPNSaKnQNOAxL7PQmqMu78CDj3Q==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.3.1.tgz", + "integrity": "sha512-hu4/LAOFSKjWt1+1hgnOv3ldxmt6lvZGTWz4KUkFrqzXrNDIVSu6txIcPszw7PNduR8en9YTN55JLRyd/L1ZiQ==", "requires": { - "chain-function": "1.0.0", "dom-helpers": "3.3.1", "loose-envify": "1.3.1", - "prop-types": "15.6.1", - "warning": "3.0.0" + "prop-types": "15.6.1" } }, "react-treebeard": { @@ -14055,7 +14102,7 @@ "prop-types": "15.6.1", "radium": "0.19.6", "shallowequal": "0.2.2", - "velocity-react": "1.3.3" + "velocity-react": "1.4.0" } }, "read-chunk": { @@ -14134,7 +14181,7 @@ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "requires": { - "resolve": "1.7.0" + "resolve": "1.7.1" } }, "recursive-readdir": { @@ -14462,6 +14509,16 @@ "lodash": "4.15.0" } }, + "request-promise-native": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", + "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", + "requires": { + "request-promise-core": "1.1.1", + "stealthy-require": "1.1.1", + "tough-cookie": "2.3.4" + } + }, "requestretry": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/requestretry/-/requestretry-1.12.3.tgz", @@ -14499,9 +14556,9 @@ "integrity": "sha512-o4sxCTSwTxx5hBFXYn5rsgMuLQT8kufJ5vzKYcRwWhCWERKN4dqZwiMx7+nRrcXouWmiFGD9A486yS4Z1a2PQQ==" }, "resolve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.0.tgz", - "integrity": "sha512-QdgZ5bjR1WAlpLaO5yHepFvC+o3rCr6wpfE2tpJNMkXdulf2jKomQBdNRQITF3ZKHNlT71syG98yQP03gasgnA==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", + "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", "requires": { "path-parse": "1.0.5" } @@ -14578,6 +14635,16 @@ "requires": { "hash-base": "2.0.2", "inherits": "2.0.3" + }, + "dependencies": { + "hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "requires": { + "inherits": "2.0.3" + } + } } }, "rst-selector-parser": { @@ -14624,9 +14691,9 @@ } }, "rxjs": { - "version": "5.5.8", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.8.tgz", - "integrity": "sha512-Bz7qou7VAIoGiglJZbzbXa4vpX5BmTTN2Dj/se6+SwADtw4SihqBIiEa7VmTXJ8pynvq0iFr5Gx9VLyye1rIxQ==", + "version": "5.5.10", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.10.tgz", + "integrity": "sha512-SRjimIDUHJkon+2hFo7xnvNC4ZEHGzCRwh9P7nzX3zPkCGFEg/tuElrNR7L/rZMagnK2JeH2jQwPRpmyXyLB6A==", "requires": { "symbol-observable": "1.0.1" } @@ -15091,7 +15158,7 @@ "clone-deep": "2.0.2", "loader-utils": "1.1.0", "lodash.tail": "4.1.1", - "neo-async": "2.5.0", + "neo-async": "2.5.1", "pify": "3.0.0" } }, @@ -15348,36 +15415,36 @@ } }, "screener-storybook": { - "version": "0.11.5", - "resolved": "https://registry.npmjs.org/screener-storybook/-/screener-storybook-0.11.5.tgz", - "integrity": "sha1-AeT31Pjt8qMwxMysVPxj4Y/zGEM=", + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/screener-storybook/-/screener-storybook-0.12.5.tgz", + "integrity": "sha1-B+L579ZC+fs9K9B/PVJGGnoQnQw=", "requires": { "bluebird": "3.4.7", "colors": "1.1.2", "commander": "2.9.0", "get-port": "3.2.0", "joi": "10.0.6", - "jsdom": "9.8.3", + "jsdom": "11.7.0", "lodash": "4.17.5", "prop-types": "15.6.1", "react": "15.6.2", "react-dom": "15.4.2", "request": "2.81.0", "requestretry": "1.12.3", - "screener-runner": "0.8.2" + "screener-runner": "0.9.1" }, "dependencies": { "acorn": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", - "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=" + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", + "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==" }, "acorn-globals": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", - "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.1.0.tgz", + "integrity": "sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ==", "requires": { - "acorn": "2.7.0" + "acorn": "5.5.3" } }, "ajv": { @@ -15399,11 +15466,6 @@ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" - }, "bluebird": { "version": "3.4.7", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", @@ -15478,58 +15540,11 @@ "ms": "0.7.1" } }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.6", - "mime-types": "2.1.18" - } - }, "har-schema": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" }, - "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - }, - "dependencies": { - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" - } - } - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.14.1" - } - }, "joi": { "version": "10.0.6", "resolved": "https://registry.npmjs.org/joi/-/joi-10.0.6.tgz", @@ -15542,30 +15557,67 @@ } }, "jsdom": { - "version": "9.8.3", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-9.8.3.tgz", - "integrity": "sha1-/eKcEJwyoRMeC2xlkU5kGY+Xw3A=", + "version": "11.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.7.0.tgz", + "integrity": "sha512-9NzSc4Iz4gN9p4uoPbBUzro21QdgL32swaWIaWS8eEVQ2I69fRJAy/MKyvlEIk0V7HtKgfMbbOKyTZUrzR2Hsw==", "requires": { "abab": "1.0.4", - "acorn": "2.7.0", - "acorn-globals": "1.0.9", + "acorn": "5.5.3", + "acorn-globals": "4.1.0", "array-equal": "1.0.0", - "content-type-parser": "1.0.2", "cssom": "0.3.2", "cssstyle": "0.2.37", + "data-urls": "1.0.0", + "domexception": "1.0.1", "escodegen": "1.9.1", "html-encoding-sniffer": "1.0.2", - "iconv-lite": "0.4.21", + "left-pad": "1.3.0", "nwmatcher": "1.4.4", - "parse5": "1.5.1", - "request": "2.81.0", + "parse5": "4.0.0", + "pn": "1.1.0", + "request": "2.85.0", + "request-promise-native": "1.0.5", "sax": "1.2.4", "symbol-tree": "3.2.2", "tough-cookie": "2.3.4", - "webidl-conversions": "3.0.1", + "w3c-hr-time": "1.0.1", + "webidl-conversions": "4.0.2", "whatwg-encoding": "1.0.3", - "whatwg-url": "3.1.0", - "xml-name-validator": "2.0.1" + "whatwg-mimetype": "2.1.0", + "whatwg-url": "6.4.0", + "ws": "4.1.0", + "xml-name-validator": "3.0.0" + }, + "dependencies": { + "request": { + "version": "2.85.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", + "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.7.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + } + } } }, "lodash": { @@ -15595,19 +15647,14 @@ "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=" }, "parse5": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", - "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=" - }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" + "punycode": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", + "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=" }, "react": { "version": "15.6.2", @@ -15658,12 +15705,74 @@ "tough-cookie": "2.3.4", "tunnel-agent": "0.6.0", "uuid": "3.2.1" + }, + "dependencies": { + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.18" + } + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.14.1" + } + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" + } } }, "screener-runner": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/screener-runner/-/screener-runner-0.8.2.tgz", - "integrity": "sha1-6s1x1kjguLZLTc6BA/E2uElTUFc=", + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/screener-runner/-/screener-runner-0.9.1.tgz", + "integrity": "sha1-+k9X6DbU0+zo8yld/9te49Cs4BM=", "requires": { "bluebird": "3.4.7", "colors": "1.1.2", @@ -15679,11 +15788,26 @@ "request-promise": "4.1.1" }, "dependencies": { + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" + }, "caseless": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=" }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.18" + } + }, "har-validator": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", @@ -15695,6 +15819,34 @@ "pinkie-promise": "2.0.1" } }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + }, + "dependencies": { + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + } + } + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.14.1" + } + }, "joi": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/joi/-/joi-9.2.0.tgz", @@ -15703,7 +15855,7 @@ "hoek": "4.2.1", "isemail": "2.2.1", "items": "2.1.1", - "moment": "2.22.0", + "moment": "2.22.1", "topo": "2.0.2" } }, @@ -15771,19 +15923,28 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=" + "tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", + "requires": { + "punycode": "2.1.0" + } }, "whatwg-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-3.1.0.tgz", - "integrity": "sha1-e9yuSQ+SGu9kUftnOexrvY6Qe/Y=", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.4.0.tgz", + "integrity": "sha512-Z0CVh/YE217Foyb488eo+iBv+r7eAQ0wSTyApi9n06jhcA3z6Nidg/EGvl0UFkg7kMdKxfBzzr+o9JF+cevgMg==", "requires": { - "tr46": "0.0.3", - "webidl-conversions": "3.0.1" + "lodash.sortby": "4.7.0", + "tr46": "1.0.1", + "webidl-conversions": "4.0.2" } + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" } } }, @@ -16047,7 +16208,7 @@ "lodash.get": "4.4.2", "lolex": "2.3.2", "nise": "1.3.2", - "supports-color": "5.3.0", + "supports-color": "5.4.0", "type-detect": "4.0.8" } }, @@ -16298,9 +16459,9 @@ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" }, "space-separated-tokens": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.1.tgz", - "integrity": "sha1-lpW5355lrsGBHUw/nOUlILwvfk0=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.2.tgz", + "integrity": "sha512-G3jprCEw+xFEs0ORweLmblJ3XLymGGr6hxZYTYZjIlvDti9vOBUjRQa1Rzjt012aRrocKstHwdNi+F7HguPsEA==", "requires": { "trim": "0.0.1" } @@ -16681,9 +16842,9 @@ } }, "supports-color": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.3.0.tgz", - "integrity": "sha512-0aP01LLIskjKs3lq52EC0aGBAJhLq7B2Rd8HC/DR/PtNNpcLilNmHC12O+hu0usQpo7wtHNRqtrhBwtDb0+dNg==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", "requires": { "has-flag": "3.0.0" } @@ -17158,9 +17319,9 @@ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" }, "timers-browserify": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.6.tgz", - "integrity": "sha512-HQ3nbYRAowdVd0ckGFvmJPPCOH/CHleFN/Y0YQCX1DVaB7t+KFvisuyN09fuP8Jtp1CpfSh8O8bMkHbdbPe6Pw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.7.tgz", + "integrity": "sha512-U7DtjfsHeYjNAyEz4MdCLGZMY3ySyHIgZZp6ba9uxZlMRMiK5yTHUYc2XfGQHKFgxGcmvBF2jafoNtQYvlDpOw==", "requires": { "setimmediate": "1.0.5" } @@ -17417,7 +17578,7 @@ "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-4.2.0.tgz", "integrity": "sha512-EvnwgbEUklPQK82OiZS0NDrG0ZoH91+zef8PFXSOZocSQ5jklQyvAM84Id20UxjVdXVIzMgFu+vlKCQomfq27A==", "requires": { - "chalk": "2.3.2", + "chalk": "2.4.0", "enhanced-resolve": "4.0.0", "loader-utils": "1.1.0", "micromatch": "3.1.10", @@ -17694,13 +17855,13 @@ "requires": { "babel-code-frame": "6.26.0", "builtin-modules": "1.1.1", - "chalk": "2.3.2", + "chalk": "2.4.0", "commander": "2.15.1", "diff": "3.5.0", "glob": "7.1.2", "js-yaml": "3.7.0", "minimatch": "3.0.4", - "resolve": "1.7.0", + "resolve": "1.7.1", "semver": "5.5.0", "tslib": "1.9.0", "tsutils": "2.26.1" @@ -17771,9 +17932,9 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typescript": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.2.tgz", - "integrity": "sha512-p5TCYZDAO0m4G344hD+wx/LATebLWZNkkh2asWUFqSsD2OrDNhbAHuSjobrmsUmdzjJjEeZVU9g1h3O6vpstnw==" + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.8.1.tgz", + "integrity": "sha512-Ao/f6d/4EPLq0YwzsQz8iXflezpTkQzqAyenTiw4kCUGr1uPiFLC3+fZ+gMZz6eeI/qdRUqvC+HxIJzUAzEFdg==" }, "typical": { "version": "2.6.1", @@ -18140,20 +18301,20 @@ "integrity": "sha512-VJ3csMz5zP1ifkbBlsNYpxnoWkPHfVRQ8tUongS78W5DxSGHB68pjYHDTgUYBkVM7P/HpYdVukgVUFcxjr1gGg==" }, "velocity-react": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/velocity-react/-/velocity-react-1.3.3.tgz", - "integrity": "sha1-1tRyds/Ivip1Yjh5sgFArFjBuCs=", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/velocity-react/-/velocity-react-1.4.0.tgz", + "integrity": "sha512-DUb+uCIjv9PboB0GprUxHE5oWij5sm40qRZmpRgZMcBBd0g3T97q/hHafxoTzM5g2ZI5GUA5kQF98oONOXxwiQ==", "requires": { - "lodash": "3.10.1", + "lodash": "4.17.5", "prop-types": "15.6.1", - "react-transition-group": "1.2.1", + "react-transition-group": "2.3.1", "velocity-animate": "1.5.1" }, "dependencies": { "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" } } }, @@ -18226,6 +18387,14 @@ "parse5": "3.0.3" } }, + "w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "requires": { + "browser-process-hrtime": "0.1.2" + } + }, "walker": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", @@ -18258,7 +18427,7 @@ "requires": { "chokidar": "2.0.3", "graceful-fs": "4.1.11", - "neo-async": "2.5.0" + "neo-async": "2.5.1" }, "dependencies": { "anymatch": { @@ -18583,7 +18752,7 @@ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", "requires": { - "minimalistic-assert": "1.0.0" + "minimalistic-assert": "1.0.1" } }, "webidl-conversions": { @@ -18831,7 +19000,7 @@ "babel-register": "6.26.0", "babylon": "6.18.0", "colors": "1.1.2", - "flow-parser": "0.69.0", + "flow-parser": "0.70.0", "lodash": "4.15.0", "micromatch": "2.3.11", "node-dir": "0.1.8", @@ -18872,7 +19041,7 @@ "requires": { "acorn": "5.5.3", "bfj-node4": "5.3.1", - "chalk": "2.3.2", + "chalk": "2.4.0", "commander": "2.15.1", "ejs": "2.5.8", "express": "4.16.3", @@ -18910,7 +19079,7 @@ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-2.0.14.tgz", "integrity": "sha512-gRoWaxSi2JWiYsn1QgOTb6ENwIeSvN1YExZ+kJ0STsTZK7bWPElW+BBBv1UnTbvcPC3v7E17mK8hlFX8DOYSGw==", "requires": { - "chalk": "2.3.2", + "chalk": "2.4.0", "cross-spawn": "6.0.5", "diff": "3.5.0", "enhanced-resolve": "4.0.0", @@ -18929,13 +19098,13 @@ "mkdirp": "0.5.1", "p-each-series": "1.0.0", "p-lazy": "1.0.0", - "prettier": "1.11.1", - "supports-color": "5.3.0", + "prettier": "1.12.1", + "supports-color": "5.4.0", "v8-compile-cache": "1.1.2", "webpack-addons": "1.1.5", "yargs": "11.1.0", "yeoman-environment": "2.0.6", - "yeoman-generator": "2.0.3" + "yeoman-generator": "2.0.4" }, "dependencies": { "ansi-escapes": { @@ -18976,7 +19145,7 @@ "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", "requires": { "ansi-escapes": "3.1.0", - "chalk": "2.3.2", + "chalk": "2.4.0", "cli-cursor": "2.1.0", "cli-width": "2.2.0", "external-editor": "2.2.0", @@ -18984,7 +19153,7 @@ "lodash": "4.17.5", "mute-stream": "0.0.7", "run-async": "2.3.0", - "rxjs": "5.5.8", + "rxjs": "5.5.10", "string-width": "2.1.1", "strip-ansi": "4.0.0", "through": "2.3.8" @@ -19039,7 +19208,7 @@ "requires": { "loud-rejection": "1.6.0", "memory-fs": "0.4.1", - "mime": "2.2.2", + "mime": "2.3.1", "path-is-absolute": "1.0.1", "range-parser": "1.2.0", "url-join": "4.0.0", @@ -19047,9 +19216,9 @@ }, "dependencies": { "mime": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.2.2.tgz", - "integrity": "sha512-A7PDg4s48MkqFEcYg2b069m3DXOEq7hx+9q9rIFrSSYfzsh35GX+LOVMQ8Au0ko7d8bSQCIAuzkjp0vCtwENlQ==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", + "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==" } } }, @@ -19082,7 +19251,7 @@ "sockjs-client": "1.1.4", "spdy": "3.4.7", "strip-ansi": "3.0.1", - "supports-color": "5.3.0", + "supports-color": "5.4.0", "webpack-dev-middleware": "1.12.2", "yargs": "6.6.0" }, @@ -19540,9 +19709,9 @@ } }, "webpack-hot-middleware": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.22.0.tgz", - "integrity": "sha512-kmjTZ6WXZowuBfTk1/H/scmyp09eHwPpqF2mHRZ9WMCBlQ61NSkqZ25azPlPOeCIhva57PGrUyeTIW5X8Q7HEw==", + "version": "2.21.2", + "resolved": "https://registry.npmjs.org/webpack-hot-middleware/-/webpack-hot-middleware-2.21.2.tgz", + "integrity": "sha512-N5c80o31E0COFJV8HRjiX3hJetDOwQ2Ajt5TTORKA9diOimhFtmaZKSfO3pQKMeQngb7I4TUnNDroJiUzPFhKQ==", "requires": { "ansi-html": "0.0.7", "html-entities": "1.2.1", @@ -19555,7 +19724,7 @@ "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-1.2.0.tgz", "integrity": "sha512-U9AnICnu50HXtiqiDxuli5gLB5PGBo7VvcHx36jRZHwK4vzOYLbImqT4lwWwoMHdQWwEKw736fCHEekokTEKHA==", "requires": { - "chalk": "2.3.2", + "chalk": "2.4.0", "log-symbols": "2.2.0", "loglevelnext": "1.0.4", "uuid": "3.2.1" @@ -19614,6 +19783,11 @@ "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.4.tgz", "integrity": "sha512-dcQ1GWpOD/eEQ97k66aiEVpNnapVj90/+R+SXTPYGHpYBBypfKJEQjLrvMZ7YXbKm21gXd4NcuxUTjiv1YtLng==" }, + "whatwg-mimetype": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz", + "integrity": "sha512-FKxhYLytBQiUKjkYteN71fAUA3g6KpNXoho1isLiLSB3N1G4F35Q5vUxWfKFhBwi5IWF27VE6WxhrnnC+m0Mew==" + }, "whatwg-url": { "version": "4.8.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-4.8.0.tgz", @@ -19753,7 +19927,7 @@ "filesize": "3.6.1", "lodash": "4.15.0", "mkdirp": "0.5.1", - "moment": "2.22.0" + "moment": "2.22.1" }, "dependencies": { "ansi-styles": { @@ -19967,7 +20141,7 @@ "resolved": "https://registry.npmjs.org/yeoman-environment/-/yeoman-environment-2.0.6.tgz", "integrity": "sha512-jzHBTTy8EPI4ImV8dpUMt+Q5zELkSU5xvGpndHcHudQ4tqN6YgIWaCGmRFl+HDchwRUkcgyjQ+n6/w5zlJBCPg==", "requires": { - "chalk": "2.3.2", + "chalk": "2.4.0", "debug": "3.1.0", "diff": "3.5.0", "escape-string-regexp": "1.0.5", @@ -19998,7 +20172,7 @@ "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", "requires": { "ansi-escapes": "3.1.0", - "chalk": "2.3.2", + "chalk": "2.4.0", "cli-cursor": "2.1.0", "cli-width": "2.2.0", "external-editor": "2.2.0", @@ -20029,12 +20203,12 @@ } }, "yeoman-generator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/yeoman-generator/-/yeoman-generator-2.0.3.tgz", - "integrity": "sha512-mODmrZ26a94djmGZZuIiomSGlN4wULdou29ZwcySupb2e9FdvoCl7Ps2FqHFjEHio3kOl/iBeaNqrnx3C3NwWg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/yeoman-generator/-/yeoman-generator-2.0.4.tgz", + "integrity": "sha512-Sgvz3MAkOpEIobcpW3rjEl6bOTNnl8SkibP9z7hYKfIGIlw0QDC2k0MAeXvyE2pLqc2M0Duql+6R7/W9GrJojg==", "requires": { "async": "2.6.0", - "chalk": "2.3.2", + "chalk": "2.4.0", "cli-table": "0.3.1", "cross-spawn": "5.1.0", "dargs": "5.1.0", diff --git a/ghdocs/BestPractices/ComponentDesign.md b/ghdocs/BestPractices/ComponentDesign.md index 840a2759ffaa2..5368c017587de 100644 --- a/ghdocs/BestPractices/ComponentDesign.md +++ b/ghdocs/BestPractices/ComponentDesign.md @@ -189,9 +189,9 @@ public render() { Best, use createRef: -The `createRef` function in `lib/Utilities` is a polyfill for [React.createRef](https://github.com/facebook/react/pull/11555). (When Fabric switches over to React 16, we'll use React.createRef instead) +The `createRef` function in `lib/Utilities` is a polyfill for [React.createRef](https://reactjs.org/docs/refs-and-the-dom.html#creating-refs). (When Fabric switches over to React 16, we'll use React.createRef instead) -`createRef` creates a reference object that has the following type `{ value: T | null }`, where T is the element to reference (either a dom node or a react component). You set the reference by passing the reference object as the `ref` prop. You can then subsequently access the reference through the `.value` property on the reference object elsewhere in your code. +`createRef` creates a reference object that has the following type `{ current: T | null }`, where T is the element to reference (either a dom node or a react component). You set the reference by passing the reference object as the `ref` prop. You can then subsequently access the reference through the `.current` property on the reference object elsewhere in your code. ```typescript import { createRef } from 'office-ui-fabric-react/lib/Utilities'; @@ -200,14 +200,14 @@ class Foo extends BaseComponent<...> { // Create the reference object that will be used for setting and accessing the reference private _root = createRef(); - public render() { + public render(): JSX.Element { // Set the reference by passing the reference object as the ref prop return + + +
  • + +
    + TestText4 +
    +
    +
  • + +
    +
    +
    +
    +`; diff --git a/packages/office-ui-fabric-react/src/components/Breadcrumb/docs/BreadcrumbDonts.md b/packages/office-ui-fabric-react/src/components/Breadcrumb/docs/BreadcrumbDonts.md new file mode 100644 index 0000000000000..41d6b2c92cb4a --- /dev/null +++ b/packages/office-ui-fabric-react/src/components/Breadcrumb/docs/BreadcrumbDonts.md @@ -0,0 +1 @@ +- Don't use Breadcrumbs as a primary way to navigate an app or site. \ No newline at end of file diff --git a/packages/office-ui-fabric-react/src/components/Breadcrumb/docs/BreadcrumbDos.md b/packages/office-ui-fabric-react/src/components/Breadcrumb/docs/BreadcrumbDos.md new file mode 100644 index 0000000000000..475b0636fbcd7 --- /dev/null +++ b/packages/office-ui-fabric-react/src/components/Breadcrumb/docs/BreadcrumbDos.md @@ -0,0 +1 @@ +- Place Breadcrumbs at the top of a page, above a list of items, or above the main content of a page. \ No newline at end of file diff --git a/packages/office-ui-fabric-react/src/components/Breadcrumb/docs/BreadcrumbOverview.md b/packages/office-ui-fabric-react/src/components/Breadcrumb/docs/BreadcrumbOverview.md new file mode 100644 index 0000000000000..78bbf512689e3 --- /dev/null +++ b/packages/office-ui-fabric-react/src/components/Breadcrumb/docs/BreadcrumbOverview.md @@ -0,0 +1,3 @@ +Breadcrumbs should be used as a navigational aid in your app or site. They indicate the current page’s location within a hierarchy and help the user understand where they are in relation to the rest of that hierarchy. They also afford one-click access to higher levels of that hierarchy. + +Breadcrumbs are typically placed, in horizontal form, under the masthead or navigation of an experience, above the primary content area. \ No newline at end of file diff --git a/packages/office-ui-fabric-react/src/components/Breadcrumb/examples/Breadcrumb.Basic.Example.tsx b/packages/office-ui-fabric-react/src/components/Breadcrumb/examples/Breadcrumb.Basic.Example.tsx index 25cb0874589e0..5ee7499cbed3b 100644 --- a/packages/office-ui-fabric-react/src/components/Breadcrumb/examples/Breadcrumb.Basic.Example.tsx +++ b/packages/office-ui-fabric-react/src/components/Breadcrumb/examples/Breadcrumb.Basic.Example.tsx @@ -1,6 +1,4 @@ -/* tslint:disable:no-unused-variable */ import * as React from 'react'; -/* tslint:enable:no-unused-variable */ import { Breadcrumb, IBreadcrumbItem } from 'office-ui-fabric-react/lib/Breadcrumb'; @@ -13,7 +11,7 @@ export class BreadcrumbBasicExample extends React.Component { super(props); } - public render() { + public render(): JSX.Element { const customDivider = () => *; return ( @@ -58,11 +56,23 @@ export class BreadcrumbBasicExample extends React.Component { maxDisplayedItems={ 3 } ariaLabel={ 'Website breadcrumb' } /> + + +
    ); } - private _onBreadcrumbItemClicked = (ev: React.MouseEvent, item: IBreadcrumbItem) => { + private _onBreadcrumbItemClicked = (ev: React.MouseEvent, item: IBreadcrumbItem): void => { console.log(`Breadcrumb item with key "${item.key}" has been clicked.`); } diff --git a/packages/office-ui-fabric-react/src/components/Breadcrumb/examples/Breadcrumb.Static.Example.tsx b/packages/office-ui-fabric-react/src/components/Breadcrumb/examples/Breadcrumb.Static.Example.tsx index fc283ec4f333f..fe371bfcee2c4 100644 --- a/packages/office-ui-fabric-react/src/components/Breadcrumb/examples/Breadcrumb.Static.Example.tsx +++ b/packages/office-ui-fabric-react/src/components/Breadcrumb/examples/Breadcrumb.Static.Example.tsx @@ -1,13 +1,11 @@ -/* tslint:disable:no-unused-variable */ import * as React from 'react'; -/* tslint:enable:no-unused-variable */ import { Breadcrumb, IBreadcrumbItem } from 'office-ui-fabric-react/lib/Breadcrumb'; export class BreadcrumbStaticExample extends React.Component { - public render() { + public render(): JSX.Element { return (
    , item: IBreadcrumbItem) => { + private _onBreadcrumbItemClicked = (ev: React.MouseEvent, item: IBreadcrumbItem): void => { console.log(`Breadcrumb item with key "${item.key}" has been clicked.`); } diff --git a/packages/office-ui-fabric-react/src/components/Button/ActionButton/ActionButton.tsx b/packages/office-ui-fabric-react/src/components/Button/ActionButton/ActionButton.tsx index c99913121c977..da778847a2dd1 100644 --- a/packages/office-ui-fabric-react/src/components/Button/ActionButton/ActionButton.tsx +++ b/packages/office-ui-fabric-react/src/components/Button/ActionButton/ActionButton.tsx @@ -12,7 +12,7 @@ export class ActionButton extends BaseComponent { */ protected _shouldUpdateComponentRef = false; - public render() { + public render(): JSX.Element { const { styles, theme } = this.props; return ( diff --git a/packages/office-ui-fabric-react/src/components/Button/BaseButton.tsx b/packages/office-ui-fabric-react/src/components/Button/BaseButton.tsx index b0c79bd946e7e..5c350017e24df 100644 --- a/packages/office-ui-fabric-react/src/components/Button/BaseButton.tsx +++ b/packages/office-ui-fabric-react/src/components/Button/BaseButton.tsx @@ -33,12 +33,14 @@ export class BaseButton extends BaseComponent = { baseClassName: 'ms-Button', - classNames: {}, styles: {}, split: false, }; @@ -65,8 +67,13 @@ export class BaseButton extends BaseComponent @@ -401,22 +408,35 @@ export class BaseButton extends BaseComponent { - this.setState({ menuProps: null }); + let menuProps = null; + if (this.props.persistMenu && this.state.menuProps) { + menuProps = this.state.menuProps; + menuProps.hidden = true; + } + this.setState({ menuProps: menuProps }); } private _openMenu = (): void => { if (this.props.menuProps) { - this.setState({ menuProps: this.props.menuProps }); + const menuProps = this.props.menuProps; + if (this.props.persistMenu) { + menuProps.hidden = false; + } + this.setState({ menuProps: menuProps }); } } private _onToggleMenu = (): void => { - if (this._splitButtonContainer.value) { - this._splitButtonContainer.value.focus(); + if (this._splitButtonContainer.current) { + this._splitButtonContainer.current.focus(); } - const { menuProps } = this.props; + const currentMenuProps = this.state.menuProps; - currentMenuProps ? this._dismissMenu() : this._openMenu(); + if (this.props.persistMenu) { + currentMenuProps && currentMenuProps.hidden ? this._openMenu() : this._dismissMenu(); + } else { + currentMenuProps ? this._dismissMenu() : this._openMenu(); + } } private _onRenderSplitButtonContent(tag: any, buttonProps: IButtonProps): JSX.Element { @@ -425,7 +445,6 @@ export class BaseButton extends BaseComponent; + return ; } private _onMouseDown = (ev: React.MouseEvent) => { @@ -530,8 +549,8 @@ export class BaseButton extends BaseComponent) => { if (ev.which === KeyCodes.enter) { - if (this._buttonElement.value) { - this._buttonElement.value.click(); + if (this._buttonElement.current) { + this._buttonElement.current.click(); ev.preventDefault(); ev.stopPropagation(); } @@ -549,14 +568,13 @@ export class BaseButton extends BaseComponent { describe('DefaultButton', () => { function renderIntoDocument(element: React.ReactElement): HTMLElement { const component = ReactTestUtils.renderIntoDocument(element); - const renderedDOM: Element = ReactDOM.findDOMNode(component as React.ReactInstance); + const renderedDOM = ReactDOM.findDOMNode(component as React.ReactInstance); return renderedDOM as HTMLElement; } @@ -84,7 +84,7 @@ describe('Button', () => { const button = ReactTestUtils.renderIntoDocument( Hello ); - const renderedDOM = ReactDOM.findDOMNode(button as React.ReactInstance); + const renderedDOM = ReactDOM.findDOMNode(button as React.ReactInstance) as Element; expect(renderedDOM.tagName).toEqual('BUTTON'); }); @@ -94,7 +94,7 @@ describe('Button', () => { const button = ReactTestUtils.renderIntoDocument( Hello ); - const renderedDOM = ReactDOM.findDOMNode(button as React.ReactInstance); + const renderedDOM = ReactDOM.findDOMNode(button as React.ReactInstance) as Element; expect(renderedDOM.tagName).toEqual('BUTTON'); }); @@ -102,7 +102,7 @@ describe('Button', () => { const button = ReactTestUtils.renderIntoDocument( Hello ); - const renderedDOM = ReactDOM.findDOMNode(button as React.ReactInstance); + const renderedDOM = ReactDOM.findDOMNode(button as React.ReactInstance) as Element; expect(renderedDOM.tagName).toEqual('A'); }); @@ -259,7 +259,7 @@ describe('Button', () => { } } /> ); - const renderedDOM = ReactDOM.findDOMNode(button as React.ReactInstance); + const renderedDOM = ReactDOM.findDOMNode(button as React.ReactInstance) as Element; expect(renderedDOM.tagName).not.toEqual('DIV'); }); @@ -287,7 +287,7 @@ describe('Button', () => { } } /> ); - const menuButtonDOM = ReactDOM.findDOMNode(button as React.ReactInstance); + const menuButtonDOM = ReactDOM.findDOMNode(button as React.ReactInstance) as Element; ReactTestUtils.Simulate.keyDown(menuButtonDOM, { which: KeyCodes.enter }); @@ -320,7 +320,7 @@ describe('Button', () => { } } /> ); - const renderedDOM = ReactDOM.findDOMNode(button as React.ReactInstance); + const renderedDOM = ReactDOM.findDOMNode(button as React.ReactInstance) as Element; const primaryButtonDOM: HTMLDivElement = renderedDOM.getElementsByTagName('div')[0] as HTMLDivElement; ReactTestUtils.Simulate.keyDown(primaryButtonDOM, { which: KeyCodes.enter }); @@ -351,7 +351,7 @@ describe('Button', () => { } } /> ); - const renderedDOM = ReactDOM.findDOMNode(button as React.ReactInstance); + const renderedDOM = ReactDOM.findDOMNode(button as React.ReactInstance) as Element; expect(renderedDOM.tagName).toEqual('DIV'); }); @@ -378,7 +378,7 @@ describe('Button', () => { } } /> ); - const renderedDOM = ReactDOM.findDOMNode(button as React.ReactInstance); + const renderedDOM = ReactDOM.findDOMNode(button as React.ReactInstance) as Element; const menuButtonDOM: HTMLButtonElement = renderedDOM.getElementsByTagName('button')[1] as HTMLButtonElement; ReactTestUtils.Simulate.click(menuButtonDOM); expect(renderedDOM.getAttribute('aria-expanded')).toEqual('true'); @@ -406,7 +406,7 @@ describe('Button', () => { } } /> ); - const menuButtonDOM = ReactDOM.findDOMNode(button as React.ReactInstance); + const menuButtonDOM = ReactDOM.findDOMNode(button as React.ReactInstance) as Element; ReactTestUtils.Simulate.keyDown(menuButtonDOM, { @@ -437,7 +437,7 @@ describe('Button', () => { } } /> ); - const menuButtonDOM = ReactDOM.findDOMNode(button as React.ReactInstance); + const menuButtonDOM = ReactDOM.findDOMNode(button as React.ReactInstance) as Element; ReactTestUtils.Simulate.keyDown(menuButtonDOM, { diff --git a/packages/office-ui-fabric-react/src/components/Button/Button.tsx b/packages/office-ui-fabric-react/src/components/Button/Button.tsx index 06772743f94da..17a4c5764e144 100644 --- a/packages/office-ui-fabric-react/src/components/Button/Button.tsx +++ b/packages/office-ui-fabric-react/src/components/Button/Button.tsx @@ -1,6 +1,4 @@ -/* tslint:disable:no-unused-variable */ import * as React from 'react'; -/* tslint:enable:no-unused-variable */ import { BaseComponent, warn } from '../../Utilities'; import { ButtonType, IButtonProps } from './Button.types'; @@ -28,7 +26,7 @@ export class Button extends BaseComponent { ); } - public render() { + public render(): JSX.Element { const props = this.props; switch (props.buttonType) { diff --git a/packages/office-ui-fabric-react/src/components/Button/Button.types.ts b/packages/office-ui-fabric-react/src/components/Button/Button.types.ts index bf875046469f5..2bae1a569d29b 100644 --- a/packages/office-ui-fabric-react/src/components/Button/Button.types.ts +++ b/packages/office-ui-fabric-react/src/components/Button/Button.types.ts @@ -234,6 +234,15 @@ export interface IButtonProps extends React.AllHTMLAttributes } overview={ -
    -

    Buttons are best used to enable a user to commit a change or complete steps in a task. They are typically found inside forms, dialogs, panels or pages. An example of their usage is confirming the deletion of a file in a confirmation dialog.

    -

    When considering their place in a layout, contemplate the order in which a user will flow through the UI. As an example, in a form, the individual will need to read and interact with the form fields before submiting the form. Therefore, as a general rule, the button should be placed at the bottom of the UI container (a dialog, panel, or page) which holds the related UI elements.

    -

    While buttons can technically be used to navigate a user to another part of the experience, this is not recommended unless that navigation is part of an action or their flow.

    -

    Note that both iconProps and menuIconProps take IIconProps to specify name and type.

    -
    + + { require('!raw-loader!office-ui-fabric-react/src/components/Button/docs/ButtonOverview.md') } + } bestPractices={
    } dos={ -
    -
      -
    • Make sure the label conveys a clear purpose of the button to the user.
    • -
    • Button labels must describe the action the button will perform and should include a verb. Use concise, specific, self-explanatory labels, usually a single word.
    • -
    • Buttons should always include a noun if there is any room for interpretation about what the verb operates on.
    • -
    • Consider the affect localization will have on the button and what will happen to components around it.
    • -
    • If the button’s label content is dynamic, consider how the button will resize and what will happen to components around it.
    • -
    • Use only a single line of text in the label of the button.
    • -
    • Expose only one or two buttons to the user at a time, for example, "Accept" and "Cancel". If you need to expose more actions to the user, consider using checkboxes or radio buttons from which the user can select actions, with a single command button to trigger those actions.
    • -
    • Show only one primary button that inherits theme color at rest state. In the event there are more than two buttons with equal priority, all buttons should have neutral backgrounds.
    • -
    • "Submit", "OK", and "Apply" buttons should always be styled as primary buttons. When "Reset" or "Cancel" buttons appear alongside one of the above, they should be styled as secondary buttons.
    • -
    • Default buttons should always perform safe operations. For example, a default button should never delete.
    • -
    • Use task buttons to cause actions that complete a task or cause a transitional task. Do not use buttons to toggle other UX in the same context. For example, a button may be used to open an interface area but should not be used to open an additional set of components in the same interface.
    • -
    -
    + + { require('!raw-loader!office-ui-fabric-react/src/components/Button/docs/ButtonDos.md') } + } donts={ -
    -
      -
    • Don't use generic labels like "Ok," especially in the case of an error; errors are never "Ok."
    • -
    • Don’t place the default focus on a button that destroys data. Instead, place the default focus on the button that performs the "safe act" and retains the content (i.e. "Save") or cancels the action (i.e. "Cancel").
    • -
    • Don’t use a button to navigate to another place, use a link instead. The exception is in a wizard where "Back" and "Next" buttons may be used.
    • -
    • Don’t put too much text in a button - try to keep the length of your text to a minimum.
    • -
    • Don't put anything other than text in a button.
    • -
    -
    + + { require('!raw-loader!office-ui-fabric-react/src/components/Button/docs/ButtonDonts.md') } + } isHeaderVisible={ this.props.isHeaderVisible } componentStatus={ @@ -183,13 +163,13 @@ export class ButtonPage extends React.Component, disabled: boolean) { + private _onDisabledChanged(ev: React.MouseEvent, disabled: boolean): void { this.setState({ areButtonsDisabled: disabled }); } - private _onToggledChanged(ev: React.MouseEvent, toggled: boolean) { + private _onToggledChanged(ev: React.MouseEvent, toggled: boolean): void { this.setState({ areButtonsChecked: toggled }); diff --git a/packages/office-ui-fabric-react/src/components/Button/CommandBarButton/CommandBarButton.tsx b/packages/office-ui-fabric-react/src/components/Button/CommandBarButton/CommandBarButton.tsx index c5b55c2678e0d..d2a94188f742c 100644 --- a/packages/office-ui-fabric-react/src/components/Button/CommandBarButton/CommandBarButton.tsx +++ b/packages/office-ui-fabric-react/src/components/Button/CommandBarButton/CommandBarButton.tsx @@ -11,7 +11,7 @@ export class CommandBarButton extends BaseComponent { */ protected _shouldUpdateComponentRef = false; - public render() { + public render(): JSX.Element { const { styles, theme } = this.props; return ( diff --git a/packages/office-ui-fabric-react/src/components/Button/CompoundButton/CompoundButton.tsx b/packages/office-ui-fabric-react/src/components/Button/CompoundButton/CompoundButton.tsx index 96cd9e73660a7..96aaf94ed664d 100644 --- a/packages/office-ui-fabric-react/src/components/Button/CompoundButton/CompoundButton.tsx +++ b/packages/office-ui-fabric-react/src/components/Button/CompoundButton/CompoundButton.tsx @@ -11,7 +11,7 @@ export class CompoundButton extends BaseComponent { */ protected _shouldUpdateComponentRef = false; - public render() { + public render(): JSX.Element { const { primary = false, styles, theme } = this.props; return ( { */ protected _shouldUpdateComponentRef = false; - public render() { + public render(): JSX.Element { const { primary = false, styles, theme } = this.props; return ( diff --git a/packages/office-ui-fabric-react/src/components/Button/IconButton/IconButton.tsx b/packages/office-ui-fabric-react/src/components/Button/IconButton/IconButton.tsx index 775ecceba5cc6..6612ed87bfa05 100644 --- a/packages/office-ui-fabric-react/src/components/Button/IconButton/IconButton.tsx +++ b/packages/office-ui-fabric-react/src/components/Button/IconButton/IconButton.tsx @@ -11,7 +11,7 @@ export class IconButton extends BaseComponent { */ protected _shouldUpdateComponentRef = false; - public render() { + public render(): JSX.Element { const { styles, theme } = this.props; return ( diff --git a/packages/office-ui-fabric-react/src/components/Button/MessageBarButton/MessageBarButton.tsx b/packages/office-ui-fabric-react/src/components/Button/MessageBarButton/MessageBarButton.tsx index c59d000ab98a1..3c5e0345f0423 100644 --- a/packages/office-ui-fabric-react/src/components/Button/MessageBarButton/MessageBarButton.tsx +++ b/packages/office-ui-fabric-react/src/components/Button/MessageBarButton/MessageBarButton.tsx @@ -7,7 +7,7 @@ import { getStyles } from './MessageBarButton.styles'; @customizable('MessageBarButton', ['theme']) export class MessageBarButton extends BaseComponent { - public render() { + public render(): JSX.Element { const { styles, theme } = this.props; return ( diff --git a/packages/office-ui-fabric-react/src/components/Button/PrimaryButton/PrimaryButton.tsx b/packages/office-ui-fabric-react/src/components/Button/PrimaryButton/PrimaryButton.tsx index c633f9c4a7031..58ec54fcdb1a7 100644 --- a/packages/office-ui-fabric-react/src/components/Button/PrimaryButton/PrimaryButton.tsx +++ b/packages/office-ui-fabric-react/src/components/Button/PrimaryButton/PrimaryButton.tsx @@ -10,7 +10,7 @@ export class PrimaryButton extends BaseComponent { */ protected _shouldUpdateComponentRef = false; - public render() { + public render(): JSX.Element { return ( IIconProps to specify name and type. \ No newline at end of file diff --git a/packages/office-ui-fabric-react/src/components/Button/examples/Button.Action.Example.tsx b/packages/office-ui-fabric-react/src/components/Button/examples/Button.Action.Example.tsx index dd8603446821a..cb59b41399533 100644 --- a/packages/office-ui-fabric-react/src/components/Button/examples/Button.Action.Example.tsx +++ b/packages/office-ui-fabric-react/src/components/Button/examples/Button.Action.Example.tsx @@ -15,7 +15,7 @@ export class ButtonActionExample extends React.Component { super(props); } - public render() { + public render(): JSX.Element { const { disabled, checked } = this.props; const getClassNames = classNamesFunction(); diff --git a/packages/office-ui-fabric-react/src/components/Button/examples/Button.Anchor.Example.tsx b/packages/office-ui-fabric-react/src/components/Button/examples/Button.Anchor.Example.tsx index 09a462ec6a688..5bdbe2a5a8917 100644 --- a/packages/office-ui-fabric-react/src/components/Button/examples/Button.Anchor.Example.tsx +++ b/packages/office-ui-fabric-react/src/components/Button/examples/Button.Anchor.Example.tsx @@ -11,7 +11,7 @@ import { } from 'office-ui-fabric-react/lib/Button'; export class ButtonAnchorExample extends React.Component { - public render() { + public render(): JSX.Element { const { disabled, checked } = this.props; const getClassNames = classNamesFunction(); diff --git a/packages/office-ui-fabric-react/src/components/Button/examples/Button.Command.Example.tsx b/packages/office-ui-fabric-react/src/components/Button/examples/Button.Command.Example.tsx index 4617d5420cb86..acbdf45e089d8 100644 --- a/packages/office-ui-fabric-react/src/components/Button/examples/Button.Command.Example.tsx +++ b/packages/office-ui-fabric-react/src/components/Button/examples/Button.Command.Example.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import { CommandButton, IButtonProps } from 'office-ui-fabric-react/lib/Button'; export class ButtonCommandExample extends React.Component { - public render() { + public render(): JSX.Element { const { disabled, checked } = this.props; return ( diff --git a/packages/office-ui-fabric-react/src/components/Button/examples/Button.CommandBar.Example.tsx b/packages/office-ui-fabric-react/src/components/Button/examples/Button.CommandBar.Example.tsx index c1ba4cf865759..295b9974150eb 100644 --- a/packages/office-ui-fabric-react/src/components/Button/examples/Button.CommandBar.Example.tsx +++ b/packages/office-ui-fabric-react/src/components/Button/examples/Button.CommandBar.Example.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import { CommandBarButton, IButtonProps } from 'office-ui-fabric-react/lib/Button'; export class ButtonCommandBarExample extends React.Component { - public render() { + public render(): JSX.Element { const { disabled, checked } = this.props; return ( diff --git a/packages/office-ui-fabric-react/src/components/Button/examples/Button.Compound.Example.tsx b/packages/office-ui-fabric-react/src/components/Button/examples/Button.Compound.Example.tsx index 19a42f41c4c63..bd284ccc3d3f5 100644 --- a/packages/office-ui-fabric-react/src/components/Button/examples/Button.Compound.Example.tsx +++ b/packages/office-ui-fabric-react/src/components/Button/examples/Button.Compound.Example.tsx @@ -16,7 +16,7 @@ export class ButtonCompoundExample extends React.Component { super(props); } - public render() { + public render(): JSX.Element { const { disabled, checked } = this.props; const getClassNames = classNamesFunction(); diff --git a/packages/office-ui-fabric-react/src/components/Button/examples/Button.ContextualMenu.Example.tsx b/packages/office-ui-fabric-react/src/components/Button/examples/Button.ContextualMenu.Example.tsx index 31aff85d1f4cd..5675c885040d4 100644 --- a/packages/office-ui-fabric-react/src/components/Button/examples/Button.ContextualMenu.Example.tsx +++ b/packages/office-ui-fabric-react/src/components/Button/examples/Button.ContextualMenu.Example.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import { DefaultButton, IButtonProps } from 'office-ui-fabric-react/lib/Button'; export class ButtonContextualMenuExample extends React.Component { - public render() { + public render(): JSX.Element { const { disabled, checked } = this.props; return ( @@ -27,8 +27,9 @@ export class ButtonContextualMenuExample extends React.Component diff --git a/packages/office-ui-fabric-react/src/components/Button/examples/Button.Default.Example.tsx b/packages/office-ui-fabric-react/src/components/Button/examples/Button.Default.Example.tsx index 7e145591eefde..83de1f76fa67f 100644 --- a/packages/office-ui-fabric-react/src/components/Button/examples/Button.Default.Example.tsx +++ b/packages/office-ui-fabric-react/src/components/Button/examples/Button.Default.Example.tsx @@ -9,7 +9,7 @@ import { DefaultButton, IButtonProps } from 'office-ui-fabric-react/lib/Button'; import { Label } from 'office-ui-fabric-react/lib/Label'; export class ButtonDefaultExample extends React.Component { - public render() { + public render(): JSX.Element { const { disabled, checked } = this.props; const getClassNames = classNamesFunction(); diff --git a/packages/office-ui-fabric-react/src/components/Button/examples/Button.Icon.Example.tsx b/packages/office-ui-fabric-react/src/components/Button/examples/Button.Icon.Example.tsx index bcd33745f2ad7..135731af03772 100644 --- a/packages/office-ui-fabric-react/src/components/Button/examples/Button.Icon.Example.tsx +++ b/packages/office-ui-fabric-react/src/components/Button/examples/Button.Icon.Example.tsx @@ -8,7 +8,7 @@ import { import { IconButton, IButtonProps } from 'office-ui-fabric-react/lib/Button'; export class ButtonIconExample extends React.Component { - public render() { + public render(): JSX.Element { const { disabled, checked } = this.props; const getClassNames = classNamesFunction(); @@ -23,6 +23,7 @@ export class ButtonIconExample extends React.Component { title='Emoji' ariaLabel='Emoji' /> +

    For a list of Icons, visit our Icon documentation.

    ); } diff --git a/packages/office-ui-fabric-react/src/components/Button/examples/Button.Primary.Example.tsx b/packages/office-ui-fabric-react/src/components/Button/examples/Button.Primary.Example.tsx index fcc150fa3fd13..253e75f431bc8 100644 --- a/packages/office-ui-fabric-react/src/components/Button/examples/Button.Primary.Example.tsx +++ b/packages/office-ui-fabric-react/src/components/Button/examples/Button.Primary.Example.tsx @@ -8,7 +8,7 @@ import { import { PrimaryButton, IButtonProps } from 'office-ui-fabric-react/lib/Button'; export class ButtonPrimaryExample extends React.Component { - public render() { + public render(): JSX.Element { const { disabled, checked } = this.props; const getClassNames = classNamesFunction(); diff --git a/packages/office-ui-fabric-react/src/components/Button/examples/Button.ScreenReader.Example.tsx b/packages/office-ui-fabric-react/src/components/Button/examples/Button.ScreenReader.Example.tsx index ceccbf0b51c1d..5cd9502c361f7 100644 --- a/packages/office-ui-fabric-react/src/components/Button/examples/Button.ScreenReader.Example.tsx +++ b/packages/office-ui-fabric-react/src/components/Button/examples/Button.ScreenReader.Example.tsx @@ -8,7 +8,7 @@ import { import { PrimaryButton, IButtonProps } from 'office-ui-fabric-react/lib/Button'; export class ButtonScreenReaderExample extends React.Component { - public render() { + public render(): JSX.Element { const { disabled, checked } = this.props; const getClassNames = classNamesFunction(); diff --git a/packages/office-ui-fabric-react/src/components/Button/examples/Button.Split.Example.tsx b/packages/office-ui-fabric-react/src/components/Button/examples/Button.Split.Example.tsx index 3ab322885eda6..63ae1632d8ccf 100644 --- a/packages/office-ui-fabric-react/src/components/Button/examples/Button.Split.Example.tsx +++ b/packages/office-ui-fabric-react/src/components/Button/examples/Button.Split.Example.tsx @@ -15,7 +15,7 @@ const alertClicked = (): void => { export class ButtonSplitExample extends React.Component { - public render() { + public render(): JSX.Element { const { disabled, checked } = this.props; const getClassNames = classNamesFunction(); @@ -139,7 +139,7 @@ export class ButtonSplitExample extends React.Component { export class ButtonSplitCustomExample extends React.Component { - public render() { + public render(): JSX.Element { const { disabled, checked } = this.props; const customSplitButtonStyles = getCustomSplitButtonStyles(); diff --git a/packages/office-ui-fabric-react/src/components/Button/examples/Button.Swap.Example.tsx b/packages/office-ui-fabric-react/src/components/Button/examples/Button.Swap.Example.tsx index e91de6bf13f39..80061d9aa3dee 100644 --- a/packages/office-ui-fabric-react/src/components/Button/examples/Button.Swap.Example.tsx +++ b/packages/office-ui-fabric-react/src/components/Button/examples/Button.Swap.Example.tsx @@ -39,7 +39,7 @@ export class ButtonSwapExample extends React.Component impl this._focusOnUpdate = false; } - public componentWillReceiveProps(nextProps: ICalendarProps) { + public componentWillReceiveProps(nextProps: ICalendarProps): void { const { autoNavigateOnSelection, value, today = new Date() } = nextProps; // Make sure auto-navigation is supported for programmatic changes to selected date, i.e., @@ -109,19 +109,19 @@ export class Calendar extends BaseComponent impl }); } - public componentDidUpdate() { + public componentDidUpdate(): void { if (this._focusOnUpdate) { // if the day picker is shown, focus on it - if (this._dayPicker.value) { - this._dayPicker.value.focus(); - } else if (this._monthPicker.value) { - this._monthPicker.value.focus(); + if (this._dayPicker.current) { + this._dayPicker.current.focus(); + } else if (this._monthPicker.current) { + this._monthPicker.current.focus(); } this._focusOnUpdate = false; } } - public render() { + public render(): JSX.Element { const rootClass = 'ms-DatePicker'; const { firstDayOfWeek, dateRangeType, strings, showMonthPickerAsOverlay, autoNavigateOnSelection, showGoToToday, highlightCurrentMonth, navigationIcons, minDate, maxDate } = this.props; const { selectedDate, navigatedDate, isMonthPickerVisible, isDayPickerVisible } = this.state; @@ -204,8 +204,8 @@ export class Calendar extends BaseComponent impl } public focus() { - if (this._dayPicker.value) { - this._dayPicker.value.focus(); + if (this._dayPicker.current) { + this._dayPicker.current.focus(); } } diff --git a/packages/office-ui-fabric-react/src/components/Calendar/CalendarDay.tsx b/packages/office-ui-fabric-react/src/components/Calendar/CalendarDay.tsx index 7907ad60de58e..60cafbab4a897 100644 --- a/packages/office-ui-fabric-react/src/components/Calendar/CalendarDay.tsx +++ b/packages/office-ui-fabric-react/src/components/Calendar/CalendarDay.tsx @@ -95,13 +95,13 @@ export class CalendarDay extends BaseComponent 0) { @@ -347,7 +347,7 @@ export class CalendarDay extends BaseComponent, date: Date, weekIndex: number, dayIndex: number) { + private _navigateMonthEdge(ev: React.KeyboardEvent, date: Date, weekIndex: number, dayIndex: number): void { const { minDate, maxDate } = this.props; let targetDate: Date | undefined = undefined; diff --git a/packages/office-ui-fabric-react/src/components/Calendar/CalendarMonth.tsx b/packages/office-ui-fabric-react/src/components/Calendar/CalendarMonth.tsx index c8058f76f7898..6dcb482316182 100644 --- a/packages/office-ui-fabric-react/src/components/Calendar/CalendarMonth.tsx +++ b/packages/office-ui-fabric-react/src/components/Calendar/CalendarMonth.tsx @@ -52,7 +52,7 @@ export class CalendarMonth extends BaseComponent { this._onSelectMonth = this._onSelectMonth.bind(this); } - public render() { + public render(): JSX.Element { const { navigatedDate, strings, today, highlightCurrentMonth, navigationIcons, dateTimeFormatter, minDate, maxDate } = this.props; const leftNavigationIcon = navigationIcons.leftNavigation; @@ -157,7 +157,7 @@ export class CalendarMonth extends BaseComponent { } } - private _isCurrentMonth(month: number, year: number, today: Date) { + private _isCurrentMonth(month: number, year: number, today: Date): boolean { return today.getFullYear() === year && today.getMonth() === month; } diff --git a/packages/office-ui-fabric-react/src/components/Calendar/CalendarPage.tsx b/packages/office-ui-fabric-react/src/components/Calendar/CalendarPage.tsx index b360902469275..3beb5f7fc4914 100644 --- a/packages/office-ui-fabric-react/src/components/Calendar/CalendarPage.tsx +++ b/packages/office-ui-fabric-react/src/components/Calendar/CalendarPage.tsx @@ -3,7 +3,8 @@ import { ComponentPage, ExampleCard, IComponentDemoPageProps, - PropertiesTableSet + PropertiesTableSet, + PageMarkdown, } from '@uifabric/example-app-base'; import { DateRangeType, DayOfWeek } from 'office-ui-fabric-react/lib/Calendar'; import { CalendarButtonExample } from './examples/Calendar.Button.Example'; @@ -16,12 +17,13 @@ const CalendarButtonExampleCode = require('!raw-loader!office-ui-fabric-react/sr const CalendarInlineExampleCode = require('!raw-loader!office-ui-fabric-react/src/components/Calendar/examples/Calendar.Inline.Example.tsx') as string; export class CalendarPage extends React.Component { - public render() { + public render(): JSX.Element { const today = new Date(Date.now()); return ( @@ -167,40 +169,27 @@ export class CalendarPage extends React.Component /> } overview={ -
    -

    - The calendar component allows a user to browse through a calendar and pick a date value. -

    -
    + + { require('!raw-loader!office-ui-fabric-react/src/components/Calendar/docs/CalendarOverview.md') } + } bestPractices={
    } dos={ -
    -
      -
    • Use the control as a single entity.
    • -
    • Set the default date to the current date unless a specific date is required for context (e.g. the date of the conference).
    • -
    • The control is designed to resize relative to available screen width. Allow it to render in either wide or narrow as appropriate.
    • -
    • When the control is engaged, the Calendar renders as a flyout and has defined widths (300px -narrow and 440px – wide). Plan your UI implementation accordingly.
    • -
    • The control renders date in a specific format. If allowing for manual entry of date, provide helper text in the appropriate format.
    • -
    -
    + + { require('!raw-loader!office-ui-fabric-react/src/components/Calendar/docs/CalendarDos.md') } + } donts={ -
    -
      -
    • Don't attempt to break apart year from month/day selectors. If granularity is required, use the Dropdown control or something similar.
    • -
    • Don't attempt to force resize the control in any way.
    • -
    • Don't force the control to render one mode vs. the other (year or month/day)
    • -
    • The flyout selector is a light dismiss control. Don't modify this behavior in any way.
    • -
    -
    + + { require('!raw-loader!office-ui-fabric-react/src/components/Calendar/docs/CalendarDonts.md') } + } isHeaderVisible={ this.props.isHeaderVisible } componentStatus={ } /> diff --git a/packages/office-ui-fabric-react/src/components/Calendar/__snapshots__/Calendar.test.tsx.snap b/packages/office-ui-fabric-react/src/components/Calendar/__snapshots__/Calendar.test.tsx.snap index da925f1c91474..507065a96d6f5 100644 --- a/packages/office-ui-fabric-react/src/components/Calendar/__snapshots__/Calendar.test.tsx.snap +++ b/packages/office-ui-fabric-react/src/components/Calendar/__snapshots__/Calendar.test.tsx.snap @@ -91,7 +91,6 @@ exports[`Calendar Test rendering simplest calendar Renders simple calendar corre aria-labelledby={undefined} className="ms-FocusZone" data-focuszone-id="FocusZone12" - onClick={[Function]} onFocus={[Function]} onKeyDown={[Function]} onMouseDownCapture={[Function]} @@ -959,7 +958,6 @@ exports[`Calendar Test rendering simplest calendar Renders simple calendar corre aria-labelledby={undefined} className="ms-FocusZone" data-focuszone-id="FocusZone13" - onClick={[Function]} onFocus={[Function]} onKeyDown={[Function]} onMouseDownCapture={[Function]} diff --git a/packages/office-ui-fabric-react/src/components/Calendar/docs/CalendarDonts.md b/packages/office-ui-fabric-react/src/components/Calendar/docs/CalendarDonts.md new file mode 100644 index 0000000000000..85f2b8d624707 --- /dev/null +++ b/packages/office-ui-fabric-react/src/components/Calendar/docs/CalendarDonts.md @@ -0,0 +1,4 @@ +- Don't attempt to break apart year from month/day selectors. If granularity is required, use the Dropdown control or something similar. +- Don't attempt to force resize the control in any way. +- Don't force the control to render one mode vs. the other (year or month/day) +- The flyout selector is a light dismiss control. Don't modify this behavior in any way. \ No newline at end of file diff --git a/packages/office-ui-fabric-react/src/components/Calendar/docs/CalendarDos.md b/packages/office-ui-fabric-react/src/components/Calendar/docs/CalendarDos.md new file mode 100644 index 0000000000000..1ce606e7118c0 --- /dev/null +++ b/packages/office-ui-fabric-react/src/components/Calendar/docs/CalendarDos.md @@ -0,0 +1,5 @@ +- Use the control as a single entity. +- Set the default date to the current date unless a specific date is required for context (e.g. the date of the conference). +- The control is designed to resize relative to available screen width. Allow it to render in either wide or narrow as appropriate. +- When the control is engaged, the Calendar renders as a flyout and has defined widths (300px -narrow and 440px – wide). Plan your UI implementation accordingly. +- The control renders date in a specific format. If allowing for manual entry of date, provide helper text in the appropriate format. \ No newline at end of file diff --git a/packages/office-ui-fabric-react/src/components/Calendar/docs/CalendarOverview.md b/packages/office-ui-fabric-react/src/components/Calendar/docs/CalendarOverview.md new file mode 100644 index 0000000000000..9cf4fbf40ffa9 --- /dev/null +++ b/packages/office-ui-fabric-react/src/components/Calendar/docs/CalendarOverview.md @@ -0,0 +1 @@ +The calendar component allows a user to browse through a calendar and pick a date value. \ No newline at end of file diff --git a/packages/office-ui-fabric-react/src/components/Calendar/examples/Calendar.Button.Example.tsx b/packages/office-ui-fabric-react/src/components/Calendar/examples/Calendar.Button.Example.tsx index 0bfa49659fd2d..66fd441b4e228 100644 --- a/packages/office-ui-fabric-react/src/components/Calendar/examples/Calendar.Button.Example.tsx +++ b/packages/office-ui-fabric-react/src/components/Calendar/examples/Calendar.Button.Example.tsx @@ -96,7 +96,7 @@ export class CalendarButtonExample extends React.Component
    this._calendarButtonElement = calendarBtn! }> @@ -134,21 +134,21 @@ export class CalendarButtonExample extends React.Component { prevState.showCalendar = !prevState.showCalendar; return prevState; }); } - private _onDismiss() { + private _onDismiss(): void { this.setState((prevState: ICalendarButtonExampleState) => { prevState.showCalendar = false; return prevState; }); } - private _onSelectDate(date: Date) { + private _onSelectDate(date: Date): void { this.setState((prevState: ICalendarButtonExampleState) => { prevState.showCalendar = false; prevState.selectedDate = date; diff --git a/packages/office-ui-fabric-react/src/components/Calendar/examples/Calendar.Inline.Example.tsx b/packages/office-ui-fabric-react/src/components/Calendar/examples/Calendar.Inline.Example.tsx index 2441e519a53c2..ab0091063ea14 100644 --- a/packages/office-ui-fabric-react/src/components/Calendar/examples/Calendar.Inline.Example.tsx +++ b/packages/office-ui-fabric-react/src/components/Calendar/examples/Calendar.Inline.Example.tsx @@ -62,8 +62,8 @@ const DayPickerStrings = { }; export interface ICalendarInlineExampleState { - selectedDate: Date | null; - selectedDateRange: Date[] | null; + selectedDate?: Date | null; + selectedDateRange?: Date[] | null; } export interface ICalendarInlineExampleProps { @@ -98,7 +98,7 @@ export class CalendarInlineExample extends React.Component { return prevState; }); } - private _goPrevious() { + private _goPrevious(): void { this.setState((prevState: ICalendarInlineExampleState) => { const selectedDate = prevState.selectedDate || new Date(); const dateRangeArray = getDateRangeArray(selectedDate, this.props.dateRangeType, DayOfWeek.Sunday); @@ -178,24 +178,31 @@ export class CalendarInlineExample extends React.Component { const selectedDate = prevState.selectedDate || new Date(); const dateRangeArray = getDateRangeArray(selectedDate, this.props.dateRangeType, DayOfWeek.Sunday); const newSelectedDate = addDays(dateRangeArray.pop()!, 1); - return prevState.selectedDate = newSelectedDate; + + return { + selectedDate: newSelectedDate + }; }); } - private _onSelectDate(date: Date, dateRangeArray: Date[]) { + private _onSelectDate(date: Date, dateRangeArray: Date[]): void { this.setState((prevState: ICalendarInlineExampleState) => { - prevState.selectedDate = date; - prevState.selectedDateRange = dateRangeArray; - return prevState; + return { + selectedDate: date, + selectedDateRange: dateRangeArray + }; }); } } diff --git a/packages/office-ui-fabric-react/src/components/Callout/Callout.tsx b/packages/office-ui-fabric-react/src/components/Callout/Callout.tsx index 07bf90be3eb67..737428170c92b 100644 --- a/packages/office-ui-fabric-react/src/components/Callout/Callout.tsx +++ b/packages/office-ui-fabric-react/src/components/Callout/Callout.tsx @@ -1,6 +1,4 @@ -/* tslint:disable:no-unused-variable */ import * as React from 'react'; -/* tslint:enable:no-unused-variable */ import { BaseComponent } from '../../Utilities'; import { ICalloutProps } from './Callout.types'; @@ -19,7 +17,7 @@ export class Callout extends BaseComponent { }); } - public render() { + public render(): JSX.Element { const content = ( ); diff --git a/packages/office-ui-fabric-react/src/components/Callout/Callout.types.ts b/packages/office-ui-fabric-react/src/components/Callout/Callout.types.ts index 5aeb79567d334..bedfebac1a961 100644 --- a/packages/office-ui-fabric-react/src/components/Callout/Callout.types.ts +++ b/packages/office-ui-fabric-react/src/components/Callout/Callout.types.ts @@ -240,6 +240,7 @@ export interface ICalloutContentStyleProps { overflowYHidden?: boolean; /** + * @deprecated will be removed in v6. Do not use. * Max height applied to the content of a callout. */ contentMaxHeight?: number; diff --git a/packages/office-ui-fabric-react/src/components/Callout/CalloutContent.base.tsx b/packages/office-ui-fabric-react/src/components/Callout/CalloutContent.base.tsx index 446700070bd86..807243c1ca152 100644 --- a/packages/office-ui-fabric-react/src/components/Callout/CalloutContent.base.tsx +++ b/packages/office-ui-fabric-react/src/components/Callout/CalloutContent.base.tsx @@ -1,6 +1,4 @@ -/* tslint:disable:no-unused-variable */ import * as React from 'react'; -/* tslint:enable:no-unused-variable */ import { ICalloutProps, ICalloutContentStyleProps, @@ -68,17 +66,17 @@ export class CalloutContentBase extends BaseComponent(); private _calloutElement = createRef(); private _targetWindow: Window; private _bounds: IRectangle; - private _maxHeight: number | undefined; private _positionAttempts: number; private _target: Element | MouseEvent | IPoint | null; private _setHeightOffsetTimer: number; private _hasListeners = false; + private _maxHeight: number | undefined; constructor(props: ICalloutProps) { super(props); @@ -114,7 +112,7 @@ export class CalloutContentBase extends BaseComponent { - if (this.props.setInitialFocus && !this._didSetInitialFocus && this.state.positions && this._calloutElement.value) { + if (this.props.setInitialFocus && !this._didSetInitialFocus && this.state.positions && this._calloutElement.current) { this._didSetInitialFocus = true; - this._async.requestAnimationFrame(() => focusFirstChild(this._calloutElement.value!)); + this._async.requestAnimationFrame(() => focusFirstChild(this._calloutElement.current!)); } } @@ -307,7 +305,7 @@ export class CalloutContentBase extends BaseComponent this._updatePosition()); } @@ -325,10 +323,10 @@ export class CalloutContentBase extends BaseComponent { + if (this._target) { + this._maxHeight = getMaxHeight(this._target, this.props.directionalHint!, totalGap, this._getBounds()); + this.forceUpdate(); + } + }); } else { this._maxHeight = this._getBounds().height! - BORDER_WIDTH * 2; } @@ -392,12 +397,12 @@ export class CalloutContentBase extends BaseComponent { - const calloutMainElem = this._calloutElement.value && this._calloutElement.value.lastChild as HTMLElement; + const calloutMainElem = this._calloutElement.current && this._calloutElement.current.lastChild as HTMLElement; if (!calloutMainElem) { return; diff --git a/packages/office-ui-fabric-react/src/components/Callout/CalloutPage.tsx b/packages/office-ui-fabric-react/src/components/Callout/CalloutPage.tsx index 1ad35f6e42f52..3da6221681baf 100644 --- a/packages/office-ui-fabric-react/src/components/Callout/CalloutPage.tsx +++ b/packages/office-ui-fabric-react/src/components/Callout/CalloutPage.tsx @@ -3,7 +3,8 @@ import { ComponentPage, ExampleCard, IComponentDemoPageProps, - PropertiesTableSet + PropertiesTableSet, + PageMarkdown, } from '@uifabric/example-app-base'; import { items } from '../CommandBar/examples/data'; @@ -20,13 +21,14 @@ const CalloutDirectionalExampleCode = require('!raw-loader!office-ui-fabric-reac const CalloutCoverExampleCode = require('!raw-loader!office-ui-fabric-react/src/components/Callout/examples/Callout.Cover.Example.tsx') as string; export class CalloutPage extends React.Component { - public render() { + public render(): JSX.Element { const cmdBarParamsTextAndIcons: any = { items: items, farItems: null }; return ( @@ -54,47 +56,27 @@ export class CalloutPage extends React.Component {
    } overview={ -
    -

    Callouts are a powerful way to simplify a user interface. They host tips and other information users need when they need it, with minimal effort on their part. Callouts can help you use screen space more effectively and reduce screen clutter. However, poorly designed Callouts can be annoying, distracting, unhelpful, overwhelming, or in the way.

    - -

    Use a Callout for displaying additional contextual information about an item on the screen. Callouts also have a tail that identifies their source. A common use for Callout is the introduction of a new feature or capability of an app or site. Alternate usages include pairing the Callout with a button or clickable element for on-demand presentation of additional or supporting content.

    - -

    Real-world examples of this implementation can be seen in administrative interfaces where a particularly difficult-to-understand concept is paired with the iconClassNames.info "i" icon. In this example, Callout - with its tip text - is opened when the user clicks on or hovers over the icon.

    -
    + + { require('!raw-loader!office-ui-fabric-react/src/components/Callout/docs/CalloutOverview.md') } + } bestPractices={
    } dos={ -
    -
      -
    • Use Callouts to introduce new concepts in an experience where highlighting specific pieces of the UI is necessary.
    • -
    • Do be concise with the information you provide inside of a Callout. Short sentences or sentence fragments are best.
    • -
    • Do be helpful with the tip text inside of your Callout.
    • -
    • Do limit the information inside of a Callout to supplemental information that users don't have to read.
    • -
    • Callouts should be placed near the object being described, usually at the pointer's tail or head if possible.
    • -
    • When additional context - or more advanced description - is necessary, consider placing a link to "Learn more" at the bottom of the Callout and opening the additional content in a new window or Panel when clicked.
    • -
    -
    + + { require('!raw-loader!office-ui-fabric-react/src/components/Callout/docs/CalloutDos.md') } + } donts={ -
    -
      -
    • Don’t overuse Callout without putting the user in control. Too many Callouts which open automatically can be perceived as interrupting workflow and are a bad user experience.
    • -
    • Don't use large, unformatted blocks of text in your Callout, they are difficult to read and overwhelming.
    • -
    • Don't put obvious tip text, or text that simply repeats what is already on the screen in your Callout.
    • -
    • Because the content inside of a Callout isn't always visible, don't put important or required information in a Callout.
    • -
    • Don’t block important UI with the placement of your Callout, it is a poor user experience that will lead to frustration.
    • -
    • Don’t open Callout from within another Callout.
    • -
    • Don’t use Callout to ask the user to confirm an action, use a Dialog instead.
    • -
    • Don’t show Callouts on hidden elements.
    • -
    -
    + + { require('!raw-loader!office-ui-fabric-react/src/components/Callout/docs/CalloutDonts.md') } + } isHeaderVisible={ this.props.isHeaderVisible } componentStatus={ } /> diff --git a/packages/office-ui-fabric-react/src/components/Callout/__snapshots__/Callout.test.tsx.snap b/packages/office-ui-fabric-react/src/components/Callout/__snapshots__/Callout.test.tsx.snap index 9c1f6c743845f..f75dbbbc908d9 100644 --- a/packages/office-ui-fabric-react/src/components/Callout/__snapshots__/Callout.test.tsx.snap +++ b/packages/office-ui-fabric-react/src/components/Callout/__snapshots__/Callout.test.tsx.snap @@ -45,7 +45,6 @@ exports[`Callout renders Callout correctly 1`] = ` ms-Callout-main { background-color: #ffffff; - max-height: 750px; overflow-x: hidden; overflow-y: auto; position: relative; @@ -55,6 +54,7 @@ exports[`Callout renders Callout correctly 1`] = ` role={undefined} style={ Object { + "maxHeight": 750, "overflowY": "auto", } } diff --git a/packages/office-ui-fabric-react/src/components/Callout/docs/CalloutDonts.md b/packages/office-ui-fabric-react/src/components/Callout/docs/CalloutDonts.md new file mode 100644 index 0000000000000..6520cbea8d16c --- /dev/null +++ b/packages/office-ui-fabric-react/src/components/Callout/docs/CalloutDonts.md @@ -0,0 +1,8 @@ +- Don’t overuse Callout without putting the user in control. Too many Callouts which open automatically can be perceived as interrupting workflow and are a bad user experience. +- Don't use large, unformatted blocks of text in your Callout, they are difficult to read and overwhelming. +- Don't put obvious tip text, or text that simply repeats what is already on the screen in your Callout. +- Because the content inside of a Callout isn't always visible, don't put important or required information in a Callout. +- Don’t block important UI with the placement of your Callout, it is a poor user experience that will lead to frustration. +- Don’t open Callout from within another Callout. +- Don’t use Callout to ask the user to confirm an action, use a Dialog instead. +- Don’t show Callouts on hidden elements. \ No newline at end of file diff --git a/packages/office-ui-fabric-react/src/components/Callout/docs/CalloutDos.md b/packages/office-ui-fabric-react/src/components/Callout/docs/CalloutDos.md new file mode 100644 index 0000000000000..865bc50ab5309 --- /dev/null +++ b/packages/office-ui-fabric-react/src/components/Callout/docs/CalloutDos.md @@ -0,0 +1,6 @@ +- Use Callouts to introduce new concepts in an experience where highlighting specific pieces of the UI is necessary. +- Do be concise with the information you provide inside of a Callout. Short sentences or sentence fragments are best. +- Do be helpful with the tip text inside of your Callout. +- Do limit the information inside of a Callout to supplemental information that users don't have to read. +- Callouts should be placed near the object being described, usually at the pointer's tail or head if possible. +- When additional context - or more advanced description - is necessary, consider placing a link to "Learn more" at the bottom of the Callout and opening the additional content in a new window or Panel when clicked. \ No newline at end of file diff --git a/packages/office-ui-fabric-react/src/components/Callout/docs/CalloutOverview.md b/packages/office-ui-fabric-react/src/components/Callout/docs/CalloutOverview.md new file mode 100644 index 0000000000000..87e096317a2b5 --- /dev/null +++ b/packages/office-ui-fabric-react/src/components/Callout/docs/CalloutOverview.md @@ -0,0 +1,5 @@ +Callouts are a powerful way to simplify a user interface. They host tips and other information users need when they need it, with minimal effort on their part. Callouts can help you use screen space more effectively and reduce screen clutter. However, poorly designed Callouts can be annoying, distracting, unhelpful, overwhelming, or in the way. + +Use a Callout for displaying additional contextual information about an item on the screen. Callouts also have a tail that identifies their source. A common use for Callout is the introduction of a new feature or capability of an app or site. Alternate usages include pairing the Callout with a button or clickable element for on-demand presentation of additional or supporting content. + +Real-world examples of this implementation can be seen in administrative interfaces where a particularly difficult-to-understand concept is paired with the iconClassNames.info "i" icon. In this example, Callout - with its tip text - is opened when the user clicks on or hovers over the icon. \ No newline at end of file diff --git a/packages/office-ui-fabric-react/src/components/Callout/examples/Callout.Basic.Example.tsx b/packages/office-ui-fabric-react/src/components/Callout/examples/Callout.Basic.Example.tsx index ead62ce067926..a3c3f641730fd 100644 --- a/packages/office-ui-fabric-react/src/components/Callout/examples/Callout.Basic.Example.tsx +++ b/packages/office-ui-fabric-react/src/components/Callout/examples/Callout.Basic.Example.tsx @@ -2,33 +2,72 @@ import * as React from 'react'; import { DefaultButton } from 'office-ui-fabric-react/lib/Button'; import { Callout } from 'office-ui-fabric-react/lib/Callout'; import { Link } from 'office-ui-fabric-react/lib/Link'; -import './CalloutExample.scss'; +import { getTheme, FontWeights, mergeStyleSets } from 'office-ui-fabric-react/lib/Styling'; -export interface ICalloutBaiscExampleState { +export interface ICalloutBasicExampleState { isCalloutVisible?: boolean; } -export class CalloutBasicExample extends React.Component<{}, ICalloutBaiscExampleState> { +// Themed styles for the example. +const theme = getTheme(); +const styles = mergeStyleSets({ + buttonArea: { + verticalAlign: 'top', + display: 'inline-block', + textAlign: 'center' + }, + callout: { + maxWidth: 300 + }, + header: { + padding: '18px 24px 12px' + }, + title: [ + theme.fonts.xLarge, + { + margin: 0, + color: theme.palette.neutralPrimary, + fontWeight: FontWeights.semilight + } + ], + inner: { + height: '100%', + padding: '0 24px 20px' + }, + actions: { + position: 'relative', + marginTop: 20, + width: '100%', + whiteSpace: 'nowrap' + }, + link: [ + theme.fonts.medium, + { + color: theme.palette.neutralPrimary + } + ] +}); + +// Example code +export class CalloutBasicExample extends React.Component<{}, ICalloutBasicExampleState> { private _menuButtonElement: HTMLElement | null; public constructor(props: {}) { super(props); - this._onShowMenuClicked = this._onShowMenuClicked.bind(this); - this._onCalloutDismiss = this._onCalloutDismiss.bind(this); - this.state = { isCalloutVisible: false }; } - public render() { + public render(): JSX.Element { const { isCalloutVisible } = this.state; return ( -
    -
    this._menuButtonElement = menuButton }> +
    +
    @@ -64,13 +103,13 @@ export class CalloutBasicExample extends React.Component<{}, ICalloutBaiscExampl ); } - private _onShowMenuClicked() { + private _onShowMenuClicked = (): void => { this.setState({ isCalloutVisible: !this.state.isCalloutVisible }); } - private _onCalloutDismiss() { + private _onCalloutDismiss = (): void => { this.setState({ isCalloutVisible: false }); diff --git a/packages/office-ui-fabric-react/src/components/Callout/examples/Callout.Cover.Example.tsx b/packages/office-ui-fabric-react/src/components/Callout/examples/Callout.Cover.Example.tsx index 7ab156a067e62..9766fe9c334e9 100644 --- a/packages/office-ui-fabric-react/src/components/Callout/examples/Callout.Cover.Example.tsx +++ b/packages/office-ui-fabric-react/src/components/Callout/examples/Callout.Cover.Example.tsx @@ -42,7 +42,7 @@ export class CalloutCoverExample extends React.Component<{}, ICalloutCoverExampl }; } - public render() { + public render(): JSX.Element { const { isCalloutVisible, directionalHint } = this.state; // ms-Callout-smallbeak is used in this directional example to reflect all the positions. Large beak will disable some position to avoid beak over the callout edge. return ( @@ -90,17 +90,17 @@ export class CalloutCoverExample extends React.Component<{}, ICalloutCoverExampl ); } - private _onDismiss() { + private _onDismiss(): void { this.setState({ isCalloutVisible: false }); } - private _onShowMenuClicked() { + private _onShowMenuClicked(): void { this.setState({ isCalloutVisible: !this.state.isCalloutVisible }); } - private _onDirectionalChanged(option: IDropdownOption) { + private _onDirectionalChanged(option: IDropdownOption): void { this.setState({ directionalHint: option.key as number }); diff --git a/packages/office-ui-fabric-react/src/components/Callout/examples/Callout.Directional.Example.tsx b/packages/office-ui-fabric-react/src/components/Callout/examples/Callout.Directional.Example.tsx index d919a218c3383..3b15711380102 100644 --- a/packages/office-ui-fabric-react/src/components/Callout/examples/Callout.Directional.Example.tsx +++ b/packages/office-ui-fabric-react/src/components/Callout/examples/Callout.Directional.Example.tsx @@ -47,7 +47,7 @@ export class CalloutDirectionalExample extends React.Component<{}, ICalloutDirec }; } - public render() { + public render(): JSX.Element { const { isCalloutVisible, isBeakVisible, directionalHint, gapSpace, beakWidth } = this.state; // ms-Callout-smallbeak is used in this directional example to reflect all the positions. Large beak will disable some position to avoid beak over the callout edge. return ( diff --git a/packages/office-ui-fabric-react/src/components/Callout/examples/Callout.Nested.Example.tsx b/packages/office-ui-fabric-react/src/components/Callout/examples/Callout.Nested.Example.tsx index f314cac7c8e3e..ab4ab4ba1bee5 100644 --- a/packages/office-ui-fabric-react/src/components/Callout/examples/Callout.Nested.Example.tsx +++ b/packages/office-ui-fabric-react/src/components/Callout/examples/Callout.Nested.Example.tsx @@ -23,7 +23,7 @@ export class CalloutNestedExample extends React.Component { checked: false }; - public shouldComponentUpdate(newProps: ICheckProps) { + public shouldComponentUpdate(newProps: ICheckProps): boolean { return this.props.checked !== newProps.checked; } diff --git a/packages/office-ui-fabric-react/src/components/Checkbox/Checkbox.base.tsx b/packages/office-ui-fabric-react/src/components/Checkbox/Checkbox.base.tsx index 30d0fdcea818c..30888e2f88819 100644 --- a/packages/office-ui-fabric-react/src/components/Checkbox/Checkbox.base.tsx +++ b/packages/office-ui-fabric-react/src/components/Checkbox/Checkbox.base.tsx @@ -27,7 +27,7 @@ export class Checkbox extends BaseComponent impl boxSide: 'start' }; - private _checkBox = createRef(); + private _checkBox = createRef(); private _id: string; private _classNames: ICheckboxClassNames; @@ -49,7 +49,7 @@ export class Checkbox extends BaseComponent impl }; } - public componentWillReceiveProps(newProps: ICheckboxProps) { + public componentWillReceiveProps(newProps: ICheckboxProps): void { if (newProps.checked !== undefined) { this.setState({ isChecked: !!newProps.checked // convert null to false @@ -131,12 +131,12 @@ export class Checkbox extends BaseComponent impl } public focus(): void { - if (this._checkBox.value) { - this._checkBox.value.focus(); + if (this._checkBox.current) { + this._checkBox.current.focus(); } } - private _onFocus = (ev: React.FocusEvent): void => { + private _onFocus = (ev: React.FocusEvent): void => { const { inputProps } = this.props; if (inputProps && inputProps.onFocus) { @@ -144,7 +144,7 @@ export class Checkbox extends BaseComponent impl } } - private _onBlur = (ev: React.FocusEvent): void => { + private _onBlur = (ev: React.FocusEvent): void => { const { inputProps } = this.props; if (inputProps && inputProps.onBlur) { @@ -152,7 +152,7 @@ export class Checkbox extends BaseComponent impl } } - private _onClick = (ev: React.FormEvent): void => { + private _onClick = (ev: React.FormEvent): void => { const { disabled, onChange } = this.props; const { isChecked } = this.state; ev.preventDefault(); diff --git a/packages/office-ui-fabric-react/src/components/Checkbox/Checkbox.styles.ts b/packages/office-ui-fabric-react/src/components/Checkbox/Checkbox.styles.ts index b1d8aebafba1f..fc7490353aa0c 100644 --- a/packages/office-ui-fabric-react/src/components/Checkbox/Checkbox.styles.ts +++ b/packages/office-ui-fabric-react/src/components/Checkbox/Checkbox.styles.ts @@ -32,6 +32,7 @@ export const getStyles = memoizeFunction(( const styles: ICheckboxStyles = { root: [ getFocusStyle(theme, -2), + theme.fonts.medium, { padding: '0', border: 'none', diff --git a/packages/office-ui-fabric-react/src/components/Checkbox/CheckboxPage.tsx b/packages/office-ui-fabric-react/src/components/Checkbox/CheckboxPage.tsx index dad989bd8097f..c9062e45d831b 100644 --- a/packages/office-ui-fabric-react/src/components/Checkbox/CheckboxPage.tsx +++ b/packages/office-ui-fabric-react/src/components/Checkbox/CheckboxPage.tsx @@ -3,7 +3,8 @@ import { ExampleCard, IComponentDemoPageProps, ComponentPage, - PropertiesTableSet + PropertiesTableSet, + PageMarkdown, } from '@uifabric/example-app-base'; import { CheckboxBasicExample } from './examples/Checkbox.Basic.Example'; import { CheckboxImplementationExamples } from './examples/Checkbox.ImplementationExamples'; @@ -14,11 +15,12 @@ const CheckboxBasicExampleCode = require('!raw-loader!office-ui-fabric-react/src const CheckboxImplementationExamplesCode = require('!raw-loader!office-ui-fabric-react/src/components/Checkbox/examples/Checkbox.ImplementationExamples.tsx') as string; export class CheckboxPage extends React.Component { - public render() { + public render(): JSX.Element { return ( /> } overview={ -
    -

    - A Checkbox is a UI element that allows users to switch between two mutually exclusive options (checked or unchecked, on or off) through a single click or tap. It can also be used to indicate a subordinate setting or preference when paired with another control. -

    - -

    - A Checkbox is used to select or deselect action items. It can be used for a single item or for a list of multiple items that a user can choose from. The control has two selection states: unselected and selected. -

    - -

    - Use a single Checkbox for a subordinate setting, such as with a "Remember me?" login scenario or with a terms of service agreement. -

    - -

    - For a binary choice, the main difference between a Checkbox and a toggle switch is that the Checkbox is for status and the toggle switch is for action. You can delay committing a Checkbox interaction (as part of a form submit, for example), while you should immediately commit a toggle switch interaction. Also, only Checkboxes allow for multi-selection. -

    - -

    - Use multiple Checkboxes for multi-select scenarios in which a user chooses one or more items from a group of choices that are not mutually exclusive. -

    -
    + + { require('!raw-loader!office-ui-fabric-react/src/components/Checkbox/docs/CheckboxOverview.md') } + } bestPractices={
    } dos={ -
    -
      -
    • Allow users to choose any combination of options when several Checkboxes are grouped together.
    • -
    -
    + + { require('!raw-loader!office-ui-fabric-react/src/components/Checkbox/docs/CheckboxDos.md') } + } donts={ -
    -
      -
    • Don't use a Checkbox as an on/off control. Instead use a toggle switch.
    • -
    • Don’t use a Checkbox when the user can choose only one option from the group, use radio buttons instead.
    • -
    • Don't put two groups of Checkboxes next to each other. Separate the two groups with labels.
    • -
    -
    + + { require('!raw-loader!office-ui-fabric-react/src/components/Checkbox/docs/CheckboxDonts.md') } + } isHeaderVisible={ this.props.isHeaderVisible } componentStatus={ } /> diff --git a/packages/office-ui-fabric-react/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap b/packages/office-ui-fabric-react/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap index f4cc49943ab2c..4a61e21ac5077 100644 --- a/packages/office-ui-fabric-react/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +++ b/packages/office-ui-fabric-react/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap @@ -13,10 +13,15 @@ exports[`Checkbox renders Checkbox correctly 1`] = ` ms-Checkbox is-enabled { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; background: none; border: none; cursor: pointer; display: block; + font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; + font-size: 14px; + font-weight: 400; margin-bottom: 0; margin-left: 0; margin-right: 0; diff --git a/packages/office-ui-fabric-react/src/components/Checkbox/docs/CheckboxDonts.md b/packages/office-ui-fabric-react/src/components/Checkbox/docs/CheckboxDonts.md new file mode 100644 index 0000000000000..e99215b63aee3 --- /dev/null +++ b/packages/office-ui-fabric-react/src/components/Checkbox/docs/CheckboxDonts.md @@ -0,0 +1,3 @@ +- Don't use a Checkbox as an on/off control. Instead use a toggle switch. +- Don’t use a Checkbox when the user can choose only one option from the group, use radio buttons instead. +- Don't put two groups of Checkboxes next to each other. Separate the two groups with labels. \ No newline at end of file diff --git a/packages/office-ui-fabric-react/src/components/Checkbox/docs/CheckboxDos.md b/packages/office-ui-fabric-react/src/components/Checkbox/docs/CheckboxDos.md new file mode 100644 index 0000000000000..8d33482977d33 --- /dev/null +++ b/packages/office-ui-fabric-react/src/components/Checkbox/docs/CheckboxDos.md @@ -0,0 +1 @@ +- Allow users to choose any combination of options when several Checkboxes are grouped together. \ No newline at end of file diff --git a/packages/office-ui-fabric-react/src/components/Checkbox/docs/CheckboxOverview.md b/packages/office-ui-fabric-react/src/components/Checkbox/docs/CheckboxOverview.md new file mode 100644 index 0000000000000..74e2b405f59c8 --- /dev/null +++ b/packages/office-ui-fabric-react/src/components/Checkbox/docs/CheckboxOverview.md @@ -0,0 +1,9 @@ +A Checkbox is a UI element that allows users to switch between two mutually exclusive options (checked or unchecked, on or off) through a single click or tap. It can also be used to indicate a subordinate setting or preference when paired with another control. + +A Checkbox is used to select or deselect action items. It can be used for a single item or for a list of multiple items that a user can choose from. The control has two selection states: unselected and selected. + +Use a single Checkbox for a subordinate setting, such as with a "Remember me?" login scenario or with a terms of service agreement. + +For a binary choice, the main difference between a Checkbox and a toggle switch is that the Checkbox is for status and the toggle switch is for action. You can delay committing a Checkbox interaction (as part of a form submit, for example), while you should immediately commit a toggle switch interaction. Also, only Checkboxes allow for multi-selection. + +Use multiple Checkboxes for multi-select scenarios in which a user chooses one or more items from a group of choices that are not mutually exclusive. \ No newline at end of file diff --git a/packages/office-ui-fabric-react/src/components/Checkbox/examples/Checkbox.Basic.Example.tsx b/packages/office-ui-fabric-react/src/components/Checkbox/examples/Checkbox.Basic.Example.tsx index b92e108a7b1c1..4251dac686370 100644 --- a/packages/office-ui-fabric-react/src/components/Checkbox/examples/Checkbox.Basic.Example.tsx +++ b/packages/office-ui-fabric-react/src/components/Checkbox/examples/Checkbox.Basic.Example.tsx @@ -12,7 +12,7 @@ export class CheckboxBasicExample extends React.Component<{}, ICheckboxBasicExam this._onCheckboxChange = this._onCheckboxChange.bind(this); } - public render() { + public render(): JSX.Element { return (
    , isChecked: boolean) { + private _onCheckboxChange(ev: React.FormEvent, isChecked: boolean): void { console.log(`The option has been changed to ${isChecked}.`); } } \ No newline at end of file diff --git a/packages/office-ui-fabric-react/src/components/Checkbox/examples/Checkbox.ImplementationExamples.tsx b/packages/office-ui-fabric-react/src/components/Checkbox/examples/Checkbox.ImplementationExamples.tsx index 16c81e39d6bf7..63356f6438067 100644 --- a/packages/office-ui-fabric-react/src/components/Checkbox/examples/Checkbox.ImplementationExamples.tsx +++ b/packages/office-ui-fabric-react/src/components/Checkbox/examples/Checkbox.ImplementationExamples.tsx @@ -25,7 +25,7 @@ export class CheckboxImplementationExamples extends React.Component<{}, ICheckbo this._onCheckboxChange = this._onCheckboxChange.bind(this); } - public render() { + public render(): JSX.Element { const { isChecked } = this.state; const styles: ICheckboxStyles = { @@ -91,7 +91,7 @@ export class CheckboxImplementationExamples extends React.Component<{}, ICheckbo ); } - private _onCheckboxChange(ev: React.FormEvent, isChecked: boolean) { + private _onCheckboxChange(ev: React.FormEvent, isChecked: boolean): void { console.log(`The option has been changed to ${isChecked}.`); } @@ -99,7 +99,7 @@ export class CheckboxImplementationExamples extends React.Component<{}, ICheckbo this.setState({ isChecked: checked! }); } - private _renderPersonaLabel(props: ICheckboxProps) { + private _renderPersonaLabel(props: ICheckboxProps): JSX.Element { const DEFAULT_IMAGE_URL = '/_layouts/15/userphoto.aspx?size=S&accountname='; return ; } diff --git a/packages/office-ui-fabric-react/src/components/ChoiceGroup/ChoiceGroup.scss b/packages/office-ui-fabric-react/src/components/ChoiceGroup/ChoiceGroup.scss index 62bc6086d1d6e..1c6b798ad2b56 100644 --- a/packages/office-ui-fabric-react/src/components/ChoiceGroup/ChoiceGroup.scss +++ b/packages/office-ui-fabric-react/src/components/ChoiceGroup/ChoiceGroup.scss @@ -121,10 +121,18 @@ $ms-choiceField-transition-timing: cubic-bezier(.4, 0, .23, 1); &:focus { &::before { border-color: $radioButton-border-hover-color; + + @include high-contrast { + border-color: Highlight; + } } :global(.ms-Label) { color: $radioButton-text-hover-color; + + @include high-contrast { + color: Highlight; + } } } @@ -302,6 +310,11 @@ $ms-choiceField-transition-timing: cubic-bezier(.4, 0, .23, 1); &:focus { border-color: $ms-color-neutralTertiaryAlt; + @include high-contrast { + border-color: Highlight; + color: Highlight; + } + &::before { opacity: 1; } @@ -367,10 +380,10 @@ $ms-choiceField-transition-timing: cubic-bezier(.4, 0, .23, 1); :global(.ms-Fabric.is-focusVisible) .choiceFieldIsInFocus { &.choiceFieldIsImage .choiceFieldWrapper, &.choiceFieldIsIcon .choiceFieldWrapper { - @include focus-border(1px, $ms-color-neutralPrimary, 2px, false); + @include focus-border(-2px, $ms-color-neutralSecondary, 1px, false); @include high-contrast { - @include focus-border(1px, WindowText, 2px, false); + @include focus-border(-2px, WindowText, 1px, false); } } } \ No newline at end of file diff --git a/packages/office-ui-fabric-react/src/components/ChoiceGroup/ChoiceGroup.test.tsx b/packages/office-ui-fabric-react/src/components/ChoiceGroup/ChoiceGroup.test.tsx index 0e635f4f66c38..7748805c52eb5 100644 --- a/packages/office-ui-fabric-react/src/components/ChoiceGroup/ChoiceGroup.test.tsx +++ b/packages/office-ui-fabric-react/src/components/ChoiceGroup/ChoiceGroup.test.tsx @@ -50,7 +50,7 @@ describe('ChoiceGroup', () => { } expect(threwException).toEqual(false); - const renderedDOM = ReactDOM.findDOMNode(choiceGroup as React.ReactInstance); + const renderedDOM = ReactDOM.findDOMNode(choiceGroup as React.ReactInstance) as Element; const choiceOptions = renderedDOM.querySelectorAll(QUERY_SELECTOR); expect((choiceOptions[0] as HTMLInputElement).checked).toEqual(false); @@ -97,7 +97,7 @@ describe('ChoiceGroup', () => { } expect(threwException).toEqual(false); - const renderedDOM = ReactDOM.findDOMNode(choiceGroup as React.ReactInstance); + const renderedDOM = ReactDOM.findDOMNode(choiceGroup as React.ReactInstance) as Element; const choiceOptions = renderedDOM.querySelectorAll(QUERY_SELECTOR); expect((choiceOptions[0] as HTMLInputElement).disabled).toEqual(true); @@ -127,7 +127,7 @@ describe('ChoiceGroup', () => { } expect(threwException).toEqual(false); - const renderedDOM = ReactDOM.findDOMNode(choiceGroup as React.ReactInstance); + const renderedDOM = ReactDOM.findDOMNode(choiceGroup as React.ReactInstance) as Element; const choiceOptions = renderedDOM.querySelectorAll(QUERY_SELECTOR); expect((choiceOptions[0] as HTMLInputElement).disabled).toEqual(true); @@ -142,7 +142,7 @@ describe('ChoiceGroup', () => { options={ TEST_OPTIONS } /> ); - const renderedDOM = ReactDOM.findDOMNode(choiceGroup as React.ReactInstance); + const renderedDOM = ReactDOM.findDOMNode(choiceGroup as React.ReactInstance) as Element; const choiceOptions = renderedDOM.querySelectorAll(QUERY_SELECTOR); expect((choiceOptions[0] as HTMLInputElement).checked).toEqual(true); @@ -165,7 +165,7 @@ describe('ChoiceGroup', () => { onChange={ onChange } /> ); - const renderedDOM = ReactDOM.findDOMNode(choiceGroup as React.ReactInstance); + const renderedDOM = ReactDOM.findDOMNode(choiceGroup as React.ReactInstance) as Element; const choiceOptions = renderedDOM.querySelectorAll(QUERY_SELECTOR); expect((choiceOptions[0] as HTMLInputElement).checked).toEqual(true); @@ -187,7 +187,7 @@ describe('ChoiceGroup', () => { onChange={ onChange } /> ); - const renderedDOM = ReactDOM.findDOMNode(choiceGroup as React.ReactInstance); + const renderedDOM = ReactDOM.findDOMNode(choiceGroup as React.ReactInstance) as Element; const choiceOptions = renderedDOM.querySelectorAll(QUERY_SELECTOR); const extraAttributeGetter: (index: number) => string | null = (index: number): string | null => { diff --git a/packages/office-ui-fabric-react/src/components/ChoiceGroup/ChoiceGroup.tsx b/packages/office-ui-fabric-react/src/components/ChoiceGroup/ChoiceGroup.tsx index ecc83d3b3cf3e..d08aa2d6fcaea 100644 --- a/packages/office-ui-fabric-react/src/components/ChoiceGroup/ChoiceGroup.tsx +++ b/packages/office-ui-fabric-react/src/components/ChoiceGroup/ChoiceGroup.tsx @@ -50,7 +50,7 @@ export class ChoiceGroup extends BaseComponent) { + private _onChange(option: IChoiceGroupOption, evt: React.FormEvent): void { const { onChanged, onChange, selectedKey } = this.props; // Only manage state in uncontrolled scenarios. diff --git a/packages/office-ui-fabric-react/src/components/ChoiceGroup/ChoiceGroupPage.tsx b/packages/office-ui-fabric-react/src/components/ChoiceGroup/ChoiceGroupPage.tsx index d1c26163ae121..4c02dc4057ab0 100644 --- a/packages/office-ui-fabric-react/src/components/ChoiceGroup/ChoiceGroupPage.tsx +++ b/packages/office-ui-fabric-react/src/components/ChoiceGroup/ChoiceGroupPage.tsx @@ -3,7 +3,8 @@ import { ExampleCard, IComponentDemoPageProps, ComponentPage, - PropertiesTableSet + PropertiesTableSet, + PageMarkdown, } from '@uifabric/example-app-base'; import { ChoiceGroupBasicExample } from './examples/ChoiceGroup.Basic.Example'; import { ChoiceGroupCustomExample } from './examples/ChoiceGroup.Custom.Example'; @@ -18,11 +19,12 @@ const ChoiceGroupImageExampleCode = require('!raw-loader!office-ui-fabric-react/ const ChoiceGroupIconExampleCode = require('!raw-loader!office-ui-fabric-react/src/components/ChoiceGroup/examples/ChoiceGroup.Icon.Example.tsx') as string; export class ChoiceGroupPage extends React.Component { - public render() { + public render(): JSX.Element { return ( @@ -49,43 +51,22 @@ export class ChoiceGroupPage extends React.Component } overview={ -
    -

    - The ChoiceGroup component, also known as radio buttons, let users select one option from two or more choices. Each option is represented by one ChoiceGroup button; a user can select only one ChoiceGroup in a button group. -

    - -

    - ChoiceGroup emphasize all options equally, and that may draw more attention to the options than necessary. Consider using other controls, unless the options deserve extra attention from the user. For example, if the default option is recommended for most users in most situations, use a Dropdown component instead. -

    - -

    - If there are only two mutually exclusive options, combine them into a single Checkbox or Toggle switch. For example, use a Checkbox for "I agree" instead of ChoiceGroup buttons for "I agree" and "I don't agree." -

    -
    + + { require('!raw-loader!office-ui-fabric-react/src/components/ChoiceGroup/docs/ChoiceGroupOverview.md') } + } bestPractices={
    } dos={ -
    -
      -
    • Use when there are 2-7 options, if you have enough screen space and the options are important enough to be a good use of that screen space. Otherwise, use a Checkbox or Dropdown list.
    • -
    • Use on wizard pages to make the alternatives clear, even if a Checkbox is otherwise acceptable.
    • -
    • List the options in a logical order, such as most likely to be selected to least, simplest operation to most complex, or least risk to most. Alphabetical ordering is not recommended because it is language dependent and therefore not localizable.
    • -
    • If none of the options is a valid choice, add another option to reflect this choice, such as "None" or "Does not apply".
    • -
    • Select the safest (to prevent loss of data or system access) and most secure and private option as the default. If safety and security aren't factors, select the most likely or convenient option.
    • -
    • Align radio buttons vertically instead of horizontally, if possible. Horizontal alignment is harder to read and localize.
    • -
    -
    + + { require('!raw-loader!office-ui-fabric-react/src/components/ChoiceGroup/docs/ChoiceGroupDos.md') } + } donts={ -
    -
      -
    • Use when the options are numbers that have fixed steps, like 10, 20, 30. Use a Slider component instead.
    • -
    • Use if there are more than 7 options, use a Dropdown instead.
    • -
    • Nest with other ChoiceGroup or CheckBoxes. If possible, keep all the options at the same level.
    • -
    -
    + + { require('!raw-loader!office-ui-fabric-react/src/components/ChoiceGroup/docs/ChoiceGroupDonts.md') } + } isHeaderVisible={ this.props.isHeaderVisible } componentStatus={ diff --git a/packages/office-ui-fabric-react/src/components/ChoiceGroup/docs/ChoiceGroupDonts.md b/packages/office-ui-fabric-react/src/components/ChoiceGroup/docs/ChoiceGroupDonts.md new file mode 100644 index 0000000000000..7378ea3aeab40 --- /dev/null +++ b/packages/office-ui-fabric-react/src/components/ChoiceGroup/docs/ChoiceGroupDonts.md @@ -0,0 +1,3 @@ +- Use when the options are numbers that have fixed steps, like 10, 20, 30. Use a Slider component instead. +- Use if there are more than 7 options, use a Dropdown instead. +- Nest with other ChoiceGroup or CheckBoxes. If possible, keep all the options at the same level. \ No newline at end of file diff --git a/packages/office-ui-fabric-react/src/components/ChoiceGroup/docs/ChoiceGroupDos.md b/packages/office-ui-fabric-react/src/components/ChoiceGroup/docs/ChoiceGroupDos.md new file mode 100644 index 0000000000000..1d665916a1165 --- /dev/null +++ b/packages/office-ui-fabric-react/src/components/ChoiceGroup/docs/ChoiceGroupDos.md @@ -0,0 +1,6 @@ +- Use when there are 2-7 options, if you have enough screen space and the options are important enough to be a good use of that screen space. Otherwise, use a Checkbox or Dropdown list. +- Use on wizard pages to make the alternatives clear, even if a Checkbox is otherwise acceptable. +- List the options in a logical order, such as most likely to be selected to least, simplest operation to most complex, or least risk to most. Alphabetical ordering is not recommended because it is language dependent and therefore not localizable. +- If none of the options is a valid choice, add another option to reflect this choice, such as "None" or "Does not apply". +- Select the safest (to prevent loss of data or system access) and most secure and private option as the default. If safety and security aren't factors, select the most likely or convenient option. +- Align radio buttons vertically instead of horizontally, if possible. Horizontal alignment is harder to read and localize. \ No newline at end of file diff --git a/packages/office-ui-fabric-react/src/components/ChoiceGroup/docs/ChoiceGroupOverview.md b/packages/office-ui-fabric-react/src/components/ChoiceGroup/docs/ChoiceGroupOverview.md new file mode 100644 index 0000000000000..5a1e8d0e3bf9b --- /dev/null +++ b/packages/office-ui-fabric-react/src/components/ChoiceGroup/docs/ChoiceGroupOverview.md @@ -0,0 +1,5 @@ +The ChoiceGroup component, also known as radio buttons, let users select one option from two or more choices. Each option is represented by one ChoiceGroup button; a user can select only one ChoiceGroup in a button group. + +ChoiceGroup emphasize all options equally, and that may draw more attention to the options than necessary. Consider using other controls, unless the options deserve extra attention from the user. For example, if the default option is recommended for most users in most situations, use a Dropdown component instead. + +If there are only two mutually exclusive options, combine them into a single Checkbox or Toggle switch. For example, use a Checkbox for "I agree" instead of ChoiceGroup buttons for "I agree" and "I don't agree." diff --git a/packages/office-ui-fabric-react/src/components/ChoiceGroup/examples/ChoiceGroup.Icon.Example.tsx b/packages/office-ui-fabric-react/src/components/ChoiceGroup/examples/ChoiceGroup.Icon.Example.tsx index cf5b0418f466b..543890406cb91 100644 --- a/packages/office-ui-fabric-react/src/components/ChoiceGroup/examples/ChoiceGroup.Icon.Example.tsx +++ b/packages/office-ui-fabric-react/src/components/ChoiceGroup/examples/ChoiceGroup.Icon.Example.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import { ChoiceGroup } from 'office-ui-fabric-react/lib/ChoiceGroup'; export class ChoiceGroupIconExample extends React.Component { - public render() { + public render(): JSX.Element { return ( , option: IChoiceGroupOption) { + private _onImageChoiceGroupChange(ev: React.SyntheticEvent, option: IChoiceGroupOption): void { this.setState({ selectedKey: option.key }); diff --git a/packages/office-ui-fabric-react/src/components/Coachmark/Coachmark.styles.ts b/packages/office-ui-fabric-react/src/components/Coachmark/Coachmark.styles.ts index 08374d695f52e..97c163d1a661a 100644 --- a/packages/office-ui-fabric-react/src/components/Coachmark/Coachmark.styles.ts +++ b/packages/office-ui-fabric-react/src/components/Coachmark/Coachmark.styles.ts @@ -1,8 +1,9 @@ import { IStyle, - IRawStyle, keyframes, - PulsingBeaconAnimationStyles + PulsingBeaconAnimationStyles, + ITheme, + getTheme } from '../../Styling'; export interface ICoachmarkStyleProps { @@ -217,14 +218,15 @@ export const rotateOne: string = keyframes({ } }); -export function getStyles(props: ICoachmarkStyleProps): ICoachmarkStyles { +export function getStyles(props: ICoachmarkStyleProps, theme: ITheme = getTheme(), +): ICoachmarkStyles { const animationInnerDimension = '35px'; const animationOuterDimension = '150px'; const animationBorderWidth = '10px'; - const ContinuousPulse: string = PulsingBeaconAnimationStyles.continuousPulseAnimation( - props.beaconColorOne!, - props.beaconColorTwo!, + const ContinuousPulse: string = PulsingBeaconAnimationStyles.continuousPulseAnimationDouble( + props.beaconColorOne ? props.beaconColorOne : theme.palette.themePrimary, + props.beaconColorTwo ? props.beaconColorTwo : theme.palette.themeTertiary, animationInnerDimension, animationOuterDimension, animationBorderWidth diff --git a/packages/office-ui-fabric-react/src/components/Coachmark/Coachmark.tsx b/packages/office-ui-fabric-react/src/components/Coachmark/Coachmark.tsx index 0500dd656c5f7..795f7e374a41a 100644 --- a/packages/office-ui-fabric-react/src/components/Coachmark/Coachmark.tsx +++ b/packages/office-ui-fabric-react/src/components/Coachmark/Coachmark.tsx @@ -71,8 +71,6 @@ export class Coachmark extends BaseComponent { delayBeforeMouseOpen: 3600, // The approximate time the coachmark shows up width: 36, height: 36, - beaconColorOne: '#00FFEC', - beaconColorTwo: '#005EDD', color: DefaultPalette.themePrimary }; @@ -108,9 +106,7 @@ export class Coachmark extends BaseComponent { target, width, height, - color, - beaconColorOne, - beaconColorTwo + color } = this.props; const classNames = getClassNames(getStyles, { @@ -121,9 +117,7 @@ export class Coachmark extends BaseComponent { entityHostWidth: this.state.entityInnerHostRect.width + 'px', width: width + 'px', height: height + 'px', - color: color, - beaconColorOne: beaconColorOne, - beaconColorTwo: beaconColorTwo + color: color }); return ( @@ -141,7 +135,7 @@ export class Coachmark extends BaseComponent {
    { - this._positioningContainer.value && { public componentDidMount(): void { this._async.requestAnimationFrame(((): void => { - if (this._entityInnerHostElement.value && (this.state.entityInnerHostRect.width + this.state.entityInnerHostRect.width) === 0) { + if (this._entityInnerHostElement.current && (this.state.entityInnerHostRect.width + this.state.entityInnerHostRect.width) === 0) { // @TODO Eventually we need to add the various directions const beakLeft = (this.props.width! / 2) - (this.props.beakWidth! / 2); @@ -188,8 +182,8 @@ export class Coachmark extends BaseComponent { this.setState({ isMeasuring: false, entityInnerHostRect: { - width: this._entityInnerHostElement.value.offsetWidth, - height: this._entityInnerHostElement.value.offsetHeight + width: this._entityInnerHostElement.current.offsetWidth, + height: this._entityInnerHostElement.current.offsetHeight }, beakLeft: beakLeft + 'px', beakTop: beakTop + 'px' @@ -214,13 +208,13 @@ export class Coachmark extends BaseComponent { collapsed: false }); - this._translateAnimationContainer.value && this._translateAnimationContainer.value.addEventListener('animationstart', (): void => { + this._translateAnimationContainer.current && this._translateAnimationContainer.current.addEventListener('animationstart', (): void => { if (this.props.onAnimationOpenStart) { this.props.onAnimationOpenStart(); } }); - this._translateAnimationContainer.value && this._translateAnimationContainer.value.addEventListener('animationend', (): void => { + this._translateAnimationContainer.current && this._translateAnimationContainer.current.addEventListener('animationend', (): void => { if (this.props.onAnimationOpenEnd) { this.props.onAnimationOpenEnd(); } @@ -243,8 +237,8 @@ export class Coachmark extends BaseComponent { // Take the initial measure out of the initial render to prevent // an unnecessary render. this._async.setTimeout(() => { - if (this._entityInnerHostElement.value) { - targetElementRect = this._entityInnerHostElement.value.getBoundingClientRect(); + if (this._entityInnerHostElement.current) { + targetElementRect = this._entityInnerHostElement.current.getBoundingClientRect(); } // When the window resizes we want to async @@ -258,8 +252,8 @@ export class Coachmark extends BaseComponent { }); timeoutIds.push(this._async.setTimeout((): void => { - if (this._entityInnerHostElement.value) { - targetElementRect = this._entityInnerHostElement.value.getBoundingClientRect(); + if (this._entityInnerHostElement.current) { + targetElementRect = this._entityInnerHostElement.current.getBoundingClientRect(); } }, 100)); }); diff --git a/packages/office-ui-fabric-react/src/components/Coachmark/CoachmarkPage.tsx b/packages/office-ui-fabric-react/src/components/Coachmark/CoachmarkPage.tsx index 458642ae39327..7be1558913add 100644 --- a/packages/office-ui-fabric-react/src/components/Coachmark/CoachmarkPage.tsx +++ b/packages/office-ui-fabric-react/src/components/Coachmark/CoachmarkPage.tsx @@ -3,7 +3,8 @@ import { ExampleCard, IComponentDemoPageProps, ComponentPage, - PropertiesTableSet + PropertiesTableSet, + PageMarkdown, } from '@uifabric/example-app-base'; import { CoachmarkBasicExample } from './examples/Coachmark.Basic.Example'; @@ -16,6 +17,7 @@ export class CoachmarkPage extends React.Component @@ -31,35 +33,22 @@ export class CoachmarkPage extends React.Component /> } overview={ -
    -

    Coachmarks are used to draw a persons attention to a part of the UI, and increase engagement with that element - in the product.

    - -

    - They should be contextual whenever possible, or related to something that will make existing user flows more efficient -

    -
    + + { require('!raw-loader!office-ui-fabric-react/src/components/Coachmark/docs/CoachmarkOverview.md') } + } bestPractices={
    } dos={ -
    -
      -
    • Only one coachmark + callout combo will be displayed at a time
    • -
    • Coachmarks can be stand alone or sequential. Sequential coachmarks should be used sparingly, to walk through complex - multi-step interactions. It is recommended that a sequence of coachmakrs does not exceed 3 steps.
    • -
    • Coachmarks are designed to only hold Callouts.
    • -
    -
    + + { require('!raw-loader!office-ui-fabric-react/src/components/Coachmark/docs/CoachmarkDos.md') } + } donts={ -
    -
      -
    • Coachmark size, color, and animation should not be altered.
    • -
    • Don't show the coachmark more than once even if the user has not completed the action.
    • -
    -
    + + { require('!raw-loader!office-ui-fabric-react/src/components/Coachmark/docs/CoachmarkDonts.md') } + } isHeaderVisible={ this.props.isHeaderVisible } /> diff --git a/packages/office-ui-fabric-react/src/components/Coachmark/PositioningContainer/PositioningContainer.tsx b/packages/office-ui-fabric-react/src/components/Coachmark/PositioningContainer/PositioningContainer.tsx index 0a31984b9cfb2..9123fe2b07398 100644 --- a/packages/office-ui-fabric-react/src/components/Coachmark/PositioningContainer/PositioningContainer.tsx +++ b/packages/office-ui-fabric-react/src/components/Coachmark/PositioningContainer/PositioningContainer.tsx @@ -1,8 +1,5 @@ import * as React from 'react'; -import { - IPositioningContainer, - IPositioningContainerTypes -} from './PositioningContainer.types'; +import { IPositioningContainerTypes } from './PositioningContainer.types'; import { getClassNames } from './PositioningContainer.styles'; import { Layer } from 'office-ui-fabric-react/lib/Layer'; @@ -217,7 +214,7 @@ export class PositioningContainer protected _dismissOnLostFocus(ev: Event): void { const target = ev.target as HTMLElement; - const clickedOutsideCallout = this._positionedHost.value && !elementContains(this._positionedHost.value, target); + const clickedOutsideCallout = this._positionedHost.current && !elementContains(this._positionedHost.current, target); if ( (!this._target && clickedOutsideCallout) || @@ -230,9 +227,9 @@ export class PositioningContainer } protected _setInitialFocus = (): void => { - if (this._contentHost.value && this.props.setInitialFocus && !this._didSetInitialFocus && this.state.positions) { + if (this._contentHost.current && this.props.setInitialFocus && !this._didSetInitialFocus && this.state.positions) { this._didSetInitialFocus = true; - focusFirstChild(this._contentHost.value); + focusFirstChild(this._contentHost.current); } } @@ -267,8 +264,8 @@ export class PositioningContainer onPositioned } = this.props; - const hostElement = this._positionedHost.value; - const positioningContainerElement = this._contentHost.value; + const hostElement = this._positionedHost.current; + const positioningContainerElement = this._contentHost.current; if (hostElement && positioningContainerElement) { let currentProps: IPositionProps | undefined; @@ -388,11 +385,11 @@ export class PositioningContainer private _setHeightOffsetEveryFrame(): void { if (this._contentHost && this.props.finalHeight) { this._setHeightOffsetTimer = this._async.requestAnimationFrame(() => { - if (!this._contentHost.value) { + if (!this._contentHost.current) { return; } - const positioningContainerMainElem = this._contentHost.value.lastChild as HTMLElement; + const positioningContainerMainElem = this._contentHost.current.lastChild as HTMLElement; const cardScrollHeight: number = positioningContainerMainElem.scrollHeight; const cardCurrHeight: number = positioningContainerMainElem.offsetHeight; const scrollDiff: number = cardScrollHeight - cardCurrHeight; diff --git a/packages/office-ui-fabric-react/src/components/Coachmark/docs/CoachmarkDonts.md b/packages/office-ui-fabric-react/src/components/Coachmark/docs/CoachmarkDonts.md new file mode 100644 index 0000000000000..8e3f583b0ce98 --- /dev/null +++ b/packages/office-ui-fabric-react/src/components/Coachmark/docs/CoachmarkDonts.md @@ -0,0 +1,2 @@ +- Coachmark size, color, and animation should not be altered. +- Don't show the coachmark more than once even if the user has not completed the action. \ No newline at end of file diff --git a/packages/office-ui-fabric-react/src/components/Coachmark/docs/CoachmarkDos.md b/packages/office-ui-fabric-react/src/components/Coachmark/docs/CoachmarkDos.md new file mode 100644 index 0000000000000..e633c88b6505b --- /dev/null +++ b/packages/office-ui-fabric-react/src/components/Coachmark/docs/CoachmarkDos.md @@ -0,0 +1,3 @@ +- Only one coachmark + callout combo will be displayed at a time +- Coachmarks can be stand alone or sequential. Sequential coachmarks should be used sparingly, to walk through complex multi-step interactions. It is recommended that a sequence of coachmakrs does not exceed 3 steps. +- Coachmarks are designed to only hold Callouts. \ No newline at end of file diff --git a/packages/office-ui-fabric-react/src/components/Coachmark/docs/CoachmarkOverview.md b/packages/office-ui-fabric-react/src/components/Coachmark/docs/CoachmarkOverview.md new file mode 100644 index 0000000000000..c498d3cc459ce --- /dev/null +++ b/packages/office-ui-fabric-react/src/components/Coachmark/docs/CoachmarkOverview.md @@ -0,0 +1,4 @@ +Coachmarks are used to draw a persons attention to a part of the UI, and increase engagement with that element +in the product. + +They should be contextual whenever possible, or related to something that will make existing user flows more efficient diff --git a/packages/office-ui-fabric-react/src/components/Coachmark/examples/Coachmark.Basic.Example.tsx b/packages/office-ui-fabric-react/src/components/Coachmark/examples/Coachmark.Basic.Example.tsx index 34cf5c556d171..65bbb98b80f66 100644 --- a/packages/office-ui-fabric-react/src/components/Coachmark/examples/Coachmark.Basic.Example.tsx +++ b/packages/office-ui-fabric-react/src/components/Coachmark/examples/Coachmark.Basic.Example.tsx @@ -73,7 +73,7 @@ export class CoachmarkBasicExample extends BaseComponent<{}, ICoachmarkBasicExam
    { isVisible && ( { ) as ColorPicker; - const renderedDOM = ReactDOM.findDOMNode(component as React.ReactInstance); + const renderedDOM = ReactDOM.findDOMNode(component as React.ReactInstance) as Element; const alphaSlider = renderedDOM.querySelector('.is-alpha'); const alphaTableHeader = renderedDOM.querySelector('.ms-ColorPicker-table > thead > tr > td:nth-child(5)'); const alphaTableInput = renderedDOM.querySelector('.ms-ColorPicker-table > tbody> tr > td:nth-child(5)'); @@ -73,7 +73,7 @@ describe('ColorPicker', () => { ) as ColorPicker; - const renderedDOM = ReactDOM.findDOMNode(component as React.ReactInstance); + const renderedDOM = ReactDOM.findDOMNode(component as React.ReactInstance) as Element; const tableHeaders = renderedDOM.querySelectorAll('.ms-ColorPicker-table > thead > tr > td') as NodeListOf; const hexTableHeader = tableHeaders[0]; @@ -110,7 +110,7 @@ describe('ColorPicker', () => { /> ) as ColorPicker; - const renderedDOM = ReactDOM.findDOMNode(component as React.ReactInstance); + const renderedDOM = ReactDOM.findDOMNode(component as React.ReactInstance) as Element; const tableHeaders = renderedDOM.querySelectorAll('.ms-ColorPicker-table > thead > tr > td') as NodeListOf; const hexTableHeader = tableHeaders[0]; diff --git a/packages/office-ui-fabric-react/src/components/ColorPicker/ColorPicker.tsx b/packages/office-ui-fabric-react/src/components/ColorPicker/ColorPicker.tsx index 291607e1e8e5b..190d570f0490d 100644 --- a/packages/office-ui-fabric-react/src/components/ColorPicker/ColorPicker.tsx +++ b/packages/office-ui-fabric-react/src/components/ColorPicker/ColorPicker.tsx @@ -48,13 +48,13 @@ export class ColorPicker extends BaseComponent { - public render() { + public render(): JSX.Element { return ( } overview={ -
    ColorPicker is used to allow a user to select a color
    + + { require('!raw-loader!office-ui-fabric-react/src/components/ColorPicker/docs/ColorPickerOverview.md') } + } isHeaderVisible={ this.props.isHeaderVisible } componentStatus={ } /> diff --git a/packages/office-ui-fabric-react/src/components/ColorPicker/ColorRectangle.tsx b/packages/office-ui-fabric-react/src/components/ColorPicker/ColorRectangle.tsx index 2a40276926f1b..0a3f784eccb18 100644 --- a/packages/office-ui-fabric-react/src/components/ColorPicker/ColorRectangle.tsx +++ b/packages/office-ui-fabric-react/src/components/ColorPicker/ColorRectangle.tsx @@ -50,11 +50,11 @@ export class ColorRectangle extends BaseComponent): void => { const { color, onSVChanged } = this.props; - if (!this._root.value) { + if (!this._root.current) { return; } - const rectSize = this._root.value.getBoundingClientRect(); + const rectSize = this._root.current.getBoundingClientRect(); const sPercentage = (ev.clientX - rectSize.left) / rectSize.width; const vPercentage = (ev.clientY - rectSize.top) / rectSize.height; diff --git a/packages/office-ui-fabric-react/src/components/ColorPicker/ColorSlider.tsx b/packages/office-ui-fabric-react/src/components/ColorPicker/ColorSlider.tsx index 73b4ca591adc5..442568c66999c 100644 --- a/packages/office-ui-fabric-react/src/components/ColorPicker/ColorSlider.tsx +++ b/packages/office-ui-fabric-react/src/components/ColorPicker/ColorSlider.tsx @@ -48,13 +48,13 @@ export class ColorSlider extends BaseComponent): void => { - if (!this._root.value) { + if (!this._root.current) { return; } const { onChanged, minValue, maxValue } = this.props; - const rectSize = this._root.value.getBoundingClientRect(); + const rectSize = this._root.current.getBoundingClientRect(); const currentPercentage = (ev.clientX - rectSize.left) / rectSize.width; const newValue = Math.min(maxValue!, Math.max(minValue!, currentPercentage * maxValue!)); diff --git a/packages/office-ui-fabric-react/src/components/ColorPicker/__snapshots__/ColorPicker.test.tsx.snap b/packages/office-ui-fabric-react/src/components/ColorPicker/__snapshots__/ColorPicker.test.tsx.snap index 004797c12984c..b5010567ea697 100644 --- a/packages/office-ui-fabric-react/src/components/ColorPicker/__snapshots__/ColorPicker.test.tsx.snap +++ b/packages/office-ui-fabric-react/src/components/ColorPicker/__snapshots__/ColorPicker.test.tsx.snap @@ -122,7 +122,7 @@ exports[`ColorPicker renders ColorPicker correctly 1`] = ` className="ms-TextField-fieldGroup" > { - public render() { + public render(): JSX.Element { return ( diff --git a/packages/office-ui-fabric-react/src/components/ComboBox/ComboBox.tsx b/packages/office-ui-fabric-react/src/components/ComboBox/ComboBox.tsx index 95b2a131799a7..977b1261608e9 100644 --- a/packages/office-ui-fabric-react/src/components/ComboBox/ComboBox.tsx +++ b/packages/office-ui-fabric-react/src/components/ComboBox/ComboBox.tsx @@ -1,14 +1,15 @@ import * as React from 'react'; -import { IComboBoxOption, IComboBoxProps } from './ComboBox.types'; +import { IComboBoxOption, IComboBoxProps, IComboBoxOptionStyles } from './ComboBox.types'; import { DirectionalHint } from '../../common/DirectionalHint'; import { Callout } from '../../Callout'; import { Label } from '../../Label'; import { Checkbox } from '../../Checkbox'; import { CommandButton, - IconButton + IconButton, + IButtonStyles } from '../../Button'; -import { Autofill } from '../Autofill/Autofill'; +import { IAutofill, Autofill } from '../Autofill/index'; import { BaseComponent, divProperties, @@ -18,7 +19,8 @@ import { KeyCodes, customizable, css, - createRef + createRef, + shallowCompare } from '../../Utilities'; import { SelectableOptionMenuItemType } from '../../utilities/selectableOption/SelectableOption.types'; import { @@ -31,6 +33,7 @@ import { getClassNames, getComboBoxOptionClassNames } from './ComboBox.classNames'; +import { BaseButton, Button } from 'src/index.bundle'; export interface IComboBoxState { @@ -77,6 +80,25 @@ enum HoverStatus { default = -1 } +interface IComboBoxOptionWrapperProps extends IComboBoxOption { + // True if the option is currently selected + isSelected: boolean; +} + +// Internal class that is used to wrap all ComboBox options +// This is used to customize when we want to rerender components, +// so we don't rerender every option every time render is executed +class ComboBoxOptionWrapper extends React.Component { + public render(): React.ReactNode { + return this.props.children; + } + + public shouldComponentUpdate(newProps: IComboBoxOptionWrapperProps): boolean { + // The children will always be different, so we ignore that prop + return !shallowCompare({ ...this.props, children: undefined }, { ...newProps, children: undefined }); + } +} + @customizable('ComboBox', ['theme']) export class ComboBox extends BaseComponent { @@ -90,7 +112,7 @@ export class ComboBox extends BaseComponent { private _root = createRef(); // The input aspect of the comboBox - private _comboBox = createRef(); + private _autofill = createRef(); // The wrapping div of the input and button private _comboBoxWrapper = createRef(); @@ -167,12 +189,12 @@ export class ComboBox extends BaseComponent { }; } - public componentDidMount() { + public componentDidMount(): void { // hook up resolving the options if needed on focus - this._events.on(this._comboBoxWrapper.value, 'focus', this._onResolveOptions, true); + this._events.on(this._comboBoxWrapper.current, 'focus', this._onResolveOptions, true); } - public componentWillReceiveProps(newProps: IComboBoxProps) { + public componentWillReceiveProps(newProps: IComboBoxProps): void { // Update the selectedIndex and currentOptions state if // the selectedKey, value, or options have changed if (newProps.selectedKey !== this.props.selectedKey || @@ -218,8 +240,8 @@ export class ComboBox extends BaseComponent { !isOpen && this._focusInputAfterClose && focused && - this._comboBox.value && - document.activeElement !== this._comboBox.value.inputElement)) { + this._autofill.current && + document.activeElement !== this._autofill.current.inputElement)) { this.focus(); } @@ -249,15 +271,15 @@ export class ComboBox extends BaseComponent { } } - public componentWillUnmount() { + public componentWillUnmount(): void { super.componentWillUnmount(); // remove the eventHanlder that was added in componentDidMount - this._events.off(this._comboBoxWrapper.value); + this._events.off(this._comboBoxWrapper.current); } // Primary Render - public render() { + public render(): JSX.Element { const id = this._id; const { className, @@ -277,7 +299,7 @@ export class ComboBox extends BaseComponent { theme, title } = this.props; - const { isOpen, selectedIndices, focused, suggestedDisplayValue } = this.state; + const { isOpen, focused, suggestedDisplayValue } = this.state; this._currentVisibleValue = this._getVisibleValue(); const divProps = getNativeProps(this.props, divProperties); @@ -317,7 +339,7 @@ export class ComboBox extends BaseComponent { > { aria-expanded={ isOpen } aria-autocomplete={ this._getAriaAutoCompleteValue() } role='combobox' - aria-readonly={ ((allowFreeform || disabled) ? null : 'true') } + aria-readonly={ ((allowFreeform || disabled) ? undefined : 'true') } readOnly={ disabled || !allowFreeform } aria-labelledby={ (label && (id + '-label')) } - aria-label={ ((ariaLabel && !label) && ariaLabel) } + aria-label={ ((ariaLabel && !label) ? ariaLabel : undefined) } aria-describedby={ (id + '-option') } aria-activedescendant={ this._getAriaActiveDescentValue() } aria-disabled={ disabled } @@ -385,8 +407,8 @@ export class ComboBox extends BaseComponent { * Set focus on the input */ public focus = (shouldOpenOnFocus?: boolean): void => { - if (this._comboBox.value) { - this._comboBox.value.focus(); + if (this._autofill.current) { + this._autofill.current.focus(); if (shouldOpenOnFocus) { this.setState({ isOpen: true @@ -411,7 +433,7 @@ export class ComboBox extends BaseComponent { * @returns {string} - the updated value to set, if needed */ private _onUpdateValueInAutofillWillReceiveProps = (): string | null => { - const comboBox = this._comboBox.value; + const comboBox = this._autofill.current; if (!comboBox) { return null; @@ -561,7 +583,7 @@ export class ComboBox extends BaseComponent { * allows freeform entry * @param updatedValue - the input's newly changed value */ - private _processInputChangeWithFreeform(updatedValue: string) { + private _processInputChangeWithFreeform(updatedValue: string): void { const { currentOptions } = this.state; @@ -583,10 +605,15 @@ export class ComboBox extends BaseComponent { if (this.props.autoComplete === 'on') { // If autoComplete is on, attempt to find a match where the text of an option starts with the updated value - const items = currentOptions.map((item, index) => { return { ...item, index }; }).filter((option) => option.itemType !== SelectableOptionMenuItemType.Header && option.itemType !== SelectableOptionMenuItemType.Divider).filter((option) => option.text.toLocaleLowerCase().indexOf(updatedValue) === 0); + const items = currentOptions.map((item, index) => { return { ...item, index }; }) + .filter((option) => option.itemType !== SelectableOptionMenuItemType.Header && option.itemType !== SelectableOptionMenuItemType.Divider) + .filter((option) => this._getPreviewText(option).toLocaleLowerCase().indexOf(updatedValue) === 0); if (items.length > 0) { + // use ariaLabel as the value when the option is set + const text: string = this._getPreviewText(items[0]); + // If the user typed out the complete option text, we don't need any suggested display text anymore - newSuggestedDisplayValue = items[0].text.toLocaleLowerCase() !== updatedValue ? items[0].text : ''; + newSuggestedDisplayValue = text.toLocaleLowerCase() !== updatedValue ? text : ''; // remember the index of the match we found newCurrentPendingValueValidIndex = items[0].index; @@ -594,7 +621,9 @@ export class ComboBox extends BaseComponent { } else { // If autoComplete is off, attempt to find a match only when the value is exactly equal to the text of an option - const items = currentOptions.map((item, index) => { return { ...item, index }; }).filter((option) => option.itemType !== SelectableOptionMenuItemType.Header && option.itemType !== SelectableOptionMenuItemType.Divider).filter((option) => option.text.toLocaleLowerCase() === updatedValue); + const items = currentOptions.map((item, index) => { return { ...item, index }; }) + .filter((option) => option.itemType !== SelectableOptionMenuItemType.Header && option.itemType !== SelectableOptionMenuItemType.Divider) + .filter((option) => this._getPreviewText(option).toLocaleLowerCase() === updatedValue); // if we fould a match remember the index if (items.length === 1) { @@ -611,12 +640,11 @@ export class ComboBox extends BaseComponent { * does not allow freeform entry * @param updatedValue - the input's newly changed value */ - private _processInputChangeWithoutFreeform(updatedValue: string) { + private _processInputChangeWithoutFreeform(updatedValue: string): void { const { currentPendingValue, currentPendingValueValidIndex, currentOptions, - selectedIndices } = this.state; if (this.props.autoComplete === 'on') { @@ -642,11 +670,13 @@ export class ComboBox extends BaseComponent { updatedValue = updatedValue.toLocaleLowerCase(); // If autoComplete is on, attempt to find a match where the text of an option starts with the updated value - const items = currentOptions.map((item, i) => { return { ...item, index: i }; }).filter((option) => option.itemType !== SelectableOptionMenuItemType.Header && option.itemType !== SelectableOptionMenuItemType.Divider).filter((option) => option.text.toLocaleLowerCase().indexOf(updatedValue) === 0); + const items = currentOptions.map((item, i) => { return { ...item, index: i }; }) + .filter((option) => option.itemType !== SelectableOptionMenuItemType.Header && option.itemType !== SelectableOptionMenuItemType.Divider) + .filter((option) => option.text.toLocaleLowerCase().indexOf(updatedValue) === 0); // If we found a match, udpdate the state if (items.length > 0) { - this._setPendingInfo(originalUpdatedValue, items[0].index, items[0].text); + this._setPendingInfo(originalUpdatedValue, items[0].index, this._getPreviewText(items[0])); } // Schedule a timeout to clear the pending value after the timeout span @@ -721,7 +751,7 @@ export class ComboBox extends BaseComponent { * @param index - the index to set (or the index to set from if a search direction is provided) * @param searchDirection - the direction to search along the options from the given index */ - private _setSelectedIndex(index: number, searchDirection: SearchDirection = SearchDirection.none) { + private _setSelectedIndex(index: number, submitPendingValueEvent: any, searchDirection: SearchDirection = SearchDirection.none): void { const { onChanged, onPendingValueChanged } = this.props; const { currentOptions } = this.state; let { selectedIndices } = this.state; @@ -769,7 +799,7 @@ export class ComboBox extends BaseComponent { // Did the creator give us an onChanged callback? if (onChanged) { - onChanged(option, index); + onChanged(option, index, undefined, submitPendingValueEvent); } // if we have a new selected index, @@ -783,8 +813,8 @@ export class ComboBox extends BaseComponent { * and set the focused state */ private _select = (): void => { - if (this._comboBox.value && this._comboBox.value.inputElement) { - this._comboBox.value.inputElement.select(); + if (this._autofill.current && this._autofill.current.inputElement) { + this._autofill.current.inputElement.select(); } if (!this.state.focused) { @@ -835,8 +865,8 @@ export class ComboBox extends BaseComponent { // inside the comboBox root or the comboBox menu since // it we are not really bluring from the whole comboBox if (event.relatedTarget && - (this._root.value && this._root.value.contains(event.relatedTarget as HTMLElement) || - this._comboBoxMenu.value && this._comboBoxMenu.value.contains(event.relatedTarget as HTMLElement))) { + (this._root.current && this._root.current.contains(event.relatedTarget as HTMLElement) || + this._comboBoxMenu.current && this._comboBoxMenu.current.contains(event.relatedTarget as HTMLElement))) { event.preventDefault(); event.stopPropagation(); return; @@ -845,7 +875,7 @@ export class ComboBox extends BaseComponent { if (this.state.focused) { this.setState({ focused: false }); if (!this.props.multiSelect) { - this._submitPendingValue(); + this._submitPendingValue(event); } } } @@ -853,7 +883,7 @@ export class ComboBox extends BaseComponent { /** * Submit a pending value if there is one */ - private _submitPendingValue() { + private _submitPendingValue(submitPendingValueEvent: any): void { const { onChanged, allowFreeform, @@ -881,18 +911,18 @@ export class ComboBox extends BaseComponent { // the live value in the underlying input matches the pending option; update the state if (currentPendingValue.toLocaleLowerCase() === pendingOptionText || (autoComplete && pendingOptionText.indexOf(currentPendingValue.toLocaleLowerCase()) === 0 && - (this._comboBox.value && this._comboBox.value.isValueSelected && - currentPendingValue.length + (this._comboBox.value.selectionEnd - this._comboBox.value.selectionStart) === pendingOptionText.length) || - (this._comboBox.value && this._comboBox.value.inputElement && this._comboBox.value.inputElement.value.toLocaleLowerCase() === pendingOptionText) + (this._autofill.current && this._autofill.current.isValueSelected && + currentPendingValue.length + (this._autofill.current.selectionEnd! - this._autofill.current.selectionStart!) === pendingOptionText.length) || + (this._autofill.current && this._autofill.current.inputElement && this._autofill.current.inputElement.value.toLocaleLowerCase() === pendingOptionText) )) { - this._setSelectedIndex(currentPendingValueValidIndex); + this._setSelectedIndex(currentPendingValueValidIndex, submitPendingValueEvent); this._clearPendingInfo(); return; } } if (onChanged) { - onChanged(undefined, undefined, currentPendingValue); + onChanged(undefined, undefined, currentPendingValue, submitPendingValueEvent); } else { // If we are not controlled, create a new option const newOption: IComboBoxOption = { key: currentPendingValue, text: currentPendingValue }; @@ -911,10 +941,10 @@ export class ComboBox extends BaseComponent { } else if (currentPendingValueValidIndex >= 0) { // Since we are not allowing freeform, we must have a matching // to be able to update state - this._setSelectedIndex(currentPendingValueValidIndex); + this._setSelectedIndex(currentPendingValueValidIndex, submitPendingValueEvent); } else if (currentPendingValueValidIndexOnHover >= 0) { // If all else failed and we were hovering over an item, select it - this._setSelectedIndex(currentPendingValueValidIndexOnHover); + this._setSelectedIndex(currentPendingValueValidIndexOnHover, submitPendingValueEvent, ); } // Finally, clear the pending info @@ -940,13 +970,13 @@ export class ComboBox extends BaseComponent { directionalHintFixed={ true } { ...calloutProps } className={ css(this._classNames.callout, calloutProps ? calloutProps.className : undefined) } - target={ this._comboBoxWrapper.value } + target={ this._comboBoxWrapper.current } onDismiss={ this._onDismiss } onScroll={ this._onScroll } setInitialFocus={ false } calloutWidth={ - useComboBoxAsMenuWidth && this._comboBoxWrapper.value ? - this._comboBoxWrapper.value.clientWidth + 2 + useComboBoxAsMenuWidth && this._comboBoxWrapper.current ? + this._comboBoxWrapper.current.clientWidth + 2 : dropdownWidth } >
    @@ -1024,46 +1054,63 @@ export class ComboBox extends BaseComponent { const id = this._id; const isSelected: boolean = this._isOptionSelected(item.index); const optionStyles = this._getCurrentOptionStyles(item); + const wrapperProps = { + key: item.key, + index: item.index, + styles: optionStyles, + disabled: item.disabled, + isSelected: isSelected, + text: item.text, + }; return ( !this.props.multiSelect ? ( - { - { onRenderOption(item, this._onRenderOptionContent) } - - } - - ) : ( - + + ariaLabel={ item.text } + disabled={ item.disabled } + > { { onRenderOption(item, this._onRenderOptionContent) } - + + } + + + ) : ( + + + { onRenderOption(item, this._onRenderOptionContent) } + + ) ); } @@ -1112,7 +1159,6 @@ export class ComboBox extends BaseComponent { currentPendingValueValidIndexOnHover, currentPendingValueValidIndex, currentPendingValue, - selectedIndices } = this.state; return ( @@ -1142,7 +1188,7 @@ export class ComboBox extends BaseComponent { /** * Scroll the selected element into view */ - private _scrollIntoView() { + private _scrollIntoView(): void { const { onScrollToItem, scrollSelectedToTop @@ -1151,22 +1197,21 @@ export class ComboBox extends BaseComponent { const { currentPendingValueValidIndex, currentPendingValue, - selectedIndices } = this.state; if (onScrollToItem) { // Use the custom scroll handler onScrollToItem((currentPendingValueValidIndex >= 0 || currentPendingValue !== '') ? currentPendingValueValidIndex : this._getFirstSelectedIndex()); - } else if (this._selectedElement.value && this._selectedElement.value.offsetParent) { + } else if (this._selectedElement.current && this._selectedElement.current.offsetParent) { // We are using refs, scroll the ref into view if (scrollSelectedToTop) { - this._selectedElement.value.offsetParent.scrollIntoView(true); + this._selectedElement.current.offsetParent.scrollIntoView(true); } else { let alignToTop = true; - if (this._comboBoxMenu.value && this._comboBoxMenu.value.offsetParent) { - const scrollableParentRect = this._comboBoxMenu.value.offsetParent.getBoundingClientRect(); - const selectedElementRect = this._selectedElement.value.offsetParent.getBoundingClientRect(); + if (this._comboBoxMenu.current && this._comboBoxMenu.current.offsetParent) { + const scrollableParentRect = this._comboBoxMenu.current.offsetParent.getBoundingClientRect(); + const selectedElementRect = this._selectedElement.current.offsetParent.getBoundingClientRect(); // If we are completely in view then we do not need to scroll if (scrollableParentRect.top <= selectedElementRect.top && @@ -1180,7 +1225,7 @@ export class ComboBox extends BaseComponent { } } - this._selectedElement.value.offsetParent.scrollIntoView(alignToTop); + this._selectedElement.current.offsetParent.scrollIntoView(alignToTop); } } } @@ -1195,9 +1240,9 @@ export class ComboBox extends BaseComponent { * to select the item and also close the menu * @param index - the index of the item that was clicked */ - private _onItemClick(index: number | undefined): () => void { - return (): void => { - this._setSelectedIndex(index as number); + private _onItemClick(index: number | undefined): (ev: any) => void { + return (ev: any): void => { + this._setSelectedIndex(index as number, ev); if (!this.props.multiSelect) { // only close the callout when it's in single-select mode this.setState({ @@ -1219,8 +1264,8 @@ export class ComboBox extends BaseComponent { // close the menu and focus the input this.setState({ isOpen: false }); - if (this._comboBox.value && this._focusInputAfterClose) { - this._comboBox.value.focus(); + if (this._autofill.current && this._focusInputAfterClose) { + this._autofill.current.focus(); } } @@ -1251,13 +1296,12 @@ export class ComboBox extends BaseComponent { * and setting the suggested display value to the last * selected state text */ - private _resetSelectedIndex() { + private _resetSelectedIndex(): void { const { - selectedIndices, currentOptions } = this.state; - if (this._comboBox.value) { - this._comboBox.value.clear(); + if (this._autofill.current) { + this._autofill.current.clear(); } this._clearPendingInfo(); @@ -1277,7 +1321,7 @@ export class ComboBox extends BaseComponent { /** * Clears the pending info state */ - private _clearPendingInfo() { + private _clearPendingInfo(): void { this._setPendingInfo('' /* suggestedDisplayValue */, -1 /* currentPendingValueValidIndex */, '' /* currentPendingValue */); } @@ -1287,7 +1331,7 @@ export class ComboBox extends BaseComponent { * @param currentPendingValueValidIndex - new pending value index to set * @param suggestedDisplayValue - new suggest display value to set */ - private _setPendingInfo(currentPendingValue: string, currentPendingValueValidIndex: number, suggestedDisplayValue: string) { + private _setPendingInfo(currentPendingValue: string, currentPendingValueValidIndex: number, suggestedDisplayValue: string): void { this.setState({ currentPendingValue: currentPendingValue, currentPendingValueValidIndex: currentPendingValueValidIndex, @@ -1300,14 +1344,14 @@ export class ComboBox extends BaseComponent { * Set the pending info from the given index * @param index - the index to set the pending info from */ - private _setPendingInfoFromIndex(index: number) { + private _setPendingInfoFromIndex(index: number): void { const { currentOptions } = this.state; if (index >= 0 && index < currentOptions.length) { const option = currentOptions[index]; - this._setPendingInfo(option.text, index, option.text); + this._setPendingInfo(this._getPreviewText(option), index, this._getPreviewText(option)); } else { this._clearPendingInfo(); } @@ -1319,9 +1363,8 @@ export class ComboBox extends BaseComponent { * @param index - the index to search from * @param searchDirection - the direction to search */ - private _setPendingInfoFromIndexAndDirection(index: number, searchDirection: SearchDirection) { + private _setPendingInfoFromIndexAndDirection(index: number, searchDirection: SearchDirection): void { const { - isOpen, currentOptions } = this.state; @@ -1354,7 +1397,7 @@ export class ComboBox extends BaseComponent { } } - private _notifyPendingValueChanged(prevState: IComboBoxState) { + private _notifyPendingValueChanged(prevState: IComboBoxState): void { const { onPendingValueChanged } = this.props; if (!onPendingValueChanged) { @@ -1392,7 +1435,7 @@ export class ComboBox extends BaseComponent { /** * Sets the isOpen state and updates focusInputAfterClose */ - private _setOpenStateAndFocusOnClose(isOpen: boolean, focusInputAfterClose: boolean) { + private _setOpenStateAndFocusOnClose(isOpen: boolean, focusInputAfterClose: boolean): void { this._focusInputAfterClose = focusInputAfterClose; this.setState({ isOpen: isOpen @@ -1412,8 +1455,7 @@ export class ComboBox extends BaseComponent { const { isOpen, currentOptions, - currentPendingValueValidIndexOnHover, - selectedIndices + currentPendingValueValidIndexOnHover } = this.state; if (disabled) { @@ -1425,7 +1467,7 @@ export class ComboBox extends BaseComponent { switch (ev.which) { case KeyCodes.enter: - this._submitPendingValue(); + this._submitPendingValue(ev); if (this.props.multiSelect && isOpen) { this.setState({ currentPendingValueValidIndex: index @@ -1453,7 +1495,7 @@ export class ComboBox extends BaseComponent { case KeyCodes.tab: // On enter submit the pending value if (!this.props.multiSelect) { - this._submitPendingValue(); + this._submitPendingValue(ev); } // If we are not allowing freeform @@ -1604,7 +1646,7 @@ export class ComboBox extends BaseComponent { ev.preventDefault(); } - private _onOptionMouseEnter(index: number) { + private _onOptionMouseEnter(index: number): void { if (!this._isScrollIdle) { return; } @@ -1614,7 +1656,7 @@ export class ComboBox extends BaseComponent { }); } - private _onOptionMouseMove(index: number) { + private _onOptionMouseMove(index: number): void { if (!this._isScrollIdle || this.state.currentPendingValueValidIndexOnHover === index) { return; } @@ -1639,7 +1681,7 @@ export class ComboBox extends BaseComponent { * eating the required key event when disabled * @param ev - the keyboard event that was fired */ - private _handleInputWhenDisabled(ev: React.KeyboardEvent | null) { + private _handleInputWhenDisabled(ev: React.KeyboardEvent | null): void { // If we are disabled, close the menu (if needed) // and eat all keystokes other than TAB or ESC if (this.props.disabled) { @@ -1688,7 +1730,7 @@ export class ComboBox extends BaseComponent { * Get the styles for the current option. * @param item Item props for the current option */ - private _getCaretButtonStyles() { + private _getCaretButtonStyles(): IButtonStyles { const { caretDownButtonStyles: customCaretDownButtonStyles } = this.props; return getCaretDownButtonStyles(this.props.theme!, customCaretDownButtonStyles); } @@ -1697,7 +1739,7 @@ export class ComboBox extends BaseComponent { * Get the styles for the current option. * @param item Item props for the current option */ - private _getCurrentOptionStyles(item: IComboBoxOption) { + private _getCurrentOptionStyles(item: IComboBoxOption): Partial { const { comboBoxOptionStyles: customStylesForAllOptions } = this.props; const { styles: customStylesForCurrentOption } = item; @@ -1708,8 +1750,8 @@ export class ComboBox extends BaseComponent { * Get the aria-activedescendant value for the comboxbox. * @returns the id of the current focused combo item, otherwise the id of the currently selected element, null otherwise */ - private _getAriaActiveDescentValue(): string | null { - let descendantText = (this.state.isOpen && this.state.selectedIndices && this.state.selectedIndices.length >= 0 ? (this._id + '-list' + this.state.selectedIndices[0]) : null); + private _getAriaActiveDescentValue(): string | undefined { + let descendantText = (this.state.isOpen && this.state.selectedIndices && this.state.selectedIndices.length >= 0 ? (this._id + '-list' + this.state.selectedIndices[0]) : undefined); if (this.state.isOpen && this.state.focused && this.state.currentPendingValueValidIndex !== -1) { descendantText = (this._id + '-list' + this.state.currentPendingValueValidIndex); } @@ -1721,7 +1763,7 @@ export class ComboBox extends BaseComponent { * @returns 'inline' if auto-complete automatically dynamic, 'both' if we have a list of possible values to pick from and can * dynamically populate input, and 'none' if auto-complete is not enabled as we can't give user inputs. */ - private _getAriaAutoCompleteValue(): string { + private _getAriaAutoCompleteValue(): 'none' | 'inline' | 'list' | 'both' | undefined { const autoComplete = !this.props.disabled && this.props.autoComplete === 'on'; return autoComplete ? (this.props.allowFreeform ? 'inline' : 'both') : 'none'; } @@ -1764,4 +1806,11 @@ export class ComboBox extends BaseComponent { return retKeys; } + + // For scenarios where the option's text prop contains embedded styles, we use the option's + // ariaLabel value as the text in the input and for autocomplete matching. We know to use this + // when the useAriaLabelAsText prop is set to true + private _getPreviewText(item: IComboBoxOption): string { + return item.useAriaLabelAsText && item.ariaLabel ? item.ariaLabel : item.text; + } } diff --git a/packages/office-ui-fabric-react/src/components/ComboBox/ComboBox.types.ts b/packages/office-ui-fabric-react/src/components/ComboBox/ComboBox.types.ts index f73bd90d5a2dc..af659255ea9af 100644 --- a/packages/office-ui-fabric-react/src/components/ComboBox/ComboBox.types.ts +++ b/packages/office-ui-fabric-react/src/components/ComboBox/ComboBox.types.ts @@ -26,6 +26,13 @@ export interface IComboBoxOption extends ISelectableOption { * the prop comboBoxOptionStyles */ styles?: Partial; + + /** + * In scenarios where embedded data is used at the text prop, we will use the ariaLabel prop + * to set the aria-label and preview text. Default to false + * @default false; + */ + useAriaLabelAsText?: boolean; } export interface IComboBoxProps extends ISelectableDroppableTextProps { @@ -46,7 +53,7 @@ export interface IComboBoxProps extends ISelectableDroppableTextProps * 2) a manually edited value is submitted. In this case there may not be a matched option if allowFreeform is also true * (and hence only value would be true, the other parameter would be null in this case) */ - onChanged?: (option?: IComboBoxOption, index?: number, value?: string) => void; + onChanged?: (option?: IComboBoxOption, index?: number, value?: string, submitPendingValueEvent?: any) => void; /** * Callback issued when the user changes the pending value in ComboBox diff --git a/packages/office-ui-fabric-react/src/components/ComboBox/ComboBoxPage.tsx b/packages/office-ui-fabric-react/src/components/ComboBox/ComboBoxPage.tsx index 5ef42f2043090..264a0698ee632 100644 --- a/packages/office-ui-fabric-react/src/components/ComboBox/ComboBoxPage.tsx +++ b/packages/office-ui-fabric-react/src/components/ComboBox/ComboBoxPage.tsx @@ -3,7 +3,8 @@ import { ExampleCard, IComponentDemoPageProps, ComponentPage, - PropertiesTableSet + PropertiesTableSet, + PageMarkdown, } from '@uifabric/example-app-base'; import { ComboBoxBasicExample } from './examples/ComboBox.Basic.Example'; import { ComboBoxCustomStyledExample } from './examples/ComboBox.CustomStyled.Example'; @@ -14,11 +15,12 @@ const ComboBoxBasicExampleCode = require('!raw-loader!office-ui-fabric-react/src const ComboBoxCustomStyledExampleCode = require('!raw-loader!office-ui-fabric-react/src/components/ComboBox/examples/ComboBox.CustomStyled.Example.tsx') as string; export class ComboBoxPage extends React.Component { - public render() { + public render(): JSX.Element { return ( @@ -38,26 +40,22 @@ export class ComboBoxPage extends React.Component { /> } overview={ -
    -

    - A ComboBox is a list in which the selected item is always visible, and the others are visible on demand by clicking a drop-down button or by typing in the input (unless allowFreeform and autoComplete are both false). They are used to simplify the design and make a choice within the UI. When closed, only the selected item is visible. When users click the drop-down button, all the options become visible. To change the value, users open the list and click another value or use the arrow keys (up and down) to select a new value. When collapsed if autoComplete and/or allowFreeform are true, the user can select a new value by typing. -

    -
    + + { require('!raw-loader!office-ui-fabric-react/src/components/ComboBox/docs/ComboBoxOverview.md') } + } bestPractices={
    } dos={ -
    -
      -
    • Use a ComboBox when there are multiple choices that can be collapsed under one title. Or if the list of items is long or when space is constrained.
    • -
    • ComboBoxs contain shortened statements or words.
    • -
    • Use a ComboBox when the selected option is more important than the alternatives (in contrast to radio buttons where all the choices are visible putting more emphasis on the other options).
    • -
    -
    + + { require('!raw-loader!office-ui-fabric-react/src/components/ComboBox/docs/ComboBoxDos.md') } + } donts={ -
    + + { require('!raw-loader!office-ui-fabric-react/src/components/ComboBox/docs/ComboBoxDonts.md') } + } isHeaderVisible={ this.props.isHeaderVisible } componentStatus={ diff --git a/packages/office-ui-fabric-react/src/components/ComboBox/VirtualizedComboBox.tsx b/packages/office-ui-fabric-react/src/components/ComboBox/VirtualizedComboBox.tsx index fc855b7ed0bde..cd78735bf8aed 100644 --- a/packages/office-ui-fabric-react/src/components/ComboBox/VirtualizedComboBox.tsx +++ b/packages/office-ui-fabric-react/src/components/ComboBox/VirtualizedComboBox.tsx @@ -12,14 +12,14 @@ export class VirtualizedComboBox extends BaseComponent imple private _list = createRef(); public dismissMenu(): void { - if (this._comboBox.value) { - return this._comboBox.value.dismissMenu(); + if (this._comboBox.current) { + return this._comboBox.current.dismissMenu(); } } public focus() { - if (this._comboBox.value) { - this._comboBox.value.focus(); + if (this._comboBox.current) { + this._comboBox.current.focus(); return true; } @@ -55,6 +55,6 @@ export class VirtualizedComboBox extends BaseComponent imple protected _onScrollToItem = (itemIndex: number): void => { // We are using the List component, call scrollToIndex - this._list.value && this._list.value.scrollToIndex(itemIndex); + this._list.current && this._list.current.scrollToIndex(itemIndex); } } \ No newline at end of file diff --git a/packages/office-ui-fabric-react/src/components/ComboBox/__snapshots__/ComboBox.test.tsx.snap b/packages/office-ui-fabric-react/src/components/ComboBox/__snapshots__/ComboBox.test.tsx.snap index 4021026e6c9e7..211b3f2f3ca29 100644 --- a/packages/office-ui-fabric-react/src/components/ComboBox/__snapshots__/ComboBox.test.tsx.snap +++ b/packages/office-ui-fabric-react/src/components/ComboBox/__snapshots__/ComboBox.test.tsx.snap @@ -106,7 +106,7 @@ exports[`ComboBox Renders ComboBox correctly 1`] = ` id="ComboBox0wrapper" > \ No newline at end of file diff --git a/packages/office-ui-fabric-react/src/components/ComboBox/docs/ComboBoxDos.md b/packages/office-ui-fabric-react/src/components/ComboBox/docs/ComboBoxDos.md new file mode 100644 index 0000000000000..f610e8facabd7 --- /dev/null +++ b/packages/office-ui-fabric-react/src/components/ComboBox/docs/ComboBoxDos.md @@ -0,0 +1,3 @@ +- Use a ComboBox when there are multiple choices that can be collapsed under one title. Or if the list of items is long or when space is constrained. +- ComboBoxs contain shortened statements or words. +- Use a ComboBox when the selected option is more important than the alternatives (in contrast to radio buttons where all the choices are visible putting more emphasis on the other options). \ No newline at end of file diff --git a/packages/office-ui-fabric-react/src/components/ComboBox/docs/ComboBoxOverview.md b/packages/office-ui-fabric-react/src/components/ComboBox/docs/ComboBoxOverview.md new file mode 100644 index 0000000000000..447c617239e24 --- /dev/null +++ b/packages/office-ui-fabric-react/src/components/ComboBox/docs/ComboBoxOverview.md @@ -0,0 +1 @@ +A ComboBox is a list in which the selected item is always visible, and the others are visible on demand by clicking a drop-down button or by typing in the input (unless allowFreeform and autoComplete are both false). They are used to simplify the design and make a choice within the UI. When closed, only the selected item is visible. When users click the drop-down button, all the options become visible. To change the value, users open the list and click another value or use the arrow keys (up and down) to select a new value. When collapsed if autoComplete and/or allowFreeform are true, the user can select a new value by typing. \ No newline at end of file diff --git a/packages/office-ui-fabric-react/src/components/ComboBox/examples/ComboBox.Basic.Example.tsx b/packages/office-ui-fabric-react/src/components/ComboBox/examples/ComboBox.Basic.Example.tsx index f66f68146c860..6bcecaf358a83 100644 --- a/packages/office-ui-fabric-react/src/components/ComboBox/examples/ComboBox.Basic.Example.tsx +++ b/packages/office-ui-fabric-react/src/components/ComboBox/examples/ComboBox.Basic.Example.tsx @@ -13,22 +13,22 @@ import { IComboBox } from '../ComboBox.types'; import { PrimaryButton } from '../../../Button'; const INITIAL_OPTIONS = -[ - { key: 'Header', text: 'Theme Fonts', itemType: SelectableOptionMenuItemType.Header }, - { key: 'A', text: 'Arial Black', fontFamily: '"Arial Black", "Arial Black_MSFontService", sans-serif' }, - { key: 'B', text: 'Time New Roman', fontFamily: '"Times New Roman", "Times New Roman_MSFontService", serif' }, - { key: 'C', text: 'Comic Sans MS', fontFamily: '"Comic Sans MS", "Comic Sans MS_MSFontService", fantasy' }, - { key: 'C1', text: 'Calibri', fontFamily: 'Calibri, Calibri_MSFontService, sans-serif' }, - { key: 'divider_2', text: '-', itemType: SelectableOptionMenuItemType.Divider }, - { key: 'Header1', text: 'Other Options', itemType: SelectableOptionMenuItemType.Header }, - { key: 'D', text: 'Option d' }, - { key: 'E', text: 'Option e' }, - { key: 'F', text: 'Option f' }, - { key: 'G', text: 'Option g' }, - { key: 'H', text: 'Option h' }, - { key: 'I', text: 'Option i' }, - { key: 'J', text: 'Option j' } -]; + [ + { key: 'Header', text: 'Theme Fonts', itemType: SelectableOptionMenuItemType.Header }, + { key: 'A', text: 'Arial Black', fontFamily: '"Arial Black", "Arial Black_MSFontService", sans-serif' }, + { key: 'B', text: 'Time New Roman', fontFamily: '"Times New Roman", "Times New Roman_MSFontService", serif' }, + { key: 'C', text: 'Comic Sans MS', fontFamily: '"Comic Sans MS", "Comic Sans MS_MSFontService", fantasy' }, + { key: 'C1', text: 'Calibri', fontFamily: 'Calibri, Calibri_MSFontService, sans-serif' }, + { key: 'divider_2', text: '-', itemType: SelectableOptionMenuItemType.Divider }, + { key: 'Header1', text: 'Other Options', itemType: SelectableOptionMenuItemType.Header }, + { key: 'D', text: 'Option d' }, + { key: 'E', text: 'Option e' }, + { key: 'F', text: 'Option f' }, + { key: 'G', text: 'Option g' }, + { key: 'H', text: 'Option h' }, + { key: 'I', text: 'Option i' }, + { key: 'J', text: 'Option j' } + ]; export class ComboBoxBasicExample extends React.Component<{}, { // For controled single select @@ -85,9 +85,9 @@ export class ComboBoxBasicExample extends React.Component<{}, { } } - public render() { + public render(): JSX.Element { const { options, selectedOptionKey, value } = this.state; - const { optionsMulti, selectedOptionKeys, valueMulti } = this.state; + const { optionsMulti } = this.state; return (
    @@ -129,7 +129,7 @@ export class ComboBoxBasicExample extends React.Component<{}, { onFocus={ () => console.log('onFocus called') } onBlur={ () => console.log('onBlur called') } onMenuOpen={ () => console.log('ComboBox menu opened') } - // tslint:enable:jsx-no-lambda + // tslint:enable:jsx-no-lambda /> console.log('onFocus called') } onBlur={ () => console.log('onBlur called') } onMenuOpen={ () => console.log('ComboBox menu opened') } - // tslint:enable:jsx-no-lambda + // tslint:enable:jsx-no-lambda />
    @@ -341,7 +341,7 @@ export class ComboBoxBasicExample extends React.Component<{}, { this.setState({ optionsMulti: INITIAL_OPTIONS, - selectedOptionKeys: [ 'C1' ], + selectedOptionKeys: ['C1'], valueMulti: undefined }); @@ -407,7 +407,7 @@ export class ComboBoxBasicExample extends React.Component<{}, { this._basicCombobox.focus(true); } - private _basicComboBoxComponentRef = (component: IComboBox) => { + private _basicComboBoxComponentRef = (component: IComboBox): void => { this._basicCombobox = component; } } diff --git a/packages/office-ui-fabric-react/src/components/ComboBox/examples/ComboBox.CustomStyled.Example.tsx b/packages/office-ui-fabric-react/src/components/ComboBox/examples/ComboBox.CustomStyled.Example.tsx index 6f1ae3b456899..134d4fecc1978 100644 --- a/packages/office-ui-fabric-react/src/components/ComboBox/examples/ComboBox.CustomStyled.Example.tsx +++ b/packages/office-ui-fabric-react/src/components/ComboBox/examples/ComboBox.CustomStyled.Example.tsx @@ -45,7 +45,7 @@ export class ComboBoxCustomStyledExample extends React.Component { }, ]; - public render() { + public render(): JSX.Element { return (
    { items={ items } /> ) as React.Component; - document.body.appendChild(ReactDOM.findDOMNode(renderedContent)); + document.body.appendChild(ReactDOM.findDOMNode(renderedContent) as Element); const [item1, item2, item3] = ['.item1', '.item2', '.item3'].map(i => document.querySelector(i)!.children[0]); expect(item1.getAttribute('aria-setsize')).toBe('3'); @@ -107,7 +105,7 @@ describe('CommandBar', () => { items={ items } /> ) as React.Component; - document.body.appendChild(ReactDOM.findDOMNode(renderedContent)); + document.body.appendChild(ReactDOM.findDOMNode(renderedContent) as Element); const menuItem = (ReactDOM.findDOMNode(renderedContent) as HTMLElement).querySelector('button') as HTMLButtonElement; ReactTestUtils.Simulate.click(menuItem); @@ -137,7 +135,7 @@ describe('CommandBar', () => { items={ items } /> ) as React.Component; - document.body.appendChild(ReactDOM.findDOMNode(renderedContent)); + document.body.appendChild(ReactDOM.findDOMNode(renderedContent) as Element); const menuItem = (ReactDOM.findDOMNode(renderedContent) as HTMLElement).querySelector('button') as HTMLButtonElement; ReactTestUtils.Simulate.click(menuItem); diff --git a/packages/office-ui-fabric-react/src/components/CommandBar/CommandBar.tsx b/packages/office-ui-fabric-react/src/components/CommandBar/CommandBar.tsx index 223dc0968e366..3456b7e577bf4 100644 --- a/packages/office-ui-fabric-react/src/components/CommandBar/CommandBar.tsx +++ b/packages/office-ui-fabric-react/src/components/CommandBar/CommandBar.tsx @@ -67,13 +67,13 @@ export class CommandBar extends BaseComponent @@ -210,7 +210,7 @@ export class CommandBar extends BaseComponent; } - private _asyncMeasure() { + private _asyncMeasure(): void { this._async.requestAnimationFrame(() => { this._updateItemMeasurements(); this._updateRenderedItems(); }); } - private _updateItemMeasurements() { + private _updateItemMeasurements(): void { // the generated width for overflow is 35 in chrome, 38 in IE, but the actual value is 41.5 - if (this._overflow.value || (this.props.overflowItems && this.props.overflowItems.length)) { + if (this._overflow.current || (this.props.overflowItems && this.props.overflowItems.length)) { this._overflowWidth = OVERFLOW_WIDTH; } else { this._overflowWidth = 0; @@ -354,12 +354,12 @@ export class CommandBar extends BaseComponent) => void { + private _onItemClick(item: IContextualMenuItem): (ev: React.MouseEvent) => void { return (ev: React.MouseEvent): void => { if (item.inactive) { return; @@ -453,7 +453,7 @@ export class CommandBar extends BaseComponent { - const { value: commandSurface } = this._commandSurface; + const { current: commandSurface } = this._commandSurface; if (!ev || !ev.relatedTarget || commandSurface && !commandSurface.contains(ev.relatedTarget as HTMLElement)) { const { contextualMenuProps } = this.state; @@ -483,7 +483,7 @@ export class CommandBar extends BaseComponent { - public render() { + public render(): JSX.Element { const cmdBarParamsTextAndIcons: any = { items, overflowItems, farItems }; return ( - + @@ -46,45 +48,27 @@ export class CommandBarPage extends React.Component /> } overview={ -
    -

    - CommandBar is a surface that houses commands that operate on the content of the window, panel, or parent region it resides above. They are one of the most visible and recognizable ways to surface commands, and can be an intuitive method for interacting with content on the page. However, if overloaded or poorly organized, they can be difficult to use and hide valuable commands from your user. CommandBars can also display a search box for finding content; hold simple commands as well as menus; and display the status of ongoing actions. -

    -

    - Commands should be sorted in order of importance, from left to right or right to left depending on the culture. Secondarily, organize commands in logical groupings for easier recall. CommandBars work best when they display no more than 5-7 commands. This helps users quickly find your most valuable features. If you need to show more commands, consider using the overflow menu. If you need to render status, or viewing controls, these go on the right side of the CommandBar (or left side if in a left to right experience). Do not display more than 2-3 items on the right side as it will make the overall CommandBar difficult to parse. -

    -

    - All command items should have an icon and a label. Commands can render as labels only as well. In smaller widths, commands can just use icon only, but only for the most recognizable and frequently used commands. All other commands should go into an overflow where text labels can be shown. -

    -
    + + { require('!raw-loader!office-ui-fabric-react/src/components/CommandBar/docs/CommandBarOverview.md') } + } bestPractices={
    } dos={ -
    -
      -
    • Sort commands in order of importance from left to right or right to left depending on the culture.
    • -
    • Organize commands into logical groupings.
    • -
    • Display no more than 5-7 commands.
    • -
    • Use overflow to house less frequently-used commands.
    • -
    • In small breakpoints, only have the most recognizable commands render as icon only.
    • -
    -
    + + { require('!raw-loader!office-ui-fabric-react/src/components/CommandBar/docs/CommandBarDos.md') } + } donts={ -
    -
      -
    • Fill the command bar completely from left to right.
    • -
    • Use icons only for commands in larger widths.
    • -
    • Display more than 2-3 items on the right side of the bar (or left side in left to right experiences).
    • -
    -
    + + { require('!raw-loader!office-ui-fabric-react/src/components/CommandBar/docs/CommandBarDonts.md') } + } isHeaderVisible={ this.props.isHeaderVisible } componentStatus={ } /> diff --git a/packages/office-ui-fabric-react/src/components/CommandBar/__snapshots__/CommandBar.test.tsx.snap b/packages/office-ui-fabric-react/src/components/CommandBar/__snapshots__/CommandBar.test.tsx.snap index f4d10a32c15ac..cdfa05f114431 100644 --- a/packages/office-ui-fabric-react/src/components/CommandBar/__snapshots__/CommandBar.test.tsx.snap +++ b/packages/office-ui-fabric-react/src/components/CommandBar/__snapshots__/CommandBar.test.tsx.snap @@ -9,7 +9,6 @@ exports[`CommandBar renders CommandBar correctly 1`] = ` aria-labelledby={undefined} className="ms-FocusZone" data-focuszone-id="FocusZone1" - onClick={[Function]} onFocus={[Function]} onKeyDown={[Function]} onMouseDownCapture={[Function]} diff --git a/packages/office-ui-fabric-react/src/components/CommandBar/docs/CommandBarDonts.md b/packages/office-ui-fabric-react/src/components/CommandBar/docs/CommandBarDonts.md new file mode 100644 index 0000000000000..f955732f34000 --- /dev/null +++ b/packages/office-ui-fabric-react/src/components/CommandBar/docs/CommandBarDonts.md @@ -0,0 +1,3 @@ +- Fill the command bar completely from left to right. +- Use icons only for commands in larger widths. +- Display more than 2-3 items on the right side of the bar (or left side in left to right experiences). \ No newline at end of file diff --git a/packages/office-ui-fabric-react/src/components/CommandBar/docs/CommandBarDos.md b/packages/office-ui-fabric-react/src/components/CommandBar/docs/CommandBarDos.md new file mode 100644 index 0000000000000..d78a921b03f72 --- /dev/null +++ b/packages/office-ui-fabric-react/src/components/CommandBar/docs/CommandBarDos.md @@ -0,0 +1,5 @@ +- Sort commands in order of importance from left to right or right to left depending on the culture. +- Organize commands into logical groupings. +- Display no more than 5-7 commands. +- Use overflow to house less frequently-used commands. +- In small breakpoints, only have the most recognizable commands render as icon only. \ No newline at end of file diff --git a/packages/office-ui-fabric-react/src/components/CommandBar/docs/CommandBarOverview.md b/packages/office-ui-fabric-react/src/components/CommandBar/docs/CommandBarOverview.md new file mode 100644 index 0000000000000..7ee4004822b8f --- /dev/null +++ b/packages/office-ui-fabric-react/src/components/CommandBar/docs/CommandBarOverview.md @@ -0,0 +1,5 @@ +CommandBar is a surface that houses commands that operate on the content of the window, panel, or parent region it resides above. They are one of the most visible and recognizable ways to surface commands, and can be an intuitive method for interacting with content on the page. However, if overloaded or poorly organized, they can be difficult to use and hide valuable commands from your user. CommandBars can also display a search box for finding content; hold simple commands as well as menus; and display the status of ongoing actions. + +Commands should be sorted in order of importance, from left to right or right to left depending on the culture. Secondarily, organize commands in logical groupings for easier recall. CommandBars work best when they display no more than 5-7 commands. This helps users quickly find your most valuable features. If you need to show more commands, consider using the overflow menu. If you need to render status, or viewing controls, these go on the right side of the CommandBar (or left side if in a left to right experience). Do not display more than 2-3 items on the right side as it will make the overall CommandBar difficult to parse. + +All command items should have an icon and a label. Commands can render as labels only as well. In smaller widths, commands can just use icon only, but only for the most recognizable and frequently used commands. All other commands should go into an overflow where text labels can be shown. diff --git a/packages/office-ui-fabric-react/src/components/CommandBar/examples/CommandBar.Basic.Example.tsx b/packages/office-ui-fabric-react/src/components/CommandBar/examples/CommandBar.Basic.Example.tsx index 85e85d209c54a..43d2d538c1abe 100644 --- a/packages/office-ui-fabric-react/src/components/CommandBar/examples/CommandBar.Basic.Example.tsx +++ b/packages/office-ui-fabric-react/src/components/CommandBar/examples/CommandBar.Basic.Example.tsx @@ -15,7 +15,7 @@ export class CommandBarBasicExample extends React.Component { }; } - public render() { + public render(): JSX.Element { const { items, overflowItems, farItems } = this.props; const { isSearchBoxVisible: searchBoxVisible, diff --git a/packages/office-ui-fabric-react/src/components/CommandBar/examples/CommandBar.Customization.Example.tsx b/packages/office-ui-fabric-react/src/components/CommandBar/examples/CommandBar.Customization.Example.tsx index 0567f01908c54..d13168457c96e 100644 --- a/packages/office-ui-fabric-react/src/components/CommandBar/examples/CommandBar.Customization.Example.tsx +++ b/packages/office-ui-fabric-react/src/components/CommandBar/examples/CommandBar.Customization.Example.tsx @@ -17,7 +17,7 @@ export class CommandBarCustomizationExample extends React.Component<{}, ISplitDr this.state = { isContextMenuShown: false }; } - public render() { + public render(): JSX.Element { return (
    { + private _renderSplitButtonMenuItem = (item: IContextualMenuItem): JSX.Element => { const darkerBG = this.state.isContextMenuShown && styles.darkerBG; const dropDownButtonClass = css( diff --git a/packages/office-ui-fabric-react/src/components/CommandBar/examples/CommandBar.NonFocusable.Example.tsx b/packages/office-ui-fabric-react/src/components/CommandBar/examples/CommandBar.NonFocusable.Example.tsx index 47ede9e27af46..49c7bab72c934 100644 --- a/packages/office-ui-fabric-react/src/components/CommandBar/examples/CommandBar.NonFocusable.Example.tsx +++ b/packages/office-ui-fabric-react/src/components/CommandBar/examples/CommandBar.NonFocusable.Example.tsx @@ -3,7 +3,7 @@ import { CommandBar } from 'office-ui-fabric-react/lib/CommandBar'; import { itemsNonFocusable, farItemsNonFocusable } from './data-nonFocusable'; export class CommandBarNonFocusableItemsExample extends React.Component { - public render() { + public render(): JSX.Element { return (
    { // Alter the Layer's prototype so that we can confirm that it mounts before the contextualmenu mounts. /* tslint:disable:no-function-expression */ - Layer.prototype.componentDidMount = function (componentDidMount) { - return function () { + Layer.prototype.componentDidMount = function (componentDidMount): () => void { + return function (): void { if (menuMounted) { menuMountedFirst = true; } diff --git a/packages/office-ui-fabric-react/src/components/ContextualMenu/ContextualMenu.tsx b/packages/office-ui-fabric-react/src/components/ContextualMenu/ContextualMenu.tsx index a60ecc7fb1777..447d4f49ecd82 100644 --- a/packages/office-ui-fabric-react/src/components/ContextualMenu/ContextualMenu.tsx +++ b/packages/office-ui-fabric-react/src/components/ContextualMenu/ContextualMenu.tsx @@ -125,25 +125,34 @@ export class ContextualMenu extends BaseComponent this._previousActiveElement!.focus(), 0); + // Note: Cannot be replaced by this._async.setTimout because those will be removed by the time this is called. + setTimeout(() => { this._previousActiveElement && this._previousActiveElement!.focus(); }, 0); } if (this.props.onMenuDismissed) { @@ -270,6 +280,7 @@ export class ContextualMenu extends BaseComponent