@campxdev/react-blueprint 1.0.4 → 1.0.6

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 (51) hide show
  1. package/package.json +6 -2
  2. package/public/index.html +3 -4
  3. package/src/App.tsx +8 -1
  4. package/src/AppContent.tsx +38 -0
  5. package/src/assets/images/svg/Emptylistmage.svg +9 -0
  6. package/src/assets/images/svg/Internalserverimage.svg +9 -0
  7. package/src/assets/images/svg/error-cactus.svg +9 -0
  8. package/src/assets/images/svg/index.ts +10 -0
  9. package/src/assets/images/svg/no-connection.svg +9 -0
  10. package/src/assets/images/svg/unauthorized.svg +9 -0
  11. package/src/components/Assets/ErrorPages/InternalServerError.tsx +31 -0
  12. package/src/components/Assets/ErrorPages/NoInternetConnection.tsx +33 -0
  13. package/src/components/Assets/ErrorPages/NoItemFound.tsx +33 -0
  14. package/src/components/Assets/ErrorPages/PageNotFound.tsx +33 -0
  15. package/src/components/Assets/ErrorPages/UnAuthorized.tsx +25 -0
  16. package/src/components/Assets/ErrorPages/styles.tsx +29 -0
  17. package/src/components/Assets/Icons/IconComponents/CompletedStateIcon.tsx +35 -0
  18. package/src/components/Assets/Icons/IconComponents/SaveIcon.tsx +42 -0
  19. package/src/components/Assets/Icons/IconComponents/ShareIcon.tsx +61 -0
  20. package/src/components/Assets/Icons/Icons.tsx +6 -0
  21. package/src/components/Assets/export.ts +5 -0
  22. package/src/components/Charts/BarChart/BarChart.tsx +160 -0
  23. package/src/components/Charts/LineChart/LineChart.tsx +119 -0
  24. package/src/components/Charts/PieChart/PieChart.tsx +95 -0
  25. package/src/components/Charts/TreeMap/TreeMap.tsx +151 -0
  26. package/src/components/Charts/types/types.ts +43 -0
  27. package/src/components/DataDisplay/Accordion/Accordion.tsx +55 -0
  28. package/src/components/DataDisplay/Accordion/utils/StandardImageList.tsx +70 -0
  29. package/src/components/DataDisplay/export.ts +4 -1
  30. package/src/components/Input/components/FetchingOptionsLoader.tsx +7 -7
  31. package/src/components/Input/export.ts +1 -0
  32. package/src/components/Layout/TabsLayout/Tabs.tsx +67 -0
  33. package/src/components/Layout/TabsLayout/TabsLayout.tsx +56 -0
  34. package/src/components/Layout/exports.ts +4 -0
  35. package/src/components/Navigation/Breadcrumbs/Breadcrumbs.tsx +40 -0
  36. package/src/components/Navigation/Sidebar/styles.tsx +1 -1
  37. package/src/components/Navigation/Stepper/Stepper.tsx +59 -0
  38. package/src/components/Navigation/Stepper/StepperComponents.tsx +72 -0
  39. package/src/components/Navigation/exports.ts +4 -0
  40. package/src/components/export.ts +3 -3
  41. package/src/stories/Charts/BarChart.stories.tsx +142 -0
  42. package/src/stories/Charts/LineChart.stories.tsx +112 -0
  43. package/src/stories/Charts/PieChart.stories.tsx +137 -0
  44. package/src/stories/Charts/Treemap.stories.tsx +224 -0
  45. package/src/stories/DataDisplay/Accordion.stories.tsx +62 -0
  46. package/src/stories/DesignSystem/typography.stories.tsx +1 -1
  47. package/src/stories/Layout/TabsLayout.stories.tsx +53 -0
  48. package/src/stories/Navigation/Breadcrumbs.stories.tsx +34 -0
  49. package/src/stories/Navigation/Stepper.stories.tsx +51 -0
  50. package/src/themes/commonTheme.ts +47 -1
  51. package/types/theme.d.ts +1 -1
