@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,149 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { AutoLinkHeader, Example, Link as PatternflyThemeLink } from '@patternfly/documentation-framework/components';
|
|
3
|
+
import { useState, useRef, useEffect } from 'react';
|
|
4
|
+
import RhUiNotificationFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-notification-fill-icon';
|
|
5
|
+
import RhUiSettingsFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-settings-fill-icon';
|
|
6
|
+
import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon';
|
|
7
|
+
import RhUiQuestionMarkCircleFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-question-mark-circle-fill-icon';
|
|
8
|
+
import imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.svg';
|
|
9
|
+
import RhUiMenuBarsIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-menu-bars-icon';
|
|
10
|
+
import LightbulbIcon from '@patternfly/react-icons/dist/esm/icons/lightbulb-icon';
|
|
11
|
+
import RhUiEllipsisVerticalFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-ellipsis-vertical-fill-icon';
|
|
12
|
+
import CubeIcon from '@patternfly/react-icons/dist/esm/icons/cube-icon';
|
|
13
|
+
import FolderIcon from '@patternfly/react-icons/dist/esm/icons/folder-icon';
|
|
14
|
+
import CloudIcon from '@patternfly/react-icons/dist/esm/icons/cloud-icon';
|
|
15
|
+
import pfLogo from '@patternfly/react-core/src/demos/assets/PF-HorizontalLogo-Color.svg';
|
|
16
|
+
import pfIconLogo from '@patternfly/react-core/src/demos/assets/PF-IconLogo-color.svg';
|
|
17
|
+
import srcImportcontextselectorperspectiveswitcherinsidebar from './react-demos/context-selectorperspective-switcher-in-sidebar.png';
|
|
18
|
+
import srcImportdefaultnav from './react-demos/default-nav.png';
|
|
19
|
+
import srcImportexpandablenav from './react-demos/expandable-nav.png';
|
|
20
|
+
import srcImportgroupednav from './react-demos/grouped-nav.png';
|
|
21
|
+
import srcImporthorizontalnav from './react-demos/horizontal-nav.png';
|
|
22
|
+
import srcImportlegacylightnav from './react-demos/legacylight-nav.png';
|
|
23
|
+
import srcImportmanualnav from './react-demos/manual-nav.png';
|
|
24
|
+
import srcImportstickysectionbreadcrumbwithbreakpoints from './react-demos/sticky-section-breadcrumb-with-breakpoints.png';
|
|
25
|
+
import srcImportstickysectiongroupalternatesyntaxandusingpageheader from './react-demos/sticky-section-group-alternate-syntax-and-using-pageheader.png';
|
|
26
|
+
import srcImportstickysectiongroupalternatesyntax from './react-demos/sticky-section-group-alternate-syntax.png';
|
|
27
|
+
import srcImportstickysectiongroupusingpageheader from './react-demos/sticky-section-group-using-pageheader.png';
|
|
28
|
+
import srcImportstickysectiongroup from './react-demos/sticky-section-group.png';
|
|
29
|
+
import srcImporttertiarynav from './react-demos/tertiary-nav.png';
|
|
30
|
+
const pageData = {
|
|
31
|
+
"id": "Page",
|
|
32
|
+
"section": "components",
|
|
33
|
+
"subsection": "",
|
|
34
|
+
"deprecated": false,
|
|
35
|
+
"template": false,
|
|
36
|
+
"beta": false,
|
|
37
|
+
"demo": false,
|
|
38
|
+
"newImplementationLink": false,
|
|
39
|
+
"source": "react-demos",
|
|
40
|
+
"tabName": null,
|
|
41
|
+
"slug": "/components/page/react-demos",
|
|
42
|
+
"sourceLink": "https://github.com/patternfly/patternfly-react/blob/main/packages/react-core/src/demos/Page.md",
|
|
43
|
+
"relPath": "packages/react-core/src/demos/Page.md",
|
|
44
|
+
"fullscreenExamples": [
|
|
45
|
+
"Sticky section group",
|
|
46
|
+
"Sticky section group (alternate syntax)",
|
|
47
|
+
"Sticky section breadcrumb (with breakpoints)",
|
|
48
|
+
"Context selector/perspective switcher in sidebar"
|
|
49
|
+
]
|
|
50
|
+
};
|
|
51
|
+
pageData.liveContext = {
|
|
52
|
+
useState,
|
|
53
|
+
useRef,
|
|
54
|
+
useEffect,
|
|
55
|
+
RhUiNotificationFillIcon,
|
|
56
|
+
RhUiSettingsFillIcon,
|
|
57
|
+
HelpIcon,
|
|
58
|
+
RhUiQuestionMarkCircleFillIcon,
|
|
59
|
+
imgAvatar,
|
|
60
|
+
RhUiMenuBarsIcon,
|
|
61
|
+
LightbulbIcon,
|
|
62
|
+
RhUiEllipsisVerticalFillIcon,
|
|
63
|
+
CubeIcon,
|
|
64
|
+
FolderIcon,
|
|
65
|
+
CloudIcon,
|
|
66
|
+
pfLogo,
|
|
67
|
+
pfIconLogo
|
|
68
|
+
};
|
|
69
|
+
pageData.examples = {
|
|
70
|
+
'Sticky section group': props =>
|
|
71
|
+
<Example {...pageData} {...props} thumbnail={srcImportstickysectiongroup} {...{"code":"import { 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 MenuToggle,\n MenuToggleElement,\n Nav,\n NavItem,\n NavList,\n NotificationBadge,\n NotificationBadgeVariant,\n Page,\n PageSection,\n PageSidebar,\n PageSidebarBody,\n PageToggleButton,\n SkipToContent,\n Toolbar,\n ToolbarContent,\n ToolbarGroup,\n ToolbarItem\n} from '@patternfly/react-core';\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 RhUiEllipsisVerticalFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-ellipsis-vertical-fill-icon';\nimport imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.svg';\nimport pfLogo from '@patternfly/react-core/src/demos/assets/PF-HorizontalLogo-Color.svg';\ninterface NavOnSelectProps {\n groupId: number | string;\n itemId: number | string;\n to: string;\n}\n\nexport const PageStickySectionGroup: 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 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(false);\n };\n\n const onKebabDropdownToggle = () => {\n setIsKebabDropdownOpen(!isKebabDropdownOpen);\n };\n\n const onKebabDropdownSelect = () => {\n setIsKebabDropdownOpen(false);\n };\n\n const onFullKebabDropdownToggle = () => {\n setIsFullKebabDropdownOpen(!isFullKebabDropdownOpen);\n };\n\n const onFullKebabDropdownSelect = () => {\n setIsFullKebabDropdownOpen(false);\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>\n <RhUiSettingsFillIcon /> Settings\n </DropdownItem>\n <DropdownItem>\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>\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}>\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';\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 isBreadcrumbWidthLimited\n isBreadcrumbGrouped\n additionalGroupedContent={\n <PageSection isWidthLimited 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 groupProps={{\n stickyOnBreakpoint: { default: 'top' }\n }}\n >\n <PageSection aria-label=\"Card gallery\">\n <Gallery hasGutter>\n {Array.from({ length: 50 }).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":"Sticky section group","lang":"ts","isFullscreen":true,"className":""}}>
|
|
72
|
+
|
|
73
|
+
</Example>,
|
|
74
|
+
'Sticky section group (alternate syntax)': props =>
|
|
75
|
+
<Example {...pageData} {...props} thumbnail={srcImportstickysectiongroupalternatesyntax} {...{"code":"import { 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 MenuToggle,\n MenuToggleElement,\n Nav,\n NavItem,\n NavList,\n NotificationBadge,\n NotificationBadgeVariant,\n Page,\n PageBreadcrumb,\n PageGroup,\n PageSection,\n PageSidebar,\n PageSidebarBody,\n PageToggleButton,\n SkipToContent,\n Toolbar,\n ToolbarContent,\n ToolbarGroup,\n ToolbarItem\n} from '@patternfly/react-core';\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 RhUiEllipsisVerticalFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-ellipsis-vertical-fill-icon';\nimport imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.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 PageStickySectionGroupAlternate: 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 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(false);\n };\n\n const onKebabDropdownToggle = () => {\n setIsKebabDropdownOpen(!isKebabDropdownOpen);\n };\n\n const onKebabDropdownSelect = () => {\n setIsKebabDropdownOpen(false);\n };\n\n const onFullKebabDropdownToggle = () => {\n setIsFullKebabDropdownOpen(!isFullKebabDropdownOpen);\n };\n\n const onFullKebabDropdownSelect = () => {\n setIsFullKebabDropdownOpen(false);\n };\n\n const kebabDropdownItems = (\n <>\n <DropdownItem>\n <RhUiSettingsFillIcon /> Settings\n </DropdownItem>\n <DropdownItem>\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>\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}>\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';\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 mainContainerId={mainContainerId}\n >\n <PageGroup stickyOnBreakpoint={{ default: 'top' }}>\n <PageBreadcrumb>\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 </PageBreadcrumb>\n <PageSection isWidthLimited 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 </PageGroup>\n <PageSection aria-label=\"Card gallery\">\n <Gallery hasGutter>\n {Array.from({ length: 50 }).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":"Sticky section group (alternate syntax)","lang":"ts","isFullscreen":true,"className":""}}>
|
|
76
|
+
|
|
77
|
+
</Example>,
|
|
78
|
+
'Sticky section breadcrumb (with breakpoints)': props =>
|
|
79
|
+
<Example {...pageData} {...props} thumbnail={srcImportstickysectionbreadcrumbwithbreakpoints} {...{"code":"import { 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 MenuToggle,\n MenuToggleElement,\n Nav,\n NavItem,\n NavList,\n NotificationBadge,\n NotificationBadgeVariant,\n Page,\n PageSection,\n PageSidebar,\n PageSidebarBody,\n PageToggleButton,\n SkipToContent,\n Toolbar,\n ToolbarContent,\n ToolbarGroup,\n ToolbarItem\n} from '@patternfly/react-core';\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 RhUiEllipsisVerticalFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-ellipsis-vertical-fill-icon';\nimport imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.svg';\nimport pfLogo from '@patternfly/react-core/src/demos/assets/PF-HorizontalLogo-Color.svg';\ninterface NavOnSelectProps {\n groupId: number | string;\n itemId: number | string;\n to: string;\n}\n\nexport const PageStickySectionBreadcrumb: 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 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(false);\n };\n\n const onKebabDropdownToggle = () => {\n setIsKebabDropdownOpen(!isKebabDropdownOpen);\n };\n\n const onKebabDropdownSelect = () => {\n setIsKebabDropdownOpen(false);\n };\n\n const onFullKebabDropdownToggle = () => {\n setIsFullKebabDropdownOpen(!isFullKebabDropdownOpen);\n };\n\n const onFullKebabDropdownSelect = () => {\n setIsFullKebabDropdownOpen(false);\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>\n <RhUiSettingsFillIcon /> Settings\n </DropdownItem>\n <DropdownItem>\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>\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}>\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';\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 isBreadcrumbWidthLimited\n breadcrumbProps={{\n stickyOnBreakpoint: {\n md: 'top'\n }\n }}\n >\n <PageSection isWidthLimited 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 <PageSection isWidthLimited aria-label=\"Card gallery\">\n <Gallery hasGutter>\n {Array.from({ length: 50 }).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":"Sticky section breadcrumb (with breakpoints)","lang":"ts","isFullscreen":true,"className":""}}>
|
|
80
|
+
|
|
81
|
+
</Example>,
|
|
82
|
+
'Context selector/perspective switcher in sidebar': props =>
|
|
83
|
+
<Example {...pageData} {...props} thumbnail={srcImportcontextselectorperspectiveswitcherinsidebar} {...{"code":"import { 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 MastheadToggle,\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 SkipToContent,\n Content,\n Toolbar,\n ToolbarContent,\n ToolbarGroup,\n ToolbarItem\n} from '@patternfly/react-core';\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 RhUiEllipsisVerticalFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-ellipsis-vertical-fill-icon';\nimport imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.svg';\nimport pfLogo from '@patternfly/react-core/src/demos/assets/PF-HorizontalLogo-Color.svg';\ninterface NavOnSelectProps {\n groupId: number | string;\n itemId: number | string;\n to: string;\n}\n\nexport const PageStickySectionBreadcrumb: React.FunctionComponent = () => {\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n const [isKebabDropdownOpen, setIsKebabDropdownOpen] = useState(false);\n const [isFullKebabDropdownOpen, setIsFullKebabDropdownOpen] = useState(false);\n const [isContextSelectorOpen, setIsContextSelectorOpen] = useState(false);\n const [activeItem, setActiveItem] = useState(1);\n const [isSidebarOpen, setIsSidebarOpen] = useState(true);\n\n const onSidebarToggle = () => {\n setIsSidebarOpen(!isSidebarOpen);\n };\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(false);\n };\n\n const onKebabDropdownToggle = () => {\n setIsKebabDropdownOpen(!isKebabDropdownOpen);\n };\n\n const onKebabDropdownSelect = () => {\n setIsKebabDropdownOpen(false);\n };\n\n const onFullKebabDropdownToggle = () => {\n setIsFullKebabDropdownOpen(!isFullKebabDropdownOpen);\n };\n\n const onFullKebabDropdownSelect = () => {\n setIsFullKebabDropdownOpen(false);\n };\n\n const onContextSelectorToggle = () => {\n setIsContextSelectorOpen(!isContextSelectorOpen);\n };\n\n const onContextSelectorSelect = () => {\n setIsContextSelectorOpen(false);\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>\n <RhUiSettingsFillIcon /> Settings\n </DropdownItem>\n <DropdownItem>\n <HelpIcon /> Help\n </DropdownItem>\n </>\n );\n\n const contextSelectorDropdownItems = (\n <>\n <DropdownItem>Developer</DropdownItem>\n <DropdownItem>Admin</DropdownItem>\n </>\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>\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\n isHamburgerButton\n aria-label=\"Global navigation\"\n isSidebarOpen={isSidebarOpen}\n onSidebarToggle={onSidebarToggle}\n />\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}>\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 pageContextSelector = (\n <Dropdown\n isOpen={isContextSelectorOpen}\n onSelect={onContextSelectorSelect}\n onOpenChange={(isOpen: boolean) => setIsContextSelectorOpen(isOpen)}\n toggle={(toggleRef: React.Ref<MenuToggleElement>) => (\n <MenuToggle\n tabIndex={isSidebarOpen ? undefined : -1}\n ref={toggleRef}\n onClick={onContextSelectorToggle}\n isExpanded={isContextSelectorOpen}\n isFullWidth\n >\n Developer\n </MenuToggle>\n )}\n >\n <DropdownList>{contextSelectorDropdownItems}</DropdownList>\n </Dropdown>\n );\n\n const sidebar = (\n <PageSidebar isSidebarOpen={isSidebarOpen}>\n <PageSidebarBody isContextSelector>{pageContextSelector}</PageSidebarBody>\n <PageSidebarBody>{pageNav}</PageSidebarBody>\n </PageSidebar>\n );\n\n const mainContainerId = 'main-content';\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 skipToContent={pageSkipToContent}\n breadcrumb={dashboardBreadcrumb}\n mainContainerId={mainContainerId}\n isBreadcrumbWidthLimited\n >\n <PageSection isWidthLimited 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 <PageSection isWidthLimited aria-label=\"Card gallery\">\n <Gallery hasGutter>\n {Array.from({ length: 50 }).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":"Context selector/perspective switcher in sidebar","lang":"ts","isFullscreen":true,"className":""}}>
|
|
84
|
+
|
|
85
|
+
<p {...{"className":"pf-v6-c-content--p pf-m-editorial ws-p "}}>
|
|
86
|
+
{`When adding a context selector/perspective switcher in a `}
|
|
87
|
+
|
|
88
|
+
<code {...{"className":"ws-code "}}>
|
|
89
|
+
{`PageSidebar`}
|
|
90
|
+
</code>
|
|
91
|
+
{`, you must manually control the open state of the `}
|
|
92
|
+
|
|
93
|
+
<code {...{"className":"ws-code "}}>
|
|
94
|
+
{`PageSidebar`}
|
|
95
|
+
</code>
|
|
96
|
+
{` as well as ensure any interactive menu toggles or buttons cannot receive focus. This demo adds a `}
|
|
97
|
+
|
|
98
|
+
<code {...{"className":"ws-code "}}>
|
|
99
|
+
{`tabIndex`}
|
|
100
|
+
</code>
|
|
101
|
+
{` of `}
|
|
102
|
+
|
|
103
|
+
<code {...{"className":"ws-code "}}>
|
|
104
|
+
{`-1`}
|
|
105
|
+
</code>
|
|
106
|
+
{` when the sidebar is not expanded to achieve this.`}
|
|
107
|
+
</p>
|
|
108
|
+
</Example>
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
const Component = () => (
|
|
112
|
+
<React.Fragment>
|
|
113
|
+
<ul {...{"className":"pf-v6-c-content--ul pf-m-editorial ws-ul "}}>
|
|
114
|
+
<li {...{"className":"pf-v6-c-content--li pf-m-editorial ws-li "}}>
|
|
115
|
+
{`All examples set the `}
|
|
116
|
+
<code {...{"className":"ws-code "}}>
|
|
117
|
+
{`isManagedSidebar`}
|
|
118
|
+
</code>
|
|
119
|
+
{` 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 the `}
|
|
120
|
+
<code {...{"className":"ws-code "}}>
|
|
121
|
+
{`isManagedSidebar`}
|
|
122
|
+
</code>
|
|
123
|
+
{` prop and instead:`}
|
|
124
|
+
<ol {...{"className":"pf-v6-c-content--ol pf-m-editorial ws-ol "}}>
|
|
125
|
+
<li {...{"className":"pf-v6-c-content--li pf-m-editorial ws-li "}}>
|
|
126
|
+
{`Add an onNavToggle callback to PageHeader`}
|
|
127
|
+
</li>
|
|
128
|
+
<li {...{"className":"pf-v6-c-content--li pf-m-editorial ws-li "}}>
|
|
129
|
+
{`Pass a boolean into the isNavOpen prop to PageSidebar`}
|
|
130
|
+
</li>
|
|
131
|
+
</ol>
|
|
132
|
+
</li>
|
|
133
|
+
</ul>
|
|
134
|
+
<AutoLinkHeader {...{"id":"layouts","headingLevel":"h2","className":"ws-title ws-h2"}}>
|
|
135
|
+
{`Layouts`}
|
|
136
|
+
</AutoLinkHeader>
|
|
137
|
+
<p {...{"className":"pf-v6-c-content--p pf-m-editorial ws-p "}}>
|
|
138
|
+
{`This demonstrates a variety of navigation patterns in the context of a full page layout. These can be used as a basis for choosing the most appropriate page template for your application.`}
|
|
139
|
+
</p>
|
|
140
|
+
{React.createElement(pageData.examples["Sticky section group"])}
|
|
141
|
+
{React.createElement(pageData.examples["Sticky section group (alternate syntax)"])}
|
|
142
|
+
{React.createElement(pageData.examples["Sticky section breadcrumb (with breakpoints)"])}
|
|
143
|
+
{React.createElement(pageData.examples["Context selector/perspective switcher in sidebar"])}
|
|
144
|
+
</React.Fragment>
|
|
145
|
+
);
|
|
146
|
+
Component.displayName = 'ComponentsPageReactDemosDocs';
|
|
147
|
+
Component.pageData = pageData;
|
|
148
|
+
|
|
149
|
+
export default Component;
|