@symply.io/basic-components 1.1.1 → 1.1.2-beta.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.
@@ -0,0 +1,3 @@
1
+ import { TableBodyProps, KvProps } from "./types";
2
+ declare function TBody<RowProps extends KvProps, ExtendedProps extends KvProps>(props: TableBodyProps<RowProps, ExtendedProps>): JSX.Element;
3
+ export default TBody;
@@ -0,0 +1,21 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import { jsx as _jsx } from "react/jsx-runtime";
13
+ import TableRow from "@mui/material/TableRow";
14
+ import TableBody from "@mui/material/TableBody";
15
+ import TableCell from "@mui/material/TableCell";
16
+ import TableBodyRow from "./TableBodyRow";
17
+ function TBody(props) {
18
+ var rows = props.rows, columns = props.columns, forFrozen = props.forFrozen, _a = props.noDataText, noDataText = _a === void 0 ? "No Data!" : _a, onRowClick = props.onRowClick;
19
+ return (_jsx(TableBody, { children: rows.length > 0 ? (rows.map(function (row, index) { return (_jsx(TableBodyRow, { row: row, rows: rows, columns: columns, forFrozen: forFrozen, onRowClick: onRowClick }, "DataTable_".concat(index))); })) : (_jsx(TableRow, { children: _jsx(TableCell, __assign({ colSpan: columns.length, align: "center" }, { children: noDataText })) })) }));
20
+ }
21
+ export default TBody;
@@ -0,0 +1,3 @@
1
+ import { TableBodyRowProps, KvProps } from "./types";
2
+ declare function TableBodyRow<RowProps extends KvProps, ExtendedProps extends KvProps>(props: TableBodyRowProps<RowProps, ExtendedProps>): JSX.Element;
3
+ export default TableBodyRow;
@@ -0,0 +1,36 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import { jsx as _jsx } from "react/jsx-runtime";
13
+ import { cloneElement } from "react";
14
+ import TableRow from "@mui/material/TableRow";
15
+ import TableCell from "@mui/material/TableCell";
16
+ import { alpha, useTheme } from "@mui/material/styles";
17
+ function TableBodyRow(props) {
18
+ var row = props.row, rows = props.rows, columns = props.columns, forFrozen = props.forFrozen, onRowClick = props.onRowClick;
19
+ var theme = useTheme();
20
+ return (_jsx(TableRow, __assign({ sx: {
21
+ "&:hover": {
22
+ cursor: !forFrozen && onRowClick ? "pointer" : "default",
23
+ backgroundColor: !forFrozen && onRowClick
24
+ ? alpha(theme.palette.primary.main, theme.palette.action.hoverOpacity)
25
+ : "initial"
26
+ }
27
+ }, onClick: !forFrozen && onRowClick
28
+ ? function () {
29
+ onRowClick(row);
30
+ }
31
+ : undefined }, { children: columns.map(function (col) {
32
+ var accessor = col.accessor, Cell = col.Cell, width = col.width, _a = col.align, align = _a === void 0 ? "center" : _a;
33
+ return (_jsx(TableCell, __assign({ align: align, sx: { width: width } }, { children: cloneElement(Cell, { column: col, rows: rows, row: row }) }), accessor));
34
+ }) })));
35
+ }
36
+ export default TableBodyRow;
@@ -0,0 +1,3 @@
1
+ import { TableFooterProps, KvProps } from "./types";
2
+ declare function TableFooter<RowProps extends KvProps, ExtendedProps extends KvProps>(props: TableFooterProps<RowProps, ExtendedProps>): JSX.Element;
3
+ export default TableFooter;
@@ -0,0 +1,30 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import { jsx as _jsx } from "react/jsx-runtime";
13
+ import { cloneElement } from "react";
14
+ import TableRow from "@mui/material/TableRow";
15
+ import Footer from "@mui/material/TableFooter";
16
+ import TableCell from "@mui/material/TableCell";
17
+ function TableFooter(props) {
18
+ var footers = props.footers;
19
+ return (_jsx(Footer, { children: _jsx(TableRow, __assign({ sx: { backgroundColor: "#eaf0f6" } }, { children: footers.map(function (footer) {
20
+ var accessor = footer.accessor, Cell = footer.Cell, _a = footer.disablePadding, disablePadding = _a === void 0 ? false : _a, _b = footer.align, align = _b === void 0 ? "center" : _b, width = footer.width;
21
+ return (_jsx(TableCell, __assign({ align: align, padding: disablePadding ? "none" : "normal", sx: {
22
+ width: width,
23
+ whiteSpace: "nowrap",
24
+ textOverflow: "ellipsis",
25
+ overflow: "hidden",
26
+ userSelect: "none"
27
+ } }, { children: cloneElement(Cell) }), accessor));
28
+ }) })) }));
29
+ }
30
+ export default TableFooter;
@@ -0,0 +1,3 @@
1
+ import { TableHeaderProps, KvProps } from "./types";
2
+ declare function TableHeader<RowProps extends KvProps, ExtendedProps extends KvProps>(props: TableHeaderProps<RowProps, ExtendedProps>): JSX.Element;
3
+ export default TableHeader;
@@ -0,0 +1,33 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import { jsx as _jsx } from "react/jsx-runtime";
13
+ import { cloneElement } from "react";
14
+ import TableRow from "@mui/material/TableRow";
15
+ import TableHead from "@mui/material/TableHead";
16
+ import TableCell from "@mui/material/TableCell";
17
+ function TableHeader(props) {
18
+ var headers = props.headers;
19
+ return (_jsx(TableHead, { children: _jsx(TableRow, __assign({ sx: { backgroundColor: "#eaf0f6" } }, { children: headers.map(function (header) {
20
+ var accessor = header.accessor, Cell = header.Cell, _a = header.disablePadding, disablePadding = _a === void 0 ? false : _a, _b = header.align, align = _b === void 0 ? "center" : _b, width = header.width, title = header.title, _c = header.sortable, sortable = _c === void 0 ? false : _c, onSort = header.onSort;
21
+ return (_jsx(TableCell, __assign({ title: title, align: align, padding: disablePadding ? "none" : "normal", sx: {
22
+ width: width,
23
+ whiteSpace: "nowrap",
24
+ textOverflow: "ellipsis",
25
+ overflow: "hidden",
26
+ userSelect: "none",
27
+ cursor: sortable ? "pointer" : "default"
28
+ }, onClick: function () {
29
+ onSort({ accessor: accessor });
30
+ } }, { children: cloneElement(Cell) }), accessor));
31
+ }) })) }));
32
+ }
33
+ export default TableHeader;
@@ -0,0 +1,4 @@
1
+ import { DataTableProps, KvProps } from "./types";
2
+ declare function DataTable<RowProps extends KvProps, ExtendedProps extends KvProps>(props: DataTableProps<RowProps, ExtendedProps>): JSX.Element;
3
+ export default DataTable;
4
+ export { default as useDataTable } from "./useTable";
@@ -0,0 +1,28 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
13
+ import Table from "@mui/material/Table";
14
+ import TableContainer from "@mui/material/TableContainer";
15
+ import useMediaQuery from "@mui/material/useMediaQuery";
16
+ import ThemeProvider from "@mui/material/styles/ThemeProvider";
17
+ import useCustomTheme from "../useCustomTheme";
18
+ import TableBody from "./TableBody";
19
+ import TableHeader from "./TableHeader";
20
+ import TableFooter from "./TableFooter";
21
+ function DataTable(props) {
22
+ var _a = props.columns, columns = _a === void 0 ? [] : _a, _b = props.rows, rows = _b === void 0 ? [] : _b, _c = props.headers, headers = _c === void 0 ? [] : _c, _d = props.footers, footers = _d === void 0 ? [] : _d, _e = props.noDataText, noDataText = _e === void 0 ? "No Data!" : _e, dense = props.dense, stickyHeader = props.stickyHeader, primaryColor = props.primaryColor, secondaryColor = props.secondaryColor, onRowClick = props.onRowClick;
23
+ var theme = useCustomTheme({ primaryColor: primaryColor, secondaryColor: secondaryColor });
24
+ var isUpMd = useMediaQuery(theme.breakpoints.up("md"));
25
+ return (_jsx(ThemeProvider, __assign({ theme: theme }, { children: _jsxs(TableContainer, { children: [_jsxs(Table, __assign({ sx: { minWidth: 600 }, stickyHeader: stickyHeader, size: dense ? "small" : "medium" }, { children: [_jsx(TableHeader, { headers: headers }), _jsx(TableBody, { rows: rows, columns: columns, noDataText: noDataText, onRowClick: onRowClick })] })), footers.length > 0 ? _jsx(TableFooter, { footers: footers }) : _jsx(_Fragment, {})] }) })));
26
+ }
27
+ export default DataTable;
28
+ export { default as useDataTable } from "./useTable";
@@ -0,0 +1,70 @@
1
+ import { ReactElement, CSSProperties } from "react";
2
+ export declare type OrderType = "ASC" | "DESC" | "NONE";
3
+ export declare type KvProps = Record<string, unknown>;
4
+ export declare type SortingProps = {
5
+ accessor: string;
6
+ order: OrderType;
7
+ };
8
+ declare type InitialStateProps = {
9
+ sortBy?: SortingProps;
10
+ };
11
+ export declare type ColumnProps = {
12
+ headerTip?: string;
13
+ disablePadding?: boolean;
14
+ Header: ReactElement;
15
+ Body: ReactElement;
16
+ Footer?: ReactElement;
17
+ align?: "left" | "center" | "right";
18
+ accessor: string;
19
+ sortable?: boolean;
20
+ fixable?: "left" | "right";
21
+ width?: number;
22
+ };
23
+ export declare type UseTableBaseProps<RowProps extends KvProps> = {
24
+ data: Array<RowProps>;
25
+ columns: Array<ColumnProps>;
26
+ initialState?: InitialStateProps;
27
+ disableSortBy?: boolean;
28
+ onSort?: (props: SortingProps) => unknown;
29
+ };
30
+ export declare type UseTableProps<RowProps extends KvProps, ExtendedProps extends KvProps> = UseTableBaseProps<RowProps> & ExtendedProps;
31
+ export declare type TableHeaderCellProps<RowProps extends KvProps, ExtendedProps extends KvProps> = Pick<ColumnProps, "align" | "accessor" | "fixable" | "width" | "disablePadding"> & Omit<UseTableProps<RowProps, ExtendedProps>, keyof UseTableBaseProps<RowProps>> & {
32
+ Cell: ReactElement;
33
+ title: string;
34
+ onSort: ({ accessor }: Pick<SortingProps, "accessor">) => unknown;
35
+ };
36
+ export declare type TableBodyCellProps<RowProps extends KvProps, ExtendedProps extends KvProps> = Pick<ColumnProps, "align" | "accessor" | "fixable" | "width" | "disablePadding"> & Omit<UseTableProps<RowProps, ExtendedProps>, keyof UseTableBaseProps<RowProps>> & {
37
+ Cell: ReactElement;
38
+ };
39
+ export declare type TableFooterCellProps<RowProps extends KvProps, ExtendedProps extends KvProps> = Pick<ColumnProps, "align" | "accessor" | "fixable" | "width" | "disablePadding"> & Omit<UseTableProps<RowProps, ExtendedProps>, keyof UseTableBaseProps<RowProps>> & {
40
+ Cell: ReactElement;
41
+ };
42
+ export declare type UserTableReturns<RowProps extends KvProps, ExtendedProps extends KvProps> = {
43
+ headers: Array<TableHeaderCellProps<RowProps, ExtendedProps>>;
44
+ footers: Array<TableFooterCellProps<RowProps, ExtendedProps>>;
45
+ columns: Array<TableBodyCellProps<RowProps, ExtendedProps>>;
46
+ rows: Array<RowProps>;
47
+ };
48
+ export declare type TableHeaderProps<RowProps extends KvProps, ExtendedProps extends KvProps> = {
49
+ headers: Array<TableHeaderCellProps<RowProps, ExtendedProps>>;
50
+ };
51
+ export declare type TableBodyProps<RowProps extends KvProps, ExtendedProps extends KvProps> = {
52
+ columns: Array<TableBodyCellProps<RowProps, ExtendedProps>>;
53
+ rows: Array<RowProps>;
54
+ noDataText?: string;
55
+ forFrozen?: boolean;
56
+ onRowClick?: (row: RowProps) => unknown;
57
+ };
58
+ export declare type TableBodyRowProps<RowProps extends KvProps, ExtendedProps extends KvProps> = Omit<TableBodyProps<RowProps, ExtendedProps>, "noDataText"> & {
59
+ row: RowProps;
60
+ };
61
+ export declare type TableFooterProps<RowProps extends KvProps, ExtendedProps extends KvProps> = {
62
+ footers: Array<TableFooterCellProps<RowProps, ExtendedProps>>;
63
+ };
64
+ export declare type DataTableProps<RowProps extends KvProps, ExtendedProps extends KvProps> = TableHeaderProps<RowProps, ExtendedProps> & Omit<TableBodyProps<RowProps, ExtendedProps>, "forFrozen"> & TableFooterProps<RowProps, ExtendedProps> & {
65
+ dense?: boolean;
66
+ stickyHeader?: boolean;
67
+ primaryColor?: CSSProperties["color"];
68
+ secondaryColor?: CSSProperties["color"];
69
+ };
70
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,3 @@
1
+ import { UseTableProps, KvProps, UserTableReturns } from "./types";
2
+ declare function useTable<T extends KvProps, F extends KvProps>(props: UseTableProps<T, F>): UserTableReturns<T, F>;
3
+ export default useTable;
@@ -0,0 +1,94 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __rest = (this && this.__rest) || function (s, e) {
13
+ var t = {};
14
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
15
+ t[p] = s[p];
16
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
17
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
18
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
19
+ t[p[i]] = s[p[i]];
20
+ }
21
+ return t;
22
+ };
23
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
24
+ import { cloneElement, useState, useMemo, useCallback } from "react";
25
+ function useTable(props) {
26
+ var data = props.data, columns = props.columns, initialState = props.initialState, disableSortBy = props.disableSortBy, onSort = props.onSort, rest = __rest(props, ["data", "columns", "initialState", "disableSortBy", "onSort"]);
27
+ if (!data) {
28
+ throw new Error('"data" is required but got null or undefined');
29
+ }
30
+ if (!columns) {
31
+ throw new Error('"columns" is required but got null or undefined');
32
+ }
33
+ var sortBy = (initialState || {}).sortBy;
34
+ var _a = sortBy || {}, accessor = _a.accessor, order = _a.order;
35
+ var _b = useState({
36
+ accessor: accessor || "",
37
+ order: !!accessor ? order || "NONE" : "NONE"
38
+ }), sortingProps = _b[0], setSortingProps = _b[1];
39
+ var handleSort = useCallback(function (_a) {
40
+ var accessor = _a.accessor;
41
+ if (!disableSortBy) {
42
+ var newSortingProps = __assign({}, sortingProps);
43
+ if (accessor !== sortingProps.accessor ||
44
+ sortingProps.order === "NONE") {
45
+ newSortingProps = { accessor: accessor, order: "ASC" };
46
+ }
47
+ else if (sortingProps.order === "ASC") {
48
+ newSortingProps = __assign(__assign({}, sortingProps), { order: "DESC" });
49
+ }
50
+ else {
51
+ newSortingProps = __assign(__assign({}, sortingProps), { order: "NONE" });
52
+ }
53
+ if (onSort) {
54
+ onSort(__assign({}, newSortingProps));
55
+ }
56
+ setSortingProps(__assign({}, newSortingProps));
57
+ }
58
+ }, [disableSortBy, onSort, sortingProps]);
59
+ var renderSortingSymbol = useCallback(function (accessor) {
60
+ var field = sortingProps.accessor, order = sortingProps.order;
61
+ if (accessor !== field || order === "NONE") {
62
+ return "";
63
+ }
64
+ if (order === "ASC") {
65
+ return "↑";
66
+ }
67
+ return "↓";
68
+ }, [sortingProps]);
69
+ var rows = useMemo(function () { return data.map(function (d) { return (__assign({}, d)); }); }, [data]);
70
+ var cols = useMemo(function () {
71
+ return columns.map(function (col) {
72
+ var Body = col.Body;
73
+ return __assign(__assign({ Cell: cloneElement(Body || _jsx(_Fragment, {}), { column: col }) }, col), rest);
74
+ });
75
+ }, [columns, rest]);
76
+ var headers = useMemo(function () {
77
+ return columns.map(function (col) {
78
+ var Header = col.Header, accessor = col.accessor, sortable = col.sortable, headerTip = col.headerTip;
79
+ var canSortBy = sortable && !disableSortBy;
80
+ return __assign(__assign({ Cell: (_jsxs(_Fragment, { children: [cloneElement(Header || _jsx(_Fragment, {}), { column: col }), canSortBy && renderSortingSymbol(accessor)] })), title: "".concat(headerTip || "").concat(canSortBy ? " (Click to sort)" : ""), sortable: canSortBy, onSort: canSortBy ? handleSort : function () { } }, col), rest);
81
+ });
82
+ }, [columns, disableSortBy, handleSort, renderSortingSymbol, rest]);
83
+ var footers = useMemo(function () {
84
+ return columns.map(function (col) {
85
+ var Footer = col.Footer;
86
+ return __assign(__assign({ Cell: cloneElement(Footer || _jsx(_Fragment, {}), {
87
+ column: col,
88
+ rows: rows
89
+ }) }, col), rest);
90
+ });
91
+ }, [columns, rest, rows]);
92
+ return { headers: headers, footers: footers, columns: cols, rows: rows };
93
+ }
94
+ export default useTable;
@@ -10,13 +10,12 @@ var __assign = (this && this.__assign) || function () {
10
10
  return __assign.apply(this, arguments);
11
11
  };
