@nypl/design-system-react-components 0.25.8 → 0.25.9
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 +45 -1
- package/README.md +1 -1
- package/dist/components/Button/Button.d.ts +6 -6
- package/dist/components/Button/ButtonTypes.d.ts +0 -1
- package/dist/components/Card/Card.d.ts +6 -4
- package/dist/components/Checkbox/Checkbox.d.ts +3 -2
- package/dist/components/CheckboxGroup/CheckboxGroup.d.ts +3 -2
- package/dist/components/ComponentWrapper/ComponentWrapper.d.ts +8 -2
- package/dist/components/DatePicker/DatePicker.d.ts +3 -2
- package/dist/components/Form/Form.d.ts +2 -2
- package/dist/components/Heading/Heading.d.ts +7 -3
- package/dist/components/Heading/HeadingTypes.d.ts +6 -6
- package/dist/components/HelperErrorText/HelperErrorText.d.ts +5 -2
- package/dist/components/HorizontalRule/HorizontalRule.d.ts +2 -2
- package/dist/components/Icons/Icon.d.ts +4 -4
- package/dist/components/Icons/IconSvgs.d.ts +0 -21
- package/dist/components/Icons/IconTypes.d.ts +0 -23
- package/dist/components/Image/Image.d.ts +11 -3
- package/dist/components/Logo/Logo.d.ts +28 -0
- package/dist/components/Logo/LogoSvgs.d.ts +18 -0
- package/dist/components/Logo/LogoTypes.d.ts +30 -0
- package/dist/components/Modal/Modal.d.ts +0 -4
- package/dist/components/Notification/Notification.d.ts +2 -2
- package/dist/components/Placeholder/Placeholder.d.ts +3 -5
- package/dist/components/Radio/Radio.d.ts +6 -5
- package/dist/components/RadioGroup/RadioGroup.d.ts +3 -2
- package/dist/components/SearchBar/SearchBar.d.ts +10 -2
- package/dist/components/Select/Select.d.ts +3 -2
- package/dist/components/SkeletonLoader/SkeletonLoader.d.ts +8 -4
- package/dist/components/Slider/Slider.d.ts +3 -2
- package/dist/components/StatusBadge/StatusBadge.d.ts +2 -1
- package/dist/components/StructuredContent/StructuredContent.d.ts +41 -0
- package/dist/components/StructuredContent/StructuredContentTypes.d.ts +5 -0
- package/dist/components/Table/Table.d.ts +23 -0
- package/dist/components/Template/Template.d.ts +8 -3
- package/dist/components/Text/Text.d.ts +2 -2
- package/dist/components/TextInput/TextInput.d.ts +4 -3
- package/dist/components/Toggle/Toggle.d.ts +3 -2
- package/dist/components/VideoPlayer/VideoPlayer.d.ts +14 -5
- package/dist/design-system-react-components.cjs.development.js +5630 -5692
- 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 +4304 -4362
- package/dist/design-system-react-components.esm.js.map +1 -1
- package/dist/index.d.ts +6 -4
- package/dist/styles.css +2 -2
- package/dist/theme/components/button.d.ts +0 -12
- package/dist/theme/components/card.d.ts +14 -2
- package/dist/theme/components/customTable.d.ts +47 -0
- package/dist/theme/components/fieldset.d.ts +2 -2
- package/dist/theme/components/global.d.ts +1 -1
- package/dist/theme/components/heading.d.ts +4 -0
- package/dist/theme/components/label.d.ts +1 -1
- package/dist/theme/components/link.d.ts +14 -1
- package/dist/theme/components/list.d.ts +0 -2
- package/dist/theme/components/logo.d.ts +4 -0
- package/dist/theme/components/searchBar.d.ts +7 -13
- package/dist/theme/components/select.d.ts +1 -0
- package/dist/theme/components/structuredContent.d.ts +33 -0
- package/dist/theme/components/template.d.ts +10 -10
- package/dist/theme/components/textInput.d.ts +2 -0
- package/dist/theme/components/toggle.d.ts +8 -5
- package/dist/utils/utils.d.ts +10 -0
- package/package.json +1 -2
- package/src/__tests__/utils/utils.test.ts +23 -1
- package/src/components/Accordion/Accordion.stories.mdx +14 -12
- package/src/components/Autosuggest/Autosuggest.stories.mdx +2 -1
- package/src/components/Autosuggest/Autosuggest.stories.tsx +24 -48
- package/src/components/Autosuggest/_Autosuggest.scss +2 -6
- package/src/components/Breadcrumbs/Breadcrumbs.stories.mdx +30 -11
- package/src/components/Button/Button.stories.mdx +93 -48
- package/src/components/Button/Button.test.tsx +0 -12
- package/src/components/Button/Button.tsx +7 -7
- package/src/components/Button/ButtonTypes.tsx +0 -1
- package/src/components/Button/__snapshots__/Button.test.tsx.snap +0 -12
- package/src/components/Card/Card.stories.mdx +186 -71
- package/src/components/Card/Card.test.tsx +45 -22
- package/src/components/Card/Card.tsx +17 -5
- package/src/components/Card/__snapshots__/Card.test.tsx.snap +8 -2
- package/src/components/Chakra/Box.stories.mdx +3 -3
- package/src/components/Chakra/Center.stories.mdx +5 -5
- package/src/components/Chakra/Grid.stories.mdx +3 -3
- package/src/components/Chakra/Stack.stories.mdx +2 -2
- package/src/components/Checkbox/Checkbox.stories.mdx +37 -15
- package/src/components/Checkbox/Checkbox.tsx +13 -8
- package/src/components/CheckboxGroup/CheckboxGroup.stories.mdx +48 -16
- package/src/components/CheckboxGroup/CheckboxGroup.tsx +14 -10
- package/src/components/CheckboxGroup/__snapshots__/CheckboxGroup.test.tsx.snap +6 -3
- package/src/components/ComponentWrapper/ComponentWrapper.test.tsx +151 -0
- package/src/components/ComponentWrapper/ComponentWrapper.tsx +36 -23
- package/src/components/ComponentWrapper/__snapshots__/ComponentWrapper.test.tsx.snap +85 -0
- package/src/components/DatePicker/DatePicker.stories.mdx +63 -18
- package/src/components/DatePicker/DatePicker.tsx +10 -6
- package/src/components/DatePicker/__snapshots__/DatePicker.test.tsx.snap +36 -18
- package/src/components/Fieldset/Fieldset.stories.mdx +19 -8
- package/src/components/Form/Form.stories.mdx +49 -41
- package/src/components/Form/Form.tsx +5 -4
- package/src/components/Grid/SimpleGrid.stories.mdx +26 -26
- package/src/components/Heading/Heading.stories.mdx +59 -23
- package/src/components/Heading/Heading.test.tsx +82 -18
- package/src/components/Heading/Heading.tsx +31 -31
- package/src/components/Heading/HeadingTypes.tsx +6 -6
- package/src/components/Heading/__snapshots__/Heading.test.tsx.snap +71 -0
- package/src/components/HelperErrorText/HelperErrorText.stories.mdx +55 -27
- package/src/components/HelperErrorText/HelperErrorText.test.tsx +42 -15
- package/src/components/HelperErrorText/HelperErrorText.tsx +24 -24
- package/src/components/HelperErrorText/__snapshots__/HelperErrorText.test.tsx.snap +41 -4
- package/src/components/Hero/Hero.stories.mdx +72 -53
- package/src/components/HorizontalRule/HorizontalRule.stories.mdx +9 -8
- package/src/components/HorizontalRule/HorizontalRule.tsx +2 -4
- package/src/components/Icons/Icon.stories.mdx +77 -76
- package/src/components/Icons/Icon.tsx +4 -5
- package/src/components/Icons/IconSvgs.tsx +0 -42
- package/src/components/Icons/IconTypes.tsx +0 -24
- package/src/components/Image/Image.stories.mdx +66 -18
- package/src/components/Image/Image.tsx +21 -10
- package/src/components/Label/Label.stories.mdx +20 -19
- package/src/components/Link/Link.stories.mdx +102 -51
- package/src/components/Link/Link.test.tsx +38 -8
- package/src/components/Link/Link.tsx +19 -12
- package/src/components/Link/__snapshots__/Link.test.tsx.snap +60 -0
- package/src/components/List/List.stories.mdx +36 -24
- package/src/components/Logo/Logo.stories.mdx +220 -0
- package/src/components/Logo/Logo.test.tsx +98 -0
- package/src/components/Logo/Logo.tsx +97 -0
- package/src/components/Logo/LogoSvgs.tsx +34 -0
- package/src/components/Logo/LogoTypes.tsx +32 -0
- package/src/components/Logo/__snapshots__/Logo.test.tsx.snap +71 -0
- package/src/components/Modal/Modal.stories.mdx +20 -5
- package/src/components/Modal/Modal.tsx +2 -8
- package/src/components/Notification/Notification.stories.mdx +61 -38
- package/src/components/Notification/Notification.tsx +9 -4
- package/src/components/Notification/__snapshots__/Notification.test.tsx.snap +4 -0
- package/src/components/Pagination/Pagination.stories.mdx +17 -6
- package/src/components/Pagination/Pagination.tsx +1 -1
- package/src/components/Placeholder/Placeholder.tsx +7 -14
- package/src/components/ProgressIndicator/ProgressIndicator.stories.mdx +72 -43
- package/src/components/Radio/Radio.stories.mdx +39 -19
- package/src/components/Radio/Radio.tsx +13 -9
- package/src/components/RadioGroup/RadioGroup.stories.mdx +50 -16
- package/src/components/RadioGroup/RadioGroup.tsx +15 -11
- package/src/components/RadioGroup/__snapshots__/RadioGroup.test.tsx.snap +6 -3
- package/src/components/SearchBar/SearchBar.Test.tsx +58 -10
- package/src/components/SearchBar/SearchBar.stories.mdx +109 -30
- package/src/components/SearchBar/SearchBar.tsx +53 -32
- package/src/components/Select/Select.stories.mdx +48 -14
- package/src/components/Select/Select.tsx +16 -10
- package/src/components/SkeletonLoader/SkeletonLoader.stories.mdx +50 -16
- package/src/components/SkeletonLoader/SkeletonLoader.tsx +8 -4
- package/src/components/Slider/Slider.stories.mdx +72 -22
- package/src/components/Slider/Slider.tsx +15 -10
- package/src/components/Slider/__snapshots__/Slider.test.tsx.snap +60 -30
- package/src/components/StatusBadge/StatusBadge.stories.mdx +33 -18
- package/src/components/StatusBadge/StatusBadge.tsx +2 -1
- package/src/components/StructuredContent/StructuredContent.stories.mdx +427 -0
- package/src/components/StructuredContent/StructuredContent.test.tsx +376 -0
- package/src/components/StructuredContent/StructuredContent.tsx +153 -0
- package/src/components/StructuredContent/StructuredContentTypes.tsx +5 -0
- package/src/components/StructuredContent/__snapshots__/StructuredContent.test.tsx.snap +283 -0
- package/src/components/StyleGuide/Bidirectionality.stories.mdx +32 -83
- package/src/components/StyleGuide/Breakpoints.stories.mdx +1 -11
- package/src/components/StyleGuide/Buttons.stories.mdx +3 -18
- package/src/components/StyleGuide/ColorCard.tsx +1 -2
- package/src/components/StyleGuide/Colors.stories.mdx +3 -11
- package/src/components/StyleGuide/DesignTokens.stories.mdx +3 -8
- package/src/components/StyleGuide/Forms.stories.mdx +2 -10
- package/src/components/StyleGuide/Iconography.stories.mdx +8 -34
- package/src/components/StyleGuide/Spacing.stories.mdx +3 -14
- package/src/components/StyleGuide/Typography.stories.mdx +64 -76
- package/src/components/Table/Table.stories.mdx +66 -0
- package/src/components/Table/Table.test.tsx +60 -0
- package/src/components/Table/Table.tsx +116 -0
- package/src/components/Tabs/Tabs.stories.mdx +19 -13
- package/src/components/Tabs/Tabs.test.tsx +1 -1
- package/src/components/Template/Template.stories.mdx +56 -47
- package/src/components/Template/Template.test.tsx +65 -5
- package/src/components/Template/Template.tsx +35 -5
- package/src/components/Template/__snapshots__/Template.test.tsx.snap +76 -0
- package/src/components/Text/Text.stories.mdx +33 -11
- package/src/components/Text/Text.tsx +2 -2
- package/src/components/TextInput/TextInput.stories.mdx +84 -17
- package/src/components/TextInput/TextInput.test.tsx +96 -0
- package/src/components/TextInput/TextInput.tsx +12 -8
- package/src/components/TextInput/__snapshots__/TextInput.test.tsx.snap +240 -0
- package/src/components/Toggle/Toggle.stories.mdx +33 -9
- package/src/components/Toggle/Toggle.tsx +14 -9
- package/src/components/VideoPlayer/VideoPlayer.stories.mdx +64 -14
- package/src/components/VideoPlayer/VideoPlayer.tsx +17 -7
- package/src/components/VideoPlayer/__snapshots__/VideoPlayer.test.tsx.snap +12 -6
- package/src/docs/Chakra.stories.mdx +5 -8
- package/src/docs/Intro.stories.mdx +2 -2
- package/src/index.ts +5 -4
- package/src/styles/base/_03-base.scss +1 -1
- package/src/styles/base/_place-holder.scss +7 -7
- package/src/styles.scss +1 -5
- package/src/theme/components/breadcrumb.ts +3 -3
- package/src/theme/components/button.ts +5 -12
- package/src/theme/components/card.ts +5 -2
- package/src/theme/components/checkbox.ts +1 -1
- package/src/theme/components/customTable.ts +50 -0
- package/src/theme/components/datePicker.ts +1 -1
- package/src/theme/components/global.ts +6 -6
- package/src/theme/components/heading.ts +13 -11
- package/src/theme/components/helperErrorText.ts +1 -1
- package/src/theme/components/image.ts +1 -1
- package/src/theme/components/link.ts +17 -5
- package/src/theme/components/list.ts +1 -3
- package/src/theme/components/logo.ts +54 -0
- package/src/theme/components/notification.ts +1 -1
- package/src/theme/components/searchBar.ts +7 -13
- package/src/theme/components/select.ts +1 -0
- package/src/theme/components/statusBadge.ts +1 -1
- package/src/theme/components/structuredContent.ts +54 -0
- package/src/theme/components/template.ts +10 -10
- package/src/theme/components/text.ts +6 -6
- package/src/theme/components/textInput.ts +1 -0
- package/src/theme/components/toggle.ts +9 -5
- package/src/theme/components/videoPlayer.ts +0 -2
- package/src/theme/foundations/global.ts +2 -2
- package/src/theme/foundations/typography.ts +84 -12
- package/src/theme/index.ts +6 -0
- package/src/utils/componentCategories.ts +1 -1
- package/src/utils/utils.ts +17 -0
- package/dist/__tests__/utils/bem.test.d.ts +0 -1
- package/dist/components/CardEdition/CardEdition.d.ts +0 -21
- package/dist/components/CardEdition/CardEdition.stories.d.ts +0 -27
- package/dist/components/Input/Input.d.ts +0 -36
- package/dist/components/Input/Input.stories.d.ts +0 -29
- package/dist/components/Input/InputTypes.d.ts +0 -6
- package/dist/components/StyleGuide/UIDocCard.d.ts +0 -11
- package/dist/helpers/CSSVariablesHelper.d.ts +0 -3
- package/dist/helpers/getCSSVariable.d.ts +0 -1
- package/dist/interfaces.d.ts +0 -3
- package/dist/utils/bem.d.ts +0 -1
- package/src/__tests__/utils/bem.test.ts +0 -37
- package/src/components/CardEdition/CardEdition.stories.tsx +0 -122
- package/src/components/CardEdition/CardEdition.test.tsx +0 -395
- package/src/components/CardEdition/CardEdition.tsx +0 -60
- package/src/components/CardEdition/_CardEdition.scss +0 -137
- package/src/components/Input/Input.stories.tsx +0 -133
- package/src/components/Input/Input.test.tsx +0 -266
- package/src/components/Input/Input.tsx +0 -81
- package/src/components/Input/InputTypes.tsx +0 -8
- package/src/components/Input/_Input.scss +0 -78
- package/src/components/StyleGuide/UIDocCard.tsx +0 -36
- package/src/helpers/CSSVariablesHelper.tsx +0 -34
- package/src/helpers/getCSSVariable.tsx +0 -5
- package/src/interfaces.ts +0 -3
- package/src/utils/bem.ts +0 -44
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { Icon as ChakraIcon, Box, useStyleConfig } from "@chakra-ui/react";
|
|
3
|
+
|
|
4
|
+
import generateUUID from "../../helpers/generateUUID";
|
|
5
|
+
import { LogoNames, LogoSizes } from "./LogoTypes";
|
|
6
|
+
import logoSvgs from "./LogoSvgs";
|
|
7
|
+
|
|
8
|
+
export interface LogoProps {
|
|
9
|
+
/** Optionally pass in additional Chakra-based styles. */
|
|
10
|
+
additionalStyles?: { [key: string]: any };
|
|
11
|
+
/** Optional className that will be added to the parent element */
|
|
12
|
+
className?: string;
|
|
13
|
+
/** Logos designated as decorative will be ignored by screenreaders. False
|
|
14
|
+
* by default. */
|
|
15
|
+
decorative?: boolean;
|
|
16
|
+
/** ID that other components can cross reference for accessibility purposes */
|
|
17
|
+
id?: string;
|
|
18
|
+
/** The name of the logo you want to use. */
|
|
19
|
+
name?: LogoNames;
|
|
20
|
+
/** Sets the logo size. */
|
|
21
|
+
size?: LogoSizes;
|
|
22
|
+
/** For accessibility purposes, the text passed in the `title` prop gets
|
|
23
|
+
* rendered in a `title` element in the SVG. This descriptive text is not
|
|
24
|
+
* visible but is needed for screenreaders to describe the graphic. */
|
|
25
|
+
title?: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* The `Logo` component renders SVG-based logos and color variants that are
|
|
30
|
+
* commonly used by the New York Public Library.
|
|
31
|
+
*/
|
|
32
|
+
export default function Logo(props: React.PropsWithChildren<LogoProps>) {
|
|
33
|
+
const {
|
|
34
|
+
additionalStyles = {},
|
|
35
|
+
children,
|
|
36
|
+
className,
|
|
37
|
+
decorative = false,
|
|
38
|
+
id = generateUUID(),
|
|
39
|
+
name,
|
|
40
|
+
size = LogoSizes.Medium,
|
|
41
|
+
title = `${name} logo`,
|
|
42
|
+
} = props;
|
|
43
|
+
const styles = useStyleConfig("Logo", {
|
|
44
|
+
size,
|
|
45
|
+
});
|
|
46
|
+
const logoProps = {
|
|
47
|
+
"aria-hidden": decorative,
|
|
48
|
+
className,
|
|
49
|
+
id,
|
|
50
|
+
role: "img",
|
|
51
|
+
title,
|
|
52
|
+
};
|
|
53
|
+
let childSVG = null;
|
|
54
|
+
|
|
55
|
+
// Component prop validation
|
|
56
|
+
if (name && children) {
|
|
57
|
+
console.warn(
|
|
58
|
+
"Logo accepts either a `name` prop or an `svg` element child. It can not accept both."
|
|
59
|
+
);
|
|
60
|
+
return null;
|
|
61
|
+
} else if (!name && !children) {
|
|
62
|
+
console.warn(
|
|
63
|
+
"Pass a logo `name` prop or an SVG child to `Logo` to ensure a logo appears."
|
|
64
|
+
);
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// The user wants to render an existing logo. Load the logo and render it
|
|
69
|
+
// as a component through Chakra's Icon component. Otherwise, we're going to
|
|
70
|
+
// render the SVG child with NYPL-theme styling.
|
|
71
|
+
if (name) {
|
|
72
|
+
const SvgComponent: any = logoSvgs[name];
|
|
73
|
+
return (
|
|
74
|
+
<ChakraIcon
|
|
75
|
+
as={SvgComponent}
|
|
76
|
+
{...logoProps}
|
|
77
|
+
__css={{ ...styles, ...additionalStyles }}
|
|
78
|
+
/>
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// If no `name` prop was passed, we expect a child SVG element to be passed.
|
|
83
|
+
// Apply logo props to the SVG child.
|
|
84
|
+
if (
|
|
85
|
+
(children as JSX.Element).type === "svg" ||
|
|
86
|
+
(children as JSX.Element).props.type === "svg" ||
|
|
87
|
+
(children as JSX.Element).props.mdxType === "svg"
|
|
88
|
+
) {
|
|
89
|
+
childSVG = React.cloneElement(children as JSX.Element, {
|
|
90
|
+
...logoProps,
|
|
91
|
+
});
|
|
92
|
+
} else {
|
|
93
|
+
console.warn("You must pass an `svg` element to the `Logo` component.");
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return <Box __css={styles}>{childSVG}</Box>;
|
|
97
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/* eslint-disable camelcase */
|
|
2
|
+
import logo_bpl_black from "../../../icons/svg/logo_bpl_black.svg";
|
|
3
|
+
import logo_lpa_color from "../../../icons/svg/logo_lpa_color.svg";
|
|
4
|
+
import logo_lpa_white from "../../../icons/svg/logo_lpa_white.svg";
|
|
5
|
+
import logo_nypl_full_black from "../../../icons/svg/logo_nypl_full_black.svg";
|
|
6
|
+
import logo_nypl_full_white from "../../../icons/svg/logo_nypl_full_white.svg";
|
|
7
|
+
import logo_nypl_lion_black from "../../../icons/svg/logo_nypl_lion_black.svg";
|
|
8
|
+
import logo_nypl_lion_white from "../../../icons/svg/logo_nypl_lion_white.svg";
|
|
9
|
+
import logo_qpl_alt_black from "../../../icons/svg/logo_qpl_alt_black.svg";
|
|
10
|
+
import logo_qpl_color from "../../../icons/svg/logo_qpl_color.svg";
|
|
11
|
+
import logo_schomburg_circle_color from "../../../icons/svg/logo_schomburg_circle_color.svg";
|
|
12
|
+
import logo_schomburg_color from "../../../icons/svg/logo_schomburg_color.svg";
|
|
13
|
+
import logo_simplye_black from "../../../icons/svg/logo_simplye_black.svg";
|
|
14
|
+
import logo_simplye_color from "../../../icons/svg/logo_simplye_color.svg";
|
|
15
|
+
import logo_snfl_black from "../../../icons/svg/logo_snfl_black.svg";
|
|
16
|
+
import logo_snfl_white from "../../../icons/svg/logo_snfl_white.svg";
|
|
17
|
+
|
|
18
|
+
export default {
|
|
19
|
+
logo_bpl_black,
|
|
20
|
+
logo_lpa_color,
|
|
21
|
+
logo_lpa_white,
|
|
22
|
+
logo_nypl_full_black,
|
|
23
|
+
logo_nypl_full_white,
|
|
24
|
+
logo_nypl_lion_white,
|
|
25
|
+
logo_nypl_lion_black,
|
|
26
|
+
logo_qpl_alt_black,
|
|
27
|
+
logo_qpl_color,
|
|
28
|
+
logo_schomburg_circle_color,
|
|
29
|
+
logo_schomburg_color,
|
|
30
|
+
logo_simplye_black,
|
|
31
|
+
logo_simplye_color,
|
|
32
|
+
logo_snfl_black,
|
|
33
|
+
logo_snfl_white,
|
|
34
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export enum LogoColors {
|
|
2
|
+
Default = "",
|
|
3
|
+
UiBlack = "ui.black",
|
|
4
|
+
UiWhite = "ui.white",
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export enum LogoSizes {
|
|
8
|
+
ExtraExtraSmall = "xxsmall",
|
|
9
|
+
ExtraSmall = "xsmall",
|
|
10
|
+
Small = "small",
|
|
11
|
+
Medium = "medium",
|
|
12
|
+
Large = "large",
|
|
13
|
+
Default = "default",
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export enum LogoNames {
|
|
17
|
+
BrooklynPublicLibraryBlack = "logo_bpl_black",
|
|
18
|
+
LPAColor = "logo_lpa_color",
|
|
19
|
+
LPAWhite = "logo_lpa_white",
|
|
20
|
+
NYPLBlack = "logo_nypl_full_black",
|
|
21
|
+
NYPLWhite = "logo_nypl_full_white",
|
|
22
|
+
NYPLLionBlack = "logo_nypl_lion_black",
|
|
23
|
+
NYPLLionWhite = "logo_nypl_lion_white",
|
|
24
|
+
QueensPublicLibraryColor = "logo_qpl_color",
|
|
25
|
+
QueensPublicLibraryAltBlack = "logo_qpl_alt_black",
|
|
26
|
+
SchomburgColor = "logo_schomburg_color",
|
|
27
|
+
SchomburgCircleColor = "logo_schomburg_circle_color",
|
|
28
|
+
SimplyEColor = "logo_simplye_color",
|
|
29
|
+
SimplyEBlack = "logo_simplye_black",
|
|
30
|
+
SNFLBlack = "logo_snfl_black",
|
|
31
|
+
SNFLWhite = "logo_snfl_white",
|
|
32
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
|
2
|
+
|
|
3
|
+
exports[`Logo renders the UI snapshot correctly 1`] = `
|
|
4
|
+
<svg
|
|
5
|
+
aria-hidden={false}
|
|
6
|
+
className="chakra-icon css-onkibi"
|
|
7
|
+
focusable={false}
|
|
8
|
+
id="test-logo"
|
|
9
|
+
role="img"
|
|
10
|
+
title="logo_nypl_full_black logo"
|
|
11
|
+
viewBox="0 0 24 24"
|
|
12
|
+
>
|
|
13
|
+
<g
|
|
14
|
+
stroke="currentColor"
|
|
15
|
+
strokeWidth="1.5"
|
|
16
|
+
>
|
|
17
|
+
<path
|
|
18
|
+
d="M9,9a3,3,0,1,1,4,2.829,1.5,1.5,0,0,0-1,1.415V14.25"
|
|
19
|
+
fill="none"
|
|
20
|
+
strokeLinecap="round"
|
|
21
|
+
/>
|
|
22
|
+
<path
|
|
23
|
+
d="M12,17.25a.375.375,0,1,0,.375.375A.375.375,0,0,0,12,17.25h0"
|
|
24
|
+
fill="currentColor"
|
|
25
|
+
strokeLinecap="round"
|
|
26
|
+
/>
|
|
27
|
+
<circle
|
|
28
|
+
cx="12"
|
|
29
|
+
cy="12"
|
|
30
|
+
fill="none"
|
|
31
|
+
r="11.25"
|
|
32
|
+
strokeMiterlimit="10"
|
|
33
|
+
/>
|
|
34
|
+
</g>
|
|
35
|
+
</svg>
|
|
36
|
+
`;
|
|
37
|
+
|
|
38
|
+
exports[`Logo renders the UI snapshot correctly 2`] = `
|
|
39
|
+
<svg
|
|
40
|
+
aria-hidden={false}
|
|
41
|
+
className="chakra-icon css-onkibi"
|
|
42
|
+
focusable={false}
|
|
43
|
+
id="test-logo-size"
|
|
44
|
+
role="img"
|
|
45
|
+
title="logo_nypl_full_black logo"
|
|
46
|
+
viewBox="0 0 24 24"
|
|
47
|
+
>
|
|
48
|
+
<g
|
|
49
|
+
stroke="currentColor"
|
|
50
|
+
strokeWidth="1.5"
|
|
51
|
+
>
|
|
52
|
+
<path
|
|
53
|
+
d="M9,9a3,3,0,1,1,4,2.829,1.5,1.5,0,0,0-1,1.415V14.25"
|
|
54
|
+
fill="none"
|
|
55
|
+
strokeLinecap="round"
|
|
56
|
+
/>
|
|
57
|
+
<path
|
|
58
|
+
d="M12,17.25a.375.375,0,1,0,.375.375A.375.375,0,0,0,12,17.25h0"
|
|
59
|
+
fill="currentColor"
|
|
60
|
+
strokeLinecap="round"
|
|
61
|
+
/>
|
|
62
|
+
<circle
|
|
63
|
+
cx="12"
|
|
64
|
+
cy="12"
|
|
65
|
+
fill="none"
|
|
66
|
+
r="11.25"
|
|
67
|
+
strokeMiterlimit="10"
|
|
68
|
+
/>
|
|
69
|
+
</g>
|
|
70
|
+
</svg>
|
|
71
|
+
`;
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { useState } from "react";
|
|
2
2
|
import {
|
|
3
|
-
Meta,
|
|
4
|
-
Story,
|
|
5
3
|
ArgsTable,
|
|
6
4
|
Canvas,
|
|
7
5
|
Description,
|
|
8
|
-
|
|
6
|
+
Meta,
|
|
7
|
+
Story,
|
|
8
|
+
} from "@storybook/addon-docs";
|
|
9
|
+
|
|
9
10
|
import Modal from "./Modal";
|
|
10
11
|
import Button from "../Button/Button";
|
|
11
12
|
import { getCategory } from "../../utils/componentCategories";
|
|
@@ -14,7 +15,12 @@ import { getCategory } from "../../utils/componentCategories";
|
|
|
14
15
|
title={getCategory("Modal")}
|
|
15
16
|
component={Modal}
|
|
16
17
|
argTypes={{
|
|
18
|
+
blockName: { control: false },
|
|
17
19
|
children: { table: { disable: true } },
|
|
20
|
+
className: { control: false },
|
|
21
|
+
id: { control: false },
|
|
22
|
+
modifiers: { control: false },
|
|
23
|
+
open: { description: "Only used in Storybook." },
|
|
18
24
|
}}
|
|
19
25
|
parameters={{
|
|
20
26
|
jest: ["Modal.test.tsx"],
|
|
@@ -119,12 +125,21 @@ export const ModalStory = (args) => {
|
|
|
119
125
|
};
|
|
120
126
|
|
|
121
127
|
<Canvas withToolbar>
|
|
122
|
-
<Story
|
|
128
|
+
<Story
|
|
129
|
+
name="Modal"
|
|
130
|
+
args={{
|
|
131
|
+
blockName: undefined,
|
|
132
|
+
className: undefined,
|
|
133
|
+
id: "modal-id",
|
|
134
|
+
modifiers: undefined,
|
|
135
|
+
open: false,
|
|
136
|
+
}}
|
|
137
|
+
>
|
|
123
138
|
{(args) => <ModalStory {...args} />}
|
|
124
139
|
</Story>
|
|
125
140
|
</Canvas>
|
|
126
141
|
|
|
127
|
-
<ArgsTable story="
|
|
142
|
+
<ArgsTable story="Modal" />
|
|
128
143
|
|
|
129
144
|
## Code Implementation
|
|
130
145
|
|
|
@@ -1,15 +1,10 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import bem from "../../utils/bem";
|
|
3
2
|
|
|
4
3
|
export interface ModalProps {
|
|
5
|
-
/** BlockName for use with BEM. See how to work with blockNames and BEM here: http://getbem.com/introduction/ */
|
|
6
|
-
blockName?: string;
|
|
7
4
|
/** ClassName that appears in addition to "modal" */
|
|
8
5
|
className?: string;
|
|
9
6
|
/** ID that other components can cross reference for accessibility purposes */
|
|
10
7
|
id?: string;
|
|
11
|
-
/** Modifiers array for use with BEM. See how to work with modifiers and BEM here: http://getbem.com/introduction/ */
|
|
12
|
-
modifiers?: string[];
|
|
13
8
|
}
|
|
14
9
|
|
|
15
10
|
/** Full-screen modal that appears on top of the body of the page. */
|
|
@@ -23,14 +18,13 @@ export default class Modal extends React.Component<ModalProps, any> {
|
|
|
23
18
|
}
|
|
24
19
|
|
|
25
20
|
render() {
|
|
26
|
-
const {
|
|
27
|
-
const baseClass = "modal";
|
|
21
|
+
const { id, className } = this.props;
|
|
28
22
|
|
|
29
23
|
return (
|
|
30
24
|
<div
|
|
31
25
|
// eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex
|
|
32
26
|
tabIndex={0}
|
|
33
|
-
className={
|
|
27
|
+
className={`modal ${className}`}
|
|
34
28
|
id={id}
|
|
35
29
|
>
|
|
36
30
|
{this.props.children}
|
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
import {
|
|
2
|
-
Meta,
|
|
3
|
-
Story,
|
|
4
|
-
Canvas,
|
|
5
2
|
ArgsTable,
|
|
6
|
-
|
|
3
|
+
Canvas,
|
|
7
4
|
Description,
|
|
8
|
-
|
|
5
|
+
Meta,
|
|
6
|
+
Story,
|
|
7
|
+
} from "@storybook/addon-docs";
|
|
9
8
|
import { withDesign } from "storybook-addon-designs";
|
|
10
9
|
|
|
10
|
+
import Icon from "../Icons/Icon";
|
|
11
|
+
import { IconColors, IconNames } from "../Icons/IconTypes";
|
|
11
12
|
import Notification from "./Notification";
|
|
12
13
|
import { NotificationTypes } from "./NotificationTypes";
|
|
13
|
-
import Icon from "../Icons/Icon";
|
|
14
|
-
import {
|
|
15
|
-
IconSizes,
|
|
16
|
-
IconColors,
|
|
17
|
-
IconNames,
|
|
18
|
-
IconAlign,
|
|
19
|
-
} from "../Icons/IconTypes";
|
|
20
14
|
import { getCategory } from "../../utils/componentCategories";
|
|
21
15
|
import DSProvider from "../../theme/provider";
|
|
16
|
+
import { getStorybookEnumValues } from "../../utils/utils";
|
|
17
|
+
|
|
18
|
+
export const enumValues = getStorybookEnumValues(
|
|
19
|
+
NotificationTypes,
|
|
20
|
+
"NotificationTypes"
|
|
21
|
+
);
|
|
22
22
|
|
|
23
23
|
<Meta
|
|
24
24
|
title={getCategory("Notification")}
|
|
@@ -31,6 +31,25 @@ import DSProvider from "../../theme/provider";
|
|
|
31
31
|
},
|
|
32
32
|
jest: ["Notification.test.tsx"],
|
|
33
33
|
}}
|
|
34
|
+
argTypes={{
|
|
35
|
+
centered: {
|
|
36
|
+
table: { defaultValue: { summary: false } },
|
|
37
|
+
},
|
|
38
|
+
className: { control: false },
|
|
39
|
+
dismissible: {
|
|
40
|
+
table: { defaultValue: { summary: false } },
|
|
41
|
+
},
|
|
42
|
+
icon: { control: false },
|
|
43
|
+
id: { control: false },
|
|
44
|
+
noMargin: {
|
|
45
|
+
table: { defaultValue: { summary: false } },
|
|
46
|
+
},
|
|
47
|
+
notificationType: {
|
|
48
|
+
control: { type: "select" },
|
|
49
|
+
table: { defaultValue: { summary: "NotificationTypes.Standard" } },
|
|
50
|
+
options: enumValues.options,
|
|
51
|
+
},
|
|
52
|
+
}}
|
|
34
53
|
/>
|
|
35
54
|
|
|
36
55
|
# Notification
|
|
@@ -38,7 +57,7 @@ import DSProvider from "../../theme/provider";
|
|
|
38
57
|
| Component Version | DS Version |
|
|
39
58
|
| ----------------- | ---------- |
|
|
40
59
|
| Added | `0.23.2` |
|
|
41
|
-
| Latest | `0.25.
|
|
60
|
+
| Latest | `0.25.9` |
|
|
42
61
|
|
|
43
62
|
<Description of={Notification} />
|
|
44
63
|
|
|
@@ -51,10 +70,14 @@ within a parent element.
|
|
|
51
70
|
|
|
52
71
|
<Canvas>
|
|
53
72
|
<Story
|
|
54
|
-
name="Notification
|
|
73
|
+
name="Notification with Controls"
|
|
55
74
|
args={{
|
|
56
|
-
|
|
57
|
-
|
|
75
|
+
centered: false,
|
|
76
|
+
className: undefined,
|
|
77
|
+
dismissible: false,
|
|
78
|
+
icon: undefined,
|
|
79
|
+
id: "notification-id",
|
|
80
|
+
noMargin: false,
|
|
58
81
|
notificationHeading: "Notification Heading",
|
|
59
82
|
notificationContent: (
|
|
60
83
|
<>
|
|
@@ -71,13 +94,16 @@ within a parent element.
|
|
|
71
94
|
>
|
|
72
95
|
{(args) => (
|
|
73
96
|
<div style={{ border: "1px solid #ccc" }}>
|
|
74
|
-
<Notification
|
|
97
|
+
<Notification
|
|
98
|
+
{...args}
|
|
99
|
+
notificationType={enumValues.getValue(args.notificationType)}
|
|
100
|
+
/>
|
|
75
101
|
</div>
|
|
76
102
|
)}
|
|
77
103
|
</Story>
|
|
78
104
|
</Canvas>
|
|
79
105
|
|
|
80
|
-
<ArgsTable story="Notification
|
|
106
|
+
<ArgsTable story="Notification with Controls" />
|
|
81
107
|
|
|
82
108
|
## Variants
|
|
83
109
|
|
|
@@ -233,25 +259,22 @@ The default icon can be overridden by using the `icon` prop to pass a custom `Ic
|
|
|
233
259
|
|
|
234
260
|
<Canvas>
|
|
235
261
|
<Story name="Custom Icons">
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
}
|
|
254
|
-
/>
|
|
255
|
-
)}
|
|
262
|
+
<Notification
|
|
263
|
+
icon={
|
|
264
|
+
<Icon
|
|
265
|
+
name={IconNames.Check}
|
|
266
|
+
color={IconColors.SectionResearchSecondary}
|
|
267
|
+
/>
|
|
268
|
+
}
|
|
269
|
+
notificationHeading="Custom Icon"
|
|
270
|
+
notificationContent={
|
|
271
|
+
<>
|
|
272
|
+
This is a Notification with a custom icon. Cras mattis consectetur
|
|
273
|
+
purus sit amet fermentum. Maecenas faucibus mollis interdum. Morbi leo
|
|
274
|
+
risus, porta ac consectetur ac, vestibulum at eros. Cum sociis natoque
|
|
275
|
+
penatibus et magnis dis parturient montes, nascetur ridiculus mus.
|
|
276
|
+
</>
|
|
277
|
+
}
|
|
278
|
+
/>
|
|
256
279
|
</Story>
|
|
257
280
|
</Canvas>
|
|
@@ -17,6 +17,8 @@ interface BaseProps {
|
|
|
17
17
|
centered?: boolean;
|
|
18
18
|
/** Optional custom `Icon` that will override the default `Icon`. */
|
|
19
19
|
icon?: JSX.Element;
|
|
20
|
+
/** ID that other components can cross reference for accessibility purposes. */
|
|
21
|
+
id?: string;
|
|
20
22
|
/** Optional prop to control the coloring of the `Notification` text and the
|
|
21
23
|
* visibility of an applicable icon. */
|
|
22
24
|
notificationType?: NotificationTypes;
|
|
@@ -35,8 +37,6 @@ export interface NotificationProps extends BasePropsWithoutAlignText {
|
|
|
35
37
|
dismissible?: boolean;
|
|
36
38
|
/** Optional custom `Icon` that will override the default `Icon`. */
|
|
37
39
|
icon?: JSX.Element;
|
|
38
|
-
/** ID that other components can cross reference for accessibility purposes. */
|
|
39
|
-
id?: string;
|
|
40
40
|
/** Optional prop to control the margin around the `Notification` component. */
|
|
41
41
|
noMargin?: boolean;
|
|
42
42
|
/** Content to be rendered in a `NotificationContent` component. */
|
|
@@ -53,7 +53,7 @@ export interface NotificationProps extends BasePropsWithoutAlignText {
|
|
|
53
53
|
export function NotificationHeading(
|
|
54
54
|
props: React.PropsWithChildren<BasePropsWithoutAlignText>
|
|
55
55
|
) {
|
|
56
|
-
const { centered, children, icon, notificationType } = props;
|
|
56
|
+
const { centered, children, icon, id, notificationType } = props;
|
|
57
57
|
const styles = useMultiStyleConfig("NotificationHeading", {
|
|
58
58
|
centered,
|
|
59
59
|
icon,
|
|
@@ -62,7 +62,11 @@ export function NotificationHeading(
|
|
|
62
62
|
return (
|
|
63
63
|
<Box as="header" __css={styles}>
|
|
64
64
|
{icon}
|
|
65
|
-
<Heading
|
|
65
|
+
<Heading
|
|
66
|
+
additionalStyles={styles.heading}
|
|
67
|
+
id={`${id}-heading`}
|
|
68
|
+
level={HeadingLevels.Four}
|
|
69
|
+
>
|
|
66
70
|
{children}
|
|
67
71
|
</Heading>
|
|
68
72
|
</Box>
|
|
@@ -171,6 +175,7 @@ export default function Notification(props: NotificationProps) {
|
|
|
171
175
|
<NotificationHeading
|
|
172
176
|
centered={centered}
|
|
173
177
|
icon={iconElem}
|
|
178
|
+
id={id}
|
|
174
179
|
notificationType={notificationType}
|
|
175
180
|
>
|
|
176
181
|
{notificationHeading}
|
|
@@ -46,6 +46,7 @@ exports[`Notification renders the UI snapshot correctly 1`] = `
|
|
|
46
46
|
</svg>
|
|
47
47
|
<h4
|
|
48
48
|
className="chakra-heading css-0"
|
|
49
|
+
id="notificationID1-heading"
|
|
49
50
|
>
|
|
50
51
|
Notification Heading
|
|
51
52
|
</h4>
|
|
@@ -109,6 +110,7 @@ exports[`Notification renders the UI snapshot correctly 2`] = `
|
|
|
109
110
|
</svg>
|
|
110
111
|
<h4
|
|
111
112
|
className="chakra-heading css-0"
|
|
113
|
+
id="notificationID2-heading"
|
|
112
114
|
>
|
|
113
115
|
Notification Heading
|
|
114
116
|
</h4>
|
|
@@ -172,6 +174,7 @@ exports[`Notification renders the UI snapshot correctly 3`] = `
|
|
|
172
174
|
</svg>
|
|
173
175
|
<h4
|
|
174
176
|
className="chakra-heading css-0"
|
|
177
|
+
id="notificationID3-heading"
|
|
175
178
|
>
|
|
176
179
|
Notification Heading
|
|
177
180
|
</h4>
|
|
@@ -257,6 +260,7 @@ exports[`Notification renders the UI snapshot correctly 5`] = `
|
|
|
257
260
|
>
|
|
258
261
|
<h4
|
|
259
262
|
className="chakra-heading css-0"
|
|
263
|
+
id="notificationID5-heading"
|
|
260
264
|
>
|
|
261
265
|
Notification Heading
|
|
262
266
|
</h4>
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
|
-
Meta,
|
|
3
|
-
Story,
|
|
4
2
|
ArgsTable,
|
|
5
3
|
Canvas,
|
|
6
4
|
Description,
|
|
7
|
-
|
|
5
|
+
Meta,
|
|
6
|
+
Story,
|
|
7
|
+
} from "@storybook/addon-docs";
|
|
8
8
|
import { withDesign } from "storybook-addon-designs";
|
|
9
9
|
import { withQuery } from "@storybook/addon-queryparams";
|
|
10
|
+
|
|
10
11
|
import Pagination from "./Pagination";
|
|
11
12
|
import * as stories from "./Pagination.stories.tsx";
|
|
12
13
|
import { getCategory } from "../../utils/componentCategories";
|
|
@@ -23,9 +24,11 @@ import { getCategory } from "../../utils/componentCategories";
|
|
|
23
24
|
jest: ["Pagination.test.tsx"],
|
|
24
25
|
}}
|
|
25
26
|
argTypes={{
|
|
26
|
-
|
|
27
|
-
getPageHref: {
|
|
28
|
-
|
|
27
|
+
className: { control: false },
|
|
28
|
+
getPageHref: { control: false },
|
|
29
|
+
id: { control: false },
|
|
30
|
+
initialPage: { table: { defaultValue: { summary: 1 } } },
|
|
31
|
+
onPageChange: { control: false },
|
|
29
32
|
}}
|
|
30
33
|
/>
|
|
31
34
|
|
|
@@ -69,7 +72,11 @@ const getPageHref = (selectedPage: number) => {
|
|
|
69
72
|
<Story
|
|
70
73
|
name="Pagination with URL Updates"
|
|
71
74
|
args={{
|
|
75
|
+
className: undefined,
|
|
76
|
+
getPageHref: undefined,
|
|
77
|
+
id: "pagination-id",
|
|
72
78
|
initialPage: 1,
|
|
79
|
+
onPageChange: undefined,
|
|
73
80
|
pageCount: 10,
|
|
74
81
|
}}
|
|
75
82
|
>
|
|
@@ -102,7 +109,11 @@ const onPageChange = (currentPage: number) => {
|
|
|
102
109
|
<Story
|
|
103
110
|
name="Pagination with Unchanging URL"
|
|
104
111
|
args={{
|
|
112
|
+
className: undefined,
|
|
113
|
+
getPageHref: undefined,
|
|
114
|
+
id: "pagination-id-2",
|
|
105
115
|
initialPage: 7,
|
|
116
|
+
onPageChange: undefined,
|
|
106
117
|
pageCount: 100,
|
|
107
118
|
}}
|
|
108
119
|
>
|
|
@@ -31,9 +31,9 @@ export interface PaginationProps {
|
|
|
31
31
|
const Pagination: React.FC<PaginationProps> = (props: PaginationProps) => {
|
|
32
32
|
const {
|
|
33
33
|
className,
|
|
34
|
-
initialPage = 1,
|
|
35
34
|
getPageHref,
|
|
36
35
|
id = generateUUID(),
|
|
36
|
+
initialPage = 1,
|
|
37
37
|
onPageChange = () => {},
|
|
38
38
|
pageCount,
|
|
39
39
|
} = props;
|
|
@@ -1,24 +1,17 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
|
-
import bem from "../../utils/bem";
|
|
3
2
|
|
|
4
3
|
export interface PlaceholderProps {
|
|
5
|
-
/**
|
|
6
|
-
|
|
7
|
-
/** Modifiers array for use with BEM. See how to work with modifiers and BEM here: http://getbem.com/introduction/ */
|
|
8
|
-
modifiers?: string[];
|
|
4
|
+
/** Modifier string for the classname. */
|
|
5
|
+
variant?: string;
|
|
9
6
|
}
|
|
10
7
|
|
|
11
8
|
/** Creates a gray box with an editable string for dropping in spaces
|
|
12
9
|
* within components or on templates where a component will be but
|
|
13
10
|
* that hasn't been created yet
|
|
14
11
|
*/
|
|
15
|
-
export default function Placeholder(
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
return
|
|
20
|
-
<div className={bem("placeholder", modifiers, blockName)}>
|
|
21
|
-
{props.children}
|
|
22
|
-
</div>
|
|
23
|
-
);
|
|
12
|
+
export default function Placeholder({
|
|
13
|
+
children,
|
|
14
|
+
variant,
|
|
15
|
+
}: React.PropsWithChildren<PlaceholderProps>) {
|
|
16
|
+
return <div className={`placeholder placeholder-${variant}`}>{children}</div>;
|
|
24
17
|
}
|