@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,237 @@
1
+ <!--- Field.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 Earth from '@strapi/icons/Earth';
7
+ import Password from '@strapi/icons/Password';
8
+ import Information from '@strapi/icons/Information';
9
+ import { FieldLabel } from './FieldLabel';
10
+ import { FieldHint } from './FieldHint';
11
+ import { FieldError } from './FieldError';
12
+ import { FieldInput } from './FieldInput';
13
+ import { Field } from './Field';
14
+ import { Flex } from '../Flex';
15
+ import { Box } from '../Box';
16
+ import { Stack } from '../Stack';
17
+ import { Tooltip } from '../Tooltip';
18
+ import { FieldAction } from './FieldAction';
19
+ import { Link } from '../Link';
20
+ import { Icon } from '../Icon';
21
+
22
+ <Meta title="Design System/Components/Field" component={Field} />
23
+
24
+ # Field
25
+
26
+ Fields are inputs that allow users to add or edit text. They support several text formats including numbers.
27
+
28
+ [View source](https://github.com/strapi/design-system/tree/main/packages/strapi-design-system/src/Field)
29
+
30
+ ## Imports
31
+
32
+ ```js
33
+ import { Field, FieldLabel, FieldHint, FieldError, FieldInput, FieldAction } from '@strapi/design-system/Field';
34
+ ```
35
+
36
+ ## Base
37
+
38
+ The simplest representation of the Field components, no description, no error, no noise.
39
+
40
+ <Canvas>
41
+ <Story name="base">
42
+ <Field name="email">
43
+ <Stack spacing={1}>
44
+ <FieldLabel>Email</FieldLabel>
45
+ <FieldInput type="text" placeholder="Placeholder" value={''} onChange={() => {}} />
46
+ </Stack>
47
+ </Field>
48
+ </Story>
49
+ </Canvas>
50
+
51
+ ## With description
52
+
53
+ A Field with a description allows to add a small hint of advanced information.
54
+
55
+ <Canvas>
56
+ <Story name="with description">
57
+ <Field name="email" hint="Description line">
58
+ <Stack spacing={1}>
59
+ <FieldLabel required>Email</FieldLabel>
60
+ <FieldInput type="text" placeholder="Placeholder" value={''} onChange={() => {}} />
61
+ <FieldHint />
62
+ </Stack>
63
+ </Field>
64
+ </Story>
65
+ </Canvas>
66
+
67
+ ## With error
68
+
69
+ An example of the Field components with an error.
70
+
71
+ <Canvas>
72
+ <Story name="with error">
73
+ <Field name="password" error={'Password is too short'}>
74
+ <Stack spacing={1}>
75
+ <FieldLabel>Password</FieldLabel>
76
+ <FieldInput type="password" placeholder="Placeholder" value={''} onChange={() => {}} />
77
+ <FieldHint />
78
+ <FieldError />
79
+ </Stack>
80
+ </Field>
81
+ </Story>
82
+ </Canvas>
83
+
84
+ ## With label action
85
+
86
+ An example of the Field components with a label action.
87
+
88
+ <Canvas>
89
+ <Story name="with label-action">
90
+ <Field name="password">
91
+ <Stack spacing={1}>
92
+ <FieldLabel required action={<Earth />}>
93
+ Password
94
+ </FieldLabel>
95
+ <FieldInput type="password" placeholder="Placeholder" value={''} onChange={() => {}} />
96
+ <FieldHint />
97
+ <FieldError />
98
+ </Stack>
99
+ </Field>
100
+ </Story>
101
+ </Canvas>
102
+
103
+ ## Disabled field
104
+
105
+ Depending on the permissions a user have or the status of an action, a Field can be unreachable or unavailable yet.
106
+
107
+ <Canvas>
108
+ <Story name="disabled">
109
+ <Field name="password" hint="Description line">
110
+ <Stack spacing={1}>
111
+ <FieldLabel>Password</FieldLabel>
112
+ <FieldInput placeholder="Placeholder" value={'Hello world'} disabled={true} onChange={() => {}} />
113
+ <FieldHint />
114
+ <FieldError />
115
+ </Stack>
116
+ </Field>
117
+ </Story>
118
+ </Canvas>
119
+
120
+ ## Password with description and error
121
+
122
+ Password fields are specific. They offer the possibility to have unreadable content. By clicking on the eye icon on the right side, it is possible to actually read the password.
123
+
124
+ ## Most complex input
125
+
126
+ This is the most complex input that can be built with the Field components.
127
+
128
+ <Canvas>
129
+ <Story name="most complex input">
130
+ {() => {
131
+ const [email, setEmail] = useState('');
132
+ return (
133
+ <Box padding={8}>
134
+ <Field name="password" hint="Description line" error={email.length > 5 ? 'Email is too short' : undefined}>
135
+ <Stack spacing={1}>
136
+ <Flex>
137
+ <FieldLabel>Password</FieldLabel>
138
+ <Box paddingLeft={2}>
139
+ <Tooltip description="Content of the tooltip">
140
+ <button
141
+ aria-label="Information about the email"
142
+ style={{ border: 'none', padding: 0, background: 'transparent' }}
143
+ >
144
+ <Icon as={Information} color="neutral800" aria-hidden={true} />
145
+ </button>
146
+ </Tooltip>
147
+ </Box>
148
+ <Flex width="100%" justifyContent="flex-end">
149
+ <Link isExternal href="#">
150
+ Details
151
+ </Link>
152
+ </Flex>
153
+ </Flex>
154
+ <FieldInput
155
+ placeholder="example@domain.com"
156
+ value={email}
157
+ onChange={(e) => setEmail(e.target.value)}
158
+ startAction={
159
+ <FieldAction label="Show password">
160
+ <Password />
161
+ </FieldAction>
162
+ }
163
+ endAction={
164
+ <FieldAction label="Show password">
165
+ <Password />
166
+ </FieldAction>
167
+ }
168
+ />
169
+ <FieldHint />
170
+ <FieldError />
171
+ </Stack>
172
+ </Field>
173
+ </Box>
174
+ );
175
+ }}
176
+ </Story>
177
+ </Canvas>
178
+
179
+ ## Most complex S size input
180
+
181
+ This is the most complex input that can be built with the Field components.
182
+
183
+ <Canvas>
184
+ <Story name="most complex s size input">
185
+ {() => {
186
+ const [email, setEmail] = useState('');
187
+ return (
188
+ <Box padding={8}>
189
+ <Field name="password" hint="Description line" error={email.length > 5 ? 'Email is too short' : undefined}>
190
+ <Stack spacing={1}>
191
+ <Flex>
192
+ <FieldLabel>Password</FieldLabel>
193
+ <Box paddingLeft={2}>
194
+ <Tooltip description="Content of the tooltip">
195
+ <button
196
+ aria-label="Information about the email"
197
+ style={{ border: 'none', padding: 0, background: 'transparent' }}
198
+ >
199
+ <Icon as={Information} color="neutral800" aria-hidden={true} />
200
+ </button>
201
+ </Tooltip>
202
+ </Box>
203
+ <Flex width="100%" justifyContent="flex-end">
204
+ <Link isExternal href="#">
205
+ Details
206
+ </Link>
207
+ </Flex>
208
+ </Flex>
209
+ <FieldInput
210
+ placeholder="example@domain.com"
211
+ value={email}
212
+ onChange={(e) => setEmail(e.target.value)}
213
+ size="S"
214
+ startAction={
215
+ <FieldAction label="Show password">
216
+ <Password />
217
+ </FieldAction>
218
+ }
219
+ endAction={
220
+ <FieldAction label="Show password">
221
+ <Password />
222
+ </FieldAction>
223
+ }
224
+ />
225
+ <FieldHint />
226
+ <FieldError />
227
+ </Stack>
228
+ </Field>
229
+ </Box>
230
+ );
231
+ }}
232
+ </Story>
233
+ </Canvas>
234
+
235
+ ## Props
236
+
237
+ <ArgsTable of={Field} />
@@ -0,0 +1,25 @@
1
+ import React from 'react';
2
+ import styled from 'styled-components';
3
+ import PropTypes from 'prop-types';
4
+
5
+ const FieldActionWrapper = styled.button`
6
+ border: none;
7
+ background: transparent;
8
+ // TODO: Make sure to use the theme when it's ready
9
+ font-size: 1.6rem;
10
+ width: auto;
11
+ padding: 0;
12
+ display: flex;
13
+ align-items: center;
14
+ `;
15
+
16
+ export const FieldAction = ({ label, children, ...props }) => (
17
+ <FieldActionWrapper aria-label={label} type="button" {...props}>
18
+ {children}
19
+ </FieldActionWrapper>
20
+ );
21
+
22
+ FieldAction.propTypes = {
23
+ children: PropTypes.node.isRequired,
24
+ label: PropTypes.string.isRequired,
25
+ };
@@ -0,0 +1,4 @@
1
+ import { createContext, useContext } from 'react';
2
+
3
+ export const FieldContext = createContext({ error: undefined, hint: undefined, name: '', id: '' });
4
+ export const useField = () => useContext(FieldContext);
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import { useField } from './FieldContext';
3
+ import { Typography } from '../Typography';
4
+
5
+ export const FieldError = () => {
6
+ const { id, error } = useField();
7
+
8
+ if (!error || typeof error !== 'string') {
9
+ return null;
10
+ }
11
+
12
+ return (
13
+ <Typography variant="pi" as="p" id={`${id}-error`} textColor="danger600" data-strapi-field-error>
14
+ {error}
15
+ </Typography>
16
+ );
17
+ };
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import { useField } from './FieldContext';
3
+ import { Typography } from '../Typography';
4
+
5
+ export const FieldHint = () => {
6
+ const { id, hint, error } = useField();
7
+
8
+ if (!hint || error) {
9
+ return null;
10
+ }
11
+
12
+ return (
13
+ <Typography variant="pi" as="p" id={`${id}-hint`} textColor="neutral600">
14
+ {hint}
15
+ </Typography>
16
+ );
17
+ };
@@ -0,0 +1,129 @@
1
+ import React, { forwardRef } from 'react';
2
+ import styled from 'styled-components';
3
+ import PropTypes from 'prop-types';
4
+ import { sizes } from '../themes/sizes';
5
+ import { inputFocusStyle } from '../themes/utils';
6
+ import { useField } from './FieldContext';
7
+ import { Flex } from '../Flex';
8
+ import { Box } from '../Box';
9
+
10
+ // padding-[top|bottom] must ensure, the input matches the height of getThemeSize('input')
11
+ const PADDING_Y = {
12
+ S: 6.5,
13
+ M: 10.5,
14
+ };
15
+
16
+ const Input = styled.input`
17
+ border: none;
18
+ border-radius: ${({ theme }) => theme.borderRadius};
19
+ padding-bottom: ${({ size }) => `${PADDING_Y[size] / 16}rem`};
20
+ padding-left: ${({ theme, hasLeftAction }) => (hasLeftAction ? 0 : theme.spaces[4])};
21
+ padding-right: ${({ theme, hasRightAction }) => (hasRightAction ? 0 : theme.spaces[4])};
22
+ padding-top: ${({ size }) => `${PADDING_Y[size] / 16}rem`};
23
+ cursor: ${(props) => (props['aria-disabled'] ? 'not-allowed' : undefined)};
24
+
25
+ color: ${({ theme }) => theme.colors.neutral800};
26
+ font-weight: 400;
27
+ // TODO: Make sure to use the theme when it's ready
28
+ font-size: ${14 / 16}rem;
29
+ display: block;
30
+ width: 100%;
31
+ background: inherit;
32
+
33
+ ::placeholder {
34
+ color: ${({ theme }) => theme.colors.neutral500};
35
+ opacity: 1;
36
+ }
37
+
38
+ &[aria-disabled='true'] {
39
+ color: inherit;
40
+ }
41
+
42
+ //focus managed by InputWrapper
43
+ &:focus {
44
+ outline: none;
45
+ box-shadow: none;
46
+ }
47
+ `;
48
+
49
+ export const InputWrapper = styled(Flex)`
50
+ border: 1px solid ${({ theme, hasError }) => (hasError ? theme.colors.danger600 : theme.colors.neutral200)};
51
+ border-radius: ${({ theme }) => theme.borderRadius};
52
+ background: ${({ theme }) => theme.colors.neutral0};
53
+ ${inputFocusStyle()}
54
+
55
+ ${({ theme, disabled }) =>
56
+ disabled
57
+ ? `
58
+ color: ${theme.colors.neutral600};
59
+ background: ${theme.colors.neutral150};
60
+
61
+ `
62
+ : undefined}
63
+ `;
64
+
65
+ export const FieldInput = forwardRef(({ endAction, startAction, disabled, onChange, size, ...props }, ref) => {
66
+ const { id, error, hint, name } = useField();
67
+
68
+ let ariaDescription;
69
+
70
+ if (error) {
71
+ ariaDescription = `${id}-error`;
72
+ } else if (hint) {
73
+ ariaDescription = `${id}-hint`;
74
+ }
75
+
76
+ const hasError = Boolean(error);
77
+
78
+ const handleChange = (e) => {
79
+ if (!disabled) {
80
+ onChange(e);
81
+ }
82
+ };
83
+
84
+ return (
85
+ <InputWrapper size={size} justifyContent="space-between" hasError={hasError} disabled={disabled}>
86
+ {startAction && (
87
+ <Box paddingLeft={3} paddingRight={2}>
88
+ {startAction}
89
+ </Box>
90
+ )}
91
+ <Input
92
+ id={id}
93
+ name={name}
94
+ ref={ref}
95
+ aria-describedby={ariaDescription}
96
+ aria-invalid={hasError}
97
+ aria-disabled={disabled}
98
+ hasLeftAction={Boolean(startAction)}
99
+ hasRightAction={Boolean(endAction)}
100
+ onChange={handleChange}
101
+ size={size}
102
+ {...props}
103
+ />
104
+ {endAction && (
105
+ <Box paddingLeft={2} paddingRight={3}>
106
+ {endAction}
107
+ </Box>
108
+ )}
109
+ </InputWrapper>
110
+ );
111
+ });
112
+
113
+ FieldInput.displayName = 'FieldInput';
114
+
115
+ FieldInput.defaultProps = {
116
+ disabled: false,
117
+ endAction: undefined,
118
+ size: 'M',
119
+ startAction: undefined,
120
+ onChange: () => {},
121
+ };
122
+
123
+ FieldInput.propTypes = {
124
+ disabled: PropTypes.bool,
125
+ endAction: PropTypes.element,
126
+ onChange: PropTypes.func,
127
+ size: PropTypes.oneOf(Object.keys(sizes.input)),
128
+ startAction: PropTypes.element,
129
+ };
@@ -0,0 +1,50 @@
1
+ import React from 'react';
2
+ import styled from 'styled-components';
3
+ import PropTypes from 'prop-types';
4
+ import { Flex } from '../Flex';
5
+ import { useField } from './FieldContext';
6
+ import { Typography } from '../Typography';
7
+
8
+ const TypographyAsterisk = styled(Typography)`
9
+ line-height: 0;
10
+ `;
11
+
12
+ const Action = styled(Flex)`
13
+ line-height: 0;
14
+
15
+ svg path {
16
+ fill: ${({ theme }) => theme.colors.neutral500};
17
+ }
18
+ `;
19
+
20
+ export const FieldLabel = ({ children, required, action, ...props }) => {
21
+ const { id } = useField();
22
+
23
+ return (
24
+ <Typography
25
+ variant="pi"
26
+ textColor="neutral800"
27
+ htmlFor={id}
28
+ fontWeight="bold"
29
+ as="label"
30
+ required={required}
31
+ {...props}
32
+ >
33
+ <Flex alignItems="center">
34
+ {children}
35
+ {required && <TypographyAsterisk textColor="danger600">*</TypographyAsterisk>}
36
+ {action && <Action marginLeft={1}>{action}</Action>}
37
+ </Flex>
38
+ </Typography>
39
+ );
40
+ };
41
+
42
+ FieldLabel.defaultProps = {
43
+ required: false,
44
+ action: undefined,
45
+ };
46
+ FieldLabel.propTypes = {
47
+ action: PropTypes.element,
48
+ children: PropTypes.node.isRequired,
49
+ required: PropTypes.bool,
50
+ };
@@ -0,0 +1,61 @@
1
+ import { injectAxe, checkA11y } from 'axe-playwright';
2
+
3
+ import { test } from '@playwright/test';
4
+
5
+ test.describe.parallel('Field', () => {
6
+ test.describe('light mode', () => {
7
+ test.describe('base', () => {
8
+ test('triggers axe on the document', async ({ page }) => {
9
+ await page.goto('/iframe.html?id=design-system-components-field--base&viewMode=story');
10
+ await injectAxe(page);
11
+ await checkA11y(page);
12
+ });
13
+ });
14
+
15
+ test.describe('with description', () => {
16
+ test('triggers axe on the document', async ({ page }) => {
17
+ await page.goto('/iframe.html?id=design-system-components-field--with-description&viewMode=story');
18
+ await injectAxe(page);
19
+ await checkA11y(page);
20
+ });
21
+ });
22
+
23
+ test.describe('with error', () => {
24
+ test('triggers axe on the document', async ({ page }) => {
25
+ await page.goto('/iframe.html?id=design-system-components-field--with-error&viewMode=story');
26
+ await injectAxe(page);
27
+ await checkA11y(page);
28
+ });
29
+ });
30
+
31
+ test.describe('disabled', () => {
32
+ test('triggers axe on the document', async ({ page }) => {
33
+ await page.goto('/iframe.html?id=design-system-components-field--disabled&viewMode=story');
34
+ await injectAxe(page);
35
+ await checkA11y(page);
36
+ });
37
+ });
38
+
39
+ test.describe('most complex input', () => {
40
+ test('triggers axe on the document', async ({ page }) => {
41
+ await page.goto('/iframe.html?id=design-system-components-field--most-complex-input&viewMode=story');
42
+ await injectAxe(page);
43
+ await checkA11y(page);
44
+ });
45
+ });
46
+ });
47
+
48
+ test.describe('dark mode', () => {
49
+ test('complex input A11y', async ({ page }) => {
50
+ await page.goto('/iframe.html?id=design-system-components-field--most-complex-input&viewMode=story&theme=dark');
51
+ await injectAxe(page);
52
+ await checkA11y(page);
53
+ });
54
+
55
+ test('disabled A11y', async ({ page }) => {
56
+ await page.goto('/iframe.html?id=design-system-components-field--disabled&viewMode=story&theme=dark');
57
+ await injectAxe(page);
58
+ await checkA11y(page);
59
+ });
60
+ });
61
+ });
@@ -0,0 +1,7 @@
1
+ export * from './Field';
2
+ export * from './FieldLabel';
3
+ export * from './FieldInput';
4
+ export * from './FieldHint';
5
+ export * from './FieldError';
6
+ export * from './FieldContext';
7
+ export * from './FieldAction';
@@ -0,0 +1,26 @@
1
+ import styled from 'styled-components';
2
+ import { Box } from '../Box';
3
+ import handleResponsiveValues from '../helpers/handleResponsiveValues';
4
+ import { flexDefaultProps, flexPropTypes } from './FlexProps';
5
+
6
+ /**
7
+ * Prevents these attributes from being spread on the DOM node
8
+ */
9
+ const transientProps = {
10
+ direction: true,
11
+ };
12
+
13
+ export const Flex = styled(Box).withConfig({
14
+ shouldForwardProp: (prop, defPropValFN) => !transientProps[prop] && defPropValFN(prop),
15
+ })`
16
+ align-items: ${({ alignItems }) => alignItems};
17
+ display: ${({ inline }) => (inline ? 'inline-flex' : 'flex')};
18
+ flex-direction: ${({ direction }) => direction};
19
+ flex-shrink: ${({ shrink }) => shrink};
20
+ flex-wrap: ${({ wrap }) => wrap};
21
+ ${({ gap, theme }) => handleResponsiveValues('gap', gap, theme)}};
22
+ justify-content: ${({ justifyContent }) => justifyContent};
23
+ `;
24
+
25
+ Flex.defaultProps = flexDefaultProps;
26
+ Flex.propTypes = flexPropTypes;
@@ -0,0 +1,45 @@
1
+ <!--- Flex.stories.mdx --->
2
+
3
+ import { Meta, Story, Canvas } from '@storybook/addon-docs';
4
+ import { ArgsTable } from '@storybook/addon-docs';
5
+ import { Flex } from './Flex';
6
+ import { Typography } from '../Typography';
7
+ import { Box } from '../Box';
8
+ import { FlexProps } from './FlexProps';
9
+
10
+ <Meta title="Design System/Technical Components/Flex" component={Flex} />
11
+
12
+ # Flex
13
+
14
+ This is the doc of the `Flex` component
15
+
16
+ [View source](https://github.com/strapi/design-system/tree/main/packages/strapi-design-system/src/Flex)
17
+
18
+ ## Imports
19
+
20
+ ```js
21
+ import { Flex } from '@strapi/design-system/Flex';
22
+ ```
23
+
24
+ ## Usage
25
+
26
+ A Flex Flex
27
+
28
+ <Canvas>
29
+ <Story name="base">
30
+ <Flex>
31
+ <Box background="primary600" padding={1} hasRadius>
32
+ <Typography textColor="neutral0">Hello</Typography>
33
+ </Box>
34
+ <Box background="success600" padding={1} hasRadius>
35
+ <Typography textColor="neutral0">World</Typography>
36
+ </Box>
37
+ </Flex>
38
+ </Story>
39
+ </Canvas>
40
+
41
+ ## Props
42
+
43
+ The Flex component wraps all its children in the (Box)[https://design-system-git-main-strapijs.vercel.app/?path=/docs/design-system-technical-components-box--base] component, so you can pass all Box props to change its style.
44
+
45
+ <ArgsTable of={FlexProps} />
@@ -0,0 +1,41 @@
1
+ import React from 'react';
2
+ import PropTypes from 'prop-types';
3
+
4
+ export const FlexProps = (props) => <div {...props} />;
5
+
6
+ export const flexDefaultProps = {
7
+ alignItems: 'center',
8
+ basis: undefined,
9
+ direction: 'row',
10
+ gap: undefined,
11
+ inline: false,
12
+ justifyContent: undefined,
13
+ reverse: false,
14
+ wrap: undefined,
15
+ };
16
+ export const flexPropTypes = {
17
+ alignItems: PropTypes.string,
18
+ basis: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
19
+ direction: PropTypes.string,
20
+ /**
21
+ * Supports responsive values
22
+ */
23
+ gap: PropTypes.oneOfType([
24
+ PropTypes.shape({
25
+ desktop: PropTypes.number,
26
+ mobile: PropTypes.number,
27
+ tablet: PropTypes.number,
28
+ }),
29
+ PropTypes.number,
30
+ PropTypes.arrayOf(PropTypes.number),
31
+ PropTypes.string,
32
+ ]),
33
+ inline: PropTypes.bool,
34
+ justifyContent: PropTypes.string,
35
+ reverse: PropTypes.bool,
36
+ shrink: PropTypes.number,
37
+ wrap: PropTypes.string,
38
+ };
39
+
40
+ FlexProps.defaultProps = flexDefaultProps;
41
+ FlexProps.propTypes = flexPropTypes;
@@ -0,0 +1,23 @@
1
+ import { injectAxe, checkA11y } from 'axe-playwright';
2
+
3
+ import { test } from '@playwright/test';
4
+
5
+ test.describe.parallel('Flex', () => {
6
+ test.describe('light mode', () => {
7
+ test('triggers axe on the document', async ({ page }) => {
8
+ // This is the URL of the Storybook Iframe
9
+ await page.goto('/iframe.html?id=design-system-technical-components-flex--base&viewMode=story');
10
+ await injectAxe(page);
11
+ await checkA11y(page);
12
+ });
13
+ });
14
+
15
+ test.describe('dark mode', () => {
16
+ test('triggers axe on the document', async ({ page }) => {
17
+ // This is the URL of the Storybook Iframe
18
+ await page.goto('/iframe.html?id=design-system-technical-components-flex--base&viewMode=story&theme=dark');
19
+ await injectAxe(page);
20
+ await checkA11y(page);
21
+ });
22
+ });
23
+ });