@nypl/design-system-react-components 0.25.8 → 0.25.11

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 (282) hide show
  1. package/CHANGELOG.md +110 -1
  2. package/README.md +1 -1
  3. package/dist/components/Button/Button.d.ts +6 -6
  4. package/dist/components/Button/ButtonTypes.d.ts +0 -1
  5. package/dist/components/Card/Card.d.ts +6 -4
  6. package/dist/components/Checkbox/Checkbox.d.ts +3 -2
  7. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +3 -2
  8. package/dist/components/ComponentWrapper/ComponentWrapper.d.ts +8 -2
  9. package/dist/components/DatePicker/DatePicker.d.ts +4 -3
  10. package/dist/components/Fieldset/Fieldset.d.ts +1 -3
  11. package/dist/components/Form/Form.d.ts +15 -14
  12. package/dist/components/Form/FormTypes.d.ts +2 -2
  13. package/dist/components/Heading/Heading.d.ts +7 -3
  14. package/dist/components/Heading/HeadingTypes.d.ts +6 -6
  15. package/dist/components/HelperErrorText/HelperErrorText.d.ts +5 -2
  16. package/dist/components/HorizontalRule/HorizontalRule.d.ts +3 -3
  17. package/dist/components/Icons/Icon.d.ts +4 -4
  18. package/dist/components/Icons/IconSvgs.d.ts +0 -21
  19. package/dist/components/Icons/IconTypes.d.ts +0 -23
  20. package/dist/components/Image/Image.d.ts +11 -3
  21. package/dist/components/List/List.d.ts +1 -1
  22. package/dist/components/Logo/Logo.d.ts +28 -0
  23. package/dist/components/Logo/LogoSvgs.d.ts +34 -0
  24. package/dist/components/Logo/LogoTypes.d.ts +46 -0
  25. package/dist/components/Modal/Modal.d.ts +0 -4
  26. package/dist/components/Notification/Notification.d.ts +4 -2
  27. package/dist/components/Placeholder/Placeholder.d.ts +3 -5
  28. package/dist/components/Radio/Radio.d.ts +6 -5
  29. package/dist/components/RadioGroup/RadioGroup.d.ts +6 -5
  30. package/dist/components/SearchBar/SearchBar.d.ts +15 -7
  31. package/dist/components/Select/Select.d.ts +7 -2
  32. package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +8 -4
  33. package/dist/components/Slider/Slider.d.ts +3 -2
  34. package/dist/components/StatusBadge/StatusBadge.d.ts +2 -1
  35. package/dist/components/StructuredContent/StructuredContent.d.ts +41 -0
  36. package/dist/components/StructuredContent/StructuredContentTypes.d.ts +5 -0
  37. package/dist/components/Table/Table.d.ts +29 -0
  38. package/dist/components/Template/Template.d.ts +30 -6
  39. package/dist/components/Text/Text.d.ts +2 -2
  40. package/dist/components/TextInput/TextInput.d.ts +4 -3
  41. package/dist/components/Toggle/Toggle.d.ts +3 -2
  42. package/dist/components/VideoPlayer/VideoPlayer.d.ts +14 -5
  43. package/dist/design-system-react-components.cjs.development.js +6721 -5777
  44. package/dist/design-system-react-components.cjs.development.js.map +1 -1
  45. package/dist/design-system-react-components.cjs.production.min.js +1 -1
  46. package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
  47. package/dist/design-system-react-components.esm.js +6774 -5839
  48. package/dist/design-system-react-components.esm.js.map +1 -1
  49. package/dist/index.d.ts +10 -8
  50. package/dist/resources.scss +0 -2
  51. package/dist/styles.css +2 -2
  52. package/dist/theme/components/breadcrumb.d.ts +1 -1
  53. package/dist/theme/components/button.d.ts +0 -12
  54. package/dist/theme/components/card.d.ts +14 -2
  55. package/dist/theme/components/customTable.d.ts +56 -0
  56. package/dist/theme/components/fieldset.d.ts +2 -2
  57. package/dist/theme/components/global.d.ts +1 -1
  58. package/dist/theme/components/heading.d.ts +4 -0
  59. package/dist/theme/components/label.d.ts +1 -1
  60. package/dist/theme/components/link.d.ts +14 -1
  61. package/dist/theme/components/list.d.ts +0 -2
  62. package/dist/theme/components/logo.d.ts +4 -0
  63. package/dist/theme/components/notification.d.ts +13 -4
  64. package/dist/theme/components/searchBar.d.ts +9 -11
  65. package/dist/theme/components/select.d.ts +1 -0
  66. package/dist/theme/components/structuredContent.d.ts +33 -0
  67. package/dist/theme/components/template.d.ts +10 -10
  68. package/dist/theme/components/textInput.d.ts +4 -0
  69. package/dist/theme/components/toggle.d.ts +8 -5
  70. package/dist/utils/utils.d.ts +10 -0
  71. package/package.json +40 -37
  72. package/src/__tests__/utils/utils.test.ts +23 -1
  73. package/src/components/Accordion/Accordion.stories.mdx +15 -13
  74. package/src/components/Accordion/Accordion.test.tsx +45 -1
  75. package/src/components/Accordion/Accordion.tsx +20 -8
  76. package/src/components/Accordion/__snapshots__/Accordion.test.tsx.snap +243 -0
  77. package/src/components/Autosuggest/Autosuggest.stories.mdx +2 -1
  78. package/src/components/Autosuggest/Autosuggest.stories.tsx +24 -48
  79. package/src/components/Autosuggest/_Autosuggest.scss +2 -6
  80. package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +43 -13
  81. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +15 -0
  82. package/src/components/Breadcrumbs/Breadcrumbs.tsx +9 -3
  83. package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +5 -5
  84. package/src/components/Button/Button.stories.mdx +93 -48
  85. package/src/components/Button/Button.test.tsx +0 -12
  86. package/src/components/Button/Button.tsx +7 -7
  87. package/src/components/Button/ButtonTypes.tsx +0 -1
  88. package/src/components/Button/__snapshots__/Button.test.tsx.snap +0 -12
  89. package/src/components/Card/Card.stories.mdx +186 -71
  90. package/src/components/Card/Card.test.tsx +45 -22
  91. package/src/components/Card/Card.tsx +21 -6
  92. package/src/components/Card/__snapshots__/Card.test.tsx.snap +9 -3
  93. package/src/components/Chakra/Box.stories.mdx +3 -3
  94. package/src/components/Chakra/Center.stories.mdx +5 -5
  95. package/src/components/Chakra/Flex.stories.mdx +113 -0
  96. package/src/components/Chakra/Grid.stories.mdx +3 -3
  97. package/src/components/Chakra/Stack.stories.mdx +2 -2
  98. package/src/components/Checkbox/Checkbox.stories.mdx +37 -15
  99. package/src/components/Checkbox/Checkbox.tsx +13 -8
  100. package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +48 -16
  101. package/src/components/CheckboxGroup/CheckboxGroup.tsx +14 -10
  102. package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +6 -3
  103. package/src/components/ComponentWrapper/ComponentWrapper.test.tsx +151 -0
  104. package/src/components/ComponentWrapper/ComponentWrapper.tsx +36 -23
  105. package/src/components/ComponentWrapper/__snapshots__/ComponentWrapper.test.tsx.snap +85 -0
  106. package/src/components/DatePicker/DatePicker.stories.mdx +63 -18
  107. package/src/components/DatePicker/DatePicker.test.tsx +6 -6
  108. package/src/components/DatePicker/DatePicker.tsx +17 -11
  109. package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +50 -24
  110. package/src/components/Fieldset/Fieldset.stories.mdx +20 -9
  111. package/src/components/Fieldset/Fieldset.tsx +2 -4
  112. package/src/components/Form/Form.stories.mdx +75 -49
  113. package/src/components/Form/Form.test.tsx +92 -3
  114. package/src/components/Form/Form.tsx +28 -23
  115. package/src/components/Form/FormTypes.tsx +2 -2
  116. package/src/components/Form/__snapshots__/Form.test.tsx.snap +0 -1
  117. package/src/components/Grid/SimpleGrid.stories.mdx +26 -26
  118. package/src/components/Heading/Heading.stories.mdx +59 -23
  119. package/src/components/Heading/Heading.test.tsx +82 -18
  120. package/src/components/Heading/Heading.tsx +31 -31
  121. package/src/components/Heading/HeadingTypes.tsx +6 -6
  122. package/src/components/Heading/__snapshots__/Heading.test.tsx.snap +71 -0
  123. package/src/components/HelperErrorText/HelperErrorText.stories.mdx +55 -27
  124. package/src/components/HelperErrorText/HelperErrorText.test.tsx +42 -15
  125. package/src/components/HelperErrorText/HelperErrorText.tsx +24 -24
  126. package/src/components/HelperErrorText/__snapshots__/HelperErrorText.test.tsx.snap +41 -4
  127. package/src/components/Hero/Hero.stories.mdx +72 -53
  128. package/src/components/HorizontalRule/HorizontalRule.stories.mdx +11 -9
  129. package/src/components/HorizontalRule/HorizontalRule.tsx +4 -6
  130. package/src/components/HorizontalRule/__snapshots__/HorizontalRule.test.tsx.snap +4 -4
  131. package/src/components/Icons/Icon.stories.mdx +78 -77
  132. package/src/components/Icons/Icon.test.tsx +1 -1
  133. package/src/components/Icons/Icon.tsx +5 -6
  134. package/src/components/Icons/IconSvgs.tsx +0 -42
  135. package/src/components/Icons/IconTypes.tsx +0 -24
  136. package/src/components/Image/Image.stories.mdx +66 -18
  137. package/src/components/Image/Image.tsx +21 -10
  138. package/src/components/Label/Label.stories.mdx +20 -19
  139. package/src/components/Link/Link.stories.mdx +102 -51
  140. package/src/components/Link/Link.test.tsx +38 -8
  141. package/src/components/Link/Link.tsx +19 -12
  142. package/src/components/Link/__snapshots__/Link.test.tsx.snap +60 -0
  143. package/src/components/List/List.stories.mdx +60 -29
  144. package/src/components/List/List.test.tsx +1 -1
  145. package/src/components/List/List.tsx +2 -2
  146. package/src/components/List/__snapshots__/List.test.tsx.snap +3 -1
  147. package/src/components/Logo/Logo.stories.mdx +222 -0
  148. package/src/components/Logo/Logo.test.tsx +98 -0
  149. package/src/components/Logo/Logo.tsx +97 -0
  150. package/src/components/Logo/LogoSvgs.tsx +66 -0
  151. package/src/components/Logo/LogoTypes.tsx +48 -0
  152. package/src/components/Logo/__snapshots__/Logo.test.tsx.snap +71 -0
  153. package/src/components/Modal/Modal.stories.mdx +20 -5
  154. package/src/components/Modal/Modal.tsx +2 -8
  155. package/src/components/Notification/Notification.stories.mdx +128 -38
  156. package/src/components/Notification/Notification.test.tsx +49 -1
  157. package/src/components/Notification/Notification.tsx +25 -12
  158. package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +4 -0
  159. package/src/components/Pagination/Pagination.stories.mdx +18 -7
  160. package/src/components/Pagination/Pagination.tsx +3 -3
  161. package/src/components/Placeholder/Placeholder.tsx +7 -14
  162. package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +72 -43
  163. package/src/components/Radio/Radio.stories.mdx +39 -19
  164. package/src/components/Radio/Radio.tsx +13 -9
  165. package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +5 -5
  166. package/src/components/RadioGroup/RadioGroup.stories.mdx +50 -16
  167. package/src/components/RadioGroup/RadioGroup.test.tsx +13 -11
  168. package/src/components/RadioGroup/RadioGroup.tsx +97 -94
  169. package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +24 -21
  170. package/src/components/SearchBar/SearchBar.Test.tsx +160 -34
  171. package/src/components/SearchBar/SearchBar.stories.mdx +115 -33
  172. package/src/components/SearchBar/SearchBar.tsx +72 -51
  173. package/src/components/Select/Select.stories.mdx +48 -14
  174. package/src/components/Select/Select.test.tsx +89 -0
  175. package/src/components/Select/Select.tsx +27 -12
  176. package/src/components/Select/__snapshots__/Select.test.tsx.snap +545 -0
  177. package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +50 -16
  178. package/src/components/SkeletonLoader/SkeletonLoader.tsx +8 -4
  179. package/src/components/Slider/Slider.stories.mdx +72 -22
  180. package/src/components/Slider/Slider.tsx +15 -10
  181. package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +67 -30
  182. package/src/components/StatusBadge/StatusBadge.stories.mdx +33 -18
  183. package/src/components/StatusBadge/StatusBadge.tsx +2 -1
  184. package/src/components/StructuredContent/StructuredContent.stories.mdx +427 -0
  185. package/src/components/StructuredContent/StructuredContent.test.tsx +376 -0
  186. package/src/components/StructuredContent/StructuredContent.tsx +153 -0
  187. package/src/components/StructuredContent/StructuredContentTypes.tsx +5 -0
  188. package/src/components/StructuredContent/__snapshots__/StructuredContent.test.tsx.snap +283 -0
  189. package/src/components/StyleGuide/Bidirectionality.stories.mdx +32 -83
  190. package/src/components/StyleGuide/Breakpoints.stories.mdx +1 -11
  191. package/src/components/StyleGuide/Buttons.stories.mdx +3 -18
  192. package/src/components/StyleGuide/ColorCard.tsx +1 -2
  193. package/src/components/StyleGuide/Colors.stories.mdx +3 -11
  194. package/src/components/StyleGuide/DesignTokens.stories.mdx +3 -8
  195. package/src/components/StyleGuide/Forms.stories.mdx +2 -10
  196. package/src/components/StyleGuide/Iconography.stories.mdx +8 -34
  197. package/src/components/StyleGuide/Spacing.stories.mdx +3 -14
  198. package/src/components/StyleGuide/Typography.stories.mdx +64 -76
  199. package/src/components/Table/Table.stories.mdx +165 -0
  200. package/src/components/Table/Table.test.tsx +137 -0
  201. package/src/components/Table/Table.tsx +126 -0
  202. package/src/components/Table/__snapshots__/Table.test.tsx.snap +1179 -0
  203. package/src/components/Tabs/Tabs.stories.mdx +20 -14
  204. package/src/components/Tabs/Tabs.test.tsx +21 -5
  205. package/src/components/Tabs/Tabs.tsx +35 -20
  206. package/src/components/Tabs/__snapshots__/Tabs.test.tsx.snap +195 -0
  207. package/src/components/Template/Template.stories.mdx +132 -48
  208. package/src/components/Template/Template.test.tsx +128 -6
  209. package/src/components/Template/Template.tsx +93 -13
  210. package/src/components/Template/__snapshots__/Template.test.tsx.snap +169 -0
  211. package/src/components/Text/Text.stories.mdx +33 -11
  212. package/src/components/Text/Text.tsx +2 -2
  213. package/src/components/TextInput/TextInput.stories.mdx +84 -17
  214. package/src/components/TextInput/TextInput.test.tsx +96 -0
  215. package/src/components/TextInput/TextInput.tsx +12 -8
  216. package/src/components/TextInput/__snapshots__/TextInput.test.tsx.snap +240 -0
  217. package/src/components/Toggle/Toggle.stories.mdx +33 -9
  218. package/src/components/Toggle/Toggle.tsx +14 -9
  219. package/src/components/Toggle/__snapshots__/Toggle.test.tsx.snap +4 -4
  220. package/src/components/VideoPlayer/VideoPlayer.stories.mdx +64 -14
  221. package/src/components/VideoPlayer/VideoPlayer.tsx +17 -7
  222. package/src/components/VideoPlayer/__snapshots__/VideoPlayer.test.tsx.snap +12 -6
  223. package/src/docs/Chakra.stories.mdx +5 -8
  224. package/src/docs/Intro.stories.mdx +2 -2
  225. package/src/index.ts +13 -6
  226. package/src/styles/base/_03-base.scss +1 -1
  227. package/src/styles/base/_place-holder.scss +7 -7
  228. package/src/styles.scss +1 -5
  229. package/src/theme/components/breadcrumb.ts +4 -4
  230. package/src/theme/components/button.ts +5 -12
  231. package/src/theme/components/card.ts +5 -2
  232. package/src/theme/components/checkbox.ts +1 -1
  233. package/src/theme/components/customTable.ts +63 -0
  234. package/src/theme/components/datePicker.ts +1 -1
  235. package/src/theme/components/global.ts +7 -7
  236. package/src/theme/components/heading.ts +13 -11
  237. package/src/theme/components/helperErrorText.ts +1 -1
  238. package/src/theme/components/image.ts +1 -1
  239. package/src/theme/components/link.ts +17 -5
  240. package/src/theme/components/list.ts +3 -5
  241. package/src/theme/components/logo.ts +54 -0
  242. package/src/theme/components/notification.ts +19 -9
  243. package/src/theme/components/searchBar.ts +11 -13
  244. package/src/theme/components/select.ts +1 -0
  245. package/src/theme/components/statusBadge.ts +1 -1
  246. package/src/theme/components/structuredContent.ts +74 -0
  247. package/src/theme/components/template.ts +10 -10
  248. package/src/theme/components/text.ts +6 -6
  249. package/src/theme/components/textInput.ts +2 -0
  250. package/src/theme/components/toggle.ts +10 -6
  251. package/src/theme/components/videoPlayer.ts +0 -2
  252. package/src/theme/foundations/global.ts +2 -2
  253. package/src/theme/foundations/typography.ts +84 -12
  254. package/src/theme/index.ts +6 -0
  255. package/src/utils/componentCategories.ts +2 -1
  256. package/src/utils/utils.ts +17 -0
  257. package/dist/__tests__/utils/bem.test.d.ts +0 -1
  258. package/dist/components/CardEdition/CardEdition.d.ts +0 -21
  259. package/dist/components/CardEdition/CardEdition.stories.d.ts +0 -27
  260. package/dist/components/Input/Input.d.ts +0 -36
  261. package/dist/components/Input/Input.stories.d.ts +0 -29
  262. package/dist/components/Input/InputTypes.d.ts +0 -6
  263. package/dist/components/StyleGuide/UIDocCard.d.ts +0 -11
  264. package/dist/helpers/CSSVariablesHelper.d.ts +0 -3
  265. package/dist/helpers/getCSSVariable.d.ts +0 -1
  266. package/dist/interfaces.d.ts +0 -3
  267. package/dist/utils/bem.d.ts +0 -1
  268. package/src/__tests__/utils/bem.test.ts +0 -37
  269. package/src/components/CardEdition/CardEdition.stories.tsx +0 -122
  270. package/src/components/CardEdition/CardEdition.test.tsx +0 -395
  271. package/src/components/CardEdition/CardEdition.tsx +0 -60
  272. package/src/components/CardEdition/_CardEdition.scss +0 -137
  273. package/src/components/Input/Input.stories.tsx +0 -133
  274. package/src/components/Input/Input.test.tsx +0 -266
  275. package/src/components/Input/Input.tsx +0 -81
  276. package/src/components/Input/InputTypes.tsx +0 -8
  277. package/src/components/Input/_Input.scss +0 -78
  278. package/src/components/StyleGuide/UIDocCard.tsx +0 -36
  279. package/src/helpers/CSSVariablesHelper.tsx +0 -34
  280. package/src/helpers/getCSSVariable.tsx +0 -5
  281. package/src/interfaces.ts +0 -3
  282. package/src/utils/bem.ts +0 -44
