title | section |
---|---|
Page layout |
demos |
import React from 'react'; import { Avatar, Brand, Button, ButtonVariant, Card, CardBody, Dropdown, DropdownToggle, DropdownItem, DropdownSeparator, Gallery, GalleryItem, KebabToggle, Nav, NavItem, NavList, NavVariants, Page, PageHeader, PageSection, PageSectionVariants, PageSidebar, SkipToContent, TextContent, Text, Toolbar, ToolbarGroup, ToolbarItem } from '@patternfly/react-core'; // make sure you've installed @patternfly/patternfly import accessibleStyles from '@patternfly/react-styles/css/utilities/Accessibility/accessibility'; import spacingStyles from '@patternfly/react-styles/css/utilities/Spacing/spacing'; import { css } from '@patternfly/react-styles'; import { BellIcon, CogIcon } from '@patternfly/react-icons'; import imgBrand from './imgBrand.svg'; import imgAvatar from './imgAvatar.svg';
-
All but the last example set the
isManagedSidebar
prop on the Page component to have the sidebar automatically close for smaller screen widths. You can also manually control this behavior by not adding theisManagedSidebar
prop and instead:- Add an onNavToggle callback to PageHeader
- Pass in a boolean into the isNavOpen prop to PageSidebar
The last example demonstrates this.
-
To make the page take up the full height, it is recommended to set the height of all ancestor elements up to the page component to
100%
import React from 'react';
import {
Avatar,
Brand,
Button,
ButtonVariant,
Dropdown,
DropdownToggle,
DropdownItem,
DropdownSeparator,
KebabToggle,
Nav,
NavGroup,
NavItem,
Page,
PageHeader,
PageSection,
PageSectionVariants,
PageSidebar,
SkipToContent,
TextContent,
Text,
Toolbar,
ToolbarGroup,
ToolbarItem
} from '@patternfly/react-core';
// make sure you've installed @patternfly/patternfly
import accessibleStyles from '@patternfly/react-styles/css/utilities/Accessibility/accessibility';
import spacingStyles from '@patternfly/react-styles/css/utilities/Spacing/spacing';
import { css } from '@patternfly/react-styles';
import { BellIcon, CogIcon } from '@patternfly/react-icons';
import imgBrand from './imgBrand.svg';
import imgAvatar from './imgAvatar.svg';
class PageLayoutDefaultNav extends React.Component {
constructor(props) {
super(props);
this.state = {
isDropdownOpen: false,
isKebabDropdownOpen: false,
activeItem: 0
};
this.onDropdownToggle = isDropdownOpen => {
this.setState({
isDropdownOpen
});
};
this.onDropdownSelect = event => {
this.setState({
isDropdownOpen: !this.state.isDropdownOpen
});
};
this.onKebabDropdownToggle = isKebabDropdownOpen => {
this.setState({
isKebabDropdownOpen
});
};
this.onKebabDropdownSelect = event => {
this.setState({
isKebabDropdownOpen: !this.state.isKebabDropdownOpen
});
};
this.onNavSelect = result => {
this.setState({
activeItem: result.itemId
});
};
}
render() {
const { isDropdownOpen, isKebabDropdownOpen, activeItem } = this.state;
const PageNav = (
<Nav onSelect={this.onNavSelect} aria-label="Nav" theme="dark">
<NavList>
<NavItem itemId={0} isActive={activeItem === 0}>
System Panel
</NavItem>
<NavItem itemId={1} isActive={activeItem === 1}>
Policy
</NavItem>
<NavItem itemId={2} isActive={activeItem === 2}>
Authentication
</NavItem>
<NavItem itemId={3} isActive={activeItem === 3}>
Network Services
</NavItem>
<NavItem itemId={4} isActive={activeItem === 4}>
Server
</NavItem>
</NavList>
</Nav>
);
const kebabDropdownItems = [
<DropdownItem>
<BellIcon /> Notifications
</DropdownItem>,
<DropdownItem>
<CogIcon /> Settings
</DropdownItem>
];
const userDropdownItems = [
<DropdownItem>Link</DropdownItem>,
<DropdownItem component="button">Action</DropdownItem>,
<DropdownItem isDisabled>Disabled link</DropdownItem>,
<DropdownItem isDisabled component="button">
Disabled action
</DropdownItem>,
<DropdownSeparator />,
<DropdownItem>Separated link</DropdownItem>,
<DropdownItem component="button">Separated action</DropdownItem>
];
const PageToolbar = (
<Toolbar>
<ToolbarGroup className={css(accessibleStyles.screenReader, accessibleStyles.visibleOnLg)}>
<ToolbarItem>
<Button id="default-example-uid-01" aria-label="Notifications actions" variant={ButtonVariant.plain}>
<BellIcon />
</Button>
</ToolbarItem>
<ToolbarItem>
<Button id="default-example-uid-02" aria-label="Settings actions" variant={ButtonVariant.plain}>
<CogIcon />
</Button>
</ToolbarItem>
</ToolbarGroup>
<ToolbarGroup>
<ToolbarItem className={css(accessibleStyles.hiddenOnLg, spacingStyles.mr_0)}>
<Dropdown
isPlain
position="right"
onSelect={this.onKebabDropdownSelect}
toggle={<KebabToggle onToggle={this.onKebabDropdownToggle} />}
isOpen={isKebabDropdownOpen}
dropdownItems={kebabDropdownItems}
/>
</ToolbarItem>
<ToolbarItem className={css(accessibleStyles.screenReader, accessibleStyles.visibleOnMd)}>
<Dropdown
isPlain
position="right"
onSelect={this.onDropdownSelect}
isOpen={isDropdownOpen}
toggle={<DropdownToggle onToggle={this.onDropdownToggle}>Kyle Baker</DropdownToggle>}
dropdownItems={userDropdownItems}
/>
</ToolbarItem>
</ToolbarGroup>
</Toolbar>
);
const Header = (
<PageHeader
logo={<Brand src={imgBrand} alt="Patternfly Logo" />}
toolbar={PageToolbar}
avatar={<Avatar src={imgAvatar} alt="Avatar image" />}
showNavToggle
/>
);
const Sidebar = <PageSidebar nav={PageNav} theme="dark" />;
const pageId = 'main-content-page-layout-default-nav';
const PageSkipToContent = <SkipToContent href={`#${pageId}`}>Skip to content</SkipToContent>;
const PageBreadcrumb = (
<Breadcrumb>
<BreadcrumbItem>Section home</BreadcrumbItem>
<BreadcrumbItem to="#">Section title</BreadcrumbItem>
<BreadcrumbItem to="#">Section title</BreadcrumbItem>
<BreadcrumbItem to="#" isActive>
Section landing
</BreadcrumbItem>
</Breadcrumb>
);
return (
<React.Fragment>
<Page
header={Header}
sidebar={Sidebar}
isManagedSidebar
skipToContent={PageSkipToContent}
breadcrumb={PageBreadcrumb}
mainContainerId={pageId}
>
<PageSection variant={PageSectionVariants.light}>
<TextContent>
<Text component="h1">Main title</Text>
<Text component="p">
Body text should be Overpass Regular at 16px. It should have leading of 24px because <br />
of it’s relative line height of 1.5.
</Text>
</TextContent>
</PageSection>
<PageSection>
<Gallery gutter="md">
{Array.apply(0, Array(10)).map((x, i) => (
<GalleryItem key={i}>
<Card>
<CardBody>This is a card</CardBody>
</Card>
</GalleryItem>
))}
</Gallery>
</PageSection>
</Page>
</React.Fragment>
);
}
}
import React from 'react';
import {
Avatar,
Brand,
Button,
ButtonVariant,
Dropdown,
DropdownToggle,
DropdownItem,
DropdownSeparator,
KebabToggle,
Nav,
NavGroup,
NavItem,
Page,
PageHeader,
PageSection,
PageSectionVariants,
PageSidebar,
SkipToContent,
TextContent,
Text,
Toolbar,
ToolbarGroup,
ToolbarItem
} from '@patternfly/react-core';
// make sure you've installed @patternfly/patternfly
import accessibleStyles from '@patternfly/react-styles/css/utilities/Accessibility/accessibility';
import spacingStyles from '@patternfly/react-styles/css/utilities/Spacing/spacing';
import { css } from '@patternfly/react-styles';
import { BellIcon, CogIcon } from '@patternfly/react-icons';
import imgBrand from './imgBrand.svg';
import imgAvatar from './imgAvatar.svg';
class PageLayoutExpandableNav extends React.Component {
constructor(props) {
super(props);
this.state = {
isDropdownOpen: false,
isKebabDropdownOpen: false,
activeGroup: 'grp-1',
activeItem: 'grp-1_itm-1'
};
this.onDropdownToggle = isDropdownOpen => {
this.setState({
isDropdownOpen
});
};
this.onDropdownSelect = event => {
this.setState({
isDropdownOpen: !this.state.isDropdownOpen
});
};
this.onKebabDropdownToggle = isKebabDropdownOpen => {
this.setState({
isKebabDropdownOpen
});
};
this.onKebabDropdownSelect = event => {
this.setState({
isKebabDropdownOpen: !this.state.isKebabDropdownOpen
});
};
this.onNavSelect = result => {
this.setState({
activeItem: result.itemId,
activeGroup: result.groupId
});
};
}
render() {
const { isDropdownOpen, isKebabDropdownOpen, activeItem, activeGroup } = this.state;
const PageNav = (
<Nav onSelect={this.onNavSelect} aria-label="Nav" theme="dark">
<NavList>
<NavExpandable title="System Panel" groupId="grp-1" isActive={activeGroup === 'grp-1'} isExpanded>
<NavItem groupId="grp-1" itemId="grp-1_itm-1" isActive={activeItem === 'grp-1_itm-1'}>
Overview
</NavItem>
<NavItem groupId="grp-1" itemId="grp-1_itm-2" isActive={activeItem === 'grp-1_itm-2'}>
Resource usage
</NavItem>
<NavItem groupId="grp-1" itemId="grp-1_itm-3" isActive={activeItem === 'grp-1_itm-3'}>
Hypervisors
</NavItem>
<NavItem groupId="grp-1" itemId="grp-1_itm-4" isActive={activeItem === 'grp-1_itm-4'}>
Instances
</NavItem>
<NavItem groupId="grp-1" itemId="grp-1_itm-5" isActive={activeItem === 'grp-1_itm-5'}>
Volumes
</NavItem>
<NavItem groupId="grp-1" itemId="grp-1_itm-6" isActive={activeItem === 'grp-1_itm-6'}>
Network
</NavItem>
</NavExpandable>
<NavExpandable title="Policy" groupId="grp-2" isActive={activeGroup === 'grp-2'}>
<NavItem groupId="grp-2" itemId="grp-2_itm-1" isActive={activeItem === 'grp-2_itm-1'}>
Subnav link 1
</NavItem>
<NavItem groupId="grp-2" itemId="grp-2_itm-2" isActive={activeItem === 'grp-2_itm-2'}>
Subnav link 2
</NavItem>
</NavExpandable>
<NavExpandable title="Authentication" groupId="grp-3" isActive={activeGroup === 'grp-3'}>
<NavItem groupId="grp-3" itemId="grp-3_itm-1" isActive={activeItem === 'grp-3_itm-1'}>
Subnav link 1
</NavItem>
<NavItem groupId="grp-3" itemId="grp-3_itm-2" isActive={activeItem === 'grp-3_itm-2'}>
Subnav link 2
</NavItem>
</NavExpandable>
</NavList>
</Nav>
);
const kebabDropdownItems = [
<DropdownItem>
<BellIcon /> Notifications
</DropdownItem>,
<DropdownItem>
<CogIcon /> Settings
</DropdownItem>
];
const userDropdownItems = [
<DropdownItem>Link</DropdownItem>,
<DropdownItem component="button">Action</DropdownItem>,
<DropdownItem isDisabled>Disabled link</DropdownItem>,
<DropdownItem isDisabled component="button">
Disabled action
</DropdownItem>,
<DropdownSeparator />,
<DropdownItem>Separated link</DropdownItem>,
<DropdownItem component="button">Separated action</DropdownItem>
];
const PageToolbar = (
<Toolbar>
<ToolbarGroup className={css(accessibleStyles.screenReader, accessibleStyles.visibleOnLg)}>
<ToolbarItem>
<Button id="expanded-example-uid-01" aria-label="Notifications actions" variant={ButtonVariant.plain}>
<BellIcon />
</Button>
</ToolbarItem>
<ToolbarItem>
<Button id="expanded-example-uid-02" aria-label="Settings actions" variant={ButtonVariant.plain}>
<CogIcon />
</Button>
</ToolbarItem>
</ToolbarGroup>
<ToolbarGroup>
<ToolbarItem className={css(accessibleStyles.hiddenOnLg, spacingStyles.mr_0)}>
<Dropdown
isPlain
position="right"
onSelect={this.onKebabDropdownSelect}
toggle={<KebabToggle onToggle={this.onKebabDropdownToggle} />}
isOpen={isKebabDropdownOpen}
dropdownItems={kebabDropdownItems}
/>
</ToolbarItem>
<ToolbarItem className={css(accessibleStyles.screenReader, accessibleStyles.visibleOnMd)}>
<Dropdown
isPlain
position="right"
onSelect={this.onDropdownSelect}
isOpen={isDropdownOpen}
toggle={<DropdownToggle onToggle={this.onDropdownToggle}>Kyle Baker</DropdownToggle>}
dropdownItems={userDropdownItems}
/>
</ToolbarItem>
</ToolbarGroup>
</Toolbar>
);
const Header = (
<PageHeader
logo={<Brand src={imgBrand} alt="Patternfly Logo" />}
toolbar={PageToolbar}
avatar={<Avatar src={imgAvatar} alt="Avatar image" />}
showNavToggle
/>
);
const Sidebar = <PageSidebar nav={PageNav} theme="dark" />;
const PageBreadcrumb = (
<Breadcrumb>
<BreadcrumbItem>Section home</BreadcrumbItem>
<BreadcrumbItem to="#">Section title</BreadcrumbItem>
<BreadcrumbItem to="#">Section title</BreadcrumbItem>
<BreadcrumbItem to="#" isActive>
Section landing
</BreadcrumbItem>
</Breadcrumb>
);
const pageId = 'main-content-page-layout-expandable-nav';
const PageSkipToContent = <SkipToContent href={`#${pageId}`}>Skip to content</SkipToContent>;
return (
<React.Fragment>
<Page
header={Header}
sidebar={Sidebar}
isManagedSidebar
skipToContent={PageSkipToContent}
breadcrumb={PageBreadcrumb}
mainContainerId={pageId}
>
<PageSection variant={PageSectionVariants.light}>
<TextContent>
<Text component="h1">Main title</Text>
<Text component="p">
Body text should be Overpass Regular at 16px. It should have leading of 24px because <br />
of it’s relative line height of 1.5.
</Text>
</TextContent>
</PageSection>
<PageSection>
<Gallery gutter="md">
{Array.apply(0, Array(10)).map((x, i) => (
<GalleryItem key={i}>
<Card>
<CardBody>This is a card</CardBody>
</Card>
</GalleryItem>
))}
</Gallery>
</PageSection>
</Page>
</React.Fragment>
);
}
}
import React from 'react';
import {
Avatar,
Brand,
Button,
ButtonVariant,
Dropdown,
DropdownToggle,
DropdownItem,
DropdownSeparator,
KebabToggle,
Nav,
NavGroup,
NavItem,
Page,
PageHeader,
PageSection,
PageSectionVariants,
PageSidebar,
SkipToContent,
TextContent,
Text,
Toolbar,
ToolbarGroup,
ToolbarItem
} from '@patternfly/react-core';
// make sure you've installed @patternfly/patternfly
import accessibleStyles from '@patternfly/react-styles/css/utilities/Accessibility/accessibility';
import spacingStyles from '@patternfly/react-styles/css/utilities/Spacing/spacing';
import { css } from '@patternfly/react-styles';
import { BellIcon, CogIcon } from '@patternfly/react-icons';
import imgBrand from './imgBrand.svg';
import imgAvatar from './imgAvatar.svg';
class PageLayoutGroupsNav extends React.Component {
constructor(props) {
super(props);
this.state = {
isDropdownOpen: false,
isKebabDropdownOpen: false,
activeItem: 'grp-1_itm-1'
};
this.onDropdownToggle = isDropdownOpen => {
this.setState({
isDropdownOpen
});
};
this.onDropdownSelect = event => {
this.setState({
isDropdownOpen: !this.state.isDropdownOpen
});
};
this.onKebabDropdownToggle = isKebabDropdownOpen => {
this.setState({
isKebabDropdownOpen
});
};
this.onKebabDropdownSelect = event => {
this.setState({
isKebabDropdownOpen: !this.state.isKebabDropdownOpen
});
};
this.onNavSelect = result => {
this.setState({
activeItem: result.itemId
});
};
}
render() {
const { isDropdownOpen, isKebabDropdownOpen, activeItem } = this.state;
const PageNav = (
<Nav onSelect={this.onNavSelect} aria-label="Nav" theme="dark">
<NavGroup title="System Panel">
<NavItem itemId="grp-1_itm-1" isActive={activeItem === 'grp-1_itm-1'}>
Overview
</NavItem>
<NavItem itemId="grp-1_itm-2" isActive={activeItem === 'grp-1_itm-2'}>
Resource Usage
</NavItem>
<NavItem itemId="grp-1_itm-3" isActive={activeItem === 'grp-1_itm-3'}>
Hypervisors
</NavItem>
<NavItem itemId="grp-1_itm-4" isActive={activeItem === 'grp-1_itm-4'}>
Instances
</NavItem>
<NavItem itemId="grp-1_itm-5" isActive={activeItem === 'grp-1_itm-5'}>
Volumes
</NavItem>
<NavItem itemId="grp-1_itm-6" isActive={activeItem === 'grp-1_itm-6'}>
Network
</NavItem>
</NavGroup>
<NavGroup title="Policy">
<NavItem itemId="grp-2_itm-1" isActive={activeItem === 'grp-2_itm-1'}>
Hosts
</NavItem>
<NavItem itemId="grp-2_itm-2" isActive={activeItem === 'grp-2_itm-2'}>
Virtual Machines
</NavItem>
<NavItem itemId="grp-2_itm-3" isActive={activeItem === 'grp-2_itm-3'}>
Storage
</NavItem>
</NavGroup>
</Nav>
);
const kebabDropdownItems = [
<DropdownItem>
<BellIcon /> Notifications
</DropdownItem>,
<DropdownItem>
<CogIcon /> Settings
</DropdownItem>
];
const userDropdownItems = [
<DropdownItem>Link</DropdownItem>,
<DropdownItem component="button">Action</DropdownItem>,
<DropdownItem isDisabled>Disabled Link</DropdownItem>,
<DropdownItem isDisabled component="button">
Disabled Action
</DropdownItem>,
<DropdownSeparator />,
<DropdownItem>Separated Link</DropdownItem>,
<DropdownItem component="button">Separated Action</DropdownItem>
];
const PageToolbar = (
<Toolbar>
<ToolbarGroup className={css(accessibleStyles.screenReader, accessibleStyles.visibleOnLg)}>
<ToolbarItem>
<Button id="groups-example-uid-01" aria-label="Notifications actions" variant={ButtonVariant.plain}>
<BellIcon />
</Button>
</ToolbarItem>
<ToolbarItem>
<Button id="groups-example-uid-02" aria-label="Setings actions" variant={ButtonVariant.plain}>
<CogIcon />
</Button>
</ToolbarItem>
</ToolbarGroup>
<ToolbarGroup>
<ToolbarItem className={css(accessibleStyles.hiddenOnLg, spacingStyles.mr_0)}>
<Dropdown
isPlain
position="right"
onSelect={this.onKebabDropdownSelect}
toggle={<KebabToggle onToggle={this.onKebabDropdownToggle} />}
isOpen={isKebabDropdownOpen}
dropdownItems={kebabDropdownItems}
/>
</ToolbarItem>
<ToolbarItem className={css(accessibleStyles.screenReader, accessibleStyles.visibleOnMd)}>
<Dropdown
isPlain
position="right"
onSelect={this.onDropdownSelect}
isOpen={isDropdownOpen}
toggle={<DropdownToggle onToggle={this.onDropdownToggle}>Kyle Baker</DropdownToggle>}
dropdownItems={userDropdownItems}
/>
</ToolbarItem>
</ToolbarGroup>
</Toolbar>
);
const Header = (
<PageHeader
logo={<Brand src={imgBrand} alt="Patternfly Logo" />}
toolbar={PageToolbar}
avatar={<Avatar src={imgAvatar} alt="Avatar image" />}
showNavToggle
/>
);
const Sidebar = <PageSidebar nav={PageNav} theme="dark" />;
const pageId = 'main-content-page-layout-group-nav';
const PageSkipToContent = <SkipToContent href={`#${pageId}`}>Skip to Content</SkipToContent>;
return (
<React.Fragment>
<Page
header={Header}
sidebar={Sidebar}
isManagedSidebar
skipToContent={PageSkipToContent}
mainContainerId={pageId}
>
<PageSection variant={PageSectionVariants.light}>
<TextContent>
<Text component="h1">Main title</Text>
<Text component="p">
Body text should be Overpass Regular at 16px. It should have leading of 24px because <br />
of it’s relative line height of 1.5.
</Text>
</TextContent>
</PageSection>
<PageSection variant={PageSectionVariants.light}>Light</PageSection>
<PageSection variant={PageSectionVariants.dark}>Dark</PageSection>
<PageSection variant={PageSectionVariants.darker}>Darker</PageSection>
<PageSection>Content</PageSection>
</Page>
</React.Fragment>
);
}
}
import React from 'react';
import {
Avatar,
Brand,
Breadcrumb,
BreadcrumbItem,
Button,
ButtonVariant,
Card,
CardBody,
Dropdown,
DropdownToggle,
DropdownItem,
DropdownSeparator,
Gallery,
GalleryItem,
KebabToggle,
Nav,
NavItem,
NavList,
NavVariants,
Page,
PageHeader,
PageSection,
PageSectionVariants,
SkipToContent,
TextContent,
Text,
Toolbar,
ToolbarGroup,
ToolbarItem
} from '@patternfly/react-core';
// make sure you've installed @patternfly/patternfly
import accessibleStyles from '@patternfly/react-styles/css/utilities/Accessibility/accessibility';
import spacingStyles from '@patternfly/react-styles/css/utilities/Spacing/spacing';
import { css } from '@patternfly/react-styles';
import { BellIcon, CogIcon } from '@patternfly/react-icons';
import imgBrand from './imgBrand.svg';
import imgAvatar from './imgAvatar.svg';
class PageLayoutHorizontalNav extends React.Component {
constructor(props) {
super(props);
this.state = {
isDropdownOpen: false,
isKebabDropdownOpen: false,
activeItem: 0
};
this.onDropdownToggle = isDropdownOpen => {
this.setState({
isDropdownOpen
});
};
this.onDropdownSelect = event => {
this.setState({
isDropdownOpen: !this.state.isDropdownOpen
});
};
this.onKebabDropdownToggle = isKebabDropdownOpen => {
this.setState({
isKebabDropdownOpen
});
};
this.onKebabDropdownSelect = event => {
this.setState({
isKebabDropdownOpen: !this.state.isKebabDropdownOpen
});
};
this.onNavSelect = result => {
this.setState({
activeItem: result.itemId
});
};
}
render() {
const { isDropdownOpen, isKebabDropdownOpen, activeItem } = this.state;
const PageNav = (
<Nav onSelect={this.onNavSelect} aria-label="Nav">
<NavList variant={NavVariants.horizontal}>
<NavItem itemId={0} isActive={activeItem === 0}>
System Panel
</NavItem>
<NavItem itemId={1} isActive={activeItem === 1}>
Policy
</NavItem>
<NavItem itemId={2} isActive={activeItem === 2}>
Authentication
</NavItem>
<NavItem itemId={3} isActive={activeItem === 3}>
Network Services
</NavItem>
<NavItem itemId={4} isActive={activeItem === 4}>
Server
</NavItem>
</NavList>
</Nav>
);
const kebabDropdownItems = [
<DropdownItem>
<BellIcon /> Notifications
</DropdownItem>,
<DropdownItem>
<CogIcon /> Settings
</DropdownItem>
];
const userDropdownItems = [
<DropdownItem>Link</DropdownItem>,
<DropdownItem component="button">Action</DropdownItem>,
<DropdownItem isDisabled>Disabled Link</DropdownItem>,
<DropdownItem isDisabled component="button">
Disabled Action
</DropdownItem>,
<DropdownSeparator />,
<DropdownItem>Separated Link</DropdownItem>,
<DropdownItem component="button">Separated Action</DropdownItem>
];
const PageToolbar = (
<Toolbar>
<ToolbarGroup className={css(accessibleStyles.screenReader, accessibleStyles.visibleOnLg)}>
<ToolbarItem>
<Button id="horizontal-example-uid-01" aria-label="Notifications actions" variant={ButtonVariant.plain}>
<BellIcon />
</Button>
</ToolbarItem>
<ToolbarItem>
<Button id="horizontal-example-uid-02" aria-label="Settings actions" variant={ButtonVariant.plain}>
<CogIcon />
</Button>
</ToolbarItem>
</ToolbarGroup>
<ToolbarGroup>
<ToolbarItem className={css(accessibleStyles.hiddenOnLg, spacingStyles.mr_0)}>
<Dropdown
isPlain
position="right"
onSelect={this.onKebabDropdownSelect}
toggle={<KebabToggle onToggle={this.onKebabDropdownToggle} />}
isOpen={isKebabDropdownOpen}
dropdownItems={kebabDropdownItems}
/>
</ToolbarItem>
<ToolbarItem className={css(accessibleStyles.screenReader, accessibleStyles.visibleOnMd)}>
<Dropdown
isPlain
position="right"
onSelect={this.onDropdownSelect}
isOpen={isDropdownOpen}
toggle={<DropdownToggle onToggle={this.onDropdownToggle}>Kyle Baker</DropdownToggle>}
dropdownItems={userDropdownItems}
/>
</ToolbarItem>
</ToolbarGroup>
</Toolbar>
);
const Header = (
<PageHeader
logo={<Brand src={imgBrand} alt="Patternfly Logo" />}
toolbar={PageToolbar}
avatar={<Avatar src={imgAvatar} alt="Avatar image" />}
topNav={PageNav}
/>
);
const PageBreadcrumb = (
<Breadcrumb>
<BreadcrumbItem>Section Home</BreadcrumbItem>
<BreadcrumbItem to="#">Section title</BreadcrumbItem>
<BreadcrumbItem to="#">Section title</BreadcrumbItem>
<BreadcrumbItem to="#" isActive>
Section landing
</BreadcrumbItem>
</Breadcrumb>
);
const pageId = 'main-content-page-layout-horizontal-nav';
const PageSkipToContent = <SkipToContent href={`#${pageId}`}>Skip to content</SkipToContent>;
return (
<React.Fragment>
<Page header={Header} skipToContent={PageSkipToContent} breadcrumb={PageBreadcrumb} mainContainerId={pageId}>
<PageSection variant={PageSectionVariants.light}>
<TextContent>
<Text component="h1">Main title</Text>
<Text component="p">
Body text should be Overpass Regular at 16px. It should have leading of 24px because <br />
of it’s relative line height of 1.5.
</Text>
</TextContent>
</PageSection>
<PageSection>
<Gallery gutter="md">
{Array.apply(0, Array(10)).map((x, i) => (
<GalleryItem key={i}>
<Card>
<CardBody>This is a card</CardBody>
</Card>
</GalleryItem>
))}
</Gallery>
</PageSection>
</Page>
</React.Fragment>
);
}
}
import React from 'react';
import {
Avatar,
Brand,
Button,
ButtonVariant,
Card,
CardBody,
Dropdown,
DropdownToggle,
DropdownItem,
DropdownSeparator,
Gallery,
GalleryItem,
KebabToggle,
Nav,
NavItem,
NavList,
Page,
PageHeader,
PageSection,
PageSectionVariants,
PageSidebar,
SkipToContent,
TextContent,
Text,
Toolbar,
ToolbarGroup,
ToolbarItem
} from '@patternfly/react-core';
// make sure you've installed @patternfly/patternfly
import accessibleStyles from '@patternfly/react-styles/css/utilities/Accessibility/accessibility';
import spacingStyles from '@patternfly/react-styles/css/utilities/Spacing/spacing';
import { css } from '@patternfly/react-styles';
import { BellIcon, CogIcon } from '@patternfly/react-icons';
import imgBrand from './imgBrand.svg';
import imgAvatar from './imgAvatar.svg';
class PageLayoutManualNav extends React.Component {
constructor(props) {
super(props);
this.state = {
isDropdownOpen: false,
isKebabDropdownOpen: false,
activeItem: 0,
isMobileView: false,
isNavOpenDesktop: true,
isNavOpenMobile: false
};
this.onDropdownToggle = isDropdownOpen => {
this.setState({
isDropdownOpen
});
};
this.onDropdownSelect = event => {
this.setState({
isDropdownOpen: !this.state.isDropdownOpen
});
};
this.onKebabDropdownToggle = isKebabDropdownOpen => {
this.setState({
isKebabDropdownOpen
});
};
this.onKebabDropdownSelect = event => {
this.setState({
isKebabDropdownOpen: !this.state.isKebabDropdownOpen
});
};
this.onNavSelect = result => {
this.setState({
activeItem: result.itemId
});
};
this.onNavToggleDesktop = () => {
this.setState({
isNavOpenDesktop: !this.state.isNavOpenDesktop
});
};
this.onNavToggleMobile = () => {
this.setState({
isNavOpenMobile: !this.state.isNavOpenMobile
});
};
this.onPageResize = ({ mobileView, windowSize }) => {
this.setState({
isMobileView: mobileView
});
};
}
render() {
const {
isDropdownOpen,
isKebabDropdownOpen,
activeItem,
isNavOpenDesktop,
isNavOpenMobile,
isMobileView
} = this.state;
const PageNav = (
<Nav onSelect={this.onNavSelect} aria-label="Nav" theme="dark">
<NavList>
<NavItem itemId={0} isActive={activeItem === 0}>
System Panel
</NavItem>
<NavItem itemId={1} isActive={activeItem === 1}>
Policy
</NavItem>
<NavItem itemId={2} isActive={activeItem === 2}>
Authentication
</NavItem>
<NavItem itemId={3} isActive={activeItem === 3}>
Network Services
</NavItem>
<NavItem itemId={4} isActive={activeItem === 4}>
Server
</NavItem>
</NavList>
</Nav>
);
const kebabDropdownItems = [
<DropdownItem>
<BellIcon /> Notifications
</DropdownItem>,
<DropdownItem>
<CogIcon /> Settings
</DropdownItem>
];
const userDropdownItems = [
<DropdownItem>Link</DropdownItem>,
<DropdownItem component="button">Action</DropdownItem>,
<DropdownItem isDisabled>Disabled Link</DropdownItem>,
<DropdownItem isDisabled component="button">
Disabled Action
</DropdownItem>,
<DropdownSeparator />,
<DropdownItem>Separated Link</DropdownItem>,
<DropdownItem component="button">Separated Action</DropdownItem>
];
const PageToolbar = (
<Toolbar>
<ToolbarGroup className={css(accessibleStyles.screenReader, accessibleStyles.visibleOnLg)}>
<ToolbarItem>
<Button id="default-example-uid-01" aria-label="Notifications actions" variant={ButtonVariant.plain}>
<BellIcon />
</Button>
</ToolbarItem>
<ToolbarItem>
<Button id="default-example-uid-02" aria-label="Settings actions" variant={ButtonVariant.plain}>
<CogIcon />
</Button>
</ToolbarItem>
</ToolbarGroup>
<ToolbarGroup>
<ToolbarItem className={css(accessibleStyles.hiddenOnLg, spacingStyles.mr_0)}>
<Dropdown
isPlain
position="right"
onSelect={this.onKebabDropdownSelect}
toggle={<KebabToggle onToggle={this.onKebabDropdownToggle} />}
isOpen={isKebabDropdownOpen}
dropdownItems={kebabDropdownItems}
/>
</ToolbarItem>
<ToolbarItem className={css(accessibleStyles.screenReader, accessibleStyles.visibleOnMd)}>
<Dropdown
isPlain
position="right"
onSelect={this.onDropdownSelect}
isOpen={isDropdownOpen}
toggle={<DropdownToggle onToggle={this.onDropdownToggle}>Kyle Baker</DropdownToggle>}
dropdownItems={userDropdownItems}
/>
</ToolbarItem>
</ToolbarGroup>
</Toolbar>
);
const Header = (
<PageHeader
logo={<Brand src={imgBrand} alt="Patternfly Logo" />}
toolbar={PageToolbar}
avatar={<Avatar src={imgAvatar} alt="Avatar image" />}
showNavToggle
onNavToggle={isMobileView ? this.onNavToggleMobile : this.onNavToggleDesktop}
isNavOpen={isMobileView ? isNavOpenMobile : isNavOpenDesktop}
/>
);
const Sidebar = (
<PageSidebar nav={PageNav} isNavOpen={isMobileView ? isNavOpenMobile : isNavOpenDesktop} theme="dark" />
);
const pageId = 'main-content-page-layout-manual-nav';
const PageSkipToContent = <SkipToContent href={`#${pageId}`}>Skip to Content</SkipToContent>;
return (
<React.Fragment>
<Page
header={Header}
sidebar={Sidebar}
onPageResize={this.onPageResize}
skipToContent={PageSkipToContent}
mainContainerId={pageId}
>
<PageSection variant={PageSectionVariants.light}>
<TextContent>
<Text component="h1">Main title</Text>
<Text component="p">
Body text should be Overpass Regular at 16px. It should have leading of 24px because <br />
of it’s relative line height of 1.5.
</Text>
</TextContent>
</PageSection>
<PageSection>
<Gallery gutter="md">
{Array.apply(0, Array(10)).map((x, i) => (
<GalleryItem key={i}>
<Card>
<CardBody>This is a card</CardBody>
</Card>
</GalleryItem>
))}
</Gallery>
</PageSection>
</Page>
</React.Fragment>
);
}
}
import React from 'react';
import {
Avatar,
Brand,
Button,
ButtonVariant,
Card,
CardBody,
Dropdown,
DropdownToggle,
DropdownItem,
DropdownSeparator,
Gallery,
GalleryItem,
KebabToggle,
Nav,
NavItem,
NavList,
NavVariants,
Page,
PageHeader,
PageSection,
PageSectionVariants,
PageSidebar,
SkipToContent,
TextContent,
Text,
Toolbar,
ToolbarGroup,
ToolbarItem
} from '@patternfly/react-core';
// make sure you've installed @patternfly/patternfly
import accessibleStyles from '@patternfly/react-styles/css/utilities/Accessibility/accessibility';
import spacingStyles from '@patternfly/react-styles/css/utilities/Spacing/spacing';
import { css } from '@patternfly/react-styles';
import { BellIcon, CogIcon } from '@patternfly/react-icons';
import imgBrand from './imgBrand.svg';
import imgAvatar from './imgAvatar.svg';
class PageLayoutLightNav extends React.Component {
constructor(props) {
super(props);
this.state = {
isDropdownOpen: false,
isKebabDropdownOpen: false,
activeItem: 0
};
this.onDropdownToggle = isDropdownOpen => {
this.setState({
isDropdownOpen
});
};
this.onDropdownSelect = event => {
this.setState({
isDropdownOpen: !this.state.isDropdownOpen
});
};
this.onKebabDropdownToggle = isKebabDropdownOpen => {
this.setState({
isKebabDropdownOpen
});
};
this.onKebabDropdownSelect = event => {
this.setState({
isKebabDropdownOpen: !this.state.isKebabDropdownOpen
});
};
this.onNavSelect = result => {
this.setState({
activeItem: result.itemId
});
};
}
render() {
const { isDropdownOpen, isKebabDropdownOpen, activeItem } = this.state;
const PageNav = (
<Nav onSelect={this.onNavSelect} aria-label="Nav">
<NavList variant={NavVariants.default}>
<NavItem itemId={0} isActive={activeItem === 0}>
System Panel
</NavItem>
<NavItem itemId={1} isActive={activeItem === 1}>
Policy
</NavItem>
<NavItem itemId={2} isActive={activeItem === 2}>
Authentication
</NavItem>
<NavItem itemId={3} isActive={activeItem === 3}>
Network Services
</NavItem>
<NavItem itemId={4} isActive={activeItem === 4}>
Server
</NavItem>
</NavList>
</Nav>
);
const kebabDropdownItems = [
<DropdownItem>
<BellIcon /> Notifications
</DropdownItem>,
<DropdownItem>
<CogIcon /> Settings
</DropdownItem>
];
const userDropdownItems = [
<DropdownItem>Link</DropdownItem>,
<DropdownItem component="button">Action</DropdownItem>,
<DropdownItem isDisabled>Disabled Link</DropdownItem>,
<DropdownItem isDisabled component="button">
Disabled Action
</DropdownItem>,
<DropdownSeparator />,
<DropdownItem>Separated Link</DropdownItem>,
<DropdownItem component="button">Separated Action</DropdownItem>
];
const PageToolbar = (
<Toolbar>
<ToolbarGroup className={css(accessibleStyles.screenReader, accessibleStyles.visibleOnLg)}>
<ToolbarItem>
<Button id="simple-example-uid-01" aria-label="Notifications actions" variant={ButtonVariant.plain}>
<BellIcon />
</Button>
</ToolbarItem>
<ToolbarItem>
<Button id="simple-example-uid-02" aria-label="Settings actions" variant={ButtonVariant.plain}>
<CogIcon />
</Button>
</ToolbarItem>
</ToolbarGroup>
<ToolbarGroup>
<ToolbarItem className={css(accessibleStyles.hiddenOnLg, spacingStyles.mr_0)}>
<Dropdown
isPlain
position="right"
onSelect={this.onKebabDropdownSelect}
toggle={<KebabToggle onToggle={this.onKebabDropdownToggle} />}
isOpen={isKebabDropdownOpen}
dropdownItems={kebabDropdownItems}
/>
</ToolbarItem>
<ToolbarItem className={css(accessibleStyles.screenReader, accessibleStyles.visibleOnMd)}>
<Dropdown
isPlain
position="right"
onSelect={this.onDropdownSelect}
isOpen={isDropdownOpen}
toggle={<DropdownToggle onToggle={this.onDropdownToggle}>Kyle Baker</DropdownToggle>}
dropdownItems={userDropdownItems}
/>
</ToolbarItem>
</ToolbarGroup>
</Toolbar>
);
const Header = (
<PageHeader
logo={<Brand src={imgBrand} alt="Patternfly Logo" />}
toolbar={PageToolbar}
avatar={<Avatar src={imgAvatar} alt="Avatar image" />}
showNavToggle
/>
);
const Sidebar = <PageSidebar nav={PageNav} />;
const pageId = 'main-content-page-layout-simple-nav';
const PageSkipToContent = <SkipToContent href={`#${pageId}`}>Skip to Content</SkipToContent>;
return (
<React.Fragment>
<Page
header={Header}
sidebar={Sidebar}
isManagedSidebar
skipToContent={PageSkipToContent}
mainContainerId={pageId}
>
<PageSection variant={PageSectionVariants.light}>
<TextContent>
<Text component="h1">Main title</Text>
<Text component="p">
Body text should be Overpass Regular at 16px. It should have leading of 24px because <br />
of it’s relative line height of 1.5.
</Text>
</TextContent>
</PageSection>
<PageSection>
<Gallery gutter="md">
{Array.apply(0, Array(10)).map((x, i) => (
<GalleryItem key={i}>
<Card>
<CardBody>This is a card</CardBody>
</Card>
</GalleryItem>
))}
</Gallery>
</PageSection>
</Page>
</React.Fragment>
);
}
}