diff --git a/packages/react-components/package.json b/packages/react-components/package.json index 78f583a4f3388..c38532f099345 100644 --- a/packages/react-components/package.json +++ b/packages/react-components/package.json @@ -10,6 +10,9 @@ "type": "git", "url": "https://github.com/microsoft/fluentui" }, + "storybook": { + "url": "https://master--6002298f95a00c00213f4d55.chromatic.com" + }, "license": "MIT", "scripts": { "build": "just-scripts build", diff --git a/packages/react-components/src/DocsComponents/FluentDocsHeader.stories.tsx b/packages/react-components/src/DocsComponents/FluentDocsHeader.stories.tsx index db785df905411..1d07f43c337a6 100644 --- a/packages/react-components/src/DocsComponents/FluentDocsHeader.stories.tsx +++ b/packages/react-components/src/DocsComponents/FluentDocsHeader.stories.tsx @@ -3,6 +3,7 @@ import { FluentGlobals, THEME_ID } from '@fluentui/react-storybook-addon'; import { tokens } from '@fluentui/react-theme'; import { shorthands, makeStyles } from '../index'; import { ThemePicker } from './ThemePicker.stories'; +import { VersionSelector } from './VersionSelector.stories'; const useStyles = makeStyles({ root: { @@ -25,6 +26,7 @@ export const FluentDocsHeader: React.FC<{ storybookGlobals: FluentGlobals }> = ( return (
+
); }; diff --git a/packages/react-components/src/DocsComponents/VersionSelector.stories.tsx b/packages/react-components/src/DocsComponents/VersionSelector.stories.tsx new file mode 100644 index 0000000000000..f1dec1e2415af --- /dev/null +++ b/packages/react-components/src/DocsComponents/VersionSelector.stories.tsx @@ -0,0 +1,93 @@ +import * as React from 'react'; +import { + MenuButton, + Menu, + MenuPopover, + MenuItemRadio, + MenuList, + MenuTrigger, + makeStyles, + MenuProps, + MenuItem, +} from '../index'; +import { version as packageJsonVersion } from '../../package.json'; + +const useStyles = makeStyles({ + menuButton: { + minWidth: '210px', + justifyContent: 'flex-start', + marginLeft: '5px', + }, + chevronIcon: { + marginLeft: 'auto', + }, + menuPopover: { + minWidth: '210px', + zIndex: 1000, + }, + menuList: { + overflowY: 'auto', + maxHeight: '30vh', + }, + menuItemRadio: { + height: 'auto', + paddingTop: '7px', + paddingBottom: '7px', + }, +}); + +const onCheckedValueChange: MenuProps['onCheckedValueChange'] = (e, data) => { + const selectedUrl = data.checkedItems[0] + window.location.search; + if (window.top) { + window.top.location.href = selectedUrl; + } else { + window.location.href = selectedUrl; + } +}; + +/** + * Theme picker used in the react-components docs header + */ +export const VersionSelector: React.FC = () => { + const styles = useStyles(); + const [versions, setVersions] = React.useState([]); + + React.useEffect(() => { + // metadata.json is populated only in Chromatic + // an example of the file is available here: + // https://master--5ccbc373887ca40020446347.chromatic.com/metadata.json + fetch('/metadata.json').then(async response => { + if (response.ok) { + const metadata = await response.json(); + setVersions(Object.entries(metadata.versions)); + } + }); + }, []); + + return ( + v[0] === `v${packageJsonVersion}`) || [], + }} + > + + + Version (v{packageJsonVersion}) + + + + + {versions.length === 0 && ( + Unable to load the list of available versions. + )} + {versions.map(([version, url], index) => ( + + {version} + + ))} + + + + ); +}; diff --git a/packages/react-components/tsconfig.json b/packages/react-components/tsconfig.json index affceae1828ae..5d0fb725bbebb 100644 --- a/packages/react-components/tsconfig.json +++ b/packages/react-components/tsconfig.json @@ -7,7 +7,8 @@ "importHelpers": true, "jsx": "react", "noUnusedLocals": true, - "preserveConstEnums": true + "preserveConstEnums": true, + "resolveJsonModule": true }, "include": [], "files": [],