@goodhood-web/ui 0.0.6-alpha.0 → 0.0.6-alpha.2

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 (293) hide show
  1. package/.babelrc +12 -0
  2. package/.eslintrc.json +25 -0
  3. package/.storybook/main.ts +31 -0
  4. package/.storybook/manager-head.html +1 -0
  5. package/.storybook/manager.ts +7 -0
  6. package/.storybook/nebenanTheme.ts +17 -0
  7. package/.storybook/preview.ts +9 -0
  8. package/.stylelintrc.json +14 -0
  9. package/README.md +7 -0
  10. package/__mocks__/svg.js +2 -0
  11. package/images/favicon.ico +0 -0
  12. package/images/logo.svg +11 -0
  13. package/jest.config.ts +16 -0
  14. package/package.json +5 -1
  15. package/project.json +95 -0
  16. package/release.config.js +30 -0
  17. package/{index.d.ts → src/index.ts} +24 -1
  18. package/src/lib/BaseButton/BaseButton.module.scss +11 -0
  19. package/src/lib/BaseButton/BaseButton.spec.tsx +12 -0
  20. package/src/lib/BaseButton/BaseButton.stories.tsx +26 -0
  21. package/src/lib/BaseButton/BaseButton.tsx +39 -0
  22. package/src/lib/Card/Card.module.scss +15 -0
  23. package/src/lib/Card/Card.spec.tsx +15 -0
  24. package/src/lib/Card/Card.stories.tsx +159 -0
  25. package/src/lib/Card/Card.tsx +31 -0
  26. package/src/lib/Card/Card.types.ts +12 -0
  27. package/src/lib/Card/Card.utils.spec.tsx +51 -0
  28. package/src/lib/Card/Card.utils.ts +23 -0
  29. package/src/lib/Card/CardBody/CardBody.module.scss +4 -0
  30. package/src/lib/Card/CardBody/CardBody.spec.tsx +15 -0
  31. package/src/lib/Card/CardBody/CardBody.stories.tsx +108 -0
  32. package/src/lib/Card/CardBody/CardBody.tsx +9 -0
  33. package/src/lib/Card/CardBody/CardBody.types.ts +4 -0
  34. package/src/lib/Card/CardHeader/CardHeader.module.scss +12 -0
  35. package/src/lib/Card/CardHeader/CardHeader.spec.tsx +72 -0
  36. package/src/lib/Card/CardHeader/CardHeader.stories.tsx +77 -0
  37. package/src/lib/Card/CardHeader/CardHeader.tsx +29 -0
  38. package/src/lib/Card/CardHeader/CardHeader.type.ts +14 -0
  39. package/src/lib/ContentCreatorButton/ContentCreatorButton.module.scss +14 -0
  40. package/src/lib/ContentCreatorButton/ContentCreatorButton.spec.tsx +14 -0
  41. package/src/lib/ContentCreatorButton/ContentCreatorButton.stories.tsx +29 -0
  42. package/src/lib/ContentCreatorButton/ContentCreatorButton.tsx +35 -0
  43. package/{lib/ContentCreatorButton/ContentCreatorButton.types.d.ts → src/lib/ContentCreatorButton/ContentCreatorButton.types.ts} +3 -2
  44. package/src/lib/Divider/Divider.module.scss +10 -0
  45. package/src/lib/Divider/Divider.spec.tsx +46 -0
  46. package/src/lib/Divider/Divider.stories.tsx +35 -0
  47. package/src/lib/Divider/Divider.tsx +17 -0
  48. package/src/lib/Divider/Divider.types.ts +6 -0
  49. package/src/lib/Fieldset/Fieldset.module.scss +3 -0
  50. package/src/lib/Fieldset/Fieldset.spec.tsx +68 -0
  51. package/src/lib/Fieldset/Fieldset.stories.tsx +60 -0
  52. package/src/lib/Fieldset/Fieldset.tsx +28 -0
  53. package/src/lib/Fieldset/Fieldset.types.ts +7 -0
  54. package/src/lib/Form/Form.spec.tsx +15 -0
  55. package/src/lib/Form/Form.stories.tsx +53 -0
  56. package/src/lib/Form/Form.tsx +14 -0
  57. package/src/lib/Form/Form.types.ts +11 -0
  58. package/src/lib/Icon/Icon.module.scss +7 -0
  59. package/src/lib/Icon/Icon.spec.tsx +33 -0
  60. package/src/lib/Icon/Icon.stories.tsx +88 -0
  61. package/src/lib/Icon/Icon.tsx +29 -0
  62. package/src/lib/Icon/Icon.types.ts +23 -0
  63. package/src/lib/Icon/icons/24x24/index.ts +89 -0
  64. package/src/lib/Icon/icons/24x24/svg/arrow_left.svg +1 -0
  65. package/src/lib/Icon/icons/24x24/svg/arrow_right.svg +1 -0
  66. package/src/lib/Icon/icons/24x24/svg/bookmark.svg +1 -0
  67. package/src/lib/Icon/icons/24x24/svg/bookmarked.svg +1 -0
  68. package/src/lib/Icon/icons/24x24/svg/burger_menu.svg +1 -0
  69. package/src/lib/Icon/icons/24x24/svg/camera.svg +1 -0
  70. package/src/lib/Icon/icons/24x24/svg/checkmark.svg +1 -0
  71. package/src/lib/Icon/icons/24x24/svg/checkmark_circle.svg +1 -0
  72. package/src/lib/Icon/icons/24x24/svg/chevron_down.svg +1 -0
  73. package/src/lib/Icon/icons/24x24/svg/chevron_left.svg +1 -0
  74. package/src/lib/Icon/icons/24x24/svg/chevron_right.svg +1 -0
  75. package/src/lib/Icon/icons/24x24/svg/chevron_up.svg +1 -0
  76. package/src/lib/Icon/icons/24x24/svg/comment_bubble.svg +1 -0
  77. package/src/lib/Icon/icons/24x24/svg/cross.svg +1 -0
  78. package/src/lib/Icon/icons/24x24/svg/cross_circle.svg +1 -0
  79. package/src/lib/Icon/icons/24x24/svg/envelope.svg +1 -0
  80. package/src/lib/Icon/icons/24x24/svg/event_calendar.svg +1 -0
  81. package/src/lib/Icon/icons/24x24/svg/external_link.svg +1 -0
  82. package/src/lib/Icon/icons/24x24/svg/eye.svg +1 -0
  83. package/src/lib/Icon/icons/24x24/svg/eye_crossed.svg +1 -0
  84. package/src/lib/Icon/icons/24x24/svg/filter.svg +1 -0
  85. package/src/lib/Icon/icons/24x24/svg/globe.svg +1 -0
  86. package/src/lib/Icon/icons/24x24/svg/heart.svg +1 -0
  87. package/src/lib/Icon/icons/24x24/svg/image.svg +1 -0
  88. package/src/lib/Icon/icons/24x24/svg/loudspeaker.svg +1 -0
  89. package/src/lib/Icon/icons/24x24/svg/marketplace.svg +1 -0
  90. package/src/lib/Icon/icons/24x24/svg/more_dots.svg +1 -0
  91. package/src/lib/Icon/icons/24x24/svg/more_dots_alt.svg +1 -0
  92. package/src/lib/Icon/icons/24x24/svg/mute.svg +1 -0
  93. package/src/lib/Icon/icons/24x24/svg/notification_bell.svg +1 -0
  94. package/src/lib/Icon/icons/24x24/svg/paperclip.svg +1 -0
  95. package/src/lib/Icon/icons/24x24/svg/pencil.svg +1 -0
  96. package/src/lib/Icon/icons/24x24/svg/pin.svg +1 -0
  97. package/src/lib/Icon/icons/24x24/svg/plus.svg +1 -0
  98. package/src/lib/Icon/icons/24x24/svg/plus_circle.svg +1 -0
  99. package/src/lib/Icon/icons/24x24/svg/privacy_lock.svg +1 -0
  100. package/src/lib/Icon/icons/24x24/svg/search.svg +1 -0
  101. package/src/lib/Icon/icons/24x24/svg/share_arrow.svg +1 -0
  102. package/src/lib/Icon/icons/24x24/svg/share_arrow_outline.svg +1 -0
  103. package/src/lib/Icon/icons/24x24/svg/sort.svg +1 -0
  104. package/src/lib/Icon/icons/24x24/svg/thanks.svg +1 -0
  105. package/src/lib/Icon/icons/24x24/svg/trash_can.svg +1 -0
  106. package/src/lib/Icon/icons/32x32/index.ts +179 -0
  107. package/src/lib/Icon/icons/32x32/svg/address_book.svg +1 -0
  108. package/src/lib/Icon/icons/32x32/svg/baby_toy.svg +1 -0
  109. package/src/lib/Icon/icons/32x32/svg/bicycle.svg +1 -0
  110. package/src/lib/Icon/icons/32x32/svg/bookmark.svg +1 -0
  111. package/src/lib/Icon/icons/32x32/svg/books.svg +1 -0
  112. package/src/lib/Icon/icons/32x32/svg/bubble_heart_filled.svg +1 -0
  113. package/src/lib/Icon/icons/32x32/svg/bubble_heart_outline.svg +1 -0
  114. package/src/lib/Icon/icons/32x32/svg/buildings.svg +1 -0
  115. package/src/lib/Icon/icons/32x32/svg/burger_menu.svg +1 -0
  116. package/src/lib/Icon/icons/32x32/svg/business.svg +1 -0
  117. package/src/lib/Icon/icons/32x32/svg/business_profile.svg +1 -0
  118. package/src/lib/Icon/icons/32x32/svg/camera.svg +1 -0
  119. package/src/lib/Icon/icons/32x32/svg/camera_crossed.svg +1 -0
  120. package/src/lib/Icon/icons/32x32/svg/car.svg +1 -0
  121. package/src/lib/Icon/icons/32x32/svg/carrot.svg +1 -0
  122. package/src/lib/Icon/icons/32x32/svg/chat.svg +1 -0
  123. package/src/lib/Icon/icons/32x32/svg/checkmark_circle.svg +1 -0
  124. package/src/lib/Icon/icons/32x32/svg/christmas_tree.svg +1 -0
  125. package/src/lib/Icon/icons/32x32/svg/clipboard.svg +1 -0
  126. package/src/lib/Icon/icons/32x32/svg/clothing.svg +1 -0
  127. package/src/lib/Icon/icons/32x32/svg/cocktail.svg +1 -0
  128. package/src/lib/Icon/icons/32x32/svg/comment_bubble.svg +1 -0
  129. package/src/lib/Icon/icons/32x32/svg/compass.svg +1 -0
  130. package/src/lib/Icon/icons/32x32/svg/computer.svg +1 -0
  131. package/src/lib/Icon/icons/32x32/svg/couch.svg +1 -0
  132. package/src/lib/Icon/icons/32x32/svg/credit_card.svg +1 -0
  133. package/src/lib/Icon/icons/32x32/svg/cross_circle.svg +1 -0
  134. package/src/lib/Icon/icons/32x32/svg/cutlery.svg +1 -0
  135. package/src/lib/Icon/icons/32x32/svg/drill_tool.svg +1 -0
  136. package/src/lib/Icon/icons/32x32/svg/email.svg +1 -0
  137. package/src/lib/Icon/icons/32x32/svg/envelope.svg +1 -0
  138. package/src/lib/Icon/icons/32x32/svg/event_calendar_check.svg +1 -0
  139. package/src/lib/Icon/icons/32x32/svg/event_calendar_date.svg +1 -0
  140. package/src/lib/Icon/icons/32x32/svg/event_calendar_plus.svg +1 -0
  141. package/src/lib/Icon/icons/32x32/svg/exchange.svg +1 -0
  142. package/src/lib/Icon/icons/32x32/svg/eye.svg +1 -0
  143. package/src/lib/Icon/icons/32x32/svg/eye_crossed.svg +1 -0
  144. package/src/lib/Icon/icons/32x32/svg/gift.svg +1 -0
  145. package/src/lib/Icon/icons/32x32/svg/group.svg +1 -0
  146. package/src/lib/Icon/icons/32x32/svg/healthcare.svg +1 -0
  147. package/src/lib/Icon/icons/32x32/svg/heart.svg +1 -0
  148. package/src/lib/Icon/icons/32x32/svg/house.svg +1 -0
  149. package/src/lib/Icon/icons/32x32/svg/image.svg +1 -0
  150. package/src/lib/Icon/icons/32x32/svg/info.svg +1 -0
  151. package/src/lib/Icon/icons/32x32/svg/invite_neighbour.svg +1 -0
  152. package/src/lib/Icon/icons/32x32/svg/key.svg +1 -0
  153. package/src/lib/Icon/icons/32x32/svg/kitchen_pot.svg +1 -0
  154. package/src/lib/Icon/icons/32x32/svg/list.svg +1 -0
  155. package/src/lib/Icon/icons/32x32/svg/log_out.svg +1 -0
  156. package/src/lib/Icon/icons/32x32/svg/loudspeaker.svg +1 -0
  157. package/src/lib/Icon/icons/32x32/svg/map.svg +1 -0
  158. package/src/lib/Icon/icons/32x32/svg/marketplace.svg +1 -0
  159. package/src/lib/Icon/icons/32x32/svg/miscellaneous_other.svg +1 -0
  160. package/src/lib/Icon/icons/32x32/svg/more_dots.svg +1 -0
  161. package/src/lib/Icon/icons/32x32/svg/more_dots_alt.svg +1 -0
  162. package/src/lib/Icon/icons/32x32/svg/music.svg +1 -0
  163. package/src/lib/Icon/icons/32x32/svg/nebenan.de.svg +1 -0
  164. package/src/lib/Icon/icons/32x32/svg/neighbour.svg +1 -0
  165. package/src/lib/Icon/icons/32x32/svg/notification_bell.svg +1 -0
  166. package/src/lib/Icon/icons/32x32/svg/organisation.svg +1 -0
  167. package/src/lib/Icon/icons/32x32/svg/paper_form_empty.svg +1 -0
  168. package/src/lib/Icon/icons/32x32/svg/paper_form_filled.svg +1 -0
  169. package/src/lib/Icon/icons/32x32/svg/paperclip.svg +1 -0
  170. package/src/lib/Icon/icons/32x32/svg/paw.svg +1 -0
  171. package/src/lib/Icon/icons/32x32/svg/pencil.svg +1 -0
  172. package/src/lib/Icon/icons/32x32/svg/pin.svg +1 -0
  173. package/src/lib/Icon/icons/32x32/svg/pins.svg +1 -0
  174. package/src/lib/Icon/icons/32x32/svg/plant.svg +1 -0
  175. package/src/lib/Icon/icons/32x32/svg/plus.svg +1 -0
  176. package/src/lib/Icon/icons/32x32/svg/plus_circle.svg +1 -0
  177. package/src/lib/Icon/icons/32x32/svg/post.svg +1 -0
  178. package/src/lib/Icon/icons/32x32/svg/privacy_lock.svg +1 -0
  179. package/src/lib/Icon/icons/32x32/svg/qr_code.svg +1 -0
  180. package/src/lib/Icon/icons/32x32/svg/search.svg +1 -0
  181. package/src/lib/Icon/icons/32x32/svg/settings_cog.svg +1 -0
  182. package/src/lib/Icon/icons/32x32/svg/shopping_bag.svg +1 -0
  183. package/src/lib/Icon/icons/32x32/svg/shopping_cart.svg +1 -0
  184. package/src/lib/Icon/icons/32x32/svg/special_place.svg +1 -0
  185. package/src/lib/Icon/icons/32x32/svg/suitcase.svg +1 -0
  186. package/src/lib/Icon/icons/32x32/svg/supporter.svg +1 -0
  187. package/src/lib/Icon/icons/32x32/svg/tennis_ball.svg +1 -0
  188. package/src/lib/Icon/icons/32x32/svg/thanks.svg +1 -0
  189. package/src/lib/Icon/icons/32x32/svg/trash_can.svg +1 -0
  190. package/src/lib/Icon/icons/32x32/svg/truck.svg +1 -0
  191. package/src/lib/Icon/icons/32x32/svg/user.svg +1 -0
  192. package/src/lib/Icon/icons/32x32/svg/user_profile.svg +1 -0
  193. package/src/lib/Icon/icons/32x32/svg/wellness.svg +1 -0
  194. package/src/lib/Icon/icons/index.ts +9 -0
  195. package/src/lib/IconButton/IconButton.module.scss +37 -0
  196. package/src/lib/IconButton/IconButton.spec.tsx +56 -0
  197. package/src/lib/IconButton/IconButton.stories.tsx +36 -0
  198. package/src/lib/IconButton/IconButton.tsx +25 -0
  199. package/{lib/IconButton/IconButton.types.d.ts → src/lib/IconButton/IconButton.types.ts} +10 -10
  200. package/src/lib/IconButton/utils.ts +6 -0
  201. package/src/lib/Image/Image.spec.tsx +10 -0
  202. package/src/lib/Image/Image.tsx +7 -0
  203. package/src/lib/Image/Image.type.tsx +5 -0
  204. package/src/lib/LabelPill/LabelPill.module.scss +33 -0
  205. package/src/lib/LabelPill/LabelPill.spec.tsx +23 -0
  206. package/src/lib/LabelPill/LabelPill.stories.tsx +31 -0
  207. package/src/lib/LabelPill/LabelPill.tsx +16 -0
  208. package/src/lib/LabelPill/LabelPill.types.ts +4 -0
  209. package/src/lib/Legend/Legend.module.scss +9 -0
  210. package/src/lib/Legend/Legend.spec.tsx +35 -0
  211. package/src/lib/Legend/Legend.stories.ts +39 -0
  212. package/src/lib/Legend/Legend.tsx +19 -0
  213. package/src/lib/Legend/Legend.types.ts +5 -0
  214. package/src/lib/MenuItem/MenuItem.module.scss +73 -0
  215. package/src/lib/MenuItem/MenuItem.spec.tsx +47 -0
  216. package/src/lib/MenuItem/MenuItem.stories.tsx +97 -0
  217. package/src/lib/MenuItem/MenuItem.tsx +34 -0
  218. package/src/lib/MenuItem/MenuItem.types.ts +10 -0
  219. package/src/lib/NotificationBubble/NotificationBubble.module.scss +30 -0
  220. package/src/lib/NotificationBubble/NotificationBubble.spec.tsx +36 -0
  221. package/src/lib/NotificationBubble/NotificationBubble.stories.tsx +56 -0
  222. package/src/lib/NotificationBubble/NotificationBubble.tsx +34 -0
  223. package/{lib/NotificationBubble/NotificationBubble.types.d.ts → src/lib/NotificationBubble/NotificationBubble.types.tsx} +3 -2
  224. package/src/lib/Thumbnail/Thumbnail.module.scss +68 -0
  225. package/src/lib/Thumbnail/Thumbnail.spec.tsx +51 -0
  226. package/src/lib/Thumbnail/Thumbnail.stories.tsx +242 -0
  227. package/src/lib/Thumbnail/Thumbnail.tsx +28 -0
  228. package/{lib/Thumbnail/Thumbnail.type.d.ts → src/lib/Thumbnail/Thumbnail.type.tsx} +9 -6
  229. package/src/lib/Toggle/Toggle.module.scss +53 -0
  230. package/src/lib/Toggle/Toggle.spec.tsx +23 -0
  231. package/src/lib/Toggle/Toggle.stories.tsx +38 -0
  232. package/src/lib/Toggle/Toggle.tsx +32 -0
  233. package/{lib/Toggle/Toggle.types.d.ts → src/lib/Toggle/Toggle.types.ts} +3 -2
  234. package/src/lib/ToggleInput/ToggleInput.module.scss +32 -0
  235. package/src/lib/ToggleInput/ToggleInput.spec.tsx +45 -0
  236. package/src/lib/ToggleInput/ToggleInput.stories.tsx +62 -0
  237. package/src/lib/ToggleInput/ToggleInput.tsx +40 -0
  238. package/{lib/ToggleInput/ToggleInput.types.d.ts → src/lib/ToggleInput/ToggleInput.types.ts} +5 -3
  239. package/src/lib/Typography/Typography.module.scss +61 -0
  240. package/src/lib/Typography/Typography.spec.tsx +60 -0
  241. package/src/lib/Typography/Typography.stories.tsx +45 -0
  242. package/src/lib/Typography/Typography.tsx +26 -0
  243. package/src/lib/Typography/Typography.types.ts +28 -0
  244. package/src/styles/_design-tokens.scss +1 -0
  245. package/src/styles/_fonts.scss +0 -0
  246. package/src/styles/_functions.scss +17 -0
  247. package/src/styles/_mixins.scss +33 -0
  248. package/src/styles/index.scss +3 -0
  249. package/src/styles/reset.scss +67 -0
  250. package/tsconfig.json +24 -0
  251. package/tsconfig.lib.json +35 -0
  252. package/tsconfig.spec.json +20 -0
  253. package/tsconfig.storybook.json +31 -0
  254. package/vite.config.ts +57 -0
  255. package/index.js +0 -48
  256. package/index.mjs +0 -2331
  257. package/lib/BaseButton/BaseButton.d.ts +0 -11
  258. package/lib/Card/Card.d.ts +0 -3
  259. package/lib/Card/Card.types.d.ts +0 -10
  260. package/lib/Card/Card.utils.d.ts +0 -3
  261. package/lib/Card/CardBody/CardBody.d.ts +0 -3
  262. package/lib/Card/CardBody/CardBody.types.d.ts +0 -5
  263. package/lib/Card/CardHeader/CardHeader.d.ts +0 -3
  264. package/lib/Card/CardHeader/CardHeader.type.d.ts +0 -10
  265. package/lib/ContentCreatorButton/ContentCreatorButton.d.ts +0 -3
  266. package/lib/Divider/Divider.d.ts +0 -3
  267. package/lib/Divider/Divider.types.d.ts +0 -6
  268. package/lib/Fieldset/Fieldset.d.ts +0 -3
  269. package/lib/Fieldset/Fieldset.types.d.ts +0 -8
  270. package/lib/Form/Form.d.ts +0 -3
  271. package/lib/Form/Form.types.d.ts +0 -10
  272. package/lib/Icon/Icon.d.ts +0 -4
  273. package/lib/Icon/Icon.types.d.ts +0 -18
  274. package/lib/Icon/icons/24x24/index.d.ts +0 -130
  275. package/lib/Icon/icons/32x32/index.d.ts +0 -265
  276. package/lib/Icon/icons/index.d.ts +0 -395
  277. package/lib/IconButton/IconButton.d.ts +0 -3
  278. package/lib/IconButton/utils.d.ts +0 -3
  279. package/lib/Image/Image.d.ts +0 -3
  280. package/lib/Image/Image.type.d.ts +0 -5
  281. package/lib/LabelPill/LabelPill.d.ts +0 -3
  282. package/lib/LabelPill/LabelPill.types.d.ts +0 -4
  283. package/lib/Legend/Legend.d.ts +0 -3
  284. package/lib/Legend/Legend.types.d.ts +0 -5
  285. package/lib/MenuItem/MenuItem.d.ts +0 -3
  286. package/lib/MenuItem/MenuItem.types.d.ts +0 -9
  287. package/lib/NotificationBubble/NotificationBubble.d.ts +0 -3
  288. package/lib/Thumbnail/Thumbnail.d.ts +0 -3
  289. package/lib/Toggle/Toggle.d.ts +0 -3
  290. package/lib/ToggleInput/ToggleInput.d.ts +0 -3
  291. package/lib/Typography/Typography.d.ts +0 -3
  292. package/lib/Typography/Typography.types.d.ts +0 -8
  293. package/style.css +0 -1
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="none"><path stroke="#201649" stroke-linecap="round" stroke-width="1.5" d="M4 5h1.73a1 1 0 0 1 .967.744l4.205 15.884a.5.5 0 0 0 .483.372H12m11 0a2.5 2.5 0 1 1 0 5 2.5 2.5 0 0 1 0-5Zm0 0H12M7.559 9h18.783a.5.5 0 0 1 .482.634l-1.714 6.169A3 3 0 0 1 22.22 18H9.94M12 22a2.5 2.5 0 1 1 0 5 2.5 2.5 0 0 1 0-5Z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="none"><path stroke="#201649" stroke-linecap="round" stroke-width="1.5" d="M21.5 20h2.823a1 1 0 0 1 .928.629l2.2 5.5a1 1 0 0 1-.928 1.371H5.477a1 1 0 0 1-.928-1.371l2.2-5.5A1 1 0 0 1 7.677 20H10.5M24 6c-2.465-1.48-5.902-.527-7.915 2.375a.104.104 0 0 1-.17 0C13.902 5.473 10.447 4.521 8 6c-2.5 1.5-3 4.5-1.5 8 1.985 4.632 8.444 9.692 9.385 10.413.07.054.16.054.23 0 .94-.72 7.4-5.781 9.385-10.413 1.5-3.5 1-6.5-1.5-8Z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="none"><path stroke="#201649" stroke-linecap="round" stroke-width="1.5" d="M11.5 10h9m-9 0V8a2 2 0 0 1 2-2h5a2 2 0 0 1 2 2v2m-9 0h-2m11 0h2m-13 0h-3a2 2 0 0 0-2 2v11.5a2 2 0 0 0 2 2h3m0-15.5v15.5m0 0h13m0 0h3a2 2 0 0 0 2-2V12a2 2 0 0 0-2-2h-3m0 15.5V10"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="none"><path stroke="#201649" stroke-linecap="round" stroke-width="1.5" d="M18.5 13.062s-.5-1.5-2.5-1.5c-1.717 0-2.697 1.106-2.94 3m0 0a7.87 7.87 0 0 0-.06 1c0 .485.059 1 .176 1.5m-.116-2.5H11m2.06 0h2.44m-2.324 2.5c.368 1.565 1.309 3 2.824 3 2 0 2.5-1.5 2.5-1.5m-5.324-1.5H15.5m-2.324 0H11M6.5 6.923c4.185-3.591 8.803.672 9.429 1.286a.1.1 0 0 0 .142 0c.625-.614 5.243-4.877 9.43-1.286C30 10.784 27 17.063 24 20.563c-1.65 1.925-5.01 4.66-6.806 6.074a1.924 1.924 0 0 1-2.388 0C13.011 25.224 9.651 22.488 8 20.562c-3-3.5-6-9.778-1.5-13.639Z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="none"><path stroke="#201649" stroke-width="1.5" d="M28 16c0 6.627-5.373 12-12 12m12-12c0-6.627-5.373-12-12-12m12 12s-5.53 1.53-8 4c-2.47 2.47-4 8-4 8m0 0C9.373 28 4 22.627 4 16m0 0C4 9.373 9.373 4 16 4M4 16s5.53-1.53 8-4c2.47-2.47 4-8 4-8"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="none"><path stroke="#201649" stroke-width="1.5" d="M11.47 13.706H6.295C5.58 13.706 5 14.286 5 15v9.706C5 25.42 5.58 26 6.294 26h5.177m0-12.294 3.388-8.911a.457.457 0 0 1 .427-.295 3.655 3.655 0 0 1 3.618 4.172l-.38 2.657a.15.15 0 0 0 .148.171h6.358a2.588 2.588 0 0 1 2.564 2.942l-1.286 9.323A2.588 2.588 0 0 1 23.744 26H11.471m0-12.294V26"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="none"><path stroke="#201649" stroke-linecap="round" stroke-width="1.5" d="M24 9v15a3 3 0 0 1-3 3H11a3 3 0 0 1-3-3V9m19-.5h-7m-15 0h7m0 0V6a1 1 0 0 1 1-1h6a1 1 0 0 1 1 1v2.5m-8 0h8m-.5 5-7 7m0-7 7 7"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="none"><path stroke="#201649" stroke-width="1.5" d="M20.5 10.5v-3a1 1 0 0 0-1-1H5a1 1 0 0 0-1 1v16a1 1 0 0 0 1 1h1m14.5-14h3.882a1 1 0 0 1 .894.553l2.618 5.236c.07.139.106.292.106.447V23.5a1 1 0 0 1-1 1h-4m-2.5-14v6m0 0h7m-7 0V22M6 24.5a2.5 2.5 0 0 0 5 0m-5 0a2.5 2.5 0 0 1 5 0m0 0h7m5 0a2.5 2.5 0 0 1-5 0m5 0c0-1.5-1-2.5-2.5-2.5M18 24.5c0-1.5 1-2.5 2.5-2.5"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="none"><path stroke="#201649" stroke-width="1.5" d="M16 14.5a5 5 0 1 0 0-10 5 5 0 0 0 0 10Zm0 0a8 8 0 0 0-8 8v2.114c0 .834.517 1.578 1.316 1.814C10.821 26.87 13.41 27.5 16 27.5s5.18-.629 6.684-1.072c.8-.236 1.316-.98 1.316-1.814V22.5a8 8 0 0 0-8-8Z"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="none"><path stroke="#201649" stroke-width="1.5" d="M16 17a4 4 0 1 0 0-8 4 4 0 0 0 0 8Zm0 0c-3.866 0-7 3.5-7 7 0 .263.015 1.523.043 1.779M16 17c3.866 0 6.957 3.5 7 7 .003.263-.015 1.523-.043 1.779m-13.914 0A11.945 11.945 0 0 0 16 28c2.593 0 4.995-.823 6.957-2.221m-13.914 0A11.985 11.985 0 0 1 4 16C4 9.373 9.373 4 16 4s12 5.373 12 12c0 4.034-1.99 7.603-5.043 9.779"/></svg>
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="none"><path stroke="#201649" stroke-linecap="round" stroke-miterlimit="16" stroke-width="1.5" d="M16 25.5S11 21 11 16c0-3.881 3.013-7.461 4.361-8.869a.875.875 0 0 1 1.278 0C17.987 8.54 21 12.12 21 16c0 5-5 9.5-5 9.5Zm0 0c8.398 0 11.725-4.087 11.983-11.529a.926.926 0 0 0-.95-.966c-1.358.038-3.9.22-6.033 1.007M16 25.5c-8.267 0-11.713-4.137-11.983-11.529a.925.925 0 0 1 .95-.966c1.358.038 3.9.22 6.033 1.007"/></svg>
@@ -0,0 +1,9 @@
1
+ import icons24 from './24x24';
2
+ import icons32 from './32x32';
3
+
4
+ const iconsMap = {
5
+ '24': icons24,
6
+ '32': icons32,
7
+ };
8
+
9
+ export default iconsMap;
@@ -0,0 +1,37 @@
1
+ @mixin iconButtonSize($size) {
2
+ width: $size;
3
+ height: $size;
4
+ }
5
+
6
+ .iconButton {
7
+ display: flex;
8
+ flex-shrink: 0;
9
+ align-items: center;
10
+ justify-content: center;
11
+ border-radius: 50%;
12
+ background: getSemanticColor('primary', 'primary');
13
+
14
+ &:disabled {
15
+ background: getSemanticColor('surface', 'surface');
16
+ }
17
+
18
+ &:hover {
19
+ background: getSemanticColor('primary', 'primaryVariant');
20
+ }
21
+
22
+ &:active {
23
+ background: getSemanticColor('primary', 'primary');
24
+ }
25
+
26
+ &--small {
27
+ @include iconButtonSize(40px);
28
+ }
29
+
30
+ &--medium {
31
+ @include iconButtonSize(48px);
32
+ }
33
+
34
+ &--large {
35
+ @include iconButtonSize(56px);
36
+ }
37
+ }
@@ -0,0 +1,56 @@
1
+ import { render } from '@testing-library/react';
2
+ import userEvent from '@testing-library/user-event';
3
+
4
+ import IconButton from './IconButton';
5
+
6
+ describe('IconButton', () => {
7
+ it('should render a medium sized icon button by default', () => {
8
+ const { baseElement } = render(
9
+ <IconButton
10
+ icon="pencil"
11
+ ariaLabel="create post"
12
+ onClick={() => {
13
+ // empty body
14
+ }}
15
+ />,
16
+ );
17
+ const iconButtonEl = baseElement.querySelector('[type=button]');
18
+
19
+ expect(iconButtonEl).toBeInTheDocument();
20
+ expect(iconButtonEl).not.toBeEmptyDOMElement();
21
+ });
22
+
23
+ it('should render a empty button if icon and size are incompatible', () => {
24
+ const { baseElement } = render(
25
+ // @ts-expect-error no small icon for address_book
26
+ <IconButton
27
+ size="small"
28
+ icon="address_book"
29
+ onClick={() => {
30
+ // empty body
31
+ }}
32
+ />,
33
+ );
34
+ const iconButtonEl = baseElement.querySelector('[type=button]');
35
+
36
+ expect(iconButtonEl).toBeInTheDocument();
37
+ expect(iconButtonEl).toBeEmptyDOMElement();
38
+ });
39
+
40
+ it('should handle button click', async () => {
41
+ const handleClick = jest.fn();
42
+
43
+ const { baseElement } = render(
44
+ <IconButton
45
+ icon="pencil"
46
+ size="medium"
47
+ onClick={handleClick}
48
+ ariaLabel="create new post"
49
+ />,
50
+ );
51
+ const iconButtonEl = baseElement.querySelector('[type=button]');
52
+
53
+ await userEvent.click(iconButtonEl as HTMLButtonElement);
54
+ expect(handleClick).toHaveBeenCalled();
55
+ });
56
+ });
@@ -0,0 +1,36 @@
1
+ import { Meta, StoryObj } from '@storybook/react';
2
+
3
+ import Icons24 from '../Icon/icons/24x24';
4
+ import Icons32 from '../Icon/icons/32x32';
5
+
6
+ import IconButton from './IconButton';
7
+
8
+ const iconNames24 = Object.keys(Icons24);
9
+ const iconName32 = Object.keys(Icons32);
10
+ const allIconNames = Array.from(new Set([...iconNames24, ...iconName32]));
11
+
12
+ const meta: Meta<typeof IconButton> = {
13
+ argTypes: {
14
+ icon: {
15
+ control: { type: 'select' },
16
+ options: allIconNames,
17
+ },
18
+ },
19
+ component: IconButton,
20
+ title: 'Components/IconButton',
21
+ };
22
+
23
+ export default meta;
24
+ type Story = StoryObj<typeof IconButton>;
25
+
26
+ export const Primary: Story = {
27
+ args: {
28
+ icon: 'pencil',
29
+ },
30
+ parameters: {
31
+ design: {
32
+ type: 'figma',
33
+ url: 'https://www.figma.com/file/hN7xJ3rRAemUJT9T0uEfUS/Product-Design-System?type=design&node-id=6952-1150&mode=design&t=3J2DmPvWcXt6Hs2q-4',
34
+ },
35
+ },
36
+ };
@@ -0,0 +1,25 @@
1
+ import clsx from 'clsx';
2
+ import React from 'react';
3
+
4
+ import BaseButton from '../BaseButton/BaseButton';
5
+ import Icon from '../Icon/Icon';
6
+
7
+ import styles from './IconButton.module.scss';
8
+ import { IconButtonProps } from './IconButton.types';
9
+ import { getIconSize } from './utils';
10
+
11
+ const IconButton = ({ icon, size = 'medium', ...baseButtonProps }: IconButtonProps) => {
12
+ const iconSize = getIconSize(size);
13
+
14
+ return (
15
+ <BaseButton
16
+ {...baseButtonProps}
17
+ className={clsx(styles.iconButton, styles[`iconButton--${size}`])}
18
+ >
19
+ {/* @ts-expect-error Icon validates props */}
20
+ <Icon size={iconSize} name={icon} />
21
+ </BaseButton>
22
+ );
23
+ };
24
+
25
+ export default IconButton;
@@ -1,17 +1,17 @@
1
1
  import { BaseButtonProps } from '../BaseButton/BaseButton';
