@nypl/design-system-react-components 0.25.9 → 0.25.10

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 (78) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/dist/components/DatePicker/DatePicker.d.ts +1 -1
  3. package/dist/components/Fieldset/Fieldset.d.ts +1 -3
  4. package/dist/components/Form/Form.d.ts +13 -12
  5. package/dist/components/Form/FormTypes.d.ts +2 -2
  6. package/dist/components/HorizontalRule/HorizontalRule.d.ts +1 -1
  7. package/dist/components/RadioGroup/RadioGroup.d.ts +3 -3
  8. package/dist/components/SearchBar/SearchBar.d.ts +5 -5
  9. package/dist/components/Table/Table.d.ts +9 -3
  10. package/dist/components/Template/Template.d.ts +23 -4
  11. package/dist/design-system-react-components.cjs.development.js +197 -89
  12. package/dist/design-system-react-components.cjs.development.js.map +1 -1
  13. package/dist/design-system-react-components.cjs.production.min.js +1 -1
  14. package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
  15. package/dist/design-system-react-components.esm.js +186 -91
  16. package/dist/design-system-react-components.esm.js.map +1 -1
  17. package/dist/index.d.ts +4 -4
  18. package/dist/resources.scss +0 -2
  19. package/dist/theme/components/breadcrumb.d.ts +1 -1
  20. package/dist/theme/components/customTable.d.ts +12 -3
  21. package/package.json +40 -36
  22. package/src/components/Accordion/Accordion.stories.mdx +1 -1
  23. package/src/components/Accordion/Accordion.test.tsx +45 -1
  24. package/src/components/Accordion/Accordion.tsx +20 -8
  25. package/src/components/Accordion/__snapshots__/Accordion.test.tsx.snap +243 -0
  26. package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +13 -2
  27. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +15 -0
  28. package/src/components/Breadcrumbs/Breadcrumbs.tsx +9 -3
  29. package/src/components/Breadcrumbs/__snapshots__/Breadcrumbs.test.tsx.snap +5 -5
  30. package/src/components/Card/Card.stories.mdx +1 -1
  31. package/src/components/Card/Card.tsx +4 -1
  32. package/src/components/Chakra/Flex.stories.mdx +113 -0
  33. package/src/components/DatePicker/DatePicker.stories.mdx +1 -1
  34. package/src/components/DatePicker/DatePicker.test.tsx +6 -6
  35. package/src/components/DatePicker/DatePicker.tsx +3 -4
  36. package/src/components/Fieldset/Fieldset.stories.mdx +1 -1
  37. package/src/components/Fieldset/Fieldset.tsx +2 -4
  38. package/src/components/Form/Form.stories.mdx +34 -16
  39. package/src/components/Form/Form.test.tsx +92 -3
  40. package/src/components/Form/Form.tsx +25 -21
  41. package/src/components/Form/FormTypes.tsx +2 -2
  42. package/src/components/Form/__snapshots__/Form.test.tsx.snap +0 -1
  43. package/src/components/Hero/Hero.stories.mdx +1 -1
  44. package/src/components/HorizontalRule/HorizontalRule.stories.mdx +3 -2
  45. package/src/components/HorizontalRule/HorizontalRule.tsx +2 -2
  46. package/src/components/HorizontalRule/__snapshots__/HorizontalRule.test.tsx.snap +4 -4
  47. package/src/components/List/List.stories.mdx +1 -1
  48. package/src/components/List/List.tsx +1 -1
  49. package/src/components/Pagination/Pagination.stories.mdx +1 -1
  50. package/src/components/Pagination/Pagination.tsx +2 -2
  51. package/src/components/Radio/__snapshots__/Radio.test.tsx.snap +5 -5
  52. package/src/components/RadioGroup/RadioGroup.stories.mdx +1 -1
  53. package/src/components/RadioGroup/RadioGroup.test.tsx +13 -11
  54. package/src/components/RadioGroup/RadioGroup.tsx +88 -89
  55. package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +18 -18
  56. package/src/components/SearchBar/SearchBar.Test.tsx +106 -28
  57. package/src/components/SearchBar/SearchBar.stories.mdx +7 -4
  58. package/src/components/SearchBar/SearchBar.tsx +19 -20
  59. package/src/components/Select/Select.test.tsx +89 -0
  60. package/src/components/Select/Select.tsx +7 -1
  61. package/src/components/Select/__snapshots__/Select.test.tsx.snap +545 -0
  62. package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +7 -0
  63. package/src/components/Table/Table.stories.mdx +118 -19
  64. package/src/components/Table/Table.test.tsx +80 -3
  65. package/src/components/Table/Table.tsx +26 -16
  66. package/src/components/Table/__snapshots__/Table.test.tsx.snap +1179 -0
  67. package/src/components/Tabs/Tabs.stories.mdx +1 -1
  68. package/src/components/Tabs/Tabs.test.tsx +21 -5
  69. package/src/components/Tabs/Tabs.tsx +33 -18
  70. package/src/components/Tabs/__snapshots__/Tabs.test.tsx.snap +195 -0
  71. package/src/components/Template/Template.stories.mdx +79 -4
  72. package/src/components/Template/Template.test.tsx +65 -3
  73. package/src/components/Template/Template.tsx +58 -8
  74. package/src/components/Template/__snapshots__/Template.test.tsx.snap +93 -0
  75. package/src/index.ts +8 -2
  76. package/src/theme/components/breadcrumb.ts +1 -1
  77. package/src/theme/components/customTable.ts +16 -3
  78. package/src/utils/componentCategories.ts +1 -0
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import "./styles.scss";
2
- export { Box, ButtonGroup, Center, Circle, Grid, GridItem, HStack, Square, Stack, VStack, } from "@chakra-ui/react";
2
+ export { Box, ButtonGroup, Center, Circle, Flex, Grid, GridItem, HStack, Spacer, Square, Stack, VStack, } from "@chakra-ui/react";
3
3
  export { default as Accordion } from "./components/Accordion/Accordion";
