@ndlib/component-library 0.0.10 → 0.0.14

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 (131) hide show
  1. package/dist/FontLoader.d.ts +1 -0
  2. package/dist/FontLoader.js +4 -0
  3. package/dist/components/composites/Card/Card.stories.d.ts +9 -0
  4. package/dist/components/composites/Card/Card.stories.js +77 -0
  5. package/dist/components/composites/Card/Card.test.d.ts +1 -0
  6. package/dist/components/composites/Card/Card.test.js +29 -0
  7. package/dist/components/composites/Card/index.d.ts +22 -0
  8. package/dist/components/composites/Card/index.js +71 -0
  9. package/dist/components/elements/Alerts/Alert.stories.d.ts +9 -0
  10. package/dist/components/elements/Alerts/Alert.stories.js +41 -0
  11. package/dist/components/elements/Alerts/Alerts.stories.d.ts +6 -0
  12. package/dist/components/elements/Alerts/Alerts.stories.js +12 -0
  13. package/dist/components/elements/Alerts/Alerts.test.d.ts +1 -0
  14. package/dist/components/elements/Alerts/Alerts.test.js +62 -0
  15. package/dist/components/elements/Alerts/index.d.ts +15 -0
  16. package/dist/components/elements/Alerts/index.js +63 -0
  17. package/dist/components/elements/BrandingBar/BrandingBar.stories.js +1 -1
  18. package/dist/components/elements/BrandingBar/index.js +5 -5
  19. package/dist/components/elements/Button/Button.stories.d.ts +4 -0
  20. package/dist/components/elements/Button/Button.stories.js +42 -9
  21. package/dist/components/elements/Button/Button.test.js +11 -2
  22. package/dist/components/elements/Button/index.d.ts +16 -11
  23. package/dist/components/elements/Button/index.js +84 -34
  24. package/dist/components/elements/Fields/Checkbox/Checkbox.stories.d.ts +6 -0
  25. package/dist/components/elements/Fields/Checkbox/Checkbox.stories.js +17 -0
  26. package/dist/components/elements/Fields/Checkbox/index.d.ts +9 -0
  27. package/dist/components/elements/Fields/Checkbox/index.js +22 -0
  28. package/dist/components/elements/Fields/CheckboxGroup/CheckboxGroup.stories.d.ts +6 -0
  29. package/dist/components/elements/Fields/CheckboxGroup/CheckboxGroup.stories.js +23 -0
  30. package/dist/components/elements/Fields/CheckboxGroup/index.d.ts +14 -0
  31. package/dist/components/elements/Fields/CheckboxGroup/index.js +35 -0
  32. package/dist/components/elements/Fields/Radio/Radio.stories.d.ts +6 -0
  33. package/dist/components/elements/Fields/Radio/Radio.stories.js +17 -0
  34. package/dist/components/elements/Fields/Radio/index.d.ts +9 -0
  35. package/dist/components/elements/Fields/Radio/index.js +22 -0
  36. package/dist/components/elements/Fields/RadioGroup/RadioGroup.stories.d.ts +6 -0
  37. package/dist/components/elements/Fields/RadioGroup/RadioGroup.stories.js +23 -0
  38. package/dist/components/elements/Fields/RadioGroup/index.d.ts +14 -0
  39. package/dist/components/elements/Fields/RadioGroup/index.js +28 -0
  40. package/dist/components/elements/Fields/Select/Select.stories.d.ts +6 -0
  41. package/dist/components/elements/Fields/Select/Select.stories.js +32 -0
  42. package/dist/components/elements/Fields/Select/index.d.ts +16 -0
  43. package/dist/components/elements/Fields/Select/index.js +136 -0
  44. package/dist/components/elements/Fields/TextInput/TextInput.stories.d.ts +6 -0
  45. package/dist/components/elements/Fields/TextInput/TextInput.stories.js +25 -0
  46. package/dist/components/elements/Fields/TextInput/index.d.ts +17 -0
  47. package/dist/components/elements/Fields/TextInput/index.js +60 -0
  48. package/dist/components/elements/Fields/option.d.ts +15 -0
  49. package/dist/components/elements/Fields/option.js +3 -0
  50. package/dist/components/elements/Group/index.js +3 -3
  51. package/dist/components/elements/Icon/Icon.stories.d.ts +7 -0
  52. package/dist/components/elements/Icon/Icon.stories.js +29 -0
  53. package/dist/components/elements/Icon/Icon.test.d.ts +1 -0
  54. package/dist/components/elements/Icon/Icon.test.js +26 -0
  55. package/dist/components/elements/Icon/index.d.ts +11 -0
  56. package/dist/components/elements/Icon/index.js +25 -0
  57. package/dist/components/elements/Link/Link.stories.js +3 -3
  58. package/dist/components/elements/Link/Link.test.js +13 -13
  59. package/dist/components/elements/Link/index.d.ts +2 -2
  60. package/dist/components/elements/Link/index.js +4 -4
  61. package/dist/components/elements/List/List.stories.d.ts +9 -0
  62. package/dist/components/elements/List/List.stories.js +31 -0
  63. package/dist/components/elements/List/List.test.d.ts +1 -0
  64. package/dist/components/elements/List/List.test.js +24 -0
  65. package/dist/components/elements/List/index.d.ts +21 -0
  66. package/dist/components/elements/List/index.js +75 -0
  67. package/dist/components/elements/ListBox/Listbox.stories.d.ts +6 -0
  68. package/dist/components/elements/ListBox/Listbox.stories.js +17 -0
  69. package/dist/components/elements/ListBox/index.d.ts +32 -0
  70. package/dist/components/elements/ListBox/index.js +50 -0
  71. package/dist/components/elements/Markdown/Markdown.stories.d.ts +6 -0
  72. package/dist/components/elements/Markdown/Markdown.stories.js +53 -0
  73. package/dist/components/elements/Markdown/Markdown.test.d.ts +1 -0
  74. package/dist/components/elements/Markdown/Markdown.test.js +58 -0
  75. package/dist/components/elements/Markdown/index.d.ts +7 -0
  76. package/dist/components/elements/Markdown/index.js +50 -0
  77. package/dist/components/elements/layout/Box.d.ts +1 -1
  78. package/dist/components/elements/layout/Box.stories.js +1 -1
  79. package/dist/components/elements/layout/Column.d.ts +2 -2
  80. package/dist/components/elements/layout/Column.js +2 -2
  81. package/dist/components/elements/layout/Flex.stories.js +2 -2
  82. package/dist/components/elements/layout/Flex.test.js +2 -2
  83. package/dist/components/elements/layout/Row.d.ts +2 -2
  84. package/dist/components/elements/layout/Row.js +1 -1
  85. package/dist/components/elements/text/Heading/Heading.stories.js +10 -11
  86. package/dist/components/elements/text/Heading/Heading.test.js +1 -1
  87. package/dist/components/elements/text/Heading/index.d.ts +6 -4
  88. package/dist/components/elements/text/Heading/index.js +19 -13
  89. package/dist/components/elements/text/Inline/Inline.stories.d.ts +6 -0
  90. package/dist/components/elements/text/Inline/Inline.stories.js +13 -0
  91. package/dist/components/elements/text/Inline/index.d.ts +7 -0
  92. package/dist/components/elements/text/Inline/index.js +21 -0
  93. package/dist/components/elements/text/Label/Label.stories.js +3 -3
  94. package/dist/components/elements/text/Label/Label.test.js +2 -2
  95. package/dist/components/elements/text/Label/index.d.ts +3 -3
  96. package/dist/components/elements/text/Label/index.js +4 -4
  97. package/dist/components/elements/text/Paragraph/Paragraph.stories.js +2 -2
  98. package/dist/components/elements/text/Paragraph/Paragraph.test.js +1 -1
  99. package/dist/components/elements/text/Paragraph/index.d.ts +2 -2
  100. package/dist/components/elements/text/Paragraph/index.js +2 -2
  101. package/dist/components/providers/alerts.d.ts +41 -0
  102. package/dist/components/providers/alerts.js +133 -0
  103. package/dist/components/providers/componentConfig.d.ts +3 -3
  104. package/dist/components/providers/componentConfig.js +5 -4
  105. package/dist/components/providers/env.d.ts +1 -1
  106. package/dist/components/providers/env.js +3 -3
  107. package/dist/components/providers/theme.js +1 -1
  108. package/dist/components/providers/ui.d.ts +7 -3
  109. package/dist/components/providers/ui.js +8 -6
  110. package/dist/index.d.ts +5 -1
  111. package/dist/index.js +5 -1
  112. package/dist/theme/Color.stories.js +17 -2
  113. package/dist/theme/Typography.stories.d.ts +6 -0
  114. package/dist/theme/Typography.stories.js +43 -0
  115. package/dist/theme/colors.d.ts +11 -1
  116. package/dist/theme/colors.js +20 -0
  117. package/dist/theme/custom.d.ts +3 -0
  118. package/dist/theme/custom.js +5 -0
  119. package/dist/theme/index.d.ts +139 -4
  120. package/dist/theme/index.js +18 -12
  121. package/dist/theme/typography.d.ts +47 -6
  122. package/dist/theme/typography.js +74 -36
  123. package/dist/utils/hooks/useStorage.d.ts +14 -0
  124. package/dist/utils/hooks/useStorage.js +31 -0
  125. package/dist/utils/hooks/useUniqueHtmlId.d.ts +1 -0
  126. package/dist/utils/hooks/useUniqueHtmlId.js +7 -0
  127. package/dist/utils/misc.d.ts +7 -0
  128. package/dist/utils/misc.js +13 -1
  129. package/dist/utils/test.js +3 -1
  130. package/global.css +4 -9
  131. package/package.json +19 -12
