@apify/ui-library 0.51.6-featurepublishuilibrary-0a4729.38266

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 (349) hide show
  1. package/.eslintrc +39 -0
  2. package/.stylelintrc +12 -0
  3. package/CHANGELOG.md +2804 -0
  4. package/README.md +15 -0
  5. package/dist/src/components/action_link.d.ts +5 -0
  6. package/dist/src/components/action_link.d.ts.map +1 -0
  7. package/dist/src/components/action_link.jsx +35 -0
  8. package/dist/src/components/action_link.jsx.map +1 -0
  9. package/dist/src/components/actor_template_card.d.ts +10 -0
  10. package/dist/src/components/actor_template_card.d.ts.map +1 -0
  11. package/dist/src/components/actor_template_card.jsx +73 -0
  12. package/dist/src/components/actor_template_card.jsx.map +1 -0
  13. package/dist/src/components/badge.d.ts +26 -0
  14. package/dist/src/components/badge.d.ts.map +1 -0
  15. package/dist/src/components/badge.jsx +96 -0
  16. package/dist/src/components/badge.jsx.map +1 -0
  17. package/dist/src/components/banner.d.ts +11 -0
  18. package/dist/src/components/banner.d.ts.map +1 -0
  19. package/dist/src/components/banner.jsx +73 -0
  20. package/dist/src/components/banner.jsx.map +1 -0
  21. package/dist/src/components/blog_article.d.ts +9 -0
  22. package/dist/src/components/blog_article.d.ts.map +1 -0
  23. package/dist/src/components/blog_article.jsx +73 -0
  24. package/dist/src/components/blog_article.jsx.map +1 -0
  25. package/dist/src/components/box.d.ts +41 -0
  26. package/dist/src/components/box.d.ts.map +1 -0
  27. package/dist/src/components/box.jsx +48 -0
  28. package/dist/src/components/box.jsx.map +1 -0
  29. package/dist/src/components/button.d.ts +35 -0
  30. package/dist/src/components/button.d.ts.map +1 -0
  31. package/dist/src/components/button.jsx +193 -0
  32. package/dist/src/components/button.jsx.map +1 -0
  33. package/dist/src/components/chip.d.ts +52 -0
  34. package/dist/src/components/chip.d.ts.map +1 -0
  35. package/dist/src/components/chip.jsx +89 -0
  36. package/dist/src/components/chip.jsx.map +1 -0
  37. package/dist/src/components/code/action_button.d.ts +11 -0
  38. package/dist/src/components/code/action_button.d.ts.map +1 -0
  39. package/dist/src/components/code/action_button.jsx +67 -0
  40. package/dist/src/components/code/action_button.jsx.map +1 -0
  41. package/dist/src/components/code/code_block/code_block.d.ts +38 -0
  42. package/dist/src/components/code/code_block/code_block.d.ts.map +1 -0
  43. package/dist/src/components/code/code_block/code_block.jsx +99 -0
  44. package/dist/src/components/code/code_block/code_block.jsx.map +1 -0
  45. package/dist/src/components/code/code_block/code_block.styled.d.ts +13 -0
  46. package/dist/src/components/code/code_block/code_block.styled.d.ts.map +1 -0
  47. package/dist/src/components/code/code_block/code_block.styled.jsx +215 -0
  48. package/dist/src/components/code/code_block/code_block.styled.jsx.map +1 -0
  49. package/dist/src/components/code/code_block/utils.d.ts +2 -0
  50. package/dist/src/components/code/code_block/utils.d.ts.map +1 -0
  51. package/dist/src/components/code/code_block/utils.js +20 -0
  52. package/dist/src/components/code/code_block/utils.js.map +1 -0
  53. package/dist/src/components/code/index.d.ts +4 -0
  54. package/dist/src/components/code/index.d.ts.map +1 -0
  55. package/dist/src/components/code/index.js +4 -0
  56. package/dist/src/components/code/index.js.map +1 -0
  57. package/dist/src/components/code/inline_code/inline_code.d.ts +11 -0
  58. package/dist/src/components/code/inline_code/inline_code.d.ts.map +1 -0
  59. package/dist/src/components/code/inline_code/inline_code.jsx +24 -0
  60. package/dist/src/components/code/inline_code/inline_code.jsx.map +1 -0
  61. package/dist/src/components/code/one_line_code/one_line_code.d.ts +27 -0
  62. package/dist/src/components/code/one_line_code/one_line_code.d.ts.map +1 -0
  63. package/dist/src/components/code/one_line_code/one_line_code.jsx +157 -0
  64. package/dist/src/components/code/one_line_code/one_line_code.jsx.map +1 -0
  65. package/dist/src/components/code/syntax_highlighter.d.ts +16 -0
  66. package/dist/src/components/code/syntax_highlighter.d.ts.map +1 -0
  67. package/dist/src/components/code/syntax_highlighter.jsx +94 -0
  68. package/dist/src/components/code/syntax_highlighter.jsx.map +1 -0
  69. package/dist/src/components/color_wheel_gradient.d.ts +9 -0
  70. package/dist/src/components/color_wheel_gradient.d.ts.map +1 -0
  71. package/dist/src/components/color_wheel_gradient.jsx +23 -0
  72. package/dist/src/components/color_wheel_gradient.jsx.map +1 -0
  73. package/dist/src/components/floating/index.d.ts +4 -0
  74. package/dist/src/components/floating/index.d.ts.map +1 -0
  75. package/dist/src/components/floating/index.js +4 -0
  76. package/dist/src/components/floating/index.js.map +1 -0
  77. package/dist/src/components/floating/menu.d.ts +33 -0
  78. package/dist/src/components/floating/menu.d.ts.map +1 -0
  79. package/dist/src/components/floating/menu.jsx +95 -0
  80. package/dist/src/components/floating/menu.jsx.map +1 -0
  81. package/dist/src/components/floating/menu_common.d.ts +42 -0
  82. package/dist/src/components/floating/menu_common.d.ts.map +1 -0
  83. package/dist/src/components/floating/menu_common.jsx +20 -0
  84. package/dist/src/components/floating/menu_common.jsx.map +1 -0
  85. package/dist/src/components/floating/menu_components.d.ts +29 -0
  86. package/dist/src/components/floating/menu_components.d.ts.map +1 -0
  87. package/dist/src/components/floating/menu_components.jsx +73 -0
  88. package/dist/src/components/floating/menu_components.jsx.map +1 -0
  89. package/dist/src/components/image.d.ts +12 -0
  90. package/dist/src/components/image.d.ts.map +1 -0
  91. package/dist/src/components/image.jsx +8 -0
  92. package/dist/src/components/image.jsx.map +1 -0
  93. package/dist/src/components/index.d.ts +21 -0
  94. package/dist/src/components/index.d.ts.map +1 -0
  95. package/dist/src/components/index.js +21 -0
  96. package/dist/src/components/index.js.map +1 -0
  97. package/dist/src/components/link.d.ts +24 -0
  98. package/dist/src/components/link.d.ts.map +1 -0
  99. package/dist/src/components/link.jsx +67 -0
  100. package/dist/src/components/link.jsx.map +1 -0
  101. package/dist/src/components/message.d.ts +31 -0
  102. package/dist/src/components/message.d.ts.map +1 -0
  103. package/dist/src/components/message.jsx +105 -0
  104. package/dist/src/components/message.jsx.map +1 -0
  105. package/dist/src/components/readme_renderer/index.d.ts +4 -0
  106. package/dist/src/components/readme_renderer/index.d.ts.map +1 -0
  107. package/dist/src/components/readme_renderer/index.js +4 -0
  108. package/dist/src/components/readme_renderer/index.js.map +1 -0
  109. package/dist/src/components/readme_renderer/pythonize_value.d.ts +3 -0
  110. package/dist/src/components/readme_renderer/pythonize_value.d.ts.map +1 -0
  111. package/dist/src/components/readme_renderer/pythonize_value.js +81 -0
  112. package/dist/src/components/readme_renderer/pythonize_value.js.map +1 -0
  113. package/dist/src/components/readme_renderer/table_of_contents.d.ts +10 -0
  114. package/dist/src/components/readme_renderer/table_of_contents.d.ts.map +1 -0
  115. package/dist/src/components/readme_renderer/table_of_contents.jsx +197 -0
  116. package/dist/src/components/readme_renderer/table_of_contents.jsx.map +1 -0
  117. package/dist/src/components/readme_renderer/utils.d.ts +6 -0
  118. package/dist/src/components/readme_renderer/utils.d.ts.map +1 -0
  119. package/dist/src/components/readme_renderer/utils.jsx +42 -0
  120. package/dist/src/components/readme_renderer/utils.jsx.map +1 -0
  121. package/dist/src/components/simple_markdown/index.d.ts +3 -0
  122. package/dist/src/components/simple_markdown/index.d.ts.map +1 -0
  123. package/dist/src/components/simple_markdown/index.jsx +3 -0
  124. package/dist/src/components/simple_markdown/index.jsx.map +1 -0
  125. package/dist/src/components/simple_markdown/simple_markdown.d.ts +16 -0
  126. package/dist/src/components/simple_markdown/simple_markdown.d.ts.map +1 -0
  127. package/dist/src/components/simple_markdown/simple_markdown.jsx +137 -0
  128. package/dist/src/components/simple_markdown/simple_markdown.jsx.map +1 -0
  129. package/dist/src/components/simple_markdown/simple_markdown_components.d.ts +26 -0
  130. package/dist/src/components/simple_markdown/simple_markdown_components.d.ts.map +1 -0
  131. package/dist/src/components/simple_markdown/simple_markdown_components.jsx +193 -0
  132. package/dist/src/components/simple_markdown/simple_markdown_components.jsx.map +1 -0
  133. package/dist/src/components/tag.d.ts +38 -0
  134. package/dist/src/components/tag.d.ts.map +1 -0
  135. package/dist/src/components/tag.jsx +126 -0
  136. package/dist/src/components/tag.jsx.map +1 -0
  137. package/dist/src/components/text/heading_content.d.ts +10 -0
  138. package/dist/src/components/text/heading_content.d.ts.map +1 -0
  139. package/dist/src/components/text/heading_content.jsx +31 -0
  140. package/dist/src/components/text/heading_content.jsx.map +1 -0
  141. package/dist/src/components/text/heading_marketing.d.ts +10 -0
  142. package/dist/src/components/text/heading_marketing.d.ts.map +1 -0
  143. package/dist/src/components/text/heading_marketing.jsx +31 -0
  144. package/dist/src/components/text/heading_marketing.jsx.map +1 -0
  145. package/dist/src/components/text/heading_shared.d.ts +10 -0
  146. package/dist/src/components/text/heading_shared.d.ts.map +1 -0
  147. package/dist/src/components/text/heading_shared.jsx +32 -0
  148. package/dist/src/components/text/heading_shared.jsx.map +1 -0
  149. package/dist/src/components/text/index.d.ts +12 -0
  150. package/dist/src/components/text/index.d.ts.map +1 -0
  151. package/dist/src/components/text/index.js +11 -0
  152. package/dist/src/components/text/index.js.map +1 -0
  153. package/dist/src/components/text/text_base.d.ts +13 -0
  154. package/dist/src/components/text/text_base.d.ts.map +1 -0
  155. package/dist/src/components/text/text_base.jsx +23 -0
  156. package/dist/src/components/text/text_base.jsx.map +1 -0
  157. package/dist/src/components/text/text_content.d.ts +11 -0
  158. package/dist/src/components/text/text_content.d.ts.map +1 -0
  159. package/dist/src/components/text/text_content.jsx +68 -0
  160. package/dist/src/components/text/text_content.jsx.map +1 -0
  161. package/dist/src/components/text/text_marketing.d.ts +11 -0
  162. package/dist/src/components/text/text_marketing.d.ts.map +1 -0
  163. package/dist/src/components/text/text_marketing.jsx +116 -0
  164. package/dist/src/components/text/text_marketing.jsx.map +1 -0
  165. package/dist/src/components/text/text_shared.d.ts +14 -0
  166. package/dist/src/components/text/text_shared.d.ts.map +1 -0
  167. package/dist/src/components/text/text_shared.jsx +55 -0
  168. package/dist/src/components/text/text_shared.jsx.map +1 -0
  169. package/dist/src/components/tile/horizontal_tile.d.ts +9 -0
  170. package/dist/src/components/tile/horizontal_tile.d.ts.map +1 -0
  171. package/dist/src/components/tile/horizontal_tile.jsx +43 -0
  172. package/dist/src/components/tile/horizontal_tile.jsx.map +1 -0
  173. package/dist/src/components/tile/index.d.ts +3 -0
  174. package/dist/src/components/tile/index.d.ts.map +1 -0
  175. package/dist/src/components/tile/index.js +3 -0
  176. package/dist/src/components/tile/index.js.map +1 -0
  177. package/dist/src/components/tile/shared.d.ts +17 -0
  178. package/dist/src/components/tile/shared.d.ts.map +1 -0
  179. package/dist/src/components/tile/shared.js +12 -0
  180. package/dist/src/components/tile/shared.js.map +1 -0
  181. package/dist/src/components/tile/vertical_tile.d.ts +10 -0
  182. package/dist/src/components/tile/vertical_tile.d.ts.map +1 -0
  183. package/dist/src/components/tile/vertical_tile.jsx +32 -0
  184. package/dist/src/components/tile/vertical_tile.jsx.map +1 -0
  185. package/dist/src/components/to_consolidate/card.d.ts +27 -0
  186. package/dist/src/components/to_consolidate/card.d.ts.map +1 -0
  187. package/dist/src/components/to_consolidate/card.jsx +93 -0
  188. package/dist/src/components/to_consolidate/card.jsx.map +1 -0
  189. package/dist/src/components/to_consolidate/index.d.ts +5 -0
  190. package/dist/src/components/to_consolidate/index.d.ts.map +1 -0
  191. package/dist/src/components/to_consolidate/index.js +5 -0
  192. package/dist/src/components/to_consolidate/index.js.map +1 -0
  193. package/dist/src/components/to_consolidate/markdown.d.ts +40 -0
  194. package/dist/src/components/to_consolidate/markdown.d.ts.map +1 -0
  195. package/dist/src/components/to_consolidate/markdown.jsx +454 -0
  196. package/dist/src/components/to_consolidate/markdown.jsx.map +1 -0
  197. package/dist/src/components/to_consolidate/pagination.d.ts +8 -0
  198. package/dist/src/components/to_consolidate/pagination.d.ts.map +1 -0
  199. package/dist/src/components/to_consolidate/pagination.jsx +88 -0
  200. package/dist/src/components/to_consolidate/pagination.jsx.map +1 -0
  201. package/dist/src/components/to_consolidate/tab_number_chip.d.ts +7 -0
  202. package/dist/src/components/to_consolidate/tab_number_chip.d.ts.map +1 -0
  203. package/dist/src/components/to_consolidate/tab_number_chip.jsx +22 -0
  204. package/dist/src/components/to_consolidate/tab_number_chip.jsx.map +1 -0
  205. package/dist/src/design_system/colors_theme.d.ts +213 -0
  206. package/dist/src/design_system/colors_theme.d.ts.map +1 -0
  207. package/dist/src/design_system/colors_theme.js +213 -0
  208. package/dist/src/design_system/colors_theme.js.map +1 -0
  209. package/dist/src/design_system/properties_theme.d.ts +175 -0
  210. package/dist/src/design_system/properties_theme.d.ts.map +1 -0
  211. package/dist/src/design_system/properties_theme.js +315 -0
  212. package/dist/src/design_system/properties_theme.js.map +1 -0
  213. package/dist/src/design_system/theme.d.ts +630 -0
  214. package/dist/src/design_system/theme.d.ts.map +1 -0
  215. package/dist/src/design_system/theme.js +17 -0
  216. package/dist/src/design_system/theme.js.map +1 -0
  217. package/dist/src/design_system/tokens/index.d.ts +6 -0
  218. package/dist/src/design_system/tokens/index.d.ts.map +1 -0
  219. package/dist/src/design_system/tokens/index.js +6 -0
  220. package/dist/src/design_system/tokens/index.js.map +1 -0
  221. package/dist/src/design_system/tokens/layouts.d.ts +29 -0
  222. package/dist/src/design_system/tokens/layouts.d.ts.map +1 -0
  223. package/dist/src/design_system/tokens/layouts.js +29 -0
  224. package/dist/src/design_system/tokens/layouts.js.map +1 -0
  225. package/dist/src/design_system/tokens/radiuses.d.ts +23 -0
  226. package/dist/src/design_system/tokens/radiuses.d.ts.map +1 -0
  227. package/dist/src/design_system/tokens/radiuses.js +23 -0
  228. package/dist/src/design_system/tokens/radiuses.js.map +1 -0
  229. package/dist/src/design_system/tokens/shadows.d.ts +23 -0
  230. package/dist/src/design_system/tokens/shadows.d.ts.map +1 -0
  231. package/dist/src/design_system/tokens/shadows.js +23 -0
  232. package/dist/src/design_system/tokens/shadows.js.map +1 -0
  233. package/dist/src/design_system/tokens/spaces.d.ts +15 -0
  234. package/dist/src/design_system/tokens/spaces.d.ts.map +1 -0
  235. package/dist/src/design_system/tokens/spaces.js +14 -0
  236. package/dist/src/design_system/tokens/spaces.js.map +1 -0
  237. package/dist/src/design_system/tokens/transitions.d.ts +20 -0
  238. package/dist/src/design_system/tokens/transitions.d.ts.map +1 -0
  239. package/dist/src/design_system/tokens/transitions.js +20 -0
  240. package/dist/src/design_system/tokens/transitions.js.map +1 -0
  241. package/dist/src/design_system/typography_theme.d.ts +189 -0
  242. package/dist/src/design_system/typography_theme.d.ts.map +1 -0
  243. package/dist/src/design_system/typography_theme.js +190 -0
  244. package/dist/src/design_system/typography_theme.js.map +1 -0
  245. package/dist/src/index.d.ts +7 -0
  246. package/dist/src/index.d.ts.map +1 -0
  247. package/dist/src/index.js +7 -0
  248. package/dist/src/index.js.map +1 -0
  249. package/dist/src/type_utils.d.ts +6 -0
  250. package/dist/src/type_utils.d.ts.map +1 -0
  251. package/dist/src/type_utils.js +2 -0
  252. package/dist/src/type_utils.js.map +1 -0
  253. package/dist/src/ui_dependency_provider.d.ts +29 -0
  254. package/dist/src/ui_dependency_provider.d.ts.map +1 -0
  255. package/dist/src/ui_dependency_provider.jsx +14 -0
  256. package/dist/src/ui_dependency_provider.jsx.map +1 -0
  257. package/dist/src/utils/copy_to_clipboard.d.ts +7 -0
  258. package/dist/src/utils/copy_to_clipboard.d.ts.map +1 -0
  259. package/dist/src/utils/copy_to_clipboard.js +16 -0
  260. package/dist/src/utils/copy_to_clipboard.js.map +1 -0
  261. package/dist/src/utils/image_color.d.ts +7 -0
  262. package/dist/src/utils/image_color.d.ts.map +1 -0
  263. package/dist/src/utils/image_color.js +35 -0
  264. package/dist/src/utils/image_color.js.map +1 -0
  265. package/dist/src/utils/index.d.ts +4 -0
  266. package/dist/src/utils/index.d.ts.map +1 -0
  267. package/dist/src/utils/index.js +4 -0
  268. package/dist/src/utils/index.js.map +1 -0
  269. package/dist/src/utils/sanitization.d.ts +11 -0
  270. package/dist/src/utils/sanitization.d.ts.map +1 -0
  271. package/dist/src/utils/sanitization.js +16 -0
  272. package/dist/src/utils/sanitization.js.map +1 -0
  273. package/dist/tsconfig.build.tsbuildinfo +1 -0
  274. package/package.json +71 -0
  275. package/src/codemods/generate_color_property_tokens.mjs +97 -0
  276. package/src/codemods/generate_color_theme_files.mjs +46 -0
  277. package/src/codemods/generate_typograpy_tokens_files.mjs +136 -0
  278. package/src/components/action_link.tsx +59 -0
  279. package/src/components/actor_template_card.tsx +99 -0
  280. package/src/components/badge.tsx +144 -0
  281. package/src/components/banner.tsx +95 -0
  282. package/src/components/blog_article.tsx +85 -0
  283. package/src/components/box.tsx +127 -0
  284. package/src/components/button.tsx +303 -0
  285. package/src/components/chip.tsx +121 -0
  286. package/src/components/code/action_button.tsx +96 -0
  287. package/src/components/code/code_block/code_block.styled.tsx +228 -0
  288. package/src/components/code/code_block/code_block.tsx +235 -0
  289. package/src/components/code/code_block/utils.ts +19 -0
  290. package/src/components/code/index.ts +3 -0
  291. package/src/components/code/inline_code/inline_code.tsx +44 -0
  292. package/src/components/code/one_line_code/one_line_code.tsx +232 -0
  293. package/src/components/code/syntax_highlighter.tsx +125 -0
  294. package/src/components/color_wheel_gradient.tsx +31 -0
  295. package/src/components/floating/index.ts +3 -0
  296. package/src/components/floating/menu.tsx +191 -0
  297. package/src/components/floating/menu_common.tsx +31 -0
  298. package/src/components/floating/menu_components.tsx +94 -0
  299. package/src/components/image.tsx +23 -0
  300. package/src/components/index.ts +20 -0
  301. package/src/components/link.tsx +114 -0
  302. package/src/components/message.tsx +157 -0
  303. package/src/components/readme_renderer/index.ts +3 -0
  304. package/src/components/readme_renderer/pythonize_value.ts +78 -0
  305. package/src/components/readme_renderer/table_of_contents.tsx +257 -0
  306. package/src/components/readme_renderer/utils.tsx +46 -0
  307. package/src/components/simple_markdown/index.tsx +2 -0
  308. package/src/components/simple_markdown/simple_markdown.tsx +181 -0
  309. package/src/components/simple_markdown/simple_markdown_components.tsx +295 -0
  310. package/src/components/tag.tsx +185 -0
  311. package/src/components/text/heading_content.tsx +56 -0
  312. package/src/components/text/heading_marketing.tsx +55 -0
  313. package/src/components/text/heading_shared.tsx +57 -0
  314. package/src/components/text/index.ts +18 -0
  315. package/src/components/text/text_base.tsx +52 -0
  316. package/src/components/text/text_content.tsx +104 -0
  317. package/src/components/text/text_marketing.tsx +152 -0
  318. package/src/components/text/text_shared.tsx +96 -0
  319. package/src/components/tile/horizontal_tile.tsx +76 -0
  320. package/src/components/tile/index.ts +2 -0
  321. package/src/components/tile/shared.ts +27 -0
  322. package/src/components/tile/vertical_tile.tsx +58 -0
  323. package/src/components/to_consolidate/card.tsx +141 -0
  324. package/src/components/to_consolidate/index.ts +4 -0
  325. package/src/components/to_consolidate/markdown.tsx +593 -0
  326. package/src/components/to_consolidate/pagination.tsx +139 -0
  327. package/src/components/to_consolidate/tab_number_chip.tsx +31 -0
  328. package/src/design_system/colors_theme.ts +213 -0
  329. package/src/design_system/generate_color_definitions.js +43 -0
  330. package/src/design_system/properties_theme.ts +453 -0
  331. package/src/design_system/supernova_color_tokens.json +1766 -0
  332. package/src/design_system/supernova_typography_tokens.json +657 -0
  333. package/src/design_system/theme.ts +26 -0
  334. package/src/design_system/tokens/index.ts +5 -0
  335. package/src/design_system/tokens/layouts.ts +29 -0
  336. package/src/design_system/tokens/radiuses.ts +22 -0
  337. package/src/design_system/tokens/shadows.ts +22 -0
  338. package/src/design_system/tokens/spaces.ts +15 -0
  339. package/src/design_system/tokens/transitions.ts +19 -0
  340. package/src/design_system/typography_theme.ts +197 -0
  341. package/src/index.ts +7 -0
  342. package/src/type_utils.ts +7 -0
  343. package/src/ui_dependency_provider.tsx +50 -0
  344. package/src/utils/copy_to_clipboard.ts +24 -0
  345. package/src/utils/image_color.ts +44 -0
  346. package/src/utils/index.ts +3 -0
  347. package/src/utils/sanitization.ts +14 -0
  348. package/tsconfig.build.json +18 -0
  349. package/tsconfig.json +10 -0