4
4
  export { default as Breadcrumbs } from "./components/Breadcrumbs/Breadcrumbs";
5
5
  export { ColorVariants } from "./components/Breadcrumbs/BreadcrumbsTypes";
@@ -10,12 +10,12 @@ export { CardLayouts } from "./components/Card/CardTypes";
10
10
  export { default as Checkbox } from "./components/Checkbox/Checkbox";
11
11
  export { default as CheckboxGroup } from "./components/CheckboxGroup/CheckboxGroup";
12
12
  export { CheckboxGroupLayoutTypes } from "./components/CheckboxGroup/CheckboxGroupLayoutTypes";
13
- export { default as DatePicker } from "./components/DatePicker/DatePicker";
13
+ export { default as DatePicker, FullDateType, } from "./components/DatePicker/DatePicker";
14
14
  export { DatePickerTypes } from "./components/DatePicker/DatePickerTypes";
15
15
  export { default as DSProvider } from "./theme/provider";
16
16
  export { default as Fieldset } from "./components/Fieldset/Fieldset";
17
17
  export { default as Form, FormField, FormRow } from "./components/Form/Form";
18
- export { FormSpacing } from "./components/Form/FormTypes";
18
+ export { FormGaps } from "./components/Form/FormTypes";
19
19
  export { GridGaps } from "./components/Grid/GridTypes";
20
20
  export { default as Heading } from "./components/Heading/Heading";
21
21
  export { HeadingDisplaySizes, HeadingLevels, } from "./components/Heading/HeadingTypes";
@@ -54,7 +54,7 @@ export { StatusBadgeTypes } from "./components/StatusBadge/StatusBadgeTypes";
54
54
  export { default as StructuredContent } from "./components/StructuredContent/StructuredContent";
55
55
  export { StructuredContentImagePosition } from "./components/StructuredContent/StructuredContentTypes";
56
56
  export { Tabs, TabList, Tab, TabPanels, TabPanel, } from "./components/Tabs/Tabs";
57
- export { TemplateAppContainer, Template, TemplateHeader, TemplateBreakout, TemplateContent, TemplateContentTop, TemplateContentPrimary, TemplateContentSidebar, TemplateFooter, } from "./components/Template/Template";
57
+ export { TemplateAppContainer, Template, TemplateAboveHeader, TemplateHeader, TemplateBreakout, TemplateContent, TemplateContentTop, TemplateContentPrimary, TemplateContentSidebar, TemplateFooter, } from "./components/Template/Template";
58
58
  export { default as Text } from "./components/Text/Text";
