diff --git a/frontend/docs/brand-guide.md b/frontend/docs/brand-guide.md new file mode 100644 index 0000000..77fdd8f --- /dev/null +++ b/frontend/docs/brand-guide.md @@ -0,0 +1,341 @@ +# Tasteby Brand & Design Guide + +> Tasteby의 브랜드 아이덴티티, 디자인 시스템, 아이콘 정책을 정의하는 가이드 문서. +> 최종 수정: 2026-03-14 + +--- + +## 1. 브랜드 개요 + +### 1.1 서비스 정의 +**Tasteby**는 유튜브 맛집 영상에서 레스토랑 정보를 추출하여 지도 위에 큐레이션하는 서비스. +"유튜버의 입맛으로(Taste by)" 찾는 맛집이라는 의미를 담고 있다. + +### 1.2 브랜드 키워드 +- **미식 큐레이션** — 단순 검색이 아닌, 유튜버가 직접 방문한 맛집을 큐레이팅 +- **신뢰** — 실제 영상 기반, 출처가 명확한 정보 +- **따뜻함** — 음식과 사람을 연결하는 따뜻한 경험 +- **프리미엄 캐주얼** — 고급스럽지만 접근하기 쉬운 톤 + +### 1.3 브랜드 보이스 +| Do | Don't | +|----|-------| +| 친근하고 자연스러운 한국어 | 과도한 존댓말·마케팅 투 | +| 간결하고 핵심적인 정보 전달 | 불필요한 수식어 남발 | +| 음식에 대한 애정이 묻어나는 톤 | 딱딱한 기술 용어 노출 | + +--- + +## 2. 로고 + +### 2.1 로고 구성 +Tasteby 로고는 **워드마크(Wordmark)** 형태로, 글자 "e" 안에 **위치 핀 마커**와 **스마일 곡선**이 결합되어 있다. + +- 핀 마커 = 지도 기반 서비스 +- 스마일 = 맛있는 음식의 만족감 +- 색상: 본문 다크 그레이(`#3C3C3C`) + 핀/스마일 레드(`#E8534A`) + +### 2.2 로고 파일 +| 파일 | 용도 | +|------|------| +| `logo.png` | 원본 (고해상도) | +| `logo-200h.png` | 히어로/소개 영역 | +| `logo-120h.png` | 헤더/네비게이션 | +| `logo-80h.png` | 파비콘/소형 UI | +| `logo-dark.png` | 다크 배경용 (현재 미사용) | +| `logo-dark-120h.png` | 다크 배경 헤더용 (현재 미사용) | +| `logo-dark-80h.png` | 다크 배경 소형 (현재 미사용) | + +### 2.3 로고 사용 규칙 +- 최소 여백: 로고 높이의 50% 이상 +- 배경: 크림 화이트(`#FFFAF5`) 또는 순백(`#FFFFFF`) 위에 사용 +- 변형 금지: 회전, 기울임, 색상 임의 변경 불가 +- 현재 라이트 모드 전용 — 다크 모드 미지원 + +--- + +## 3. 컬러 시스템 + +### 3.1 디자인 테마: Saffron (사프란) +따뜻한 금빛 오렌지 톤. 고급스러운 미식 큐레이션 느낌을 전달한다. + +### 3.2 브랜드 팔레트 +CSS 변수로 `globals.css`의 `@theme inline`에 등록되어 있다. + +| 토큰 | Hex | 용도 | +|------|-----|------| +| `brand-50` | `#FFF8F0` | 선택 상태 배경, 카드 hover | +| `brand-100` | `#FFEDD5` | 연한 배경, 뱃지 배경 | +| `brand-200` | `#FFD6A5` | 보조 배경 | +| `brand-300` | `#FFBC72` | 호버 보더, 보조 강조 | +| `brand-400` | `#F5A623` | 스피너, 중간 강조 | +| `brand-500` | `#F59E3F` | Primary 라이트 | +| `brand-600` | `#E8720C` | **Primary** — 아이콘, 버튼, 핵심 강조색 | +| `brand-700` | `#C45A00` | Primary 다크 — 텍스트 강조 | +| `brand-800` | `#9A4500` | 진한 강조 | +| `brand-900` | `#6B3000` | 다크 상태 | +| `brand-950` | `#3D1A00` | 최진한 강조 | + +### 3.3 시맨틱 토큰 +| 토큰 | Hex | 용도 | +|------|-----|------| +| `background` | `#FFFAF5` | 페이지 배경 (크림 화이트) | +| `foreground` | `#171717` | 본문 텍스트 | +| `surface` | `#FFFFFF` | 카드/패널 배경 | + +### 3.4 컬러 사용 원칙 +- 인터랙티브/강조 요소에는 반드시 `brand-*` 토큰 사용 (`orange-*` 금지) +- Tailwind 기본 `gray` 팔레트는 변경하지 않음 (다크 모드 호환 문제) +- 라이트 모드 전용 (`color-scheme: only light`) +- 다크 모드 CSS는 코멘트 처리하여 보존 중 (향후 지원 가능성) + +--- + +## 4. 타이포그래피 + +### 4.1 서체 스택 +``` +Pretendard Variable → Geist → system-ui → sans-serif +``` + +| 서체 | 역할 | 로딩 방식 | +|------|------|----------| +| **Pretendard Variable** | 1순위 본문 서체 | 로컬 woff2 (`src/fonts/`) | +| **Geist** | 폴백 서체 | Google Fonts (`next/font/google`) | + +### 4.2 선택 이유 +- **Pretendard**: 한국어 가독성 최적화, 다양한 웨이트 지원, 깔끔하고 현대적 +- **Geist**: 영문/숫자 렌더링 우수, Next.js 기본 서체로 호환성 확보 + +### 4.3 사용 원칙 +- 웨이트: Regular(400), Medium(500), SemiBold(600), Bold(700) 주로 사용 +- 한글 최소 본문 크기: 14px (가독성 확보) +- 레이블/캡션: 12px까지 허용 +- HTML lang: `ko` (한국어 기본) + +--- + +## 5. 아이콘 시스템 + +Tasteby는 **3개의 아이콘 레이어**를 사용한다. + +### 5.1 Material Symbols Rounded — UI 아이콘 +**용도**: 범용 UI (검색, 재생, 네비게이션, 상태 표시 등) + +| 항목 | 값 | +|------|-----| +| 폰트 | Material Symbols Rounded (Google Fonts) | +| 기본 설정 | FILL 0, wght 400, GRAD 0, opsz 24 | +| 컴포넌트 | `` | +| 파일 | `src/components/Icon.tsx` | + +**사용 위치**: +- RestaurantList 음식 카테고리 아이콘 +- MapView 마커/InfoWindow 카테고리 아이콘 +- SearchBar, 네비게이션, 재생 버튼 등 모든 UI 아이콘 +- RestaurantDetail 상세 정보 아이콘 + +**주요 아이콘 매핑** (`getCuisineIcon()`): +- 한식 → `rice_bowl`, 일식 → `set_meal`, 중식 → `skillet` +- 양식 → `dinner_dining`, 아시아 → `restaurant`, 기타 → `flatware` +- 소분류별 세부 매핑 (67개 규칙) — `cuisine-icons.ts` 참조 + +**스타일 규칙**: +- 아이콘 크기와 `width`/`height`를 동일하게 설정하여 종횡비 고정 +- `overflow: hidden`으로 비정형 아이콘(예: sake) 크기 넘침 방지 + +### 5.2 Phosphor Icons — 장르 카드 픽토그램 +**용도**: 홈 탭 장르 필터 카드의 카테고리 아이콘 + +| 항목 | 값 | +|------|-----| +| 패키지 | `@phosphor-icons/react` (^2.1.10) | +| 라이선스 | MIT | +| 스타일 | Regular (outline) 기본 | +| 파일 | `src/lib/cuisine-icons.ts` → `getPhosphorCuisineIcon()` | + +**Phosphor 아이콘 매핑**: + +| 카테고리 | 아이콘 | Phosphor 컴포넌트명 | +|----------|--------|---------------------| +| 한식 | 밥그릇 | `BowlFood` | +| 일식 | 물고기 | `FishSimple` | +| 중식 | 불꽃 | `Fire` | +| 양식 | 피자 | `Pizza` | +| 아시아 | 김 나는 그릇 | `BowlSteam` | +| 기타 | 쿠키 | `Cookie` | + +**소분류 Phosphor 매핑** (주요 항목): +| 소분류 | 아이콘 | 비고 | +|--------|--------|------| +| 국밥/해장국 | `BowlSteam` | | +| 소고기/한우구이 | `Cow` | | +| 곱창/막창 | `Flame` | | +| 닭/오리구이 | `Bird` | | +| 회/횟집 | `Fish` | | +| 해산물 | `Shrimp` | | +| 주점/포차 | `BeerStein` | | +| 이자카야 | `Martini` | 술잔 모양 | +| 파인다이닝/코스 | `Champagne` | | +| 스시/오마카세 | `Fish` | | +| 스테이크 | `Knife` | | +| 햄버거 | `Hamburger` | | +| 피자 | `Pizza` | | +| 프렌치 | `Champagne` | | +| 마라/훠궈 | `Pepper` | | +| 딤섬/만두 | `Egg` | | +| 비건/샐러드 | `Leaf` | | +| 카페/디저트 | `Coffee` | | +| 베이커리 | `Bread` | | + +### 5.3 Custom SVG Food Icons — 커스텀 음식 픽토그램 +**용도**: Phosphor에 적합한 아이콘이 없는 특수 음식 카테고리 + +| 항목 | 값 | +|------|-----| +| 컴포넌트 | `` | +| 파일 | `src/components/FoodIcon.tsx` | +| 접두어 | `food:` (예: `food:noodle`) | +| 렌더링 | SVG inline, `fill` 또는 `stroke` 모드 | + +**등록된 커스텀 아이콘**: + +| 이름 | 대상 소분류 | viewBox | 렌더링 모드 | 출처 | +|------|------------|---------|------------|------| +| `jjigae` | 찌개/전골/탕 | 0 0 24 24 | stroke | 자체 제작 (뚝배기+김) | +| `tteok` | 분식 | 0 0 24 24 | stroke | 자체 제작 (가래떡) | +| `noodle` | 면, 라멘, 소바/우동, 베트남 | 0 0 363.674 363.674 | fill | 외부 SVG (그릇+면+젓가락) | +| `tempura` | 텐동/튀김 | 0 0 64 64 | fill | Flaticon (텐푸라) | +| `pig` | 삼겹살/돼지구이, 족발/보쌈, 돈카츠 | 0 0 90 90 | fill | 외부 SVG (돼지 전신) | + +### 5.4 아이콘 선택 기준 + +``` +1단계: Phosphor Icons에 적합한 아이콘이 있는가? + → 있으면 Phosphor 사용 + +2단계: 없으면 커스텀 SVG(FoodIcon)로 제작/수급 + → food: 접두어로 매핑 + +3단계: UI 범용 아이콘은 Material Symbols + → 검색, 네비, 상태 표시 등 +``` + +### 5.5 아이콘 제작/추가 가이드 + +**커스텀 SVG 추가 시:** +1. `FoodIcon.tsx`의 `FOOD_ICONS` Record에 `IconDef` 추가 +2. `viewBox`는 원본 SVG에 맞게 설정 (24×24가 아닐 수 있음) +3. `fill: true`면 fill 모드, 생략/false면 stroke 모드 +4. `cuisine-icons.ts`의 `PHOSPHOR_SUB_RULES`에서 `food:이름`으로 매핑 +5. SVG 경로는 JSX로 변환 (`clip-rule` → `clipRule` 등) + +**라이선스 확인:** +- Phosphor Icons: MIT ✅ +- Material Symbols: Apache 2.0 ✅ +- 외부 SVG: 출처별 라이선스 확인 필수 (Flaticon은 Attribution 필요할 수 있음) + +--- + +## 6. 레이아웃 & 컴포넌트 스타일 + +### 6.1 홈 탭 구성 +``` +┌─────────────────────────────────────┐ +│ [로고] [검색] [유튜버▼] │ ← 헤더 +├─────────────────────────────────────┤ +│ [한식][일식][중식][양식]... →scroll │ ← 장르 카드 (가로 스크롤+드래그) +│ [가격▼][지역▼][내위치][N개 결과] │ ← 필터 바 (flex-wrap) +├─────────────────────────────────────┤ +│ 지도 / 리스트 / 근처 탭 │ ← 메인 콘텐츠 +└─────────────────────────────────────┘ +``` + +### 6.2 장르 카드 스타일 +- 칩(chip) 형태, 가로 스크롤 + 마우스 드래그 지원 (`useDragScroll`) +- 아이콘(22px) + 텍스트 라벨 +- 선택 시: `bg-brand-50 border-brand-300 text-brand-700` +- 비선택 시: `bg-white border-gray-200 text-gray-600` +- 아이콘 색상: 선택 시 `brand-600`, 비선택 시 `gray-400` + +### 6.3 카드/서피스 +- 배경: `surface` (#FFFFFF) +- 보더: `border-gray-200` (1px) +- 라운딩: `rounded-lg` (8px) 기본 +- 그림자: 최소한 사용 (flat 디자인 지향) + +### 6.4 버튼/인터랙티브 +- Primary: `bg-brand-600 text-white hover:bg-brand-700` +- Secondary: `bg-brand-50 text-brand-700 border-brand-300` +- 포커스 링: `ring-brand-400` + +--- + +## 7. 지도 마커 스타일 + +### 7.1 마커 디자인 +텍스트 라벨 마커 (핀이 아닌 말풍선 형태): +- 배경: 흰색 (폐업 시 회색) +- 보더: 카테고리별 색상 +- 텍스트: 레스토랑 이름 + 카테고리 아이콘 (Material Symbols) +- 하단 꼬리(arrow): 삼각형 +- 선택 시: 파란색(`#1d4ed8`) 보더+꼬리 + +### 7.2 마커 카테고리 색상 +| 카테고리 | 보더 | 배경 | 화살표 | +|----------|------|------|--------| +| 한식 | `#E8720C` | `#FFF8F0` | `#E8720C` | +| 일식 | `#D94F5A` | `#FFF5F5` | `#D94F5A` | +| 기타 | 기본 그레이 | 기본 화이트 | 기본 그레이 | + +### 7.3 클러스터링 +- 라이브러리: supercluster +- 클러스터 마커: 원형 + 개수 텍스트 + +--- + +## 8. 향후 방향 + +### 8.1 다크 모드 +- 현재 라이트 모드 전용 +- 다크 모드 CSS 토큰은 정의되어 있으나 비활성 상태 +- 다크 배경 로고 에셋 준비 완료 (`logo-dark-*.png`) +- 활성화 시 Tailwind 기본 gray 팔레트 유지 (커스텀 gray 금지) + +### 8.2 아이콘 정리 +- `@tabler/icons-react` 의존성 제거 가능 (현재 미사용) +- 커스텀 SVG 아이콘 추가 확장 가능 (소고기/해산물 등) +- Flaticon 에셋 사용 시 Attribution 라이선스 확인 필요 + +### 8.3 디자인 토큰 확장 +- 현재: 색상 + 폰트 토큰만 정의 +- 향후: spacing, radius, shadow, motion 토큰 추가 가능 +- Tailwind v4 `@theme` 기반으로 확장 + +--- + +## 부록: 파일 구조 + +``` +frontend/ +├── docs/ +│ ├── brand-guide.md ← 이 문서 +│ └── design-concepts.md ← 초기 컨셉 후보안 +├── public/ +│ ├── logo.png ← 로고 에셋들 +│ ├── logo-{80h,120h,200h}.png +│ ├── logo-dark.png +│ └── logo-dark-{80h,120h}.png +├── src/ +│ ├── app/ +│ │ ├── globals.css ← 디자인 토큰 (@theme inline) +│ │ ├── layout.tsx ← 폰트, 메타 설정 +│ │ └── page.tsx ← 홈 탭 (장르 카드 렌더링) +│ ├── components/ +│ │ ├── Icon.tsx ← Material Symbols 래퍼 +│ │ └── FoodIcon.tsx ← 커스텀 SVG 아이콘 +│ ├── fonts/ +│ │ └── PretendardVariable.woff2 +│ └── lib/ +│ └── cuisine-icons.ts ← 아이콘 매핑 (Material + Phosphor + Food) +``` diff --git a/frontend/src/components/FoodIcon.tsx b/frontend/src/components/FoodIcon.tsx new file mode 100644 index 0000000..b64aebb --- /dev/null +++ b/frontend/src/components/FoodIcon.tsx @@ -0,0 +1,93 @@ +"use client"; + +interface FoodIconProps { + name: string; + size?: number; + className?: string; +} + +interface IconDef { + viewBox: string; + fill?: boolean; // true = fill icon (no stroke), false = stroke icon (default) + paths: React.ReactNode; +} + +const FOOD_ICONS: Record = { + // 찌개/전골/탕: 뚝배기 + 김 + "jjigae": { + viewBox: "0 0 24 24", + paths: ( + <> + + + + + + ), + }, + // 분식: 가래떡 1개 사선 + "tteok": { + viewBox: "0 0 24 24", + paths: ( + + ), + }, + // 면: 그릇에 면+젓가락 (noodles-in-a-bowl) + "noodle": { + viewBox: "0 0 363.674 363.674", + fill: true, + paths: ( + <> + + + + ), + }, + // 텐동/튀김: 텐푸라 (flaticon tempura) + "tempura": { + viewBox: "0 0 64 64", + fill: true, + paths: ( + <> + + + + + + + + + ), + }, + // 돼지 (삼겹살/돼지구이, 족발/보쌈, 돈카츠) + "pig": { + viewBox: "0 0 90 90", + fill: true, + paths: ( + <> + + + + ), + }, +}; + +export default function FoodIcon({ name, size = 24, className = "" }: FoodIconProps) { + const icon = FOOD_ICONS[name]; + if (!icon) return null; + + return ( + + {icon.paths} + + ); +} diff --git a/frontend/src/components/Icon.tsx b/frontend/src/components/Icon.tsx index 6edef0d..b38d101 100644 --- a/frontend/src/components/Icon.tsx +++ b/frontend/src/components/Icon.tsx @@ -15,7 +15,7 @@ export default function Icon({ name, size = 20, filled, className = "" }: IconPr return ( {name} diff --git a/frontend/src/lib/cuisine-icons.ts b/frontend/src/lib/cuisine-icons.ts index 791bcc2..528f5df 100644 --- a/frontend/src/lib/cuisine-icons.ts +++ b/frontend/src/lib/cuisine-icons.ts @@ -39,7 +39,7 @@ const SUB_ICON_RULES: { keyword: string; icon: string }[] = [ { keyword: "라멘", icon: "ramen_dining" }, { keyword: "돈카츠", icon: "lunch_dining" }, { keyword: "텐동/튀김", icon: "tapas" }, - { keyword: "이자카야", icon: "sake" }, + { keyword: "이자카야", icon: "local_bar" }, { keyword: "야키니쿠", icon: "kebab_dining" }, { keyword: "카레", icon: "skillet" }, { keyword: "소바/우동", icon: "ramen_dining" }, @@ -77,78 +77,78 @@ export function getCuisineIcon(cuisineType: string | null | undefined): string { return CUISINE_ICON_MAP[main] || DEFAULT_ICON; } -// ── Tabler Icons (for genre card chips) ── -// Returns Tabler icon component name (PascalCase without "Icon" prefix) +// ── Phosphor Icons (for genre card chips) ── +// Returns Phosphor icon component name (PascalCase) -const TABLER_CUISINE_MAP: Record = { - "한식": "BowlChopsticks", - "일식": "Fish", - "중식": "Soup", +const PHOSPHOR_CUISINE_MAP: Record = { + "한식": "BowlFood", + "일식": "FishSimple", + "중식": "Fire", "양식": "Pizza", - "아시아": "BowlSpoon", + "아시아": "BowlSteam", "기타": "Cookie", }; -const TABLER_SUB_RULES: { keyword: string; icon: string }[] = [ +const PHOSPHOR_SUB_RULES: { keyword: string; icon: string }[] = [ // 한식 - { keyword: "백반/한정식", icon: "BowlChopsticks" }, - { keyword: "국밥/해장국", icon: "Soup" }, - { keyword: "찌개/전골/탕", icon: "Cooker" }, - { keyword: "삼겹살/돼지구이", icon: "Meat" }, - { keyword: "소고기/한우구이", icon: "Grill" }, - { keyword: "곱창/막창", icon: "GrillFork" }, - { keyword: "닭/오리구이", icon: "Meat" }, - { keyword: "족발/보쌈", icon: "Meat" }, + { keyword: "백반/한정식", icon: "BowlFood" }, + { keyword: "국밥/해장국", icon: "BowlSteam" }, + { keyword: "찌개/전골/탕", icon: "CookingPot" }, + { keyword: "삼겹살/돼지구이", icon: "food:pig" }, + { keyword: "소고기/한우구이", icon: "Cow" }, + { keyword: "곱창/막창", icon: "Flame" }, + { keyword: "닭/오리구이", icon: "Bird" }, + { keyword: "족발/보쌈", icon: "food:pig" }, { keyword: "회/횟집", icon: "Fish" }, - { keyword: "해산물", icon: "Fish" }, - { keyword: "분식", icon: "EggFried" }, - { keyword: "면", icon: "BowlChopsticks" }, - { keyword: "죽/죽집", icon: "BowlSpoon" }, - { keyword: "순대/순대국", icon: "Soup" }, - { keyword: "장어/민물", icon: "Fish" }, - { keyword: "주점/포차", icon: "Beer" }, - { keyword: "파인다이닝/코스", icon: "GlassChampagne" }, + { keyword: "해산물", icon: "Shrimp" }, + { keyword: "분식", icon: "food:tteok" }, + { keyword: "면", icon: "food:noodle" }, + { keyword: "죽/죽집", icon: "BowlFood" }, + { keyword: "순대/순대국", icon: "BowlSteam" }, + { keyword: "장어/민물", icon: "FishSimple" }, + { keyword: "주점/포차", icon: "BeerStein" }, + { keyword: "파인다이닝/코스", icon: "Champagne" }, // 일식 { keyword: "스시/오마카세", icon: "Fish" }, - { keyword: "라멘", icon: "Soup" }, - { keyword: "돈카츠", icon: "Meat" }, - { keyword: "텐동/튀김", icon: "EggFried" }, - { keyword: "이자카야", icon: "GlassCocktail" }, - { keyword: "야키니쿠", icon: "Grill" }, - { keyword: "카레", icon: "BowlSpoon" }, - { keyword: "소바/우동", icon: "BowlChopsticks" }, + { keyword: "라멘", icon: "food:noodle" }, + { keyword: "돈카츠", icon: "food:pig" }, + { keyword: "텐동/튀김", icon: "food:tempura" }, + { keyword: "이자카야", icon: "Martini" }, + { keyword: "야키니쿠", icon: "Flame" }, + { keyword: "카레", icon: "BowlFood" }, + { keyword: "소바/우동", icon: "food:noodle" }, // 중식 - { keyword: "중화요리", icon: "Soup" }, + { keyword: "중화요리", icon: "Fire" }, { keyword: "마라/훠궈", icon: "Pepper" }, { keyword: "딤섬/만두", icon: "Egg" }, - { keyword: "양꼬치", icon: "Grill" }, + { keyword: "양꼬치", icon: "Flame" }, // 양식 - { keyword: "파스타/이탈리안", icon: "BowlSpoon" }, - { keyword: "스테이크", icon: "Meat" }, - { keyword: "햄버거", icon: "Burger" }, + { keyword: "파스타/이탈리안", icon: "ForkKnife" }, + { keyword: "스테이크", icon: "Knife" }, + { keyword: "햄버거", icon: "Hamburger" }, { keyword: "피자", icon: "Pizza" }, - { keyword: "프렌치", icon: "GlassChampagne" }, - { keyword: "바베큐", icon: "GrillSpatula" }, - { keyword: "브런치", icon: "EggFried" }, - { keyword: "비건/샐러드", icon: "Salad" }, + { keyword: "프렌치", icon: "Champagne" }, + { keyword: "바베큐", icon: "Flame" }, + { keyword: "브런치", icon: "Coffee" }, + { keyword: "비건/샐러드", icon: "Leaf" }, // 아시아 - { keyword: "베트남", icon: "BowlChopsticks" }, + { keyword: "베트남", icon: "food:noodle" }, { keyword: "태국", icon: "Pepper" }, - { keyword: "인도/중동", icon: "BowlSpoon" }, - { keyword: "동남아기타", icon: "BowlSpoon" }, + { keyword: "인도/중동", icon: "BowlFood" }, + { keyword: "동남아기타", icon: "BowlFood" }, // 기타 - { keyword: "치킨", icon: "Meat" }, + { keyword: "치킨", icon: "Egg" }, { keyword: "카페/디저트", icon: "Coffee" }, { keyword: "베이커리", icon: "Bread" }, - { keyword: "뷔페", icon: "Cheese" }, + { keyword: "뷔페", icon: "ForkKnife" }, { keyword: "퓨전", icon: "Cookie" }, ]; -export function getTablerCuisineIcon(cuisineType: string | null | undefined): string { - if (!cuisineType) return "Bowl"; - for (const rule of TABLER_SUB_RULES) { +export function getPhosphorCuisineIcon(cuisineType: string | null | undefined): string { + if (!cuisineType) return "ForkKnife"; + for (const rule of PHOSPHOR_SUB_RULES) { if (cuisineType.includes(rule.keyword)) return rule.icon; } const main = cuisineType.split("|")[0]; - return TABLER_CUISINE_MAP[main] || "Bowl"; + return PHOSPHOR_CUISINE_MAP[main] || "ForkKnife"; }