@4alldigital/foundation-ui--core 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (470) hide show
  1. package/LICENSE.txt +21 -0
  2. package/package.json +35 -0
  3. package/src/__mocks__/_examples/cnbc.ts +146 -0
  4. package/src/__mocks__/_examples/nrg.ts +222 -0
  5. package/src/__mocks__/empty-module.js +0 -0
  6. package/src/__mocks__/fileMock.js +3 -0
  7. package/src/__mocks__/fileTransformer.js +8 -0
  8. package/src/__mocks__/mockSearchData.js +511 -0
  9. package/src/__mocks__/nrglogo.svg +74 -0
  10. package/src/__mocks__/styleMock.js +3 -0
  11. package/src/__mocks__/tempPolyFills.js +5 -0
  12. package/src/components/Accordion/Accordion.stories.tsx +33 -0
  13. package/src/components/Accordion/Accordion.tsx +53 -0
  14. package/src/components/Accordion/Accordion.types.ts +8 -0
  15. package/src/components/Accordion/index.ts +1 -0
  16. package/src/components/AnimationCounter/AnimationCounter.stories.tsx +22 -0
  17. package/src/components/AnimationCounter/AnimationCounter.tsx +51 -0
  18. package/src/components/AnimationCounter/AnimationCounter.types.ts +10 -0
  19. package/src/components/AnimationCounter/index.ts +1 -0
  20. package/src/components/AnimationSet1/AnimationSet1.stories.tsx +36 -0
  21. package/src/components/AnimationSet1/AnimationSet1.tsx +107 -0
  22. package/src/components/AnimationSet1/AnimationSet1.types.ts +12 -0
  23. package/src/components/AnimationSet1/index.ts +1 -0
  24. package/src/components/Authenticator/Authenticator.stories.tsx +37 -0
  25. package/src/components/Authenticator/Authenticator.tsx +84 -0
  26. package/src/components/Authenticator/Authenticator.types.ts +7 -0
  27. package/src/components/Authenticator/index.ts +1 -0
  28. package/src/components/Avatar/Avatar.stories.tsx +26 -0
  29. package/src/components/Avatar/Avatar.tsx +88 -0
  30. package/src/components/Avatar/Avatar.types.ts +8 -0
  31. package/src/components/Avatar/index.ts +1 -0
  32. package/src/components/Banner/Banner.stories.tsx +59 -0
  33. package/src/components/Banner/Banner.tsx +60 -0
  34. package/src/components/Banner/Banner.types.ts +9 -0
  35. package/src/components/Banner/index.ts +1 -0
  36. package/src/components/Blockquote/Blockquote.stories.tsx +20 -0
  37. package/src/components/Blockquote/Blockquote.tsx +32 -0
  38. package/src/components/Blockquote/Blockquote.types.ts +8 -0
  39. package/src/components/Blockquote/index.ts +1 -0
  40. package/src/components/Button/Button.stories.tsx +50 -0
  41. package/src/components/Button/Button.tsx +117 -0
  42. package/src/components/Button/Button.types.ts +43 -0
  43. package/src/components/Button/index.ts +1 -0
  44. package/src/components/ButtonGroup/ButtonGroup.stories.tsx +59 -0
  45. package/src/components/ButtonGroup/ButtonGroup.tsx +35 -0
  46. package/src/components/ButtonGroup/ButtonGroup.types.ts +5 -0
  47. package/src/components/ButtonGroup/index.ts +1 -0
  48. package/src/components/Calendar/Calendar.stories.tsx +100 -0
  49. package/src/components/Calendar/Calendar.tsx +91 -0
  50. package/src/components/Calendar/Calendar.types.ts +10 -0
  51. package/src/components/Calendar/index.ts +2 -0
  52. package/src/components/Card/Card.stories.tsx +487 -0
  53. package/src/components/Card/Card.tsx +32 -0
  54. package/src/components/Card/Card.types.ts +79 -0
  55. package/src/components/Card/constants/index.ts +8 -0
  56. package/src/components/Card/index.ts +1 -0
  57. package/src/components/Card/types/CardBasic/CardBasic.tsx +262 -0
  58. package/src/components/Card/types/CardBasic/CardBasic.types.ts +7 -0
  59. package/src/components/Card/types/CardBasic/index.ts +1 -0
  60. package/src/components/Card/types/CardData/CardData.tsx +68 -0
  61. package/src/components/Card/types/CardData/CardData.types.ts +21 -0
  62. package/src/components/Card/types/CardData/index.ts +1 -0
  63. package/src/components/Card/types/CardHorz/CardHorz.tsx +80 -0
  64. package/src/components/Card/types/CardHorz/CardHorz.types.ts +8 -0
  65. package/src/components/Card/types/CardHorz/index.ts +1 -0
  66. package/src/components/Card/types/CardIcon/CardIcon.tsx +76 -0
  67. package/src/components/Card/types/CardIcon/CardIcon.types.ts +8 -0
  68. package/src/components/Card/types/CardIcon/index.ts +1 -0
  69. package/src/components/Card/types/CardMedia/CardMedia.tsx +277 -0
  70. package/src/components/Card/types/CardMedia/CardMedia.types.ts +5 -0
  71. package/src/components/Card/types/CardMedia/index.ts +1 -0
  72. package/src/components/Card/types/CardVideo/CardVideo.tsx +262 -0
  73. package/src/components/Card/types/CardVideo/CardVideo.types.ts +11 -0
  74. package/src/components/Card/types/CardVideo/index.ts +1 -0
  75. package/src/components/CardGrid/CardGrid.stories.tsx +122 -0
  76. package/src/components/CardGrid/CardGrid.tsx +25 -0
  77. package/src/components/CardGrid/CardGrid.types.ts +7 -0
  78. package/src/components/CardGrid/index.ts +1 -0
  79. package/src/components/Carousel/Carousel.stories.tsx +351 -0
  80. package/src/components/Carousel/Carousel.tsx +174 -0
  81. package/src/components/Carousel/Carousel.types.ts +32 -0
  82. package/src/components/Carousel/MIGRATION.md +156 -0
  83. package/src/components/Carousel/index.ts +1 -0
  84. package/src/components/Cart/Cart.stories.tsx +92 -0
  85. package/src/components/Cart/Cart.tsx +194 -0
  86. package/src/components/Cart/Cart.types.ts +4 -0
  87. package/src/components/Cart/index.ts +1 -0
  88. package/src/components/Checkbox/Checkbox.stories.tsx +18 -0
  89. package/src/components/Checkbox/Checkbox.tsx +38 -0
  90. package/src/components/Checkbox/Checkbox.types.ts +15 -0
  91. package/src/components/Checkbox/index.ts +1 -0
  92. package/src/components/Chip/Chip.stories.tsx +37 -0
  93. package/src/components/Chip/Chip.tsx +104 -0
  94. package/src/components/Chip/Chip.types.ts +13 -0
  95. package/src/components/Chip/index.ts +1 -0
  96. package/src/components/Collapsible/Collapsible.stories.tsx +139 -0
  97. package/src/components/Collapsible/Collapsible.tsx +75 -0
  98. package/src/components/Collapsible/Collapsible.types.ts +14 -0
  99. package/src/components/Collapsible/index.ts +3 -0
  100. package/src/components/Container/Container.stories.tsx +17 -0
  101. package/src/components/Container/Container.tsx +51 -0
  102. package/src/components/Container/Container.types.ts +17 -0
  103. package/src/components/Container/index.ts +1 -0
  104. package/src/components/ContentPageLayout/ContentPageLayout.stories.tsx +17 -0
  105. package/src/components/ContentPageLayout/ContentPageLayout.tsx +38 -0
  106. package/src/components/ContentPageLayout/ContentPageLayout.types.ts +17 -0
  107. package/src/components/ContentPageLayout/index.ts +1 -0
  108. package/src/components/ContentRowsLayout/ContentRowsLayout.stories.tsx +19 -0
  109. package/src/components/ContentRowsLayout/ContentRowsLayout.tsx +30 -0
  110. package/src/components/ContentRowsLayout/ContentRowsLayout.types.ts +15 -0
  111. package/src/components/ContentRowsLayout/index.ts +1 -0
  112. package/src/components/Copy/Copy.stories.tsx +28 -0
  113. package/src/components/Copy/Copy.tsx +43 -0
  114. package/src/components/Copy/Copy.types.tsx +53 -0
  115. package/src/components/Copy/index.tsx +1 -0
  116. package/src/components/DisplayHeading/DisplayHeading.stories.tsx +17 -0
  117. package/src/components/DisplayHeading/DisplayHeading.tsx +43 -0
  118. package/src/components/DisplayHeading/DisplayHeading.types.ts +8 -0
  119. package/src/components/DisplayHeading/index.ts +1 -0
  120. package/src/components/FileUpload/FileUpload.stories.tsx +18 -0
  121. package/src/components/FileUpload/FileUpload.tsx +41 -0
  122. package/src/components/FileUpload/FileUpload.types.ts +9 -0
  123. package/src/components/FileUpload/index.ts +1 -0
  124. package/src/components/Footer/Footer.stories.tsx +17 -0
  125. package/src/components/Footer/Footer.tsx +78 -0
  126. package/src/components/Footer/Footer.types.ts +4 -0
  127. package/src/components/Footer/index.ts +1 -0
  128. package/src/components/Form/Form.stories.tsx +81 -0
  129. package/src/components/Form/Form.tsx +98 -0
  130. package/src/components/Form/Form.types.ts +34 -0
  131. package/src/components/Form/index.ts +1 -0
  132. package/src/components/FormField/FormField.stories.tsx +205 -0
  133. package/src/components/FormField/FormField.tsx +258 -0
  134. package/src/components/FormField/FormField.types.ts +89 -0
  135. package/src/components/FormField/index.ts +1 -0
  136. package/src/components/FormSelect/FormSelect.stories.tsx +27 -0
  137. package/src/components/FormSelect/FormSelect.tsx +46 -0
  138. package/src/components/FormSelect/FormSelect.types.ts +45 -0
  139. package/src/components/FormSelect/index.ts +1 -0
  140. package/src/components/FullContentBackgroundImage/FullContentBackgroundImage.stories.tsx +18 -0
  141. package/src/components/FullContentBackgroundImage/FullContentBackgroundImage.tsx +26 -0
  142. package/src/components/FullContentBackgroundImage/FullContentBackgroundImage.types.ts +6 -0
  143. package/src/components/FullContentBackgroundImage/index.ts +1 -0
  144. package/src/components/FullScreenVideoModal/FullScreenVideoModal.stories.tsx +34 -0
  145. package/src/components/FullScreenVideoModal/FullScreenVideoModal.tsx +41 -0
  146. package/src/components/FullScreenVideoModal/FullScreenVideoModal.types.ts +9 -0
  147. package/src/components/FullScreenVideoModal/index.ts +1 -0
  148. package/src/components/Header/Header.stories.tsx +51 -0
  149. package/src/components/Header/Header.tsx +170 -0
  150. package/src/components/Header/Header.types.ts +11 -0
  151. package/src/components/Header/index.ts +1 -0
  152. package/src/components/Heading/Heading.stories.tsx +57 -0
  153. package/src/components/Heading/Heading.tsx +47 -0
  154. package/src/components/Heading/Heading.types.ts +35 -0
  155. package/src/components/Heading/index.ts +1 -0
  156. package/src/components/Hero/Hero.stories.tsx +17 -0
  157. package/src/components/Hero/Hero.tsx +28 -0
  158. package/src/components/Hero/Hero.types.ts +17 -0
  159. package/src/components/Hero/index.ts +1 -0
  160. package/src/components/Hr/Hr.stories.tsx +13 -0
  161. package/src/components/Hr/Hr.tsx +16 -0
  162. package/src/components/Hr/Hr.types.ts +3 -0
  163. package/src/components/Hr/index.ts +1 -0
  164. package/src/components/HtmlContent/HtmlContent.stories.tsx +29 -0
  165. package/src/components/HtmlContent/HtmlContent.tsx +36 -0
  166. package/src/components/HtmlContent/HtmlContent.types.ts +6 -0
  167. package/src/components/HtmlContent/index.ts +1 -0
  168. package/src/components/Icon/Icon.stories.tsx +26 -0
  169. package/src/components/Icon/Icon.tsx +24 -0
  170. package/src/components/Icon/Icon.types.ts +8 -0
  171. package/src/components/Icon/index.ts +2 -0
  172. package/src/components/Image/Image.stories.tsx +32 -0
  173. package/src/components/Image/Image.tsx +71 -0
  174. package/src/components/Image/Image.types.ts +20 -0
  175. package/src/components/Image/index.ts +1 -0
  176. package/src/components/Label/Label.stories.tsx +18 -0
  177. package/src/components/Label/Label.tsx +17 -0
  178. package/src/components/Label/Label.types.ts +9 -0
  179. package/src/components/Label/index.ts +1 -0
  180. package/src/components/Link/Link.stories.tsx +25 -0
  181. package/src/components/Link/Link.tsx +85 -0
  182. package/src/components/Link/Link.types.ts +14 -0
  183. package/src/components/Link/index.ts +1 -0
  184. package/src/components/List/List.stories.tsx +38 -0
  185. package/src/components/List/List.tsx +17 -0
  186. package/src/components/List/List.types.ts +27 -0
  187. package/src/components/List/index.ts +1 -0
  188. package/src/components/ListItem/ListItem.stories.tsx +61 -0
  189. package/src/components/ListItem/ListItem.tsx +53 -0
  190. package/src/components/ListItem/ListItem.types.ts +10 -0
  191. package/src/components/ListItem/index.ts +1 -0
  192. package/src/components/Loader/Loader.stories.tsx +17 -0
  193. package/src/components/Loader/Loader.tsx +34 -0
  194. package/src/components/Loader/Loader.types.ts +5 -0
  195. package/src/components/Loader/index.ts +1 -0
  196. package/src/components/Logo/Logo.stories.tsx +17 -0
  197. package/src/components/Logo/Logo.tsx +17 -0
  198. package/src/components/Logo/Logo.types.ts +6 -0
  199. package/src/components/Logo/index.ts +1 -0
  200. package/src/components/Menu/Menu.stories.tsx +37 -0
  201. package/src/components/Menu/Menu.tsx +45 -0
  202. package/src/components/Menu/Menu.types.ts +15 -0
  203. package/src/components/Menu/index.ts +1 -0
  204. package/src/components/Notice/Notice.stories.tsx +49 -0
  205. package/src/components/Notice/Notice.tsx +63 -0
  206. package/src/components/Notice/Notice.types.ts +11 -0
  207. package/src/components/Notice/index.ts +1 -0
  208. package/src/components/OTPInput/OTPInput.stories.tsx +18 -0
  209. package/src/components/OTPInput/OTPInput.tsx +80 -0
  210. package/src/components/OTPInput/OTPInput.types.ts +8 -0
  211. package/src/components/OTPInput/index.ts +1 -0
  212. package/src/components/PanelCards/PanelCards.stories.tsx +125 -0
  213. package/src/components/PanelCards/PanelCards.tsx +81 -0
  214. package/src/components/PanelCards/PanelCards.types.ts +11 -0
  215. package/src/components/PanelCards/index.ts +1 -0
  216. package/src/components/PanelCustom/PanelCustom.stories.tsx +18 -0
  217. package/src/components/PanelCustom/PanelCustom.tsx +39 -0
  218. package/src/components/PanelCustom/PanelCustom.types.ts +20 -0
  219. package/src/components/PanelCustom/index.ts +1 -0
  220. package/src/components/PanelFeature/PanelFeature.stories.tsx +46 -0
  221. package/src/components/PanelFeature/PanelFeature.tsx +83 -0
  222. package/src/components/PanelFeature/PanelFeature.types.ts +27 -0
  223. package/src/components/PanelFeature/index.ts +1 -0
  224. package/src/components/PanelHero/PanelHero.stories.tsx +126 -0
  225. package/src/components/PanelHero/PanelHero.tsx +184 -0
  226. package/src/components/PanelHero/PanelHero.types.ts +19 -0
  227. package/src/components/PanelHero/index.ts +1 -0
  228. package/src/components/PanelIntro/PanelIntro.stories.tsx +38 -0
  229. package/src/components/PanelIntro/PanelIntro.tsx +139 -0
  230. package/src/components/PanelIntro/PanelIntro.types.ts +19 -0
  231. package/src/components/PanelIntro/index.ts +1 -0
  232. package/src/components/PanelProduct/PanelProduct.stories.tsx +24 -0
  233. package/src/components/PanelProduct/PanelProduct.tsx +87 -0
  234. package/src/components/PanelProduct/PanelProduct.types.ts +14 -0
  235. package/src/components/PanelProduct/index.ts +1 -0
  236. package/src/components/PanelScroller/PanelScroller.stories.tsx +81 -0
  237. package/src/components/PanelScroller/PanelScroller.tsx +58 -0
  238. package/src/components/PanelScroller/PanelScroller.types.ts +8 -0
  239. package/src/components/PanelScroller/index.ts +1 -0
  240. package/src/components/PanelVideo/PanelVideo.stories.tsx +42 -0
  241. package/src/components/PanelVideo/PanelVideo.tsx +81 -0
  242. package/src/components/PanelVideo/PanelVideo.types.ts +11 -0
  243. package/src/components/PanelVideo/index.ts +1 -0
  244. package/src/components/Radio/Radio.stories.tsx +24 -0
  245. package/src/components/Radio/Radio.tsx +44 -0
  246. package/src/components/Radio/Radio.types.ts +13 -0
  247. package/src/components/Radio/index.ts +1 -0
  248. package/src/components/Schedule/Schedule.stories.tsx +96 -0
  249. package/src/components/Schedule/Schedule.tsx +118 -0
  250. package/src/components/Schedule/Schedule.types.ts +64 -0
  251. package/src/components/Schedule/index.ts +1 -0
  252. package/src/components/ScheduleItem/ScheduleItem.stories.tsx +21 -0
  253. package/src/components/ScheduleItem/ScheduleItem.tsx +77 -0
  254. package/src/components/ScheduleItem/ScheduleItem.types.ts +8 -0
  255. package/src/components/ScheduleItem/index.ts +1 -0
  256. package/src/components/Screen/Screen.stories.tsx +27 -0
  257. package/src/components/Screen/Screen.tsx +63 -0
  258. package/src/components/Screen/Screen.types.ts +16 -0
  259. package/src/components/Screen/index.ts +1 -0
  260. package/src/components/ShadcnButton/ShadcnButton.tsx +57 -0
  261. package/src/components/ShadcnButton/index.ts +2 -0
  262. package/src/components/ShadcnCarousel/ShadcnCarousel.tsx +261 -0
  263. package/src/components/ShadcnCarousel/index.ts +9 -0
  264. package/src/components/Share/Share.stories.tsx +17 -0
  265. package/src/components/Share/Share.tsx +60 -0
  266. package/src/components/Share/Share.types.ts +12 -0
  267. package/src/components/Share/index.ts +1 -0
  268. package/src/components/SubscriptionManager/SubscriptionManager.stories.tsx +177 -0
  269. package/src/components/SubscriptionManager/SubscriptionManager.tsx +369 -0
  270. package/src/components/SubscriptionManager/SubscriptionManager.types.ts +36 -0
  271. package/src/components/SubscriptionManager/index.ts +1 -0
  272. package/src/components/Switch/Switch.stories.tsx +20 -0
  273. package/src/components/Switch/Switch.tsx +30 -0
  274. package/src/components/Switch/Switch.types.ts +7 -0
  275. package/src/components/Switch/index.ts +1 -0
  276. package/src/components/Tabs/Tabs.stories.tsx +34 -0
  277. package/src/components/Tabs/Tabs.tsx +42 -0
  278. package/src/components/Tabs/Tabs.types.ts +8 -0
  279. package/src/components/Tabs/index.ts +1 -0
  280. package/src/components/TextInput/TextInput.stories.tsx +18 -0
  281. package/src/components/TextInput/TextInput.tsx +78 -0
  282. package/src/components/TextInput/TextInput.types.ts +81 -0
  283. package/src/components/TextInput/index.ts +1 -0
  284. package/src/components/Video/Video.stories.tsx +75 -0
  285. package/src/components/Video/Video.tsx +280 -0
  286. package/src/components/Video/Video.types.ts +147 -0
  287. package/src/components/Video/index.ts +1 -0
  288. package/src/components/VisitUs/VisitUs.stories.tsx +32 -0
  289. package/src/components/VisitUs/VisitUs.tsx +56 -0
  290. package/src/components/VisitUs/VisitUs.types.ts +13 -0
  291. package/src/components/VisitUs/index.ts +1 -0
  292. package/src/components/index.ts +143 -0
  293. package/src/constants/index.ts +6 -0
  294. package/src/context/Amplify/index.tsx +65 -0
  295. package/src/context/App/index.tsx +93 -0
  296. package/src/context/Cart/index.tsx +64 -0
  297. package/src/context/ExampleContext/index.tsx +34 -0
  298. package/src/context/Theme/index.tsx +37 -0
  299. package/src/context/index.ts +18 -0
  300. package/src/features/Search/Search.stories.tsx +395 -0
  301. package/src/features/Search/Search.tsx +204 -0
  302. package/src/features/Search/Search.types.ts +41 -0
  303. package/src/features/Search/config/config-helper.ts +219 -0
  304. package/src/features/Search/index.ts +1 -0
  305. package/src/features/Search/view-helpers/appendClassName.ts +14 -0
  306. package/src/features/Search/view-helpers/formatResult.ts +97 -0
  307. package/src/features/Search/view-helpers/getFilterValueDisplay.ts +10 -0
  308. package/src/features/Search/view-helpers/getUrlSanitizer.ts +23 -0
  309. package/src/features/Search/view-helpers/index.ts +4 -0
  310. package/src/features/Search/views/Layout/Layout.tsx +50 -0
  311. package/src/features/Search/views/Layout/Layout.types.ts +13 -0
  312. package/src/features/Search/views/Layout/index.ts +1 -0
  313. package/src/features/Search/views/MultiCheckboxFacet/MultiCheckboxFacet.tsx +85 -0
  314. package/src/features/Search/views/MultiCheckboxFacet/MultiCheckboxFacet.types.ts +5 -0
  315. package/src/features/Search/views/MultiCheckboxFacet/index.ts +1 -0
  316. package/src/features/Search/views/Paging/Paging.tsx +35 -0
  317. package/src/features/Search/views/Paging/Paging.types.ts +24 -0
  318. package/src/features/Search/views/Paging/index.ts +1 -0
  319. package/src/features/Search/views/PagingInfo/PagingInfo.tsx +34 -0
  320. package/src/features/Search/views/PagingInfo/PagingInfo.types.ts +26 -0
  321. package/src/features/Search/views/PagingInfo/index.ts +1 -0
  322. package/src/features/Search/views/Result/Result.tsx +84 -0
  323. package/src/features/Search/views/Result/Result.types.ts +47 -0
  324. package/src/features/Search/views/Result/index.ts +1 -0
  325. package/src/features/Search/views/Results/Results.tsx +16 -0
  326. package/src/features/Search/views/Results/Results.types.ts +24 -0
  327. package/src/features/Search/views/Results/index.ts +1 -0
  328. package/src/features/Search/views/ResultsPerPage/ResultsPerPage.tsx +32 -0
  329. package/src/features/Search/views/ResultsPerPage/ResultsPerPage.types.ts +26 -0
  330. package/src/features/Search/views/ResultsPerPage/index.ts +1 -0
  331. package/src/features/Search/views/SearchBox/SearchBox.tsx +51 -0
  332. package/src/features/Search/views/SearchBox/SearchBox.types.ts +10 -0
  333. package/src/features/Search/views/SearchBox/index.ts +1 -0
  334. package/src/features/Search/views/Sidebar/Sidebar.tsx +14 -0
  335. package/src/features/Search/views/Sidebar/Sidebar.types.ts +3 -0
  336. package/src/features/Search/views/Sidebar/index.ts +1 -0
  337. package/src/features/Search/views/SingleLinksFacet/SingleLinksFacet.tsx +62 -0
  338. package/src/features/Search/views/SingleLinksFacet/SingleLinksFacet.types.ts +5 -0
  339. package/src/features/Search/views/SingleLinksFacet/index.ts +1 -0
  340. package/src/features/Search/views/SingleSelectFacet/SingleSelectFacet.tsx +34 -0
  341. package/src/features/Search/views/SingleSelectFacet/SingleSelectFacet.types.ts +5 -0
  342. package/src/features/Search/views/SingleSelectFacet/index.ts +1 -0
  343. package/src/features/Search/views/Sorting/Sorting.tsx +24 -0
  344. package/src/features/Search/views/Sorting/Sorting.types.ts +25 -0
  345. package/src/features/Search/views/Sorting/index.ts +1 -0
  346. package/src/features/index.ts +11 -0
  347. package/src/forms/ForgotPasswordForm/ForgotPasswordForm.stories.tsx +19 -0
  348. package/src/forms/ForgotPasswordForm/ForgotPasswordForm.tsx +28 -0
  349. package/src/forms/ForgotPasswordForm/ForgotPasswordForm.types.ts +3 -0
  350. package/src/forms/ForgotPasswordForm/index.ts +1 -0
  351. package/src/forms/LoginForm/LoginForm.stories.tsx +67 -0
  352. package/src/forms/LoginForm/LoginForm.tsx +112 -0
  353. package/src/forms/LoginForm/LoginForm.types.ts +7 -0
  354. package/src/forms/LoginForm/index.ts +1 -0
  355. package/src/forms/ProfileForm/ProfileForm.stories.tsx +23 -0
  356. package/src/forms/ProfileForm/ProfileForm.tsx +40 -0
  357. package/src/forms/ProfileForm/ProfileForm.types.ts +6 -0
  358. package/src/forms/ProfileForm/index.ts +1 -0
  359. package/src/forms/PromoCodeForm/PromoCodeForm.stories.tsx +19 -0
  360. package/src/forms/PromoCodeForm/PromoCodeForm.tsx +22 -0
  361. package/src/forms/PromoCodeForm/PromoCodeForm.types.ts +4 -0
  362. package/src/forms/PromoCodeForm/index.ts +1 -0
  363. package/src/forms/RegisterForm/RegisterForm.stories.tsx +85 -0
  364. package/src/forms/RegisterForm/RegisterForm.tsx +108 -0
  365. package/src/forms/RegisterForm/RegisterForm.types.ts +6 -0
  366. package/src/forms/RegisterForm/index.ts +1 -0
  367. package/src/forms/ResetPasswordAuthForm/ResetPasswordAuthForm.stories.tsx +23 -0
  368. package/src/forms/ResetPasswordAuthForm/ResetPasswordAuthForm.tsx +39 -0
  369. package/src/forms/ResetPasswordAuthForm/ResetPasswordAuthForm.types.ts +3 -0
  370. package/src/forms/ResetPasswordAuthForm/index.ts +1 -0
  371. package/src/forms/ResetPasswordForm/ResetPasswordForm.stories.tsx +23 -0
  372. package/src/forms/ResetPasswordForm/ResetPasswordForm.tsx +30 -0
  373. package/src/forms/ResetPasswordForm/ResetPasswordForm.types.ts +3 -0
  374. package/src/forms/ResetPasswordForm/index.ts +1 -0
  375. package/src/forms/SubscriptionForm/SubscriptionForm.stories.tsx +31 -0
  376. package/src/forms/SubscriptionForm/SubscriptionForm.tsx +46 -0
  377. package/src/forms/SubscriptionForm/SubscriptionForm.types.ts +6 -0
  378. package/src/forms/SubscriptionForm/index.ts +1 -0
  379. package/src/forms/constants/index.ts +13 -0
  380. package/src/forms/index.ts +17 -0
  381. package/src/forms/validations/index.ts +39 -0
  382. package/src/hooks/index.ts +2 -0
  383. package/src/hooks/useLanguage.ts +18 -0
  384. package/src/hooks/useTheme.ts +6 -0
  385. package/src/index.ts +8 -0
  386. package/src/react-app-env.d.ts +1 -0
  387. package/src/setupTests.ts +5 -0
  388. package/src/templates/AccountScreen/AccountScreen.stories.tsx +67 -0
  389. package/src/templates/AccountScreen/AccountScreen.tsx +78 -0
  390. package/src/templates/AccountScreen/AccountScreen.types.ts +31 -0
  391. package/src/templates/AccountScreen/index.ts +1 -0
  392. package/src/templates/AuthScreen/AuthScreen.stories.tsx +33 -0
  393. package/src/templates/AuthScreen/AuthScreen.tsx +21 -0
  394. package/src/templates/AuthScreen/AuthScreen.types.ts +8 -0
  395. package/src/templates/AuthScreen/index.ts +1 -0
  396. package/src/templates/CardGridScreen/CardGridScreen.stories.tsx +95 -0
  397. package/src/templates/CardGridScreen/CardGridScreen.tsx +43 -0
  398. package/src/templates/CardGridScreen/CardGridScreen.types.ts +11 -0
  399. package/src/templates/CardGridScreen/index.ts +1 -0
  400. package/src/templates/CatalogueScreen/CatalogueScreen.stories.tsx +31 -0
  401. package/src/templates/CatalogueScreen/CatalogueScreen.tsx +21 -0
  402. package/src/templates/CatalogueScreen/CatalogueScreen.types.ts +8 -0
  403. package/src/templates/CatalogueScreen/index.ts +1 -0
  404. package/src/templates/ChallengeLibraryScreen/ChallengeLibraryScreen.stories.tsx +171 -0
  405. package/src/templates/ChallengeLibraryScreen/ChallengeLibraryScreen.tsx +36 -0
  406. package/src/templates/ChallengeLibraryScreen/ChallengeLibraryScreen.types.ts +9 -0
  407. package/src/templates/ChallengeLibraryScreen/index.ts +1 -0
  408. package/src/templates/ChallengeScreen/ChallengeScreen.stories.tsx +65 -0
  409. package/src/templates/ChallengeScreen/ChallengeScreen.tsx +88 -0
  410. package/src/templates/ChallengeScreen/ChallengeScreen.types.ts +22 -0
  411. package/src/templates/ChallengeScreen/index.ts +1 -0
  412. package/src/templates/ContentScreen/ContentScreen.stories.tsx +71 -0
  413. package/src/templates/ContentScreen/ContentScreen.tsx +55 -0
  414. package/src/templates/ContentScreen/ContentScreen.types.ts +9 -0
  415. package/src/templates/ContentScreen/index.ts +1 -0
  416. package/src/templates/DashboardScreen/DashboardScreen.stories.tsx +490 -0
  417. package/src/templates/DashboardScreen/DashboardScreen.tsx +156 -0
  418. package/src/templates/DashboardScreen/DashboardScreen.types.ts +28 -0
  419. package/src/templates/DashboardScreen/index.ts +1 -0
  420. package/src/templates/FAQScreen/FAQScreen.stories.tsx +278 -0
  421. package/src/templates/FAQScreen/FAQScreen.tsx +32 -0
  422. package/src/templates/FAQScreen/FAQScreen.types.ts +14 -0
  423. package/src/templates/FAQScreen/index.ts +1 -0
  424. package/src/templates/HomeScreen/HomeScreen.stories.tsx +315 -0
  425. package/src/templates/HomeScreen/HomeScreen.tsx +50 -0
  426. package/src/templates/HomeScreen/HomeScreen.types.ts +23 -0
  427. package/src/templates/HomeScreen/index.ts +1 -0
  428. package/src/templates/LogoutScreen/LogoutScreen.stories.tsx +20 -0
  429. package/src/templates/LogoutScreen/LogoutScreen.tsx +25 -0
  430. package/src/templates/LogoutScreen/LogoutScreen.types.ts +4 -0
  431. package/src/templates/LogoutScreen/index.ts +1 -0
  432. package/src/templates/MenuScreen/MenuScreen.stories.tsx +36 -0
  433. package/src/templates/MenuScreen/MenuScreen.tsx +32 -0
  434. package/src/templates/MenuScreen/MenuScreen.types.ts +11 -0
  435. package/src/templates/MenuScreen/index.ts +1 -0
  436. package/src/templates/NotFoundScreen/NotFoundScreen.stories.tsx +20 -0
  437. package/src/templates/NotFoundScreen/NotFoundScreen.tsx +31 -0
  438. package/src/templates/NotFoundScreen/NotFoundScreen.types.ts +5 -0
  439. package/src/templates/NotFoundScreen/index.ts +1 -0
  440. package/src/templates/PasswordResetAuthScreen/PasswordResetAuthScreen.stories.tsx +27 -0
  441. package/src/templates/PasswordResetAuthScreen/PasswordResetAuthScreen.tsx +20 -0
  442. package/src/templates/PasswordResetAuthScreen/PasswordResetAuthScreen.types.ts +6 -0
  443. package/src/templates/PasswordResetAuthScreen/index.ts +1 -0
  444. package/src/templates/PasswordResetScreen/PasswordResetScreen.stories.tsx +22 -0
  445. package/src/templates/PasswordResetScreen/PasswordResetScreen.tsx +19 -0
  446. package/src/templates/PasswordResetScreen/PasswordResetScreen.types.ts +6 -0
  447. package/src/templates/PasswordResetScreen/index.ts +1 -0
  448. package/src/templates/ProfileScreen/ProfileScreen.stories.tsx +41 -0
  449. package/src/templates/ProfileScreen/ProfileScreen.tsx +30 -0
  450. package/src/templates/ProfileScreen/ProfileScreen.types.ts +24 -0
  451. package/src/templates/ProfileScreen/index.ts +1 -0
  452. package/src/templates/ScheduleScreen/ScheduleScreen.stories.tsx +174 -0
  453. package/src/templates/ScheduleScreen/ScheduleScreen.tsx +29 -0
  454. package/src/templates/ScheduleScreen/ScheduleScreen.types.ts +9 -0
  455. package/src/templates/ScheduleScreen/index.ts +1 -0
  456. package/src/templates/SubscriptionScreen/SubscriptionScreen.stories.tsx +98 -0
  457. package/src/templates/SubscriptionScreen/SubscriptionScreen.tsx +49 -0
  458. package/src/templates/SubscriptionScreen/SubscriptionScreen.types.ts +28 -0
  459. package/src/templates/SubscriptionScreen/index.ts +1 -0
  460. package/src/templates/WorkoutScreen/WorkoutScreen.stories.tsx +173 -0
  461. package/src/templates/WorkoutScreen/WorkoutScreen.tsx +230 -0
  462. package/src/templates/WorkoutScreen/WorkoutScreen.types.ts +34 -0
  463. package/src/templates/WorkoutScreen/index.ts +1 -0
  464. package/src/templates/index.ts +40 -0
  465. package/src/translations/en.ts +777 -0
  466. package/src/translations/fr.ts +182 -0
  467. package/src/translations/index.ts +2 -0
  468. package/src/utils/htmlParser/index.tsx +22 -0
  469. package/src/utils/index.ts +38 -0
  470. package/src/utils/parseDuration/index.ts +94 -0
