Skip to content

Commit 60c5be2

Browse files
committed
feat: 스타일링된 details 아코디언 컴포넌트 추가
1 parent aa9c836 commit 60c5be2

File tree

2 files changed

+88
-0
lines changed

2 files changed

+88
-0
lines changed

packages/common/src/components/index.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ import { ErrorFallback as ErrorFallbackComponent } from "./error_handler";
99
import { MDXRenderer as MDXRendererComponent } from "./mdx";
1010
import type { MapPropType as MapComponentPropType } from "./mdx_components/map";
1111
import { Map as MapComponent } from "./mdx_components/map";
12+
import {
13+
PrimaryStyledDetails as PrimaryStyledDetailsComponent,
14+
HighlightedStyledDetails as SecondaryStyledDetailsComponent,
15+
} from "./mdx_components/styled_details";
1216
import { MDXEditor as MDXEditorComponent } from "./mdx_editor";
1317
import { PythonKorea as PythonKoreaComponent } from "./pythonkorea";
1418

@@ -24,6 +28,8 @@ namespace Components {
2428
export const ErrorFallback = ErrorFallbackComponent;
2529

2630
export namespace MDX {
31+
export const PrimaryStyledDetails = PrimaryStyledDetailsComponent;
32+
export const SecondaryStyledDetails = SecondaryStyledDetailsComponent;
2733
export const Map = MapComponent;
2834
export type MapPropType = MapComponentPropType;
2935
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
import { ExpandMore } from "@mui/icons-material";
2+
import {
3+
Accordion,
4+
AccordionActions,
5+
AccordionDetails,
6+
AccordionSummary,
7+
PaletteColor,
8+
styled,
9+
SxProps,
10+
Typography,
11+
useTheme,
12+
} from "@mui/material";
13+
import * as React from "react";
14+
15+
type StyledDetailsProps = React.PropsWithChildren<{
16+
expandIcon?: React.ReactNode;
17+
open?: boolean;
18+
summary?: React.ReactNode;
19+
actions?: React.ReactNode;
20+
}>;
21+
22+
type BaseStyledDetailsProps = StyledDetailsProps & {
23+
paletteColor: PaletteColor;
24+
transparencyOnExpand?: number;
25+
};
26+
27+
const BaseStyledDetails: React.FC<BaseStyledDetailsProps> = ({
28+
expandIcon,
29+
open,
30+
summary,
31+
children,
32+
actions,
33+
paletteColor,
34+
transparencyOnExpand,
35+
}) => {
36+
const StyledAccordion = styled(Accordion)(({ theme }) => ({
37+
width: "100%",
38+
paddingRight: theme.spacing(1),
39+
paddingLeft: theme.spacing(1),
40+
border: `1px solid ${paletteColor.dark}`,
41+
borderRadius: "0.5rem",
42+
fontWeight: 500,
43+
}));
44+
45+
const StyledAccordionSummary = styled(AccordionSummary)(() => ({
46+
color: paletteColor.dark,
47+
}));
48+
49+
const rootSx: SxProps = {
50+
transition: "background-color 0.3s ease",
51+
"&.Mui-expanded": {
52+
backgroundColor: `color-mix(in srgb, ${paletteColor.light} ${transparencyOnExpand || 10}%, transparent)`,
53+
},
54+
};
55+
56+
const DefaultExpandIcon = styled(ExpandMore)(({ theme }) => ({
57+
color: paletteColor.dark,
58+
fontSize: theme.typography.h4.fontSize,
59+
}));
60+
61+
return (
62+
<StyledAccordion expanded={open} disableGutters square elevation={0} slotProps={{ root: { sx: rootSx } }}>
63+
{summary && (
64+
<StyledAccordionSummary expandIcon={expandIcon || <DefaultExpandIcon />}>
65+
{typeof summary === "string" ? <Typography variant="h5">{summary}</Typography> : summary}
66+
</StyledAccordionSummary>
67+
)}
68+
<AccordionDetails sx={{ pt: "0", pb: "1rem", px: "2rem" }}>{children}</AccordionDetails>
69+
{actions && <AccordionActions sx={{ pt: "0", pb: "1rem", px: "2rem" }}>{actions}</AccordionActions>}
70+
</StyledAccordion>
71+
);
72+
};
73+
74+
export const PrimaryStyledDetails: React.FC<StyledDetailsProps> = (props) => {
75+
const { palette } = useTheme();
76+
return <BaseStyledDetails {...props} paletteColor={palette.primary} transparencyOnExpand={20} />;
77+
};
78+
79+
export const HighlightedStyledDetails: React.FC<StyledDetailsProps> = (props) => {
80+
const { palette } = useTheme();
81+
return <BaseStyledDetails {...props} paletteColor={palette.highlight} transparencyOnExpand={10} />;
82+
};

0 commit comments

Comments
 (0)