@nethru/ui 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 (34) hide show
  1. package/base/Radio.js +22 -0
  2. package/base/Select.js +2 -0
  3. package/base/deprecated/Accordion.js +45 -0
  4. package/base/deprecated/AccordionDetails.js +19 -0
  5. package/base/deprecated/AccordionSummary.js +35 -0
  6. package/base/deprecated/AppendableFormList.js +56 -0
  7. package/base/deprecated/AvatarDropdown.js +80 -0
  8. package/base/deprecated/Button.js +61 -0
  9. package/base/deprecated/CircularProgress.js +33 -0
  10. package/base/deprecated/FormLabel.js +23 -0
  11. package/base/deprecated/GroupSelect.js +67 -0
  12. package/base/deprecated/ListItem.js +21 -0
  13. package/base/deprecated/ListItemDivider.js +15 -0
  14. package/base/deprecated/ListItemGrid.js +12 -0
  15. package/base/deprecated/ListItemText.js +44 -0
  16. package/base/deprecated/ReferenceChipList.js +59 -0
  17. package/base/deprecated/Section.js +22 -0
  18. package/base/deprecated/ShadowedSection.js +36 -0
  19. package/base/deprecated/StatusChip.js +34 -0
  20. package/base/deprecated/TabbedSection.js +37 -0
  21. package/base/deprecated/Tabs.js +38 -0
  22. package/base/deprecated/TextField.js +25 -0
  23. package/base/frame/sidebar/Sidebar.js +1 -1
  24. package/base/frame/sidebar/css/sidebar.module.css +1 -1
  25. package/base/index.js +22 -1
  26. package/base/styles/button.js +199 -0
  27. package/base/styles/createTheme.js +2 -0
  28. package/base/styles/mui/button.js +2 -2
  29. package/base/styles/mui/formControl.js +8 -3
  30. package/base/styles/mui/formControlLabel.js +10 -1
  31. package/base/styles/mui/radio.js +30 -0
  32. package/base/styles/mui/tabs.js +1 -1
  33. package/base/styles/mui/tooltip.js +4 -4
  34. package/package.json +1 -1