@@ -1,10 +1,10 @@
1
1
  import {
2
- Meta,
3
- Story,
4
- Canvas,
5
2
  ArgsTable,
3
+ Canvas,
6
4
  Description,
7
- } from "@storybook/addon-docs/blocks";
5
+ Meta,
6
+ Story,
7
+ } from "@storybook/addon-docs";
8
8
  import { withDesign } from "storybook-addon-designs";
9
9
 
10
10
  import { Tabs, TabList, Tab, TabPanels, TabPanel } from "./Tabs";
@@ -18,17 +18,21 @@ import DSProvider from "../../theme/provider";
18
18
  parameters={{
19
19
  design: {
20
20
  type: "figma",
21
- url:
22
- "https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Main?node-id=36835%3A26464",
21
+ url: "https://www.figma.com/file/qShodlfNCJHb8n03IFyApM/Main?node-id=36835%3A26464",
23
22
  },
24
23
  jest: ["Tabs.test.tsx"],
25
24
  }}
26
25
  argTypes={{
27
26
  children: { table: { disable: true } },
28
- id: { table: { disable: true } },
29
- className: { table: { disable: true } },
30
- data: { table: { disable: true } },
31
- onChange: { table: { disable: true } },
27
+ contentData: { control: false },
28
+ defaultIndex: {
29
+ table: { defaultValue: { summary: 0 } },
30
+ },
31
+ id: { control: false },
32
+ onChange: { control: false },
33
+ useHash: {
34
+ table: { defaultValue: { summary: false } },
35
+ },
32
36
  }}