@@ -0,0 +1,95 @@
1
+ import { Stack, SxProps, Typography, useTheme } from "@mui/material";
2
+ import { Cell, Legend, Pie, PieChart as RePieChart, Tooltip } from "recharts";
3
+ import { LegendProps, MarginProps } from "../types/types";
4
+
5
+ export type PieChartProps = {
6
+ title?: string;
7
+ titleSx?: SxProps;
8
+ margin?: MarginProps;
9
+ width?: number;
10
+ height?: number;
11
+ pie1: PieProps;
12
+ pie2?: PieProps;
13
+ containerSx?: SxProps;
14
+ showLegend?: boolean;
15
+ legendSx?: LegendProps;
16
+ showToolTip?: boolean;
17
+ };
18
+
19
+ type PieProps = {
20
+ data: any[];
21
+ dataKey: string;
22
+ innerRadius?: number;
23
+ outerRadius?: number;
24
+ fill?: string;
25
+ label?: boolean;
26
+ cx?: string;
27
+ cy?: string;
28
+ colors?: string[];
29
+ };
30
+
31
+ export const PieChart = ({
32
+ title = "Pie Chart",
33
+ titleSx,
34
+ margin,
35
+ width = 500,
36
+ height = 500,
37
+ showToolTip = true,
38
+ showLegend = true,
39
+ legendSx,
40
+ pie1,
41
+ pie2,
42
+ containerSx,
43
+ }: PieChartProps) => {
44
+ const theme = useTheme();
45
+
46
+ return (
47
+ <Stack alignItems="center" sx={{ ...containerSx }}>
48
+ <Typography variant="h5" align="center" sx={{ ...titleSx }}>
49
+ {title}
50
+ </Typography>
51
+ <RePieChart width={width} height={height} margin={margin}>
52
+ {showToolTip && (
53
+ <Tooltip
54
+ itemStyle={{
55
+ color: theme.palette.text.primary,
56
+ }}
57
+ contentStyle={{
58
+ color: theme.palette.text.secondary,
59
+ backgroundColor: theme.palette.background.paper,
60
+ borderRadius: "5px",
61
+ padding: "5px 10px",
62
+ }}
63
+ />
64
+ )}
65
+ {showLegend && <Legend {...legendSx} />}
66
+ <Pie {...pie1} cx={pie1?.cx ?? "50%"} cy={pie1?.cy ?? "50%"}>
67
+ {pie1?.data.map((entry, index) => (
68
+ <Cell
69
+ key={`cell-${index}`}
70
+ fill={
71
+ pie1.colors
72
+ ? pie1.colors[index % pie1.colors.length]
73
+ : pie1.fill
74
+ }
75
+ />
76
+ ))}
77
+ </Pie>
78
+ {pie2 && (
79
+ <Pie {...pie2} cx={pie2?.cx ?? "50%"} cy={pie2?.cy ?? "50%"}>
80
+ {pie2?.data.map((entry, index) => (
81
+ <Cell
82
+ key={`cell-${index}`}
83
+ fill={
84
+ pie2.colors
85
+ ? pie2.colors[index % pie2.colors.length]
86
+ : pie2.fill
87
+ }
88
+ />
89
+ ))}
90
+ </Pie>
91
+ )}
92
+ </RePieChart>
93
+ </Stack>
94
+ );
95
+ };
@@ -0,0 +1,151 @@
1
+ import {
2
+ Box,
3
+ Stack,
4
+ styled,
5
+ SxProps,
6
+ Typography,
7
+ useTheme,
8
+ } from "@mui/material";
9
+ import { Treemap as ReTreeMap, Tooltip } from "recharts";
10
+ import { AnimationTiming } from "recharts/types/util/types";
11
+ import { MarginProps } from "../types/types";
12
+
13
+ interface TreeMapProps {
14
+ title?: string;
15
+ titleSx?: any;
16
+ data: any;
17
+ dataKey: string | number;
18
+ width?: number;
19
+ height?: number;
20
+ margin?: MarginProps;
21
+ aspectRatio?: number;
22
+ fill?: string;
23
+ stroke?: string;
24
+ colors?: string[];
25
+ showToolTip?: boolean;
26
+ isAnimationActive?: boolean;
27
+ animationEasing?: AnimationTiming;
28
+ treeMapStyle?: SxProps;
29
+ containerSx?: any;
30
+ }
31
+
32
+ const TreeMap = ({
33
+ title = "Tree Map",
34
+ titleSx,
35
+ data,
36
+ dataKey,
37
+ width = 400,
38
+ height = 200,
39
+ aspectRatio,
40
+ fill = "#F8C12D",
41
+ stroke = "#fff",
42
+ colors,
43
+ showToolTip = true,
44
+ animationEasing = "linear",
45
+ isAnimationActive = false,
46
+ treeMapStyle,
47
+ containerSx,
48
+ }: TreeMapProps) => {
49
+ return (
50
+ <Stack alignItems={"center"} sx={{ ...containerSx }}>
51
+ <Typography variant={"h5"} align={"center"} sx={{ ...titleSx }}>
52
+ {title}
53
+ </Typography>
54
+ <ReTreeMap
55
+ data={data}
56
+ dataKey={dataKey}
57
+ width={width}
58
+ height={height}
59
+ aspectRatio={aspectRatio}
60
+ fill={fill}
61
+ stroke={stroke}
62
+ style={treeMapStyle}
63
+ isAnimationActive={isAnimationActive}
64
+ animationEasing={animationEasing}
65
+ content={<CustomizedContent colors={colors} />}
66
+ >
67
+ {showToolTip && <Tooltip content={CustomTooltip} />}
68
+ </ReTreeMap>
69
+ </Stack>
70
+ );
71
+ };
72
+
73
+ export default TreeMap;
74
+
75
+ const CustomizedContent = (props: any) => {
76
+ const theme = useTheme();
77
+ const {
78
+ root,
79
+ depth,
80
+ x,
81
+ y,
82
+ width,
83
+ height,
84
+ index,
85
+ payload,
86
+ colors,
87
+ rank,
88
+ name,
89
+ } = props;
90
+
91
+ return (
92
+ <g {...props}>
93
+ <rect
94
+ x={x}
95
+ y={y}
96
+ width={width}
97
+ height={height}
98
+ style={{
99
+ fill:
100
+ depth < 2
101
+ ? colors[
102
+ Math.floor((index / root.children.length) * colors.length)
103
+ ]
104
+ : "#ffffff00",
105
+ stroke: theme.palette.surface.grey,
106
+ strokeWidth: 2,
107
+ strokeOpacity: 1,
108
+ }}
109
+ />
110
+ {depth === 1 ? (
111
+ <text
112
+ x={x + width / 2}
113
+ y={y + height / 2}
114
+ textAnchor="middle"
115
+ fill={theme.palette.text.primary}
116
+ fontSize={14}
117
+ strokeOpacity={0}
118
+ >
119
+ {name}
120
+ </text>
121
+ ) : null}
122
+ </g>
123
+ );
124
+ };
125
+
126
+ const CustomTooltip = ({ active, payload }: any) => {
127
+ const theme = useTheme();
128
+ if (active && payload && payload.length) {
129
+ return (
130
+ <StyledContainer>
131
+ <Typography variant="body2">{`${payload[0].payload.root.name}`}</Typography>
132
+ <Typography variant="caption">
133
+ <span>{`${payload[0].payload.name}`}</span>
134
+ <span
135
+ style={{ fontWeight: "bold", color: theme.palette.text.primary }}
136
+ >
137
+ {"\xa0\xa0" + `${payload[0].value}`}
138
+ </span>
139
+ </Typography>
140
+ </StyledContainer>
141
+ );
142
+ }
143
+
144
+ return null;
145
+ };
146
+
147
+ export const StyledContainer = styled(Box)(({ theme }) => ({
148
+ backgroundColor: theme.palette.background.paper,
149
+ borderRadius: "5px",
150
+ padding: "5px 10px",
151
+ }));
@@ -0,0 +1,43 @@
1
+ import { SxProps } from "@mui/material";
2
+ import {
3
+ HorizontalAlignmentType,
4
+ IconType,
5
+ VerticalAlignmentType,
6
+ } from "recharts/types/component/DefaultLegendContent";
7
+ import { LayoutType } from "recharts/types/util/types";
8
+
9
+ export type CartesianGridProps = {
10
+ showCartesianGrid: boolean;
11
+ size?: number;
12
+ };
13
+
14
+ export type AxisLabelProps = {
15
+ xLabel?: LabelProps;
16
+ yLabel?: LabelProps;
17
+ };
18
+
19
+ export type MarginProps = {
20
+ top?: number;
21
+ right?: number;
22
+ bottom?: number;
23
+ left?: number;
24
+ };
25
+
26
+ export type LabelProps = {
27
+ value: string;
28
+ dx?: number;
29
+ dy?: number;
30
+ angle?: number;
31
+ };
32
+
33
+ export type LegendProps = {
34
+ width?: number;
35
+ height?: number;
36
+ layout?: LayoutType;
37
+ align?: HorizontalAlignmentType;
38
+ verticalAlign?: VerticalAlignmentType;
39
+ iconSize?: number;
40
+ iconType?: IconType;
41
+ margin: MarginProps;
42
+ className: string;
43
+ };
@@ -0,0 +1,55 @@
1
+ import { ExpandMore } from "@mui/icons-material";
2
+ import {
3
+ AccordionDetails,
4
+ Box,
5
+ Accordion as MuiAccordion,
6
+ AccordionSummary as MuiAccordionSummary,
7
+ SxProps,
8
+ } from "@mui/material";
9
+ import { ReactNode, SyntheticEvent, useState } from "react";
10
+ import { Typography } from "../Typography/Typography";
11
+
12
+ interface AccordionProps {
13
+ data: AccordionItem[];
14
+ containerSx?: SxProps;
15
+ }
16
+ interface AccordionItem {
17
+ title: string | ReactNode;
18
+ content: string | ReactNode;
19
+ }
20
+
21
+ export const Accordion = ({ data, containerSx }: AccordionProps) => {
22
+ const [expanded, setExpanded] = useState<number | false>(false);
23
+
24
+ const handleChange =
25
+ (panel: number) => (event: SyntheticEvent, isExpanded: boolean) => {
26
+ setExpanded(isExpanded ? panel : false);
27
+ };
28
+
29
+ return (
30
+ <Box sx={{ ...containerSx }}>
31
+ {data?.map((item, index) => (
32
+ <MuiAccordion
33
+ key={index}
34
+ expanded={expanded === index}
35
+ onChange={handleChange(index)}
36
+ >
37
+ <MuiAccordionSummary expandIcon={<ExpandMore />}>
38
+ {typeof item?.title === "string" ? (
39
+ <Typography variant="subtitle2">{item?.title}</Typography>
40
+ ) : (
41
+ item?.title
42
+ )}
43
+ </MuiAccordionSummary>
44
+ <AccordionDetails>
45
+ {typeof item?.content === "string" ? (
46
+ <Typography variant="label1">{item?.content}</Typography>
47
+ ) : (
48
+ item?.content
49
+ )}
50
+ </AccordionDetails>
51
+ </MuiAccordion>
52
+ ))}
53
+ </Box>
54
+ );
55
+ };
@@ -0,0 +1,70 @@
1
+ import ImageList from "@mui/material/ImageList";
2
+ import ImageListItem from "@mui/material/ImageListItem";
3
+
4
+ export default function StandardImageList() {
5
+ return (
6
+ <ImageList sx={{ width: 500, height: 450 }} cols={3} rowHeight={164}>
7
+ {itemData.map((item) => (
8
+ <ImageListItem key={item.img}>
9
+ <img
10
+ srcSet={`${item.img}?w=164&h=164&fit=crop&auto=format&dpr=2 2x`}
11
+ src={`${item.img}?w=164&h=164&fit=crop&auto=format`}
12
+ alt={item.title}
13
+ loading="lazy"
14
+ />
15
+ </ImageListItem>
16
+ ))}
17
+ </ImageList>
18
+ );
19
+ }
20
+
21
+ const itemData = [
22
+ {
23
+ img: "https://images.unsplash.com/photo-1551963831-b3b1ca40c98e",
24
+ title: "Breakfast",
25
+ },
26
+ {
27
+ img: "https://images.unsplash.com/photo-1551782450-a2132b4ba21d",
28
+ title: "Burger",
29
+ },
30
+ {
31
+ img: "https://images.unsplash.com/photo-1522770179533-24471fcdba45",
32
+ title: "Camera",
33
+ },
34
+ {
35
+ img: "https://images.unsplash.com/photo-1444418776041-9c7e33cc5a9c",
36
+ title: "Coffee",
37
+ },
38
+ {
39
+ img: "https://images.unsplash.com/photo-1533827432537-70133748f5c8",
40
+ title: "Hats",
41
+ },
42
+ {
43
+ img: "https://images.unsplash.com/photo-1558642452-9d2a7deb7f62",
44
+ title: "Honey",
45
+ },
46
+ {
47
+ img: "https://images.unsplash.com/photo-1516802273409-68526ee1bdd6",
48
+ title: "Basketball",
49
+ },
50
+ {
51
+ img: "https://images.unsplash.com/photo-1518756131217-31eb79b20e8f",
52
+ title: "Fern",
53
+ },
54
+ {
55
+ img: "https://images.unsplash.com/photo-1597645587822-e99fa5d45d25",
56
+ title: "Mushrooms",
57
+ },
58
+ {
59
+ img: "https://images.unsplash.com/photo-1567306301408-9b74779a11af",
60
+ title: "Tomato basil",
61
+ },
62
+ {
63
+ img: "https://images.unsplash.com/photo-1471357674240-e1a485acb3e1",
64
+ title: "Sea star",
65
+ },
66
+ {
67
+ img: "https://images.unsplash.com/photo-1589118949245-7d38baf380d6",
68
+ title: "Bike",
69
+ },
70
+ ];
@@ -1,2 +1,5 @@
1
+ import { Accordion } from "./Accordion/Accordion";
2
+ import { DataTable } from "./DataTable/DataTable";
3
+
1
4
  export * from "./Avatar/Avatar";
