@nypl/design-system-react-components 0.23.4 → 0.25.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 (307) hide show
  1. package/CHANGELOG.md +98 -1
  2. package/README.md +46 -11
  3. package/dist/components/Accordion/Accordion.d.ts +14 -14
  4. package/dist/components/Autosuggest/Autosuggest.stories.d.ts +1 -0
  5. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +11 -14
  6. package/dist/components/Breadcrumbs/BreadcrumbsTypes.d.ts +6 -0
  7. package/dist/components/Button/Button.d.ts +6 -13
  8. package/dist/components/Button/ButtonTypes.d.ts +5 -3
  9. package/dist/components/Card/Card.d.ts +59 -10
  10. package/dist/components/Card/CardTypes.d.ts +19 -0
  11. package/dist/components/CardEdition/CardEdition.d.ts +21 -0
  12. package/dist/components/{StyleGuide/Colors.stories.d.ts → CardEdition/CardEdition.stories.d.ts} +5 -2
  13. package/dist/components/Checkbox/Checkbox.d.ts +21 -16
  14. package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +43 -0
  15. package/dist/components/CheckboxGroup/CheckboxGroupLayoutTypes.d.ts +4 -0
  16. package/dist/components/DatePicker/DatePicker.d.ts +79 -0
  17. package/dist/components/DatePicker/DatePickerTypes.d.ts +5 -0
  18. package/dist/components/Form/Form.d.ts +16 -8
  19. package/dist/components/Form/FormTypes.d.ts +2 -0
  20. package/dist/components/Grid/GridTypes.d.ts +9 -0
  21. package/dist/components/Grid/SimpleGrid.d.ts +14 -0
  22. package/dist/components/Heading/Heading.d.ts +9 -11
  23. package/dist/components/Heading/{HeadingDisplaySizes.d.ts → HeadingTypes.d.ts} +8 -0
  24. package/dist/components/HelperErrorText/HelperErrorText.stories.d.ts +2 -1
  25. package/dist/components/Hero/Hero.d.ts +19 -14
  26. package/dist/components/Hero/HeroTypes.d.ts +10 -5
  27. package/dist/components/Icons/Icon.d.ts +13 -16
  28. package/dist/components/Icons/IconSvgs.d.ts +4 -0
  29. package/dist/components/Icons/IconTypes.d.ts +78 -60
  30. package/dist/components/Image/Image.stories.d.ts +2 -1
  31. package/dist/components/Label/Label.d.ts +10 -26
  32. package/dist/components/Link/Link.d.ts +8 -12
  33. package/dist/components/List/List.stories.d.ts +1 -0
  34. package/dist/components/Radio/Radio.d.ts +30 -24
  35. package/dist/components/RadioGroup/RadioGroup.d.ts +40 -0
  36. package/dist/components/RadioGroup/RadioGroupLayoutTypes.d.ts +4 -0
  37. package/dist/components/SearchBar/SearchBar.d.ts +45 -27
  38. package/dist/components/Select/Select.d.ts +34 -35
  39. package/dist/components/Select/SelectTypes.d.ts +4 -0
  40. package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +1 -1
  41. package/dist/components/SkeletonLoader/SkeletonLoaderTypes.d.ts +2 -2
  42. package/dist/components/StatusBadge/StatusBadge.d.ts +8 -6
  43. package/dist/components/StatusBadge/StatusBadgeTypes.d.ts +5 -0
  44. package/dist/components/Tabs/Tabs.d.ts +25 -0
  45. package/dist/components/Template/Template.d.ts +91 -0
  46. package/dist/components/Text/Text.d.ts +16 -0
  47. package/dist/components/Text/TextTypes.d.ts +6 -0
  48. package/dist/components/TextInput/TextInput.d.ts +37 -30
  49. package/dist/components/TextInput/TextInputTypes.d.ts +5 -0
  50. package/dist/design-system-react-components.cjs.development.js +4102 -917
  51. package/dist/design-system-react-components.cjs.development.js.map +1 -1
  52. package/dist/design-system-react-components.cjs.production.min.js +1 -1
  53. package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
  54. package/dist/design-system-react-components.esm.js +4023 -920
  55. package/dist/design-system-react-components.esm.js.map +1 -1
  56. package/dist/index.d.ts +23 -5
  57. package/dist/resources.scss +133 -24
  58. package/dist/styles.css +1 -1
  59. package/dist/theme/components/accordion.d.ts +25 -0
  60. package/dist/theme/components/breadcrumb.d.ts +90 -0
  61. package/dist/theme/components/button.d.ts +109 -0
  62. package/dist/theme/components/checkbox.d.ts +91 -0
  63. package/dist/theme/components/customCheckboxGroup.d.ts +18 -0
  64. package/dist/theme/components/customRadioGroup.d.ts +18 -0
  65. package/dist/theme/components/global.d.ts +55 -0
  66. package/dist/theme/components/globalMixins.d.ts +15 -0
  67. package/dist/theme/components/heading.d.ts +110 -0
  68. package/dist/theme/components/hero.d.ts +492 -0
  69. package/dist/theme/components/icon.d.ts +13 -0
  70. package/dist/theme/components/label.d.ts +16 -0
  71. package/dist/theme/components/link.d.ts +45 -0
  72. package/dist/theme/components/radio.d.ts +95 -0
  73. package/dist/theme/components/searchBar.d.ts +20 -0
  74. package/dist/theme/components/select.d.ts +58 -0
  75. package/dist/theme/components/statusBadge.d.ts +25 -0
  76. package/dist/theme/components/tabs.d.ts +85 -0
  77. package/dist/theme/components/template.d.ts +105 -0
  78. package/dist/theme/components/text.d.ts +20 -0
  79. package/dist/theme/components/textInput.d.ts +105 -0
  80. package/dist/theme/foundations/breakpoints.d.ts +23 -0
  81. package/dist/theme/foundations/colors.d.ts +3 -0
  82. package/dist/theme/foundations/global.d.ts +23 -0
  83. package/dist/theme/foundations/shadows.d.ts +4 -0
  84. package/dist/theme/foundations/spacing.d.ts +77 -0
  85. package/dist/theme/foundations/typography.d.ts +8 -0
  86. package/dist/theme/index.d.ts +20 -0
  87. package/dist/theme/provider.d.ts +5 -0
  88. package/dist/theme/types.d.ts +1 -0
  89. package/dist/utils/utils.d.ts +6 -0
  90. package/package.json +9 -2
  91. package/src/components/Accordion/Accordion.stories.mdx +233 -33
  92. package/src/components/Accordion/Accordion.test.tsx +135 -19
  93. package/src/components/Accordion/Accordion.tsx +81 -56
  94. package/src/components/Autosuggest/Autosuggest.stories.mdx +4 -3
  95. package/src/components/Autosuggest/Autosuggest.stories.tsx +1 -1
  96. package/src/components/Autosuggest/_Autosuggest.scss +2 -2
  97. package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +57 -56
  98. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +31 -25
  99. package/src/components/Breadcrumbs/Breadcrumbs.tsx +71 -73
  100. package/src/components/Breadcrumbs/BreadcrumbsTypes.tsx +6 -0
  101. package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +100 -0
  102. package/src/components/Button/Button.stories.mdx +125 -138
  103. package/src/components/Button/Button.test.tsx +65 -11
  104. package/src/components/Button/Button.tsx +72 -68
  105. package/src/components/Button/ButtonTypes.tsx +4 -2
  106. package/src/components/Button/_Button.scss +7 -92
  107. package/src/components/Button/__snapshots__/Button.test.tsx.snap +58 -3
  108. package/src/components/Card/Card.stories.mdx +694 -0
  109. package/src/components/Card/Card.test.tsx +97 -102
  110. package/src/components/Card/Card.tsx +182 -31
  111. package/src/components/Card/CardTypes.tsx +21 -0
  112. package/src/components/Card/_Card.scss +234 -49
  113. package/src/components/{Card/Card.stories.tsx → CardEdition/CardEdition.stories.tsx} +32 -22
  114. package/src/components/CardEdition/CardEdition.test.tsx +395 -0
  115. package/src/components/CardEdition/CardEdition.tsx +60 -0
  116. package/src/components/CardEdition/_CardEdition.scss +138 -0
  117. package/src/components/Chakra/Box.stories.mdx +57 -0
  118. package/src/components/Chakra/Center.stories.mdx +99 -0
  119. package/src/components/Chakra/Grid.stories.mdx +79 -0
  120. package/src/components/Chakra/Stack.stories.mdx +93 -0
  121. package/src/components/Checkbox/Checkbox.stories.mdx +57 -35
  122. package/src/components/Checkbox/Checkbox.test.tsx +117 -147
  123. package/src/components/Checkbox/Checkbox.tsx +76 -50
  124. package/src/components/Checkbox/__snapshots__/Checkbox.test.tsx.snap +325 -0
  125. package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +249 -0
  126. package/src/components/CheckboxGroup/CheckboxGroup.test.tsx +345 -0
  127. package/src/components/CheckboxGroup/CheckboxGroup.tsx +148 -0
  128. package/src/components/CheckboxGroup/CheckboxGroupLayoutTypes.tsx +4 -0
  129. package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +1360 -0
  130. package/src/components/DatePicker/DatePicker.stories.mdx +284 -0
  131. package/src/components/DatePicker/DatePicker.test.tsx +657 -0
  132. package/src/components/DatePicker/DatePicker.tsx +396 -0
  133. package/src/components/DatePicker/DatePickerTypes.tsx +5 -0
  134. package/src/components/DatePicker/_DatePicker.scss +76 -0
  135. package/src/components/Form/Form.stories.mdx +130 -27
  136. package/src/components/Form/Form.test.tsx +78 -36
  137. package/src/components/Form/Form.tsx +53 -19
  138. package/src/components/Form/FormTypes.tsx +3 -0
  139. package/src/components/Form/__snapshots__/Form.test.tsx.snap +38 -0
  140. package/src/components/Grid/GridTypes.tsx +9 -0
  141. package/src/components/Grid/SimpleGrid.stories.mdx +275 -0
  142. package/src/components/Grid/SimpleGrid.test.tsx +66 -0
  143. package/src/components/Grid/SimpleGrid.tsx +37 -0
  144. package/src/components/Grid/__snapshots__/SimpleGrid.test.tsx.snap +8 -0
  145. package/src/components/Heading/Heading.stories.mdx +63 -33
  146. package/src/components/Heading/Heading.test.tsx +24 -16
  147. package/src/components/Heading/Heading.tsx +54 -38
  148. package/src/components/Heading/{HeadingDisplaySizes.tsx → HeadingTypes.tsx} +9 -0
  149. package/src/components/HelperErrorText/HelperErrorText.stories.tsx +2 -1
  150. package/src/components/HelperErrorText/_HelperErrorText.scss +1 -1
  151. package/src/components/Hero/Hero.stories.mdx +195 -85
  152. package/src/components/Hero/Hero.test.tsx +544 -113
  153. package/src/components/Hero/Hero.tsx +80 -93
  154. package/src/components/Hero/HeroTypes.tsx +17 -5
  155. package/src/components/Hero/__snapshots__/Hero.test.tsx.snap +307 -0
  156. package/src/components/HorizontalRule/HorizontalRule.stories.mdx +6 -1
  157. package/src/components/HorizontalRule/_HorizontalRule.scss +1 -1
  158. package/src/components/Icons/Icon.stories.mdx +89 -74
  159. package/src/components/Icons/Icon.test.tsx +30 -22
  160. package/src/components/Icons/Icon.tsx +63 -61
  161. package/src/components/Icons/IconSvgs.tsx +8 -0
  162. package/src/components/Icons/IconTypes.tsx +80 -60
  163. package/src/components/Image/Image.stories.tsx +2 -1
  164. package/src/components/Input/_Input.scss +2 -2
  165. package/src/components/Label/Label.stories.mdx +77 -0
  166. package/src/components/Label/Label.test.tsx +43 -12
  167. package/src/components/Label/Label.tsx +28 -45
  168. package/src/components/Label/__snapshots__/Label.test.tsx.snap +41 -0
  169. package/src/components/Link/Link.stories.mdx +47 -41
  170. package/src/components/Link/Link.test.tsx +33 -44
  171. package/src/components/Link/Link.tsx +114 -100
  172. package/src/components/List/List.stories.mdx +7 -3
  173. package/src/components/List/List.stories.tsx +14 -9
  174. package/src/components/List/List.test.tsx +12 -8
  175. package/src/components/List/List.tsx +9 -7
  176. package/src/components/List/_List.scss +3 -3
  177. package/src/components/Modal/Modal.stories.mdx +7 -3
  178. package/src/components/Modal/_Modal.scss +1 -1
  179. package/src/components/Notification/Notification.stories.mdx +99 -65
  180. package/src/components/Notification/Notification.test.tsx +3 -16
  181. package/src/components/Notification/Notification.tsx +12 -12
  182. package/src/components/Notification/_Notification.scss +5 -4
  183. package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +1 -1
  184. package/src/components/Pagination/Pagination.stories.mdx +7 -1
  185. package/src/components/Pagination/Pagination.test.tsx +16 -10
  186. package/src/components/Radio/Radio.stories.mdx +57 -46
  187. package/src/components/Radio/Radio.test.tsx +92 -138
  188. package/src/components/Radio/Radio.tsx +70 -69
  189. package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +250 -0
  190. package/src/components/RadioGroup/RadioGroup.stories.mdx +247 -0
  191. package/src/components/RadioGroup/RadioGroup.test.tsx +327 -0
  192. package/src/components/RadioGroup/RadioGroup.tsx +154 -0
  193. package/src/components/RadioGroup/RadioGroupLayoutTypes.tsx +4 -0
  194. package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +1101 -0
  195. package/src/components/SearchBar/SearchBar.Test.tsx +151 -16
  196. package/src/components/SearchBar/SearchBar.stories.mdx +196 -224
  197. package/src/components/SearchBar/SearchBar.tsx +151 -46
  198. package/src/components/Select/Select.stories.mdx +193 -168
  199. package/src/components/Select/Select.test.tsx +129 -324
  200. package/src/components/Select/Select.tsx +120 -160
  201. package/src/components/Select/SelectTypes.tsx +4 -0
  202. package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +18 -29
  203. package/src/components/SkeletonLoader/SkeletonLoader.test.tsx +7 -7
  204. package/src/components/SkeletonLoader/SkeletonLoader.tsx +4 -2
  205. package/src/components/SkeletonLoader/SkeletonLoaderTypes.tsx +2 -2
  206. package/src/components/SkeletonLoader/_SkeletonLoader.scss +3 -3
  207. package/src/components/StatusBadge/StatusBadge.stories.mdx +91 -0
  208. package/src/components/StatusBadge/StatusBadge.test.tsx +35 -7
  209. package/src/components/StatusBadge/StatusBadge.tsx +24 -25
  210. package/src/components/StatusBadge/StatusBadgeTypes.tsx +5 -0
  211. package/src/components/StatusBadge/__snapshots__/StatusBadge.test.tsx.snap +28 -0
  212. package/src/components/StyleGuide/Bidirectionality.stories.mdx +112 -90
  213. package/src/components/StyleGuide/Buttons.stories.mdx +98 -100
  214. package/src/components/StyleGuide/Colors.stories.mdx +336 -0
  215. package/src/components/StyleGuide/Forms.stories.mdx +85 -0
  216. package/src/components/StyleGuide/Iconography.stories.mdx +86 -93
  217. package/src/components/StyleGuide/Spacing.stories.mdx +0 -1
  218. package/src/components/StyleGuide/Typography.stories.mdx +164 -166
  219. package/src/components/StyleGuide/UIDocCard.tsx +4 -4
  220. package/src/components/Tabs/Tabs.stories.mdx +221 -0
  221. package/src/components/Tabs/Tabs.test.tsx +264 -0
  222. package/src/components/Tabs/Tabs.tsx +220 -0
  223. package/src/components/Template/Template.stories.mdx +574 -0
  224. package/src/components/Template/Template.test.tsx +124 -0
  225. package/src/components/Template/Template.tsx +226 -0
  226. package/src/components/Text/Text.stories.mdx +70 -0
  227. package/src/components/Text/Text.test.tsx +63 -0
  228. package/src/components/Text/Text.tsx +55 -0
  229. package/src/components/Text/TextTypes.tsx +6 -0
  230. package/src/components/Text/__snapshots__/Text.test.tsx.snap +33 -0
  231. package/src/components/TextInput/TextInput.stories.mdx +90 -90
  232. package/src/components/TextInput/TextInput.test.tsx +103 -83
  233. package/src/components/TextInput/TextInput.tsx +108 -91
  234. package/src/components/TextInput/TextInputTypes.tsx +6 -0
  235. package/src/components/VideoPlayer/VideoPlayer.stories.mdx +2 -1
  236. package/src/components/VideoPlayer/VideoPlayer.tsx +4 -2
  237. package/src/components/VideoPlayer/_VideoPlayer.scss +1 -1
  238. package/src/docs/Chakra.stories.mdx +341 -0
  239. package/src/docs/Intro.stories.mdx +31 -24
  240. package/src/index.ts +70 -5
  241. package/src/styles/01-colors/_colors-brand.scss +6 -4
  242. package/src/styles/01-colors/_colors-utility.scss +14 -15
  243. package/src/styles/03-space/_space-inline.scss +47 -7
  244. package/src/styles/03-space/_space-inset.scss +33 -5
  245. package/src/styles/03-space/_space-stack.scss +48 -8
  246. package/src/styles/base/_02-breakpoints.scss +5 -4
  247. package/src/styles/base/_04-base.scss +2 -1
  248. package/src/styles/base/_place-holder.scss +1 -1
  249. package/src/styles/base/_typography.scss +1 -29
  250. package/src/styles.scss +22 -25
  251. package/src/theme/components/accordion.ts +30 -0
  252. package/src/theme/components/breadcrumb.ts +77 -0
  253. package/src/theme/components/button.ts +125 -0
  254. package/src/theme/components/checkbox.ts +107 -0
  255. package/src/theme/components/customCheckboxGroup.ts +12 -0
  256. package/src/theme/components/customRadioGroup.ts +12 -0
  257. package/src/theme/components/global.ts +71 -0
  258. package/src/theme/components/globalMixins.ts +16 -0
  259. package/src/theme/components/heading.ts +72 -0
  260. package/src/theme/components/hero.ts +239 -0
  261. package/src/theme/components/icon.ts +79 -0
  262. package/src/theme/components/label.ts +17 -0
  263. package/src/theme/components/link.ts +47 -0
  264. package/src/theme/components/radio.ts +106 -0
  265. package/src/theme/components/searchBar.ts +21 -0
  266. package/src/theme/components/select.ts +50 -0
  267. package/src/theme/components/statusBadge.ts +27 -0
  268. package/src/theme/components/tabs.ts +79 -0
  269. package/src/theme/components/template.ts +114 -0
  270. package/src/theme/components/text.ts +31 -0
  271. package/src/theme/components/textInput.ts +61 -0
  272. package/src/theme/foundations/breakpoints.ts +24 -0
  273. package/src/theme/foundations/colors.ts +208 -0
  274. package/src/theme/foundations/global.ts +26 -0
  275. package/src/theme/foundations/shadows.ts +5 -0
  276. package/src/theme/foundations/spacing.ts +85 -0
  277. package/src/theme/foundations/typography.ts +35 -0
  278. package/src/theme/index.ts +88 -0
  279. package/src/theme/provider.tsx +9 -0
  280. package/src/theme/types.ts +1 -0
  281. package/src/utils/componentCategories.ts +56 -21
  282. package/src/utils/utils.ts +13 -0
  283. package/dist/components/Accordion/Accordion.stories.d.ts +0 -5
  284. package/dist/components/Card/Card.stories.d.ts +0 -27
  285. package/dist/components/Label/Label.stories.d.ts +0 -12
  286. package/dist/components/StatusBadge/StatusBadge.stories.d.ts +0 -8
  287. package/dist/components/Template/Template.stories.d.ts +0 -29
  288. package/src/components/Accordion/Accordion.stories.tsx +0 -65
  289. package/src/components/Accordion/_Accordion.scss +0 -81
  290. package/src/components/Breadcrumbs/_Breadcrumbs.scss +0 -97
  291. package/src/components/Checkbox/_Checkbox.scss +0 -97
  292. package/src/components/Form/_Form.scss +0 -28
  293. package/src/components/Heading/_Heading.scss +0 -163
  294. package/src/components/Hero/_Hero.scss +0 -256
  295. package/src/components/Icons/_Icons.scss +0 -116
  296. package/src/components/Label/Label.stories.tsx +0 -30
  297. package/src/components/Label/_Label.scss +0 -22
  298. package/src/components/Link/_Link.scss +0 -73
  299. package/src/components/Radio/_Radio.scss +0 -84
  300. package/src/components/SearchBar/_SearchBar.scss +0 -16
  301. package/src/components/Select/_Select.scss +0 -82
  302. package/src/components/StatusBadge/StatusBadge.stories.tsx +0 -33
  303. package/src/components/StatusBadge/_StatusBadge.scss +0 -23
  304. package/src/components/StyleGuide/Colors.stories.tsx +0 -288
  305. package/src/components/Template/Template.stories.tsx +0 -85
  306. package/src/components/Template/_Template.scss +0 -63
  307. package/src/components/TextInput/_TextInput.scss +0 -59
