@madie/madie-design-system 2.0.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/.babelrc +14 -2
  2. package/.storybook/preview.js +1 -1
  3. package/components/Accordion/index.jsx +32 -36
  4. package/components/AutoComplete/AutoComplete.jsx +1 -16
  5. package/components/Button/Button.stories.js +0 -5
  6. package/components/Button/index.js +34 -44
  7. package/components/DateField/DateField.jsx +1 -14
  8. package/components/DateTimeField/DateTimeField.jsx +1 -9
  9. package/components/InputLabel/index.jsx +1 -6
  10. package/components/Instant/index.jsx +0 -16
  11. package/components/Link/index.js +42 -0
  12. package/components/MadieAlert/index.jsx +1 -40
  13. package/components/MadieConfirmDialog/MadieConfirmDialog.stories.js +0 -5
  14. package/components/MadieConfirmDialog/index.jsx +0 -8
  15. package/components/MadieDeleteDialog/MadieDeleteDialog.stories.js +24 -5
  16. package/components/MadieDeleteDialog/index.jsx +18 -8
  17. package/components/MadieDialog/MadieDialog.stories.js +0 -5
  18. package/components/MadieDialog/index.jsx +0 -21
  19. package/components/MadieDiscardDialog/MadieDiscardDialog.stories.js +0 -5
  20. package/components/MadieDiscardDialog/index.jsx +0 -7
  21. package/components/MadieSpinner/MadieSpinner.stories.js +0 -6
  22. package/components/MadieSpinner/index.jsx +0 -5
  23. package/components/MadieTooltip/index.jsx +0 -6
  24. package/components/MadieTooltipIcon/index.jsx +0 -5
  25. package/components/Modal/Modal.jsx +31 -43
  26. package/components/Modal/index.jsx +6 -8
  27. package/components/NumberInput/NumberInput.stories.js +0 -5
  28. package/components/NumberInput/index.jsx +0 -13
  29. package/components/Pagination/index.jsx +0 -17
  30. package/components/Popover/index.js +0 -23
  31. package/components/RadioButton/RadioButton.jsx +1 -13
  32. package/components/ReadOnlyTextField/ReadOnlyTextField.stories.js +0 -6
  33. package/components/ReadOnlyTextField/index.jsx +0 -8
  34. package/components/RichTextEditor/index.jsx +0 -15
  35. package/components/SanitizedContent/index.jsx +0 -8
  36. package/components/Search/index.js +26 -40
  37. package/components/Select/Select.stories.js +0 -4
  38. package/components/Select/index.jsx +1 -16
  39. package/components/Tabs/Tab.js +29 -25
  40. package/components/Tabs/TabPanel.js +15 -19
  41. package/components/Tabs/Tabs.stories.js +14 -50
  42. package/components/Tabs/index.js +10 -28
  43. package/components/TextArea/TextArea.stories.js +0 -6
  44. package/components/TextArea/index.jsx +1 -13
  45. package/components/TextField/TextField.stories.js +0 -6
  46. package/components/TextField/index.jsx +1 -16
  47. package/components/TimeField/TimeField.jsx +0 -10
  48. package/components/Toast/index.jsx +0 -14
  49. package/components/TruncateText/index.js +0 -8
  50. package/components/{index.js → index.mjs} +37 -33
  51. package/dist/index.js +3 -1
  52. package/dist/index.js.LICENSE.txt +16 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/react/index.html +1 -1
  55. package/dist/react/index.mjs +103 -0
  56. package/dist/react/{index.js.LICENSE.txt → index.mjs.LICENSE.txt} +0 -52
  57. package/dist/react/index.mjs.map +1 -0
  58. package/dist/react/package.json +1 -0
  59. package/{eslint.config.js → eslint.config.cjs} +3 -0
  60. package/jest.config.mjs +10 -0
  61. package/lib/Chevron.jsx +2 -10
  62. package/package.json +18 -10
  63. package/styles/_main.scss +4 -3
  64. package/test/components/Button.test.js +6 -16
  65. package/test/components/MadieDeleteDialog.test.js +30 -1
  66. package/test/components/Search.test.js +1 -1
  67. package/test/components/TruncateText.test.js +1 -1
  68. package/webpack.config.mjs +79 -0
  69. package/webpack.config.react.mjs +72 -0
  70. package/components/NotificationBanner/NotificationBanner.stories.js +0 -29
  71. package/components/NotificationBanner/index.js +0 -279
  72. package/components/UnwrappedSpinner/index.js +0 -8
  73. package/dist/browser.js +0 -1
  74. package/dist/react/index.js +0 -316
  75. package/dist/react/index.js.map +0 -1
  76. package/jest.config.js +0 -17
  77. package/webpack.config.js +0 -123
  78. package/webpack.config.react.js +0 -104
