@strapi/design-system 1.2.7 → 1.3.0-beta.1

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 (730) hide show
  1. package/.eslintignore +3 -0
  2. package/.eslintrc.js +38 -0
  3. package/.prettierrc.js +7 -0
  4. package/.storybook/components/Theme.js +28 -0
  5. package/.storybook/main.js +13 -0
  6. package/.storybook/manager.js +12 -0
  7. package/.storybook/preview.js +42 -0
  8. package/.storybook/utils/createCustomTheme.js +26 -0
  9. package/LICENSE +20 -0
  10. package/__mocks__/fileMock.js +1 -0
  11. package/__mocks__/styleMock.js +1 -0
  12. package/babel.config.js +5 -0
  13. package/createIndexFiles.js +34 -0
  14. package/global-setup.js +4 -0
  15. package/jest.config.js +17 -0
  16. package/package.json +3 -3
  17. package/playwright.config.js +39 -0
  18. package/src/Accordion/Accordion.js +148 -0
  19. package/src/Accordion/Accordion.stories.mdx +327 -0
  20. package/src/Accordion/AccordionContent.js +26 -0
  21. package/src/Accordion/AccordionContext.js +5 -0
  22. package/src/Accordion/AccordionGroup.js +114 -0
  23. package/src/Accordion/AccordionToggle.js +192 -0
  24. package/src/Accordion/__tests__/Accordion.e2e.js +32 -0
  25. package/src/Accordion/__tests__/AccordionKeyboard.e2e.js +73 -0
  26. package/src/Accordion/index.js +4 -0
  27. package/src/Accordion/utils.js +15 -0
  28. package/src/Alert/Alert.js +144 -0
  29. package/src/Alert/Alert.stories.mdx +135 -0
  30. package/src/Alert/__tests__/Alert.e2e.js +39 -0
  31. package/src/Alert/index.js +1 -0
  32. package/src/Alert/utils.js +35 -0
  33. package/src/Avatar/Avatar.js +110 -0
  34. package/src/Avatar/Avatar.stories.mdx +67 -0
  35. package/src/Avatar/AvatarGroup.js +9 -0
  36. package/src/Avatar/__tests__/Avatar.e2e.js +23 -0
  37. package/src/Avatar/__tests__/Avatar.spec.js +153 -0
  38. package/src/Avatar/constants.js +2 -0
  39. package/src/Avatar/index.js +2 -0
  40. package/src/Badge/Badge.js +41 -0
  41. package/src/Badge/Badge.stories.mdx +57 -0
  42. package/src/Badge/__tests__/Badge.e2e.js +23 -0
  43. package/src/Badge/index.js +1 -0
  44. package/src/BaseButton/BaseButton.js +46 -0
  45. package/src/BaseButton/BaseButton.stories.mdx +32 -0
  46. package/src/BaseButton/__tests__/BaseButton.e2e.js +23 -0
  47. package/src/BaseButton/index.js +1 -0
  48. package/src/BaseCheckbox/BaseCheckbox.js +133 -0
  49. package/src/BaseCheckbox/BaseCheckbox.stories.mdx +107 -0
  50. package/src/BaseCheckbox/__tests__/BaseCheckbox.e2e.js +94 -0
  51. package/src/BaseCheckbox/assets/checkmark-black.svg +6 -0
  52. package/src/BaseCheckbox/assets/checkmark.svg +6 -0
  53. package/src/BaseCheckbox/index.js +1 -0
  54. package/src/BaseCheckbox/utils.js +7 -0
  55. package/src/BaseLink/BaseLink.js +38 -0
  56. package/src/BaseLink/BaseLink.stories.mdx +34 -0
  57. package/src/BaseLink/__tests__/BaseLink.e2e.js +23 -0
  58. package/src/BaseLink/__tests__/BaseLink.spec.js +26 -0
  59. package/src/BaseLink/index.js +1 -0
  60. package/src/BaseRadio/BaseRadio.js +69 -0
  61. package/src/BaseRadio/BaseRadio.stories.mdx +110 -0
  62. package/src/BaseRadio/RadioGroup.js +36 -0
  63. package/src/BaseRadio/__tests__/BaseRadio.e2e.js +90 -0
  64. package/src/BaseRadio/context.js +3 -0
  65. package/src/BaseRadio/index.js +2 -0
  66. package/src/BaseRadio/utils.js +30 -0
  67. package/src/Box/Box.js +104 -0
  68. package/src/Box/Box.stories.mdx +57 -0
  69. package/src/Box/BoxProps.js +99 -0
  70. package/src/Box/__tests__/Box.e2e.js +23 -0
  71. package/src/Box/__tests__/Box.spec.js +36 -0
  72. package/src/Box/index.js +1 -0
  73. package/src/Breadcrumbs/Breadcrumbs.js +58 -0
  74. package/src/Breadcrumbs/Breadcrumbs.stories.mdx +47 -0
  75. package/src/Breadcrumbs/__tests__/Breadcrumbs.e2e.js +23 -0
  76. package/src/Breadcrumbs/index.js +1 -0
  77. package/src/Button/Button.js +138 -0
  78. package/src/Button/Button.stories.mdx +216 -0
  79. package/src/Button/__tests__/Button.e2e.js +89 -0
  80. package/src/Button/__tests__/utils.spec.js +19 -0
  81. package/src/Button/constants.js +12 -0
  82. package/src/Button/index.js +1 -0
  83. package/src/Button/utils.js +170 -0
  84. package/src/Card/Card.js +35 -0
  85. package/src/Card/Card.stories.mdx +202 -0
  86. package/src/Card/CardAction.js +13 -0
  87. package/src/Card/CardAsset.js +49 -0
  88. package/src/Card/CardBadge.js +18 -0
  89. package/src/Card/CardBody.js +11 -0
  90. package/src/Card/CardCheckbox.js +14 -0
  91. package/src/Card/CardContent.js +16 -0
  92. package/src/Card/CardContext.js +5 -0
  93. package/src/Card/CardHeader.js +12 -0
  94. package/src/Card/CardTimer.js +23 -0
  95. package/src/Card/CardTitle.js +12 -0
  96. package/src/Card/__tests__/Card.e2e.js +164 -0
  97. package/src/Card/index.js +10 -0
  98. package/src/Card/story-assets/first.jpg +0 -0
  99. package/src/CarouselInput/Carousel.js +138 -0
  100. package/src/CarouselInput/Carousel.stories.mdx +149 -0
  101. package/src/CarouselInput/CarouselActions.js +6 -0
  102. package/src/CarouselInput/CarouselImage.js +39 -0
  103. package/src/CarouselInput/CarouselInput.js +80 -0
  104. package/src/CarouselInput/CarouselSlide.js +32 -0
  105. package/src/CarouselInput/__tests__/CarouselImage.e2e.js +15 -0
  106. package/src/CarouselInput/__tests__/CarouselInput.e2e.js +48 -0
  107. package/src/CarouselInput/index.js +5 -0
  108. package/src/CarouselInput/story-assets/first.jpg +0 -0
  109. package/src/Checkbox/Checkbox.js +63 -0
  110. package/src/Checkbox/Checkbox.stories.mdx +190 -0
  111. package/src/Checkbox/__tests__/Checkbox.e2e.js +96 -0
  112. package/src/Checkbox/index.js +1 -0
  113. package/src/Combobox/Combobox.js +421 -0
  114. package/src/Combobox/Combobox.stories.mdx +191 -0
  115. package/src/Combobox/ComboboxList.js +22 -0
  116. package/src/Combobox/ComboboxOption.js +36 -0
  117. package/src/Combobox/__tests__/Combobox.e2e.js +133 -0
  118. package/src/Combobox/__tests__/utils.spec.js +94 -0
  119. package/src/Combobox/components.js +69 -0
  120. package/src/Combobox/index.js +2 -0
  121. package/src/Combobox/utils.js +97 -0
  122. package/src/DatePicker/DatePicker.js +132 -0
  123. package/src/DatePicker/DatePicker.stories.mdx +172 -0
  124. package/src/DatePicker/DatePickerCalendar.js +134 -0
  125. package/src/DatePicker/DatePickerTd.js +51 -0
  126. package/src/DatePicker/DatePickerTh.js +39 -0
  127. package/src/DatePicker/__tests__/DatePicker.e2e.js +94 -0
  128. package/src/DatePicker/__tests__/DatePicker.spec.js +40 -0
  129. package/src/DatePicker/compareDates.js +9 -0
  130. package/src/DatePicker/components.js +45 -0
  131. package/src/DatePicker/index.js +1 -0
  132. package/src/DatePicker/utils/formatDate.js +5 -0
  133. package/src/DatePicker/utils/generateWeeks.js +58 -0
  134. package/src/DatePicker/utils/getDayOfWeek.js +24 -0
  135. package/src/DatePicker/utils/getMonths.js +10 -0
  136. package/src/DatePicker/utils/getYears.js +19 -0
  137. package/src/DatePicker/utils/index.js +5 -0
  138. package/src/DatePicker/utils/tests/generateWeeks.spec.js +136 -0
  139. package/src/DatePicker/utils/tests/getMonths.spec.js +21 -0
  140. package/src/DatePicker/utils/tests/getYears.spec.js +21 -0
  141. package/src/DateTimePicker/DateTimePicker.js +151 -0
  142. package/src/DateTimePicker/DateTimePicker.stories.mdx +114 -0
  143. package/src/DateTimePicker/DateTimePickerProps.js +85 -0
  144. package/src/DateTimePicker/__tests__/DateTimePicker.e2e.js +103 -0
  145. package/src/DateTimePicker/__tests__/DateTimePicker.spec.js +89 -0
  146. package/src/DateTimePicker/__tests__/__snapshots__/DateTimePicker.spec.js.snap +448 -0
  147. package/src/DateTimePicker/__tests__/parseDate.test.js +10 -0
  148. package/src/DateTimePicker/index.js +1 -0
  149. package/src/DateTimePicker/parseDate.js +11 -0
  150. package/src/Dialog/Dialog.js +86 -0
  151. package/src/Dialog/Dialog.stories.mdx +78 -0
  152. package/src/Dialog/DialogBody.js +36 -0
  153. package/src/Dialog/DialogFooter.js +38 -0
  154. package/src/Dialog/__tests__/Dialog.e2e.js +20 -0
  155. package/src/Dialog/__tests__/Dialog.spec.js +28 -0
  156. package/src/Dialog/index.js +3 -0
  157. package/src/DismissibleLayer/DismissibleLayer.js +87 -0
  158. package/src/DismissibleLayer/DismissibleLayer.stories.mdx +50 -0
  159. package/src/DismissibleLayer/__test__/DimissibleLayer.spec.js +44 -0
  160. package/src/DismissibleLayer/index.js +1 -0
  161. package/src/Divider/Divider.js +26 -0
  162. package/src/Divider/Divider.stories.mdx +55 -0
  163. package/src/Divider/__tests__/Divider.e2e.js +23 -0
  164. package/src/Divider/index.js +1 -0
  165. package/src/EmptyStateLayout/EmptyStateLayout.js +48 -0
  166. package/src/EmptyStateLayout/EmptyStateLayout.stories.mdx +87 -0
  167. package/src/EmptyStateLayout/__tests__/EmptyStateLayout.e2e.js +31 -0
  168. package/src/EmptyStateLayout/index.js +1 -0
  169. package/src/EmptyStateLayout/story-assets/Illo.js +51 -0
  170. package/src/Field/Field.js +29 -0
  171. package/src/Field/Field.stories.mdx +237 -0
  172. package/src/Field/FieldAction.js +25 -0
  173. package/src/Field/FieldContext.js +4 -0
  174. package/src/Field/FieldError.js +17 -0
  175. package/src/Field/FieldHint.js +17 -0
  176. package/src/Field/FieldInput.js +129 -0
  177. package/src/Field/FieldLabel.js +50 -0
  178. package/src/Field/__tests__/Field.e2e.js +61 -0
  179. package/src/Field/index.js +7 -0
  180. package/src/Flex/Flex.js +26 -0
  181. package/src/Flex/Flex.stories.mdx +45 -0
  182. package/src/Flex/FlexProps.js +41 -0
  183. package/src/Flex/__tests__/Flex.e2e.js +23 -0
  184. package/src/Flex/index.js +1 -0
  185. package/src/FocusTrap/ExampleComponent.js +71 -0
  186. package/src/FocusTrap/FocusTrap.js +83 -0
  187. package/src/FocusTrap/FocusTrap.stories.mdx +32 -0
  188. package/src/FocusTrap/__tests__/FocusTrap.e2e.js +126 -0
  189. package/src/FocusTrap/index.js +1 -0
  190. package/src/Grid/Grid.js +30 -0
  191. package/src/Grid/Grid.stories.mdx +112 -0
  192. package/src/Grid/GridContext.js +5 -0
  193. package/src/Grid/GridItem.js +40 -0
  194. package/src/Grid/__tests__/Grid.e2e.js +23 -0
  195. package/src/Grid/index.js +2 -0
  196. package/src/Icon/Icon.js +27 -0
  197. package/src/Icon/Icon.stories.mdx +41 -0
  198. package/src/Icon/__tests__/Icon.e2e.js +21 -0
  199. package/src/Icon/index.js +1 -0
  200. package/src/IconButton/IconButton.js +175 -0
  201. package/src/IconButton/IconButton.stories.mdx +153 -0
  202. package/src/IconButton/__tests__/IconButton.e2e.js +57 -0
  203. package/src/IconButton/index.js +1 -0
  204. package/src/KeyboardNavigable/KeyboardNavigable.js +96 -0
  205. package/src/KeyboardNavigable/index.js +1 -0
  206. package/src/Layout/ActionLayout.js +40 -0
  207. package/src/Layout/ContentLayout.js +15 -0
  208. package/src/Layout/GridLayout.js +12 -0
  209. package/src/Layout/GridLayout.stories.mdx +36 -0
  210. package/src/Layout/HeaderLayout.js +170 -0
  211. package/src/Layout/HeaderLayout.stories.mdx +175 -0
  212. package/src/Layout/Layout.js +31 -0
  213. package/src/Layout/Layout.stories.mdx +240 -0
  214. package/src/Layout/TwoColsLayout.js +26 -0
  215. package/src/Layout/TwoColsLayout.stories.mdx +46 -0
  216. package/src/Layout/__tests__/GridLayout.e2e.js +23 -0
  217. package/src/Layout/__tests__/HeaderLayout.e2e.js +83 -0
  218. package/src/Layout/__tests__/Layout.e2e.js +23 -0
  219. package/src/Layout/__tests__/TwoColsLayout.e2e.js +23 -0
  220. package/src/Layout/index.js +6 -0
  221. package/src/Link/Link.js +105 -0
  222. package/src/Link/Link.stories.mdx +57 -0
  223. package/src/Link/__tests__/Link.e2e.js +23 -0
  224. package/src/Link/index.js +1 -0
  225. package/src/LinkButton/LinkButton.js +113 -0
  226. package/src/LinkButton/LinkButton.stories.mdx +153 -0
  227. package/src/LinkButton/__tests__/LinkButton.e2e.js +89 -0
  228. package/src/LinkButton/index.js +1 -0
  229. package/src/LiveRegions/LiveRegions.js +13 -0
  230. package/src/LiveRegions/LiveRegions.stories.mdx +76 -0
  231. package/src/LiveRegions/StoryComponent.js +26 -0
  232. package/src/LiveRegions/__tests__/LiveRegions.spec.js +200 -0
  233. package/src/LiveRegions/constants.js +5 -0
  234. package/src/LiveRegions/index.js +1 -0
  235. package/src/LiveRegions/useNotifyAT.js +39 -0
  236. package/src/Loader/Loader.js +40 -0
  237. package/src/Loader/Loader.stories.mdx +48 -0
  238. package/src/Loader/__tests__/Loader.e2e.js +23 -0
  239. package/src/Loader/assets/loader.svg +3 -0
  240. package/src/Loader/index.js +1 -0
  241. package/src/Main/Main.js +24 -0
  242. package/src/Main/SkipToContent.js +29 -0
  243. package/src/Main/index.js +2 -0
  244. package/src/MainNav/MainNav.js +31 -0
  245. package/src/MainNav/MainNav.stories.mdx +197 -0
  246. package/src/MainNav/MainNavContext.js +5 -0
  247. package/src/MainNav/NavBrand.js +76 -0
  248. package/src/MainNav/NavCondense.js +44 -0
  249. package/src/MainNav/NavLink.js +143 -0
  250. package/src/MainNav/NavSection.js +53 -0
  251. package/src/MainNav/NavSections.js +20 -0
  252. package/src/MainNav/NavUser.js +53 -0
  253. package/src/MainNav/__tests__/MainNav.e2e.js +23 -0
  254. package/src/MainNav/index.js +7 -0
  255. package/src/MainNav/strapi-img.png +0 -0
  256. package/src/ModalLayout/ModalBody.js +12 -0
  257. package/src/ModalLayout/ModalContext.js +4 -0
  258. package/src/ModalLayout/ModalFooter.js +37 -0
  259. package/src/ModalLayout/ModalHeader.js +35 -0
  260. package/src/ModalLayout/ModalLayout.js +58 -0
  261. package/src/ModalLayout/ModalLayout.stories.mdx +100 -0
  262. package/src/ModalLayout/__tests__/ModalLayout.e2e.js +19 -0
  263. package/src/ModalLayout/__tests__/ModalLayout.spec.js +596 -0
  264. package/src/ModalLayout/index.js +4 -0
  265. package/src/NumberInput/NumberInput.js +253 -0
  266. package/src/NumberInput/NumberInput.stories.mdx +319 -0
  267. package/src/NumberInput/__tests__/NumberInput.e2e.js +194 -0
  268. package/src/NumberInput/index.js +1 -0
  269. package/src/Pagination/Pagination.js +37 -0
  270. package/src/Pagination/Pagination.stories.mdx +97 -0
  271. package/src/Pagination/PaginationContext.js +4 -0
  272. package/src/Pagination/__tests__/Pagination.e2e.js +23 -0
  273. package/src/Pagination/assets/next.svg +3 -0
  274. package/src/Pagination/assets/previous.svg +3 -0
  275. package/src/Pagination/components.js +147 -0
  276. package/src/Pagination/index.js +2 -0
  277. package/src/Popover/Popover.js +167 -0
  278. package/src/Popover/Popover.stories.mdx +167 -0
  279. package/src/Popover/__tests__/Popover.e2e.js +48 -0
  280. package/src/Popover/__tests__/Popover.spec.js +153 -0
  281. package/src/Popover/index.js +1 -0
  282. package/src/Portal/Portal.js +25 -0
  283. package/src/Portal/Portal.stories.mdx +33 -0
  284. package/src/Portal/__tests__/Portal.e2e.js +23 -0
  285. package/src/Portal/index.js +1 -0
  286. package/src/ProgressBar/ProgressBar.js +57 -0
  287. package/src/ProgressBar/ProgressBar.stories.mdx +47 -0
  288. package/src/ProgressBar/__tests__/ProgressBar.e2e.js +41 -0
  289. package/src/ProgressBar/index.js +1 -0
  290. package/src/Radio/Radio.js +25 -0
  291. package/src/Radio/Radio.stories.mdx +66 -0
  292. package/src/Radio/__tests__/Radio.e2e.js +66 -0
  293. package/src/Radio/__tests__/Radio.spec.js +56 -0
  294. package/src/Radio/index.js +2 -0
  295. package/src/RawTable/RawCell.js +182 -0
  296. package/src/RawTable/RawTable.js +123 -0
  297. package/src/RawTable/RawTable.stories.mdx +258 -0
  298. package/src/RawTable/RawTableContext.js +10 -0
  299. package/src/RawTable/RawTbody.js +18 -0
  300. package/src/RawTable/RawThead.js +15 -0
  301. package/src/RawTable/RawTr.js +20 -0
  302. package/src/RawTable/__tests__/RawTable.e2e.js +344 -0
  303. package/src/RawTable/focusFocusable.js +7 -0
  304. package/src/RawTable/index.js +5 -0
  305. package/src/Searchbar/SearchForm.js +3 -0
  306. package/src/Searchbar/Searchbar.js +103 -0
  307. package/src/Searchbar/Searchbar.stories.mdx +115 -0
  308. package/src/Searchbar/__tests__/Searchbar.e2e.js +52 -0
  309. package/src/Searchbar/index.js +2 -0
  310. package/src/Select/MultiSelectNested.js +31 -0
  311. package/src/Select/OptGroup.js +27 -0
  312. package/src/Select/Option.js +123 -0
  313. package/src/Select/Select.js +318 -0
  314. package/src/Select/Select.stories.mdx +362 -0
  315. package/src/Select/SelectButton.js +77 -0
  316. package/src/Select/SelectList.js +113 -0
  317. package/src/Select/SelectTags.js +50 -0
  318. package/src/Select/__tests__/Select.e2e.js +238 -0
  319. package/src/Select/__tests__/Select.spec.js +1020 -0
  320. package/src/Select/components.js +51 -0
  321. package/src/Select/constants.js +6 -0
  322. package/src/Select/hooks/useButtonRef.js +31 -0
  323. package/src/Select/hooks/useListRef.js +35 -0
  324. package/src/Select/index.js +5 -0
  325. package/src/Select/utils.js +27 -0
  326. package/src/SimpleMenu/SimpleMenu.js +252 -0
  327. package/src/SimpleMenu/SimpleMenu.stories.mdx +220 -0
  328. package/src/SimpleMenu/__tests__/SimpleMenu.e2e.js +98 -0
  329. package/src/SimpleMenu/__tests__/SimpleMenu.spec.js +48 -0
  330. package/src/SimpleMenu/index.js +1 -0
  331. package/src/SimpleMenu/utils.js +12 -0
  332. package/src/Stack/Stack.js +75 -0
  333. package/src/Stack/Stack.stories.mdx +66 -0
  334. package/src/Stack/__tests__/Stack.e2e.js +43 -0
  335. package/src/Stack/index.js +1 -0
  336. package/src/Status/Status.js +76 -0
  337. package/src/Status/Status.stories.mdx +80 -0
  338. package/src/Status/__tests__/Status.e2e.js +23 -0
  339. package/src/Status/__tests__/Status.spec.js +48 -0
  340. package/src/Status/index.js +1 -0
  341. package/src/SubNav/SubNav.js +25 -0
  342. package/src/SubNav/SubNav.stories.mdx +234 -0
  343. package/src/SubNav/SubNavHeader.js +122 -0
  344. package/src/SubNav/SubNavLink.js +92 -0
  345. package/src/SubNav/SubNavLinkSection.js +75 -0
  346. package/src/SubNav/SubNavSection.js +75 -0
  347. package/src/SubNav/SubNavSectionLabel.js +67 -0
  348. package/src/SubNav/SubNavSections.js +20 -0
  349. package/src/SubNav/__tests__/SubNav.e2e.js +23 -0
  350. package/src/SubNav/index.js +6 -0
  351. package/src/Switch/Switch.js +97 -0
  352. package/src/Switch/Switch.stories.mdx +76 -0
  353. package/src/Switch/__tests__/Switch.e2e.js +33 -0
  354. package/src/Switch/index.js +1 -0
  355. package/src/Table/Cell.js +49 -0
  356. package/src/Table/TFooter.js +58 -0
  357. package/src/Table/Table.js +96 -0
  358. package/src/Table/Table.stories.mdx +330 -0
  359. package/src/Table/Tbody.js +13 -0
  360. package/src/Table/Thead.js +11 -0
  361. package/src/Table/Tr.js +28 -0
  362. package/src/Table/__tests__/Table.e2e.js +41 -0
  363. package/src/Table/index.js +6 -0
  364. package/src/Tabs/TabGroup.js +46 -0
  365. package/src/Tabs/TabPanels.js +32 -0
  366. package/src/Tabs/Tabs.js +227 -0
  367. package/src/Tabs/Tabs.stories.mdx +211 -0
  368. package/src/Tabs/TabsContext.js +5 -0
  369. package/src/Tabs/__tests__/Tabs.e2e.js +253 -0
  370. package/src/Tabs/components.js +66 -0
  371. package/src/Tabs/index.js +3 -0
  372. package/src/Tabs/useTabsFocus.js +28 -0
  373. package/src/Tag/Tag.js +72 -0
  374. package/src/Tag/Tag.stories.mdx +47 -0
  375. package/src/Tag/__tests__/Tag.e2e.js +37 -0
  376. package/src/Tag/index.js +1 -0
  377. package/src/TextButton/TextButton.js +102 -0
  378. package/src/TextButton/TextButton.stories.mdx +71 -0
  379. package/src/TextButton/__tests__/TextButton.e2e.js +23 -0
  380. package/src/TextButton/index.js +1 -0
  381. package/src/TextInput/TextInput.js +67 -0
  382. package/src/TextInput/TextInput.stories.mdx +228 -0
  383. package/src/TextInput/__tests__/TextInput.e2e.js +73 -0
  384. package/src/TextInput/index.js +1 -0
  385. package/src/Textarea/Textarea.js +74 -0
  386. package/src/Textarea/Textarea.stories.mdx +105 -0
  387. package/src/Textarea/TextareaInput.js +77 -0
  388. package/src/Textarea/__tests__/Textarea.e2e.js +37 -0
  389. package/src/Textarea/index.js +1 -0
  390. package/src/ThemeProvider/ThemeProvider.js +193 -0
  391. package/src/ThemeProvider/hooks.js +5 -0
  392. package/src/ThemeProvider/index.js +2 -0
  393. package/src/TimePicker/TimePicker.js +128 -0
  394. package/src/TimePicker/TimePicker.stories.mdx +171 -0
  395. package/src/TimePicker/__tests__/TimePicker.e2e.js +37 -0
  396. package/src/TimePicker/__tests__/TimePicker.spec.js +2099 -0
  397. package/src/TimePicker/index.js +1 -0
  398. package/src/ToggleCheckbox/ToggleCheckbox.js +169 -0
  399. package/src/ToggleCheckbox/ToggleCheckbox.stories.mdx +96 -0
  400. package/src/ToggleCheckbox/__tests__/ToggleCheckbox.e2e.js +59 -0
  401. package/src/ToggleCheckbox/index.js +1 -0
  402. package/src/ToggleInput/ToggleInput.js +89 -0
  403. package/src/ToggleInput/ToggleInput.stories.mdx +171 -0
  404. package/src/ToggleInput/__tests__/ToggleInput.e2e.js +109 -0
  405. package/src/ToggleInput/index.js +1 -0
  406. package/src/Tooltip/Tooltip.js +72 -0
  407. package/src/Tooltip/Tooltip.stories.mdx +127 -0
  408. package/src/Tooltip/__tests__/Tooltip.e2e.js +33 -0
  409. package/src/Tooltip/__tests__/Tooltip.spec.js +306 -0
  410. package/src/Tooltip/hooks/useTooltipHandlers.js +39 -0
  411. package/src/Tooltip/hooks/useTooltipLayout.js +21 -0
  412. package/src/Tooltip/index.js +1 -0
  413. package/src/Tooltip/utils/__tests__/positionTooltip.spec.js +114 -0
  414. package/src/Tooltip/utils/positionTooltip.js +83 -0
  415. package/src/Typography/Typography.js +24 -0
  416. package/src/Typography/Typography.stories.mdx +86 -0
  417. package/src/Typography/TypographyProps.js +30 -0
  418. package/src/Typography/__tests__/Typography.e2e.js +25 -0
  419. package/src/Typography/__tests__/Typography.spec.js +32 -0
  420. package/src/Typography/__tests__/__snapshots__/Typography.spec.js.snap +103 -0
  421. package/src/Typography/constants.js +9 -0
  422. package/src/Typography/index.js +1 -0
  423. package/src/Typography/utils.js +69 -0
  424. package/src/VisuallyHidden/VisuallyHidden.js +12 -0
  425. package/src/VisuallyHidden/index.js +1 -0
  426. package/src/helpers/__tests__/useId.spec.js +39 -0
  427. package/src/helpers/escapeSelector.js +1 -0
  428. package/src/helpers/genId.js +2 -0
  429. package/src/helpers/getDefaultLocale.js +33 -0
  430. package/src/helpers/getFocusableNodes.js +35 -0
  431. package/src/helpers/handleResponsiveValues.js +34 -0
  432. package/src/helpers/keyboardKeys.js +17 -0
  433. package/src/helpers/setOpacity.js +4 -0
  434. package/src/helpers/setTabIndexOnFirstItem.js +7 -0
  435. package/src/helpers/useElementOnScreen.js +27 -0
  436. package/src/helpers/useId.js +8 -0
  437. package/src/helpers/useIntersection.js +31 -0
  438. package/src/helpers/useLockScroll.js +14 -0
  439. package/src/helpers/usePrevious.js +9 -0
  440. package/src/helpers/useResizeObserver.js +22 -0
  441. package/src/index.js +65 -0
  442. package/src/themes/ColorButton.js +24 -0
  443. package/src/themes/Theme.stories.mdx +227 -0
  444. package/src/themes/__tests__/extendTheme.spec.js +119 -0
  445. package/src/themes/colors.js +46 -0
  446. package/src/themes/common-theme.js +19 -0
  447. package/src/themes/darkTheme/dark-colors.js +49 -0
  448. package/src/themes/darkTheme/dark-shadows.js +10 -0
  449. package/src/themes/darkTheme/index.js +9 -0
  450. package/src/themes/extendTheme.js +60 -0
  451. package/src/themes/index.js +4 -0
  452. package/src/themes/lightTheme/index.js +9 -0
  453. package/src/themes/lightTheme/light-colors.js +49 -0
  454. package/src/themes/lightTheme/light-shadows.js +10 -0
  455. package/src/themes/sizes.js +10 -0
  456. package/src/themes/utils.js +50 -0
  457. package/src/v2/Breadcrumbs/Breadcrumbs.js +45 -0
  458. package/src/v2/Breadcrumbs/Breadcrumbs.stories.mdx +129 -0
  459. package/src/v2/Breadcrumbs/Crumb.js +30 -0
  460. package/src/v2/Breadcrumbs/CrumbLink.js +33 -0
  461. package/src/v2/Breadcrumbs/CrumbSimpleMenu.js +30 -0
  462. package/src/v2/Breadcrumbs/Divider.js +16 -0
  463. package/src/v2/Breadcrumbs/__tests__/Breadcrumbs.e2e.js +47 -0
  464. package/src/v2/Breadcrumbs/__tests__/Breadcrumbs.spec.js +47 -0
  465. package/src/v2/Breadcrumbs/index.js +4 -0
  466. package/src/v2/Link/Link.js +79 -0
  467. package/src/v2/Link/Link.stories.mdx +113 -0
  468. package/src/v2/Link/__tests__/Link.e2e.js +23 -0
  469. package/src/v2/Link/index.js +1 -0
  470. package/src/v2/LinkButton/LinkButton.js +105 -0
  471. package/src/v2/LinkButton/LinkButton.stories.mdx +153 -0
  472. package/src/v2/LinkButton/__tests__/LinkButton.e2e.js +89 -0
  473. package/src/v2/LinkButton/index.js +1 -0
  474. package/src/v2/MainNav/MainNav.js +31 -0
  475. package/src/v2/MainNav/MainNav.stories.mdx +197 -0
  476. package/src/v2/MainNav/MainNavContext.js +5 -0
  477. package/src/v2/MainNav/NavBrand.js +79 -0
  478. package/src/v2/MainNav/NavCondense.js +44 -0
  479. package/src/v2/MainNav/NavLink.js +143 -0
  480. package/src/v2/MainNav/NavSection.js +53 -0
  481. package/src/v2/MainNav/NavSections.js +20 -0
  482. package/src/v2/MainNav/NavUser.js +53 -0
  483. package/src/v2/MainNav/__tests__/MainNav.e2e.js +23 -0
  484. package/src/v2/MainNav/index.js +7 -0
  485. package/src/v2/MainNav/strapi-img.png +0 -0
  486. package/src/v2/Pagination/Pagination.js +37 -0
  487. package/src/v2/Pagination/Pagination.stories.mdx +97 -0
  488. package/src/v2/Pagination/PaginationContext.js +4 -0
  489. package/src/v2/Pagination/__tests__/Pagination.e2e.js +23 -0
  490. package/src/v2/Pagination/assets/next.svg +3 -0
  491. package/src/v2/Pagination/assets/previous.svg +3 -0
  492. package/src/v2/Pagination/components.js +136 -0
  493. package/src/v2/Pagination/index.js +2 -0
  494. package/src/v2/SimpleMenu/SimpleMenu.js +252 -0
  495. package/src/v2/SimpleMenu/SimpleMenu.stories.mdx +220 -0
  496. package/src/v2/SimpleMenu/__tests__/SimpleMenu.e2e.js +100 -0
  497. package/src/v2/SimpleMenu/__tests__/SimpleMenu.spec.js +48 -0
  498. package/src/v2/SimpleMenu/index.js +1 -0
  499. package/src/v2/SimpleMenu/utils.js +12 -0
  500. package/src/v2/SubNav/SubNav.js +25 -0
  501. package/src/v2/SubNav/SubNav.stories.mdx +234 -0
  502. package/src/v2/SubNav/SubNavHeader.js +122 -0
  503. package/src/v2/SubNav/SubNavLink.js +95 -0
  504. package/src/v2/SubNav/SubNavLinkSection.js +75 -0
  505. package/src/v2/SubNav/SubNavSection.js +75 -0
  506. package/src/v2/SubNav/SubNavSectionLabel.js +67 -0
  507. package/src/v2/SubNav/SubNavSections.js +20 -0
  508. package/src/v2/SubNav/__tests__/SubNav.e2e.js +23 -0
  509. package/src/v2/SubNav/index.js +6 -0
  510. package/src/v2/index.js +7 -0
  511. package/test-bundler.js +35 -0
  512. package/tests/check-exports.spec.js +36 -0
  513. package/webpack.config.js +84 -0
  514. package/Accordion.development.js +0 -775
  515. package/Accordion.js +0 -9
  516. package/Accordion.production.js +0 -1
  517. package/Alert.development.js +0 -562
  518. package/Alert.js +0 -9
  519. package/Alert.production.js +0 -1
  520. package/Avatar.development.js +0 -485
  521. package/Avatar.js +0 -9
  522. package/Avatar.production.js +0 -1
  523. package/Badge.development.js +0 -494
  524. package/Badge.js +0 -9
  525. package/Badge.production.js +0 -1
  526. package/BaseButton.development.js +0 -285
  527. package/BaseButton.js +0 -9
  528. package/BaseButton.production.js +0 -1
  529. package/BaseCheckbox.development.js +0 -309
  530. package/BaseCheckbox.js +0 -9
  531. package/BaseCheckbox.production.js +0 -1
  532. package/BaseLink.development.js +0 -273
  533. package/BaseLink.js +0 -9
  534. package/BaseLink.production.js +0 -1
  535. package/BaseRadio.development.js +0 -321
  536. package/BaseRadio.js +0 -9
  537. package/BaseRadio.production.js +0 -1
  538. package/Box.development.js +0 -341
  539. package/Box.js +0 -9
  540. package/Box.production.js +0 -1
  541. package/Breadcrumbs.development.js +0 -518
  542. package/Breadcrumbs.js +0 -9
  543. package/Breadcrumbs.production.js +0 -1
  544. package/Button.development.js +0 -573
  545. package/Button.js +0 -9
  546. package/Button.production.js +0 -1
  547. package/Card.development.js +0 -746
  548. package/Card.js +0 -9
  549. package/Card.production.js +0 -1
  550. package/CarouselInput.development.js +0 -898
  551. package/CarouselInput.js +0 -9
  552. package/CarouselInput.production.js +0 -1
  553. package/Checkbox.development.js +0 -722
  554. package/Checkbox.js +0 -9
  555. package/Checkbox.production.js +0 -1
  556. package/Combobox.development.js +0 -934
  557. package/Combobox.js +0 -9
  558. package/Combobox.production.js +0 -1
  559. package/DatePicker.development.js +0 -1323
  560. package/DatePicker.js +0 -9
  561. package/DatePicker.production.js +0 -1
  562. package/Dialog.development.js +0 -741
  563. package/Dialog.js +0 -9
  564. package/Dialog.production.js +0 -1
  565. package/DismissibleLayer.development.js +0 -218
  566. package/DismissibleLayer.js +0 -9
  567. package/DismissibleLayer.production.js +0 -1
  568. package/Divider.development.js +0 -398
  569. package/Divider.js +0 -9
  570. package/Divider.production.js +0 -1
  571. package/EmptyStateLayout.development.js +0 -425
  572. package/EmptyStateLayout.js +0 -9
  573. package/EmptyStateLayout.production.js +0 -1
  574. package/Field.development.js +0 -614
  575. package/Field.js +0 -9
  576. package/Field.production.js +0 -1
  577. package/Flex.development.js +0 -377
  578. package/Flex.js +0 -9
  579. package/Flex.production.js +0 -1
  580. package/FocusTrap.development.js +0 -341
  581. package/FocusTrap.js +0 -9
  582. package/FocusTrap.production.js +0 -1
  583. package/Grid.development.js +0 -422
  584. package/Grid.js +0 -9
  585. package/Grid.production.js +0 -1
  586. package/Icon.development.js +0 -376
  587. package/Icon.js +0 -9
  588. package/Icon.production.js +0 -1
  589. package/IconButton.development.js +0 -684
  590. package/IconButton.js +0 -9
  591. package/IconButton.production.js +0 -1
  592. package/KeyboardNavigable.development.js +0 -454
  593. package/KeyboardNavigable.js +0 -9
  594. package/KeyboardNavigable.production.js +0 -1
  595. package/Layout.development.js +0 -626
  596. package/Layout.js +0 -9
  597. package/Layout.production.js +0 -1
  598. package/Link.development.js +0 -492
  599. package/Link.js +0 -9
  600. package/Link.production.js +0 -1
  601. package/LinkButton.development.js +0 -573
  602. package/LinkButton.js +0 -9
  603. package/LinkButton.production.js +0 -1
  604. package/LiveRegions.development.js +0 -147
  605. package/LiveRegions.js +0 -9
  606. package/LiveRegions.production.js +0 -1
  607. package/Loader.development.js +0 -309
  608. package/Loader.js +0 -9
  609. package/Loader.production.js +0 -1
  610. package/Main.development.js +0 -410
  611. package/Main.js +0 -9
  612. package/Main.production.js +0 -1
  613. package/MainNav.development.js +0 -957
  614. package/MainNav.js +0 -9
  615. package/MainNav.production.js +0 -1
  616. package/ModalLayout.development.js +0 -895
  617. package/ModalLayout.js +0 -9
  618. package/ModalLayout.production.js +0 -1
  619. package/NumberInput.development.js +0 -733
  620. package/NumberInput.js +0 -9
  621. package/NumberInput.production.js +0 -1
  622. package/Pagination.development.js +0 -587
  623. package/Pagination.js +0 -9
  624. package/Pagination.production.js +0 -1
  625. package/Popover.development.js +0 -481
  626. package/Popover.js +0 -9
  627. package/Popover.production.js +0 -1
  628. package/Portal.development.js +0 -212
  629. package/Portal.js +0 -9
  630. package/Portal.production.js +0 -1
  631. package/ProgressBar.development.js +0 -273
  632. package/ProgressBar.js +0 -9
  633. package/ProgressBar.production.js +0 -1
  634. package/Radio.development.js +0 -518
  635. package/Radio.js +0 -9
  636. package/Radio.production.js +0 -1
  637. package/RawTable.development.js +0 -549
  638. package/RawTable.js +0 -9
  639. package/RawTable.production.js +0 -1
  640. package/Searchbar.development.js +0 -696
  641. package/Searchbar.js +0 -9
  642. package/Searchbar.production.js +0 -1
  643. package/Select.development.js +0 -1063
  644. package/Select.js +0 -9
  645. package/Select.production.js +0 -1
  646. package/SimpleMenu.development.js +0 -821
  647. package/SimpleMenu.js +0 -9
  648. package/SimpleMenu.production.js +0 -1
  649. package/Stack.development.js +0 -434
  650. package/Stack.js +0 -9
  651. package/Stack.production.js +0 -1
  652. package/Status.development.js +0 -494
  653. package/Status.js +0 -9
  654. package/Status.production.js +0 -1
  655. package/SubNav.development.js +0 -1123
  656. package/SubNav.js +0 -9
  657. package/SubNav.production.js +0 -1
  658. package/Switch.development.js +0 -434
  659. package/Switch.js +0 -9
  660. package/Switch.production.js +0 -1
  661. package/Table.development.js +0 -741
  662. package/Table.js +0 -9
  663. package/Table.production.js +0 -1
  664. package/Tabs.development.js +0 -590
  665. package/Tabs.js +0 -9
  666. package/Tabs.production.js +0 -1
  667. package/Tag.development.js +0 -494
  668. package/Tag.js +0 -9
  669. package/Tag.production.js +0 -1
  670. package/TextButton.development.js +0 -517
  671. package/TextButton.js +0 -9
  672. package/TextButton.production.js +0 -1
  673. package/TextInput.development.js +0 -662
  674. package/TextInput.js +0 -9
  675. package/TextInput.production.js +0 -1
  676. package/Textarea.development.js +0 -674
  677. package/Textarea.js +0 -9
  678. package/Textarea.production.js +0 -1
  679. package/ThemeProvider.development.js +0 -300
  680. package/ThemeProvider.js +0 -9
  681. package/ThemeProvider.production.js +0 -1
  682. package/TimePicker.development.js +0 -1098
  683. package/TimePicker.js +0 -9
  684. package/TimePicker.production.js +0 -1
  685. package/ToggleCheckbox.development.js +0 -542
  686. package/ToggleCheckbox.js +0 -9
  687. package/ToggleCheckbox.production.js +0 -1
  688. package/ToggleInput.development.js +0 -745
  689. package/ToggleInput.js +0 -9
  690. package/ToggleInput.production.js +0 -1
  691. package/Tooltip.development.js +0 -588
  692. package/Tooltip.js +0 -9
  693. package/Tooltip.production.js +0 -1
  694. package/Typography.development.js +0 -276
  695. package/Typography.js +0 -9
  696. package/Typography.production.js +0 -1
  697. package/VisuallyHidden.development.js +0 -146
  698. package/VisuallyHidden.js +0 -9
  699. package/VisuallyHidden.production.js +0 -1
  700. package/index.development.js +0 -4290
  701. package/index.js +0 -9
  702. package/index.production.js +0 -1
  703. package/themes.development.js +0 -254
  704. package/themes.js +0 -9
  705. package/themes.production.js +0 -1
  706. package/v2/Breadcrumbs.development.js +0 -906
  707. package/v2/Breadcrumbs.js +0 -9
  708. package/v2/Breadcrumbs.production.js +0 -1
  709. package/v2/Link.development.js +0 -505
  710. package/v2/Link.js +0 -9
  711. package/v2/Link.production.js +0 -1
  712. package/v2/LinkButton.development.js +0 -586
  713. package/v2/LinkButton.js +0 -9
  714. package/v2/LinkButton.production.js +0 -1
  715. package/v2/MainNav.development.js +0 -970
  716. package/v2/MainNav.js +0 -9
  717. package/v2/MainNav.production.js +0 -1
  718. package/v2/Pagination.development.js +0 -600
  719. package/v2/Pagination.js +0 -9
  720. package/v2/Pagination.production.js +0 -1
  721. package/v2/SimpleMenu.development.js +0 -834
  722. package/v2/SimpleMenu.js +0 -9
  723. package/v2/SimpleMenu.production.js +0 -1
  724. package/v2/SubNav.development.js +0 -1136
  725. package/v2/SubNav.js +0 -9
  726. package/v2/SubNav.production.js +0 -1
  727. package/v2/index.development.js +0 -1740
  728. package/v2/index.js +0 -9
  729. package/v2/index.production.js +0 -1
  730. package/v2/package.json +0 -81
