From eb28c6a719b678321b21b3cecd7823aa1b685ce0 Mon Sep 17 00:00:00 2001 From: chpark Date: Mon, 20 Apr 2026 16:52:56 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=82=AC=EC=9D=B4=ED=8A=B8=20=EC=A0=84?= =?UTF-8?q?=EB=A9=B4=20=EB=8B=A4=ED=81=AC=20=EB=A6=AC=EB=89=B4=EC=96=BC=20?= =?UTF-8?q?(invyone=20=EC=8A=A4=ED=83=80=EC=9D=BC=20=EB=A0=88=EC=9D=B8?= =?UTF-8?q?=EB=B3=B4=EC=9A=B0=20=EA=B7=B8=EB=9D=BC=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=EC=85=98)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 메인 페이지(/)를 다크 네이비 + 인디고→바이올렛→로즈→탠저린 그라데이션 시그니처로 전면 재구성: Hero(애니메이티드 그리드+글로우 오브+거대 타이포) / Marquee / For Who(그라데이션 보더 카드) / Process / Numbers / Categories / Benefits / Services / Journal / FAQ / CTA(3중 radial-gradient) - 타이포그래피: Inter + Instrument Serif italic + JetBrains Mono + Noto Sans KR, 한글·숫자·영문 혼용 대응 - globals.css에 다크 테마 디자인 시스템 추가: gradient text 유틸, orb/grid/dot 배경, grad-border·glass·btn-grad·link-grad 컴포넌트, shimmer/pulse-glow/marquee/grid-drift 키프레임 - 레거시 페이지(stores/blog/auth/faq/contact/about/admin/subsidies /vendors/matching/contracts/privacy/terms) 일괄 다크 전환: warm-*/ink*/white/sage-* 클래스 전역 오버라이드로 코드 수정 없이 일괄화 - 폼 입력·체크박스·select·prose 본문 모두 다크 테마 적응 - 레이아웃: sticky top nav를 다크 글래스모피즘으로, 풋터도 다크+오브 장식, auth-buttons 가입 CTA를 그라데이션 버튼으로 - color-scheme: dark 지정, prefers-reduced-motion 대응 포함 - Google AdSense(ads.txt, adsense-account meta, adsbygoogle 스크립트)는 원본 그대로 유지 --- apps/web/src/app/auth-buttons.tsx | 15 +- apps/web/src/app/globals.css | 594 ++++++++++++++++++++++-- apps/web/src/app/layout.tsx | 126 +++-- apps/web/src/app/page.tsx | 733 +++++++++++++++++++----------- 4 files changed, 1099 insertions(+), 369 deletions(-) diff --git a/apps/web/src/app/auth-buttons.tsx b/apps/web/src/app/auth-buttons.tsx index b52dfa5..cdfab9d 100644 --- a/apps/web/src/app/auth-buttons.tsx +++ b/apps/web/src/app/auth-buttons.tsx @@ -29,13 +29,18 @@ export function AuthButtons({ session }: AuthButtonsProps) {
로그인 회원가입 @@ -45,15 +50,15 @@ export function AuthButtons({ session }: AuthButtonsProps) { return (
- + {session.user.name} - + ({ROLE_LABELS[session.user.primaryRole] || session.user.primaryRole}) diff --git a/apps/web/src/app/globals.css b/apps/web/src/app/globals.css index bdf0146..1d767e2 100644 --- a/apps/web/src/app/globals.css +++ b/apps/web/src/app/globals.css @@ -1,9 +1,14 @@ -@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@300;400;500;700;900&family=Playfair+Display:ital,wght@0,700;0,900;1,700&display=swap'); +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&family=Noto+Sans+KR:wght@300;400;500;700;900&family=Instrument+Serif:ital@0;1&family=JetBrains+Mono:wght@400;500;700&display=swap'); @import "tailwindcss"; @theme { - --font-display: 'Playfair Display', Georgia, serif; - --font-body: 'Noto Sans KR', sans-serif; + /* Typography */ + --font-body: 'Inter', 'Noto Sans KR', -apple-system, BlinkMacSystemFont, system-ui, sans-serif; + --font-display: 'Inter', 'Noto Sans KR', -apple-system, BlinkMacSystemFont, sans-serif; + --font-serif: 'Instrument Serif', Georgia, serif; + --font-mono: 'JetBrains Mono', ui-monospace, 'SFMono-Regular', monospace; + + /* Legacy warm palette — still referenced on sub-pages (blog, stores, about, etc.) */ --color-warm-50: #fefcf9; --color-warm-100: #fdf6ec; --color-warm-200: #f9e8cf; @@ -19,58 +24,204 @@ --color-ink-muted: #8a7e72; --color-sage-500: #6b8f71; --color-sage-600: #527a58; + + /* invyone-inspired dark foundation */ + --color-night-0: #05050f; + --color-night-1: #0a0a18; + --color-night-2: #10101f; + --color-night-3: #1a1a2e; + --color-night-4: #252540; + --color-night-5: #353848; + --color-cloud-0: #ffffff; + --color-cloud-1: rgba(255, 255, 255, 0.92); + --color-cloud-2: rgba(255, 255, 255, 0.68); + --color-cloud-3: rgba(255, 255, 255, 0.48); + --color-cloud-4: rgba(255, 255, 255, 0.28); + + /* Rainbow accent palette */ + --color-iris: #6366f1; + --color-iris-light: #818cf8; + --color-violet: #a855f7; + --color-violet-light: #c084fc; + --color-rose: #ec4899; + --color-rose-light: #f472b6; + --color-tangerine: #f97316; + --color-tangerine-light: #fb923c; + --color-azure: #60a5fa; + --color-lime: #22c55e; + --color-lime-light: #34d399; + --color-amber: #fbbf24; } -/* Staggered fade-in-up animation */ +/* ----------------------------------------------------------------- + * Global body defaults + * ----------------------------------------------------------------- */ +html { + background: #05050f; +} +body { + background: #05050f; + color: rgba(255, 255, 255, 0.92); + font-feature-settings: "cv11", "ss01"; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-rendering: optimizeLegibility; +} + +::selection { + background: rgba(168, 85, 247, 0.35); + color: #ffffff; +} + +/* ----------------------------------------------------------------- + * Keyframes + * ----------------------------------------------------------------- */ @keyframes fade-up { - from { - opacity: 0; - transform: translateY(32px); - } - to { - opacity: 1; - transform: translateY(0); - } + from { opacity: 0; transform: translateY(32px); } + to { opacity: 1; transform: translateY(0); } } - @keyframes fade-in { from { opacity: 0; } - to { opacity: 1; } + to { opacity: 1; } } - @keyframes slide-in-right { - from { - opacity: 0; - transform: translateX(24px); - } - to { - opacity: 1; - transform: translateX(0); - } + from { opacity: 0; transform: translateX(24px); } + to { opacity: 1; transform: translateX(0); } } - @keyframes mesh-float { 0%, 100% { transform: translate(0, 0) scale(1); } - 33% { transform: translate(30px, -20px) scale(1.05); } - 66% { transform: translate(-20px, 15px) scale(0.95); } + 33% { transform: translate(40px, -30px) scale(1.08); } + 66% { transform: translate(-30px, 20px) scale(0.92); } +} +@keyframes shimmer { + 0% { background-position: 0% 50%; } + 100% { background-position: 200% 50%; } +} +@keyframes gradient-pan { + 0%, 100% { background-position: 0% 50%; } + 50% { background-position: 100% 50%; } +} +@keyframes pulse-glow { + 0%, 100% { opacity: 0.55; transform: scale(1); } + 50% { opacity: 0.95; transform: scale(1.07); } +} +@keyframes marquee { + 0% { transform: translateX(0); } + 100% { transform: translateX(-50%); } +} +@keyframes spin-slow { + from { transform: rotate(0deg); } + to { transform: rotate(360deg); } +} +@keyframes grid-drift { + 0% { background-position: 0 0; } + 100% { background-position: 48px 48px; } } -.animate-fade-up { - animation: fade-up 0.8s cubic-bezier(0.22, 1, 0.36, 1) forwards; - opacity: 0; +/* Reveal-on-load with stagger */ +.reveal { opacity: 0; transform: translateY(24px); animation: fade-up 0.9s cubic-bezier(0.22, 1, 0.36, 1) forwards; } +.reveal.d1 { animation-delay: 0.08s; } +.reveal.d2 { animation-delay: 0.18s; } +.reveal.d3 { animation-delay: 0.28s; } +.reveal.d4 { animation-delay: 0.4s; } +.reveal.d5 { animation-delay: 0.55s; } +.reveal.d6 { animation-delay: 0.7s; } +.reveal.d7 { animation-delay: 0.85s; } + +.animate-fade-up { animation: fade-up 0.9s cubic-bezier(0.22, 1, 0.36, 1) forwards; opacity: 0; } +.animate-fade-in { animation: fade-in 0.7s ease forwards; opacity: 0; } +.animate-slide-right { animation: slide-in-right 0.8s cubic-bezier(0.22, 1, 0.36, 1) forwards; opacity: 0; } +.animate-spin-slow { animation: spin-slow 30s linear infinite; } + +/* ----------------------------------------------------------------- + * Gradient / text utilities + * ----------------------------------------------------------------- */ +.text-grad-primary { + background: linear-gradient(135deg, #6366f1 0%, #a855f7 40%, #ec4899 70%, #f97316 100%); + -webkit-background-clip: text; + background-clip: text; + -webkit-text-fill-color: transparent; + color: transparent; +} +.text-grad-subtle { + background: linear-gradient(120deg, #818cf8 0%, #c084fc 30%, #f472b6 60%, #fb923c 100%); + -webkit-background-clip: text; + background-clip: text; + -webkit-text-fill-color: transparent; + color: transparent; +} +.text-grad-rainbow { + background: linear-gradient(120deg, #60a5fa, #c084fc, #f472b6, #fb923c, #fbbf24, #34d399, #60a5fa); + background-size: 200% auto; + -webkit-background-clip: text; + background-clip: text; + -webkit-text-fill-color: transparent; + color: transparent; + animation: shimmer 8s linear infinite; +} +.text-grad-iris { + background: linear-gradient(135deg, #818cf8 0%, #6366f1 50%, #4f46e5 100%); + -webkit-background-clip: text; + background-clip: text; + -webkit-text-fill-color: transparent; + color: transparent; +} +.text-grad-rose { + background: linear-gradient(135deg, #f472b6 0%, #ec4899 50%, #db2777 100%); + -webkit-background-clip: text; + background-clip: text; + -webkit-text-fill-color: transparent; + color: transparent; +} +.text-grad-tangerine { + background: linear-gradient(135deg, #fbbf24 0%, #f97316 50%, #ea580c 100%); + -webkit-background-clip: text; + background-clip: text; + -webkit-text-fill-color: transparent; + color: transparent; } -.animate-fade-in { - animation: fade-in 0.6s ease forwards; - opacity: 0; +/* ----------------------------------------------------------------- + * Backgrounds / patterns + * ----------------------------------------------------------------- */ +.bg-grid { + background-image: + linear-gradient(to right, rgba(255, 255, 255, 0.045) 1px, transparent 1px), + linear-gradient(to bottom, rgba(255, 255, 255, 0.045) 1px, transparent 1px); + background-size: 48px 48px; +} +.bg-grid-animated { + background-image: + linear-gradient(to right, rgba(255, 255, 255, 0.045) 1px, transparent 1px), + linear-gradient(to bottom, rgba(255, 255, 255, 0.045) 1px, transparent 1px); + background-size: 48px 48px; + animation: grid-drift 20s linear infinite; +} +.bg-dot { + background-image: radial-gradient(circle, rgba(255, 255, 255, 0.1) 1px, transparent 1px); + background-size: 24px 24px; +} +.bg-radial-fade { + background: radial-gradient(ellipse at center, transparent 0%, #05050f 75%); } -.animate-slide-right { - animation: slide-in-right 0.7s cubic-bezier(0.22, 1, 0.36, 1) forwards; - opacity: 0; +/* Glow orbs */ +.orb { + position: absolute; + border-radius: 50%; + filter: blur(80px); + opacity: 0.55; + pointer-events: none; + animation: mesh-float 18s ease-in-out infinite, pulse-glow 9s ease-in-out infinite; } +.orb-iris { background: radial-gradient(circle, #6366f1 0%, transparent 70%); } +.orb-violet { background: radial-gradient(circle, #a855f7 0%, transparent 70%); } +.orb-rose { background: radial-gradient(circle, #ec4899 0%, transparent 70%); } +.orb-tangerine{ background: radial-gradient(circle, #f97316 0%, transparent 70%); } +.orb-azure { background: radial-gradient(circle, #60a5fa 0%, transparent 70%); } +.orb-lime { background: radial-gradient(circle, #34d399 0%, transparent 70%); } -/* Gradient mesh blobs */ +/* Legacy mesh-blob preserved for other pages */ .mesh-blob { position: absolute; border-radius: 50%; @@ -79,16 +230,114 @@ pointer-events: none; } -/* Card hover lift */ +/* ----------------------------------------------------------------- + * Glass / gradient-border cards + * ----------------------------------------------------------------- */ +.glass-dark { + background: rgba(16, 16, 31, 0.6); + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); + border: 1px solid rgba(255, 255, 255, 0.08); +} +.glass-darker { + background: rgba(10, 10, 24, 0.72); + backdrop-filter: blur(24px); + -webkit-backdrop-filter: blur(24px); + border: 1px solid rgba(255, 255, 255, 0.06); +} + +.grad-border { + position: relative; + background: rgba(16, 16, 31, 0.65); + border-radius: 20px; + transition: transform 0.4s cubic-bezier(0.22, 1, 0.36, 1), + background 0.4s ease; +} +.grad-border::before { + content: ''; + position: absolute; + inset: 0; + padding: 1px; + border-radius: inherit; + background: linear-gradient(135deg, + rgba(99, 102, 241, 0.5) 0%, + rgba(168, 85, 247, 0.35) 35%, + rgba(236, 72, 153, 0.25) 65%, + rgba(249, 115, 22, 0.18) 100%); + -webkit-mask: + linear-gradient(#000 0 0) content-box, + linear-gradient(#000 0 0); + mask: + linear-gradient(#000 0 0) content-box, + linear-gradient(#000 0 0); + -webkit-mask-composite: xor; + mask-composite: exclude; + pointer-events: none; + transition: opacity 0.4s ease; +} +.grad-border:hover { + transform: translateY(-6px); + background: rgba(24, 24, 48, 0.8); +} +.grad-border:hover::before { + background: linear-gradient(135deg, + rgba(99, 102, 241, 0.9) 0%, + rgba(168, 85, 247, 0.75) 35%, + rgba(236, 72, 153, 0.6) 65%, + rgba(249, 115, 22, 0.45) 100%); +} + +/* ----------------------------------------------------------------- + * Buttons + * ----------------------------------------------------------------- */ +.btn-grad { + position: relative; + background: linear-gradient(135deg, #6366f1 0%, #a855f7 50%, #ec4899 100%); + color: white; + border-radius: 999px; + padding: 14px 28px; + font-weight: 600; + letter-spacing: -0.01em; + box-shadow: 0 10px 32px -8px rgba(168, 85, 247, 0.55), + 0 0 0 1px rgba(255, 255, 255, 0.08) inset; + transition: transform 0.25s ease, box-shadow 0.25s ease; +} +.btn-grad:hover { + transform: translateY(-2px); + box-shadow: 0 16px 40px -8px rgba(168, 85, 247, 0.7), + 0 0 0 1px rgba(255, 255, 255, 0.14) inset; +} +.btn-ghost { + background: rgba(255, 255, 255, 0.04); + color: rgba(255, 255, 255, 0.92); + border: 1px solid rgba(255, 255, 255, 0.14); + border-radius: 999px; + padding: 14px 28px; + font-weight: 600; + backdrop-filter: blur(10px); + transition: background 0.2s ease, border-color 0.2s ease, transform 0.25s ease; +} +.btn-ghost:hover { + background: rgba(255, 255, 255, 0.08); + border-color: rgba(255, 255, 255, 0.28); + transform: translateY(-2px); +} + +/* ----------------------------------------------------------------- + * Card lift (legacy + dark variant) + * ----------------------------------------------------------------- */ .card-lift { - transition: transform 0.35s cubic-bezier(0.22, 1, 0.36, 1), box-shadow 0.35s ease; + transition: transform 0.4s cubic-bezier(0.22, 1, 0.36, 1), + box-shadow 0.4s ease, + background 0.3s ease; } .card-lift:hover { transform: translateY(-6px); - box-shadow: 0 20px 60px -12px rgba(26, 20, 16, 0.15); } -/* Link underline animation */ +/* ----------------------------------------------------------------- + * Link underline (legacy) + * ----------------------------------------------------------------- */ .link-underline { position: relative; display: inline-block; @@ -106,3 +355,268 @@ .link-underline:hover::after { width: 100%; } + +/* Gradient underline for dark theme */ +.link-grad { + position: relative; + display: inline-block; +} +.link-grad::after { + content: ''; + position: absolute; + left: 0; + bottom: -3px; + width: 0; + height: 2px; + background: linear-gradient(90deg, #6366f1, #a855f7, #ec4899, #f97316); + transition: width 0.35s cubic-bezier(0.22, 1, 0.36, 1); +} +.link-grad:hover::after { + width: 100%; +} + +/* ----------------------------------------------------------------- + * Marquee + * ----------------------------------------------------------------- */ +.marquee-track { + display: flex; + gap: 3rem; + animation: marquee 40s linear infinite; + white-space: nowrap; + width: max-content; +} +.marquee-mask { + -webkit-mask-image: linear-gradient(to right, transparent 0%, #000 10%, #000 90%, transparent 100%); + mask-image: linear-gradient(to right, transparent 0%, #000 10%, #000 90%, transparent 100%); +} + +/* ----------------------------------------------------------------- + * Conic/orbit decorative ring + * ----------------------------------------------------------------- */ +.conic-ring { + background: conic-gradient( + from 0deg, + #6366f1 0deg, + #a855f7 90deg, + #ec4899 180deg, + #f97316 270deg, + #6366f1 360deg + ); + filter: blur(2px); +} + +/* Reduce motion preference */ +@media (prefers-reduced-motion: reduce) { + .reveal, + .animate-fade-up, + .animate-fade-in, + .animate-slide-right, + .animate-spin-slow, + .orb, + .mesh-blob, + .bg-grid-animated, + .text-grad-rainbow, + .marquee-track { + animation: none !important; + opacity: 1 !important; + transform: none !important; + } +} + +/* ================================================================= + * SITE-WIDE DARK THEME OVERRIDES + * Legacy pages (stores/blog/about/auth/faq/contact/admin/etc.) + * use warm-*/ink/white color classes. Remap them to dark equivalents + * here so every page inherits the new look without touching code. + * ================================================================= */ + +/* --- Page / section backgrounds (warm-50, warm-100) --- */ +.bg-warm-50 { background-color: #05050f !important; } +.bg-warm-50\/50 { background-color: rgba(5, 5, 15, 0.6) !important; } +.bg-warm-50\/60 { background-color: rgba(5, 5, 15, 0.7) !important; } +.bg-warm-50\/70 { background-color: rgba(5, 5, 15, 0.75) !important; } +.bg-warm-50\/80 { background-color: rgba(5, 5, 15, 0.8) !important; } + +.bg-warm-100 { background-color: #0a0a18 !important; } +.bg-warm-100\/40 { background-color: rgba(10, 10, 24, 0.45) !important; } +.bg-warm-100\/50 { background-color: rgba(10, 10, 24, 0.55) !important; } +.bg-warm-100\/60 { background-color: rgba(10, 10, 24, 0.65) !important; } +.bg-warm-100\/70 { background-color: rgba(10, 10, 24, 0.75) !important; } + +.bg-warm-200 { background-color: #10101f !important; } +.bg-warm-200\/50 { background-color: rgba(16, 16, 31, 0.6) !important; } + +/* --- Accent color tints (warm-400/500/600 → violet/iris/rose) --- */ +.bg-warm-400\/15 { background-color: rgba(192, 132, 252, 0.14) !important; } +.bg-warm-400\/30 { background-color: rgba(192, 132, 252, 0.28) !important; } +.bg-warm-400\/40 { background-color: rgba(192, 132, 252, 0.38) !important; } +.bg-warm-500 { background-color: #a855f7 !important; color: white !important; } +.bg-warm-500\/10 { background-color: rgba(168, 85, 247, 0.12) !important; } +.bg-warm-500\/15 { background-color: rgba(168, 85, 247, 0.18) !important; } +.bg-warm-500\/20 { background-color: rgba(168, 85, 247, 0.24) !important; } +.bg-warm-600 { background-color: #ec4899 !important; color: white !important; } +.bg-warm-600\/90 { background-color: rgba(236, 72, 153, 0.92) !important; color: white !important; } +.bg-warm-700 { background-color: #6366f1 !important; color: white !important; } +.bg-warm-800 { background-color: #0f0f22 !important; } +.bg-warm-900 { background-color: #050510 !important; } + +/* --- Ink (dark) backgrounds — now map to darkest navy --- */ +.bg-ink { background-color: #05050f !important; } +.bg-ink\/5 { background-color: rgba(255, 255, 255, 0.04) !important; } +.bg-ink\/10 { background-color: rgba(255, 255, 255, 0.07) !important; } +.bg-ink\/20 { background-color: rgba(255, 255, 255, 0.12) !important; } + +/* --- Sage (green) tints --- */ +.bg-sage-500 { background-color: #34d399 !important; color: #05050f !important; } +.bg-sage-500\/5 { background-color: rgba(52, 211, 153, 0.08) !important; } +.bg-sage-500\/10 { background-color: rgba(52, 211, 153, 0.14) !important; } +.bg-sage-500\/15 { background-color: rgba(52, 211, 153, 0.2) !important; } +.bg-sage-500\/90 { background-color: rgba(52, 211, 153, 0.88) !important; color: #05050f !important; } + +/* --- White backgrounds → dark glass cards --- */ +.bg-white { + background-color: rgba(16, 16, 31, 0.85) !important; + color: rgba(255, 255, 255, 0.92) !important; +} +.bg-white\/50 { + background-color: rgba(16, 16, 31, 0.55) !important; + backdrop-filter: blur(16px); + -webkit-backdrop-filter: blur(16px); +} +.bg-white\/60 { + background-color: rgba(16, 16, 31, 0.6) !important; + backdrop-filter: blur(18px); + -webkit-backdrop-filter: blur(18px); +} +.bg-white\/70 { + background-color: rgba(16, 16, 31, 0.65) !important; + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); +} +.bg-white\/80 { + background-color: rgba(16, 16, 31, 0.75) !important; + backdrop-filter: blur(22px); + -webkit-backdrop-filter: blur(22px); +} +.bg-white\/90 { + background-color: rgba(16, 16, 31, 0.85) !important; +} + +/* --- Text colors --- */ +.text-ink { color: #ffffff !important; } +.text-ink-light { color: rgba(255, 255, 255, 0.68) !important; } +.text-ink-muted { color: rgba(255, 255, 255, 0.45) !important; } +.text-warm-50 { color: #ffffff !important; } +.text-warm-100 { color: rgba(255, 255, 255, 0.9) !important; } +.text-warm-200 { color: rgba(255, 255, 255, 0.72) !important; } +.text-warm-400 { color: #c084fc !important; } +.text-warm-500 { color: #a855f7 !important; } +.text-warm-600 { color: #ec4899 !important; } +.text-warm-700 { color: #818cf8 !important; } +.text-warm-800 { color: #c084fc !important; } +.text-warm-900 { color: #ffffff !important; } +.text-sage-500 { color: #34d399 !important; } +.text-sage-600 { color: #10b981 !important; } + +/* --- Borders --- */ +.border-ink { border-color: rgba(255, 255, 255, 0.92) !important; } +.border-ink\/5 { border-color: rgba(255, 255, 255, 0.05) !important; } +.border-ink\/10 { border-color: rgba(255, 255, 255, 0.08) !important; } +.border-ink\/15 { border-color: rgba(255, 255, 255, 0.12) !important; } +.border-ink\/20 { border-color: rgba(255, 255, 255, 0.16) !important; } +.border-ink\/40 { border-color: rgba(255, 255, 255, 0.3) !important; } +.border-warm-200 { border-color: rgba(255, 255, 255, 0.1) !important; } +.border-warm-200\/30{ border-color: rgba(255, 255, 255, 0.12) !important; } +.border-warm-200\/60{ border-color: rgba(255, 255, 255, 0.2) !important; } +.border-warm-500 { border-color: #a855f7 !important; } + +/* --- Hover variants --- */ +.hover\:bg-warm-50:hover { background-color: rgba(255, 255, 255, 0.03) !important; } +.hover\:bg-warm-100:hover { background-color: rgba(255, 255, 255, 0.05) !important; } +.hover\:bg-warm-200:hover { background-color: rgba(255, 255, 255, 0.08) !important; } +.hover\:bg-warm-400:hover { background-color: #c084fc !important; } +.hover\:bg-warm-500:hover { background-color: #a855f7 !important; } +.hover\:bg-warm-600:hover { background-color: #ec4899 !important; } +.hover\:bg-warm-700:hover { background-color: #6366f1 !important; } +.hover\:bg-warm-800:hover { background-color: #10101f !important; } +.hover\:text-warm-600:hover { color: #ec4899 !important; } +.hover\:text-warm-700:hover { color: #818cf8 !important; } +.hover\:text-warm-800:hover { color: #c084fc !important; } +.hover\:border-ink\/40:hover{ border-color: rgba(255, 255, 255, 0.3) !important; } +.hover\:border-warm-200:hover { border-color: rgba(255, 255, 255, 0.2) !important; } + +/* --- Form inputs: dark theme by default --- */ +input[type="text"], +input[type="email"], +input[type="password"], +input[type="number"], +input[type="tel"], +input[type="url"], +input[type="search"], +input[type="date"], +input[type="time"], +input[type="datetime-local"], +input:not([type]), +textarea, +select { + background-color: rgba(16, 16, 31, 0.6) !important; + border: 1px solid rgba(255, 255, 255, 0.1) !important; + color: #ffffff !important; + border-radius: 10px; + transition: border-color 0.2s ease, box-shadow 0.2s ease; +} +input::placeholder, +textarea::placeholder { + color: rgba(255, 255, 255, 0.35) !important; +} +input:focus, +textarea:focus, +select:focus { + border-color: #a855f7 !important; + box-shadow: 0 0 0 4px rgba(168, 85, 247, 0.18) !important; + outline: none !important; +} +/* Checkbox / radio — keep accent purple */ +input[type="checkbox"], +input[type="radio"] { + accent-color: #a855f7; +} +/* Option elements inside select */ +select option { + background-color: #10101f; + color: #ffffff; +} + +/* --- Blog article prose (if used) --- */ +.prose, +.prose-lg, +.prose-xl { + --tw-prose-body: rgba(255, 255, 255, 0.78); + --tw-prose-headings: #ffffff; + --tw-prose-lead: rgba(255, 255, 255, 0.72); + --tw-prose-links: #c084fc; + --tw-prose-bold: #ffffff; + --tw-prose-counters: rgba(255, 255, 255, 0.5); + --tw-prose-bullets: rgba(255, 255, 255, 0.35); + --tw-prose-hr: rgba(255, 255, 255, 0.1); + --tw-prose-quotes: rgba(255, 255, 255, 0.85); + --tw-prose-quote-borders: rgba(168, 85, 247, 0.5); + --tw-prose-captions: rgba(255, 255, 255, 0.5); + --tw-prose-code: #f472b6; + --tw-prose-pre-code: #e4e4e7; + --tw-prose-pre-bg: rgba(16, 16, 31, 0.75); + --tw-prose-th-borders: rgba(255, 255, 255, 0.15); + --tw-prose-td-borders: rgba(255, 255, 255, 0.08); +} + +/* --- Placeholder/disabled states --- */ +*:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +/* --- Ensure html/body stay dark for non-home routes too --- */ +html, body { + background-color: #05050f; + color-scheme: dark; +} diff --git a/apps/web/src/app/layout.tsx b/apps/web/src/app/layout.tsx index 7b8f44e..1805543 100644 --- a/apps/web/src/app/layout.tsx +++ b/apps/web/src/app/layout.tsx @@ -65,42 +65,54 @@ const OPERATOR_ROLES = [ 'SUPER_ADMIN', ]; +const NAV_LINKS = [ + { href: '/stores', label: '매장 검색' }, + { href: '/stores/new', label: '매장 등록' }, + { href: '/matching', label: '매칭' }, + { href: '/subsidies', label: '지원금' }, + { href: '/vendors', label: '업체' }, + { href: '/blog', label: '블로그' }, + { href: '/faq', label: 'FAQ' }, +]; + async function Navigation() { const session = await auth(); const isOperator = session?.user && OPERATOR_ROLES.includes(session.user.primaryRole); return ( -