@@ -0,0 +1 @@
1
+ export declare const FontLoader: () => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,4 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ export const FontLoader = () => {
3
+ return (_jsx("link", { rel: "stylesheet", href: "https://fonts.googleapis.com/css2?family=Libre+Franklin|Libre+Franklin:wght@700|Sumana" }));
4
+ };
@@ -0,0 +1,9 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { Card } from '.';
3
+ declare const meta: Meta<typeof Card>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof Card>;
6
+ export declare const Default: Story;
7
+ export declare const Horizontal: Story;
8
+ export declare const DateCards: Story;
9
+ export declare const Clickable: Story;
@@ -0,0 +1,77 @@
1
+ import { createElement as _createElement } from "react";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import AccessTime from '@mui/icons-material/AccessTimeFilled';
4
+ import CalendarIcon from '@mui/icons-material/CalendarMonth';
5
+ import { CARD_LAYOUT, CARD_SIZE, Card } from '.';
6
+ import { COLOR, Column, LABEL_SIZE, Label, Paragraph } from '../../..';
7
+ import { Icon } from '../../elements/Icon';
8
+ const meta = {
9
+ title: 'Composites/Card',
10
+ component: Card,
11
+ tags: ['autodocs'],
12
+ };
13
+ export default meta;
14
+ const basicCards = [
15
+ {
16
+ headline: 'Exhibit — Printing the Nation: A Century of Irish Book Arts',
17
+ image: 'https://images.ctfassets.net/cfblb1f7i85j/7aCd5Sm86JdtQepGBKDUfy/dcb4d97dd3a1d3ee810e8bcaa82dc715/Spring_Exhibit_2023-Rep.jpg?w=296',
18
+ size: CARD_SIZE.SM,
19
+ },
20
+ {
21
+ headline: 'One Book, One Michiana Digital Exhibit — Papers Alight: Contextualizing Mike Curato’s Flamer',
22
+ image: 'https://images.ctfassets.net/cfblb1f7i85j/2sGpdDbNkl6MPnlem6wq1R/995c786624613b5ff07228e481996385/One.Book.2023-Rep.png?w=296',
23
+ size: CARD_SIZE.SM,
24
+ },
25
+ ];
26
+ const dateCards = [
27
+ {
28
+ displayDate: new Date().toISOString(),
29
+ headline: 'Exhibit — Printing the Nation: A Century of Irish Book Arts',
30
+ size: CARD_SIZE.SM,
31
+ },
32
+ {
33
+ displayDate: new Date().toISOString(),
34
+ headline: 'One Book, One Michiana Digital Exhibit — Papers Alight: Contextualizing Mike Curato’s Flamer',
35
+ size: CARD_SIZE.SM,
36
+ },
37
+ ];
38
+ const horizontalCards = [
39
+ {
40
+ headline: 'Exhibit — Printing the Nation: A Century of Irish Book Arts',
41
+ image: 'https://images.ctfassets.net/cfblb1f7i85j/7aCd5Sm86JdtQepGBKDUfy/dcb4d97dd3a1d3ee810e8bcaa82dc715/Spring_Exhibit_2023-Rep.jpg?w=296',
42
+ size: CARD_SIZE.SM,
43
+ body: (_jsxs(_Fragment, { children: [_jsxs(Label, Object.assign({ color: COLOR.PRIMARY, size: LABEL_SIZE.SM, sx: {
44
+ display: 'flex',
45
+ } }, { children: [_jsx(Icon, { icon: CalendarIcon, sx: { mr: 1 } }), "Monday, February 6 \u2013 Monday, July 31, 2023"] })), _jsxs(Label, Object.assign({ color: COLOR.PRIMARY, size: LABEL_SIZE.SM, sx: {
46
+ display: 'flex',
47
+ } }, { children: [_jsx(Icon, { icon: AccessTime, sx: { mr: 1 } }), "M-F: 9:30am \u2013 4:30pm"] })), _jsx(Paragraph, { children: "This exhibit demonstrates the art and craft of the Irish book since 1900." })] })),
48
+ },
49
+ {
50
+ headline: 'One Book, One Michiana Digital Exhibit — Papers Alight: Contextualizing Mike Curato’s Flamer',
51
+ image: 'https://images.ctfassets.net/cfblb1f7i85j/2sGpdDbNkl6MPnlem6wq1R/995c786624613b5ff07228e481996385/One.Book.2023-Rep.png?w=296',
52
+ size: CARD_SIZE.SM,
53
+ body: (_jsxs(_Fragment, { children: [_jsxs(Label, Object.assign({ color: COLOR.PRIMARY, size: LABEL_SIZE.SM, sx: {
54
+ display: 'flex',
55
+ } }, { children: [_jsx(Icon, { icon: CalendarIcon, sx: { mr: 1 } }), "Monday, February 6 \u2013 Monday, July 31, 2023"] })), _jsxs(Label, Object.assign({ color: COLOR.PRIMARY, size: LABEL_SIZE.SM, sx: {
56
+ display: 'flex',
57
+ } }, { children: [_jsx(Icon, { icon: AccessTime, sx: { mr: 1 } }), "M-F: 9:30am \u2013 4:30pm"] })), _jsx(Paragraph, { children: "This online exhibition displays rare materials from Hesburgh Libraries collections that place Mike Curato\u2019s teen graphic novel into a historical and social context." })] })),
58
+ },
59
+ ];
60
+ export const Default = {
61
+ render: () => (_jsx(Column, { children: basicCards.map((props, i) => (_createElement(Card, Object.assign({}, props, { key: i })))) })),
62
+ args: {},
63
+ };
64
+ export const Horizontal = {
65
+ render: () => (_jsx(Column, { children: horizontalCards.map((props, i) => (_createElement(Card, Object.assign({}, props, { key: i, layout: CARD_LAYOUT.HORIZONTAL })))) })),
66
+ args: {},
67
+ };
68
+ export const DateCards = {
69
+ render: () => (_jsx(Column, { children: dateCards.map((props, i) => (_createElement(Card, Object.assign({}, props, { key: i, layout: CARD_LAYOUT.HORIZONTAL, sx: { height: '120px' } })))) })),
70
+ args: {},
71
+ };
72
+ export const Clickable = {
73
+ render: () => (_jsx(Column, { children: basicCards.map((props, i) => (_createElement(Card, Object.assign({}, props, { onClick: () => {
74
+ alert('Card clicked');
75
+ }, key: i })))) })),
76
+ args: {},
77
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,29 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { fireEvent } from '@testing-library/react';
3
+ import { vi } from 'vitest';
4
+ import { render } from '../../../utils/test';
5
+ import { Card } from '.';
6
+ import { KEY_CODES } from '../../../utils/misc';
7
+ const MOCK_HEADLINE = 'MOCK HEADLINE';
8
+ const MOCK_BODY = 'MOCK BODY';
9
+ describe('Card', () => {
10
+ const mockClickHandler = vi.fn();
11
+ afterEach(() => {
12
+ vi.resetAllMocks();
13
+ });
14
+ it('renders contents', () => {
15
+ const { getByText } = render(_jsx(Card, { headline: MOCK_HEADLINE, body: MOCK_BODY }));
16
+ expect(getByText(MOCK_HEADLINE)).toBeDefined();
17
+ expect(getByText(MOCK_BODY)).toBeDefined();
18
+ });
19
+ it('fires handler when clicked', () => {
20
+ const { getByRole } = render(_jsx(Card, { headline: MOCK_HEADLINE, onClick: mockClickHandler }));
21
+ const card = getByRole('button');
22
+ fireEvent.click(card);
23
+ expect(mockClickHandler).toBeCalledTimes(1);
24
+ fireEvent.keyDown(card, {
25
+ key: KEY_CODES.ENTER,
26
+ });
27
+ expect(mockClickHandler).toBeCalledTimes(2);
28
+ });
29
+ });
@@ -0,0 +1,22 @@
1
+ import { StyledElementProps } from '../../../theme';
2
+ import React from 'react';
3
+ export declare enum CARD_LAYOUT {
4
+ VERTICAL = "vertical",
5
+ HORIZONTAL = "horizontal"
6
+ }
7
+ export declare enum CARD_SIZE {
8
+ SM = "SM",
9
+ MD = "MD",
10
+ LG = "LG"
11
+ }
12
+ type CardProps = StyledElementProps<HTMLDivElement, {
13
+ headline: string;
14
+ body?: React.ReactNode;
15
+ image?: string;
16
+ layout?: CARD_LAYOUT;
17
+ size?: CARD_SIZE;
18
+ displayDate?: string;
19
+ onClick?: () => void;
20
+ }>;
21
+ export declare const Card: React.FC<CardProps>;
22
+ export {};
@@ -0,0 +1,71 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Heading } from '../../elements/text/Heading';
3
+ import { GROUP_TYPE, Group } from '../../elements/Group';
4
+ import { Box } from '../../elements/layout/Box';
5
+ import { Column, FONT, FONT_SIZE, Row, TYPOGRAPHY_TYPE } from '../../..';
6
+ import { COLOR } from '../../../theme/colors';
7
+ import React from 'react';
8
+ import { KEY_CODES } from '../../../utils/misc';
9
+ export var CARD_LAYOUT;
10
+ (function (CARD_LAYOUT) {
11
+ CARD_LAYOUT["VERTICAL"] = "vertical";
12
+ CARD_LAYOUT["HORIZONTAL"] = "horizontal";
13
+ })(CARD_LAYOUT || (CARD_LAYOUT = {}));
14
+ export var CARD_SIZE;
15
+ (function (CARD_SIZE) {
16
+ CARD_SIZE["SM"] = "SM";
17
+ CARD_SIZE["MD"] = "MD";
18
+ CARD_SIZE["LG"] = "LG";
19
+ })(CARD_SIZE || (CARD_SIZE = {}));
20
+ const MONTH_LABELS = [
21
+ 'JAN',
22
+ 'FEB',
23
+ 'MAR',
24
+ 'APR',
25
+ 'MAY',
26
+ 'JUN',
27
+ 'JUL',
28
+ 'AUG',
29
+ 'SEP',
30
+ 'OCT',
31
+ 'NOV',
32
+ 'DEC',
33
+ ];
34
+ const DateDisplay = ({ date: dateString }) => {
35
+ const date = React.useMemo(() => {
36
+ return new Date(dateString);
37
+ }, [dateString]);
38
+ return (_jsxs(Column, Object.assign({ sx: {
39
+ alignItems: 'center',
40
+ justifyContent: 'center',
41
+ p: 3,
42
+ fontFamily: FONT.BRANDED2,
43
+ backgroundColor: COLOR.ND_GOLD,
44
+ } }, { children: [_jsx(Box, Object.assign({ sx: {
45
+ fontSize: FONT_SIZE.LG,
46
+ } }, { children: date.getDate() })), _jsx(Box, Object.assign({ sx: {
47
+ fontSize: FONT_SIZE.MD,
48
+ mt: 1,
49
+ } }, { children: MONTH_LABELS[date.getMonth()] }))] })));
50
+ };
51
+ export const Card = ({ size, displayDate, headline, body, image, layout, onClick, sx, }) => {
52
+ const contentPaddingX = size === CARD_SIZE.SM ? 4 : 5;
53
+ const bodyTopMargin = size === CARD_SIZE.SM ? 2 : 3;
54
+ const isVertical = !layout || layout === CARD_LAYOUT.VERTICAL;
55
+ const contentPaddingY = isVertical ? contentPaddingX : 2;
56
+ const typography = size === CARD_SIZE.SM
57
+ ? TYPOGRAPHY_TYPE.HEADLINE_SMALL
58
+ : TYPOGRAPHY_TYPE.HEADLINE_MEDIUM;
59
+ return (_jsxs(Group, Object.assign({ type: GROUP_TYPE.GROUP, role: onClick ? 'button' : 'group', onClick: onClick, onKeyDown: (e) => {
60
+ if (onClick && e.key === KEY_CODES.ENTER) {
61
+ onClick();
62
+ }
63
+ }, tabIndex: onClick ? 0 : undefined, sx: Object.assign({ width: isVertical ? '400px' : '100%', height: isVertical ? '350px' : '220px', borderBottom: 'solid 2px', borderColor: COLOR.TRANSPARENT, cursor: onClick ? 'pointer' : undefined, display: 'flex', flexDirection: layout === CARD_LAYOUT.HORIZONTAL ? 'row' : 'column', alignItems: 'flex-start', ':hover,:focus': {
64
+ transform: 'scale(1.01)',
65
+ borderColor: COLOR.ND_SKY_BLUE_DARK,
66
+ backgroundColor: COLOR.ND_SKY_BLUE,
67
+ } }, sx) }, { children: [image && (_jsx("img", { src: image, style: {
68
+ width: isVertical ? '100%' : 'auto',
69
+ height: isVertical ? 'auto' : '100%',
70
+ } })), displayDate && _jsx(DateDisplay, { date: displayDate }), _jsx(Row, Object.assign({ sx: { px: contentPaddingX, py: contentPaddingY } }, { children: _jsxs(Column, Object.assign({ justify: "center" }, { children: [_jsx(Heading, Object.assign({ typography: typography, sx: { textAlign: 'justify' } }, { children: headline })), body && _jsx(Box, Object.assign({ sx: { mt: bodyTopMargin } }, { children: body }))] })) }))] })));
71
+ };
@@ -0,0 +1,9 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { Alert } from '.';
3
+ declare const meta: Meta<typeof Alert>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof Alert>;
6
+ export declare const Default: Story;
7
+ export declare const InformationalAlert: Story;
8
+ export declare const YellowAlert: Story;
9
+ export declare const WarningAlert: Story;
@@ -0,0 +1,41 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Alert } from '.';
3
+ import { ALERT_TYPE } from '../../providers/alerts';
4
+ const meta = {
5
+ title: 'Elements/Alert',
6
+ component: Alert,
7
+ tags: ['autodocs'],
8
+ };
9
+ export default meta;
10
+ export const Default = {
11
+ render: (args) => _jsx(Alert, Object.assign({}, args)),
12
+ args: {
13
+ title: 'Informational Alert',
14
+ type: ALERT_TYPE.INFORMATIONAL,
15
+ description: 'This is an informational alert',
16
+ },
17
+ };
18
+ export const InformationalAlert = {
19
+ render: (args) => _jsx(Alert, Object.assign({}, args)),
20
+ args: {
21
+ title: 'Informational Alert',
22
+ type: ALERT_TYPE.INFORMATIONAL,
23
+ description: 'This is an informational alert',
24
+ },
25
+ };
26
+ export const YellowAlert = {
27
+ render: (args) => _jsx(Alert, Object.assign({}, args)),
28
+ args: {
29
+ title: 'Informational - Yellow Alert',
30
+ type: ALERT_TYPE.INFORMATIONAL_YELLOW,
31
+ description: 'This is an informational yellow alert',
32
+ },
33
+ };
34
+ export const WarningAlert = {
35
+ render: (args) => _jsx(Alert, Object.assign({}, args)),
36
+ args: {
37
+ title: 'Warning Alert',
38
+ type: ALERT_TYPE.WARNING,
39
+ description: 'This is a warning alert',
40
+ },
41
+ };
@@ -0,0 +1,6 @@
1
+ import type { Meta, StoryObj } from '@storybook/react';
2
+ import { Alerts } from '.';
3
+ declare const meta: Meta<typeof Alerts>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof Alerts>;
6
+ export declare const Default: Story;
@@ -0,0 +1,12 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Alerts } from '.';
3
+ import { AlertsProvider } from '../../providers/alerts';
4
+ const meta = {
5
+ title: 'Elements/Alerts',
6
+ component: Alerts,
7
+ tags: ['autodocs'],
8
+ };
9
+ export default meta;
10
+ export const Default = {
11
+ render: () => (_jsx(AlertsProvider, Object.assign({ startTime: new Date('2022-01-01').toISOString(), endTime: new Date('2022-01-01').toISOString(), endpoint: "http://localhost:1337/graphql" }, { children: _jsx(Alerts, {}) }))),
12
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,62 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { jsx as _jsx } from "react/jsx-runtime";
11
+ // import { fireEvent } from '@testing-library/react'
12
+ import { vi } from 'vitest';
13
+ import { render } from '../../../utils/test';
14
+ import { useAlerts } from '../../providers/alerts';
15
+ import { Alerts } from '.';
16
+ import { useState } from 'react';
17
+ vi.mock('../../providers/alerts', () => __awaiter(void 0, void 0, void 0, function* () {
18
+ const actual = yield vi.importActual('../../providers/alerts');
19
+ return Object.assign(Object.assign({}, actual), { useAlerts: vi.fn() });
20
+ }));
21
+ const MOCK_ALERTS = [
22
+ {
23
+ uuid: 'bcb7a31c-4d67-45fa-9ad8-314fac1eace6',
24
+ domains: ['library'],
25
+ startTime: '2020-09-06T04:00:00.000Z',
26
+ endTime: '2020-09-09T04:00:00.000Z',
27
+ title: 'Aleph API down due to DNS problem',
28
+ description: 'Test 1',
29
+ type: 'Warning',
30
+ global: true,
31
+ },
32
+ {
33
+ uuid: 'bcb7a31c-4d67-45fa-9ad8-314fac1eace6',
34
+ domains: ['library'],
35
+ startTime: '2020-09-06T04:00:00.000Z',
36
+ endTime: '2020-09-09T04:00:00.000Z',
37
+ title: 'Aleph API down due to DNS problem',
38
+ description: '__bold__ [Test 2 Link](https://onesearch.library.nd.edu/)',
39
+ type: 'Warning',
40
+ global: true,
41
+ },
42
+ ];
43
+ describe('Alerts', () => {
44
+ const mockUseAlerts = useAlerts;
45
+ beforeEach(() => {
46
+ mockUseAlerts.mockImplementation(() => {
47
+ const [alerts, setAlerts] = useState(MOCK_ALERTS);
48
+ const dismiss = (uuid) => {
49
+ setAlerts(alerts.filter((alert) => alert.uuid !== uuid));
50
+ };
51
+ return { alerts, dismiss };
52
+ });
53
+ });
54
+ afterEach(() => {
55
+ vi.resetAllMocks();
56
+ });
57
+ it('renders alert content', () => {
58
+ const { getByText, getByRole } = render(_jsx(Alerts, {}));
59
+ expect(getByText('Test 1')).toBeInTheDocument();
60
+ expect(getByRole('link')).toBeInTheDocument();
61
+ });
62
+ });
@@ -0,0 +1,15 @@
1
+ /** @jsxImportSource theme-ui */
2
+ import React from 'react';
3
+ import { ALERT_TYPE } from '../../providers/alerts';
4
+ import { StyledElementProps } from '../../../theme';
5
+ type AlertsProps = StyledElementProps<HTMLDivElement, {
6
+ pageAlerts?: string[];
7
+ }>;
8
+ export declare const Alerts: React.FC<AlertsProps>;
9
+ type AlertProps = StyledElementProps<HTMLDivElement, {
10
+ type: ALERT_TYPE;
11
+ description: string;
12
+ dismiss: () => void;
13
+ }>;
14
+ export declare const Alert: React.FC<AlertProps>;
15
+ export {};
@@ -0,0 +1,63 @@
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
12
+ import { jsx as _jsx, jsxs as _jsxs } from "theme-ui/jsx-runtime";
13
+ import WarningIcon from '@mui/icons-material/Warning';
14
+ import InfoIcon from '@mui/icons-material/Info';
15
+ import { COLOR } from '../../../theme/colors';
16
+ import { Markdown } from '../Markdown';
17
+ import { Row } from '../layout/Row';
18
+ import { Icon } from '../Icon';
19
+ import { FONT_SIZE } from '../../../theme/typography';
20
+ import { useAlerts, ALERT_TYPE } from '../../providers/alerts';
21
+ import { useTheme } from '../../../theme';
22
+ import { BUTTON_TYPE, Button } from '../Button';
23
+ export const Alerts = (_a) => {
24
+ var { pageAlerts } = _a, rest = __rest(_a, ["pageAlerts"]);
25
+ const { alerts, dismiss } = useAlerts(pageAlerts);
26
+ return (_jsx("div", Object.assign({}, rest, { children: alerts.map((alert, i) => {
27
+ const { type, description } = alert;
28
+ return (_jsx(Alert, { type: type, description: description, css: {
29
+ marginTop: i ? '4px' : 0,
30
+ }, dismiss: () => {
31
+ dismiss(alert.uuid);
32
+ } }, i));
33
+ }) })));
34
+ };
35
+ export const Alert = (_a) => {
36
+ var { type = ALERT_TYPE.INFORMATIONAL, description = '', dismiss } = _a, rest = __rest(_a, ["type", "description", "dismiss"]);
37
+ const theme = useTheme();
38
+ const style = {
39
+ backgroundColor: COLOR.ALERT_INFORMATIONAL_BG,
40
+ boxShadow: theme.boxShadow.NORMAL,
41
+ border: '2px solid',
42
+ borderRadius: '4px',
43
+ borderColor: COLOR.ALERT_INFORMATIONAL_BORDER,
44
+ m: 0,
45
+ p: '1rem',
46
+ };
47
+ if (type === ALERT_TYPE.INFORMATIONAL_YELLOW) {
48
+ style.backgroundColor = COLOR.ALERT_INFORMATIONAL_YELLOW_BG;
49
+ style.borderColor = COLOR.ALERT_INFORMATIONAL_YELLOW_BORDER;
50
+ }
51
+ else if (type === ALERT_TYPE.WARNING) {
52
+ style.backgroundColor = COLOR.ALERT_WARNING_BG;
53
+ style.borderColor = COLOR.ALERT_WARNING_BORDER;
54
+ }
55
+ const icon = {
56
+ [ALERT_TYPE.WARNING]: WarningIcon,
57
+ [ALERT_TYPE.INFORMATIONAL_YELLOW]: InfoIcon,
58
+ [ALERT_TYPE.INFORMATIONAL]: InfoIcon,
59
+ }[type];
60
+ return (_jsxs(Row, Object.assign({ sx: Object.assign({}, style) }, rest, { children: [icon && _jsx(Icon, { icon: icon, sx: { mr: 4 }, size: FONT_SIZE.LG }), _jsx(Markdown, { content: description, sx: { mt: 1, flexGrow: 1 } }), _jsx(Button, Object.assign({ type: BUTTON_TYPE.TEXT, onClick: dismiss, sx: { ml: 4 } }, { children: "Dismiss" }))] })));
61
+ };
62
+ const myHeaders = new Headers();
63
+ myHeaders.append('Content-Type', 'application/json');
@@ -7,5 +7,5 @@ const meta = {
7
7
  };
8
8
  export default meta;
9
9
  export const Default = {
10
- render: () => (_jsx(BrandingBar, {}))
10
+ render: () => _jsx(BrandingBar, {}),
11
11
  };
@@ -1,5 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "theme-ui/jsx-runtime";
2
- import { COLOR } from "../../../theme/colors";
2
+ import { COLOR } from '../../../theme/colors';
3
3
  const ProvostImage = 'data:image/png;base64,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';
4
4
  const UniversityLogo = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAlcAAABkCAMAAACclOWcAAAABGdBTUEAALGPC/xhBQAAADNQTFRF////////////////////////////////////////////////////////////AAAA////FbWC9gAAABB0Uk5TcI+vUM8w358gYO8Qf0C/AK6MYRQAAAmFSURBVHja7ZzrlqyqDoVVFOVavv/TbgFFLlGxu/qMM/ae80+v0hJD+AghWqv7QND31cEFELiCwBUEriAIXEHgCgJXEASuIHAFgSsIAlcQuILAFQSBKwhcQeAKgsAVBK4gcAVB4AoCVxC4giBwBYErCFxBELiCwBUEriAIXEHgCgJXEASuIHAFgSsIAlcQuPq/09R1C7wArr5MlR36VQKsfyFXyhjzPLCi/Ar7BgyT3JzVr/rnDRgz/c+s/Zl71de4WuyuwX3U+4fzTuHzvH8cwsc+mcPp5cEtxyH2SZqMvhI2k0iM0Xrej2pB+VaMqxOfk2N9fjcvK/N7jGscz6OD1sRrh0afS+cVQ8Sr3WiV36G03XrbVyvKsbux9iP00b++m+r4mam/sf307KDFdPm1sW5jqRtn1cj1uSWTi1dsdt2VwezFd3825yWml+48OxIMHr8bTNkv789Lls67kO8OXLqtgZmp84rBnR6dAVtjKSMz9xdaj09f+l9tzQ7GiO1LJk15eBiuZLw3e/z4uOObtj9nd7TvDtfq+DCLNq6GMNwLlXV5E3bXBxcm/vC3dT1lxt+Qs/zyG2s/nT8s/dHVlvc2ffBXuJxf274MfG/Hytj7OsZIqo19gDNPlA5fRDTf3UCEdZCfTvGf5mKm+XYPSxZ/War88nhoTByXt6hcg8HverXVhduZZcwa2KnbsPKX89wCb1/qqGUdPTXrPkQiHanP4jw7REsaqdpau4lry3p26cqF4Ua+Z+LTbK3rtVt6lftbx8oxnA3X367BMTgYx6hkxHec86lYNieB5Ri+EkB2mP9Rg7PIcWWjcT4slxmE7/E5ylm0+FSXn0M9xQ9SlTM0NlKsF3Y/4wdKV2NndoN0ZV/exyk/PmSntTu+7P9sXARdG+zmrHdRHPbShSLpzCQLsBqs1ceol4tr6nt9y1Xqcz86gkaPWky9w+Z8cO2HgORIGEiudMmNWWXasF0/j1wpmVwwVKlu2seR5MrH2vxUd04a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';
5
5
  const sharedLinkStyle = {
@@ -31,22 +31,22 @@ export const BrandingBar = () => {
31
31
  backgroundColor: COLOR.ND_PROVOST_BLUE,
32
32
  height: '50px',
33
33
  display: 'block',
34
- 'a': {
34
+ a: {
35
35
  color: COLOR.TEXT_ON_PRIMARY,
36
36
  textDecoration: 'none',
37
- }
37
+ },
38
38
  } }, { children: _jsx("div", Object.assign({ sx: {
39
39
  display: 'block',
40
40
  margin: '0 auto',
41
41
  maxWidth: '1200px',
42
42
  padding: '0',
43
43
  position: 'relative',
44
- } }, { children: _jsxs("nav", Object.assign({ "aria-label": 'University of Notre Dame', sx: {
44
+ } }, { children: _jsxs("nav", Object.assign({ "aria-label": "University of Notre Dame", sx: {
45
45
  boxSizing: 'border-box',
46
46
  display: 'block',
47
47
  height: '50px',
48
48
  position: 'relative',
49
49
  overflow: 'hidden',
50
50
  width: '100%',
51
- } }, { children: [_jsxs("a", Object.assign({ sx: universityLogo, href: 'http://nd.edu' }, { children: ["University ", _jsx("i", { children: "of" }), " Notre Dame"] })), _jsxs("a", Object.assign({ sx: provostLogo, href: 'http://provost.nd.edu' }, { children: ["Office ", _jsx("i", { children: "of the" }), " Provost"] }))] })) })) })));
51
+ } }, { children: [_jsxs("a", Object.assign({ sx: universityLogo, href: "http://nd.edu" }, { children: ["University ", _jsx("i", { children: "of" }), " Notre Dame"] })), _jsxs("a", Object.assign({ sx: provostLogo, href: "http://provost.nd.edu" }, { children: ["Office ", _jsx("i", { children: "of the" }), " Provost"] }))] })) })) })));
52
52
  };
