[WebUI]Tailwind + nextjs(card) – 2

👉🏻 카드는 웹 앱이나 모바일 앱에서 매우 많이 쓰이는 요소입니다.
Cards are a widely used element in web and mobile apps.

👉🏻 데이터를 화면에 표시할 때 카드 요소에 데이터를 담아 화면에 표현하는 경우가 매우 많습니다.
When displaying data on the screen, it is very common to present it using card elements.

👉🏻 tailwind는 아래의 웹사이트의 검색을 통해서 자세한 내용을 확인 할 수 있습니다.
You can find detailed information about Tailwind by searching on the website below.

https://tailwindcss.com/docs/installation/using-vite

👉🏻 전체 코드는 깃허브에서 확인 할 수 있습니다.
You can find the full code on GitHub.

https://github.com/gideonslife01/flm-webui


📁 타입스크립트 / Typescript

✔️ page.tsx는 타입스크립트를 사용합니다.
page.tsx uses TypeScript.

✔️ 만약에 에디터로 코드 오픈시 태그 부분에 빨간 줄이 생기면 아래처럼 모듈을 설치합니다.
If a red line appears under the tag section when opening the code in the editor, install the module as shown below.

✔️ vscode나 에디터가 타입스크립트를 인식할 수 있게 다음처럼 설치합니다.
Install the following so that VS Code or your editor can recognize TypeScript.

npm install -D @types/react @types/node

📁 태그 구조 / Tag structure

✔️ 카드 부분의 HTML기본 구조는 아래와 같습니다.
The basic HTML structure for the card section is as follows.

✔️ 여기서 중요하게봐야하는건 각 요소(div,p,button…)들의 배치 부분입니다.
The key aspect to focus on here is the layout of the individual elements (div, p, button, etc.).

    <main className="min-h-screen flex items-center justify-center bg-gray-50 p-4">

      {/* 카드 시작 / Start Card */}
      <div className="w-full max-w-sm bg-white rounded-2xl shadow-lg overflow-hidden">

        {/* 이미지 영역 / Image Area */}
        <div className="h-48 bg-gradient-to-br from-blue-400 to-purple-500 flex items-center justify-center">
          <span className="text-5xl">🚀</span>
        </div>

        {/* 텍스트 영역 / Text area */}
        <div className="p-6">
          <div className="flex items-center justify-between">
            <h2 className="text-xl font-bold text-gray-900">Freelifemakers</h2>
            <span className="px-2 py-1 text-xs font-bold bg-blue-100 text-blue-600 rounded-full">NEW</span>
          </div>
          <p className="mt-2 text-sm text-gray-400">
            Next.js + Tailwind로 만든 소개 카드입니다.<br></br>
            This is an introductory card built with Next.js and Tailwind.
          </p>

          {/* 버튼 / Button */}
          <div className="mt-6 flex gap-3">
            <button
              onClick={() => setLiked(!liked)}
              className={`flex-1 py-3 rounded-xl font-bold transition-all active:scale-95 ${liked ? 'bg-red-500 text-white' : 'bg-gray-100 text-gray-700 hover:bg-gray-200'}`}
            >
              {liked ? '❤️ 좋아요/like' : '🤍 좋아요/like'}
            </button>
            <button className="flex-1 py-3 bg-blue-500 text-white rounded-xl font-bold shadow-md hover:bg-blue-600 hover:-translate-y-0.5 transition-all active:scale-95">
              시작하기 / Start
            </button>
          </div>
          
        </div>
      </div>
      {/* 카드 끝 / card end */}
    </main>

📁 가로배치 / Horizontal layout

✔️ 각 요소들은 기본적으로 세로로 배치됩니다.
Each element is arranged vertically by default.

✔️ 요소들의 배치를 코드로 조정하려면 flex를 사용합니다.
Use flex to adjust the layout of elements via code.

✔️ 카드가 시작되는 부분에 flex를 사용하지 않은 경우입니다. 이 경우 기본 값으로 각 요소는 세로로 배치됩니다.
This is a case where flex is not used at the start of the card. In this instance, the elements are arranged vertically by default.

      {/* 카드 시작 / Start Card */}
      <div className="w-full max-w-sm bg-white rounded-2xl shadow-lg overflow-hidden">
              ... ...
      </div>
