리팩토링을 마친 Typographies 컴포넌트는

import styled from "styled-components";

function Typographies({ text, variant, typoStyle, margin }) {
  return (
    <StyledFont as={variant} typoStyle={typoStyle} margin={margin}>
      {text}
    </StyledFont>
  );
}

const StyledFont = styled.span.attrs((props) => ({
  typoStyle: props.typoStyle,
}))`
  display: -webkit-box;
  overflow: hidden;
  -webkit-box-orient: vertical;
  text-overflow: ellipsis;
  word-wrap: break-word;
  width: 100%;
  margin: ${(props) => props.margin};
  padding: ${(props) => props.theme.typos[props.typoStyle].padding};
  max-width: ${(props) => props.theme.typos[props.typoStyle].width};
  height: ${(props) => props.theme.typos[props.typoStyle].height};
  color: ${(props) => props.theme.typos[props.typoStyle].color};
  font-weight: ${(props) => props.theme.typos[props.typoStyle].bold};
  font-size: ${(props) => props.theme.typos[props.typoStyle].size};
  white-space: ${(props) => props.theme.typos[props.typoStyle].space};
  -webkit-line-clamp: ${(props) => props.theme.typos[props.typoStyle].line};
  line-height: ${(props) => props.theme.typos[props.typoStyle].lineHeight};
  text-shadow: ${(props) => props.theme.typos[props.typoStyle].textShadow};
  background-color: ${(props) =>
    props.theme.typos[props.typoStyle].backgroundColor};
`;

export default Typographies;

그리고 theme

const typos = {
  title_1: {
    size: fontSizes.title,
    bold: "bold",
    color: colors.tea_2,
    space: "nowrap",
  },
  title_2: {
    size: fontSizes.title,
    bold: "bold",
    height: sizes.h_s,
    line: 2,
  },
  title_3: {
    size: fontSizes.xl,
    bold: "bold",
    height: sizes.h_xs,
    lineHeight: fontSizes.xl,
  },
  title_4: {
    size: fontSizes.zl,
    bold: "bold",
  },
  carousel: {
    size: fontSizes.carousel,
    bold: "bold",
    color: colors.tea_2,
    space: "nowrap",
    textShadow: "-1px 0 white, 0 1px white, 1px 0 white, 0 -1px white",
  },
  commissions: {
    size: fontSizes.base,
    bold: "bold",
    height: sizes.h_xs,
  },
  commissionSub: {
    size: fontSizes.base,
    height: sizes.h_xxxxxl,
    lineHeight: fontSizes.xl,
  },
  commissionMain: {
    size: fontSizes.base,
    lineHeight: fontSizes.xl,
  },
  name: {
    size: fontSizes.l,
    bold: "bold",
    color: colors.tea_2,
  },
  name_2: {
    size: fontSizes.base,
    bold: "bold",
    color: colors.tea_2,
  },
  base: {
    size: fontSizes.base,
  },
  base_2: {
    size: fontSizes.content,
    bold: "bold",
    color: colors.gray_3,
  },
  date: {
    size: fontSizes.s,
    color: colors.gray_3,
  },
};

확실히 사용할 때는 간편하지만 자유롭게 커스텀할 수 없다보니 FormPage를 만드는 과정에서 이건 아니다 싶었다.

차라리 색상, 크기 등을 조절할 수 있도록 만들어야 겠다.

theme에 정의된 typos 를 기본으로 하고 여기에 정의되지 않은 typo에 대한 커스텀이라고 보면 될 것 같다.

color를 예로 들면

<Typographies text="제목" typoStyle="title_4" color="gray_3" />

처럼 typoStyle은 그대로 사용하면서 color를 gray_3으로 하면

const StyledFont = styled.span.attrs((props) => ({
  typoStyle: props.typoStyle,
  color: props.color,
}))`
  color: ${(props) =>
    props.color
      ? props.theme.colors[props.color]
      : props.theme.typos[props.typoStyle].color};
`;

props를 받으면서 props.color가 있다면 props.color를 color로 사용하고 없다면 typoStyle의 color를 사용하게 되는 코드를 작성했다.

댓글남기기