@@ -5,4 +5,8 @@ export default meta;
5
5
  type Story = StoryObj<typeof Button>;
6
6
  export declare const Default: Story;
7
7
  export declare const CustomColor: Story;
8
+ export declare const OutlineButton: Story;
8
9
  export declare const TextButton: Story;
10
+ export declare const IconButton: Story;
11
+ export declare const LeftIcon: Story;
12
+ export declare const RightIcon: Story;
@@ -1,4 +1,7 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import SearchIcon from '@mui/icons-material/Search';
3
+ import ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown';
4
+ import SettingsIcon from '@mui/icons-material/Settings';
2
5
  import { BUTTON_SIZE, BUTTON_TYPE, Button } from '.';
3
6
  import { GROUP_TYPE, Group } from '../Group';
4
7
  import { HEADING_SIZE, Heading } from '../text/Heading';
@@ -16,24 +19,54 @@ const sizes = [
16
19
  { size: BUTTON_SIZE.SM, label: 'Small' },
17
20
  ];
18
21
  export const Default = {
19
- render: (args) => (_jsx(Column, { children: sizes.map(size => (_jsxs(Group, Object.assign({ type: GROUP_TYPE.REGION }, { children: [_jsx(Heading, Object.assign({ size: HEADING_SIZE.MD }, { children: size.label })), _jsx(Button, Object.assign({}, args, { size: size.size, sx: { mt: 1 } }))] })))) })),
22
+ render: (args) => (_jsx(Column, { children: sizes.map((size) => (_jsxs(Group, Object.assign({ type: GROUP_TYPE.REGION }, { children: [_jsx(Heading, Object.assign({ size: HEADING_SIZE.MD }, { children: size.label })), _jsx(Button, Object.assign({}, args, { size: size.size, sx: { mt: 1 } }))] })))) })),
20
23
  args: {
21
24
  type: BUTTON_TYPE.DEFAULT,
22
- children: "Click Me"
23
- }
25
+ children: 'Click Me',
26
+ },
24
27
  };
