@a-little-world/little-world-design-system 2.10.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 (488) hide show
  1. package/.babelrc +7 -0
  2. package/.storybook/main.ts +36 -0
  3. package/.storybook/preview-head.html +6 -0
  4. package/.storybook/preview.ts +15 -0
  5. package/.turbo/turbo-build.log +14 -0
  6. package/CHANGELOG.md +398 -0
  7. package/LICENSE +21 -0
  8. package/README.md +180 -0
  9. package/__mocks__/focus-trap-react.tsx +1 -0
  10. package/__mocks__/svg.tsx +6 -0
  11. package/dist/cjs/components/Accordion/Accordion.d.ts +15 -0
  12. package/dist/cjs/components/Accordion/Accordion.js +20 -0
  13. package/dist/cjs/components/Accordion/styles.d.ts +18 -0
  14. package/dist/cjs/components/Accordion/styles.js +100 -0
  15. package/dist/cjs/components/Button/Button.d.ts +9 -0
  16. package/dist/cjs/components/Button/Button.js +17 -0
  17. package/dist/cjs/components/Button/styles.d.ts +16 -0
  18. package/dist/cjs/components/Button/styles.js +313 -0
  19. package/dist/cjs/components/Card/Card.d.ts +11 -0
  20. package/dist/cjs/components/Card/Card.js +108 -0
  21. package/dist/cjs/components/Checkbox/Checkbox.d.ts +15 -0
  22. package/dist/cjs/components/Checkbox/Checkbox.js +24 -0
  23. package/dist/cjs/components/Checkbox/styles.d.ts +27 -0
  24. package/dist/cjs/components/Checkbox/styles.js +108 -0
  25. package/dist/cjs/components/CheckboxGrid/CheckboxGrid.d.ts +22 -0
  26. package/dist/cjs/components/CheckboxGrid/CheckboxGrid.js +73 -0
  27. package/dist/cjs/components/CheckboxGrid/styles.d.ts +64 -0
  28. package/dist/cjs/components/CheckboxGrid/styles.js +137 -0
  29. package/dist/cjs/components/Dropdown/Dropdown.d.ts +25 -0
  30. package/dist/cjs/components/Dropdown/Dropdown.js +70 -0
  31. package/dist/cjs/components/Dropdown/styles.d.ts +15 -0
  32. package/dist/cjs/components/Dropdown/styles.js +145 -0
  33. package/dist/cjs/components/Icon/Icon.d.ts +10 -0
  34. package/dist/cjs/components/Icon/Icon.js +82 -0
  35. package/dist/cjs/components/Icon/IconGradient.d.ts +4 -0
  36. package/dist/cjs/components/Icon/IconGradient.js +29 -0
  37. package/dist/cjs/components/Icon/createIconComponent.d.ts +10 -0
  38. package/dist/cjs/components/Icon/createIconComponent.js +31 -0
  39. package/dist/cjs/components/Icon/getDefaultIconProps.d.ts +2 -0
  40. package/dist/cjs/components/Icon/getDefaultIconProps.js +15 -0
  41. package/dist/cjs/components/Icon/index.d.ts +553 -0
  42. package/dist/cjs/components/Icon/index.js +342 -0
  43. package/dist/cjs/components/Illustrations/Illustration.d.ts +3 -0
  44. package/dist/cjs/components/Illustrations/Illustration.js +12 -0
  45. package/dist/cjs/components/Illustrations/createIllustrationComponent.d.ts +10 -0
  46. package/dist/cjs/components/Illustrations/createIllustrationComponent.js +23 -0
  47. package/dist/cjs/components/Illustrations/index.d.ts +152 -0
  48. package/dist/cjs/components/Illustrations/index.js +81 -0
  49. package/dist/cjs/components/InputError/InputError.d.ts +15 -0
  50. package/dist/cjs/components/InputError/InputError.js +79 -0
  51. package/dist/cjs/components/Label/Label.d.ts +10 -0
  52. package/dist/cjs/components/Label/Label.js +68 -0
  53. package/dist/cjs/components/Link/Link.d.ts +6 -0
  54. package/dist/cjs/components/Link/Link.js +48 -0
  55. package/dist/cjs/components/Link/styles.d.ts +22 -0
  56. package/dist/cjs/components/Link/styles.js +99 -0
  57. package/dist/cjs/components/Loading/Loading.d.ts +10 -0
  58. package/dist/cjs/components/Loading/Loading.js +27 -0
  59. package/dist/cjs/components/Loading/LoadingLogo.d.ts +8 -0
  60. package/dist/cjs/components/Loading/LoadingLogo.js +31 -0
  61. package/dist/cjs/components/Loading/styles.d.ts +15 -0
  62. package/dist/cjs/components/Loading/styles.js +107 -0
  63. package/dist/cjs/components/Modal/Modal.d.ts +20 -0
  64. package/dist/cjs/components/Modal/Modal.js +95 -0
  65. package/dist/cjs/components/Modal/styles.d.ts +4 -0
  66. package/dist/cjs/components/Modal/styles.js +102 -0
  67. package/dist/cjs/components/MultiCheckbox/MultiCheckbox.d.ts +15 -0
  68. package/dist/cjs/components/MultiCheckbox/MultiCheckbox.js +61 -0
  69. package/dist/cjs/components/MultiCheckbox/styles.d.ts +1 -0
  70. package/dist/cjs/components/MultiCheckbox/styles.js +15 -0
  71. package/dist/cjs/components/MultiDropdown/MultiDropdown.d.ts +28 -0
  72. package/dist/cjs/components/MultiDropdown/MultiDropdown.js +124 -0
  73. package/dist/cjs/components/MultiDropdown/styles.d.ts +7 -0
  74. package/dist/cjs/components/MultiDropdown/styles.js +44 -0
  75. package/dist/cjs/components/MultiSelection/MultiSelection.d.ts +16 -0
  76. package/dist/cjs/components/MultiSelection/MultiSelection.js +62 -0
  77. package/dist/cjs/components/MultiSelection/styles.d.ts +9 -0
  78. package/dist/cjs/components/MultiSelection/styles.js +99 -0
  79. package/dist/cjs/components/NavigationMenu/NavigationMenu.d.ts +35 -0
  80. package/dist/cjs/components/NavigationMenu/NavigationMenu.js +85 -0
  81. package/dist/cjs/components/NavigationMenu/styles.d.ts +81 -0
  82. package/dist/cjs/components/NavigationMenu/styles.js +296 -0
  83. package/dist/cjs/components/Popover/InfoPopover.d.ts +8 -0
  84. package/dist/cjs/components/Popover/InfoPopover.js +46 -0
  85. package/dist/cjs/components/Popover/Popover.d.ts +16 -0
  86. package/dist/cjs/components/Popover/Popover.js +61 -0
  87. package/dist/cjs/components/Popover/styles.d.ts +14 -0
  88. package/dist/cjs/components/Popover/styles.js +116 -0
  89. package/dist/cjs/components/ProgressBar/ProgressBar.d.ts +8 -0
  90. package/dist/cjs/components/ProgressBar/ProgressBar.js +85 -0
  91. package/dist/cjs/components/RadioGroup/RadioGroup.d.ts +16 -0
  92. package/dist/cjs/components/RadioGroup/RadioGroup.js +24 -0
  93. package/dist/cjs/components/RadioGroup/styles.d.ts +12 -0
  94. package/dist/cjs/components/RadioGroup/styles.js +126 -0
  95. package/dist/cjs/components/Separator/Separator.d.ts +11 -0
  96. package/dist/cjs/components/Separator/Separator.js +61 -0
  97. package/dist/cjs/components/Separator/styles.d.ts +6 -0
  98. package/dist/cjs/components/Separator/styles.js +57 -0
  99. package/dist/cjs/components/Slider/Slider.d.ts +12 -0
  100. package/dist/cjs/components/Slider/Slider.js +17 -0
  101. package/dist/cjs/components/Slider/styles.d.ts +6 -0
  102. package/dist/cjs/components/Slider/styles.js +57 -0
  103. package/dist/cjs/components/StarRating/StarRating.d.ts +22 -0
  104. package/dist/cjs/components/StarRating/StarRating.js +143 -0
  105. package/dist/cjs/components/StarRating/styles.d.ts +35 -0
  106. package/dist/cjs/components/StarRating/styles.js +104 -0
  107. package/dist/cjs/components/StatusMessage/StatusMessage.d.ts +4 -0
  108. package/dist/cjs/components/StatusMessage/StatusMessage.js +112 -0
  109. package/dist/cjs/components/Switch/Switch.d.ts +15 -0
  110. package/dist/cjs/components/Switch/Switch.js +19 -0
  111. package/dist/cjs/components/Switch/styles.d.ts +14 -0
  112. package/dist/cjs/components/Switch/styles.js +99 -0
  113. package/dist/cjs/components/Tags/Tags.d.ts +15 -0
  114. package/dist/cjs/components/Tags/Tags.js +17 -0
  115. package/dist/cjs/components/Tags/styles.d.ts +19 -0
  116. package/dist/cjs/components/Tags/styles.js +119 -0
  117. package/dist/cjs/components/Text/Text.d.ts +11 -0
  118. package/dist/cjs/components/Text/Text.js +13 -0
  119. package/dist/cjs/components/Text/styles.d.ts +8 -0
  120. package/dist/cjs/components/Text/styles.js +98 -0
  121. package/dist/cjs/components/Text/types.d.ts +8 -0
  122. package/dist/cjs/components/Text/types.js +2 -0
  123. package/dist/cjs/components/TextArea/TextArea.d.ts +19 -0
  124. package/dist/cjs/components/TextArea/TextArea.js +84 -0
  125. package/dist/cjs/components/TextArea/styles.d.ts +22 -0
  126. package/dist/cjs/components/TextArea/styles.js +81 -0
  127. package/dist/cjs/components/TextContent/TextContent.d.ts +28 -0
  128. package/dist/cjs/components/TextContent/TextContent.js +46 -0
  129. package/dist/cjs/components/TextContent/styles.d.ts +24 -0
  130. package/dist/cjs/components/TextContent/styles.js +75 -0
  131. package/dist/cjs/components/TextInput/TextInput.d.ts +8 -0
  132. package/dist/cjs/components/TextInput/TextInput.js +49 -0
  133. package/dist/cjs/components/TextInput/styles.d.ts +18 -0
  134. package/dist/cjs/components/TextInput/styles.js +150 -0
  135. package/dist/cjs/components/Toast/Toast.d.ts +5 -0
  136. package/dist/cjs/components/Toast/Toast.js +90 -0
  137. package/dist/cjs/components/Toast/styles.d.ts +27 -0
  138. package/dist/cjs/components/Toast/styles.js +164 -0
  139. package/dist/cjs/components/Tooltip/Tooltip.d.ts +9 -0
  140. package/dist/cjs/components/Tooltip/Tooltip.js +55 -0
  141. package/dist/cjs/components/Tooltip/styles.d.ts +2 -0
  142. package/dist/cjs/components/Tooltip/styles.js +24 -0
  143. package/dist/cjs/components/Widget/AttachmentWidget.d.ts +18 -0
  144. package/dist/cjs/components/Widget/AttachmentWidget.js +124 -0
  145. package/dist/cjs/components/Widget/CallWidget.d.ts +11 -0
  146. package/dist/cjs/components/Widget/CallWidget.js +84 -0
  147. package/dist/cjs/components/Widget/Widget.d.ts +26 -0
  148. package/dist/cjs/components/Widget/Widget.js +87 -0
  149. package/dist/cjs/globalStyles.d.ts +5 -0
  150. package/dist/cjs/globalStyles.js +66 -0
  151. package/dist/cjs/hooks/useAutosizeTextArea.d.ts +2 -0
  152. package/dist/cjs/hooks/useAutosizeTextArea.js +14 -0
  153. package/dist/cjs/index.d.ts +51 -0
  154. package/dist/cjs/index.js +139 -0
  155. package/dist/cjs/storybook/BreakpointDocumentation.d.ts +3 -0
  156. package/dist/cjs/storybook/BreakpointDocumentation.js +139 -0
  157. package/dist/cjs/storybook/Components.d.ts +2 -0
  158. package/dist/cjs/storybook/Components.js +30 -0
  159. package/dist/cjs/storybook/Documentation.d.ts +5 -0
  160. package/dist/cjs/storybook/Documentation.js +67 -0
  161. package/dist/cjs/storybook/RadiusDocumentation.d.ts +3 -0
  162. package/dist/cjs/storybook/RadiusDocumentation.js +150 -0
  163. package/dist/cjs/storybook/SpacingDocumentation.d.ts +3 -0
  164. package/dist/cjs/storybook/SpacingDocumentation.js +146 -0
  165. package/dist/cjs/theme/index.d.ts +17 -0
  166. package/dist/cjs/theme/index.js +90 -0
  167. package/dist/cjs/utils/animations.d.ts +12 -0
  168. package/dist/cjs/utils/animations.js +120 -0
  169. package/dist/cjs/utils/createReactSvg.d.ts +3 -0
  170. package/dist/cjs/utils/createReactSvg.js +77 -0
  171. package/dist/cjs/utils/parser.d.ts +12 -0
  172. package/dist/cjs/utils/parser.js +200 -0
  173. package/dist/cjs/utils/replaceUrlsWithAnchors.d.ts +6 -0
  174. package/dist/cjs/utils/replaceUrlsWithAnchors.js +32 -0
  175. package/dist/cjs/utils/status.d.ts +6 -0
  176. package/dist/cjs/utils/status.js +54 -0
  177. package/dist/cjs/utils/styles.d.ts +1 -0
  178. package/dist/cjs/utils/styles.js +5 -0
  179. package/dist/cjs/utils/types.d.ts +1 -0
  180. package/dist/cjs/utils/types.js +2 -0
  181. package/dist/esm/components/Accordion/Accordion.d.ts +15 -0
  182. package/dist/esm/components/Accordion/Accordion.js +14 -0
  183. package/dist/esm/components/Accordion/styles.d.ts +18 -0
  184. package/dist/esm/components/Accordion/styles.js +61 -0
  185. package/dist/esm/components/Button/Button.d.ts +9 -0
  186. package/dist/esm/components/Button/Button.js +10 -0
  187. package/dist/esm/components/Button/styles.d.ts +16 -0
  188. package/dist/esm/components/Button/styles.js +277 -0
  189. package/dist/esm/components/Card/Card.d.ts +11 -0
  190. package/dist/esm/components/Card/Card.js +66 -0
  191. package/dist/esm/components/Checkbox/Checkbox.d.ts +15 -0
  192. package/dist/esm/components/Checkbox/Checkbox.js +17 -0
  193. package/dist/esm/components/Checkbox/styles.d.ts +27 -0
  194. package/dist/esm/components/Checkbox/styles.js +69 -0
  195. package/dist/esm/components/CheckboxGrid/CheckboxGrid.d.ts +22 -0
  196. package/dist/esm/components/CheckboxGrid/CheckboxGrid.js +35 -0
  197. package/dist/esm/components/CheckboxGrid/styles.d.ts +64 -0
  198. package/dist/esm/components/CheckboxGrid/styles.js +98 -0
  199. package/dist/esm/components/Dropdown/Dropdown.d.ts +25 -0
  200. package/dist/esm/components/Dropdown/Dropdown.js +32 -0
  201. package/dist/esm/components/Dropdown/styles.d.ts +15 -0
  202. package/dist/esm/components/Dropdown/styles.js +106 -0
  203. package/dist/esm/components/Icon/Icon.d.ts +10 -0
  204. package/dist/esm/components/Icon/Icon.js +42 -0
  205. package/dist/esm/components/Icon/IconGradient.d.ts +4 -0
  206. package/dist/esm/components/Icon/IconGradient.js +24 -0
  207. package/dist/esm/components/Icon/createIconComponent.d.ts +10 -0
  208. package/dist/esm/components/Icon/createIconComponent.js +24 -0
  209. package/dist/esm/components/Icon/getDefaultIconProps.d.ts +2 -0
  210. package/dist/esm/components/Icon/getDefaultIconProps.js +11 -0
  211. package/dist/esm/components/Icon/index.d.ts +553 -0
  212. package/dist/esm/components/Icon/index.js +338 -0
  213. package/dist/esm/components/Illustrations/Illustration.d.ts +3 -0
  214. package/dist/esm/components/Illustrations/Illustration.js +5 -0
  215. package/dist/esm/components/Illustrations/createIllustrationComponent.d.ts +10 -0
  216. package/dist/esm/components/Illustrations/createIllustrationComponent.js +16 -0
  217. package/dist/esm/components/Illustrations/index.d.ts +152 -0
  218. package/dist/esm/components/Illustrations/index.js +78 -0
  219. package/dist/esm/components/InputError/InputError.d.ts +15 -0
  220. package/dist/esm/components/InputError/InputError.js +40 -0
  221. package/dist/esm/components/Label/Label.d.ts +10 -0
  222. package/dist/esm/components/Label/Label.js +30 -0
  223. package/dist/esm/components/Link/Link.d.ts +6 -0
  224. package/dist/esm/components/Link/Link.js +13 -0
  225. package/dist/esm/components/Link/styles.d.ts +22 -0
  226. package/dist/esm/components/Link/styles.js +63 -0
  227. package/dist/esm/components/Loading/Loading.d.ts +10 -0
  228. package/dist/esm/components/Loading/Loading.js +21 -0
  229. package/dist/esm/components/Loading/LoadingLogo.d.ts +8 -0
  230. package/dist/esm/components/Loading/LoadingLogo.js +26 -0
  231. package/dist/esm/components/Loading/styles.d.ts +15 -0
  232. package/dist/esm/components/Loading/styles.js +71 -0
  233. package/dist/esm/components/Modal/Modal.d.ts +20 -0
  234. package/dist/esm/components/Modal/Modal.js +59 -0
  235. package/dist/esm/components/Modal/styles.d.ts +4 -0
  236. package/dist/esm/components/Modal/styles.js +63 -0
  237. package/dist/esm/components/MultiCheckbox/MultiCheckbox.d.ts +15 -0
  238. package/dist/esm/components/MultiCheckbox/MultiCheckbox.js +23 -0
  239. package/dist/esm/components/MultiCheckbox/styles.d.ts +1 -0
  240. package/dist/esm/components/MultiCheckbox/styles.js +9 -0
  241. package/dist/esm/components/MultiDropdown/MultiDropdown.d.ts +28 -0
  242. package/dist/esm/components/MultiDropdown/MultiDropdown.js +86 -0
  243. package/dist/esm/components/MultiDropdown/styles.d.ts +7 -0
  244. package/dist/esm/components/MultiDropdown/styles.js +38 -0
  245. package/dist/esm/components/MultiSelection/MultiSelection.d.ts +16 -0
  246. package/dist/esm/components/MultiSelection/MultiSelection.js +24 -0
  247. package/dist/esm/components/MultiSelection/styles.d.ts +9 -0
  248. package/dist/esm/components/MultiSelection/styles.js +63 -0
  249. package/dist/esm/components/NavigationMenu/NavigationMenu.d.ts +35 -0
  250. package/dist/esm/components/NavigationMenu/NavigationMenu.js +40 -0
  251. package/dist/esm/components/NavigationMenu/styles.d.ts +81 -0
  252. package/dist/esm/components/NavigationMenu/styles.js +257 -0
  253. package/dist/esm/components/Popover/InfoPopover.d.ts +8 -0
  254. package/dist/esm/components/Popover/InfoPopover.js +8 -0
  255. package/dist/esm/components/Popover/Popover.d.ts +16 -0
  256. package/dist/esm/components/Popover/Popover.js +22 -0
  257. package/dist/esm/components/Popover/styles.d.ts +14 -0
  258. package/dist/esm/components/Popover/styles.js +80 -0
  259. package/dist/esm/components/ProgressBar/ProgressBar.d.ts +8 -0
  260. package/dist/esm/components/ProgressBar/ProgressBar.js +47 -0
  261. package/dist/esm/components/RadioGroup/RadioGroup.d.ts +16 -0
  262. package/dist/esm/components/RadioGroup/RadioGroup.js +19 -0
  263. package/dist/esm/components/RadioGroup/styles.d.ts +12 -0
  264. package/dist/esm/components/RadioGroup/styles.js +90 -0
  265. package/dist/esm/components/Separator/Separator.d.ts +11 -0
  266. package/dist/esm/components/Separator/Separator.js +23 -0
  267. package/dist/esm/components/Separator/styles.d.ts +6 -0
  268. package/dist/esm/components/Separator/styles.js +51 -0
  269. package/dist/esm/components/Slider/Slider.d.ts +12 -0
  270. package/dist/esm/components/Slider/Slider.js +12 -0
  271. package/dist/esm/components/Slider/styles.d.ts +6 -0
  272. package/dist/esm/components/Slider/styles.js +51 -0
  273. package/dist/esm/components/StarRating/StarRating.d.ts +22 -0
  274. package/dist/esm/components/StarRating/StarRating.js +107 -0
  275. package/dist/esm/components/StarRating/styles.d.ts +35 -0
  276. package/dist/esm/components/StarRating/styles.js +65 -0
  277. package/dist/esm/components/StatusMessage/StatusMessage.d.ts +4 -0
  278. package/dist/esm/components/StatusMessage/StatusMessage.js +74 -0
  279. package/dist/esm/components/Switch/Switch.d.ts +15 -0
  280. package/dist/esm/components/Switch/Switch.js +14 -0
  281. package/dist/esm/components/Switch/styles.d.ts +14 -0
  282. package/dist/esm/components/Switch/styles.js +63 -0
  283. package/dist/esm/components/Tags/Tags.d.ts +15 -0
  284. package/dist/esm/components/Tags/Tags.js +10 -0
  285. package/dist/esm/components/Tags/styles.d.ts +19 -0
  286. package/dist/esm/components/Tags/styles.js +80 -0
  287. package/dist/esm/components/Text/Text.d.ts +11 -0
  288. package/dist/esm/components/Text/Text.js +8 -0
  289. package/dist/esm/components/Text/styles.d.ts +8 -0
  290. package/dist/esm/components/Text/styles.js +62 -0
  291. package/dist/esm/components/Text/types.d.ts +8 -0
  292. package/dist/esm/components/Text/types.js +1 -0
  293. package/dist/esm/components/TextArea/TextArea.d.ts +19 -0
  294. package/dist/esm/components/TextArea/TextArea.js +45 -0
  295. package/dist/esm/components/TextArea/styles.d.ts +22 -0
  296. package/dist/esm/components/TextArea/styles.js +42 -0
  297. package/dist/esm/components/TextContent/TextContent.d.ts +28 -0
  298. package/dist/esm/components/TextContent/TextContent.js +40 -0
  299. package/dist/esm/components/TextContent/styles.d.ts +24 -0
  300. package/dist/esm/components/TextContent/styles.js +36 -0
  301. package/dist/esm/components/TextInput/TextInput.d.ts +8 -0
  302. package/dist/esm/components/TextInput/TextInput.js +42 -0
  303. package/dist/esm/components/TextInput/styles.d.ts +18 -0
  304. package/dist/esm/components/TextInput/styles.js +111 -0
  305. package/dist/esm/components/Toast/Toast.d.ts +5 -0
  306. package/dist/esm/components/Toast/Toast.js +54 -0
  307. package/dist/esm/components/Toast/styles.d.ts +27 -0
  308. package/dist/esm/components/Toast/styles.js +125 -0
  309. package/dist/esm/components/Tooltip/Tooltip.d.ts +9 -0
  310. package/dist/esm/components/Tooltip/Tooltip.js +16 -0
  311. package/dist/esm/components/Tooltip/styles.d.ts +2 -0
  312. package/dist/esm/components/Tooltip/styles.js +18 -0
  313. package/dist/esm/components/Widget/AttachmentWidget.d.ts +18 -0
  314. package/dist/esm/components/Widget/AttachmentWidget.js +85 -0
  315. package/dist/esm/components/Widget/CallWidget.d.ts +11 -0
  316. package/dist/esm/components/Widget/CallWidget.js +46 -0
  317. package/dist/esm/components/Widget/Widget.d.ts +26 -0
  318. package/dist/esm/components/Widget/Widget.js +46 -0
  319. package/dist/esm/globalStyles.d.ts +5 -0
  320. package/dist/esm/globalStyles.js +64 -0
  321. package/dist/esm/hooks/useAutosizeTextArea.d.ts +2 -0
  322. package/dist/esm/hooks/useAutosizeTextArea.js +12 -0
  323. package/dist/esm/index.d.ts +51 -0
  324. package/dist/esm/index.js +45 -0
  325. package/dist/esm/storybook/BreakpointDocumentation.d.ts +3 -0
  326. package/dist/esm/storybook/BreakpointDocumentation.js +101 -0
  327. package/dist/esm/storybook/Components.d.ts +2 -0
  328. package/dist/esm/storybook/Components.js +23 -0
  329. package/dist/esm/storybook/Documentation.d.ts +5 -0
  330. package/dist/esm/storybook/Documentation.js +62 -0
  331. package/dist/esm/storybook/RadiusDocumentation.d.ts +3 -0
  332. package/dist/esm/storybook/RadiusDocumentation.js +112 -0
  333. package/dist/esm/storybook/SpacingDocumentation.d.ts +3 -0
  334. package/dist/esm/storybook/SpacingDocumentation.js +108 -0
  335. package/dist/esm/theme/index.d.ts +17 -0
  336. package/dist/esm/theme/index.js +53 -0
  337. package/dist/esm/utils/animations.d.ts +12 -0
  338. package/dist/esm/utils/animations.js +117 -0
  339. package/dist/esm/utils/createReactSvg.d.ts +3 -0
  340. package/dist/esm/utils/createReactSvg.js +70 -0
  341. package/dist/esm/utils/parser.d.ts +12 -0
  342. package/dist/esm/utils/parser.js +195 -0
  343. package/dist/esm/utils/replaceUrlsWithAnchors.d.ts +6 -0
  344. package/dist/esm/utils/replaceUrlsWithAnchors.js +29 -0
  345. package/dist/esm/utils/status.d.ts +6 -0
  346. package/dist/esm/utils/status.js +49 -0
  347. package/dist/esm/utils/styles.d.ts +1 -0
  348. package/dist/esm/utils/styles.js +1 -0
  349. package/dist/esm/utils/types.d.ts +1 -0
  350. package/dist/esm/utils/types.js +1 -0
  351. package/jest.config.ts +30 -0
  352. package/package.json +98 -0
  353. package/src/components/Accordion/Accordion.stories.tsx +66 -0
  354. package/src/components/Accordion/Accordion.tsx +59 -0
  355. package/src/components/Accordion/styles.tsx +68 -0
  356. package/src/components/Button/Button.stories.tsx +119 -0
  357. package/src/components/Button/Button.tsx +59 -0
  358. package/src/components/Button/styles.tsx +313 -0
  359. package/src/components/Card/Card.stories.tsx +22 -0
  360. package/src/components/Card/Card.tsx +125 -0
  361. package/src/components/Checkbox/Checkbox.stories.tsx +11 -0
  362. package/src/components/Checkbox/Checkbox.tsx +112 -0
  363. package/src/components/Checkbox/styles.tsx +96 -0
  364. package/src/components/CheckboxGrid/CheckboxGrid.stories.tsx +49 -0
  365. package/src/components/CheckboxGrid/CheckboxGrid.tsx +126 -0
  366. package/src/components/CheckboxGrid/styles.tsx +122 -0
  367. package/src/components/Dropdown/Dropdown.stories.tsx +59 -0
  368. package/src/components/Dropdown/Dropdown.tsx +128 -0
  369. package/src/components/Dropdown/styles.tsx +120 -0
  370. package/src/components/Icon/Icon.stories.tsx +44 -0
  371. package/src/components/Icon/Icon.test.tsx +20 -0
  372. package/src/components/Icon/Icon.tsx +88 -0
  373. package/src/components/Icon/IconDocs.mdx +22 -0
  374. package/src/components/Icon/IconGradient.tsx +70 -0
  375. package/src/components/Icon/createIconComponent.tsx +63 -0
  376. package/src/components/Icon/getDefaultIconProps.ts +23 -0
  377. package/src/components/Icon/index.ts +499 -0
  378. package/src/components/Illustrations/Illustration.tsx +18 -0
  379. package/src/components/Illustrations/Illustrations.stories.tsx +53 -0
  380. package/src/components/Illustrations/createIllustrationComponent.tsx +39 -0
  381. package/src/components/Illustrations/index.ts +118 -0
  382. package/src/components/InputError/InputError.tsx +86 -0
  383. package/src/components/Label/Label.stories.tsx +18 -0
  384. package/src/components/Label/Label.tsx +76 -0
  385. package/src/components/Link/Link.stories.tsx +14 -0
  386. package/src/components/Link/Link.test.tsx +27 -0
  387. package/src/components/Link/Link.tsx +68 -0
  388. package/src/components/Link/styles.tsx +86 -0
  389. package/src/components/Loading/Loading.stories.tsx +26 -0
  390. package/src/components/Loading/Loading.tsx +65 -0
  391. package/src/components/Loading/LoadingLogo.tsx +141 -0
  392. package/src/components/Loading/styles.ts +95 -0
  393. package/src/components/Modal/Modal.stories.tsx +52 -0
  394. package/src/components/Modal/Modal.test.tsx +98 -0
  395. package/src/components/Modal/Modal.tsx +115 -0
  396. package/src/components/Modal/ModalDocs.mdx +21 -0
  397. package/src/components/Modal/styles.tsx +67 -0
  398. package/src/components/MultiCheckbox/MultiCheckbox.stories.tsx +24 -0
  399. package/src/components/MultiCheckbox/MultiCheckbox.tsx +73 -0
  400. package/src/components/MultiCheckbox/styles.tsx +10 -0
  401. package/src/components/MultiDropdown/MultiDropdown.stories.tsx +105 -0
  402. package/src/components/MultiDropdown/MultiDropdown.tsx +247 -0
  403. package/src/components/MultiDropdown/styles.tsx +45 -0
  404. package/src/components/MultiSelection/MultiSelection.stories.tsx +19 -0
  405. package/src/components/MultiSelection/MultiSelection.tsx +74 -0
  406. package/src/components/MultiSelection/styles.tsx +78 -0
  407. package/src/components/NavigationMenu/NavigationMenu.stories.tsx +108 -0
  408. package/src/components/NavigationMenu/NavigationMenu.tsx +151 -0
  409. package/src/components/NavigationMenu/styles.tsx +293 -0
  410. package/src/components/Popover/InfoPopover.tsx +40 -0
  411. package/src/components/Popover/Popover.stories.tsx +85 -0
  412. package/src/components/Popover/Popover.tsx +68 -0
  413. package/src/components/Popover/styles.tsx +109 -0
  414. package/src/components/ProgressBar/ProgressBar.stories.tsx +15 -0
  415. package/src/components/ProgressBar/ProgressBar.tsx +76 -0
  416. package/src/components/RadioGroup/RadioGroup.stories.tsx +42 -0
  417. package/src/components/RadioGroup/RadioGroup.tsx +91 -0
  418. package/src/components/RadioGroup/styles.tsx +100 -0
  419. package/src/components/Separator/Separator.stories.tsx +27 -0
  420. package/src/components/Separator/Separator.tsx +52 -0
  421. package/src/components/Separator/styles.tsx +57 -0
  422. package/src/components/Slider/Slider.stories.tsx +27 -0
  423. package/src/components/Slider/Slider.tsx +61 -0
  424. package/src/components/Slider/styles.tsx +57 -0
  425. package/src/components/StarRating/StarRating.stories.tsx +20 -0
  426. package/src/components/StarRating/StarRating.tsx +212 -0
  427. package/src/components/StarRating/styles.ts +76 -0
  428. package/src/components/StatusMessage/StatusMessage.stories.tsx +44 -0
  429. package/src/components/StatusMessage/StatusMessage.tsx +110 -0
  430. package/src/components/Switch/Switch.stories.tsx +12 -0
  431. package/src/components/Switch/Switch.tsx +83 -0
  432. package/src/components/Switch/styles.tsx +75 -0
  433. package/src/components/Tags/Tags.stories.tsx +44 -0
  434. package/src/components/Tags/Tags.tsx +68 -0
  435. package/src/components/Tags/styles.tsx +89 -0
  436. package/src/components/Text/Text.stories.tsx +288 -0
  437. package/src/components/Text/Text.tsx +58 -0
  438. package/src/components/Text/styles.tsx +75 -0
  439. package/src/components/Text/types.ts +9 -0
  440. package/src/components/Text/typography.mdx +91 -0
  441. package/src/components/TextArea/TextArea.stories.tsx +26 -0
  442. package/src/components/TextArea/TextArea.tsx +117 -0
  443. package/src/components/TextArea/styles.tsx +58 -0
  444. package/src/components/TextContent/TextContent.stories.tsx +54 -0
  445. package/src/components/TextContent/TextContent.tsx +154 -0
  446. package/src/components/TextContent/styles.tsx +47 -0
  447. package/src/components/TextInput/TextInput.stories.tsx +43 -0
  448. package/src/components/TextInput/TextInput.tsx +146 -0
  449. package/src/components/TextInput/styles.tsx +129 -0
  450. package/src/components/Toast/Toast.stories.tsx +55 -0
  451. package/src/components/Toast/Toast.tsx +139 -0
  452. package/src/components/Toast/styles.tsx +142 -0
  453. package/src/components/Tooltip/Tooltip.stories.tsx +31 -0
  454. package/src/components/Tooltip/Tooltip.tsx +48 -0
  455. package/src/components/Tooltip/styles.tsx +20 -0
  456. package/src/components/Widget/AttachmentWidget.stories.tsx +14 -0
  457. package/src/components/Widget/AttachmentWidget.tsx +142 -0
  458. package/src/components/Widget/CallWidget.stories.tsx +38 -0
  459. package/src/components/Widget/CallWidget.tsx +114 -0
  460. package/src/components/Widget/Widget.stories.tsx +10 -0
  461. package/src/components/Widget/Widget.tsx +104 -0
  462. package/src/globalStyles.ts +68 -0
  463. package/src/hooks/useAutosizeTextArea.tsx +19 -0
  464. package/src/index.ts +107 -0
  465. package/src/setupTests.ts +8 -0
  466. package/src/storybook/BreakpointDocumentation.tsx +126 -0
  467. package/src/storybook/Components.tsx +29 -0
  468. package/src/storybook/Documentation.tsx +86 -0
  469. package/src/storybook/RadiusDocumentation.tsx +133 -0
  470. package/src/storybook/SpacingDocumentation.tsx +131 -0
  471. package/src/storybook/breakpoints.mdx +83 -0
  472. package/src/storybook/colors.mdx +118 -0
  473. package/src/storybook/radius.mdx +48 -0
  474. package/src/storybook/spacing.mdx +45 -0
  475. package/src/testUtils.tsx +49 -0
  476. package/src/theme/index.tsx +98 -0
  477. package/src/utils/animations.ts +129 -0
  478. package/src/utils/createReactSvg.tsx +140 -0
  479. package/src/utils/parser.mdx +41 -0
  480. package/src/utils/parser.test.tsx +542 -0
  481. package/src/utils/parser.tsx +333 -0
  482. package/src/utils/replaceUrlsWithAnchors.test.ts +42 -0
  483. package/src/utils/replaceUrlsWithAnchors.ts +32 -0
  484. package/src/utils/status.tsx +85 -0
  485. package/src/utils/styles.ts +1 -0
  486. package/src/utils/types.ts +1 -0
  487. package/tsconfig.json +34 -0
  488. package/tsconfig.test.json +16 -0
