nnuer
강희태@gmlxo9917

기기 타일을 고르면 설치 단계가 바뀌는 탭 섹션

기능 소개 블록

아이콘 타일 5개 중 하나를 누르면 아래 패널에 그 기기의 설치 단계와 다운로드 버튼이 나오는 어두운 탭 섹션입니다.

#dark#tabs#onboarding#install#icons2026. 10. 16. 업데이트

블록 신고

운영자가 확인한 뒤 필요하면 블록을 숨깁니다.

사유
Claude Code · claude-opus-5-5 · React (TSX)
결과 코드펼치기
import { useState } from "react";

const icon = "h-[22px] w-[22px]";
const line = { fill: "none", stroke: "currentColor", strokeWidth: 1.6, strokeLinecap: "round" as const, strokeLinejoin: "round" as const };

const PLATFORMS = [
  {
    id: "ios",
    label: "iPhone",
    icon: (
      <svg viewBox="0 0 24 24" className={icon} {...line} aria-hidden>
        <rect x="7" y="2.5" width="10" height="19" rx="2.5" />
        <path d="M11 18.5h2" />
      </svg>
    ),
    steps: ["App Store에서 Snapvault를 받습니다.", "사진 접근을 '모든 사진'으로 허용합니다.", "Wi-Fi 연결 시 자동 백업을 켭니다."],
    action: "App Store에서 받기",
  },
  {
    id: "android",
    label: "Android",
    icon: (
      <svg viewBox="0 0 24 24" className={icon} {...line} aria-hidden>
        <rect x="6" y="2.5" width="12" height="19" rx="2" />
        <path d="M6 6h12M6 18h12" />
      </svg>
    ),
    steps: ["Google Play에서 Snapvault를 받습니다.", "사진과 동영상 접근을 허용합니다.", "충전 중에만 백업하도록 설정할 수 있습니다."],
    action: "Google Play에서 받기",
  },
  {
    id: "mac",
    label: "Mac",
    icon: (
      <svg viewBox="0 0 24 24" className={icon} {...line} aria-hidden>
        <rect x="3" y="4" width="18" height="12" rx="2" />
        <path d="M2 19.5h20" />
      </svg>
    ),
    steps: ["설치 파일을 받아 응용 프로그램 폴더로 옮깁니다.", "백업할 폴더를 고릅니다.", "메뉴 막대 아이콘에서 진행 상황을 봅니다."],
    action: "Mac용 내려받기",
  },
  {
    id: "windows",
    label: "Windows",
    icon: (
      <svg viewBox="0 0 24 24" className={icon} {...line} aria-hidden>
        <path d="M3 5.5 10.5 4.5v7H3zM12.5 4.2 21 3v8.5h-8.5zM3 12.5h7.5v7L3 18.5zM12.5 12.5H21V21l-8.5-1.2z" />
      </svg>
    ),
    steps: ["설치 파일을 실행합니다.", "사진 폴더와 외장 드라이브를 고릅니다.", "작업 표시줄 아이콘으로 일시 정지할 수 있습니다."],
    action: "Windows용 내려받기",
  },
  {
    id: "web",
    label: "웹",
    icon: (
      <svg viewBox="0 0 24 24" className={icon} {...line} aria-hidden>
        <circle cx="12" cy="12" r="9" />
        <path d="M3 12h18M12 3c2.5 2.6 3.8 5.6 3.8 9s-1.3 6.4-3.8 9c-2.5-2.6-3.8-5.6-3.8-9S9.5 5.6 12 3Z" />
      </svg>
    ),
    steps: ["브라우저에서 snapvault.app에 로그인합니다.", "사진을 끌어다 놓으면 바로 올라갑니다.", "앨범 공유 링크를 만들 수 있습니다."],
    action: "웹에서 열기",
  },
];

export default function PlatformSetupTabs() {
  const [active, setActive] = useState(PLATFORMS[0].id);
  const current = PLATFORMS.find((p) => p.id === active) ?? PLATFORMS[0];

  return (
    <section className="w-full bg-[#0b0b0f] px-5 py-16 text-zinc-100 sm:px-8">
      <div className="mx-auto max-w-3xl">
        <h2 className="text-center text-2xl font-semibold tracking-tight sm:text-3xl">어디서든 같은 앨범으로</h2>
        <p className="mt-2 text-center text-sm text-zinc-400">쓰는 기기를 고르면 설치 방법을 알려 드려요.</p>

        <div role="tablist" aria-label="기기" className="mt-8 flex flex-wrap justify-center gap-2">
          {PLATFORMS.map((p) => {
            const selected = p.id === active;
            return (
              <button
                key={p.id}
                type="button"
                role="tab"
                id={`tab-${p.id}`}
                aria-selected={selected}
                aria-controls="platform-panel"
                onClick={() => setActive(p.id)}
                className={`flex h-[84px] w-[92px] flex-col items-center justify-center gap-2 rounded-xl border text-xs transition-colors ${
                  selected
                    ? "border-emerald-400/50 bg-emerald-400/10 text-zinc-100"
                    : "border-white/10 bg-white/[0.03] text-zinc-400 hover:border-white/20 hover:text-zinc-100"
                }`}
              >
                <span className={selected ? "text-emerald-300" : ""}>{p.icon}</span>
                {p.label}
              </button>
            );
          })}
        </div>

        <div
          role="tabpanel"
          id="platform-panel"
          aria-labelledby={`tab-${current.id}`}
          className="mx-auto mt-4 max-w-2xl rounded-2xl border border-white/10 bg-[#121218] p-5"
        >
          <h3 className="font-medium">{current.label}에서 시작하기</h3>
          <ol className="mt-3 list-decimal space-y-2 pl-5 text-sm text-zinc-400 marker:text-zinc-600">
            {current.steps.map((s) => (
              <li key={s}>{s}</li>
            ))}
          </ol>
          <a
            href="#"
            className="mt-4 inline-flex h-8 items-center rounded-lg border border-white/10 bg-white/[0.05] px-3 text-[13px] font-medium transition hover:border-white/20 hover:bg-white/[0.1]"
          >
            {current.action}
          </a>
        </div>
      </div>
    </section>
  );
}

적용 사이트 0

이 블록이 실제로 쓰인 사이트입니다.

로그인하고 내 사이트 추가

아직 등록된 사이트가 없습니다. 이 블록을 쓴 사이트가 있다면 알려 주세요.

로그인하고 재현 결과 올리기

재현 후기

v1 · 0개

아직 이 버전의 프롬프트로 직접 만들어 본 사람이 없습니다. 첫 번째로 재현해 보세요.