25
28
  export const CustomColor = {
26
- render: (args) => (_jsx(Column, { children: sizes.map(size => (_jsxs(Group, Object.assign({ type: GROUP_TYPE.REGION }, { children: [_jsx(Heading, Object.assign({ size: HEADING_SIZE.MD }, { children: size.label })), _jsx(Button, Object.assign({}, args, { size: size.size, color: COLOR.SECONDARY, sx: { mt: 1 } }))] })))) })),
29
+ render: (args) => (_jsx(Column, { children: sizes.map((size) => (_jsxs(Group, Object.assign({ type: GROUP_TYPE.REGION }, { children: [_jsx(Heading, Object.assign({ size: HEADING_SIZE.MD }, { children: size.label })), _jsx(Button, Object.assign({}, args, { size: size.size, color: COLOR.SECONDARY, sx: { mt: 1 } }))] })))) })),
27
30
  args: {
28
31
  type: BUTTON_TYPE.DEFAULT,
29
- children: "Click Me"
30
- }
32
+ children: 'Click Me',
33
+ },
34
+ };
35
+ export const OutlineButton = {
36
+ render: (args) => (_jsx(Column, { children: sizes.map((size) => (_jsxs(Group, Object.assign({ type: GROUP_TYPE.REGION }, { children: [_jsx(Heading, Object.assign({ size: HEADING_SIZE.MD }, { children: size.label })), _jsx(Button, Object.assign({}, args, { size: size.size, sx: { mt: 1 } }))] })))) })),
37
+ args: {
38
+ type: BUTTON_TYPE.OUTLINE,
39
+ children: 'Click Me',
40
+ onClick: () => { },
41
+ },
31
42
  };
