@patternfly/quickstarts 2.3.2 → 2.3.4

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 (41) hide show
  1. package/dist/ConsoleInternal/components/markdown-view.d.ts +1 -1
  2. package/dist/ConsoleShared/src/components/markdown-extensions/accordion-extension.d.ts +7 -0
  3. package/dist/ConsoleShared/src/components/markdown-extensions/accordion-render-extension.d.ts +6 -0
  4. package/dist/ConsoleShared/src/components/markdown-extensions/const.d.ts +2 -0
  5. package/dist/ConsoleShared/src/components/markdown-extensions/index.d.ts +2 -0
  6. package/dist/ConsoleShared/src/components/status/NotStartedIcon.d.ts +0 -1
  7. package/dist/index.es.js +106 -30
  8. package/dist/index.es.js.map +1 -1
  9. package/dist/index.js +104 -28
  10. package/dist/index.js.map +1 -1
  11. package/dist/patternfly-docs/quick-starts/design-guidelines/design-guidelines.md +1 -1
  12. package/dist/patternfly-docs/quick-starts/examples/about.md +28 -21
  13. package/dist/patternfly-docs/quick-starts/examples/basic.md +7 -5
  14. package/dist/patternfly-docs/quick-starts/examples/help-topics.md +8 -5
  15. package/dist/patternfly-global.css +890 -419
  16. package/dist/patternfly-nested.css +12484 -7322
  17. package/dist/quickstarts-base.css +870 -671
  18. package/dist/quickstarts-full.es.js +6466 -6194
  19. package/dist/quickstarts-full.es.js.map +1 -1
  20. package/dist/quickstarts-standalone.css +854 -622
  21. package/dist/quickstarts-standalone.min.css +2 -2
  22. package/dist/quickstarts-vendor.css +84 -55
  23. package/dist/quickstarts.css +953 -726
  24. package/dist/quickstarts.min.css +1 -1
  25. package/dist/utils/quick-start-types.d.ts +0 -1
  26. package/package.json +16 -13
  27. package/src/ConsoleInternal/components/catalog/_catalog.scss +7 -5
  28. package/src/ConsoleInternal/components/markdown-view.tsx +34 -50
  29. package/src/ConsoleShared/src/components/markdown-extensions/accordion-extension.tsx +52 -0
  30. package/src/ConsoleShared/src/components/markdown-extensions/accordion-render-extension.tsx +60 -0
  31. package/src/ConsoleShared/src/components/markdown-extensions/const.ts +2 -0
  32. package/src/ConsoleShared/src/components/markdown-extensions/index.ts +2 -0
  33. package/src/HelpTopicPanelContent.tsx +1 -1
  34. package/src/QuickStartMarkdownView.tsx +5 -0
  35. package/src/QuickStartPanelContent.tsx +17 -2
  36. package/src/catalog/QuickStartTileHeader.tsx +2 -1
  37. package/src/controller/QuickStartTaskHeader.tsx +12 -1
  38. package/src/declaration.d.ts +1 -0
  39. package/src/styles/legacy-bootstrap/_code.scss +4 -2
  40. package/src/styles/legacy-bootstrap/_type.scss +8 -6
  41. package/src/styles/patternfly-nested.scss +9 -9
@@ -5,7 +5,7 @@ declare type ShowdownExtension = {
5
5
  regex?: RegExp;
6
6
  replace?: (...args: any[]) => string;
7
7
  };
