@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,327 @@
1
+ <!--- Accordion.stories.mdx --->
2
+
3
+ import { useState } from 'react';
4
+ import { Meta, Story, Canvas } from '@storybook/addon-docs';
5
+ import { ArgsTable } from '@storybook/addon-docs';
6
+ import Pencil from '@strapi/icons/Pencil';
7
+ import Information from '@strapi/icons/Information';
8
+ import Trash from '@strapi/icons/Trash';
9
+ import User from '@strapi/icons/User';
10
+ import Plus from '@strapi/icons/Plus';
11
+
12
+ import { Accordion } from './Accordion';
13
+ import { AccordionToggle } from './AccordionToggle';
14
+ import { AccordionContent } from './AccordionContent';
15
+ import { AccordionGroup } from './AccordionGroup';
16
+
17
+ import { KeyboardNavigable } from '../KeyboardNavigable';
18
+ import { Box } from '../Box';
19
+ import { Flex } from '../Flex';
20
+ import { Typography } from '../Typography';
21
+ import { IconButton } from '../IconButton';
22
+ import { TextButton } from '../TextButton';
23
+ import { TextInput } from '../TextInput';
24
+ import { Stack } from '../Stack';
25
+ import { Tooltip } from '../Tooltip';
26
+
27
+ <Meta title="Design System/Components/Accordion" component={Accordion} />
28
+
29
+ # Accordion
30
+
31
+ Accordions are collapsable blocks that vertically hide a stack of content. Clicking on the block reveals the associated content.
32
+
33
+ **Best practices**
34
+
35
+ - Use accordion when you need big and/or related chunks of content to be organized in a same place.
36
+ - Use accordion for lower priority information.
37
+ - Use to shorten pages and increase readability.
38
+ - The chevron icon pointing down indicates a collapsed state and pointing up indicates an expanded state.
39
+ - Hover and active states should be used anytime it's possible.
40
+ - Content should not scroll within an accordion.
41
+ - Use chevron icon on the left side if call-to-actions are available on the right side.
42
+
43
+ [View source](https://github.com/strapi/design-system/tree/main/packages/strapi-design-system/src/Accordion)
44
+
45
+ ## Imports
46
+
47
+ ```js
48
+ import { Accordion, AccordionToggle, AccordionContent, AccordionGroup } from '@strapi/design-system/Accordion';
49
+ ```
50
+
51
+ ## Usage
52
+
53
+ <Canvas>
54
+ <Story name="base">
55
+ {() => {
56
+ const [expanded, setExpanded] = useState(false);
57
+ return (
58
+ <div>
59
+ <Box padding={8} background="neutral100">
60
+ <Accordion
61
+ error="The component contain error(s)"
62
+ expanded={expanded}
63
+ onToggle={() => setExpanded((s) => !s)}
64
+ id="acc-1"
65
+ size="S"
66
+ >
67
+ <AccordionToggle title="User informations" />
68
+ <AccordionContent>
69
+ <Box padding={3}>
70
+ <Typography>My name is John Duff</Typography>
71
+ </Box>
72
+ </AccordionContent>
73
+ </Accordion>
74
+ </Box>
75
+ <Box padding={8} background="neutral0">
76
+ <Accordion expanded={expanded} onToggle={() => setExpanded((s) => !s)} id="acc-2" variant="secondary">
77
+ <AccordionToggle
78
+ title="User informations 2"
79
+ description="The following contains information about the current user 2"
80
+ action={<IconButton onClick={() => console.log('edit')} label="Edit" icon={<Pencil />} />}
81
+ />
82
+ <AccordionContent>
83
+ <Box padding={3}>
84
+ <Typography>My name is John Duff</Typography>
85
+ </Box>
86
+ </AccordionContent>
87
+ </Accordion>
88
+ </Box>
89
+ <Box padding={8} background="neutral100">
90
+ <Accordion expanded={expanded} onToggle={() => setExpanded((s) => !s)} id="acc-3">
91
+ <AccordionToggle
92
+ togglePosition="left"
93
+ title="User informations 3"
94
+ description="The following contains information about the current user 3"
95
+ />
96
+ <AccordionContent>
97
+ <Box padding={3}>
98
+ <Typography>My name is John Duff</Typography>
99
+ </Box>
100
+ </AccordionContent>
101
+ </Accordion>
102
+ </Box>
103
+ <Box padding={8} background="neutral0">
104
+ <Accordion expanded={expanded} onToggle={() => setExpanded((s) => !s)} id="acc-4" variant="secondary">
105
+ <AccordionToggle
106
+ togglePosition="left"
107
+ title="User informations 4"
108
+ action={<IconButton onClick={() => console.log('edit')} label="Edit" icon={<Pencil />} />}
109
+ />
110
+ <AccordionContent>
111
+ <Box padding={3}>
112
+ <Typography>My name is John Duff</Typography>
113
+ </Box>
114
+ </AccordionContent>
115
+ </Accordion>
116
+ </Box>
117
+ </div>
118
+ );
119
+ }}
120
+ </Story>
121
+ </Canvas>
122
+
123
+ ## AccordionGroup
124
+
125
+ <Canvas>
126
+ <Story name="accordion-group">
127
+ {() => {
128
+ const [expandedID, setExpandedID] = useState(null);
129
+ const handleToggle = (id) => () => {
130
+ setExpandedID((s) => (s === id ? null : id));
131
+ };
132
+ return (
133
+ <div>
134
+ <Box padding={8} background="neutral0">
135
+ <AccordionGroup
136
+ error="The components contain error(s)"
137
+ footer={
138
+ <Flex justifyContent="center" height="48px" background="neutral150">
139
+ <TextButton disabled={true} startIcon={<Plus />}>
140
+ Add an entry
141
+ </TextButton>
142
+ </Flex>
143
+ }
144
+ label="Label"
145
+ labelAction={
146
+ <Tooltip description="Content of the tooltip">
147
+ <button
148
+ aria-label="Information about the email"
149
+ style={{
150
+ border: 'none',
151
+ padding: 0,
152
+ background: 'transparent',
153
+ }}
154
+ >
155
+ <Information aria-hidden={true} />
156
+ </button>
157
+ </Tooltip>
158
+ }
159
+ >
160
+ <Accordion
161
+ error="The components contain error(s)"
162
+ expanded={expandedID === 'acc-1'}
163
+ onToggle={handleToggle('acc-1')}
164
+ id="acc-1"
165
+ size="S"
166
+ >
167
+ <AccordionToggle
168
+ startIcon={<User aria-hidden={true} />}
169
+ action={
170
+ <Stack horizontal spacing={0}>
171
+ <IconButton noBorder onClick={() => console.log('edit')} label="Edit" icon={<Pencil />} />
172
+ <IconButton noBorder onClick={() => console.log('delete')} label="Delete" icon={<Trash />} />
173
+ </Stack>
174
+ }
175
+ title="User informations"
176
+ togglePosition="left"
177
+ />
178
+ <AccordionContent>
179
+ <Box padding={3}>
180
+ <TextInput label="Name" />
181
+ </Box>
182
+ </AccordionContent>
183
+ </Accordion>
184
+ <Accordion
185
+ error="The component contain error(s)"
186
+ expanded={expandedID === 'acc-2'}
187
+ onToggle={handleToggle('acc-2')}
188
+ id="acc-2"
189
+ size="S"
190
+ >
191
+ <AccordionToggle title="User informations" togglePosition="left" />
192
+ <AccordionContent>
193
+ <Box padding={3}>
194
+ <Typography>My name is John Duff</Typography>
195
+ </Box>
196
+ </AccordionContent>
197
+ </Accordion>
198
+ <Accordion expanded={expandedID === 'acc-3'} onToggle={handleToggle('acc-3')} id="acc-3" size="S">
199
+ <AccordionToggle title="User informations" togglePosition="left" />
200
+ <AccordionContent>
201
+ <Box padding={3}>
202
+ <Typography>My name is Michka</Typography>
203
+ </Box>
204
+ </AccordionContent>
205
+ </Accordion>
206
+ <Accordion expanded={expandedID === 'acc-4'} onToggle={handleToggle('acc-4')} id="acc-4" size="S">
207
+ <AccordionToggle
208
+ startIcon={<User aria-hidden={true} />}
209
+ title="User informations"
210
+ togglePosition="left"
211
+ />
212
+ <AccordionContent>
213
+ <Box padding={3}>
214
+ <Typography>My name is John Duff</Typography>
215
+ </Box>
216
+ </AccordionContent>
217
+ </Accordion>
218
+ </AccordionGroup>
219
+ </Box>
220
+ </div>
221
+ );
222
+ }}
223
+ </Story>
224
+ </Canvas>
225
+
226
+ ## Accordion keyboard navigable
227
+
228
+ The accordion component has two main states: collapsed and expanded. By default it has a collapsed state. If Call-to-actions are required, use them on the right side and use chevron icon on the left one.
229
+
230
+ <Canvas>
231
+ <Story name="keyboard navigable">
232
+ {() => {
233
+ return (
234
+ <KeyboardNavigable attributeName="data-strapi-accordion-toggle">
235
+ <Box padding={8} background="neutral100">
236
+ <Accordion expanded={false} onToggle={() => {}} id="acc-1">
237
+ <AccordionToggle
238
+ title="User informations"
239
+ description="The following contains information about the current user"
240
+ />
241
+ <AccordionContent>
242
+ <Box padding={3}>
243
+ <Typography>My name is John Duff</Typography>
244
+ </Box>
245
+ </AccordionContent>
246
+ </Accordion>
247
+ </Box>
248
+ <Box padding={8} background="neutral0">
249
+ <Accordion expanded={false} onToggle={() => {}} id="acc-2">
250
+ <AccordionToggle
251
+ variant="secondary"
252
+ title="User informations 2"
253
+ description="The following contains information about the current user 2"
254
+ />
255
+ <AccordionContent>
256
+ <Box padding={3}>
257
+ <Typography>My name is John Duff</Typography>
258
+ </Box>
259
+ </AccordionContent>
260
+ </Accordion>
261
+ </Box>
262
+ <Box padding={8} background="neutral100">
263
+ <Accordion expanded={false} onToggle={() => {}} id="acc-3">
264
+ <AccordionToggle
265
+ togglePosition="left"
266
+ title="User informations 3"
267
+ description="The following contains information about the current user 3"
268
+ />
269
+ <AccordionContent>
270
+ <Box padding={3}>
271
+ <Typography>My name is John Duff</Typography>
272
+ </Box>
273
+ </AccordionContent>
274
+ </Accordion>
275
+ </Box>
276
+ <Box padding={8} background="neutral0">
277
+ <Accordion expanded={false} onToggle={() => {}} id="acc-4">
278
+ <AccordionToggle
279
+ variant="secondary"
280
+ togglePosition="left"
281
+ title="User informations 4"
282
+ action={<IconButton onClick={() => console.log('edit')} label="Edit" icon={<Pencil />} />}
283
+ />
284
+ <AccordionContent>
285
+ <Box padding={3}>
286
+ <Typography>My name is John Duff</Typography>
287
+ </Box>
288
+ </AccordionContent>
289
+ </Accordion>
290
+ </Box>
291
+ </KeyboardNavigable>
292
+ );
293
+ }}
294
+ </Story>
295
+ </Canvas>
296
+
297
+ ## Accordion expanded
298
+
299
+ The Accordion component can also be open by default using the parameter `expanded={true}`.
300
+
301
+ <Canvas>
302
+ <Story name="expanded">
303
+ <Accordion expanded={true} onToggle={() => {}} id="acc-1">
304
+ <AccordionToggle
305
+ title="User informations"
306
+ description="The following contains information about the current user"
307
+ />
308
+ <AccordionContent>
309
+ <Box padding={3}>
310
+ <Typography>My name is John Duff</Typography>
311
+ </Box>
312
+ </AccordionContent>
313
+ </Accordion>
314
+ </Story>
315
+ </Canvas>
316
+
317
+ ## Accordion props
318
+
319
+ <ArgsTable of={Accordion} />
320
+
321
+ ## AccordionGroup props
322
+
323
+ <ArgsTable of={AccordionGroup} />
324
+
325
+ ## AccordionToggle props
326
+
327
+ <ArgsTable of={AccordionToggle} />
@@ -0,0 +1,26 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { useAccordion } from './AccordionContext';
4
+ import { Box } from '../Box';
5
+
6
+ export const AccordionContent = ({ children, ...props }) => {
7
+ const { expanded, id } = useAccordion();
8
+
9
+ if (!expanded) {
10
+ return null;
11
+ }
12
+
13
+ const idContent = `accordion-content-${id}`;
14
+ const ariaLabelId = `accordion-label-${id}`;
15
+ const ariaDescriptionId = `accordion-desc-${id}`;
16
+
17
+ return (
18
+ <Box role="region" id={idContent} aria-labelledby={ariaLabelId} aria-describedby={ariaDescriptionId} {...props}>
19
+ {children}
20
+ </Box>
21
+ );
22
+ };
23
+
24
+ AccordionContent.propTypes = {
25
+ children: PropTypes.node.isRequired,
26
+ };
@@ -0,0 +1,5 @@
1
+ import { createContext, useContext } from 'react';
2
+
3
+ export const AccordionContext = createContext();
4
+
5
+ export const useAccordion = () => useContext(AccordionContext);
@@ -0,0 +1,114 @@
1
+ import React, { Children, cloneElement } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import styled from 'styled-components';
4
+ import { Box } from '../Box';
5
+ import { Typography } from '../Typography';
6
+ import { Flex } from '../Flex';
7
+ import { KeyboardNavigable } from '../KeyboardNavigable';
8
+
9
+ const AccordionFooter = styled(Box)`
10
+ border-bottom: 1px solid ${({ theme }) => theme.colors.neutral200};
11
+ border-right: 1px solid ${({ theme }) => theme.colors.neutral200};
12
+ border-left: 1px solid ${({ theme }) => theme.colors.neutral200};
13
+ border-radius: 0 0 ${({ theme }) => theme.borderRadius} ${({ theme }) => theme.borderRadius};
14
+ `;
15
+
16
+ const EnhancedGroup = styled(Box)`
17
+ & > * {
18
+ & > * {
19
+ border-radius: unset;
20
+ }
21
+ }
22
+
23
+ & > * {
24
+ border-radius: unset;
25
+ border-right: 1px solid ${({ theme }) => theme.colors.neutral200};
26
+ border-left: 1px solid ${({ theme }) => theme.colors.neutral200};
27
+ border-bottom: 1px solid ${({ theme }) => theme.colors.neutral200};
28
+ }
29
+
30
+ & > *:first-of-type {
31
+ border-top: 1px solid ${({ theme }) => theme.colors.neutral200};
32
+ border-radius: ${({ theme }) => theme.borderRadius} ${({ theme }) => theme.borderRadius} 0 0;
33
+ & > * {
34
+ border-radius: ${({ theme }) => theme.borderRadius} ${({ theme }) => theme.borderRadius} 0 0;
35
+ }
36
+
37
+ &:hover {
38
+ border-top: 1px solid ${({ theme }) => theme.colors.primary600};
39
+ }
40
+ }
41
+
42
+ & [data-strapi-expanded='true'] {
43
+ border: 1px solid ${({ theme }) => theme.colors.primary600};
44
+ }
45
+
46
+ ${({ theme, footer }) => `
47
+ &:not(${footer}) {
48
+ & > *:last-of-type {
49
+ border-radius: 0 0 ${theme.borderRadius} ${theme.borderRadius};
50
+ }
51
+ }
52
+ `}
53
+ `;
54
+
55
+ const LabelAction = styled(Box)`
56
+ svg path {
57
+ fill: ${({ theme }) => theme.colors.neutral500};
58
+ }
59
+ `;
60
+
61
+ export const AccordionGroup = ({ children, footer, label, labelAction, error }) => {
62
+ const childrenArray = Children.toArray(children).map((child) => {
63
+ return cloneElement(child, { hasErrorMessage: false });
64
+ });
65
+
66
+ return (
67
+ <KeyboardNavigable attributeName="data-strapi-accordion-toggle">
68
+ {label && (
69
+ <Flex paddingBottom={1}>
70
+ <Typography variant="pi" as="label" textColor="neutral800" fontWeight="bold">
71
+ {label}
72
+ </Typography>
73
+ {labelAction && <LabelAction paddingLeft={1}>{labelAction}</LabelAction>}
74
+ </Flex>
75
+ )}
76
+ <EnhancedGroup footer={footer}>{childrenArray}</EnhancedGroup>
77
+ {footer && <AccordionFooter>{footer}</AccordionFooter>}
78
+ {error && (
79
+ <Box paddingTop={1}>
80
+ <Typography variant="pi" textColor="danger600">
81
+ {error}
82
+ </Typography>
83
+ </Box>
84
+ )}
85
+ </KeyboardNavigable>
86
+ );
87
+ };
88
+
89
+ AccordionGroup.defaultProps = {
90
+ footer: null,
91
+ error: undefined,
92
+ label: null,
93
+ labelAction: undefined,
94
+ };
95
+
96
+ AccordionGroup.propTypes = {
97
+ children: PropTypes.node.isRequired,
98
+ /**
99
+ * If defined, the component will show the error message at the bottom of the `AccordionGroup` and will hide all Accordion error messages children (in order to display only one error).
100
+ */
101
+ error: PropTypes.string,
102
+ /**
103
+ * Render a node a last child. Mainly used for an "Add new accordion" button
104
+ */
105
+ footer: PropTypes.node,
106
+ /**
107
+ * The label of the AccordionGroup
108
+ */
109
+ label: PropTypes.string,
110
+ /**
111
+ * Will render a node to the right of the label
112
+ */
113
+ labelAction: PropTypes.node,
114
+ };
@@ -0,0 +1,192 @@
1
+ import React, { useRef } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import DropdownIcon from '@strapi/icons/CarretDown';
4
+ import styled from 'styled-components';
5
+ import { TextButton } from '../TextButton';
6
+ import { Typography } from '../Typography';
7
+ import { AccordionTypography } from './Accordion';
8
+ import { useAccordion } from './AccordionContext';
9
+ import { Flex } from '../Flex';
10
+ import { Stack } from '../Stack';
11
+ import { Icon } from '../Icon';
12
+ import { getBackground } from './utils';
13
+
14
+ const ToggleButton = styled(TextButton)`
15
+ text-align: left;
16
+
17
+ // necessary to make the ellipsis prop work on the title
18
+ > span {
19
+ max-width: 100%;
20
+ }
21
+
22
+ svg {
23
+ width: ${14 / 16}rem;
24
+ height: ${14 / 16}rem;
25
+
26
+ path {
27
+ fill: ${({ theme, expanded }) => (expanded ? theme.colors.primary600 : theme.colors.neutral500)};
28
+ }
29
+ }
30
+ `;
31
+
32
+ const FlexWithSize = styled(Flex)`
33
+ min-height: ${({ theme, size }) => theme.sizes.accordions[size]};
34
+ border-radius: ${({ theme, expanded }) =>
35
+ expanded ? `${theme.borderRadius} ${theme.borderRadius} 0 0` : theme.borderRadius};
36
+
37
+ &:hover {
38
+ svg {
39
+ path {
40
+ fill: ${({ theme }) => theme.colors.primary600};
41
+ }
42
+ }
43
+ }
44
+ `;
45
+
46
+ export const AccordionToggle = ({ title, description, as, togglePosition, action, ...props }) => {
47
+ const toggleButtonRef = useRef(null);
48
+ const { onToggle, toggle, expanded, id, size, variant, disabled } = useAccordion();
49
+
50
+ // Accessibility identifiers
51
+ const ariaControls = `accordion-content-${id}`;
52
+ const ariaLabelId = `accordion-label-${id}`;
53
+ const ariaDescriptionId = `accordion-desc-${id}`;
54
+
55
+ // Style overrides
56
+ const boxPaddingX = size === 'M' ? 6 : 4;
57
+ const boxPaddingY = size === 'M' ? boxPaddingX : boxPaddingX - 2;
58
+ const boxBackground = getBackground({ expanded, disabled, variant });
59
+ const titleColor = expanded ? 'primary600' : 'neutral700';
60
+ const titleProps = {
61
+ as,
62
+ fontWeight: size === 'S' ? 'bold' : undefined,
63
+ id: ariaLabelId,
64
+ textColor: titleColor,
65
+ ellipsis: true,
66
+ variant: size === 'M' ? 'delta' : undefined,
67
+ };
68
+ const descriptionColor = expanded ? 'primary600' : 'neutral600';
69
+ const iconColor = expanded ? 'primary200' : 'neutral200';
70
+ const iconSize = size === 'M' ? `${32 / 16}rem` : `${24 / 16}rem`;
71
+
72
+ const handleToggle = () => {
73
+ if (!disabled) {
74
+ if (toggle && !onToggle) {
75
+ console.warn(
76
+ 'Deprecation warning: Usage of "toggle" prop in Accordion component is deprecated. This is discouraged and will be removed in the next major release. Please use "onToggle" instead',
77
+ );
78
+ toggle();
79
+ } else {
80
+ onToggle();
81
+ }
82
+ }
83
+ };
84
+
85
+ const dropdownIcon = (
86
+ <Flex
87
+ justifyContent="center"
88
+ borderRadius="50%"
89
+ height={iconSize}
90
+ width={iconSize}
91
+ transform={expanded ? `rotate(180deg)` : undefined}
92
+ data-strapi-dropdown={true}
93
+ disabled={disabled}
94
+ aria-hidden
95
+ as="span"
96
+ background={iconColor}
97
+ cursor={disabled ? 'not-allowed' : 'pointer'}
98
+ onClick={() => toggleButtonRef?.current?.click()}
99
+ shrink={0}
100
+ >
101
+ <Icon
102
+ as={DropdownIcon}
103
+ width={size === 'M' ? `${11 / 16}rem` : `${8 / 16}rem`}
104
+ color={expanded ? 'primary600' : 'neutral600'}
105
+ />
106
+ </Flex>
107
+ );
108
+
109
+ return (
110
+ <FlexWithSize
111
+ paddingBottom={boxPaddingY}
112
+ paddingLeft={boxPaddingX}
113
+ paddingRight={boxPaddingX}
114
+ paddingTop={boxPaddingY}
115
+ background={boxBackground}
116
+ expanded={expanded}
117
+ size={size}
118
+ justifyContent="space-between"
119
+ cursor={disabled ? 'not-allowed' : ''}
120
+ >
121
+ <Stack horizontal spacing={3} flex={1} maxWidth="100%">
122
+ {togglePosition === 'left' && dropdownIcon}
123
+
124
+ <ToggleButton
125
+ ref={toggleButtonRef}
126
+ onClick={handleToggle}
127
+ aria-disabled={disabled}
128
+ aria-expanded={expanded}
129
+ aria-controls={ariaControls}
130
+ aria-labelledby={ariaLabelId}
131
+ data-strapi-accordion-toggle={true}
132
+ expanded={expanded}
133
+ type="button"
134
+ flex={1}
135
+ minWidth={0}
136
+ {...props}
137
+ >
138
+ <>
139
+ <AccordionTypography {...titleProps}>{title}</AccordionTypography>
140
+
141
+ {description && (
142
+ <Typography as="p" id={ariaDescriptionId} textColor={descriptionColor}>
143
+ {description}
144
+ </Typography>
145
+ )}
146
+ </>
147
+ </ToggleButton>
148
+
149
+ {togglePosition === 'right' && (
150
+ <Stack horizontal spacing={3}>
151
+ {dropdownIcon}
152
+ {action}
153
+ </Stack>
154
+ )}
155
+
156
+ {togglePosition === 'left' && action}
157
+ </Stack>
158
+ </FlexWithSize>
159
+ );
160
+ };
161
+
162
+ AccordionToggle.defaultProps = {
163
+ action: undefined,
164
+ as: 'span',
165
+ description: undefined,
166
+ variant: 'primary',
167
+ togglePosition: 'right',
168
+ };
169
+
170
+ AccordionToggle.propTypes = {
171
+ /**
172
+ * Will render a node to the right of the Accordion component
173
+ */
174
+ action: PropTypes.node,
175
+ as: PropTypes.string,
176
+ /**
177
+ * Show the secondary text of the Accordion component
178
+ */
179
+ description: PropTypes.string,
180
+ /**
181
+ * Show the main title of the Accordion component
182
+ */
183
+ title: PropTypes.string.isRequired,
184
+ /**
185
+ * Set the position of the toggle icon button
186
+ */
187
+ togglePosition: PropTypes.oneOf(['right', 'left']),
188
+ /**
189
+ * Color variant
190
+ */
191
+ variant: PropTypes.oneOf(['primary', 'secondary']),
192
+ };
@@ -0,0 +1,32 @@
1
+ import { injectAxe, checkA11y } from 'axe-playwright';
2
+
3
+ import { test } from '@playwright/test';
4
+
5
+ test.describe.parallel('Accordion', () => {
6
+ test.describe('light theme', () => {
7
+ test.beforeEach(async ({ page }) => {
8
+ // This is the URL of the Storybook Iframe
9
+ await page.goto('/iframe.html?id=design-system-components-accordion--base&viewMode=story');
10
+ await injectAxe(page);
11
+ });
12
+
13
+ test('triggers axe on the document', async ({ page }) => {
14
+ await checkA11y(page);
15
+ });
16
+
17
+ test('triggers axe on the document when the accordion is expanded', async ({ page }) => {
18
+ await page.click('[aria-labelledby="accordion-label-acc-1"]');
19
+
20
+ await checkA11y(page);
21
+ });
22
+ });
23
+
24
+ test.describe('dark theme', () => {
25
+ test('triggers axe on the document', async ({ page }) => {
26
+ // This is the URL of the Storybook Iframe
27
+ await page.goto('/iframe.html?id=design-system-components-accordion--base&viewMode=story&theme=dark');
28
+ await injectAxe(page);
29
+ await checkA11y(page);
30
+ });
31
+ });
32
+ });