@nypl/design-system-react-components 0.25.10 → 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.
- package/CHANGELOG.md +21 -1
- package/dist/components/List/List.d.ts +1 -1
- package/dist/components/Logo/LogoSvgs.d.ts +17 -1
- package/dist/components/Logo/LogoTypes.d.ts +17 -1
- package/dist/components/Notification/Notification.d.ts +2 -0
- package/dist/components/Select/Select.d.ts +4 -0
- package/dist/design-system-react-components.cjs.development.js +1215 -317
- package/dist/design-system-react-components.cjs.development.js.map +1 -1
- package/dist/design-system-react-components.cjs.production.min.js +1 -1
- package/dist/design-system-react-components.cjs.production.min.js.map +1 -1
- package/dist/design-system-react-components.esm.js +1217 -319
- package/dist/design-system-react-components.esm.js.map +1 -1
- package/dist/theme/components/notification.d.ts +13 -4
- package/dist/theme/components/searchBar.d.ts +4 -0
- package/dist/theme/components/structuredContent.d.ts +9 -9
- package/dist/theme/components/textInput.d.ts +2 -0
- package/package.json +1 -1
- package/src/components/Card/__snapshots__/Card.test.tsx.snap +1 -1
- package/src/components/Checkbox/Checkbox.stories.mdx +1 -1
- package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +1 -1
- package/src/components/DatePicker/DatePicker.tsx +9 -6
- package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +28 -20
- package/src/components/HelperErrorText/HelperErrorText.stories.mdx +1 -1
- package/src/components/Icons/Icon.stories.mdx +1 -1
- package/src/components/Icons/Icon.test.tsx +1 -1
- package/src/components/Icons/Icon.tsx +1 -1
- package/src/components/List/List.stories.mdx +24 -5
- package/src/components/List/List.test.tsx +1 -1
- package/src/components/List/List.tsx +1 -1
- package/src/components/List/__snapshots__/List.test.tsx.snap +3 -1
- package/src/components/Logo/Logo.stories.mdx +7 -5
- package/src/components/Logo/LogoSvgs.tsx +33 -1
- package/src/components/Logo/LogoTypes.tsx +16 -0
- package/src/components/Notification/Notification.stories.mdx +68 -1
- package/src/components/Notification/Notification.test.tsx +49 -1
- package/src/components/Notification/Notification.tsx +16 -8
- package/src/components/Radio/Radio.stories.mdx +1 -1
- package/src/components/SearchBar/SearchBar.stories.mdx +1 -1
- package/src/components/SearchBar/SearchBar.tsx +2 -1
- package/src/components/Select/Select.stories.mdx +1 -1
- package/src/components/Select/Select.tsx +4 -1
- package/src/components/Slider/Slider.stories.mdx +1 -1
- package/src/components/StructuredContent/StructuredContent.stories.mdx +1 -1
- package/src/components/Tabs/Tabs.stories.mdx +1 -1
- package/src/components/Tabs/Tabs.tsx +3 -3
- package/src/components/TextInput/TextInput.stories.mdx +1 -1
- package/src/components/Toggle/Toggle.stories.mdx +1 -1
- package/src/components/Toggle/__snapshots__/Toggle.test.tsx.snap +4 -4
- package/src/theme/components/global.ts +1 -1
- package/src/theme/components/list.ts +2 -2
- package/src/theme/components/notification.ts +18 -8
- package/src/theme/components/searchBar.ts +4 -0
- package/src/theme/components/structuredContent.ts +26 -6
- package/src/theme/components/textInput.ts +1 -0
- package/src/theme/components/toggle.ts +1 -1
- package/src/theme/foundations/typography.ts +1 -1
|
@@ -41,6 +41,18 @@ describe("Notification Accessibility", () => {
|
|
|
41
41
|
);
|
|
42
42
|
expect(await axe(container)).toHaveNoViolations();
|
|
43
43
|
});
|
|
44
|
+
|
|
45
|
+
it("passes axe accessibility test for the dismissible type", async () => {
|
|
46
|
+
const { container } = render(
|
|
47
|
+
<Notification
|
|
48
|
+
dismissible
|
|
49
|
+
id="notificationID"
|
|
50
|
+
notificationContent={<>Notification content.</>}
|
|
51
|
+
notificationHeading="Notification Heading"
|
|
52
|
+
/>
|
|
53
|
+
);
|
|
54
|
+
expect(await axe(container)).toHaveNoViolations();
|
|
55
|
+
});
|
|
44
56
|
});
|
|
45
57
|
|
|
46
58
|
describe("Notification", () => {
|
|
@@ -48,6 +60,7 @@ describe("Notification", () => {
|
|
|
48
60
|
beforeEach(() => {
|
|
49
61
|
utils = render(
|
|
50
62
|
<Notification
|
|
63
|
+
ariaLabel="Notification label"
|
|
51
64
|
id="notificationID"
|
|
52
65
|
notificationContent={<>Notification content.</>}
|
|
53
66
|
notificationHeading="Notification Heading"
|
|
@@ -133,7 +146,31 @@ describe("Notification", () => {
|
|
|
133
146
|
);
|
|
134
147
|
});
|
|
135
148
|
|
|
136
|
-
it("renders
|
|
149
|
+
it("renders with an aria-label attribute", () => {
|
|
150
|
+
expect(screen.getByRole("complementary")).toHaveAttribute(
|
|
151
|
+
"aria-label",
|
|
152
|
+
"Notification label"
|
|
153
|
+
);
|
|
154
|
+
});
|
|
155
|
+
|
|
156
|
+
it("renders a dismissible icon", () => {
|
|
157
|
+
utils.rerender(
|
|
158
|
+
<Notification
|
|
159
|
+
dismissible
|
|
160
|
+
id="notificationID"
|
|
161
|
+
notificationContent={<>Notification content.</>}
|
|
162
|
+
notificationHeading="Notification Heading"
|
|
163
|
+
notificationType={NotificationTypes.Standard}
|
|
164
|
+
/>
|
|
165
|
+
);
|
|
166
|
+
const icons = screen.queryAllByRole("img");
|
|
167
|
+
|
|
168
|
+
expect(icons).toHaveLength(2);
|
|
169
|
+
expect(screen.getByTitle("Notification standard icon")).toBeInTheDocument();
|
|
170
|
+
expect(screen.getByTitle("Notification close icon")).toBeInTheDocument();
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
it.skip("renders the UI snapshot correctly", () => {
|
|
137
174
|
const standard = renderer
|
|
138
175
|
.create(
|
|
139
176
|
<Notification
|
|
@@ -190,11 +227,22 @@ describe("Notification", () => {
|
|
|
190
227
|
/>
|
|
191
228
|
)
|
|
192
229
|
.toJSON();
|
|
230
|
+
const dismissible = renderer
|
|
231
|
+
.create(
|
|
232
|
+
<Notification
|
|
233
|
+
dismissible
|
|
234
|
+
id="notificationID7"
|
|
235
|
+
notificationContent={<>Notification content.</>}
|
|
236
|
+
/>
|
|
237
|
+
)
|
|
238
|
+
.toJSON();
|
|
239
|
+
|
|
193
240
|
expect(standard).toMatchSnapshot();
|
|
194
241
|
expect(announcement).toMatchSnapshot();
|
|
195
242
|
expect(warning).toMatchSnapshot();
|
|
196
243
|
expect(withoutHeading).toMatchSnapshot();
|
|
197
244
|
expect(withoutAnIcon).toMatchSnapshot();
|
|
198
245
|
expect(withoutHeadingAndIcon).toMatchSnapshot();
|
|
246
|
+
expect(dismissible).toMatchSnapshot();
|
|
199
247
|
});
|
|
200
248
|
});
|
|
@@ -30,6 +30,8 @@ type BasePropsWithoutAlignText = Omit<BaseProps, "alignText">;
|
|
|
30
30
|
type BasePropsWithoutCentered = Omit<BaseProps, "centered">;
|
|
31
31
|
|
|
32
32
|
export interface NotificationProps extends BasePropsWithoutAlignText {
|
|
33
|
+
/** Label used to describe the `Notification`'s aside HTML element. */
|
|
34
|
+
ariaLabel?: string;
|
|
33
35
|
/** Additional `className` to add. */
|
|
34
36
|
className?: string;
|
|
35
37
|
/** Optional prop to control whether a `Notification` can be dismissed
|
|
@@ -99,6 +101,7 @@ export function NotificationContent(
|
|
|
99
101
|
*/
|
|
100
102
|
export default function Notification(props: NotificationProps) {
|
|
101
103
|
const {
|
|
104
|
+
ariaLabel,
|
|
102
105
|
centered = false,
|
|
103
106
|
className,
|
|
104
107
|
dismissible = false,
|
|
@@ -114,15 +117,15 @@ export default function Notification(props: NotificationProps) {
|
|
|
114
117
|
const handleClose = () => setIsOpen(false);
|
|
115
118
|
const styles = useMultiStyleConfig("Notification", {
|
|
116
119
|
centered,
|
|
120
|
+
dismissible,
|
|
117
121
|
noMargin,
|
|
118
122
|
notificationType,
|
|
119
|
-
showIcon,
|
|
120
123
|
});
|
|
121
124
|
const iconElement = () => {
|
|
122
125
|
const baseIconProps = {
|
|
126
|
+
additionalStyles: styles.icon,
|
|
123
127
|
decorative: false,
|
|
124
128
|
size: IconSizes.Large,
|
|
125
|
-
additionalStyles: styles.icon,
|
|
126
129
|
};
|
|
127
130
|
// If the icon should not display, return null.
|
|
128
131
|
if (!showIcon) {
|
|
@@ -136,16 +139,19 @@ export default function Notification(props: NotificationProps) {
|
|
|
136
139
|
});
|
|
137
140
|
const iconProps = {
|
|
138
141
|
[NotificationTypes.Announcement]: {
|
|
139
|
-
name: IconNames.SpeakerNotes,
|
|
140
142
|
color: IconColors.SectionResearchSecondary,
|
|
143
|
+
name: IconNames.SpeakerNotes,
|
|
144
|
+
title: "Notification announcement icon",
|
|
141
145
|
},
|
|
142
146
|
[NotificationTypes.Standard]: {
|
|
143
|
-
name: IconNames.AlertNotificationImportant,
|
|
144
147
|
color: IconColors.UiBlack,
|
|
148
|
+
name: IconNames.AlertNotificationImportant,
|
|
149
|
+
title: "Notification standard icon",
|
|
145
150
|
},
|
|
146
151
|
[NotificationTypes.Warning]: {
|
|
147
|
-
name: IconNames.ErrorFilled,
|
|
148
152
|
color: IconColors.BrandPrimary,
|
|
153
|
+
name: IconNames.ErrorFilled,
|
|
154
|
+
title: "Notification warning icon",
|
|
149
155
|
},
|
|
150
156
|
};
|
|
151
157
|
return (
|
|
@@ -163,10 +169,11 @@ export default function Notification(props: NotificationProps) {
|
|
|
163
169
|
additionalStyles={styles.dismissibleButton}
|
|
164
170
|
>
|
|
165
171
|
<Icon
|
|
166
|
-
id={`${id}-notification-dismissible-icon`}
|
|
167
172
|
decorative={false}
|
|
173
|
+
id={`${id}-notification-dismissible-icon`}
|
|
168
174
|
name={IconNames.Close}
|
|
169
175
|
size={IconSizes.Large}
|
|
176
|
+
title="Notification close icon"
|
|
170
177
|
/>
|
|
171
178
|
</Button>
|
|
172
179
|
);
|
|
@@ -199,11 +206,12 @@ export default function Notification(props: NotificationProps) {
|
|
|
199
206
|
}
|
|
200
207
|
return (
|
|
201
208
|
<Box
|
|
209
|
+
aria-label={ariaLabel}
|
|
202
210
|
as="aside"
|
|
203
|
-
id={id}
|
|
204
211
|
className={className}
|
|
205
|
-
__css={styles}
|
|
206
212
|
data-type={notificationType}
|
|
213
|
+
id={id}
|
|
214
|
+
__css={styles}
|
|
207
215
|
>
|
|
208
216
|
<Box __css={styles.container}>
|
|
209
217
|
{childHeading}
|
|
@@ -97,7 +97,7 @@ export default function SearchBar(props: SearchBarProps) {
|
|
|
97
97
|
textInputElement,
|
|
98
98
|
textInputProps,
|
|
99
99
|
} = props;
|
|
100
|
-
const styles = useMultiStyleConfig("SearchBar", {
|
|
100
|
+
const styles = useMultiStyleConfig("SearchBar", {});
|
|
101
101
|
const stateProps = {
|
|
102
102
|
helperText: "",
|
|
103
103
|
isDisabled,
|
|
@@ -123,6 +123,7 @@ export default function SearchBar(props: SearchBarProps) {
|
|
|
123
123
|
// Render the `Select` component.
|
|
124
124
|
const selectElem = selectProps && (
|
|
125
125
|
<Select
|
|
126
|
+
additionalStyles={styles.select}
|
|
126
127
|
id={`searchbar-select-${id}`}
|
|
127
128
|
labelText={selectProps?.labelText}
|
|
128
129
|
name={selectProps?.name}
|
|
@@ -67,7 +67,7 @@ export const enumValues = getStorybookEnumValues(SelectTypes, "SelectTypes");
|
|
|
67
67
|
| Component Version | DS Version |
|
|
68
68
|
| ----------------- | ---------- |
|
|
69
69
|
| Added | `0.7.0` |
|
|
70
|
-
| Latest | `0.25.
|
|
70
|
+
| Latest | `0.25.11` |
|
|
71
71
|
|
|
72
72
|
<Description of={Select} />
|
|
73
73
|
|
|
@@ -15,6 +15,8 @@ import { SelectTypes } from "./SelectTypes";
|
|
|
15
15
|
import generateUUID from "../../helpers/generateUUID";
|
|
16
16
|
|
|
17
17
|
export interface SelectProps {
|
|
18
|
+
/** Optionally pass in additional Chakra-based styles. */
|
|
19
|
+
additionalStyles?: { [key: string]: any };
|
|
18
20
|
/** A class name for the `div` parent element. */
|
|
19
21
|
className?: string;
|
|
20
22
|
/** Optional string to populate the `HelperErrorText` for the standard state. */
|
|
@@ -65,6 +67,7 @@ const Select = React.forwardRef<
|
|
|
65
67
|
React.PropsWithChildren<SelectProps>
|
|
66
68
|
>((props: React.PropsWithChildren<SelectProps>, ref?) => {
|
|
67
69
|
const {
|
|
70
|
+
additionalStyles = {},
|
|
68
71
|
children,
|
|
69
72
|
className,
|
|
70
73
|
helperText,
|
|
@@ -116,7 +119,7 @@ const Select = React.forwardRef<
|
|
|
116
119
|
}
|
|
117
120
|
|
|
118
121
|
return (
|
|
119
|
-
<Box className={className} __css={styles}>
|
|
122
|
+
<Box className={className} __css={{ ...styles, ...additionalStyles }}>
|
|
120
123
|
{showLabel && (
|
|
121
124
|
<Label
|
|
122
125
|
id={`${id}-label`}
|
|
@@ -97,8 +97,8 @@ const getElementsFromContentData = (data, useHash): TabPanelProps => {
|
|
|
97
97
|
});
|
|
98
98
|
|
|
99
99
|
return {
|
|
100
|
-
tabs: <TabList>{tabs}</TabList
|
|
101
|
-
panels: <TabPanels>{panels}</TabPanels
|
|
100
|
+
tabs: [<TabList key="list">{tabs}</TabList>],
|
|
101
|
+
panels: [<TabPanels key="panels">{panels}</TabPanels>],
|
|
102
102
|
};
|
|
103
103
|
};
|
|
104
104
|
|
|
@@ -159,7 +159,7 @@ function Tabs(props: React.PropsWithChildren<TabsProps>) {
|
|
|
159
159
|
? getElementsFromContentData(contentData, useHash)
|
|
160
160
|
: getElementsFromChildren(children);
|
|
161
161
|
|
|
162
|
-
if (
|
|
162
|
+
if (tabs.length === 0 || panels.length === 0) {
|
|
163
163
|
console.warn("Tabs: Pass data in the `data` props or as children.");
|
|
164
164
|
}
|
|
165
165
|
|
|
@@ -5,7 +5,7 @@ exports[`Toggle Renders the UI snapshot correctly 1`] = `
|
|
|
5
5
|
className="css-0"
|
|
6
6
|
>
|
|
7
7
|
<label
|
|
8
|
-
className="chakra-switch css-
|
|
8
|
+
className="chakra-switch css-16pgy8f"
|
|
9
9
|
onClick={[Function]}
|
|
10
10
|
>
|
|
11
11
|
<input
|
|
@@ -66,7 +66,7 @@ exports[`Toggle Renders the UI snapshot correctly 2`] = `
|
|
|
66
66
|
className="css-0"
|
|
67
67
|
>
|
|
68
68
|
<label
|
|
69
|
-
className="chakra-switch css-
|
|
69
|
+
className="chakra-switch css-16pgy8f"
|
|
70
70
|
data-checked=""
|
|
71
71
|
onClick={[Function]}
|
|
72
72
|
>
|
|
@@ -131,7 +131,7 @@ exports[`Toggle Renders the UI snapshot correctly 3`] = `
|
|
|
131
131
|
className="css-0"
|
|
132
132
|
>
|
|
133
133
|
<label
|
|
134
|
-
className="chakra-switch css-
|
|
134
|
+
className="chakra-switch css-16pgy8f"
|
|
135
135
|
data-invalid=""
|
|
136
136
|
onClick={[Function]}
|
|
137
137
|
>
|
|
@@ -195,7 +195,7 @@ exports[`Toggle Renders the UI snapshot correctly 4`] = `
|
|
|
195
195
|
className="css-0"
|
|
196
196
|
>
|
|
197
197
|
<label
|
|
198
|
-
className="chakra-switch css-
|
|
198
|
+
className="chakra-switch css-16pgy8f"
|
|
199
199
|
data-disabled=""
|
|
200
200
|
onClick={[Function]}
|
|
201
201
|
>
|
|
@@ -8,10 +8,10 @@ const List = {
|
|
|
8
8
|
padding: noStyling ? "0" : null,
|
|
9
9
|
display: inline ? "flex" : null,
|
|
10
10
|
li: {
|
|
11
|
-
marginRight: inline ? "
|
|
11
|
+
marginRight: inline ? "m" : null,
|
|
12
12
|
listStyleType: inline ? "none" : null,
|
|
13
13
|
_notFirst: {
|
|
14
|
-
marginTop: "xxs",
|
|
14
|
+
marginTop: inline ? null : "xxs",
|
|
15
15
|
},
|
|
16
16
|
},
|
|
17
17
|
}),
|
|
@@ -2,31 +2,34 @@ import { NotificationTypes } from "../../components/Notification/NotificationTyp
|
|
|
2
2
|
|
|
3
3
|
const Notification = {
|
|
4
4
|
parts: ["container", "dismissibleButton", "icon"],
|
|
5
|
-
baseStyle: ({ centered, noMargin, notificationType }) => {
|
|
5
|
+
baseStyle: ({ centered, dismissible, noMargin, notificationType }) => {
|
|
6
6
|
let bg = "ui.status.primary";
|
|
7
|
-
if (
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
if (
|
|
8
|
+
notificationType === NotificationTypes.Announcement ||
|
|
9
|
+
notificationType === NotificationTypes.Warning
|
|
10
|
+
) {
|
|
11
|
+
bg = "ui.gray.x-light-cool";
|
|
11
12
|
}
|
|
12
13
|
return {
|
|
13
14
|
bg,
|
|
14
15
|
display: "flex",
|
|
15
16
|
fontSize: "-1", // slightly smaller than the default size
|
|
16
|
-
padding: "var(--nypl-space-s) var(--nypl-space-l)",
|
|
17
17
|
position: "relative",
|
|
18
18
|
textAlign: centered ? "center" : null,
|
|
19
19
|
borderRadius: noMargin ? "0" : "4px",
|
|
20
20
|
margin: noMargin ? "0" : "s",
|
|
21
21
|
container: {
|
|
22
22
|
margin: "auto",
|
|
23
|
+
maxWidth: "var(--nypl-breakpoint-xl)",
|
|
24
|
+
padding: "s",
|
|
25
|
+
paddingRight: dismissible ? "l" : null,
|
|
26
|
+
paddingLeft: centered && dismissible ? "l" : null,
|
|
23
27
|
width: "100%",
|
|
24
|
-
maxWidth: "var(--nypl-breakpoint-large)",
|
|
25
28
|
},
|
|
26
29
|
dismissibleButton: {
|
|
27
30
|
border: "none",
|
|
28
|
-
alignItems: "center",
|
|
29
31
|
bgColor: "inherit",
|
|
32
|
+
alignItems: "center",
|
|
30
33
|
color: "ui.black",
|
|
31
34
|
display: "flex",
|
|
32
35
|
height: "32px",
|
|
@@ -62,6 +65,13 @@ const NotificationContent = {
|
|
|
62
65
|
? "calc(var(--nypl-space-m) + var(--nypl-space-s))"
|
|
63
66
|
: null,
|
|
64
67
|
width: "100%",
|
|
68
|
+
// Links should always be black and underlined.
|
|
69
|
+
a: {
|
|
70
|
+
color: "ui.black",
|
|
71
|
+
_hover: {
|
|
72
|
+
color: "ui.black",
|
|
73
|
+
},
|
|
74
|
+
},
|
|
65
75
|
},
|
|
66
76
|
}),
|
|
67
77
|
};
|
|
@@ -3,19 +3,29 @@ const StructuredContent = {
|
|
|
3
3
|
baseStyle: ({ hasFigureImage, imageAspectRatio, imagePosition }) => {
|
|
4
4
|
const styles: { maxWidth?: string } = {};
|
|
5
5
|
const wrapperStyles = {
|
|
6
|
-
float:
|
|
7
|
-
|
|
6
|
+
float: [
|
|
7
|
+
"none",
|
|
8
|
+
"none",
|
|
9
|
+
imagePosition !== "center" ? imagePosition : undefined,
|
|
10
|
+
],
|
|
11
|
+
marginLeft: [
|
|
12
|
+
"auto",
|
|
13
|
+
"auto",
|
|
8
14
|
imagePosition === "center"
|
|
9
15
|
? null
|
|
10
16
|
: imagePosition === "left"
|
|
11
17
|
? "0"
|
|
12
18
|
: "m",
|
|
13
|
-
|
|
19
|
+
],
|
|
20
|
+
marginRight: [
|
|
21
|
+
"auto",
|
|
22
|
+
"auto",
|
|
14
23
|
imagePosition === "center"
|
|
15
24
|
? null
|
|
16
25
|
: imagePosition === "left"
|
|
17
26
|
? "m"
|
|
18
27
|
: "0",
|
|
28
|
+
],
|
|
19
29
|
width: imagePosition !== "center" ? "100%" : undefined,
|
|
20
30
|
...styles,
|
|
21
31
|
};
|
|
@@ -34,15 +44,25 @@ const StructuredContent = {
|
|
|
34
44
|
image: {
|
|
35
45
|
// To handle the case when the image does not have a container,
|
|
36
46
|
// e.g. when there is no image caption or credit.
|
|
37
|
-
float:
|
|
38
|
-
|
|
47
|
+
float: [
|
|
48
|
+
"none",
|
|
49
|
+
"none",
|
|
50
|
+
imagePosition !== "center" ? imagePosition : undefined,
|
|
51
|
+
],
|
|
52
|
+
marginLeft: [
|
|
53
|
+
"auto",
|
|
54
|
+
"auto",
|
|
39
55
|
imagePosition === "right" && imageAspectRatio === "original"
|
|
40
56
|
? "m"
|
|
41
57
|
: undefined,
|
|
42
|
-
|
|
58
|
+
],
|
|
59
|
+
marginRight: [
|
|
60
|
+
"auto",
|
|
61
|
+
"auto",
|
|
43
62
|
imagePosition === "left" && imageAspectRatio === "original"
|
|
44
63
|
? "m"
|
|
45
64
|
: undefined,
|
|
65
|
+
],
|
|
46
66
|
marginBottom:
|
|
47
67
|
!hasFigureImage || imageAspectRatio === "original" ? "m" : null,
|
|
48
68
|
...styles,
|