2
- export * from "./DataTable/DataTable";
5
+ export { Accordion, DataTable };
@@ -3,12 +3,12 @@ import { Spinner } from "../../Feedback/Spinner/Spinner";
3
3
  import { FetchingOptionsLoaderContainer } from "../styles";
4
4
 
5
5
  export const FetchingOptionsLoader = ({ loading }: { loading: boolean }) => {
6
- return (
7
- loading && (
8
- <FetchingOptionsLoaderContainer direction="row" alignItems="center">
9
- <Spinner />
10
- <Typography variant="caption">Fetching Options</Typography>
11
- </FetchingOptionsLoaderContainer>
12
- )
6
+ return loading ? (
7
+ <FetchingOptionsLoaderContainer direction="row" alignItems="center">
8
+ <Spinner />
9
+ <Typography variant="caption">Fetching Options</Typography>
10
+ </FetchingOptionsLoaderContainer>
11
+ ) : (
12
+ <></>
13
13
  );
14
14
  };
@@ -1,4 +1,5 @@
1
1
  export * from "./Button/Button";
2
+ export * from "./MultiCheckBox/MultiCheckBox";
2
3
  export * from "./SearchBar/SearchBar";
3
4
  export * from "./SingleSelect/SingleSelect";
4
5
  export * from "./Switch/Switch";
@@ -0,0 +1,67 @@
1
+ import { Box, Divider, styled } from "@mui/material";
2
+ import { NavLink } from "react-router-dom";
3
+
4
+ interface TabProps {
5
+ index: number;
6
+ path: string;
7
+ title: string;
8
+ handleTabChange: (index: number) => void;
9
+ isActiveTab: boolean;
10
+ isPrevTab: boolean;
11
+ isLastTab: boolean;
12
+ }
13
+
14
+ export const Tab = ({
15
+ index,
16
+ path,
17
+ title,
18
+ isActiveTab,
19
+ isPrevTab,
20
+ isLastTab,
21
+ handleTabChange,
22
+ }: TabProps) => {
23
+ return (
24
+ <Box
25
+ key={index}
26
+ sx={{
27
+ display: "flex",
28
+ alignItems: "center",
29
+ }}
30
+ onClick={() => handleTabChange(index)}
31
+ >
32
+ <StyledNavLink to={path} key={path}>
33
+ {title}
34
+ </StyledNavLink>
35
+ {!isActiveTab && !isPrevTab && !isLastTab && (
36
+ <Divider orientation="vertical" variant="middle" flexItem />
37
+ )}
38
+ </Box>
39
+ );
40
+ };
41
+
42
+ const StyledNavLink = styled(NavLink)(({ theme }) => ({
43
+ width: "204px",
44
+ padding: "12px 26px",
45
+ textAlign: "center",
46
+ textDecoration: "none",
47
+ fontWeight: 400,
48
+ color: theme.palette.text.secondary,
49
+ borderTopRightRadius: "12px",
50
+ borderTopLeftRadius: "12px",
51
+ backgroundColor: theme.palette.surface.defaultBackground,
52
+ position: "relative",
53
+
54
+ "&.active": {
55
+ fontWeight: 600,
56
+ color: theme.palette.text.primary,
57
+ backgroundColor: theme.palette.surface.paperBackground,
58
+ "&::after": {
59
+ content: '""',
60
+ position: "absolute",
61
+ bottom: 0,
62
+ left: "25%",
63
+ width: "50%",
64
+ borderBottom: `4px solid ${theme.palette.tertiary.main}`,
65
+ },
66
+ },
67
+ }));
@@ -0,0 +1,56 @@
1
+ import { Box, Stack, useTheme } from "@mui/material";
2
+ import { useState } from "react";
3
+ import { ErrorBoundary } from "react-error-boundary";
4
+ import { Outlet } from "react-router-dom";
5
+ import { Tab } from "./Tabs";
6
+
7
+ interface TabsLayoutProps {
8
+ menu: MenuItem[];
9
+ }
10
+
11
+ interface MenuItem {
12
+ title: string;
13
+ path: string;
14
+ permissionKey?: string;
15
+ }
16
+
17
+ export const TabsLayout = ({ menu }: TabsLayoutProps) => {
18
+ const theme = useTheme();
19
+ const [activeTab, setActiveTab] = useState<number | null>(null);
20
+ const handleTabChange = (index: number) => {
21
+ setActiveTab(index);
22
+ };
23
+
24
+ return (
25
+ <Stack>
26
+ <Stack
27
+ direction={"row"}
28
+ sx={{
29
+ backgroundColor: theme.palette.surface.defaultBackground,
30
+ }}
31
+ >
32
+ {menu?.map((item, index) => {
33
+ return (
34
+ <Tab
35
+ key={index}
36
+ index={index}
37
+ path={item?.path}
38
+ title={item?.title}
39
+ handleTabChange={handleTabChange}
40
+ isActiveTab={index === activeTab}
41
+ isPrevTab={activeTab !== null && index === activeTab - 1}
42
+ isLastTab={index === menu?.length - 1}
43
+ />
44
+ );
45
+ })}
46
+ </Stack>
47
+ <ErrorBoundary
48
+ fallbackRender={(error: any) => (
49
+ <Box>Error: {error?.response?.data?.message ?? error?.message}</Box>
50
+ )}
51
+ >
52
+ <Outlet />
53
+ </ErrorBoundary>
54
+ </Stack>
55
+ );
56
+ };
@@ -0,0 +1,4 @@
1
+ import { AppHeader } from "./AppHeader/AppHeader";
2
+ import { TabsLayout } from "./TabsLayout/TabsLayout";
3
+
4
+ export { AppHeader, TabsLayout };
@@ -0,0 +1,40 @@
1
+ import {
2
+ Link,
3
+ Breadcrumbs as MuiBreadcrumbs,
4
+ Stack,
5
+ styled,
6
+ } from "@mui/material";
7
+ import { ReactNode } from "react";
8
+ import { Typography } from "../../DataDisplay/Typography/Typography";
9
+
10
+ interface BreadcrumbsProps {
11
+ links: {
12
+ name: string | ReactNode;
13
+ to: string;
14
+ }[];
15
+ }
16
+
17
+ export const Breadcrumbs = ({ links }: BreadcrumbsProps) => {
18
+ const linksArray = links?.slice(0, -1);
19
+ const currentPage = links?.slice(-1)[0];
20
+
21
+ return (
22
+ <Stack direction={"row"} alignItems={"center"}>
23
+ <MuiBreadcrumbs>
24
+ {linksArray?.map((item, index) => (
25
+ <StyledLink key={index} href={item?.to}>
26
+ {item?.name}
27
+ </StyledLink>
28
+ ))}
29
+ <Typography variant="subtitle2">{currentPage?.name}</Typography>
30
+ </MuiBreadcrumbs>
31
+ </Stack>
32
+ );
33
+ };
34
+
35
+ const StyledLink = styled(Link)(({ theme }) => ({
36
+ transition: "color 0.3s ease-in-out",
37
+ "&:hover": {
38
+ color: theme.palette.primary.light,
39
+ },
40
+ }));
@@ -50,7 +50,7 @@ export const createSidebarStyles = (collapsed: boolean) => {
50
50
  const StyledListItem = styled(ListItem)<StyledListItemProps>(
51
51
  ({ theme, match }) => ({
52
52
  backgroundColor: match ? theme.palette.secondary.main : "none",
53
- width: "auto",
53
+ width: collapsed ? "min-content" : "auto",
54
54
  margin: "5px 8px",
55
55
  borderRadius: "4px",
56
56
  })
@@ -0,0 +1,59 @@
1
+ import {
2
+ Box,
3
+ Stepper as MuiStepper,
4
+ Step,
5
+ StepLabel,
6
+ SxProps,
7
+ Typography,
8
+ } from "@mui/material";
9
+ import { Connector, StepIcon, StyledStepContent } from "./StepperComponents";
10
+
11
+ interface StepperProps {
12
+ orientation: "vertical" | "horizontal";
13
+ activeStep: number;
14
+ steps: StepItem[];
15
+ containerSx: SxProps;
16
+ }
17
+
18
+ interface StepItem {
19
+ label: string;
20
+ description: string;
21
+ }
22
+
23
+ export const Stepper = ({
24
+ orientation,
25
+ steps,
26
+ activeStep = 0,
27
+ containerSx,
28
+ }: StepperProps) => {
29
+ const isVertical = orientation === "vertical";
30
+
31
+ return (
32
+ <Box
33
+ sx={{
34
+ ...(isVertical ? { maxWidth: "300px" } : {}),
35
+ ...containerSx,
36
+ }}
37
+ >
38
+ <MuiStepper
39
+ activeStep={activeStep}
40
+ orientation={orientation}
41
+ alternativeLabel={!isVertical}
42
+ connector={<Connector isVertical={isVertical} />}
43
+ >
44
+ {steps?.map((item, index) => (
45
+ <Step key={index} expanded>
46
+ <StepLabel StepIconComponent={StepIcon}>{item?.label}</StepLabel>
47
+ <StyledStepContent
48
+ isVertical={isVertical}
49
+ activeStep={index < activeStep}
50
+ isLastStep={index === steps?.length - 1}
51
+ >
52
+ <Typography variant="label2">{item?.description}</Typography>
53
+ </StyledStepContent>
54
+ </Step>
55
+ ))}
56
+ </MuiStepper>
57
+ </Box>
58
+ );
59
+ };