o2o-clinicad-frontend/src/app/index.css

245 lines
10 KiB
CSS
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

@import url('https://fonts.googleapis.com/css2?family=Inter:wght@100..900&family=Playfair+Display:ital,wght@0,400..900;1,400..900&display=swap');
@import url('https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/variable/pretendardvariable-dynamic-subset.min.css');
@import "tailwindcss";
/* ─── Design Tokens ───────────────────────────────────────────────── */
@theme {
/* Navy ─ 950(darkest) · 900 · 800 · 50(lightest)
짙은 네이비 계열. 본문 텍스트, 다크 섹션 배경, 그라디언트 끝 */
--color-navy-950: #021341;
--color-navy-900: #0A1128;
--color-navy-800: #1A2B5E;
--color-navy-50: #F4F6FB;
/* Violet ─ 700(deep) · 500(accent)
퍼플 계열. 그라디언트 시작(700), 활성 상태·아이콘(500) */
--color-violet-700: #4F1DA1;
--color-violet-500: #6C5CE7;
/* Marketing accents (CTA / Process / Hero blobs — shared with DEMO) */
--color-marketing-cream: #fff3eb;
--color-marketing-lilac: #e4cfff;
--color-marketing-ice: #f5f9ff;
--color-lavender-100: #f3e8ff;
--color-lavender-200: #e9d4ff;
--color-lavender-300: #d8b4fe;
--color-violet-hover: #af90ff;
/* Hero radial + blob tints */
--color-hero-wash-start: #e0e7ff;
--color-hero-wash-mid: #faf5ff;
--color-hero-wash-end: #fdf2f8;
--color-marketing-blush: #fbcfe8;
/* Neutral ─ 90(darkest) · 80 · 70 · 60 · 40 · 30 · 20 · 10 · 00(white) */
--color-neutral-90: #151515;
--color-neutral-80: #303030;
--color-neutral-70: #606060;
--color-neutral-60: #808080;
--color-neutral-40: #DADBDE;
--color-neutral-30: #EAEBEF;
--color-neutral-20: #F0F1F4;
--color-neutral-10: #F7F8FA;
--color-neutral-00: #FFFFFF;
/* Status ─ {critical | warning | good | info} × {bg | text | border | dot}
파스텔 시맨틱 팔레트. 원색(빨강·초록) 사용 금지 */
--color-status-critical-bg: #FFF0F0;
--color-status-critical-text: #7C3A4B;
--color-status-critical-border: #F5D5DC;
--color-status-critical-dot: #D4889A;
--color-status-warning-bg: #FFF6ED;
--color-status-warning-text: #7C5C3A;
--color-status-warning-border: #F5E0C5;
--color-status-warning-dot: #D4A872;
--color-status-good-bg: #F3F0FF;
--color-status-good-text: #4A3A7C;
--color-status-good-border: #D5CDF5;
--color-status-good-dot: #9B8AD4;
--color-status-info-bg: #EFF0FF;
--color-status-info-text: #3A3F7C;
--color-status-info-border: #C5CBF5;
--color-status-info-dot: #7A84D4;
/* Typography */
--font-sans: "Pretendard Variable", "Pretendard", ui-sans-serif, system-ui, sans-serif;
--font-serif: "Playfair Display", ui-serif, Georgia, Cambria, serif;
--font-inter: "Inter", ui-sans-serif, system-ui, sans-serif;
/* Animation */
--animate-blob: blob 7s infinite;
--animate-blob-large: blob-large 25s infinite ease-in-out;
--animate-fade-in-up: fade-in-up 0.6s ease-out both;
--animate-fade-in-left: fade-in-left 0.6s ease-out both;
--animate-fade-in-right: fade-in-right 0.6s ease-out both;
--animate-fade-in-scale: fade-in-scale 0.8s ease-out both;
}
/* ─── Keyframes ───────────────────────────────────────────────────── */
@keyframes blob {
0% { transform: translate(0, 0) scale(1); }
33% { transform: translate(30px, -50px) scale(1.1); }
66% { transform: translate(-20px, 20px) scale(0.9); }
100% { transform: translate(0, 0) scale(1); }
}
@keyframes blob-large {
0% { transform: translate(0, 0) scale(1); }
33% { transform: translate(8vw, -8vh) scale(1.1); }
66% { transform: translate(-8vw, 8vh) scale(0.9); }
100% { transform: translate(0, 0) scale(1); }
}
/* fade + slide-up: replaces framer-motion entrance (opacity 0→1, y 20→0) */
@keyframes fade-in-up {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
/* fade + slide-left/right: whileInView x:-20→0 / x:20→0 */
@keyframes fade-in-left {
from { opacity: 0; transform: translateX(-20px); }
to { opacity: 1; transform: translateX(0); }
}
@keyframes fade-in-right {
from { opacity: 0; transform: translateX(20px); }
to { opacity: 1; transform: translateX(0); }
}
@keyframes fade-in-scale {
from { opacity: 0; transform: scale(0.95); }
to { opacity: 1; transform: scale(1); }
}
/* ─── Animation Delays ────────────────────────────────────────────── */
/* UI entrance stagger (short) */
.animation-delay-100 { animation-delay: 0.1s; }
.animation-delay-200 { animation-delay: 0.2s; }
.animation-delay-300 { animation-delay: 0.3s; }
.animation-delay-400 { animation-delay: 0.4s; }
.animation-delay-500 { animation-delay: 0.5s; }
/* Blob float delays (long) */
.animation-delay-2000 { animation-delay: 2s; }
.animation-delay-4000 { animation-delay: 4s; }
.animation-delay-7000 { animation-delay: 7s; }
.animation-delay-14000 { animation-delay: 14s; }
/* ─── Utility Classes ─────────────────────────────────────────────── */
/* 라이트 섹션 헤딩 그라디언트 텍스트 */
.text-gradient {
background: linear-gradient(to right, var(--color-navy-900), #3b5998);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
/* 반투명 글래스 카드 — 랜딩 섹션 */
.glass-card {
@apply bg-white/70 backdrop-blur-xl border border-white/40 rounded-2xl;
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.07);
}
/* 다크 섹션 위 화이트 카드 사선 그림자 */
.card-shadow { box-shadow: 3px 4px 12px rgba(0, 0, 0, 0.06); }
.card-shadow:hover { box-shadow: 4px 6px 16px rgba(0, 0, 0, 0.09); }
/* 브랜드 그라디언트 Primary 버튼 */
.btn-primary {
@apply bg-gradient-to-r from-violet-700 to-navy-950 text-white rounded-full font-medium transition-all;
}
/* ─── Typography Scale ────────────────────────────────────────────── */
/* Display */
.display-72 { font-family: var(--font-serif); font-size: 72px; font-weight: 700; line-height: 1.1; letter-spacing: -1.44px; }
.display-48 { font-family: var(--font-serif); font-size: 48px; font-weight: 700; line-height: 1.1; letter-spacing: -0.96px; }
.display-36 { font-family: var(--font-serif); font-size: 36px; font-weight: 700; line-height: 1.15; letter-spacing: -0.72px; }
/* Headline */
.headline-30 { font-family: var(--font-serif); font-size: 30px; font-weight: 700; line-height: 1.2; letter-spacing: -0.6px; }
.headline-24 { font-family: var(--font-serif); font-size: 24px; font-weight: 700; line-height: 1.3; letter-spacing: -0.48px; }
.headline-20 { font-family: var(--font-serif); font-size: 20px; font-weight: 700; line-height: 1.4; letter-spacing: -0.4px; }
/* Title */
.title-20 { font-family: var(--font-sans); font-size: 20px; font-weight: 700; line-height: 1.4; letter-spacing: -0.4px; }
.title-18 { font-family: var(--font-sans); font-size: 18px; font-weight: 700; line-height: 1.4; letter-spacing: -0.36px; }
.title-18-semibold { font-family: var(--font-sans); font-size: 18px; font-weight: 600; line-height: 1.4; letter-spacing: -0.36px; }
.title-16 { font-family: var(--font-sans); font-size: 16px; font-weight: 600; line-height: 1.4; letter-spacing: -0.32px; }
.title-14 { font-family: var(--font-sans); font-size: 14px; font-weight: 600; line-height: 1.4; letter-spacing: -0.28px; }
/* Body */
.body-20 { font-family: var(--font-sans); font-size: 20px; font-weight: 400; line-height: 1.6; letter-spacing: -0.4px; }
.body-20-medium { font-family: var(--font-sans); font-size: 20px; font-weight: 500; line-height: 1.4; letter-spacing: -0.4px; }
.body-18 { font-family: var(--font-sans); font-size: 18px; font-weight: 400; line-height: 1.6; letter-spacing: -0.36px; }
.body-16 { font-family: var(--font-sans); font-size: 16px; font-weight: 400; line-height: 1.5; letter-spacing: -0.32px; }
.body-16-medium { font-family: var(--font-sans); font-size: 16px; font-weight: 500; line-height: 1.5; letter-spacing: -0.32px; }
.body-14 { font-family: var(--font-sans); font-size: 14px; font-weight: 400; line-height: 1.5; letter-spacing: -0.28px; }
.body-14-medium { font-family: var(--font-sans); font-size: 14px; font-weight: 500; line-height: 1.5; letter-spacing: -0.28px; }
/* Label */
.label-12 { font-family: var(--font-sans); font-size: 12px; font-weight: 500; line-height: 1.4; letter-spacing: -0.24px; }
.label-12-semibold { font-family: var(--font-sans); font-size: 12px; font-weight: 600; line-height: 1.4; letter-spacing: -0.24px; }
/* Responsive body: 18px → 20px at md (text-lg / text-xl) */
.body-18-md-20 {
font-family: var(--font-sans);
font-weight: 400;
line-height: 1.625;
letter-spacing: -0.36px;
font-size: 1.125rem;
}
@media (min-width: 768px) {
.body-18-md-20 {
font-size: 1.25rem;
letter-spacing: -0.4px;
}
}
/* Responsive sans title: 18px → 20px at md (module card titles 등) */
.title-18-md-20 {
font-family: var(--font-sans);
font-weight: 700;
line-height: 1.4;
letter-spacing: -0.36px;
font-size: 1.125rem;
}
@media (min-width: 768px) {
.title-18-md-20 {
font-size: 1.25rem;
letter-spacing: -0.4px;
}
}
/* Responsive list body: 14px → 16px at md */
.body-14-md-16 {
font-family: var(--font-sans);
font-weight: 400;
line-height: 1.625;
letter-spacing: -0.28px;
font-size: 0.875rem;
}
@media (min-width: 768px) {
.body-14-md-16 {
font-size: 1rem;
letter-spacing: -0.32px;
}
}
/* ─── Base ────────────────────────────────────────────────────────── */
@layer base {
html, body {
@apply font-sans text-neutral-80 bg-neutral-10 antialiased;
font-style: normal;
line-height: normal;
min-height: 100dvh;
}
h1, h2, h3, h4, h5, h6 {
@apply font-serif text-navy-900;
}
}