32
43
  export const TextButton = {
33
- render: (args) => (_jsx(Column, { children: sizes.map(size => (_jsxs(Group, Object.assign({ type: GROUP_TYPE.REGION }, { children: [_jsx(Heading, Object.assign({ size: HEADING_SIZE.MD }, { children: size.label })), _jsx(Button, Object.assign({}, args, { size: size.size, sx: { mt: 1 } }))] })))) })),
44
+ render: (args) => (_jsx(Column, { children: sizes.map((size) => (_jsxs(Group, Object.assign({ type: GROUP_TYPE.REGION }, { children: [_jsx(Heading, Object.assign({ size: HEADING_SIZE.MD }, { children: size.label })), _jsx(Button, Object.assign({}, args, { size: size.size, sx: { mt: 1 } }))] })))) })),
45
+ args: {
46
+ type: BUTTON_TYPE.TEXT,
47
+ onClick: () => { },
48
+ children: 'Click Me',
49
+ },
50
+ };
51
+ export const IconButton = {
52
+ render: (args) => (_jsx(Column, { children: sizes.map((size) => (_jsxs(Group, Object.assign({ type: GROUP_TYPE.REGION }, { children: [_jsx(Heading, Object.assign({ size: HEADING_SIZE.MD }, { children: size.label })), _jsx(Button, Object.assign({}, args, { size: size.size, sx: { mt: 1 }, primaryIcon: SettingsIcon }))] })))) })),
34
53
  args: {
35
54
  type: BUTTON_TYPE.TEXT,
55
+ children: 'Click Me',
56
+ onClick: () => { },
57
+ },
58
+ };
59
+ export const LeftIcon = {
60
+ render: (args) => (_jsx(Column, { children: sizes.map((size) => (_jsxs(Group, Object.assign({ type: GROUP_TYPE.REGION }, { children: [_jsx(Heading, Object.assign({ size: HEADING_SIZE.MD }, { children: size.label })), _jsx(Button, Object.assign({}, args, { size: size.size, sx: { mt: 1 }, leftIcon: SearchIcon }))] })))) })),
61
+ args: {
62
+ onClick: () => { },
63
+ children: 'Search',
64
+ },
65
+ };
66
+ export const RightIcon = {
67
+ render: (args) => (_jsx(Column, { children: sizes.map((size) => (_jsxs(Group, Object.assign({ type: GROUP_TYPE.REGION }, { children: [_jsx(Heading, Object.assign({ size: HEADING_SIZE.MD }, { children: size.label })), _jsx(Button, Object.assign({}, args, { size: size.size, sx: { mt: 1 }, rightIcon: ArrowDropDownIcon }))] })))) })),
68
+ args: {
36
69
  onClick: () => { },
37
- children: "Click Me"
38
- }
70
+ children: 'Select',
71
+ },
39
72
  };
