@patternfly/react-docs 7.6.0-prerelease.6 → 7.6.0-prerelease.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/package.json +12 -13
- package/patternfly-docs/generated/components/about-modal/react.js +149 -0
- package/patternfly-docs/generated/components/accordion/react.js +262 -0
- package/patternfly-docs/generated/components/action-list/react.js +144 -0
- package/patternfly-docs/generated/components/alert/react-demos.js +56 -0
- package/patternfly-docs/generated/components/alert/react.js +1433 -0
- package/patternfly-docs/generated/components/avatar/react.js +166 -0
- package/patternfly-docs/generated/components/back-to-top/react-demos.js +60 -0
- package/patternfly-docs/generated/components/back-to-top/react.js +77 -0
- package/patternfly-docs/generated/components/backdrop/react.js +64 -0
- package/patternfly-docs/generated/components/background-image/react.js +62 -0
- package/patternfly-docs/generated/components/badge/react.js +97 -0
- package/patternfly-docs/generated/components/banner/react-demos.js +57 -0
- package/patternfly-docs/generated/components/banner/react.js +148 -0
- package/patternfly-docs/generated/components/brand/react.js +142 -0
- package/patternfly-docs/generated/components/breadcrumb/react.js +206 -0
- package/patternfly-docs/generated/components/button/react-demos.js +57 -0
- package/patternfly-docs/generated/components/button/react.js +826 -0
- package/patternfly-docs/generated/components/card/react-demos.js +201 -0
- package/patternfly-docs/generated/components/card/react.js +1015 -0
- package/patternfly-docs/generated/components/charts/area-chart/-Victory.js +1350 -0
- package/patternfly-docs/generated/components/charts/bar-chart/-Victory.js +1334 -0
- package/patternfly-docs/generated/components/charts/box-plot-chart/-Victory.js +1282 -0
- package/patternfly-docs/generated/components/charts/bullet-chart/-Victory.js +848 -0
- package/patternfly-docs/generated/components/charts/colors-for-charts/-Victory.js +192 -0
- package/patternfly-docs/generated/components/charts/donut-chart/-Victory.js +426 -0
- package/patternfly-docs/generated/components/charts/donut-utilization-chart/-Victory.js +804 -0
- package/patternfly-docs/generated/components/charts/legends/-Victory.js +3230 -0
- package/patternfly-docs/generated/components/charts/line-chart/-Victory.js +1178 -0
- package/patternfly-docs/generated/components/charts/line-chart/ECharts.js +525 -0
- package/patternfly-docs/generated/components/charts/patterns/-Victory.js +3382 -0
- package/patternfly-docs/generated/components/charts/pie-chart/-Victory.js +377 -0
- package/patternfly-docs/generated/components/charts/resize-observer/-Victory.js +2475 -0
- package/patternfly-docs/generated/components/charts/sankey-chart/ECharts.js +538 -0
- package/patternfly-docs/generated/components/charts/scatter-chart/-Victory.js +1551 -0
- package/patternfly-docs/generated/components/charts/skeletons/-Victory.js +4115 -0
- package/patternfly-docs/generated/components/charts/sparkline-chart/-Victory.js +955 -0
- package/patternfly-docs/generated/components/charts/stack-chart/-Victory.js +1173 -0
- package/patternfly-docs/generated/components/charts/threshold-chart/-Victory.js +1166 -0
- package/patternfly-docs/generated/components/charts/tooltips/-Victory.js +413 -0
- package/patternfly-docs/generated/components/chip/react-deprecated.js +323 -0
- package/patternfly-docs/generated/components/clipboard-copy/react.js +373 -0
- package/patternfly-docs/generated/components/code-block/react.js +148 -0
- package/patternfly-docs/generated/components/code-editor/react.js +659 -0
- package/patternfly-docs/generated/components/compass/react-demos.js +147 -0
- package/patternfly-docs/generated/components/compass/react.js +440 -0
- package/patternfly-docs/generated/components/content/react.js +248 -0
- package/patternfly-docs/generated/components/data-list/react-demos.js +90 -0
- package/patternfly-docs/generated/components/data-list/react.js +709 -0
- package/patternfly-docs/generated/components/date-and-time/calendar-month/react.js +283 -0
- package/patternfly-docs/generated/components/date-and-time/date-and-time-picker/react-demos.js +64 -0
- package/patternfly-docs/generated/components/date-and-time/date-picker/react-demos.js +83 -0
- package/patternfly-docs/generated/components/date-and-time/date-picker/react.js +395 -0
- package/patternfly-docs/generated/components/date-and-time/time-picker/react.js +241 -0
- package/patternfly-docs/generated/components/description-list/react-demos.js +58 -0
- package/patternfly-docs/generated/components/description-list/react.js +743 -0
- package/patternfly-docs/generated/components/divider/react.js +126 -0
- package/patternfly-docs/generated/components/drag-and-drop/react-demos.js +351 -0
- package/patternfly-docs/generated/components/drag-and-drop/react-deprecated.js +184 -0
- package/patternfly-docs/generated/components/drag-and-drop/react.js +137 -0
- package/patternfly-docs/generated/components/drawer/react.js +598 -0
- package/patternfly-docs/generated/components/dual-list-selector/react-deprecated.js +772 -0
- package/patternfly-docs/generated/components/dual-list-selector/react.js +594 -0
- package/patternfly-docs/generated/components/empty-state/react.js +199 -0
- package/patternfly-docs/generated/components/expandable-section/react-demos.js +65 -0
- package/patternfly-docs/generated/components/expandable-section/react.js +408 -0
- package/patternfly-docs/generated/components/file-upload/multiple-file-upload/react-demos.js +52 -0
- package/patternfly-docs/generated/components/file-upload/multiple-file-upload/react.js +398 -0
- package/patternfly-docs/generated/components/file-upload/simple-file-upload/react.js +749 -0
- package/patternfly-docs/generated/components/forms/checkbox/react.js +222 -0
- package/patternfly-docs/generated/components/forms/form/react.js +1106 -0
- package/patternfly-docs/generated/components/forms/form-select/react.js +208 -0
- package/patternfly-docs/generated/components/forms/radio/react.js +212 -0
- package/patternfly-docs/generated/components/forms/text-area/react.js +160 -0
- package/patternfly-docs/generated/components/forms/text-input/react.js +216 -0
- package/patternfly-docs/generated/components/helper-text/react-demos.js +180 -0
- package/patternfly-docs/generated/components/helper-text/react.js +164 -0
- package/patternfly-docs/generated/components/hero/react.js +88 -0
- package/patternfly-docs/generated/components/hint/react.js +169 -0
- package/patternfly-docs/generated/components/icon/react.js +215 -0
- package/patternfly-docs/generated/components/input-group/react.js +182 -0
- package/patternfly-docs/generated/components/jump-links/react-demos.js +154 -0
- package/patternfly-docs/generated/components/jump-links/react.js +212 -0
- package/patternfly-docs/generated/components/label/react-demos.js +57 -0
- package/patternfly-docs/generated/components/label/react.js +417 -0
- package/patternfly-docs/generated/components/list/react.js +175 -0
- package/patternfly-docs/generated/components/login-page/react.js +587 -0
- package/patternfly-docs/generated/components/masthead/react-demos.js +79 -0
- package/patternfly-docs/generated/components/masthead/react.js +291 -0
- package/patternfly-docs/generated/components/menus/application-launcher/react-demos.js +769 -0
- package/patternfly-docs/generated/components/menus/context-selector/react-demos.js +665 -0
- package/patternfly-docs/generated/components/menus/custom-menus/react-demos.js +187 -0
- package/patternfly-docs/generated/components/menus/dropdown/react-templates.js +163 -0
- package/patternfly-docs/generated/components/menus/dropdown/react.js +998 -0
- package/patternfly-docs/generated/components/menus/menu/react.js +1540 -0
- package/patternfly-docs/generated/components/menus/menu-toggle/react.js +747 -0
- package/patternfly-docs/generated/components/menus/options-menu/react-demos.js +508 -0
- package/patternfly-docs/generated/components/menus/select/react-templates.js +257 -0
- package/patternfly-docs/generated/components/menus/select/react.js +998 -0
- package/patternfly-docs/generated/components/modal/react-deprecated.js +554 -0
- package/patternfly-docs/generated/components/modal/react.js +597 -0
- package/patternfly-docs/generated/components/navigation/react-demos.js +356 -0
- package/patternfly-docs/generated/components/navigation/react.js +409 -0
- package/patternfly-docs/generated/components/notification-badge/react.js +196 -0
- package/patternfly-docs/generated/components/notification-drawer/react-demos.js +107 -0
- package/patternfly-docs/generated/components/notification-drawer/react.js +394 -0
- package/patternfly-docs/generated/components/number-input/react.js +210 -0
- package/patternfly-docs/generated/components/overflow-menu/react.js +274 -0
- package/patternfly-docs/generated/components/page/react-demos.js +149 -0
- package/patternfly-docs/generated/components/page/react.js +1352 -0
- package/patternfly-docs/generated/components/pagination/react.js +492 -0
- package/patternfly-docs/generated/components/panel/react.js +236 -0
- package/patternfly-docs/generated/components/popover/react.js +390 -0
- package/patternfly-docs/generated/components/progress/react-demos.js +59 -0
- package/patternfly-docs/generated/components/progress/react.js +283 -0
- package/patternfly-docs/generated/components/progress-stepper/react-demos.js +45 -0
- package/patternfly-docs/generated/components/progress-stepper/react.js +219 -0
- package/patternfly-docs/generated/components/search-input/react-demos.js +113 -0
- package/patternfly-docs/generated/components/search-input/react.js +263 -0
- package/patternfly-docs/generated/components/sidebar/react.js +236 -0
- package/patternfly-docs/generated/components/simple-list/react.js +200 -0
- package/patternfly-docs/generated/components/skeleton/react-demos.js +44 -0
- package/patternfly-docs/generated/components/skeleton/react.js +122 -0
- package/patternfly-docs/generated/components/skip-to-content/react.js +73 -0
- package/patternfly-docs/generated/components/slider/react.js +309 -0
- package/patternfly-docs/generated/components/spinner/react.js +111 -0
- package/patternfly-docs/generated/components/switch/react.js +163 -0
- package/patternfly-docs/generated/components/table/react-demos.js +355 -0
- package/patternfly-docs/generated/components/table/react-deprecated.js +1350 -0
- package/patternfly-docs/generated/components/table/react.js +3241 -0
- package/patternfly-docs/generated/components/tabs/react-demos.js +108 -0
- package/patternfly-docs/generated/components/tabs/react.js +1359 -0
- package/patternfly-docs/generated/components/text-input-group/react-demos.js +152 -0
- package/patternfly-docs/generated/components/text-input-group/react.js +278 -0
- package/patternfly-docs/generated/components/tile/react-deprecated.js +242 -0
- package/patternfly-docs/generated/components/timestamp/react.js +283 -0
- package/patternfly-docs/generated/components/title/react.js +94 -0
- package/patternfly-docs/generated/components/toggle-group/react.js +299 -0
- package/patternfly-docs/generated/components/toolbar/react-demos.js +66 -0
- package/patternfly-docs/generated/components/toolbar/react.js +932 -0
- package/patternfly-docs/generated/components/tooltip/react.js +241 -0
- package/patternfly-docs/generated/components/tree-view/react.js +429 -0
- package/patternfly-docs/generated/components/truncate/react.js +211 -0
- package/patternfly-docs/generated/components/wizard/react-demos.js +87 -0
- package/patternfly-docs/generated/components/wizard/react-deprecated.js +788 -0
- package/patternfly-docs/generated/components/wizard/react.js +986 -0
- package/patternfly-docs/generated/developer-guides/open-ui-automation/react.js +285 -0
- package/patternfly-docs/generated/foundations-and-styles/layouts/bullseye/react.js +70 -0
- package/patternfly-docs/generated/foundations-and-styles/layouts/flex/react.js +506 -0
- package/patternfly-docs/generated/foundations-and-styles/layouts/gallery/react.js +94 -0
- package/patternfly-docs/generated/foundations-and-styles/layouts/grid/react.js +272 -0
- package/patternfly-docs/generated/foundations-and-styles/layouts/level/react.js +87 -0
- package/patternfly-docs/generated/foundations-and-styles/layouts/split/react.js +124 -0
- package/patternfly-docs/generated/foundations-and-styles/layouts/stack/react.js +112 -0
- package/patternfly-docs/generated/index.js +1769 -0
- package/patternfly-docs/generated/patterns/card-view/react-demos.js +78 -0
- package/patternfly-docs/generated/patterns/filters/react-demos.js +141 -0
- package/patternfly-docs/generated/patterns/password-generator/react-demos.js +51 -0
- package/patternfly-docs/generated/patterns/password-strength/react-demos.js +61 -0
- package/patternfly-docs/generated/patterns/primary-detail/react-demos.js +124 -0
- package/patternfly-docs/generated/patterns/right-to-left/react-demos.js +81 -0
- package/LICENSE +0 -21
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { AutoLinkHeader, Example, Link as PatternflyThemeLink } from '@patternfly/documentation-framework/components';
|
|
3
|
+
import { cloneElement, Fragment, useEffect, useRef, useState } from 'react';
|
|
4
|
+
import RhUiMenuBarsIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-menu-bars-icon';
|
|
5
|
+
import RhUiEllipsisVerticalFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-ellipsis-vertical-fill-icon';
|
|
6
|
+
import RhUiNotificationFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-notification-fill-icon';
|
|
7
|
+
import RhUiSettingsFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-settings-fill-icon';
|
|
8
|
+
import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon';
|
|
9
|
+
import RhUiQuestionMarkCircleFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-question-mark-circle-fill-icon';
|
|
10
|
+
import RhUiThumbnailViewSmallFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-thumbnail-view-small-fill-icon';
|
|
11
|
+
import imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.svg';
|
|
12
|
+
import pfIcon from '../../../../../react-core/src/demos/./assets/pf-logo-small.svg';
|
|
13
|
+
import pfLogo from '../../../../../react-core/src/demos/./assets/PF-HorizontalLogo-Color.svg';
|
|
14
|
+
import srcImporthorizontalnav from './react-demos/horizontal-nav.png';
|
|
15
|
+
import srcImportmastheadwithutilitiesanduserdropdownmenu from './react-demos/masthead-with-utilities-and-user-dropdown-menu.png';
|
|
16
|
+
import srcImportutilitiesanduserdropdownmenu from './react-demos/utilities-and-user-dropdown-menu.png';
|
|
17
|
+
const pageData = {
|
|
18
|
+
"id": "Masthead",
|
|
19
|
+
"section": "components",
|
|
20
|
+
"subsection": "",
|
|
21
|
+
"deprecated": false,
|
|
22
|
+
"template": false,
|
|
23
|
+
"beta": false,
|
|
24
|
+
"demo": false,
|
|
25
|
+
"newImplementationLink": false,
|
|
26
|
+
"source": "react-demos",
|
|
27
|
+
"tabName": null,
|
|
28
|
+
"slug": "/components/masthead/react-demos",
|
|
29
|
+
"sourceLink": "https://github.com/patternfly/patternfly-react/blob/main/packages/react-core/src/demos/Masthead.md",
|
|
30
|
+
"relPath": "packages/react-core/src/demos/Masthead.md",
|
|
31
|
+
"fullscreenExamples": [
|
|
32
|
+
"Utilities and user dropdown menu",
|
|
33
|
+
"Horizontal nav"
|
|
34
|
+
]
|
|
35
|
+
};
|
|
36
|
+
pageData.liveContext = {
|
|
37
|
+
cloneElement,
|
|
38
|
+
Fragment,
|
|
39
|
+
useEffect,
|
|
40
|
+
useRef,
|
|
41
|
+
useState,
|
|
42
|
+
RhUiMenuBarsIcon,
|
|
43
|
+
RhUiEllipsisVerticalFillIcon,
|
|
44
|
+
RhUiNotificationFillIcon,
|
|
45
|
+
RhUiSettingsFillIcon,
|
|
46
|
+
HelpIcon,
|
|
47
|
+
RhUiQuestionMarkCircleFillIcon,
|
|
48
|
+
RhUiThumbnailViewSmallFillIcon,
|
|
49
|
+
imgAvatar,
|
|
50
|
+
pfIcon,
|
|
51
|
+
pfLogo
|
|
52
|
+
};
|
|
53
|
+
pageData.examples = {
|
|
54
|
+
'Utilities and user dropdown menu': props =>
|
|
55
|
+
<Example {...pageData} {...props} thumbnail={srcImportutilitiesanduserdropdownmenu} {...{"code":"import { cloneElement, Fragment, useEffect, useRef, useState } from 'react';\nimport {\n Avatar,\n Brand,\n Breadcrumb,\n BreadcrumbItem,\n Button,\n ButtonVariant,\n Card,\n CardBody,\n Content,\n Divider,\n Dropdown,\n DropdownGroup,\n DropdownItem,\n DropdownList,\n Gallery,\n GalleryItem,\n Masthead,\n MastheadMain,\n MastheadLogo,\n MastheadContent,\n MastheadBrand,\n MastheadToggle,\n Menu,\n MenuContent,\n MenuList,\n MenuItem,\n MenuToggle,\n MenuToggleElement,\n Nav,\n NavItem,\n NavList,\n NotificationBadge,\n NotificationBadgeVariant,\n Page,\n PageSection,\n PageSidebar,\n PageSidebarBody,\n PageToggleButton,\n Popper,\n SkipToContent,\n Toolbar,\n ToolbarContent,\n ToolbarGroup,\n ToolbarItem,\n MenuGroup,\n MenuSearchInput,\n SearchInput,\n Tooltip\n} from '@patternfly/react-core';\nimport RhUiEllipsisVerticalFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-ellipsis-vertical-fill-icon';\nimport RhUiSettingsFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-settings-fill-icon';\nimport HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon';\nimport RhUiThumbnailViewSmallFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-thumbnail-view-small-fill-icon';\nimport RhUiQuestionMarkCircleFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-question-mark-circle-fill-icon';\nimport imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.svg';\nimport pfIcon from '@patternfly/react-core/src/demos/assets/pf-logo-small.svg';\nimport pfLogo from '@patternfly/react-core/src/demos/assets/PF-HorizontalLogo-Color.svg';\n\ninterface NavOnSelectProps {\n groupId: number | string;\n itemId: number | string;\n to: string;\n}\n\nexport const MastheadWithUtilitiesAndUserDropdownMenu: React.FunctionComponent = () => {\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n const [isKebabDropdownOpen, setIsKebabDropdownOpen] = useState(false);\n const [isFullKebabDropdownOpen, setIsFullKebabDropdownOpen] = useState(false);\n const [activeItem, setActiveItem] = useState(1);\n\n const [isOpen, setIsOpen] = useState<boolean>(false);\n const [refFullOptions, setRefFullOptions] = useState<Element[]>();\n const [favorites, setFavorites] = useState<string[]>([]);\n const [filteredIds, setFilteredIds] = useState<string[]>(['*']);\n const [searchValue, setSearchValue] = useState('');\n const menuRef = useRef<HTMLDivElement>(null);\n const toggleRef = useRef<HTMLButtonElement>(null);\n\n const onNavSelect = (_event: React.FormEvent<HTMLInputElement>, selectedItem: NavOnSelectProps) => {\n typeof selectedItem.itemId === 'number' && setActiveItem(selectedItem.itemId);\n };\n\n const onDropdownToggle = () => {\n setIsDropdownOpen(!isDropdownOpen);\n };\n\n const onDropdownSelect = () => {\n setIsDropdownOpen(!isDropdownOpen);\n };\n\n const onKebabDropdownToggle = () => {\n setIsKebabDropdownOpen(!isKebabDropdownOpen);\n };\n\n const onKebabDropdownSelect = () => {\n setIsKebabDropdownOpen(!isKebabDropdownOpen);\n };\n\n const onFullKebabDropdownToggle = () => {\n setIsFullKebabDropdownOpen(!isFullKebabDropdownOpen);\n };\n\n const onFullKebabDropdownSelect = () => {\n setIsFullKebabDropdownOpen(!isFullKebabDropdownOpen);\n };\n\n const handleMenuKeys = (event: KeyboardEvent) => {\n if (!isOpen) {\n return;\n }\n if (menuRef.current?.contains(event.target as Node) || toggleRef.current?.contains(event.target as Node)) {\n if (event.key === 'Escape') {\n setIsOpen(!isOpen);\n toggleRef.current?.focus();\n }\n }\n };\n\n const handleClickOutside = (event: MouseEvent) => {\n if (isOpen && !menuRef.current?.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n const onToggleClick = (ev: React.MouseEvent) => {\n ev.stopPropagation(); // Stop handleClickOutside from handling\n setTimeout(() => {\n if (menuRef.current) {\n const firstElement = menuRef.current.querySelector(\n 'li > button:not(:disabled), li > a:not(:disabled), input:not(:disabled)'\n );\n firstElement && (firstElement as HTMLElement).focus();\n setRefFullOptions(Array.from(menuRef.current.querySelectorAll('li:not(li[role=separator])>*:first-child')));\n }\n }, 0);\n setIsOpen(!isOpen);\n };\n\n useEffect(() => {\n window.addEventListener('keydown', handleMenuKeys);\n window.addEventListener('click', handleClickOutside);\n\n return () => {\n window.removeEventListener('keydown', handleMenuKeys);\n window.removeEventListener('click', handleClickOutside);\n };\n }, [isOpen, menuRef]);\n\n const toggle = (\n <MenuToggle\n aria-label=\"Toggle\"\n ref={toggleRef}\n variant=\"plain\"\n onClick={onToggleClick}\n isExpanded={isOpen}\n style={{ width: 'auto' }}\n icon={<RhUiThumbnailViewSmallFillIcon />}\n />\n );\n\n const menuItems = [\n <MenuGroup key=\"group1\" label=\"Group 1\">\n <MenuList>\n <MenuItem itemId=\"0\" id=\"0\" isFavorited={favorites.includes('0')}>\n Application 1\n </MenuItem>\n <MenuItem\n itemId=\"1\"\n id=\"1\"\n isFavorited={favorites.includes('1')}\n to=\"#default-link2\"\n onClick={(ev) => ev.preventDefault()}\n >\n Application 2\n </MenuItem>\n </MenuList>\n </MenuGroup>,\n <Divider key=\"group1-divider\" />,\n <MenuGroup key=\"group2\" label=\"Group 2\">\n <MenuList>\n <MenuItem\n itemId=\"2\"\n id=\"2\"\n isFavorited={favorites.includes('2')}\n to=\"#default-link3\"\n onClick={(ev) => ev.preventDefault()}\n >\n Application 3\n </MenuItem>\n <MenuItem\n itemId=\"3\"\n id=\"3\"\n isFavorited={favorites.includes('3')}\n isExternalLink\n icon={<img src={pfIcon} />}\n to=\"#default-link4\"\n onClick={(ev) => ev.preventDefault()}\n >\n Application 4 with icon\n </MenuItem>\n </MenuList>\n </MenuGroup>,\n <Divider key=\"group2-divider\" />,\n <MenuList key=\"other-items\">\n <MenuItem key=\"tooltip-app\" isFavorited={favorites.includes('4')} itemId=\"4\" id=\"4\">\n <Tooltip content={<div>Launch Application 4</div>} position=\"right\">\n <span>Application 4 with tooltip</span>\n </Tooltip>\n </MenuItem>\n <MenuItem key=\"disabled-app\" itemId=\"5\" id=\"5\" isDisabled>\n Unavailable Application\n </MenuItem>\n </MenuList>\n ];\n\n const createFavorites = (favIds: string[]) => {\n const favorites: unknown[] = [];\n\n menuItems.forEach((item) => {\n if (item.type === MenuList) {\n item.props.children.filter((child) => {\n if (favIds.includes(child.props.itemId)) {\n favorites.push(child);\n }\n });\n } else if (item.type === MenuGroup) {\n item.props.children.props.children.filter((child) => {\n if (favIds.includes(child.props.itemId)) {\n favorites.push(child);\n }\n });\n } else {\n if (favIds.includes(item.props.itemId)) {\n favorites.push(item);\n }\n }\n });\n\n return favorites;\n };\n\n const filterItems = (items: any[], filteredIds: string[]) => {\n if (filteredIds.length === 1 && filteredIds[0] === '*') {\n return items;\n }\n let keepDivider = false;\n const filteredCopy = items\n .map((group) => {\n if (group.type === MenuGroup) {\n const filteredGroup = cloneElement(group, {\n children: cloneElement(group.props.children, {\n children: group.props.children.props.children.filter((child) => {\n if (filteredIds.includes(child.props.itemId)) {\n return child;\n }\n })\n })\n });\n const filteredList = filteredGroup.props.children;\n if (filteredList.props.children.length > 0) {\n keepDivider = true;\n return filteredGroup;\n } else {\n keepDivider = false;\n }\n } else if (group.type === MenuList) {\n const filteredGroup = cloneElement(group, {\n children: group.props.children.filter((child) => {\n if (filteredIds.includes(child.props.itemId)) {\n return child;\n }\n })\n });\n if (filteredGroup.props.children.length > 0) {\n keepDivider = true;\n return filteredGroup;\n } else {\n keepDivider = false;\n }\n } else {\n if ((keepDivider && group.type === Divider) || filteredIds.includes(group.props.itemId)) {\n return group;\n }\n }\n })\n .filter((newGroup) => newGroup);\n\n if (filteredCopy.length > 0) {\n const lastGroup = filteredCopy.pop();\n if (lastGroup.type !== Divider) {\n filteredCopy.push(lastGroup);\n }\n }\n\n return filteredCopy;\n };\n\n const onTextChange = (textValue: string) => {\n setSearchValue(textValue);\n if (textValue === '') {\n setFilteredIds(['*']);\n return;\n }\n\n const filteredIds =\n refFullOptions\n ?.filter((item) => (item as HTMLElement).innerText.toLowerCase().includes(textValue.toString().toLowerCase()))\n .map((item) => item.id) || [];\n setFilteredIds(filteredIds);\n };\n\n const onFavorite = (event: any, itemId: string, actionId: string) => {\n event.stopPropagation();\n if (actionId === 'fav') {\n const isFavorite = favorites.includes(itemId);\n if (isFavorite) {\n setFavorites(favorites.filter((fav) => fav !== itemId));\n } else {\n setFavorites([...favorites, itemId]);\n }\n }\n };\n\n const filteredFavorites = filterItems(createFavorites(favorites), filteredIds);\n const filteredItems = filterItems(menuItems, filteredIds);\n if (filteredItems.length === 0) {\n filteredItems.push(<MenuItem key=\"no-items\">No results found</MenuItem>);\n }\n\n const menu = (\n // eslint-disable-next-line no-console\n <Menu ref={menuRef} onActionClick={onFavorite} onSelect={(_ev, itemId) => console.log('selected', itemId)}>\n <MenuSearchInput>\n <SearchInput\n aria-label=\"Filter menu items\"\n value={searchValue}\n onChange={(_event, value) => onTextChange(value)}\n onClear={(event) => {\n event.stopPropagation();\n onTextChange('');\n }}\n />\n </MenuSearchInput>\n <Divider />\n <MenuContent>\n {filteredFavorites.length > 0 && (\n <Fragment>\n <MenuGroup key=\"favorites-group\" label=\"Favorites\">\n <MenuList>{filteredFavorites}</MenuList>\n </MenuGroup>\n <Divider key=\"favorites-divider\" />\n </Fragment>\n )}\n {filteredItems}\n </MenuContent>\n </Menu>\n );\n\n const dashboardBreadcrumb = (\n <Breadcrumb>\n <BreadcrumbItem>Section home</BreadcrumbItem>\n <BreadcrumbItem to=\"#\">Section title</BreadcrumbItem>\n <BreadcrumbItem to=\"#\">Section title</BreadcrumbItem>\n <BreadcrumbItem to=\"#\" isActive>\n Section landing\n </BreadcrumbItem>\n </Breadcrumb>\n );\n\n const kebabDropdownItems = (\n <>\n <DropdownItem key=\"settings\">\n <RhUiSettingsFillIcon /> Settings\n </DropdownItem>\n <DropdownItem key=\"help\">\n <HelpIcon /> Help\n </DropdownItem>\n </>\n );\n const userDropdownItems = [\n <>\n <DropdownItem key=\"group 2 profile\">My profile</DropdownItem>\n <DropdownItem key=\"group 2 user\">User management</DropdownItem>\n <DropdownItem key=\"group 2 logout\">Logout</DropdownItem>\n </>\n ];\n\n const headerToolbar = (\n <Toolbar id=\"toolbar\" isStatic>\n <ToolbarContent>\n <ToolbarGroup\n variant=\"action-group-plain\"\n align={{ default: 'alignEnd' }}\n gap={{ default: 'gapNone', md: 'gapMd' }}\n >\n <ToolbarItem>\n <NotificationBadge aria-label=\"Notifications\" variant={NotificationBadgeVariant.read} onClick={() => {}} />\n </ToolbarItem>\n <ToolbarGroup variant=\"action-group-plain\" visibility={{ default: 'hidden', lg: 'visible' }}>\n <ToolbarItem visibility={{ default: 'hidden', md: 'hidden', lg: 'visible' }}>\n <Popper trigger={toggle} triggerRef={toggleRef} popper={menu} popperRef={menuRef} isVisible={isOpen} />\n </ToolbarItem>\n <ToolbarItem>\n <Button aria-label=\"Settings\" isSettings variant=\"plain\" />\n </ToolbarItem>\n <ToolbarItem>\n <Button aria-label=\"Help\" variant={ButtonVariant.plain} icon={<RhUiQuestionMarkCircleFillIcon />} />\n </ToolbarItem>\n </ToolbarGroup>\n <ToolbarItem visibility={{ default: 'hidden', md: 'visible', lg: 'hidden' }}>\n <Dropdown\n isOpen={isKebabDropdownOpen}\n onSelect={onKebabDropdownSelect}\n onOpenChange={(isOpen: boolean) => setIsKebabDropdownOpen(isOpen)}\n popperProps={{ position: 'right' }}\n toggle={(toggleRef: React.Ref<MenuToggleElement>) => (\n <MenuToggle\n ref={toggleRef}\n onClick={onKebabDropdownToggle}\n isExpanded={isKebabDropdownOpen}\n variant=\"plain\"\n aria-label=\"Settings and help\"\n icon={<RhUiEllipsisVerticalFillIcon />}\n />\n )}\n >\n <DropdownList>{kebabDropdownItems}</DropdownList>\n </Dropdown>\n </ToolbarItem>\n <ToolbarItem visibility={{ md: 'hidden' }}>\n <Dropdown\n isOpen={isFullKebabDropdownOpen}\n onSelect={onFullKebabDropdownSelect}\n onOpenChange={(isOpen: boolean) => setIsFullKebabDropdownOpen(isOpen)}\n popperProps={{ position: 'right' }}\n toggle={(toggleRef: React.Ref<MenuToggleElement>) => (\n <MenuToggle\n ref={toggleRef}\n onClick={onFullKebabDropdownToggle}\n isExpanded={isFullKebabDropdownOpen}\n variant=\"plain\"\n aria-label=\"Toolbar menu\"\n icon={<RhUiEllipsisVerticalFillIcon />}\n />\n )}\n >\n <DropdownGroup key=\"group 2\" aria-label=\"User actions\">\n <DropdownList>{userDropdownItems}</DropdownList>\n </DropdownGroup>\n <Divider />\n <DropdownList>{kebabDropdownItems}</DropdownList>\n </Dropdown>\n </ToolbarItem>\n </ToolbarGroup>\n <ToolbarItem visibility={{ default: 'hidden', md: 'visible' }}>\n <Dropdown\n isOpen={isDropdownOpen}\n onSelect={onDropdownSelect}\n onOpenChange={(isOpen: boolean) => setIsDropdownOpen(isOpen)}\n popperProps={{ position: 'right' }}\n toggle={(toggleRef: React.Ref<MenuToggleElement>) => (\n <MenuToggle\n ref={toggleRef}\n onClick={onDropdownToggle}\n isExpanded={isDropdownOpen}\n icon={<Avatar src={imgAvatar} alt=\"\" size=\"sm\" />}\n >\n Ned Username\n </MenuToggle>\n )}\n >\n <DropdownList>{userDropdownItems}</DropdownList>\n </Dropdown>\n </ToolbarItem>\n </ToolbarContent>\n </Toolbar>\n );\n\n const masthead = (\n <Masthead>\n <MastheadMain>\n <MastheadToggle>\n <PageToggleButton isHamburgerButton aria-label=\"Global navigation\" />\n </MastheadToggle>\n <MastheadBrand>\n <MastheadLogo>\n <Brand src={pfLogo} alt=\"PatternFly\" heights={{ default: '36px' }} />\n </MastheadLogo>\n </MastheadBrand>\n </MastheadMain>\n <MastheadContent>{headerToolbar}</MastheadContent>\n </Masthead>\n );\n\n const pageNav = (\n <Nav onSelect={onNavSelect} aria-label=\"Nav\">\n <NavList>\n <NavItem itemId={0} isActive={activeItem === 0} to=\"#system-panel\">\n System panel\n </NavItem>\n <NavItem itemId={1} isActive={activeItem === 1} to=\"#policy\">\n Policy\n </NavItem>\n <NavItem itemId={2} isActive={activeItem === 2} to=\"#auth\">\n Authentication\n </NavItem>\n <NavItem itemId={3} isActive={activeItem === 3} to=\"#network\">\n Network services\n </NavItem>\n <NavItem itemId={4} isActive={activeItem === 4} to=\"#server\">\n Server\n </NavItem>\n </NavList>\n </Nav>\n );\n\n const sidebar = (\n <PageSidebar>\n <PageSidebarBody>{pageNav}</PageSidebarBody>\n </PageSidebar>\n );\n\n const mainContainerId = 'main-content-page-layout-tertiary-nav';\n\n const handleClick = (event) => {\n event.preventDefault();\n\n const mainContentElement = document.getElementById(mainContainerId);\n if (mainContentElement) {\n mainContentElement.focus();\n }\n };\n\n const pageSkipToContent = (\n <SkipToContent onClick={handleClick} href={`#${mainContainerId}`}>\n Skip to content\n </SkipToContent>\n );\n\n return (\n <Page\n masthead={masthead}\n sidebar={sidebar}\n isManagedSidebar\n skipToContent={pageSkipToContent}\n breadcrumb={dashboardBreadcrumb}\n mainContainerId={mainContainerId}\n isHorizontalSubnavWidthLimited\n isBreadcrumbWidthLimited\n isBreadcrumbGrouped\n additionalGroupedContent={\n <PageSection aria-labelledby=\"main-title\">\n <Content>\n <h1 id=\"main-title\">Main title</h1>\n <p>This is a full page demo.</p>\n </Content>\n </PageSection>\n }\n >\n <PageSection aria-label=\"Card gallery\">\n <Gallery hasGutter>\n {Array.from({ length: 10 }).map((_value, index) => (\n <GalleryItem key={index}>\n <Card>\n <CardBody>This is a card</CardBody>\n </Card>\n </GalleryItem>\n ))}\n </Gallery>\n </PageSection>\n </Page>\n );\n};\n","title":"Utilities and user dropdown menu","lang":"ts","isFullscreen":true,"className":""}}>
|
|
56
|
+
|
|
57
|
+
<p {...{"className":"pf-v6-c-content--p pf-m-editorial ws-p "}}>
|
|
58
|
+
{`Many mastheads contain utilities which collapse into a dropdown at smaller viewport widths. These utilities could include a notification badge to open and close a notification drawer, a link to app or user settings, a help icon which could launch quick starts or link to other resources, and many other utilities. In this demo, the notification badge does not collapse down into the mobile menu so that it is always visible even at narrower viewport widths.`}
|
|
59
|
+
</p>
|
|
60
|
+
</Example>,
|
|
61
|
+
'Horizontal nav': props =>
|
|
62
|
+
<Example {...pageData} {...props} thumbnail={srcImporthorizontalnav} {...{"code":"import { useEffect, useRef, useState } from 'react';\nimport {\n Avatar,\n Brand,\n Breadcrumb,\n BreadcrumbItem,\n Button,\n ButtonVariant,\n Card,\n CardBody,\n Divider,\n Dropdown,\n DropdownGroup,\n DropdownItem,\n DropdownList,\n Gallery,\n GalleryItem,\n Masthead,\n MastheadMain,\n MastheadLogo,\n MastheadContent,\n MastheadBrand,\n MenuToggle,\n MenuToggleElement,\n Nav,\n NavItem,\n NavList,\n NotificationBadge,\n NotificationBadgeVariant,\n Page,\n PageSection,\n SkipToContent,\n Content,\n Toolbar,\n ToolbarContent,\n ToolbarGroup,\n ToolbarItem\n} from '@patternfly/react-core';\nimport RhUiEllipsisVerticalFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-ellipsis-vertical-fill-icon';\nimport RhUiSettingsFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-settings-fill-icon';\nimport HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon';\nimport RhUiQuestionMarkCircleFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-question-mark-circle-fill-icon';\nimport imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.svg';\nimport pfLogo from '@patternfly/react-core/src/demos/assets/pf-logo.svg';\n\ninterface NavOnSelectProps {\n groupId: number | string;\n itemId: number | string;\n to: string;\n}\n\nexport const MastheadWithHorizontalNav: React.FunctionComponent = () => {\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n const [isKebabDropdownOpen, setIsKebabDropdownOpen] = useState(false);\n const [isFullKebabDropdownOpen, setIsFullKebabDropdownOpen] = useState(false);\n const [activeItem, setActiveItem] = useState(0);\n\n const [isOpen, setIsOpen] = useState<boolean>(false);\n const menuRef = useRef<HTMLDivElement>(null);\n const toggleRef = useRef<HTMLButtonElement>(null);\n\n const onNavSelect = (_event: React.FormEvent<HTMLInputElement>, selectedItem: NavOnSelectProps) => {\n typeof selectedItem.itemId === 'number' && setActiveItem(selectedItem.itemId);\n };\n\n const onDropdownToggle = () => {\n setIsDropdownOpen(!isDropdownOpen);\n };\n\n const onDropdownSelect = () => {\n setIsDropdownOpen(!isDropdownOpen);\n };\n\n const onKebabDropdownToggle = () => {\n setIsKebabDropdownOpen(!isKebabDropdownOpen);\n };\n\n const onKebabDropdownSelect = () => {\n setIsKebabDropdownOpen(!isKebabDropdownOpen);\n };\n\n const onFullKebabDropdownToggle = () => {\n setIsFullKebabDropdownOpen(!isFullKebabDropdownOpen);\n };\n\n const onFullKebabDropdownSelect = () => {\n setIsFullKebabDropdownOpen(!isFullKebabDropdownOpen);\n };\n\n const handleMenuKeys = (event: KeyboardEvent) => {\n if (!isOpen) {\n return;\n }\n if (menuRef.current?.contains(event.target as Node) || toggleRef.current?.contains(event.target as Node)) {\n if (event.key === 'Escape') {\n setIsOpen(!isOpen);\n toggleRef.current?.focus();\n }\n }\n };\n\n const handleClickOutside = (event: MouseEvent) => {\n if (isOpen && !menuRef.current?.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n useEffect(() => {\n window.addEventListener('keydown', handleMenuKeys);\n window.addEventListener('click', handleClickOutside);\n\n return () => {\n window.removeEventListener('keydown', handleMenuKeys);\n window.removeEventListener('click', handleClickOutside);\n };\n }, [isOpen, menuRef]);\n\n const dashboardBreadcrumb = (\n <Breadcrumb>\n <BreadcrumbItem>Section home</BreadcrumbItem>\n <BreadcrumbItem to=\"#\">Section title</BreadcrumbItem>\n <BreadcrumbItem to=\"#\">Section title</BreadcrumbItem>\n <BreadcrumbItem to=\"#\" isActive>\n Section landing\n </BreadcrumbItem>\n </Breadcrumb>\n );\n\n const kebabDropdownItems = (\n <>\n <DropdownItem key=\"settings\">\n <RhUiSettingsFillIcon /> Settings\n </DropdownItem>\n <DropdownItem key=\"help\">\n <HelpIcon /> Help\n </DropdownItem>\n </>\n );\n const userDropdownItems = [\n <>\n <DropdownItem key=\"group 2 profile\">My profile</DropdownItem>\n <DropdownItem key=\"group 2 user\">User management</DropdownItem>\n <DropdownItem key=\"group 2 logout\">Logout</DropdownItem>\n </>\n ];\n\n const PageHorizontalNav = () => (\n <ToolbarItem isOverflowContainer>\n <Nav\n id=\"page-layout-horizontal-nav-horizontal-nav\"\n onSelect={onNavSelect}\n aria-label=\"Global\"\n variant=\"horizontal\"\n >\n <NavList>\n <NavItem itemId={0} isActive={activeItem === 0} to=\"#horizontal-1\">\n Horizontal nav item 1\n </NavItem>\n <NavItem itemId={1} isActive={activeItem === 1} to=\"#horizontal-2\">\n Horizontal nav item 2\n </NavItem>\n <NavItem itemId={2} isActive={activeItem === 2} to=\"#horizontal-3\">\n Horizontal nav item 3\n </NavItem>\n <NavItem itemId={3} isActive={activeItem === 3} to=\"#horizontal-4\">\n Horizontal nav item 4\n </NavItem>\n <NavItem itemId={4} isActive={activeItem === 4} to=\"#horizontal-5\">\n Horizontal nav item 5\n </NavItem>\n <NavItem itemId={5} isActive={activeItem === 4} to=\"#horizontal-6\">\n Horizontal nav item 6\n </NavItem>\n <NavItem itemId={6} isActive={activeItem === 4} to=\"#horizontal-7\">\n Horizontal nav item 7\n </NavItem>\n </NavList>\n </Nav>\n </ToolbarItem>\n );\n\n const headerToolbar = (\n <Toolbar id=\"toolbar\">\n <ToolbarContent>\n <PageHorizontalNav />\n <ToolbarGroup\n variant=\"action-group-plain\"\n align={{ default: 'alignEnd' }}\n gap={{ default: 'gapNone', md: 'gapMd' }}\n >\n <ToolbarItem>\n <NotificationBadge aria-label=\"Notifications\" variant={NotificationBadgeVariant.read} onClick={() => {}} />\n </ToolbarItem>\n <ToolbarGroup variant=\"action-group-plain\" visibility={{ default: 'hidden', lg: 'visible' }}>\n <ToolbarItem>\n <Button aria-label=\"Settings\" isSettings variant=\"plain\" />\n </ToolbarItem>\n <ToolbarItem>\n <Button aria-label=\"Help\" variant={ButtonVariant.plain} icon={<RhUiQuestionMarkCircleFillIcon />} />\n </ToolbarItem>\n </ToolbarGroup>\n <ToolbarItem visibility={{ default: 'hidden', md: 'visible', lg: 'hidden' }}>\n <Dropdown\n isOpen={isKebabDropdownOpen}\n onSelect={onKebabDropdownSelect}\n onOpenChange={(isOpen: boolean) => setIsKebabDropdownOpen(isOpen)}\n popperProps={{ position: 'right' }}\n toggle={(toggleRef: React.Ref<MenuToggleElement>) => (\n <MenuToggle\n ref={toggleRef}\n onClick={onKebabDropdownToggle}\n isExpanded={isKebabDropdownOpen}\n variant=\"plain\"\n aria-label=\"Settings and help\"\n icon={<RhUiEllipsisVerticalFillIcon />}\n />\n )}\n >\n <DropdownList>{kebabDropdownItems}</DropdownList>\n </Dropdown>\n </ToolbarItem>\n <ToolbarItem visibility={{ md: 'hidden' }}>\n <Dropdown\n isOpen={isFullKebabDropdownOpen}\n onSelect={onFullKebabDropdownSelect}\n onOpenChange={(isOpen: boolean) => setIsFullKebabDropdownOpen(isOpen)}\n popperProps={{ position: 'right' }}\n toggle={(toggleRef: React.Ref<MenuToggleElement>) => (\n <MenuToggle\n ref={toggleRef}\n onClick={onFullKebabDropdownToggle}\n isExpanded={isFullKebabDropdownOpen}\n variant=\"plain\"\n aria-label=\"Toolbar menu\"\n icon={<RhUiEllipsisVerticalFillIcon />}\n />\n )}\n >\n <DropdownGroup key=\"group 2\" aria-label=\"User actions\">\n <DropdownList>{userDropdownItems}</DropdownList>\n </DropdownGroup>\n <Divider />\n <DropdownList>{kebabDropdownItems}</DropdownList>\n </Dropdown>\n </ToolbarItem>\n </ToolbarGroup>\n <ToolbarItem visibility={{ default: 'hidden', md: 'visible' }}>\n <Dropdown\n isOpen={isDropdownOpen}\n onSelect={onDropdownSelect}\n onOpenChange={(isOpen: boolean) => setIsDropdownOpen(isOpen)}\n popperProps={{ position: 'right' }}\n toggle={(toggleRef: React.Ref<MenuToggleElement>) => (\n <MenuToggle\n ref={toggleRef}\n onClick={onDropdownToggle}\n isExpanded={isDropdownOpen}\n icon={<Avatar src={imgAvatar} alt=\"\" size=\"sm\" />}\n >\n Ned Username\n </MenuToggle>\n )}\n >\n <DropdownList>{userDropdownItems}</DropdownList>\n </Dropdown>\n </ToolbarItem>\n </ToolbarContent>\n </Toolbar>\n );\n\n const masthead = (\n <Masthead>\n <MastheadMain>\n <MastheadBrand>\n <MastheadLogo>\n <Brand src={pfLogo} alt=\"PatternFly\" heights={{ default: '36px' }} />\n </MastheadLogo>\n </MastheadBrand>\n </MastheadMain>\n <MastheadContent>{headerToolbar}</MastheadContent>\n </Masthead>\n );\n\n const mainContainerId = 'main-content-page-layout-tertiary-nav';\n\n const handleClick = (event) => {\n event.preventDefault();\n\n const mainContentElement = document.getElementById(mainContainerId);\n if (mainContentElement) {\n mainContentElement.focus();\n }\n };\n\n const pageSkipToContent = (\n <SkipToContent onClick={handleClick} href={`#${mainContainerId}`}>\n Skip to content\n </SkipToContent>\n );\n\n return (\n <Page\n masthead={masthead}\n isManagedSidebar\n skipToContent={pageSkipToContent}\n breadcrumb={dashboardBreadcrumb}\n mainContainerId={mainContainerId}\n isBreadcrumbWidthLimited\n isBreadcrumbGrouped\n additionalGroupedContent={\n <PageSection aria-labelledby=\"main-title\">\n <Content>\n <Content component=\"h1\" id=\"main-title\">\n Main title\n </Content>\n <Content component=\"p\">This is a full page demo.</Content>\n </Content>\n </PageSection>\n }\n >\n <PageSection aria-label=\"Card gallery\">\n <Gallery hasGutter>\n {Array.from({ length: 10 }).map((_value, index) => (\n <GalleryItem key={index}>\n <Card>\n <CardBody>This is a card</CardBody>\n </Card>\n </GalleryItem>\n ))}\n </Gallery>\n </PageSection>\n </Page>\n );\n};\n","title":"Horizontal nav","lang":"ts","isFullscreen":true,"className":""}}>
|
|
63
|
+
|
|
64
|
+
</Example>
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
const Component = () => (
|
|
68
|
+
<React.Fragment>
|
|
69
|
+
<AutoLinkHeader {...{"id":"demos","headingLevel":"h2","className":"ws-title ws-h2"}}>
|
|
70
|
+
{`Demos`}
|
|
71
|
+
</AutoLinkHeader>
|
|
72
|
+
{React.createElement(pageData.examples["Utilities and user dropdown menu"])}
|
|
73
|
+
{React.createElement(pageData.examples["Horizontal nav"])}
|
|
74
|
+
</React.Fragment>
|
|
75
|
+
);
|
|
76
|
+
Component.displayName = 'ComponentsMastheadReactDemosDocs';
|
|
77
|
+
Component.pageData = pageData;
|
|
78
|
+
|
|
79
|
+
export default Component;
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { AutoLinkHeader, Example, Link as PatternflyThemeLink } from '@patternfly/documentation-framework/components';
|
|
3
|
+
import RhUiMenuBarsIcon from '@patternfly/react-icons/dist/js/icons/rh-ui-menu-bars-icon';
|
|
4
|
+
import pfIcon from '../../../../../react-core/src/components/Masthead/examples/../../assets/PF-HorizontalLogo-Color.svg';
|
|
5
|
+
const pageData = {
|
|
6
|
+
"id": "Masthead",
|
|
7
|
+
"section": "components",
|
|
8
|
+
"subsection": "",
|
|
9
|
+
"deprecated": false,
|
|
10
|
+
"template": false,
|
|
11
|
+
"beta": false,
|
|
12
|
+
"demo": false,
|
|
13
|
+
"newImplementationLink": false,
|
|
14
|
+
"source": "react",
|
|
15
|
+
"tabName": null,
|
|
16
|
+
"slug": "/components/masthead/react",
|
|
17
|
+
"sourceLink": "https://github.com/patternfly/patternfly-react/blob/main/packages/react-core/src/components/Masthead/examples/Masthead.md",
|
|
18
|
+
"relPath": "packages/react-core/src/components/Masthead/examples/Masthead.md",
|
|
19
|
+
"propComponents": [
|
|
20
|
+
{
|
|
21
|
+
"name": "Masthead",
|
|
22
|
+
"description": "",
|
|
23
|
+
"props": [
|
|
24
|
+
{
|
|
25
|
+
"name": "children",
|
|
26
|
+
"type": "React.ReactNode",
|
|
27
|
+
"description": "Content rendered inside of the masthead"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"name": "className",
|
|
31
|
+
"type": "string",
|
|
32
|
+
"description": "Additional classes added to the masthead"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"name": "display",
|
|
36
|
+
"type": "{\n default?: 'inline' | 'stack';\n sm?: 'inline' | 'stack';\n md?: 'inline' | 'stack';\n lg?: 'inline' | 'stack';\n xl?: 'inline' | 'stack';\n '2xl'?: 'inline' | 'stack';\n}",
|
|
37
|
+
"description": "Display type at various breakpoints",
|
|
38
|
+
"defaultValue": "{\n md: 'inline'\n}"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"name": "inset",
|
|
42
|
+
"type": "{\n default?: 'insetNone' | 'insetXs' | 'insetSm' | 'insetMd' | 'insetLg' | 'insetXl' | 'inset2xl' | 'inset3xl';\n sm?: 'insetNone' | 'insetXs' | 'insetSm' | 'insetMd' | 'insetLg' | 'insetXl' | 'inset2xl' | 'inset3xl';\n md?: 'insetNone' | 'insetXs' | 'insetSm' | 'insetMd' | 'insetLg' | 'insetXl' | 'inset2xl' | 'inset3xl';\n lg?: 'insetNone' | 'insetXs' | 'insetSm' | 'insetMd' | 'insetLg' | 'insetXl' | 'inset2xl' | 'inset3xl';\n xl?: 'insetNone' | 'insetXs' | 'insetSm' | 'insetMd' | 'insetLg' | 'insetXl' | 'inset2xl' | 'inset3xl';\n '2xl'?: 'insetNone' | 'insetXs' | 'insetSm' | 'insetMd' | 'insetLg' | 'insetXl' | 'inset2xl' | 'inset3xl';\n}",
|
|
43
|
+
"description": "Insets at various breakpoints"
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"name": "variant",
|
|
47
|
+
"type": "'default' | 'docked'",
|
|
48
|
+
"description": "Indicates the variant of the masthead",
|
|
49
|
+
"defaultValue": "'default'",
|
|
50
|
+
"beta": true
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"name": "MastheadToggle",
|
|
56
|
+
"description": "",
|
|
57
|
+
"props": [
|
|
58
|
+
{
|
|
59
|
+
"name": "children",
|
|
60
|
+
"type": "React.ReactNode",
|
|
61
|
+
"description": "Content rendered inside of the masthead toggle."
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"name": "className",
|
|
65
|
+
"type": "string",
|
|
66
|
+
"description": "Additional classes added to the masthead toggle."
|
|
67
|
+
}
|
|
68
|
+
]
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"name": "MastheadMain",
|
|
72
|
+
"description": "",
|
|
73
|
+
"props": [
|
|
74
|
+
{
|
|
75
|
+
"name": "children",
|
|
76
|
+
"type": "React.ReactNode",
|
|
77
|
+
"description": "Content rendered inside of the masthead main block."
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"name": "className",
|
|
81
|
+
"type": "string",
|
|
82
|
+
"description": "Additional classes added to the masthead main."
|
|
83
|
+
}
|
|
84
|
+
]
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"name": "MastheadBrand",
|
|
88
|
+
"description": "",
|
|
89
|
+
"props": [
|
|
90
|
+
{
|
|
91
|
+
"name": "children",
|
|
92
|
+
"type": "React.ReactNode",
|
|
93
|
+
"description": "Content rendered inside of the masthead brand."
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"name": "className",
|
|
97
|
+
"type": "string",
|
|
98
|
+
"description": "Additional classes added to the masthead brand."
|
|
99
|
+
}
|
|
100
|
+
]
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"name": "MastheadLogo",
|
|
104
|
+
"description": "",
|
|
105
|
+
"props": [
|
|
106
|
+
{
|
|
107
|
+
"name": "children",
|
|
108
|
+
"type": "React.ReactNode",
|
|
109
|
+
"description": "Content rendered inside of the masthead logo."
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"name": "className",
|
|
113
|
+
"type": "string",
|
|
114
|
+
"description": "Additional classes added to the masthead logo."
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"name": "component",
|
|
118
|
+
"type": "React.ElementType<any> | React.ComponentType<any>",
|
|
119
|
+
"description": "Component type of the masthead logo."
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"name": "isCompact",
|
|
123
|
+
"type": "boolean",
|
|
124
|
+
"description": "Flag indicating the logo is a compact variant. Used in docked layouts.",
|
|
125
|
+
"defaultValue": "false",
|
|
126
|
+
"beta": true
|
|
127
|
+
}
|
|
128
|
+
]
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"name": "MastheadContent",
|
|
132
|
+
"description": "",
|
|
133
|
+
"props": [
|
|
134
|
+
{
|
|
135
|
+
"name": "children",
|
|
136
|
+
"type": "React.ReactNode",
|
|
137
|
+
"description": "Content rendered inside of the masthead content block."
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
"name": "className",
|
|
141
|
+
"type": "string",
|
|
142
|
+
"description": "Additional classes added to the masthead content."
|
|
143
|
+
}
|
|
144
|
+
]
|
|
145
|
+
}
|
|
146
|
+
],
|
|
147
|
+
"cssPrefix": [
|
|
148
|
+
"pf-v6-c-masthead"
|
|
149
|
+
],
|
|
150
|
+
"examples": [
|
|
151
|
+
"Basic",
|
|
152
|
+
"Basic with mixed content",
|
|
153
|
+
"Display inline",
|
|
154
|
+
"Display stack",
|
|
155
|
+
"Display stack, display inline responsive",
|
|
156
|
+
"Inset",
|
|
157
|
+
"Custom logo component"
|
|
158
|
+
]
|
|
159
|
+
};
|
|
160
|
+
pageData.liveContext = {
|
|
161
|
+
RhUiMenuBarsIcon,
|
|
162
|
+
pfIcon
|
|
163
|
+
};
|
|
164
|
+
pageData.examples = {
|
|
165
|
+
'Basic': props =>
|
|
166
|
+
<Example {...pageData} {...props} {...{"code":"import {\n Masthead,\n MastheadMain,\n MastheadToggle,\n MastheadBrand,\n MastheadLogo,\n MastheadContent,\n Button\n} from '@patternfly/react-core';\n\nexport const MastheadBasic: React.FunctionComponent = () => (\n <Masthead id=\"basic-example\">\n <MastheadMain>\n <MastheadToggle>\n <Button variant=\"plain\" isHamburger onClick={() => {}} aria-label=\"Global navigation\" />\n </MastheadToggle>\n <MastheadBrand>\n <MastheadLogo component=\"a\">Logo</MastheadLogo>\n </MastheadBrand>\n </MastheadMain>\n <MastheadContent>\n <span>Content</span>\n </MastheadContent>\n </Masthead>\n);\n","title":"Basic","lang":"ts","className":""}}>
|
|
167
|
+
|
|
168
|
+
</Example>,
|
|
169
|
+
'Basic with mixed content': props =>
|
|
170
|
+
<Example {...pageData} {...props} {...{"code":"import {\n Masthead,\n MastheadMain,\n MastheadToggle,\n MastheadBrand,\n MastheadLogo,\n MastheadContent,\n Button,\n Flex,\n FlexItem\n} from '@patternfly/react-core';\n\nexport const MastheadBasicMixedContent: React.FunctionComponent = () => (\n <Masthead id=\"basic-mixed\">\n <MastheadMain>\n <MastheadToggle>\n <Button variant=\"plain\" isHamburger onClick={() => {}} aria-label=\"Global navigation\" />\n </MastheadToggle>\n <MastheadBrand>\n <MastheadLogo component=\"a\">Logo</MastheadLogo>\n </MastheadBrand>\n </MastheadMain>\n <MastheadContent>\n <Flex>\n <span>Content</span>\n <Button>Primary</Button>\n <FlexItem alignSelf={{ default: 'alignSelfFlexEnd' }}>\n <Button variant=\"secondary\">Secondary</Button>\n </FlexItem>\n <FlexItem alignSelf={{ default: 'alignSelfFlexEnd' }}>\n <Button variant=\"tertiary\">Tertiary</Button>\n </FlexItem>\n </Flex>\n </MastheadContent>\n </Masthead>\n);\n","title":"Basic with mixed content","lang":"ts","className":""}}>
|
|
171
|
+
|
|
172
|
+
</Example>,
|
|
173
|
+
'Display inline': props =>
|
|
174
|
+
<Example {...pageData} {...props} {...{"code":"import {\n Masthead,\n MastheadMain,\n MastheadToggle,\n MastheadBrand,\n MastheadLogo,\n MastheadContent,\n Button\n} from '@patternfly/react-core';\n\nexport const MastheadDisplayInline: React.FunctionComponent = () => (\n <Masthead id=\"inline-masthead\" display={{ default: 'inline' }}>\n <MastheadMain>\n <MastheadToggle>\n <Button variant=\"plain\" isHamburger onClick={() => {}} aria-label=\"Global navigation\" />\n </MastheadToggle>\n <MastheadBrand>\n <MastheadLogo component=\"a\">Logo</MastheadLogo>\n </MastheadBrand>\n </MastheadMain>\n <MastheadContent>\n <span>Content</span>\n </MastheadContent>\n </Masthead>\n);\n","title":"Display inline","lang":"ts","className":""}}>
|
|
175
|
+
|
|
176
|
+
</Example>,
|
|
177
|
+
'Display stack': props =>
|
|
178
|
+
<Example {...pageData} {...props} {...{"code":"import {\n Masthead,\n MastheadMain,\n MastheadToggle,\n MastheadBrand,\n MastheadLogo,\n MastheadContent,\n Button\n} from '@patternfly/react-core';\n\nexport const MastheadDisplayStack: React.FunctionComponent = () => (\n <Masthead id=\"stack-masthead\" display={{ default: 'stack' }}>\n <MastheadMain>\n <MastheadToggle>\n <Button variant=\"plain\" isHamburger onClick={() => {}} aria-label=\"Global navigation\" />\n </MastheadToggle>\n <MastheadBrand>\n <MastheadLogo component=\"a\">Logo</MastheadLogo>\n </MastheadBrand>\n </MastheadMain>\n <MastheadContent>\n <span>Content</span>\n </MastheadContent>\n </Masthead>\n);\n","title":"Display stack","lang":"ts","className":""}}>
|
|
179
|
+
|
|
180
|
+
</Example>,
|
|
181
|
+
'Display stack, display inline responsive': props =>
|
|
182
|
+
<Example {...pageData} {...props} {...{"code":"import {\n Masthead,\n MastheadMain,\n MastheadToggle,\n MastheadBrand,\n MastheadLogo,\n MastheadContent,\n Button\n} from '@patternfly/react-core';\n\nexport const MastheadDisplayStackInlineResponsive: React.FunctionComponent = () => (\n <Masthead id=\"stack-inline-masthead\" display={{ default: 'inline', lg: 'stack', '2xl': 'inline' }}>\n <MastheadMain>\n <MastheadToggle>\n <Button variant=\"plain\" isHamburger onClick={() => {}} aria-label=\"Global navigation\" />\n </MastheadToggle>\n <MastheadBrand>\n <MastheadLogo component=\"a\">Logo</MastheadLogo>\n </MastheadBrand>\n </MastheadMain>\n <MastheadContent>\n <span>Content</span>\n </MastheadContent>\n </Masthead>\n);\n","title":"Display stack, display inline responsive","lang":"ts","className":""}}>
|
|
183
|
+
|
|
184
|
+
</Example>,
|
|
185
|
+
'Inset': props =>
|
|
186
|
+
<Example {...pageData} {...props} {...{"code":"import {\n Masthead,\n MastheadMain,\n MastheadToggle,\n MastheadBrand,\n MastheadLogo,\n MastheadContent,\n Button\n} from '@patternfly/react-core';\n\nexport const MastheadInsets: React.FunctionComponent = () => (\n <Masthead id=\"inset-masthead\" inset={{ default: 'insetSm' }}>\n <MastheadMain>\n <MastheadToggle>\n <Button variant=\"plain\" isHamburger onClick={() => {}} aria-label=\"Global navigation\" />\n </MastheadToggle>\n <MastheadBrand>\n <MastheadLogo component=\"a\">Logo</MastheadLogo>\n </MastheadBrand>\n </MastheadMain>\n <MastheadContent>\n <span>Content</span>\n </MastheadContent>\n </Masthead>\n);\n","title":"Inset","lang":"ts","className":""}}>
|
|
187
|
+
|
|
188
|
+
</Example>,
|
|
189
|
+
'Custom logo component': props =>
|
|
190
|
+
<Example {...pageData} {...props} {...{"code":"import {\n Masthead,\n MastheadMain,\n MastheadToggle,\n MastheadBrand,\n MastheadLogo,\n MastheadContent,\n Button,\n Brand\n} from '@patternfly/react-core';\nimport pfIcon from '../../assets/PF-HorizontalLogo-Color.svg';\n\nexport const MastheadLogoCustomComponent: React.FunctionComponent = () => (\n <Masthead id=\"icon-router-link\">\n <MastheadMain>\n <MastheadToggle>\n <Button variant=\"plain\" isHamburger onClick={() => {}} aria-label=\"Global navigation\" />\n </MastheadToggle>\n <MastheadBrand>\n <MastheadLogo component={(props) => <a {...props} href=\"#\" />}>\n <Brand src={pfIcon} alt=\"PatternFly\" heights={{ default: '36px' }} />\n </MastheadLogo>\n </MastheadBrand>\n </MastheadMain>\n <MastheadContent>\n <span>Content</span>\n </MastheadContent>\n </Masthead>\n);\n","title":"Custom logo component","lang":"ts","className":""}}>
|
|
191
|
+
|
|
192
|
+
<p {...{"className":"pf-v6-c-content--p pf-m-editorial ws-p "}}>
|
|
193
|
+
{`In addition to being able to pass a string to the `}
|
|
194
|
+
|
|
195
|
+
<code {...{"className":"ws-code "}}>
|
|
196
|
+
{`component`}
|
|
197
|
+
</code>
|
|
198
|
+
{` property of `}
|
|
199
|
+
|
|
200
|
+
<code {...{"className":"ws-code "}}>
|
|
201
|
+
{`MastheadLogo`}
|
|
202
|
+
</code>
|
|
203
|
+
{`, you can provide more fine-tuned customization by passing a callback that returns a component.`}
|
|
204
|
+
</p>
|
|
205
|
+
</Example>
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
const Component = () => (
|
|
209
|
+
<React.Fragment>
|
|
210
|
+
<p {...{"className":"pf-v6-c-content--p pf-m-editorial ws-p "}}>
|
|
211
|
+
{`To maintain proper layout and formatting, a `}
|
|
212
|
+
<code {...{"className":"ws-code "}}>
|
|
213
|
+
{`<Masthead>`}
|
|
214
|
+
</code>
|
|
215
|
+
{` should contain both a `}
|
|
216
|
+
<code {...{"className":"ws-code "}}>
|
|
217
|
+
{`<MastheadMain>`}
|
|
218
|
+
</code>
|
|
219
|
+
{` and `}
|
|
220
|
+
<code {...{"className":"ws-code "}}>
|
|
221
|
+
{`<MastheadContent>`}
|
|
222
|
+
</code>
|
|
223
|
+
{` component.`}
|
|
224
|
+
</p>
|
|
225
|
+
<p {...{"className":"pf-v6-c-content--p pf-m-editorial ws-p "}}>
|
|
226
|
+
{`Mastheads contain the `}
|
|
227
|
+
<code {...{"className":"ws-code "}}>
|
|
228
|
+
{`<MastheadMain>`}
|
|
229
|
+
</code>
|
|
230
|
+
{` that wraps a `}
|
|
231
|
+
<code {...{"className":"ws-code "}}>
|
|
232
|
+
{`<PageToggleButton>`}
|
|
233
|
+
</code>
|
|
234
|
+
{` and `}
|
|
235
|
+
<code {...{"className":"ws-code "}}>
|
|
236
|
+
{`<MastheadBrand>`}
|
|
237
|
+
</code>
|
|
238
|
+
{`. The `}
|
|
239
|
+
<code {...{"className":"ws-code "}}>
|
|
240
|
+
{`<MastheadBrand>`}
|
|
241
|
+
</code>
|
|
242
|
+
{` wraps `}
|
|
243
|
+
<code {...{"className":"ws-code "}}>
|
|
244
|
+
{`<MastheadLogo>`}
|
|
245
|
+
</code>
|
|
246
|
+
{`. The masthead also contains the page's header toolbar within `}
|
|
247
|
+
<code {...{"className":"ws-code "}}>
|
|
248
|
+
{`<MastheadContent>`}
|
|
249
|
+
</code>
|
|
250
|
+
{`.`}
|
|
251
|
+
</p>
|
|
252
|
+
<AutoLinkHeader {...{"id":"examples","headingLevel":"h2","className":"ws-title ws-h2"}}>
|
|
253
|
+
{`Examples`}
|
|
254
|
+
</AutoLinkHeader>
|
|
255
|
+
{React.createElement(pageData.examples["Basic"])}
|
|
256
|
+
{React.createElement(pageData.examples["Basic with mixed content"])}
|
|
257
|
+
{React.createElement(pageData.examples["Display inline"])}
|
|
258
|
+
{React.createElement(pageData.examples["Display stack"])}
|
|
259
|
+
{React.createElement(pageData.examples["Display stack, display inline responsive"])}
|
|
260
|
+
{React.createElement(pageData.examples["Inset"])}
|
|
261
|
+
{React.createElement(pageData.examples["Custom logo component"])}
|
|
262
|
+
<AutoLinkHeader {...{"id":"using-router-links","headingLevel":"h2","className":"ws-title ws-h2"}}>
|
|
263
|
+
{`Using router links`}
|
|
264
|
+
</AutoLinkHeader>
|
|
265
|
+
<p {...{"className":"pf-v6-c-content--p pf-m-editorial ws-p "}}>
|
|
266
|
+
{`Router links can be used for in-app linking in React environments to prevent page reloading. To use a `}
|
|
267
|
+
<code {...{"className":"ws-code "}}>
|
|
268
|
+
{`Link`}
|
|
269
|
+
</code>
|
|
270
|
+
{` component from a router package, you can follow our `}
|
|
271
|
+
<PatternflyThemeLink {...{"to":"#custom-logo-component","className":""}}>
|
|
272
|
+
{`custom logo component example`}
|
|
273
|
+
</PatternflyThemeLink>
|
|
274
|
+
{` and pass a callback to the `}
|
|
275
|
+
<code {...{"className":"ws-code "}}>
|
|
276
|
+
{`component`}
|
|
277
|
+
</code>
|
|
278
|
+
{` property of the `}
|
|
279
|
+
<code {...{"className":"ws-code "}}>
|
|
280
|
+
{`MastheadLogo`}
|
|
281
|
+
</code>
|
|
282
|
+
{`:`}
|
|
283
|
+
</p>
|
|
284
|
+
<Example {...{"code":"<MastheadLogo component={(props) => <Link {...props} to=\"#\" />}>\n <Brand ...brandProps />\n</MastheadLogo>","lang":"nolive","className":""}}>
|
|
285
|
+
</Example>
|
|
286
|
+
</React.Fragment>
|
|
287
|
+
);
|
|
288
|
+
Component.displayName = 'ComponentsMastheadReactDocs';
|
|
289
|
+
Component.pageData = pageData;
|
|
290
|
+
|
|
291
|
+
export default Component;
|