8
- export declare const markdownConvert: (markdown: any, extensions?: ShowdownExtension[]) => any;
8
+ export declare const markdownConvert: (markdown: string, extensions?: ShowdownExtension[]) => Promise<any>;
9
9
  declare type SyncMarkdownProps = {
10
10
  content?: string;
11
11
  emptyMsg?: string;
@@ -0,0 +1,7 @@
1
+ import './showdown-extension.scss';
2
+ declare const useAccordionShowdownExtension: () => {
3
+ type: string;
4
+ regex: RegExp;
5
+ replace: (_text: string, accordionContent: string, _command: string, accordionHeading: string) => string;
6
+ };
7
+ export default useAccordionShowdownExtension;
@@ -0,0 +1,6 @@
1
+ import * as React from 'react';
2
+ declare type accordionRenderExtensionProps = {
3
+ docContext: HTMLDocument;
4
+ };
5
+ declare const AccordionRenderExtension: React.FC<accordionRenderExtensionProps>;
6
+ export default AccordionRenderExtension;
@@ -1,3 +1,5 @@
1
1
  export declare const MARKDOWN_COPY_BUTTON_ID = "data-copy-for";
2
2
  export declare const MARKDOWN_EXECUTE_BUTTON_ID = "data-execute-for";
3
3
  export declare const MARKDOWN_SNIPPET_ID = "data-snippet-id";
4
+ export declare const ACCORDION_MARKDOWN_BUTTON_ID = "accordion-markdown-button-id";
5
+ export declare const ACCORDION_MARKDOWN_CONTENT_ID = "accordion-markdown-content-id";
@@ -3,3 +3,5 @@ export { default as useInlineCopyClipboardShowdownExtension } from './inline-cli
3
3
  export { default as useMultilineCopyClipboardShowdownExtension } from './multiline-clipboard-extension';
4
4
  export { default as useAdmonitionShowdownExtension } from './admonition-extension';
5
5
  export { default as useCodeShowdownExtension } from './code-extension';
6
+ export { default as useAccordionShowdownExtension } from './accordion-extension';
7
+ export { default as AccordionRenderExtension } from './accordion-render-extension';
@@ -1,3 +1,2 @@
1
- /// <reference types="react" />
2
1
  declare const _default: (props: any) => JSX.Element;
3
2
  export default _default;
package/dist/index.es.js CHANGED
@@ -1,16 +1,16 @@
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, Alert, CodeBlock, 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, Radio, DrawerPanelContent, DrawerHead, DrawerActions, DrawerCloseButton, DrawerPanelBody, Drawer, DrawerContent, DrawerContentBody, OptionsMenuItem, Stack, StackItem, OptionsMenu, OptionsMenuToggle } from '@patternfly/react-core';
3
+ import { Card, CardHeader, CardActions, CardTitle, CardBody, CardFooter, Modal as Modal$1, Tooltip, Alert, CodeBlock, Accordion, AccordionItem, AccordionToggle, AccordionContent, 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, Radio, DrawerPanelContent, DrawerHead, DrawerActions, DrawerCloseButton, DrawerPanelBody, Drawer, DrawerContent, DrawerContentBody, OptionsMenuItem, Stack, StackItem, OptionsMenu, OptionsMenuToggle } 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';
7
- import { __rest } from 'tslib';
7
+ import { __rest, __awaiter } from 'tslib';
8
8
  import * as ReactDOM from 'react-dom';
9
9
  import { renderToStaticMarkup } from 'react-dom/server';
10
10
  import CopyIcon from '@patternfly/react-icons/dist/js/icons/copy-icon';
11
11
  import LightbulbIcon from '@patternfly/react-icons/dist/js/icons/lightbulb-icon';
12
12
  import FireIcon from '@patternfly/react-icons/dist/js/icons/fire-icon';
13
- import { Converter } from 'showdown';
13
+ import { marked } from 'marked';
14
14
  import SyncAltIcon from '@patternfly/react-icons/dist/js/icons/sync-alt-icon';
15
15
  import CheckCircleIcon from '@patternfly/react-icons/dist/js/icons/check-circle-icon';
16
16
  import ExclamationCircleIcon from '@patternfly/react-icons/dist/js/icons/exclamation-circle-icon';
