-
Notifications
You must be signed in to change notification settings - Fork 2
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[Feat] input supportingText 구현 #41
Conversation
src/common/component/Input/Input.tsx
Outdated
{LeftIcon && <LeftIcon />} | ||
<input css={inputStyle} {...props} /> | ||
</div> | ||
{supportingText && <SupportingText text={supportingText} isError={isError} isNotice={isNotice} />} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
여기서 SupportingText
한테 텍스트는 children
으로 넘겨준다면 더 깔끔할 것 같다고 생각이 들어요 !
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이말을 듣고 children에 대해서 알아보고 적용하였습니다!
children이 사용하기 훨씬 편할 것 같다는 생각이 드네욤 🙇♀️
좋은 지적 감사합니다 💟
|
||
'::placeholder': { | ||
color: theme.colors.gray_500, | ||
...theme.text.body03, | ||
}, | ||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
제가 스토리북으로 안 사실인데, input
안의 텍스트에 대한 폰트 사이즈와 라인 헤이트도 설정해주셔야 될 것 같습니다 ! GUI 보구요 !
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
오오! 알려주셔서 넘 감사합니다! 수정완료했습니다 !! 💯
const textColor = isError ? theme.colors.red : isNotice ? theme.colors.blue_900 : theme.colors.gray_400; | ||
return <p css={textStyle(textColor)}>{text}</p>; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
요론거 가독성 좋게 return
문은 한 칸 띄워주시면 어떨지..!
그리고 isError
랑 isNotice
를 textStyle
함수에 바로 넘겨주고, 색깔 정하는 삼항연산자는 스타일 함수 내에서 수행하게 하는 건 어떠신가요 ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
넵!
textStyle에 많은 인자를 넣는 게 깔끔해보이지 않아서 저렇게 밖에서 했는데
주용님 말 들어보니까 스타일은 스타일 함수에서 수행하게 하는 것이 더 깔끔한 방법일 것 같네요!!! 👍
감사합니다 !!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
정말 고생하셨습니다 ~! 진짜 실력이 일취월장 하는 모습이 너무 훤히 보여요 !
제가 다 기쁘네용! 반영해주실 것만 반영해주시면 될것 같습니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
고생하셨습니다 ㅎㅎ 마지막 반영만 !!!!
const style = { | ||
outline: { | ||
boxShadow: ` 0px 0px 0px 1px ${theme.colors.gray_400}`, | ||
boxShadow: ` 0px 0px 0px 1px ${borderColor}`, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
요거 inset
추가해주어야 하지 않나요 ?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
inset 안하면 원래의 경계선에 shadow가 생기고 inset을 설정하면 경계선 안에 shadow가 생기더라구요!
underline 상태도 inset을 하지 않았기 때문에 outline도 inset설정하지 않았습니당
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
outline
의 취지가 안에 border
처럼 선이 생길려고 하는 의도가 맞지 않나요 ?? 지금처럼 작성해주면 말 그대로 box
에 흐릿한 그림자가 생기는 것이라input
의 의도상 inset
이 맞지 않나 싶네요 !
그리고 추가적인 의견인데 outline
보다는 default
어떤가요 ? 저희 서비스 특징 상 input
의 기본적인 형상이 outline
이기 때문에 의견 한 번 내봅니다 !
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
그리고 현재 boxShadow
에 할당한 스트링에 맨 앞 공백 다 제거해주시면 감사하겠습니다 !
src/common/component/Input/Input.tsx
Outdated
const Input = ({ | ||
variant, | ||
size = 'medium', | ||
label, | ||
LeftIcon, | ||
isError = false, | ||
isNotice = false, | ||
supportingText, | ||
...props | ||
}: InputProps) => { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
특히 Input
컴포넌트는 forwardRef
를 통해서 외부에서 ref
를 전달받을 수 있도록 구현하는 것이 정말 좋아요 ! 왜냐하면 input
이란 요소 자체가 ref를 통해 focus
나 value
관련 기능을 많이 필요로 하기 때문입니다.
forwardRef
는 말 그대로 부모 컴포넌트에게 ref
를 전달할 수 있게끔 해주는 녀석이에요. Input
은 순수 html 태그로 이루어진 jsx 요소가 아니기 때문에 원래는 ref
를 전달하지 못하지만 다음과 같이 forwardRef를 사용하여 ref를 전달할 수 있어요.
const Input = ({
...
}: InputProps, ref: ForwardRef<HTMLInputElement>) => {
return <input ref={ref} />;
}
export default forwardRef(Input)
이제 해당 Input
컴포넌트를 사용할 때도, 외부에서 ref
를 prop으로 전달할 수 있게 되면서 하나의 DOM 노드로서 기능할 수 있도록 해준답니다 :)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
넵! 알려주셔서 감사합니다~~!!
수정하였습니다!! 👍
isError?: boolean; //red | ||
isNotice?: boolean; //blue |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
주석을 사용하실거라면 저렇게 red
, blue
보다는 해당 prop
이 어떤 용도로 쓰이는지를 적어주시는게 더 나을 것 같아요
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
넵! 이름에서 용도가 드러난다고 판단해서 주석 삭제하였습니당
export const textStyle = ({ isError, isNotice }: { isError: boolean; isNotice: boolean }) => { | ||
const textColor = isError ? theme.colors.red : isNotice ? theme.colors.blue_900 : theme.colors.gray_400; | ||
|
||
const style: CSSObject = { color: textColor, wordBreak: 'break-word', ...theme.text.body04 }; | ||
|
||
return style; | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
반환 객체의 타입을 따로 지정하지 않아도 동작하지 않나요 ?
CSSObject
를 반환하는게 아니라 그냥 style을 css
함수로 작성하면 될 것 같습니다.
const style = css({
...
});
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
타입스크립트 css-in-js에서 color나 다른 속성들은 타입을 문자열로 받아도 유연하게 대처하는데 제가 사용한 wordBreak 속성은 css 표준에 정의된 특정값 (CSSObject 형태) 로 받아야 에러가 나지 않더라구요!
그래서 문자열로 보냈을 때 에러를해결하기 위해 CSSObject 키워드를 붙여줬습니다. !
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
고생하셨습니다 ! 마지막 반영... !
const style = { | ||
outline: { | ||
boxShadow: ` 0px 0px 0px 1px ${theme.colors.gray_400}`, | ||
boxShadow: ` 0px 0px 0px 1px ${borderColor}`, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
outline
의 취지가 안에 border
처럼 선이 생길려고 하는 의도가 맞지 않나요 ?? 지금처럼 작성해주면 말 그대로 box
에 흐릿한 그림자가 생기는 것이라input
의 의도상 inset
이 맞지 않나 싶네요 !
그리고 추가적인 의견인데 outline
보다는 default
어떤가요 ? 저희 서비스 특징 상 input
의 기본적인 형상이 outline
이기 때문에 의견 한 번 내봅니다 !
const style = { | ||
outline: { | ||
boxShadow: ` 0px 0px 0px 1px ${theme.colors.gray_400}`, | ||
boxShadow: ` 0px 0px 0px 1px ${borderColor}`, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
그리고 현재 boxShadow
에 할당한 스트링에 맨 앞 공백 다 제거해주시면 감사하겠습니다 !
src/common/component/Input/Input.tsx
Outdated
<article css={containerStyle}> | ||
{label && <Label id={label}>{label}</Label>} | ||
<div css={[inputWarpperStyle, variantStyle(variant), sizeStyle(size)]}> | ||
{LeftIcon && <LeftIcon />} | ||
<input css={[inputStyle]} {...props} /> | ||
<div css={inputSupportStyle}> | ||
<div css={[warpperStyle, variantStyle({ variant, isError }), sizeStyle(size)]}> | ||
{LeftIcon && <LeftIcon />} | ||
<input ref={ref} css={inputStyle} {...props} /> | ||
</div> | ||
{supportingText && ( | ||
<SupportingText isError={isError} isNotice={isNotice}> | ||
{supportingText} | ||
</SupportingText> | ||
)} | ||
</div> | ||
</article> | ||
); | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Label
을 현재 inputSupportingStyle
을 부여한 div
안으로 넣어줄 수 있지 않나요 ? 그렇다면 최상위 컨테이너 요소인 article
을 하나 더 적어줄 필요가 없을 것 같습니다.
<article>
<Label>
<div css={wrapperStyle}>
{<LeftIcon />}
<input />
</div>
<SupportingText>
</article>
구조로도 충분히 구현할 수 있을 것 같아요
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
보운이 넘 고생하셨습니다 !! 코멘트만 해결해주시면 될 것 같아용
src/common/component/Input/Input.tsx
Outdated
} | ||
|
||
const Input = ({ variant, size = 'medium', label, LeftIcon, ...props }: InputProps) => { | ||
const Input = ({ | ||
variant, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
스타일 적용한 거 보니까 Required로 variant 값을 가져왔던데, 그렇다면 variant 값을 옵셔널로 주는 방향으로 코드를 작성하는 게 맞는 것 같습니다 !
import { theme } from '@/common/style/theme/theme'; | ||
|
||
export const textStyle = ({ isError, isNotice }: { isError: boolean; isNotice: boolean }) => { | ||
const textColor = isError ? theme.colors.red : isNotice ? theme.colors.blue_900 : theme.colors.gray_400; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
야무지다 !!!
해당 이슈 번호
closed #32
체크리스트
📌 내가 알게 된 부분
wordBreak
를 알게되었다!📌사용법
Input 사용할 때, 속성으로 isError, isNotice, supportingText로 Supporting text를 사용할 수 있습니다.
isError 는 빨간색으로, isNotice는 파란색으로, 둘다 아무런 입력이 없으면 모두 false가 기본이고, 둘다 false인데 supporitngText가 있으면 회색으로 나오게 됩니다.
즉,
빨강: isError == true
파랑: isNotice == true
회색: isNotice & isError == false