@@ -0,0 +1,156 @@
1
+ # Carousel Component Migration Guide
2
+
3
+ ## Overview
4
+ The Carousel component has been updated to use **shadcn's Embla Carousel** instead of react-slick. This fixes the responsive breakpoint issues on initial page load and provides a more modern, accessible carousel implementation.
5
+
6
+ ## What Changed?
7
+
8
+ ### New Implementation
9
+ - ✅ **Embla Carousel** (via shadcn) - Modern, lightweight carousel
10
+ - ✅ **Fixed responsive issues** - Breakpoints work correctly on initial load
11
+ - ✅ **Better accessibility** - Keyboard navigation and ARIA attributes
12
+ - ✅ **Tailwind-first** - Uses responsive Tailwind classes
13
+
14
+ ### Removed
15
+ - ❌ **react-slick** - No longer used
16
+ - ❌ **slick-carousel** styles - No longer needed
17
+
18
+ ## New API (Recommended)
19
+
20
+ The new API uses Tailwind's breakpoint naming convention for better integration:
21
+
22
+ ```tsx
23
+ <Carousel
24
+ data={items}
25
+ carouselOptions={{
26
+ slidesPerView: {
27
+ base: 1, // Mobile (default)
28
+ sm: 2, // 640px+
29
+ md: 3, // 768px+
30
+ lg: 4, // 1024px+
31
+ xl: 5, // 1280px+
32
+ '2xl': 6, // 1536px+
33
+ },
34
+ loop: true,
35
+ showArrows: true,
36
+ }}
37
+ />
38
+ ```
39
+
40
+ ### Breakpoint Reference
41
+ | Breakpoint | Min Width | CSS Media Query |
42
+ |------------|-----------|-----------------|
43
+ | `base` | 0px | Default (mobile-first) |
44
+ | `sm` | 640px | `@media (min-width: 640px)` |
45
+ | `md` | 768px | `@media (min-width: 768px)` |
46
+ | `lg` | 1024px | `@media (min-width: 1024px)` |
47
+ | `xl` | 1280px | `@media (min-width: 1280px)` |
48
+ | `2xl` | 1536px | `@media (min-width: 1536px)` |
49
+
50
+ ## Legacy API (Still Supported)
51
+
52
+ For backward compatibility, the old API still works:
53
+
54
+ ```tsx
55
+ <Carousel
56
+ data={items}
57
+ carouselOptions={{
58
+ slidesToShow: 4,
59
+ responsive: [
60
+ {
61
+ breakpoint: 1024,
62
+ settings: {
63
+ slidesToShow: 3,
64
+ },
65
+ },
66
+ {
67
+ breakpoint: 600,
68
+ settings: {
69
+ slidesToShow: 1,
70
+ },
71
+ },
72
+ ],
73
+ loop: true,
74
+ showArrows: true,
75
+ }}
76
+ />
77
+ ```
78
+
79
+ ## Migration Examples
80
+
81
+ ### Before (react-slick)
82
+ ```tsx
83
+ const carouselOptions = {
84
+ loop: false,
85
+ slidesToShow: 5,
86
+ scrollAnimationDuration: 350,
87
+ showDots: false,
88
+ showArrows: true,
89
+ responsive: [
90
+ {
91
+ breakpoint: 1324,
92
+ settings: { slidesToShow: 4 },
93
+ },
94
+ {
95
+ breakpoint: 1024,
96
+ settings: { slidesToShow: 3 },
97
+ },
98
+ {
99
+ breakpoint: 600,
100
+ settings: { slidesToShow: 1 },
101
+ },
102
+ ],
103
+ };
104
+ ```
105
+
106
+ ### After (shadcn/Embla)
107
+ ```tsx
108
+ const carouselOptions = {
109
+ loop: false,
110
+ showArrows: true,
111
+ slidesPerView: {
112
+ base: 1, // < 640px
113
+ sm: 1, // 640px - 767px
114
+ md: 3, // 768px - 1023px
115
+ lg: 4, // 1024px - 1279px
116
+ xl: 5, // 1280px+
117
+ },
118
+ };
119
+ ```
120
+
121
+ ## Removed Options
122
+
123
+ The following options are no longer supported:
124
+
125
+ - `scrollAnimationDuration` - Handled by Embla's default animation
126
+ - `showDots` - Not implemented (can be added if needed)
127
+ - `autoPlay` - Not implemented (can be added if needed)
128
+ - `autoplaySpeed` - Not implemented (can be added if needed)
129
+ - `easing` - Handled by Embla's default easing
130
+ - `rtl` - Not implemented (can be added if needed)
131
+ - `onSnapToItem` - Use Embla's API directly if needed
132
+ - `shouldScrollOnClick` - Not applicable
133
+
134
+ ## Benefits of New Implementation
135
+
136
+ 1. **Fixed Initial Load Issue** ✅
137
+ - Responsive breakpoints now work correctly on page load
138
+ - No need for window resize or device rotation
139
+
140
+ 2. **Better Performance** ⚡
141
+ - Lighter bundle size (Embla vs react-slick)
142
+ - Native browser features where possible
143
+
144
+ 3. **Improved Accessibility** ♿
145
+ - Better keyboard navigation
146
+ - Proper ARIA attributes
147
+ - Screen reader support
148
+
149
+ 4. **Modern Stack** 🔧
150
+ - Tailwind CSS integration
151
+ - TypeScript first
152
+ - React 19 compatible
153
+
154
+ ## Need Help?
155
+
156
+ If you encounter any issues during migration or need additional features from the old API, please reach out to the team or create an issue in the repository.
@@ -0,0 +1 @@
1
+ export { default } from './Carousel';
@@ -0,0 +1,92 @@
1
+ import type { Meta, StoryObj } from '@storybook/nextjs';
2
+ import Cart from '.';
3
+ import { CartProvider } from '../../context';
4
+
5
+ const meta: Meta<typeof Cart> = {
6
+ title: 'UI/Cart',
7
+ component: Cart,
8
+ };
9
+
10
+ type Story = StoryObj<typeof Cart>;
11
+
12
+ export const Default: Story = {
13
+ args: {
14
+ isCheckout: true,
15
+ },
16
+ render: props => {
17
+ const exampleAppData = {
18
+ value: {
19
+ items: [
20
+ {
21
+ uuid: '123',
22
+ title: 'Inside Alef, the company trying to build a car you can both drive and fly',
23
+ image: 'https://picsum.photos/600/400',
24
+ options: {
25
+ usage: 'Personal',
26
+ selectedPrice: 10,
27
+ selectedLicense: 'Standard',
28
+ },
29
+ },
30
+ {
31
+ uuid: '456',
32
+ title: 'Item 2',
33
+ image: 'https://picsum.photos/650/300',
34
+ options: {
35
+ usage: 'Commercial',
36
+ selectedPrice: 20,
37
+ selectedLicense: 'Extended',
38
+ },
39
+ },
40
+ ],
41
+ taxRate: {
42
+ country: 'US',
43
+ percentage: 10,
44
+ },
45
+ taxAmount: 3,
46
+ promoCode: {
47
+ code: 'ABC123',
48
+ name: 'Summer Sale',
49
+ discount: '10%',
50
+ discountedAmount: 3,
51
+ },
52
+ currency: {
53
+ symbol: '$',
54
+ code: 'USD',
55
+ showCode: true,
56
+ },
57
+ cartTotal: new Intl.NumberFormat('en-US', {
58
+ style: 'currency',
59
+ currency: 'USD',
60
+ currencyDisplay: 'symbol',
61
+ }).format(30),
62
+ },
63
+ handleRemoveFromCart: (uuid: string) => {
64
+ console.log('Removing item from cart', uuid);
65
+ },
66
+ handleRemovePromoCode: (uuid: string) => {
67
+ console.log('Removing promo code from cart', uuid);
68
+ },
69
+ handleCheckout: () => {
70
+ console.log('Checking out');
71
+ },
72
+ handleItemClick: (uuid: string) => {
73
+ console.log('Item clicked', uuid);
74
+ },
75
+ };
76
+
77
+ /* TODO review:
78
+ new Intl.NumberFormat("en-GB", {
79
+ style: "currency",
80
+ currency: "GBP",
81
+ })
82
+ */
83
+
84
+ return (
85
+ <CartProvider data={exampleAppData}>
86
+ <Cart {...props} />
87
+ </CartProvider>
88
+ );
89
+ },
90
+ };
91
+
92
+ export default meta;
@@ -0,0 +1,194 @@
1
+ import React, { useEffect, useRef, useState } from 'react';
2
+ import cx from 'classnames';
3
+ import { Props } from './Cart.types';
4
+ import { useCartContext } from '../../context';
5
+ import DisplayHeading from '../DisplayHeading';
6
+ import { HEADING_TAGS } from '../Heading/Heading.types';
7
+ import Heading from '../Heading';
8
+ import List from '../List';
9
+ import { ListTag } from '../List/List.types';
10
+ import Copy from '../Copy';
11
+ import Button from '../Button';
12
+ import { BTN_SIZES, BTN_TYPES, BTN_VARIANTS } from '../Button/Button.types';
13
+ import { useLanguage } from '../../hooks';
14
+ import ListItem from '../ListItem';
15
+ import Image from '../Image';
16
+ import PromoCodeForm from '../../forms/PromoCodeForm';
17
+
18
+ const Cart = ({ testID, isCheckout }: Props) => {
19
+ const context = useCartContext();
20
+ const T = useLanguage();
21
+
22
+ const [showCart, setShowCart] = useState(false);
23
+ const popupRef = useRef<HTMLDivElement>(null); // To reference the popup box
24
+ const promoCode = context?.value?.promoCode?.code;
25
+
26
+ // Function to handle clicks outside the popup
27
+ const handleClickOutside = (event: MouseEvent) => {
28
+ if (popupRef.current && !popupRef.current.contains(event.target as Node)) {
29
+ setShowCart(false); // Close popup if clicked outside
30
+ }
31
+ };
32
+
33
+ useEffect(() => {
34
+ // Attach the event listener when the component mounts
35
+ document.addEventListener('mousedown', handleClickOutside);
36
+
37
+ // Cleanup the event listener when the component unmounts
38
+ return () => {
39
+ document.removeEventListener('mousedown', handleClickOutside);
40
+ };
41
+ }, []);
42
+
43
+ return (
44
+ <div data-testid={testID || '"Cart"'} className="relative">
45
+ <div className="relative">
46
+ {!isCheckout && (
47
+ <>
48
+ <Button
49
+ rounded
50
+ icon="mdi:cart"
51
+ onClick={event => {
52
+ event.stopPropagation();
53
+ setShowCart(!showCart);
54
+ }}
55
+ />
56
+ {context?.value?.items && context.value.items.length > 0 && (
57
+ <div className="absolute rounded-full bg-accent p-2 w-6 h-6 -top-2 -left-2 flex items-center justify-center">
58
+ <Copy className="mb-0 text-white text-sm">{String(context?.value?.items.length)}</Copy>
59
+ </div>
60
+ )}
61
+ </>
62
+ )}
63
+ </div>
64
+ {(showCart || isCheckout) && (
65
+ <div
66
+ ref={popupRef}
67
+ className={cx(
68
+ 'min-w-128 text-body-text dark:text-body-text-dark bg-body-bg dark:bg-body-bg-dark',
69
+ { 'rounded shadow absolute top-12 p-4 right-0': !isCheckout },
70
+ )}>
71
+ {!isCheckout && <DisplayHeading tag={HEADING_TAGS.H3} text="Cart" />}
72
+ {context?.value?.items && context?.value?.items.length > 0 && (
73
+ <div>
74
+ <List as={ListTag.UL} className="">
75
+ {context?.value?.items.map((item: any) => {
76
+ const itemTitle = item.title || item.generatedTitle || item.uuid;
77
+ return (
78
+ <ListItem key={item.uuid} as="li">
79
+ <div className="flex flex-row gap-4 p-2 border border-solid border-grey-100 rounded mb-2">
80
+ <Button
81
+ variant={BTN_VARIANTS.LINK}
82
+ className="w-full p-0"
83
+ onClick={() => context?.handleItemClick?.(item.uuid)}>
84
+ <div className="flex gap-2 w-full">
85
+ <div className="relative max-w-32 flex flex-1 overflow-hidden rounded h-20">
86
+ <Image
87
+ src={item.image}
88
+ alt="item image"
89
+ className="aspect-[2/1] w-auto h-auto object-cover"
90
+ />
91
+ </div>
92
+ <div className="max-w-64 flex-1 text-left">
93
+ <Copy className="mb-0 line-clamp-2">{itemTitle}</Copy>
94
+ <Copy className="mb-0">${item?.options?.selectedPrice} USD</Copy>
95
+ </div>
96
+ </div>
97
+ </Button>
98
+ <div className="flex items-center justify-center">
99
+ <Button
100
+ id="remove-cart-btn"
101
+ rounded
102
+ variant={BTN_VARIANTS.SECONDARY}
103
+ type={BTN_TYPES.BUTTON}
104
+ onClick={() => {
105
+ context?.handleRemoveFromCart?.(item.uuid);
106
+ if (context?.value?.items && context.value.items.length === 1) {
107
+ setTimeout(() => {
108
+ setShowCart(false);
109
+ }, 2000);
110
+ }
111
+ }}
112
+ icon="mdi:delete"
113
+ />
114
+ </div>
115
+ </div>
116
+ </ListItem>
117
+ );
118
+ })}
119
+ </List>
120
+ <div className="mt-4" />
121
+ {isCheckout && (
122
+ <>
123
+ <div className="flex items-start justify-start">
124
+ <PromoCodeForm handleSubmit={(value: string) => context?.handleAddPromoCode?.(value)} />
125
+ </div>
126
+ <Copy>
127
+ {T?.UI?.TAX}: {context?.value?.taxRate?.percentage}%
128
+ </Copy>
129
+ <Copy>
130
+ {T?.UI?.TAX_DUE}: {context?.value?.currency?.symbol}
131
+ {context?.value?.taxAmount} {context?.value?.currency?.code}
132
+ </Copy>
133
+ {promoCode && (
134
+ <div className="flex gap-4 items-center justify-between">
135
+ <Copy>
136
+ {T?.UI?.PROMO_CODE}: {promoCode}
137
+ </Copy>
138
+ <div>
139
+ <Button
140
+ rounded
141
+ id="remove-promo-btn"
142
+ variant={BTN_VARIANTS.SECONDARY}
143
+ outline
144
+ type={BTN_TYPES.BUTTON}
145
+ onClick={() => context?.handleRemovePromoCode?.(promoCode)}
146
+ className=""
147
+ icon="mdi:window-close"
148
+ />
149
+ </div>
150
+ </div>
151
+ )}
152
+ </>
153
+ )}
154
+ <Copy>
155
+ {T?.UI?.TOTAL}: {context?.value?.cartTotal}{' '}
156
+ {context?.value?.currency?.showCode && context?.value?.currency?.code}
157
+ </Copy>
158
+ {!isCheckout && (
159
+ <div className="flex items-center justify-between gap-4">
160
+ <div className="">
161
+ <Button size={BTN_SIZES.SMALL} variant={BTN_VARIANTS.SECONDARY} onClick={() => setShowCart(false)}>
162
+ {T?.UI?.CONTINUE_BROWSING}
163
+ </Button>
164
+ </div>
165
+ <div className="">
166
+ <Button
167
+ size={BTN_SIZES.SMALL}
168
+ variant={BTN_VARIANTS.PRIMARY}
169
+ onClick={() => {
170
+ setShowCart(false);
171
+ context?.handleCheckout?.();
172
+ }}>
173
+ {T?.UI?.CHECKOUT}
174
+ </Button>
175
+ </div>
176
+ </div>
177
+ )}
178
+ </div>
179
+ )}
180
+ {(!context?.value?.items || context?.value?.items?.length === 0) && (
181
+ <div>
182
+ <Heading tag={HEADING_TAGS.H5}>{T?.UI?.EMPTY}</Heading>
183
+ </div>
184
+ )}
185
+ </div>
186
+ )}
187
+ </div>
188
+ );
189
+ };
190
+
191
+ Cart.displayName = 'Cart';
192
+
193
+ export default Cart;
194
+ export type { Props };
@@ -0,0 +1,4 @@
1
+ export interface Props {
2
+ testID?: string;
3
+ isCheckout?: boolean;
4
+ }
@@ -0,0 +1 @@
1
+ export { default } from './Cart';
@@ -0,0 +1,18 @@
1
+ import type { Meta, StoryObj } from '@storybook/nextjs';
2
+ import Checkbox from '.';
3
+
4
+ const meta: Meta<typeof Checkbox> = {
5
+ title: 'ATOMS/Checkbox',
6
+ component: Checkbox,
7
+ };
8
+
9
+ type Story = StoryObj<typeof Checkbox>;
10
+
11
+ export const Default: Story = {};
12
+
13
+ Default.args = {
14
+ id: 'id',
15
+ label: 'My Checkbox Label',
16
+ };
17
+
18
+ export default meta;
@@ -0,0 +1,38 @@
1
+ import { forwardRef } from 'react';
2
+ import cx from 'classnames';
3
+ import { Props } from './Checkbox.types';
4
+ import Icon from '../Icon';
5
+
6
+ const Checkbox = forwardRef(function MyInput(
7
+ { id, label, required, className, disabled, ...rest }: Props,
8
+ ref: any,
9
+ ) {
10
+ return (
11
+ <div data-testid="Checkbox" className={cx('flex items-center', className)}>
12
+ <div className="relative bg-none w-5 h-5 flex justify-center items-center">
13
+ <input
14
+ id={id}
15
+ ref={ref}
16
+ disabled={disabled}
17
+ type="checkbox"
18
+ className="form-item checkbox m-0 appearance-none peer h-full w-full shrink-0 focus:ring-2"
19
+ required={required}
20
+ {...rest}
21
+ />
22
+ <span className="absolute transition-opacity opacity-0 pointer-events-none peer-checked:opacity-100 w-full h-full flex items-center justify-center top-0 left-0">
23
+ <Icon name="mdi:check-bold" size={12} />
24
+ </span>
25
+ </div>
26
+ {label && (
27
+ <label className="label pl-2 leading-none text-sm text-body-text dark:text-body-text-dark" htmlFor={id}>
28
+ {label}
29
+ </label>
30
+ )}
31
+ </div>
32
+ );
33
+ });
34
+
35
+ Checkbox.displayName = 'Checkbox';
36
+
37
+ export default Checkbox;
38
+ export type { Props };
@@ -0,0 +1,15 @@
1
+ export enum Size {
2
+ SMALL = 'small',
3
+ MEDIUM = 'medium',
4
+ LARGE = 'large',
5
+ }
6
+
7
+ export interface Props {
8
+ id: string;
9
+ label?: string | React.ReactNode[];
10
+ required?: boolean;
11
+ className?: string;
12
+ disabled?: boolean;
13
+ checked?: boolean;
14
+ onChange?: (e: React.ChangeEvent<HTMLInputElement>) => void;
15
+ }
@@ -0,0 +1 @@
1
+ export { default } from './Checkbox';
@@ -0,0 +1,37 @@
1
+ import type { Meta, StoryObj } from '@storybook/nextjs';
2
+ import Chip from '.';
3
+
4
+ const meta: Meta<typeof Chip> = {
5
+ title: 'ATOMS/Chip',
6
+ component: Chip,
7
+ };
8
+
9
+ type Story = StoryObj<typeof Chip>;
10
+
11
+ export const Default: Story = {
12
+ args: {
13
+ text: 'Chip',
14
+ outline: true,
15
+ },
16
+ };
17
+
18
+ export const WithIcon = {
19
+ args: {
20
+ text: 'Chip',
21
+ outline: true,
22
+ icon: 'mdi:check',
23
+ },
24
+ };
25
+
26
+ export const ClickeableCip = {
27
+ args: {
28
+ text: 'Chip',
29
+ outline: true,
30
+ icon: 'mdi:close',
31
+ rounded: true,
32
+ variant: 'error',
33
+ onClick: () => alert('Chip clicked'),
34
+ },
35
+ };
36
+
37
+ export default meta;
@@ -0,0 +1,104 @@
1
+ import React, { useMemo } from 'react';
2
+ import { twMerge } from 'tailwind-merge';
3
+ import cx from 'classnames';
4
+ import { Props } from './Chip.types';
5
+ import Icon from '../Icon';
6
+ import Link from '../Link';
7
+ import Copy from '../Copy';
8
+ import { COPY_SIZE, COPY_TAG } from '../Copy/Copy.types';
9
+
10
+ const Chip = ({
11
+ testID,
12
+ text,
13
+ outline,
14
+ rounded,
15
+ variant,
16
+ size = 'medium',
17
+ icon,
18
+ iconFirst,
19
+ onClick,
20
+ }: Props) => {
21
+ const contentSizeMap = useMemo(() => {
22
+ switch (size) {
23
+ case 'small':
24
+ return {
25
+ iconSize: 16,
26
+ copySize: COPY_SIZE.SMALL,
27
+ };
28
+ case 'medium':
29
+ return {
30
+ iconSize: 20,
31
+ copySize: COPY_SIZE.MEDIUM,
32
+ };
33
+ case 'large':
34
+ return {
35
+ iconSize: 28,
36
+ copySize: COPY_SIZE.LARGE,
37
+ };
38
+ default:
39
+ return {
40
+ iconSize: 20,
41
+ copySize: COPY_SIZE.MEDIUM,
42
+ };
43
+ }
44
+ }, [size]);
45
+
46
+ const classes = twMerge(
47
+ cx(
48
+ 'flex inline-flex items-center justify-center rounded select-none gap-2',
49
+ { 'border border-solid border-primary': outline },
50
+ { 'rounded-full': rounded },
51
+ { 'flex-row-reverse': iconFirst },
52
+ {
53
+ 'bg-primary text-white': variant === 'primary',
54
+ },
55
+ { 'bg-secondary text-white': variant === 'secondary' },
56
+ { 'bg-tertiary text-white': variant === 'tertiary' },
57
+ { 'bg-info text-white': variant === 'info' },
58
+ {
59
+ 'bg-success text-white': variant === 'success',
60
+ },
61
+ { 'bg-warning text-white': variant === 'warning' },
62
+ { 'bg-error text-white': variant === 'error' },
63
+ {
64
+ 'py-1 px-3': size === 'small',
65
+ },
66
+ { 'py-2 px-4': size === 'medium' },
67
+ { 'py-3 px-6': size === 'large' },
68
+ ),
69
+ );
70
+
71
+ if (onClick && typeof onClick === 'function') {
72
+ return (
73
+ <Link data-testid={testID || 'Chip'} className={classes} onClick={onClick}>
74
+ <Copy className="mb-0" as={COPY_TAG.SPAN} size={contentSizeMap.copySize}>
75
+ {text}
76
+ </Copy>
77
+
78
+ {icon && (
79
+ <div className="flex items-center justify-center">
80
+ <Icon name={icon} size={contentSizeMap.iconSize} />
81
+ </div>
82
+ )}
83
+ </Link>
84
+ );
85
+ }
86
+
87
+ return (
88
+ <div data-testid={testID || 'Chip'} className={classes}>
89
+ <Copy className="mb-0" as={COPY_TAG.SPAN} size={contentSizeMap.copySize}>
90
+ {text}
91
+ </Copy>
92
+ {icon && (
93
+ <div className="flex items-center justify-center">
94
+ <Icon name={icon} size={contentSizeMap.iconSize} />
95
+ </div>
96
+ )}
97
+ </div>
98
+ );
99
+ };
100
+
101
+ Chip.displayName = 'Chip';
102
+
103
+ export default Chip;
104
+ export type { Props };
@@ -0,0 +1,13 @@
1
+ export type ChipVariant = 'primary' | 'secondary' | 'tertiary' | 'info' | 'success' | 'warning' | 'error';
2
+
3
+ export interface Props {
4
+ testID?: string;
5
+ text: string;
6
+ outline?: boolean;
7
+ rounded?: boolean;
8
+ variant?: ChipVariant;
9
+ size?: 'small' | 'medium' | 'large';
10
+ icon?: string;
11
+ iconFirst?: boolean;
12
+ onClick?: () => void;
13
+ }
@@ -0,0 +1 @@
1
+ export { default } from './Chip';