@@ -0,0 +1,542 @@
1
+ // @ts-nocheck
2
+ import React from 'react';
3
+ import '@testing-library/jest-dom';
4
+ import { render, screen } from '../testUtils';
5
+ import textParser from './parser';
6
+
7
+ // Mock AttachmentWidget component for testing
8
+ const MockAttachmentWidget = ({
9
+ attachmentTitle,
10
+ attachmentLink,
11
+ imageSrc,
12
+ caption,
13
+ isPreview,
14
+ }: any) => (
15
+ <div data-testid="attachment-widget">
16
+ <div>Title: {attachmentTitle}</div>
17
+ <div>Link: {attachmentLink}</div>
18
+ <div>Image: {imageSrc}</div>
19
+ <div>Caption: {caption}</div>
20
+ <div>Preview: {isPreview ? 'true' : 'false'}</div>
21
+ </div>
22
+ );
23
+
24
+ it('should return string if it does not contain tags', () => {
25
+ const text = 'Mock string with no tags';
26
+ render(textParser(text));
27
+ expect(screen.getByText(text)).toBeInTheDocument();
28
+ });
29
+
30
+ it('should return string including unrecognised tags', () => {
31
+ const text =
32
+ 'Mock string with <fake>unrecognised tags</fake>. This <book>is also fake</book>';
33
+ render(textParser(text));
34
+ expect(screen.getByText(text)).toBeInTheDocument();
35
+ });
36
+
37
+ it('should return string including unrecognised tags containing empty string', () => {
38
+ const text = 'Empty string <sa></sa>';
39
+ render(textParser(text));
40
+ expect(screen.getByText(text)).toBeInTheDocument();
41
+ });
42
+
43
+ it('should return urls as anchor tags', () => {
44
+ const normalString = 'Mock string and';
45
+ const endOfString = '. Sign up';
46
+ const text =
47
+ normalString +
48
+ ` little-world.com & https://www.little-world.com` +
49
+ endOfString;
50
+ render(textParser(text));
51
+
52
+ const links = screen.getAllByRole('link');
53
+ expect(links[0]).toHaveTextContent('little-world.com');
54
+ expect(links[1]).toHaveTextContent('https://www.little-world.com');
55
+ });
56
+
57
+ it('should return color text if text contains highlight tag', () => {
58
+ const normalString = 'Mock string with';
59
+ const text = normalString + ' <highlight>this is orange</highlight>';
60
+ render(textParser(text));
61
+ expect(screen.getByText(normalString)).toBeInTheDocument();
62
+ expect(screen.getByText('this is orange')).toBeInTheDocument();
63
+ });
64
+
65
+ it('should return anchor element with correct attributes', () => {
66
+ const normalString = 'Mock string and';
67
+ const text =
68
+ normalString + ' <a {"href": "little-world"}>this is an anchor</a>';
69
+ render(textParser(text));
70
+
71
+ const link = screen.getByRole('link');
72
+ expect(screen.getByText(normalString)).toBeInTheDocument();
73
+ expect(link).toHaveTextContent('this is an anchor');
74
+ expect(link).toHaveAttribute('href', 'little-world');
75
+ });
76
+
77
+ it('should return just string if anchor does not contain href', () => {
78
+ const string = '<a {"onClick": "little-world"}>this is an anchor</a>';
79
+ render(textParser(string));
80
+
81
+ const link = screen.queryByRole('link');
82
+ expect(link).not.toBeInTheDocument();
83
+ expect(screen.getByText('this is an anchor')).toBeInTheDocument();
84
+ });
85
+
86
+ it('should return correct elements if string contains multiple anchor tags', () => {
87
+ const normalString = 'Mock string and';
88
+ const text =
89
+ normalString +
90
+ ` <a {"href": "little-world"}>this is an anchor</a>and<a {"href": "sda"}>another anchor</a>`;
91
+ render(textParser(text));
92
+
93
+ const links = screen.getAllByRole('link');
94
+ expect(links[0]).toHaveTextContent('this is an anchor');
95
+ expect(links[1]).toHaveTextContent('another anchor');
96
+ });
97
+
98
+ it('should return correct elements if string contains multiple valid tags', () => {
99
+ const normalString = 'Mock string with';
100
+ const text =
101
+ normalString +
102
+ ` <a {"href": "little-world"}>this is an anchor</a><highlight>highlight text</highlight>`;
103
+ render(textParser(text));
104
+ expect(screen.getByText(normalString)).toBeInTheDocument();
105
+ expect(screen.getByRole('link')).toBeInTheDocument();
106
+ expect(screen.getByText('highlight text')).toBeInTheDocument();
107
+ });
108
+
109
+ it('should return text after tag elements correctly', () => {
110
+ const normalString = 'Mock string and';
111
+ const text = `<a {"href": "little-world"}>this is an anchor</a><highlight>highlight text</highlight>${normalString}`;
112
+ render(textParser(text));
113
+ expect(screen.getByText('Mock string and')).toBeInTheDocument();
114
+ expect(screen.getByRole('link')).toBeInTheDocument();
115
+ expect(screen.getByText('highlight text')).toBeInTheDocument();
116
+ });
117
+
118
+ it('should return button if string contains button tag', () => {
119
+ const normalString = 'Mock string and';
120
+ const text = `<button>this is a button</button><highlight>highlight text</highlight>${normalString}`;
121
+ render(textParser(text));
122
+ expect(screen.getByRole('button')).toHaveTextContent('this is a button');
123
+ expect(screen.getByText('highlight text')).toBeInTheDocument();
124
+ });
125
+
126
+ it('should not return parsed button if onlyLinks is true', () => {
127
+ const text = `<a {"href": "little-world"}>this is an anchor</a><button>this is a button</button><highlight>highlight text</highlight>`;
128
+
129
+ render(textParser(text, { onlyLinks: true }));
130
+ expect(screen.getByRole('link')).toHaveTextContent('this is an anchor');
131
+ expect(screen.queryByRole('button')).toBeNull();
132
+ });
133
+
134
+ // Test for the failing AttachmentWidget case
135
+ it('should handle AttachmentWidget with malformed JSON gracefully', () => {
136
+ const text =
137
+ '<AttachmentWidget {"attachmentTitle": "Image", "attachmentLink": null, "imageSrc": "https://little-world-production-bucket.s3.eu-central-1.amazonaws.com/static/message_attachments/9cca2cd0-07f5-4727-a0ee-6012a34f98f6.png", "caption": "Hallo Hasan,\ndoch, hast Du :)\nNach dem Login bist Du automatisch auf \"Start", dann oben unter Gruppengespräche -> siehe Anhang\nGruß\nChris"} ></AttachmentWidget>';
138
+
139
+ const options = {
140
+ customElements: [
141
+ {
142
+ Component: MockAttachmentWidget,
143
+ tag: 'AttachmentWidget',
144
+ props: { isPreview: false },
145
+ },
146
+ ],
147
+ };
148
+
149
+ // This should not crash and should return the unparsed string
150
+ render(textParser(text, options));
151
+
152
+ // Should render the unparsed string (HTML-encoded) instead of a component
153
+ expect(screen.getByText(/AttachmentWidget/)).toBeInTheDocument();
154
+ expect(screen.getByText(/attachmentTitle/)).toBeInTheDocument();
155
+ expect(screen.getByText(/Hallo Hasan/)).toBeInTheDocument();
156
+ });
157
+
158
+ // Test for AttachmentWidget with valid JSON
159
+ it('should handle AttachmentWidget with valid JSON correctly', () => {
160
+ const text =
161
+ '<AttachmentWidget {"attachmentTitle": "Image", "attachmentLink": null, "imageSrc": "https://example.com/image.png", "caption": "Valid caption"} ></AttachmentWidget>';
162
+
163
+ const options = {
164
+ customElements: [
165
+ {
166
+ Component: MockAttachmentWidget,
167
+ tag: 'AttachmentWidget',
168
+ props: { isPreview: false },
169
+ },
170
+ ],
171
+ };
172
+
173
+ render(textParser(text, options));
174
+
175
+ const attachmentWidget = screen.getByTestId('attachment-widget');
176
+ expect(attachmentWidget).toBeInTheDocument();
177
+ expect(screen.getByText('Title: Image')).toBeInTheDocument();
178
+ expect(screen.getByText('Caption: Valid caption')).toBeInTheDocument();
179
+ });
180
+
181
+ // Test for the problematic German text that was causing hanging
182
+ it('should handle complex German text with incomplete tags without hanging', () => {
183
+ const problematicText = `Hallo Andreas,
184
+ das kenne ich :)
185
+
186
+ auch die anderen bekommen diese Email typischerweise innerhalb von <30min - in Ausnahmefällen auch mal in ein paar Stunden (Server-Verzögerungen).
187
+
188
+ Bei manchen landen diese Systemnachrichten im Spam-Ordner und wenn der Nutzer dann den Absender nicht als "kein Spam" bzw "zulassen" markiert, passiert das immer wieder. Auch denke ich, das nicht jeder Nutzer regelmäßig in seine Email schaut - old school :) - oder eine Neben-Emailadresse benutzt - oder diese Nachricht ignoriert - oder ....
189
+
190
+ Ich würde das bei den Betroffenen ganz einfach mal ansprechen. Oft klärt sich das dann recht schnell.
191
+
192
+ Meldet sich jemand länger nicht, besteht ja die Möglichkeit, dass wir eine private Email an denjenigen schicken - das hilft in 50% der Fälle.
193
+
194
+ Gruß
195
+ Chris`;
196
+
197
+ const options = {
198
+ customElements: [
199
+ {
200
+ Component: MockAttachmentWidget,
201
+ tag: 'AttachmentWidget',
202
+ props: { isPreview: false },
203
+ },
204
+ ],
205
+ };
206
+
207
+ const result = textParser(problematicText, options);
208
+ expect(result).toBe(problematicText);
209
+ });
210
+
211
+ // Test for text with malformed HTML-like content
212
+ it('should handle text with malformed HTML-like content gracefully', () => {
213
+ const malformedText =
214
+ 'This text has <incomplete tags and <nested>content</nested> and <30min which looks like a tag but isnt';
215
+
216
+ const options = {
217
+ customElements: [
218
+ {
219
+ Component: MockAttachmentWidget,
220
+ tag: 'AttachmentWidget',
221
+ props: { isPreview: false },
222
+ },
223
+ ],
224
+ };
225
+
226
+ const result = textParser(malformedText, options);
227
+ expect(result).toBe(malformedText);
228
+ });
229
+
230
+ // Test for the specific problematic pattern step by step
231
+ it('should handle the specific problematic pattern step by step', () => {
232
+ // Test 1: Just the <30min part
233
+ const test1 = 'Text with <30min in it';
234
+ const result1 = textParser(test1, {});
235
+ expect(result1).toBe(test1);
236
+
237
+ // Test 2: Text with quotes and newlines
238
+ const test2 = 'Text with "quotes" and\nnewlines';
239
+ const result2 = textParser(test2, {});
240
+ expect(result2).toBe(test2);
241
+
242
+ // Test 3: Text with incomplete tag-like content
243
+ const test3 = 'Text with <30min - incomplete tag';
244
+ const result3 = textParser(test3, {});
245
+ expect(result3).toBe(test3);
246
+ });
247
+
248
+ // Test for the exact problematic pattern that causes hanging
249
+ it('should handle the exact problematic pattern that causes hanging', () => {
250
+ const problematicLine =
251
+ 'auch die anderen bekommen diese Email typischerweise innerhalb von <30min - in Ausnahmefällen auch mal in ein paar Stunden (Server-Verzögerungen).';
252
+
253
+ const result = textParser(problematicLine, {});
254
+ expect(result).toBe(problematicLine);
255
+ });
256
+
257
+ // Test to identify the exact hanging combination
258
+ it('should identify the exact hanging combination', () => {
259
+ const paragraph1 = 'Hallo Andreas,\ndas kenne ich :)';
260
+ const result1 = textParser(paragraph1, {});
261
+ expect(result1).toBe(paragraph1);
262
+
263
+ const paragraph2 =
264
+ 'auch die anderen bekommen diese Email typischerweise innerhalb von <30min - in Ausnahmefällen auch mal in ein paar Stunden (Server-Verzögerungen).';
265
+ const result2 = textParser(paragraph2, {});
266
+ expect(result2).toBe(paragraph2);
267
+
268
+ const paragraph3 =
269
+ 'Bei manchen landen diese Systemnachrichten im Spam-Ordner und wenn der Nutzer dann den Absender nicht als "kein Spam" bzw "zulassen" markiert, passiert das immer wieder.';
270
+ const result3 = textParser(paragraph3, {});
271
+ expect(result3).toBe(paragraph3);
272
+
273
+ // Test 4: The paragraph with multiple incomplete patterns
274
+ const paragraph4 =
275
+ 'Auch denke ich, das nicht jeder Nutzer regelmäßig in seine Email schaut - old school :) - oder eine Neben-Emailadresse benutzt - oder diese Nachricht ignoriert - oder ....';
276
+ const result4 = textParser(paragraph4, {});
277
+ expect(result4).toBe(paragraph4);
278
+ });
279
+
280
+ // Test for the full problematic text to identify where it hangs
281
+ it('should handle the full problematic text without hanging', () => {
282
+ const fullProblematicText = `Hallo Andreas,
283
+ das kenne ich :)
284
+
285
+ auch die anderen bekommen diese Email typischerweise innerhalb von <30min - in Ausnahmefällen auch mal in ein paar Stunden (Server-Verzögerungen).
286
+
287
+ Bei manchen landen diese Systemnachrichten im Spam-Ordner und wenn der Nutzer dann den Absender nicht als "kein Spam" bzw "zulassen" markiert, passiert das immer wieder. Auch denke ich, das nicht jeder Nutzer regelmäßig in seine Email schaut - old school :) - oder eine Neben-Emailadresse benutzt - oder diese Nachricht ignoriert - oder ....
288
+
289
+ Ich würde das bei den Betroffenen ganz einfach mal ansprechen. Oft klärt sich das dann recht schnell.
290
+
291
+ Meldet sich jemand länger nicht, besteht ja die Möglichkeit, dass wir eine private Email an denjenigen schicken - das hilft in 50% der Fälle.
292
+
293
+ Gruß
294
+ Chris`;
295
+
296
+ const options = {
297
+ customElements: [
298
+ {
299
+ Component: MockAttachmentWidget,
300
+ tag: 'AttachmentWidget',
301
+ props: { isPreview: false },
302
+ },
303
+ ],
304
+ };
305
+
306
+ const result = textParser(fullProblematicText, options);
307
+ expect(result).toBe(fullProblematicText);
308
+ });
309
+
310
+ // Test for text with multiple < characters
311
+ it('should handle text with multiple < characters without hanging', () => {
312
+ const textWithMultipleLessThan =
313
+ 'Text with <30min and <another and <third and <fourth';
314
+
315
+ const result = textParser(textWithMultipleLessThan, {});
316
+ expect(result).toBe(textWithMultipleLessThan);
317
+ });
318
+
319
+ it('should handle multiple problematic patterns without hanging', () => {
320
+ // This combines multiple patterns that individually work but together caused hanging with regex
321
+ const multipleProblematicPatterns =
322
+ 'Text with <30min and <nested>content</nested> and <another incomplete';
323
+
324
+ const result = textParser(multipleProblematicPatterns, {});
325
+ expect(result).toBe(multipleProblematicPatterns);
326
+ });
327
+
328
+ it('should handle component creation without hanging', () => {
329
+ const problematicComponentCreation = 'Text with <30min - incomplete tag';
330
+
331
+ const result = textParser(problematicComponentCreation, {});
332
+ expect(result).toBe(problematicComponentCreation);
333
+ });
334
+
335
+ it('should handle nested tags correctly', () => {
336
+ const text = `<highlight>This highlighted text contains a <a {"href": "/nested-link"}>nested link</a> inside it</highlight>`;
337
+
338
+ const result = textParser(text, {});
339
+
340
+ expect(result).toBeDefined();
341
+ // The result should be a React element, not the original string
342
+ expect(typeof result).not.toBe('string');
343
+ });
344
+
345
+ it('should handle button with ButtonAppearance.Secondary and onClick', () => {
346
+ const text = `<button {"appearance": "secondary", "onClick": "console.log('Button clicked!')"}>Click me!</button>`;
347
+
348
+ const result = textParser(text, {});
349
+
350
+ // Should render button component
351
+ expect(result).toBeDefined();
352
+ expect(typeof result).not.toBe('string');
353
+ });
354
+
355
+ it('should handle custom elements like CallWidget and AttachmentWidget', () => {
356
+ const MockCallWidget = ({
357
+ isMissed,
358
+ isPreview,
359
+ header,
360
+ description,
361
+ onReturnCall,
362
+ ...props
363
+ }) => (
364
+ <div data-testid="call-widget" {...props}>
365
+ <div>Header: {header}</div>
366
+ <div>Description: {description}</div>
367
+ <div>Missed: {isMissed ? 'Yes' : 'No'}</div>
368
+ <div>Preview: {isPreview ? 'Yes' : 'No'}</div>
369
+ {onReturnCall && <button onClick={onReturnCall}>Return Call</button>}
370
+ </div>
371
+ );
372
+
373
+ const MockAttachmentWidget = ({ isPreview, ...props }) => (
374
+ <div data-testid="attachment-widget" {...props}>
375
+ <div>Preview: {isPreview ? 'Yes' : 'No'}</div>
376
+ </div>
377
+ );
378
+
379
+ const customElements = [
380
+ {
381
+ Component: MockCallWidget,
382
+ tag: 'CallWidget',
383
+ props: { isPreview: false },
384
+ },
385
+ {
386
+ Component: MockAttachmentWidget,
387
+ tag: 'AttachmentWidget',
388
+ props: { isPreview: false },
389
+ },
390
+ ];
391
+
392
+ const text = `<CallWidget {"isMissed": false, "header": "Video Anruf", "isPreview": false}>Call content</CallWidget>
393
+ <AttachmentWidget {"isPreview": false}>Attachment content</AttachmentWidget>`;
394
+
395
+ const result = textParser(text, { customElements });
396
+
397
+ // Should render custom components
398
+ expect(result).toBeDefined();
399
+ expect(typeof result).not.toBe('string');
400
+ });
401
+
402
+ it('should handle mixed content with custom elements and regular tags', () => {
403
+ const MockWidget = ({ title, children, ...props }) => (
404
+ <div data-testid="widget" {...props}>
405
+ <strong>{title}: </strong>
406
+ {children}
407
+ </div>
408
+ );
409
+
410
+ const customElements = [
411
+ {
412
+ Component: MockWidget,
413
+ tag: 'widget',
414
+ props: { className: 'custom-widget' },
415
+ },
416
+ ];
417
+
418
+ const text = `<highlight>Highlighted text with <widget {"title": "Custom Widget"}>widget content</widget> and <a {"href": "/link"}>a link</a></highlight>`;
419
+
420
+ const result = textParser(text, { customElements });
421
+
422
+ expect(result).toBeDefined();
423
+ expect(typeof result).not.toBe('string');
424
+ });
425
+
426
+ // Test 6: Edge case - custom elements with invalid JSON
427
+ it('should handle custom elements with invalid JSON gracefully', () => {
428
+ const MockWidget = ({ title, children, ...props }) => (
429
+ <div data-testid="widget" {...props}>
430
+ <strong>{title}: </strong>
431
+ {children}
432
+ </div>
433
+ );
434
+
435
+ const customElements = [
436
+ {
437
+ Component: MockWidget,
438
+ tag: 'widget',
439
+ props: { className: 'custom-widget' },
440
+ },
441
+ ];
442
+
443
+ const text = `<widget {"title": "Valid Widget"}>Valid content</widget>
444
+ <widget {"title": "Invalid Widget", "broken": json}>Invalid content</widget>`;
445
+
446
+ const result = textParser(text, { customElements });
447
+
448
+ // Should handle invalid JSON gracefully
449
+ expect(result).toBeDefined();
450
+ });
451
+
452
+ // Test cases for nonInteractive option
453
+ describe('nonInteractive option', () => {
454
+ it('should render plain URLs as text when nonInteractive is true', () => {
455
+ const text =
456
+ 'Visit little-world.com and https://www.little-world.com for more info';
457
+
458
+ const { container } = render(textParser(text, { nonInteractive: true }));
459
+
460
+ // Should render URLs as plain text, not as links
461
+ expect(screen.queryByRole('link')).not.toBeInTheDocument();
462
+ expect(container.textContent).toContain('little-world.com');
463
+ expect(container.textContent).toContain('https://www.little-world.com');
464
+ });
465
+
466
+ it('should render anchor tags as plain text when nonInteractive is true', () => {
467
+ const text =
468
+ 'Check out <a {"href": "little-world"}>this link</a> for more details';
469
+
470
+ const { container } = render(textParser(text, { nonInteractive: true }));
471
+
472
+ // Should render anchor content as plain text, not as a link
473
+ expect(screen.queryByRole('link')).not.toBeInTheDocument();
474
+ expect(container.textContent).toContain('this link');
475
+ });
476
+
477
+ it('should render button tags as plain text when nonInteractive is true', () => {
478
+ const text = 'Click <button>this button</button> to continue';
479
+
480
+ const { container } = render(textParser(text, { nonInteractive: true }));
481
+
482
+ // Should render button content as plain text, not as a button
483
+ expect(screen.queryByRole('button')).not.toBeInTheDocument();
484
+ expect(container.textContent).toContain('this button');
485
+ });
486
+
487
+ it('should render colored tags as plain text when nonInteractive is true', () => {
488
+ const text =
489
+ 'This is <highlight>highlighted text</highlight> and <bold>bold text</bold>';
490
+
491
+ const { container } = render(textParser(text, { nonInteractive: true }));
492
+
493
+ // Should render colored content as plain text
494
+ expect(container.textContent).toContain('highlighted text');
495
+ expect(container.textContent).toContain('bold text');
496
+ });
497
+
498
+ it('should render mixed content as plain text when nonInteractive is true', () => {
499
+ const text =
500
+ 'Visit <a {"href": "little-world"}>little-world.com</a> and click <button>Submit</button> for <highlight>highlighted action</highlight>';
501
+
502
+ const { container } = render(textParser(text, { nonInteractive: true }));
503
+
504
+ // Should render all content as plain text
505
+ expect(screen.queryByRole('link')).not.toBeInTheDocument();
506
+ expect(screen.queryByRole('button')).not.toBeInTheDocument();
507
+ expect(container.textContent).toContain('little-world.com');
508
+ expect(container.textContent).toContain('Submit');
509
+ expect(container.textContent).toContain('highlighted action');
510
+ });
511
+
512
+ it('should still render custom elements when nonInteractive is true', () => {
513
+ const MockWidget = ({ title, children }) => (
514
+ <div data-testid="widget">
515
+ <strong>{title}: </strong>
516
+ {children}
517
+ </div>
518
+ );
519
+
520
+ const customElements = [
521
+ {
522
+ Component: MockWidget,
523
+ tag: 'widget',
524
+ props: {},
525
+ },
526
+ ];
527
+
528
+ const text =
529
+ 'Regular text with <widget {"title": "Custom Widget"}>widget content</widget> and <a {"href": "/link"}>link text</a>';
530
+
531
+ const { container } = render(
532
+ textParser(text, { nonInteractive: true, customElements }),
533
+ );
534
+
535
+ // Custom elements should still render, but interactive elements should be plain text
536
+ expect(screen.getByTestId('widget')).toBeInTheDocument();
537
+ expect(screen.getByText('Custom Widget:')).toBeInTheDocument();
538
+ expect(screen.getByText('widget content')).toBeInTheDocument();
539
+ expect(screen.queryByRole('link')).not.toBeInTheDocument();
540
+ expect(container.textContent).toContain('link text');
541
+ });
542
+ });