@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 @@
1
+ export * from './Flex';
@@ -0,0 +1,71 @@
1
+ /* eslint-disable react/prop-types */
2
+ import React, { useState } from 'react';
3
+ import Cross from '@strapi/icons/Cross';
4
+ import { Box } from '../Box';
5
+ import { Stack } from '../Stack';
6
+ import { Typography } from '../Typography';
7
+ import { Button } from '../Button';
8
+ import { Flex } from '../Flex';
9
+
10
+ import { FocusTrap } from './FocusTrap';
11
+
12
+ const TrappedComponent = ({ onClose }) => {
13
+ const [newLastVisible, setNewLastVisible] = useState(false);
14
+
15
+ return (
16
+ <FocusTrap onEscape={onClose}>
17
+ <Box background="neutral0" padding={4} hasRadius style={{ width: '600px' }}>
18
+ <Stack spacing={2}>
19
+ <Flex justifyContent="space-between">
20
+ <Typography variant="beta" as="h2">
21
+ Hey folks!
22
+ </Typography>
23
+ <button style={{ border: 'none', background: 'transparent' }} onClick={onClose} aria-label="Close">
24
+ <Cross aria-hidden={true} />
25
+ </button>
26
+ </Flex>
27
+ <Box paddingTop={2} paddingBottom={2}>
28
+ <Typography>
29
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et
30
+ dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex
31
+ ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
32
+ fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt
33
+ mollit anim id est laborum.
34
+ </Typography>
35
+ </Box>
36
+ <Flex justifyContent="space-between">
37
+ <Button id="second">Second focusable</Button>
38
+ <Button id="last" onClick={() => setNewLastVisible(true)}>
39
+ Last focusable (at the beginning)
40
+ </Button>
41
+
42
+ {newLastVisible && <Button id="real-last">Last focusable (at the end)</Button>}
43
+ </Flex>
44
+ </Stack>
45
+ </Box>
46
+ </FocusTrap>
47
+ );
48
+ };
49
+
50
+ export const ExampleComponent = () => {
51
+ const [visible, setVisible] = useState(false);
52
+
53
+ return (
54
+ <Box background="neutral150" padding={10}>
55
+ <Stack spacing={2}>
56
+ {visible && <TrappedComponent onClose={() => setVisible(false)} />}
57
+ <Box background="neutral0" padding={4} hasRadius style={{ width: '600px' }}>
58
+ <Typography variant="beta" as="h2">
59
+ Outside the trap!
60
+ </Typography>
61
+
62
+ <Box paddingTop={2}>
63
+ <Button onClick={() => setVisible(true)} id="trigger">
64
+ Open the trap
65
+ </Button>
66
+ </Box>
67
+ </Box>
68
+ </Stack>
69
+ </Box>
70
+ );
71
+ };
@@ -0,0 +1,83 @@
1
+ import React, { useEffect, useRef } from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { getFocusableNodes } from '../helpers/getFocusableNodes';
4
+ import { KeyboardKeys } from '../helpers/keyboardKeys';
5
+
6
+ export const FocusTrap = ({ onEscape, restoreFocus, ...props }) => {
7
+ const trappedRef = useRef(null);
8
+
9
+ /**
10
+ * Restore the focus to the previously focused element (often, it's the CTA that opened the trap)
11
+ */
12
+ useEffect(() => {
13
+ if (restoreFocus) {
14
+ const currentFocus = document.activeElement;
15
+
16
+ return () => {
17
+ currentFocus.focus();
18
+ };
19
+ }
20
+ }, [restoreFocus]);
21
+
22
+ /**
23
+ * Sends the focus to the first element of the focus trap tree
24
+ */
25
+ useEffect(() => {
26
+ if (!trappedRef.current) return;
27
+
28
+ const focusableChildren = getFocusableNodes(trappedRef.current);
29
+
30
+ if (focusableChildren.length > 0) {
31
+ const firstElement = focusableChildren[0];
32
+
33
+ firstElement.focus();
34
+ } else {
35
+ console.warn(
36
+ '[FocusTrap]: it seems there are no focusable elements in the focus trap tree. Make sure there s at least one.',
37
+ );
38
+ }
39
+ }, []);
40
+
41
+ const handleKeyDown = (e) => {
42
+ if (e.key === KeyboardKeys.ESCAPE && onEscape) {
43
+ return onEscape();
44
+ }
45
+
46
+ if (e.key !== KeyboardKeys.TAB) return;
47
+
48
+ const focusableChildren = getFocusableNodes(trappedRef.current);
49
+
50
+ if (focusableChildren.length > 0) {
51
+ const firstElement = focusableChildren[0];
52
+ const lastElement = focusableChildren[focusableChildren.length - 1];
53
+
54
+ // e.shiftKey allows to verify reverse tab
55
+ if (e.shiftKey) {
56
+ if (firstElement === document.activeElement) {
57
+ e.preventDefault();
58
+ lastElement.focus();
59
+ }
60
+ } else if (lastElement === document.activeElement) {
61
+ e.preventDefault();
62
+ firstElement.focus();
63
+ }
64
+ }
65
+ };
66
+
67
+ return <div ref={trappedRef} onKeyDown={handleKeyDown} {...props} />;
68
+ };
69
+
70
+ FocusTrap.defaultProps = {
71
+ restoreFocus: true,
72
+ };
73
+
74
+ FocusTrap.propTypes = {
75
+ /**
76
+ * A callback called on escape key. Useful to deactivate the focus trap.
77
+ */
78
+ onEscape: PropTypes.func,
79
+ /**
80
+ * A boolean value to define whether the focus should be restored or not.
81
+ */
82
+ restoreFocus: PropTypes.bool,
83
+ };
@@ -0,0 +1,32 @@
1
+ <!--- FocusTrap.stories.mdx --->
2
+
3
+ import { Meta, Story, Canvas } from '@storybook/addon-docs';
4
+ import { ArgsTable } from '@storybook/addon-docs';
5
+ import { FocusTrap } from './FocusTrap';
6
+ import { ExampleComponent } from './ExampleComponent';
7
+
8
+ <Meta title="Design System/Technical Components/FocusTrap" component={FocusTrap} />
9
+
10
+ # FocusTrap
11
+
12
+ The FocusTrap restricts keyboard navigation to a certain zone of the screen. For instance, it can be used in a modal to limit tab navigation to a specific context.
13
+
14
+ ## Imports
15
+
16
+ ```js
17
+ import FocusTrap from '@strapi/parts/FocusTrap';
18
+ ```
19
+
20
+ ## Usage
21
+
22
+ To use it, wrap your code into a `<FocusTrap onEscape={onClose}>` block.
23
+
24
+ <Canvas>
25
+ <Story name="base">
26
+ <ExampleComponent />
27
+ </Story>
28
+ </Canvas>
29
+
30
+ ## Props
31
+
32
+ <ArgsTable of={FocusTrap} />
@@ -0,0 +1,126 @@
1
+ import { injectAxe, checkA11y } from 'axe-playwright';
2
+
3
+ import { test, expect } from '@playwright/test';
4
+
5
+ test.describe.parallel('FocusTrap', () => {
6
+ test.describe('light mode', () => {
7
+ test.beforeEach(async ({ page }) => {
8
+ // This is the URL of the Storybook Iframe
9
+ await page.goto('/iframe.html?id=design-system-technical-components-focustrap--base&viewMode=story');
10
+ await injectAxe(page);
11
+ });
12
+
13
+ test.beforeEach(async ({ page }) => {
14
+ await page.focus('#trigger');
15
+ await page.keyboard.press('Space');
16
+ });
17
+
18
+ test('triggers axe on the document', async ({ page }) => {
19
+ await checkA11y(page);
20
+ });
21
+
22
+ test('focuses the first focusable element when opening the focus trap', async ({ page }) => {
23
+ await expect(page.locator('[aria-label="Close"]')).toBeFocused();
24
+ });
25
+
26
+ test('restores focus when pressing Escape', async ({ page }) => {
27
+ await page.waitForSelector('[aria-label="Close"]');
28
+ await page.keyboard.press('Escape');
29
+
30
+ await expect(page.locator('#trigger')).toBeFocused();
31
+ });
32
+
33
+ test.describe('Pressing Tab in the trap', () => {
34
+ test('traps the focus when pressing Tab for Firefox and Chrome', async ({ page, browserName }) => {
35
+ test.skip(browserName === 'webkit', 'Still working on it');
36
+ await page.keyboard.press('Tab');
37
+ await expect(page.locator('#second')).toBeFocused();
38
+
39
+ await page.keyboard.press('Tab');
40
+ await expect(page.locator('#last')).toBeFocused();
41
+
42
+ await page.keyboard.press('Tab');
43
+ await expect(page.locator('[aria-label="Close"]')).toBeFocused();
44
+ });
45
+
46
+ test('traps the focus when pressing Tab for Webkit', async ({ page, browserName }) => {
47
+ test.skip(['firefox', 'chromium'].includes(browserName), 'Still working on it');
48
+ await page.waitForSelector('[aria-label="Close"]');
49
+ await page.keyboard.press('Alt+Tab');
50
+ await expect(page.locator('#second')).toBeFocused();
51
+
52
+ await page.keyboard.press('Alt+Tab');
53
+ await expect(page.locator('#last')).toBeFocused();
54
+
55
+ await page.keyboard.press('Alt+Tab');
56
+ await expect(page.locator('[aria-label="Close"]')).toBeFocused();
57
+ });
58
+
59
+ test('traps the focus when dynamically adding an element in the focus tree and pressing Tab for Firefox and Chrome', async ({
60
+ page,
61
+ browserName,
62
+ }) => {
63
+ test.skip(browserName === 'webkit', 'Still working on it');
64
+ await page.keyboard.press('Tab');
65
+ await expect(page.locator('#second')).toBeFocused();
66
+
67
+ await page.keyboard.press('Tab');
68
+ await expect(page.locator('#last')).toBeFocused();
69
+ await page.click('#last');
70
+
71
+ await page.keyboard.press('Tab');
72
+ await expect(page.locator('#real-last')).toBeFocused();
73
+ });
74
+
75
+ test('traps the focus when pressing Tab with click for Webkit', async ({ page, browserName }) => {
76
+ test.skip(['firefox', 'chromium'].includes(browserName), 'Still working on it');
77
+ await page.waitForSelector('[aria-label="Close"]');
78
+ await page.keyboard.press('Alt+Tab');
79
+ await expect(page.locator('#second')).toBeFocused();
80
+
81
+ await page.keyboard.press('Alt+Tab');
82
+ await expect(page.locator('#last')).toBeFocused();
83
+ await page.click('#last');
84
+
85
+ await page.keyboard.press('Alt+Tab');
86
+ await expect(page.locator('#real-last')).toBeFocused();
87
+ });
88
+ });
89
+
90
+ test.describe('Pressing Shift+Tab in the trap', () => {
91
+ test('traps the focus when pressing Tab for Firefox and Chrome', async ({ page, browserName }) => {
92
+ test.skip(browserName === 'webkit', 'Still working on it');
93
+ await page.keyboard.press('Shift+Tab');
94
+ await expect(page.locator('#last')).toBeFocused();
95
+
96
+ await page.keyboard.press('Shift+Tab');
97
+ await expect(page.locator('#second')).toBeFocused();
98
+
99
+ await page.keyboard.press('Shift+Tab');
100
+ await expect(page.locator('[aria-label="Close"]')).toBeFocused();
101
+ });
102
+
103
+ test('traps the focus when pressing Tab for Webkit', async ({ page, browserName }) => {
104
+ test.skip(['firefox', 'chromium'].includes(browserName), 'Still working on it');
105
+ await page.waitForSelector('[aria-label="Close"]');
106
+ await page.keyboard.press('Alt+Shift+Tab');
107
+ await expect(page.locator('#last')).toBeFocused();
108
+
109
+ await page.keyboard.press('Alt+Shift+Tab');
110
+ await expect(page.locator('#second')).toBeFocused();
111
+
112
+ await page.keyboard.press('Alt+Shift+Tab');
113
+ await expect(page.locator('[aria-label="Close"]')).toBeFocused();
114
+ });
115
+ });
116
+ });
117
+
118
+ test.describe('dark mode', () => {
119
+ test('triggers axe on the document', async ({ page }) => {
120
+ // This is the URL of the Storybook Iframe
121
+ await page.goto('/iframe.html?id=design-system-technical-components-focustrap--base&viewMode=story&theme=dark');
122
+ await injectAxe(page);
123
+ await checkA11y(page);
124
+ });
125
+ });
126
+ });
@@ -0,0 +1 @@
1
+ export * from './FocusTrap';
@@ -0,0 +1,30 @@
1
+ import React from 'react';
2
+ import styled from 'styled-components';
3
+ import PropTypes from 'prop-types';
4
+ import { GridContext } from './GridContext';
5
+ import { Box } from '../Box';
6
+ import handleResponsiveValues from '../helpers/handleResponsiveValues';
7
+
8
+ const GridWrapper = styled(Box)`
9
+ display: grid;
10
+ grid-template-columns: repeat(${({ gridCols }) => gridCols}, 1fr);
11
+ ${({ theme, gap }) => handleResponsiveValues('gap', gap, theme)}
12
+ `;
13
+
14
+ export const Grid = ({ gap, gridCols, ...props }) => {
15
+ return (
16
+ <GridContext.Provider value={{ gap, gridCols }}>
17
+ <GridWrapper gap={gap} gridCols={gridCols} {...props} />
18
+ </GridContext.Provider>
19
+ );
20
+ };
21
+
22
+ Grid.defaultProps = {
23
+ gap: 0,
24
+ gridCols: 12,
25
+ };
26
+
27
+ Grid.propTypes = {
28
+ gap: PropTypes.oneOfType([PropTypes.number, PropTypes.arrayOf(PropTypes.number)]),
29
+ gridCols: PropTypes.number,
30
+ };
@@ -0,0 +1,112 @@
1
+ <!--- Grid.stories.mdx --->
2
+
3
+ import { Meta, Story, Canvas } from '@storybook/addon-docs';
4
+ import { ArgsTable } from '@storybook/addon-docs';
5
+ import { Grid } from './Grid';
6
+ import { GridItem } from './GridItem';
7
+ import { Typography } from '../Typography';
8
+
9
+ <Meta title="Design System/Technical Components/Grid" component={Grid} />
10
+
11
+ # Grid
12
+
13
+ A grid system helps the content to follow a logical order and increase readability.
14
+
15
+ **Baseline**
16
+ The Strapi type stack specifies 14px/0.875rem for the base font size, which produces an 8px x-height. The x-height is halved to produce a 4px baseline.
17
+ This baseline convention naturally flows on to the rest of the grid system, which includes icons, components, and layout dimensions. Always try to align objects on the 8px grid, but where necessary use good judgement to fine tune your designs to 4px. The 4px baseline is there to allow more flexibility for line heights and smaller adjustments.
18
+
19
+ [View source](https://github.com/strapi/design-system/tree/main/packages/strapi-design-system/src/Grid)
20
+
21
+ ## Imports
22
+
23
+ ```js
24
+ import { Grid, GridItem } from '@strapi/design-system/Grid';
25
+ ```
26
+
27
+ ## Usage
28
+
29
+ The component allows to create a Grid on the screen using the CSS grid feature. This component extends the `<Box />` one and can receive the same props.
30
+
31
+ <Canvas>
32
+ <Story name="base">
33
+ <Grid gap={5}>
34
+ <GridItem col={1} background="primary100">
35
+ <Typography>First</Typography>
36
+ </GridItem>
37
+ <GridItem col={1} background="primary100">
38
+ <Typography>Second</Typography>
39
+ </GridItem>
40
+ <GridItem col={1} background="primary100">
41
+ <Typography>Third</Typography>
42
+ </GridItem>
43
+ <GridItem col={1} background="primary100" color="primary700">
44
+ <Typography>Last</Typography>
45
+ </GridItem>
46
+ </Grid>
47
+ </Story>
48
+ </Canvas>
49
+
50
+ The following is a representation of the 12 columns Grid presented in the documentation.
51
+
52
+ <Canvas>
53
+ <Story name="base grid">
54
+ <Grid gap={5}>
55
+ {Array(12)
56
+ .fill(null)
57
+ .map((_, i) => (
58
+ <GridItem key={i} background="warning200" col={1}>
59
+ <Typography>{i + 1}</Typography>
60
+ </GridItem>
61
+ ))}
62
+ </Grid>
63
+ </Story>
64
+ </Canvas>
65
+
66
+ A more complex one
67
+
68
+ <Canvas>
69
+ <Story name="complex grid">
70
+ <Grid gap={{ desktop: 5, tablet: 2, mobile: 1 }} background={'primary200'}>
71
+ <GridItem background="neutral100" padding={1} col={6} s={12}>
72
+ <Typography>Some box 1</Typography>
73
+ </GridItem>
74
+ <GridItem background="neutral100" padding={1} col={6} s={12}>
75
+ <Typography>Some box 2</Typography>
76
+ </GridItem>
77
+ <GridItem background="neutral100" padding={1} col={3} s={6} xs={12}>
78
+ <Typography>Some box 3</Typography>
79
+ </GridItem>
80
+ <GridItem background="neutral100" padding={1} col={3} s={6} xs={12}>
81
+ <Typography>Some box 4</Typography>
82
+ </GridItem>
83
+ <GridItem background="neutral100" padding={1} col={3} s={6} xs={12}>
84
+ <Typography>Some box 5</Typography>
85
+ </GridItem>
86
+ <GridItem background="neutral100" padding={1} col={3} s={6} xs={12}>
87
+ <Typography>Some box 6</Typography>
88
+ </GridItem>
89
+ <GridItem background="neutral100" padding={1} col={8} xs={12}>
90
+ <Typography>Some box 7</Typography>
91
+ </GridItem>
92
+ <GridItem background="neutral100" padding={1} col={2} xs={12}>
93
+ <Typography>Some box 8</Typography>
94
+ </GridItem>
95
+ <GridItem background="neutral100" padding={5} col={2} xs={12}>
96
+ <Typography>Some box 9</Typography>
97
+ </GridItem>
98
+ </Grid>
99
+ </Story>
100
+ </Canvas>
101
+
102
+ ## Props
103
+
104
+ The Grid and GridItem components wraps all their 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 their style.
105
+
106
+ ### Grid Props
107
+
108
+ <ArgsTable of={Grid} />
109
+
110
+ ### GridItem Props
111
+
112
+ <ArgsTable of={GridItem} />
@@ -0,0 +1,5 @@
1
+ import { createContext, useContext } from 'react';
2
+
3
+ export const GridContext = createContext({ gap: 0, gridCols: 12 });
4
+
5
+ export const useGrid = () => useContext(GridContext);
@@ -0,0 +1,40 @@
1
+ import React from 'react';
2
+ import styled from 'styled-components';
3
+ import PropTypes from 'prop-types';
4
+ import { Box } from '../Box';
5
+ import { useGrid } from './GridContext';
6
+
7
+ const GridItemWrapper = styled.div`
8
+ grid-column: span ${({ col }) => col};
9
+ max-width: 100%;
10
+
11
+ ${({ theme }) => theme.mediaQueries.tablet} {
12
+ grid-column: span ${({ s }) => s};
13
+ }
14
+
15
+ ${({ theme }) => theme.mediaQueries.mobile} {
16
+ grid-column: span ${({ xs }) => xs};
17
+ }
18
+ `;
19
+
20
+ export const GridItem = ({ col, xs, s, ...props }) => {
21
+ const { gap, gridCols } = useGrid();
22
+
23
+ return (
24
+ <GridItemWrapper gap={gap} gridCols={gridCols} col={col} xs={xs} s={s}>
25
+ <Box {...props} />
26
+ </GridItemWrapper>
27
+ );
28
+ };
29
+
30
+ GridItem.defaultProps = {
31
+ col: undefined,
32
+ s: undefined,
33
+ xs: undefined,
34
+ };
35
+
36
+ GridItem.propTypes = {
37
+ col: PropTypes.number,
38
+ s: PropTypes.number,
39
+ xs: PropTypes.number,
40
+ };
@@ -0,0 +1,23 @@
1
+ import { injectAxe, checkA11y } from 'axe-playwright';
2
+
3
+ import { test } from '@playwright/test';
4
+
5
+ test.describe.parallel('Grid', () => {
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-technical-components-grid--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-technical-components-grid--base&viewMode=story&theme=dark');
19
+ await injectAxe(page);
20
+ await checkA11y(page);
21
+ });
22
+ });
23
+ });
@@ -0,0 +1,2 @@
1
+ export * from './Grid';
2
+ export * from './GridItem';
@@ -0,0 +1,27 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import { Box } from '../Box';
4
+ import styled from 'styled-components';
5
+
6
+ const IconWrapper = styled(Box)`
7
+ path {
8
+ fill: ${({ color, theme }) => theme.colors[color]};
9
+ }
10
+ ${({ theme, colors }) => colors(theme)}
11
+ `;
12
+
13
+ export const Icon = React.forwardRef((props, ref) => {
14
+ return <IconWrapper ref={ref} {...props} />;
15
+ });
16
+
17
+ Icon.displayName = 'Icon';
18
+
19
+ Icon.defaultProps = {
20
+ color: 'neutral600',
21
+ colors: () => undefined,
22
+ };
23
+
24
+ Icon.propTypes = {
25
+ color: PropTypes.string,
26
+ colors: PropTypes.func,
27
+ };
@@ -0,0 +1,41 @@
1
+ <!--- BaseButton.stories.mdx --->
2
+
3
+ import { Meta, Story, Canvas } from '@storybook/addon-docs';
4
+ import { ArgsTable } from '@storybook/addon-docs';
5
+ import Pencil from '@strapi/icons/Pencil';
6
+ import Play from '@strapi/icons/Play';
7
+ import Trash from '@strapi/icons/Trash';
8
+ import Plus from '@strapi/icons/Plus';
9
+ import { Icon } from './Icon';
10
+ import { Stack } from '../Stack';
11
+
12
+ <Meta title="Design System/Technical Components/Icon" component={Icon} />
13
+
14
+ ## Imports
15
+
16
+ ```js
17
+ import { Icon } from '@strapi/design-system/Icon';
18
+ ```
19
+
20
+ # Icon
21
+
22
+ The `Icon` component is used to customize Strapi icons.
23
+
24
+ ## Usage
25
+
26
+ <Canvas withSource="open">
27
+ <Story name="base">
28
+ <Stack spacing={3} horizontal>
29
+ <Icon width={`${25 / 16}rem`} height={`${25 / 16}rem`} color="secondary500" as={Pencil} />
30
+ <Icon width={`${15 / 16}rem`} height={`${15 / 16}rem`} color="alternative500" as={Play} />
31
+ <Icon width={`${30 / 16}rem`} height={`${30 / 16}rem`} color="danger500" as={Trash} />
32
+ <Icon as={Plus} />
33
+ </Stack>
34
+ </Story>
35
+ </Canvas>
36
+
37
+ ## Props
38
+
39
+ The Icon 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.
40
+
41
+ <ArgsTable of={Icon} />
@@ -0,0 +1,21 @@
1
+ import { injectAxe, checkA11y } from 'axe-playwright';
2
+
3
+ import { test } from '@playwright/test';
4
+
5
+ test.describe.parallel('IconButton', () => {
6
+ test.describe('light mode', () => {
7
+ test('triggers axe on the document', async ({ page }) => {
8
+ await page.goto('/iframe.html?id=design-system-technical-components-icon&viewMode=story');
9
+ await injectAxe(page);
10
+ await checkA11y(page);
11
+ });
12
+ });
13
+
14
+ test.describe('dark mode', () => {
15
+ test('triggers axe on the document', async ({ page }) => {
16
+ await page.goto('/iframe.html?id=design-system-technical-components-icon&viewMode=story&theme=dark');
17
+ await injectAxe(page);
18
+ await checkA11y(page);
19
+ });
20
+ });
21
+ });
@@ -0,0 +1 @@
1
+ export * from './Icon';