@@ -1,8 +1,11 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { fireEvent } from '@testing-library/react';
3
3
  import { vi } from 'vitest';
4
4
  import { render } from '../../../utils/test';
5
- import { Button } from ".";
5
+ import { Button } from '.';
6
+ const MockPrimaryIcon = () => _jsx("div", { children: "Mock Primary Icon" });
7
+ const MockLeftIcon = () => _jsx("div", { children: "Mock Left Icon" });
8
+ const MockRightIcon = () => _jsx("div", { children: "Mock Right Icon" });
6
9
  describe('Button', () => {
7
10
  const mockClickHandler = vi.fn();
8
11
  afterEach(() => {
@@ -12,6 +15,12 @@ describe('Button', () => {
12
15
  const { getByText } = render(_jsx(Button, { children: "Foo" }));
13
16
  expect(getByText('Foo')).toBeInTheDocument();
14
17
  });
18
+ it('renders icon component passed to it', () => {
19
+ const { getByText } = render(_jsxs(_Fragment, { children: [_jsx(Button, Object.assign({ leftIcon: MockLeftIcon }, { children: "Click Me" })), _jsx(Button, Object.assign({ primaryIcon: MockPrimaryIcon }, { children: "Click Me" })), _jsx(Button, Object.assign({ rightIcon: MockRightIcon }, { children: "Click Me" }))] }));
20
+ expect(getByText('Mock Primary Icon')).toBeDefined();
21
+ expect(getByText('Mock Left Icon')).toBeDefined();
22
+ expect(getByText('Mock Right Icon')).toBeDefined();
23
+ });
15
24
  it('responds to click handlers', () => {
16
25
  const { getByRole } = render(_jsx(Button, { onClick: mockClickHandler }));
17
26
  fireEvent.click(getByRole('button'));