@patternfly/quickstarts 1.3.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -27,9 +27,26 @@ import '@patternfly/react-core/dist/styles/base.css';
27
27
  import '@patternfly/quickstarts/dist/quickstarts.min.css';
28
28
  ```
29
29
 
30
+ ### Stylesheets if you use an older version of PatternFly
31
+ If you use an older version of @patternfly/react-core (older than "4.115.2"), and you can't upgrade yet, you can pull in the necessary PatternFly styles that @patternfly/quickstarts depends upon.
32
+
33
+ Ideally @patternfly/quickstarts will use the consumer provided PatternFly styles, only use these stylesheets if really needed.
34
+
35
+ `quickstarts-standalone.min.css` nests the css classes within a **.pfext-quick-start__base** parent, so that they have higher specificity. `patternfly-global.css` includes component styles that we cannot nest with more specificiy (for example Drawer since it can include consumer components that depend on an older PF version).
36
+
37
+ > Note: Only use these stylesheets if necessary!
38
+ ```js
39
+ // import base from PatternFly to get the font
40
+ import '@patternfly/react-core/dist/styles/base.css';
41
+ // some global styles and variables that quickstarts uses (Drawer, Popover, Modal, Backdrop, Bullseye)
42
+ import '@patternfly/quickstarts/dist/patternfly-global.css';
43
+ // PF and quickstarts styles nested within .pfext-quick-start__base
44
+ import '@patternfly/quickstarts/dist/quickstarts-standalone.min.css';
45
+ ```
46
+
30
47
  ## Usage example
31
48
 
32
- Note: You can also view this example on [codesandbox](https://codesandbox.io/s/patternflyquickstarts-1386f?file=/src/App.js) and [stackblitz](https://stackblitz.com/edit/react-ts-wcc244?file=Main.jsx)!
49
+ Note: You can also view this example on [codesandbox](https://codesandbox.io/s/patternfly-quickstarts-finished-cnv53)!
33
50
 
34
51
  ```js
35
52
  import "./styles.css";
@@ -93,7 +110,10 @@ const App = () => {
93
110
  allQuickStartStates,
94
111
  setActiveQuickStartID,
95
112
  setAllQuickStartStates,
113
+ // Set to true to opt-out of default hidden card footers
96
114
  showCardFooters: false,
115
+ // Set to true to opt-out of default drawer header colors of blue with white text
116
+ useLegacyHeaderColors: false,
97
117
  loading,
98
118
  useQueryParams: withQueryParams,
99
119
  };
