@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.
Files changed (163) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/package.json +12 -13
  3. package/patternfly-docs/generated/components/about-modal/react.js +149 -0
  4. package/patternfly-docs/generated/components/accordion/react.js +262 -0
  5. package/patternfly-docs/generated/components/action-list/react.js +144 -0
  6. package/patternfly-docs/generated/components/alert/react-demos.js +56 -0
  7. package/patternfly-docs/generated/components/alert/react.js +1433 -0
  8. package/patternfly-docs/generated/components/avatar/react.js +166 -0
  9. package/patternfly-docs/generated/components/back-to-top/react-demos.js +60 -0
  10. package/patternfly-docs/generated/components/back-to-top/react.js +77 -0
  11. package/patternfly-docs/generated/components/backdrop/react.js +64 -0
  12. package/patternfly-docs/generated/components/background-image/react.js +62 -0
  13. package/patternfly-docs/generated/components/badge/react.js +97 -0
  14. package/patternfly-docs/generated/components/banner/react-demos.js +57 -0
  15. package/patternfly-docs/generated/components/banner/react.js +148 -0
  16. package/patternfly-docs/generated/components/brand/react.js +142 -0
  17. package/patternfly-docs/generated/components/breadcrumb/react.js +206 -0
  18. package/patternfly-docs/generated/components/button/react-demos.js +57 -0
  19. package/patternfly-docs/generated/components/button/react.js +826 -0
  20. package/patternfly-docs/generated/components/card/react-demos.js +201 -0
  21. package/patternfly-docs/generated/components/card/react.js +1015 -0
  22. package/patternfly-docs/generated/components/charts/area-chart/-Victory.js +1350 -0
  23. package/patternfly-docs/generated/components/charts/bar-chart/-Victory.js +1334 -0
  24. package/patternfly-docs/generated/components/charts/box-plot-chart/-Victory.js +1282 -0
  25. package/patternfly-docs/generated/components/charts/bullet-chart/-Victory.js +848 -0
  26. package/patternfly-docs/generated/components/charts/colors-for-charts/-Victory.js +192 -0
  27. package/patternfly-docs/generated/components/charts/donut-chart/-Victory.js +426 -0
  28. package/patternfly-docs/generated/components/charts/donut-utilization-chart/-Victory.js +804 -0
  29. package/patternfly-docs/generated/components/charts/legends/-Victory.js +3230 -0
  30. package/patternfly-docs/generated/components/charts/line-chart/-Victory.js +1178 -0
  31. package/patternfly-docs/generated/components/charts/line-chart/ECharts.js +525 -0
  32. package/patternfly-docs/generated/components/charts/patterns/-Victory.js +3382 -0
  33. package/patternfly-docs/generated/components/charts/pie-chart/-Victory.js +377 -0
  34. package/patternfly-docs/generated/components/charts/resize-observer/-Victory.js +2475 -0
  35. package/patternfly-docs/generated/components/charts/sankey-chart/ECharts.js +538 -0
  36. package/patternfly-docs/generated/components/charts/scatter-chart/-Victory.js +1551 -0
  37. package/patternfly-docs/generated/components/charts/skeletons/-Victory.js +4115 -0
  38. package/patternfly-docs/generated/components/charts/sparkline-chart/-Victory.js +955 -0
  39. package/patternfly-docs/generated/components/charts/stack-chart/-Victory.js +1173 -0
  40. package/patternfly-docs/generated/components/charts/threshold-chart/-Victory.js +1166 -0
  41. package/patternfly-docs/generated/components/charts/tooltips/-Victory.js +413 -0
  42. package/patternfly-docs/generated/components/chip/react-deprecated.js +323 -0
  43. package/patternfly-docs/generated/components/clipboard-copy/react.js +373 -0
  44. package/patternfly-docs/generated/components/code-block/react.js +148 -0
  45. package/patternfly-docs/generated/components/code-editor/react.js +659 -0
  46. package/patternfly-docs/generated/components/compass/react-demos.js +147 -0
  47. package/patternfly-docs/generated/components/compass/react.js +440 -0
  48. package/patternfly-docs/generated/components/content/react.js +248 -0
  49. package/patternfly-docs/generated/components/data-list/react-demos.js +90 -0
  50. package/patternfly-docs/generated/components/data-list/react.js +709 -0
  51. package/patternfly-docs/generated/components/date-and-time/calendar-month/react.js +283 -0
  52. package/patternfly-docs/generated/components/date-and-time/date-and-time-picker/react-demos.js +64 -0
  53. package/patternfly-docs/generated/components/date-and-time/date-picker/react-demos.js +83 -0
  54. package/patternfly-docs/generated/components/date-and-time/date-picker/react.js +395 -0
  55. package/patternfly-docs/generated/components/date-and-time/time-picker/react.js +241 -0
  56. package/patternfly-docs/generated/components/description-list/react-demos.js +58 -0
  57. package/patternfly-docs/generated/components/description-list/react.js +743 -0
  58. package/patternfly-docs/generated/components/divider/react.js +126 -0
  59. package/patternfly-docs/generated/components/drag-and-drop/react-demos.js +351 -0
  60. package/patternfly-docs/generated/components/drag-and-drop/react-deprecated.js +184 -0
  61. package/patternfly-docs/generated/components/drag-and-drop/react.js +137 -0
  62. package/patternfly-docs/generated/components/drawer/react.js +598 -0
  63. package/patternfly-docs/generated/components/dual-list-selector/react-deprecated.js +772 -0
  64. package/patternfly-docs/generated/components/dual-list-selector/react.js +594 -0
  65. package/patternfly-docs/generated/components/empty-state/react.js +199 -0
  66. package/patternfly-docs/generated/components/expandable-section/react-demos.js +65 -0
  67. package/patternfly-docs/generated/components/expandable-section/react.js +408 -0
  68. package/patternfly-docs/generated/components/file-upload/multiple-file-upload/react-demos.js +52 -0
  69. package/patternfly-docs/generated/components/file-upload/multiple-file-upload/react.js +398 -0
  70. package/patternfly-docs/generated/components/file-upload/simple-file-upload/react.js +749 -0
  71. package/patternfly-docs/generated/components/forms/checkbox/react.js +222 -0
  72. package/patternfly-docs/generated/components/forms/form/react.js +1106 -0
  73. package/patternfly-docs/generated/components/forms/form-select/react.js +208 -0
  74. package/patternfly-docs/generated/components/forms/radio/react.js +212 -0
  75. package/patternfly-docs/generated/components/forms/text-area/react.js +160 -0
  76. package/patternfly-docs/generated/components/forms/text-input/react.js +216 -0
  77. package/patternfly-docs/generated/components/helper-text/react-demos.js +180 -0
  78. package/patternfly-docs/generated/components/helper-text/react.js +164 -0
  79. package/patternfly-docs/generated/components/hero/react.js +88 -0
  80. package/patternfly-docs/generated/components/hint/react.js +169 -0
  81. package/patternfly-docs/generated/components/icon/react.js +215 -0
  82. package/patternfly-docs/generated/components/input-group/react.js +182 -0
  83. package/patternfly-docs/generated/components/jump-links/react-demos.js +154 -0
  84. package/patternfly-docs/generated/components/jump-links/react.js +212 -0
  85. package/patternfly-docs/generated/components/label/react-demos.js +57 -0
  86. package/patternfly-docs/generated/components/label/react.js +417 -0
  87. package/patternfly-docs/generated/components/list/react.js +175 -0
  88. package/patternfly-docs/generated/components/login-page/react.js +587 -0
  89. package/patternfly-docs/generated/components/masthead/react-demos.js +79 -0
  90. package/patternfly-docs/generated/components/masthead/react.js +291 -0
  91. package/patternfly-docs/generated/components/menus/application-launcher/react-demos.js +769 -0
  92. package/patternfly-docs/generated/components/menus/context-selector/react-demos.js +665 -0
  93. package/patternfly-docs/generated/components/menus/custom-menus/react-demos.js +187 -0
  94. package/patternfly-docs/generated/components/menus/dropdown/react-templates.js +163 -0
  95. package/patternfly-docs/generated/components/menus/dropdown/react.js +998 -0
  96. package/patternfly-docs/generated/components/menus/menu/react.js +1540 -0
  97. package/patternfly-docs/generated/components/menus/menu-toggle/react.js +747 -0
  98. package/patternfly-docs/generated/components/menus/options-menu/react-demos.js +508 -0
  99. package/patternfly-docs/generated/components/menus/select/react-templates.js +257 -0
  100. package/patternfly-docs/generated/components/menus/select/react.js +998 -0
  101. package/patternfly-docs/generated/components/modal/react-deprecated.js +554 -0
  102. package/patternfly-docs/generated/components/modal/react.js +597 -0
  103. package/patternfly-docs/generated/components/navigation/react-demos.js +356 -0
  104. package/patternfly-docs/generated/components/navigation/react.js +409 -0
  105. package/patternfly-docs/generated/components/notification-badge/react.js +196 -0
  106. package/patternfly-docs/generated/components/notification-drawer/react-demos.js +107 -0
  107. package/patternfly-docs/generated/components/notification-drawer/react.js +394 -0
  108. package/patternfly-docs/generated/components/number-input/react.js +210 -0
  109. package/patternfly-docs/generated/components/overflow-menu/react.js +274 -0
  110. package/patternfly-docs/generated/components/page/react-demos.js +149 -0
  111. package/patternfly-docs/generated/components/page/react.js +1352 -0
  112. package/patternfly-docs/generated/components/pagination/react.js +492 -0
  113. package/patternfly-docs/generated/components/panel/react.js +236 -0
  114. package/patternfly-docs/generated/components/popover/react.js +390 -0
  115. package/patternfly-docs/generated/components/progress/react-demos.js +59 -0
  116. package/patternfly-docs/generated/components/progress/react.js +283 -0
  117. package/patternfly-docs/generated/components/progress-stepper/react-demos.js +45 -0
  118. package/patternfly-docs/generated/components/progress-stepper/react.js +219 -0
  119. package/patternfly-docs/generated/components/search-input/react-demos.js +113 -0
  120. package/patternfly-docs/generated/components/search-input/react.js +263 -0
  121. package/patternfly-docs/generated/components/sidebar/react.js +236 -0
  122. package/patternfly-docs/generated/components/simple-list/react.js +200 -0
  123. package/patternfly-docs/generated/components/skeleton/react-demos.js +44 -0
  124. package/patternfly-docs/generated/components/skeleton/react.js +122 -0
  125. package/patternfly-docs/generated/components/skip-to-content/react.js +73 -0
  126. package/patternfly-docs/generated/components/slider/react.js +309 -0
  127. package/patternfly-docs/generated/components/spinner/react.js +111 -0
  128. package/patternfly-docs/generated/components/switch/react.js +163 -0
  129. package/patternfly-docs/generated/components/table/react-demos.js +355 -0
  130. package/patternfly-docs/generated/components/table/react-deprecated.js +1350 -0
  131. package/patternfly-docs/generated/components/table/react.js +3241 -0
  132. package/patternfly-docs/generated/components/tabs/react-demos.js +108 -0
  133. package/patternfly-docs/generated/components/tabs/react.js +1359 -0
  134. package/patternfly-docs/generated/components/text-input-group/react-demos.js +152 -0
  135. package/patternfly-docs/generated/components/text-input-group/react.js +278 -0
  136. package/patternfly-docs/generated/components/tile/react-deprecated.js +242 -0
  137. package/patternfly-docs/generated/components/timestamp/react.js +283 -0
  138. package/patternfly-docs/generated/components/title/react.js +94 -0
  139. package/patternfly-docs/generated/components/toggle-group/react.js +299 -0
  140. package/patternfly-docs/generated/components/toolbar/react-demos.js +66 -0
  141. package/patternfly-docs/generated/components/toolbar/react.js +932 -0
  142. package/patternfly-docs/generated/components/tooltip/react.js +241 -0
  143. package/patternfly-docs/generated/components/tree-view/react.js +429 -0
  144. package/patternfly-docs/generated/components/truncate/react.js +211 -0
  145. package/patternfly-docs/generated/components/wizard/react-demos.js +87 -0
  146. package/patternfly-docs/generated/components/wizard/react-deprecated.js +788 -0
  147. package/patternfly-docs/generated/components/wizard/react.js +986 -0
  148. package/patternfly-docs/generated/developer-guides/open-ui-automation/react.js +285 -0
  149. package/patternfly-docs/generated/foundations-and-styles/layouts/bullseye/react.js +70 -0
  150. package/patternfly-docs/generated/foundations-and-styles/layouts/flex/react.js +506 -0
  151. package/patternfly-docs/generated/foundations-and-styles/layouts/gallery/react.js +94 -0
  152. package/patternfly-docs/generated/foundations-and-styles/layouts/grid/react.js +272 -0
  153. package/patternfly-docs/generated/foundations-and-styles/layouts/level/react.js +87 -0
  154. package/patternfly-docs/generated/foundations-and-styles/layouts/split/react.js +124 -0
  155. package/patternfly-docs/generated/foundations-and-styles/layouts/stack/react.js +112 -0
  156. package/patternfly-docs/generated/index.js +1769 -0
  157. package/patternfly-docs/generated/patterns/card-view/react-demos.js +78 -0
  158. package/patternfly-docs/generated/patterns/filters/react-demos.js +141 -0
  159. package/patternfly-docs/generated/patterns/password-generator/react-demos.js +51 -0
  160. package/patternfly-docs/generated/patterns/password-strength/react-demos.js +61 -0
  161. package/patternfly-docs/generated/patterns/primary-detail/react-demos.js +124 -0
  162. package/patternfly-docs/generated/patterns/right-to-left/react-demos.js +81 -0
  163. package/LICENSE +0 -21