59
59
  export { TextDisplaySizes } from "./components/Text/TextTypes";
60
60
  export { default as TextInput, TextInputRefType, } from "./components/TextInput/TextInput";
@@ -1,4 +1,3 @@
1
- // Resources to export as sass mixins
2
1
  /**
3
2
  * Breakpoint Configuration
4
3
  * @see https://github.com/Team-Sass/breakpoint/wiki
@@ -385,4 +384,3 @@ $nypl-max-width: $nypl-breakpoint-xl;
385
384
  @include space-stack-xxxl;
386
385
  }
387
386
  }
388
-
@@ -62,7 +62,7 @@ declare const Breadcrumb: {
62
62
  marginInlineStart: string;
63
63
  };
64
64
  };
65
- "li:nth-last-child(2)": {
65
+ "li:nth-last-of-type(2)": {
66
66
  display: string;
67
67
  span: {
68
68
  display: {
@@ -4,6 +4,11 @@ declare const CustomTable: {
4
4
  showRowDividers: any;
5
5
  useRowHeaders: any;
6
6
  }) => {
7
+ tbody: {
8
+ th: {
9
+ color: string;
10
+ };
11
+ };
7
12
  th: {
8
13
  border: string;
9
14
  borderBottom: string;
@@ -36,11 +41,15 @@ declare const CustomTable: {
36
41
  };
37
42
  caption: {
38
43
  captionSide: string;
39
- textAlign: string;
40
- fontSize: string;
41
44
  color: string;
42
- textTransform: string;
45
+ fontSize: string;
43
46
  fontWeight: string;
47
+ marginBottom: string;
48
+ marginLeft: string;
49
+ marginRight: string;
50
+ marginTop: string;
51
+ padding: string;
52
+ textAlign: string;
44
53
  };
45
54
  };
46
55
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nypl/design-system-react-components",
3
- "version": "0.25.9",
3
+ "version": "0.25.10",
4
4
  "description": "Design System React Components",
5
5
  "repository": {
6
6
  "type": "git",
@@ -28,7 +28,7 @@
28
28
  "test:watch": "tsdx test - --watch",
29
29
  "test:generate-output": "tsdx test --json --outputFile=.jest-test-results.json || true",
30
30
  "lint": "tsdx lint",
31
- "prepare": "npm run build",
31
+ "prepare": "npm run build && husky install",
32
32
  "size": "size-limit",
33
33
  "analyze": "size-limit --why",
34
34
  "generate-sass-resources": "gulp",
@@ -36,26 +36,9 @@
36
36
  "build-storybook": "npm run prebuild:storybook && build-storybook -c .storybook -o ./storybook-static",
37
37
  "prebuild:storybook": "npm run test:generate-output"
38
38
  },
39
- "dependencies": {
40
- "@chakra-ui/react": "1.7.1",
41
- "@chakra-ui/system": "1.8.1",
42
- "@emotion/react": "11.4.1",
43
- "@emotion/styled": "11.3.0",
44
- "framer-motion": "4.1.17",
45
- "he": "1.2.0",
46
- "react-datepicker": "4.1.1",
47
- "system-font-css": "2.0.2",
48
- "typescript": "4.3.5",
49
- "uuid": "8.3.2"
50
- },
51
- "peerDependencies": {
52
- "react": ">=16.13.0",
53
- "react-dom": ">=16.13.0"
54
- },
55
- "husky": {
56
- "hooks": {
57
- "pre-commit": "pretty-quick --staged"
58
- }
39
+ "lint-staged": {
40
+ "*.{jsx,ts,tsx}": "eslint src --ext=jsx,ts,tsx --cache --fix",
41
+ "*.{js,jsx,ts,tsx,css,md}": "prettier --write"
59
42
  },
60
43
  "prettier": {
61
44
  "printWidth": 80,
@@ -73,19 +56,40 @@
73
56
  "limit": "300 KB"
74
57
  }
75
58
  ],
59
+ "dependencies": {
60
+ "@chakra-ui/react": ">=1.7.1",
61
+ "@chakra-ui/system": ">=1.8.1",
62
+ "@emotion/react": "11.4.1",
63
+ "@emotion/styled": "11.3.0",
64
+ "framer-motion": "4.1.17",
65
+ "he": "1.2.0",
66
+ "react-datepicker": "4.1.1",
67
+ "system-font-css": "2.0.2",
68
+ "typescript": "4.3.5",
69
+ "uuid": "8.3.2"
70
+ },
71
+ "peerDependencies": {
72
+ "@chakra-ui/react": ">=1.7.1",
73
+ "@chakra-ui/system": ">=1.8.1",
74
+ "@emotion/react": ">=11.4.1",
75
+ "@emotion/styled": ">=11.3.0",
76
+ "framer-motion": ">=4.1.17",
77
+ "react": ">=16.13.0",
78
+ "react-dom": ">=16.13.0"
79
+ },
76
80
  "devDependencies": {
77
81
  "@babel/core": "7.14.6",
78
82
  "@mdx-js/react": "1.6.22",
79
83
  "@size-limit/preset-small-lib": "5.0.1",
80
- "@storybook/addon-a11y": "6.4.8",
81
- "@storybook/addon-actions": "6.4.8",
82
- "@storybook/addon-docs": "6.4.8",
83
- "@storybook/addon-essentials": "6.4.8",
84
- "@storybook/addon-jest": "6.4.8",
85
- "@storybook/addon-links": "6.4.8",
84
+ "@storybook/addon-a11y": "6.4.19",
85
+ "@storybook/addon-actions": "6.4.19",
86
+ "@storybook/addon-docs": "6.4.19",
87
+ "@storybook/addon-essentials": "6.4.19",
88
+ "@storybook/addon-jest": "6.4.19",
89
+ "@storybook/addon-links": "6.4.19",
86
90
  "@storybook/addon-queryparams": "6.2.9",
87
- "@storybook/addons": "6.4.8",
88
- "@storybook/react": "6.4.8",
91
+ "@storybook/addons": "6.4.19",
92
+ "@storybook/react": "6.4.19",
89
93
  "@svgr/rollup": "5.5.0",
90
94
  "@svgr/webpack": "5.5.0",
91
95
  "@testing-library/jest-dom": "5.14.1",
@@ -100,7 +104,7 @@
100
104
  "@types/testing-library__jest-dom": "5.14.1",
101
105
  "@typescript-eslint/eslint-plugin": "4.33.0",
102
106
  "@typescript-eslint/parser": "4.33.0",
103
- "autoprefixer": "9.8.6",
107
+ "autoprefixer": "9.8.8",
104
108
  "babel-loader": "8.2.2",
105
109
  "breakpoint-sass": "2.7.1",
106
110
  "css-loader": "5.2.7",
@@ -109,18 +113,18 @@
109
113
  "eslint-config-react-app": "6.0.0",
110
114
  "eslint-plugin-flowtype": "5.8.2",
111
115
  "eslint-plugin-react-hooks": "4.2.0",
116
+ "eslint-plugin-storybook": "^0.5.6",
112
117
  "gulp": "4.0.2",
113
- "gulp-scss-combine": "1.0.0",
114
- "husky": "4.2.5",
118
+ "gulp-concat": "^2.6.1",
119
+ "husky": "^7.0.4",
115
120
  "import-glob-loader": "1.1.0",
116
121
  "jest": "27.3.1",
117
122
  "jest-axe": "5.0.1",
118
123
  "jsdom": "15.2.1",
124
+ "lint-staged": "10.5.4",
119
125
  "node-sass-glob-importer": "5.3.2",
120
126
  "normalize.css": "8.0.1",
121
- "postcss": "8.3.6",
122
127
  "prettier": "2.4.1",
123
- "pretty-quick": "3.1.1",
124
128
  "react": "16.14.0",
125
129
  "react-autosuggest": "10.0.2",
126
130
  "react-docgen-typescript-loader": "3.1.0",
@@ -133,7 +137,7 @@
133
137
  "sass-loader": "10.0.0",
134
138
  "semantic-release-slack-bot": "2.1.0",
135
139
  "size-limit": "5.0.1",
136
- "storybook-addon-designs": "6.2.0",
140
+ "storybook-addon-designs": "6.2.1",
137
141
  "style-loader": "2.0.0",
138
142
  "ts-jest": "27.0.4",
139
143
  "tsdx": "0.14.1",
@@ -38,7 +38,7 @@ import { getCategory } from "../../utils/componentCategories";
38
38
  | Component Version | DS Version |
39
39
  | ----------------- | ---------- |
40
40
  | Added | `0.1.0` |
41
- | Latest | `0.25.1` |
41
+ | Latest | `0.25.10` |
42
42
 
43
43
  <Description of={Accordion} />
44
44
 
@@ -1,9 +1,14 @@
1
1
  import * as React from "react";
2
- import { render, screen } from "@testing-library/react";
3
2
  import { axe } from "jest-axe";
3
+ import { render, screen } from "@testing-library/react";
4
+ import renderer from "react-test-renderer";
4
5
  import userEvent from "@testing-library/user-event";
5
6
 
6
7
  import Accordion from "./Accordion";
8
+ import Card, { CardContent, CardHeading } from "../Card/Card";
9
+ import { CardLayouts } from "../Card/CardTypes";
10
+ import { HeadingLevels } from "../Heading/HeadingTypes";
11
+ import { ImageRatios } from "../Image/ImageTypes";
7
12
 
8
13
  describe("Accordion Accessibility", () => {
9
14
  it("passes axe accessibility test for one item", async () => {
@@ -150,4 +155,43 @@ describe("Accordion", () => {
150
155
  expect(accordion2).toHaveAttribute("aria-expanded", "true");
151
156
  expect(accordion3).toHaveAttribute("aria-expanded", "true");
152
157
  });
158
+
159
+ it("Renders the UI snapshot correctly", () => {
160
+ const contentData = [
161
+ {
162
+ label: "Gerry Kellman",
163
+ panel: (
164
+ <Card
165
+ center
166
+ id="card"
167
+ imageAlt="Alt text"
168
+ imageAspectRatio={ImageRatios.TwoByOne}
169
+ imageSrc={`https://cdn.onebauer.media/one/media/6176/76fd/405b/ab5f/f20f/2d52/gerri-1500-1.jpg?format=jpg&quality=80&width=850&ratio=1-1&resize=aspectfit`}
170
+ layout={CardLayouts.Row}
171
+ >
172
+ <CardHeading id="heading1" level={HeadingLevels.Four}>
173
+ Gerry Kellman
174
+ </CardHeading>
175
+ <CardContent>
176
+ Gerri is <b>one of Logan's most trusted confidantes</b>, one who
177
+ serves many roles within the company. She's one of the most
178
+ powerful people at Waystar Royco outside of the family itself.
179
+ </CardContent>
180
+ </Card>
181
+ ),
182
+ },
183
+ ];
184
+
185
+ const primary = renderer
186
+ .create(<Accordion contentData={contentData} id="accordian" />)
187
+ .toJSON();
188
+ const defaultOpen = renderer
189
+ .create(
190
+ <Accordion contentData={contentData} id="accordian" isDefaultOpen />
191
+ )
192
+ .toJSON();
193
+
194
+ expect(primary).toMatchSnapshot();
195
+ expect(defaultOpen).toMatchSnapshot();
196
+ });
153
197
  });
@@ -29,9 +29,15 @@ export interface AccordionProps {
29
29
  * Get the minus or plus icon depending on whether the accordion
30
30
  * is open or closed.
31
31
  */
