@patternfly/quickstarts 0.0.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.
Files changed (304) hide show
  1. package/README.md +546 -0
  2. package/dist/ConsoleInternal/components/markdown-view.d.ts +19 -0
  3. package/dist/ConsoleInternal/components/utils/camel-case-wrap.d.ts +6 -0
  4. package/dist/ConsoleInternal/components/utils/index.d.ts +3 -0
  5. package/dist/ConsoleInternal/components/utils/router.d.ts +9 -0
  6. package/dist/ConsoleInternal/components/utils/status-box.d.ts +20 -0
  7. package/dist/ConsoleInternal/module/k8s/types.d.ts +42 -0
  8. package/dist/ConsoleShared/index.d.ts +1 -0
  9. package/dist/ConsoleShared/src/components/index.d.ts +7 -0
  10. package/dist/ConsoleShared/src/components/markdown-extensions/MarkdownCopyClipboard.d.ts +13 -0
  11. package/dist/ConsoleShared/src/components/markdown-extensions/accordion-extension.d.ts +7 -0
  12. package/dist/ConsoleShared/src/components/markdown-extensions/accordion-render-extension.d.ts +6 -0
  13. package/dist/ConsoleShared/src/components/markdown-extensions/admonition-extension.d.ts +7 -0
  14. package/dist/ConsoleShared/src/components/markdown-extensions/code-extension.d.ts +7 -0
  15. package/dist/ConsoleShared/src/components/markdown-extensions/const.d.ts +5 -0
  16. package/dist/ConsoleShared/src/components/markdown-extensions/index.d.ts +7 -0
  17. package/dist/ConsoleShared/src/components/markdown-extensions/inline-clipboard-extension.d.ts +7 -0
  18. package/dist/ConsoleShared/src/components/markdown-extensions/multiline-clipboard-extension.d.ts +7 -0
  19. package/dist/ConsoleShared/src/components/markdown-extensions/utils.d.ts +1 -0
  20. package/dist/ConsoleShared/src/components/markdown-highlight-extension/MarkdownHighlightExtension.d.ts +7 -0
  21. package/dist/ConsoleShared/src/components/markdown-highlight-extension/highlight-consts.d.ts +4 -0
  22. package/dist/ConsoleShared/src/components/markdown-highlight-extension/index.d.ts +1 -0
  23. package/dist/ConsoleShared/src/components/modal/Modal.d.ts +9 -0
  24. package/dist/ConsoleShared/src/components/modal/index.d.ts +1 -0
  25. package/dist/ConsoleShared/src/components/popper/Portal.d.ts +8 -0
  26. package/dist/ConsoleShared/src/components/popper/SimplePopper.d.ts +6 -0
  27. package/dist/ConsoleShared/src/components/popper/index.d.ts +2 -0
  28. package/dist/ConsoleShared/src/components/spotlight/InteractiveSpotlight.d.ts +7 -0
  29. package/dist/ConsoleShared/src/components/spotlight/Spotlight.d.ts +7 -0
  30. package/dist/ConsoleShared/src/components/spotlight/StaticSpotlight.d.ts +7 -0
  31. package/dist/ConsoleShared/src/components/spotlight/index.d.ts +1 -0
  32. package/dist/ConsoleShared/src/components/status/GenericStatus.d.ts +12 -0
  33. package/dist/ConsoleShared/src/components/status/NotStartedIcon.d.ts +3 -0
  34. package/dist/ConsoleShared/src/components/status/PopoverStatus.d.ts +13 -0
  35. package/dist/ConsoleShared/src/components/status/Status.d.ts +11 -0
  36. package/dist/ConsoleShared/src/components/status/StatusIconAndText.d.ts +8 -0
  37. package/dist/ConsoleShared/src/components/status/icons.d.ts +9 -0
  38. package/dist/ConsoleShared/src/components/status/index.d.ts +1 -0
  39. package/dist/ConsoleShared/src/components/status/statuses.d.ts +5 -0
  40. package/dist/ConsoleShared/src/components/status/types.d.ts +9 -0
  41. package/dist/ConsoleShared/src/components/utils/FallbackImg.d.ts +9 -0
  42. package/dist/ConsoleShared/src/components/utils/index.d.ts +1 -0
  43. package/dist/ConsoleShared/src/constants/index.d.ts +1 -0
  44. package/dist/ConsoleShared/src/constants/ui.d.ts +1 -0
  45. package/dist/ConsoleShared/src/hooks/index.d.ts +6 -0
  46. package/dist/ConsoleShared/src/hooks/scroll.d.ts +8 -0
  47. package/dist/ConsoleShared/src/hooks/useBoundingClientRect.d.ts +3 -0
  48. package/dist/ConsoleShared/src/hooks/useEventListener.d.ts +1 -0
  49. package/dist/ConsoleShared/src/hooks/useForceRender.d.ts +4 -0
  50. package/dist/ConsoleShared/src/hooks/useResizeObserver.d.ts +1 -0
  51. package/dist/ConsoleShared/src/hooks/useScrollShadows.d.ts +7 -0
  52. package/dist/ConsoleShared/src/index.d.ts +4 -0
  53. package/dist/ConsoleShared/src/utils/index.d.ts +1 -0
  54. package/dist/ConsoleShared/src/utils/useCombineRefs.d.ts +2 -0
  55. package/dist/HelpTopicDrawer.d.ts +33 -0
  56. package/dist/HelpTopicPanelContent.d.ts +11 -0
  57. package/dist/QuickStartCatalogPage.d.ts +14 -0
  58. package/dist/QuickStartCloseModal.d.ts +8 -0
  59. package/dist/QuickStartController.d.ts +10 -0
  60. package/dist/QuickStartDrawer.d.ts +62 -0
  61. package/dist/QuickStartMarkdownView.d.ts +9 -0
  62. package/dist/QuickStartPanelContent.d.ts +15 -0
  63. package/dist/catalog/Catalog/QuickStartCatalogHeader.d.ts +6 -0
  64. package/dist/catalog/Catalog/QuickStartCatalogSection.d.ts +5 -0
  65. package/dist/catalog/Catalog/QuickStartCatalogToolbar.d.ts +5 -0
  66. package/dist/catalog/Catalog/index.d.ts +3 -0
  67. package/dist/catalog/QuickStartCatalog.d.ts +8 -0
  68. package/dist/catalog/QuickStartTile.d.ts +14 -0
  69. package/dist/catalog/QuickStartTileDescription.d.ts +8 -0
  70. package/dist/catalog/QuickStartTileFooter.d.ts +8 -0
  71. package/dist/catalog/QuickStartTileFooterExternal.d.ts +8 -0
  72. package/dist/catalog/QuickStartTileHeader.d.ts +24 -0
  73. package/dist/catalog/Toolbar/QuickStartCatalogFilter.d.ts +10 -0
  74. package/dist/catalog/Toolbar/QuickStartCatalogFilterItems.d.ts +31 -0
  75. package/dist/catalog/index.d.ts +9 -0
  76. package/dist/controller/QuickStartConclusion.d.ts +12 -0
  77. package/dist/controller/QuickStartContent.d.ts +14 -0
  78. package/dist/controller/QuickStartFooter.d.ts +14 -0
  79. package/dist/controller/QuickStartIntroduction.d.ts +12 -0
  80. package/dist/controller/QuickStartTaskHeader.d.ts +15 -0
  81. package/dist/controller/QuickStartTaskHeaderList.d.ts +10 -0
  82. package/dist/controller/QuickStartTaskReview.d.ts +10 -0
  83. package/dist/controller/QuickStartTasks.d.ts +12 -0
  84. package/dist/data/mocks/json/explore-pipeline-quickstart.d.ts +2 -0
  85. package/dist/data/mocks/json/explore-serverless-quickstart.d.ts +2 -0
  86. package/dist/data/mocks/json/monitor-sampleapp-quickstart.d.ts +2 -0
  87. package/dist/data/mocks/json/tour-icons.d.ts +2 -0
  88. package/dist/data/quick-start-test-data.d.ts +2 -0
  89. package/dist/data/test-utils.d.ts +8 -0
  90. package/dist/index.d.ts +16 -0
  91. package/dist/index.es.js +2593 -0
  92. package/dist/index.es.js.map +1 -0
  93. package/dist/index.js +2695 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/patternfly-docs/quick-starts/design-guidelines/design-guidelines.md +105 -0
  96. package/dist/patternfly-docs/quick-starts/design-guidelines/img/card-elements copy.png +0 -0
  97. package/dist/patternfly-docs/quick-starts/design-guidelines/img/card-elements.png +0 -0
  98. package/dist/patternfly-docs/quick-starts/design-guidelines/img/catalog-elements.png +0 -0
  99. package/dist/patternfly-docs/quick-starts/design-guidelines/img/check-your-work.png +0 -0
  100. package/dist/patternfly-docs/quick-starts/design-guidelines/img/introduction-screen.png +0 -0
  101. package/dist/patternfly-docs/quick-starts/design-guidelines/img/mixed-catalog.png +0 -0
  102. package/dist/patternfly-docs/quick-starts/design-guidelines/img/prerequisites.png +0 -0
  103. package/dist/patternfly-docs/quick-starts/design-guidelines/img/qs-context.png +0 -0
  104. package/dist/patternfly-docs/quick-starts/design-guidelines/img/side-panel-elements.png +0 -0
  105. package/dist/patternfly-docs/quick-starts/design-guidelines/img/side-panel-resized.png +0 -0
  106. package/dist/patternfly-docs/quick-starts/design-guidelines/img/side-panel.png +0 -0
  107. package/dist/patternfly-docs/quick-starts/design-guidelines/img/task-no.png +0 -0
  108. package/dist/patternfly-docs/quick-starts/design-guidelines/img/task-yes.png +0 -0
  109. package/dist/patternfly-docs/quick-starts/design-guidelines/img/task.png +0 -0
  110. package/dist/patternfly-docs/quick-starts/examples/Basic.jsx +73 -0
  111. package/dist/patternfly-docs/quick-starts/examples/HelpTopic.jsx +51 -0
  112. package/dist/patternfly-docs/quick-starts/examples/about.md +84 -0
  113. package/dist/patternfly-docs/quick-starts/examples/basic.md +29 -0
  114. package/dist/patternfly-docs/quick-starts/examples/example-data/example-help-topics.js +173 -0
  115. package/dist/patternfly-docs/quick-starts/examples/example-data/example-quickstarts.js +215 -0
  116. package/dist/patternfly-docs/quick-starts/examples/example-data/index.js +15 -0
  117. package/dist/patternfly-docs/quick-starts/examples/help-topics.md +28 -0
  118. package/dist/patternfly-docs/quick-starts/examples/img/catalog.png +0 -0
  119. package/dist/patternfly-docs/quick-starts/examples/img/help-topic.png +0 -0
  120. package/dist/patternfly-docs/quick-starts/examples/img/side-panel.png +0 -0
  121. package/dist/patternfly-global.css +1302 -0
  122. package/dist/patternfly-nested.css +11812 -0
  123. package/dist/quickstarts-base.css +1219 -0
  124. package/dist/quickstarts-full.es.js +31861 -0
  125. package/dist/quickstarts-full.es.js.map +1 -0
  126. package/dist/quickstarts-standalone.css +868 -0
  127. package/dist/quickstarts-standalone.min.css +4 -0
  128. package/dist/quickstarts-vendor.css +165 -0
  129. package/dist/quickstarts.css +1383 -0
  130. package/dist/quickstarts.min.css +1 -0
  131. package/dist/styles/patternfly-global-entry.d.ts +1 -0
  132. package/dist/styles/patternfly-nested-entry.d.ts +1 -0
  133. package/dist/styles/quickstarts-standalone-entry.d.ts +1 -0
  134. package/dist/styles/vendor-entry.d.ts +1 -0
  135. package/dist/utils/PluralResolver.d.ts +16 -0
  136. package/dist/utils/asciidoc-procedure-parser.d.ts +12 -0
  137. package/dist/utils/const.d.ts +6 -0
  138. package/dist/utils/help-topic-context.d.ts +23 -0
  139. package/dist/utils/help-topic-types.d.ts +13 -0
  140. package/dist/utils/quick-start-context.d.ts +81 -0
  141. package/dist/utils/quick-start-types.d.ts +60 -0
  142. package/dist/utils/quick-start-utils.d.ts +10 -0
  143. package/dist/utils/useLocalStorage.d.ts +1 -0
  144. package/dist/vendor.js +2 -0
  145. package/dist/vendor.js.map +1 -0
  146. package/package.json +105 -0
  147. package/src/ConsoleInternal/components/_icon-and-text.scss +14 -0
  148. package/src/ConsoleInternal/components/_markdown-view.scss +19 -0
  149. package/src/ConsoleInternal/components/catalog/_catalog.scss +392 -0
  150. package/src/ConsoleInternal/components/markdown-view.tsx +276 -0
  151. package/src/ConsoleInternal/components/utils/_status-box.scss +58 -0
  152. package/src/ConsoleInternal/components/utils/camel-case-wrap.tsx +33 -0
  153. package/src/ConsoleInternal/components/utils/index.tsx +3 -0
  154. package/src/ConsoleInternal/components/utils/router.ts +45 -0
  155. package/src/ConsoleInternal/components/utils/status-box.tsx +56 -0
  156. package/src/ConsoleInternal/module/k8s/types.ts +53 -0
  157. package/src/ConsoleShared/index.ts +1 -0
  158. package/src/ConsoleShared/src/components/index.ts +7 -0
  159. package/src/ConsoleShared/src/components/layout/PageLayout.scss +29 -0
  160. package/src/ConsoleShared/src/components/markdown-extensions/MarkdownCopyClipboard.tsx +95 -0
  161. package/src/ConsoleShared/src/components/markdown-extensions/__tests__/MarkdownCopyClipboard.spec.tsx +25 -0
  162. package/src/ConsoleShared/src/components/markdown-extensions/__tests__/test-data.ts +5 -0
  163. package/src/ConsoleShared/src/components/markdown-extensions/accordion-extension.tsx +51 -0
  164. package/src/ConsoleShared/src/components/markdown-extensions/accordion-render-extension.tsx +60 -0
  165. package/src/ConsoleShared/src/components/markdown-extensions/admonition-extension.tsx +67 -0
  166. package/src/ConsoleShared/src/components/markdown-extensions/code-extension.tsx +23 -0
  167. package/src/ConsoleShared/src/components/markdown-extensions/const.ts +5 -0
  168. package/src/ConsoleShared/src/components/markdown-extensions/index.ts +7 -0
  169. package/src/ConsoleShared/src/components/markdown-extensions/inline-clipboard-extension.tsx +39 -0
  170. package/src/ConsoleShared/src/components/markdown-extensions/multiline-clipboard-extension.tsx +44 -0
  171. package/src/ConsoleShared/src/components/markdown-extensions/showdown-extension.scss +52 -0
  172. package/src/ConsoleShared/src/components/markdown-extensions/utils.ts +1 -0
  173. package/src/ConsoleShared/src/components/markdown-highlight-extension/MarkdownHighlightExtension.tsx +65 -0
  174. package/src/ConsoleShared/src/components/markdown-highlight-extension/highlight-consts.ts +9 -0
  175. package/src/ConsoleShared/src/components/markdown-highlight-extension/index.ts +1 -0
  176. package/src/ConsoleShared/src/components/modal/Modal.scss +3 -0
  177. package/src/ConsoleShared/src/components/modal/Modal.tsx +19 -0
  178. package/src/ConsoleShared/src/components/modal/index.ts +1 -0
  179. package/src/ConsoleShared/src/components/popper/Portal.tsx +25 -0
  180. package/src/ConsoleShared/src/components/popper/SimplePopper.tsx +92 -0
  181. package/src/ConsoleShared/src/components/popper/index.ts +2 -0
  182. package/src/ConsoleShared/src/components/spotlight/InteractiveSpotlight.tsx +58 -0
  183. package/src/ConsoleShared/src/components/spotlight/Spotlight.tsx +35 -0
  184. package/src/ConsoleShared/src/components/spotlight/StaticSpotlight.tsx +32 -0
  185. package/src/ConsoleShared/src/components/spotlight/index.ts +1 -0
  186. package/src/ConsoleShared/src/components/spotlight/spotlight.scss +63 -0
  187. package/src/ConsoleShared/src/components/status/GenericStatus.tsx +34 -0
  188. package/src/ConsoleShared/src/components/status/NotStartedIcon.tsx +27 -0
  189. package/src/ConsoleShared/src/components/status/PopoverStatus.tsx +39 -0
  190. package/src/ConsoleShared/src/components/status/Status.tsx +38 -0
  191. package/src/ConsoleShared/src/components/status/StatusIconAndText.tsx +42 -0
  192. package/src/ConsoleShared/src/components/status/icons.tsx +39 -0
  193. package/src/ConsoleShared/src/components/status/index.tsx +1 -0
  194. package/src/ConsoleShared/src/components/status/statuses.tsx +20 -0
  195. package/src/ConsoleShared/src/components/status/types.ts +8 -0
  196. package/src/ConsoleShared/src/components/utils/FallbackImg.tsx +20 -0
  197. package/src/ConsoleShared/src/components/utils/index.ts +1 -0
  198. package/src/ConsoleShared/src/constants/index.ts +1 -0
  199. package/src/ConsoleShared/src/constants/ui.ts +1 -0
  200. package/src/ConsoleShared/src/hooks/index.ts +6 -0
  201. package/src/ConsoleShared/src/hooks/scroll.ts +52 -0
  202. package/src/ConsoleShared/src/hooks/useBoundingClientRect.ts +18 -0
  203. package/src/ConsoleShared/src/hooks/useEventListener.ts +14 -0
  204. package/src/ConsoleShared/src/hooks/useForceRender.ts +6 -0
  205. package/src/ConsoleShared/src/hooks/useResizeObserver.ts +19 -0
  206. package/src/ConsoleShared/src/hooks/useScrollShadows.ts +45 -0
  207. package/src/ConsoleShared/src/index.ts +4 -0
  208. package/src/ConsoleShared/src/utils/index.ts +1 -0
  209. package/src/ConsoleShared/src/utils/useCombineRefs.ts +16 -0
  210. package/src/HelpTopicDrawer.tsx +116 -0
  211. package/src/HelpTopicPanelContent.tsx +160 -0
  212. package/src/QuickStartCatalogPage.tsx +195 -0
  213. package/src/QuickStartCloseModal.tsx +47 -0
  214. package/src/QuickStartController.tsx +111 -0
  215. package/src/QuickStartDrawer.scss +11 -0
  216. package/src/QuickStartDrawer.tsx +265 -0
  217. package/src/QuickStartMarkdownView.tsx +80 -0
  218. package/src/QuickStartPanelContent.scss +46 -0
  219. package/src/QuickStartPanelContent.tsx +165 -0
  220. package/src/__tests__/quick-start-utils.spec.tsx +16 -0
  221. package/src/catalog/Catalog/QuickStartCatalogHeader.tsx +18 -0
  222. package/src/catalog/Catalog/QuickStartCatalogSection.tsx +9 -0
  223. package/src/catalog/Catalog/QuickStartCatalogToolbar.tsx +12 -0
  224. package/src/catalog/Catalog/index.ts +3 -0
  225. package/src/catalog/QuickStartCatalog.scss +8 -0
  226. package/src/catalog/QuickStartCatalog.tsx +42 -0
  227. package/src/catalog/QuickStartTile.scss +11 -0
  228. package/src/catalog/QuickStartTile.tsx +129 -0
  229. package/src/catalog/QuickStartTileDescription.scss +29 -0
  230. package/src/catalog/QuickStartTileDescription.tsx +79 -0
  231. package/src/catalog/QuickStartTileFooter.tsx +101 -0
  232. package/src/catalog/QuickStartTileFooterExternal.tsx +40 -0
  233. package/src/catalog/QuickStartTileHeader.scss +16 -0
  234. package/src/catalog/QuickStartTileHeader.tsx +105 -0
  235. package/src/catalog/Toolbar/QuickStartCatalogFilter.scss +25 -0
  236. package/src/catalog/Toolbar/QuickStartCatalogFilter.tsx +32 -0
  237. package/src/catalog/Toolbar/QuickStartCatalogFilterItems.tsx +218 -0
  238. package/src/catalog/__tests__/QuickStartCatalog.spec.tsx +35 -0
  239. package/src/catalog/__tests__/QuickStartTile.spec.tsx +38 -0
  240. package/src/catalog/__tests__/QuickStartTileDescription.spec.tsx +44 -0
  241. package/src/catalog/index.ts +9 -0
  242. package/src/controller/QuickStartConclusion.tsx +63 -0
  243. package/src/controller/QuickStartContent.scss +12 -0
  244. package/src/controller/QuickStartContent.tsx +72 -0
  245. package/src/controller/QuickStartFooter.scss +13 -0
  246. package/src/controller/QuickStartFooter.tsx +124 -0
  247. package/src/controller/QuickStartIntroduction.scss +35 -0
  248. package/src/controller/QuickStartIntroduction.tsx +64 -0
  249. package/src/controller/QuickStartTaskHeader.scss +58 -0
  250. package/src/controller/QuickStartTaskHeader.tsx +125 -0
  251. package/src/controller/QuickStartTaskHeaderList.scss +17 -0
  252. package/src/controller/QuickStartTaskHeaderList.tsx +33 -0
  253. package/src/controller/QuickStartTaskReview.scss +30 -0
  254. package/src/controller/QuickStartTaskReview.tsx +81 -0
  255. package/src/controller/QuickStartTasks.scss +89 -0
  256. package/src/controller/QuickStartTasks.tsx +75 -0
  257. package/src/controller/__tests__/QuickStartConclusion.spec.tsx +95 -0
  258. package/src/controller/__tests__/QuickStartContent.spec.tsx +52 -0
  259. package/src/controller/__tests__/QuickStartFooter.spec.tsx +148 -0
  260. package/src/controller/__tests__/QuickStartTaskHeader.spec.tsx +43 -0
  261. package/src/controller/__tests__/QuickStartTaskReview.spec.tsx +45 -0
  262. package/src/controller/__tests__/QuickStartTasks.spec.tsx +81 -0
  263. package/src/data/mocks/json/explore-pipeline-quickstart.ts +66 -0
  264. package/src/data/mocks/json/explore-serverless-quickstart.ts +90 -0
  265. package/src/data/mocks/json/monitor-sampleapp-quickstart.ts +77 -0
  266. package/src/data/mocks/json/tour-icons.ts +3 -0
  267. package/src/data/mocks/yamls/add-healthchecks-quickstart.yaml +67 -0
  268. package/src/data/mocks/yamls/explore-pipeline-quickstart.yaml +57 -0
  269. package/src/data/mocks/yamls/explore-serverless-quickstart.yaml +83 -0
  270. package/src/data/mocks/yamls/install-associate-pipeline-quickstart.yaml +74 -0
  271. package/src/data/mocks/yamls/monitor-sampleapp-quickstart.yaml +66 -0
  272. package/src/data/mocks/yamls/sample-application-quickstart.yaml +97 -0
  273. package/src/data/mocks/yamls/serverless-application-quickstart.yaml +141 -0
  274. package/src/data/quick-start-test-data.ts +10 -0
  275. package/src/data/test-utils.ts +11 -0
  276. package/src/declaration.d.ts +2 -0
  277. package/src/index.ts +17 -0
  278. package/src/locales/en/quickstart.json +46 -0
  279. package/src/styles/_base.scss +54 -0
  280. package/src/styles/_dark-custom-override.scss +62 -0
  281. package/src/styles/legacy-bootstrap/README.md +21 -0
  282. package/src/styles/legacy-bootstrap/_code.scss +46 -0
  283. package/src/styles/legacy-bootstrap/_tables.scss +38 -0
  284. package/src/styles/legacy-bootstrap/_type.scss +92 -0
  285. package/src/styles/legacy-bootstrap/_variables.scss +48 -0
  286. package/src/styles/legacy-bootstrap.scss +5 -0
  287. package/src/styles/patternfly-global-entry.ts +1 -0
  288. package/src/styles/patternfly-global.scss +28 -0
  289. package/src/styles/patternfly-nested-entry.ts +1 -0
  290. package/src/styles/patternfly-nested.scss +18 -0
  291. package/src/styles/quickstarts-standalone-entry.ts +1 -0
  292. package/src/styles/quickstarts-standalone.scss +7 -0
  293. package/src/styles/style.scss +12 -0
  294. package/src/styles/vendor-entry.ts +1 -0
  295. package/src/styles/vendor.scss +7 -0
  296. package/src/utils/PluralResolver.ts +362 -0
  297. package/src/utils/asciidoc-procedure-parser.ts +130 -0
  298. package/src/utils/const.ts +10 -0
  299. package/src/utils/help-topic-context.tsx +72 -0
  300. package/src/utils/help-topic-types.ts +16 -0
  301. package/src/utils/quick-start-context.tsx +473 -0
  302. package/src/utils/quick-start-types.ts +73 -0
  303. package/src/utils/quick-start-utils.ts +88 -0
  304. package/src/utils/useLocalStorage.ts +38 -0