@@ -1,5 +1,4 @@
1
1
  import React from "react";
2
- import PropTypes from "prop-types";
3
2
  import { Tab as MuiTab } from "@mui/material";
4
3
 
5
4
  const typeA = {
@@ -14,6 +13,7 @@ const typeA = {
14
13
  boxShadow: "0px 0px 0px 4px #CBE4FF",
15
14
  },
16
15
  };
16
+
17
17
  const typeB = {
18
18
  color: "#515151",
19
19
  "&:hover": {
@@ -25,6 +25,7 @@ const typeB = {
25
25
  background: "#fff",
26
26
  },
27
27
  };
28
+
28
29
  const typeC = {
29
30
  color: "#333",
30
31
  background: "#EDEDED",
@@ -38,7 +39,20 @@ const typeC = {
38
39
  },
39
40
  };
40
41
 
41
- const Tab = ({ type, orientation, size, ...rest }) => {
42
+ /**
43
+ * @param {{
44
+ * type?: "A" | "B" | "C" | "D",
45
+ * size?: "standard" | string,
46
+ * orientation?: "horizontal" | "vertical",
47
+ * [key: string]: any
48
+ * }} props
49
+ */
50
+ const Tab = ({
51
+ type = "A",
52
+ size = "standard",
53
+ orientation = "horizontal",
54
+ ...rest
55
+ }) => {
42
56
  const baseStyle = {
43
57
  height: size === "standard" ? "48px" : "60px",
44
58
  fontFamily: "Rubik, sans serif",
@@ -46,35 +60,25 @@ const Tab = ({ type, orientation, size, ...rest }) => {
46
60
  padding: size === "standard" ? "14.5px 24px" : "20.5px 24px",
47
61
  textTransform: "none",
48
62
  fontSize: "16px",
49
- alignItems: orientation === "vertical" && "flex-start",
63
+ alignItems: orientation === "vertical" ? "flex-start" : undefined,
50
64
  "&.Mui-disabled": {
51
65
  background: "#DDDDDD",
52
66
  color: "#717171 !important",
53
67
  },
54
68
  };
55
- const style = ((type) => {
56
- if (type === "A") {
57
- return { ...baseStyle, ...typeA };
58
- }
59
- if (type === "B" || type === "D") {
60
- return { ...baseStyle, ...typeB };
61
- }
62
- if (type === "C") {
63
- return { ...baseStyle, ...typeC };
64
- }
65
- })(type);
66
- return <MuiTab tabIndex={0} sx={style} {...rest} />;
67
- };
68
69
 
69
- Tab.propTypes = {
70
- orientation: PropTypes.string,
71
- type: PropTypes.oneOf(["A", "B", "C", "D"]),
72
- size: PropTypes.oneOf(["standard", "large"]),
73
- };
74
- Tab.defaultProps = {
75
- type: "A",
76
- size: "standard",
77
- onChange: null,
70
+ const variantStyles =
71
+ type === "A"
72
+ ? typeA
73
+ : type === "B" || type === "D"
74
+ ? typeB
75
+ : type === "C"
76
+ ? typeC
77
+ : {};
78
+
79
+ const style = { ...baseStyle, ...variantStyles };
80
+
81
+ return <MuiTab tabIndex={0} sx={style} {...rest} />;
78
82
  };
79
83
 
80
84
  export default Tab;
@@ -1,15 +1,25 @@
1
1
  import React from "react";
2
- import PropTypes from "prop-types";
3
2
 
3
+ /**
4
+ * @param {{
5
+ * children?: React.ReactNode,
6
+ * value?: number,
7
+ * id: string,
8
+ * index?: number,
9
+ * className?: string,
10
+ * disabled?: boolean
11
+ * }} props
12
+ */
4
13
  export const TabPanel = ({
5
14
  children,
6
- value,
15
+ value = 0,
16
+ index = 0,
7
17
  id,
8
- index,
9
- className,
10
- disabled,
18
+ className = "",
19
+ disabled = false,
11
20
  }) => {
12
21
  const classes = ["qpp-c-tabs__panel", className].filter(Boolean).join(" ");
22
+
13
23
  return (
14
24
  <div
15
25
  role="tabpanel"
@@ -24,18 +34,4 @@ export const TabPanel = ({
24
34
  );
25
35
  };
26
36
 
27
- TabPanel.propTypes = {
28
- children: PropTypes.node,
29
- className: PropTypes.string,
30
- index: PropTypes.number.isRequired,
31
- id: PropTypes.string,
32
- value: PropTypes.number.isRequired,
33
- disabled: PropTypes.bool,
34
- };
35
-
36
- TabPanel.defaultProps = {
37
- index: 0,
38
- value: 0,
39
- };
40
-
41
37
  export default TabPanel;
@@ -2,7 +2,6 @@ import React, { useState } from "react";
2
2
  import "./tabs.scss";
3
3
  import Tabs from "./index";
4
4
  import Tab from "./Tab";
5
- import PropTypes from "prop-types";
6
5
 
7
6
  export default {
8
7
  title: "Tabs",
@@ -23,21 +22,18 @@ export default {
23
22
  },
24
23
  };
25
24
 
25
+ /**
26
+ * @param {{
27
+ * type: "A" | "B" | "C" | "D",
28
+ * size: "standard" | "large",
29
+ * orientation: "horizontal" | "vertical"
30
+ * }} props
31
+ */
26
32
  const Template = ({ type, size, orientation }) => {
27
33
  const [selected, setSelected] = useState(1);
34
+ const handleChange = (_, value) => setSelected(value);
28
35
 
29
- const handleChange = (event, value) => {
30
- setSelected(value);
31
- };
32
-
33
- const tabProps = {
34
- type,
35
- size,
36
- orientation,
37
- };
38
-
39
- const tabsOrientation =
40
- orientation === "vertical" ? "vertical" : "horizontal";
36
+ const tabProps = { type, size, orientation };
41
37
 
42
38
  return (
43
39
  <div
@@ -46,48 +42,16 @@ const Template = ({ type, size, orientation }) => {
46
42
  width: orientation === "vertical" ? 200 : "fit-content",
47
43
  }}
48
44
  >
49
- <Tabs
50
- type={type}
51
- size={size}
52
- orientation={tabsOrientation}
53
- value={selected}
54
- onChange={handleChange}
55
- >
56
- <Tab
57
- {...tabProps}
58
- label="Item One"
59
- value={1}
60
- orientation={tabsOrientation}
61
- />
62
- <Tab
63
- {...tabProps}
64
- label="Item Two"
65
- value={2}
66
- orientation={tabsOrientation}
67
- />
68
- <Tab
69
- {...tabProps}
70
- label="Item Three"
71
- value={3}
72
- orientation={tabsOrientation}
73
- />
74
- <Tab
75
- {...tabProps}
76
- label="disabled"
77
- value={4}
78
- disabled
79
- orientation={tabsOrientation}
80
- />
45
+ <Tabs {...tabProps} value={selected} onChange={handleChange}>
46
+ <Tab {...tabProps} label="Item One" value={1} />
47
+ <Tab {...tabProps} label="Item Two" value={2} />
48
+ <Tab {...tabProps} label="Item Three" value={3} />
49
+ <Tab {...tabProps} label="disabled" value={4} disabled />
81
50
  </Tabs>
82
51
  </div>
83
52
  );
84
53
  };
85
54
 
86
- Template.propTypes = {
87
- type: PropTypes.string.isRequired,
88
- size: PropTypes.string.isRequired,
89
- orientation: PropTypes.oneOf(["horizontal", "vertical"]).isRequired,
90
- };
91
55
  export const InteractiveTabs = Template.bind({});
92
56
  InteractiveTabs.args = {
93
57
  type: "A",
@@ -1,5 +1,4 @@
1
1
  import React from "react";
2
- import PropTypes from "prop-types";
3
2
  import { Tabs as MuiTabs } from "@mui/material";
4
3
 
5
4
  const typeA = {
@@ -63,7 +62,12 @@ const baseStyle = {
63
62
  },
64
63
  };
65
64
 
66
- const Tabs = ({ type, size, orientation, ...rest }) => {
65
+ const Tabs = ({
66
+ type = "A",
67
+ size = "standard",
68
+ orientation = "horizontal",
69
+ ...rest
70
+ }) => {
67
71
  let style = { ...baseStyle };
68
72
 
69
73
  switch (type) {
@@ -74,11 +78,10 @@ const Tabs = ({ type, size, orientation, ...rest }) => {
74
78
  style = { ...style, ...typeB };
75
79
  break;
76
80
  case "C":
77
- if (orientation === "vertical") {
78
- style = { ...style, ...typeC, ...typeCVerticalSelected };
79
- } else {
80
- style = { ...style, ...typeC };
81
- }
81
+ style =
82
+ orientation === "vertical"
83
+ ? { ...style, ...typeC, ...typeCVerticalSelected }
84
+ : { ...style, ...typeC };
82
85
  break;
83
86
  case "D":
84
87
  style = { ...style, ...typeD };
@@ -92,25 +95,4 @@ const Tabs = ({ type, size, orientation, ...rest }) => {
92
95
  );
93
96
  };
94
97
 
95
- Tabs.propTypes = {
96
- orientation: PropTypes.string,
97
- type: PropTypes.oneOf(["A", "B", "C", "D"]),
98
- size: PropTypes.oneOf(["standard", "large"]),
99
- ariaLabel: PropTypes.string,
100
- selected: PropTypes.string,
101
- defaultSelectedId: PropTypes.string,
102
- onChange: PropTypes.func,
103
- children: PropTypes.oneOfType([PropTypes.node, PropTypes.array]),
104
- };
105
-
106
- Tabs.defaultProps = {
107
- orientation: "horizontal",
108
- type: "A",
109
- size: "standard",
110
- selected: null,
111
- defaultSelectedId: null,
112
- onChange: null,
113
- children: null,
114
- };
115
-
116
98
  export default Tabs;
@@ -1,5 +1,4 @@
1
1
  import React from "react";
2
- import PropTypes from "prop-types";
3
2
  import TextArea from "./index";
4
3
  import { FormHelperText } from "@mui/material";
5
4
 
@@ -25,11 +24,6 @@ const Wrapper = ({ children }) => (
25
24
  </div>
26
25
  );
27
26
 
28
- Wrapper.propTypes = {
29
- className: PropTypes.string,
30
- children: PropTypes.node,
31
- };
32
-
33
27
  const Template = (args) => (
34
28
  <Wrapper>
35
29
  <TextArea
@@ -1,8 +1,7 @@
1
1
  import React from "react";
2
2
  import { FormControl, FormHelperText, TextareaAutosize } from "@mui/material";
3
3
  import InputLabel from "../InputLabel";
4
- import PropTypes from "prop-types";
5
- import { ReadOnlyTextField } from "../index";
4
+ import ReadOnlyTextField from "../ReadOnlyTextField";
6
5
 
7
6
  const TextArea = ({
8
7
  id,
@@ -131,15 +130,4 @@ const TextArea = ({
131
130
  );
132
131
  };
133
132
 
134
- TextArea.propTypes = {
135
- id: PropTypes.string,
136
- error: PropTypes.bool,
137
- helperText: PropTypes.string,
138
- required: PropTypes.bool,
139
- disabled: PropTypes.bool,
140
- placeholder: PropTypes.string, // expects placeholder objects of { name: value } and inserts into the render item function.
141
- label: PropTypes.string,
142
- inputProps: PropTypes.any,
143
- maxLength: PropTypes.number,
144
- };
145
133
  export default TextArea;
@@ -1,5 +1,4 @@
1
1
  import React from "react";
2
- import PropTypes from "prop-types";
3
2
  import TextField from "./index";
4
3
  import { FormHelperText, IconButton, InputAdornment } from "@mui/material";
5
4
  import SearchIcon from "@mui/icons-material/Search";
@@ -30,11 +29,6 @@ const Wrapper = ({ children }) => (
30
29
  </div>
31
30
  );
32
31
 
33
- Wrapper.propTypes = {
34
- className: PropTypes.string,
35
- children: PropTypes.node,
36
- };
37
-
38
32
  const Template = (args) => (
39
33
  <Wrapper>
40
34
  <TextField
@@ -6,8 +6,7 @@ import {
6
6
  } from "@mui/material";
7
7
  import InputLabel from "../InputLabel";
8
8
  import MadieToolTip from "../MadieTooltip";
9
- import PropTypes from "prop-types";
10
- import { ReadOnlyTextField } from "../index";
9
+ import ReadOnlyTextField from "../ReadOnlyTextField";
11
10
 
12
11
  const TextField = ({
13
12
  id,
@@ -204,18 +203,4 @@ const TextField = ({
204
203
  );
205
204
  };
206
205
 
207
- TextField.propTypes = {
208
- id: PropTypes.string,
209
- textFieldStyles: PropTypes.object,
210
- error: PropTypes.bool,
211
- helperText: PropTypes.string,
212
- required: PropTypes.bool,
213
- disabled: PropTypes.bool,
214
- placeholder: PropTypes.string, // expects placeholder objects of { name: value } and inserts into the render item function.
215
- label: PropTypes.string,
216
- tooltipText: PropTypes.string,
217
- inputProps: PropTypes.object,
218
- labelColor: PropTypes.string,
219
- maxLength: PropTypes.number,
220
- };
221
206
  export default TextField;
@@ -4,7 +4,6 @@ import { LocalizationProvider } from "@mui/x-date-pickers/LocalizationProvider";
4
4
  import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
5
5
  import InputLabel from "../InputLabel";
6
6
  import { kebabCase } from "lodash";
7
- import PropTypes from "prop-types";
8
7
 
9
8
  const timeFieldStyle = {
10
9
  width: "170px",
@@ -89,13 +88,4 @@ const TimeField = ({
89
88
  );
90
89
  };
91
90
 
92
- TimeField.propTypes = {
93
- label: PropTypes.string.isRequired,
94
- value: PropTypes.object,
95
- handleTimeChange: PropTypes.func.isRequired,
96
- disabled: PropTypes.bool,
97
- required: PropTypes.bool,
98
- error: PropTypes.string,
99
- };
100
-
101
91
  export default TimeField;
@@ -9,7 +9,6 @@ import { IconButton, Snackbar } from "@mui/material";
9
9
  import ClearIcon from "@mui/icons-material/Clear";
10
10
 
11
11
  import classNames from "classnames";
12
- import PropTypes from "prop-types";
13
12
 
14
13
  const Toast = ({
15
14
  toastType = "warning",
@@ -101,17 +100,4 @@ const Toast = ({
101
100
  );
102
101
  };
103
102
 
104
- Toast.propTypes = {
105
- toastType: PropTypes.string,
106
- open: PropTypes.bool,
107
- message: PropTypes.node,
108
- canClose: PropTypes.bool,
109
- onClose: PropTypes.func,
110
- autoHideDuration: PropTypes.number,
111
- testId: PropTypes.string,
112
- toastKey: PropTypes.string,
113
- toastProps: PropTypes.object,
114
- closeButtonProps: PropTypes.object,
115
- };
116
-
117
103
  export default Toast;
@@ -1,7 +1,6 @@
1
1
  import { IconButton } from "@mui/material";
2
2
  import React, { useState } from "react";
3
3
  import _ from "lodash";
4
- import PropTypes from "prop-types";
5
4
 
6
5
  const TruncateText = ({
7
6
  text,
@@ -42,11 +41,4 @@ const TruncateText = ({
42
41
  );
43
42
  };
44
43
 
45
- TruncateText.propTypes = {
46
- text: PropTypes.string,
47
- maxLength: PropTypes.number,
48
- dataTestId: PropTypes.string,
49
- fontSize: PropTypes.string,
50
- };
51
-
52
44
  export default TruncateText;
@@ -1,37 +1,40 @@
1
- import Accordion from "./Accordion";
2
- import AutoComplete from "./AutoComplete/AutoComplete";
3
- import Button, { TextButton } from "./Button";
4
- import DateField from "./DateField/DateField";
5
- import DateTimeField from "./DateTimeField/DateTimeField";
6
- import Instant from "./Instant";
7
- import InputLabel from "./InputLabel";
8
- import FormControlLabel from "./FormControlLabel";
9
- import MadieAlert from "./MadieAlert";
10
- import MadieDialog from "./MadieDialog";
11
- import MadieDiscardDialog from "./MadieDiscardDialog";
12
- import MadieDeleteDialog from "./MadieDeleteDialog";
13
- import MadieConfirmDialog from "./MadieConfirmDialog";
14
- import MadieSpinner from "./MadieSpinner";
15
- import MadieTooltip from "./MadieTooltip";
16
- import MadieTooltipIcon from "./MadieTooltipIcon";
17
- import Modal from "./Modal";
18
- import Popover from "./Popover";
19
- import { Pagination } from "./Pagination";
20
- import RadioButton from "./RadioButton/RadioButton";
21
- import ReadOnlyTextField from "./ReadOnlyTextField";
22
- import RichTextEditor from "./RichTextEditor";
23
- import Select from "./Select";
24
- import TabPanel from "./Tabs/TabPanel";
25
- import Tabs from "./Tabs/index";
26
- import Tab from "./Tabs/Tab";
27
- import TextField from "./TextField";
28
- import TimeField from "./TimeField/TimeField";
29
- import TextArea from "./TextArea";
30
- import Toast from "./Toast";
31
- import Search from "./Search";
32
- import NumberInput from "./NumberInput";
33
- import TruncateText from "./TruncateText/index";
1
+
2
+ import Accordion from "./Accordion/index.jsx";
3
+ import AutoComplete from "./AutoComplete/AutoComplete.jsx";
4
+ import Button, { TextButton } from "./Button/index.js";
5
+ import DateField from "./DateField/DateField.jsx";
6
+ import DateTimeField from "./DateTimeField/DateTimeField.jsx";
7
+ import DSLink from "./Link/index.js";
8
+ import Instant from "./Instant/index.jsx";
9
+ import InputLabel from "./InputLabel/index.jsx";
10
+ import FormControlLabel from "./FormControlLabel/index.jsx";
11
+ import MadieAlert from "./MadieAlert/index.jsx";
12
+ import MadieDialog from "./MadieDialog/index.jsx";
13
+ import MadieDiscardDialog from "./MadieDiscardDialog/index.jsx";
14
+ import MadieDeleteDialog from "./MadieDeleteDialog/index.jsx";
15
+ import MadieConfirmDialog from "./MadieConfirmDialog/index.jsx";
16
+ import MadieSpinner from "./MadieSpinner/index.jsx";
17
+ import MadieTooltip from "./MadieTooltip/index.jsx";
18
+ import MadieTooltipIcon from "./MadieTooltipIcon/index.jsx";
19
+ import Modal from "./Modal/index.jsx";
20
+ import Popover from "./Popover/index.js";
21
+ import { Pagination } from "./Pagination/index.jsx";
22
+ import RadioButton from "./RadioButton/RadioButton.jsx";
23
+ import ReadOnlyTextField from "./ReadOnlyTextField/index.jsx";
24
+ import RichTextEditor from "./RichTextEditor/index.jsx";
25
+ import Select from "./Select/index.jsx";
26
+ import TabPanel from "./Tabs/TabPanel.js";
27
+ import Tabs from "./Tabs/index.js";
28
+ import Tab from "./Tabs/Tab.js";
29
+ import TextField from "./TextField/index.jsx";
30
+ import TimeField from "./TimeField/TimeField.jsx";
31
+ import TextArea from "./TextArea/index.jsx";
32
+ import Toast from "./Toast/index.jsx";
33
+ import Search from "./Search/index.js";
34
+ import NumberInput from "./NumberInput/index.jsx";
35
+ import TruncateText from "./TruncateText/index.js";
34
36
  import theme from "../themes/actionCenterTheme.js";
37
+
35
38
  import {
36
39
  MyApplicationsIcon,
37
40
  UserSignInIcon,
@@ -120,6 +123,7 @@ export {
120
123
  Button,
121
124
  DateField,
122
125
  DateTimeField,
126
+ DSLink,
123
127
  FormControlLabel,
124
128
  InputLabel,
125
129
  Icons,