33
37
  />
34
38
 
@@ -37,7 +41,7 @@ import DSProvider from "../../theme/provider";
37
41
  | Component Version | DS Version |
38
42
  | ----------------- | ---------- |
39
43
  | Added | `0.24.0` |
40
- | Latest | `0.25.0` |
44
+ | Latest | `0.25.11` |
41
45
 
42
46
  <Description of={Tabs} />
43
47
 
@@ -89,18 +93,20 @@ export const animalCrossing = [
89
93
 
90
94
  <Canvas withToolbar>
91
95
  <Story
92
- name="Basic with props"
96
+ name="Tabs with Controls"
93
97
  args={{
98
+ contentData: animalCrossing,
94
99
  defaultIndex: 0,
100
+ id: "tabs-id",
101
+ onChange: undefined,
95
102
  useHash: false,
96
- contentData: animalCrossing,
97
103
  }}
98
104
  >
99
105
  {(args) => <Tabs {...args} />}
100
106
  </Story>
101
107
  </Canvas>
102
108
 
103
- <ArgsTable story="Basic with props" />
109
+ <ArgsTable story="Tabs with Controls" />
104
110
 
105
111
  ## Composing with a Data Object
106
112
 
@@ -1,7 +1,8 @@
1
1
  import * as React from "react";
2
2
  import { render, screen } from "@testing-library/react";
3
- import { axe } from "jest-axe";
4
3
  import userEvent from "@testing-library/user-event";
4
+ import { axe } from "jest-axe";
5
+ import renderer from "react-test-renderer";
5
6
 
6
7
  import { Tabs, TabList, Tab, TabPanels, TabPanel } from "./Tabs";
7
8
 
@@ -208,7 +209,15 @@ describe("Tabs", () => {
208
209
  expect(selectedIndex).toEqual(1);
209
210
  });
210
211
 
211
- it("should throw warning when both the 'data' probp and children are passed", () => {
212
+ it("should throw a warning when no data is passed", () => {
213
+ const warn = jest.spyOn(console, "warn");
214
+ render(<Tabs />);
215
+ expect(warn).toHaveBeenCalledWith(
216
+ "Tabs: Pass data in the `data` props or as children."
217
+ );
218
+ });
219
+
220
+ it("should throw a warning when both the 'data' prop and children are passed", () => {
212
221
  const warn = jest.spyOn(console, "warn");
213
222
  render(
214
223
  <Tabs contentData={animalCrossing}>
@@ -238,11 +247,11 @@ describe("Tabs", () => {
238
247
  </Tabs>
239
248
  );
240
249
  expect(warn).toHaveBeenCalledWith(
241
- "Only pass children or data in the `data` props but not both."
250
+ "Tabs: Only pass children or data in the `data` props but not both."
242
251
  );
243
252
  });
244
253
 
245
- it("should throw warning when more than six object tabs are passed", () => {
254
+ it("should throw a warning when more than six object tabs are passed", () => {
246
255
  const warn = jest.spyOn(console, "warn");
247
256
  render(
248
257
  <Tabs
@@ -258,7 +267,14 @@ describe("Tabs", () => {
258
267
  />
259
268
  );
260
269
  expect(warn).toHaveBeenCalledWith(
261
- "We recommend to use no more than six tabs. If more than six tabs are needed, consider other navigational patterns."
270
+ "Tabs: We recommend to use no more than six tabs. If more than six tabs are needed, consider other navigational patterns."
262
271
  );
263
272
  });
273
+
274
+ it("renders the UI snapshot correctly", () => {
275
+ const basic = renderer
276
+ .create(<Tabs contentData={animalCrossing} id="basic" />)
277
+ .toJSON();
278
+ expect(basic).toMatchSnapshot();
279
+ });
264
280
  });
@@ -17,6 +17,12 @@ import Button from "../Button/Button";
17
17
  import useCarouselStyles from "../../hooks/useCarouselStyles";
18
18
  import useWindowSize from "../../hooks/useWindowSize";
19
19
 
20
+ // Internal interface used for rendering `Tabs` tab and panel
21
+ // elements, either from data or from children.
22
+ interface TabPanelProps {
23
+ tabs: React.ReactNode[] | React.ReactNode;
24
+ panels: React.ReactNode[] | React.ReactNode;
25
+ }
20
26
  // The general shape of the data object for each Tab.
21
27
  export interface TabsContentDataProps {
22
28
  label: string;
@@ -49,18 +55,18 @@ const onClickHash = (tabHash) => {
49
55
  * This returns an object with `Tab` and `TabPanel` components to rendered in
50
56
  * `TabList` and `TabPanels` components respectively.
51
57
  */
52
- const getElementsFromContentData = (data, useHash) => {
58
+ const getElementsFromContentData = (data, useHash): TabPanelProps => {
53
59
  const tabs = [];
54
60
  const panels = [];
55
61
 
56
62
  if (!data?.length) {
57
- return {};
63
+ return { tabs: [], panels: [] };
58
64
  }
59
65
 
60
66
  if (data?.length > 6) {
61
67
  console.warn(
62
- "We recommend to use no more than six tabs. If more than six tabs are " +
63
- "needed, consider other navigational patterns."
68
+ "Tabs: We recommend to use no more than six tabs. If more than six tabs " +
69
+ "are needed, consider other navigational patterns."
64
70
  );
65
71
  }
66
72
  data.forEach((tab, index) => {
@@ -78,8 +84,8 @@ const getElementsFromContentData = (data, useHash) => {
78
84
  if (typeof tab.content === "string") {
79
85
  tempPanel = (
80
86
  <TabPanel
81
- key={index}
82
87
  dangerouslySetInnerHTML={{ __html: tab.content }}
88
+ key={index}
83
89
  />
84
90
  );
85
91
  } else {
@@ -91,8 +97,8 @@ const getElementsFromContentData = (data, useHash) => {
91
97
  });
92
98
 
93
99
  return {
94
- tabs: <TabList>{tabs}</TabList>,
95
- panels: <TabPanels>{panels}</TabPanels>,
100
+ tabs: [<TabList key="list">{tabs}</TabList>],
101
+ panels: [<TabPanels key="panels">{panels}</TabPanels>],
96
102
  };
97
103
  };
98
104
 
@@ -100,12 +106,12 @@ const getElementsFromContentData = (data, useHash) => {
100
106
  * This returns an object with `TabList` and `TabPanels` components to help format
101
107
  * the DOM when building up the `Tabs` component using child component.
102
108
  */
103
- const getElementsFromChildren = (children) => {
109
+ const getElementsFromChildren = (children): TabPanelProps => {
104
110
  const tabs = [];
105
111
  const panels = [];
106
112
 
107
113
  if (!children?.length) {
108
- return {};
114
+ return { tabs: [], panels: [] };
109
115
  }
110
116
 
111
117
  children.forEach((child) => {
@@ -115,8 +121,8 @@ const getElementsFromChildren = (children) => {
115
121
  const childTabs = React.Children.count(child.props.children);
116
122
  if (childTabs > 6) {
117
123
  console.warn(
118
- "We recommend to use no more than six tabs. If more than six tabs are " +
119
- "needed, consider other navigational patterns."
124
+ "Tabs: We recommend to use no more than six tabs. If more than six " +
125
+ "tabs are needed, consider other navigational patterns."
120
126
  );
121
127
  }
122
128
  }
@@ -149,9 +155,14 @@ function Tabs(props: React.PropsWithChildren<TabsProps>) {
149
155
  const mediumTabWidth = 40;
150
156
  const [tabWidth, setTabWidth] = React.useState(initTabWidth);
151
157
  const windowDimensions = useWindowSize();
152
- const { tabs, panels } = contentData
158
+ const { tabs, panels }: any = contentData
153
159
  ? getElementsFromContentData(contentData, useHash)
154
160
  : getElementsFromChildren(children);
161
+
162
+ if (tabs.length === 0 || panels.length === 0) {
163
+ console.warn("Tabs: Pass data in the `data` props or as children.");
164
+ }
165
+
155
166
  // `tabs` is an array for the children component approach but an object for
156
167
  // the `contentData` prop approach. We need to get the right props key value
157
168
  // to set the carousel's length.
@@ -173,34 +184,38 @@ function Tabs(props: React.PropsWithChildren<TabsProps>) {
173
184
  }, [goToStart, windowDimensions.width]);
174
185
  const previousButton = (
175
186
  <Button
176
- buttonType={ButtonTypes.Primary}
177
187
  attributes={{
178
188
  "aria-label": "Previous",
179
189
  ...styles.buttonArrows,
180
190
  left: "0",
181
191
  }}
192
+ buttonType={ButtonTypes.Primary}
193
+ id={`tabs-previous-${id}`}
182
194
  onClick={prevSlide}
183
195
  >
184
196
  <Icon
185
- name={IconNames.Arrow}
186
197
  iconRotation={IconRotationTypes.Rotate90}
198
+ id={`tabs-previous-icon-${id}`}
199
+ name={IconNames.Arrow}
187
200
  size={IconSizes.Small}
188
201
  />
189
202
  </Button>
190
203
  );
191
204
  const nextButton = (
192
205
  <Button
193
- buttonType={ButtonTypes.Primary}
194
206
  attributes={{
195
207
  "aria-label": "Next",
196
208
  ...styles.buttonArrows,
197
209
  right: "0",
198
210
  }}
211
+ buttonType={ButtonTypes.Primary}
212
+ id={`tabs-next-${id}`}
199
213
  onClick={nextSlide}
200
214
  >
201
215
  <Icon
202
- name={IconNames.Arrow}
203
216
  iconRotation={IconRotationTypes.Rotate270}
217
+ id={`tabs-next-icon-${id}`}
218
+ name={IconNames.Arrow}
204
219
  size={IconSizes.Small}
205
220
  />
206
221
  </Button>
@@ -208,18 +223,18 @@ function Tabs(props: React.PropsWithChildren<TabsProps>) {
208
223
 
209
224
  if (children && contentData?.length) {
210
225
  console.warn(
211
- "Only pass children or data in the `data` props but not both."
226
+ "Tabs: Only pass children or data in the `data` props but not both."
212
227
  );
213
228
  }
214
229
 
215
230
  return (
216
231
  <ChakraTabs
217
- id={id}
218
- onChange={onChange}
219
232
  defaultIndex={defaultIndex}
220
- variant="enclosed"
233
+ id={id}
221
234
  // The following lazy loads each panel whenever it is needed.
222
235
  isLazy
236
+ onChange={onChange}
237
+ variant="enclosed"
223
238
  >
224
239
  <Box
225
240
  __css={styles.tablistWrapper}
@@ -0,0 +1,195 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Tabs renders the UI snapshot correctly 1`] = `
4
+ <div
5
+ className="chakra-tabs css-0"
6
+ id="basic"
7
+ >
8
+ <div
9
+ className="css-l3f8vc"
10
+ >
11
+ <button
12
+ aria-label="Previous"
13
+ className="chakra-button css-fg6w03"
14
+ data-testid="button"
15
+ id="tabs-previous-basic"
16
+ onClick={[Function]}
17
+ type="button"
18
+ >
19
+ <svg
20
+ aria-hidden={true}
21
+ className="chakra-icon css-onkibi"
22
+ focusable={false}
23
+ id="tabs-previous-icon-basic"
24
+ role="img"
25
+ title="arrow icon"
26
+ viewBox="0 0 24 24"
27
+ >
28
+ <g
29
+ stroke="currentColor"
30
+ strokeWidth="1.5"
31
+ >
32
+ <path
33
+ d="M9,9a3,3,0,1,1,4,2.829,1.5,1.5,0,0,0-1,1.415V14.25"
34
+ fill="none"
35
+ strokeLinecap="round"
36
+ />
37
+ <path
38
+ d="M12,17.25a.375.375,0,1,0,.375.375A.375.375,0,0,0,12,17.25h0"
39
+ fill="currentColor"
40
+ strokeLinecap="round"
41
+ />
42
+ <circle
43
+ cx="12"
44
+ cy="12"
45
+ fill="none"
46
+ r="11.25"
47
+ strokeMiterlimit="10"
48
+ />
49
+ </g>
50
+ </svg>
51
+ </button>
52
+ <div
53
+ className="css-0"
54
+ >
55
+ <div
56
+ className="css-16fuzwj"
57
+ >
58
+ <div
59
+ aria-orientation="horizontal"
60
+ className="chakra-tabs__tablist css-k008qs"
61
+ onKeyDown={[Function]}
62
+ role="tablist"
63
+ >
64
+ <button
65
+ aria-controls="basic--tabpanel--1"
66
+ aria-selected={false}
67
+ className="chakra-tabs__tab css-abpfcx"
68
+ id="basic--tab--1"
69
+ onClick={[Function]}
70
+ onFocus={[Function]}
71
+ role="tab"
72
+ tabIndex={-1}
73
+ type="button"
74
+ >
75
+ Tom Nook
76
+ </button>
77
+ <button
78
+ aria-controls="basic--tabpanel--1"
79
+ aria-selected={false}
80
+ className="chakra-tabs__tab css-abpfcx"
81
+ id="basic--tab--1"
82
+ onClick={[Function]}
83
+ onFocus={[Function]}
84
+ role="tab"
85
+ tabIndex={-1}
86
+ type="button"
87
+ >
88
+ Isabelle
89
+ </button>
90
+ <button
91
+ aria-controls="basic--tabpanel--1"
92
+ aria-selected={false}
93
+ className="chakra-tabs__tab css-abpfcx"
94
+ id="basic--tab--1"
95
+ onClick={[Function]}
96
+ onFocus={[Function]}
97
+ role="tab"
98
+ tabIndex={-1}
99
+ type="button"
100
+ >
101
+ K.K. Slider
102
+ </button>
103
+ </div>
104
+ </div>
105
+ </div>
106
+ <button
107
+ aria-label="Next"
108
+ className="chakra-button css-1whvqek"
109
+ data-testid="button"
110
+ id="tabs-next-basic"
111
+ onClick={[Function]}
112
+ type="button"
113
+ >
114
+ <svg
115
+ aria-hidden={true}
116
+ className="chakra-icon css-onkibi"
117
+ focusable={false}
118
+ id="tabs-next-icon-basic"
119
+ role="img"
120
+ title="arrow icon"
121
+ viewBox="0 0 24 24"
122
+ >
123
+ <g
124
+ stroke="currentColor"
125
+ strokeWidth="1.5"
126
+ >
127
+ <path
128
+ d="M9,9a3,3,0,1,1,4,2.829,1.5,1.5,0,0,0-1,1.415V14.25"
129
+ fill="none"
130
+ strokeLinecap="round"
131
+ />
132
+ <path
133
+ d="M12,17.25a.375.375,0,1,0,.375.375A.375.375,0,0,0,12,17.25h0"
134
+ fill="currentColor"
135
+ strokeLinecap="round"
136
+ />
137
+ <circle
138
+ cx="12"
139
+ cy="12"
140
+ fill="none"
141
+ r="11.25"
142
+ strokeMiterlimit="10"
143
+ />
144
+ </g>
145
+ </svg>
146
+ </button>
147
+ </div>
148
+ <div
149
+ className="chakra-tabs__tab-panels css-8atqhb"
150
+ >
151
+ <div
152
+ aria-labelledby="basic--tab-0"
153
+ className="chakra-tabs__tab-panel css-sjt5nk"
154
+ hidden={false}
155
+ id="basic--tabpanel-0"
156
+ role="tabpanel"
157
+ tabIndex={0}
158
+ >
159
+ <p>
160
+ Tom Nook,
161
+ <b>
162
+ known in Japan as Tanukichi
163
+ </b>
164
+ , is a fictional character in the Animal Crossing series who operates the village store.
165
+ </p>
166
+ </div>
167
+ <div
168
+ aria-labelledby="basic--tab-1"
169
+ className="chakra-tabs__tab-panel css-sjt5nk"
170
+ dangerouslySetInnerHTML={
171
+ Object {
172
+ "__html": "Isabelle, known as Shizue in Japan, is a fictional character from the Animal Crossing series of video games. She is a kindly Shih Tzu that debuted in the 2012 release Animal Crossing: New Leaf, where she serves as the secretary to the player character.",
173
+ }
174
+ }
175
+ hidden={true}
176
+ id="basic--tabpanel-1"
177
+ role="tabpanel"
178
+ tabIndex={0}
179
+ />
180
+ <div
181
+ aria-labelledby="basic--tab-2"
182
+ className="chakra-tabs__tab-panel css-sjt5nk"
183
+ dangerouslySetInnerHTML={
184
+ Object {
185
+ "__html": "<p>Totakeke, more commonly known as <b>K.K. Slider or K.K.</b>, is a fictional character within the Animal Crossing franchise. One of the franchise's most popular characters, he debuted in the title Animal Crossing, and has appeared in every installment since.</p>",
186
+ }
187
+ }
188
+ hidden={true}
189
+ id="basic--tabpanel-2"
190
+ role="tabpanel"
191
+ tabIndex={0}
192
+ />
193
+ </div>
194
+ </div>
195
+ `;