@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,220 @@
1
+ <!--- SimpleMenu.stories.mdx --->
2
+
3
+ import { useState } from 'react';
4
+ import { ArgsTable } from '@storybook/addon-docs';
5
+ import { Meta, Story, Canvas } from '@storybook/addon-docs';
6
+ import CarretDown from '@strapi/icons/CarretDown';
7
+ import { SimpleMenu, MenuItem } from './SimpleMenu';
8
+ import { IconButton } from '../../IconButton';
9
+ import { Stack } from '../../Stack';
10
+
11
+ <Meta title="Design System/Components/v2/SimpleMenu" component={SimpleMenu} />
12
+
13
+ # SimpleMenu
14
+
15
+ A menu displays a list of potential options or actions via a Popover component. A menu is used to give choices to the users in small spaces. However, a single option or action should be taken via a menu.
16
+
17
+ **Best practices**
18
+
19
+ - Use menu for small spaces. When there is more space, use Select component.
20
+ - Use menu if you want the user to make a single choice. When you need your user to select one or several options, use Select component.
21
+ - Try to have a sort logic in the popover of the menu.
22
+
23
+ [View source](https://github.com/strapi/design-system-experiments/tree/main/packages/strapi-design-system/src/v2/SimpleMenu)
24
+
25
+ ## Imports
26
+
27
+ ```js
28
+ import { SimpleMenu, MenuItem } from '@strapi/design-system/v2/SimpleMenu';
29
+ ```
30
+
31
+ ## Usage
32
+
33
+ The label of the menu can be replaced by the option selected. For instance, in a Date picker component, the menu label will be replaced by the active month.
34
+
35
+ By passing `aria-disabled` hover styles on `MenuItem`s can be disabled.
36
+
37
+ <Canvas>
38
+ <Story
39
+ name="base"
40
+ parameters={{
41
+ docs: {
42
+ source: {
43
+ code: `
44
+ const [val, setValue] = useState('January');\n
45
+ return (
46
+ <SimpleMenu id="label" label={val}>
47
+ <MenuItem id="menuItem-January" onClick={() => setValue('January')}>
48
+ January
49
+ </MenuItem>
50
+ <MenuItem id="menuItem-February" onClick={() => setValue('February')}>
51
+ February
52
+ </MenuItem>
53
+ </SimpleMenu>
54
+ );
55
+ `,
56
+ },
57
+ },
58
+ }}
59
+ >
60
+ {() => {
61
+ const [val, setValue] = useState('January');
62
+ return (
63
+ <SimpleMenu id="label" label={val}>
64
+ <MenuItem id="menuItem-January" onClick={() => setValue('January')}>
65
+ January
66
+ </MenuItem>
67
+ <MenuItem id="menuItem-February" onClick={() => setValue('February')}>
68
+ February
69
+ </MenuItem>
70
+ </SimpleMenu>
71
+ );
72
+ }}
73
+ </Story>
74
+ </Canvas>
75
+
76
+ ### With links
77
+
78
+ <Canvas>
79
+ <Story
80
+ name="with-links"
81
+ parameters={{
82
+ docs: {
83
+ source: {
84
+ code: `
85
+ <SimpleMenu label="Menu">
86
+ <MenuItem to="/">
87
+ Home
88
+ </MenuItem>
89
+ <MenuItem to="/somewhere">
90
+ Somewhere internal
91
+ </MenuItem>
92
+ </SimpleMenu>
93
+ `,
94
+ },
95
+ },
96
+ }}
97
+ >
98
+ <SimpleMenu label="Menu">
99
+ <MenuItem to="/">Home</MenuItem>
100
+ <MenuItem to="/somewhere">Somewhere internal</MenuItem>
101
+ </SimpleMenu>
102
+ </Story>
103
+ </Canvas>
104
+
105
+ A menu can allow the user to make actions. It can redirect the user to another page or another part of the product.
106
+
107
+ ### With IconButton
108
+
109
+ <Canvas>
110
+ <Story name="with-iconbutton">
111
+ <SimpleMenu label="Menu" as={IconButton} icon={<CarretDown />}>
112
+ <MenuItem>Home</MenuItem>
113
+ <MenuItem>Somewhere internal</MenuItem>
114
+ </SimpleMenu>
115
+ </Story>
116
+ </Canvas>
117
+
118
+ ### Sizes
119
+
120
+ Use the size prop to change the size of the button. You can set the value to `S` or `M` (by default `M` is being used).
121
+ If a custom component is rendered (through the `as` prop), the size is passed through, but needs to be handled in
122
+ that component.
123
+
124
+ Size `S` can be useful if the component is being used in places, where it needs to align on the left (ex: within tables).
125
+
126
+ <Canvas>
127
+ <Story name="sizes">
128
+ <Stack horizontal spacing={4}>
129
+ <SimpleMenu label="Small Menu" size="S" icon={<CarretDown />}>
130
+ <MenuItem>Home</MenuItem>
131
+ <MenuItem>Somewhere internal</MenuItem>
132
+ </SimpleMenu>
133
+ <SimpleMenu label="Medium Menu" icon={<CarretDown />}>
134
+ <MenuItem>Home</MenuItem>
135
+ <MenuItem>Somewhere internal</MenuItem>
136
+ </SimpleMenu>
137
+ </Stack>
138
+ </Story>
139
+ </Canvas>
140
+
141
+ ### With Custom Label
142
+
143
+ <Canvas>
144
+ <Story
145
+ name="with-custom-label"
146
+ parameters={{
147
+ docs: {
148
+ source: {
149
+ code: `
150
+ const Label = <><span>2</span> special items</>;
151
+ return (
152
+ <SimpleMenu label={Label}>
153
+ <MenuItem>Home</MenuItem>
154
+ <MenuItem>Somewhere internal</MenuItem>
155
+ </SimpleMenu>
156
+ );
157
+ `,
158
+ },
159
+ },
160
+ }}
161
+ >
162
+ {() => {
163
+ const Label = (
164
+ <>
165
+ <span>2</span> special items
166
+ </>
167
+ );
168
+ return (
169
+ <SimpleMenu label={Label}>
170
+ <MenuItem>Home</MenuItem>
171
+ <MenuItem>Somewhere internal</MenuItem>
172
+ </SimpleMenu>
173
+ );
174
+ }}
175
+ </Story>
176
+ </Canvas>
177
+
178
+ ### with other routing libraries
179
+
180
+ To use the SimpleMenu/MenuItem components with a routing library (e.g. react-router-dom), you'll need to pass the `NavLink` component to the `as` prop in order to replace the default HTML anchor `<a />`.
181
+ You'll also need to pass the `isLink` props to the `MenuItem` component.
182
+
183
+ ```jsx
184
+ import { SimpleMenu, MenuItem } from '@strapi/design-system/SimpleMenu';
185
+ import { NavLink as RouterNavLink } from 'react-router-dom';
186
+
187
+ <SimpleMenu label={Label}>
188
+ <MenuItem as={RouterNavLink} to="/">
189
+ Home
190
+ </MenuItem>
191
+ </SimpleMenu>;
192
+ ```
193
+
194
+ #### with NextJS
195
+
196
+ For NextJS, you'll need to wrap the `NavLink` with the `NextLink` component
197
+
198
+ ```jsx
199
+ import { SimpleMenu, MenuItem } from '@strapi/design-system/SimpleMenu';
200
+ import NextLink from 'next/link';
201
+
202
+ <SimpleMenu label={Label}>
203
+ <NextLink href="/home" passHref>
204
+ <MenuItem>Home</MenuItem>
205
+ </NextLink>
206
+ </SimpleMenu>;
207
+ ```
208
+
209
+ ## Accessibility
210
+
211
+ - When the menu button has focus, `Space` or `Enter` opens or closes the menu.
212
+ - When the menu is open, the navigation between menu items can be done with the `ArrowDown` or `ArrowUp`
213
+
214
+ ## SimpleMenu props
215
+
216
+ <ArgsTable of={SimpleMenu} />
217
+
218
+ ## MenuItem props
219
+
220
+ <ArgsTable of={MenuItem} />
@@ -0,0 +1,100 @@
1
+ import { injectAxe, checkA11y, getViolations } from 'axe-playwright';
2
+
3
+ import { test, expect } from '@playwright/test';
4
+
5
+ test.describe.parallel('SimpleMenu', () => {
6
+ test.describe('light mode', () => {
7
+ test.describe('base', () => {
8
+ test.beforeEach(async ({ page }) => {
9
+ // This is the URL of the Storybook Iframe
10
+ await page.goto('/iframe.html?id=design-system-components-v2-simplemenu--base&viewMode=story');
11
+ await injectAxe(page);
12
+ });
13
+
14
+ test('triggers axe on the document', async ({ page }) => {
15
+ await checkA11y(page);
16
+ });
17
+
18
+ test('triggers axe on the document when the menu is opened', async ({ page }) => {
19
+ await page.click('#root button');
20
+
21
+ await expect(page.locator('[role="menu"]')).toBeVisible();
22
+
23
+ const violations = await getViolations(page);
24
+
25
+ // Axe throws an error because the portal is not wrapped by a region.
26
+ const realViolations = violations
27
+ .filter((violation) => violation.id !== 'region')
28
+ .filter((violation) => violation.id !== 'aria-required-parent');
29
+
30
+ expect(realViolations.length).toBe(0);
31
+ });
32
+
33
+ test('select the second value of the menu key=Enter', async ({ page }) => {
34
+ await page.focus('#root button');
35
+ await page.keyboard.press('Enter');
36
+ await page.keyboard.press('ArrowDown');
37
+ await page.keyboard.press('Enter');
38
+
39
+ const label = await page.textContent('#root button');
40
+ expect(label).toBe('February');
41
+ });
42
+
43
+ test('select the second value of the menu key=Space', async ({ page }) => {
44
+ await page.focus('#root button');
45
+ await page.keyboard.press('Space');
46
+ await page.keyboard.press('ArrowDown');
47
+ await page.keyboard.press('Space');
48
+
49
+ const label = await page.textContent('#root button');
50
+ expect(label).toBe('February');
51
+ });
52
+ });
53
+
54
+ test.describe('with links', () => {
55
+ test.beforeEach(async ({ page }) => {
56
+ // This is the URL of the Storybook Iframe
57
+ await page.goto('/iframe.html?id=design-system-components-v2-simplemenu--with-links&viewMode=story');
58
+ await injectAxe(page);
59
+ });
60
+
61
+ test('triggers axe on the document', async ({ page }) => {
62
+ await checkA11y(page);
63
+ });
64
+
65
+ test('triggers axe on the document when the menu is opened', async ({ page }) => {
66
+ await page.click('#root button');
67
+
68
+ await expect(page.locator('[role="menu"]')).toBeVisible();
69
+
70
+ const violations = await getViolations(page);
71
+
72
+ // Axe throws an error because the portal is not wrapped by a region.
73
+ const realViolations = violations
74
+ .filter((violation) => violation.id !== 'region')
75
+ .filter((violation) => violation.id !== 'aria-required-parent');
76
+
77
+ expect(realViolations.length).toBe(0);
78
+ });
79
+ });
80
+ });
81
+
82
+ test.describe('sizes', () => {
83
+ test('triggers axe on the document', async ({ page }) => {
84
+ await page.goto(
85
+ 'http://localhost:6006/iframe.html?id=design-system-components-v2-simplemenu--sizes&viewMode=story',
86
+ );
87
+ await injectAxe(page);
88
+ await checkA11y(page);
89
+ });
90
+ });
91
+
92
+ test.describe('with links', () => {
93
+ test.beforeEach(async ({ page }) => {
94
+ // This is the URL of the Storybook Iframe
95
+ await page.goto('/iframe.html?id=design-system-components-v2-simplemenu--base&viewMode=story&theme=dark');
96
+ await injectAxe(page);
97
+ await checkA11y(page);
98
+ });
99
+ });
100
+ });
@@ -0,0 +1,48 @@
1
+ import * as React from 'react';
2
+ import { render, screen, fireEvent, waitFor } from '@testing-library/react';
3
+ import { SimpleMenu, MenuItem } from '../../SimpleMenu';
4
+ import { ThemeProvider } from '../../../ThemeProvider';
5
+ import { lightTheme } from '../../../themes';
6
+
7
+ describe('SimpleMenu', () => {
8
+ it('display the menu on click on the menu button', async () => {
9
+ render(
10
+ <ThemeProvider theme={lightTheme}>
11
+ <SimpleMenu label="January">
12
+ <MenuItem onClick={() => {}}>January</MenuItem>
13
+ <MenuItem onClick={() => {}}>February</MenuItem>
14
+ <MenuItem href="https://strapi.io">Strapi website</MenuItem>
15
+ </SimpleMenu>
16
+ </ThemeProvider>,
17
+ );
18
+
19
+ const button = await waitFor(() => screen.getByText('January'));
20
+ fireEvent.mouseDown(button);
21
+
22
+ await waitFor(() => {
23
+ expect(screen.getByText('February')).toBeInTheDocument();
24
+ });
25
+ });
26
+
27
+ it('display the menu and click on a menu item', async () => {
28
+ const onClickSpy = jest.fn();
29
+
30
+ render(
31
+ <ThemeProvider theme={lightTheme}>
32
+ <SimpleMenu label="January">
33
+ <MenuItem onClick={onClickSpy}>January</MenuItem>
34
+ <MenuItem onClick={onClickSpy}>February</MenuItem>
35
+ <MenuItem href="https://strapi.io">Strapi website</MenuItem>
36
+ </SimpleMenu>
37
+ </ThemeProvider>,
38
+ );
39
+
40
+ const button = await waitFor(() => screen.getByText('January'));
41
+ fireEvent.mouseDown(button);
42
+
43
+ const menuItemButton = await waitFor(() => screen.getByText('February'));
44
+ fireEvent.mouseDown(menuItemButton);
45
+
46
+ expect(onClickSpy).toBeCalled();
47
+ });
48
+ });
@@ -0,0 +1 @@
1
+ export * from './SimpleMenu';
@@ -0,0 +1,12 @@
1
+ export const getOptionStyle = ({ theme }) => `
2
+ text-align: left;
3
+ width: 100%;
4
+ color: ${theme.colors.neutral800};
5
+ border-radius: ${theme.borderRadius};
6
+ &:focus {
7
+ background-color: ${theme.colors.primary100};
8
+ }
9
+ &:not([aria-disabled]):hover {
10
+ background-color: ${theme.colors.primary100};
11
+ }
12
+ `;
@@ -0,0 +1,25 @@
1
+ import React from 'react';
2
+ import styled from 'styled-components';
3
+ import PropTypes from 'prop-types';
4
+ import { Grid } from '../../Grid';
5
+
6
+ export const subNavWidth = `${232 / 16}rem`;
7
+
8
+ const SubNavWrapper = styled(Grid)`
9
+ width: ${subNavWidth};
10
+ background: ${({ theme }) => theme.colors.neutral100};
11
+ position: sticky;
12
+ top: 0;
13
+ height: 100vh;
14
+ overflow-y: auto;
15
+ border-right: 1px solid ${({ theme }) => theme.colors.neutral200};
16
+ z-index: 1;
17
+ `;
18
+
19
+ export const SubNav = ({ ariaLabel, ...props }) => {
20
+ return <SubNavWrapper aria-label={ariaLabel} as="nav" {...props} />;
21
+ };
22
+
23
+ SubNav.propTypes = {
24
+ ariaLabel: PropTypes.string.isRequired,
25
+ };
@@ -0,0 +1,234 @@
1
+ <!--- SubNav.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 Apps from '@strapi/icons/Apps';
7
+ import Plus from '@strapi/icons/Plus';
8
+ import ExclamationMarkCircle from '@strapi/icons/ExclamationMarkCircle';
9
+ import { SubNav } from './SubNav';
10
+ import { SubNavHeader } from './SubNavHeader';
11
+ import { SubNavSection } from './SubNavSection';
12
+ import { SubNavSections } from './SubNavSections';
13
+ import { SubNavLink } from './SubNavLink';
14
+ import { SubNavLinkSection } from './SubNavLinkSection';
15
+ import { Box } from '../../Box';
16
+ import { Flex } from '../../Flex';
17
+ import { TextButton } from '../../TextButton';
18
+
19
+ <Meta title="Design System/Components/v2/SubNav" component={SubNav} />
20
+
21
+ # SubNav
22
+
23
+ The Sub Navigation is available and displayed on predefined sections of the admin panel to access advanced options (i.e. Content Manager, Content-types Builder and Settings). Thanks to it the users can easily navigation from an entry or a page to another. The Sub Navigation cannot be collapsed.
24
+
25
+ **Best practices**
26
+
27
+ - It is not possible to have more than 2 navigation bars next to each others.
28
+ - Each page has its own icon taken from the iconography library.
29
+ - Do not use icons for headers.
30
+ - Use sentence case for page names and all caps for header labels.
31
+ - Each plugin should have its own new category and its own header.
32
+
33
+ ## Usage
34
+
35
+ The Sub Navigation cannot be collapsed. A notification system can appear in the Sub Navigation, especially in the Settings section for the Application page.
36
+
37
+ A Text Button component can be found at the bottom of a pages gathering in the Sub Navigation.
38
+
39
+ ## Hierarchy
40
+
41
+ Related pages are gathered under specific headers within the Sub Navigation. These headers are helpful to understand the section hierarchy. Moreover, each page gets its very own icon to make it distinctive.
42
+
43
+ [View source](https://github.com/strapi/design-system/tree/main/packages/strapi-design-system/src/v2/SubNav)
44
+
45
+ ## Imports
46
+
47
+ ```js
48
+ import {
49
+ SubNav,
50
+ SubNavHeader,
51
+ SubNavSection,
52
+ SubNavSections,
53
+ SubNavLink,
54
+ SubNavLinkSection,
55
+ } from '@strapi/design-system/v2/SubNav';
56
+ ```
57
+
58
+ ## Usage
59
+
60
+ <Canvas>
61
+ <Story name="base">
62
+ {() => {
63
+ const [search, setSearch] = useState('');
64
+ const links = [
65
+ {
66
+ id: 1,
67
+ label: 'Addresses',
68
+ icon: <ExclamationMarkCircle />,
69
+ to: '/address',
70
+ },
71
+ {
72
+ id: 2,
73
+ label: 'Categories',
74
+ to: '/category',
75
+ },
76
+ {
77
+ id: 3,
78
+ label: 'Cities',
79
+ icon: <Apps />,
80
+ to: '/city',
81
+ active: true,
82
+ },
83
+ {
84
+ id: 4,
85
+ label: 'Countries',
86
+ to: '/country',
87
+ },
88
+ ];
89
+ return (
90
+ <Flex>
91
+ <Box padding={10} style={{ height: '100vh' }} background="neutral200">
92
+ <SubNav ariaLabel="Builder sub nav">
93
+ <SubNavHeader
94
+ searchable
95
+ value={search}
96
+ onClear={() => setSearch('')}
97
+ onChange={(e) => setSearch(e.target.value)}
98
+ label="Content-Type Builder"
99
+ searchLabel="Search..."
100
+ />
101
+ <SubNavSections>
102
+ <SubNavSection label="Collection Type" collapsable badgeLabel={links.length.toString()}>
103
+ {links.map((link) => (
104
+ <SubNavLink to={link.to} active={link.active} key={link.id}>
105
+ {link.label}
106
+ </SubNavLink>
107
+ ))}
108
+ </SubNavSection>
109
+ <Box paddingLeft={7} paddingBottom={3}>
110
+ <TextButton startIcon={<Plus />}>Click on me</TextButton>
111
+ </Box>
112
+ <SubNavSection label="Single Type" collapsable badgeLabel={links.length.toString()}>
113
+ <SubNavLinkSection label="Default">
114
+ {links.map((link) => (
115
+ <SubNavLink to={link.to} key={link.id} isSubSectionChild>
116
+ {link.label}
117
+ </SubNavLink>
118
+ ))}
119
+ </SubNavLinkSection>
120
+ </SubNavSection>
121
+ <Box paddingLeft={7}>
122
+ <TextButton startIcon={<Plus />}>Click on me</TextButton>
123
+ </Box>
124
+ </SubNavSections>
125
+ </SubNav>
126
+ </Box>
127
+ <Box padding={10} style={{ height: '100vh' }} background="neutral200">
128
+ <SubNav ariaLabel="Settings sub nav">
129
+ <SubNavHeader label="Settings" />
130
+ <SubNavSections>
131
+ <SubNavLink to="/blabla" withBullet icon={<Apps />} className="active">
132
+ Application
133
+ </SubNavLink>
134
+ <SubNavSection label="Global Settings">
135
+ {links.map(
136
+ (link) =>
137
+ link.icon && (
138
+ <SubNavLink to={link.to} active={link.active} icon={link.icon} key={link.id} isSubSectionChild>
139
+ {link.label}
140
+ </SubNavLink>
141
+ ),
142
+ )}
143
+ </SubNavSection>
144
+ <SubNavSection label="Permissions">
145
+ {links.map(
146
+ (link) =>
147
+ link.icon && (
148
+ <SubNavLink to={link.to} icon={link.icon} key={link.id}>
149
+ {link.label}
150
+ </SubNavLink>
151
+ ),
152
+ )}
153
+ </SubNavSection>
154
+ </SubNavSections>
155
+ </SubNav>
156
+ </Box>
157
+ <Box padding={10} style={{ height: '100vh' }} background="neutral200">
158
+ <SubNav ariaLabel="Mixed sub nav">
159
+ <SubNavHeader label="Mixed" />
160
+ <SubNavSections>
161
+ <SubNavLink to="/blabla" withBullet icon={<Apps />}>
162
+ Application
163
+ </SubNavLink>
164
+ <SubNavSection label="Global Settings">
165
+ <SubNavLinkSection label="Sub section">
166
+ {links.map((link) => (
167
+ <SubNavLink to={link.to} active={link.active} icon={link.icon} key={link.id}>
168
+ {link.label}
169
+ </SubNavLink>
170
+ ))}
171
+ </SubNavLinkSection>
172
+ </SubNavSection>
173
+ <SubNavSection label="Permissions">
174
+ {links.map((link) => (
175
+ <SubNavLink to={link.to} icon={link.icon} key={link.id}>
176
+ {link.label}
177
+ </SubNavLink>
178
+ ))}
179
+ </SubNavSection>
180
+ </SubNavSections>
181
+ </SubNav>
182
+ </Box>
183
+ </Flex>
184
+ );
185
+ }}
186
+ </Story>
187
+ </Canvas>
188
+
189
+ ### Usage with other routing libraries
190
+
191
+ To use the Strapi design system SubNavLink component with a routing library (e.g. react-router-dom), you'll need to pass the react-router-dom `NavLink` component to the `as` prop in order to replace the default HTML anchor `<a />`.
192
+ You'll now be able to pass all `NavLink` props.
193
+
194
+ ```jsx
195
+ import { SubNavLink } from '@strapi/design-system/SubNavLink';
196
+ import { NavLink } from 'react-router-dom';
197
+
198
+ <SubNavLink as={NavLink} to="/home">
199
+ Home
200
+ </SubNavLink>;
201
+ ```
202
+
203
+ #### NextJS usage
204
+
205
+ For NextJS, you'll need to wrap the `NavLink` with the `NextLink` component
206
+
207
+ ```jsx
208
+ import { SubNavLink } from '@strapi/design-system/SubNavLink';
209
+ import NextLink from 'next/link';
210
+
211
+ <NextLink href="/home" passHref>
212
+ <SubNavLink>Home</SubNavLink>
213
+ </NextLink>;
214
+ ```
215
+
216
+ ## SubNav Props
217
+
218
+ <ArgsTable of={SubNav} />
219
+
220
+ ## SubNavHeader Props
221
+
222
+ <ArgsTable of={SubNavHeader} />
223
+
224
+ ## SubNavSection Props
225
+
226
+ <ArgsTable of={SubNavSection} />
227
+
228
+ ## SubNavLinkSection Props
229
+
230
+ <ArgsTable of={SubNavLinkSection} />
231
+
232
+ ## SubNavLink Props
233
+
234
+ <ArgsTable of={SubNavLink} />