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
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證正在載入完整 README。 以下為已儲存的摘錄。
리프트바운드(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 기반檢視完整 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 |