๐Ÿ“ฆ ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ ์„ค๊ณ„ ๊ฐ€์ด๋“œ (React + Tailwind)

๐ŸŽฏ ์™œ ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊นŒ?

๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ๋Š”

๐Ÿ‘‰ ๋””์ž์ธ ์ผ๊ด€์„ฑ ์œ ์ง€

๐Ÿ‘‰ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ

๐Ÿ‘‰ ์œ ์ง€๋ณด์ˆ˜ ํšจ์œจ ์ฆ๊ฐ€

๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

๋‹จ, ๋ฌด์กฐ๊ฑด ๋งŽ์ด ๋งŒ๋“œ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ โ€œํ•„์š”ํ•œ ๋งŒํผ๋งŒโ€ ๋งŒ๋“œ๋Š” ๊ฒŒ ํ•ต์‹ฌ์ด๋‹ค.


๐Ÿง  ํ•ต์‹ฌ ๊ธฐ์ค€ (๊ฐ€์žฅ ์ค‘์š”)

๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ๋Š” ์•„๋ž˜ 3๊ฐ€์ง€ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•  ๋•Œ ๋งŒ๋“ ๋‹ค.

  1. 3๋ฒˆ ์ด์ƒ ๋ฐ˜๋ณต๋œ๋‹ค
  2. ๋””์ž์ธ์ด ๋™์ผํ•˜๋‹ค
  3. props๋กœ ์ œ์–ด ๊ฐ€๋Šฅํ•˜๋‹ค

๐Ÿ‘‰ 3๊ฐœ ๋ชจ๋‘ YES์ผ ๋•Œ๋งŒ ๋งŒ๋“ ๋‹ค.


๐Ÿงฉ ์ปดํฌ๋„ŒํŠธ ์ข…๋ฅ˜

1๏ธโƒฃ UI ์ปดํฌ๋„ŒํŠธ (๊ณตํ†ต)

  • Button
  • Card
  • Input
  • ProgressBar

๐Ÿ‘‰ ํŠน์ง•:

  • ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ์Šคํƒ€์ผ ์ค‘์‹ฌ
  • ๋กœ์ง ๊ฑฐ์˜ ์—†์Œ

2๏ธโƒฃ ๋„๋ฉ”์ธ ์ปดํฌ๋„ŒํŠธ (์„œ๋น„์Šค ์ „์šฉ)

  • ResultCard
  • QuestionCard
  • MatchSection

๐Ÿ‘‰ ํŠน์ง•:

  • ํŠน์ • ๊ธฐ๋Šฅ ํฌํ•จ
  • ํ•ด๋‹น ์„œ๋น„์Šค์—์„œ๋งŒ ์‚ฌ์šฉ

๐ŸŽจ Button ์ปดํฌ๋„ŒํŠธ ์„ค๊ณ„ (์‹ค์ „ ์˜ˆ์‹œ)

๐Ÿ“Œ Button.jsx

export default function Button({
  variant = "primary",
  size = "md",
  children,
  disabled = false,
  onClick,
  className = "",
}) {
  const base =
    "rounded-xl font-medium transition active:scale-95";

  const variants = {
    primary: "bg-yellow-400 text-black",
    secondary: "bg-gray-200 text-black",
    danger: "bg-red-500 text-white",
    outline: "border border-gray-300 text-black",
  };

  const sizes = {
    sm: "px-3 py-1 text-sm",
    md: "px-4 py-2 text-base",
    lg: "px-5 py-3 text-lg",
  };

  const disabledStyle = disabled
    ? "opacity-50 cursor-not-allowed"
    : "";

  return (
    <button
      onClick={onClick}
      disabled={disabled}
      className={`${base} ${variants[variant]} ${sizes[size]} ${disabledStyle} ${className}`}
    >
      {children}
    </button>
  );
}

๐Ÿ“Œ ์‚ฌ์šฉ ์˜ˆ์‹œ

<Button variant="primary">์‹œ์ž‘ํ•˜๊ธฐ</Button>
<Button variant="danger">์‚ญ์ œ</Button>
<Button variant="outline">์ทจ์†Œ</Button>
<Button size="lg">ํฐ ๋ฒ„ํŠผ</Button>

๐ŸŽด Card ์ปดํฌ๋„ŒํŠธ

export default function Card({ children, className = "" }) {
  return (
    <div className={`bg-white rounded-2xl shadow-md p-4 ${className}`}>
      {children}
    </div>
  );
}

๐Ÿง  ResultCard (๋„๋ฉ”์ธ ์ปดํฌ๋„ŒํŠธ)

import Card from "../common/Card";

export default function ResultCard({ bread, description, mbti }) {
  return (
    <Card className="text-center">
      <h2 className="text-xl font-bold">{bread}</h2>
      <p className="mt-2 text-sm text-gray-600">{description}</p>
      <span className="mt-3 inline-block text-xs bg-gray-100 px-2 py-1 rounded">
        {mbti}
      </span>
    </Card>
  );
}

๐Ÿ“ ํด๋” ๊ตฌ์กฐ

components/
  common/
    Button.jsx
    Card.jsx
    ProgressBar.jsx

  domain/
    ResultCard.jsx
    QuestionCard.jsx

โš ๏ธ ํ•˜์ง€ ๋ง์•„์•ผ ํ•  ๊ฒƒ

โŒ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ปดํฌ๋„ŒํŠธํ™”

โŒ ์Šคํƒ€์ผ์„ props๋กœ ๋ฌดํ•œ ํ™•์žฅ

โŒ ๊ณตํ†ตํ™” ๊ธฐ์ค€ ์—†์ด ๋ถ„๋ฆฌ

๐Ÿ‘‰ ๊ณผํ•œ ์ถ”์ƒํ™”๋Š” ์˜คํžˆ๋ ค ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค.


๐Ÿ’ก ์‹ค์ „ ํŒ

  • ์Šคํƒ€์ผ์€ variant๋กœ ๊ด€๋ฆฌ
  • ๋ ˆ์ด์•„์›ƒ์€ className์œผ๋กœ ๋ฎ์–ด์“ฐ๊ธฐ
  • ์ฒ˜์Œ๋ถ€ํ„ฐ ๋งŒ๋“ค์ง€ ๋ง๊ณ  ๋ฐ˜๋ณต๋˜๋ฉด ๋ถ„๋ฆฌ

๐Ÿš€ ํ•œ์ค„ ์ •๋ฆฌ

๐Ÿ‘‰ โ€œ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฏธ๋ฆฌ ๋งŒ๋“œ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ๋ฐ˜๋ณต๋  ๋•Œ ๋ฝ‘๋Š” ๊ฒƒ์ด๋‹ค.โ€

results matching ""

    No results matching ""