@@ -0,0 +1,73 @@
1
+ import { injectAxe, checkA11y } from 'axe-playwright';
2
+ import { test, expect } from '@playwright/test';
3
+
4
+ test.describe.parallel('Accordion Keyboard Navigable', () => {
5
+ test.beforeEach(async ({ page }) => {
6
+ // This is the URL of the Storybook Iframe
7
+ await page.goto('/iframe.html?id=design-system-components-accordion--keyboard-navigable&viewMode=story');
8
+ await injectAxe(page);
9
+ });
10
+
11
+ test('triggers axe on the document', async ({ page }) => {
12
+ await checkA11y(page);
13
+ });
14
+
15
+ test('triggers axe on the document when the accordion is expanded', async ({ page }) => {
16
+ await page.click('[aria-labelledby="accordion-label-acc-1"]');
17
+
18
+ await checkA11y(page);
19
+ });
20
+
21
+ test.describe('Keyboard interactions', () => {
22
+ test('focuses the next node when pressing arrow down until reaching the end of the group where it focuses the first accordion', async ({
23
+ page,
24
+ }) => {
25
+ await page.focus('[aria-labelledby="accordion-label-acc-1"]');
26
+
27
+ await page.keyboard.press('ArrowDown');
28
+ await expect(page.locator('[aria-labelledby="accordion-label-acc-2"]')).toBeFocused();
29
+
30
+ await page.keyboard.press('ArrowDown');
31
+ await expect(page.locator('[aria-labelledby="accordion-label-acc-3"]')).toBeFocused();
32
+
33
+ await page.keyboard.press('ArrowDown');
34
+ await expect(page.locator('[aria-labelledby="accordion-label-acc-4"]')).toBeFocused();
35
+
36
+ await page.keyboard.press('ArrowDown');
37
+ await expect(page.locator('[aria-labelledby="accordion-label-acc-1"]')).toBeFocused();
38
+ });
39
+
40
+ test('focuses the previous node when pressing arrow up and reaches the latest accordion when being on the first one', async ({
41
+ page,
42
+ }) => {
43
+ await page.focus('[aria-labelledby="accordion-label-acc-1"]');
44
+
45
+ await page.keyboard.press('ArrowUp');
46
+ await expect(page.locator('[aria-labelledby="accordion-label-acc-4"]')).toBeFocused();
47
+
48
+ await page.keyboard.press('ArrowUp');
49
+ await expect(page.locator('[aria-labelledby="accordion-label-acc-3"]')).toBeFocused();
50
+
51
+ await page.keyboard.press('ArrowUp');
52
+ await expect(page.locator('[aria-labelledby="accordion-label-acc-2"]')).toBeFocused();
53
+
54
+ await page.keyboard.press('ArrowUp');
55
+ await expect(page.locator('[aria-labelledby="accordion-label-acc-1"]')).toBeFocused();
56
+ });
57
+
58
+ test('focuses the last element when pressing end', async ({ page }) => {
59
+ await page.focus('[aria-labelledby="accordion-label-acc-1"]');
60
+
61
+ await page.keyboard.press('End');
62
+ await expect(page.locator('[aria-labelledby="accordion-label-acc-4"]')).toBeFocused();
63
+ });
64
+
65
+ test('focuses the first element when pressing home', async ({ page }) => {
66
+ await page.focus('[aria-labelledby="accordion-label-acc-1"]');
67
+
68
+ await page.keyboard.press('ArrowUp');
69
+ await page.keyboard.press('Home');
70
+ await expect(page.locator('[aria-labelledby="accordion-label-acc-1"]')).toBeFocused();
71
+ });
72
+ });
73
+ });
@@ -0,0 +1,4 @@
1
+ export * from './Accordion';
2
+ export * from './AccordionContent';
3
+ export * from './AccordionToggle';
4
+ export * from './AccordionGroup';
@@ -0,0 +1,15 @@
1
+ export const getBackground = ({ expanded, disabled, variant }) => {
2
+ let boxBackground;
3
+
4
+ if (expanded) {
5
+ boxBackground = 'primary100';
6
+ } else if (disabled) {
7
+ boxBackground = 'neutral150';
8
+ } else if (variant === 'primary') {
9
+ boxBackground = 'neutral0';
10
+ } else {
11
+ boxBackground = 'neutral100';
12
+ }
13
+
14
+ return boxBackground;
15
+ };
@@ -0,0 +1,144 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import styled from 'styled-components';
4
+ import Information from '@strapi/icons/Information';
5
+ import CheckCircle from '@strapi/icons/CheckCircle';
6
+ import ExclamationMarkCircle from '@strapi/icons/ExclamationMarkCircle';
7
+ import Cross from '@strapi/icons/Cross';
8
+ import { Box } from '../Box';
9
+ import { Typography } from '../Typography';
10
+ import { Flex } from '../Flex';
11
+ import { handleBackgroundColor, handleBorderColor, handleIconColor } from './utils';
12
+ import { buttonFocusStyle } from '../themes/utils';
13
+
14
+ const AlertBody = styled(Box)`
15
+ flex: 1;
16
+ flex-wrap: wrap;
17
+ display: flex;
18
+ flex-direction: row;
19
+ `;
20
+
21
+ const AlertWrapper = styled(Box)`
22
+ border: 1px solid ${handleBorderColor};
23
+ background: ${handleBackgroundColor};
24
+ box-shadow: ${({ theme }) => theme.shadows.filterShadow};
25
+ `;
26
+
27
+ const CloseButton = styled.button`
28
+ border: none;
29
+ background: transparent;
30
+ font-size: ${12 / 16}rem;
31
+ svg path {
32
+ fill: ${({ theme }) => theme.colors.neutral700};
33
+ }
34
+ margin-top: ${({ theme }) => theme.spaces[1]};
35
+ ${buttonFocusStyle};
36
+ `;
37
+
38
+ const AlertIconWrapper = styled(Box)`
39
+ font-size: ${20 / 16}rem;
40
+ svg path {
41
+ fill: ${handleIconColor};
42
+ }
43
+ `;
44
+
45
+ const AlertIcon = ({ variant, ...props }) => {
46
+ if (variant === 'success') {
47
+ return <CheckCircle {...props} />;
48
+ }
49
+
50
+ if (variant === 'danger') {
51
+ return <ExclamationMarkCircle {...props} />;
52
+ }
53
+
54
+ return <Information {...props} />;
55
+ };
56
+
57
+ const ActionBox = styled(Box)`
58
+ // Checked with the designers, validated
59
+ padding-top: 1px;
60
+
61
+ & a > span {
62
+ color: ${handleIconColor};
63
+
64
+ svg path {
65
+ fill: ${handleIconColor};
66
+ }
67
+ }
68
+ `;
69
+
70
+ export const Alert = ({ title, children, variant, onClose, closeLabel, titleAs, action, ...props }) => {
71
+ return (
72
+ <AlertWrapper hasRadius paddingLeft={5} paddingRight={6} paddingTop={5} variant={variant} {...props}>
73
+ <Flex alignItems="flex-start">
74
+ <AlertIconWrapper paddingRight={3} variant={variant}>
75
+ <AlertIcon variant={variant} aria-hidden={true} />
76
+ </AlertIconWrapper>
77
+ <AlertBody role={variant === 'danger' ? 'alert' : 'status'}>
78
+ <Box paddingBottom={2} paddingRight={1}>
79
+ <Typography fontWeight="bold" textColor="neutral800" as={titleAs}>
80
+ {title}
81
+ </Typography>
82
+ </Box>
83
+
84
+ <Box paddingBottom={action ? 2 : 5} paddingRight={2}>
85
+ <Typography as="p" textColor="neutral800">
86
+ {children}
87
+ </Typography>
88
+ </Box>
89
+
90
+ {action && (
91
+ <ActionBox paddingBottom={5} variant={variant}>
92
+ {action}
93
+ </ActionBox>
94
+ )}
95
+ </AlertBody>
96
+
97
+ <CloseButton onClick={onClose} aria-label={closeLabel}>
98
+ <Cross aria-hidden={true} />
99
+ </CloseButton>
100
+ </Flex>
101
+ </AlertWrapper>
102
+ );
103
+ };
104
+
105
+ Alert.defaultProps = {
106
+ action: undefined,
107
+ variant: 'default',
108
+ titleAs: 'p',
109
+ };
110
+
111
+ Alert.propTypes = {
112
+ /**
113
+ * Render a React element below the body of an `Alert` (Mainly used to render a Link).
114
+ */
115
+ action: PropTypes.element,
116
+ /**
117
+ * The body of the `Alert` (Will be rendered under the `Alert` title).
118
+ */
119
+ children: PropTypes.node.isRequired,
120
+ /**
121
+ * Accessible label for the close icon button.
122
+ */
123
+ closeLabel: PropTypes.string.isRequired,
124
+ /**
125
+ * The callback invoked when click on the close icon button.
126
+ */
127
+ onClose: PropTypes.func.isRequired,
128
+ /**
129
+ * The title of the `Alert`.
130
+ */
131
+ title: PropTypes.string.isRequired,
132
+ /**
133
+ * Changes the element, as which a component will render (similar to styled-components).
134
+ */
135
+ titleAs: PropTypes.string,
136
+ /**
137
+ * `Alert` color variant.
138
+ */
139
+ variant: PropTypes.oneOf(['danger', 'success', 'default']),
140
+ };
141
+
142
+ AlertIcon.propTypes = {
143
+ variant: Alert.propTypes.variant,
144
+ };
@@ -0,0 +1,135 @@
1
+ <!--- Alert.stories.mdx --->
2
+
3
+ import { Meta, Story, Canvas } from '@storybook/addon-docs';
4
+ import { ArgsTable } from '@storybook/addon-docs';
5
+ import { Alert } from './Alert';
6
+ import { Box } from '../Box';
7
+ import { Stack } from '../Stack';
8
+ import { Link } from '../Link';
9
+
10
+ <Meta title="Design System/Components/Alert" component={Alert} />
11
+
12
+ # Alert
13
+
14
+ Alerts are messages displayed over the content, at the top of the screen to give information to users. They have multiple purposes and provide context.
15
+
16
+ **Best practices**
17
+
18
+ - The alert should be relevant to the page.
19
+ - Address a single piece of information or required action.
20
+ - Content of the alert should be concise and straightforward. Provide additional information on how to resolve the issue if needed.
21
+ - Alerts should be used thoughtfully and occasionally not to overwhelmed the users.
22
+ - Should not be used for marketing purposes.
23
+
24
+ [View source](https://github.com/strapi/design-system/tree/main/packages/strapi-design-system/src/Alert)
25
+
26
+ ## Imports
27
+
28
+ ```js
29
+ import { Alert } from '@strapi/design-system/Alert';
30
+ ```
31
+
32
+ ## Usage
33
+
34
+ The most common button component used in the interface. Alerts have a title, a description, and two sizes. This default one is aimed to give a small piece of text.
35
+
36
+ <Canvas withSource="open">
37
+ <Story
38
+ name="base"
39
+ parameters={{
40
+ docs: {
41
+ source: {
42
+ code: '<Alert closeLabel="Close alert" title="Title">This is the default alert.</Alert>',
43
+ },
44
+ },
45
+ }}
46
+ >
47
+ <Box style={{ width: 700 }}>
48
+ <Alert closeLabel="Close alert" title="Title" onClose={() => {}}>
49
+ This is the default alert.
50
+ </Alert>
51
+ </Box>
52
+ </Story>
53
+ </Canvas>
54
+
55
+ ### Alert variants
56
+
57
+ Use the variant prop to change the visual style of the Button.
58
+ You can set the value to `default`, `success`, or `danger`.
59
+
60
+ <Canvas withSource="open">
61
+ <Story
62
+ name="variants"
63
+ parameters={{
64
+ docs: {
65
+ source: {
66
+ code: '<Alert closeLabel="Close alert" title="Title" variant="success">This is the default variant.</Alert>',
67
+ },
68
+ },
69
+ }}
70
+ >
71
+ <Box style={{ width: 700 }}>
72
+ <Stack spacing={1}>
73
+ <Alert onClose={() => {}} closeLabel="Close" title="Title">
74
+ This is the default variant.
75
+ </Alert>
76
+ <Alert onClose={() => {}} closeLabel="Close" title="Title" variant="success">
77
+ This is the success variant.
78
+ </Alert>
79
+ <Alert onClose={() => {}} closeLabel="Close" title="Title" variant="danger">
80
+ This is the danger variant.
81
+ </Alert>
82
+ </Stack>
83
+ </Box>
84
+ </Story>
85
+ </Canvas>
86
+
87
+ | State | Description |
88
+ | ------------------- | --------------------------------------------------------------------------------------------------------------------- |
89
+ | Default/Information | Use a default alert for an informational purpose. Examples: Latest update, a specific mode, ... |
90
+ | Success | Use a success alert to indicate a successful action. Examples: Content has been saved, the locale has been added, ... |
91
+ | Danger | Examples: Content has been saved, the locale has been added, ... |
92
+
93
+ ### Alert with action
94
+
95
+ Alerts can contain an action. Via a Link component, they mostly encourage the user to be redirected to another page with more information. The wording of the action should be clear and concise.
96
+
97
+ <Canvas withSource="open">
98
+ <Story
99
+ name="with action"
100
+ parameters={{
101
+ docs: {
102
+ source: {
103
+ code: `
104
+ <Alert closeLabel="Close alert" title="This is the title of the alert" action={<Link to="/somewhere">See more</Link>}>
105
+ Alert with title and longer description, lorem ipsum dolor sit amet constrectum adipisicng lorem ipsum dolor sit
106
+ amet consrectumis adipisingus.
107
+ </Alert>`,
108
+ },
109
+ },
110
+ }}
111
+ >
112
+ <Box style={{ width: 700 }}>
113
+ <Alert
114
+ closeLabel="Close"
115
+ onClose={() => {}}
116
+ title="This is the title of the alert"
117
+ action={<Link to="/somewhere">See more</Link>}
118
+ >
119
+ Alert with title and longer description, lorem ipsum dolor sit amet constrectum adipisicng lorem ipsum dolor sit
120
+ amet consrectumis adipisingus.
121
+ </Alert>
122
+ </Box>
123
+ </Story>
124
+ </Canvas>
125
+
126
+ ## Accessibility
127
+
128
+ - Alerts use a combination of icons and colors to show their purpose and level of importance.
129
+ - This is a visual component which does not implement toasted notification nor a live region.
130
+
131
+ ## Props
132
+
133
+ The Alert component wraps all its children in the (Box)[https://design-system-git-main-strapijs.vercel.app/?path=/docs/design-system-technical-components-box--base] component, so you can pass all Box props to change its style.
134
+
135
+ <ArgsTable of={Alert} />
@@ -0,0 +1,39 @@
1
+ import { injectAxe, checkA11y } from 'axe-playwright';
2
+
3
+ import { test } from '@playwright/test';
4
+
5
+ test.describe.parallel('Alert', () => {
6
+ test.describe('light mode', () => {
7
+ test.describe('base', () => {
8
+ test('triggers axe on the document', async ({ page }) => {
9
+ await page.goto('/iframe.html?id=design-system-components-alert--base&viewMode=story');
10
+ await injectAxe(page);
11
+ await checkA11y(page);
12
+ });
13
+ });
14
+
15
+ test.describe('variants', () => {
16
+ test('triggers axe on the document', async ({ page }) => {
17
+ await page.goto('/iframe.html?id=design-system-components-alert--variants&viewMode=story');
18
+ await injectAxe(page);
19
+ await checkA11y(page);
20
+ });
21
+ });
22
+
23
+ test.describe('with action', () => {
24
+ test('triggers axe on the document', async ({ page }) => {
25
+ await page.goto('/iframe.html?id=design-system-components-alert--with-action&viewMode=story');
26
+ await injectAxe(page);
27
+ await checkA11y(page);
28
+ });
29
+ });
30
+ });
31
+
32
+ test.describe('dark mode', () => {
33
+ test('triggers axe on the document', async ({ page }) => {
34
+ await page.goto('/iframe.html?id=design-system-components-alert--base&viewMode=story&theme=dark');
35
+ await injectAxe(page);
36
+ await checkA11y(page);
37
+ });
38
+ });
39
+ });
@@ -0,0 +1 @@
1
+ export * from './Alert';
@@ -0,0 +1,35 @@
1
+ export const handleBackgroundColor = ({ theme, variant }) => {
2
+ if (variant === 'danger') {
3
+ return theme.colors.danger100;
4
+ }
5
+
6
+ if (variant === 'success') {
7
+ return theme.colors.success100;
8
+ }
9
+
10
+ return theme.colors.primary100;
11
+ };
12
+
13
+ export const handleBorderColor = ({ theme, variant }) => {
14
+ if (variant === 'danger') {
15
+ return theme.colors.danger200;
16
+ }
17
+
18
+ if (variant === 'success') {
19
+ return theme.colors.success200;
20
+ }
21
+
22
+ return theme.colors.primary200;
23
+ };
24
+
25
+ export const handleIconColor = ({ theme, variant }) => {
26
+ if (variant === 'danger') {
27
+ return theme.colors.danger700;
28
+ }
29
+
30
+ if (variant === 'success') {
31
+ return theme.colors.success700;
32
+ }
33
+
34
+ return theme.colors.primary700;
35
+ };
@@ -0,0 +1,110 @@
1
+ import React, { useState } from 'react';
2
+ import styled from 'styled-components';
3
+ import PropTypes from 'prop-types';
4
+ import { avatarSize, previewSize } from './constants';
5
+ import { Typography } from '../Typography';
6
+ import { Flex } from '../Flex';
7
+
8
+ const AvatarImg = styled.img`
9
+ border-radius: 50%;
10
+ object-fit: cover;
11
+ display: block;
12
+ position: relative;
13
+ `;
14
+
15
+ const AvatarImgWrapper = styled.div`
16
+ position: relative;
17
+ width: ${avatarSize / 16}rem;
18
+ height: ${avatarSize / 16}rem;
19
+ z-index: ${({ hovering }) => (hovering ? 1 : undefined)};
20
+ `;
21
+
22
+ const PreviewContainer = styled.img`
23
+ border-radius: 50%;
24
+ object-fit: cover;
25
+ position: absolute;
26
+ transform: translate(-${(previewSize - avatarSize) / 2}px, -100%);
27
+ margin-top: -${({ theme }) => theme.spaces[1]};
28
+ `;
29
+
30
+ const Overlay = styled.div`
31
+ z-index: 1;
32
+ border-radius: 30%;
33
+ position: absolute;
34
+ width: ${avatarSize / 16}rem;
35
+ height: ${avatarSize / 16}rem;
36
+ background: ${({ theme }) => theme.colors.neutral0};
37
+ opacity: 0.4;
38
+ `;
39
+
40
+ export const Avatar = ({ src, alt, preview }) => {
41
+ const [previewVisible, setPreviewVisible] = useState(false);
42
+
43
+ return (
44
+ <span>
45
+ {preview && previewVisible ? (
46
+ <PreviewContainer
47
+ aria-hidden
48
+ alt=""
49
+ width={`${previewSize}px`}
50
+ height={`${previewSize}px`}
51
+ src={preview === true ? src : preview}
52
+ />
53
+ ) : null}
54
+
55
+ <AvatarImgWrapper
56
+ hovering={preview && previewVisible}
57
+ onMouseEnter={() => setPreviewVisible(true)}
58
+ onMouseLeave={() => setPreviewVisible(false)}
59
+ >
60
+ {preview && previewVisible ? <Overlay /> : null}
61
+ <AvatarImg src={src} alt={alt} width={`${avatarSize}px`} height={`${avatarSize}px`} />
62
+ </AvatarImgWrapper>
63
+ </span>
64
+ );
65
+ };
66
+
67
+ const InitialsWrapper = styled(Flex)`
68
+ span {
69
+ line-height: 0;
70
+ }
71
+ `;
72
+
73
+ export const Initials = ({ children }) => {
74
+ return (
75
+ <InitialsWrapper
76
+ borderRadius="50%"
77
+ width={`${avatarSize}px`}
78
+ height={`${avatarSize}px`}
79
+ background="primary600"
80
+ justifyContent="center"
81
+ >
82
+ <Typography fontWeight="bold" textColor="buttonNeutral0" fontSize={0} textTransform="uppercase">
83
+ {children}
84
+ </Typography>
85
+ </InitialsWrapper>
86
+ );
87
+ };
88
+
89
+ Initials.propTypes = {
90
+ children: PropTypes.node.isRequired,
91
+ };
92
+
93
+ Avatar.defaultProps = {
94
+ preview: undefined,
95
+ };
96
+
97
+ Avatar.propTypes = {
98
+ /**
99
+ * Alternative text
100
+ */
101
+ alt: PropTypes.string.isRequired,
102
+ /**
103
+ * Image src of the image preview (displayed on `Avatar` hover).
104
+ */
105
+ preview: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),
106
+ /**
107
+ * Image src of the `Avatar`
108
+ */
109
+ src: PropTypes.string.isRequired,
110
+ };
@@ -0,0 +1,67 @@
1
+ <!--- Avatar.stories.mdx --->
2
+
3
+ import { Meta, Story, Canvas } from '@storybook/addon-docs';
4
+ import { ArgsTable } from '@storybook/addon-docs';
5
+ import { Avatar, Initials } from './Avatar';
6
+ import { AvatarGroup } from './AvatarGroup';
7
+ import { Box } from '../Box';
8
+
9
+ <Meta title="Design System/Components/Avatar" component={Avatar} />
10
+
11
+ # Avatar
12
+
13
+ Avatars are used to show a thumbnail of an asset or an individual.
14
+
15
+ **Best practices**
16
+
17
+ - Use the thumbnail preview feature only when the avatar might not be enough.
18
+ - Use avatar in small areas such as tables.
19
+ - In a form we should rather use the Card component.
20
+
21
+ [View source](https://github.com/strapi/design-system/tree/main/packages/strapi-design-system/src/Avatar)
22
+
23
+ ## Imports
24
+
25
+ ```js
26
+ import { Avatar, AvatarGroup } from '@strapi/design-system/Avatar';
27
+ ```
28
+
29
+ ## Usage
30
+
31
+ The avatar has a feature to display a preview of its thumbnail.
32
+
33
+ <Canvas>
34
+ <Story name="base">
35
+ <Box padding={11}>
36
+ <Avatar src="https://avatars.githubusercontent.com/u/3874873?v=4" alt="marvin frachet" preview />
37
+ </Box>
38
+ </Story>
39
+ </Canvas>
40
+
41
+ ## Group
42
+
43
+ <Canvas>
44
+ <Story name="group">
45
+ <Box padding={11}>
46
+ <AvatarGroup>
47
+ <Avatar src="https://avatars.githubusercontent.com/u/3874873?v=4" alt="marvin frachet" preview />
48
+ <Avatar src="https://avatars.githubusercontent.com/u/3874873?v=4" alt="marvin frachet" preview />
49
+ <Avatar src="https://avatars.githubusercontent.com/u/3874873?v=4" alt="marvin frachet" preview />
50
+ </AvatarGroup>
51
+ </Box>
52
+ </Story>
53
+ </Canvas>
54
+
55
+ ## Basic initials
56
+
57
+ <Canvas>
58
+ <Story name="initials">
59
+ <Box padding={11}>
60
+ <Initials>MF</Initials>
61
+ </Box>
62
+ </Story>
63
+ </Canvas>
64
+
65
+ ## Props
66
+
67
+ <ArgsTable of={Avatar} />
@@ -0,0 +1,9 @@
1
+ import styled from 'styled-components';
2
+ import { Flex } from '../Flex';
3
+ import { avatarSize } from './constants';
4
+
5
+ export const AvatarGroup = styled(Flex)`
6
+ & > * + * {
7
+ margin-left: -${avatarSize / 2}px;
8
+ }
9
+ `;
@@ -0,0 +1,23 @@
1
+ import { injectAxe, checkA11y } from 'axe-playwright';
2
+
3
+ import { test } from '@playwright/test';
4
+
5
+ test.describe.parallel('Avatar', () => {
6
+ test.describe('light mode', () => {
7
+ test('triggers axe on the document', async ({ page }) => {
8
+ // This is the URL of the Storybook Iframe
9
+ await page.goto('/iframe.html?id=design-system-components-avatar--base&viewMode=story');
10
+ await injectAxe(page);
11
+ await checkA11y(page);
12
+ });
13
+ });
14
+
15
+ test.describe('dark mode', () => {
16
+ test('triggers axe on the document', async ({ page }) => {
17
+ // This is the URL of the Storybook Iframe
18
+ await page.goto('/iframe.html?id=design-system-components-avatar--base&viewMode=story&theme=dark');
19
+ await injectAxe(page);
20
+ await checkA11y(page);
21
+ });
22
+ });
23
+ });