Alert
개요
Alert는 사용자에게 중요한 정보나 경고를 전달하는 컴포넌트입니다. Cals에서는 예약 확정, 취소, 승인 대기 등 예약 관련 알림 메시지를 표시하는 데 사용됩니다.
언제 사용하는가
- 예약 확정/취소 알림
- 예약 승인 대기 안내
- 예약 가능 시간대 안내
- 시스템 공지사항 표시
- 오류 및 경고 메시지 전달
언제 사용하지 말아야 하는가
- 일시적인 상태 업데이트 → Toast 사용
- 사용자 액션 필요 → Dialog 사용
- 짧은 설명 텍스트 → Tooltip 사용
- 인터랙티브한 정보 → Popover 사용
설치
npx @vortex/cli add alert기본 사용법
import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
import { CheckCircle2 } from "lucide-react";
export default function AlertDemo() {
return (
<Alert>
<CheckCircle2 className="h-4 w-4" />
<AlertTitle>예약 확정</AlertTitle>
<AlertDescription>
2024년 1월 15일 14:00 예약이 확정되었습니다.
</AlertDescription>
</Alert>
);
}Variants
Default (Info)
일반적인 정보 메시지를 표시합니다.
<Alert>
<Info className="h-4 w-4" />
<AlertTitle>예약 가능</AlertTitle>
<AlertDescription>선택하신 시간대에 예약이 가능합니다.</AlertDescription>
</Alert>Destructive (Error)
오류나 중요한 경고를 표시합니다.
<Alert variant="destructive">
<AlertCircle className="h-4 w-4" />
<AlertTitle>예약 취소</AlertTitle>
<AlertDescription>
예약이 취소되었습니다. 환불은 3-5 영업일 내에 처리됩니다.
</AlertDescription>
</Alert>Cals 브랜딩
브랜드 컬러
Cals의 Primary Pink를 활용한 브랜드 Alert 스타일입니다.
// tailwind.config.ts
export default {
theme: {
extend: {
colors: {
cals: {
primary: "#e91e63",
secondary: "#03a9f4",
accent: "#9c27b0",
},
},
},
},
};<Alert className="border-cals-primary bg-cals-primary/10 text-cals-primary">
<Calendar className="h-4 w-4" />
<AlertTitle>Cals 예약 시스템</AlertTitle>
<AlertDescription>새로운 예약 요청이 도착했습니다.</AlertDescription>
</Alert>예약 상태 컬러
예약 상태별 Alert 스타일을 제공합니다.
// Available - 예약 가능
<Alert className="border-green-500 bg-green-50 text-green-900">
<CheckCircle2 className="h-4 w-4" />
<AlertTitle>예약 가능</AlertTitle>
<AlertDescription>
해당 시간대에 예약하실 수 있습니다.
</AlertDescription>
</Alert>
// Pending - 승인 대기
<Alert className="border-orange-500 bg-orange-50 text-orange-900">
<Clock className="h-4 w-4" />
<AlertTitle>승인 대기</AlertTitle>
<AlertDescription>
예약 요청이 접수되었습니다. 승인까지 최대 24시간 소요됩니다.
</AlertDescription>
</Alert>
// Confirmed - 예약 확정
<Alert className="border-blue-500 bg-blue-50 text-blue-900">
<CheckCircle2 className="h-4 w-4" />
<AlertTitle>예약 확정</AlertTitle>
<AlertDescription>
2024년 1월 15일 14:00 예약이 확정되었습니다.
</AlertDescription>
</Alert>
// Cancelled - 예약 취소
<Alert className="border-red-500 bg-red-50 text-red-900">
<XCircle className="h-4 w-4" />
<AlertTitle>예약 취소</AlertTitle>
<AlertDescription>
예약이 취소되었습니다. 취소 수수료가 부과될 수 있습니다.
</AlertDescription>
</Alert>
// Completed - 예약 완료
<Alert className="border-purple-500 bg-purple-50 text-purple-900">
<CheckCircle2 className="h-4 w-4" />
<AlertTitle>예약 완료</AlertTitle>
<AlertDescription>
서비스가 정상적으로 완료되었습니다. 이용해주셔서 감사합니다.
</AlertDescription>
</Alert>브랜드 비교표
| 속성 | Foundation | iCignal | Cals |
|---|---|---|---|
| Primary Color | Neutral Gray | Corporate Blue #0066cc | Primary Pink #e91e63 |
| Use Case | 범용 알림 | 기업 공지사항 | 예약 상태 알림 |
| Status Colors | Semantic (success/error) | Corporate Blue 기반 | 5가지 예약 상태 컬러 |
| Icon | Optional | Required (기업용) | Required (예약 상태 표시) |
| Action | Optional | Optional | Optional (예약 관리 링크) |
Props API
Alert
| Prop | Type | Default | Description |
|---|---|---|---|
| variant | "default" | "destructive" | "default" | Alert 스타일 변형 |
| className | string | - | 커스텀 CSS 클래스 |
AlertTitle
| Prop | Type | Default | Description |
|---|---|---|---|
| className | string | - | 커스텀 CSS 클래스 |
AlertDescription
| Prop | Type | Default | Description |
|---|---|---|---|
| className | string | - | 커스텀 CSS 클래스 |
접근성
- Role:
role="alert"자동 적용 - ARIA: 중요도에 따라
aria-live="polite"또는aria-live="assertive"사용 - Color Contrast: WCAG AA 기준 충족 (4.5:1 이상)
- Screen Reader: 아이콘 + 텍스트로 의미 전달
- Keyboard: 포커스 가능한 액션 버튼 포함 가능
예제
예약 상태별 알림
import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
import { CheckCircle2, Clock, XCircle, Calendar } from "lucide-react";
export default function ReservationAlerts() {
return (
<div className="space-y-4">
{/* Available */}
<Alert className="border-green-500 bg-green-50 text-green-900">
<Calendar className="h-4 w-4" />
<AlertTitle>예약 가능</AlertTitle>
<AlertDescription>
1월 15일 14:00-16:00 시간대에 예약하실 수 있습니다.
</AlertDescription>
</Alert>
{/* Pending */}
<Alert className="border-orange-500 bg-orange-50 text-orange-900">
<Clock className="h-4 w-4" />
<AlertTitle>승인 대기 중</AlertTitle>
<AlertDescription>
예약 요청이 접수되었습니다. 승인까지 최대 24시간 소요됩니다.
</AlertDescription>
</Alert>
{/* Confirmed */}
<Alert className="border-blue-500 bg-blue-50 text-blue-900">
<CheckCircle2 className="h-4 w-4" />
<AlertTitle>예약 확정</AlertTitle>
<AlertDescription>
2024년 1월 15일 14:00 예약이 확정되었습니다.
</AlertDescription>
</Alert>
{/* Cancelled */}
<Alert className="border-red-500 bg-red-50 text-red-900">
<XCircle className="h-4 w-4" />
<AlertTitle>예약 취소</AlertTitle>
<AlertDescription>
예약이 취소되었습니다. 취소 수수료 5,000원이 부과됩니다.
</AlertDescription>
</Alert>
</div>
);
}액션 버튼 포함
import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
import { Button } from "@/components/ui/button";
import { Clock } from "lucide-react";
export default function AlertWithAction() {
return (
<Alert className="border-orange-500 bg-orange-50 text-orange-900">
<Clock className="h-4 w-4" />
<div className="flex-1">
<AlertTitle>승인 대기 중</AlertTitle>
<AlertDescription>
예약 요청이 접수되었습니다. 승인까지 최대 24시간 소요됩니다.
</AlertDescription>
</div>
<Button variant="outline" size="sm" className="ml-auto">
예약 내역 보기
</Button>
</Alert>
);
}Cals 브랜드 알림
import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
import { Calendar } from "lucide-react";
export default function CalsBrandAlert() {
return (
<Alert className="border-cals-primary bg-cals-primary/10 text-cals-primary">
<Calendar className="h-4 w-4" />
<AlertTitle>Cals 예약 시스템</AlertTitle>
<AlertDescription>
새로운 예약 요청이 3건 도착했습니다. 예약 관리 페이지에서 확인하세요.
</AlertDescription>
</Alert>
);
}관련 컴포넌트
Last updated on