@@ -0,0 +1,33 @@
1
+ import * as React from 'react';
2
+
3
+ const MEMO = {};
4
+
5
+ export const CamelCaseWrap: React.FC<CamelCaseWrapProps> = ({ value, dataTest }) => {
6
+ if (!value) {
7
+ return '-';
8
+ }
9
+
10
+ if (MEMO[value]) {
11
+ return MEMO[value];
12
+ }
13
+
14
+ // Add word break points before capital letters (but keep consecutive capital letters together).
15
+ const words = value.match(/[A-Z]+[^A-Z]*|[^A-Z]+/g);
16
+ const rendered = (
17
+ <span data-test={dataTest}>
18
+ {words.map((word, i) => (
19
+ <React.Fragment key={i}>
20
+ {word}
21
+ {i !== words.length - 1 && <wbr />}
22
+ </React.Fragment>
23
+ ))}
24
+ </span>
25
+ );
26
+ MEMO[value] = rendered;
27
+ return rendered;
28
+ };
29
+
30
+ export interface CamelCaseWrapProps {
31
+ value: string;
32
+ dataTest?: string;
33
+ }
@@ -0,0 +1,3 @@
1
+ export * from './status-box';
2
+ export * from './router';
3
+ export * from './camel-case-wrap';
@@ -0,0 +1,45 @@
1
+ import { History, createBrowserHistory, createMemoryHistory } from 'history';
2
+ import { QUICKSTART_SEARCH_FILTER_KEY, QUICKSTART_STATUS_FILTER_KEY } from '../../../utils/const';
3
+
4
+ type AppHistory = History & { pushPath: History['push'] };
5
+
6
+ let createHistory;
7
+
8
+ try {
9
+ if (process.env.NODE_ENV === 'test') {
10
+ // Running in node. Can't use browser history
11
+ createHistory = createMemoryHistory;
12
+ } else {
13
+ createHistory = createBrowserHistory;
14
+ }
15
+ } catch (unused) {
16
+ createHistory = createBrowserHistory;
17
+ }
18
+
19
+ export const history: AppHistory = createHistory();
20
+
21
+ export const removeQueryArgument = (k: string) => {
22
+ const params = new URLSearchParams(window.location.search);
23
+ if (params.has(k)) {
24
+ params.delete(k);
25
+ const url = new URL(window.location.href);
26
+ history.replace(`${url.pathname}?${params.toString()}${url.hash}`);
27
+ }
28
+ };
29
+
30
+ export const setQueryArgument = (k: string, v: string) => {
31
+ if (!v) {
32
+ return removeQueryArgument(k);
33
+ }
34
+ const params = new URLSearchParams(window.location.search);
35
+ if (params.get(k) !== v) {
36
+ params.set(k, v);
37
+ const url = new URL(window.location.href);
38
+ history.replace(`${url.pathname}?${params.toString()}${url.hash}`);
39
+ }
40
+ };
41
+
42
+ export const clearFilterParams = () => {
43
+ removeQueryArgument(QUICKSTART_SEARCH_FILTER_KEY);
44
+ removeQueryArgument(QUICKSTART_STATUS_FILTER_KEY);
45
+ };
@@ -0,0 +1,56 @@
1
+ import * as React from 'react';
2
+ import { css } from '@patternfly/react-styles';
3
+ import { QuickStartContext, QuickStartContextValues } from '../../../utils/quick-start-context';
4
+
5
+ export const Box: React.FC<BoxProps> = ({ children, className }) => (
6
+ <div className={css('pfext-status-box', className)}>{children}</div>
7
+ );
8
+
9
+ export const Loading: React.FC<LoadingProps> = ({ className }) => (
10
+ <div className={css('pfext-m-loader', className)}>
11
+ <div className="pfext-m-loader-dot__one" />
12
+ <div className="pfext-m-loader-dot__two" />
13
+ <div className="pfext-m-loader-dot__three" />
14
+ </div>
15
+ );
16
+ Loading.displayName = 'Loading';
17
+
18
+ export const LoadingBox: React.FC<LoadingBoxProps> = ({ className, message }) => (
19
+ <Box className={css('pfext-status-box--loading', className)}>
20
+ <Loading />
21
+ {message && <div className="pfext-status-box__loading-message">{message}</div>}
22
+ </Box>
23
+ );
24
+ LoadingBox.displayName = 'LoadingBox';
25
+
26
+ export const EmptyBox: React.FC<EmptyBoxProps> = ({ label }) => {
27
+ const { getResource } = React.useContext<QuickStartContextValues>(QuickStartContext);
28
+ return (
29
+ <Box>
30
+ <div data-test="empty-message" className="text-center">
31
+ {label
32
+ ? getResource('No {{label}} found').replace('{{label}}', label)
33
+ : getResource('Not found')}
34
+ </div>
35
+ </Box>
36
+ );
37
+ };
38
+ EmptyBox.displayName = 'EmptyBox';
39
+
40
+ interface BoxProps {
41
+ children: React.ReactNode;
42
+ className?: string;
43
+ }
44
+
45
+ interface LoadingProps {
46
+ className?: string;
47
+ }
48
+
49
+ interface LoadingBoxProps {
50
+ className?: string;
51
+ message?: string;
52
+ }
53
+
54
+ interface EmptyBoxProps {
55
+ label?: string;
56
+ }
@@ -0,0 +1,53 @@
1
+ export interface AccessReviewResourceAttributes {
2
+ group?: string;
3
+ resource?: string;
4
+ subresource?: string;
5
+ verb?: K8sVerb;
6
+ name?: string;
7
+ namespace?: string;
8
+ }
9
+
10
+ export type K8sVerb =
11
+ | 'create'
12
+ | 'get'
13
+ | 'list'
14
+ | 'update'
15
+ | 'patch'
16
+ | 'delete'
17
+ | 'deletecollection'
18
+ | 'watch';
19
+
20
+ export interface OwnerReference {
21
+ name: string;
22
+ kind: string;
23
+ uid: string;
24
+ apiVersion: string;
25
+ controller?: boolean;
26
+ blockOwnerDeletion?: boolean;
27
+ }
28
+
29
+ export interface ObjectMetadata {
30
+ name: string;
31
+ annotations?: { [key: string]: string };
32
+ clusterName?: string;
33
+ creationTimestamp?: string;
34
+ deletionGracePeriodSeconds?: number;
35
+ deletionTimestamp?: string;
36
+ finalizers?: string[];
37
+ generateName?: string;
38
+ generation?: number;
39
+ labels?: { [key: string]: string };
40
+ managedFields?: any[];
41
+ namespace?: string;
42
+ ownerReferences?: OwnerReference[];
43
+ resourceVersion?: string;
44
+ uid?: string;
45
+ // language can be: en
46
+ language?: string;
47
+ // country can be: US
48
+ country?: string;
49
+ // locale is a combination of language and country, for example: en_US
50
+ locale?: string;
51
+ // anything else to custom define
52
+ [key: string]: any;
53
+ }
@@ -0,0 +1 @@
1
+ export * from './src';
@@ -0,0 +1,7 @@
1
+ export * from './modal';
2
+ export * from './spotlight';
3
+ export * from './markdown-highlight-extension';
4
+ export * from './markdown-extensions';
5
+ export * from './popper';
6
+ export * from './utils';
7
+ export * from './status';
@@ -0,0 +1,29 @@
1
+ .pfext-page-layout {
2
+ &__content {
3
+ padding: var(--pf-v5-global--spacer--lg);
4
+ flex: 1;
5
+ }
6
+
7
+ &__header {
8
+ padding-top: 1px;
9
+ background-color: var(--pf-v5-global--BackgroundColor--light-100);
10
+ }
11
+
12
+ &__hint {
13
+ padding-left: var(--pf-v5-global--spacer--lg);
14
+ padding-right: var(--pf-v5-global--spacer--lg);
15
+ padding-bottom: var(--pf-v5-global--spacer--md);
16
+ font-size: 14px;
17
+ }
18
+
19
+ &__title {
20
+ padding-left: var(--pf-v5-global--spacer--lg);
21
+ padding-right: var(--pf-v5-global--spacer--lg);
22
+ font-size: var(--pf-v5-global--FontSize--2xl);
23
+ margin-top: 23px;
24
+ margin-bottom: 11.5px;
25
+ font-family: var(--pf-v5-global--FontFamily--heading--sans-serif);
26
+ font-weight: var(--pf-v5-global--FontWeight--normal);
27
+ line-height: 1.1;
28
+ }
29
+ }
@@ -0,0 +1,95 @@
1
+ import * as React from 'react';
2
+ import { Tooltip } from '@patternfly/react-core';
3
+ import { QuickStartContext, QuickStartContextValues } from '@quickstarts/utils/quick-start-context';
4
+ import { useEventListener } from '../../hooks';
5
+ import { MARKDOWN_COPY_BUTTON_ID, MARKDOWN_SNIPPET_ID } from './const';
6
+
7
+ interface CopyClipboardProps {
8
+ element: HTMLElement;
9
+ rootSelector: string;
10
+ docContext: Document;
11
+ }
12
+
13
+ export const CopyClipboard: React.FC<CopyClipboardProps> = ({
14
+ element,
15
+ rootSelector,
16
+ docContext,
17
+ }) => {
18
+ const { getResource } = React.useContext<QuickStartContextValues>(QuickStartContext);
19
+ const [showSuccessContent, setShowSuccessContent] = React.useState<boolean>(false);
20
+ const textToCopy = React.useMemo(() => {
21
+ const copyTextId = element.getAttribute(MARKDOWN_COPY_BUTTON_ID);
22
+ return (
23
+ docContext.querySelector(
24
+ `${rootSelector} [${MARKDOWN_SNIPPET_ID}="${copyTextId}"]`,
25
+ ) as HTMLElement
26
+ )?.innerText;
27
+ }, [element, docContext, rootSelector]);
28
+
29
+ useEventListener(
30
+ element,
31
+ 'click',
32
+ React.useCallback(() => {
33
+ navigator.clipboard
34
+ .writeText(textToCopy.trim())
35
+ .then(() => {
36
+ setShowSuccessContent(true);
37
+ })
38
+ .catch(() => {});
39
+ }, [textToCopy]),
40
+ );
41
+
42
+ useEventListener(
43
+ element,
44
+ 'mouseleave',
45
+ React.useCallback(() => {
46
+ setShowSuccessContent(false);
47
+ }, []),
48
+ );
49
+
50
+ return showSuccessContent ? (
51
+ <Tooltip
52
+ key="after-copy"
53
+ isVisible
54
+ triggerRef={() => element as HTMLElement}
55
+ content={getResource('Successfully copied to clipboard!')}
56
+ className="pfext-quick-start__base"
57
+ />
58
+ ) : (
59
+ <Tooltip
60
+ key="before-copy"
61
+ triggerRef={() => element as HTMLElement}
62
+ content={getResource('Copy to clipboard')}
63
+ className="pfext-quick-start__base"
64
+ />
65
+ );
66
+ };
67
+
68
+ interface MarkdownCopyClipboardProps {
69
+ docContext: Document;
70
+ rootSelector: string;
71
+ }
72
+
73
+ const MarkdownCopyClipboard: React.FC<MarkdownCopyClipboardProps> = ({
74
+ docContext,
75
+ rootSelector,
76
+ }) => {
77
+ const elements = docContext.querySelectorAll(`${rootSelector} [${MARKDOWN_COPY_BUTTON_ID}]`);
78
+ return elements.length > 0 ? (
79
+ <>
80
+ {Array.from(elements).map((elm) => {
81
+ const attributeValue = elm.getAttribute(MARKDOWN_COPY_BUTTON_ID);
82
+ return (
83
+ <CopyClipboard
84
+ key={attributeValue}
85
+ element={elm as HTMLElement}
86
+ rootSelector={rootSelector}
87
+ docContext={docContext}
88
+ />
89
+ );
90
+ })}
91
+ </>
92
+ ) : null;
93
+ };
94
+
95
+ export default MarkdownCopyClipboard;
@@ -0,0 +1,25 @@
1
+ import * as React from 'react';
2
+ import { shallow } from 'enzyme';
3
+ import MarkdownCopyClipboard, { CopyClipboard } from '../MarkdownCopyClipboard';
4
+ import { htmlDocumentForCopyClipboard } from './test-data';
5
+
6
+ describe('MarkdownCopyClipboard', () => {
7
+ beforeAll(() => {
8
+ document.body.innerHTML = htmlDocumentForCopyClipboard;
9
+ });
10
+ it('should render null if no element is found', () => {
11
+ const wrapper = shallow(
12
+ <MarkdownCopyClipboard docContext={document} rootSelector="#copy-markdown-3" />,
13
+ );
14
+ expect(wrapper.isEmptyRender()).toBe(true);
15
+ expect(wrapper.find(CopyClipboard).exists()).toBe(false);
16
+ });
17
+
18
+ it('should render null if no element is found', () => {
19
+ const wrapper = shallow(
20
+ <MarkdownCopyClipboard docContext={document} rootSelector="#copy-markdown-1" />,
21
+ );
22
+ expect(wrapper.isEmptyRender()).toBe(false);
23
+ expect(wrapper.find(CopyClipboard).exists()).toBe(true);
24
+ });
25
+ });
@@ -0,0 +1,5 @@
1
+ import { MARKDOWN_COPY_BUTTON_ID, MARKDOWN_SNIPPET_ID, MARKDOWN_EXECUTE_BUTTON_ID } from '../const';
2
+
3
+ export const htmlDocumentForCopyClipboard = `<div id="copy-markdown-1"><div ${MARKDOWN_SNIPPET_ID}="1234">some test data for testing</div><button ${MARKDOWN_COPY_BUTTON_ID}="1234"</button><div ${MARKDOWN_SNIPPET_ID}="12354">some test data for testing</div><button ${MARKDOWN_COPY_BUTTON_ID}="12354"</button></div>`;
4
+
5
+ export const htmlDocumentForExecuteButton = `<div id="execute-markdown-1"><div ${MARKDOWN_SNIPPET_ID}="1234">some test data for testing</div><button ${MARKDOWN_EXECUTE_BUTTON_ID}="1234"</button><div ${MARKDOWN_SNIPPET_ID}="12354">some test data for testing</div><button ${MARKDOWN_EXECUTE_BUTTON_ID}="12354"</button></div>`;
@@ -0,0 +1,51 @@
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
+ 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 = 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
+ 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
+ interface 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-v5-c-accordion__toggle ${!expanded ? expandedModifier : ''}`;
20
+ contentElement.hidden = expanded;
21
+ contentElement.className = `pf-v5-c-accordion__expanded-content ${
22
+ !expanded ? expandedModifier : ''
23
+ }`;
24
+ setExpanded(!expanded);
25
+ };
26
+
27
+ useEventListener(buttonElement, 'click', handleClick);
28
+
29
+ return <></>;
30
+ };
31
+
32
+ interface accordionRenderExtensionProps {
33
+ docContext: Document;
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;
@@ -0,0 +1,67 @@
1
+ import * as React from 'react';
2
+ import { removeTemplateWhitespace } from './utils';
3
+ import { renderToStaticMarkup } from 'react-dom/server';
4
+ import { Alert } from '@patternfly/react-core';
5
+ import LightbulbIcon from '@patternfly/react-icons/dist/js/icons/lightbulb-icon';
6
+ import FireIcon from '@patternfly/react-icons/dist/js/icons/fire-icon';
7
+ import './showdown-extension.scss';
8
+ import QuickStartMarkdownView from '../../../../QuickStartMarkdownView';
9
+
10
+ enum AdmonitionType {
11
+ TIP = 'TIP',
12
+ NOTE = 'NOTE',
13
+ IMPORTANT = 'IMPORTANT',
14
+ WARNING = 'WARNING',
15
+ CAUTION = 'CAUTION',
16
+ }
17
+
18
+ const admonitionToAlertVariantMap = {
19
+ [AdmonitionType.NOTE]: { variant: 'info' },
20
+ [AdmonitionType.TIP]: { variant: 'default', customIcon: <LightbulbIcon /> },
21
+ [AdmonitionType.IMPORTANT]: { variant: 'danger' },
22
+ [AdmonitionType.CAUTION]: { variant: 'warning', customIcon: <FireIcon /> },
23
+ [AdmonitionType.WARNING]: { variant: 'warning' },
24
+ };
25
+
26
+ const useAdmonitionShowdownExtension = () =>
27
+ // const { getResource } = React.useContext<QuickStartContextValues>(QuickStartContext);
28
+ React.useMemo(
29
+ () => ({
30
+ type: 'lang',
31
+ regex: /\[(.+)]{{(admonition) ([\w-]+)}}/g,
32
+ replace: (
33
+ text: string,
34
+ content: string,
35
+ admonitionLabel: string,
36
+ admonitionType: string,
37
+ groupId: string,
38
+ ): string => {
39
+ if (!content || !admonitionLabel || !admonitionType || !groupId) {
40
+ return text;
41
+ }
42
+ admonitionType = admonitionType.toUpperCase();
43
+
44
+ const { variant, customIcon } = admonitionToAlertVariantMap[admonitionType];
45
+ const style =
46
+ admonitionType === AdmonitionType.CAUTION ? { backgroundColor: '#ec7a0915' } : {};
47
+ const mdContent = <QuickStartMarkdownView content={content} />;
48
+ const pfAlert = (
49
+ <Alert
50
+ variant={variant}
51
+ customIcon={customIcon && customIcon}
52
+ isInline
53
+ title={admonitionType}
54
+ className="pfext-markdown-admonition"
55
+ style={style}
56
+ >
57
+ {mdContent}
58
+ </Alert>
59
+ );
60
+ return removeTemplateWhitespace(renderToStaticMarkup(pfAlert));
61
+ },
62
+ }),
63
+ [],
64
+ )
65
+ ;
66
+
67
+ export default useAdmonitionShowdownExtension;
@@ -0,0 +1,23 @@
1
+ import * as React from 'react';
2
+ import { removeTemplateWhitespace } from './utils';
3
+ import { renderToStaticMarkup } from 'react-dom/server';
4
+ import { CodeBlock } from '@patternfly/react-core';
5
+ import './showdown-extension.scss';
6
+
7
+ const useCodeShowdownExtension = () => React.useMemo(
8
+ () => ({
9
+ type: 'output',
10
+ regex: /<pre><code>(.*?)\n?<\/code><\/pre>/g,
11
+ replace: (text: string, content: string): string => {
12
+ if (!content) {
13
+ return text;
14
+ }
15
+ const pfCodeBlock = <CodeBlock>{content}</CodeBlock>;
16
+
17
+ return removeTemplateWhitespace(renderToStaticMarkup(pfCodeBlock));
18
+ },
19
+ }),
20
+ [],
21
+ );
22
+
23
+ export default useCodeShowdownExtension;
@@ -0,0 +1,5 @@
1
+ export const MARKDOWN_COPY_BUTTON_ID = 'data-copy-for';
2
+ export const MARKDOWN_EXECUTE_BUTTON_ID = 'data-execute-for';
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`;
@@ -0,0 +1,7 @@
1
+ export { default as MarkdownCopyClipboard } from './MarkdownCopyClipboard';
2
+ export { default as useInlineCopyClipboardShowdownExtension } from './inline-clipboard-extension';
3
+ export { default as useMultilineCopyClipboardShowdownExtension } from './multiline-clipboard-extension';
4
+ export { default as useAdmonitionShowdownExtension } from './admonition-extension';
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';
@@ -0,0 +1,39 @@
1
+ import * as React from 'react';
2
+ import { QuickStartContext, QuickStartContextValues } from '@quickstarts/utils/quick-start-context';
3
+ import { MARKDOWN_COPY_BUTTON_ID, MARKDOWN_SNIPPET_ID } from './const';
4
+ import { removeTemplateWhitespace } from './utils';
5
+ import { renderToStaticMarkup } from 'react-dom/server';
6
+ import CopyIcon from '@patternfly/react-icons/dist/js/icons/copy-icon';
7
+ import './showdown-extension.scss';
8
+
9
+ const useInlineCopyClipboardShowdownExtension = () => {
10
+ const { getResource } = React.useContext<QuickStartContextValues>(QuickStartContext);
11
+ return React.useMemo(
12
+ () => ({
13
+ type: 'lang',
14
+ regex: /`([^`](.*?)[^`])`{{copy}}/g,
15
+ replace: (text: string, group: string, _: string, groupId: number): string => {
16
+ if (!group || isNaN(groupId)) {
17
+ return text;
18
+ }
19
+ return removeTemplateWhitespace(
20
+ `<span class="pf-v5-c-clipboard-copy pf-m-inline">
21
+ <span class="pf-v5-c-clipboard-copy__text" ${MARKDOWN_SNIPPET_ID}="${groupId}">${group}</span>
22
+ <span class="pf-v5-c-clipboard-copy__actions">
23
+ <span class="pf-v5-c-clipboard-copy__actions-item">
24
+ <button class="pf-v5-c-button pf-m-plain" aria-label="${getResource(
25
+ 'Copy to clipboard',
26
+ )}" ${MARKDOWN_COPY_BUTTON_ID}="${groupId}">
27
+ ${renderToStaticMarkup(<CopyIcon />)}
28
+ </button>
29
+ </span>
30
+ </span>
31
+ </span>`,
32
+ );
33
+ },
34
+ }),
35
+ [getResource],
36
+ );
37
+ };
38
+
39
+ export default useInlineCopyClipboardShowdownExtension;
@@ -0,0 +1,44 @@
1
+ import * as React from 'react';
2
+ import { QuickStartContext, QuickStartContextValues } from '@quickstarts/utils/quick-start-context';
3
+ import { MARKDOWN_COPY_BUTTON_ID, MARKDOWN_SNIPPET_ID } from './const';
4
+ import { renderToStaticMarkup } from 'react-dom/server';
5
+ import CopyIcon from '@patternfly/react-icons/dist/js/icons/copy-icon';
6
+
7
+ import './showdown-extension.scss';
8
+
9
+ const useMultilineCopyClipboardShowdownExtension = () => {
10
+ const { getResource } = React.useContext<QuickStartContextValues>(QuickStartContext);
11
+ return React.useMemo(
12
+ () => ({
13
+ type: 'lang',
14
+ regex: /```[\n]\s*((((?!```).)*?\n)+)\s*```{{copy}}/g,
15
+ replace: (text: string, group: string, _1: string, _2: string, groupId: number): string => {
16
+ if (!group || isNaN(groupId)) {
17
+ return text;
18
+ }
19
+ return `<div class="pf-v5-c-code-block">
20
+ <div class="pf-v5-c-code-block__header">
21
+ <div class="pf-v5-c-code-block__actions">
22
+ <div class="pf-v5-c-code-block__actions-item">
23
+ <button class="pf-v5-c-button pf-m-plain" type="button" aria-label="${getResource(
24
+ 'Copy to clipboard',
25
+ )}" ${MARKDOWN_COPY_BUTTON_ID}="${groupId}">
26
+ ${renderToStaticMarkup(<CopyIcon />)}
27
+ </button>
28
+ </div>
29
+ </div>
30
+ </div>
31
+ <div class="pf-v5-c-code-block__content">
32
+ <pre class="pf-v5-c-code-block__pre pfext-code-block__pre">
33
+ <code class="pf-v5-c-code-block__code"
34
+ ${MARKDOWN_SNIPPET_ID}="${groupId}">${group.trim()}</code>
35
+ </pre>
36
+ </div>
37
+ </div>`;
38
+ },
39
+ }),
40
+ [getResource],
41
+ );
42
+ };
43
+
44
+ export default useMultilineCopyClipboardShowdownExtension;