@@ -872,7 +872,7 @@ class CatalogTile extends React.Component {
872
872
  const _a = this.props, { id, className, featured, onClick, href, icon, iconImg, iconAlt, iconClass, badges, title, vendor, description, footer,
873
873
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
874
874
  ref, children } = _a, props = __rest(_a, ["id", "className", "featured", "onClick", "href", "icon", "iconImg", "iconAlt", "iconClass", "badges", "title", "vendor", "description", "footer", "ref", "children"]);
875
- return (React.createElement(Card, Object.assign({ component: href || onClick ? 'a' : 'div', id: id, href: href || '#', className: css('catalog-tile-pf', { featured }, className), onClick: e => this.handleClick(e), isHoverable: true }, props),
875
+ return (React.createElement(Card, Object.assign({ component: href || onClick ? 'a' : 'div', id: id, href: href || '#', className: css('catalog-tile-pf', { featured }, className), onClick: e => this.handleClick(e), isSelectable: true }, props),
876
876
  (badges.length > 0 || iconImg || iconClass || icon) && (React.createElement(CardHeader, null,
877
877
  iconImg && React.createElement("img", { className: "catalog-tile-pf-icon", src: iconImg, alt: iconAlt }),
878
878
  !iconImg && (iconClass || icon) && React.createElement("span", { className: `catalog-tile-pf-icon ${iconClass}` }, icon),
@@ -1195,7 +1195,9 @@ const MarkdownHighlightExtension = ({ docContext, rootSelector, }) => {
1195
1195
  };
1196
1196
 
1197
1197
  const MARKDOWN_COPY_BUTTON_ID = 'data-copy-for';
1198
- const MARKDOWN_SNIPPET_ID = 'data-snippet-id';
1198
+ const MARKDOWN_SNIPPET_ID = 'data-snippet-id';
1199
+ const ACCORDION_MARKDOWN_BUTTON_ID = `accordion-markdown-button-id`;
1200
+ const ACCORDION_MARKDOWN_CONTENT_ID = `accordion-markdown-content-id`;
1199
1201
 
1200
1202
  const CopyClipboard = ({ element, rootSelector, docContext, }) => {
1201
1203
  const { getResource } = React.useContext(QuickStartContext);
@@ -1285,16 +1287,7 @@ const useMultilineCopyClipboardShowdownExtension = () => {
1285
1287
 
1286
1288
  // eslint-disable-next-line @typescript-eslint/no-require-imports
1287
1289
  const DOMPurify = require('dompurify');
1288
- const markdownConvert = (markdown, extensions) => {
1289
- const converter = new Converter({
1290
- tables: true,
1291
- openLinksInNewWindow: true,
1292
- strikethrough: true,
1293
- emoji: false,
1294
- });
1295
- if (extensions) {
1296
- converter.addExtension(extensions);
1297
- }
1290
+ const markdownConvert = (markdown, extensions) => __awaiter(void 0, void 0, void 0, function* () {
1298
1291
  DOMPurify.addHook('beforeSanitizeElements', function (node) {
1299
1292
  // nodeType 1 = element type
1300
1293
  // transform anchor tags
@@ -1321,20 +1314,38 @@ const markdownConvert = (markdown, extensions) => {
1321
1314
  node.setAttribute('xlink:show', 'new');
1322
1315
  }
1323
1316
  });
1324
- return DOMPurify.sanitize(converter.makeHtml(markdown), {
1325
- USE_PROFILES: {
1326
- html: true,
1327
- svg: true,
1328
- },
1329
- });
1330
- };
1317
+ // Replace code fences with non markdown formatting relates tokens so that marked doesn't try to parse them as code spans
1318
+ const markdownWithSubstitutedCodeFences = markdown.replace(/```/g, '@@@');
1319
+ const parsedMarkdown = yield marked.parse(markdownWithSubstitutedCodeFences);
1320
+ // Swap the temporary tokens back to code fences before we run the extensions
1321
+ let md = parsedMarkdown.replace(/@@@/g, '```');
1322
+ if (extensions) {
1323
+ // Convert code spans back to md format before we run the custom extension regexes
1324
+ md = md.replace(/<code>(.*)<\/code>/g, '`$1`');
1325
+ extensions.forEach(({ regex, replace }) => {
1326
+ if (regex) {
1327
+ md = md.replace(regex, replace);
1328
+ }
1329
+ });
1330
+ // Convert any remaining backticks back into code spans
1331
+ md = md.replace(/`(.*)`/g, '<code>$1</code>');
1332
+ }
1333
+ return DOMPurify.sanitize(md);
1334
+ });
1331
1335
  const SyncMarkdownView = ({
1332
1336
  // truncateContent,
1333
1337
  content, emptyMsg, extensions, renderExtension, exactHeight, inline, className, }) => {
1334
1338
  const { getResource } = React.useContext(QuickStartContext);
1335
- const markup = React.useMemo(() => {
1336
- return markdownConvert(content || emptyMsg || getResource('Not available'), extensions);
1337
- }, [content, emptyMsg, extensions, getResource]);
1339
+ const [markup, setMarkup] = React.useState('');
1340
+ React.useEffect(() => {
1341
+ function getMd() {
1342
+ return __awaiter(this, void 0, void 0, function* () {
1343
+ const md = yield markdownConvert(content || emptyMsg || getResource('Not available'), extensions);
1344
+ setMarkup(md);
1345
+ });
1346
+ }
1347
+ getMd();
1348
+ }, [content, emptyMsg, getResource, extensions]);
1338
1349
  const innerProps = {
1339
1350
  renderExtension: (extensions === null || extensions === void 0 ? void 0 : extensions.length) > 0 ? renderExtension : undefined,
1340
1351
  exactHeight,
@@ -1459,6 +1470,7 @@ const QuickStartMarkdownView = ({ content, exactHeight, className, }) => {
1459
1470
  const multilineCopyClipboardShowdownExtension = useMultilineCopyClipboardShowdownExtension();
1460
1471
  const admonitionShowdownExtension = useAdmonitionShowdownExtension();
1461
1472
  const codeShowdownExtension = useCodeShowdownExtension();
1473
+ const accordionShowdownExtension = useAccordionShowdownExtension();
1462
1474
  return (React.createElement(SyncMarkdownView, { inline: true, content: content, exactHeight: exactHeight, extensions: [
1463
1475
  {
1464
1476
  type: 'lang',
@@ -1482,8 +1494,10 @@ const QuickStartMarkdownView = ({ content, exactHeight, className, }) => {
1482
1494
  multilineCopyClipboardShowdownExtension,
1483
1495
  admonitionShowdownExtension,
1484
1496
  codeShowdownExtension,
1497
+ accordionShowdownExtension,
1485
1498
  ...(markdown ? markdown.extensions : []),
1486
1499
  ], renderExtension: (docContext, rootSelector) => (React.createElement(React.Fragment, null,
1500
+ React.createElement(AccordionRenderExtension, { docContext: docContext }),
1487
1501
  React.createElement(MarkdownHighlightExtension, { docContext: docContext, rootSelector: rootSelector }),
1488
1502
  React.createElement(MarkdownCopyClipboard, { docContext: docContext, rootSelector: rootSelector }),
1489
1503
  markdown &&
@@ -1539,6 +1553,45 @@ const useCodeShowdownExtension = () => {
1539
1553
  }), []);
1540
1554
  };
1541
1555
 
1556
+ const useAccordionShowdownExtension = () => {
1557
+ return React.useMemo(() => ({
1558
+ type: 'lang',
1559
+ regex: /\[(.+)]{{(accordion) ("(.*?)")}}/g,
1560
+ replace: (_text, accordionContent, _command, accordionHeading) => {
1561
+ const accordionId = new String(accordionHeading).replace(/\s/g, '-');
1562
+ return removeTemplateWhitespace(renderToStaticMarkup(React.createElement(Accordion, { asDefinitionList: true },
1563
+ React.createElement(AccordionItem, null,
1564
+ React.createElement(AccordionToggle, { isExpanded: false, id: `${ACCORDION_MARKDOWN_BUTTON_ID}-${accordionId}` }, accordionHeading),
1565
+ React.createElement(AccordionContent, { id: `${ACCORDION_MARKDOWN_CONTENT_ID}-${accordionId}`, isHidden: !false }, accordionContent)))));
1566
+ },
1567
+ }), []);
1568
+ };
1569
+
1570
+ const AccordionShowdownHandler = ({ buttonElement, contentElement, }) => {
1571
+ const [expanded, setExpanded] = React.useState(false);
1572
+ const handleClick = () => {
1573
+ const expandedModifier = 'pf-m-expanded';
1574
+ buttonElement.className = `pf-c-accordion__toggle ${!expanded ? expandedModifier : ''}`;
1575
+ contentElement.hidden = expanded;
1576
+ contentElement.className = `pf-c-accordion__expanded-content ${!expanded ? expandedModifier : ''}`;
1577
+ setExpanded(!expanded);
1578
+ };
1579
+ useEventListener(buttonElement, 'click', handleClick);
1580
+ return React.createElement(React.Fragment, null);
1581
+ };
1582
+ const AccordionRenderExtension = ({ docContext }) => {
1583
+ const buttonElements = docContext.querySelectorAll(`[id ^= ${ACCORDION_MARKDOWN_BUTTON_ID}]`);
1584
+ const contentElements = docContext.querySelectorAll(`[id ^= ${ACCORDION_MARKDOWN_CONTENT_ID}]`);
1585
+ return buttonElements.length > 0 ? (React.createElement(React.Fragment, null, Array.from(buttonElements).map((elm) => {
1586
+ const content = Array.from(contentElements).find((elm2) => {
1587
+ const elmId = elm.id.split(ACCORDION_MARKDOWN_BUTTON_ID)[1];
1588
+ const elm2Id = elm2.id.split(ACCORDION_MARKDOWN_CONTENT_ID)[1];
1589
+ return elmId === elm2Id;
1590
+ });
1591
+ return (React.createElement(AccordionShowdownHandler, { key: elm.id.split(ACCORDION_MARKDOWN_BUTTON_ID)[1], buttonElement: elm, contentElement: content }));
1592
+ }))) : null;
1593
+ };
1594
+
1542
1595
  const FallbackImg = ({ src, alt, className, fallback }) => {
1543
1596
  const [isSrcValid, setIsSrcValid] = React.useState(true);
1544
1597
  if (src && isSrcValid) {
@@ -1669,7 +1722,8 @@ const QuickStartTileHeader = ({ status, duration, name, type, quickStartId, }) =
1669
1722
  [QuickStartStatus.NOT_STARTED]: getResource('Not started'),
1670
1723
  };
1671
1724
  return (React.createElement("div", { className: "pfext-quick-start-tile-header" },
1672
- React.createElement(Title, { headingLevel: "h3", "data-test": "title", id: quickStartId }, name),
1725
+ React.createElement(Title, { headingLevel: "h3", "data-test": "title", id: quickStartId },
1726
+ React.createElement(QuickStartMarkdownView, { content: name })),
1673
1727
  React.createElement("div", { className: "pfext-quick-start-tile-header__status" },
1674
1728
  type && (React.createElement(Label, { className: "pfext-quick-start-tile-header--margin", color: type.color }, type.text)),
1675
1729
  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))),
@@ -1958,12 +2012,22 @@ const TaskIcon = ({ taskIndex, taskStatus }) => {
1958
2012
  };
1959
2013
  const QuickStartTaskHeader = ({ title, taskIndex, subtitle, taskStatus, size, isActiveTask, onTaskSelect, children, }) => {
1960
2014
  const titleRef = React.useRef(null);
2015
+ const [parsedTitle, setParsedTitle] = React.useState('');
1961
2016
  React.useEffect(() => {
1962
2017
  if (isActiveTask) {
1963
2018
  // Focus the WizardNavItem button element that contains the title
1964
2019
  titleRef.current.parentNode.focus();
1965
2020
  }
1966
2021
  }, [isActiveTask]);
2022
+ React.useEffect(() => {
2023
+ function getParsedTitle() {
2024
+ return __awaiter(this, void 0, void 0, function* () {
2025
+ const convertedMdTitle = yield markdownConvert(title);
2026
+ setParsedTitle(removeParagraphWrap(convertedMdTitle));
2027
+ });
2028
+ }
2029
+ getParsedTitle();
2030
+ }, [title]);
1967
2031
  const classNames = css('pfext-quick-start-task-header__title', {
1968
2032
  'pfext-quick-start-task-header__title-success': taskStatus === QuickStartTaskStatus.SUCCESS,
1969
2033
  'pfext-quick-start-task-header__title-failed': taskStatus === (QuickStartTaskStatus.FAILED || QuickStartTaskStatus.VISITED),
@@ -1979,7 +2043,7 @@ const QuickStartTaskHeader = ({ title, taskIndex, subtitle, taskStatus, size, is
1979
2043
  const content = (React.createElement("div", { className: "pfext-quick-start-task-header", ref: titleRef },
1980
2044
  React.createElement(TaskIcon, { taskIndex: taskIndex, taskStatus: taskStatus }),
1981
2045
  React.createElement(Title, { headingLevel: "h3", size: size, className: classNames },
1982
- React.createElement("span", { dangerouslySetInnerHTML: { __html: removeParagraphWrap(markdownConvert(title)) } }),
2046
+ React.createElement("span", { dangerouslySetInnerHTML: { __html: parsedTitle } }),
1983
2047
  isActiveTask && subtitle && (React.createElement("span", { className: "pfext-quick-start-task-header__subtitle", "data-test-id": "quick-start-task-subtitle" },
1984
2048
  ' ',
1985
2049
  subtitle))),
@@ -2186,6 +2250,7 @@ const QuickStartPanelContent = (_a) => {
2186
2250
  const titleRef = React.useRef(null);
2187
2251
  const { getResource, activeQuickStartState } = React.useContext(QuickStartContext);
2188
2252
  const [contentRef, setContentRef] = React.useState();
2253
+ const [displayName, setDisplayName] = React.useState('');
2189
2254
  const shadows = useScrollShadows(contentRef);
2190
2255
  const quickStart = quickStarts.find((qs) => qs.metadata.name === activeQuickStartID);
2191
2256
  const taskNumber = activeQuickStartState === null || activeQuickStartState === void 0 ? void 0 : activeQuickStartState.taskNumber;
@@ -2213,12 +2278,23 @@ const QuickStartPanelContent = (_a) => {
2213
2278
  titleRef.current.focus();
2214
2279
  }
2215
2280
  }, [quickStart]);
2281
+ React.useEffect(() => {
2282
+ function getDisplayName() {
2283
+ return __awaiter(this, void 0, void 0, function* () {
2284
+ const convertedMdDisplayName = yield markdownConvert(quickStart === null || quickStart === void 0 ? void 0 : quickStart.spec.displayName);
2285
+ setDisplayName(removeParagraphWrap(convertedMdDisplayName));
2286
+ });
2287
+ }
2288
+ getDisplayName();
2289
+ }, [quickStart]);
2216
2290
  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),
2217
2291
  React.createElement("div", { className: headerClasses },
2218
2292
  React.createElement(DrawerHead, null,
2219
2293
  React.createElement("div", { className: "pfext-quick-start-panel-content__title", tabIndex: -1, ref: titleRef },
2220
- 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 :
2221
- quickStart.spec.displayName,
2294
+ React.createElement(Title, { headingLevel: "h2", size: "xl", className: "pfext-quick-start-panel-content__name", style: { marginRight: 'var(--pf-global--spacer--md)' } },
2295
+ React.createElement("span", { dangerouslySetInnerHTML: {
2296
+ __html: displayName,
2297
+ } }),
2222
2298
  ' ',
2223
2299
  React.createElement("small", { className: "pfext-quick-start-panel-content__duration" }, (quickStart === null || quickStart === void 0 ? void 0 : quickStart.spec.durationMinutes) ? getResource('{{type}} • {{duration, number}} minutes', quickStart === null || quickStart === void 0 ? void 0 : quickStart.spec.durationMinutes)
2224
2300
  .replace('{{duration, number}}', quickStart === null || quickStart === void 0 ? void 0 : quickStart.spec.durationMinutes)
@@ -2384,7 +2460,7 @@ const HelpTopicPanelContent = (_a) => {
2384
2460
  setActiveHelpTopicByName(topicName);
2385
2461
  toggleHelpTopicMenu();
2386
2462
  };
2387
- const menuItems = filteredHelpTopics.length > 0 &&
2463
+ const menuItems = filteredHelpTopics.length > 1 &&
2388
2464
  filteredHelpTopics.map((topic) => {
2389
2465
  return (React.createElement(OptionsMenuItem, { key: topic.name, onSelect: onSelectHelpTopic, id: topic.name }, topic.title));
2390
2466
  });