Underground 2 Revived
Play Need for Speed: Underground 2 (2004) in Chrome and Firefox with WebGPU graphics, Web Audio, up to 120 fps widescreen, controller support, free roam and Online races with friends. Fan project, not
리프트바운드(Riftbound) TCG 정보 허브 — 덱 티어리스트 · 카드 DB · 덱 시뮬레이터 · 시세 · 매장 대회 · 커뮤니티
Translation pending
GamesTypeScript · HTMLGitHub @shsshs010607-delOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
리프트바운드(Riftbound) TCG 정보 허브 — 티어리스트 · 카드 DB · 덱 시뮬레이터 · 시세 · 커뮤니티. (riba.gg) • Framework: Next.js 14 (App Router) + TypeScript • Styling: Tailwind CSS — "Tactile Neo-Arcade" 디자인 시스템 (DESIGN.md) • BaaS: Supabase (Postgres + Auth + Storage), Row Level Security 기반Read the full README ↗
리프트바운드(Riftbound) TCG 정보 허브 — 티어리스트 · 카드 DB · 덱 시뮬레이터 · 시세 · 커뮤니티. (riba.gg)
DESIGN.md)rift-report/
├── src/
│ ├── app/ # App Router
│ │ ├── layout.tsx # 루트 레이아웃 (폰트, Navbar, Footer)
│ │ ├── globals.css # 디자인 토큰(CSS 변수) + 컴포넌트 클래스
│ │ ├── page.tsx # ★ 메인 대시보드
│ │ ├── not-found.tsx
│ │ │
│ │ ├── reports/ # 리포트(뉴스·분석)
│ │ │ ├── page.tsx # 목록
│ │ │ └── [slug]/page.tsx # 상세
│ │ │
│ │ ├── tiers/ # 덱 티어리스트
│ │ │ ├── page.tsx # S/A/B/C 티어 보드
│ │ │ └── [slug]/page.tsx # 덱 상세 + 덱리스트
│ │ │
│ │ ├── cards/ # 카드 DB
│ │ │ ├── page.tsx # 검색 + 필터 + 그리드
│ │ │ └── [id]/page.tsx # 카드 상세 (모달은 인터셉트 라우트로 확장)
│ │ │
│ │ ├── rules/ # 룰 & 용어
│ │ │ └── page.tsx # 초보자 가이드 + 용어 검색
│ │ │
│ │ ├── community/ # 커뮤니티 게시판
│ │ │ ├── page.tsx # 카테고리 허브
│ │ │ ├── [category]/page.tsx # 자유 / 공략·팁 / 덱 분석 목록
│ │ │ ├── post/[id]/page.tsx # 게시글 + 댓글
│ │ │ └── new/page.tsx # 글쓰기 (로그인 가드)
│ │ │
│ │ ├── trading/ # 카드 거래 게시판
│ │ │ ├── page.tsx # 팝니다/삽니다/교환 목록
│ │ │ ├── [id]/page.tsx # 거래글 상세
│ │ │ └── new/page.tsx # 거래글 등록 (로그인 가드)
│ │ │
│ │ ├── tournaments/ # 대회 정보
│ │ │ ├── page.tsx # 상태별 카드 뷰
│ │ │ └── [slug]/page.tsx # 대회 상세
│ │ │
│ │ ├── login/page.tsx # 매직 링크 + OAuth
│ │ ├── auth/callback/route.ts # 세션 교환 (오픈 리다이렉트 차단)
│ │ └── me/page.tsx # 내 프로필 (로그인 가드)
│ │
│ ├── components/
│ │ ├── layout/ # navbar, footer
│ │ ├── home/ # 대시보드 섹션 (report-highlights, tier-summary, ...)
│ │ ├── auth/ # login-form, sign-out-button
│ │ └── ui/ # section-header, tier-badge, page-heading (공용 프리미티브)
│ │
│ └── lib/
│ ├── constants.ts # 네비, 카테고리, 티어 스타일, 카드 도메인/타입/레어도
│ ├── utils.ts # cn(), formatKRW()
│ ├── queries.ts # 홈 대시보드용 서버 읽기 쿼리 (server-only)
│ ├── supabase/
│ │ ├── client.ts # 브라우저 클라이언트
│ │ ├── server.ts # 서버 컴포넌트/액션 클라이언트
│ │ └── middleware.ts # 세션 쿠키 갱신
│ └── types/database.ts # 스키마 타입 (supabase gen types 로 대체 가능)
│
├── middleware.ts # updateSession 연결
├── supabase/
│ ├── schema.sql # 테이블 · 인덱스 · 트리거 · ENUM
│ ├── policies.sql # RLS 정책 + Storage 정책 가이드
│ └── seed.sql # 개발용 시드
├── tailwind.config.ts # 디자인 토큰 → Tailwind 매핑
├── .env.local.example
└── DESIGN.md # 디자인 시스템 스펙
확장 포인트
- 카드 상세 모달:
app/cards/@modal/(.)[id]/page.tsx인터셉트 라우트- 관리자:
app/(admin)/라우트 그룹 +is_staff()가드- i18n:
next-intl도입 시app/[locale]/로 이동
npm install
cp .env.local.example .env.local # Supabase 키 입력
Project Settings > API 에서 URL / anon key 복사SQL Editor 에서 순서대로 실행: supabase/schema.sql → supabase/policies.sql (→ 선택: seed.sql)Authentication > Providers 에서 Email(매직 링크) 활성화, 필요 시 Google OAuth 설정Authentication > URL Configuration 의 Redirect URLs 에 http://localhost:3000/auth/callback 추가Storage 에서 버킷 생성: avatars, trade-images, report-covers, card-images (모두 public read) — 업로드 정책은 policies.sql 하단 참고npm run dev # http://localhost:3000
npm run typecheck # 타입 점검
DB 미연결 상태에서도 홈은 빈 상태(Empty State)로 정상 렌더된다 (lib/queries.ts 의 safe() 폴백).
전체 DDL은 supabase/schema.sql, 권한은 supabase/policies.sql.
| 테이블 | 용도 | 주요 컬럼 | 쓰기 권한 (RLS) |
|---|---|---|---|
profiles | auth.users 1:1 확장 | username, avatar_url, role(user|editor|admin) | 본인만 update, 가입 시 트리거로 자동 생성 |
reports | 뉴스·분석 글 | slug, title, body, status(draft|published), tag, view_count | editor·admin |
cards | 카드 DB | code, name, domains[], type, cost, might, rarity, search_tsv | editor·admin |
decks | 티어리스트 덱 | slug, tier(S|A|B|C), tier_rank, archetype, champion_card_ids[], guide | editor·admin |
deck_cards | 덱 ↔ 카드 (수량) | (deck_id, card_id, board) PK, quantity, board(main|rune|sideboard) | editor·admin |
glossary_terms | 룰 & 용어 | term, reading, category, definition, related_terms[], search_tsv | editor·admin |
posts | 커뮤니티 게시글 | category(free|guide|deck-analysis), title, body, author_id, deck_id?, view/like/comment_count | 작성: 로그인, 수정·삭제: 본인 or staff |
comments | 댓글 (대댓글) | post_id, parent_id?, body, author_id | 작성: 로그인, 수정·삭제: 본인 |
post_likes | 좋아요 | (post_id, user_id) PK | 본인만 |
trade_listings | 카드 거래 | , , , , , , , |
auth.users ─1:1─ profiles ─1:N─ posts ─1:N─ comments
│ └─1:N─ post_likes
├─1:N─ trade_listings ─N:1─ cards
└─1:N─ reports (author)
decks ─N:M─ cards (deck_cards 조인 테이블: quantity, board)
decks.champion_card_ids[] → cards.id (대표 챔피언 아이콘, 배열 참조)
posts.deck_id (nullable) → decks.id ('덱 분석' 카테고리)
comments insert/delete → posts.comment_countpost_likes insert/delete → posts.like_countupdated_at 은 모든 갱신 대상 테이블에 set_updated_at() 트리거increment_view_count('reports'|'posts', id) RPC 로 원자적 증가tsvector 생성 컬럼 + GIN 인덱스 (to_tsvector), 부분 일치는 pg_trgm(type, cost, rarity) 복합 인덱스 + domains GINservice_role 키는 .env.local 서버 전용, 시드/관리 스크립트에서만.is_staff() (security definer) 한 곳에서.next 파라미터를 내부 절대경로로만 제한 (오픈 리다이렉트 차단).getUser() 로 1차 가드 후, 최종 방어선은 RLS.CHECK 제약으로 강제.trade-images/{uid}/... 처럼 본인 폴더 경로만 허용.category(sell|buy|trade)card_id?card_conditionprice?status(open|reserved|closed)regionimages[]seller_id| 작성: 로그인, 수정·삭제: 본인 |
tournaments | 대회 | slug, name, status(upcoming|ongoing|finished), starts_at, format, location, is_online, registration_url, prize_pool | editor·admin |