default

✔️ flex를 사용한 경우입니다. 이 경우 이미지와 텍스트가 가로 배치되는 것을 볼 수 있습니다.

      {/* 카드 시작 / Start Card */}
      <div className="w-full flex max-w-sm bg-white rounded-2xl shadow-lg overflow-hidden">
              ... ...
      </div>
Horizontal layout

📁 세로배치 / Vertical layout

✔️ 기본값은 세로 배치지만 정렬기능을 사용하기 위해서 flex-col를 사용합니다.

✔️ 아래처럼 버튼 부분에 아래 처럼 flex-1로 적용하고 <div className=”mt-6 flex gap-3″> 이렇게 적용하면 레이아웃이 깨질 수 있습니다.

✔️ flex-1 가로 모드에서 아이템이 차지하는 공간이 1:1 비율로 배치하는 코드입니다.

 <button
       onClick={() => setLiked(!liked)}
       className={`flex-1 py-3 rounded-xl ... ... > ... ... </button>

✔️ 그래서 코드를 다음과 같이 바꿉니다. w-full은 요소가 전체 공간을 차지하게 합니다.

✔️ 버튼이 두개 있다면 가로모드에서 w-full을 적용하면 1:1비율로 배치되고 세로 모드에서는 전체 공간을 차지 합니다.

   <button
        onClick={() => setLiked(!liked)}
        className={`w-full py-3 rounded-xl ... ...> ... ... </button?

✔️ 아래는 flex-col을 이용해서 세로 배치를 적용한 모습입니다.

— 코드 / Code

       {/* 버튼 / Button */}
          <div className="mt-6 flex-col gap-3">
            <button
              onClick={() => setLiked(!liked)}
              className={`w-full py-3 rounded-xl font-bold transition-all active:scale-95 ${liked ? 'bg-red-500 text-white' : 'bg-gray-100 text-gray-700 hover:bg-gray-200'}`}
            >
              {liked ? '❤️ 좋아요/like' : '🤍 좋아요/like'}
            </button>
            <button className="w-full py-3 bg-blue-500 text-white rounded-xl font-bold shadow-md hover:bg-blue-600 hover:-translate-y-0.5 transition-all active:scale-95">
              시작하기 / Start
            </button>
          </div>

       {/* 버튼 flex / Button flex *}
          <div className="mt-6 flex">
            <button
              onClick={() => setLiked(!liked)}
              className={`w-full py-3  ${liked ? 'bg-red-500 text-white' : 'bg-gray-100 text-gray-700 hover:bg-gray-200'}`}
            >
              {liked ? '❤️ 좋아요/like' : '🤍 좋아요/like'}
            </button>
            <button className="w-full py-3 bg-blue-500 ">
              시작하기 / Start
            </button>
          </div>
flex-col
💡 flex에서 설정 값
 
1.flex 
- 요소 가로 배치 / Horizontal element layout

2.flex-col 
-  요소 세로 배치 / Vertical element arrangement

3.justify-center 
- 가로 중앙 정렬 / Center-aligned horizontally

4.items-center 
- 위 아래 중앙 정렬 / Vercital center alignment 

5.gap-3 
- 요소 사이 간격 12px / 12px spacing between elements

6.justify-between 
- 요소를 양쪽 끝으로 배치 (ex. 제목은 왼쪽, 뱃지는 오른쪽)
Position elements at both ends (e.g., title on the left, badge on the right).

📁 CSS

✔️ 세로 정렬(기본 값) / Vertical alignment (default)

        
        <style> ...
        /* 카드 본체 / Card body */
        .card {
          width: 100%;
          max-width: 384px; /* max-w-sm = 384px */
          background-color: white;
          border-radius: 16px; /* rounded-2xl */
          box-shadow: 0 10px 15px rgba(0,0,0,0.1);
          overflow: hidden;
        } ...
        </style>

✔️ 가로정렬 / Horizontal alignment(flex)

        <style> ...
        .card-actions {
          margin-top: 24px;
          display: flex;
          gap: 12px;
        } ... ...
        </style>

✔️ 세로정렬 flex / Vertical alignment flex

        <style> ...
         .card-actions {
          display: flex;
          flex-direction: column; /* vertical */
          gap: 12px;
        } ... ...
        </style>

Leave a Reply