12
12
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
13
- import colorAlpha from "color-alpha";
14
13
  import Chip from "@mui/material/Chip";
15
14
  import ListItem from "@mui/material/ListItem";
16
15
  import ListItemText from "@mui/material/ListItemText";
17
16
  import ListItemIcon from "@mui/material/ListItemIcon";
18
17
  import LockIcon from "@mui/icons-material/LockRounded";
19
- import useTheme from "@mui/material/styles/useTheme";
18
+ import { useTheme, alpha } from "@mui/material/styles";
20
19
  import ChevronRightIcon from "@mui/icons-material/ChevronRight";
21
20
  import ExpandMoreIcon from "@mui/icons-material/ExpandMore";
22
21
  function SidebarItem(props) {
@@ -27,10 +26,10 @@ function SidebarItem(props) {
27
26
  display: "flex",
28
27
  width: "100%",
29
28
  "&:hover": {
30
- backgroundColor: colorAlpha(theme.palette.primary.main, 0.3)
29
+ backgroundColor: alpha(theme.palette.primary.main, theme.palette.action.hoverOpacity)
31
30
  },
32
31
  backgroundColor: active
33
- ? colorAlpha(theme.palette.primary.main, 0.2)
32
+ ? alpha(theme.palette.primary.main, theme.palette.action.activatedOpacity)
34
33
  : undefined
35
34
  } }, { children: [_jsx(ListItemIcon, __assign({ sx: {
36
35
  color: active ? theme.palette.primary.main : undefined,
package/index.d.ts CHANGED
@@ -6,6 +6,7 @@ export * from "./BasicTable";
6
6
  export * from "./BreadCrumbs";
7
7
  export * from "./CheckBox";
8
8
  export * from "./Copyright";
9
+ export * from "./DataTable";
9
10
  export * from "./DateInput";
10
11
  export * from "./DigitInput";
11
12
  export * from "./DynamicHeaderBar";
@@ -33,6 +34,7 @@ export { default as BasicModal } from "./BasicModal";
33
34
  export { default as BasicTable } from "./BasicTable";
34
35
  export { default as BreadCrumbs } from "./BreadCrumbs";
35
36
  export { default as Copyright } from "./Copyright";
37
+ export { default as DataTable } from "./DataTable";
36
38
  export { default as DigitInput } from "./DigitInput";
37
39
  export { default as DynamicHeaderBar } from "./DynamicHeaderBar";
38
40
  export { default as FeinInput } from "./FeinInput";
package/index.js CHANGED
@@ -6,6 +6,7 @@ export * from "./BasicTable";
6
6
  export * from "./BreadCrumbs";
7
7
  export * from "./CheckBox";
8
8
  export * from "./Copyright";
9
+ export * from "./DataTable";
9
10
  export * from "./DateInput";
10
11
  export * from "./DigitInput";
11
12
  export * from "./DynamicHeaderBar";
@@ -33,6 +34,7 @@ export { default as BasicModal } from "./BasicModal";
33
34
  export { default as BasicTable } from "./BasicTable";
34
35
  export { default as BreadCrumbs } from "./BreadCrumbs";
35
36
  export { default as Copyright } from "./Copyright";
37
+ export { default as DataTable } from "./DataTable";
36
38
  export { default as DigitInput } from "./DigitInput";
37
39
  export { default as DynamicHeaderBar } from "./DynamicHeaderBar";
38
40
  export { default as FeinInput } from "./FeinInput";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@symply.io/basic-components",
3
- "version": "1.1.1",
3
+ "version": "1.1.2-beta.2",
4
4
  "description": "Basic and reusable components for all frontend of Symply apps",
5
5
  "keywords": [
6
6
  "react",