-
Notifications
You must be signed in to change notification settings - Fork 3
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
[디자인시스템] 3주차 변성진 #9
base: seounjin
Are you sure you want to change the base?
Conversation
return isOpen ? ( | ||
<S.Layout | ||
role="dialog" | ||
aria-labelledby="modal-title" |
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.
<div role="dialog" aria-modal="true" aria-labelledby="dialog_label" aria-describedby="dialog_desc">
<h2 id="dialog_label">모달 제목</h2>
<div id="dialog_desc">모달 내용 설명입니다.</div>
</div>
보통 이렇게 id랑 짝꿍인 aria-속성이 들어가면 그에 맞는 id가 기대되는데
modal-title
에 맞는 id는 없는 것....같아요? 👀
const [isOpen, setIsOpen] = useState<boolean>(false); | ||
|
||
const onConfirm = () => { | ||
setIsOpen(false); | ||
}; | ||
|
||
const onOpen = () => { | ||
setIsOpen(true); | ||
}; | ||
|
||
const onClose = () => { | ||
setIsOpen(false); | ||
}; |
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.
보통 open, close 같은 열림 상태 관리나, 사용자가 닫을 수 있는 방법을 공통화해놓으면 사용자가 여러군데에서 사용할 수 있더라구요. (chakra에서는 useDisclosure 라는 훅으로 사용하고 있어요)
interface ModalLayoutProps extends PropsWithChildren {} | ||
|
||
const ModalLayout = ({ children }: ModalLayoutProps) => { | ||
const { isOpen, onClose } = useModalContext(); |
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.
useModal()
(예시) 같은 훅을 하나 만들어서, 거기서 isOpen
, onClose
같은 속성을 관리하고,
추가로 모달은 키보드 인터랙션(ex) esc
를 누르면 꺼진다, overlay
를 누르면 꺼진다) 같은 것도 같이 관리하면 좋을 것 같아요.
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.
그리고 키보드 이벤트가 나와서 참고로 말씀드리면,
운영체제마다 키보드의 event.key
값이 조금씩 다른거 아시나요?
예를들어, 맥이랑 윈도우에서 어디는 스페이스바 이벤트 키가 어디는 event.key === 'Space'
이고, 어디는 event.key=' '
입니다 ㅎㅎ
그래서 esc를 눌러도 event.key==='Esc'
일수도, event.key==='Escape'
일 수도 있습니다!
이런 점 참고해서 키보드 인터랙션도 구현하시면 좋을 것 같아요
<S.Content role="document" tabIndex={-1}> | ||
{children} | ||
</S.Content> |
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.
tabIndex를 넣으신 이유가 있을까요??
스토리북상으로 확인했을 땐 tabIndex={-1}
이 있을 때랑, 없을 때랑 차이가 없는 것...같아요...?
import { createPortal } from "react-dom"; | ||
|
||
const ModalPortal = ({ children }: PropsWithChildren) => { | ||
const container = document.getElementById("modal"); |
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.
모달용 포탈을 만들어주셨군요! 👍
@@ -16,7 +19,11 @@ const Option = ({ children, value }: OptionProps) => { | |||
setIsOpen(false); | |||
}; | |||
|
|||
return <S.OptionItem onMouseDown={handleOption}>{children}</S.OptionItem>; | |||
return ( | |||
<S.OptionItem id={`listbox-option-${id}`} onMouseDown={handleOption}> |
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.
React에 빌트인된 useId라는 훅이 있습니다 ㅎㅎ 걔를 활용해보셔도 좋을 것 같아요!
구현내용
Modal 컴포넌트
Combobx 컴포넌트
고민한점
공통
파일을 만들때 prefix Naming convenstion을 사용할지 dot notation convenstion을 사용해야 하는게 좋을지 고민함
Combox 컴포넌트
구현하려고 했던 코드
error
Type '(props: T) => void' is not assignable to type '(props: unknown) => void'.
Types of parameters 'props' and 'props' are incompatible.
Type 'unknown' is not assignable to type 'T'.
'unknown' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'unknown'.ts(2322)