32
- const getIcon = (isExpanded = false) => {
32
+ const getIcon = (isExpanded = false, index, id) => {
33
33
  const iconName = isExpanded ? IconNames.Minus : IconNames.Plus;
34
- return <Icon name={iconName} size={IconSizes.Small} />;
34
+ return (
35
+ <Icon
36
+ id={`accordion-${id}-icon-${index}`}
37
+ name={iconName}
38
+ size={IconSizes.Small}
39
+ />
40
+ );
35
41
  };
36
42
 
37
43
  /**
@@ -39,7 +45,7 @@ const getIcon = (isExpanded = false) => {
39
45
  * array. This automatically creates the `AccordionButton` and `AccordionPanel`
40
46
  * combination that is required for the Chakra `Accordion` component.
41
47
  */
42
- const getElementsFromContentData = (data = []) => {
48
+ const getElementsFromContentData = (data = [], id) => {
43
49
  // For FAQ-style multiple accordions, the button should be bigger.
44
50
  // Otherwise, use the default.
45
51
  const multiplePadding = data?.length > 1 ? 4 : null;
@@ -49,23 +55,29 @@ const getElementsFromContentData = (data = []) => {
49
55
  const panel =
50
56
  typeof content.panel === "string" ? (
51
57
  <AccordionPanel
58
+ id={`${id}-panel-${index}`}
52
59
  key={index}
53
60
  dangerouslySetInnerHTML={{ __html: content.panel }}
54
61
  />
55
62
  ) : (
56
- <AccordionPanel key={index}>{content.panel}</AccordionPanel>
63
+ <AccordionPanel id={`${id}-panel-${index}`} key={index}>
64
+ {content.panel}
65
+ </AccordionPanel>
57
66
  );
58
67
 
59
68
  return (
60
- <AccordionItem key={index}>
69
+ <AccordionItem id={`${id}-item-${index}`} key={index}>
61
70
  {/* Get the current state to render the correct icon. */}
62
71
  {({ isExpanded }) => (
63
72
  <>
64
- <AccordionButton padding={multiplePadding}>
73
+ <AccordionButton
74
+ id={`${id}-button-${index}`}
75
+ padding={multiplePadding}
76
+ >
65
77
  <Box flex="1" textAlign="left">
66
78
  {content.label}
67
79
  </Box>
68
- {getIcon(isExpanded)}
80
+ {getIcon(isExpanded, index, id)}
69
81
  </AccordionButton>
70
82
  {panel}
71
83
  </>
@@ -86,7 +98,7 @@ function Accordion(props: React.PropsWithChildren<AccordionProps>) {
86
98
  const openFirstAccordion = isDefaultOpen ? 0 : undefined;
87
99
  return (
88
100
  <ChakraAccordion id={id} defaultIndex={[openFirstAccordion]} allowMultiple>
89
- {getElementsFromContentData(contentData)}
101
+ {getElementsFromContentData(contentData, id)}
90
102
  </ChakraAccordion>
91
103
  );
92
104
  }
@@ -0,0 +1,243 @@
1
+ // Jest Snapshot v1, https://goo.gl/fbAQLP
2
+
3
+ exports[`Accordion Renders the UI snapshot correctly 1`] = `
4
+ <div
5
+ className="chakra-accordion css-0"
6
+ id="accordian"
7
+ >
8
+ <div
9
+ className="chakra-accordion__item css-1fsnuue"
10
+ >
11
+ <button
12
+ aria-controls="accordion-panel-accordian-item-0"
13
+ aria-expanded={false}
14
+ className="chakra-accordion__button css-ubg1nw"
15
+ disabled={false}
16
+ id="accordion-button-accordian-item-0"
17
+ onClick={[Function]}
18
+ onFocus={[Function]}
19
+ onKeyDown={[Function]}
20
+ type="button"
21
+ >
22
+ <div
23
+ className="css-1eziwv"
24
+ >
25
+ Gerry Kellman
26
+ </div>
27
+ <svg
28
+ aria-hidden={true}
29
+ className="chakra-icon css-onkibi"
30
+ focusable={false}
31
+ id="accordion-accordian-icon-0"
32
+ role="img"
33
+ title="plus icon"
34
+ viewBox="0 0 24 24"
35
+ >
36
+ <g
37
+ stroke="currentColor"
38
+ strokeWidth="1.5"
39
+ >
40
+ <path
41
+ d="M9,9a3,3,0,1,1,4,2.829,1.5,1.5,0,0,0-1,1.415V14.25"
42
+ fill="none"
43
+ strokeLinecap="round"
44
+ />
45
+ <path
46
+ d="M12,17.25a.375.375,0,1,0,.375.375A.375.375,0,0,0,12,17.25h0"
47
+ fill="currentColor"
48
+ strokeLinecap="round"
49
+ />
50
+ <circle
51
+ cx="12"
52
+ cy="12"
53
+ fill="none"
54
+ r="11.25"
55
+ strokeMiterlimit="10"
56
+ />
57
+ </g>
58
+ </svg>
59
+ </button>
60
+ <div
61
+ className="chakra-collapse"
62
+ style={
63
+ Object {
64
+ "display": "none",
65
+ "height": "0px",
66
+ "opacity": 0,
67
+ "overflow": "hidden",
68
+ }
69
+ }
70
+ >
71
+ <div
72
+ aria-labelledby="accordion-button-accordian-item-0"
73
+ className="chakra-accordion__panel css-0"
74
+ id="accordion-panel-accordian-item-0"
75
+ role="region"
76
+ >
77
+ <div
78
+ className="css-0"
79
+ id="card"
80
+ >
81
+ <div
82
+ className="css-0"
83
+ >
84
+ <div
85
+ className="the-wrap css-0"
86
+ >
87
+ <div
88
+ className="the-crop css-0"
89
+ >
90
+ <img
91
+ alt="Alt text"
92
+ className="css-0"
93
+ src="https://cdn.onebauer.media/one/media/6176/76fd/405b/ab5f/f20f/2d52/gerri-1500-1.jpg?format=jpg&quality=80&width=850&ratio=1-1&resize=aspectfit"
94
+ />
95
+ </div>
96
+ </div>
97
+ </div>
98
+ <div
99
+ className="card-body css-0"
100
+ >
101
+ <h4
102
+ className="chakra-heading css-0"
103
+ id="heading1"
104
+ >
105
+ Gerry Kellman
106
+ </h4>
107
+ <div
108
+ className="css-0"
109
+ >
110
+ Gerri is
111
+ <b>
112
+ one of Logan's most trusted confidantes
113
+ </b>
114
+ , one who serves many roles within the company. She's one of the most powerful people at Waystar Royco outside of the family itself.
115
+ </div>
116
+ </div>
117
+ </div>
118
+ </div>
119
+ </div>
120
+ </div>
121
+ </div>
122
+ `;
123
+
124
+ exports[`Accordion Renders the UI snapshot correctly 2`] = `
125
+ <div
126
+ className="chakra-accordion css-0"
127
+ id="accordian"
128
+ >
129
+ <div
130
+ className="chakra-accordion__item css-1fsnuue"
131
+ >
132
+ <button
133
+ aria-controls="accordion-panel-accordian-item-0"
134
+ aria-expanded={false}
135
+ className="chakra-accordion__button css-ubg1nw"
136
+ disabled={false}
137
+ id="accordion-button-accordian-item-0"
138
+ onClick={[Function]}
139
+ onFocus={[Function]}
140
+ onKeyDown={[Function]}
141
+ type="button"
142
+ >
143
+ <div
144
+ className="css-1eziwv"
145
+ >
146
+ Gerry Kellman
147
+ </div>
148
+ <svg
149
+ aria-hidden={true}
150
+ className="chakra-icon css-onkibi"
151
+ focusable={false}
152
+ id="accordion-accordian-icon-0"
153
+ role="img"
154
+ title="plus icon"
155
+ viewBox="0 0 24 24"
156
+ >
157
+ <g
158
+ stroke="currentColor"
159
+ strokeWidth="1.5"
160
+ >
161
+ <path
162
+ d="M9,9a3,3,0,1,1,4,2.829,1.5,1.5,0,0,0-1,1.415V14.25"
163
+ fill="none"
164
+ strokeLinecap="round"
165
+ />
166
+ <path
167
+ d="M12,17.25a.375.375,0,1,0,.375.375A.375.375,0,0,0,12,17.25h0"
168
+ fill="currentColor"
169
+ strokeLinecap="round"
170
+ />
171
+ <circle
172
+ cx="12"
173
+ cy="12"
174
+ fill="none"
175
+ r="11.25"
176
+ strokeMiterlimit="10"
177
+ />
178
+ </g>
179
+ </svg>
180
+ </button>
181
+ <div
182
+ className="chakra-collapse"
183
+ style={
184
+ Object {
185
+ "display": "none",
186
+ "height": "0px",
187
+ "opacity": 0,
188
+ "overflow": "hidden",
189
+ }
190
+ }
191
+ >
192
+ <div
193
+ aria-labelledby="accordion-button-accordian-item-0"
194
+ className="chakra-accordion__panel css-0"
195
+ id="accordion-panel-accordian-item-0"
196
+ role="region"
197
+ >
198
+ <div
199
+ className="css-0"
200
+ id="card"
201
+ >
202
+ <div
203
+ className="css-0"
204
+ >
205
+ <div
206
+ className="the-wrap css-0"
207
+ >
208
+ <div
209
+ className="the-crop css-0"
210
+ >
211
+ <img
212
+ alt="Alt text"
213
+ className="css-0"
214
+ src="https://cdn.onebauer.media/one/media/6176/76fd/405b/ab5f/f20f/2d52/gerri-1500-1.jpg?format=jpg&quality=80&width=850&ratio=1-1&resize=aspectfit"
215
+ />
216
+ </div>
217
+ </div>
218
+ </div>
219
+ <div
220
+ className="card-body css-0"
221
+ >
222
+ <h4
223
+ className="chakra-heading css-0"
224
+ id="heading1"
225
+ >
226
+ Gerry Kellman
227
+ </h4>
228
+ <div
229
+ className="css-0"
230
+ >
231
+ Gerri is
232
+ <b>
233
+ one of Logan's most trusted confidantes
234
+ </b>
235
+ , one who serves many roles within the company. She's one of the most powerful people at Waystar Royco outside of the family itself.
236
+ </div>
237
+ </div>
238
+ </div>
239
+ </div>
240
+ </div>
241
+ </div>
242
+ </div>
243
+ `;
@@ -49,11 +49,13 @@ export const enumValues = getStorybookEnumValues(
49
49
  | Component Version | DS Version |
50
50
  | ----------------- | ---------- |
51
51
  | Added | `0.0.3` |
52
- | Latest | `0.25.8` |
52
+ | Latest | `0.25.10` |
53
53
 
54
54
  <Description of={Breadcrumbs} />
55
55
 
56
- The `Breadcrumbs` component is a navigation element that provides a breadcrumb path that reflects the site structure and allows a user to navigate to any page available in the breadcrumb hierarchy.
56
+ The `Breadcrumbs` component is a navigation element that provides a breadcrumb
57
+ path that reflects the site structure and allows a user to navigate to any page
58
+ available in the breadcrumb hierarchy.
57
59
 
58
60
  <Canvas withToolbar>
59
61
  <Story
@@ -81,6 +83,15 @@ The `Breadcrumbs` component is a navigation element that provides a breadcrumb p
81
83
 
82
84
  <ArgsTable story="Breadcrumbs with Controls" />
83
85
 
86
+ ### Accessibility
87
+
88
+ Only one `Breadcrumbs` component should be rendered on a page. This is because
89
+ only one HTML `<nav>` element with `aria-label` attribute of "Breadcrumbs"
90
+ should be rendered. The DS `Breadcrumbs` component renders this HTML landmark
91
+ so only one component must be rendered on a page.
92
+
93
+ - [W3 Breadcrumbs Practice](https://www.w3.org/TR/wai-aria-practices/examples/breadcrumb/index.html)
94
+
84
95
  ### Long Titles
85
96
 
86
97
  <Canvas>
@@ -11,12 +11,27 @@ describe("Breadcrumbs Accessibility", () => {
11
11
  { url: "#string1", text: "string1" },
12
12
  { url: "#string2", text: "string2" },
13
13
  ];
14
+
14
15
  it("passes axe accessibility test", async () => {
15
16
  const { container } = render(
16
17
  <Breadcrumbs breadcrumbsData={breadcrumbsData} />
17
18
  );
18
19
  expect(await axe(container)).toHaveNoViolations();
19
20
  });
21
+
22
+ // This fails because there MUST only be one "breadcrumb" landmark item
23
+ // on a page. This specifically means there should be one `<nav>` element
24
+ // with `aria-label="Breadcrumb"`.
25
+ // https://www.w3.org/TR/wai-aria-practices/examples/breadcrumb/index.html
26
+ it("does not pass axe accessibility test", async () => {
27
+ const { container } = render(
28
+ <>
29
+ <Breadcrumbs breadcrumbsData={breadcrumbsData} />
30
+ <Breadcrumbs breadcrumbsData={breadcrumbsData} />
31
+ </>
32
+ );
33
+ expect(await axe(container)).not.toHaveNoViolations();
34
+ });
20
35
  });
21
36
 
22
37
  describe("Breadcrumbs Snapshot", () => {