@patternfly/quickstarts 2.3.3 → 2.4.0

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@patternfly/quickstarts",
3
- "version": "2.3.3",
3
+ "version": "2.4.0",
4
4
  "description": "PatternFly quick starts",
5
5
  "files": [
6
6
  "src",
@@ -9,6 +9,10 @@
9
9
  "main": "dist/index.js",
10
10
  "module": "dist/index.es.js",
11
11
  "types": "dist/index.d.ts",
12
+ "publishConfig": {
13
+ "access": "public",
14
+ "tag": "prerelease"
15
+ },
12
16
  "repository": {
13
17
  "type": "git",
14
18
  "url": "git+https://github.com/patternfly/patternfly-quickstarts.git"
@@ -0,0 +1,52 @@
1
+ import * as React from 'react';
2
+ import {
3
+ Accordion,
4
+ AccordionItem,
5
+ AccordionToggle,
6
+ AccordionContent,
7
+ } from '@patternfly/react-core';
8
+ import { renderToStaticMarkup } from 'react-dom/server';
9
+ import { removeTemplateWhitespace } from './utils';
10
+ import { ACCORDION_MARKDOWN_BUTTON_ID, ACCORDION_MARKDOWN_CONTENT_ID } from './const';
11
+ import './showdown-extension.scss';
12
+
13
+ const useAccordionShowdownExtension = () => {
14
+ return React.useMemo(
15
+ () => ({
16
+ type: 'lang',
17
+ regex: /\[(.+)]{{(accordion) ("(.*?)")}}/g,
18
+ replace: (
19
+ _text: string,
20
+ accordionContent: string,
21
+ _command: string,
22
+ accordionHeading: string,
23
+ ): string => {
24
+ const accordionId = new String(accordionHeading).replace(/\s/g, '-');
25
+
26
+ return removeTemplateWhitespace(
27
+ renderToStaticMarkup(
28
+ <Accordion asDefinitionList>
29
+ <AccordionItem>
30
+ <AccordionToggle
31
+ isExpanded={false}
32
+ id={`${ACCORDION_MARKDOWN_BUTTON_ID}-${accordionId}`}
33
+ >
34
+ {accordionHeading}
35
+ </AccordionToggle>
36
+ <AccordionContent
37
+ id={`${ACCORDION_MARKDOWN_CONTENT_ID}-${accordionId}`}
38
+ isHidden={!false}
39
+ >
40
+ {accordionContent}
41
+ </AccordionContent>
42
+ </AccordionItem>
43
+ </Accordion>,
44
+ ),
45
+ );
46
+ },
47
+ }),
48
+ [],
49
+ );
50
+ };
51
+
52
+ export default useAccordionShowdownExtension;
@@ -0,0 +1,60 @@
1
+ import * as React from 'react';
2
+ import { useEventListener } from '../../hooks';
3
+ import { ACCORDION_MARKDOWN_BUTTON_ID, ACCORDION_MARKDOWN_CONTENT_ID } from './const';
4
+
5
+ type AccordionShowdownComponentProps = {
6
+ buttonElement: HTMLElement;
7
+ contentElement: HTMLElement;
8
+ };
9
+
10
+ const AccordionShowdownHandler: React.FC<AccordionShowdownComponentProps> = ({
11
+ buttonElement,
12
+ contentElement,
13
+ }) => {
14
+ const [expanded, setExpanded] = React.useState<boolean>(false);
15
+
16
+ const handleClick = () => {
17
+ const expandedModifier = 'pf-m-expanded';
18
+
19
+ buttonElement.className = `pf-c-accordion__toggle ${!expanded ? expandedModifier : ''}`;
20
+ contentElement.hidden = expanded;
21
+ contentElement.className = `pf-c-accordion__expanded-content ${
22
+ !expanded ? expandedModifier : ''
23
+ }`;
24
+ setExpanded(!expanded);
25
+ };
26
+
27
+ useEventListener(buttonElement, 'click', handleClick);
28
+
29
+ return <></>;
30
+ };
31
+
32
+ type accordionRenderExtensionProps = {
33
+ docContext: HTMLDocument;
34
+ };
35
+
36
+ const AccordionRenderExtension: React.FC<accordionRenderExtensionProps> = ({ docContext }) => {
37
+ const buttonElements = docContext.querySelectorAll(`[id ^= ${ACCORDION_MARKDOWN_BUTTON_ID}]`);
38
+ const contentElements = docContext.querySelectorAll(`[id ^= ${ACCORDION_MARKDOWN_CONTENT_ID}]`);
39
+
40
+ return buttonElements.length > 0 ? (
41
+ <>
42
+ {Array.from(buttonElements).map((elm) => {
43
+ const content = Array.from(contentElements).find((elm2) => {
44
+ const elmId = elm.id.split(ACCORDION_MARKDOWN_BUTTON_ID)[1];
45
+ const elm2Id = elm2.id.split(ACCORDION_MARKDOWN_CONTENT_ID)[1];
46
+ return elmId === elm2Id;
47
+ });
48
+ return (
49
+ <AccordionShowdownHandler
50
+ key={elm.id.split(ACCORDION_MARKDOWN_BUTTON_ID)[1]}
51
+ buttonElement={elm as HTMLElement}
52
+ contentElement={content as HTMLElement}
53
+ />
54
+ );
55
+ })}
56
+ </>
57
+ ) : null;
58
+ };
59
+
60
+ export default AccordionRenderExtension;
@@ -1,3 +1,5 @@
1
1
  export const MARKDOWN_COPY_BUTTON_ID = 'data-copy-for';
2
2
  export const MARKDOWN_EXECUTE_BUTTON_ID = 'data-execute-for';
3
3
  export const MARKDOWN_SNIPPET_ID = 'data-snippet-id';
4
+ export const ACCORDION_MARKDOWN_BUTTON_ID = `accordion-markdown-button-id`;
5
+ export 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,12 +1,14 @@
1
1
  import * as React from 'react';
2
2
  import { SyncMarkdownView } from '@console/internal/components/markdown-view';
3
3
  import {
4
+ AccordionRenderExtension,
4
5
  MarkdownCopyClipboard,
5
6
  MarkdownHighlightExtension,
6
7
  useInlineCopyClipboardShowdownExtension,
7
8
  useMultilineCopyClipboardShowdownExtension,
8
9
  useAdmonitionShowdownExtension,
9
10
  useCodeShowdownExtension,
11
+ useAccordionShowdownExtension,
10
12
  } from '@console/shared';
11
13
  import { HIGHLIGHT_REGEXP } from '@console/shared/src/components/markdown-highlight-extension/highlight-consts';
12
14
  import { QuickStartContext, QuickStartContextValues } from './utils/quick-start-context';
@@ -29,6 +31,7 @@ const QuickStartMarkdownView: React.FC<QuickStartMarkdownViewProps> = ({
29
31
  const multilineCopyClipboardShowdownExtension = useMultilineCopyClipboardShowdownExtension();
30
32
  const admonitionShowdownExtension = useAdmonitionShowdownExtension();
31
33
  const codeShowdownExtension = useCodeShowdownExtension();
34
+ const accordionShowdownExtension = useAccordionShowdownExtension();
32
35
  return (
33
36
  <SyncMarkdownView
34
37
  inline
@@ -57,10 +60,12 @@ const QuickStartMarkdownView: React.FC<QuickStartMarkdownViewProps> = ({
57
60
  multilineCopyClipboardShowdownExtension,
58
61
  admonitionShowdownExtension,
59
62
  codeShowdownExtension,
63
+ accordionShowdownExtension,
60
64
  ...(markdown ? markdown.extensions : []),
61
65
  ]}
62
66
  renderExtension={(docContext, rootSelector) => (
63
67
  <>
68
+ <AccordionRenderExtension docContext={docContext} />
64
69
  <MarkdownHighlightExtension docContext={docContext} rootSelector={rootSelector} />
65
70
  <MarkdownCopyClipboard docContext={docContext} rootSelector={rootSelector} />
66
71
  {markdown &&