@@ -0,0 +1,257 @@
1
+ import _ from 'lodash';
2
+ import React, {
3
+ useMemo,
4
+ useCallback,
5
+ } from 'react';
6
+ import ReactMarkdown from 'react-markdown';
7
+ import type { AllowElement } from 'react-markdown/lib/rehype-filter';
8
+ import remarkToc from 'remark-toc';
9
+ import styled from 'styled-components';
10
+
11
+ import { theme } from '../../design_system/theme';
12
+ import { inlineCodeStyles } from '../code';
13
+ import { Link } from '../link';
14
+ import { Text } from '../text';
15
+ import { cleanMarkdown, slugifyHeadingChildren } from './utils';
16
+
17
+ const TOC_HEADING_ID = 'Contents';
18
+
19
+ const StyledTOCLink = styled(Text)`
20
+ display: inline-block;
21
+ color: ${theme.color.neutral.textMuted};
22
+ text-decoration: none;
23
+
24
+ /* Do no change the font style if the heading is defined as bold in the markdown and is wrapped in a <strong> tag */
25
+ strong {
26
+ font-size: inherit !important;
27
+ line-height: inherit !important;
28
+ font-weight: inherit !important;
29
+ }
30
+
31
+ &:hover, &.selected {
32
+ color: ${theme.color.primary.text} !important;
33
+ }
34
+
35
+ &:before {
36
+ content: " ";
37
+ display: inline-block;
38
+ height: 100%;
39
+ left: 0;
40
+ margin-top: -1px;
41
+ position: absolute;
42
+ width: 1px;
43
+ background-color: ${theme.color.neutral.border};
44
+ }
45
+
46
+ &.selected:before {
47
+ background-color: ${theme.color.primary.text};
48
+ }
49
+ `;
50
+
51
+ const StyledTableOfContents = styled.div`
52
+ position: relative;
53
+ overflow: hidden;
54
+
55
+ p {
56
+ margin: 0;
57
+ }
58
+
59
+ .level-3 a {
60
+ color: ${theme.color.neutral.textSubtle};
61
+ }
62
+
63
+ ul {
64
+ padding-left: ${theme.space.space8} !important;
65
+ list-style: none;
66
+ margin: 0;
67
+ overflow-y: auto;
68
+
69
+ &.level-3 {
70
+ padding-left: ${theme.space.space16} !important;
71
+ max-height: 0;
72
+ overflow: hidden;
73
+ transition: all .3s ease-in-out;
74
+
75
+ &.expanded {
76
+ max-height: 1000px;
77
+ }
78
+ }
79
+ }
80
+
81
+ .inline-code {
82
+ ${inlineCodeStyles}
83
+ }
84
+ `;
85
+
86
+ interface CustomHTMLAnchorElement extends Omit<HTMLAnchorElement, 'children' | 'parentNode'> {
87
+ hash: string;
88
+ tagName: string;
89
+ type: string;
90
+ parentNode: any;
91
+ }
92
+
93
+ const handleScroll = (anchors: CustomHTMLAnchorElement[] | null, headlines: HTMLElement[], anchorLists: HTMLUListElement[] | null, headingOffsetPx: number) => {
94
+ if (!anchors || !headlines) return;
95
+
96
+ // Items that are past scroll
97
+ const headlinesPastScrollPosition = headlines.filter((headline) => {
98
+ return headline.getBoundingClientRect().top - headingOffsetPx < 0;
99
+ });
100
+
101
+ // Last item that is past the scroll is current in view. If no headline is past the scroll, let's select the first one
102
+ const currentHeadlineId = headlinesPastScrollPosition[headlinesPastScrollPosition.length - 1]?.id || headlines[0]?.id;
103
+
104
+ // Highlighting anchor of current headline
105
+ if (currentHeadlineId) {
106
+ const currentHash = `#${currentHeadlineId}`;
107
+
108
+ anchorLists?.forEach((anchorList) => anchorList.classList.remove('expanded'));
109
+
110
+ // Remove selected class from all anchors and only add it to the current one
111
+ anchors.forEach((anchor) => {
112
+ anchor.classList.remove('selected');
113
+ if (anchor.hash === currentHash) {
114
+ anchor.classList.add('selected');
115
+
116
+ const grandparent = anchor.parentNode?.parentNode;
117
+
118
+ // Structure of the table of content is normalized so we can figure out if section should be expanded
119
+ // by tag and className of neighboring nodes. There are two cases:
120
+
121
+ // 1) If h2 is selected, we want to expand its section with h3 headings
122
+ if (grandparent?.tagName === 'LI' && grandparent.children[1]?.tagName === 'UL' && grandparent.children[1]?.classList.contains('level-3')) {
123
+ grandparent.children[1].classList.add('expanded');
124
+ }
125
+
126
+ // 2) We also want to expand section of h3 headings that follow h1 right away
127
+ if (grandparent?.tagName === 'UL' && grandparent.classList.contains('level-3')) {
128
+ grandparent.classList.add('expanded');
129
+ }
130
+ }
131
+ });
132
+ }
133
+ };
134
+
135
+ const assignHeadingLevelsRecursively = ({ children, tagName, properties }: any, level: number) => {
136
+ if (level > 3) return;
137
+ if (tagName === 'ul') {
138
+ properties.className = `level-${level}`; // assign level className
139
+ level += 1; // increase current heading level;
140
+ }
141
+
142
+ children?.forEach((child: { type: string }) => {
143
+ // We only care about ul and li elements - we don't need to traverse any other
144
+ if (child.type === 'element' && (tagName === 'ul' || tagName === 'li')) {
145
+ assignHeadingLevelsRecursively(child, level);
146
+ }
147
+ });
148
+ };
149
+
150
+ export interface TableOfContentsProps {
151
+ markdown: string;
152
+ headingOffsetPx?: number; // How far from the top should the toc detect the current heading
153
+ // Function where we can define which elements are allowed in the markdown. See https://github.com/remarkjs/react-markdown#props for more info
154
+ allowElement?: AllowElement;
155
+ }
156
+
157
+ const TableOfContents = ({
158
+ markdown,
159
+ headingOffsetPx = 10,
160
+ allowElement,
161
+ ...rest
162
+ }: TableOfContentsProps) => {
163
+ const cleanedMarkdown = useMemo(() => {
164
+ const cleanedMarkdownString = cleanMarkdown(markdown);
165
+ return `### ${TOC_HEADING_ID}\n${cleanedMarkdownString}`;
166
+ }, [markdown]);
167
+
168
+ const hasTopLevelHeading = useMemo(() => !!cleanedMarkdown.match(/^#\s.+$/m), [cleanedMarkdown]);
169
+
170
+ const tocRef = useCallback((node: HTMLElement | null) => {
171
+ const anchors = node ? Array.from(node.querySelectorAll('a')) : null;
172
+ const anchorLists = node ? Array.from(node.querySelectorAll('ul')) : null;
173
+ const headlines = (anchors || [])
174
+ .map((anchor) => document.getElementById(anchor.hash.substr(1)))
175
+ .filter((headline) => headline !== undefined && headline !== null) as HTMLElement[];
176
+
177
+ const scrollHandler = () => handleScroll(anchors, headlines, anchorLists, headingOffsetPx);
178
+
179
+ // Callback refs cannot return cleanup functions - but they are called again with null on unmount
180
+ if (node) {
181
+ window.addEventListener('scroll', scrollHandler);
182
+ } else {
183
+ window.removeEventListener('scroll', scrollHandler);
184
+ }
185
+ scrollHandler(); // call for the first time so we select the first heading without scrolling
186
+ }, [headingOffsetPx]);
187
+
188
+ return (
189
+ <StyledTableOfContents ref={tocRef} {...rest}>
190
+ <ReactMarkdown
191
+ allowElement={allowElement}
192
+ remarkPlugins={[
193
+ [remarkToc, { heading: TOC_HEADING_ID, maxDepth: 3 }],
194
+ () => ({ children, ...nodeRest }) => {
195
+ // TOC plug-ins only inject content table to existing markdown documents - only generating it is not a common use-case
196
+ // To make is happen, we can just take the generated node where toc is located and throw away the rest.
197
+ // children[0] is the heading where toc is placed (that's plug-in's requirement)
198
+ // children[1] is the generated table of contents we can simply pick
199
+
200
+ let tocContentNode = children[1];
201
+
202
+ // If there is no H1 heading in the readme then assignHeadingLevelsRecursively does not work correctly.
203
+ // We need to 'normalize' the final node to have all the levels we expect
204
+ // - solution is to wrap the content in extra node that mimic this H1 group that remarkToc would normally create
205
+ if (!hasTopLevelHeading) {
206
+ tocContentNode = {
207
+ type: 'list',
208
+ ordered: false,
209
+ spread: false,
210
+ children: [
211
+ {
212
+ type: 'listItem',
213
+ spread: true,
214
+ children: [
215
+ tocContentNode,
216
+ ],
217
+ },
218
+ ],
219
+ };
220
+ }
221
+
222
+ return {
223
+ ...nodeRest,
224
+ children: [
225
+ tocContentNode,
226
+ ],
227
+ };
228
+ },
229
+ ]}
230
+ rehypePlugins={[() => (input) => {
231
+ // this plug-in already works with html node representation so we can assign classNames that we need
232
+ // in order to allow hiding blocks with h3 headings that are out of the viewport
233
+ assignHeadingLevelsRecursively(input.children[0], 1);
234
+ return input;
235
+ }]}
236
+ components={{
237
+ a: ({ children }) => (
238
+ <StyledTOCLink
239
+ forwardedAs={Link}
240
+ to={`#${slugifyHeadingChildren(children)}`}
241
+ py={'space4'}
242
+ >
243
+ {children}
244
+ </StyledTOCLink>
245
+ ),
246
+ code: ({ children }) => (
247
+ <code className="inline-code">{children}</code>
248
+ ),
249
+ }}
250
+ >
251
+ {cleanedMarkdown}
252
+ </ReactMarkdown>
253
+ </StyledTableOfContents>
254
+ );
255
+ };
256
+
257
+ export default React.memo(TableOfContents, (prevProps, nextProps) => _.isEqual(prevProps, nextProps));
@@ -0,0 +1,46 @@
1
+ import React, { useCallback } from 'react';
2
+ import type { AllowElement } from 'react-markdown/lib/rehype-filter';
3
+ import slugify from 'slugify';
4
+
5
+ export const slugifyHeadingChildren = (
6
+ headingChildren: React.ReactNode,
7
+ ): string | undefined => {
8
+ if (!headingChildren) return undefined;
9
+
10
+ const slugs: string[] = [];
11
+ React.Children.forEach(headingChildren, (child) => {
12
+ if (typeof child === 'string') {
13
+ slugs.push(slugify(child, { lower: true, strict: true }));
14
+ } else if (React.isValidElement(child) && child.props.children) {
15
+ const nestedSlugs = slugifyHeadingChildren(child.props.children);
16
+ if (nestedSlugs) slugs.push(nestedSlugs);
17
+ }
18
+ });
19
+
20
+ return slugs.join('-');
21
+ };
22
+
23
+ export const cleanMarkdown = (markdown: string, removeFirstH1?: boolean): string => {
24
+ // Remove the table of contents as we are generating our own
25
+ let clean = markdown
26
+ .replace(/<!-- toc start -->.*?<!-- toc end -->/s, '')
27
+ .replace(/##.*content.*?\n*<!-- toc -->(.|[\r\n])*<!-- tocstop -->\n*/, '');
28
+
29
+ // Remove first h1 if removeFirstH1 is true
30
+ if (removeFirstH1) clean = clean.replace(removeFirstH1 ? /^#\s.+$/m : '', '');
31
+
32
+ return clean.trim();
33
+ };
34
+
35
+ // This removes the first element if it's a `h1` containing exactly the Actor title
36
+ export const useActorTitleHeadingFilter = (actorTitle: string): AllowElement => {
37
+ return useCallback((element, index, parent) => {
38
+ if (parent.type === 'root'
39
+ && index === 0
40
+ && element.tagName === 'h1'
41
+ && element.children.length === 1
42
+ && element.children[0].type === 'text'
43
+ && element.children[0].value?.toLowerCase() === actorTitle.toLowerCase()) return false;
44
+ return true;
45
+ }, [actorTitle]);
46
+ };
@@ -0,0 +1,2 @@
1
+ export * from './simple_markdown';
2
+ export * from './simple_markdown_components';
@@ -0,0 +1,181 @@
1
+ import React, { useCallback, useMemo, useRef } from 'react';
2
+ import type { Components } from 'react-markdown';
3
+ import ReactMarkdown, { uriTransformer } from 'react-markdown';
4
+ import type { ReactMarkdownOptions } from 'react-markdown/lib/react-markdown';
5
+ import rehypeRaw from 'rehype-raw';
6
+ import rehypeSanitize from 'rehype-sanitize';
7
+ import remarkGfm from 'remark-gfm';
8
+ import styled from 'styled-components';
9
+
10
+ import { theme } from '../../design_system/theme';
11
+ import { useSharedUiDependencies } from '../../ui_dependency_provider';
12
+ import { Box } from '../box';
13
+ import { isUrlExternal } from '../link';
14
+ import { cleanMarkdown } from '../readme_renderer/utils';
15
+ import { Heading, Text } from '../text';
16
+ import { HeadingContent } from '../text/heading_content';
17
+ import { TextContent } from '../text/text_content';
18
+ import {
19
+ MarkdownBlockQuote,
20
+ MarkdownCode,
21
+ MarkdownLink,
22
+ MarkdownTable,
23
+ } from './simple_markdown_components';
24
+
25
+ export type SimpleMarkdownComponents = Components;
26
+
27
+ const StyledMarkdown = styled(ReactMarkdown)`
28
+ scroll-margin-top: 10px;
29
+
30
+ @font-face {
31
+ font-family: "ellipsis-font";
32
+ src: local("Courier");
33
+ unicode-range: U+2026;
34
+ size-adjust: 0%;
35
+ }
36
+
37
+ img {
38
+ max-width: 100%;
39
+ }
40
+
41
+ hr {
42
+ color: ${theme.color.neutral.border};
43
+ }
44
+ `;
45
+
46
+ export const defaultRehypePlugins = [rehypeRaw];
47
+ export const defaultRemarkPlugins = [remarkGfm];
48
+ export const defaultAllowedElements = [
49
+ 'a',
50
+ 'b',
51
+ 'blockquote',
52
+ 'br',
53
+ 'center',
54
+ 'code',
55
+ 'del',
56
+ 'em',
57
+ 'h1',
58
+ 'h2',
59
+ 'h3',
60
+ 'h4',
61
+ 'h5',
62
+ 'hr',
63
+ 'i',
64
+ 'img',
65
+ 'li',
66
+ 'ol',
67
+ 'p',
68
+ 'pre',
69
+ 'span',
70
+ 'strong',
71
+ 'table',
72
+ 'tbody',
73
+ 'td',
74
+ 'tfoot',
75
+ 'th',
76
+ 'thead',
77
+ 'tr',
78
+ 'u',
79
+ 'ul',
80
+ ];
81
+
82
+ // TODO: Add Image component
83
+ const regularMarkdownSizeComponents: Components = {
84
+ h1: ({ children }) => <HeadingContent mt='space32' mb='space16' type='heading1'>{children}</HeadingContent>,
85
+ h2: ({ children }) => <HeadingContent mt='space32' mb='space16' type='heading2'>{children}</HeadingContent>,
86
+ h3: ({ children }) => <HeadingContent mt='space32' mb='space16' type='heading3'>{children}</HeadingContent>,
87
+ h4: ({ children }) => <HeadingContent mt='space32' mb='space16' type='heading4'>{children}</HeadingContent>,
88
+ h5: ({ children }) => <HeadingContent mt='space32' mb='space16' type='heading5'>{children}</HeadingContent>,
89
+ h6: ({ children }) => <HeadingContent mt='space32' mb='space16' type='heading6'>{children}</HeadingContent>,
90
+ p: ({ children }) => (<TextContent my='space16'>{children}</TextContent>),
91
+ strong: ({ children }) => <TextContent as='strong' weight='bold'>{children}</TextContent>,
92
+ b: ({ children }) => <TextContent as='b' weight='bold'>{children}</TextContent>,
93
+ th: ({ children }) => <TextContent as='th' weight='bold'>{children}</TextContent>,
94
+ blockquote: ({ children }) => <MarkdownBlockQuote>{children}</MarkdownBlockQuote>,
95
+ table: ({ children }) => <MarkdownTable>{children}</MarkdownTable>,
96
+ ul: ({ children }) => <Box as='ul' pl='space32'>{children}</Box>,
97
+ ol: ({ children, start }) => <Box as='ol' pl='space32' start={start}>{children}</Box>,
98
+ li: ({ children }) => <Box as='li' mt='space4'>{children}</Box>,
99
+ a: ({ children, href }) => <MarkdownLink to={href}>{children}</MarkdownLink>,
100
+ code: ({ children, inline }) => <MarkdownCode inline={inline} size='regular'>{children}</MarkdownCode>,
101
+ };
102
+
103
+ const smallMarkdownSizeComponents: Components = {
104
+ h1: ({ children }) => <Heading mt='space32' mb='space16' type='title2xl'>{children}</Heading>,
105
+ h2: ({ children }) => <Heading mt='space32' mb='space16' type='titleXl'>{children}</Heading>,
106
+ h3: ({ children }) => <Heading mt='space32' mb='space16' type='titleL'>{children}</Heading>,
107
+ h4: ({ children }) => <Heading mt='space32' mb='space16' type='titleM'>{children}</Heading>,
108
+ h5: ({ children }) => <Heading mt='space32' mb='space16' type='titleS'>{children}</Heading>,
109
+ h6: ({ children }) => <Heading mt='space32' mb='space16' type='titleXs'>{children}</Heading>,
110
+ p: ({ children }) => (<Text my='space16'>{children}</Text>),
111
+ strong: ({ children }) => <Text as='strong' weight='bold'>{children}</Text>,
112
+ b: ({ children }) => <Text as='b' weight='bold'>{children}</Text>,
113
+ th: ({ children }) => <Text as='th' weight='bold'>{children}</Text>,
114
+ blockquote: ({ children }) => <MarkdownBlockQuote>{children}</MarkdownBlockQuote>,
115
+ table: ({ children }) => <MarkdownTable>{children}</MarkdownTable>,
116
+ ul: ({ children }) => <Box as='ul' pl='space32'>{children}</Box>,
117
+ ol: ({ children, start }) => <Box as='ol' pl='space32' start={start}>{children}</Box>,
118
+ li: ({ children }) => <Box as='li' mt='space4'>{children}</Box>,
119
+ a: ({ children, href }) => <MarkdownLink to={href}>{children}</MarkdownLink>,
120
+ code: ({ children, inline }) => <MarkdownCode inline={inline} size='small'>{children}</MarkdownCode>,
121
+ };
122
+
123
+ type MarkdownSize = 'regular' | 'small';
124
+
125
+ interface SimpleMarkdownProps extends ReactMarkdownOptions {
126
+ size?: MarkdownSize,
127
+ }
128
+
129
+ const useDefaultUrlTransform = () => {
130
+ const { windowLocationHost } = useSharedUiDependencies();
131
+
132
+ return useCallback((url: string) => {
133
+ if (!isUrlExternal(url, windowLocationHost)) {
134
+ // We want to make sure internal links will be relative links without https://host at the beginning because Link doesn't work with these
135
+ return url.replace(/^(https?:\/\/)?(www\.)?[^/]+/, '') || '/';
136
+ }
137
+
138
+ return url;
139
+ }, [windowLocationHost]);
140
+ };
141
+
142
+ export const SimpleMarkdown: React.FC<SimpleMarkdownProps> = ({
143
+ size = 'regular', // small is default for console
144
+ children: markdown,
145
+ components,
146
+ rehypePlugins,
147
+ remarkPlugins,
148
+ transformLinkUri,
149
+ allowedElements,
150
+ ...rest
151
+ }) => {
152
+ const cleanedMarkdown = useMemo(() => cleanMarkdown(markdown), [markdown]);
153
+
154
+ const effectiveComponents = useRef({
155
+ ...(size === 'regular' ? regularMarkdownSizeComponents : smallMarkdownSizeComponents),
156
+ ...components,
157
+ });
158
+
159
+ const rehypePluginsRef = useRef([
160
+ ...(rehypePlugins || defaultRehypePlugins),
161
+ rehypeSanitize, // lets always sanitize the output
162
+ ]);
163
+
164
+ const defaultUrlTransform = useDefaultUrlTransform();
165
+
166
+ return (
167
+ <StyledMarkdown
168
+ components={effectiveComponents.current}
169
+ rehypePlugins={rehypePluginsRef.current}
170
+ remarkPlugins={remarkPlugins || defaultRemarkPlugins}
171
+ allowedElements={allowedElements || defaultAllowedElements}
172
+ transformLinkUri={(href, children, title) => {
173
+ const transformed = transformLinkUri ? transformLinkUri(href, children, title) : defaultUrlTransform(href);
174
+ return uriTransformer(transformed);
175
+ }}
176
+ {...rest}
177
+ >
178
+ {cleanedMarkdown}
179
+ </StyledMarkdown>
180
+ );
181
+ };