package/base/Radio.js ADDED
@@ -0,0 +1,22 @@
1
+ import { FormControlLabel } from "@mui/material";
2
+ import MuiRadio from "@mui/material/Radio";
3
+ import { forwardRef } from "react";
4
+ import { jsx as _jsx } from "react/jsx-runtime";
5
+ const Radio = /*#__PURE__*/forwardRef(({
6
+ value,
7
+ formControlLabelProps,
8
+ children,
9
+ ...props
10
+ }, ref) => {
11
+ return /*#__PURE__*/_jsx(FormControlLabel, {
12
+ ref: ref,
13
+ label: children,
14
+ value: value,
15
+ control: /*#__PURE__*/_jsx(MuiRadio, {
16
+ ...props,
17
+ color: "info"
18
+ }),
19
+ ...formControlLabelProps
20
+ });
21
+ });
22
+ export default Radio;
package/base/Select.js CHANGED
@@ -6,6 +6,7 @@ import { jsxs as _jsxs } from "react/jsx-runtime";
6
6
  const Select = /*#__PURE__*/forwardRef(({
7
7
  label,
8
8
  helperText,
9
+ size,
9
10
  children,
10
11
  formControlProps,
11
12
  ...props
@@ -16,6 +17,7 @@ const Select = /*#__PURE__*/forwardRef(({
16
17
  }), [label, formControlProps]);
17
18
  return /*#__PURE__*/_jsxs(FormControl, {
18
19
  ref: ref,
20
+ size: size,
19
21
  disabled: props.disabled,
20
22
  error: props.error,
21
23
  sx: styles,
@@ -0,0 +1,45 @@
1
+ import MuiAccordion from "@mui/material/Accordion";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ const styles = {
4
+ border: '1px solid #eaeaea',
5
+ boxShadow: 'none',
6
+ '.MuiAccordionDetails-root': {
7
+ pt: 0,
8
+ pl: 8,
9
+ pr: 8
10
+ },
11
+ '.MuiFormLabel-root.MuiInputLabel-root': {
12
+ fontSize: '14px'
13
+ },
14
+ '.MuiInputBase-input.MuiInput-input': {
15
+ color: '#555',
16
+ fontSize: '15px'
17
+ },
18
+ '.MuiTabs-root.MuiTabs-vertical': {
19
+ mt: 2
20
+ },
21
+ '.MuiTabs-root.MuiTabs-vertical .MuiButtonBase-root.MuiTab-root': {
22
+ fontSize: '14px',
23
+ minWidth: '32px',
24
+ maxWidth: '32px'
25
+ },
26
+ '.MuiButtonBase-root.MuiToggleButton-root': {
27
+ pt: '1px',
28
+ pb: '1px',
29
+ fontSize: '12px'
30
+ }
31
+ };
32
+ export default function Accordion({
33
+ children,
34
+ sx,
35
+ ...props
36
+ }) {
37
+ return /*#__PURE__*/_jsx(MuiAccordion, {
38
+ sx: {
39
+ ...sx,
40
+ ...styles
41
+ },
42
+ ...props,
43
+ children: children
44
+ });
45
+ }
@@ -0,0 +1,19 @@
1
+ import MuiAccordionDetails from "@mui/material/AccordionDetails";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ const styles = {
4
+ mb: 2
5
+ };
6
+ export default function AccordionDetails({
7
+ children,
8
+ sx,
9
+ ...props
10
+ }) {
11
+ return /*#__PURE__*/_jsx(MuiAccordionDetails, {
12
+ sx: {
13
+ ...sx,
14
+ ...styles
15
+ },
16
+ ...props,
17
+ children: children
18
+ });
19
+ }
@@ -0,0 +1,35 @@
1
+ import { Stack, Typography } from "@mui/material";
2
+ import MuiAccordionSummary from "@mui/material/AccordionSummary";
3
+ import ExpandMoreIcon from "@mui/icons-material/ExpandMore";
4
+ import { jsx as _jsx } from "react/jsx-runtime";
5
+ import { jsxs as _jsxs } from "react/jsx-runtime";
6
+ import { Fragment as _Fragment } from "react/jsx-runtime";
7
+ export default function AccordionSummary({
8
+ title,
9
+ desc,
10
+ children,
11
+ ...props
12
+ }) {
13
+ return /*#__PURE__*/_jsxs(_Fragment, {
14
+ children: [title && /*#__PURE__*/_jsx(MuiAccordionSummary, {
15
+ expandIcon: /*#__PURE__*/_jsx(ExpandMoreIcon, {}),
16
+ ...props,
17
+ children: /*#__PURE__*/_jsxs(Stack, {
18
+ direction: "row",
19
+ alignItems: "flex-end",
20
+ gap: 1,
21
+ children: [/*#__PURE__*/_jsx(Typography, {
22
+ children: title
23
+ }), desc && /*#__PURE__*/_jsx(Typography, {
24
+ variant: "caption",
25
+ color: "#aaa",
26
+ children: desc
27
+ })]
28
+ })
29
+ }), !title && /*#__PURE__*/_jsx(MuiAccordionSummary, {
30
+ expandIcon: /*#__PURE__*/_jsx(ExpandMoreIcon, {}),
31
+ ...props,
32
+ children: children
33
+ })]
34
+ });
35
+ }
@@ -0,0 +1,56 @@
1
+ import React from "react";
2
+ import { Button, IconButton, Stack, Tooltip, Typography } from "@mui/material";
3
+ import AddIcon from "@mui/icons-material/Add";
4
+ import DeleteIcon from "@mui/icons-material/Delete";
5
+ import { jsx as _jsx } from "react/jsx-runtime";
6
+ import { jsxs as _jsxs } from "react/jsx-runtime";
7
+ import { Fragment as _Fragment } from "react/jsx-runtime";
8
+ export default function AppendableFormList({
9
+ gap = 1,
10
+ forms,
11
+ renderForm,
12
+ addOns,
13
+ onAppend,
14
+ onRemove,
15
+ readOnly
16
+ }) {
17
+ return /*#__PURE__*/_jsxs(Stack, {
18
+ gap: gap,
19
+ children: [/*#__PURE__*/_jsxs(_Fragment, {
20
+ children: [forms.map((form, index) => /*#__PURE__*/_jsxs(Stack, {
21
+ direction: "row",
22
+ alignItems: "end",
23
+ gap: 2,
24
+ children: [renderForm(form, index), !readOnly && /*#__PURE__*/_jsx(Tooltip, {
25
+ title: "\uC0AD\uC81C",
26
+ children: /*#__PURE__*/_jsx(IconButton, {
27
+ onClick: _ => onRemove(index),
28
+ size: "small",
29
+ sx: {
30
+ ml: '-10px',
31
+ mb: '-5px'
32
+ },
33
+ children: /*#__PURE__*/_jsx(DeleteIcon, {
34
+ fontSize: "small"
35
+ })
36
+ })
37
+ })]
38
+ }, index)), forms.length === 0 && /*#__PURE__*/_jsx(Typography, {
39
+ variant: "body2",
40
+ sx: {
41
+ color: '#999'
42
+ },
43
+ children: "\uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4"
44
+ })]
45
+ }), !readOnly && /*#__PURE__*/_jsxs(Stack, {
46
+ direction: "row",
47
+ gap: 1,
48
+ children: [/*#__PURE__*/_jsx(Button, {
49
+ variant: "text",
50
+ startIcon: /*#__PURE__*/_jsx(AddIcon, {}),
51
+ onClick: onAppend,
52
+ children: "\uCD94\uAC00"
53
+ }), addOns]
54
+ })]
55
+ });
56
+ }
@@ -0,0 +1,80 @@
1
+ import { useMemo, useState } from 'react';
2
+ import { Avatar, Box, IconButton } from '@mui/material';
3
+ import Menu from '@mui/material/Menu';
4
+ import MenuItem from '@mui/material/MenuItem';
5
+ import ListItemIcon from '@mui/material/ListItemIcon';
6
+ import Divider from '@mui/material/Divider';
7
+ import LogoutRoundedIcon from '@mui/icons-material/LogoutRounded';
8
+ import { red } from '@mui/material/colors';
9
+ import { jsx as _jsx } from "react/jsx-runtime";
10
+ import { jsxs as _jsxs } from "react/jsx-runtime";
11
+ export default function AvatarDropdown({
12
+ name,
13
+ color,
14
+ bgcolor,
15
+ children,
16
+ onProfileClick,
17
+ onLogoutClick,
18
+ ...props
19
+ }) {
20
+ const [anchorEl, setAnchorEl] = useState(null);
21
+ const open = Boolean(anchorEl);
22
+ const firstLetter = useMemo(() => {
23
+ return name && name.length > 0 ? name[0].toUpperCase() : "?";
24
+ }, [name]);
25
+ const handleClick = event => setAnchorEl(event.currentTarget);
26
+ const handleClose = () => setAnchorEl(null);
27
+ const styles = {
28
+ color: color ? color : '#fff',
29
+ bgcolor: bgcolor ? bgcolor : red[900],
30
+ width: 32,
31
+ height: 32,
32
+ fontSize: 16
33
+ };
34
+ return /*#__PURE__*/_jsxs(Box, {
35
+ ...props,
36
+ children: [/*#__PURE__*/_jsx(IconButton, {
37
+ onClick: handleClick,
38
+ size: "small",
39
+ sx: {
40
+ ml: 2
41
+ },
42
+ children: /*#__PURE__*/_jsx(Avatar, {
43
+ sx: styles,
44
+ children: firstLetter
45
+ })
46
+ }), /*#__PURE__*/_jsxs(Menu, {
47
+ anchorEl: anchorEl,
48
+ open: open,
49
+ onClose: handleClose,
50
+ onClick: handleClose,
51
+ sx: {
52
+ '.MuiButtonBase-root.MuiMenuItem-root': {
53
+ fontSize: 14
54
+ }
55
+ },
56
+ children: [/*#__PURE__*/_jsxs(MenuItem, {
57
+ onClick: onProfileClick,
58
+ children: [/*#__PURE__*/_jsx(ListItemIcon, {
59
+ children: /*#__PURE__*/_jsx(Avatar, {
60
+ sx: {
61
+ ...styles,
62
+ mr: 1,
63
+ fontSize: 13,
64
+ width: 22,
65
+ height: 22
66
+ },
67
+ children: firstLetter
68
+ })
69
+ }), name]
70
+ }), /*#__PURE__*/_jsx(Divider, {}), children, children && /*#__PURE__*/_jsx(Divider, {}), /*#__PURE__*/_jsxs(MenuItem, {
71
+ onClick: onLogoutClick,
72
+ children: [/*#__PURE__*/_jsx(ListItemIcon, {
73
+ children: /*#__PURE__*/_jsx(LogoutRoundedIcon, {
74
+ fontSize: "small"
75
+ })
76
+ }), "\uB85C\uADF8\uC544\uC6C3"]
77
+ })]
78
+ })]
79
+ });
80
+ }
@@ -0,0 +1,61 @@
1
+ import { useMemo } from "react";
2
+ import MuiButton from "@mui/material/Button";
3
+ import { Box, CircularProgress, IconButton } from "@mui/material";
4
+ import { jsx as _jsx } from "react/jsx-runtime";
5
+ import { jsxs as _jsxs } from "react/jsx-runtime";
6
+ export default function Button({
7
+ label,
8
+ icon,
9
+ iconPlacement = 'start',
10
+ iconSize = '20px',
11
+ iconProps = {},
12
+ progressProps = {},
13
+ loading = false,
14
+ ...props
15
+ }) {
16
+ const iconComponent = useMemo(() => {
17
+ return icon ? /*#__PURE__*/_jsx(Box, {
18
+ component: icon,
19
+ sx: {
20
+ '&.MuiSvgIcon-root': {
21
+ fontSize: `${iconSize}!important`
22
+ }
23
+ },
24
+ ...iconProps
25
+ }) : null;
26
+ }, [icon, iconSize, iconProps]);
27
+ const startIcon = useMemo(() => {
28
+ return iconPlacement === 'start' ? iconComponent : null;
29
+ }, [iconComponent, iconPlacement]);
30
+ const endIcon = useMemo(() => {
31
+ return iconPlacement === 'end' ? iconComponent : null;
32
+ }, [iconComponent, iconPlacement]);
33
+ return /*#__PURE__*/_jsxs(Box, {
34
+ sx: {
35
+ position: 'relative',
36
+ width: 'fit-content'
37
+ },
38
+ children: [label ? /*#__PURE__*/_jsx(MuiButton, {
39
+ startIcon: startIcon,
40
+ endIcon: endIcon,
41
+ disabled: loading,
42
+ ...props,
43
+ children: label
44
+ }) : /*#__PURE__*/_jsx(IconButton, {
45
+ disabled: loading,
46
+ ...props,
47
+ children: iconComponent
48
+ }), loading && /*#__PURE__*/_jsx(CircularProgress, {
49
+ size: 24,
50
+ thickness: 6,
51
+ sx: {
52
+ position: 'absolute',
53
+ top: '50%',
54
+ left: '50%',
55
+ marginTop: '-12px',
56
+ marginLeft: '-12px'
57
+ },
58
+ ...progressProps
59
+ })]
60
+ });
61
+ }
@@ -0,0 +1,33 @@
1
+ import { Box, Typography } from "@mui/material";
2
+ import MuiCircularProgress from "@mui/material/CircularProgress";
3
+ import { jsx as _jsx } from "react/jsx-runtime";
4
+ import { jsxs as _jsxs } from "react/jsx-runtime";
5
+ export default function CircularProgress(props) {
6
+ return /*#__PURE__*/_jsxs(Box, {
7
+ sx: {
8
+ position: 'relative',
9
+ display: 'inline-flex'
10
+ },
11
+ children: [/*#__PURE__*/_jsx(MuiCircularProgress, {
12
+ variant: "determinate",
13
+ ...props
14
+ }), /*#__PURE__*/_jsx(Box, {
15
+ sx: {
16
+ top: 0,
17
+ left: 0,
18
+ bottom: 0,
19
+ right: 0,
20
+ position: 'absolute',
21
+ display: 'flex',
22
+ alignItems: 'center',
23
+ justifyContent: 'center'
24
+ },
25
+ children: /*#__PURE__*/_jsx(Typography, {
26
+ variant: "caption",
27
+ component: "div",
28
+ color: "text.secondary",
29
+ children: `${Math.round(props.value)}%`
30
+ })
31
+ })]
32
+ });
33
+ }
@@ -0,0 +1,23 @@
1
+ import React from "react";
2
+ import MuiFormLabel from "@mui/material/FormLabel";
3
+ import { jsx as _jsx } from "react/jsx-runtime";
4
+ export default function FormLabel({
5
+ value = false,
6
+ children,
7
+ sx,
8
+ ...props
9
+ }) {
10
+ const styles = {
11
+ color: value ? 'rgba(0, 0, 0, 0.87)' : 'rgba(0, 0, 0, 0.6)',
12
+ fontSize: value ? 16 : 14,
13
+ fontWeight: value ? 600 : 400
14
+ };
15
+ return /*#__PURE__*/_jsx(MuiFormLabel, {
16
+ sx: {
17
+ ...sx,
18
+ ...styles
19
+ },
20
+ ...props,
21
+ children: children
22
+ });
23
+ }
@@ -0,0 +1,67 @@
1
+ import { Autocomplete, TextField } from "@mui/material";
2
+ import Paper from "@mui/material/Paper";
3
+ import { jsx as _jsx } from "react/jsx-runtime";
4
+ export default function GroupSelect({
5
+ id,
6
+ options,
7
+ groupKey,
8
+ value,
9
+ onSelect,
10
+ placeholder,
11
+ disableClearable = false,
12
+ sx,
13
+ ...props
14
+ }) {
15
+ const styles = {
16
+ '.MuiInputLabel-root, .MuiInputBase-input': {
17
+ fontSize: '0.875rem'
18
+ }
19
+ };
20
+ const paperStyles = {
21
+ '& .MuiAutocomplete-groupLabel': {
22
+ fontSize: '0.8rem',
23
+ paddingTop: 0,
24
+ paddingBottom: 0
25
+ },
26
+ '& .MuiAutocomplete-option': {
27
+ color: '#333',
28
+ fontSize: '0.875rem',
29
+ paddingTop: '3px',
30
+ paddingBottom: '3px'
31
+ },
32
+ '& .MuiAutocomplete-noOptions': {
33
+ fontSize: '0.8rem'
34
+ }
35
+ };
36
+ const handleSelect = (event, value, reason) => {
37
+ if (reason !== 'selectOption') return;
38
+ if (onSelect) onSelect(id, value);
39
+ };
40
+ function CustomPaper(props) {
41
+ return /*#__PURE__*/_jsx(Paper, {
42
+ ...props,
43
+ sx: paperStyles
44
+ });
45
+ }
46
+ return /*#__PURE__*/_jsx(Autocomplete, {
47
+ id: id,
48
+ size: "small",
49
+ options: options,
50
+ groupBy: option => option[groupKey],
51
+ value: value,
52
+ onChange: handleSelect,
53
+ blurOnSelect: true,
54
+ disableClearable: disableClearable,
55
+ noOptionsText: "\uC77C\uCE58\uD558\uB294 \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4",
56
+ PaperComponent: CustomPaper,
57
+ renderInput: params => /*#__PURE__*/_jsx(TextField, {
58
+ ...params,
59
+ label: placeholder
60
+ }),
61
+ sx: {
62
+ ...sx,
63
+ ...styles
64
+ },
65
+ ...props
66
+ });
67
+ }
@@ -0,0 +1,21 @@
1
+ import MuiListItem from "@mui/material/ListItem";
2
+ import { Grid } from "@mui/material";
3
+ import { jsx as _jsx } from "react/jsx-runtime";
4
+ import { jsxs as _jsxs } from "react/jsx-runtime";
5
+ export default function ListItem({
6
+ grid,
7
+ spacing = 10,
8
+ verticalAlign = 'flex-start',
9
+ children,
10
+ ...props
11
+ }) {
12
+ return /*#__PURE__*/_jsxs(MuiListItem, {
13
+ ...props,
14
+ children: [grid && /*#__PURE__*/_jsx(Grid, {
15
+ container: true,
16
+ columnSpacing: spacing,
17
+ alignItems: verticalAlign,
18
+ children: children
19
+ }), !grid && children]
20
+ });
21
+ }
@@ -0,0 +1,15 @@
1
+ import { Divider } from "@mui/material";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ export default function ListItemDivider({
4
+ sx,
5
+ ...props
6
+ }) {
7
+ return /*#__PURE__*/_jsx(Divider, {
8
+ sx: {
9
+ ...sx,
10
+ mt: 3,
11
+ mb: 2
12
+ },
13
+ ...props
14
+ });
15
+ }
@@ -0,0 +1,12 @@
1
+ import { Grid } from "@mui/material";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ export default function ListItemGrid({
4
+ children,
5
+ ...props
6
+ }) {
7
+ return /*#__PURE__*/_jsx(Grid, {
8
+ item: true,
9
+ ...props,
10
+ children: children
11
+ });
12
+ }
@@ -0,0 +1,44 @@
1
+ import { useState } from "react";
2
+ import { Box, Stack, Tooltip, Typography } from "@mui/material";
3
+ import MuiListItemText from "@mui/material/ListItemText";
4
+ import HelpIcon from "@mui/icons-material/Help";
5
+ import { jsx as _jsx } from "react/jsx-runtime";
6
+ import { jsxs as _jsxs } from "react/jsx-runtime";
7
+ export default function ListItemText({
8
+ primary,
9
+ secondary,
10
+ tooltip,
11
+ ...props
12
+ }) {
13
+ const [hover, setHover] = useState(false);
14
+ return /*#__PURE__*/_jsx(MuiListItemText, {
15
+ primary: typeof primary === 'string' ? /*#__PURE__*/_jsx(Typography, {
16
+ fontSize: 17,
17
+ fontWeight: 600,
18
+ children: primary
19
+ }) : /*#__PURE__*/_jsx(Box, {
20
+ children: primary
21
+ }),
22
+ secondary: /*#__PURE__*/_jsxs(Stack, {
23
+ direction: "row",
24
+ spacing: 0.5,
25
+ children: [/*#__PURE__*/_jsx(Box, {
26
+ color: "rgba(0, 0, 0, 0.6)",
27
+ fontSize: 14,
28
+ children: secondary
29
+ }), /*#__PURE__*/_jsx(Tooltip, {
30
+ title: tooltip,
31
+ children: /*#__PURE__*/_jsx(HelpIcon, {
32
+ sx: {
33
+ fontSize: 18,
34
+ visibility: tooltip && hover ? 'visible' : 'hidden'
35
+ }
36
+ })
37
+ })]
38
+ }),
39
+ disableTypography: true,
40
+ onMouseEnter: _ => setHover(true),
41
+ onMouseLeave: _ => setHover(false),
42
+ ...props
43
+ });
44
+ }
@@ -0,0 +1,59 @@
1
+ import { Chip, Stack, Link } from "@mui/material";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ export default function ReferenceChipList({
4
+ references,
5
+ onClick,
6
+ chipStyles,
7
+ chipProps,
8
+ sx,
9
+ ...props
10
+ }) {
11
+ const handleClick = (id, event) => {
12
+ if (onClick) onClick(id, event);
13
+ };
14
+ return /*#__PURE__*/_jsx(Stack, {
15
+ direction: "row",
16
+ gap: 0.5,
17
+ sx: {
18
+ flexWrap: 'wrap',
19
+ ...sx
20
+ },
21
+ ...props,
22
+ children: references.map((reference, index) => {
23
+ return reference.href ? /*#__PURE__*/_jsx(Link, {
24
+ href: reference.href,
25
+ underline: "none",
26
+ onClick: event => handleClick(reference.id, event),
27
+ children: /*#__PURE__*/_jsx(ReferenceChip, {
28
+ name: reference.name,
29
+ sx: chipStyles,
30
+ ...chipProps
31
+ })
32
+ }, index) : /*#__PURE__*/_jsx(ReferenceChip, {
33
+ name: reference.name,
34
+ onClick: event => reference.clickable && handleClick(reference.id, event),
35
+ sx: {
36
+ cursor: reference.clickable ? 'pointer' : 'default',
37
+ ...chipStyles
38
+ },
39
+ ...chipProps
40
+ }, index);
41
+ })
42
+ });
43
+ }
44
+ function ReferenceChip({
45
+ name,
46
+ sx,
47
+ ...props
48
+ }) {
49
+ return /*#__PURE__*/_jsx(Chip, {
50
+ variant: "outlined",
51
+ label: name,
52
+ size: "small",
53
+ sx: {
54
+ fontSize: '13px',
55
+ ...sx
56
+ },
57
+ ...props
58
+ });
59
+ }
@@ -0,0 +1,22 @@
1
+ import { Paper } from "@mui/material";
2
+ import { forwardRef } from "react";
3
+ import { jsx as _jsx } from "react/jsx-runtime";
4
+ const Section = /*#__PURE__*/forwardRef(({
5
+ children,
6
+ sx,
7
+ ...props
8
+ }, ref) => {
9
+ return /*#__PURE__*/_jsx(Paper, {
10
+ ref: ref,
11
+ variant: "outlined",
12
+ square: false,
13
+ sx: {
14
+ marginTop: '20px',
15
+ padding: 3,
16
+ ...sx
17
+ },
18
+ ...props,
19
+ children: children
20
+ });
21
+ });
22
+ export default Section;
@@ -0,0 +1,36 @@
1
+ import { Box, Divider, Stack, Typography } from "@mui/material";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { jsxs as _jsxs } from "react/jsx-runtime";
4
+ import { Fragment as _Fragment } from "react/jsx-runtime";
5
+ export default function ShadowedSection({
6
+ label,
7
+ children,
8
+ marginTop = '20px',
9
+ sx,
10
+ ...props
11
+ }) {
12
+ return /*#__PURE__*/_jsxs(_Fragment, {
13
+ children: [/*#__PURE__*/_jsx(Box, {
14
+ sx: {
15
+ mt: marginTop
16
+ },
17
+ children: /*#__PURE__*/_jsx(Typography, {
18
+ variant: "subtitle1",
19
+ children: label
20
+ })
21
+ }), /*#__PURE__*/_jsxs(Stack, {
22
+ sx: {
23
+ backgroundColor: '#fff',
24
+ boxShadow: '0 0.3rem 0.3rem rgba(0, 0, 0, 0.03) !important'
25
+ },
26
+ children: [/*#__PURE__*/_jsx(Divider, {}), /*#__PURE__*/_jsx(Stack, {
27
+ sx: {
28
+ padding: 3,
29
+ ...sx
30
+ },
31
+ ...props,
32
+ children: children
33
+ }), /*#__PURE__*/_jsx(Divider, {})]
34
+ })]
35
+ });
36
+ }
@@ -0,0 +1,34 @@
1
+ import { Chip } from "@mui/material";
2
+ import CheckCircleIcon from "@mui/icons-material/CheckCircle";
3
+ import ErrorIcon from "@mui/icons-material/Error";
4
+ import { jsx as _jsx } from "react/jsx-runtime";
5
+ export default function StatusChip({
6
+ id,
7
+ label,
8
+ status,
9
+ onOperate,
10
+ sx,
11
+ ...props
12
+ }) {
13
+ const styles = {
14
+ '&': {
15
+ bgcolor: status === 'normal' ? '#4caf50' : '#fff'
16
+ },
17
+ '.MuiSvgIcon-root.MuiChip-deleteIcon': {
18
+ cursor: onOperate ? 'pointer' : 'default'
19
+ }
20
+ };
21
+ return /*#__PURE__*/_jsx(Chip, {
22
+ id: id,
23
+ label: label,
24
+ variant: status === 'normal' ? 'filled' : 'outlined',
25
+ color: status === 'normal' ? 'success' : 'default',
26
+ deleteIcon: status === 'normal' ? /*#__PURE__*/_jsx(CheckCircleIcon, {}) : /*#__PURE__*/_jsx(ErrorIcon, {}),
27
+ onDelete: _ => onOperate && onOperate(id, status),
28
+ sx: {
29
+ ...sx,
30
+ ...styles
31
+ },
32
+ ...props
33
+ });
34
+ }
@@ -0,0 +1,37 @@
1
+ import { Stack, Tab } from "@mui/material";
2
+ import Tabs from "./Tabs";
3
+ import Section from "./Section";
4
+ import { jsx as _jsx } from "react/jsx-runtime";
5
+ import { jsxs as _jsxs } from "react/jsx-runtime";
6
+ export default function TabbedSection({
7
+ orientation,
8
+ labels = [],
9
+ tabProps = {},
10
+ sectionProps = {},
11
+ children,
12
+ ...props
13
+ }) {
14
+ const styles = {
15
+ mt: 0,
16
+ width: orientation === 'vertical' ? '100%' : 'unset'
17
+ };
18
+ return /*#__PURE__*/_jsxs(Stack, {
19
+ direction: orientation === 'vertical' ? 'row' : 'column',
20
+ children: [/*#__PURE__*/_jsx(Tabs, {
21
+ orientation: orientation,
22
+ ...props,
23
+ children: labels.map((label, index) => /*#__PURE__*/_jsx(Tab, {
24
+ label: label,
25
+ wrapped: orientation === 'vertical',
26
+ ...tabProps
27
+ }, index))
28
+ }), /*#__PURE__*/_jsx(Section, {
29
+ sx: {
30
+ ...styles,
31
+ ...sectionProps.sx
32
+ },
33
+ ...sectionProps,
34
+ children: children
35
+ })]
36
+ });
37
+ }
@@ -0,0 +1,38 @@
1
+ import React from "react";
2
+ import MuiTabs from "@mui/material/Tabs";
3
+ import { jsx as _jsx } from "react/jsx-runtime";
4
+ import { Fragment as _Fragment } from "react/jsx-runtime";
5
+ export default function Tabs({
6
+ orientation,
7
+ sx,
8
+ ...props
9
+ }) {
10
+ const vertical = orientation === 'vertical';
11
+ const styles = {
12
+ ml: vertical ? 0 : 0.5,
13
+ mr: vertical ? 0 : 0.5,
14
+ mt: vertical ? 0.5 : 0,
15
+ mb: vertical ? 0.5 : 0,
16
+ '& .MuiButtonBase-root.MuiTab-root': {
17
+ fontSize: '15px'
18
+ },
19
+ '&.MuiTabs-root.MuiTabs-vertical': {
20
+ minWidth: '40px',
21
+ maxWidth: '40px'
22
+ },
23
+ '&.MuiTabs-root.MuiTabs-vertical .MuiButtonBase-root.MuiTab-root': {
24
+ minWidth: '40px',
25
+ maxWidth: '40px'
26
+ }
27
+ };
28
+ return /*#__PURE__*/_jsx(_Fragment, {
29
+ children: /*#__PURE__*/_jsx(MuiTabs, {
30
+ orientation: orientation,
31
+ sx: {
32
+ ...styles,
33
+ ...sx
34
+ },
35
+ ...props
36
+ })
37
+ });
38
+ }
@@ -0,0 +1,25 @@
1
+ import MuiTextField from "@mui/material/TextField";
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { Fragment as _Fragment } from "react/jsx-runtime";
4
+ export default function TextField({
5
+ width,
6
+ fontSize,
7
+ textAlign,
8
+ inputProps,
9
+ ...props
10
+ }) {
11
+ const styles = {
12
+ fontSize: fontSize ? fontSize : 16,
13
+ textAlign: textAlign ? textAlign : 'left',
14
+ width
15
+ };
16
+ return /*#__PURE__*/_jsx(_Fragment, {
17
+ children: /*#__PURE__*/_jsx(MuiTextField, {
18
+ inputProps: {
19
+ ...inputProps,
20
+ style: styles
21
+ },
22
+ ...props
23
+ })
24
+ });
25
+ }
@@ -21,7 +21,7 @@ const Sidebar = /*#__PURE__*/forwardRef((props, ref) => {
21
21
  const location = useLocation();
22
22
  const navigate = useNavigate();
23
23
  const handleClick = useCallback(item => {
24
- navigate(item.href);
24
+ navigate(item.href instanceof Array ? item.href[0] : item.href);
25
25
  }, [navigate]);
26
26
  const handleToggle = useCallback(_ => {
27
27
  dispatch({
@@ -38,7 +38,7 @@
38
38
 
39
39
  .toggler {
40
40
  position: fixed;
41
- top: calc(var(--gnb-height) + 28px);
41
+ bottom: 28px;
42
42
  width: 32px;
43
43
  height: 32px;
44
44
  background-color: var(--gnb-background-color);
package/base/index.js CHANGED
@@ -21,6 +21,7 @@ export { default as Frame } from "./frame/Frame";
21
21
  export { default as MainHeader } from "./MainHeader";
22
22
  export { default as MenuItem } from "./MenuItem";
23
23
  export { default as PropertyTable } from "./PropertyTable";
24
+ export { default as Radio } from "./Radio";
24
25
  export { default as SearchableSelect } from "./SearchableSelect";
25
26
  export { default as SearchTextField } from "./SearchTextField";
26
27
  export { default as Sidebar } from "./frame/sidebar/Sidebar";
@@ -30,4 +31,24 @@ export { default as Snackbar } from "./Snackbar";
30
31
  export { default as Switch } from "./Switch";
31
32
  export * from './frame/sidebar/SidebarContext';
32
33
  export { default as Error } from "./error/Error";
33
- export { default as HttpError } from "./error/HttpError";
34
+ export { default as HttpError } from "./error/HttpError";
35
+ export { default as Accordion } from "./deprecated/Accordion";
36
+ export { default as AccordionDetails } from "./deprecated/AccordionDetails";
37
+ export { default as AccordionSummary } from "./deprecated/AccordionSummary";
38
+ export { default as AppendableFormList } from "./deprecated/AppendableFormList";
39
+ export { default as AvatarDropdown } from "./deprecated/AvatarDropdown";
40
+ export { default as Button } from "./deprecated/Button";
41
+ export { default as CircularProgress } from "./deprecated/CircularProgress";
42
+ export { default as FormLabel } from "./deprecated/FormLabel";
43
+ export { default as GroupSelect } from "./deprecated/GroupSelect";
44
+ export { default as ListItem } from "./deprecated/ListItem";
45
+ export { default as ListItemDivider } from "./deprecated/ListItemDivider";
46
+ export { default as ListItemGrid } from "./deprecated/ListItemGrid";
47
+ export { default as ListItemText } from "./deprecated/ListItemText";
48
+ export { default as ReferenceChipList } from "./deprecated/ReferenceChipList";
49
+ export { default as Section } from "./deprecated/Section";
50
+ export { default as ShadowedSection } from "./deprecated/ShadowedSection";
51
+ export { default as StatusChip } from "./deprecated/StatusChip";
52
+ export { default as TabbedSection } from "./deprecated/TabbedSection";
53
+ export { default as Tabs } from "./deprecated/Tabs";
54
+ export { default as TextField } from "./deprecated/TextField";
@@ -0,0 +1,199 @@
1
+ import { blue, grey, orange, red } from "../colors";
2
+ export const primary = {
3
+ contained: (ownerState, theme) => {
4
+ return ownerState.color === 'primary' && ownerState.variant === 'contained' && {
5
+ color: theme.palette.primary.contrastText,
6
+ backgroundColor: theme.palette.primary.main,
7
+ ':hover': {
8
+ color: theme.palette.primary.contrastText,
9
+ backgroundColor: '#242424'
10
+ },
11
+ ':active': {
12
+ color: grey[300],
13
+ backgroundColor: '#141414'
14
+ },
15
+ ':disabled': {
16
+ color: grey[500],
17
+ backgroundColor: grey[300]
18
+ }
19
+ };
20
+ },
21
+ outlined: (ownerState, theme) => {
22
+ return ownerState.color === 'primary' && ownerState.variant === 'outlined' && {
23
+ color: grey[900],
24
+ backgroundColor: '#fff',
25
+ borderColor: grey[700],
26
+ ':hover': {
27
+ color: grey[900],
28
+ backgroundColor: grey[10]
29
+ },
30
+ ':active': {
31
+ color: grey[900],
32
+ backgroundColor: grey[20]
33
+ },
34
+ ':disabled': {
35
+ color: grey[400],
36
+ backgroundColor: '#fff',
37
+ borderColor: grey[400]
38
+ }
39
+ };
40
+ },
41
+ text: (ownerState, theme) => {
42
+ return ownerState.color === 'primary' && ownerState.variant === 'text' && {
43
+ color: grey[900],
44
+ backgroundColor: '#fff',
45
+ ':hover': {
46
+ color: grey[900],
47
+ backgroundColor: grey[100]
48
+ },
49
+ ':active': {
50
+ color: grey[900],
51
+ backgroundColor: grey[200]
52
+ },
53
+ ':disabled': {
54
+ color: grey[400],
55
+ backgroundColor: '#fff'
56
+ }
57
+ };
58
+ }
59
+ };
60
+ export const info = {
61
+ contained: (ownerState, theme) => {
62
+ return ownerState.color === 'info' && ownerState.variant === 'contained' && {
63
+ color: theme.palette.info.contrastText,
64
+ backgroundColor: theme.palette.info.main,
65
+ ':hover': {
66
+ color: theme.palette.info.contrastText,
67
+ backgroundColor: blue[600]
68
+ },
69
+ ':active': {
70
+ color: theme.palette.info.contrastText,
71
+ backgroundColor: blue[800]
72
+ },
73
+ ':disabled': {
74
+ color: grey[500],
75
+ backgroundColor: grey[300]
76
+ }
77
+ };
78
+ },
79
+ outlined: (ownerState, theme) => {
80
+ return ownerState.color === 'info' && ownerState.variant === 'outlined' && {
81
+ color: blue[500],
82
+ backgroundColor: '#fff',
83
+ borderColor: blue[500],
84
+ ':hover': {
85
+ color: blue[500],
86
+ backgroundColor: blue[50]
87
+ },
88
+ ':active': {
89
+ color: blue[500],
90
+ backgroundColor: blue[100]
91
+ },
92
+ ':disabled': {
93
+ color: grey[400],
94
+ backgroundColor: '#fff',
95
+ borderColor: grey[400]
96
+ }
97
+ };
98
+ },
99
+ text: (ownerState, theme) => {
100
+ return ownerState.color === 'info' && ownerState.variant === 'text' && {
101
+ color: blue[500],
102
+ backgroundColor: '#fff',
103
+ ':hover': {
104
+ color: blue[500],
105
+ backgroundColor: blue[50]
106
+ },
107
+ ':active': {
108
+ color: blue[500],
109
+ backgroundColor: blue[100]
110
+ },
111
+ ':disabled': {
112
+ color: grey[400],
113
+ backgroundColor: '#fff'
114
+ }
115
+ };
116
+ }
117
+ };
118
+ export const warning = {
119
+ contained: (ownerState, theme) => {
120
+ return ownerState.color === 'warning' && ownerState.variant === 'contained' && {
121
+ color: theme.palette.warning.contrastText,
122
+ backgroundColor: theme.palette.warning.main,
123
+ ':hover': {
124
+ color: theme.palette.warning.contrastText,
125
+ backgroundColor: orange[600]
126
+ },
127
+ ':active': {
128
+ color: theme.palette.warning.contrastText,
129
+ backgroundColor: orange[800]
130
+ },
131
+ ':disabled': {
132
+ color: grey[500],
133
+ backgroundColor: grey[300]
134
+ }
135
+ };
136
+ }
137
+ };
138
+ export const error = {
139
+ contained: (ownerState, theme) => {
140
+ return ownerState.color === 'error' && ownerState.variant === 'contained' && {
141
+ color: theme.palette.error.contrastText,
142
+ backgroundColor: theme.palette.error.main,
143
+ ':hover': {
144
+ color: theme.palette.error.contrastText,
145
+ backgroundColor: red[600]
146
+ },
147
+ ':active': {
148
+ color: theme.palette.error.contrastText,
149
+ backgroundColor: red[800]
150
+ },
151
+ ':disabled': {
152
+ color: grey[500],
153
+ backgroundColor: grey[300]
154
+ }
155
+ };
156
+ },
157
+ outlined: (ownerState, theme) => {
158
+ return ownerState.color === 'error' && ownerState.variant === 'outlined' && {
159
+ color: red[700],
160
+ backgroundColor: '#fff',
161
+ borderColor: red[600],
162
+ ':hover': {
163
+ color: red[700],
164
+ backgroundColor: red[50] //'#fef2f4',
165
+ },
166
+
167
+ ':active': {
168
+ color: red[700],
169
+ backgroundColor: red[100] //'#fcdee5',
170
+ },
171
+
172
+ ':disabled': {
173
+ color: grey[400],
174
+ backgroundColor: '#fff',
175
+ borderColor: grey[400]
176
+ }
177
+ };
178
+ },
179
+ text: (ownerState, theme) => {
180
+ return ownerState.color === 'error' && ownerState.variant === 'text' && {
181
+ color: red[700],
182
+ backgroundColor: '#fff',
183
+ ':hover': {
184
+ color: red[700],
185
+ backgroundColor: red[50] //'#fef2f4',
186
+ },
187
+
188
+ ':active': {
189
+ color: red[700],
190
+ backgroundColor: red[100] //'#fcdee5',
191
+ },
192
+
193
+ ':disabled': {
194
+ color: grey[400],
195
+ backgroundColor: '#fff'
196
+ }
197
+ };
198
+ }
199
+ };
@@ -8,6 +8,7 @@ import * as button from "./mui/button";
8
8
  import * as toggleButton from "./mui/toggleButton";
9
9
  import * as iconButton from "./mui/iconButton";
10
10
  import * as checkbox from "./mui/checkbox";
11
+ import * as radio from "./mui/radio";
11
12
  import * as switcher from "./mui/switch";
12
13
  import * as select from "./mui/select";
13
14
  import * as autocomplete from "./mui/autocomplete";
@@ -54,6 +55,7 @@ export default function createTheme() {
54
55
  MuiIcon: icon.styles,
55
56
  MuiSvgIcon: icon.styles,
56
57
  MuiCheckbox: checkbox.styles,
58
+ MuiRadio: radio.styles,
57
59
  MuiSwitch: switcher.styles,
58
60
  MuiSelect: select.styles,
59
61
  MuiAutocomplete: autocomplete.styles,
@@ -249,14 +249,14 @@ export const styles = {
249
249
  }) => ({
250
250
  minWidth: 60,
251
251
  height: ownerState.color === 'crud' ? 26 : 36,
252
- padding: ownerState.color === 'crud' ? '0px 2px' : '8px 12px',
252
+ padding: ownerState.color === 'crud' ? '0px 2px' : '8px 20px',
253
253
  fontSize: typography.bodyMdSemibold.fontSize,
254
254
  fontWeight: typography.bodyMdSemibold.fontWeight
255
255
  }),
256
256
  sizeSmall: {
257
257
  minWidth: '50px',
258
258
  height: '26px',
259
- padding: '8px 8px',
259
+ padding: '8px 12px',
260
260
  fontSize: typography.bodySmSemibold.fontSize,
261
261
  fontWeight: typography.bodySmSemibold.fontWeight
262
262
  },
@@ -1,8 +1,13 @@
1
1
  import typography from "../typography";
2
2
  export const styles = {
3
3
  styleOverrides: {
4
- root: {
5
- fontFamily: typography.fontFamily
6
- }
4
+ root: ({
5
+ ownerState
6
+ }) => ({
7
+ fontFamily: typography.fontFamily,
8
+ '.MuiInputBase-root': {
9
+ height: ownerState.size === 'small' ? 26 : undefined
10
+ }
11
+ })
7
12
  }
8
13
  };
@@ -1,9 +1,18 @@
1
1
  import typography from "../typography";
2
+ import { grey } from "../../colors";
2
3
  export const styles = {
3
4
  styleOverrides: {
4
5
  root: {
5
6
  fontFamily: typography.fontFamily,
6
- ...typography.bodyMdMedium
7
+ ...typography.bodyMdMedium,
8
+ '.Mui-checked.Mui-disabled + .MuiFormControlLabel-label': {
9
+ color: grey[700]
10
+ }
11
+ },
12
+ label: {
13
+ '&.Mui-disabled': {
14
+ color: grey[400]
15
+ }
7
16
  }
8
17
  }
9
18
  };
@@ -0,0 +1,30 @@
1
+ import { grey } from "../../colors";
2
+ export const styles = {
3
+ styleOverrides: {
4
+ root: ({
5
+ ownerState,
6
+ theme
7
+ }) => ({
8
+ ':hover, &.Mui-focusVisible': {
9
+ backgroundColor: grey[5]
10
+ },
11
+ '&:active': {
12
+ backgroundColor: grey[10]
13
+ },
14
+ '& svg': {
15
+ fill: grey[700],
16
+ width: 18,
17
+ height: 18
18
+ },
19
+ '&.Mui-checked svg': {
20
+ fill: theme.palette.info.main
21
+ },
22
+ '&.Mui-disabled svg': {
23
+ fill: grey[400]
24
+ },
25
+ '&.Mui-disabled.Mui-checked svg': {
26
+ fill: grey[700]
27
+ }
28
+ })
29
+ }
30
+ };
@@ -4,7 +4,7 @@ export const styles = {
4
4
  minHeight: 42
5
5
  },
6
6
  flexContainer: {
7
- gap: 16
7
+ gap: 24
8
8
  },
9
9
  flexContainerVertical: ({
10
10
  ownerState,
@@ -1,6 +1,6 @@
1
1
  import typography from "../typography";
2
2
  import shadow from "../shadow";
3
- import { grey } from "../../colors";
3
+ const backgroundColor = 'rgba(101, 101, 101, 0.9)';
4
4
  export const styles = {
5
5
  defaultProps: {
6
6
  arrow: true
@@ -11,12 +11,12 @@ export const styles = {
11
11
  ...typography.bodySmMedium
12
12
  },
13
13
  tooltip: {
14
- color: grey[900],
15
- backgroundColor: '#fff',
14
+ color: '#fff',
15
+ backgroundColor: backgroundColor,
16
16
  boxShadow: shadow[4]
17
17
  },
18
18
  arrow: {
19
- color: '#fff'
19
+ color: backgroundColor
20
20
  }
21
21
  }
22
22
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nethru/ui",
3
- "version": "2.0.0",
3
+ "version": "2.0.2",
4
4
  "main": "base/index.js",
5
5
  "files": [
6
6
  "/base"