@@ -0,0 +1,51 @@
1
+ import React from 'react';
2
+ import { AutoLinkHeader, Example, Link as PatternflyThemeLink } from '@patternfly/documentation-framework/components';
3
+ import { useEffect, useRef, useState } from 'react';
4
+ import RedoIcon from '@patternfly/react-icons/dist/esm/icons/redo-icon';
5
+ import RhUiViewFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-view-fill-icon';
6
+ import RhUiViewOffFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-view-off-fill-icon';
7
+ const pageData = {
8
+ "id": "Password generator",
9
+ "section": "patterns",
10
+ "subsection": "",
11
+ "deprecated": false,
12
+ "template": false,
13
+ "beta": false,
14
+ "demo": false,
15
+ "newImplementationLink": false,
16
+ "source": "react-demos",
17
+ "tabName": null,
18
+ "slug": "/patterns/password-generator/react-demos",
19
+ "sourceLink": "https://github.com/patternfly/patternfly-react/blob/main/packages/react-core/src/demos/PasswordGenerator/PasswordGenerator.md",
20
+ "relPath": "packages/react-core/src/demos/PasswordGenerator/PasswordGenerator.md",
21
+ "examples": [
22
+ "Provide a generated password"
23
+ ]
24
+ };
25
+ pageData.liveContext = {
26
+ useEffect,
27
+ useRef,
28
+ useState,
29
+ RedoIcon,
30
+ RhUiViewFillIcon,
31
+ RhUiViewOffFillIcon
32
+ };
33
+ pageData.examples = {
34
+ 'Provide a generated password': props =>
35
+ <Example {...pageData} {...props} {...{"code":"import { useEffect, useRef, useState } from 'react';\nimport {\n InputGroup,\n InputGroupItem,\n TextInput,\n Button,\n Popper,\n Menu,\n MenuContent,\n MenuList,\n MenuItem,\n MenuItemAction\n} from '@patternfly/react-core';\nimport RedoIcon from '@patternfly/react-icons/dist/esm/icons/redo-icon';\nimport RhUiViewFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-view-fill-icon';\nimport RhUiViewOffFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-view-off-fill-icon';\n\nexport const PasswordGenerator: React.FunctionComponent = () => {\n const generatePassword = () => {\n const length = 12;\n const charset = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@%()_-=+';\n let retVal = '';\n for (let i = 0, n = charset.length; i < length; ++i) {\n retVal += charset.charAt(Math.floor(Math.random() * n));\n }\n return retVal;\n };\n const [password, setPassword] = useState<string>('');\n const [generatedPassword, setGeneratedPassword] = useState<string>(generatePassword());\n const [isAutocompleteOpen, setIsAutocompleteOpen] = useState<boolean>(false);\n const [passwordHidden, setPasswordHidden] = useState<boolean>(true);\n const searchInputRef = useRef(null);\n const autocompleteRef = useRef(null);\n\n useEffect(() => {\n window.addEventListener('keydown', handleMenuKeys);\n window.addEventListener('click', handleClickOutside);\n return () => {\n window.removeEventListener('keydown', handleMenuKeys);\n window.removeEventListener('click', handleClickOutside);\n };\n }, [isAutocompleteOpen, searchInputRef.current]);\n\n const onChange = (_event: React.FormEvent<HTMLInputElement>, newValue: string) => {\n if (searchInputRef && searchInputRef.current && searchInputRef.current.contains(document.activeElement)) {\n setIsAutocompleteOpen(true);\n } else {\n setIsAutocompleteOpen(false);\n }\n setPassword(newValue);\n };\n\n // Whenever an autocomplete option is selected, set the search input value, close the menu, and put the browser\n // focus back on the search input\n const onSelect = (event: React.MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n setPassword(generatedPassword);\n setIsAutocompleteOpen(false);\n searchInputRef.current.focus();\n };\n\n const handleMenuKeys = (event: KeyboardEvent | React.KeyboardEvent<any>) => {\n if (!(isAutocompleteOpen && searchInputRef.current && searchInputRef.current.contains(event.target))) {\n return;\n }\n // the escape key closes the autocomplete menu and keeps the focus on the search input.\n if (event.key === 'Escape') {\n setIsAutocompleteOpen(false);\n searchInputRef.current.focus();\n // the up and down arrow keys move browser focus into the autocomplete menu\n } else if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n const firstElement = autocompleteRef.current.querySelector('li > button:not(:disabled)');\n firstElement && firstElement.focus();\n event.preventDefault(); // by default, the up and down arrow keys scroll the window\n }\n // If the autocomplete is open and the browser focus is in the autocomplete menu\n // hitting tab will close the autocomplete and put browser focus back on the search input.\n else if (autocompleteRef.current.contains(event.target) && event.key === 'Tab') {\n event.preventDefault();\n setIsAutocompleteOpen(false);\n searchInputRef.current.focus();\n }\n };\n\n // The autocomplete menu should close if the user clicks outside the menu.\n const handleClickOutside = (\n event: MouseEvent | TouchEvent | KeyboardEvent | React.KeyboardEvent<any> | React.MouseEvent<HTMLButtonElement>\n ) => {\n if (\n isAutocompleteOpen &&\n autocompleteRef &&\n autocompleteRef.current &&\n !searchInputRef.current.contains(event.target)\n ) {\n setIsAutocompleteOpen(false);\n }\n if (\n !isAutocompleteOpen &&\n searchInputRef &&\n searchInputRef.current &&\n searchInputRef.current.contains(event.target)\n ) {\n setIsAutocompleteOpen(true);\n }\n };\n const textInput = (\n <div ref={searchInputRef} id=\"password-input\">\n <InputGroup>\n <InputGroupItem isFill>\n <TextInput\n onFocus={() => {\n setIsAutocompleteOpen(true);\n }}\n isRequired\n type={passwordHidden ? 'password' : 'text'}\n aria-label=\"Password input\"\n value={password}\n onChange={onChange}\n />\n </InputGroupItem>\n <InputGroupItem>\n <Button\n variant=\"control\"\n onClick={() => setPasswordHidden(!passwordHidden)}\n aria-label={passwordHidden ? 'Show password' : 'Hide password'}\n icon={passwordHidden ? <RhUiViewFillIcon /> : <RhUiViewOffFillIcon />}\n />\n </InputGroupItem>\n </InputGroup>\n </div>\n );\n const autocomplete = (\n <Menu ref={autocompleteRef} onSelect={onSelect}>\n <MenuContent>\n <MenuList>\n <MenuItem\n itemId={0}\n actions={\n <MenuItemAction\n icon={<RedoIcon />}\n onClick={(_e) => {\n setGeneratedPassword(generatePassword());\n }}\n actionId=\"redo\"\n aria-label=\"Generate a new suggested password\"\n />\n }\n >\n Use suggested password: <b>{`${generatedPassword}`}</b>\n </MenuItem>\n </MenuList>\n </MenuContent>\n </Menu>\n );\n\n return (\n <Popper\n trigger={textInput}\n triggerRef={searchInputRef}\n popper={autocomplete}\n popperRef={autocompleteRef}\n isVisible={isAutocompleteOpen}\n enableFlip={false}\n // append the autocomplete menu to the search input in the DOM for the sake of the keyboard navigation experience\n appendTo={() => document.querySelector('#password-input')}\n />\n );\n};\n","title":"Provide a generated password","lang":"ts","className":""}}>
36
+
37
+ </Example>
38
+ };
39
+
40
+ const Component = () => (
41
+ <React.Fragment>
42
+ <AutoLinkHeader {...{"id":"demos","headingLevel":"h2","className":"ws-title ws-h2"}}>
43
+ {`Demos`}
44
+ </AutoLinkHeader>
45
+ {React.createElement(pageData.examples["Provide a generated password"])}
46
+ </React.Fragment>
47
+ );
48
+ Component.displayName = 'PatternsPasswordGeneratorReactDemosDocs';
49
+ Component.pageData = pageData;
50
+
51
+ export default Component;
@@ -0,0 +1,61 @@
1
+ import React from 'react';
2
+ import { AutoLinkHeader, Example, Link as PatternflyThemeLink } from '@patternfly/documentation-framework/components';
3
+ import { useState } from 'react';
4
+ import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon';
5
+ import RhUiErrorFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-error-fill-icon';
6
+ import RhUiWarningFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-warning-fill-icon';
7
+ import RhUiCheckCircleFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-check-circle-fill-icon';
8
+ import formStyles from '@patternfly/react-styles/css/components/Form/form';
9
+ const pageData = {
10
+ "id": "Password strength",
11
+ "section": "patterns",
12
+ "subsection": "",
13
+ "deprecated": false,
14
+ "template": false,
15
+ "beta": false,
16
+ "demo": false,
17
+ "newImplementationLink": false,
18
+ "source": "react-demos",
19
+ "tabName": null,
20
+ "slug": "/patterns/password-strength/react-demos",
21
+ "sourceLink": "https://github.com/patternfly/patternfly-react/blob/main/packages/react-core/src/demos/PasswordStrength.md",
22
+ "relPath": "packages/react-core/src/demos/PasswordStrength.md",
23
+ "examples": [
24
+ "Basic validation"
25
+ ]
26
+ };
27
+ pageData.liveContext = {
28
+ useState,
29
+ HelpIcon,
30
+ RhUiErrorFillIcon,
31
+ RhUiWarningFillIcon,
32
+ RhUiCheckCircleFillIcon,
33
+ formStyles
34
+ };
35
+ pageData.examples = {
36
+ 'Basic validation': props =>
37
+ <Example {...pageData} {...props} {...{"code":"import { useState } from 'react';\nimport { Form, FormGroup, FormHelperText, HelperText, HelperTextItem, TextInput } from '@patternfly/react-core';\nimport RhUiErrorFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-error-fill-icon';\nimport RhUiWarningFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-warning-fill-icon';\nimport RhUiCheckCircleFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-check-circle-fill-icon';\n\nexport const PasswordStrengthDemo: React.FunctionComponent = () => {\n type HelperTextItemVariant = 'default' | 'indeterminate' | 'warning' | 'success' | 'error';\n interface PassStrength {\n variant: HelperTextItemVariant;\n icon: React.JSX.Element;\n text: string;\n }\n\n const [password, setPassword] = useState('');\n const [ruleLength, setRuleLength] = useState<HelperTextItemVariant>('indeterminate');\n const [ruleContent, setRuleContent] = useState<HelperTextItemVariant>('indeterminate');\n const [ruleCharacters, setRuleCharacters] = useState<HelperTextItemVariant>('indeterminate');\n const [passStrength, setPassStrength] = useState<PassStrength>({\n variant: 'error',\n icon: <RhUiErrorFillIcon />,\n text: 'Weak'\n });\n\n const handlePasswordInput = (_event: any, password: string) => {\n setPassword(password);\n validate(password);\n };\n\n const validate = (password: string) => {\n if (password === '') {\n setRuleLength('indeterminate');\n setRuleContent('indeterminate');\n setRuleCharacters('indeterminate');\n return;\n }\n\n if (password.length < 14) {\n setRuleLength('error');\n } else {\n setRuleLength('success');\n }\n\n if (/redhat/gi.test(password)) {\n setRuleContent('error');\n } else {\n setRuleContent('success');\n }\n\n let rulesCount = 0;\n let strCount = 0;\n if (/[a-z]/g.test(password)) {\n rulesCount++;\n }\n if (/[A-Z]/g.test(password)) {\n strCount += password.match(/[A-Z]/g).length;\n rulesCount++;\n }\n if (/\\d/g.test(password)) {\n strCount += password.match(/\\d/g).length;\n rulesCount++;\n }\n if (/\\W/g.test(password)) {\n strCount += password.match(/\\W/g).length;\n rulesCount++;\n }\n\n if (rulesCount < 3) {\n setRuleCharacters('error');\n } else {\n setRuleCharacters('success');\n }\n\n if (strCount < 3) {\n setPassStrength({ variant: 'error', icon: <RhUiErrorFillIcon />, text: 'Weak' });\n } else if (strCount < 5) {\n setPassStrength({ variant: 'warning', icon: <RhUiWarningFillIcon />, text: 'Medium' });\n } else {\n setPassStrength({ variant: 'success', icon: <RhUiCheckCircleFillIcon />, text: 'Strong' });\n }\n };\n\n const passStrLabel = (\n <HelperText>\n <HelperTextItem variant={passStrength.variant} icon={passStrength.icon}>\n {passStrength.text}\n </HelperTextItem>\n </HelperText>\n );\n\n return (\n <Form>\n <FormGroup\n label=\"Password\"\n isRequired\n fieldId=\"password-field\"\n {...(ruleLength === 'success' &&\n ruleContent === 'success' &&\n ruleCharacters === 'success' && {\n labelInfo: passStrLabel\n })}\n >\n <TextInput\n isRequired\n type=\"password\"\n id=\"password-field\"\n name=\"password-field\"\n aria-describedby=\"password-field-helper\"\n aria-invalid={ruleLength === 'error' || ruleContent === 'error' || ruleCharacters === 'error'}\n value={password}\n onChange={handlePasswordInput}\n />\n <FormHelperText>\n <HelperText component=\"ul\" aria-live=\"polite\" id=\"password-field-helper\">\n <HelperTextItem variant={ruleLength} component=\"li\">\n Must be at least 14 characters\n </HelperTextItem>\n <HelperTextItem variant={ruleContent} component=\"li\">\n Cannot contain the word \"redhat\"\n </HelperTextItem>\n <HelperTextItem variant={ruleCharacters} component=\"li\">\n Must include at least 3 of the following: lowercase letter, uppercase letters, numbers, symbols\n </HelperTextItem>\n </HelperText>\n </FormHelperText>\n </FormGroup>\n </Form>\n );\n};\n","title":"Basic validation","lang":"ts","className":""}}>
38
+
39
+ <p {...{"className":"pf-v6-c-content--p pf-m-editorial ws-p "}}>
40
+ {`Note, the validation and password strength rules are only examples, demonstrating the changes in the UI when certain conditions are met. We expect consumers will substitute their own, more robust, validation algorithm. In this demo the password strength is determined by how often validation rules are met. A good open-source password strength estimator, recommended by InfoSec, is `}
41
+
42
+ <PatternflyThemeLink {...{"to":"https://github.com/dropbox/zxcvbn","className":""}}>
43
+ {`zxcvbn`}
44
+ </PatternflyThemeLink>
45
+ {`.`}
46
+ </p>
47
+ </Example>
48
+ };
49
+
50
+ const Component = () => (
51
+ <React.Fragment>
52
+ <AutoLinkHeader {...{"id":"demos","headingLevel":"h2","className":"ws-title ws-h2"}}>
53
+ {`Demos`}
54
+ </AutoLinkHeader>
55
+ {React.createElement(pageData.examples["Basic validation"])}
56
+ </React.Fragment>
57
+ );
58
+ Component.displayName = 'PatternsPasswordStrengthReactDemosDocs';
59
+ Component.pageData = pageData;
60
+
61
+ export default Component;
@@ -0,0 +1,124 @@
1
+ import React from 'react';
2
+ import { AutoLinkHeader, Example, Link as PatternflyThemeLink } from '@patternfly/documentation-framework/components';
3
+ import { Fragment, useState } from 'react';
4
+ import RhUiBranchFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-branch-fill-icon';
5
+ import TrashIcon from '@patternfly/react-icons/dist/esm/icons/trash-icon';
6
+ import RhUiCodeIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-code-icon';
7
+ import CubeIcon from '@patternfly/react-icons/dist/esm/icons/cube-icon';
8
+ import RhUiCheckCircleFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-check-circle-fill-icon';
9
+ import RhUiWarningFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-warning-fill-icon';
10
+ import FilterIcon from '@patternfly/react-icons/dist/esm/icons/filter-icon';
11
+ import SearchIcon from '@patternfly/react-icons/dist/esm/icons/search-icon';
12
+ import TimesCircleIcon from '@patternfly/react-icons/dist/esm/icons/times-circle-icon';
13
+ import pfIcon from '../../../../../react-core/src/demos/./assets/pf-logo-small.svg';
14
+ import activeMQIcon from '../../../../../react-core/src/demos/./assets/activemq-core_200x150.png';
15
+ import avroIcon from '../../../../../react-core/src/demos/./assets/camel-avro_200x150.png';
16
+ import dropBoxIcon from '../../../../../react-core/src/demos/./assets/camel-dropbox_200x150.png';
17
+ import infinispanIcon from '../../../../../react-core/src/demos/./assets/camel-infinispan_200x150.png';
18
+ import saxonIcon from '../../../../../react-core/src/demos/./assets/camel-saxon_200x150.png';
19
+ import sparkIcon from '../../../../../react-core/src/demos/./assets/camel-spark_200x150.png';
20
+ import swaggerIcon from '../../../../../react-core/src/demos/./assets/camel-swagger-java_200x150.png';
21
+ import azureIcon from '../../../../../react-core/src/demos/./assets/FuseConnector_Icons_AzureServices.png';
22
+ import restIcon from '../../../../../react-core/src/demos/./assets/FuseConnector_Icons_REST.png';
23
+ import RhUiEllipsisVerticalFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-ellipsis-vertical-fill-icon';
24
+ import { data } from '@patternfly/react-core/src/demos/CardView/examples/CardViewData.jsx';
25
+ import { DashboardWrapper } from '@patternfly/react-core/dist/js/demos/DashboardWrapper';
26
+ import srcImportprimarydetailcardview from './react-demos/primary-detail-card-view.png';
27
+ import srcImportprimarydetailcontentpadding from './react-demos/primary-detail-content-padding.png';
28
+ import srcImportprimarydetaildatalistincard from './react-demos/primary-detail-data-list-in-card.png';
29
+ import srcImportprimarydetailfullpage from './react-demos/primary-detail-full-page.png';
30
+ import srcImportprimarydetailinlinemodifier from './react-demos/primary-detail-inline-modifier.png';
31
+ import srcImportprimarydetailsimplelistincard from './react-demos/primary-detail-simple-list-in-card.png';
32
+ const pageData = {
33
+ "id": "Primary-detail",
34
+ "section": "patterns",
35
+ "subsection": "",
36
+ "deprecated": false,
37
+ "template": false,
38
+ "beta": false,
39
+ "demo": false,
40
+ "newImplementationLink": false,
41
+ "source": "react-demos",
42
+ "tabName": null,
43
+ "slug": "/patterns/primary-detail/react-demos",
44
+ "sourceLink": "https://github.com/patternfly/patternfly-react/blob/main/packages/react-core/src/demos/PrimaryDetail.md",
45
+ "relPath": "packages/react-core/src/demos/PrimaryDetail.md",
46
+ "fullscreenExamples": [
47
+ "Primary-detail full page",
48
+ "Primary-detail content padding",
49
+ "Primary-detail card view",
50
+ "Primary-detail simple list in card",
51
+ "Primary-detail data list in card",
52
+ "Primary-detail inline modifier"
53
+ ]
54
+ };
55
+ pageData.liveContext = {
56
+ Fragment,
57
+ useState,
58
+ RhUiBranchFillIcon,
59
+ TrashIcon,
60
+ RhUiCodeIcon,
61
+ CubeIcon,
62
+ RhUiCheckCircleFillIcon,
63
+ RhUiWarningFillIcon,
64
+ FilterIcon,
65
+ SearchIcon,
66
+ TimesCircleIcon,
67
+ pfIcon,
68
+ activeMQIcon,
69
+ avroIcon,
70
+ dropBoxIcon,
71
+ infinispanIcon,
72
+ saxonIcon,
73
+ sparkIcon,
74
+ swaggerIcon,
75
+ azureIcon,
76
+ restIcon,
77
+ RhUiEllipsisVerticalFillIcon,
78
+ data,
79
+ DashboardWrapper
80
+ };
81
+ pageData.examples = {
82
+ 'Primary-detail full page': props =>
83
+ <Example {...pageData} {...props} thumbnail={srcImportprimarydetailfullpage} {...{"code":"import { Fragment, useState } from 'react';\nimport {\n Button,\n ButtonVariant,\n Content,\n DataList,\n DataListAction,\n DataListCell,\n DataListItem,\n DataListItemCells,\n DataListItemRow,\n Toolbar,\n ToolbarItem,\n ToolbarContent,\n ToolbarToggleGroup,\n ToolbarGroup,\n Divider,\n Drawer,\n DrawerActions,\n DrawerCloseButton,\n DrawerContent,\n DrawerContentBody,\n DrawerHead,\n DrawerPanelBody,\n DrawerPanelContent,\n Flex,\n FlexItem,\n InputGroup,\n InputGroupItem,\n PageSection,\n Progress,\n Stack,\n StackItem,\n TextInput,\n Title,\n Select,\n SelectOption,\n SelectOptionProps,\n MenuToggle\n} from '@patternfly/react-core';\nimport { DashboardWrapper } from '@patternfly/react-core/dist/js/demos/DashboardWrapper';\nimport RhUiCodeIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-code-icon';\nimport RhUiBranchFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-branch-fill-icon';\nimport CubeIcon from '@patternfly/react-icons/dist/esm/icons/cube-icon';\nimport RhUiCheckCircleFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-check-circle-fill-icon';\nimport RhUiWarningFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-warning-fill-icon';\nimport FilterIcon from '@patternfly/react-icons/dist/esm/icons/filter-icon';\nimport SearchIcon from '@patternfly/react-icons/dist/esm/icons/search-icon';\nimport TimesCircleIcon from '@patternfly/react-icons/dist/esm/icons/times-circle-icon';\n\ninterface SelectOptionType extends Omit<SelectOptionProps, 'children'> {\n label: string;\n}\n\nconst statusOptions: SelectOptionType[] = [\n { value: 'New', label: 'New' },\n { value: 'Pending', label: 'Pending' },\n { value: 'Running', label: 'Running' },\n { value: 'Cancelled', label: 'Cancelled' }\n];\n\nconst riskOptions: SelectOptionType[] = [\n { value: 'Low', label: 'Low' },\n { value: 'Medium', label: 'Medium' },\n { value: 'High', label: 'High' }\n];\n\nexport const PrimaryDetailFullPage: React.FunctionComponent = () => {\n const [isDrawerExpanded, setIsDrawerExpanded] = useState(false);\n const [drawerPanelBodyContent, setDrawerPanelBodyContent] = useState('');\n const [inputValue, setInputValue] = useState('');\n const [statusIsOpen, setStatusIsOpen] = useState(false);\n const [statusSelected, setStatusSelected] = useState<string | number | undefined>('Status');\n const [riskIsOpen, setRiskIsOpen] = useState(false);\n const [riskSelected, setRiskSelected] = useState<string | number | undefined>('Risk');\n const [selectedDataListItemId, setSelectedDataListItemId] = useState('');\n\n const onStatusSelect = (_event: React.MouseEvent<Element> | undefined, value: string | number | undefined) => {\n setStatusSelected(value);\n setStatusIsOpen(false);\n };\n\n const onRiskSelect = (_event: React.MouseEvent<Element> | undefined, value: string | number | undefined) => {\n setRiskSelected(value);\n setRiskIsOpen(false);\n };\n\n const onSelectDataListItem = (\n _event: React.MouseEvent<Element, MouseEvent> | React.KeyboardEvent<Element>,\n id: string\n ) => {\n setSelectedDataListItemId(id);\n setIsDrawerExpanded(true);\n setDrawerPanelBodyContent(id.charAt(id.length - 1));\n };\n\n const onCloseDrawerClick = (_event: React.MouseEvent<HTMLDivElement>) => {\n setIsDrawerExpanded(false);\n setSelectedDataListItemId('');\n };\n\n const toggleGroupItems = (\n <Flex alignItems={{ default: 'alignItemsCenter' }}>\n <ToolbarItem>\n <InputGroup>\n <InputGroupItem isFill>\n <TextInput\n name=\"full-page-data-toolbar-input1\"\n id=\"full-page-data-toolbar-input1\"\n type=\"search\"\n aria-label=\"search input example\"\n onChange={(_event: React.FormEvent<HTMLInputElement>, value: string) => setInputValue(value)}\n value={inputValue}\n />\n </InputGroupItem>\n <InputGroupItem>\n <Button variant={ButtonVariant.control} aria-label=\"search button for search input\" icon={<SearchIcon />} />\n </InputGroupItem>\n </InputGroup>\n </ToolbarItem>\n <ToolbarGroup variant=\"filter-group\">\n <ToolbarItem>\n <Select\n aria-label=\"Status select\"\n selected={statusSelected}\n isOpen={statusIsOpen}\n toggle={(toggleRef) => (\n <MenuToggle\n ref={toggleRef}\n onClick={() => setStatusIsOpen((prevIsOpen) => !prevIsOpen)}\n isExpanded={statusIsOpen}\n >\n {statusSelected}\n </MenuToggle>\n )}\n onOpenChange={(isOpen: boolean) => setStatusIsOpen(isOpen)}\n onSelect={onStatusSelect}\n >\n {statusOptions.map(({ label, value }) => (\n <SelectOption key={label} value={value}>\n {label}\n </SelectOption>\n ))}\n </Select>\n </ToolbarItem>\n <ToolbarItem>\n <Select\n aria-label=\"Risk select\"\n selected={riskSelected}\n isOpen={riskIsOpen}\n toggle={(toggleRef) => (\n <MenuToggle\n ref={toggleRef}\n onClick={() => setRiskIsOpen((prevIsOpen) => !prevIsOpen)}\n isExpanded={riskIsOpen}\n >\n {riskSelected}\n </MenuToggle>\n )}\n onOpenChange={(isOpen: boolean) => setRiskIsOpen(isOpen)}\n onSelect={onRiskSelect}\n >\n {riskOptions.map(({ label, value }) => (\n <SelectOption key={label} value={value}>\n {label}\n </SelectOption>\n ))}\n </Select>\n </ToolbarItem>\n </ToolbarGroup>\n </Flex>\n );\n\n const ToolbarItems = (\n <ToolbarToggleGroup toggleIcon={<FilterIcon />} breakpoint=\"xl\">\n {toggleGroupItems}\n </ToolbarToggleGroup>\n );\n\n const panelContent = (\n <DrawerPanelContent>\n <DrawerHead>\n <Title headingLevel=\"h2\" size=\"xl\">\n node-{drawerPanelBodyContent}\n </Title>\n <DrawerActions>\n <DrawerCloseButton onClick={onCloseDrawerClick} />\n </DrawerActions>\n </DrawerHead>\n <DrawerPanelBody>\n <Flex spaceItems={{ default: 'spaceItemsLg' }} direction={{ default: 'column' }}>\n <FlexItem>\n <p>\n The content of the drawer really is up to you. It could have form fields, definition lists, text lists,\n labels, charts, progress bars, etc. Spacing recommendation is 24px margins. You can put tabs in here, and\n can also make the drawer scrollable.\n </p>\n </FlexItem>\n <FlexItem>\n <Progress value={parseInt(drawerPanelBodyContent) * 10} title=\"Title\" />\n </FlexItem>\n <FlexItem>\n <Progress value={parseInt(drawerPanelBodyContent) * 5} title=\"Title\" />\n </FlexItem>\n </Flex>\n </DrawerPanelBody>\n </DrawerPanelContent>\n );\n\n const drawerContent = (\n <Fragment>\n <Toolbar id=\"full-page-data-toolbar\">\n <ToolbarContent>{ToolbarItems}</ToolbarContent>\n </Toolbar>\n <DataList\n aria-label=\"data list\"\n selectedDataListItemId={selectedDataListItemId}\n onSelectDataListItem={onSelectDataListItem}\n >\n <DataListItem id=\"full-page-item1\">\n <DataListItemRow>\n <DataListItemCells\n dataListCells={[\n <DataListCell key=\"primary-content\">\n <Flex spaceItems={{ default: 'spaceItemsMd' }} direction={{ default: 'column' }}>\n <FlexItem>\n <p>patternfly</p>\n <small>\n Working repo for PatternFly 5 <a>https://pf5.patternfly.org/</a>\n </small>\n </FlexItem>\n <Flex spaceItems={{ default: 'spaceItemsMd' }}>\n <FlexItem>\n <RhUiBranchFillIcon /> 10\n </FlexItem>\n <FlexItem>\n <RhUiCodeIcon /> 4\n </FlexItem>\n <FlexItem>\n <CubeIcon /> 5\n </FlexItem>\n <FlexItem>Updated 2 days ago</FlexItem>\n </Flex>\n </Flex>\n </DataListCell>,\n <DataListAction\n key=\"actions\"\n aria-labelledby=\"full-page-item1 full-page-action1\"\n id=\"full-page-action1\"\n aria-label=\"Actions\"\n >\n <Stack>\n <StackItem>\n <Button variant={ButtonVariant.secondary}>Secondary</Button>\n </StackItem>\n <StackItem>\n <Button variant={ButtonVariant.link}>Link Button</Button>\n </StackItem>\n </Stack>\n </DataListAction>\n ]}\n />\n </DataListItemRow>\n </DataListItem>\n <DataListItem id=\"full-page-item2\">\n <DataListItemRow>\n <DataListItemCells\n dataListCells={[\n <DataListCell key=\"primary-content\">\n <Flex spaceItems={{ default: 'spaceItemsMd' }} direction={{ default: 'column' }}>\n <FlexItem>\n <p>patternfly-elements</p>\n <small>PatternFly elements</small>\n </FlexItem>\n <Flex spaceItems={{ default: 'spaceItemsMd' }}>\n <FlexItem>\n <RhUiBranchFillIcon /> 10\n </FlexItem>\n <FlexItem>\n <RhUiCodeIcon /> 4\n </FlexItem>\n <FlexItem>\n <CubeIcon /> 5\n </FlexItem>\n <FlexItem>\n <RhUiCheckCircleFillIcon /> 7\n </FlexItem>\n <FlexItem>\n <RhUiWarningFillIcon /> 5\n </FlexItem>\n <FlexItem>\n <TimesCircleIcon /> 5\n </FlexItem>\n <FlexItem>Updated 2 days ago</FlexItem>\n </Flex>\n </Flex>\n </DataListCell>,\n <DataListAction\n key=\"actions\"\n aria-labelledby=\"full-page-item2 full-page-action2\"\n id=\"full-page-action2\"\n aria-label=\"Actions\"\n >\n <Stack>\n <StackItem>\n <Button variant={ButtonVariant.secondary}>Secondary</Button>\n </StackItem>\n <StackItem>\n <Button variant={ButtonVariant.link}>Link Button</Button>\n </StackItem>\n </Stack>\n </DataListAction>\n ]}\n />\n </DataListItemRow>\n </DataListItem>\n <DataListItem id=\"full-page-item3\">\n <DataListItemRow>\n <DataListItemCells\n dataListCells={[\n <DataListCell key=\"primary-content\">\n <Flex spaceItems={{ default: 'spaceItemsMd' }} direction={{ default: 'column' }}>\n <FlexItem>\n <p>patternfly</p>\n <small>\n Working repo for PatternFly 5 <a>https://pf5.patternfly.org/</a>\n </small>\n </FlexItem>\n <Flex spaceItems={{ default: 'spaceItemsMd' }}>\n <FlexItem>\n <RhUiBranchFillIcon /> 10\n </FlexItem>\n <FlexItem>\n <RhUiCodeIcon /> 4\n </FlexItem>\n <FlexItem>\n <CubeIcon /> 5\n </FlexItem>\n <FlexItem>Updated 2 days ago</FlexItem>\n </Flex>\n </Flex>\n </DataListCell>,\n <DataListAction\n key=\"actions\"\n aria-labelledby=\"full-page-item3 full-page-action3\"\n id=\"full-page-action3\"\n aria-label=\"Actions\"\n >\n <Stack>\n <StackItem>\n <Button variant={ButtonVariant.secondary}>Secondary</Button>\n </StackItem>\n <StackItem>\n <Button variant={ButtonVariant.link}>Link Button</Button>\n </StackItem>\n </Stack>\n </DataListAction>\n ]}\n />\n </DataListItemRow>\n </DataListItem>\n <DataListItem id=\"full-page-item4\">\n <DataListItemRow>\n <DataListItemCells\n dataListCells={[\n <DataListCell key=\"primary-content\">\n <Flex spaceItems={{ default: 'spaceItemsMd' }} direction={{ default: 'column' }}>\n <FlexItem>\n <p>patternfly-elements</p>\n <small>PatternFly elements</small>\n </FlexItem>\n <Flex spaceItems={{ default: 'spaceItemsMd' }}>\n <FlexItem>\n <RhUiBranchFillIcon /> 10\n </FlexItem>\n <FlexItem>\n <RhUiCodeIcon /> 4\n </FlexItem>\n <FlexItem>\n <CubeIcon /> 5\n </FlexItem>\n <FlexItem>\n <RhUiCheckCircleFillIcon /> 7\n </FlexItem>\n <FlexItem>\n <RhUiWarningFillIcon /> 5\n </FlexItem>\n <FlexItem>\n <TimesCircleIcon /> 5\n </FlexItem>\n <FlexItem>Updated 2 days ago</FlexItem>\n </Flex>\n </Flex>\n </DataListCell>,\n <DataListAction\n key=\"actions\"\n aria-labelledby=\"full-page-item4 full-page-action4\"\n id=\"full-page-action4\"\n aria-label=\"Actions\"\n >\n <Stack>\n <StackItem>\n <Button variant={ButtonVariant.secondary}>Secondary</Button>\n </StackItem>\n <StackItem>\n <Button variant={ButtonVariant.link}>Link Button</Button>\n </StackItem>\n </Stack>\n </DataListAction>\n ]}\n />\n </DataListItemRow>\n </DataListItem>\n </DataList>\n </Fragment>\n );\n\n return (\n <DashboardWrapper mainContainerId=\"main-content-page-layout-default-nav\">\n <PageSection aria-labelledby=\"main-title\">\n <Content>\n <h1 id=\"main-title\">Main title</h1>\n <p>\n Body text should be Red Hat Text at 1rem(16px). It should have leading of 1.5rem(24px) because <br />\n of it's relative line height of 1.5.\n </p>\n </Content>\n </PageSection>\n <Divider component=\"div\" />\n <PageSection padding={{ default: 'noPadding' }} aria-label=\"Card with drawer content\">\n <Drawer isExpanded={isDrawerExpanded}>\n <DrawerContent panelContent={panelContent}>\n <DrawerContentBody>{drawerContent}</DrawerContentBody>\n </DrawerContent>\n </Drawer>\n </PageSection>\n </DashboardWrapper>\n );\n};\n","title":"Primary-detail full page","lang":"ts","isFullscreen":true,"className":""}}>
84
+
85
+ </Example>,
86
+ 'Primary-detail content padding': props =>
87
+ <Example {...pageData} {...props} thumbnail={srcImportprimarydetailcontentpadding} {...{"code":"import { Fragment, useState } from 'react';\nimport {\n Button,\n ButtonVariant,\n Content,\n DataList,\n DataListAction,\n DataListCell,\n DataListItem,\n DataListItemCells,\n DataListItemRow,\n Toolbar,\n ToolbarItem,\n ToolbarContent,\n ToolbarToggleGroup,\n ToolbarGroup,\n Divider,\n Drawer,\n DrawerActions,\n DrawerCloseButton,\n DrawerContent,\n DrawerContentBody,\n DrawerHead,\n DrawerPanelBody,\n DrawerPanelContent,\n Flex,\n FlexItem,\n InputGroup,\n InputGroupItem,\n PageSection,\n Progress,\n Stack,\n StackItem,\n TextInput,\n Title,\n Select,\n SelectOption,\n SelectOptionProps,\n MenuToggle\n} from '@patternfly/react-core';\nimport { DashboardWrapper } from '@patternfly/react-core/dist/js/demos/DashboardWrapper';\nimport RhUiCodeIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-code-icon';\nimport RhUiBranchFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-branch-fill-icon';\nimport CubeIcon from '@patternfly/react-icons/dist/esm/icons/cube-icon';\nimport RhUiCheckCircleFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-check-circle-fill-icon';\nimport RhUiWarningFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-warning-fill-icon';\nimport FilterIcon from '@patternfly/react-icons/dist/esm/icons/filter-icon';\nimport SearchIcon from '@patternfly/react-icons/dist/esm/icons/search-icon';\nimport TimesCircleIcon from '@patternfly/react-icons/dist/esm/icons/times-circle-icon';\n\ninterface SelectOptionType extends Omit<SelectOptionProps, 'children'> {\n label: string;\n}\n\nconst statusOptions: SelectOptionType[] = [\n { value: 'New', label: 'New' },\n { value: 'Pending', label: 'Pending' },\n { value: 'Running', label: 'Running' },\n { value: 'Cancelled', label: 'Cancelled' }\n];\n\nconst riskOptions: SelectOptionType[] = [\n { value: 'Low', label: 'Low' },\n { value: 'Medium', label: 'Medium' },\n { value: 'High', label: 'High' }\n];\n\nexport const PrimaryDetailContentPadding: React.FunctionComponent = () => {\n const [isDrawerExpanded, setIsDrawerExpanded] = useState(false);\n const [drawerPanelBodyContent, setDrawerPanelBodyContent] = useState('');\n const [inputValue, setInputValue] = useState('');\n const [statusIsOpen, setStatusIsOpen] = useState(false);\n const [statusSelected, setStatusSelected] = useState<string | number | undefined>('Status');\n const [riskIsOpen, setRiskIsOpen] = useState(false);\n const [riskSelected, setRiskSelected] = useState<string | number | undefined>('Risk');\n const [selectedDataListItemId, setSelectedDataListItemId] = useState('');\n\n const onStatusSelect = (_event: React.MouseEvent<Element> | undefined, value: string | number | undefined) => {\n setStatusSelected(value);\n setStatusIsOpen(false);\n };\n\n const onRiskSelect = (_event: React.MouseEvent<Element> | undefined, value: string | number | undefined) => {\n setRiskSelected(value);\n setRiskIsOpen(false);\n };\n\n const onSelectDataListItem = (\n _event: React.MouseEvent<Element, MouseEvent> | React.KeyboardEvent<Element>,\n id: string\n ) => {\n setSelectedDataListItemId(id);\n setIsDrawerExpanded(true);\n setDrawerPanelBodyContent(id.charAt(id.length - 1));\n };\n\n const onCloseDrawerClick = (_event: React.MouseEvent<HTMLDivElement>) => {\n setIsDrawerExpanded(false);\n setSelectedDataListItemId('');\n };\n\n const toggleGroupItems = (\n <Flex alignItems={{ default: 'alignItemsCenter' }}>\n <ToolbarItem>\n <InputGroup>\n <InputGroupItem isFill>\n <TextInput\n name=\"content-padding-data-toolbar-input1\"\n id=\"content-padding-data-toolbar-input1\"\n type=\"search\"\n aria-label=\"search input example\"\n onChange={(_event: React.FormEvent<HTMLInputElement>, value: string) => setInputValue(value)}\n value={inputValue}\n />\n </InputGroupItem>\n <InputGroupItem>\n <Button variant={ButtonVariant.control} aria-label=\"search button for search input\" icon={<SearchIcon />} />\n </InputGroupItem>\n </InputGroup>\n </ToolbarItem>\n <ToolbarGroup variant=\"filter-group\">\n <ToolbarItem>\n <Select\n aria-label=\"Status select\"\n selected={statusSelected}\n isOpen={statusIsOpen}\n toggle={(toggleRef) => (\n <MenuToggle\n ref={toggleRef}\n onClick={() => setStatusIsOpen((prevIsOpen) => !prevIsOpen)}\n isExpanded={statusIsOpen}\n >\n {statusSelected}\n </MenuToggle>\n )}\n onOpenChange={(isOpen: boolean) => setStatusIsOpen(isOpen)}\n onSelect={onStatusSelect}\n >\n {statusOptions.map(({ label, value }) => (\n <SelectOption key={label} value={value}>\n {label}\n </SelectOption>\n ))}\n </Select>\n </ToolbarItem>\n <ToolbarItem>\n <Select\n aria-label=\"Risk select\"\n selected={riskSelected}\n isOpen={riskIsOpen}\n toggle={(toggleRef) => (\n <MenuToggle\n ref={toggleRef}\n onClick={() => setRiskIsOpen((prevIsOpen) => !prevIsOpen)}\n isExpanded={riskIsOpen}\n >\n {riskSelected}\n </MenuToggle>\n )}\n onOpenChange={(isOpen: boolean) => setRiskIsOpen(isOpen)}\n onSelect={onRiskSelect}\n >\n {riskOptions.map(({ label, value }) => (\n <SelectOption key={label} value={value}>\n {label}\n </SelectOption>\n ))}\n </Select>\n </ToolbarItem>\n </ToolbarGroup>\n </Flex>\n );\n\n const ToolbarItems = (\n <ToolbarToggleGroup toggleIcon={<FilterIcon />} breakpoint=\"xl\">\n {toggleGroupItems}\n </ToolbarToggleGroup>\n );\n\n const panelContent = (\n <DrawerPanelContent isPlain>\n <DrawerHead>\n <Title headingLevel=\"h2\" size=\"xl\">\n node-{drawerPanelBodyContent}\n </Title>\n <DrawerActions>\n <DrawerCloseButton onClick={onCloseDrawerClick} />\n </DrawerActions>\n </DrawerHead>\n <DrawerPanelBody>\n <Flex spaceItems={{ default: 'spaceItemsLg' }} direction={{ default: 'column' }}>\n <FlexItem>\n <p>\n The content of the drawer really is up to you. It could have form fields, definition lists, text lists,\n labels, charts, progress bars, etc. Spacing recommendation is 24px margins. You can put tabs in here, and\n can also make the drawer scrollable.\n </p>\n </FlexItem>\n <FlexItem>\n <Progress value={parseInt(drawerPanelBodyContent) * 10} title=\"Title\" />\n </FlexItem>\n <FlexItem>\n <Progress value={parseInt(drawerPanelBodyContent) * 5} title=\"Title\" />\n </FlexItem>\n </Flex>\n </DrawerPanelBody>\n </DrawerPanelContent>\n );\n\n const drawerContent = (\n <Fragment>\n <Toolbar id=\"content-padding-data-toolbar\">\n <ToolbarContent>{ToolbarItems}</ToolbarContent>\n </Toolbar>\n <DataList\n aria-label=\"data list\"\n selectedDataListItemId={selectedDataListItemId}\n onSelectDataListItem={onSelectDataListItem}\n >\n <DataListItem id=\"content-padding-item1\">\n <DataListItemRow>\n <DataListItemCells\n dataListCells={[\n <DataListCell key=\"primary-content\">\n <Flex spaceItems={{ default: 'spaceItemsMd' }} direction={{ default: 'column' }}>\n <FlexItem>\n <p>patternfly</p>\n <small>\n Working repo for PatternFly 5 <a>https://pf5.patternfly.org/</a>\n </small>\n </FlexItem>\n <Flex spaceItems={{ default: 'spaceItemsMd' }}>\n <FlexItem>\n <RhUiBranchFillIcon /> 10\n </FlexItem>\n <FlexItem>\n <RhUiCodeIcon /> 4\n </FlexItem>\n <FlexItem>\n <CubeIcon /> 5\n </FlexItem>\n <FlexItem>Updated 2 days ago</FlexItem>\n </Flex>\n </Flex>\n </DataListCell>,\n <DataListAction\n key=\"actions\"\n aria-labelledby=\"content-padding-item1 content-padding-action1\"\n id=\"content-padding-action1\"\n aria-label=\"Actions\"\n >\n <Stack>\n <StackItem>\n <Button variant={ButtonVariant.secondary}>Secondary</Button>\n </StackItem>\n <StackItem>\n <Button variant={ButtonVariant.link}>Link Button</Button>\n </StackItem>\n </Stack>\n </DataListAction>\n ]}\n />\n </DataListItemRow>\n </DataListItem>\n <DataListItem id=\"content-padding-item2\">\n <DataListItemRow>\n <DataListItemCells\n dataListCells={[\n <DataListCell key=\"primary-content\">\n <Flex spaceItems={{ default: 'spaceItemsMd' }} direction={{ default: 'column' }}>\n <FlexItem>\n <p>patternfly-elements</p>\n <small>PatternFly elements</small>\n </FlexItem>\n <Flex spaceItems={{ default: 'spaceItemsMd' }}>\n <FlexItem>\n <RhUiBranchFillIcon /> 10\n </FlexItem>\n <FlexItem>\n <RhUiCodeIcon /> 4\n </FlexItem>\n <FlexItem>\n <CubeIcon /> 5\n </FlexItem>\n <FlexItem>\n <RhUiCheckCircleFillIcon /> 7\n </FlexItem>\n <FlexItem>\n <RhUiWarningFillIcon /> 5\n </FlexItem>\n <FlexItem>\n <TimesCircleIcon /> 5\n </FlexItem>\n <FlexItem>Updated 2 days ago</FlexItem>\n </Flex>\n </Flex>\n </DataListCell>,\n <DataListAction\n key=\"actions\"\n aria-labelledby=\"content-padding-item2 content-padding-action2\"\n id=\"content-padding-action2\"\n aria-label=\"Actions\"\n >\n <Stack>\n <StackItem>\n <Button variant={ButtonVariant.secondary}>Secondary</Button>\n </StackItem>\n <StackItem>\n <Button variant={ButtonVariant.link}>Link Button</Button>\n </StackItem>\n </Stack>\n </DataListAction>\n ]}\n />\n </DataListItemRow>\n </DataListItem>\n <DataListItem id=\"content-padding-item3\">\n <DataListItemRow>\n <DataListItemCells\n dataListCells={[\n <DataListCell key=\"primary-content\">\n <Flex spaceItems={{ default: 'spaceItemsMd' }} direction={{ default: 'column' }}>\n <FlexItem>\n <p>patternfly</p>\n <small>\n Working repo for PatternFly 5 <a>https://pf5.patternfly.org/</a>\n </small>\n </FlexItem>\n <Flex spaceItems={{ default: 'spaceItemsMd' }}>\n <FlexItem>\n <RhUiBranchFillIcon /> 10\n </FlexItem>\n <FlexItem>\n <RhUiCodeIcon /> 4\n </FlexItem>\n <FlexItem>\n <CubeIcon /> 5\n </FlexItem>\n <FlexItem>Updated 2 days ago</FlexItem>\n </Flex>\n </Flex>\n </DataListCell>,\n <DataListAction\n key=\"actions\"\n aria-labelledby=\"content-padding-item3 content-padding-action3\"\n id=\"content-padding-action3\"\n aria-label=\"Actions\"\n >\n <Stack>\n <StackItem>\n <Button variant={ButtonVariant.secondary}>Secondary</Button>\n </StackItem>\n <StackItem>\n <Button variant={ButtonVariant.link}>Link Button</Button>\n </StackItem>\n </Stack>\n </DataListAction>\n ]}\n />\n </DataListItemRow>\n </DataListItem>\n <DataListItem id=\"content-padding-item4\">\n <DataListItemRow>\n <DataListItemCells\n dataListCells={[\n <DataListCell key=\"primary-content\">\n <Flex spaceItems={{ default: 'spaceItemsMd' }} direction={{ default: 'column' }}>\n <FlexItem>\n <p>patternfly-elements</p>\n <small>PatternFly elements</small>\n </FlexItem>\n <Flex spaceItems={{ default: 'spaceItemsMd' }}>\n <FlexItem>\n <RhUiBranchFillIcon /> 10\n </FlexItem>\n <FlexItem>\n <RhUiCodeIcon /> 4\n </FlexItem>\n <FlexItem>\n <CubeIcon /> 5\n </FlexItem>\n <FlexItem>\n <RhUiCheckCircleFillIcon /> 7\n </FlexItem>\n <FlexItem>\n <RhUiWarningFillIcon /> 5\n </FlexItem>\n <FlexItem>\n <TimesCircleIcon /> 5\n </FlexItem>\n <FlexItem>Updated 2 days ago</FlexItem>\n </Flex>\n </Flex>\n </DataListCell>,\n <DataListAction\n key=\"actions\"\n aria-labelledby=\"content-padding-item4 content-padding-action4\"\n id=\"content-padding-action4\"\n aria-label=\"Actions\"\n >\n <Stack>\n <StackItem>\n <Button variant={ButtonVariant.secondary}>Secondary</Button>\n </StackItem>\n <StackItem>\n <Button variant={ButtonVariant.link}>Link Button</Button>\n </StackItem>\n </Stack>\n </DataListAction>\n ]}\n />\n </DataListItemRow>\n </DataListItem>\n </DataList>\n </Fragment>\n );\n\n return (\n <DashboardWrapper>\n <PageSection aria-labelledby=\"main-title\">\n <Content>\n <h1 id=\"main-title\">Main title</h1>\n <p>\n Body text should be Red Hat Text at 1rem(16px). It should have leading of 1.5rem(24px) because <br />\n of it's relative line height of 1.5.\n </p>\n </Content>\n </PageSection>\n <Divider component=\"div\" />\n <PageSection padding={{ default: 'noPadding' }} aria-label=\"Drawer content section\">\n <Drawer isExpanded={isDrawerExpanded}>\n <DrawerContent panelContent={panelContent}>\n <DrawerContentBody hasPadding>{drawerContent}</DrawerContentBody>\n </DrawerContent>\n </Drawer>\n </PageSection>\n </DashboardWrapper>\n );\n};\n","title":"Primary-detail content padding","lang":"ts","isFullscreen":true,"className":""}}>
88
+
89
+ </Example>,
90
+ 'Primary-detail card view': props =>
91
+ <Example {...pageData} {...props} thumbnail={srcImportprimarydetailcardview} {...{"code":"import { Fragment, useState } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardHeader,\n CardBody,\n CardTitle,\n Content,\n Divider,\n Drawer,\n DrawerActions,\n DrawerPanelBody,\n DrawerCloseButton,\n DrawerContent,\n DrawerContentBody,\n DrawerHead,\n DrawerPanelContent,\n Dropdown,\n DropdownItem,\n DropdownList,\n Flex,\n FlexItem,\n Gallery,\n MenuToggle,\n MenuToggleCheckbox,\n PageSection,\n Pagination,\n Progress,\n Select,\n SelectList,\n SelectOption,\n Title,\n Toolbar,\n ToolbarFilter,\n ToolbarItem,\n ToolbarContent,\n MenuToggleElement\n} from '@patternfly/react-core';\nimport TrashIcon from '@patternfly/react-icons/dist/esm/icons/trash-icon';\nimport pfIcon from './assets/pf-logo-small.svg';\nimport activeMQIcon from './assets/activemq-core_200x150.png';\nimport avroIcon from './assets/camel-avro_200x150.png';\nimport dropBoxIcon from './assets/camel-dropbox_200x150.png';\nimport infinispanIcon from './assets/camel-infinispan_200x150.png';\nimport saxonIcon from './assets/camel-saxon_200x150.png';\nimport sparkIcon from './assets/camel-spark_200x150.png';\nimport swaggerIcon from './assets/camel-swagger-java_200x150.png';\nimport azureIcon from './assets/FuseConnector_Icons_AzureServices.png';\nimport restIcon from './assets/FuseConnector_Icons_REST.png';\nimport RhUiEllipsisVerticalFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-ellipsis-vertical-fill-icon';\nimport { DashboardWrapper } from '@patternfly/react-core/src/demos/DashboardWrapper';\nimport { data } from '@patternfly/react-core/src/demos/CardView/examples/CardViewData.jsx';\n\nexport const PrimaryDetailCardView: React.FunctionComponent = () => {\n const [totalItemCount, setTotalItemCount] = useState(10);\n const [cardData, setCardData] = useState(data);\n const [isChecked, setIsChecked] = useState(false);\n const [isDrawerExpanded, setIsDrawerExpanded] = useState(false);\n const [selectedItems, setSelectedItems] = useState<number[]>([]);\n const [areAllSelected, setAreAllSelected] = useState<boolean>(false);\n const [splitButtonDropdownIsOpen, setSplitButtonDropdownIsOpen] = useState(false);\n const [isLowerToolbarDropdownOpen, setIsLowerToolbarDropdownOpen] = useState(false);\n const [isLowerToolbarKebabDropdownOpen, setIsLowerToolbarKebabDropdownOpen] = useState(false);\n const [page, setPage] = useState(1);\n const [perPage, setPerPage] = useState(10);\n const [filters, setFilters] = useState<Record<string, string[]>>({ products: [] });\n const [state, setState] = useState({});\n const [activeCard, setActiveCard] = useState(-1);\n\n interface ProductType {\n id: number;\n name: string;\n icon: string;\n description: string;\n }\n\n const onToolbarDropdownToggle = () => {\n setIsLowerToolbarDropdownOpen(!isLowerToolbarDropdownOpen);\n };\n\n const onToolbarKebabDropdownToggle = () => {\n setIsLowerToolbarKebabDropdownOpen(!isLowerToolbarKebabDropdownOpen);\n };\n\n const onToolbarKebabDropdownSelect = () => {\n setIsLowerToolbarKebabDropdownOpen(!isLowerToolbarKebabDropdownOpen);\n };\n\n const onCardKebabDropdownToggle = (\n event: React.MouseEvent<HTMLButtonElement, MouseEvent> | React.MouseEvent<HTMLDivElement, MouseEvent>,\n key: string\n ) => {\n setState({\n [key]: !state[key as keyof Object]\n });\n };\n\n const checkAllSelected = (selected: number, total: number) => {\n if (selected && selected < total) {\n return null;\n }\n return selected === total;\n };\n\n const onNameSelect = (event: any, selection = '') => {\n const checked = event.target.checked;\n const prevSelections = filters.products;\n\n setFilters({\n ...filters,\n products: checked ? [...prevSelections, selection] : prevSelections.filter((value) => value !== selection)\n });\n };\n\n const onDelete = (type = '', _id = '') => {\n if (type) {\n setFilters(filters);\n } else {\n setFilters({ products: [] });\n }\n };\n\n const deleteItem = (item: ProductType) => {\n const filter = (getter) => (val) => getter(val) !== item.id;\n\n setCardData(cardData.filter(filter(({ id }) => id)));\n\n setSelectedItems(selectedItems.filter(filter((id) => id)));\n\n setTotalItemCount(totalItemCount - 1);\n setIsDrawerExpanded(false);\n setActiveCard(-1);\n };\n\n const onSetPage = (_event: any, pageNumber: number) => {\n setPage(pageNumber);\n };\n\n const onPerPageSelect = (_event: any, perPage: number) => {\n setPerPage(perPage);\n setPage(1);\n };\n\n const onSplitButtonToggle = () => {\n setSplitButtonDropdownIsOpen(!splitButtonDropdownIsOpen);\n };\n\n const onSplitButtonSelect = () => {\n setSplitButtonDropdownIsOpen(false);\n setIsDrawerExpanded(false);\n setActiveCard(-1);\n };\n\n const onCloseDrawerClick = () => {\n setActiveCard(-1);\n setIsDrawerExpanded(false);\n };\n\n const onChange = (event: React.FormEvent<HTMLInputElement>) => {\n const name = event.currentTarget.name;\n const productId = Number(name.charAt(name.length - 1));\n\n if (selectedItems.includes(productId * 1)) {\n setSelectedItems(selectedItems.filter((id) => productId * 1 !== id));\n\n const checkAll = checkAllSelected(selectedItems.length - 1, totalItemCount);\n setAreAllSelected(!!checkAll);\n } else {\n setSelectedItems([...selectedItems, productId * 1]);\n const checkAll = checkAllSelected(selectedItems.length + 1, totalItemCount);\n setAreAllSelected(!!checkAll);\n }\n };\n\n const onCardClick = (productId) => {\n if (productId === activeCard) {\n setIsDrawerExpanded(!isDrawerExpanded);\n setActiveCard(-1);\n } else {\n setActiveCard(productId);\n setIsDrawerExpanded(true);\n }\n };\n\n const selectPage = (e: { target: { checked: any } }) => {\n const { checked } = e.target;\n let collection: number[] = [];\n\n collection = getAllItems();\n\n setSelectedItems(collection);\n setIsChecked(checked);\n setAreAllSelected(totalItemCount === perPage ? true : false);\n\n updateSelected();\n };\n\n const selectAll = () => {\n let collection: number[] = [];\n for (let i = 0; i <= 9; i++) {\n collection = [...collection, i];\n }\n\n setSelectedItems(collection);\n setIsChecked(true);\n setAreAllSelected(true);\n\n updateSelected();\n };\n\n const selectNone = () => {\n setSelectedItems([]);\n setIsChecked(false);\n setAreAllSelected(false);\n setIsDrawerExpanded(false);\n setActiveCard(-1);\n\n updateSelected();\n };\n\n const updateSelected = () => {\n const rows = cardData.map((post) => {\n post.selected = selectedItems.includes(post.id);\n return post;\n });\n\n setCardData(rows);\n };\n\n const getAllItems = () => {\n const collection: number[] = [];\n for (const items of cardData) {\n collection.push(items.id);\n }\n\n return collection;\n };\n\n const splitCheckboxSelectAll = (e: any) => {\n let collection: number[] = [];\n\n if (e.target.checked) {\n for (let i = 0; i <= 9; i++) {\n collection = [...collection, i];\n }\n }\n\n setSelectedItems(collection);\n setIsChecked(isChecked);\n setAreAllSelected(e.target.checked);\n setIsDrawerExpanded(false);\n setActiveCard(-1);\n\n updateSelected();\n };\n\n const renderPagination = () => {\n const defaultPerPageOptions = [\n {\n title: '1',\n value: 1\n },\n {\n title: '5',\n value: 5\n },\n {\n title: '10',\n value: 10\n }\n ];\n\n return (\n <Pagination\n itemCount={totalItemCount}\n page={page}\n perPage={perPage}\n perPageOptions={defaultPerPageOptions}\n onSetPage={onSetPage}\n onPerPageSelect={onPerPageSelect}\n variant=\"top\"\n isCompact\n />\n );\n };\n\n const buildSelectDropdown = () => {\n const numSelected = selectedItems.length;\n const anySelected = numSelected > 0;\n const splitButtonDropdownItems = (\n <>\n <DropdownItem key=\"item-1\" onClick={selectNone}>\n Select none (0 items)\n </DropdownItem>\n <DropdownItem key=\"item-2\" onClick={selectPage}>\n Select page ({perPage} items)\n </DropdownItem>\n <DropdownItem key=\"item-3\" onClick={selectAll}>\n Select all ({totalItemCount} items)\n </DropdownItem>\n </>\n );\n\n return (\n <Dropdown\n onSelect={onSplitButtonSelect}\n isOpen={splitButtonDropdownIsOpen}\n onOpenChange={(isOpen) => setSplitButtonDropdownIsOpen(isOpen)}\n toggle={(toggleRef) => (\n <MenuToggle\n ref={toggleRef}\n isExpanded={splitButtonDropdownIsOpen}\n onClick={onSplitButtonToggle}\n aria-label=\"Select cards\"\n splitButtonItems={[\n <MenuToggleCheckbox\n id=\"split-dropdown-checkbox\"\n key=\"split-dropdown-checkbox\"\n aria-label={anySelected ? 'Deselect all cards' : 'Select all cards'}\n isChecked={areAllSelected}\n onClick={splitCheckboxSelectAll.bind(this)}\n >\n {numSelected !== 0 && `${numSelected} selected`}\n </MenuToggleCheckbox>\n ]}\n ></MenuToggle>\n )}\n >\n <DropdownList>{splitButtonDropdownItems}</DropdownList>\n </Dropdown>\n );\n };\n\n const buildFilterDropdown = () => {\n const filterDropdownItems = (\n <SelectList>\n <SelectOption\n hasCheckbox\n key=\"patternfly\"\n value=\"PatternFly\"\n isSelected={filters.products.includes('PatternFly')}\n >\n PatternFly\n </SelectOption>\n <SelectOption hasCheckbox key=\"activemq\" value=\"ActiveMQ\" isSelected={filters.products.includes('ActiveMQ')}>\n ActiveMQ\n </SelectOption>\n <SelectOption\n hasCheckbox\n key=\"apachespark\"\n value=\"Apache Spark\"\n isSelected={filters.products.includes('Apache Spark')}\n >\n Apache Spark\n </SelectOption>\n <SelectOption hasCheckbox key=\"avro\" value=\"Avro\" isSelected={filters.products.includes('Avro')}>\n Avro\n </SelectOption>\n <SelectOption\n hasCheckbox\n key=\"azureservices\"\n value=\"Azure Services\"\n isSelected={filters.products.includes('Azure Services')}\n >\n Azure Services\n </SelectOption>\n <SelectOption hasCheckbox key=\"crypto\" value=\"Crypto\" isSelected={filters.products.includes('Crypto')}>\n Crypto\n </SelectOption>\n <SelectOption hasCheckbox key=\"dropbox\" value=\"DropBox\" isSelected={filters.products.includes('DropBox')}>\n DropBox\n </SelectOption>\n <SelectOption\n hasCheckbox\n key=\"jbossdatagrid\"\n value=\"JBoss Data Grid\"\n isSelected={filters.products.includes('JBoss Data Grid')}\n >\n JBoss Data Grid\n </SelectOption>\n <SelectOption hasCheckbox key=\"rest\" value=\"REST\" isSelected={filters.products.includes('REST')}>\n REST\n </SelectOption>\n <SelectOption hasCheckbox key=\"swagger\" value=\"SWAGGER\" isSelected={filters.products.includes('SWAGGER')}>\n SWAGGER\n </SelectOption>\n </SelectList>\n );\n\n return (\n <ToolbarFilter\n categoryName=\"Products\"\n labels={filters.products}\n deleteLabel={(type, id) => onDelete(type as string, id as string)}\n >\n <Select\n aria-label=\"Products\"\n role=\"menu\"\n toggle={(toggleRef) => (\n <MenuToggle ref={toggleRef} onClick={onToolbarDropdownToggle} isExpanded={isLowerToolbarDropdownOpen}>\n Filter by creator name\n {filters.products.length > 0 && <Badge isRead>{filters.products.length}</Badge>}\n </MenuToggle>\n )}\n onSelect={(event, selection) => onNameSelect(event, selection?.toString())}\n onOpenChange={(isOpen) => {\n setIsLowerToolbarDropdownOpen(isOpen);\n }}\n selected={filters.products}\n isOpen={isLowerToolbarDropdownOpen}\n >\n {filterDropdownItems}\n </Select>\n </ToolbarFilter>\n );\n };\n\n const toolbarKebabDropdownItems = (\n <>\n <DropdownItem value={0} key=\"action\">\n Action\n </DropdownItem>\n <DropdownItem\n value={1}\n key=\"link\"\n to=\"#default-link2\"\n // Prevent the default onClick functionality for example purposes\n onClick={(ev) => ev.preventDefault()}\n >\n Link\n </DropdownItem>\n <DropdownItem value={2} isDisabled key=\"disabled action\">\n Disabled Action\n </DropdownItem>\n <DropdownItem value={3} isDisabled key=\"disabled link\" to=\"#default-link4\">\n Disabled Link\n </DropdownItem>\n <Divider component=\"li\" key=\"separator\" />\n <DropdownItem value={4} key=\"separated action\">\n Separated Action\n </DropdownItem>\n <DropdownItem value={5} key=\"separated link\" to=\"#default-link6\" onClick={(ev) => ev.preventDefault()}>\n Separated Link\n </DropdownItem>\n </>\n );\n const toolbarItems = (\n <Fragment>\n <ToolbarItem>{buildSelectDropdown()}</ToolbarItem>\n <ToolbarItem>{buildFilterDropdown()}</ToolbarItem>\n <ToolbarItem>\n <Button variant=\"primary\">Create instance</Button>\n </ToolbarItem>\n <ToolbarItem>\n <Button variant=\"secondary\">Action</Button>\n </ToolbarItem>\n <ToolbarItem>\n <Dropdown\n onSelect={onToolbarKebabDropdownSelect}\n isOpen={isLowerToolbarKebabDropdownOpen}\n onOpenChange={(isOpen) => setIsLowerToolbarKebabDropdownOpen(isOpen)}\n toggle={(toggleRef) => (\n <MenuToggle\n ref={toggleRef}\n isExpanded={isLowerToolbarKebabDropdownOpen}\n variant=\"plain\"\n onClick={onToolbarKebabDropdownToggle}\n aria-label=\"Toolbar actions\"\n icon={<RhUiEllipsisVerticalFillIcon />}\n />\n )}\n >\n <DropdownList>{toolbarKebabDropdownItems}</DropdownList>\n </Dropdown>\n </ToolbarItem>\n <ToolbarItem variant=\"pagination\" align={{ default: 'alignEnd' }}>\n {renderPagination()}\n </ToolbarItem>\n </Fragment>\n );\n\n const filtered =\n filters.products.length > 0\n ? data.filter((card: { name: string }) => filters.products.length === 0 || filters.products.includes(card.name))\n : cardData.slice((page - 1) * perPage, perPage === 1 ? page * perPage : page * perPage - 1);\n\n const icons = {\n pfIcon,\n activeMQIcon,\n sparkIcon,\n avroIcon,\n azureIcon,\n saxonIcon,\n dropBoxIcon,\n infinispanIcon,\n restIcon,\n swaggerIcon\n };\n\n const drawerContent = (\n <Gallery hasGutter role=\"region\" aria-label=\"Selectable card container\">\n {filtered.map((product, key) => (\n <Card\n key={product.name}\n id={'card-view-' + key}\n isClickable\n isSelectable\n isSelected={activeCard === product.id}\n >\n <CardHeader\n actions={{\n actions: (\n <>\n <Dropdown\n isOpen={!!state[key] ?? false}\n onOpenChange={(isOpen) => setState({ [key]: isOpen })}\n popperProps={{ position: 'right' }}\n toggle={(toggleRef: React.Ref<MenuToggleElement>) => (\n <MenuToggle\n ref={toggleRef}\n aria-label={`${product.name} actions`}\n variant=\"plain\"\n onClick={(e) => {\n onCardKebabDropdownToggle(e, key.toString());\n }}\n isExpanded={!!state[key]}\n icon={<RhUiEllipsisVerticalFillIcon />}\n />\n )}\n >\n <DropdownList>\n <DropdownItem\n key=\"trash\"\n onClick={() => {\n deleteItem(product);\n }}\n >\n <TrashIcon />\n Delete\n </DropdownItem>\n </DropdownList>\n </Dropdown>\n </>\n )\n }}\n selectableActions={{\n isChecked: selectedItems.includes(product.id),\n selectableActionId: `selectable-actions-item-${product.id}`,\n selectableActionAriaLabelledby: `${'card-view-' + key}`,\n name: `check-${product.id}`,\n onChange\n }}\n >\n <img src={icons[product.icon]} alt={`${product.name} icon`} style={{ height: '50px' }} />\n </CardHeader>\n <CardTitle>\n <Flex direction={{ default: 'column' }} spaceItems={{ default: 'spaceItemsNone' }}>\n <FlexItem>\n <Button\n variant=\"link\"\n isInline\n onClick={() => onCardClick(product.id)}\n aria-expanded={activeCard === product.id}\n >\n {product.name}\n </Button>\n </FlexItem>\n <FlexItem>\n <Content>\n <small className=\"pf-v6-u-color-200 pf-v6-u-font-family-text\">Provided by Red Hat</small>\n </Content>\n </FlexItem>\n </Flex>\n </CardTitle>\n\n <CardBody>{product.description}</CardBody>\n </Card>\n ))}\n </Gallery>\n );\n\n const panelContent = (\n <DrawerPanelContent>\n <DrawerHead>\n <Title headingLevel=\"h2\" size=\"xl\">\n node-{activeCard}\n </Title>\n <DrawerActions>\n <DrawerCloseButton onClick={onCloseDrawerClick} />\n </DrawerActions>\n </DrawerHead>\n <DrawerPanelBody>\n <Flex spaceItems={{ default: 'spaceItemsLg' }} direction={{ default: 'column' }}>\n <FlexItem>\n <p>\n The content of the drawer really is up to you. It could have form fields, definition lists, text lists,\n labels, charts, progress bars, etc. Spacing recommendation is 24px margins. You can put tabs in here, and\n can also make the drawer scrollable.\n </p>\n </FlexItem>\n <FlexItem>\n <Progress value={activeCard * 10} title=\"Title\" />\n </FlexItem>\n <FlexItem>\n <Progress value={activeCard * 5} title=\"Title\" />\n </FlexItem>\n </Flex>\n </DrawerPanelBody>\n </DrawerPanelContent>\n );\n\n return (\n <DashboardWrapper mainContainerId=\"main-content-card-view-default-nav\" breadcrumb={null}>\n <PageSection aria-labelledby=\"projects\">\n <Content>\n <h1 id=\"projects\">Projects</h1>\n <p>This is a demo that showcases Patternfly cards.</p>\n </Content>\n </PageSection>\n <PageSection isFilled padding={{ md: 'padding' }} aria-label=\"Card filtering toolbar\">\n <Toolbar id=\"card-view-data-toolbar-group-types\" clearAllFilters={onDelete}>\n <ToolbarContent>{toolbarItems}</ToolbarContent>\n </Toolbar>\n <Divider component=\"div\" />\n </PageSection>\n <PageSection isFilled padding={{ default: 'noPadding' }} aria-label=\"Card content area\">\n <Drawer isExpanded={isDrawerExpanded} className={'pf-m-inline-on-2xl'}>\n <DrawerContent panelContent={panelContent}>\n <DrawerContentBody hasPadding>{drawerContent}</DrawerContentBody>\n </DrawerContent>\n </Drawer>\n </PageSection>\n <PageSection\n isFilled={false}\n stickyOnBreakpoint={{ default: 'bottom' }}\n padding={{ default: 'noPadding' }}\n variant=\"light\"\n aria-label=\"Pagination controls\"\n >\n <Pagination\n itemCount={filtered.length}\n page={page}\n perPage={perPage}\n onPerPageSelect={onPerPageSelect}\n onSetPage={onSetPage}\n variant=\"bottom\"\n />\n </PageSection>\n </DashboardWrapper>\n );\n};\n","title":"Primary-detail card view","lang":"ts","isFullscreen":true,"className":""}}>
92
+
93
+ </Example>,
94
+ 'Primary-detail simple list in card': props =>
95
+ <Example {...pageData} {...props} thumbnail={srcImportprimarydetailsimplelistincard} {...{"code":"import { Fragment, useState } from 'react';\nimport {\n Card,\n Content,\n Divider,\n Drawer,\n DrawerActions,\n DrawerCloseButton,\n DrawerContent,\n DrawerContentBody,\n DrawerHead,\n DrawerPanelBody,\n DrawerPanelContent,\n Flex,\n FlexItem,\n PageSection,\n Progress,\n SimpleList,\n SimpleListGroup,\n SimpleListItem,\n Title\n} from '@patternfly/react-core';\nimport { DashboardWrapper } from '@patternfly/react-core/src/demos/DashboardWrapper';\n\nexport const PrimaryDetailSimpleListInCard: React.FunctionComponent = () => {\n const [drawerPanelBodyContent, setDrawerPanelBodyContent] = useState(1);\n const [isExpanded, setIsExpanded] = useState(false);\n\n const onSelectListItem = (_listItem, listItemProps) => {\n const id = listItemProps.children;\n setDrawerPanelBodyContent(id.charAt(id.length - 1));\n setIsExpanded(true);\n };\n\n const onClose = () => {\n setIsExpanded(false);\n };\n\n const panelContent = (\n <DrawerPanelContent widths={{ xl: 'width_75' }}>\n <DrawerHead>\n <Title headingLevel=\"h2\" size=\"xl\">\n {`List item ${drawerPanelBodyContent} details`}\n </Title>\n <DrawerActions>\n <DrawerCloseButton onClick={onClose} />\n </DrawerActions>\n </DrawerHead>\n <DrawerPanelBody>\n <Flex spaceItems={{ default: 'spaceItemsLg' }} direction={{ default: 'column' }}>\n <FlexItem>\n <p>\n The content of the drawer really is up to you. It could have form fields, definition lists, text lists,\n labels, charts, progress bars, etc. Spacing recommendation is 24px margins. You can put tabs in here, and\n can also make the drawer scrollable.\n </p>\n </FlexItem>\n <FlexItem>\n <Progress value={drawerPanelBodyContent * 10} title=\"Title\" />\n </FlexItem>\n <FlexItem>\n <Progress value={drawerPanelBodyContent * 5} title=\"Title\" />\n </FlexItem>\n </Flex>\n </DrawerPanelBody>\n </DrawerPanelContent>\n );\n\n const drawerContent = (\n <Fragment>\n <SimpleList onSelect={onSelectListItem}>\n <SimpleListGroup title=\"Section 1\" id=\"simple-list-section-1\">\n <SimpleListItem key=\"item1\" isActive>\n List item 1\n </SimpleListItem>\n <SimpleListItem key=\"item2\">List item 2</SimpleListItem>\n <SimpleListItem key=\"item3\">List item 3</SimpleListItem>\n <SimpleListItem key=\"item4\">List item 4</SimpleListItem>\n </SimpleListGroup>\n <SimpleListGroup title=\"Section 2\" id=\"section-2\">\n <SimpleListItem key=\"item5\">List item 5</SimpleListItem>\n <SimpleListItem key=\"item6\">List item 6</SimpleListItem>\n <SimpleListItem key=\"item7\">List item 7</SimpleListItem>\n <SimpleListItem key=\"item8\">List item 8</SimpleListItem>\n <SimpleListItem key=\"item9\">List item 9</SimpleListItem>\n </SimpleListGroup>\n </SimpleList>\n </Fragment>\n );\n\n return (\n <DashboardWrapper>\n <PageSection aria-labelledby=\"main-title\">\n <Content>\n <h1 id=\"main-title\">Main title</h1>\n <p>\n Body text should be Red Hat Text at 1rem(16px). It should have leading of 1.5rem(24px) because <br />\n of it’s relative line height of 1.5.\n </p>\n </Content>\n </PageSection>\n <Divider component=\"div\" />\n <PageSection aria-label=\"Card with drawer content\">\n <Card>\n <Drawer isStatic isExpanded={isExpanded}>\n <DrawerContent panelContent={panelContent}>\n <DrawerContentBody>{drawerContent}</DrawerContentBody>\n </DrawerContent>\n </Drawer>\n </Card>\n </PageSection>\n </DashboardWrapper>\n );\n};\n","title":"Primary-detail simple list in card","lang":"ts","isFullscreen":true,"className":""}}>
96
+
97
+ </Example>,
98
+ 'Primary-detail data list in card': props =>
99
+ <Example {...pageData} {...props} thumbnail={srcImportprimarydetaildatalistincard} {...{"code":"import { Fragment, useState } from 'react';\nimport {\n Card,\n Content,\n DataList,\n DataListCell,\n DataListItem,\n DataListItemCells,\n DataListItemRow,\n Toolbar,\n ToolbarContent,\n ToolbarItem,\n Divider,\n Drawer,\n DrawerActions,\n DrawerCloseButton,\n DrawerContent,\n DrawerContentBody,\n DrawerHead,\n DrawerPanelBody,\n DrawerPanelContent,\n Dropdown,\n DropdownItem,\n DropdownList,\n Flex,\n FlexItem,\n MenuToggle,\n PageSection,\n Progress,\n Title\n} from '@patternfly/react-core';\nimport { DashboardWrapper } from '@patternfly/react-core/src/demos/DashboardWrapper';\n\nexport const PrimaryDetailDataListInCard: React.FunctionComponent = () => {\n const [drawerPanelBodyContent, setDrawerPanelBodyContent] = useState(1);\n const [isDropdownOpen, setIsDropdownOpen] = useState(false);\n const [selectedDataListItemId, setSelectedDataListItemId] = useState('dataListItem1');\n const [isExpanded, setIsExpanded] = useState(false);\n\n const onDropdownToggle = () => {\n setIsDropdownOpen(!isDropdownOpen);\n };\n const onDropdownSelect = () => {\n setIsDropdownOpen(false);\n onDropdownFocus();\n };\n const onDropdownFocus = () => {\n const element = document.getElementById('toggle-id');\n element?.focus();\n };\n const onSelectDataListItem = (_event, id) => {\n setSelectedDataListItemId(id);\n setDrawerPanelBodyContent(id.charAt(id.length - 1));\n setIsExpanded(true);\n };\n const onClose = () => {\n setIsExpanded(false);\n };\n\n const panelContent = (\n <DrawerPanelContent widths={{ '2xl': 'width_75' }}>\n <DrawerHead>\n <Title size=\"lg\" headingLevel=\"h2\">\n Patternfly-elements\n </Title>\n <DrawerActions>\n <DrawerCloseButton onClick={onClose} />\n </DrawerActions>\n </DrawerHead>\n <DrawerPanelBody>\n <Flex spaceItems={{ default: 'spaceItemsLg' }} direction={{ default: 'column' }}>\n <FlexItem>\n <p>\n The content of the drawer really is up to you. It could have form fields, definition lists, text lists,\n labels, charts, progress bars, etc. Spacing recommendation is 24px margins. You can put tabs in here, and\n can also make the drawer scrollable.\n </p>\n </FlexItem>\n <FlexItem>\n <Progress value={drawerPanelBodyContent * 10} title=\"Title\" />\n </FlexItem>\n <FlexItem>\n <Progress value={drawerPanelBodyContent * 5} title=\"Title\" />\n </FlexItem>\n </Flex>\n </DrawerPanelBody>\n </DrawerPanelContent>\n );\n\n const drawerContent = (\n <Fragment>\n <Toolbar id=\"data-list-data-toolbar\">\n <ToolbarContent>\n <ToolbarItem>\n <Dropdown\n onSelect={onDropdownSelect}\n isOpen={isDropdownOpen}\n onOpenChange={(isOpen) => setIsDropdownOpen(isOpen)}\n toggle={(toggleRef) => (\n <MenuToggle ref={toggleRef} isExpanded={isDropdownOpen} onClick={onDropdownToggle}>\n Dropdown\n </MenuToggle>\n )}\n >\n <DropdownList>\n <DropdownItem key=\"option1\">Option 1</DropdownItem>\n <DropdownItem key=\"option2\">Option 2</DropdownItem>\n </DropdownList>\n </Dropdown>\n </ToolbarItem>\n </ToolbarContent>\n </Toolbar>\n <DataList\n aria-label=\"selectable data list example\"\n selectedDataListItemId={selectedDataListItemId}\n onSelectDataListItem={onSelectDataListItem}\n >\n <DataListItem aria-label=\"data-list-item1-in-card\" id=\"data-list-item1\">\n <DataListItemRow>\n <DataListItemCells\n dataListCells={[\n <DataListCell key=\"node 1\">\n <div>Node 1</div>\n <a href=\"#\">siemur/test-space</a>\n </DataListCell>\n ]}\n />\n </DataListItemRow>\n </DataListItem>\n <DataListItem aria-label=\"data-list-item2-in-card\" id=\"data-list-item2\">\n <DataListItemRow>\n <DataListItemCells\n dataListCells={[\n <DataListCell key=\"node 2\">\n <div>Node 2</div>\n <a href=\"#\">siemur/test-space</a>\n </DataListCell>\n ]}\n />\n </DataListItemRow>\n </DataListItem>\n <DataListItem aria-label=\"data-list-item3-in-card\" id=\"data-list-item3\">\n <DataListItemRow>\n <DataListItemCells\n dataListCells={[\n <DataListCell key=\"node 3\">\n <div>Node 3</div>\n <a href=\"#\">siemur/test-space</a>\n </DataListCell>\n ]}\n />\n </DataListItemRow>\n </DataListItem>\n <DataListItem aria-label=\"data-list-item4-in-card\" id=\"data-list-item4\">\n <DataListItemRow>\n <DataListItemCells\n dataListCells={[\n <DataListCell key=\"node 4\">\n <div>Node 4</div>\n <a href=\"#\">siemur/test-space</a>\n </DataListCell>\n ]}\n />\n </DataListItemRow>\n </DataListItem>\n <DataListItem aria-label=\"data-list-item5-in-card\" id=\"data-list-item5\">\n <DataListItemRow>\n <DataListItemCells\n dataListCells={[\n <DataListCell key=\"node 5\">\n <div>Node 5</div>\n <a href=\"#\">siemur/test-space</a>\n </DataListCell>\n ]}\n />\n </DataListItemRow>\n </DataListItem>\n </DataList>\n </Fragment>\n );\n\n return (\n <DashboardWrapper>\n <PageSection aria-labelledby=\"main-title\">\n <Content>\n <h1 id=\"main-title\">Main title</h1>\n <p>\n Body text should be Red Hat Text at 1rem(16px). It should have leading of 1.5rem(24px) because <br />\n of it’s relative line height of 1.5.\n </p>\n </Content>\n </PageSection>\n <Divider component=\"div\" />\n <PageSection aria-label=\"Card with drawer content\">\n <Card>\n <Drawer isStatic isExpanded={isExpanded}>\n <DrawerContent panelContent={panelContent}>\n <DrawerContentBody>{drawerContent}</DrawerContentBody>\n </DrawerContent>\n </Drawer>\n </Card>\n </PageSection>\n </DashboardWrapper>\n );\n};\n","title":"Primary-detail data list in card","lang":"ts","isFullscreen":true,"className":""}}>
100
+
101
+ </Example>,
102
+ 'Primary-detail inline modifier': props =>
103
+ <Example {...pageData} {...props} thumbnail={srcImportprimarydetailinlinemodifier} {...{"code":"import { Fragment, useState } from 'react';\nimport {\n Button,\n ButtonVariant,\n Content,\n DataList,\n DataListAction,\n DataListCell,\n DataListItem,\n DataListItemCells,\n DataListItemRow,\n Toolbar,\n ToolbarItem,\n ToolbarContent,\n ToolbarToggleGroup,\n ToolbarGroup,\n Divider,\n Drawer,\n DrawerActions,\n DrawerCloseButton,\n DrawerContent,\n DrawerContentBody,\n DrawerHead,\n DrawerPanelBody,\n DrawerPanelContent,\n Flex,\n FlexItem,\n InputGroup,\n InputGroupItem,\n PageSection,\n Progress,\n Stack,\n StackItem,\n TextInput,\n Title,\n Select,\n SelectOption,\n SelectOptionProps,\n MenuToggle\n} from '@patternfly/react-core';\nimport { DashboardWrapper } from '@patternfly/react-core/dist/js/demos/DashboardWrapper';\nimport RhUiCodeIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-code-icon';\nimport RhUiBranchFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-branch-fill-icon';\nimport CubeIcon from '@patternfly/react-icons/dist/esm/icons/cube-icon';\nimport RhUiCheckCircleFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-check-circle-fill-icon';\nimport RhUiWarningFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-warning-fill-icon';\nimport FilterIcon from '@patternfly/react-icons/dist/esm/icons/filter-icon';\nimport SearchIcon from '@patternfly/react-icons/dist/esm/icons/search-icon';\nimport TimesCircleIcon from '@patternfly/react-icons/dist/esm/icons/times-circle-icon';\n\ninterface SelectOptionType extends Omit<SelectOptionProps, 'children'> {\n label: string;\n}\n\nconst statusOptions: SelectOptionType[] = [\n { value: 'New', label: 'New' },\n { value: 'Pending', label: 'Pending' },\n { value: 'Running', label: 'Running' },\n { value: 'Cancelled', label: 'Cancelled' }\n];\n\nconst riskOptions: SelectOptionType[] = [\n { value: 'Low', label: 'Low' },\n { value: 'Medium', label: 'Medium' },\n { value: 'High', label: 'High' }\n];\n\nexport const PrimaryDetailInlineModifier: React.FunctionComponent = () => {\n const [isDrawerExpanded, setIsDrawerExpanded] = useState(false);\n const [drawerPanelBodyContent, setDrawerPanelBodyContent] = useState('');\n const [inputValue, setInputValue] = useState('');\n const [statusIsOpen, setStatusIsOpen] = useState(false);\n const [statusSelected, setStatusSelected] = useState<string | number | undefined>('Status');\n const [riskIsOpen, setRiskIsOpen] = useState(false);\n const [riskSelected, setRiskSelected] = useState<string | number | undefined>('Risk');\n const [selectedDataListItemId, setSelectedDataListItemId] = useState('');\n\n const onStatusSelect = (_event: React.MouseEvent<Element> | undefined, value: string | number | undefined) => {\n setStatusSelected(value);\n setStatusIsOpen(false);\n };\n\n const onRiskSelect = (_event: React.MouseEvent<Element> | undefined, value: string | number | undefined) => {\n setRiskSelected(value);\n setRiskIsOpen(false);\n };\n\n const onSelectDataListItem = (\n _event: React.MouseEvent<Element, MouseEvent> | React.KeyboardEvent<Element>,\n id: string\n ) => {\n setSelectedDataListItemId(id);\n setIsDrawerExpanded(true);\n setDrawerPanelBodyContent(id.charAt(id.length - 1));\n };\n\n const onCloseDrawerClick = (_event: React.MouseEvent<HTMLDivElement>) => {\n setIsDrawerExpanded(false);\n setSelectedDataListItemId('');\n };\n\n const toggleGroupItems = (\n <Flex alignItems={{ default: 'alignItemsCenter' }}>\n <ToolbarItem>\n <InputGroup>\n <InputGroupItem isFill>\n <TextInput\n name=\"inline-modifier-data-toolbar-input1\"\n id=\"inline-modifier-data-toolbar-input1\"\n type=\"search\"\n aria-label=\"search input example\"\n onChange={(_event: React.FormEvent<HTMLInputElement>, value: string) => setInputValue(value)}\n value={inputValue}\n />\n </InputGroupItem>\n <InputGroupItem>\n <Button variant={ButtonVariant.control} aria-label=\"search button for search input\" icon={<SearchIcon />} />\n </InputGroupItem>\n </InputGroup>\n </ToolbarItem>\n <ToolbarGroup variant=\"filter-group\">\n <ToolbarItem>\n <Select\n aria-label=\"Status select\"\n selected={statusSelected}\n isOpen={statusIsOpen}\n toggle={(toggleRef) => (\n <MenuToggle\n ref={toggleRef}\n onClick={() => setStatusIsOpen((prevIsOpen) => !prevIsOpen)}\n isExpanded={statusIsOpen}\n >\n {statusSelected}\n </MenuToggle>\n )}\n onOpenChange={(isOpen: boolean) => setStatusIsOpen(isOpen)}\n onSelect={onStatusSelect}\n >\n {statusOptions.map(({ label, value }) => (\n <SelectOption key={label} value={value}>\n {label}\n </SelectOption>\n ))}\n </Select>\n </ToolbarItem>\n <ToolbarItem>\n <Select\n aria-label=\"Risk select\"\n selected={riskSelected}\n isOpen={riskIsOpen}\n toggle={(toggleRef) => (\n <MenuToggle\n ref={toggleRef}\n onClick={() => setRiskIsOpen((prevIsOpen) => !prevIsOpen)}\n isExpanded={riskIsOpen}\n >\n {riskSelected}\n </MenuToggle>\n )}\n onOpenChange={(isOpen: boolean) => setRiskIsOpen(isOpen)}\n onSelect={onRiskSelect}\n >\n {riskOptions.map(({ label, value }) => (\n <SelectOption key={label} value={value}>\n {label}\n </SelectOption>\n ))}\n </Select>\n </ToolbarItem>\n </ToolbarGroup>\n </Flex>\n );\n\n const ToolbarItems = (\n <ToolbarToggleGroup toggleIcon={<FilterIcon />} breakpoint=\"xl\">\n {toggleGroupItems}\n </ToolbarToggleGroup>\n );\n\n const panelContent = (\n <DrawerPanelContent>\n <DrawerHead>\n <Title headingLevel=\"h2\" size=\"xl\">\n node-{drawerPanelBodyContent}\n </Title>\n <DrawerActions>\n <DrawerCloseButton onClick={onCloseDrawerClick} />\n </DrawerActions>\n </DrawerHead>\n <DrawerPanelBody>\n <Flex spaceItems={{ default: 'spaceItemsLg' }} direction={{ default: 'column' }}>\n <FlexItem>\n <p>\n The content of the drawer really is up to you. It could have form fields, definition lists, text lists,\n labels, charts, progress bars, etc. Spacing recommendation is 24px margins. You can put tabs in here, and\n can also make the drawer scrollable.\n </p>\n </FlexItem>\n <FlexItem>\n <Progress value={parseInt(drawerPanelBodyContent) * 10} title=\"Title\" />\n </FlexItem>\n <FlexItem>\n <Progress value={parseInt(drawerPanelBodyContent) * 5} title=\"Title\" />\n </FlexItem>\n </Flex>\n </DrawerPanelBody>\n </DrawerPanelContent>\n );\n\n const drawerContent = (\n <Fragment>\n <Toolbar id=\"inline-modifier-data-toolbar\">\n <ToolbarContent>{ToolbarItems}</ToolbarContent>\n </Toolbar>\n <DataList\n aria-label=\"data list\"\n selectedDataListItemId={selectedDataListItemId}\n onSelectDataListItem={onSelectDataListItem}\n >\n <DataListItem id=\"inline-modifier-item1\">\n <DataListItemRow>\n <DataListItemCells\n dataListCells={[\n <DataListCell key=\"primary-content\">\n <Flex spaceItems={{ default: 'spaceItemsMd' }} direction={{ default: 'column' }}>\n <FlexItem>\n <p>patternfly</p>\n <small>\n Working repo for PatternFly 5 <a>https://pf5.patternfly.org/</a>\n </small>\n </FlexItem>\n <Flex spaceItems={{ default: 'spaceItemsMd' }}>\n <FlexItem>\n <RhUiBranchFillIcon /> 10\n </FlexItem>\n <FlexItem>\n <RhUiCodeIcon /> 4\n </FlexItem>\n <FlexItem>\n <CubeIcon /> 5\n </FlexItem>\n <FlexItem>Updated 2 days ago</FlexItem>\n </Flex>\n </Flex>\n </DataListCell>,\n <DataListAction\n key=\"actions\"\n aria-labelledby=\"inline-modifier-item1 inline-modifier-action1\"\n id=\"inline-modifier-action1\"\n aria-label=\"Actions\"\n >\n <Stack>\n <StackItem>\n <Button variant={ButtonVariant.secondary}>Secondary</Button>\n </StackItem>\n <StackItem>\n <Button variant={ButtonVariant.link}>Link Button</Button>\n </StackItem>\n </Stack>\n </DataListAction>\n ]}\n />\n </DataListItemRow>\n </DataListItem>\n <DataListItem id=\"inline-modifier-item2\">\n <DataListItemRow>\n <DataListItemCells\n dataListCells={[\n <DataListCell key=\"primary-content\">\n <Flex spaceItems={{ default: 'spaceItemsMd' }} direction={{ default: 'column' }}>\n <FlexItem>\n <p>patternfly-elements</p>\n <small>PatternFly elements</small>\n </FlexItem>\n <Flex spaceItems={{ default: 'spaceItemsMd' }}>\n <FlexItem>\n <RhUiBranchFillIcon /> 10\n </FlexItem>\n <FlexItem>\n <RhUiCodeIcon /> 4\n </FlexItem>\n <FlexItem>\n <CubeIcon /> 5\n </FlexItem>\n <FlexItem>\n <RhUiCheckCircleFillIcon /> 7\n </FlexItem>\n <FlexItem>\n <RhUiWarningFillIcon /> 5\n </FlexItem>\n <FlexItem>\n <TimesCircleIcon /> 5\n </FlexItem>\n <FlexItem>Updated 2 days ago</FlexItem>\n </Flex>\n </Flex>\n </DataListCell>,\n <DataListAction\n key=\"actions\"\n aria-labelledby=\"inline-modifier-item2 inline-modifier-action2\"\n id=\"inline-modifier-action2\"\n aria-label=\"Actions\"\n >\n <Stack>\n <StackItem>\n <Button variant={ButtonVariant.secondary}>Secondary</Button>\n </StackItem>\n <StackItem>\n <Button variant={ButtonVariant.link}>Link Button</Button>\n </StackItem>\n </Stack>\n </DataListAction>\n ]}\n />\n </DataListItemRow>\n </DataListItem>\n <DataListItem id=\"inline-modifier-item3\">\n <DataListItemRow>\n <DataListItemCells\n dataListCells={[\n <DataListCell key=\"primary-content\">\n <Flex spaceItems={{ default: 'spaceItemsMd' }} direction={{ default: 'column' }}>\n <FlexItem>\n <p>patternfly</p>\n <small>\n Working repo for PatternFly 5 <a>https://pf5.patternfly.org/</a>\n </small>\n </FlexItem>\n <Flex spaceItems={{ default: 'spaceItemsMd' }}>\n <FlexItem>\n <RhUiBranchFillIcon /> 10\n </FlexItem>\n <FlexItem>\n <RhUiCodeIcon /> 4\n </FlexItem>\n <FlexItem>\n <CubeIcon /> 5\n </FlexItem>\n <FlexItem>Updated 2 days ago</FlexItem>\n </Flex>\n </Flex>\n </DataListCell>,\n <DataListAction\n key=\"actions\"\n aria-labelledby=\"inline-modifier-item3 inline-modifier-action3\"\n id=\"inline-modifier-action3\"\n aria-label=\"Actions\"\n >\n <Stack>\n <StackItem>\n <Button variant={ButtonVariant.secondary}>Secondary</Button>\n </StackItem>\n <StackItem>\n <Button variant={ButtonVariant.link}>Link Button</Button>\n </StackItem>\n </Stack>\n </DataListAction>\n ]}\n />\n </DataListItemRow>\n </DataListItem>\n <DataListItem id=\"inline-modifier-item4\">\n <DataListItemRow>\n <DataListItemCells\n dataListCells={[\n <DataListCell key=\"primary-content\">\n <Flex spaceItems={{ default: 'spaceItemsMd' }} direction={{ default: 'column' }}>\n <FlexItem>\n <p>patternfly-elements</p>\n <small>PatternFly elements</small>\n </FlexItem>\n <Flex spaceItems={{ default: 'spaceItemsMd' }}>\n <FlexItem>\n <RhUiBranchFillIcon /> 10\n </FlexItem>\n <FlexItem>\n <RhUiCodeIcon /> 4\n </FlexItem>\n <FlexItem>\n <CubeIcon /> 5\n </FlexItem>\n <FlexItem>\n <RhUiCheckCircleFillIcon /> 7\n </FlexItem>\n <FlexItem>\n <RhUiWarningFillIcon /> 5\n </FlexItem>\n <FlexItem>\n <TimesCircleIcon /> 5\n </FlexItem>\n <FlexItem>Updated 2 days ago</FlexItem>\n </Flex>\n </Flex>\n </DataListCell>,\n <DataListAction\n key=\"actions\"\n aria-labelledby=\"inline-modifier-item4 inline-modifier-action4\"\n id=\"inline-modifier-action4\"\n aria-label=\"Actions\"\n >\n <Stack>\n <StackItem>\n <Button variant={ButtonVariant.secondary}>Secondary</Button>\n </StackItem>\n <StackItem>\n <Button variant={ButtonVariant.link}>Link Button</Button>\n </StackItem>\n </Stack>\n </DataListAction>\n ]}\n />\n </DataListItemRow>\n </DataListItem>\n </DataList>\n </Fragment>\n );\n\n return (\n <DashboardWrapper>\n <PageSection aria-labelledby=\"main-title\">\n <Content>\n <h1 id=\"main-title\">Main title</h1>\n <p>\n Body text should be Red Hat Text at 1rem(16px). It should have leading of 1.5rem(24px) because <br />\n of it's relative line height of 1.5.\n </p>\n </Content>\n </PageSection>\n <Divider component=\"div\" />\n <PageSection padding={{ default: 'noPadding' }} aria-label=\"Card with drawer content\">\n <Drawer isExpanded={isDrawerExpanded} isInline>\n <DrawerContent panelContent={panelContent}>\n <DrawerContentBody>{drawerContent}</DrawerContentBody>\n </DrawerContent>\n </Drawer>\n </PageSection>\n </DashboardWrapper>\n );\n};\n","title":"Primary-detail inline modifier","lang":"ts","isFullscreen":true,"className":""}}>
104
+
105
+ </Example>
106
+ };
107
+
108
+ const Component = () => (
109
+ <React.Fragment>
110
+ <AutoLinkHeader {...{"id":"demos","headingLevel":"h2","className":"ws-title ws-h2"}}>
111
+ {`Demos`}
112
+ </AutoLinkHeader>
113
+ {React.createElement(pageData.examples["Primary-detail full page"])}
114
+ {React.createElement(pageData.examples["Primary-detail content padding"])}
115
+ {React.createElement(pageData.examples["Primary-detail card view"])}
116
+ {React.createElement(pageData.examples["Primary-detail simple list in card"])}
117
+ {React.createElement(pageData.examples["Primary-detail data list in card"])}
118
+ {React.createElement(pageData.examples["Primary-detail inline modifier"])}
119
+ </React.Fragment>
120
+ );
121
+ Component.displayName = 'PatternsPrimaryDetailReactDemosDocs';
122
+ Component.pageData = pageData;
123
+
124
+ export default Component;
@@ -0,0 +1,81 @@
1
+ import React from 'react';
2
+ import { AutoLinkHeader, Example, Link as PatternflyThemeLink } from '@patternfly/documentation-framework/components';
3
+ import { Fragment, useEffect, useState } from 'react';
4
+ import translationsEn from "../../../../../react-core/src/demos/RTL/./examples/translations.en.json";
5
+ import translationsHe from "../../../../../react-core/src/demos/RTL/./examples/translations.he.json";
6
+ import AlignRightIcon from '@patternfly/react-icons/dist/esm/icons/align-right-icon';
7
+ import ToolsIcon from '@patternfly/react-icons/dist/esm/icons/tools-icon';
8
+ import RhUiRunningIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-running-icon';
9
+ import RhUiClockFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-clock-fill-icon';
10
+ import pfLogo from '@patternfly/react-core/src/demos/assets/PF-HorizontalLogo-Color.svg';
11
+ import RhUiMenuBarsIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-menu-bars-icon';
12
+ import RhUiSettingsFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-settings-fill-icon';
13
+ import RhUiQuestionMarkCircleFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-question-mark-circle-fill-icon';
14
+ import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon';
15
+ import RhUiStopCircleFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-stop-circle-fill-icon';
16
+ import RhUiEllipsisVerticalFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-ellipsis-vertical-fill-icon';
17
+ import imgAvatar from '@patternfly/react-core/src/components/assets/avatarImg.svg';
18
+ import { rows } from '@patternfly/react-core/dist/esm/demos/sampleDataRTL';
19
+ import '../../../../../react-core/src/demos/RTL/./examples/PaginatedTable.css';
20
+ import srcImportpaginatedtable from './react-demos/paginated-table.png';
21
+ const pageData = {
22
+ "id": "Right-to-left",
23
+ "section": "patterns",
24
+ "subsection": "",
25
+ "deprecated": false,
26
+ "template": false,
27
+ "beta": false,
28
+ "demo": false,
29
+ "newImplementationLink": false,
30
+ "source": "react-demos",
31
+ "tabName": null,
32
+ "slug": "/patterns/right-to-left/react-demos",
33
+ "sourceLink": "https://github.com/patternfly/patternfly-react/blob/main/packages/react-core/src/demos/RTL/RTL.md",
34
+ "relPath": "packages/react-core/src/demos/RTL/RTL.md",
35
+ "fullscreenExamples": [
36
+ "Paginated table"
37
+ ]
38
+ };
39
+ pageData.liveContext = {
40
+ Fragment,
41
+ useEffect,
42
+ useState,
43
+ translationsEn,
44
+ translationsHe,
45
+ AlignRightIcon,
46
+ ToolsIcon,
47
+ RhUiRunningIcon,
48
+ RhUiClockFillIcon,
49
+ pfLogo,
50
+ RhUiMenuBarsIcon,
51
+ RhUiSettingsFillIcon,
52
+ RhUiQuestionMarkCircleFillIcon,
53
+ HelpIcon,
54
+ RhUiStopCircleFillIcon,
55
+ RhUiEllipsisVerticalFillIcon,
56
+ imgAvatar,
57
+ rows
58
+ };
59
+ pageData.relativeImports = "import translationsEn from 'react-core/src/demos/RTL/./examples/translations.en.json';,import translationsHe from 'react-core/src/demos/RTL/./examples/translations.he.json';,import 'react-core/src/demos/RTL/./examples/PaginatedTable.css';"
60
+ pageData.examples = {
61
+ 'Paginated table': props =>
62
+ <Example {...pageData} {...props} thumbnail={srcImportpaginatedtable} {...{"code":"import { Fragment, useEffect, useState } from 'react';\nimport {\n Avatar,\n Brand,\n Breadcrumb,\n BreadcrumbItem,\n Button,\n ButtonVariant,\n Content,\n Divider,\n Dropdown,\n DropdownGroup,\n DropdownItem,\n DropdownList,\n Label,\n LabelStatus,\n Masthead,\n MastheadMain,\n MastheadLogo,\n MastheadContent,\n MastheadBrand,\n MastheadToggle,\n MenuToggle,\n Nav,\n NavItem,\n NavList,\n Page,\n PageBreadcrumb,\n PageSection,\n PageSidebar,\n PageSidebarBody,\n PageToggleButton,\n Pagination,\n PaginationVariant,\n Toolbar,\n ToolbarContent,\n ToolbarGroup,\n ToolbarItem,\n Truncate\n} from '@patternfly/react-core';\n\nimport { Table, Thead, Tr, Th, Tbody, Td } from '@patternfly/react-table';\nimport translationsEn from './examples/translations.en.json';\nimport translationsHe from './examples/translations.he.json';\nimport AlignRightIcon from '@patternfly/react-icons/dist/esm/icons/align-right-icon';\nimport ToolsIcon from '@patternfly/react-icons/dist/esm/icons/tools-icon';\nimport RhUiRunningIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-running-icon';\nimport RhUiClockFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-clock-fill-icon';\nimport RhUiStopCircleFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-stop-circle-fill-icon';\nimport pfLogo from '@patternfly/react-core/src/demos/assets/pf-logo.svg';\nimport RhUiSettingsFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-settings-fill-icon';\nimport RhUiQuestionMarkCircleFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-question-mark-circle-fill-icon';\nimport HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-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 { rows } from '@patternfly/react-core/dist/esm/demos/sampleDataRTL';\n\ninterface Row {\n name: string;\n status: string;\n location: string;\n lastModified: string;\n url: string;\n}\n\ninterface Translation {\n [key: string]: any;\n}\n\nexport const PaginatedTableAction: React.FunctionComponent = () => {\n const [translation, setTranslation] = useState<Translation>(translationsEn);\n const [page, setPage] = useState<number>(1);\n const [perPage, setPerPage] = useState<number>(10);\n\n const columns = [\n translation.table.columns.servers,\n translation.table.columns.status,\n translation.table.columns.location,\n translation.table.columns.modified,\n translation.table.columns.url\n ];\n\n const generateRowsFromTranslation = (translation: Translation): Row[] =>\n rows.map((row, index) => ({\n name: `${translation.table.rows.node}${index + 1}`,\n status: translation.table.rows.status[row.status],\n location: translation.table.rows.locations[row.location],\n lastModified: translation.table.rows.lastModified[row.lastModified],\n url: `http://www.redhat.com/en/office-locations/node${index + 1}`\n }));\n\n const [paginatedRows, setPaginatedRows] = useState<Row[]>(rows.slice(0, 10));\n const [isDirRTL, setIsDirRTL] = useState<boolean>(false);\n\n const capitalize = (input: string) => input[0].toUpperCase() + input.substring(1);\n\n const switchTranslation = () => {\n setIsDirRTL((prevIsDirRTL) => !prevIsDirRTL);\n setTranslation((prevTranslation: string) => (prevTranslation === translationsEn ? translationsHe : translationsEn));\n };\n\n useEffect(() => {\n const fullRows = generateRowsFromTranslation(translation);\n setPaginatedRows(fullRows.slice((page - 1) * perPage, page * perPage));\n }, [translation]);\n\n useEffect(() => {\n const html = document.querySelector('html');\n html.dir = isDirRTL ? 'rtl' : 'ltr';\n }, [isDirRTL]);\n\n // Pagination logic\n\n const handleSetPage = (\n _evt: React.MouseEvent | React.KeyboardEvent | MouseEvent,\n newPage: number,\n _perPage: number | undefined,\n startIdx: number | undefined,\n endIdx: number | undefined\n ) => {\n const fullRows = generateRowsFromTranslation(translation);\n setPaginatedRows(fullRows.slice(startIdx, endIdx));\n setPage(newPage);\n };\n\n const handlePerPageSelect = (\n _evt: React.MouseEvent | React.KeyboardEvent | MouseEvent,\n newPerPage: number,\n _newPage: number,\n startIdx: number | undefined,\n endIdx: number | undefined\n ) => {\n const fullRows = generateRowsFromTranslation(translation);\n setPaginatedRows(fullRows.slice(startIdx, endIdx));\n setPerPage(newPerPage);\n };\n\n const renderPagination = (variant: PaginationVariant) => {\n const { pagination } = translation;\n\n return (\n <Pagination\n itemCount={rows.length}\n page={page}\n perPage={perPage}\n onSetPage={handleSetPage}\n onPerPageSelect={handlePerPageSelect}\n variant={variant}\n titles={{\n paginationAriaLabel: pagination?.[`${variant}VariantAriaLabel`] || `${variant} pagination`,\n ofWord: pagination?.ofWord,\n items: pagination?.items,\n perPageSuffix: pagination?.perPageSuffix,\n toNextPageAriaLabel: pagination?.toNextPageAriaLabel,\n toPreviousPageAriaLabel: pagination?.toPreviousPageAriaLabel,\n toFirstPageAriaLabel: pagination?.toFirstPageAriaLabel,\n toLastPageAriaLabel: pagination?.perPageSuffix,\n currPageAriaLabel: pagination?.currPageAriaLabel\n }}\n />\n );\n };\n\n const breadcrumbItems = {\n home: {\n url: '#home'\n },\n category: {\n url: '#category'\n },\n subCategory: {\n url: 'sub-category'\n }\n };\n\n const renderLabel = (labelText: string) => {\n switch (labelText) {\n case 'Running':\n case 'רץ':\n return (\n <Label status={LabelStatus.success} icon={<RhUiRunningIcon className=\"pf-v6-m-mirror-inline-rtl\" />}>\n {translation.table.rows.status.running}\n </Label>\n );\n case 'Stopped':\n case 'עצר':\n return (\n <Label status={LabelStatus.danger} icon={<RhUiStopCircleFillIcon className=\"pf-v6-m-mirror-inline-rtl\" />}>\n {translation.table.rows.status.stopped}\n </Label>\n );\n case 'Needs maintenance':\n case 'זקוק לתחזוקה':\n return (\n <Label status={LabelStatus.info} icon={<ToolsIcon />}>\n {translation.table.rows.status.needsMaintenance}\n </Label>\n );\n case 'Down':\n case 'מטה':\n return (\n <Label status={LabelStatus.warning} icon={<RhUiClockFillIcon />}>\n {translation.table.rows.status.down}\n </Label>\n );\n }\n };\n\n const toolbarItems = (\n <Fragment>\n <Toolbar id=\"rtl-paginated-table\">\n <ToolbarContent>\n <ToolbarItem>\n <Button\n variant=\"primary\"\n icon={<AlignRightIcon className=\"pf-v6-m-mirror-inline-rtl\" />}\n iconPosition=\"end\"\n onClick={switchTranslation}\n >\n {translation.switchBtn}\n </Button>\n </ToolbarItem>\n <ToolbarItem variant=\"pagination\">{renderPagination(PaginationVariant.top)}</ToolbarItem>\n </ToolbarContent>\n </Toolbar>\n </Fragment>\n );\n\n const pageNav = (\n <Nav aria-label={translation.nav.ariaLabel || undefined}>\n <NavList>\n <NavItem itemId={0} isActive to=\"#system-panel\">\n {translation.nav.systemPanel}\n </NavItem>\n <NavItem itemId={1} to=\"#policy\">\n {translation.nav.policy}\n </NavItem>\n <NavItem itemId={2} to=\"#auth\">\n {translation.nav.authentication}\n </NavItem>\n <NavItem itemId={3} to=\"#network\">\n {translation.nav.networkServices}\n </NavItem>\n <NavItem itemId={4} to=\"#server\">\n {translation.nav.server}\n </NavItem>\n </NavList>\n </Nav>\n );\n\n const sidebar = (\n <PageSidebar>\n <PageSidebarBody>{pageNav}</PageSidebarBody>\n </PageSidebar>\n );\n\n const [isDropdownOpen, setIsDropdownOpen] = useState<boolean>(false);\n const [isKebabDropdownOpen, setIsKebabDropdownOpen] = useState<boolean>(false);\n const [isFullKebabDropdownOpen, setIsFullKebabDropdownOpen] = useState<boolean>(false);\n\n const kebabDropdownItems = (\n <>\n <DropdownItem icon={<RhUiSettingsFillIcon />}>{translation.kebabDropdown.settings}</DropdownItem>\n <DropdownItem icon={<HelpIcon />}>{translation.kebabDropdown.help}</DropdownItem>\n </>\n );\n\n const userDropdownItems = (\n <>\n <DropdownItem key=\"group 2 profile\">{translation.userDropdown.myProfile}</DropdownItem>\n <DropdownItem key=\"group 2 user\">{translation.userDropdown.userManagement}</DropdownItem>\n <DropdownItem key=\"group 2 logout\">{translation.userDropdown.logout}</DropdownItem>\n </>\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 onFullKebabToggle = () => {\n setIsFullKebabDropdownOpen(!isFullKebabDropdownOpen);\n };\n\n const onFullKebabSelect = () => {\n setIsFullKebabDropdownOpen(false);\n };\n\n const masthead = (\n <Masthead>\n <MastheadMain>\n <MastheadToggle>\n <PageToggleButton isHamburgerButton aria-label={translation.mastheadToggleAriaLabel} />\n </MastheadToggle>\n <MastheadBrand>\n <MastheadLogo dir=\"ltr\">\n <Brand src={pfLogo} alt=\"PatternFly\" heights={{ default: '36px' }} />\n {translation.brandLanguage && <span className=\"brand-language\">{translation.brandLanguage}</span>}\n </MastheadLogo>\n </MastheadBrand>\n </MastheadMain>\n <MastheadContent>\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 <ToolbarGroup variant=\"action-group-plain\" visibility={{ default: 'hidden', lg: 'visible' }}>\n <ToolbarItem>\n <Button aria-label={translation.kebabDropdown.settings} isSettings variant=\"plain\" />\n </ToolbarItem>\n <ToolbarItem>\n <Button\n aria-label={translation.kebabDropdown.help}\n variant={ButtonVariant.plain}\n icon={<RhUiQuestionMarkCircleFillIcon />}\n />\n </ToolbarItem>\n </ToolbarGroup>\n <ToolbarItem visibility={{ default: 'hidden', md: 'visible', lg: 'hidden' }}>\n <Dropdown\n isOpen={isKebabDropdownOpen}\n onSelect={onKebabDropdownSelect}\n onOpenChange={setIsKebabDropdownOpen}\n popperProps={{ position: 'right' }}\n toggle={(toggleRef) => (\n <MenuToggle\n ref={toggleRef}\n isExpanded={isKebabDropdownOpen}\n onClick={onKebabDropdownToggle}\n variant=\"plain\"\n aria-label={translation.kebabDropdown.settingsAndHelp}\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={onFullKebabSelect}\n onOpenChange={setIsFullKebabDropdownOpen}\n popperProps={{ position: 'right' }}\n toggle={(toggleRef) => (\n <MenuToggle\n ref={toggleRef}\n isExpanded={isFullKebabDropdownOpen}\n onClick={onFullKebabToggle}\n variant=\"plain\"\n aria-label={translation.kebabAndUserDropdown.toolbarMenuAriaLabel}\n icon={<RhUiEllipsisVerticalFillIcon />}\n />\n )}\n >\n <DropdownGroup key=\"group 2\" aria-label={translation.kebabAndUserDropdown.groupAriaLabel}>\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={setIsDropdownOpen}\n popperProps={{ position: 'right' }}\n toggle={(toggleRef) => (\n <MenuToggle\n ref={toggleRef}\n isExpanded={isDropdownOpen}\n onClick={onDropdownToggle}\n icon={<Avatar src={imgAvatar} alt=\"\" size=\"sm\" />}\n >\n {translation.username}\n </MenuToggle>\n )}\n >\n <DropdownList>{userDropdownItems}</DropdownList>\n </Dropdown>\n </ToolbarItem>\n </ToolbarContent>\n </Toolbar>\n </MastheadContent>\n </Masthead>\n );\n\n const breadcrumbItemsLength = Object.keys(breadcrumbItems).length;\n\n return (\n <Fragment>\n <Page sidebar={sidebar} masthead={masthead} isManagedSidebar>\n <PageBreadcrumb>\n <Breadcrumb aria-label={translation.breadcrumbs.ariaLabel || undefined}>\n {Object.keys(breadcrumbItems).map((key: string, idx: number, arr: string[]) => (\n <BreadcrumbItem key={idx} isActive={arr.length - 1 === idx} to={`${breadcrumbItems[key].url}`}>\n {translation.breadcrumbs[key]}\n {breadcrumbItemsLength}\n </BreadcrumbItem>\n ))}\n </Breadcrumb>\n </PageBreadcrumb>\n <PageSection variant=\"light\" aria-labelledby=\"main-title\">\n <Content>\n <h1 id=\"main-title\">{translation.title}</h1>\n <p>{translation.body}</p>\n </Content>\n </PageSection>\n <PageSection>\n {toolbarItems}\n <Table variant=\"compact\" aria-label={translation.table.ariaLabel}>\n <Thead>\n <Tr>\n {columns.map((column, columnIndex) => (\n <Th key={columnIndex}>{column}</Th>\n ))}\n </Tr>\n </Thead>\n <Tbody>\n {paginatedRows.map((row: Row, rowIndex: number) => (\n <Tr key={rowIndex}>\n <>\n {Object.entries(row).map(([key, value]) => {\n if (key === 'status') {\n return (\n <Td key={key} width={15} dataLabel=\"Status\">\n {renderLabel(value)}\n </Td>\n );\n } else if (key === 'url') {\n return (\n // Passing dir=\"rtl\" forces truncation at the start of the URL,\n // resulting in the unique portion being visible regardless of language\n <Td key={key} dataLabel=\"URL\" width={15}>\n <a href=\"#\">\n <Truncate content={row.url} position={isDirRTL ? 'end' : 'start'} />\n </a>\n </Td>\n );\n } else {\n return (\n <Td key={key} dataLabel={key === 'lastModified' ? 'Last modified' : capitalize(key)}>\n {value}\n </Td>\n );\n }\n })}\n </>\n </Tr>\n ))}\n </Tbody>\n </Table>\n {renderPagination(PaginationVariant.bottom)}\n </PageSection>\n </Page>\n </Fragment>\n );\n};\n","title":"Paginated table","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
+ <p {...{"className":"pf-v6-c-content--p pf-m-editorial ws-p "}}>
73
+ {`This demonstrates how the UI adapts to the writing mode of the page.`}
74
+ </p>
75
+ {React.createElement(pageData.examples["Paginated table"])}
76
+ </React.Fragment>
77
+ );
78
+ Component.displayName = 'PatternsRightToLeftReactDemosDocs';
79
+ Component.pageData = pageData;
80
+
81
+ export default Component;