2
2
  import { Icon24, Icon32 } from '../Icon/Icon.types';
3
- type BaseIconButtonProps = Omit<BaseButtonProps, 'children' | 'ref' | 'className'> & ({
4
- ariaLabel: string;
5
- } | {
6
- ariaLabelledBy: string;
7
- });
3
+
4
+ type BaseIconButtonProps = Omit<BaseButtonProps, 'children' | 'ref' | 'className'> &
5
+ ({ ariaLabel: string } | { ariaLabelledBy: string });
6
+
8
7
  type IconButtonIcon24Props = {
9
- icon: Icon24;
10
- size?: 'small';
8
+ icon: Icon24;
9
+ size?: 'small';
11
10
  } & BaseIconButtonProps;
11
+
12
12
  type IconButtonIcon32Props = {
13
- icon: Icon32;
14
- size: 'medium' | 'large';
13
+ icon: Icon32;
14
+ size: 'medium' | 'large';
15
15
  } & BaseIconButtonProps;
16
+
16
17
  export type IconButtonProps = IconButtonIcon32Props | IconButtonIcon24Props;
17
- export {};
@@ -0,0 +1,6 @@
1
+ type IconButtonSize = 'large' | 'medium' | 'small';
2
+
3
+ export const getIconSize = (size: IconButtonSize) => {
4
+ if (size === 'small') return '24';
5
+ return '32';
6
+ };
@@ -0,0 +1,10 @@
1
+ import { render } from '@testing-library/react';
2
+
3
+ import Image from './Image';
4
+
5
+ describe('Image', () => {
6
+ it('should render successfully', () => {
7
+ const { baseElement } = render(<Image src="" alt="" />);
8
+ expect(baseElement).toBeTruthy();
9
+ });
10
+ });
@@ -0,0 +1,7 @@
1
+ import { ImageProps } from './Image.type';
2
+
3
+ const Image = ({ alt, className, src }: ImageProps) => (
4
+ <img className={className} src={src} alt={alt} />
5
+ );
6
+
7
+ export default Image;
@@ -0,0 +1,5 @@
1
+ export interface ImageProps {
2
+ alt: string;
3
+ className?: string;
4
+ src: string;
5
+ }
@@ -0,0 +1,33 @@
1
+ .labelPill {
2
+ display: inline-flex;
3
+ align-items: center;
4
+ justify-content: center;
5
+ border-radius: mapGet($tokens, borderRadius, lg);
6
+ background: getSemanticColor('secondary2', 'secondary2');
7
+
8
+ span {
9
+ color: getSemanticColor('secondary2', 'onSecondary2');
10
+ line-height: mapGet($tokens, lineHeight, sm);
11
+ text-align: center;
12
+ }
13
+
14
+ &--small {
15
+ height: 20px;
16
+ padding: 0 8px;
17
+
18
+ span {
19
+ font-size: 10px;
20
+ font-weight: 800;
21
+ text-transform: uppercase;
22
+ }
23
+ }
24
+
25
+ &--medium {
26
+ padding: 4px 8px;
27
+
28
+ span {
29
+ font-size: 12px;
30
+ font-weight: 700;
31
+ }
32
+ }
33
+ }
@@ -0,0 +1,23 @@
1
+ import { render } from '@testing-library/react';
2
+
3
+ import LabelPill from './LabelPill';
4
+
5
+ describe('LabelPill', () => {
6
+ it('should render with "small" size', () => {
7
+ const { baseElement } = render(<LabelPill label="New" size="small" />);
8
+ const spanElement = baseElement.querySelector('span.labelPill span');
9
+
10
+ expect(spanElement?.innerHTML).toBe('New');
11
+
12
+ const elementWithClassName = baseElement.querySelector('.labelPill--small');
13
+
14
+ expect(elementWithClassName).not.toBeNull();
15
+ });
16
+
17
+ it('should renders with "medium" size', () => {
18
+ const { baseElement } = render(<LabelPill label="New" size="medium" />);
19
+ const elementWithClassName = baseElement.querySelector('.labelPill--medium');
20
+
21
+ expect(elementWithClassName).not.toBeNull();
22
+ });
23
+ });
@@ -0,0 +1,31 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+
3
+ import LabelPill from './LabelPill';
4
+
5
+ const meta: Meta<typeof LabelPill> = {
6
+ argTypes: {
7
+ size: {
8
+ control: { type: 'select' },
9
+ options: ['small', 'medium'],
10
+ },
11
+ },
12
+ component: LabelPill,
13
+ title: 'Components/LabelPill',
14
+ };
15
+
16
+ export default meta;
17
+
18
+ type Story = StoryObj<typeof LabelPill>;
19
+
20
+ export const Primary: Story = {
21
+ args: {
22
+ label: 'new',
23
+ size: 'small',
24
+ },
25
+ parameters: {
26
+ design: {
27
+ type: 'figma',
28
+ url: 'https://www.figma.com/file/hN7xJ3rRAemUJT9T0uEfUS/Product-Design-System?node-id=1680%3A6106&mode=dev',
29
+ },
30
+ },
31
+ };
@@ -0,0 +1,16 @@
1
+ import clsx from 'clsx';
2
+
3
+ import styles from './LabelPill.module.scss';
4
+ import { LabelPillProps } from './LabelPill.types';
5
+
6
+ const LabelPill = ({ label, size }: LabelPillProps) => {
7
+ const pillClass = styles[`labelPill--${size}`];
8
+
9
+ return (
10
+ <span className={clsx(styles.labelPill, pillClass)}>
11
+ <span>{label}</span>
12
+ </span>
13
+ );
14
+ };
15
+
16
+ export default LabelPill;
@@ -0,0 +1,4 @@
1
+ export interface LabelPillProps {
2
+ label: string;
3
+ size: 'small' | 'medium';
4
+ }
@@ -0,0 +1,9 @@
1
+ .legend {
2
+ display: flex;
3
+ flex-direction: column;
4
+ padding-bottom: getSpacing('md');
5
+ gap: getSpacing('sm');
6
+ .text {
7
+ color: getSemanticColor('surface', 'onSurfaceVariant');
8
+ }
9
+ }
@@ -0,0 +1,35 @@
1
+ import { render } from '@testing-library/react';
2
+
3
+ import Legend from './Legend';
4
+
5
+ describe('Legend', () => {
6
+ it('should render with a headline', () => {
7
+ const { getByText } = render(<Legend headline="Example Headline" />);
8
+ const headlineElement = getByText('Example Headline');
9
+
10
+ expect(headlineElement).toBeInTheDocument();
11
+ });
12
+
13
+ it('should render with optional text when provided', () => {
14
+ const testText = 'Additional information';
15
+ const { getByText } = render(<Legend headline="Headline" text={testText} />);
16
+ const textElement = getByText(testText);
17
+
18
+ expect(textElement).toBeInTheDocument();
19
+ });
20
+
21
+ it('should not render optional text when not provided', () => {
22
+ const { queryByText } = render(<Legend headline="Headline" />);
23
+ const textElement = queryByText('Additional information');
24
+
25
+ expect(textElement).toBeNull();
26
+ });
27
+
28
+ it('should apply custom className if provided', () => {
29
+ const customClass = 'custom-legend-class';
30
+ const { container } = render(<Legend headline="Headline" className={customClass} />);
31
+ const legendElement = container.firstChild;
32
+
33
+ expect(legendElement).toHaveClass(customClass);
34
+ });
35
+ });
@@ -0,0 +1,39 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+
3
+ import Legend from './Legend';
4
+
5
+ const meta: Meta<typeof Legend> = {
6
+ argTypes: {
7
+ className: {
8
+ control: { type: 'text' },
9
+ description: 'Additional CSS class name',
10
+ },
11
+ headline: {
12
+ control: { type: 'text' },
13
+ description: 'Headline of the legend',
14
+ },
15
+ text: {
16
+ control: { type: 'text' },
17
+ description: 'Text of the legend',
18
+ },
19
+ },
20
+ component: Legend,
21
+ title: 'Components/Legend',
22
+ };
23
+
24
+ export default meta;
25
+
26
+ type Story = StoryObj<typeof Legend>;
27
+
28
+ export const Primary: Story = {
29
+ args: {
30
+ headline: 'Test Headline',
31
+ text: 'Test Text',
32
+ },
33
+ parameters: {
34
+ design: {
35
+ type: 'figma',
36
+ url: 'https://www.figma.com/file/Q0LB4cf1uDAOQlRv79mj2W/User-Settings?type=design&node-id=5534-27808&mode=design&t=twDm2lPGITVsLdiy-0',
37
+ },
38
+ },
39
+ };
@@ -0,0 +1,19 @@
1
+ import clsx from 'clsx';
2
+
3
+ import { Typography } from '@goodhood-web/ui';
4
+
5
+ import styles from './Legend.module.scss';
6
+ import { LegendProps } from './Legend.types';
7
+
8
+ const Legend = ({ className, headline, text }: LegendProps) => (
9
+ <legend className={clsx(styles.legend, className)}>
10
+ <Typography type="h5">{headline}</Typography>
11
+ {text && (
12
+ <Typography className={styles.text} type="body-regular" as="p">
13
+ {text}
14
+ </Typography>
15
+ )}
16
+ </legend>
17
+ );
18
+
19
+ export default Legend;
@@ -0,0 +1,5 @@
1
+ export type LegendProps = {
2
+ className?: string;
3
+ headline: string;
4
+ text?: string;
5
+ };
@@ -0,0 +1,73 @@
1
+ $color-surface: getSemanticColor('surface', 'surface');
2
+ $color-on-surface: getSemanticColor('surface', 'onSurface');
3
+ $color-on-surface-variant: getSemanticColor('surface', 'onSurfaceVariant');
4
+ $color-surface-container: getSemanticColor('surface', 'surfaceContainer');
5
+
6
+ $color-primary: getSemanticColor('primary', 'primary');
7
+ $color-on-primary-container: getSemanticColor('primary', 'onPrimaryContainer');
8
+ $color-primary-container: getSemanticColor('primary', 'primaryContainer');
9
+
10
+ $border-radius-sm: mapGet($tokens, borderRadius, sm);
11
+
12
+ $spacing-sm: getSpacing('sm');
13
+
14
+ .menuItem {
15
+ display: flex;
16
+ width: 100%;
17
+ flex-shrink: 0;
18
+ align-items: center;
19
+ padding: 0 $spacing-sm;
20
+ background-color: $color-surface;
21
+ color: $color-on-surface;
22
+ gap: $spacing-sm;
23
+ text-decoration: none;
24
+ cursor: pointer;
25
+
26
+ .highlightFrame {
27
+ display: flex;
28
+ flex: 1;
29
+ align-items: center;
30
+ padding: $spacing-sm;
31
+ border-radius: $border-radius-sm;
32
+ gap: $spacing-sm;
33
+ }
34
+
35
+ .rightIcon {
36
+ display: inherit;
37
+ margin-left: auto;
38
+
39
+ svg path {
40
+ stroke: $color-on-surface-variant !important;
41
+ }
42
+ }
43
+
44
+ &--selected {
45
+ .highlightFrame {
46
+ background-color: $color-primary-container;
47
+
48
+ svg path {
49
+ stroke: $color-on-primary-container;
50
+ }
51
+ }
52
+ &:hover {
53
+ color: $color-on-primary-container;
54
+ }
55
+ }
56
+
57
+ &:not(&--selected) {
58
+ &:active {
59
+ background-color: $color-surface-container;
60
+ }
61
+ &:hover {
62
+ color: $color-on-surface-variant;
63
+
64
+ svg path {
65
+ stroke: $color-on-surface-variant;
66
+ }
67
+
68
+ .highlightFrame {
69
+ background-color: $color-surface-container;
70
+ }
71
+ }
72
+ }
73
+ }
@@ -0,0 +1,47 @@
1
+ import { fireEvent, render, screen } from '@testing-library/react';
2
+
3
+ import MenuItem from './MenuItem';
4
+ import { MenuItemProps } from './MenuItem.types';
5
+
6
+ describe('MenuItem Component', () => {
7
+ const defaultProps: MenuItemProps = {
8
+ labelPillText: 'Label',
9
+ leftIcon: null,
10
+ onClick: jest.fn(),
11
+ rightIcon: null,
12
+ text: 'Test Menu Item',
13
+ };
14
+
15
+ it('renders with the correct props', () => {
16
+ render(<MenuItem {...defaultProps} />);
17
+
18
+ const textElement = screen.getByText(defaultProps.text);
19
+ const labelPillElement = screen.getByText(defaultProps.labelPillText);
20
+
21
+ expect(textElement).toBeInTheDocument();
22
+ expect(labelPillElement).toBeInTheDocument();
23
+ expect(textElement.textContent).toBe(defaultProps.text);
24
+ expect(labelPillElement.textContent).toBe(defaultProps.labelPillText);
25
+ });
26
+
27
+ it('renders left and right icons when provided', () => {
28
+ const mockLeftIcon = <span>Left Icon</span>;
29
+ const mockRightIcon = <span>Right Icon</span>;
30
+ render(
31
+ <MenuItem {...defaultProps} leftIcon={mockLeftIcon} rightIcon={mockRightIcon} />,
32
+ );
33
+
34
+ expect(screen.getByText('Left Icon')).toBeInTheDocument();
35
+ expect(screen.getByText('Right Icon')).toBeInTheDocument();
36
+ });
37
+
38
+ it('calls onClick when clicked', () => {
39
+ render(<MenuItem {...defaultProps} />);
40
+
41
+ const menuItem = screen.getByRole('button');
42
+
43
+ fireEvent.click(menuItem);
44
+
45
+ expect(defaultProps.onClick).toHaveBeenCalledTimes(1);
46
+ });
47
+ });