Welcome to the OBar!
+Cocktail Dashboard
++ Explore our collection of premium cocktails and discover your favorite +
- {/* 통계 카드 영역 */} -칵테일을 찾을 수 없습니다
++ {error.message || "요청하신 칵테일 정보를 불러올 수 없습니다."} +
+Loading...
; + return { title: "Cocktail Not Found" }; + } + + return { + title: `${cocktail.name} - Obar`, + description: cocktail.description, + }; +} + +export function generateStaticParams() { + return cocktailsData.cocktails.map((cocktail) => ({ + id: String(cocktail.id), + })); +} + +export default async function DetailPage({ params }: DetailPageProps) { + const { id } = await params; + const cocktail = cocktailsData.cocktails.find((c) => String(c.id) === id); + + if (!cocktail) { + notFound(); } return ( -OBar
-DATA ON THE ROCKS
- ENTER OBAR WORLD -
- Obar Story
+
- Beyond the Ordinary
+ {/* Right - Content */}
+
+
+ Our
+ Story
-
-
-
- OBar라는 이름은 두 가지 의미를 담고 있습니다.
- "OH, bar"라는 감탄사와 "Over"라는 초월의 의미가 만나 평범함을 넘은 특별함을 담고 있습니다.
-
-
- 우리는 단순히 음료를 보여주는 것이 아니라,
- 각각의 칵테일에 OBar만의 스토리와 감성을 담아냅니다.
- 검은색의 세련됨과 핑크색의 열정이 조화를 이루는 공간에서 당신만의 특별한 순간을 만들어보세요.
-
-
-
-
-
- Visit us for an unforgettable experience
+
+ Obar는 2020년 서울의 한 골목에서 시작되었습니다. 평범한 칵테일 바가 아닌, 예술과 과학이 만나는 공간을 만들고 싶었던 우리의 꿈에서 비롯되었습니다.
+
+
+
+ 매 순간 우리는 최고의 재료를 엄선하고, 각 칵테일에 담긴 스토리를 전달하며, 손님들의 특별한 순간을 만들기 위해 노력합니다.
+
+
+
+ Obar에서 경험하는 모든 것은 우리의 철학을 담고 있습니다: OH, bar도 가능하고 Over라는 느낌도 나는 중의적 표현. 평범함을 넘어, 특별한 경험을 제공하는 것이 우리의 목표입니다.
+
+
+
+
+ 500+
+ Happy Customers
+
+
+ 50+
+ Signature Cocktails
diff --git a/components/about/CTASection.tsx b/components/about/CTASection.tsx
index d8a75c2..fdf94e7 100644
--- a/components/about/CTASection.tsx
+++ b/components/about/CTASection.tsx
@@ -1,26 +1,30 @@
-'use client';
+import Link from "next/link";
-export function CTASection() {
+export default function CTASection() {
return (
-
-
-
-
- Ready to Experience OBar?
-
-
- 평범함을 넘어선 특별한 칵테일 경험이 당신을 기다립니다.
-
-
-
-
-
+
+
+
+ Ready to Experience
+ Obar?
+
+
+
+ 지금 바로 우리의 프리미엄 칵테일 컬렉션을 탐색해보세요. 특별한 순간을 만들어보세요.
+
+
+
+
+ Explore All Cocktails
+
+
);
-}
+}
\ No newline at end of file
diff --git a/components/about/CocktailCollectionSection.tsx b/components/about/CocktailCollectionSection.tsx
new file mode 100644
index 0000000..e2c44ee
--- /dev/null
+++ b/components/about/CocktailCollectionSection.tsx
@@ -0,0 +1,78 @@
+"use client";
+
+import Link from "next/link";
+import cocktailsData from "@/lib/cocktails.json";
+
+export default function CocktailCollectionSection() {
+ const featuredCocktails = cocktailsData.cocktails.slice(0, 4);
+
+ return (
+
+
+
+
+ Signature
+ Collection
+
+
+ Obar의 대표 칵테일들을 만나보세요
+
+
+
+
+ {featuredCocktails.map((cocktail) => (
+
+
+
+ {cocktail.image ? (
+
{
+ (e.target as HTMLImageElement).style.display = 'none';
+ }}
+ />
+ ) : (
+ 🍸
+ )}
+
+
+ {/* Overlay info */}
+
+ {cocktail.alcohol}%
+
+
+ {cocktail.category}
+
+
+
+
+
+ {cocktail.name}
+
+ {cocktail.nameKo}
+
+ {cocktail.description}
+
+
+
+ ))}
+
+
+
+
+ View All Cocktails
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/components/about/HeroSection.tsx b/components/about/HeroSection.tsx
index f30e18b..24aec77 100644
--- a/components/about/HeroSection.tsx
+++ b/components/about/HeroSection.tsx
@@ -1,86 +1,81 @@
-'use client';
+"use client";
-import { Sparkles } from 'lucide-react';
-import Link from 'next/link';
+import Link from "next/link";
+import { useState } from "react";
+
+export default function HeroSection() {
+ const heroImage = "/images/about/cocktail-neon.jpg";
+ const [isImageError, setIsImageError] = useState(false);
-export function HeroSection() {
return (
-
- {/* 이미지 overlay */}
-
-
-
-
+
+ {/* Background gradient */}
+
- {/* body */}
-
-
- {/* 완쪽 - 글 영역 */}
-
-
-
-
-
- Premium Cocktail Website
-
-
-
-
- O
- Bar
-
-
-
-
- Oh, Bar!
-
-
- Over the ordinary
-
-
-
+
+ {/* Left Content */}
+
+
+ ✦ PREMIUM COCKTAIL EXPERIENCE
+
-
- Obar는 당신이 원하는 칵테일을 모두 가지고 있습니다.
- 감각적인 분위기 속에서 나만의 칵테일을 찾아보세요.
-
+
+ O
+ bar
+
-
-
- Go Dashboard
-
-
-
+ OH, bar
+ Over the ordinary
+
+
+ Obar는 평범함을 넘어선 특별한 칵테일 경험을 제공합니다.
+ 세련된 분위기 속에서 엄선된 레시피와 함께 잊지 못할 순간을 만들어보세요.
+
+
+
+
+ Explore Menu
+
+
+
- {/* 오른쪽 - 이미지 영역 */}
-
-
-
-
+ {heroImage && !isImageError ? (
+ <>
+
+
setIsImageError(true)}
/>
+ >
+ ) : (
+
+
+ 🍸
+
+ Premium Cocktails
+
+
-
+ )}
- {/* 스크롤 스티커 */}
-
-
- Scroll
-
-
+ {/* Scroll indicator */}
+
+ SCROLL
+
);
diff --git a/components/about/MixologySection.tsx b/components/about/MixologySection.tsx
index 16c5175..1df179e 100644
--- a/components/about/MixologySection.tsx
+++ b/components/about/MixologySection.tsx
@@ -1,61 +1,50 @@
-'use client';
-
-import { Wine, Sparkles, Clock } from 'lucide-react';
-
-export function MixologySection() {
+export default function MixologySection() {
const features = [
{
- icon: Wine,
- title: "Premium Ingredients",
- description: "엄선된 최고급 재료만을 사용하여 완벽한 한 잔을 만들어냅니다."
+ icon: "🎨",
+ title: "Craft & Artistry",
+ description: "각 칵테일은 마스터 바텐더의 정성과 예술성이 담긴 작품입니다.",
},
{
- icon: Sparkles,
- title: "Signature Creations",
- description: "숙련된 믹솔로지스트가 창조하는 독창적인 시그니처 칵테일을 경험하세요."
+ icon: "✨",
+ title: "Premium Ingredients",
+ description: "세계 최고의 주류와 신선한 재료만을 엄선하여 사용합니다.",
},
{
- icon: Clock,
- title: "Timeless Atmosphere",
- description: "세련되고 감각적인 공간에서 특별한 순간을 만들어보세요."
- }
+ icon: "🌟",
+ title: "Unique Experience",
+ description: "각 칵테일마다 특별한 스토리와 경험이 담겨있습니다.",
+ },
];
return (
-
-
-
-
-
- The Art of Mixology
-
-
- OBar는 세련된 디자인과 분위기 속에 다양한 종류의 칵테일을 제공해드립니다.
-
-
+
+
+
+
+ The Art of
+ Mixology
+
+
+ Obar에서는 단순한 음료가 아닌 경험을 제공합니다.
+
+
-
- {features.map((feature, index) => {
- const Icon = feature.icon;
- return (
-
-
-
-
-
-
- {feature.title}
-
- {feature.description}
-
-
-
- );
- })}
-
+
+ {features.map((feature, index) => (
+
+
+ {feature.icon}
+
+
+ {feature.title}
+
+ {feature.description}
+
+ ))}
diff --git a/components/dashboard/CategoryFilter.tsx b/components/dashboard/CategoryFilter.tsx
new file mode 100644
index 0000000..e6196a2
--- /dev/null
+++ b/components/dashboard/CategoryFilter.tsx
@@ -0,0 +1,35 @@
+"use client";
+
+import { useState } from "react";
+
+interface CategoryFilterProps {
+ onFilter?: (category: string) => void;
+}
+
+export default function CategoryFilter({ onFilter }: CategoryFilterProps) {
+ const [activeCategory, setActiveCategory] = useState("All");
+ const categories = ["All", "Classic", "Modern Classic", "Signature"];
+
+ const handleFilter = (category: string) => {
+ setActiveCategory(category);
+ onFilter?.(category);
+ };
+
+ return (
+
+ {categories.map((category) => (
+
+ ))}
+
+ );
+}
\ No newline at end of file
diff --git a/components/dashboard/ChartSection.tsx b/components/dashboard/ChartSection.tsx
new file mode 100644
index 0000000..dd651cf
--- /dev/null
+++ b/components/dashboard/ChartSection.tsx
@@ -0,0 +1,79 @@
+"use client";
+
+import cocktailsData from "@/lib/cocktails.json";
+
+export default function ChartSection() {
+ const cocktails = cocktailsData.cocktails;
+
+ // Category distribution
+ const categoryCount = cocktails.reduce(
+ (acc, c) => {
+ acc[c.category] = (acc[c.category] || 0) + 1;
+ return acc;
+ },
+ {} as Record
+ );
+
+ // Difficulty distribution
+ const difficultyCount = cocktails.reduce(
+ (acc, c) => {
+ acc[c.difficulty] = (acc[c.difficulty] || 0) + 1;
+ return acc;
+ },
+ {} as Record
+ );
+
+ const totalCocktails = cocktails.length;
+
+ return (
+
+ {/* By Category */}
+
+ By Category
+
+ {Object.entries(categoryCount).map(([category, count]) => {
+ const percentage = Math.round((count / totalCocktails) * 100);
+ return (
+
+
+ {category}
+ {count} cocktails
+
+
+
+
+
+ );
+ })}
+
+
+
+ {/* By Difficulty */}
+
+ By Difficulty
+
+ {Object.entries(difficultyCount).map(([difficulty, count]) => {
+ const percentage = Math.round((count / totalCocktails) * 100);
+ return (
+
+
+ {difficulty}
+ {count} cocktails
+
+
+
+
+
+ );
+ })}
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/components/dashboard/CocktailGrid.tsx b/components/dashboard/CocktailGrid.tsx
new file mode 100644
index 0000000..e930fd3
--- /dev/null
+++ b/components/dashboard/CocktailGrid.tsx
@@ -0,0 +1,92 @@
+"use client";
+
+import Link from "next/link";
+import cocktailsData from "@/lib/cocktails.json";
+import { useState, useMemo } from "react";
+
+export default function CocktailGrid() {
+ const [searchQuery, setSearchQuery] = useState("");
+ const [selectedCategory, setSelectedCategory] = useState("All");
+
+ const filteredCocktails = useMemo(() => {
+ return cocktailsData.cocktails.filter((cocktail) => {
+ const matchesSearch =
+ searchQuery === "" ||
+ cocktail.name.toLowerCase().includes(searchQuery.toLowerCase()) ||
+ cocktail.nameKo.toLowerCase().includes(searchQuery.toLowerCase()) ||
+ cocktail.description.toLowerCase().includes(searchQuery.toLowerCase());
+
+ const matchesCategory =
+ selectedCategory === "All" || cocktail.category === selectedCategory;
+
+ return matchesSearch && matchesCategory;
+ });
+ }, [searchQuery, selectedCategory]);
+
+ return (
+
+
+ All Cocktails ({filteredCocktails.length})
+
+
+
+ {filteredCocktails.map((cocktail) => (
+
+
+ {/* 이미지 처리 부분 */}
+
+ {cocktail.image ? (
+
{
+ (e.target as HTMLImageElement).style.display = 'none';
+ }}
+ />
+ ) : (
+ 🍸
+ )}
+
+
+ {/* Overlay info */}
+
+ {cocktail.alcohol}%
+
+
+ {cocktail.category}
+
+
+ ⭐
+ {cocktail.rating}
+
+
+
+
+
+ {cocktail.name}
+
+ {cocktail.nameKo}
+
+ {cocktail.description}
+
+
+
+ ))}
+
+
+ {filteredCocktails.length === 0 && (
+
+
+ 검색 결과가 없습니다. 다시 시도해주세요.
+
+
+ )}
+
+ );
+}
\ No newline at end of file
diff --git a/components/dashboard/CocktailMapping.tsx b/components/dashboard/CocktailMapping.tsx
deleted file mode 100644
index dcc380e..0000000
--- a/components/dashboard/CocktailMapping.tsx
+++ /dev/null
@@ -1,27 +0,0 @@
-import { Cocktail } from "@/types/cocktails";
-import Link from "next/link";
-import cocktailData from "@/lib/cocktails.json";
-
-export const CocktailMapping = () => {
- const cocktails: Cocktail[] = cocktailData as Cocktail[];
-
- return (
-
- {cocktails.map((cocktail) => (
-
-
-
- {cocktail.name}
-
- {cocktail.alcoholic}
-
-
-
- ))}
-
- );
-}
\ No newline at end of file
diff --git a/components/dashboard/SearchBar.tsx b/components/dashboard/SearchBar.tsx
index 56f52ae..eae50ec 100644
--- a/components/dashboard/SearchBar.tsx
+++ b/components/dashboard/SearchBar.tsx
@@ -1,10 +1,44 @@
-export const SeachBar = () => {
+"use client";
+
+import { useState } from "react";
+
+interface SearchBarProps {
+ onSearch?: (query: string) => void;
+}
+
+export default function SearchBar({ onSearch }: SearchBarProps) {
+ const [query, setQuery] = useState("");
+
+ const handleChange = (e: React.ChangeEvent) => {
+ const value = e.target.value;
+ setQuery(value);
+ onSearch?.(value);
+ };
+
return (
-
-
+
+
+
+
+
);
}
\ No newline at end of file
diff --git a/components/dashboard/StatCard.tsx b/components/dashboard/StatCard.tsx
deleted file mode 100644
index 6ac192f..0000000
--- a/components/dashboard/StatCard.tsx
+++ /dev/null
@@ -1,15 +0,0 @@
-import { Cocktail } from "@/types/cocktails";
-import cocktailData from "@/lib/cocktails.json";
-
-export const StatCard = () => {
- const cocktails: Cocktail[] = cocktailData as Cocktail[];
-
- return (
-
- Total Recipes: {cocktails.length}
- Alcoholic Ratio: 85%
- Most Popular Glass: Highball
- Ingredients Count: 74
-
- );
-}
\ No newline at end of file
diff --git a/components/dashboard/StatsCards.tsx b/components/dashboard/StatsCards.tsx
new file mode 100644
index 0000000..1e7e157
--- /dev/null
+++ b/components/dashboard/StatsCards.tsx
@@ -0,0 +1,57 @@
+"use client";
+
+import cocktailsData from "@/lib/cocktails.json";
+
+export default function StatsCards() {
+ const cocktails = cocktailsData.cocktails;
+ const totalCocktails = cocktails.length;
+ const avgRating = (
+ cocktails.reduce((sum, c) => sum + c.rating, 0) / totalCocktails
+ ).toFixed(1);
+ const totalReviews = cocktails.reduce((sum, c) => sum + c.reviews, 0);
+ const avgAlcohol = (
+ cocktails.reduce((sum, c) => sum + c.alcohol, 0) / totalCocktails
+ ).toFixed(1);
+
+ const stats = [
+ {
+ label: "Total Cocktails",
+ value: totalCocktails,
+ icon: "🍸",
+ },
+ {
+ label: "Avg Rating",
+ value: avgRating,
+ icon: "⭐",
+ },
+ {
+ label: "Total Reviews",
+ value: totalReviews,
+ icon: "👥",
+ },
+ {
+ label: "Avg Alcohol %",
+ value: `${avgAlcohol}%`,
+ icon: "📊",
+ },
+ ];
+
+ return (
+
+ {stats.map((stat, index) => (
+
+
+
+ {stat.label}
+ {stat.value}
+
+ {stat.icon}
+
+
+ ))}
+
+ );
+}
\ No newline at end of file
diff --git a/components/detail/CocktailHero.tsx b/components/detail/CocktailHero.tsx
new file mode 100644
index 0000000..7d14df0
--- /dev/null
+++ b/components/detail/CocktailHero.tsx
@@ -0,0 +1,138 @@
+"use client";
+
+import Link from "next/link";
+
+interface Cocktail {
+ id: string;
+ name: string;
+ nameKo: string;
+ category: string;
+ description: string;
+ image?: string;
+ alcohol: number;
+ difficulty: string;
+ glass: string;
+ method: string;
+ rating: number;
+ popularity: number;
+ taste: {
+ sweet: number;
+ sour: number;
+ bitter: number;
+ strong: number;
+ };
+}
+
+interface CocktailHeroProps {
+ cocktail: Cocktail;
+}
+
+export default function CocktailHero({ cocktail }: CocktailHeroProps) {
+ return (
+
+
+
+ Back to Cocktails
+
+
+
+ {/* Image Section */}
+
+
+
+ {cocktail.image ? (
+
{
+ (e.target as HTMLImageElement).style.display = 'none';
+ }}
+ />
+ ) : (
+ 🍸
+ )}
+
+
+
+ {/* Info Section */}
+
+
+ {cocktail.category}
+
+ {cocktail.name}
+ {cocktail.nameKo}
+
+
+ {cocktail.description}
+
+
+ {/* Taste Profile */}
+
+
+ 🌟 Taste Profile
+
+
+ {Object.entries(cocktail.taste).map(([key, value]) => (
+
+
+ {key}
+ {value}%
+
+
+
+
+
+ ))}
+
+
+
+ {/* Stats & Details Grid */}
+
+
+
+ {cocktail.alcohol}%
+ Alcohol
+
+
+ ⭐ {cocktail.rating}
+ Rating
+
+
+ {cocktail.popularity}%
+ Popularity
+
+
+
+
+
+ 🥃 Glass
+ {cocktail.glass}
+
+
+ 🔧 Method
+ {cocktail.method}
+
+
+ ⏱️ Difficulty
+ {cocktail.difficulty}
+
+
+
+
+
+
+
+
+ );
+}
\ No newline at end of file
diff --git a/components/detail/HeaderCocktail.tsx b/components/detail/HeaderCocktail.tsx
deleted file mode 100644
index b392df5..0000000
--- a/components/detail/HeaderCocktail.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import { Cocktail } from "@/types/cocktails";
-
-export const HeaderCocktail = ({ cocktail }: { cocktail: Cocktail }) => {
- return (
-
-
- {cocktail.name}
-
-
-
- {cocktail.description}
-
-
-
-
- Category: {cocktail.category}
- Glass: {cocktail.glass}
-
-
-
- );
-}
diff --git a/components/detail/ImageCocktail.tsx b/components/detail/ImageCocktail.tsx
deleted file mode 100644
index f97b1d3..0000000
--- a/components/detail/ImageCocktail.tsx
+++ /dev/null
@@ -1,11 +0,0 @@
-export const ImageCocktail = ({ image, name }: { image: string; name: string }) => {
- return (
-
-
-
- );
-}
diff --git a/components/detail/IngredientCocktail.tsx b/components/detail/IngredientCocktail.tsx
deleted file mode 100644
index fed8280..0000000
--- a/components/detail/IngredientCocktail.tsx
+++ /dev/null
@@ -1,28 +0,0 @@
-import { Cocktail } from "@/types/cocktails";
-
-export const IngredientCocktail = ({ ingredients }: { ingredients: Cocktail["ingredients"] }) => {
- return (
-
-
- 재료 정보
-
-
-
- {ingredients.map((ingredient, index) => (
- -
-
- {ingredient.item}
-
- {ingredient.amount}
-
- ))}
-
-
-
-
-
- );
-}
diff --git a/components/detail/InstructionCocktail.tsx b/components/detail/InstructionCocktail.tsx
deleted file mode 100644
index 01de423..0000000
--- a/components/detail/InstructionCocktail.tsx
+++ /dev/null
@@ -1,17 +0,0 @@
-export const InstructionCocktail = ({ instructions }: { instructions: string[] }) => {
- return (
-
-
- 레시피 설명
-
-
-
- {instructions.map((step, index) => (
- - {step}
- ))}
-
-
-
-
- );
-}
\ No newline at end of file
diff --git a/components/detail/RecipeSection.tsx b/components/detail/RecipeSection.tsx
new file mode 100644
index 0000000..50fbc08
--- /dev/null
+++ b/components/detail/RecipeSection.tsx
@@ -0,0 +1,64 @@
+"use client";
+
+interface Ingredient {
+ name: string;
+ amount: string;
+}
+
+interface Cocktail {
+ id: string;
+ name: string;
+ ingredients: Ingredient[];
+ garnish: string[];
+ story: string;
+}
+
+interface RecipeSectionProps {
+ cocktail: Cocktail;
+}
+
+export default function RecipeSection({ cocktail }: RecipeSectionProps) {
+ return (
+
+ {/* Recipe */}
+
+ 📋 Recipe
+
+
+ Ingredients
+
+ {cocktail.ingredients.map((ingredient, index) => (
+
+ {ingredient.name}
+ {ingredient.amount}
+
+ ))}
+
+
+
+
+ Garnish
+
+ {cocktail.garnish.map((item, index) => (
+
+ {item}
+
+ ))}
+
+
+
+
+ {/* Story */}
+
+ 📖 Story
+ {cocktail.story}
+
+
+ );
+}
\ No newline at end of file
diff --git a/components/detail/RelatedCocktails.tsx b/components/detail/RelatedCocktails.tsx
new file mode 100644
index 0000000..277b477
--- /dev/null
+++ b/components/detail/RelatedCocktails.tsx
@@ -0,0 +1,79 @@
+"use client";
+
+import Link from "next/link";
+import cocktailsData from "@/lib/cocktails.json";
+
+interface RelatedCocktailsProps {
+ currentId: string;
+}
+
+export default function RelatedCocktails({ currentId }: RelatedCocktailsProps) {
+ const currentCocktail = cocktailsData.cocktails.find(c => c.id === currentId);
+
+ const relatedCocktails = cocktailsData.cocktails
+ .filter((c) => c.id !== currentId)
+ .sort((a, b) => {
+ if (a.category === currentCocktail?.category && b.category !== currentCocktail?.category) return -1;
+ if (a.category !== currentCocktail?.category && b.category === currentCocktail?.category) return 1;
+ return 0;
+ })
+ .slice(0, 3);
+
+ return (
+
+
+ You Might Also
+ Like
+
+
+
+ {relatedCocktails.map((cocktail) => (
+
+
+
+ {cocktail.image ? (
+
{
+ (e.target as HTMLImageElement).style.display = 'none';
+ }}
+ />
+ ) : (
+ 🍸
+ )}
+
+
+ {/* Overlay info */}
+
+ {cocktail.alcohol}%
+
+
+ {cocktail.category}
+
+
+ ⭐
+ {cocktail.rating}
+
+
+
+
+
+ {cocktail.name}
+
+ {cocktail.nameKo}
+
+ {cocktail.description}
+
+
+
+ ))}
+
+
+ );
+}
\ No newline at end of file
diff --git a/lib/cocktails.json b/lib/cocktails.json
index 5ebbbd4..51d8eae 100644
--- a/lib/cocktails.json
+++ b/lib/cocktails.json
@@ -1,548 +1,1045 @@
-[
- {
- "id": "1",
- "name": "모스코 뮬 (Moscow Mule)",
- "nameKo": "모스코 뮬 (Moscow Mule)",
- "category": "보드카 베이스",
- "description": "보드카의 깔끔한 맛을 베이스로, 진저에일의 톡 쏘는 생강향과 라임 주스의 산미가 더해진 상큼·시원한 칵테일이다. 첫 모금은 청량감이 확 올라오고, 뒤에는 은은한 생강 향이 부드럽게 남아 더위에 특히 잘 어울리는 시원한 스타일이다.",
- "image": "/images/Moscow Mule.jpeg",
- "alcohol": 45,
- "difficulty": "Medium",
- "ingredients": [
- { "name": "보드카", "amount": "45ml" },
- { "name": "진저에일", "amount": "적당량" },
- { "name": "라임 주스", "amount": "15ml" }
- ],
- "garnish": ["라임 웨지"],
- "glass": "하이볼 잔",
- "method": "하이볼 잔에 얼음을 채우고 보드카와 라임 주스를 넣습니다. 진저 에일을 가득 채우고 살짝 저어줍니다. 이후 레몬이나 라임 웨지로 가니쉬하면 완성.",
- "taste": {
- "sweet": 2,
- "sour": 3,
- "bitter": 1,
- "strong": 4
- },
- "story": "모스코 뮬은 1940년대 후반에 미국 LA에서 처음 만들어졌다고 알려져 있습니다. 진저에일과 보드카의 조화가 특징입니다."
- },
- {
- "id": "2",
- "name": "코스모폴리탄 (Cosmopolitan)",
- "nameKo": "코스모폴리탄 (Cosmopolitan)",
- "category": "보드카 베이스",
- "description": "보드카 시트론의 상큼함 위에 크랜베리 주스의 달콤한 산미, 오렌지 리큐어의 과일 향이 어우러져 부드럽지만 은근히 도수가 느껴지는 칵테일이다. 달콤하고 가벼워 보이지만 실제로는 도수가 높아 ‘레이디 킬러’라 불릴 만큼 깔끔하고 뒤끝이 강렬한 맛이다. 컬러감까지 예뻐 파티 분위기에도 잘 어울린다.",
- "image": "/images/Cosmopolitan.jpeg",
- "alcohol": 40,
- "difficulty": "Medium",
- "ingredients": [
- { "name": "보드카 시트론", "amount": "40ml" },
- { "name": "크랜베리 주스", "amount": "30ml" },
- { "name": "오렌지 리큐어", "amount": "15ml" },
- { "name": "라임즙", "amount": "15ml" }
- ],
- "garnish": ["라임 웨지", "레몬 필 트위스트"],
- "glass": "마티니 잔",
- "method": "셰이커에 얼음과 주재료를 넣고 8~10초정도 셰이킹합니다. 더블 스트레인으로 걸러내 차갑게 식힌 마티니 글라스에 따릅니다. 라임 웨지나 레몬 필 트위스트로 가니쉬합니다.",
- "taste": {
- "sweet": 3,
- "sour": 2,
- "bitter": 1,
- "strong": 3
- },
- "story": "코스모폴리탄은 1980년대 미국에서 여성들 사이에서 유행하였으며, 인기 TV 쇼인 '섹스 앤 더 시티'로 더욱 유명해졌습니다."
- },
- {
- "id": "3",
- "name": "블러디 메리 (Bloody Mary)",
- "nameKo": "블러디 메리 (Bloody Mary)",
- "category": "보드카 베이스",
- "description": "보드카의 묵직한 베이스에 토마토 주스의 진한 감칠맛이 더해져 짭짤하고 시원한 맛을 만든다. 레몬 주스의 산미, 타바스코와 후추의 매콤함이 더해져 해장용으로도 유명할 만큼 독특하게 상쾌한 느낌을 준다. 한 잔으로도 배부른, 식사같은 칵테일이다.",
- "image": "/images/Bloody Mary.jpeg",
- "alcohol": 45,
- "difficulty": "Hard",
- "ingredients": [
- { "name": "보드카", "amount": "45ml" },
- { "name": "토마토 주스", "amount": "90ml" },
- { "name": "레몬 주스", "amount": "10ml" },
- { "name": "타바스코 소스", "amount": "1-2대시" },
- { "name": "소금", "amount": "약간" },
- { "name": "후추", "amount": "약간" }
- ],
- "garnish": ["소금", "후추"],
- "glass": "하이볼 글라스",
- "method": "셰이커에 모든 재료를 넣고 잘 흔듭니다. 얼음을 가득 채운 하이볼 글라스에 따라줍니다. 소금과 후추로 장식합니다.",
- "taste": {
- "sweet": 1,
- "sour": 2,
- "bitter": 2,
- "strong": 4
- },
- "story": "블러디 메리는 1920년대 초, 프랑스에서 개발된 것으로 전해지며, 해장용으로 유명한 칵테일입니다."
- },
- {
- "id": "4",
- "name": "블랙 러시안 (Black Russian)",
- "nameKo": "블랙 러시안 (Black Russian)",
- "category": "보드카 베이스",
- "description": "보드카의 깔끔한 바디감에 커피 리큐어의 달콤쌉싸름한 풍미가 강하게 느껴지는 진한 칵테일이다. 단맛과 쓴맛이 동시에 올라오고, 전체적으로 술 자체의 도수를 고스란히 느낄 수 있는 묵직한 스타일이다. 달콤한데 강한 술을 좋아하는 사람에게 잘 맞는다.",
- "image": "/images/Black Russian.jpeg",
- "alcohol": 50,
- "difficulty": "Easy",
- "ingredients": [
- { "name": "보드카", "amount": "50ml" },
- { "name": "커피 리큐어", "amount": "25ml" }
- ],
- "garnish": [],
- "glass": "올드 패션드 잔",
- "method": "얼음을 채운 올드 패션드 잔에 보드카와 커피 리큐어를 붓습니다. 가볍게 저어줍니다.",
- "taste": {
- "sweet": 2,
- "sour": 1,
- "bitter": 3,
- "strong": 4
- },
- "story": "블랙 러시안은 1949년 벨기에에서 처음 만들어졌다고 전해지며, 커피 리큐어와 보드카가 조화를 이루는 칵테일입니다."
- },
- {
- "id": "5",
- "name": "진 토닉 (Gin Tonic)",
- "nameKo": "진 토닉 (Gin Tonic)",
- "category": "진 베이스",
- "description": "드라이 진의 솔향·허브향이 토닉 워터의 상쾌하고 가벼운 단맛과 만나 아주 깨끗하고 청량한 맛을 만든다. 라임이나 레몬을 더하면 쓴맛이 부드럽게 정리되고 상큼한 향이 올라와 전체적으로 깔끔하고 목넘김이 좋은, 누구나 즐기기 쉬운 칵테일이다.",
- "image": "/images/Gin Tonic.jpeg",
- "alcohol": 45,
- "difficulty": "Easy",
- "ingredients": [
- { "name": "드라이 진", "amount": "45ml" },
- { "name": "토닉 워터", "amount": "적당량" },
- { "name": "라임 또는 레몬 웨지", "amount": "1개" }
- ],
- "garnish": ["라임 웨지", "레몬 웨지"],
- "glass": "하이볼 글라스",
- "method": "하이볼 글라스에 얼음을 가득 채웁니다. 진을 붓고 토닉 워터로 잔을 채웁니다. 라임 또는 레몬 웨지를 짜서 넣고 잔에 떨어뜨립니다. 가볍게 저어줍니다.",
- "taste": {
- "sweet": 2,
- "sour": 3,
- "bitter": 1,
- "strong": 2
- },
- "story": "진 토닉은 19세기 영국에서 시작되었으며, 말라리아 예방을 위해 탄산수와 진을 결합한 칵테일입니다."
- },
- {
- "id": "6",
- "name": "Martini",
- "nameKo": "마티니",
- "category": "진 베이스",
- "description": "드라이 진의 강렬한 향과 베르무트의 허브·꽃향이 조화되는 가장 클래식한 칵테일이다. 한 모금만 마셔도 도수가 뚜렷하게 느껴질 만큼 깔끔하고 드라이하며, 올리브나 레몬 필이 들어가면 짭조름하거나 상큼한 여운이 더해진다. 강한 술을 선호하는 사람에게 어울리는 정통 스타일이다.",
- "image": "/images/Martini.jpeg",
- "alcohol": 35,
- "difficulty": "Medium",
- "ingredients": [
- {"name": "드라이 진", "amount": "60ml"},
- {"name": "드라이 베르무트", "amount": "10ml"}
- ],
- "garnish": [
- "올리브",
- "레몬 껍질"
- ],
- "glass": "칵테일 잔",
- "method": "셰이커에 얼음과 모든 재료를 넣고 잘 흔든 후, 스트레인해서 칵테일 잔에 따릅니다.",
- "taste": {
- "sweet": 1,
- "sour": 1,
- "bitter": 2,
- "strong": 5
- },
- "story": ""
- },
- {
- "id": "7",
- "name": "Negroni",
- "nameKo": "네그로니",
- "category": "진 베이스",
- "description": "진의 향긋한 보태니컬 향, 캄파리의 쌉싸름한 씁쓸함, 스위트 베르무트의 달콤한 허브 향이 완벽한 1:1:1 비율로 어우러진 깊은 맛의 칵테일이다. 쓴맛과 단맛이 동시에 느껴져 어른스러운 맛을 내며, 오렌지 향이 마지막에 은은하게 올라와 무게감 있는 고전풍 칵테일을 좋아하는 사람들에게 사랑받는다.",
- "image": "/images/Negroni.jpeg",
- "alcohol": 28,
- "difficulty": "Easy",
- "ingredients": [
- {"name": "드라이 진", "amount": "30ml"},
- {"name": "캄파리", "amount": "30ml"},
- {"name": "스위트 베르무트", "amount": "30ml"}
- ],
- "garnish": [
- "오렌지 껍질"
- ],
- "glass": "올드 패션드 잔",
- "method": "얼음을 채운 올드 패션드 잔에 모든 재료를 붓고 잘 저어줍니다.",
- "taste": {
- "sweet": 3,
- "sour": 1,
- "bitter": 5,
- "strong": 4
- },
- "story": ""
- },
- {
- "id": "8",
- "name": "Singapore Sling",
- "nameKo": "싱가포르 슬링",
- "category": "진 베이스",
- "description": "진의 깔끔한 향을 바탕으로 체리 리큐어의 달콤함과 파인애플 주스의 풍부한 열대 과일향이 어우러진 밝고 화사한 칵테일이다. 레몬 주스의 산미가 단맛을 정리해주며, 전체적으로 과일 펀치를 마시는 듯한 상큼·달콤한 느낌을 준다. 열대 지방의 분위기가 물씬 나는, 분위기 전환용으로 딱 맞는 칵테일이다.",
- "image": "/images/Singapore Sling.jpeg",
- "alcohol": 12,
- "difficulty": "Medium",
- "ingredients": [
- {"name": "진", "amount": "30ml"},
- {"name": "체리 리큐어", "amount": "15ml"},
- {"name": "파인애플 주스", "amount": "90ml"},
- {"name": "레몬 주스", "amount": "15ml"},
- {"name": "그레나딘 시럽", "amount": "10ml"}
- ],
- "garnish": [
- "체리",
- "파인애플 조각"
- ],
- "glass": "하이볼 잔",
- "method": "셰이커에 모든 재료와 얼음을 넣고 잘 흔든 후, 스트레인해서 하이볼 잔에 따라줍니다.",
- "taste": {
- "sweet": 5,
- "sour": 3,
- "bitter": 1,
- "strong": 2
- },
- "story": ""
- },
- {
- "id": "9",
- "name": "Old Fashioned",
- "nameKo": "올드 패션드",
- "category": "위스키 베이스",
- "description": "버번 또는 라이 위스키의 깊고 묵직한 풍미가 중심이 되며, 설탕의 은은한 단맛과 앙고스투라 비터즈의 스파이시한 향이 더해져 클래식한 밸런스를 이룬다. 위스키 본연의 맛을 해치지 않으면서 부드럽게 다듬어주는 스타일로, 첫 모금부터 깊고 진한 느낌이 살아난다. ‘칵테일의 아버지’라 불릴 만큼 전통적이고 품격 있는 맛을 준다.",
- "image": "/images/Old Fashioned.jpeg",
- "alcohol": 32,
- "difficulty": "Medium",
- "ingredients": [
- {"name": "버번 위스키 또는 라이 위스키", "amount": "60ml"},
- {"name": "설탕 또는 설탕 시럽", "amount": "1각 또는 5ml"},
- {"name": "앙고스투라 비터즈", "amount": "2-3대시"},
- {"name": "오렌지 껍질", "amount": "장식용"}
- ],
- "garnish": [
- "오렌지 껍질"
- ],
- "glass": "올드 패션드 잔",
- "method": "올드 패션드 잔에 설탕과 비터즈를 넣고 녹인 후, 위스키와 얼음을 넣고 잘 희석될 때까지 섞어줍니다. (오렌지 껍질로 잔의 입구를 문지른 뒤 잔에 넣고 가볍게 저어줍니다.)",
- "taste": {
- "sweet": 3,
- "sour": 1,
- "bitter": 3,
- "strong": 5
- },
- "story": ""
- },
- {
- "id": "10",
- "name": "Manhattan",
- "nameKo": "맨해튼",
- "category": "위스키 베이스",
- "description": "버번 위스키의 묵직한 단맛과 스위트 베르무트의 허브 향이 조화된 클래식한 칵테일이다. 비터즈가 향을 잡아주어 전체적으로 부드럽고 깊은 풍미가 느껴진다. 달콤하지만 도수도 뚜렷해, 고급스럽고 어른스러운 느낌의 칵테일을 좋아하는 사람에게 어울린다.",
- "image": "/images/Manhattan.jpeg",
- "alcohol": 30,
- "difficulty": "Medium",
- "ingredients": [
- {"name": "버번 위스키", "amount": "50ml"},
- {"name": "스위트 베르무트", "amount": "25ml"},
- {"name": "앙고스투라 비터즈", "amount": "2-3대시"}
- ],
- "garnish": [
- "체리"
- ],
- "glass": "칵테일 잔",
- "method": "셰이커에 얼음과 재료를 넣고 잘 흔든 후, 스트레인해서 칵테일 잔에 따릅니다.",
- "taste": {
- "sweet": 3,
- "sour": 1,
- "bitter": 2,
- "strong": 5
- },
- "story": ""
- },
- {
- "id": "11",
- "name": "Whiskey Sour",
- "nameKo": "위스키 사워",
- "category": "위스키 베이스",
- "description": "버번 위스키의 따뜻한 풍미에 레몬 주스의 산미가 확 살아나며 설탕 시럽이 부드럽게 단맛을 더해 새콤달콤한 밸런스를 완성한다. 계란 흰자를 사용하면 거품이 더해져 한층 크리미하고 고급스러운 질감을 느낄 수 있다. 입맛을 환기시키는 상큼한 느낌의 칵테일이다.",
- "image": "/images/Whiskey Sour.jpeg",
- "alcohol": 18,
- "difficulty": "Medium",
- "ingredients": [
- {"name": "버번 위스키","amount": "45ml"},
- {"name": "레몬 주스","amount": "30ml"},
- {"name": "설탕 시럽","amount": "15ml"},
- {"name": "계란 흰자","amount": "1개 (선택)"},
- {"name": "앙고스투라 비터즈","amount": "1-2대시"}
- ],
- "garnish": [
- "비터즈 (한 대시)"
- ],
- "glass": "올드 패션드 잔",
- "method": "셰이커에 얼음과 모든 재료를 넣고 잘 흔든 후, 스트레인해서 올드 패션드 잔에 따릅니다.",
- "taste": {
- "sweet": 3,
- "sour": 5,
- "bitter": 1,
- "strong": 3
- },
- "story": ""
- },
- {
- "id": "12",
- "name": "Mint Julep",
- "nameKo": "민트 줄렙",
- "category": "위스키 베이스",
- "description": "민트 잎의 시원하고 청량한 향에 버번 위스키의 달콤하고 묵직한 맛이 뒤따라오는 상쾌한 칵테일이다. 설탕 시럽이 목넘김을 부드럽게 만들어주고, 얼음이 녹으면서 점점 더 깔끔한 맛으로 바뀐다. 뜨거운 여름에 특히 잘 어울리는, 시원한 허브 향이 돋보이는 정통 위스키 칵테일이다.",
- "image": "/images/Mint Julep.jpeg",
- "alcohol": 20,
- "difficulty": "Easy",
- "ingredients": [
- {"name": "버번 위스키", "amount": "60ml"},
- {"name": "설탕 시럽", "amount": "15ml"},
- {"name": "민트 잎", "amount": "10-12장"},
- {"name": "얼음", "amount": "적당량"}
- ],
- "garnish": [
- "민트 잎"
- ],
- "glass": "잔",
- "method": "민트 잎과 설탕 시럽을 넣고 머들러로 가볍게 으깬 후, 버번 위스키와 얼음을 넣고 잘 섞습니다.",
- "taste": {
- "sweet": 4,
- "sour": 1,
- "bitter": 1,
- "strong": 4
- },
- "story": ""
- },
- {
- "id": "13",
- "name": "Mojito",
- "nameKo": "모히토",
- "category": "럼 베이스",
- "description": "화이트 럼의 가벼운 단맛 위에 라임의 상큼함과 신선한 민트 향이 더해져 매우 청량감 있는 칵테일이다. 설탕이 은은한 단맛을 더해주고, 탄산수의 톡 쏘는 느낌이 기분 좋게 이어진다. 시원하고 가벼운 맛으로 해변이나 여름 밤을 떠올리게 하는 대표적인 쿠바 스타일 칵테일이다.",
- "image": "/images/Mojito.jpeg",
- "alcohol": 12,
- "difficulty": "Medium",
- "ingredients": [
- {"name": "화이트 럼", "amount": "45ml"},
- {"name": "라임 주스", "amount": "30ml"},
- {"name": "설탕", "amount": "2티스푼"},
- {"name": "민트 잎", "amount": "6-8장"},
- {"name": "탄산수", "amount": "적당량"},
- {"name": "얼음", "amount": "적당량"}
- ],
- "garnish": [
- "민트 sprig",
- "라임 슬라이스"
- ],
- "glass": "하이볼 글라스",
- "method": "하이볼 글라스에 민트 잎과 설탕, 라임 주스를 넣고 머들러로 가볍게 으깬 후, 럼과 얼음을 넣고 탄산수로 잔을 채우고 바 스푼으로 부드럽게 섞어줍니다.",
- "taste": {
- "sweet": 4,
- "sour": 4,
- "bitter": 1,
- "strong": 2
- },
- "story": ""
- },
- {
- "id": "14",
- "name": "Pina Colada",
- "nameKo": "피나 콜라다",
- "category": "럼 베이스",
- "description": "화이트 럼의 깔끔한 단맛을 베이스로 파인애플 주스의 열대 과일 풍미와 코코넛 크림의 부드러운 고소함이 만나 달콤하고 크리미한 트로피컬 칵테일을 만든다. 디저트처럼 풍부한 질감에 달달하면서도 향긋해 휴양지에서 마시는 듯한 여유로운 기분을 준다.",
- "image": "/images/Pina Colada.jpeg",
- "alcohol": 15,
- "difficulty": "Easy",
- "ingredients": [
- {"name": "화이트 럼", "amount": "45ml"},
- {"name": "파인애플 주스", "amount": "90ml"},
- {"name": "코코넛 크림", "amount": "30ml"}
- ],
- "garnish": [
- "파인애플 조각"
- ],
- "glass": "하이볼 글라스",
- "method": "셰이커에 모든 재료와 얼음을 넣고 잘 흔든 후, 스트레인해서 하이볼 글라스에 따릅니다.",
- "taste": {
- "sweet": 5,
- "sour": 3,
- "bitter": 1,
- "strong": 2
- },
- "story": ""
- },
- {
- "id": "15",
- "name": "Daiquiri",
- "nameKo": "다이키리",
- "category": "럼 베이스",
- "description": "화이트 럼의 깔끔한 단맛, 라임 주스의 톡 쏘는 산미, 설탕 시럽의 은은한 단맛이 깔끔하고 직선적인 맛을 만든다. 재료는 단순하지만 맛의 밸런스가 뛰어난 클래식 칵테일로, 상큼하고 시원한 한 모금 뒤에 럼의 부드러운 여운이 남는 것이 특징이다.",
- "image": "/images/Daiquiri.jpeg",
- "alcohol": 18,
- "difficulty": "Easy",
- "ingredients": [
- {"name": "화이트 럼", "amount": "45ml"},
- {"name": "라임 주스", "amount": "25ml"},
- {"name": "설탕 시럽","amount": "15ml"}
- ],
- "garnish": [
- "라임 웨지"
- ],
- "glass": "칵테일 잔",
- "method": "셰이커에 모든 재료와 얼음을 넣고 잘 흔든 후, 스트레인해서 칵테일 잔에 따릅니다.",
- "taste": {
- "sweet": 3,
- "sour": 5,
- "bitter": 1,
- "strong": 3
- },
- "story": ""
- },
{
- "id": "16",
- "name": "Cuba Libre",
- "nameKo": "쿠바 리브레",
- "category": "럼 베이스",
- "description": "화이트 럼의 가벼운 단맛에 콜라의 달콤함과 라임 주스의 상큼함이 더해져 시원하고 친숙한 맛이 난다. 콜라 덕분에 마시기 쉽고 청량감이 높아 일상적으로 즐기기 좋은 캐주얼 칵테일이다. 럼 콜라에 상큼함까지 더한 완성형 버전이라 할 수 있다.",
- "image": "/images/Cuba Libre.jpeg",
- "alcohol": 12,
- "difficulty": "Easy",
- "ingredients": [
- {"name": "화이트 럼","amount": "45ml"},
- {"name": "콜라","amount": "적당량"},
- {"name": "라임 주스","amount": "15ml"}
- ],
- "garnish": [
- "라임 웨지"
- ],
- "glass": "하이볼 글라스",
- "method": "하이볼 글라스에 얼음을 채우고 럼과 라임 주스를 넣은 후, 콜라로 잔을 채우고 잘 섞어줍니다.",
- "taste": {
- "sweet": 4,
- "sour": 3,
- "bitter": 1,
- "strong": 2
- },
- "story": ""
- },
- {
- "id": "17",
- "name": "Margarita",
- "nameKo": "마르가리타",
- "category": "데킬라 베이스",
- "description": "테킬라의 향긋한 아가베 풍미에 라임 주스의 강한 산미, 오렌지 리큐어의 달콤한 과일향이 어우러져 상큼하면서도 짭짤한 맛을 낸다. 잔 테두리에 소금을 묻히는 솔트 림이 새콤·짭짤 조합을 강조해주며, 한 모금만 마셔도 강렬한 멕시코의 느낌이 살아난다. 시원하고 도전적인 맛을 좋아하는 사람에게 인기 있다.",
- "image": "/images/Margarita.jpeg",
- "alcohol": 25,
- "difficulty": "Medium",
- "ingredients": [
- {"name": "테킬라","amount": "45ml"},
- {"name": "오렌지 리큐어 (트리플 섹)","amount": "30ml"},
- {"name": "라임 주스","amount": "15ml"},
- {"name": "소금","amount": "잔 테두리 장식용"}
- ],
- "garnish": [
- "솔트 림",
- "라임 웨지"
- ],
- "glass": "마르가리타 잔",
- "method": "잔 테두리에 솔트 림을 만든 후, 테킬라, 오렌지 리큐어, 라임 주스를 셰이커에 넣고 얼음과 함께 흔들어 따라줍니다.",
- "taste": {
- "sweet": 3,
- "sour": 5,
- "bitter": 1,
- "strong": 4
- },
- "story": ""
- },
- {
- "id": "18",
- "name": "Tequila Sunrise",
- "nameKo": "데킬라 선라이즈",
- "category": "데킬라 베이스",
- "description": "테킬라의 깔끔한 풍미에 오렌지 주스의 달콤한 과일향이 어우러지고, 그레나딘 시럽이 아래에 깔리며 달콤하고 부드러운 여운을 만든다. 이름처럼 ‘일출’처럼 보이는 아름다운 층이 특징이며, 맛은 부드럽고 달달해 누구나 마시기 쉬운 스타일이다.",
- "image": "/images/Tequila Sunrise.jpeg",
- "alcohol": 15,
- "difficulty": "Easy",
- "ingredients": [
- {"name": "테킬라", "amount": "45ml"},
- {"name": "오렌지 주스", "amount": "90ml"},
- {"name": "그레나딘 시럽", "amount": "15ml"}
- ],
- "garnish": [
- "오렌지 웨지"
- ],
- "glass": "하이볼 글라스",
- "method": "하이볼 글라스에 얼음을 채우고 테킬라와 오렌지 주스를 넣은 후, 그레나딘 시럽을 천천히 부어 층을 만듭니다.",
- "taste": {
- "sweet": 5,
- "sour": 2,
- "bitter": 1,
- "strong": 2
- },
- "story": ""
- },
- {
- "id": "19",
- "name": "Paloma",
- "nameKo": "팔로마",
- "category": "데킬라 베이스",
- "description": "테킬라의 산뜻한 향에 자몽 주스의 쌉싸름하고 상큼한 풍미, 탄산수의 청량감이 더해져 깔끔하고 시원한 맛을 낸다. 마르가리타보다 가볍고 더 상큼한 느낌이라 가볍게 마시기 좋고, 과일 향이 부드럽게 이어지며 뒷맛이 매우 깔끔하다.",
- "image": "/images/Paloma.jpeg",
- "alcohol": 12,
- "difficulty": "Easy",
- "ingredients": [
- {"name": "테킬라", "amount": "45ml"},
- {"name": "자몽 주스", "amount": "60ml"},
- {"name": "탄산수", "amount": "적당량"}
- ],
- "garnish": [
- "자몽 웨지"
- ],
- "glass": "하이볼 글라스",
- "method": "하이볼 글라스에 얼음을 채우고 테킬라와 자몽 주스를 넣은 후, 탄산수로 채우고 잘 섞어줍니다.",
- "taste": {
- "sweet": 3,
- "sour": 4,
- "bitter": 3,
- "strong": 2
- },
- "story": ""
- },
- {
- "id": "20",
- "name": "Matador",
- "nameKo": "마타도르",
- "category": "데킬라 베이스",
- "description": "데킬라의 향긋한 아가베 향과 파인애플 주스의 달콤한 열대 과일 맛, 라임 주스의 산미가 조화된 밝고 상큼한 칵테일이다. 마시기 부드럽고 과일향이 풍부해 산뜻하면서도 달콤한 여운이 남는다. 여름 휴양지를 떠올리게 하는 가벼운 트로피컬 스타일이다.",
- "image": "/images/Matador.jpeg",
- "alcohol": 15,
- "difficulty": "Easy",
- "ingredients": [
- {"name": "데킬라", "amount": "45ml"},
- {"name": "파인애플 주스", "amount": "60ml"},
- {"name": "라임 주스", "amount": "15ml"}
- ],
- "garnish": [
- "라임 웨지"
- ],
- "glass": "칵테일 글라스",
- "method": "쉐이커에 얼음을 넣고 데킬라, 파인애플 주스, 라임 주스를 넣고 잘 흔든 후, 칵테일 글라스에 따라줍니다.",
- "taste": {
- "sweet": 4,
- "sour": 4,
- "bitter": 1,
- "strong": 3
- },
- "story": ""
- }
-]
\ No newline at end of file
+ "cocktails": [
+ {
+ "id": "moscow-mule",
+ "name": "Moscow Mule",
+ "nameKo": "모스코 뮬",
+ "category": "Vodka Based",
+ "description": "보드카의 깔끔함과 진저에일의 톡 쏘는 생강향이 어우러진 청량한 칵테일",
+ "image": "/images/Moscow Mule.jpeg",
+ "alcohol": 12,
+ "difficulty": "Easy",
+ "ingredients": [
+ { "name": "Vodka", "amount": "45ml" },
+ { "name": "Ginger Ale", "amount": "Fill" },
+ { "name": "Lime Juice", "amount": "15ml" }
+ ],
+ "instructions": [
+ "하이볼 잔에 얼음을 채우고 보드카와 라임 주스를 넣습니다.",
+ "진저 에일을 가득 채우고 살짝 저어줍니다.",
+ "이후 레몬이나 라임 웨지로 가니쉬하면 완성."
+ ],
+ "garnish": ["Lime Wedge"],
+ "glass": "Highball Glass",
+ "method": "Build",
+ "taste": { "sweet": 50, "sour": 60, "bitter": 10, "strong": 40 },
+ "story": "1940년대 미국에서 보드카 재고를 처리하기 위해 탄생한 이 칵테일은 구리 잔에 담겨 나오는 전통으로 유명합니다.",
+ "popularity": 98, "rating": 4.9, "reviews": 512
+ },
+ {
+ "id": "cosmopolitan",
+ "name": "Cosmopolitan",
+ "nameKo": "코스모폴리탄",
+ "category": "Vodka Based",
+ "description": "상큼한 크랜베리와 시트러스 향이 돋보이는 세련된 핑크빛 칵테일",
+ "image": "/images/Cosmopolitan.jpeg",
+ "alcohol": 20,
+ "difficulty": "Medium",
+ "ingredients": [
+ { "name": "Vodka Citron", "amount": "40ml" },
+ { "name": "Cranberry Juice", "amount": "30ml" },
+ { "name": "Cointreau", "amount": "15ml" },
+ { "name": "Lime Juice", "amount": "15ml" }
+ ],
+ "instructions": [
+ "셰이커에 얼음과 주재료를 넣고 8~10초정도 셰이킹합니다.",
+ "더블 스트레인으로 걸러내 차갑게 식힌 마티니 글라스에 따릅니다.",
+ "라임 웨지나 레몬 필 트위스트로 가니쉬합니다."
+ ],
+ "garnish": ["Lime Wedge", "Lemon Twist"],
+ "glass": "Martini Glass",
+ "method": "Shake",
+ "taste": { "sweet": 60, "sour": 70, "bitter": 10, "strong": 60 },
+ "story": "드라마 '섹스 앤 더 시티'를 통해 전 세계적인 인기를 얻은 이 칵테일은 도시적인 여성미를 상징합니다.",
+ "popularity": 96, "rating": 4.7, "reviews": 425
+ },
+ {
+ "id": "bloody-mary",
+ "name": "Bloody Mary",
+ "nameKo": "블러디 메리",
+ "category": "Vodka Based",
+ "description": "토마토 주스와 향신료가 어우러진 독특하고 짭짤한 풍미의 해장 칵테일",
+ "image": "/images/Bloody Mary.jpeg",
+ "alcohol": 14,
+ "difficulty": "Hard",
+ "ingredients": [
+ { "name": "Vodka", "amount": "45ml" },
+ { "name": "Tomato Juice", "amount": "90ml" },
+ { "name": "Lemon Juice", "amount": "10ml" },
+ { "name": "Tabasco", "amount": "2 dashes" },
+ { "name": "Salt/Pepper", "amount": "Pinch" }
+ ],
+ "instructions": [
+ "셰이커에 모든 재료를 넣고 잘 흔듭니다.",
+ "얼음을 가득 채운 하이볼 글라스에 따라줍니다.",
+ "소금과 후추로 장식합니다."
+ ],
+ "garnish": ["Celery Stick", "Lemon Wedge"],
+ "glass": "Highball Glass",
+ "method": "Shake",
+ "taste": { "sweet": 20, "sour": 40, "bitter": 30, "strong": 45 },
+ "story": "잉글랜드 여왕 메리 1세의 별명에서 이름을 따왔으며, 서구권에서는 숙취 해소용 칵테일로 사랑받습니다.",
+ "popularity": 88, "rating": 4.2, "reviews": 215
+ },
+ {
+ "id": "black-russian",
+ "name": "Black Russian",
+ "nameKo": "블랙 러시안",
+ "category": "Vodka Based",
+ "description": "보드카의 강렬함과 커피의 달콤쌉싸름한 풍미가 만난 묵직한 한 잔",
+ "image": "/images/Black Russian.jpeg",
+ "alcohol": 25,
+ "difficulty": "Easy",
+ "ingredients": [
+ { "name": "Vodka", "amount": "50ml" },
+ { "name": "Coffee Liqueur", "amount": "25ml" }
+ ],
+ "instructions": [
+ "얼음을 채운 올드 패션드 잔에 보드카와 커피 리큐어를 붓습니다.",
+ "가볍게 저어줍니다."
+ ],
+ "garnish": [],
+ "glass": "Old Fashioned Glass",
+ "method": "Build",
+ "taste": { "sweet": 60, "sour": 0, "bitter": 40, "strong": 80 },
+ "story": "냉전 시대의 어두운 분위기를 담아 벨기에 바텐더가 고안한 칵테일로, 깔끔하면서도 묵직한 맛이 특징입니다.",
+ "popularity": 92, "rating": 4.5, "reviews": 310
+ },
+ {
+ "id": "gin-tonic",
+ "name": "Gin Tonic",
+ "nameKo": "진 토닉",
+ "category": "Gin Based",
+ "description": "진의 허브향과 토닉 워터의 탄산이 만나 입안을 깨끗하게 비워주는 국민 칵테일",
+ "image": "/images/Gin Tonic.jpeg",
+ "alcohol": 12,
+ "difficulty": "Easy",
+ "ingredients": [
+ { "name": "Dry Gin", "amount": "45ml" },
+ { "name": "Tonic Water", "amount": "Fill" },
+ { "name": "Lime Wedge", "amount": "1ea" }
+ ],
+ "instructions": [
+ "하이볼 글라스에 얼음을 가득 채웁니다.",
+ "진을 붓고 토닉 워터로 잔을 채웁니다.",
+ "라임 또는 레몬 웨지를 짜서 넣고 가볍게 저어줍니다."
+ ],
+ "garnish": ["Lime Wedge"],
+ "glass": "Highball Glass",
+ "method": "Build",
+ "taste": { "sweet": 40, "sour": 50, "bitter": 30, "strong": 35 },
+ "story": "영국 동인도 회사의 군인들이 말라리아를 예방하기 위해 퀴닌(토닉 성분)을 진과 섞어 마신 것에서 유래되었습니다.",
+ "popularity": 99, "rating": 4.8, "reviews": 890
+ },
+ {
+ "id": "martini",
+ "name": "Martini",
+ "nameKo": "마티니",
+ "category": "Gin Based",
+ "description": "드라이 진과 베르무트의 조화가 만들어내는 '칵테일의 왕'",
+ "image": "/images/Martini.jpeg",
+ "alcohol": 30,
+ "difficulty": "Medium",
+ "ingredients": [
+ { "name": "Dry Gin", "amount": "60ml" },
+ { "name": "Dry Vermouth", "amount": "10ml" }
+ ],
+ "instructions": [
+ "믹싱 글라스에 얼음과 모든 재료를 넣고 잘 젓거나 흔듭니다.",
+ "스트레인해서 차갑게 식힌 칵테일 잔에 따릅니다.",
+ "올리브 또는 레몬 껍질로 장식합니다."
+ ],
+ "garnish": ["Olive", "Lemon Twist"],
+ "glass": "Cocktail Glass",
+ "method": "Stir",
+ "taste": { "sweet": 10, "sour": 10, "bitter": 40, "strong": 95 },
+ "story": "제임스 본드의 '흔들지 말고 저어서'라는 대사로 유명한, 가장 정통성 있는 드라이 칵테일입니다.",
+ "popularity": 97, "rating": 4.6, "reviews": 560
+ },
+ {
+ "id": "negroni",
+ "name": "Negroni",
+ "nameKo": "네그로니",
+ "category": "Gin Based",
+ "description": "씁쓸한 캄파리와 달콤한 베르무트의 밸런스가 매력적인 식전주",
+ "image": "/images/Negroni.jpeg",
+ "alcohol": 25,
+ "difficulty": "Easy",
+ "ingredients": [
+ { "name": "Dry Gin", "amount": "30ml" },
+ { "name": "Campari", "amount": "30ml" },
+ { "name": "Sweet Vermouth", "amount": "30ml" }
+ ],
+ "instructions": [
+ "얼음을 채운 올드 패션드 잔에 모든 재료를 붓고 잘 저어줍니다.",
+ "오렌지 껍질로 장식합니다."
+ ],
+ "garnish": ["Orange Peel"],
+ "glass": "Old Fashioned Glass",
+ "method": "Build",
+ "taste": { "sweet": 50, "sour": 20, "bitter": 80, "strong": 70 },
+ "story": "이탈리아의 네그로니 백작이 진 토닉 대신 더 강한 술을 원하여 주문했다는 설이 있는 정통 식전 칵테일입니다.",
+ "popularity": 94, "rating": 4.8, "reviews": 320
+ },
+ {
+ "id": "singapore-sling",
+ "name": "Singapore Sling",
+ "nameKo": "싱가포르 슬링",
+ "category": "Gin Based",
+ "description": "열대 과일의 달콤함과 진의 청량함이 만난 화려한 핑크빛 칵테일",
+ "image": "/images/Singapore Sling.jpeg",
+ "alcohol": 15,
+ "difficulty": "Hard",
+ "ingredients": [
+ { "name": "Gin", "amount": "30ml" },
+ { "name": "Cherry Brandy", "amount": "15ml" },
+ { "name": "Pineapple Juice", "amount": "90ml" },
+ { "name": "Lemon Juice", "amount": "15ml" },
+ { "name": "Grenadine", "amount": "10ml" }
+ ],
+ "instructions": [
+ "셰이커에 모든 재료와 얼음을 넣고 잘 흔듭니다.",
+ "스트레인해서 하이볼 잔에 따라줍니다.",
+ "체리나 파인애플 조각으로 장식합니다."
+ ],
+ "garnish": ["Cherry", "Pineapple Slice"],
+ "glass": "Highball Glass",
+ "method": "Shake",
+ "taste": { "sweet": 80, "sour": 50, "bitter": 20, "strong": 40 },
+ "story": "싱가포르 래플스 호텔에서 탄생한 이 술은 동양의 신비로운 노을 빛깔을 닮았다고 평가받습니다.",
+ "popularity": 91, "rating": 4.5, "reviews": 280
+ },
+ {
+ "id": "old-fashioned",
+ "name": "Old Fashioned",
+ "nameKo": "올드 패션드",
+ "category": "Whiskey Based",
+ "description": "위스키 본연의 맛을 극대화한 가장 클래식한 위스키 칵테일",
+ "image": "/images/Old Fashioned.jpeg",
+ "alcohol": 32,
+ "difficulty": "Medium",
+ "ingredients": [
+ { "name": "Bourbon Whiskey", "amount": "60ml" },
+ { "name": "Simple Syrup", "amount": "5ml" },
+ { "name": "Angostura Bitters", "amount": "3 dashes" }
+ ],
+ "instructions": [
+ "올드 패션드 잔에 설탕과 비터즈를 넣습니다.",
+ "위스키와 얼음을 넣고 잘 희석될 때까지 충분히 섞어줍니다.",
+ "오렌지 껍질의 오일을 잔 입구에 바른 뒤 잔에 넣습니다."
+ ],
+ "garnish": ["Orange Peel", "Cherry"],
+ "glass": "Old Fashioned Glass",
+ "method": "Stir",
+ "taste": { "sweet": 30, "sour": 0, "bitter": 50, "strong": 95 },
+ "story": "19세기부터 존재해온 '가장 오래된 방식'의 칵테일로, 진정한 위스키 애호가들이 가장 선호하는 메뉴입니다.",
+ "popularity": 97, "rating": 4.9, "reviews": 465
+ },
+ {
+ "id": "manhattan",
+ "name": "Manhattan",
+ "nameKo": "맨해튼",
+ "category": "Whiskey Based",
+ "description": "위스키의 묵직함에 베르무트의 달콤함이 더해진 '칵테일의 여왕'",
+ "image": "/images/Manhattan.jpeg",
+ "alcohol": 30,
+ "difficulty": "Medium",
+ "ingredients": [
+ { "name": "Bourbon Whiskey", "amount": "50ml" },
+ { "name": "Sweet Vermouth", "amount": "25ml" },
+ { "name": "Angostura Bitters", "amount": "2 dashes" }
+ ],
+ "instructions": [
+ "믹싱 글라스에서 재료를 얼음과 함께 섞어 차갑게 만듭니다.",
+ "스트레인해서 차가운 칵테일 잔에 따릅니다.",
+ "체리로 장식합니다."
+ ],
+ "garnish": ["Maraschino Cherry"],
+ "glass": "Cocktail Glass",
+ "method": "Stir",
+ "taste": { "sweet": 40, "sour": 0, "bitter": 30, "strong": 90 },
+ "story": "뉴욕 맨해튼 클럽에서 윈스턴 처칠의 어머니가 주최한 파티에서 처음 선보였다는 설이 유명합니다.",
+ "popularity": 93, "rating": 4.7, "reviews": 312
+ },
+ {
+ "id": "whiskey-sour",
+ "name": "Whiskey Sour",
+ "nameKo": "위스키 사워",
+ "category": "Whiskey Based",
+ "description": "위스키의 강한 맛을 레몬과 설탕이 부드럽고 상큼하게 감싸주는 맛",
+ "image": "/images/Whiskey Sour.jpeg",
+ "alcohol": 18,
+ "difficulty": "Medium",
+ "ingredients": [
+ { "name": "Bourbon Whiskey", "amount": "45ml" },
+ { "name": "Lemon Juice", "amount": "30ml" },
+ { "name": "Simple Syrup", "amount": "15ml" },
+ { "name": "Egg White", "amount": "1ea (Optional)" }
+ ],
+ "instructions": [
+ "셰이커에 모든 재료를 넣고 잘 흔듭니다. 계란 흰자 사용 시 드라이 셰이킹을 먼저 하세요.",
+ "스트레인해서 얼음이 담긴 올드 패션드 잔에 따릅니다.",
+ "비터즈를 한 대시 뿌려 마무리합니다."
+ ],
+ "garnish": ["Lemon Wheel", "Cherry"],
+ "glass": "Old Fashioned Glass",
+ "method": "Shake",
+ "taste": { "sweet": 60, "sour": 80, "bitter": 20, "strong": 50 },
+ "story": "항해사들이 괴혈병 예방을 위해 레몬을 위스키에 섞어 마시던 것에서 발전한 역사 깊은 레시피입니다.",
+ "popularity": 95, "rating": 4.8, "reviews": 405
+ },
+ {
+ "id": "mint-julep",
+ "name": "Mint Julep",
+ "nameKo": "민트 줄렙",
+ "category": "Whiskey Based",
+ "description": "신선한 민트 향이 코끝을 찌르는 극강의 청량감을 가진 위스키 칵테일",
+ "image": "/images/Mint Julep.jpeg",
+ "alcohol": 22,
+ "difficulty": "Medium",
+ "ingredients": [
+ { "name": "Bourbon Whiskey", "amount": "60ml" },
+ { "name": "Simple Syrup", "amount": "15ml" },
+ { "name": "Fresh Mint", "amount": "12 leaves" }
+ ],
+ "instructions": [
+ "민트 잎과 시럽을 잔 바닥에서 가볍게 머들링합니다.",
+ "크러쉬드 아이스를 가득 채우고 위스키를 붓습니다.",
+ "잔 겉면에 성에가 낄 때까지 충분히 저어줍니다."
+ ],
+ "garnish": ["Mint Sprig"],
+ "glass": "Julep Cup or Rock Glass",
+ "method": "Muddle/Stir",
+ "taste": { "sweet": 50, "sour": 10, "bitter": 10, "strong": 70 },
+ "story": "미국 남부 켄터키 더비 경마 대회의 공식 음료로 지정되어 매년 수만 잔이 소비되는 상징적인 술입니다.",
+ "popularity": 89, "rating": 4.4, "reviews": 185
+ },
+ {
+ "id": "mojito",
+ "name": "Mojito",
+ "nameKo": "모히토",
+ "category": "Rum Based",
+ "description": "라임과 민트의 상큼함이 폭발하는 쿠바의 대표 칵테일",
+ "image": "/images/Mojito.jpeg",
+ "alcohol": 12,
+ "difficulty": "Medium",
+ "ingredients": [
+ { "name": "White Rum", "amount": "45ml" },
+ { "name": "Lime Juice", "amount": "30ml" },
+ { "name": "Sugar", "amount": "2 tsp" },
+ { "name": "Mint Leaves", "amount": "8 leaves" },
+ { "name": "Soda Water", "amount": "Fill" }
+ ],
+ "instructions": [
+ "민트, 설탕, 라임을 잔에 넣고 가볍게 으깹니다.",
+ "럼과 얼음을 넣고 탄산수를 채웁니다.",
+ "바 스푼으로 가볍게 저어 섞어줍니다."
+ ],
+ "garnish": ["Mint Sprig", "Lime Slice"],
+ "glass": "Highball Glass",
+ "method": "Muddle/Build",
+ "taste": { "sweet": 60, "sour": 80, "bitter": 10, "strong": 30 },
+ "story": "소설가 어니스트 헤밍웨이가 사랑한 술로 잘 알려져 있으며, '나의 모히토는 라 보데기타에 있다'는 명언을 남겼습니다.",
+ "popularity": 99, "rating": 4.9, "reviews": 1020
+ },
+ {
+ "id": "pina-colada",
+ "name": "Pina Colada",
+ "nameKo": "피나 콜라다",
+ "category": "Rum Based",
+ "description": "코코넛의 부드러움과 파인애플의 달콤함이 만나 휴양지의 기분을 선사하는 맛",
+ "image": "/images/Pina Colada.jpeg",
+ "alcohol": 12,
+ "difficulty": "Easy",
+ "ingredients": [
+ { "name": "White Rum", "amount": "45ml" },
+ { "name": "Pineapple Juice", "amount": "90ml" },
+ { "name": "Coconut Cream", "amount": "30ml" }
+ ],
+ "instructions": [
+ "셰이커에 모든 재료와 얼음을 넣고 잘 흔듭니다.",
+ "얼음이 담긴 하이볼 잔이나 고블렛 잔에 따릅니다.",
+ "파인애플 조각으로 장식합니다."
+ ],
+ "garnish": ["Pineapple Slice", "Cherry"],
+ "glass": "Highball Glass",
+ "method": "Shake",
+ "taste": { "sweet": 90, "sour": 30, "bitter": 0, "strong": 30 },
+ "story": "푸에르토리코의 공식 음료로 지정될 만큼 사랑받는 칵테일로, 스페인어로 '걸러낸 파인애플'이라는 뜻을 가지고 있습니다.",
+ "popularity": 96, "rating": 4.7, "reviews": 650
+ },
+ {
+ "id": "daiquiri",
+ "name": "Daiquiri",
+ "nameKo": "다이키리",
+ "category": "Rum Based",
+ "description": "럼, 라임, 설탕의 심플하지만 완벽한 황금 비율",
+ "image": "/images/Daiquiri.jpeg",
+ "alcohol": 18,
+ "difficulty": "Easy",
+ "ingredients": [
+ { "name": "White Rum", "amount": "45ml" },
+ { "name": "Lime Juice", "amount": "25ml" },
+ { "name": "Simple Syrup", "amount": "15ml" }
+ ],
+ "instructions": [
+ "셰이커에 모든 재료와 얼음을 넣고 잘 흔듭니다.",
+ "차갑게 식힌 칵테일 잔에 거르며 따릅니다."
+ ],
+ "garnish": ["Lime Wheel"],
+ "glass": "Cocktail Glass",
+ "method": "Shake",
+ "taste": { "sweet": 40, "sour": 80, "bitter": 10, "strong": 50 },
+ "story": "쿠바의 다이키리 광산에서 일하던 미국 엔지니어가 더위를 쫓기 위해 즉석에서 섞어 만든 것에서 시작되었습니다.",
+ "popularity": 92, "rating": 4.6, "reviews": 290
+ },
+ {
+ "id": "cuba-libre",
+ "name": "Cuba Libre",
+ "nameKo": "쿠바 리브레",
+ "category": "Rum Based",
+ "description": "럼과 콜라의 친숙한 조화에 라임의 상큼함이 더해진 캐주얼 칵테일",
+ "image": "/images/Cuba Libre.jpeg",
+ "alcohol": 12,
+ "difficulty": "Easy",
+ "ingredients": [
+ { "name": "White Rum", "amount": "45ml" },
+ { "name": "Cola", "amount": "Fill" },
+ { "name": "Lime Juice", "amount": "15ml" }
+ ],
+ "instructions": [
+ "하이볼 잔에 얼음을 채우고 럼과 라임을 넣습니다.",
+ "콜라를 가득 채운 뒤 가볍게 저어 완성합니다."
+ ],
+ "garnish": ["Lime Wedge"],
+ "glass": "Highball Glass",
+ "method": "Build",
+ "taste": { "sweet": 70, "sour": 40, "bitter": 10, "strong": 35 },
+ "story": "미국-스페인 전쟁 당시 쿠바의 독립을 응원하며 '자유 쿠바 만세(Viva Cuba Libre)'라고 외친 것에서 유래했습니다.",
+ "popularity": 94, "rating": 4.5, "reviews": 430
+ },
+ {
+ "id": "margarita",
+ "name": "Margarita",
+ "nameKo": "마르가리타",
+ "category": "Tequila Based",
+ "description": "테킬라와 라임, 그리고 잔 테두리의 소금이 만드는 단짠의 정석",
+ "image": "/images/Margarita.jpeg",
+ "alcohol": 23,
+ "difficulty": "Medium",
+ "ingredients": [
+ { "name": "Tequila", "amount": "45ml" },
+ { "name": "Triple Sec", "amount": "30ml" },
+ { "name": "Lime Juice", "amount": "15ml" },
+ { "name": "Salt", "amount": "Rim" }
+ ],
+ "instructions": [
+ "잔 테두리에 라임 즙을 묻히고 소금을 찍어 림을 만듭니다.",
+ "셰이커에 재료를 넣고 흔든 뒤, 잔에 얼음을 걸러 따릅니다."
+ ],
+ "garnish": ["Lime Wheel"],
+ "glass": "Margarita Glass",
+ "method": "Shake",
+ "taste": { "sweet": 40, "sour": 80, "bitter": 10, "strong": 65 },
+ "story": "사랑했던 연인 마르가리타를 그리워하며 바텐더가 만들었다는 슬픈 전설을 가진 멕시코 대표 칵테일입니다.",
+ "popularity": 98, "rating": 4.8, "reviews": 720
+ },
+ {
+ "id": "tequila-sunrise",
+ "name": "Tequila Sunrise",
+ "nameKo": "테킬라 선라이즈",
+ "category": "Tequila Based",
+ "description": "오렌지 주스와 시럽의 층이 아름다운 일출을 연상시키는 칵테일",
+ "image": "/images/Tequila Sunrise.jpeg",
+ "alcohol": 12,
+ "difficulty": "Easy",
+ "ingredients": [
+ { "name": "Tequila", "amount": "45ml" },
+ { "name": "Orange Juice", "amount": "90ml" },
+ { "name": "Grenadine", "amount": "15ml" }
+ ],
+ "instructions": [
+ "얼음을 채운 잔에 테킬라와 오렌지 주스를 넣고 섞습니다.",
+ "그레나딘 시럽을 천천히 부어 바닥에 가라앉힙니다. (젓지 마세요)"
+ ],
+ "garnish": ["Orange Slice", "Cherry"],
+ "glass": "Highball Glass",
+ "method": "Build",
+ "taste": { "sweet": 80, "sour": 40, "bitter": 10, "strong": 40 },
+ "story": "롤링 스톤즈의 믹 재거가 멕시코 투어 중 이 술에 반해 전 세계적으로 유명해진 일화가 있습니다.",
+ "popularity": 93, "rating": 4.6, "reviews": 380
+ },
+ {
+ "id": "paloma",
+ "name": "Paloma",
+ "nameKo": "팔로마",
+ "category": "Tequila Based",
+ "description": "자몽의 쌉쌀함과 테킬라의 향이 만나 깔끔하고 청량한 느낌을 주는 술",
+ "image": "/images/Paloma.jpeg",
+ "alcohol": 14,
+ "difficulty": "Easy",
+ "ingredients": [
+ { "name": "Tequila", "amount": "45ml" },
+ { "name": "Grapefruit Juice", "amount": "60ml" },
+ { "name": "Soda Water", "amount": "Fill" }
+ ],
+ "instructions": [
+ "잔 테두리에 소금을 묻히고 얼음을 채웁니다.",
+ "테킬라와 자몽 주스를 넣고 탄산수로 채워 가볍게 섞습니다."
+ ],
+ "garnish": ["Grapefruit Wedge"],
+ "glass": "Highball Glass",
+ "method": "Build",
+ "taste": { "sweet": 40, "sour": 70, "bitter": 40, "strong": 45 },
+ "story": "멕시코에서 마르가리타보다 더 대중적으로 즐겨 마시는 '진짜 국민 테킬라 칵테일'입니다.",
+ "popularity": 90, "rating": 4.5, "reviews": 210
+ },
+ {
+ "id": "matador",
+ "name": "Matador",
+ "nameKo": "마타도르",
+ "category": "Tequila Based",
+ "description": "투우사처럼 정열적이고 달콤한 파인애플 풍미의 칵테일",
+ "image": "/images/Matador.jpeg",
+ "alcohol": 15,
+ "difficulty": "Easy",
+ "ingredients": [
+ { "name": "Tequila", "amount": "45ml" },
+ { "name": "Pineapple Juice", "amount": "60ml" },
+ { "name": "Lime Juice", "amount": "15ml" }
+ ],
+ "instructions": [
+ "셰이커에 모든 재료를 넣고 얼음과 함께 잘 흔듭니다.",
+ "차갑게 식힌 칵테일 잔에 따릅니다."
+ ],
+ "garnish": ["Lime Wedge"],
+ "glass": "Cocktail Glass",
+ "method": "Shake",
+ "taste": { "sweet": 70, "sour": 50, "bitter": 10, "strong": 45 },
+ "story": "투우사를 뜻하는 '마타도르'라는 이름답게 강렬한 테킬라를 파인애플이 부드럽게 감싸주는 매력적인 맛입니다.",
+ "popularity": 87, "rating": 4.3, "reviews": 145
+ },
+ {
+ "id": "sidecar",
+ "name": "Sidecar",
+ "nameKo": "사이드카",
+ "category": "Brandy Based",
+ "description": "브랜디의 풍부한 향에 오렌지와 레몬의 상큼함이 더해진 클래식의 정수",
+ "image": "/images/Sidecar.jpeg",
+ "alcohol": 25,
+ "difficulty": "Medium",
+ "ingredients": [
+ { "name": "Cognac", "amount": "50ml" },
+ { "name": "Cointreau", "amount": "20ml" },
+ { "name": "Lemon Juice", "amount": "20ml" }
+ ],
+ "instructions": [
+ "칵테일 잔 테두리에 설탕을 묻혀 리밍합니다(선택 사항).",
+ "셰이커에 모든 재료와 얼음을 넣고 강하게 흔듭니다.",
+ "식힌 잔에 내용물만 걸러서 따릅니다."
+ ],
+ "garnish": ["Lemon Twist"],
+ "glass": "Cocktail Glass",
+ "method": "Shake",
+ "taste": { "sweet": 40, "sour": 70, "bitter": 10, "strong": 75 },
+ "story": "제1차 세계대전 당시 오토바이 사이드카를 타고 다니던 장교를 위해 만들어졌다는 유래가 가장 유명합니다.",
+ "popularity": 92, "rating": 4.7, "reviews": 310
+ },
+ {
+ "id": "white-lady",
+ "name": "White Lady",
+ "nameKo": "화이트 레이디",
+ "category": "Gin Based",
+ "description": "눈처럼 하얀 외관과 깔끔하고 드라이한 맛이 돋보이는 우아한 칵테일",
+ "image": "/images/White Lady.jpeg",
+ "alcohol": 22,
+ "difficulty": "Medium",
+ "ingredients": [
+ { "name": "Dry Gin", "amount": "40ml" },
+ { "name": "Triple Sec", "amount": "30ml" },
+ { "name": "Lemon Juice", "amount": "20ml" }
+ ],
+ "instructions": [
+ "셰이커에 모든 재료와 얼음을 넣습니다.",
+ "충분히 차가워질 때까지 셰이킹합니다.",
+ "차갑게 식힌 칵테일 잔에 따릅니다."
+ ],
+ "garnish": ["Lemon Peel"],
+ "glass": "Cocktail Glass",
+ "method": "Shake",
+ "taste": { "sweet": 30, "sour": 70, "bitter": 10, "strong": 65 },
+ "story": "해리 맥켈혼이 처음 고안했을 당시에는 민트 리큐르를 사용했으나, 나중에 진 베이스로 바뀌며 완성되었습니다.",
+ "popularity": 89, "rating": 4.5, "reviews": 195
+ },
+ {
+ "id": "long-island-iced-tea",
+ "name": "Long Island Iced Tea",
+ "nameKo": "롱 아일랜드 아이스 티",
+ "category": "Mixed Spirit",
+ "description": "5가지 술이 섞여 홍차 맛을 내는, 도수가 높지만 마시기 편한 칵테일",
+ "image": "/images/Long Island Iced Tea.jpeg",
+ "alcohol": 28,
+ "difficulty": "Hard",
+ "ingredients": [
+ { "name": "Vodka", "amount": "15ml" },
+ { "name": "Gin", "amount": "15ml" },
+ { "name": "White Rum", "amount": "15ml" },
+ { "name": "Tequila", "amount": "15ml" },
+ { "name": "Triple Sec", "amount": "15ml" },
+ { "name": "Lemon Juice", "amount": "20ml" },
+ { "name": "Cola", "amount": "Fill" }
+ ],
+ "instructions": [
+ "콜라를 제외한 모든 재료를 얼음이 든 하이볼 잔에 넣습니다.",
+ "콜라를 채워 홍차 색을 냅니다.",
+ "가볍게 저어준 뒤 레몬 웨지로 장식합니다."
+ ],
+ "garnish": ["Lemon Slice"],
+ "glass": "Highball Glass",
+ "method": "Build",
+ "taste": { "sweet": 60, "sour": 50, "bitter": 10, "strong": 90 },
+ "story": "실제 홍차는 들어가지 않지만 콜라와 레몬즙의 조화로 홍차 맛이 나며, 별명은 '작업주'로 통합니다.",
+ "popularity": 99, "rating": 4.6, "reviews": 1200
+ },
+ {
+ "id": "amaretto-sour",
+ "name": "Amaretto Sour",
+ "nameKo": "아마레또 사워",
+ "category": "Liqueur Based",
+ "description": "아몬드 향의 달콤한 리큐르와 레몬의 산미가 조화로운 중독성 있는 맛",
+ "image": "/images/Amaretto Sour.jpeg",
+ "alcohol": 12,
+ "difficulty": "Medium",
+ "ingredients": [
+ { "name": "Amaretto", "amount": "45ml" },
+ { "name": "Lemon Juice", "amount": "30ml" },
+ { "name": "Simple Syrup", "amount": "15ml" },
+ { "name": "Egg White", "amount": "1ea (Optional)" }
+ ],
+ "instructions": [
+ "셰이커에 모든 재료를 넣고 얼음 없이 먼저 흔들어 거품을 냅니다(드라이 셰이킹).",
+ "얼음을 넣고 다시 한 번 세게 흔듭니다.",
+ "얼음이 든 잔에 따릅니다."
+ ],
+ "garnish": ["Maraschino Cherry", "Lemon Wheel"],
+ "glass": "Old Fashioned Glass",
+ "method": "Shake",
+ "taste": { "sweet": 80, "sour": 60, "bitter": 20, "strong": 30 },
+ "story": "이탈리아의 아마레또 리큐르를 가장 대중적으로 즐길 수 있는 방법으로 사랑받습니다.",
+ "popularity": 94, "rating": 4.8, "reviews": 560
+ },
+ {
+ "id": "espresso-martini",
+ "name": "Espresso Martini",
+ "nameKo": "에스프레소 마티니",
+ "category": "Vodka Based",
+ "description": "진한 에스프레소의 풍미와 보드카가 만난 현대적인 클래식 칵테일",
+ "image": "/images/Espresso Martini.jpeg",
+ "alcohol": 18,
+ "difficulty": "Hard",
+ "ingredients": [
+ { "name": "Vodka", "amount": "50ml" },
+ { "name": "Espresso Shot", "amount": "30ml" },
+ { "name": "Coffee Liqueur", "amount": "15ml" },
+ { "name": "Simple Syrup", "amount": "10ml" }
+ ],
+ "instructions": [
+ "갓 추출한 에스프레소를 살짝 식힙니다.",
+ "셰이커에 모든 재료와 얼음을 가득 넣고 강하게 흔들어 거품을 냅니다.",
+ "거품이 잘 살도록 칵테일 잔에 따릅니다."
+ ],
+ "garnish": ["3 Coffee Beans"],
+ "glass": "Cocktail Glass",
+ "method": "Shake",
+ "taste": { "sweet": 50, "sour": 10, "bitter": 60, "strong": 60 },
+ "story": "런던의 바텐더 딕 브래드셀이 한 모델의 '나를 깨워주고 취하게 해줄 술'을 달라는 요청에 만들었습니다.",
+ "popularity": 97, "rating": 4.9, "reviews": 840
+ },
+ {
+ "id": "aviation",
+ "name": "Aviation",
+ "nameKo": "에비에이션",
+ "category": "Gin Based",
+ "description": "보라색 하늘을 연상시키는 신비로운 색감의 꽃향기 가득한 칵테일",
+ "image": "/images/Aviation.jpeg",
+ "alcohol": 24,
+ "difficulty": "Hard",
+ "ingredients": [
+ { "name": "Dry Gin", "amount": "45ml" },
+ { "name": "Maraschino Liqueur", "amount": "15ml" },
+ { "name": "Lemon Juice", "amount": "15ml" },
+ { "name": "Crème de Violette", "amount": "10ml" }
+ ],
+ "instructions": [
+ "모든 재료를 셰이커에 넣고 얼음과 함께 흔듭니다.",
+ "차갑게 식힌 잔에 더블 스트레인하여 따릅니다."
+ ],
+ "garnish": ["Cherry"],
+ "glass": "Cocktail Glass",
+ "method": "Shake",
+ "taste": { "sweet": 30, "sour": 60, "bitter": 20, "strong": 70 },
+ "story": "20세기 초 비행기 발명을 기념하여 만들어진 이 술은 바이올렛 리큐르가 선사하는 푸른 빛이 특징입니다.",
+ "popularity": 85, "rating": 4.4, "reviews": 160
+ },
+ {
+ "id": "sex-on-the-beach",
+ "name": "Sex on the Beach",
+ "nameKo": "섹스 온 더 비치",
+ "category": "Vodka Based",
+ "description": "복숭아와 열대 과일의 달콤함이 어우러진 화려하고 마시기 쉬운 칵테일",
+ "image": "/images/Sex on the Beach.jpeg",
+ "alcohol": 10,
+ "difficulty": "Easy",
+ "ingredients": [
+ { "name": "Vodka", "amount": "40ml" },
+ { "name": "Peach Schnapps", "amount": "20ml" },
+ { "name": "Orange Juice", "amount": "40ml" },
+ { "name": "Cranberry Juice", "amount": "40ml" }
+ ],
+ "instructions": [
+ "모든 재료를 셰이커에 넣고 잘 흔듭니다.",
+ "얼음이 든 하이볼 잔에 내용물을 따릅니다."
+ ],
+ "garnish": ["Orange Slice"],
+ "glass": "Highball Glass",
+ "method": "Shake",
+ "taste": { "sweet": 90, "sour": 40, "bitter": 0, "strong": 30 },
+ "story": "플로리다의 한 바텐더가 휴양지 관광객들의 특징을 따서 이름 붙였으며, 영화 '칵테일'을 통해 유명해졌습니다.",
+ "popularity": 95, "rating": 4.5, "reviews": 680
+ },
+ {
+ "id": "french-75",
+ "name": "French 75",
+ "nameKo": "프렌치 75",
+ "category": "Gin Based",
+ "description": "진의 향긋함에 샴페인의 탄산이 더해진 고급스럽고 청량한 칵테일",
+ "image": "/images/French 75.jpeg",
+ "alcohol": 18,
+ "difficulty": "Medium",
+ "ingredients": [
+ { "name": "Dry Gin", "amount": "30ml" },
+ { "name": "Lemon Juice", "amount": "15ml" },
+ { "name": "Simple Syrup", "amount": "15ml" },
+ { "name": "Champagne", "amount": "Fill" }
+ ],
+ "instructions": [
+ "샴페인을 제외한 재료를 셰이킹하여 샴페인 글라스에 담습니다.",
+ "차가운 샴페인을 천천히 채우고 가볍게 젓습니다."
+ ],
+ "garnish": ["Lemon Twist"],
+ "glass": "Champagne Flute",
+ "method": "Shake/Build",
+ "taste": { "sweet": 40, "sour": 70, "bitter": 10, "strong": 55 },
+ "story": "제1차 세계대전 당시 프랑스군의 75mm 야포의 위력이 이 술과 같다고 하여 붙여진 이름입니다.",
+ "popularity": 91, "rating": 4.7, "reviews": 240
+ },
+ {
+ "id": "white-russian",
+ "name": "White Russian",
+ "nameKo": "화이트 러시안",
+ "category": "Vodka Based",
+ "description": "블랙 러시안에 우유나 크림을 더해 부드러운 목넘김을 자랑하는 디저트 칵테일",
+ "image": "/images/White Russian.jpeg",
+ "alcohol": 15,
+ "difficulty": "Easy",
+ "ingredients": [
+ { "name": "Vodka", "amount": "40ml" },
+ { "name": "Coffee Liqueur", "amount": "20ml" },
+ { "name": "Fresh Cream", "amount": "30ml" }
+ ],
+ "instructions": [
+ "얼음이 든 올드 패션드 잔에 보드카와 커피 리큐어를 붓습니다.",
+ "그 위에 크림을 천천히 띄우거나 가볍게 저어줍니다."
+ ],
+ "garnish": [],
+ "glass": "Old Fashioned Glass",
+ "method": "Build",
+ "taste": { "sweet": 80, "sour": 0, "bitter": 30, "strong": 45 },
+ "story": "영화 '위대한 레보스키'의 주인공이 즐겨 마시면서 대중적으로 큰 인기를 끌게 되었습니다.",
+ "popularity": 93, "rating": 4.6, "reviews": 410
+ },
+ {
+ "id": "boulevardier",
+ "name": "Boulevardier",
+ "nameKo": "불바디에",
+ "category": "Whiskey Based",
+ "description": "네그로니의 진 대신 위스키를 사용하여 더 묵직하고 따뜻한 느낌을 주는 술",
+ "image": "/images/Boulevardier.jpeg",
+ "alcohol": 28,
+ "difficulty": "Medium",
+ "ingredients": [
+ { "name": "Bourbon Whiskey", "amount": "45ml" },
+ { "name": "Campari", "amount": "30ml" },
+ { "name": "Sweet Vermouth", "amount": "30ml" }
+ ],
+ "instructions": [
+ "믹싱 글라스에 모든 재료와 얼음을 넣고 충분히 젓습니다.",
+ "얼음을 걸러 차가운 잔에 따르거나 큰 얼음이 담긴 잔에 따릅니다."
+ ],
+ "garnish": ["Orange Peel"],
+ "glass": "Old Fashioned Glass",
+ "method": "Stir",
+ "taste": { "sweet": 50, "sour": 10, "bitter": 80, "strong": 85 },
+ "story": "1920년대 파리에서 활동하던 미국인 작가가 즐겨 마신 것에서 시작된 '위스키 버전의 네그로니'입니다.",
+ "popularity": 88, "rating": 4.8, "reviews": 275
+ },
+ {
+ "id": "clover-club",
+ "name": "Clover Club",
+ "nameKo": "클로버 클럽",
+ "category": "Gin Based",
+ "description": "라즈베리의 달콤함과 계란 흰자의 부드러운 거품이 매력적인 클래식 칵테일",
+ "image": "/images/Clover Club.jpeg",
+ "alcohol": 18,
+ "difficulty": "Hard",
+ "ingredients": [
+ { "name": "Dry Gin", "amount": "45ml" },
+ { "name": "Raspberry Syrup", "amount": "15ml" },
+ { "name": "Lemon Juice", "amount": "15ml" },
+ { "name": "Egg White", "amount": "1ea" }
+ ],
+ "instructions": [
+ "모든 재료를 얼음 없이 셰이킹하여 거품을 충분히 냅니다.",
+ "얼음을 넣고 한 번 더 셰이킹한 후 거름망을 이용해 잔에 따릅니다."
+ ],
+ "garnish": ["Fresh Raspberries"],
+ "glass": "Cocktail Glass",
+ "method": "Shake",
+ "taste": { "sweet": 60, "sour": 60, "bitter": 10, "strong": 50 },
+ "story": "필라델피아의 남성 전용 클럽인 '클로버 클럽'에서 유래했으며, 의외로 초창기엔 남성들에게 인기였습니다.",
+ "popularity": 86, "rating": 4.6, "reviews": 140
+ },
+ {
+ "id": "rusty-nail",
+ "name": "Rusty Nail",
+ "nameKo": "러스티 네일",
+ "category": "Whiskey Based",
+ "description": "스카치 위스키에 꿀과 허브의 풍미가 담긴 드람뷔를 더한 묵직한 한 잔",
+ "image": "/images/Rusty Nail.jpeg",
+ "alcohol": 35,
+ "difficulty": "Easy",
+ "ingredients": [
+ { "name": "Scotch Whiskey", "amount": "45ml" },
+ { "name": "Drambuie", "amount": "25ml" }
+ ],
+ "instructions": [
+ "얼음이 든 올드 패션드 잔에 위스키와 드람뷔를 붓습니다.",
+ "가볍게 저어준 뒤 오렌지 껍질을 곁들입니다."
+ ],
+ "garnish": ["Lemon Twist"],
+ "glass": "Old Fashioned Glass",
+ "method": "Build",
+ "taste": { "sweet": 60, "sour": 0, "bitter": 20, "strong": 95 },
+ "story": "이름은 '녹슨 못'이라는 뜻으로, 색상이 갈색을 띠는 데서 유래했습니다. 남성적인 이미지가 강한 칵테일입니다.",
+ "popularity": 90, "rating": 4.5, "reviews": 230
+ },
+ {
+ "id": "blue-hawaiian",
+ "name": "Blue Hawaiian",
+ "nameKo": "블루 하와이안",
+ "category": "Rum Based",
+ "description": "하와이의 푸른 바다를 담은 듯한 시각적 청량감과 달콤한 열대 과일 맛",
+ "image": "/images/Blue Hawaiian.jpeg",
+ "alcohol": 12,
+ "difficulty": "Medium",
+ "ingredients": [
+ { "name": "White Rum", "amount": "30ml" },
+ { "name": "Blue Curacao", "amount": "15ml" },
+ { "name": "Coconut Cream", "amount": "30ml" },
+ { "name": "Pineapple Juice", "amount": "60ml" }
+ ],
+ "instructions": [
+ "모든 재료를 얼음과 함께 셰이킹하거나 블렌더로 갈아줍니다.",
+ "잘게 부순 얼음이 든 큰 잔에 따릅니다."
+ ],
+ "garnish": ["Pineapple Wedge", "Cocktail Umbrella"],
+ "glass": "Hurricane Glass",
+ "method": "Shake",
+ "taste": { "sweet": 90, "sour": 30, "bitter": 10, "strong": 30 },
+ "story": "1957년 하와이 와이키키 빌리지 호텔의 바텐더가 리큐르 홍보를 위해 고안한 여름 대표 칵테일입니다.",
+ "popularity": 94, "rating": 4.4, "reviews": 480
+ },
+ {
+ "id": "last-word",
+ "name": "Last Word",
+ "nameKo": "라스트 워드",
+ "category": "Gin Based",
+ "description": "허브와 시트러스가 복합적으로 어우러져 한 번 마시면 잊기 힘든 강렬한 맛",
+ "image": "/images/Last Word.jpeg",
+ "alcohol": 25,
+ "difficulty": "Medium",
+ "ingredients": [
+ { "name": "Dry Gin", "amount": "22.5ml" },
+ { "name": "Green Chartreuse", "amount": "22.5ml" },
+ { "name": "Maraschino Liqueur", "amount": "22.5ml" },
+ { "name": "Lime Juice", "amount": "22.5ml" }
+ ],
+ "instructions": [
+ "네 가지 재료를 1:1:1:1 비율로 셰이커에 넣습니다.",
+ "얼음과 함께 잘 흔든 뒤 차가운 칵테일 잔에 따릅니다."
+ ],
+ "garnish": ["Maraschino Cherry"],
+ "glass": "Cocktail Glass",
+ "method": "Shake",
+ "taste": { "sweet": 50, "sour": 60, "bitter": 40, "strong": 75 },
+ "story": "금주법 시대 직전 디트로이트에서 탄생했으며, 잊혀졌다가 최근 클래식 칵테일 붐과 함께 다시 주목받고 있습니다.",
+ "popularity": 87, "rating": 4.9, "reviews": 120
+ },
+ {
+ "id": "pisco-sour",
+ "name": "Pisco Sour",
+ "nameKo": "피스코 사워",
+ "category": "Brandy Based",
+ "description": "남미의 포도 브랜디인 피스코를 베이스로 한 상큼하고 거품이 매력적인 술",
+ "image": "/images/Pisco Sour.jpeg",
+ "alcohol": 16,
+ "difficulty": "Hard",
+ "ingredients": [
+ { "name": "Pisco", "amount": "60ml" },
+ { "name": "Lemon Juice", "amount": "30ml" },
+ { "name": "Simple Syrup", "amount": "20ml" },
+ { "name": "Egg White", "amount": "1ea" },
+ { "name": "Angostura Bitters", "amount": "1 dash" }
+ ],
+ "instructions": [
+ "비터즈를 제외한 재료를 드라이 셰이킹하여 거품을 냅니다.",
+ "얼음을 넣고 다시 흔든 뒤 잔에 따릅니다.",
+ "하얀 거품 위에 비터즈 한 방울을 떨어뜨려 장식합니다."
+ ],
+ "garnish": ["Angostura Bitters Drops"],
+ "glass": "Coupette or Old Fashioned",
+ "method": "Shake",
+ "taste": { "sweet": 50, "sour": 80, "bitter": 10, "strong": 50 },
+ "story": "페루와 칠레의 국주로 통하며, 두 나라 사이에서 서로 종주국임을 주장할 정도로 자부심이 대단한 칵테일입니다.",
+ "popularity": 89, "rating": 4.7, "reviews": 210
+ },
+ {
+ "id": "dark-n-stormy",
+ "name": "Dark 'n' Stormy",
+ "nameKo": "다크 앤 스토미",
+ "category": "Rum Based",
+ "description": "다크 럼의 묵직함과 생강의 스파이시함이 만난 폭풍우 전야 같은 맛",
+ "image": "/images/Dark n Stormy.jpeg",
+ "alcohol": 14,
+ "difficulty": "Easy",
+ "ingredients": [
+ { "name": "Dark Rum", "amount": "60ml" },
+ { "name": "Ginger Beer", "amount": "Fill" },
+ { "name": "Lime Juice", "amount": "15ml" }
+ ],
+ "instructions": [
+ "얼음이 든 하이볼 잔에 진저 비어를 먼저 채웁니다.",
+ "그 위에 다크 럼을 천천히 부어 층이 생기게(플로팅) 합니다.",
+ "마시기 직전에 섞어 마십니다."
+ ],
+ "garnish": ["Lime Wheel"],
+ "glass": "Highball Glass",
+ "method": "Build/Float",
+ "taste": { "sweet": 50, "sour": 40, "bitter": 20, "strong": 50 },
+ "story": "버뮤다의 국주로, 구름 낀 하늘을 닮은 비주얼 때문에 '폭풍 전야'라는 이름이 붙었습니다.",
+ "popularity": 92, "rating": 4.6, "reviews": 330
+ },
+ {
+ "id": "vampiro",
+ "name": "Vampiro",
+ "nameKo": "뱀파이어",
+ "category": "Tequila Based",
+ "description": "테킬라와 토마토, 과일 주스가 섞인 매콤하고 붉은 매력의 칵테일",
+ "image": "/images/Vampiro.jpeg",
+ "alcohol": 15,
+ "difficulty": "Medium",
+ "ingredients": [
+ { "name": "Tequila", "amount": "50ml" },
+ { "name": "Tomato Juice", "amount": "70ml" },
+ { "name": "Orange Juice", "amount": "30ml" },
+ { "name": "Lime Juice", "amount": "10ml" },
+ { "name": "Honey/Hot Sauce", "amount": "Pinch" }
+ ],
+ "instructions": [
+ "모든 재료를 셰이커에 넣고 잘 흔듭니다.",
+ "소금을 묻힌 하이볼 잔에 따릅니다."
+ ],
+ "garnish": ["Red Chili", "Lime Wedge"],
+ "glass": "Highball Glass",
+ "method": "Shake",
+ "taste": { "sweet": 40, "sour": 50, "bitter": 10, "strong": 45 },
+ "story": "멕시코의 상그리타(Sangrita)를 칵테일화한 것으로, 피처럼 붉은 색상 때문에 이름 붙여졌습니다.",
+ "popularity": 84, "rating": 4.2, "reviews": 95
+ },
+ {
+ "id": "grasshopper",
+ "name": "Grasshopper",
+ "nameKo": "그래스호퍼",
+ "category": "Liqueur Based",
+ "description": "민트 초코 우유처럼 달콤하고 상쾌한 초록빛 디저트 칵테일",
+ "image": "/images/Grasshopper.jpeg",
+ "alcohol": 10,
+ "difficulty": "Easy",
+ "ingredients": [
+ { "name": "Crème de Menthe (Green)", "amount": "30ml" },
+ { "name": "Crème de Cacao (White)", "amount": "30ml" },
+ { "name": "Fresh Cream", "amount": "30ml" }
+ ],
+ "instructions": [
+ "셰이커에 모든 재료와 얼음을 넣고 충분히 흔듭니다.",
+ "내용물만 거른 뒤 차가운 칵테일 잔에 따릅니다."
+ ],
+ "garnish": ["Mint Leaf"],
+ "glass": "Cocktail Glass",
+ "method": "Shake",
+ "taste": { "sweet": 95, "sour": 0, "bitter": 10, "strong": 20 },
+ "story": "이름은 '메뚜기'라는 뜻으로 그 특유의 밝은 초록색에서 따왔습니다. 민트 초코 애호가들에게 최고의 선택입니다.",
+ "popularity": 91, "rating": 4.5, "reviews": 380
+ },
+ {
+ "id": "tom-collins",
+ "name": "Tom Collins",
+ "nameKo": "톰 콜린스",
+ "category": "Gin Based",
+ "description": "진, 레몬, 탄산수가 어우러진 시원하고 깔끔한 맛의 롱 드링크",
+ "image": "/images/Tom Collins.jpeg",
+ "alcohol": 12,
+ "difficulty": "Easy",
+ "ingredients": [
+ { "name": "Old Tom Gin", "amount": "45ml" },
+ { "name": "Lemon Juice", "amount": "30ml" },
+ { "name": "Simple Syrup", "amount": "15ml" },
+ { "name": "Soda Water", "amount": "Fill" }
+ ],
+ "instructions": [
+ "탄산수를 제외한 재료를 하이볼 잔에 넣고 섞습니다.",
+ "얼음을 채우고 탄산수를 부어 가볍게 젓습니다."
+ ],
+ "garnish": ["Lemon Wheel", "Maraschino Cherry"],
+ "glass": "Collins Glass",
+ "method": "Build",
+ "taste": { "sweet": 50, "sour": 70, "bitter": 10, "strong": 35 },
+ "story": "19세기 런던에서 유행했던 '톰 콜린스라는 사람이 당신 욕을 하고 다닌다'는 장난 전화 소동에서 이름이 유래되었습니다.",
+ "popularity": 93, "rating": 4.6, "reviews": 520
+ },
+ {
+ "id": "bellini",
+ "name": "Bellini",
+ "nameKo": "벨리니",
+ "category": "Sparkling Wine Based",
+ "description": "복숭아의 향긋함과 스파클링 와인의 기포가 입안을 즐겁게 하는 칵테일",
+ "image": "/images/Bellini.jpeg",
+ "alcohol": 8,
+ "difficulty": "Easy",
+ "ingredients": [
+ { "name": "Prosecco", "amount": "100ml" },
+ { "name": "Peach Puree", "amount": "50ml" }
+ ],
+ "instructions": [
+ "차갑게 식힌 잔에 복숭아 퓨레를 먼저 넣습니다.",
+ "프로세코(또는 샴페인)를 천천히 붓고 가볍게 섞어줍니다."
+ ],
+ "garnish": ["Peach Slice"],
+ "glass": "Champagne Flute",
+ "method": "Build",
+ "taste": { "sweet": 85, "sour": 30, "bitter": 0, "strong": 15 },
+ "story": "이탈리아 베네치아의 해리즈 바에서 고안되었으며, 화가 지오반니 벨리니의 그림 색채에서 이름을 따왔습니다.",
+ "popularity": 90, "rating": 4.7, "reviews": 290
+ }
+ ]
+}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index df03a7e..2bc75b8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -9,7 +9,7 @@
"version": "0.1.0",
"dependencies": {
"lucide-react": "^0.554.0",
- "next": "16.0.3",
+ "next": "^16.1.0",
"react": "19.2.0",
"react-dom": "19.2.0"
},
@@ -18,6 +18,7 @@
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
+ "baseline-browser-mapping": "^2.9.11",
"eslint": "^9",
"eslint-config-next": "16.0.3",
"tailwindcss": "^4",
@@ -1036,9 +1037,9 @@
}
},
"node_modules/@next/env": {
- "version": "16.0.3",
- "resolved": "https://registry.npmjs.org/@next/env/-/env-16.0.3.tgz",
- "integrity": "sha512-IqgtY5Vwsm14mm/nmQaRMmywCU+yyMIYfk3/MHZ2ZTJvwVbBn3usZnjMi1GacrMVzVcAxJShTCpZlPs26EdEjQ==",
+ "version": "16.1.0",
+ "resolved": "https://registry.npmjs.org/@next/env/-/env-16.1.0.tgz",
+ "integrity": "sha512-Dd23XQeFHmhf3KBW76leYVkejHlCdB7erakC2At2apL1N08Bm+dLYNP+nNHh0tzUXfPQcNcXiQyacw0PG4Fcpw==",
"license": "MIT"
},
"node_modules/@next/eslint-plugin-next": {
@@ -1052,9 +1053,9 @@
}
},
"node_modules/@next/swc-darwin-arm64": {
- "version": "16.0.3",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.0.3.tgz",
- "integrity": "sha512-MOnbd92+OByu0p6QBAzq1ahVWzF6nyfiH07dQDez4/Nku7G249NjxDVyEfVhz8WkLiOEU+KFVnqtgcsfP2nLXg==",
+ "version": "16.1.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.1.0.tgz",
+ "integrity": "sha512-onHq8dl8KjDb8taANQdzs3XmIqQWV3fYdslkGENuvVInFQzZnuBYYOG2HGHqqtvgmEU7xWzhgndXXxnhk4Z3fQ==",
"cpu": [
"arm64"
],
@@ -1068,9 +1069,9 @@
}
},
"node_modules/@next/swc-darwin-x64": {
- "version": "16.0.3",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.0.3.tgz",
- "integrity": "sha512-i70C4O1VmbTivYdRlk+5lj9xRc2BlK3oUikt3yJeHT1unL4LsNtN7UiOhVanFdc7vDAgZn1tV/9mQwMkWOJvHg==",
+ "version": "16.1.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.1.0.tgz",
+ "integrity": "sha512-Am6VJTp8KhLuAH13tPrAoVIXzuComlZlMwGr++o2KDjWiKPe3VwpxYhgV6I4gKls2EnsIMggL4y7GdXyDdJcFA==",
"cpu": [
"x64"
],
@@ -1084,9 +1085,9 @@
}
},
"node_modules/@next/swc-linux-arm64-gnu": {
- "version": "16.0.3",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.0.3.tgz",
- "integrity": "sha512-O88gCZ95sScwD00mn/AtalyCoykhhlokxH/wi1huFK+rmiP5LAYVs/i2ruk7xST6SuXN4NI5y4Xf5vepb2jf6A==",
+ "version": "16.1.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.1.0.tgz",
+ "integrity": "sha512-fVicfaJT6QfghNyg8JErZ+EMNQ812IS0lmKfbmC01LF1nFBcKfcs4Q75Yy8IqnsCqH/hZwGhqzj3IGVfWV6vpA==",
"cpu": [
"arm64"
],
@@ -1100,9 +1101,9 @@
}
},
"node_modules/@next/swc-linux-arm64-musl": {
- "version": "16.0.3",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.0.3.tgz",
- "integrity": "sha512-CEErFt78S/zYXzFIiv18iQCbRbLgBluS8z1TNDQoyPi8/Jr5qhR3e8XHAIxVxPBjDbEMITprqELVc5KTfFj0gg==",
+ "version": "16.1.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.1.0.tgz",
+ "integrity": "sha512-TojQnDRoX7wJWXEEwdfuJtakMDW64Q7NrxQPviUnfYJvAx5/5wcGE+1vZzQ9F17m+SdpFeeXuOr6v3jbyusYMQ==",
"cpu": [
"arm64"
],
@@ -1116,9 +1117,9 @@
}
},
"node_modules/@next/swc-linux-x64-gnu": {
- "version": "16.0.3",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.3.tgz",
- "integrity": "sha512-Tc3i+nwt6mQ+Dwzcri/WNDj56iWdycGVh5YwwklleClzPzz7UpfaMw1ci7bLl6GRYMXhWDBfe707EXNjKtiswQ==",
+ "version": "16.1.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.1.0.tgz",
+ "integrity": "sha512-quhNFVySW4QwXiZkZ34SbfzNBm27vLrxZ2HwTfFFO1BBP0OY1+pI0nbyewKeq1FriqU+LZrob/cm26lwsiAi8Q==",
"cpu": [
"x64"
],
@@ -1132,9 +1133,9 @@
}
},
"node_modules/@next/swc-linux-x64-musl": {
- "version": "16.0.3",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.3.tgz",
- "integrity": "sha512-zTh03Z/5PBBPdTurgEtr6nY0vI9KR9Ifp/jZCcHlODzwVOEKcKRBtQIGrkc7izFgOMuXDEJBmirwpGqdM/ZixA==",
+ "version": "16.1.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.1.0.tgz",
+ "integrity": "sha512-6JW0z2FZUK5iOVhUIWqE4RblAhUj1EwhZ/MwteGb//SpFTOHydnhbp3868gxalwea+mbOLWO6xgxj9wA9wNvNw==",
"cpu": [
"x64"
],
@@ -1148,9 +1149,9 @@
}
},
"node_modules/@next/swc-win32-arm64-msvc": {
- "version": "16.0.3",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.3.tgz",
- "integrity": "sha512-Jc1EHxtZovcJcg5zU43X3tuqzl/sS+CmLgjRP28ZT4vk869Ncm2NoF8qSTaL99gh6uOzgM99Shct06pSO6kA6g==",
+ "version": "16.1.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.1.0.tgz",
+ "integrity": "sha512-+DK/akkAvvXn5RdYN84IOmLkSy87SCmpofJPdB8vbLmf01BzntPBSYXnMvnEEv/Vcf3HYJwt24QZ/s6sWAwOMQ==",
"cpu": [
"arm64"
],
@@ -1164,9 +1165,9 @@
}
},
"node_modules/@next/swc-win32-x64-msvc": {
- "version": "16.0.3",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.3.tgz",
- "integrity": "sha512-N7EJ6zbxgIYpI/sWNzpVKRMbfEGgsWuOIvzkML7wxAAZhPk1Msxuo/JDu1PKjWGrAoOLaZcIX5s+/pF5LIbBBg==",
+ "version": "16.1.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.1.0.tgz",
+ "integrity": "sha512-Tr0j94MphimCCks+1rtYPzQFK+faJuhHWCegU9S9gDlgyOk8Y3kPmO64UcjyzZAlligeBtYZ/2bEyrKq0d2wqQ==",
"cpu": [
"x64"
],
@@ -2500,10 +2501,9 @@
"license": "MIT"
},
"node_modules/baseline-browser-mapping": {
- "version": "2.8.29",
- "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.29.tgz",
- "integrity": "sha512-sXdt2elaVnhpDNRDz+1BDx1JQoJRuNk7oVlAlbGiFkLikHCAQiccexF/9e91zVi6RCgqspl04aP+6Cnl9zRLrA==",
- "dev": true,
+ "version": "2.9.11",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.11.tgz",
+ "integrity": "sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==",
"license": "Apache-2.0",
"bin": {
"baseline-browser-mapping": "dist/cli.js"
@@ -5059,13 +5059,14 @@
"license": "MIT"
},
"node_modules/next": {
- "version": "16.0.3",
- "resolved": "https://registry.npmjs.org/next/-/next-16.0.3.tgz",
- "integrity": "sha512-Ka0/iNBblPFcIubTA1Jjh6gvwqfjrGq1Y2MTI5lbjeLIAfmC+p5bQmojpRZqgHHVu5cG4+qdIiwXiBSm/8lZ3w==",
+ "version": "16.1.0",
+ "resolved": "https://registry.npmjs.org/next/-/next-16.1.0.tgz",
+ "integrity": "sha512-Y+KbmDbefYtHDDQKLNrmzE/YYzG2msqo2VXhzh5yrJ54tx/6TmGdkR5+kP9ma7i7LwZpZMfoY3m/AoPPPKxtVw==",
"license": "MIT",
"dependencies": {
- "@next/env": "16.0.3",
+ "@next/env": "16.1.0",
"@swc/helpers": "0.5.15",
+ "baseline-browser-mapping": "^2.8.3",
"caniuse-lite": "^1.0.30001579",
"postcss": "8.4.31",
"styled-jsx": "5.1.6"
@@ -5077,14 +5078,14 @@
"node": ">=20.9.0"
},
"optionalDependencies": {
- "@next/swc-darwin-arm64": "16.0.3",
- "@next/swc-darwin-x64": "16.0.3",
- "@next/swc-linux-arm64-gnu": "16.0.3",
- "@next/swc-linux-arm64-musl": "16.0.3",
- "@next/swc-linux-x64-gnu": "16.0.3",
- "@next/swc-linux-x64-musl": "16.0.3",
- "@next/swc-win32-arm64-msvc": "16.0.3",
- "@next/swc-win32-x64-msvc": "16.0.3",
+ "@next/swc-darwin-arm64": "16.1.0",
+ "@next/swc-darwin-x64": "16.1.0",
+ "@next/swc-linux-arm64-gnu": "16.1.0",
+ "@next/swc-linux-arm64-musl": "16.1.0",
+ "@next/swc-linux-x64-gnu": "16.1.0",
+ "@next/swc-linux-x64-musl": "16.1.0",
+ "@next/swc-win32-arm64-msvc": "16.1.0",
+ "@next/swc-win32-x64-msvc": "16.1.0",
"sharp": "^0.34.4"
},
"peerDependencies": {
diff --git a/package.json b/package.json
index 7c6a28c..fe17d4f 100644
--- a/package.json
+++ b/package.json
@@ -10,7 +10,7 @@
},
"dependencies": {
"lucide-react": "^0.554.0",
- "next": "16.0.3",
+ "next": "^16.1.0",
"react": "19.2.0",
"react-dom": "19.2.0"
},
@@ -19,6 +19,7 @@
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
+ "baseline-browser-mapping": "^2.9.11",
"eslint": "^9",
"eslint-config-next": "16.0.3",
"tailwindcss": "^4",
diff --git a/public/images/Amaretto Sour.jpeg b/public/images/Amaretto Sour.jpeg
new file mode 100644
index 0000000..92213a6
Binary files /dev/null and b/public/images/Amaretto Sour.jpeg differ
diff --git a/public/images/Aviation.jpeg b/public/images/Aviation.jpeg
new file mode 100644
index 0000000..f9573a8
Binary files /dev/null and b/public/images/Aviation.jpeg differ
diff --git a/public/images/Bellini.jpeg b/public/images/Bellini.jpeg
new file mode 100644
index 0000000..951879b
Binary files /dev/null and b/public/images/Bellini.jpeg differ
diff --git a/public/images/Blue Hawaiian.jpeg b/public/images/Blue Hawaiian.jpeg
new file mode 100644
index 0000000..ed3b354
Binary files /dev/null and b/public/images/Blue Hawaiian.jpeg differ
diff --git a/public/images/Boulevardier.jpeg b/public/images/Boulevardier.jpeg
new file mode 100644
index 0000000..ae3891b
Binary files /dev/null and b/public/images/Boulevardier.jpeg differ
diff --git a/public/images/Clover Club.jpeg b/public/images/Clover Club.jpeg
new file mode 100644
index 0000000..be8ac14
Binary files /dev/null and b/public/images/Clover Club.jpeg differ
diff --git a/public/images/Dark n Stormy.jpeg b/public/images/Dark n Stormy.jpeg
new file mode 100644
index 0000000..93262c8
Binary files /dev/null and b/public/images/Dark n Stormy.jpeg differ
diff --git a/public/images/Espresso Martini.jpeg b/public/images/Espresso Martini.jpeg
new file mode 100644
index 0000000..d37f4d8
Binary files /dev/null and b/public/images/Espresso Martini.jpeg differ
diff --git a/public/images/French 75.jpeg b/public/images/French 75.jpeg
new file mode 100644
index 0000000..92d0348
Binary files /dev/null and b/public/images/French 75.jpeg differ
diff --git a/public/images/Grasshopper.jpeg b/public/images/Grasshopper.jpeg
new file mode 100644
index 0000000..279d78c
Binary files /dev/null and b/public/images/Grasshopper.jpeg differ
diff --git a/public/images/Last Word.jpeg b/public/images/Last Word.jpeg
new file mode 100644
index 0000000..683df9c
Binary files /dev/null and b/public/images/Last Word.jpeg differ
diff --git a/public/images/Long Island Iced Tea.jpeg b/public/images/Long Island Iced Tea.jpeg
new file mode 100644
index 0000000..dc8c083
Binary files /dev/null and b/public/images/Long Island Iced Tea.jpeg differ
diff --git a/public/images/Pisco Sour.jpeg b/public/images/Pisco Sour.jpeg
new file mode 100644
index 0000000..f2d5440
Binary files /dev/null and b/public/images/Pisco Sour.jpeg differ
diff --git a/public/images/Rusty Nail.jpeg b/public/images/Rusty Nail.jpeg
new file mode 100644
index 0000000..e23bd6d
Binary files /dev/null and b/public/images/Rusty Nail.jpeg differ
diff --git a/public/images/Sex on the Beach.jpeg b/public/images/Sex on the Beach.jpeg
new file mode 100644
index 0000000..65ef78e
Binary files /dev/null and b/public/images/Sex on the Beach.jpeg differ
diff --git a/public/images/Sidecar.jpeg b/public/images/Sidecar.jpeg
new file mode 100644
index 0000000..a59c48b
Binary files /dev/null and b/public/images/Sidecar.jpeg differ
diff --git a/public/images/Tom Collins.jpeg b/public/images/Tom Collins.jpeg
new file mode 100644
index 0000000..a269b88
Binary files /dev/null and b/public/images/Tom Collins.jpeg differ
diff --git a/public/images/Vampiro.jpeg b/public/images/Vampiro.jpeg
new file mode 100644
index 0000000..0b7cd73
Binary files /dev/null and b/public/images/Vampiro.jpeg differ
diff --git a/public/images/White Lady.jpeg b/public/images/White Lady.jpeg
new file mode 100644
index 0000000..0d1dea9
Binary files /dev/null and b/public/images/White Lady.jpeg differ
diff --git a/public/images/White Russian.jpeg b/public/images/White Russian.jpeg
new file mode 100644
index 0000000..3ded43f
Binary files /dev/null and b/public/images/White Russian.jpeg differ
diff --git a/types/cocktails.ts b/types/cocktails.ts
index 79e7874..b393ca0 100644
--- a/types/cocktails.ts
+++ b/types/cocktails.ts
@@ -8,7 +8,7 @@ export interface Cocktail {
description: string;
image: string;
alcohol: number;
- difficulty: "Easy" | "Medium" | "Hard";
+ difficulty: string;
ingredients: {
name: string;
amount: string;
@@ -16,6 +16,7 @@ export interface Cocktail {
garnish: string[];
glass: string;
method: string;
+ method_detail: string;
taste: {
sweet: number;
sour: number;
+ Our + Story
- -- OBar라는 이름은 두 가지 의미를 담고 있습니다. - "OH, bar"라는 감탄사와 "Over"라는 초월의 의미가 만나 평범함을 넘은 특별함을 담고 있습니다. -
-- 우리는 단순히 음료를 보여주는 것이 아니라, - 각각의 칵테일에 OBar만의 스토리와 감성을 담아냅니다. - 검은색의 세련됨과 핑크색의 열정이 조화를 이루는 공간에서 당신만의 특별한 순간을 만들어보세요. -
-+ Obar는 2020년 서울의 한 골목에서 시작되었습니다. 평범한 칵테일 바가 아닌, 예술과 과학이 만나는 공간을 만들고 싶었던 우리의 꿈에서 비롯되었습니다. +
+ ++ 매 순간 우리는 최고의 재료를 엄선하고, 각 칵테일에 담긴 스토리를 전달하며, 손님들의 특별한 순간을 만들기 위해 노력합니다. +
+ ++ Obar에서 경험하는 모든 것은 우리의 철학을 담고 있습니다: OH, bar도 가능하고 Over라는 느낌도 나는 중의적 표현. 평범함을 넘어, 특별한 경험을 제공하는 것이 우리의 목표입니다. +
+ +500+
+Happy Customers
+50+
+Signature Cocktails
- Ready to Experience OBar? -
-- 평범함을 넘어선 특별한 칵테일 경험이 당신을 기다립니다. -
-+ Ready to Experience + Obar? +
+ ++ 지금 바로 우리의 프리미엄 칵테일 컬렉션을 탐색해보세요. 특별한 순간을 만들어보세요. +
+ ++ Signature + Collection +
++ Obar의 대표 칵테일들을 만나보세요 +
++ {cocktail.name} +
+{cocktail.nameKo}
++ {cocktail.description} +
+- O - Bar -
- -- Oh, Bar! -
-- Over the ordinary -
-+ ✦ PREMIUM COCKTAIL EXPERIENCE +
-- Obar는 당신이 원하는 칵테일을 모두 가지고 있습니다. - 감각적인 분위기 속에서 나만의 칵테일을 찾아보세요. -
++ O + bar +
-OH, bar
+Over the ordinary
+ ++ Obar는 평범함을 넘어선 특별한 칵테일 경험을 제공합니다. + 세련된 분위기 속에서 엄선된 레시피와 함께 잊지 못할 순간을 만들어보세요. +
+ +
+ {heroImage && !isImageError ? (
+ <>
+
+ + Premium Cocktails +
+SCROLL
+- The Art of Mixology -
-- OBar는 세련된 디자인과 분위기 속에 다양한 종류의 칵테일을 제공해드립니다. -
-+ The Art of + Mixology +
++ Obar에서는 단순한 음료가 아닌 경험을 제공합니다. +
+{feature.title}
-- {feature.description} -
-+ {feature.title} +
+{feature.description}
+By Category
+By Difficulty
++ All Cocktails ({filteredCocktails.length}) +
+ ++ {cocktail.name} +
+{cocktail.nameKo}
++ {cocktail.description} +
++ 검색 결과가 없습니다. 다시 시도해주세요. +
+{cocktail.name}
-- {cocktail.alcoholic} -
-{stat.label}
+{stat.value}
++ {cocktail.category} +
+{cocktail.name}
+{cocktail.nameKo}
+ ++ {cocktail.description} +
+ + {/* Taste Profile */} ++ 🌟 Taste Profile +
+{cocktail.alcohol}%
+Alcohol
+⭐ {cocktail.rating}
+Rating
+{cocktail.popularity}%
+Popularity
+🥃 Glass
+{cocktail.glass}
+🔧 Method
+{cocktail.method}
+⏱️ Difficulty
+{cocktail.difficulty}
+- {cocktail.name} -
- -- {cocktail.description} -
- -- Category: {cocktail.category} - Glass: {cocktail.glass} -
-재료 정보
- --
- {ingredients.map((ingredient, index) => (
-
- - - {ingredient.item} - - {ingredient.amount} - - ))} -
레시피 설명
- --
- {instructions.map((step, index) => (
-
- {step} - ))} -
📋 Recipe
+ +Ingredients
+Garnish
+📖 Story
+{cocktail.story}
++ You Might Also + Like +
+ ++ {cocktail.name} +
+{cocktail.nameKo}
++ {cocktail.description} +
+