@@ -140,6 +160,10 @@ const SomeNestedComponent = () => {
140
160
  export default App;
141
161
  ```
142
162
 
163
+ ## Design update, option to opt-out of new drawer header coloring
164
+
165
+ See above usage of `useLegacyHeaderColors` boolean to opt-out of update. Should only be used if new color scheme clashes with the usage context.
166
+
143
167
  ## Quick starts format
144
168
 
145
169
  Quick starts are parsed as markdown. To write your own quick start, if you use Typescript you can [check out the type definition here](https://github.com/patternfly/patternfly-quickstarts/blob/d52b194119f1ff16e69bf589d49a14931a19ac4b/packages/module/src/utils/quick-start-types.ts#L6).
@@ -204,4 +228,26 @@ You can have inline or block copyable text.
204
228
  ```{{copy}}
205
229
  ```
206
230
 
207
- ####
231
+ ## Localization
232
+ We use English as the default language. You can override the default by providing your own key/value pairs to the `QuickStartContainer` or `QuickStartContextProvider` resourceBundle prop.
233
+
234
+ Example:
235
+ ```js
236
+ // load my own resource Czech translations resource bundle using i18next
237
+ const resourceBundle = i18n.getResourceBundle('cs', 'quickstart');
238
+ const resources = {
239
+ ...resourceBundle,
240
+ Start: "Let's go!",
241
+ Continue: 'Resume',
242
+ Restart: 'Start over',
243
+ };
244
+ return (
245
+ <QuickStartContainer resourceBundle={resources}>
246
+ </QuickStartContainer>
247
+ )
248
+ ```
249
+
250
+ Use this [file](https://github.com/patternfly/patternfly-quickstarts/blob/main/packages/module/src/locales/en/quickstart.json) as a base for your translations.
251
+ Each language is different, especially when it comes to plurals. Try [this utility](https://jsfiddle.net/6bpxsgd4) sourced from [i18next](https://www.i18next.com/translation-function/plurals#how-to-find-the-correct-plural-suffix) to determine the suffixes for the right plural format.
252
+
253
+ ####
@@ -14,6 +14,7 @@ export interface QuickStartContainerProps extends React.HTMLProps<HTMLDivElement
14
14
  onCloseInProgress?: any;
15
15
  onCloseNotInProgress?: any;
16
16
  showCardFooters?: boolean;
17
+ useLegacyHeaderColors?: boolean;
17
18
  resourceBundle?: any;
18
19
  language?: string;
19
20
  loading?: boolean;
@@ -9,6 +9,7 @@ declare type QuickStartPanelContentProps = {
9
9
  appendTo?: HTMLElement | (() => HTMLElement);
10
10
  isResizable?: boolean;
11
11
  showClose?: boolean;
12
+ headerVariant?: '' | 'blue-white';
12
13
  };
13
14
  declare const QuickStartPanelContent: React.FC<QuickStartPanelContentProps>;
14
15
  export default QuickStartPanelContent;
@@ -2,6 +2,7 @@ import * as React from 'react';
2
2
  import { QuickStartExternal } from '../utils/quick-start-types';
3
3
  declare type QuickStartTileFooterProps = {
4
4
  link: QuickStartExternal;
5
+ quickStartId?: string;
5
6
  };
6
7
  declare const QuickStartTileFooterExternal: React.FC<QuickStartTileFooterProps>;
7
8
  export default QuickStartTileFooterExternal;
@@ -6,6 +6,7 @@ declare type QuickStartTileHeaderProps = {
6
6
  duration: number;
7
7
  name: string;
8
8
  type?: QuickStartType;
9
+ quickStartId?: string;
9
10
  };
10
11
  declare const QuickStartTileHeader: React.FC<QuickStartTileHeaderProps>;
11
12
  export default QuickStartTileHeader;
@@ -1,9 +1,11 @@
1
1
  import * as React from 'react';
2
2
  import { QuickStartTask, QuickStartTaskStatus } from '../utils/quick-start-types';
3
+ import './QuickStartIntroduction.scss';
3
4
  declare type QuickStartIntroductionProps = {
4
5
  introduction: string;
5
6
  tasks: QuickStartTask[];
6
7
  allTaskStatuses: QuickStartTaskStatus[];
8
+ prerequisites?: string[];
7
9
  onTaskSelect: (selectedTaskNumber: number) => void;
8
10
  };
9
11
  declare const QuickStartIntroduction: React.FC<QuickStartIntroductionProps>;
package/dist/index.es.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import React__default, { createContext, useCallback, useEffect, useState } from 'react';
3
- import { Card, CardHeader, CardActions, CardTitle, CardBody, CardFooter, Modal as Modal$1, Tooltip, Popover, PopoverPosition, Button, Text, TextVariants, TextList, TextListItem, Flex, FlexItem, Title, Label, Gallery, GalleryItem, ToolbarItem, SearchInput, Select, SelectVariant, SelectOption, Toolbar, ToolbarContent, EmptyState, EmptyStateIcon, EmptyStateBody, EmptyStatePrimary, Divider, ModalVariant, WizardNavItem, List, Alert, Radio, DrawerPanelContent, DrawerHead, DrawerActions, DrawerCloseButton, DrawerPanelBody, Drawer, DrawerContent, DrawerContentBody } from '@patternfly/react-core';
3
+ import { Card, CardHeader, CardActions, CardTitle, CardBody, CardFooter, Modal as Modal$1, Tooltip, Popover, PopoverPosition, Button, Text, TextVariants, TextList, TextListItem, Flex, FlexItem, Title, Label, Gallery, GalleryItem, ToolbarItem, SearchInput, Select, SelectVariant, SelectOption, Toolbar, ToolbarContent, EmptyState, EmptyStateIcon, EmptyStateBody, EmptyStatePrimary, Divider, ModalVariant, WizardNavItem, List, ExpandableSection, ListItem, Alert, Radio, DrawerPanelContent, DrawerHead, DrawerActions, DrawerCloseButton, DrawerPanelBody, Drawer, DrawerContent, DrawerContentBody } from '@patternfly/react-core';
4
4
  import SearchIcon from '@patternfly/react-icons/dist/js/icons/search-icon';
5
5
  import { css } from '@patternfly/react-styles';
6
6
  import RocketIcon from '@patternfly/react-icons/dist/js/icons/rocket-icon';
@@ -139,6 +139,7 @@ var en = {
139
139
  "{{count, number}} item": "{{count, number}} item",
140
140
  "{{count, number}} item_plural": "{{count, number}} items",
141
141
  "Prerequisites ({{totalPrereqs}})": "Prerequisites ({{totalPrereqs}})",
142
+ "View Prerequisites ({{totalPrereqs}})": "View Prerequisites ({{totalPrereqs}})",
142
143
  Prerequisites: Prerequisites,
143
144
  "Show prerequisites": "Show prerequisites",
144
145
  Complete: Complete,
@@ -166,7 +167,8 @@ var en = {
166
167
  "Your progress will be saved.": "Your progress will be saved.",
167
168
  "Not available": "Not available",
168
169
  "Copy to clipboard": "Copy to clipboard",
169
- "Successfully copied to clipboard!": "Successfully copied to clipboard!"
170
+ "Successfully copied to clipboard!": "Successfully copied to clipboard!",
171
+ "Quick start • {{duration, number}} minutes": "Quick start • {{duration, number}} minutes"
170
172
  };
171
173
 
172
174
  /* eslint-disable */
@@ -576,6 +578,7 @@ const QuickStartContextDefaults = {
576
578
  },
577
579
  setFilter: () => { },
578
580
  footer: null,
581
+ useLegacyHeaderColors: false,
579
582
  markdown: null,
580
583
  loading: false,
581
584
  alwaysShowTaskReview: false,
@@ -594,7 +597,7 @@ const getResource = (resource, options, resourceBundle, lng) => {
594
597
  const useValuesForQuickStartContext = (value = {}) => {
595
598
  var _a, _b;
596
599
  const combinedValue = Object.assign(Object.assign({}, QuickStartContextDefaults), value);
597
- const { activeQuickStartID, setActiveQuickStartID, setAllQuickStartStates, useQueryParams, allQuickStartStates, allQuickStarts = [], footer, markdown, } = combinedValue;
600
+ const { activeQuickStartID, setActiveQuickStartID, setAllQuickStartStates, useQueryParams, allQuickStartStates, allQuickStarts = [], footer, useLegacyHeaderColors, markdown, } = combinedValue;
598
601
  const [quickStarts, setQuickStarts] = React__default.useState(combinedValue.allQuickStarts || []);
599
602
  const [resourceBundle, setResourceBundle] = React__default.useState(Object.assign(Object.assign({}, en), combinedValue.resourceBundle));
600
603
  const [language, setLanguage] = React__default.useState(combinedValue.language);
@@ -777,6 +780,7 @@ const useValuesForQuickStartContext = (value = {}) => {
777
780
  setQuickStartTaskStatus,
778
781
  getQuickStartForId,
779
782
  footer,
783
+ useLegacyHeaderColors,
780
784
  useQueryParams,
781
785
  markdown,
782
786
  resourceBundle,
@@ -962,7 +966,7 @@ const SimplePopper = ({ children }) => {
962
966
  }
963
967
  }, [destroy, isOpen]);
964
968
  return isOpen ? (React.createElement(Portal, null,
965
- React.createElement("div", { ref: nodeRefCallback, style: { zIndex: 9999, position: 'absolute', top: 0, left: 0 } }, children))) : null;
969
+ React.createElement("div", { ref: nodeRefCallback, style: { zIndex: 9999, position: 'absolute', top: 0, left: 0 }, className: "pfext-quick-start__base" }, children))) : null;
966
970
  };
967
971
 
968
972
  const isInViewport = (elementToCheck) => {
@@ -1205,7 +1209,7 @@ const CopyClipboard = ({ element, rootSelector, docContext, }) => {
1205
1209
  useEventListener(element, 'mouseleave', React.useCallback(() => {
1206
1210
  setShowSuccessContent(false);
1207
1211
  }, []));
1208
- return showSuccessContent ? (React.createElement(Tooltip, { key: "after-copy", isVisible: true, reference: () => element, content: getResource('Successfully copied to clipboard!') })) : (React.createElement(Tooltip, { key: "before-copy", reference: () => element, content: getResource('Copy to clipboard') }));
1212
+ return showSuccessContent ? (React.createElement(Tooltip, { key: "after-copy", isVisible: true, reference: () => element, content: getResource('Successfully copied to clipboard!'), className: "pfext-quick-start__base" })) : (React.createElement(Tooltip, { key: "before-copy", reference: () => element, content: getResource('Copy to clipboard'), className: "pfext-quick-start__base" }));
1209
1213
  };
1210
1214
  const MarkdownCopyClipboard = ({ docContext, rootSelector, }) => {
1211
1215
  const elements = docContext.querySelectorAll(`${rootSelector} [${MARKDOWN_COPY_BUTTON_ID}]`);
@@ -1530,10 +1534,11 @@ const QuickStartTileDescription = ({ description, prerequisites, }) => {
1530
1534
  React.createElement(Text, { component: TextVariants.h5, className: "pfext-quick-start-tile-prerequisites__text" },
1531
1535
  getResource('Prerequisites ({{totalPrereqs}})').replace('{{totalPrereqs}}', prereqs.length),
1532
1536
  ' '),
1533
- React.createElement(Popover, { "aria-label": getResource('Prerequisites'), headerContent: getResource('Prerequisites'), className: "pfext-page-layout__base", bodyContent: React.createElement(TextList, { "aria-label": getResource('Prerequisites'), className: "pfext-quick-start-tile-prerequisites-list" }, prereqs.map((prerequisite, index) => (
1534
- // eslint-disable-next-line react/no-array-index-key
1535
- React.createElement(TextListItem, { key: index },
1536
- React.createElement(QuickStartMarkdownView, { content: prerequisite }))))) },
1537
+ React.createElement(Popover, { "aria-label": getResource('Prerequisites'), headerContent: getResource('Prerequisites'), className: "pfext-quick-start__base", bodyContent: React.createElement("div", { className: "pfext-popover__base" },
1538
+ React.createElement(TextList, { "aria-label": getResource('Prerequisites'), className: "pfext-quick-start-tile-prerequisites-list" }, prereqs.map((prerequisite, index) => (
1539
+ // eslint-disable-next-line react/no-array-index-key
1540
+ React.createElement(TextListItem, { key: index },
1541
+ React.createElement(QuickStartMarkdownView, { content: prerequisite })))))) },
1537
1542
  React.createElement(Button, { variant: "link", isInline: true, className: "pfext-quick-start-tile-prerequisites__icon", "data-testid": "qs-card-prereqs", onClick: (e) => {
1538
1543
  e.preventDefault();
1539
1544
  e.stopPropagation();
@@ -1556,20 +1561,20 @@ const QuickStartTileFooter = ({ quickStartId, status, totalTasks, }) => {
1556
1561
  }, [quickStartId, restartQuickStart, totalTasks]);
1557
1562
  return (React.createElement(Flex, { justifyContent: { default: 'justifyContentSpaceBetween' } },
1558
1563
  status === QuickStartStatus.NOT_STARTED && (React.createElement(FlexItem, null,
1559
- React.createElement(Button, { onClick: start, variant: "link", isInline: true, "data-testid": "qs-card-notStarted-start" }, getResource('Start')))),
1564
+ React.createElement(Button, { onClick: start, variant: "link", isInline: true, "data-testid": "qs-card-notStarted-start", id: `${quickStartId}-start`, "aria-labelledby": `${quickStartId}-start ${quickStartId}` }, getResource('Start')))),
1560
1565
  status === QuickStartStatus.IN_PROGRESS && activeQuickStartID !== quickStartId && (React.createElement(FlexItem, null,
1561
- React.createElement(Button, { variant: "link", isInline: true, "data-testid": "qs-card-inProgress-resume" }, getResource('Continue')))),
1566
+ React.createElement(Button, { variant: "link", isInline: true, "data-testid": "qs-card-inProgress-resume", id: `${quickStartId}-continue`, "aria-labelledby": `${quickStartId}-continue ${quickStartId}` }, getResource('Continue')))),
1562
1567
  status === QuickStartStatus.COMPLETE && (React.createElement(FlexItem, null,
1563
- React.createElement(Button, { onClick: restart, variant: "link", isInline: true, "data-testid": "qs-card-complete-restart" }, getResource('Start')))),
1568
+ React.createElement(Button, { onClick: restart, variant: "link", isInline: true, "data-testid": "qs-card-complete-restart", id: `${quickStartId}-restart`, "aria-labelledby": `${quickStartId}-restart ${quickStartId}` }, getResource('Restart')))),
1564
1569
  status === QuickStartStatus.IN_PROGRESS && (React.createElement(FlexItem, null,
1565
- React.createElement(Button, { onClick: restart, variant: "link", isInline: true, "data-testid": "qs-card-inProgress-restart" }, getResource('Restart'))))));
1570
+ React.createElement(Button, { onClick: restart, variant: "link", isInline: true, "data-testid": "qs-card-inProgress-restart", id: `${quickStartId}-restart`, "aria-labelledby": `${quickStartId}-restart ${quickStartId}` }, getResource('Restart'))))));
1566
1571
  };
1567
1572
 
1568
- const QuickStartTileFooterExternal = ({ link }) => {
1573
+ const QuickStartTileFooterExternal = ({ link, quickStartId, }) => {
1569
1574
  const { href, text } = link;
1570
1575
  return (React.createElement(Flex, { justifyContent: { default: 'justifyContentSpaceBetween' } },
1571
1576
  React.createElement(FlexItem, null,
1572
- React.createElement(Button, { component: "a", href: href, target: "_blank", rel: "noopener noreferrer", variant: "link", "aria-label": `Open documentation in new window`, isInline: true, icon: React.createElement(ExternalLinkAltIcon, null), iconPosition: "right" }, text || href))));
1577
+ React.createElement(Button, { component: "a", href: href, target: "_blank", rel: "noopener noreferrer", variant: "link", "aria-label": `Open documentation in new window`, isInline: true, icon: React.createElement(ExternalLinkAltIcon, null), iconPosition: "right", id: quickStartId, "aria-labelledby": `${quickStartId}-external ${quickStartId}` }, text || href))));
1573
1578
  };
1574
1579
 
1575
1580
  const statusColorMap = {
@@ -1577,7 +1582,7 @@ const statusColorMap = {
1577
1582
  [QuickStartStatus.IN_PROGRESS]: 'purple',
1578
1583
  [QuickStartStatus.NOT_STARTED]: 'grey',
1579
1584
  };
1580
- const QuickStartTileHeader = ({ status, duration, name, type, }) => {
1585
+ const QuickStartTileHeader = ({ status, duration, name, type, quickStartId, }) => {
1581
1586
  const { getResource } = React.useContext(QuickStartContext);
1582
1587
  const statusLocaleMap = {
1583
1588
  [QuickStartStatus.COMPLETE]: getResource('Complete'),
@@ -1585,7 +1590,7 @@ const QuickStartTileHeader = ({ status, duration, name, type, }) => {
1585
1590
  [QuickStartStatus.NOT_STARTED]: getResource('Not started'),
1586
1591
  };
1587
1592
  return (React.createElement("div", { className: "pfext-quick-start-tile-header" },
1588
- React.createElement(Title, { headingLevel: "h3", "data-test": "title" }, name),
1593
+ React.createElement(Title, { headingLevel: "h3", "data-test": "title", id: quickStartId }, name),
1589
1594
  React.createElement("div", { className: "pfext-quick-start-tile-header__status" },
1590
1595
  type && (React.createElement(Label, { className: "pfext-quick-start-tile-header--margin", color: type.color }, type.text)),
1591
1596
  duration && (React.createElement(Label, { variant: "outline", "data-test": "duration", icon: React.createElement(OutlinedClockIcon, null), className: "pfext-quick-start-tile-header--margin" }, getResource('{{duration, number}} minutes', duration).replace('{{duration, number}}', duration))),
@@ -1603,7 +1608,7 @@ const QuickStartTile = ({ quickStart, status, isActive, onClick = () => { }, })
1603
1608
  else {
1604
1609
  quickStartIcon = (React.createElement(FallbackImg, { className: "pfext-catalog-item-icon__img--large", src: icon, alt: "", fallback: React.createElement(RocketIcon, null) }));
1605
1610
  }
1606
- const footerComponent = footer && footer.show === false ? null : link ? (React.createElement(QuickStartTileFooterExternal, { link: link })) : (React.createElement(QuickStartTileFooter, { quickStartId: id, status: status, totalTasks: tasks === null || tasks === void 0 ? void 0 : tasks.length }));
1611
+ const footerComponent = footer && footer.show === false ? null : link ? (React.createElement(QuickStartTileFooterExternal, { link: link, quickStartId: id })) : (React.createElement(QuickStartTileFooter, { quickStartId: id, status: status, totalTasks: tasks === null || tasks === void 0 ? void 0 : tasks.length }));
1607
1612
  const handleClick = (e) => {
1608
1613
  var _a;
1609
1614
  if ((_a = ref.current) === null || _a === void 0 ? void 0 : _a.contains(e.target)) {
@@ -1623,7 +1628,7 @@ const QuickStartTile = ({ quickStart, status, isActive, onClick = () => { }, })
1623
1628
  // @ts-ignore
1624
1629
  component: "div", style: {
1625
1630
  cursor: 'pointer',
1626
- }, icon: quickStartIcon, className: "pfext-quick-start-tile", "data-testid": `qs-card-${camelize(displayName)}`, featured: isActive, title: React.createElement(QuickStartTileHeader, { name: displayName, status: status, duration: durationMinutes, type: type }), onClick: handleClick, "data-test": `tile ${id}`, description: React.createElement(QuickStartTileDescription, { description: description, prerequisites: prerequisites }), footer: footerComponent })));
1631
+ }, icon: quickStartIcon, className: "pfext-quick-start-tile", "data-testid": `qs-card-${camelize(displayName)}`, featured: isActive, title: React.createElement(QuickStartTileHeader, { name: displayName, status: status, duration: durationMinutes, type: type, quickStartId: id }), onClick: handleClick, "data-test": `tile ${id}`, description: React.createElement(QuickStartTileDescription, { description: description, prerequisites: prerequisites }), footer: footerComponent })));
1627
1632
  };
1628
1633
 
1629
1634
  const QuickStartCatalog = ({ quickStarts }) => {
@@ -1816,7 +1821,7 @@ const QuickStartCatalogPage = ({ quickStarts, showFilter, sortFnc = (q1, q2) =>
1816
1821
  if (!allQuickStarts || allQuickStarts.length === 0) {
1817
1822
  return React.createElement(EmptyBox, { label: getResource('Quick Starts') });
1818
1823
  }
1819
- return (React.createElement(React.Fragment, null,
1824
+ return (React.createElement("div", { className: "pfext-quick-start__base" },
1820
1825
  showTitle && (React.createElement("div", { className: "pfext-page-layout__header" },
1821
1826
  React.createElement(Text, { component: "h1", className: "pfext-page-layout__title", "data-test": "page-title" }, title || getResource('Quick Starts')),
1822
1827
  hint && React.createElement("div", { className: "pfext-page-layout__hint" }, hint))),
@@ -1837,31 +1842,31 @@ const QuickStartCatalogToolbar = ({ children }) => (React.createElement(Toolbar,
1837
1842
 
1838
1843
  const QuickStartCloseModal = ({ isOpen, onConfirm, onCancel, }) => {
1839
1844
  const { getResource } = React.useContext(QuickStartContext);
1840
- return (React.createElement(Modal, { className: "pfext-quick-start-drawer__modal", isOpen: isOpen, variant: ModalVariant.small, showClose: false, "data-test": "leave-quickstart", title: getResource('Leave quick start?'), footer: React.createElement(Flex, null,
1845
+ return (React.createElement(Modal, { className: "pfext-quick-start-drawer__modal pfext-quick-start__base", isOpen: isOpen, variant: ModalVariant.small, showClose: false, "data-test": "leave-quickstart", title: getResource('Leave quick start?'), footer: React.createElement(Flex, null,
1841
1846
  React.createElement(FlexItem, { align: { default: 'alignRight' } },
1842
1847
  React.createElement(Button, { variant: "secondary", "data-test": "cancel button", onClick: onCancel }, getResource('Cancel'))),
1843
1848
  React.createElement(FlexItem, null,
1844
1849
  React.createElement(Button, { variant: "primary", "data-test": "leave button", onClick: onConfirm }, getResource('Leave')))), isFullScreen: true }, getResource('Your progress will be saved.')));
1845
1850
  };
1846
1851
 
1847
- const TaskIcon = ({ taskIndex, taskStatus, isActiveTask }) => {
1852
+ const TaskIcon = ({ taskIndex, taskStatus }) => {
1848
1853
  const { getResource } = React.useContext(QuickStartContext);
1849
- const stepNumberIcon = (React.createElement("span", { className: "pfext-icon-and-text__icon pfext-quick-start-task-header__task-icon-init" }, getResource('{{taskIndex, number}}', taskIndex).replace('{{taskIndex, number}}', taskIndex)));
1850
- // When the task has been visited but is the active task, show number icon.
1851
- if (taskStatus === QuickStartTaskStatus.VISITED && isActiveTask) {
1852
- return stepNumberIcon;
1854
+ const success = taskStatus === QuickStartTaskStatus.SUCCESS;
1855
+ const failed = taskStatus === QuickStartTaskStatus.FAILED;
1856
+ const classNames = css('pfext-icon-and-text__icon', {
1857
+ 'pfext-quick-start-task-header__task-icon-init': !failed && !success,
1858
+ });
1859
+ let content;
1860
+ if (success) {
1861
+ content = (React.createElement(CheckCircleIcon, { size: "md", className: "pfext-quick-start-task-header__task-icon-success" }));
1853
1862
  }
1854
- switch (taskStatus) {
1855
- case QuickStartTaskStatus.SUCCESS:
1856
- return (React.createElement("span", { className: "pfext-icon-and-text__icon" },
1857
- React.createElement(CheckCircleIcon, { size: "md", className: "pfext-quick-start-task-header__task-icon-success" })));
1858
- case QuickStartTaskStatus.FAILED:
1859
- case QuickStartTaskStatus.VISITED:
1860
- return (React.createElement("span", { className: "pfext-icon-and-text__icon" },
1861
- React.createElement(ExclamationCircleIcon, { size: "md", className: "pfext-quick-start-task-header__task-icon-failed" })));
1862
- default:
1863
- return stepNumberIcon;
1863
+ else if (failed) {
1864
+ content = (React.createElement(ExclamationCircleIcon, { size: "md", className: "pfext-quick-start-task-header__task-icon-failed" }));
1864
1865
  }
1866
+ else {
1867
+ content = getResource('{{taskIndex, number}}', taskIndex).replace('{{taskIndex, number}}', taskIndex);
1868
+ }
1869
+ return React.createElement("span", { className: classNames }, content);
1865
1870
  };
1866
1871
  const QuickStartTaskHeader = ({ title, taskIndex, subtitle, taskStatus, size, isActiveTask, onTaskSelect, }) => {
1867
1872
  const classNames = css('pfext-quick-start-task-header__title', {
@@ -1870,16 +1875,16 @@ const QuickStartTaskHeader = ({ title, taskIndex, subtitle, taskStatus, size, is
1870
1875
  });
1871
1876
  const notCompleted = taskStatus === QuickStartTaskStatus.VISITED;
1872
1877
  const skippedReviewOrFailed = taskStatus === QuickStartTaskStatus.REVIEW || taskStatus === QuickStartTaskStatus.FAILED;
1873
- const tryAgain = !isActiveTask && (skippedReviewOrFailed || notCompleted) && (React.createElement(FlexItem, null,
1874
- React.createElement(Title, { headingLevel: "h4", className: "pfext-quick-start-task-header__tryagain" }, "Try the steps again.")));
1875
- const content = (React.createElement(Flex, { className: "pfext-quick-start-task-header", direction: { default: 'column' }, spaceItems: { default: 'spaceItemsXs' } },
1876
- React.createElement(FlexItem, null,
1877
- React.createElement(Title, { headingLevel: "h3", size: size, className: classNames },
1878
- React.createElement(TaskIcon, { taskIndex: taskIndex, taskStatus: taskStatus, isActiveTask: true }),
1879
- React.createElement("span", { dangerouslySetInnerHTML: { __html: removeParagraphWrap(markdownConvert(title)) } }),
1880
- isActiveTask && subtitle && (React.createElement(React.Fragment, null,
1881
- ' ',
1882
- React.createElement("span", { className: "pfext-quick-start-task-header__subtitle", "data-test-id": "quick-start-task-subtitle" }, subtitle))))),
1878
+ const tryAgain = !isActiveTask && (skippedReviewOrFailed || notCompleted) && (React.createElement(React.Fragment, null,
1879
+ React.createElement("div", null),
1880
+ React.createElement("div", { className: "pfext-quick-start-task-header__tryagain" }, "Try the steps again.")));
1881
+ const content = (React.createElement("div", { className: "pfext-quick-start-task-header" },
1882
+ React.createElement(TaskIcon, { taskIndex: taskIndex, taskStatus: taskStatus }),
1883
+ React.createElement(Title, { headingLevel: "h3", size: size, className: classNames },
1884
+ React.createElement("span", { dangerouslySetInnerHTML: { __html: removeParagraphWrap(markdownConvert(title)) } }),
1885
+ isActiveTask && subtitle && (React.createElement("span", { className: "pfext-quick-start-task-header__subtitle", "data-test-id": "quick-start-task-subtitle" },
1886
+ ' ',
1887
+ subtitle))),
1883
1888
  tryAgain));
1884
1889
  return (React.createElement(WizardNavItem, { content: content, step: taskIndex, onNavItemClick: () => onTaskSelect(taskIndex - 1), navItemComponent: "button", isCurrent: isActiveTask }));
1885
1890
  };
@@ -1908,10 +1913,18 @@ const QuickStartConclusion = ({ tasks, conclusion, allTaskStatuses, nextQuickSta
1908
1913
  })));
1909
1914
  };
1910
1915
 
1911
- const QuickStartIntroduction = ({ tasks, introduction, allTaskStatuses, onTaskSelect, }) => {
1916
+ const QuickStartIntroduction = ({ tasks, introduction, allTaskStatuses, prerequisites, onTaskSelect, }) => {
1912
1917
  const { getResource } = React.useContext(QuickStartContext);
1918
+ const prereqs = prerequisites === null || prerequisites === void 0 ? void 0 : prerequisites.filter((p) => p);
1919
+ const [isPrereqsExpanded, setIsPrereqsExpanded] = React.useState(false);
1920
+ const prereqList = (prereqs === null || prereqs === void 0 ? void 0 : prereqs.length) > 0 && (React.createElement(ExpandableSection, { toggleText: getResource('View Prerequisites ({{totalPrereqs}})').replace('{{totalPrereqs}}', prereqs.length), onToggle: () => setIsPrereqsExpanded(!isPrereqsExpanded), className: "pfext-quick-start-intro__prereq" },
1921
+ React.createElement(List, { className: "pfext-quick-start-intro__prereq-list" }, prereqs.map((pr) => {
1922
+ return (React.createElement(ListItem, { key: pr, className: "pfext-quick-start-intro__prereq-list__item" },
1923
+ React.createElement("span", { className: "pfext-quick-start-intro__prereq-list__item-content" }, pr)));
1924
+ }))));
1913
1925
  return (React.createElement(React.Fragment, null,
1914
1926
  React.createElement(QuickStartMarkdownView, { content: introduction }),
1927
+ prereqList,
1915
1928
  React.createElement("p", { style: { marginBottom: 'var(--pf-global--spacer--md)' } },
1916
1929
  getResource('In this quick start, you will complete {{count, number}} task', tasks.length).replace('{{count, number}}', tasks.length),
1917
1930
  ":"),
@@ -1936,7 +1949,7 @@ const QuickStartTaskReview = ({ review, taskStatus, onTaskReview, }) => {
1936
1949
  'pfext-quick-start-task-review--failed': taskStatus === QuickStartTaskStatus.FAILED,
1937
1950
  });
1938
1951
  const title = React.createElement("span", { className: alertClassNames }, getResource('Check your work'));
1939
- return (React.createElement(Alert, { variant: getAlertVariant(taskStatus), title: title, isInline: true },
1952
+ return (React.createElement(Alert, { className: "pfext-quick-start-task-review-alert", variant: getAlertVariant(taskStatus), title: title, isInline: true },
1940
1953
  React.createElement(QuickStartMarkdownView, { content: instructions }),
1941
1954
  React.createElement("span", { className: "pfext-quick-start-task-review__actions" },
1942
1955
  React.createElement(Radio, { id: "review-success", name: "review-success", "data-testid": "qs-drawer-check-yes", label: getResource('Yes'), className: "pfext-quick-start-task-review__radio", isChecked: taskStatus === QuickStartTaskStatus.SUCCESS, onChange: () => onTaskReview(QuickStartTaskStatus.SUCCESS) }),
@@ -1958,17 +1971,17 @@ const QuickStartTasks = ({ tasks, taskNumber, allTaskStatuses, onTaskReview, onT
1958
1971
  React.createElement(QuickStartTaskHeader, { taskIndex: index + 1, title: title, size: "md", subtitle: getResource('{{index, number}} of {{tasks, number}}')
1959
1972
  .replace('{{index, number}}', index + 1)
1960
1973
  .replace('{{tasks, number}}', tasks.length), taskStatus: taskStatus, isActiveTask: isActiveTask, onTaskSelect: onTaskSelect }),
1961
- isActiveTask && (React.createElement("div", { style: { marginBottom: 'var(--pf-global--spacer--md)' } },
1974
+ isActiveTask && (React.createElement("div", { className: "pfext-quick-start-task__content" },
1962
1975
  React.createElement(QuickStartMarkdownView, { content: description }),
1963
1976
  shouldShowTaskReview && (React.createElement(QuickStartTaskReview, { review: review, taskStatus: taskStatus, onTaskReview: onTaskReview }))))));
1964
1977
  })));
1965
1978
  };
1966
1979
 
1967
1980
  const QuickStartContent = React.forwardRef(({ quickStart, nextQuickStarts = [], taskNumber, allTaskStatuses, onTaskSelect, onTaskReview, onQuickStartChange, }, ref) => {
1968
- const { spec: { introduction, tasks, conclusion }, } = quickStart;
1981
+ const { spec: { introduction, tasks, conclusion, prerequisites }, } = quickStart;
1969
1982
  const totalTasks = tasks.length;
1970
1983
  return (React.createElement("div", { className: "pfext-quick-start-content", ref: ref },
1971
- taskNumber === -1 && (React.createElement(QuickStartIntroduction, { tasks: tasks, allTaskStatuses: allTaskStatuses, introduction: introduction, onTaskSelect: onTaskSelect })),
1984
+ taskNumber === -1 && (React.createElement(QuickStartIntroduction, { tasks: tasks, allTaskStatuses: allTaskStatuses, introduction: introduction, prerequisites: prerequisites, onTaskSelect: onTaskSelect })),
1972
1985
  taskNumber > -1 && taskNumber < totalTasks && (React.createElement(QuickStartTasks, { tasks: tasks, taskNumber: taskNumber, allTaskStatuses: allTaskStatuses, onTaskReview: onTaskReview, onTaskSelect: onTaskSelect })),
1973
1986
  taskNumber === totalTasks && (React.createElement(QuickStartConclusion, { tasks: tasks, conclusion: conclusion, allTaskStatuses: allTaskStatuses, nextQuickStarts: nextQuickStarts, onQuickStartChange: onQuickStartChange, onTaskSelect: onTaskSelect }))));
1974
1987
  });
@@ -2070,7 +2083,7 @@ const useScrollTopOnTaskNumberChange = (node, taskNumber) => {
2070
2083
  }, [taskNumber, node]);
2071
2084
  };
2072
2085
  const QuickStartPanelContent = (_a) => {
2073
- var { quickStarts = [], handleClose, activeQuickStartID, appendTo, isResizable = true, showClose = true } = _a, props = __rest(_a, ["quickStarts", "handleClose", "activeQuickStartID", "appendTo", "isResizable", "showClose"]);
2086
+ var { quickStarts = [], handleClose, activeQuickStartID, appendTo, isResizable = true, showClose = true, headerVariant = '' } = _a, props = __rest(_a, ["quickStarts", "handleClose", "activeQuickStartID", "appendTo", "isResizable", "showClose", "headerVariant"]);
2074
2087
  const { getResource } = React.useContext(QuickStartContext);
2075
2088
  const [contentRef, setContentRef] = React.useState();
2076
2089
  const shadows = useScrollShadows(contentRef);
@@ -2081,6 +2094,7 @@ const QuickStartPanelContent = (_a) => {
2081
2094
  const nextQuickStarts = quickStarts.filter((qs) => { var _a; return (_a = quickStart === null || quickStart === void 0 ? void 0 : quickStart.spec.nextQuickStart) === null || _a === void 0 ? void 0 : _a.includes(qs.metadata.name); });
2082
2095
  const headerClasses = css('pfext-quick-start-panel-content__header', {
2083
2096
  'pfext-quick-start-panel-content__header__shadow': shadows === Shadows.top || shadows === Shadows.both,
2097
+ 'pfext-quick-start-panel-content__header--blue-white': headerVariant === 'blue-white',
2084
2098
  });
2085
2099
  const footerClass = css({
2086
2100
  'pfext-quick-start-panel-content__footer__shadow': shadows === Shadows.bottom || shadows === Shadows.both,
@@ -2095,16 +2109,16 @@ const QuickStartPanelContent = (_a) => {
2095
2109
  }
2096
2110
  return Number.parseInt(taskNumber, 10) + 1;
2097
2111
  };
2098
- const content = quickStart ? (React.createElement(DrawerPanelContent, Object.assign({ isResizable: isResizable, className: "pfext-quick-start-panel-content", "data-testid": `qs-drawer-${camelize(quickStart.spec.displayName)}`, "data-qs": `qs-step-${getStep()}`, "data-test": "quickstart drawer" }, props),
2112
+ const content = quickStart ? (React.createElement(DrawerPanelContent, Object.assign({ isResizable: isResizable, className: "pfext-quick-start__base", "data-testid": `qs-drawer-${camelize(quickStart.spec.displayName)}`, "data-qs": `qs-step-${getStep()}`, "data-test": "quickstart drawer" }, props),
2099
2113
  React.createElement("div", { className: headerClasses },
2100
2114
  React.createElement(DrawerHead, null,
2101
2115
  React.createElement("div", { className: "pfext-quick-start-panel-content__title" },
2102
- React.createElement(Title, { headingLevel: "h1", size: "xl", style: { marginRight: 'var(--pf-global--spacer--md)' } }, quickStart === null || quickStart === void 0 ? void 0 :
2116
+ React.createElement(Title, { headingLevel: "h1", size: "xl", className: "pfext-quick-start-panel-content__name", style: { marginRight: 'var(--pf-global--spacer--md)' } }, quickStart === null || quickStart === void 0 ? void 0 :
2103
2117
  quickStart.spec.displayName,
2104
2118
  ' ',
2105
- React.createElement("small", { className: "pfext-quick-start-panel-content__duration text-secondary" }, getResource('{{duration, number}} minutes', quickStart === null || quickStart === void 0 ? void 0 : quickStart.spec.durationMinutes).replace('{{duration, number}}', quickStart === null || quickStart === void 0 ? void 0 : quickStart.spec.durationMinutes)))),
2119
+ React.createElement("small", { className: "pfext-quick-start-panel-content__duration" }, getResource('Quick start • {{duration, number}} minutes', quickStart === null || quickStart === void 0 ? void 0 : quickStart.spec.durationMinutes).replace('{{duration, number}}', quickStart === null || quickStart === void 0 ? void 0 : quickStart.spec.durationMinutes)))),
2106
2120
  showClose && (React.createElement(DrawerActions, null,
2107
- React.createElement(DrawerCloseButton, { onClick: handleClose, "data-testid": "qs-drawer-close" }))))),
2121
+ React.createElement(DrawerCloseButton, { onClick: handleClose, className: "pfext-quick-start-panel-content__close-button", "data-testid": "qs-drawer-close" }))))),
2108
2122
  React.createElement(DrawerPanelBody, { hasNoPadding: true, className: "pfext-quick-start-panel-content__body", "data-test": "content" },
2109
2123
  React.createElement(QuickStartController, { quickStart: quickStart, nextQuickStarts: nextQuickStarts, footerClass: footerClass, contentRef: setContentRef })))) : null;
2110
2124
  if (appendTo) {
@@ -2114,13 +2128,14 @@ const QuickStartPanelContent = (_a) => {
2114
2128
  };
2115
2129
 
2116
2130
  const QuickStartContainer = (_a) => {
2117
- var { quickStarts, children, activeQuickStartID, allQuickStartStates, setActiveQuickStartID, setAllQuickStartStates, appendTo, fullWidth, onCloseInProgress, onCloseNotInProgress, resourceBundle, showCardFooters, language, loading = false, useQueryParams = true, markdown, contextProps, alwaysShowTaskReview = false } = _a, props = __rest(_a, ["quickStarts", "children", "activeQuickStartID", "allQuickStartStates", "setActiveQuickStartID", "setAllQuickStartStates", "appendTo", "fullWidth", "onCloseInProgress", "onCloseNotInProgress", "resourceBundle", "showCardFooters", "language", "loading", "useQueryParams", "markdown", "contextProps", "alwaysShowTaskReview"]);
2131
+ var { quickStarts, children, activeQuickStartID, allQuickStartStates, setActiveQuickStartID, setAllQuickStartStates, appendTo, fullWidth, onCloseInProgress, onCloseNotInProgress, resourceBundle, showCardFooters, useLegacyHeaderColors, language, loading = false, useQueryParams = true, markdown, contextProps, alwaysShowTaskReview = false } = _a, props = __rest(_a, ["quickStarts", "children", "activeQuickStartID", "allQuickStartStates", "setActiveQuickStartID", "setAllQuickStartStates", "appendTo", "fullWidth", "onCloseInProgress", "onCloseNotInProgress", "resourceBundle", "showCardFooters", "useLegacyHeaderColors", "language", "loading", "useQueryParams", "markdown", "contextProps", "alwaysShowTaskReview"]);
2118
2132
  const valuesForQuickstartContext = useValuesForQuickStartContext(Object.assign({ allQuickStarts: quickStarts, activeQuickStartID,
2119
2133
  setActiveQuickStartID,
2120
2134
  allQuickStartStates,
2121
2135
  setAllQuickStartStates, footer: {
2122
2136
  show: showCardFooters,
2123
- }, language, resourceBundle: Object.assign({}, resourceBundle), loading,
2137
+ }, useLegacyHeaderColors,
2138
+ language, resourceBundle: Object.assign({}, resourceBundle), loading,
2124
2139
  useQueryParams,
2125
2140
  markdown,
2126
2141
  alwaysShowTaskReview }, contextProps));
@@ -2144,7 +2159,7 @@ const QuickStartContainer = (_a) => {
2144
2159
  };
2145
2160
  const QuickStartDrawer = (_a) => {
2146
2161
  var { quickStarts = [], children, appendTo, fullWidth, onCloseInProgress, onCloseNotInProgress } = _a, props = __rest(_a, ["quickStarts", "children", "appendTo", "fullWidth", "onCloseInProgress", "onCloseNotInProgress"]);
2147
- const { activeQuickStartID, setActiveQuickStart, allQuickStarts = [], activeQuickStartState, allQuickStartStates, setAllQuickStartStates, } = React.useContext(QuickStartContext);
2162
+ const { activeQuickStartID, setActiveQuickStart, allQuickStarts = [], activeQuickStartState, allQuickStartStates, setAllQuickStartStates, useLegacyHeaderColors, } = React.useContext(QuickStartContext);
2148
2163
  const combinedQuickStarts = allQuickStarts.concat(quickStarts);
2149
2164
  React.useEffect(() => {
2150
2165
  const params = new URLSearchParams(window.location.search);
@@ -2203,7 +2218,7 @@ const QuickStartDrawer = (_a) => {
2203
2218
  },
2204
2219
  }
2205
2220
  : {};
2206
- const panelContent = (React.createElement(QuickStartPanelContent, Object.assign({ quickStarts: combinedQuickStarts, handleClose: handleClose, activeQuickStartID: activeQuickStartID, appendTo: appendTo, isResizable: !fullWidth }, fullWidthPanelStyle)));
2221
+ const panelContent = (React.createElement(QuickStartPanelContent, Object.assign({ quickStarts: combinedQuickStarts, handleClose: handleClose, activeQuickStartID: activeQuickStartID, appendTo: appendTo, isResizable: !fullWidth, headerVariant: useLegacyHeaderColors ? '' : 'blue-white' }, fullWidthPanelStyle)));
2207
2222
  return (React.createElement(React.Fragment, null,
2208
2223
  React.createElement(Drawer, Object.assign({ isExpanded: !!activeQuickStartID, isInline: true }, props), children ? (React.createElement(DrawerContent, Object.assign({ panelContent: panelContent }, fullWidthBodyStyle),
2209
2224
  React.createElement(DrawerContentBody, { className: "pfext-quick-start-drawer__body" }, children))) : (React.createElement("div", { className: "pf-c-drawer__main" }, panelContent))),