@@ -2,15 +2,46 @@ import * as React from "react";
2
2
  import { render, screen } from "@testing-library/react";
3
3
  import { axe } from "jest-axe";
4
4
  import userEvent from "@testing-library/user-event";
5
+ import renderer from "react-test-renderer";
5
6
 
6
- import Button from "../Button/Button";
7
- import { ButtonTypes } from "../Button/ButtonTypes";
8
7
  import SearchBar from "./SearchBar";
9
8
 
9
+ const optionsGroup = [
10
+ "Art",
11
+ "Bushes",
12
+ "Clothing",
13
+ "Flowers",
14
+ "Fossils",
15
+ "Fruits",
16
+ "Furniture",
17
+ "Songs",
18
+ "Tools",
19
+ "Villagers",
20
+ ];
21
+ const selectProps = {
22
+ name: "nhItemSearch",
23
+ labelText: "Select a category",
24
+ optionsData: optionsGroup,
25
+ };
26
+ const textInputProps = {
27
+ labelText: "Item Search",
28
+ placeholder: "Item Search",
29
+ };
30
+ const helperErrorText = "Search for items in Animal Crossing New Horizons";
31
+ const invalidText = "Could not find the item :(";
32
+
10
33
  describe("SearchBar Accessibility", () => {
11
34
  it("passes axe accessibility test", async () => {
12
35
  const { container } = render(
13
- <SearchBar id="id" ariaLabel="searchbar" onSubmit={jest.fn()} />
36
+ <SearchBar
37
+ id="id"
38
+ labelText="Searchbar"
39
+ onSubmit={jest.fn()}
40
+ selectProps={selectProps}
41
+ textInputProps={textInputProps}
42
+ helperErrorText={helperErrorText}
43
+ invalidText={invalidText}
44
+ />
14
45
  );
15
46
  expect(await axe(container)).toHaveNoViolations();
16
47
  });
@@ -20,32 +51,136 @@ describe("SearchBar", () => {
20
51
  const searchBarSubmit = jest.fn();
21
52
  const buttonCallback = jest.fn();
22
53
 
23
- it("Renders SearchBar", () => {
54
+ it("renders the basic form", () => {
24
55
  render(
25
- <SearchBar id="id" ariaLabel="searchbar" onSubmit={searchBarSubmit} />
56
+ <SearchBar
57
+ id="id"
58
+ labelText="searchbar"
59
+ onSubmit={searchBarSubmit}
60
+ textInputProps={textInputProps}
61
+ helperErrorText={helperErrorText}
62
+ />
26
63
  );
27
64
  expect(screen.getByRole("search")).toBeInTheDocument();
28
65
  expect(screen.getByRole("search")).toHaveAttribute(
29
66
  "aria-label",
30
67
  "searchbar"
31
68
  );
69
+ expect(screen.getByPlaceholderText("Item Search")).toBeInTheDocument();
70
+ expect(screen.getByRole("button")).toBeInTheDocument();
71
+ });
72
+
73
+ it("renders an optional Select component", () => {
74
+ render(
75
+ <SearchBar
76
+ id="id"
77
+ labelText="searchbar"
78
+ onSubmit={searchBarSubmit}
79
+ selectProps={selectProps}
80
+ textInputProps={textInputProps}
81
+ helperErrorText={helperErrorText}
82
+ />
83
+ );
84
+ expect(screen.getByRole("combobox")).toBeInTheDocument();
85
+ expect(screen.getByLabelText("Select a category")).toBeInTheDocument();
86
+ });
87
+
88
+ it("renders the invalid text in the invalid state", () => {
89
+ render(
90
+ <SearchBar
91
+ id="id"
92
+ labelText="searchbar"
93
+ onSubmit={searchBarSubmit}
94
+ selectProps={selectProps}
95
+ textInputProps={textInputProps}
96
+ helperErrorText={helperErrorText}
97
+ invalidText={invalidText}
98
+ isInvalid
99
+ />
100
+ );
101
+ expect(screen.getByText(invalidText)).toBeInTheDocument();
102
+ expect(screen.queryByText(helperErrorText)).not.toBeInTheDocument();
32
103
  });
33
104
 
34
- it("Search Bar calls call back on Submit ", () => {
105
+ it("calls the callback function on submit ", () => {
35
106
  render(
36
- <SearchBar ariaLabel="searchBar" id="id" onSubmit={searchBarSubmit}>
37
- <Button
38
- buttonType={ButtonTypes.Primary}
39
- id="button"
40
- onClick={buttonCallback}
41
- type="submit"
42
- >
43
- Search
44
- </Button>
45
- </SearchBar>
107
+ <SearchBar
108
+ labelText="searchBar"
109
+ id="id"
110
+ onSubmit={searchBarSubmit}
111
+ selectProps={selectProps}
112
+ textInputProps={textInputProps}
113
+ helperErrorText={helperErrorText}
114
+ />
46
115
  );
47
116
  expect(searchBarSubmit).toHaveBeenCalledTimes(0);
117
+ expect(buttonCallback).toHaveBeenCalledTimes(0);
48
118
  userEvent.click(screen.getByRole("button"));
49
119
  expect(searchBarSubmit).toHaveBeenCalledTimes(1);
120
+ expect(buttonCallback).toHaveBeenCalledTimes(1);
121
+ });
122
+
123
+ it("Renders the UI snapshot correctly", () => {
124
+ const basic = renderer
125
+ .create(
126
+ <SearchBar
127
+ id="id"
128
+ labelText="searchbar"
129
+ onSubmit={jest.fn()}
130
+ textInputProps={textInputProps}
131
+ helperErrorText={helperErrorText}
132
+ />
133
+ )
134
+ .toJSON();
135
+ const withSelect = renderer
136
+ .create(
137
+ <SearchBar
138
+ id="id"
139
+ labelText="searchbar"
140
+ onSubmit={jest.fn()}
141
+ selectProps={selectProps}
142
+ textInputProps={textInputProps}
143
+ helperErrorText={helperErrorText}
144
+ />
145
+ )
146
+ .toJSON();
147
+ const withoutHelperText = renderer
148
+ .create(
149
+ <SearchBar
150
+ id="id"
151
+ labelText="searchbar"
152
+ onSubmit={jest.fn()}
153
+ textInputProps={textInputProps}
154
+ />
155
+ )
156
+ .toJSON();
157
+ const invalidState = renderer
158
+ .create(
159
+ <SearchBar
160
+ id="id"
161
+ labelText="searchbar"
162
+ onSubmit={jest.fn()}
163
+ textInputProps={textInputProps}
164
+ isInvalid
165
+ />
166
+ )
167
+ .toJSON();
168
+ const disabledState = renderer
169
+ .create(
170
+ <SearchBar
171
+ id="id"
172
+ labelText="searchbar"
173
+ onSubmit={jest.fn()}
174
+ textInputProps={textInputProps}
175
+ isDisabled
176
+ />
177
+ )
178
+ .toJSON();
179
+
180
+ expect(basic).toMatchSnapshot();
181
+ expect(withSelect).toMatchSnapshot();
182
+ expect(withoutHelperText).toMatchSnapshot();
183
+ expect(invalidState).toMatchSnapshot();
184
+ expect(disabledState).toMatchSnapshot();
50
185
  });
51
186
  });
@@ -2,21 +2,15 @@ import {
2
2
  Meta,
3
3
  Story,
4
4
  ArgsTable,
5
- Preview,
5
+ Canvas,
6
6
  Description,
7
7
  } from "@storybook/addon-docs/blocks";
8
8
  import { withDesign } from "storybook-addon-designs";
9
+
9
10
  import SearchBar from "./SearchBar";
10
- import Select from "../Select/Select";
11
- import HelperErrorText from "../HelperErrorText/HelperErrorText";
12
- import Button from "../Button/Button";
13
- import { ButtonTypes } from "../Button/ButtonTypes";
14
- import Icon from "../Icons/Icon";
15
- import { IconNames } from "../Icons/IconTypes";
16
- import Input from "../Input/Input";
17
- import { InputTypes } from "../Input/InputTypes";
18
11
  import * as stories from "../Autosuggest/Autosuggest.stories.tsx";
19
12
  import { getCategory } from "../../utils/componentCategories";
13
+ import DSProvider from "../../theme/provider";
20
14
 
21
15
  <Meta
22
16
  title={getCategory("SearchBar")}
@@ -31,9 +25,16 @@ import { getCategory } from "../../utils/componentCategories";
31
25
  jest: ["SearchBar.test.tsx"],
32
26
  }}
33
27
  argTypes={{
34
- blockName: {
35
- table: { disable: true },
36
- },
28
+ action: { table: { disable: true } },
29
+ ariaLabel: { table: { disable: true } },
30
+ buttonOnClick: { table: { disable: true } },
31
+ className: { table: { disable: true } },
32
+ id: { table: { disable: true } },
33
+ method: { table: { disable: true } },
34
+ onSubmit: { table: { disable: true } },
35
+ selectProps: { table: { disable: true } },
36
+ textInputProps: { table: { disable: true } },
37
+ textInputElement: { table: { disable: true } },
37
38
  }}
38
39
  />
39
40
 
@@ -41,178 +42,183 @@ import { getCategory } from "../../utils/componentCategories";
41
42
 
42
43
  <Description of={SearchBar} />
43
44
 
44
- The main wrapper element that is rendered is `<form>` DOM element. All the props
45
- passed to `SearchBar` will apply to the `<form>` element. If you need to update
46
- the children, make sure the props are passed to the appropriate components.
45
+ The main wrapper element that is rendered is a `<form>` DOM element. All the
46
+ props passed to `SearchBar` will apply to the `<form>` element and its children.
47
+ The `SearchBar` component will render a `Select` component (optional),
48
+ `TextInput` component, `Button` component, and `HelperErrorText` component
49
+ based on the required props.
47
50
 
48
51
  The `Select` dropdown narrows the search within a specific category, typically
49
- title or author. You should only have one `Select` component at a time. If you
50
- need more options, link to the advance search page. Toggle the `Select` through
51
- the Controls.
52
-
53
- _Note: The `HelperErrorText` component should be the next direct sibling of the
54
- `SearchBar` component if it will be used._
55
-
56
- export const optionsGroup = {
57
- Art: [
58
- "Academic Painting",
59
- "Amazing Painting",
60
- "Ancient Statue",
61
- "Basic Painting",
62
- "Beautiful Statue",
63
- ],
64
- Bushes: [
65
- "Blue-Hydrangea Bush",
66
- "Blue-Hydrangea Start",
67
- "Holly Bush",
68
- "Orange-Tea-Olive Bush",
69
- "Pink Camellia Bush",
70
- ],
71
- Clothing: ["3D Glasses", "Academy Uniform", "Acid-Washed Jacket"],
72
- "DIY Recipes": ["Acorn Pochette", "Acoustic Guitar", "Angled Signpost"],
73
- Flowers: [
74
- "Black Cosmos",
75
- "Blue Pansies",
76
- "Gold Roses",
77
- "Lily of the Valley",
78
- "Orange Hyacinth",
79
- ],
80
- Fossils: [
81
- "Acanthostega",
82
- "Amber",
83
- "Ammonite",
84
- "Ankylo Skull",
85
- "Anomalocaris",
86
- "Australopith",
87
- ],
88
- Fruits: ["Apples", "Oranges", "Pears", "Coconuts", "Cherries"],
89
- Furniture: [
90
- "Abstract Wall",
91
- "Accessories Stand",
92
- "ACNH Switch",
93
- "Air Circulator",
94
- ],
95
- Materials: [
96
- "Acorn",
97
- "Aquaris Fragment",
98
- "Bamboo Piece",
99
- "Boot",
100
- "Clump of Weeds",
101
- ],
102
- NPC: ["Celeste", "Kicks", "Leif", "Redd", "Saharah"],
103
- Songs: ["Agent K.K.", "Café K.K.", "Comrade K.K."],
104
- Tools: [
105
- "Axe",
106
- "Bamboo Wand",
107
- "Fishing Rod",
108
- "Shovel",
109
- "Slingshot",
110
- "Watering Can",
111
- ],
112
- Villagers: ["Agnes", "Alfonso", "Anchovy", "Axel", "Aurora"],
113
- };
52
+ title or author. Toggle the `Select` through the Controls.
114
53
 
115
- <Preview withToolbar>
54
+ export const optionsGroup = [
55
+ "Art",
56
+ "Bushes",
57
+ "Clothing",
58
+ "Flowers",
59
+ "Fossils",
60
+ "Fruits",
61
+ "Furniture",
62
+ "Songs",
63
+ "Tools",
64
+ "Villagers",
65
+ ];
66
+
67
+ <Canvas withToolbar>
116
68
  <Story
117
69
  name="Basic"
118
70
  args={{
119
71
  showHelperText: true,
120
72
  showSelect: true,
121
- isErrorState: false,
122
- disabledButton: false,
73
+ invalidText: "Could not find the item :(",
74
+ isDisabled: false,
75
+ isInvalid: false,
76
+ isRequired: false,
77
+ helperErrorText: "Search for items in Animal Crossing New Horizons",
123
78
  }}
124
79
  >
125
80
  {(args) => (
126
- <div>
127
- <SearchBar {...args}>
128
- {args.showSelect && (
129
- <Select
130
- name="nhItemSearch"
131
- ariaLabel="Filter Search"
132
- id="select-searchBar"
133
- isRequired={false}
134
- >
135
- {Object.keys(optionsGroup).map((nhOption) => (
136
- <option key={nhOption} aria-selected={false}>
137
- {nhOption}
138
- </option>
139
- ))}
140
- </Select>
141
- )}
142
- <Input
143
- id="inputBasic"
144
- ariaLabelledBy="buttonBasic"
145
- placeholder="Item Search"
146
- required={true}
147
- type={InputTypes.text}
148
- attributes={{
149
- ["aria-describedby"]: "helperTextBasic",
150
- }}
151
- errored={args.isErrorState}
152
- />
153
- <Button
154
- buttonType={ButtonTypes.Primary}
155
- id="buttonBasic"
156
- type="submit"
157
- disabled={args.disabledButton}
158
- >
159
- <Icon
160
- name={IconNames.search}
161
- decorative={true}
162
- modifiers={["small", "icon-left"]}
163
- />
164
- Search
165
- </Button>
166
- </SearchBar>
167
- {args.showHelperText && (
168
- <HelperErrorText id="helperTextBasic" isError={args.isErrorState}>
169
- Search for items in Animal Crossing New Horizons
170
- </HelperErrorText>
171
- )}
172
- </div>
81
+ <SearchBar
82
+ onSubmit={() => {}}
83
+ {...args}
84
+ selectProps={
85
+ args.showSelect && {
86
+ name: "nhItemSearch",
87
+ labelText: "Select a category",
88
+ optionsData: optionsGroup,
89
+ }
90
+ }
91
+ textInputProps={{
92
+ labelText: "Item Search",
93
+ placeholder: "Item Search",
94
+ }}
95
+ helperErrorText={args.showHelperText && args.helperErrorText}
96
+ />
173
97
  )}
174
98
  </Story>
175
- </Preview>
99
+ </Canvas>
176
100
 
177
101
  <ArgsTable story="Basic" />
178
102
 
103
+ ## Component Props
104
+
105
+ ### Select Component
106
+
107
+ To render an optional `Select` component, an object must be passed to the
108
+ `selectProps` prop. It _must_ include `name`, `labelText`, and `optionsData`
109
+ properties. The `labelText` value won't be rendered but will be used for its
110
+ `aria-label` attribute.
111
+
112
+ ```
113
+ const selectProps = {
114
+ name: "select-form-name",
115
+ labelText: "Select a category",
116
+ optionsData: optionsGroup,
117
+ };
118
+
119
+ // ...
120
+ <SearchBar
121
+ onSubmit={() => {}}
122
+ selectProps={selectProps}
123
+ // ...
124
+ />
125
+ ```
126
+
127
+ ### TextInput Component
128
+
129
+ To render the `TextInput` component, an object must be passed to the
130
+ `textInputProps` prop. It _must_ include `labelText` and `placeholder`
131
+ properties. The `labelText` value won't be rendered but will be used for its
132
+ `aria-label` attribute.
133
+
134
+ ```
135
+ const textInputProps = {
136
+ labelText: "Item Search",
137
+ placeholder: "Item Search",
138
+ };
139
+
140
+ // ...
141
+ <SearchBar
142
+ onSubmit={() => {}}
143
+ textInputProps={textInputProps}
144
+ // ...
145
+ />
146
+ ```
147
+
148
+ ### Custom Input Component
149
+
150
+ To render a custom input component, pass the component to the `textInputElement`
151
+ prop. This will render your custom input component such as an `Autocomplete`
152
+ component. Check the "Search Autocomplete" example for more details.
153
+
154
+ ```
155
+ const textInputElement = <CustomInput {...props} />;
156
+
157
+ // ...
158
+ <SearchBar
159
+ onSubmit={() => {}}
160
+ textInputElement={textInputElement}
161
+ // ...
162
+ />
163
+ ```
164
+
165
+ ### Button Component
166
+
167
+ A `Button` component will automatically be rendered for the `SearchBar`
168
+ component. If you want to pass a callback function to the `Button`, use the
169
+ `buttonOnClick` prop.
170
+
171
+ ### HelperErrorText Component
172
+
173
+ To render the `HelperErrorText` component, pass a string value to the
174
+ `helperErrorText` prop. For the invalid state when `isInvalid` is true, pass the
175
+ error string in the `invalidText` prop.
176
+
177
+ ```
178
+ const helperErrorText = "";
179
+
180
+ // ...
181
+ <SearchBar
182
+ onSubmit={() => {}}
183
+ helperErrorText="Search for items in Animal Crossing New Horizons"
184
+ // ...
185
+ />
186
+ ```
187
+
179
188
  ## Search Autocomplete
180
189
 
181
190
  While the Design System does not implement an `Autosuggest` or `Autocomplete`
182
191
  component, it does show a pattern for using the `react-autosuggest` package.
183
192
  In this example, we're using the `react-autosuggest` example found in the
184
193
  [Basic Autosuggest story](https://nypl.github.io/nypl-design-system/storybook-static/?path=/story/autosuggest--autosuggest-library)
185
- as the main component inside the `SearchBar` component. See the combination of
186
- the Autosuggest story along with this story to see how to compose all the
187
- components together.
194
+ as the main component inside the `SearchBar` component.
195
+
196
+ In order to render this custom input element in the `SearchBar` component, pass
197
+ it in the `textInputElement` prop. Do not pass an object to the `textInputProps`
198
+ prop since the custom input component passed in `textInputElement` will take
199
+ precedence.
188
200
 
189
- <Preview withToolbar>
190
- <Story name="Search Autocomplete">
201
+ <Canvas withToolbar>
202
+ <Story
203
+ name="Search Autocomplete"
204
+ args={{
205
+ isInvalid: false,
206
+ isDisabled: false,
207
+ isRequired: false,
208
+ }}
209
+ >
191
210
  {(args) => (
192
211
  <div style={{ minHeight: "150px" }}>
193
- <SearchBar {...args}>
194
- {stories.SearchBarExample()}
195
- <Button
196
- buttonType={ButtonTypes.Primary}
197
- id="autosuggest-button"
198
- type="submit"
199
- >
200
- <Icon
201
- name={IconNames.search}
202
- decorative={true}
203
- modifiers={["small", "icon-left"]}
204
- />
205
- Search
206
- </Button>
207
- </SearchBar>
208
- <HelperErrorText id="autosuggest-helperText" isError={false}>
209
- Select your home library. Start by typing the name of the library. Try{" "}
210
- {'"'}ba{'"'}.
211
- </HelperErrorText>
212
+ <SearchBar
213
+ onSubmit={() => {}}
214
+ textInputElement={stories.SearchBarExample()}
215
+ helperErrorText="Select your home library. Start by typing the name of the library. Try 'ba'."
216
+ {...args}
217
+ />
212
218
  </div>
213
219
  )}
214
220
  </Story>
215
- </Preview>
221
+ </Canvas>
216
222
 
217
223
  ## Other Examples
218
224
 
@@ -221,75 +227,41 @@ Here are the same possible states of the `SearchBar` component in static example
221
227
 
222
228
  ### Error State
223
229
 
224
- For the error state, make sure that the `errored` prop is passed to the `Input`
225
- component and the `isError` prop is passed to the `HelperErrorText` component.
226
-
227
- <Preview>
228
- <div>
229
- <SearchBar>
230
- <Input
231
- ariaLabelledBy="button-error-state"
232
- id="input-error"
233
- placeholder="Item Search"
234
- required={true}
235
- type={InputTypes.text}
236
- errored={true}
237
- attributes={{
238
- ["aria-describedby"]: "error-helperText",
239
- }}
240
- />
241
- <Button
242
- buttonType={ButtonTypes.Primary}
243
- id="button-error-state"
244
- type="submit"
245
- >
246
- <Icon
247
- name={IconNames.search}
248
- decorative={true}
249
- modifiers={["small", "icon-left"]}
250
- />
251
- Search
252
- </Button>
253
- </SearchBar>
254
- <HelperErrorText id="error-helperText" isError={true}>
255
- Sorry, we can't find that item!
256
- </HelperErrorText>
257
- </div>
258
- </Preview>
230
+ For the error state, set the `isInvalid` prop to `true`. This will update the
231
+ state for all its children. If you passed a custom input element, you must
232
+ handle the error state yourself.
259
233
 
260
- <br />
234
+ <Canvas>
235
+ <DSProvider>
236
+ <SearchBar
237
+ onSubmit={() => {}}
238
+ textInputProps={{
239
+ labelText: "Item Search",
240
+ placeholder: "Item Search",
241
+ }}
242
+ helperErrorText="Sorry, we can't find that item!"
243
+ invalidText="Could not find the item :("
244
+ isInvalid
245
+ />
246
+ </DSProvider>
247
+ </Canvas>
261
248
 
262
249
  ### Disabled State
263
250
 
264
- For the disabled state, make sure to pass the `disabled` prop to the
265
- `Button` component.
266
-
267
- <Preview>
268
- <div>
269
- <SearchBar>
270
- <Input
271
- ariaLabelledBy="button-disabled"
272
- id="input-disabled"
273
- placeholder="Item Search"
274
- required={true}
275
- type={InputTypes.text}
276
- />
277
- <Button
278
- buttonType={ButtonTypes.Primary}
279
- id="button-disabled"
280
- type="submit"
281
- disabled={true}
282
- >
283
- <Icon
284
- name={IconNames.search}
285
- decorative={true}
286
- modifiers={["small", "icon-left"]}
287
- />
288
- Search
289
- </Button>
290
- </SearchBar>
291
- <HelperErrorText id="error-disabled">
292
- Reason for disabled state.
293
- </HelperErrorText>
294
- </div>
295
- </Preview>
251
+ For the disabled state, set the `isDisabled` prop to `true`. This will update
252
+ the state for all its children. If you passed a custom input element, you must
253
+ handle the disabled state yourself.
254
+
255
+ <Canvas>
256
+ <DSProvider>
257
+ <SearchBar
258
+ obSubmit={() => {}}
259
+ textInputProps={{
260
+ labelText: "Item Search",
261
+ placeholder: "Item Search",
262
+ }}
263
+ helperErrorText="Reason for disabled state."
264
+ isDisabled
265
+ />
266
+ </DSProvider>
267
+ </Canvas>