diff --git a/06-StarRating/k0nghaa/Star.css b/06-StarRating/k0nghaa/Star.css new file mode 100644 index 0000000..a8524b2 --- /dev/null +++ b/06-StarRating/k0nghaa/Star.css @@ -0,0 +1,17 @@ +button { + /* 1. 배경 및 테두리 초기화 */ + background: transparent; + border: none; + + /* 2. 안팎 여백 및 크기 초기화 */ + padding: 0; + margin: 0; + + /* 3. 마우스 커서 및 클릭 시 외곽선 제어 */ + cursor: pointer; + outline: none; + + /* 4. 폰트 스타일 상속 (부모 요소의 글꼴을 그대로 따름) */ + font: inherit; + color: inherit; +} diff --git a/06-StarRating/k0nghaa/Star.tsx b/06-StarRating/k0nghaa/Star.tsx new file mode 100644 index 0000000..6df6676 --- /dev/null +++ b/06-StarRating/k0nghaa/Star.tsx @@ -0,0 +1,41 @@ +interface StarProps { + isFilled: boolean; +} + +export default function Star({ isFilled }: StarProps) { + return isFilled ? ( + + + + ) : ( + + + + ); +} diff --git a/06-StarRating/k0nghaa/StarRating.tsx b/06-StarRating/k0nghaa/StarRating.tsx new file mode 100644 index 0000000..8420cc4 --- /dev/null +++ b/06-StarRating/k0nghaa/StarRating.tsx @@ -0,0 +1,49 @@ +import { useState } from 'react'; +import Star from './Star'; +import './Star.css'; + +interface StarRatingProps { + maxStar: number; + // filledStar: number; + // newStarRating: () => void; +} + +export default function StarRating({ maxStar }: StarRatingProps) { + const [clickedStar, setClickedStar] = useState(0); + const [isHoveredStar, setIsHoveredStar] = useState(null); + + const starArray = Array.from({ length: maxStar }); + + const activeRating = isHoveredStar !== null ? isHoveredStar : clickedStar; + + const handleFilledStar = (index: number) => { + if (index === 0 && clickedStar === 1) { + setClickedStar(0); + } else { + setClickedStar(index + 1); + } + }; + + const handleMouseEnter = (index: number) => { + setIsHoveredStar(index + 1); + }; + + const handleMouseLeave = () => { + setIsHoveredStar(null); + }; + + return ( + <> + {starArray.map((_, index) => ( + + ))} + + ); +}