import * as React from 'react';
import {
ChoiceGroup,
CommandBar,
ICommandBarItemProps,
createTheme,
Customizer,
Dialog,
DialogFooter,
DialogType,
getTheme,
IPalette,
IStackComponent,
IStackStylesReturnType,
IStackTokens,
ITheme,
Stack,
Toggle,
Text,
} from '@fluentui/react';
import { DefaultButton, PrimaryButton } from '@fluentui/react/lib/Button';
import { CollapsibleSectionRecursiveExample } from '@fluentui/react-examples/lib/react-experiments/CollapsibleSection/CollapsibleSection.Recursive.Example';
import { ThemeProvider as DeprecatedThemeProvider } from '@fluentui/foundation-legacy';
// Workaround to prevent errors on usage of ThemeProvider, without disabling all deprecation checks
// eslint-disable-next-line deprecation/deprecation
const ThemeProvider = DeprecatedThemeProvider;
const regionStyles: IStackComponent['styles'] = (props, theme): IStackStylesReturnType => ({
root: {
backgroundColor: theme.semanticColors.bodyBackground,
color: theme.semanticColors.bodyText,
},
});
const invertedPrimaryPalette: IPalette = {
themePrimary: '#ffffff',
themeLighterAlt: '#767676',
themeLighter: '#a6a6a6',
themeLight: '#c8c8c8',
themeTertiary: '#d0d0d0',
themeSecondary: '#dadada',
themeDarkAlt: '#eaeaea',
themeDark: '#f4f4f4',
themeDarker: '#f8f8f8',
neutralLighterAlt: '#097dd6',
neutralLighter: '#1282d7',
neutralLight: '#2089da',
neutralQuaternaryAlt: '#288edc',
neutralQuaternary: '#3092dd',
neutralTertiaryAlt: '#4fa3e3',
neutralTertiary: '#c8c8c8',
neutralSecondary: '#d0d0d0',
neutralPrimaryAlt: '#dadada',
neutralPrimary: '#ffffff',
neutralDark: '#f4f4f4',
black: '#f8f8f8',
white: '#0078d4',
// TODO: not generated by ThemeGeneratorPage:
blackTranslucent40: 'rgba(0,0,0,.4)',
neutralSecondaryAlt: '#767676',
accent: '#0078d4',
whiteTranslucent40: 'rgba(255,255,255,.4)',
yellowDark: '#d29200',
yellow: '#ffb900',
yellowLight: '#fff100',
orange: '#d83b01',
orangeLight: '#ea4300',
orangeLighter: '#ff8c00',
redDark: '#a80000',
red: '#e81123',
magentaDark: '#5c005c',
magenta: '#b4009e',
magentaLight: '#e3008c',
purpleDark: '#32145a',
purple: '#5c2d91',
purpleLight: '#b4a0ff',
blueDark: '#002050',
blueMid: '#00188f',
blue: '#0078d4',
blueLight: '#00bcf2',
tealDark: '#004b50',
teal: '#008272',
tealLight: '#00b294',
greenDark: '#004b1c',
green: '#107c10',
greenLight: '#bad80a',
};
const invertedDefaultPalette: IPalette = {
themePrimary: '#ffffff',
themeLighterAlt: '#767676',
themeLighter: '#a6a6a6',
themeLight: '#c8c8c8',
themeTertiary: '#d0d0d0',
themeSecondary: '#dadada',
themeDarkAlt: '#eaeaea',
themeDark: '#f4f4f4',
themeDarker: '#f8f8f8',
neutralLighterAlt: '#0b0b0b',
neutralLighter: '#151515',
neutralLight: '#252525',
neutralQuaternaryAlt: '#2f2f2f',
neutralQuaternary: '#373737',
neutralTertiaryAlt: '#595959',
neutralTertiary: '#c8c8c8',
neutralSecondary: '#d0d0d0',
neutralPrimaryAlt: '#dadada',
neutralPrimary: '#ffffff',
neutralDark: '#f4f4f4',
black: '#f8f8f8',
white: '#000000',
blackTranslucent40: 'rgba(0,0,0,.4)',
neutralSecondaryAlt: '#767676',
accent: '#0078d4',
whiteTranslucent40: 'rgba(255,255,255,.4)',
yellowDark: '#d29200',
yellow: '#ffb900',
yellowLight: '#fff100',
orange: '#d83b01',
orangeLight: '#ea4300',
orangeLighter: '#ff8c00',
redDark: '#a80000',
red: '#e81123',
magentaDark: '#5c005c',
magenta: '#b4009e',
magentaLight: '#e3008c',
purpleDark: '#32145a',
purple: '#5c2d91',
purpleLight: '#b4a0ff',
blueDark: '#002050',
blueMid: '#00188f',
blue: '#0078d4',
blueLight: '#00bcf2',
tealDark: '#004b50',
teal: '#008272',
tealLight: '#00b294',
greenDark: '#004b1c',
green: '#107c10',
greenLight: '#bad80a',
};
const defaultTheme: ITheme = getTheme(true);
const invertedDefaultTheme: ITheme = createTheme({
palette: invertedDefaultPalette,
semanticColors: {
bodyText: defaultTheme.palette.white,
bodyBackground: defaultTheme.palette.neutralPrimary,
},
});
const invertedPrimaryTheme: ITheme = createTheme({
palette: invertedPrimaryPalette,
semanticColors: {
bodyText: defaultTheme.palette.white,
bodyBackground: defaultTheme.palette.themePrimary,
},
});
const schemeThemeCustom: ITheme = {
...defaultTheme,
schemes: {
default: defaultTheme,
neutral: defaultTheme,
soft: invertedPrimaryTheme,
strong: invertedDefaultTheme,
},
};
export interface IThemingExampleState {
bodyToggle: boolean;
sideToggle: boolean;
topToggle: boolean;
}
export class ThemingSchemesCustomExample extends React.Component<{}, IThemingExampleState> {
public state: IThemingExampleState = {
bodyToggle: false,
sideToggle: false,
topToggle: false,
};
public render(): JSX.Element {
// eslint-disable-next-line deprecation/deprecation
return {this._renderSchemedComponents()};
}
/**
* Render various components only using scheme names (no Customizers.)
*/
private _renderSchemedComponents(): JSX.Element {
const bodyScheme = this.state.bodyToggle ? 'soft' : 'neutral';
const sideScheme = this.state.sideToggle ? 'neutral' : 'strong';
const topScheme = this.state.topToggle ? 'strong' : 'soft';
const bodyCaption = 'Scheme: ' + bodyScheme;
const sideCaption = 'Scheme: ' + sideScheme;
const topCaption = 'Scheme: ' + topScheme;
const stackTokens: IStackTokens = { childrenGap: 10 };
// TODO: Even though this styles function is the same for all regions, it has to be provided whenever the scheme
// is changed to apply the new semanticColors. Is this the best way we can do this?
return (
{sideCaption}
{topCaption}
{bodyCaption}
);
}
private _toggleBody = () => {
this.setState((state: IThemingExampleState) => this.setState({ bodyToggle: !state.bodyToggle }));
};
private _toggleSide = () => {
this.setState((state: IThemingExampleState) => this.setState({ sideToggle: !state.sideToggle }));
};
private _toggleTop = () => {
this.setState((state: IThemingExampleState) => this.setState({ topToggle: !state.topToggle }));
};
}
// eslint-disable-next-line deprecation/deprecation
const onCommandClick = (ev: any, item?: ICommandBarItemProps) => console.log(item && (item.text || item.name));
const items: ICommandBarItemProps[] = [
{
key: 'newItem',
name: 'New',
iconProps: { iconName: 'Add' },
ariaLabel: 'New. Use left and right arrow keys to navigate',
subMenuProps: {
items: [
{ key: 'emailMessage', name: 'Email message', iconProps: { iconName: 'Mail' } },
{ key: 'calendarEvent', name: 'Calendar event', iconProps: { iconName: 'Calendar' } },
],
},
},
{
key: 'upload',
name: 'Upload',
iconProps: { iconName: 'Upload' },
href: 'https://developer.microsoft.com/en-us/fluentui',
target: '_blank',
},
{ key: 'share', name: 'Share', iconProps: { iconName: 'Share' }, onClick: onCommandClick },
{ key: 'download', name: 'Download', iconProps: { iconName: 'Download' }, onClick: onCommandClick },
];
const overflowItems: ICommandBarItemProps[] = [
{ key: 'move', name: 'Move to...', iconProps: { iconName: 'MoveToFolder' } },
{ key: 'copy', name: 'Copy to...', iconProps: { iconName: 'Copy' } },
{ key: 'rename', name: 'Rename...', iconProps: { iconName: 'Edit' } },
];
const farItems: ICommandBarItemProps[] = [
{ key: 'sort', name: 'Sort', ariaLabel: 'Sort', iconProps: { iconName: 'SortLines' }, onClick: onCommandClick },
{
key: 'tile',
name: 'Grid view',
ariaLabel: 'Grid view',
iconProps: { iconName: 'Tiles' },
iconOnly: true,
onClick: onCommandClick,
},
{
key: 'info',
name: 'Info',
ariaLabel: 'Info',
iconProps: { iconName: 'Info' },
iconOnly: true,
onClick: onCommandClick,
},
];
interface IDialogExampleProps {
buttonText: string;
}
interface IDialogExampleState {
hideDialog: boolean;
}
class DialogExample extends React.Component {
public state: IDialogExampleState = {
hideDialog: true,
};
public render(): JSX.Element {
return (
);
}
private _showDialog = (): void => this.setState({ hideDialog: false });
private _closeDialog = (): void => this.setState({ hideDialog: true });
}