@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,194 @@
1
+ import { injectAxe, checkA11y } from 'axe-playwright';
2
+
3
+ import { test, expect } from '@playwright/test';
4
+
5
+ test.describe.parallel('NumberInput', () => {
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-numberinput--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('fills the input when typing valid numeric numbers', async ({ page }) => {
19
+ await page.fill('input', '123.123');
20
+ await page.keyboard.press('Tab');
21
+
22
+ const value = await page.$eval('input', (el) => el.value);
23
+ expect(value).toBe('123.123');
24
+ });
25
+
26
+ test('fills the input when typing valid float numbers with more than 3 significant digits after the seperator', async ({
27
+ page,
28
+ }) => {
29
+ await page.fill('input', '1.23456789');
30
+ await page.keyboard.press('Tab');
31
+
32
+ const value = await page.$eval('input', (el) => el.value);
33
+ expect(value).toBe('1.23456789');
34
+ });
35
+
36
+ test('keeps a scientific number after blur / focus', async ({ page }) => {
37
+ await page.fill('input', '0.00000001');
38
+
39
+ await page.keyboard.press('Tab');
40
+ await page.focus('input');
41
+
42
+ const value = await page.$eval('input', (el) => el.value);
43
+ expect(value).toBe('0.00000001');
44
+ });
45
+
46
+ test('fills the input when typing a valid numeric and a trailing comma', async ({ page }) => {
47
+ await page.fill('input', '123456,');
48
+ await page.keyboard.press('Tab');
49
+
50
+ const value = await page.$eval('input', (el) => el.value);
51
+ expect(value).toBe('123,456');
52
+ expect(await page.$('text="The value is 123456"')).toBeTruthy();
53
+ });
54
+
55
+ test('erases the value in the input when pressing backspace', async ({ page }) => {
56
+ await page.fill('input', '-1');
57
+ await page.keyboard.press('Backspace');
58
+ await page.keyboard.press('Tab');
59
+
60
+ const value = await page.$eval('input', (el) => el.value);
61
+ expect(value).toBe('');
62
+ expect(await page.$('text="The value is undefined"')).toBeTruthy();
63
+ });
64
+
65
+ test('puts the step value in the input when pressing ArrowUp and that the input is empty', async ({ page }) => {
66
+ await page.focus('input');
67
+ await page.fill('input', '1,');
68
+ await page.keyboard.press('ArrowUp');
69
+ await page.keyboard.press('Tab');
70
+
71
+ const value = await page.$eval('input', (el) => el.value);
72
+ expect(value).toBe('2');
73
+ expect(await page.$('text="The value is 2"')).toBeTruthy();
74
+ });
75
+
76
+ test('keeps zero/ a falsy value on blur/ focus', async ({ page }) => {
77
+ await page.focus('input');
78
+ await page.fill('input', '0,');
79
+ await page.keyboard.press('Tab');
80
+ await page.focus('input');
81
+
82
+ const value = await page.$eval('input', (el) => el.value);
83
+ expect(value).toBe('0');
84
+ });
85
+
86
+ test('puts the step value in the input when pressing ArrowDown and that the input contains only the minus sign', async ({
87
+ page,
88
+ }) => {
89
+ await page.fill('input', '-');
90
+ await page.keyboard.press('ArrowDown');
91
+ await page.keyboard.press('Tab');
92
+
93
+ const value = await page.$eval('input', (el) => el.value);
94
+ expect(value).toBe('-1');
95
+ expect(await page.$('text="The value is -1"')).toBeTruthy();
96
+ });
97
+
98
+ test('puts the step value in the input when pressing ArrowDown and that the input is empty', async ({ page }) => {
99
+ await page.focus('input');
100
+ await page.fill('input', '-');
101
+ await page.keyboard.press('ArrowDown');
102
+ await page.keyboard.press('Tab');
103
+
104
+ const value = await page.$eval('input', (el) => el.value);
105
+ expect(value).toBe('-1');
106
+ expect(await page.$('text="The value is -1"')).toBeTruthy();
107
+ });
108
+
109
+ test('puts the step value in the input when pressing ArrowUp and that the input contains only the minus sign', async ({
110
+ page,
111
+ }) => {
112
+ await page.fill('input', '-');
113
+ await page.keyboard.press('ArrowUp');
114
+ await page.keyboard.press('Tab');
115
+
116
+ const value = await page.$eval('input', (el) => el.value);
117
+ expect(value).toBe('1');
118
+ expect(await page.$('text="The value is 1"')).toBeTruthy();
119
+ });
120
+
121
+ test('increments the value when clicking on ArrowUp without blur needed', async ({ page }) => {
122
+ await page.fill('input', '0');
123
+ await page.click('[data-testid="ArrowUp"]');
124
+
125
+ const value = await page.$eval('input', (el) => el.value);
126
+ expect(value).toBe('1');
127
+ expect(await page.$('text="The value is 1"')).toBeTruthy();
128
+ });
129
+
130
+ test('decrements the value when clicking on ArrowUp without blur needed', async ({ page }) => {
131
+ await page.fill('input', '0');
132
+ await page.click('[data-testid="ArrowDown"]');
133
+
134
+ const value = await page.$eval('input', (el) => el.value);
135
+ expect(value).toBe('-1');
136
+ expect(await page.$('text="The value is -1"')).toBeTruthy();
137
+ });
138
+
139
+ test('increments the value eventhough the field is empty', async ({ page }) => {
140
+ await page.fill('input', '');
141
+ await page.click('[data-testid="ArrowUp"]');
142
+
143
+ const value = await page.$eval('input', (el) => el.value);
144
+ expect(value).toBe('1');
145
+ });
146
+
147
+ test('decrements the value eventhough the field is empty', async ({ page }) => {
148
+ await page.fill('input', '');
149
+ await page.click('[data-testid="ArrowDown"]');
150
+
151
+ const value = await page.$eval('input', (el) => el.value);
152
+ expect(value).toBe('-1');
153
+ });
154
+ });
155
+
156
+ test.describe('with initial value', () => {
157
+ test.beforeEach(async ({ page }) => {
158
+ // This is the URL of the Storybook Iframe
159
+ await page.goto('/iframe.html?id=design-system-components-numberinput--with-initial-0&viewMode=story');
160
+ await injectAxe(page);
161
+ });
162
+
163
+ test('shows an initial value of 0', async ({ page }) => {
164
+ const value = await page.$eval('input', (el) => el.value);
165
+ expect(value).toBe('0');
166
+ });
167
+ });
168
+
169
+ test.describe('disabled', () => {
170
+ test('disabled A11ly', async ({ page }) => {
171
+ // This is the URL of the Storybook Iframe
172
+ await page.goto('/iframe.html?id=design-system-components-numberinput--disabled&viewMode=story');
173
+ await injectAxe(page);
174
+ await checkA11y(page);
175
+ });
176
+ });
177
+ });
178
+
179
+ test.describe('dark mode', () => {
180
+ test('base A11ly', async ({ page }) => {
181
+ // This is the URL of the Storybook Iframe
182
+ await page.goto('/iframe.html?id=design-system-components-numberinput--base&viewMode=story&theme=dark');
183
+ await injectAxe(page);
184
+ await checkA11y(page);
185
+ });
186
+
187
+ test('disabled A11ly', async ({ page }) => {
188
+ // This is the URL of the Storybook Iframe
189
+ await page.goto('/iframe.html?id=design-system-components-numberinput--disabled&viewMode=story&theme=dark');
190
+ await injectAxe(page);
191
+ await checkA11y(page);
192
+ });
193
+ });
194
+ });
@@ -0,0 +1 @@
1
+ export * from './NumberInput';
@@ -0,0 +1,37 @@
1
+ import React, { Children } from 'react';
2
+ import styled from 'styled-components';
3
+ import PropTypes from 'prop-types';
4
+ import { Flex } from '../Flex';
5
+ import { PaginationContext } from './PaginationContext';
6
+
7
+ const PaginationWrapper = styled.nav``;
8
+ const PaginationList = styled(Flex)`
9
+ & > * + * {
10
+ margin-left: ${({ theme }) => theme.spaces[1]};
11
+ }
12
+ `;
13
+
14
+ export const Pagination = ({ children, label, activePage, pageCount }) => {
15
+ return (
16
+ <PaginationContext.Provider value={{ activePage, pageCount }}>
17
+ <PaginationWrapper aria-label={label}>
18
+ <PaginationList as="ul">
19
+ {Children.map(children, (child, index) => {
20
+ return <li key={index}>{child}</li>;
21
+ })}
22
+ </PaginationList>
23
+ </PaginationWrapper>
24
+ </PaginationContext.Provider>
25
+ );
26
+ };
27
+
28
+ Pagination.defaultProps = {
29
+ label: 'pagination',
30
+ };
31
+
32
+ Pagination.propTypes = {
33
+ activePage: PropTypes.number.isRequired,
34
+ children: PropTypes.node.isRequired,
35
+ label: PropTypes.string,
36
+ pageCount: PropTypes.number.isRequired,
37
+ };
@@ -0,0 +1,97 @@
1
+ <!--- Pagination.stories.mdx --->
2
+
3
+ import { Meta, Story, Canvas } from '@storybook/addon-docs';
4
+ import { ArgsTable } from '@storybook/addon-docs';
5
+ import { Pagination } from './Pagination';
6
+ import { PreviousLink, NextLink, PageLink, Dots } from './components';
7
+
8
+ <Meta title="Design System/Components/Pagination" component={Pagination} />
9
+
10
+ # Pagination
11
+
12
+ The Pagination component is used to navigate multipage content.
13
+
14
+ [View source](https://github.com/strapi/design-system/tree/main/packages/strapi-design-system/src/Pagination)
15
+
16
+ ## Imports
17
+
18
+ ```js
19
+ import { Dots, NextLink, PageLink, Pagination, PreviousLink } from '@strapi/design-system/Pagination';
20
+ ```
21
+
22
+ ## Usage
23
+
24
+ <Canvas>
25
+ <Story name="base">
26
+ <Pagination activePage={1} pageCount={26}>
27
+ <PreviousLink to="/1">Go to previous page</PreviousLink>
28
+ <PageLink number={1} to="/1">
29
+ Go to page 1
30
+ </PageLink>
31
+ <PageLink number={2} to="/2">
32
+ Go to page 2
33
+ </PageLink>
34
+ <Dots>And 23 other links</Dots>
35
+ <PageLink number={25} to="/25">
36
+ Go to page 3
37
+ </PageLink>
38
+ <PageLink number={26} to="/26">
39
+ Go to page 26
40
+ </PageLink>
41
+ <NextLink to="/3">Go to next page</NextLink>
42
+ </Pagination>
43
+ </Story>
44
+ </Canvas>
45
+
46
+ ### Usage with routing libraries
47
+
48
+ To use the PreviousLink/PageLink/NextLink component 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 />`.
49
+ You'll now be able to pass all `NavLink` props.
50
+
51
+ ```jsx
52
+ import { PreviousLink, PageLink, NextLink } from '@strapi/design-system/Pagination';
53
+ import { NavLink } from 'react-router-dom';
54
+
55
+ <Pagination>
56
+ <PreviousLink as={NavLink} to="/1">
57
+ Previous
58
+ </PreviousLink>
59
+ <PageLink as={NavLink} to="/1">
60
+ 1
61
+ </PageLink>
62
+ <PageLink as={NavLink} to="/2">
63
+ 2
64
+ </PageLink>
65
+ <NextLink as={NavLink} to="/2">
66
+ Next page
67
+ </NextLink>
68
+ </Pagination>;
69
+ ```
70
+
71
+ #### Usage with NextJS
72
+
73
+ For NextJS, you'll need to wrap the `Link` with the `NextLink` component
74
+
75
+ ```jsx
76
+ import { PreviousLink, PageLink, NextLink } from '@strapi/design-system/Pagination';
77
+ import NextLink from 'next/link';
78
+
79
+ <Pagination>
80
+ <NextLink href="/home" passHref>
81
+ <PreviousLink>Previous</PreviousLink>
82
+ </NextLink>
83
+ <NextLink href="/1" passHref>
84
+ <PageLink>1</PageLink>
85
+ </NextLink>
86
+ <NextLink href="/2" passHref>
87
+ <PageLink>2</PageLink>
88
+ </NextLink>
89
+ <NextLink href="/2" passHref>
90
+ <NextLink>Next page</NextLink>
91
+ </NextLink>
92
+ </Pagination>;
93
+ ```
94
+
95
+ ## Props
96
+
97
+ <ArgsTable of={Pagination} />
@@ -0,0 +1,4 @@
1
+ import { createContext, useContext } from 'react';
2
+
3
+ export const PaginationContext = createContext({ activePage: 1, pageCount: 1 });
4
+ export const usePagination = () => useContext(PaginationContext);
@@ -0,0 +1,23 @@
1
+ import { injectAxe, checkA11y } from 'axe-playwright';
2
+
3
+ import { test } from '@playwright/test';
4
+
5
+ test.describe.parallel('Pagination', () => {
6
+ test.describe('light mode', () => {
7
+ test('triggers axe on the document', async ({ page }) => {
8
+ // This is the URL of the Storybook Iframe
9
+ await page.goto('/iframe.html?id=design-system-components-pagination--base&viewMode=story');
10
+ await injectAxe(page);
11
+ await checkA11y(page);
12
+ });
13
+ });
14
+
15
+ test.describe('dark mode', () => {
16
+ test('triggers axe on the document', async ({ page }) => {
17
+ // This is the URL of the Storybook Iframe
18
+ await page.goto('/iframe.html?id=design-system-components-pagination--base&viewMode=story&theme=dark');
19
+ await injectAxe(page);
20
+ await checkA11y(page);
21
+ });
22
+ });
23
+ });
@@ -0,0 +1,3 @@
1
+ <svg width="7" height="10" viewBox="0 0 7 10" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M-0.000195503 1.175L3.81647 5L-0.000195503 8.825L1.1748 10L6.1748 5L1.1748 0L-0.000195503 1.175Z" fill="#8E8EA9"/>
3
+ </svg>
@@ -0,0 +1,3 @@
1
+ <svg width="7" height="10" viewBox="0 0 7 10" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M6.175 8.825L2.35833 5L6.175 1.175L5 0L0 5L5 10L6.175 8.825Z" fill="#8E8EA9"/>
3
+ </svg>
@@ -0,0 +1,147 @@
1
+ import React from 'react';
2
+ import styled from 'styled-components';
3
+ import PropTypes from 'prop-types';
4
+ import ChevronLeft from '@strapi/icons/ChevronLeft';
5
+ import ChevronRight from '@strapi/icons/ChevronRight';
6
+ import { NavLink } from 'react-router-dom';
7
+ import { VisuallyHidden } from '../VisuallyHidden';
8
+ import { usePagination } from './PaginationContext';
9
+ import { Typography } from '../Typography';
10
+ import { buttonFocusStyle } from '../themes/utils';
11
+
12
+ const PaginationText = styled(Typography)`
13
+ line-height: revert;
14
+ `;
15
+
16
+ const transientProps = {
17
+ active: true,
18
+ };
19
+
20
+ const LinkWrapper = styled(NavLink).withConfig({
21
+ shouldForwardProp: (prop, defPropValFN) => !transientProps[prop] && defPropValFN(prop),
22
+ })`
23
+ padding: ${({ theme }) => theme.spaces[3]};
24
+ border-radius: ${({ theme }) => theme.borderRadius};
25
+ box-shadow: ${({ active, theme }) => (active ? theme.shadows.filterShadow : undefined)};
26
+ text-decoration: none;
27
+ display: flex;
28
+
29
+ ${buttonFocusStyle}
30
+ `;
31
+
32
+ const PageLinkWrapper = styled(LinkWrapper)`
33
+ color: ${({ theme, active }) => (active ? theme.colors.primary700 : theme.colors.neutral800)};
34
+ background: ${({ theme, active }) => (active ? theme.colors.neutral0 : undefined)};
35
+
36
+ &:hover {
37
+ box-shadow: ${({ theme }) => theme.shadows.filterShadow};
38
+ }
39
+ `;
40
+
41
+ const ActionLinkWrapper = styled(LinkWrapper)`
42
+ font-size: 0.7rem;
43
+ svg path {
44
+ fill: ${(p) => (p['aria-disabled'] ? p.theme.colors.neutral300 : p.theme.colors.neutral600)};
45
+ }
46
+
47
+ &:focus,
48
+ &:hover {
49
+ svg path {
50
+ fill: ${(p) => (p['aria-disabled'] ? p.theme.colors.neutral300 : p.theme.colors.neutral700)};
51
+ }
52
+ }
53
+
54
+ ${(p) =>
55
+ p['aria-disabled']
56
+ ? `
57
+ pointer-events: none;
58
+ `
59
+ : undefined}
60
+ `;
61
+
62
+ const DotsWrapper = styled(LinkWrapper)`
63
+ color: ${({ theme }) => theme.colors.neutral800};
64
+ `;
65
+
66
+ export const PreviousLink = ({ children, to, ...props }) => {
67
+ const { activePage } = usePagination();
68
+
69
+ const disabled = activePage === 1;
70
+
71
+ return (
72
+ <ActionLinkWrapper
73
+ to={disabled ? '#' : to}
74
+ aria-disabled={disabled}
75
+ tabIndex={disabled ? -1 : undefined}
76
+ {...props}
77
+ >
78
+ <VisuallyHidden>{children}</VisuallyHidden>
79
+ <ChevronLeft aria-hidden={true} />
80
+ </ActionLinkWrapper>
81
+ );
82
+ };
83
+
84
+ PreviousLink.displayName = 'PreviousLink';
85
+
86
+ export const NextLink = ({ children, to, ...props }) => {
87
+ const { activePage, pageCount } = usePagination();
88
+
89
+ const disabled = activePage === pageCount;
90
+
91
+ return (
92
+ <ActionLinkWrapper
93
+ to={disabled ? '#' : to}
94
+ aria-disabled={disabled}
95
+ tabIndex={disabled ? -1 : undefined}
96
+ {...props}
97
+ >
98
+ <VisuallyHidden>{children}</VisuallyHidden>
99
+ <ChevronRight aria-hidden={true} />
100
+ </ActionLinkWrapper>
101
+ );
102
+ };
103
+
104
+ NextLink.displayName = 'NextLink';
105
+
106
+ export const PageLink = ({ number, children, ...props }) => {
107
+ const { activePage } = usePagination();
108
+
109
+ const isActive = activePage === number;
110
+
111
+ return (
112
+ <PageLinkWrapper {...props} active={isActive}>
113
+ <VisuallyHidden>{children}</VisuallyHidden>
114
+ <PaginationText aria-hidden={true} variant="pi" fontWeight={isActive ? 'bold' : null}>
115
+ {number}
116
+ </PaginationText>
117
+ </PageLinkWrapper>
118
+ );
119
+ };
120
+
121
+ PageLink.displayName = 'PageLink';
122
+
123
+ export const Dots = ({ children, ...props }) => (
124
+ <DotsWrapper {...props} as="div">
125
+ <VisuallyHidden>{children}</VisuallyHidden>
126
+ <PaginationText aria-hidden={true} variant="pi">
127
+ …
128
+ </PaginationText>
129
+ </DotsWrapper>
130
+ );
131
+
132
+ PageLink.propTypes = {
133
+ children: PropTypes.node.isRequired,
134
+ number: PropTypes.number.isRequired,
135
+ };
136
+
137
+ const sharedPropTypes = {
138
+ children: PropTypes.node.isRequired,
139
+ to: PropTypes.string.isRequired,
140
+ };
141
+
142
+ NextLink.propTypes = sharedPropTypes;
143
+ PreviousLink.propTypes = sharedPropTypes;
144
+
145
+ Dots.propTypes = {
146
+ children: PropTypes.node.isRequired,
147
+ };
@@ -0,0 +1,2 @@
1
+ export * from './Pagination';
2
+ export * from './components';
@@ -0,0 +1,167 @@
1
+ import * as React from 'react';
2
+ import PropTypes from 'prop-types';
3
+ import styled from 'styled-components';
4
+ import { useFloating, flip, shift, offset, autoUpdate } from '@floating-ui/react-dom';
5
+
6
+ import { Box } from '../Box';
7
+ import { Portal } from '../Portal';
8
+
9
+ import { useIntersection } from '../helpers/useIntersection';
10
+
11
+ export const POPOVER_PLACEMENTS = [
12
+ 'top',
13
+ 'top-start',
14
+ 'top-end',
15
+ 'right',
16
+ 'right-start',
17
+ 'right-end',
18
+ 'bottom',
19
+ 'bottom-start',
20
+ 'bottom-end',
21
+ 'left',
22
+ 'left-start',
23
+ 'left-end',
24
+ ];
25
+
26
+ const PopoverWrapper = styled(Box)`
27
+ box-shadow: ${({ theme }) => theme.shadows.filterShadow};
28
+ z-index: 4;
29
+ border: 1px solid ${({ theme }) => theme.colors.neutral150};
30
+ background: ${({ theme }) => theme.colors.neutral0};
31
+ `;
32
+
33
+ const PopoverScrollable = styled(Box)`
34
+ // 16 is base base size, 3 is the factor to get closer to 40px and 5 is the number of elements visible in the list
35
+ max-height: ${3 * 5}rem;
36
+ overflow-y: auto;
37
+ overflow-x: hidden;
38
+
39
+ &::-webkit-scrollbar {
40
+ -webkit-appearance: none;
41
+ width: 4px;
42
+ }
43
+
44
+ &::-webkit-scrollbar-track {
45
+ background: ${({ theme }) => theme.colors.neutral0};
46
+ }
47
+
48
+ &::-webkit-scrollbar-thumb {
49
+ background: ${({ theme }) => theme.colors.neutral150};
50
+ border-radius: ${({ theme }) => theme.borderRadius};
51
+ margin-right: 10px;
52
+ }
53
+ `;
54
+
55
+ const PopoverContent = ({
56
+ source,
57
+ children,
58
+ spacing,
59
+ fullWidth,
60
+ placement,
61
+ onReachEnd,
62
+ intersectionId,
63
+ centered,
64
+ ...props
65
+ }) => {
66
+ const popoverRef = React.useRef(null);
67
+ const [width, setWidth] = React.useState(undefined);
68
+ const { x, y, reference, floating, strategy } = useFloating({
69
+ strategy: 'fixed',
70
+ placement: centered ? 'bottom' : placement,
71
+ middleware: [
72
+ offset({
73
+ mainAxis: spacing,
74
+ }),
75
+ shift(),
76
+ flip(),
77
+ ],
78
+ whileElementsMounted: autoUpdate,
79
+ });
80
+
81
+ React.useLayoutEffect(() => {
82
+ reference(source.current);
83
+ }, [source]);
84
+
85
+ React.useLayoutEffect(() => {
86
+ if (fullWidth) {
87
+ setWidth(source.current.offsetWidth);
88
+ }
89
+ }, [fullWidth]);
90
+
91
+ useIntersection(popoverRef, onReachEnd, {
92
+ selectorToWatch: `#${intersectionId}`,
93
+ skipWhen: !intersectionId || !onReachEnd,
94
+ });
95
+
96
+ return (
97
+ <PopoverWrapper
98
+ ref={floating}
99
+ style={{
100
+ left: x,
101
+ top: y,
102
+ position: strategy,
103
+ width: width ? width : undefined,
104
+ }}
105
+ hasRadius
106
+ background="neutral0"
107
+ padding={1}
108
+ >
109
+ <PopoverScrollable ref={popoverRef} {...props}>
110
+ {children}
111
+ {intersectionId && onReachEnd && <Box id={intersectionId} width="100%" height="1px" />}
112
+ </PopoverScrollable>
113
+ </PopoverWrapper>
114
+ );
115
+ };
116
+
117
+ export const Popover = (props) => {
118
+ return (
119
+ <Portal>
120
+ <PopoverContent {...props} />
121
+ </Portal>
122
+ );
123
+ };
124
+
125
+ const popoverDefaultProps = {
126
+ fullWidth: false,
127
+ intersectionId: undefined,
128
+ onReachEnd: undefined,
129
+ centered: false,
130
+ placement: 'bottom-start',
131
+ };
132
+
133
+ const popoverProps = {
134
+ /**
135
+ * Horizontally center the popover
136
+ */
137
+ centered: PropTypes.bool,
138
+ children: PropTypes.node.isRequired,
139
+ /**
140
+ * Display full width popover
141
+ */
142
+ fullWidth: PropTypes.bool,
143
+ /**
144
+ * Element id to watch for the onReachEnd event
145
+ */
146
+ intersectionId: PropTypes.string,
147
+ /**
148
+ * The callback invoked after a scroll to the bottom of the popover content.
149
+ */
150
+ onReachEnd: PropTypes.func,
151
+ /**
152
+ * The popover position
153
+ */
154
+ placement: PropTypes.oneOf(POPOVER_PLACEMENTS),
155
+ /**
156
+ * A React ref. Used to defined the position of the popover.
157
+ */
158
+ source: PropTypes.shape({
159
+ current: (typeof Element === 'undefined' ? PropTypes.any : PropTypes.instanceOf(Element)).isRequired,
160
+ }).isRequired,
161
+ spacing: PropTypes.number,
162
+ };
163
+
164
+ PopoverContent.propTypes = popoverProps;
165
+ PopoverContent.defaultProps = popoverDefaultProps;
166
+ Popover.propTypes = popoverProps;
167
+ Popover.defaultProps = popoverDefaultProps;