Skip to content

Latest commit

Β 

History

History
174 lines (128 loc) Β· 4.29 KB

File metadata and controls

174 lines (128 loc) Β· 4.29 KB

κΈ°μ—¬ κ°€μ΄λ“œ

English | ν•œκ΅­μ–΄


SoundBadge에 관심을 κ°€μ Έμ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€! 버그 리포트, κΈ°λŠ₯ μ œμ•ˆ, μƒˆλ‘œμš΄ ν…Œλ§ˆ/ν…œν”Œλ¦Ώ μΆ”κ°€ λ“± μ–΄λ–€ ν˜•νƒœμ˜ κΈ°μ—¬λ“  ν™˜μ˜ν•©λ‹ˆλ‹€.

μ‹œμž‘ν•˜κΈ°

μš”κ΅¬ 사항

둜컬 ν™˜κ²½ μ„€μ •

# 1. Fork ν›„ 클둠
git clone https://github.com/<your-username>/SoundBadge.git
cd SoundBadge

# 2. μ˜μ‘΄μ„± μ„€μΉ˜
bun install

# 3. ν™˜κ²½ λ³€μˆ˜ μ„€μ •
cp .env.example .env.local
# .env.local에 YOUTUBE_API_KEY μž…λ ₯

# 4. 개발 μ„œλ²„ μ‹€ν–‰
bun dev

개발 λͺ…λ Ήμ–΄

bun dev            # 개발 μ„œλ²„ (Turbopack)
bun run build      # ν”„λ‘œλ•μ…˜ λΉŒλ“œ
bun run lint       # ESLint
bun run typecheck  # TypeScript νƒ€μž… 체크

PR μ›Œν¬ν”Œλ‘œμš°

  1. mainμ—μ„œ μƒˆ 브랜치 생성
    git checkout -b feat/my-feature
  2. 변경사항 μž‘μ„± 및 컀밋
  3. lint & νƒ€μž… 체크 톡과 확인
    bun run lint && bun run typecheck
  4. Push ν›„ PR 생성
    git push origin feat/my-feature

브랜치 넀이밍

접두사 μš©λ„
feat/ μƒˆ κΈ°λŠ₯
fix/ 버그 μˆ˜μ •
theme/ μƒˆ ν…Œλ§ˆ/ν…œν”Œλ¦Ώ
docs/ λ¬Έμ„œ μˆ˜μ •
refactor/ λ¦¬νŒ©ν† λ§

μƒˆ ν΄λž˜μ‹ ν…Œλ§ˆ μΆ”κ°€

ν΄λž˜μ‹ ν…Œλ§ˆλŠ” 썸넀일 + 제λͺ© + 채널 정보가 ν¬ν•¨λœ μΉ΄λ“œ μŠ€νƒ€μΌμž…λ‹ˆλ‹€.

1. ν…Œλ§ˆ 파일 생성

src/themes/presets/your-theme.ts:

import type { Theme } from "../types";

export const yourTheme: Theme = {
  name: "your-theme",   // ThemeName νƒ€μž…μ— μΆ”κ°€ ν•„μš”
  label: "Your Theme",
  tokens: {
    bg: "#ffffff",       // λ°°κ²½ (단색 λ˜λŠ” CSS κ·ΈλΌλ°μ΄μ…˜)
    fg: "#1a1a1a",       // 메인 ν…μŠ€νŠΈ
    muted: "#6b7280",    // μ„œλΈŒ ν…μŠ€νŠΈ
    accent: "#3b82f6",   // 포인트 색상
    border: "#e5e7eb",   // ν…Œλ‘λ¦¬ ("none" κ°€λŠ₯)
    shadow: "none",      // 그림자 (CSS box-shadow λ˜λŠ” "none")
    radius: 12,          // μΉ΄λ“œ λΌμš΄λ“œ (px)
    pattern: "none",     // λ°°κ²½ νŒ¨ν„΄: "none" | "noise" | "grid" | "dots"
  },
};

2. νƒ€μž… 등둝

src/themes/types.ts의 ThemeName μœ λ‹ˆμ˜¨μ— μΆ”κ°€:

export type ThemeName =
  | "minimal"
  // ...
  | "your-theme";

3. λ ˆμ§€μŠ€νŠΈλ¦¬ 등둝

src/themes/index.tsμ—μ„œ import ν›„ 등둝.

μƒˆ ν…œν”Œλ¦Ώ μΆ”κ°€

ν…œν”Œλ¦Ώμ€ ν΄λž˜μ‹ ν…Œλ§ˆλ³΄λ‹€ 자유둜운 SVG λ ˆμ΄μ•„μ›ƒμž…λ‹ˆλ‹€ (badge, stream, terminal λ“±).

1. ν…œν”Œλ¦Ώ 파일 생성

src/templates/your-template.ts:

import type { Template, TemplateRenderOptions } from "./types";
import { truncate, esc } from "./utils";

export const yourTemplate: Template = {
  meta: {
    id: "your-template",
    displayName: "Your Template",
    description: "ν…œν”Œλ¦Ώ μ„€λͺ…",
    category: "simple",           // "simple" | "player" | "visual" | "developer"
    supportsLayout: false,
    supportsMultiTrack: false,
    maxTracks: 1,
    variants: [],                 // 색상 λ³€ν˜•μ΄ 있으면 μΆ”κ°€
    previewDimensions: { width: 480, height: 180 },
  },

  render(options: TemplateRenderOptions): string {
    const { track, tracks, variant } = options;

    return `<svg xmlns="http://www.w3.org/2000/svg" width="480" height="180" viewBox="0 0 480 180">
      <!-- 여기에 SVG λ Œλ”λ§ 둜직 -->
    </svg>`;
  },
};

2. λ ˆμ§€μŠ€νŠΈλ¦¬ 등둝

src/templates/index.tsμ—μ„œ import ν›„ 등둝.

μœ ν‹Έλ¦¬ν‹° ν•¨μˆ˜

src/templates/utils.tsμ—μ„œ 제곡:

  • truncate(text, maxLen) β€” ν…μŠ€νŠΈ 자λ₯΄κΈ° (λ§μ€„μž„ν‘œ 포함)
  • esc(text) β€” SVG/XML μ΄μŠ€μΌ€μ΄ν”„
  • fetchImageAsBase64(url) β€” 이미지λ₯Ό base64둜 λ³€ν™˜

μ½”λ“œ μ»¨λ²€μ…˜

  • μ»΄ν¬λ„ŒνŠΈ: PascalCase (CardPreview.tsx)
  • μœ ν‹Έ/ν•¨μˆ˜: camelCase (parseYouTubeUrl)
  • 파일λͺ…: kebab-case (card-renderer.ts)
  • 경둜 alias: @/* β†’ src/*
  • API Route: Edge Runtime μ‚¬μš©

이슈 & 버그 리포트

이슈 생성 μ‹œ μ œκ³΅λ˜λŠ” 이슈 ν…œν”Œλ¦Ώμ„ μ‚¬μš©ν•΄μ£Όμ„Έμš”. 포함할 λ‚΄μš©:

  • μž¬ν˜„ 단계
  • κΈ°λŒ€ λ™μž‘ vs μ‹€μ œ λ™μž‘
  • μ‚¬μš©ν•œ ν…Œλ§ˆ/ν…œν”Œλ¦Ώ/νŒŒλΌλ―Έν„°
  • μŠ€ν¬λ¦°μƒ· (κ°€λŠ₯ν•˜λ©΄)