diff --git a/apps/web/src/app/auth-buttons.tsx b/apps/web/src/app/auth-buttons.tsx index b52dfa5..81eaf7f 100644 --- a/apps/web/src/app/auth-buttons.tsx +++ b/apps/web/src/app/auth-buttons.tsx @@ -29,13 +29,17 @@ export function AuthButtons({ session }: AuthButtonsProps) {
로그인 회원가입 @@ -47,13 +51,14 @@ export function AuthButtons({ session }: AuthButtonsProps) {
{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..88c51cd 100644 --- a/apps/web/src/app/globals.css +++ b/apps/web/src/app/globals.css @@ -1,76 +1,242 @@ -@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; - --color-warm-50: #fefcf9; - --color-warm-100: #fdf6ec; - --color-warm-200: #f9e8cf; - --color-warm-300: #f2d1a5; - --color-warm-400: #e8b06e; - --color-warm-500: #d4874a; - --color-warm-600: #b8622e; - --color-warm-700: #8e4a22; - --color-warm-800: #6b3a1e; - --color-warm-900: #3d2213; - --color-ink: #1a1410; - --color-ink-light: #4a4035; - --color-ink-muted: #8a7e72; - --color-sage-500: #6b8f71; - --color-sage-600: #527a58; + /* 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; + + /* Naver Green signature system */ + --color-naver: #03C75A; + --color-naver-dark: #02A149; + --color-naver-deep: #018f40; + --color-naver-light: #2BD673; + --color-naver-soft: #E4F9EC; + --color-naver-tint: #F2FBF6; + + /* Gradient complements */ + --color-mint: #00C4A7; + --color-lime-accent: #84E1A1; + --color-emerald: #0AB070; + + /* Neutral (white-first) palette */ + --color-ink: #0F1D17; /* near-black text */ + --color-ink-light: #3E4A44; /* secondary text */ + --color-ink-muted: #7B8581; /* muted text */ + --color-line: #E4E8E6; /* subtle border */ + --color-line-soft: #EFF2F0; /* softer border */ + --color-surface: #FFFFFF; + --color-surface-soft: #F7FAF8; + --color-surface-mute: #F0F5F2; + + /* Legacy warm palette remap → light neutrals so old pages stay readable */ + --color-warm-50: #ffffff; + --color-warm-100: #F7FAF8; + --color-warm-200: #EFF2F0; + --color-warm-300: #E4E8E6; + --color-warm-400: #84E1A1; + --color-warm-500: #03C75A; + --color-warm-600: #02A149; + --color-warm-700: #018f40; + --color-warm-800: #0F1D17; + --color-warm-900: #0A1410; + + --color-sage-500: #03C75A; + --color-sage-600: #02A149; + + /* Legacy dark night palette kept as neutrals (in case referenced) */ + --color-night-0: #ffffff; + --color-night-1: #F7FAF8; + --color-night-2: #EFF2F0; + --color-night-3: #E4E8E6; + --color-night-4: #D3D9D6; + --color-night-5: #B6BEB9; + --color-cloud-0: #0F1D17; + --color-cloud-1: rgba(15, 29, 23, 0.92); + --color-cloud-2: rgba(15, 29, 23, 0.68); + --color-cloud-3: rgba(15, 29, 23, 0.48); + --color-cloud-4: rgba(15, 29, 23, 0.32); + + /* Accent palette remapped toward green family */ + --color-iris: #03C75A; + --color-iris-light: #2BD673; + --color-violet: #00C4A7; + --color-violet-light: #4FD9C3; + --color-rose: #0AB070; + --color-rose-light: #34D399; + --color-tangerine: #84E1A1; + --color-tangerine-light: #A5EBB8; + --color-azure: #34D399; + --color-lime: #03C75A; + --color-lime-light: #2BD673; + --color-amber: #02A149; } -/* Staggered fade-in-up animation */ +/* ----------------------------------------------------------------- + * Global body defaults — LIGHT theme + * ----------------------------------------------------------------- */ +html { + background: #ffffff; +} +body { + background: #ffffff; + color: #0F1D17; + font-feature-settings: "cv11", "ss01"; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-rendering: optimizeLegibility; +} + +::selection { + background: rgba(3, 199, 90, 0.22); + color: #0F1D17; +} + +/* ----------------------------------------------------------------- + * 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.45; transform: scale(1); } + 50% { opacity: 0.85; transform: scale(1.06); } +} +@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 — Naver green family + * ----------------------------------------------------------------- */ +.text-grad-primary { + background: linear-gradient(135deg, #03C75A 0%, #00C4A7 55%, #0AB070 100%); + -webkit-background-clip: text; + background-clip: text; + -webkit-text-fill-color: transparent; + color: transparent; +} +.text-grad-subtle { + background: linear-gradient(120deg, #2BD673 0%, #4FD9C3 50%, #84E1A1 100%); + -webkit-background-clip: text; + background-clip: text; + -webkit-text-fill-color: transparent; + color: transparent; +} +.text-grad-rainbow { + background: linear-gradient(120deg, #03C75A, #00C4A7, #2BD673, #0AB070, #84E1A1, #03C75A); + background-size: 200% auto; + -webkit-background-clip: text; + background-clip: text; + -webkit-text-fill-color: transparent; + color: transparent; + animation: shimmer 10s linear infinite; +} +.text-grad-iris, +.text-grad-rose, +.text-grad-tangerine { + background: linear-gradient(135deg, #03C75A 0%, #00C4A7 60%, #0AB070 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; +.bg-grad-primary { + background: linear-gradient(135deg, #03C75A 0%, #00C4A7 55%, #0AB070 100%); +} +.bg-grad-soft { + background: linear-gradient(135deg, #E4F9EC 0%, #F2FBF6 60%, #FFFFFF 100%); } -.animate-slide-right { - animation: slide-in-right 0.7s cubic-bezier(0.22, 1, 0.36, 1) forwards; - opacity: 0; +/* ----------------------------------------------------------------- + * Backgrounds / patterns (light) + * ----------------------------------------------------------------- */ +.bg-grid { + background-image: + linear-gradient(to right, rgba(15, 29, 23, 0.04) 1px, transparent 1px), + linear-gradient(to bottom, rgba(15, 29, 23, 0.04) 1px, transparent 1px); + background-size: 48px 48px; +} +.bg-grid-animated { + background-image: + linear-gradient(to right, rgba(3, 199, 90, 0.07) 1px, transparent 1px), + linear-gradient(to bottom, rgba(3, 199, 90, 0.07) 1px, transparent 1px); + background-size: 48px 48px; + animation: grid-drift 20s linear infinite; +} +.bg-dot { + background-image: radial-gradient(circle, rgba(3, 199, 90, 0.18) 1px, transparent 1px); + background-size: 24px 24px; +} +.bg-radial-fade { + background: radial-gradient(ellipse at center, transparent 0%, #ffffff 75%); } -/* Gradient mesh blobs */ +/* Glow orbs — green family */ +.orb { + position: absolute; + border-radius: 50%; + filter: blur(90px); + opacity: 0.35; + pointer-events: none; + animation: mesh-float 18s ease-in-out infinite, pulse-glow 9s ease-in-out infinite; +} +.orb-iris { background: radial-gradient(circle, #03C75A 0%, transparent 70%); } +.orb-violet { background: radial-gradient(circle, #00C4A7 0%, transparent 70%); } +.orb-rose { background: radial-gradient(circle, #2BD673 0%, transparent 70%); } +.orb-tangerine { background: radial-gradient(circle, #84E1A1 0%, transparent 70%); } +.orb-azure { background: radial-gradient(circle, #4FD9C3 0%, transparent 70%); } +.orb-lime { background: radial-gradient(circle, #03C75A 0%, transparent 70%); } + .mesh-blob { position: absolute; border-radius: 50%; @@ -79,16 +245,111 @@ pointer-events: none; } -/* Card hover lift */ -.card-lift { - transition: transform 0.35s cubic-bezier(0.22, 1, 0.36, 1), box-shadow 0.35s ease; -} -.card-lift:hover { - transform: translateY(-6px); - box-shadow: 0 20px 60px -12px rgba(26, 20, 16, 0.15); +/* ----------------------------------------------------------------- + * Card surfaces (light glass) + * ----------------------------------------------------------------- */ +.glass-dark, +.glass-darker { + background: rgba(255, 255, 255, 0.82); + backdrop-filter: blur(18px); + -webkit-backdrop-filter: blur(18px); + border: 1px solid rgba(15, 29, 23, 0.06); + box-shadow: 0 6px 30px -18px rgba(15, 29, 23, 0.18); } -/* Link underline animation */ +.grad-border { + position: relative; + background: #ffffff; + border-radius: 20px; + transition: transform 0.4s cubic-bezier(0.22, 1, 0.36, 1), + box-shadow 0.4s ease; + box-shadow: 0 4px 18px -10px rgba(15, 29, 23, 0.12); +} +.grad-border::before { + content: ''; + position: absolute; + inset: 0; + padding: 1px; + border-radius: inherit; + background: linear-gradient(135deg, + rgba(3, 199, 90, 0.55) 0%, + rgba(0, 196, 167, 0.38) 50%, + rgba(10, 176, 112, 0.30) 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); + box-shadow: 0 16px 40px -18px rgba(3, 199, 90, 0.35); +} +.grad-border:hover::before { + background: linear-gradient(135deg, + rgba(3, 199, 90, 0.95) 0%, + rgba(0, 196, 167, 0.75) 50%, + rgba(10, 176, 112, 0.60) 100%); +} + +/* ----------------------------------------------------------------- + * Buttons + * ----------------------------------------------------------------- */ +.btn-grad { + position: relative; + background: linear-gradient(135deg, #03C75A 0%, #00C4A7 60%, #0AB070 100%); + color: #ffffff; + border-radius: 999px; + padding: 14px 28px; + font-weight: 700; + letter-spacing: -0.01em; + box-shadow: 0 12px 28px -10px rgba(3, 199, 90, 0.5), + 0 0 0 1px rgba(255, 255, 255, 0.14) inset; + transition: transform 0.25s ease, box-shadow 0.25s ease; +} +.btn-grad:hover { + transform: translateY(-2px); + box-shadow: 0 18px 40px -10px rgba(3, 199, 90, 0.65), + 0 0 0 1px rgba(255, 255, 255, 0.2) inset; +} +.btn-ghost { + background: #ffffff; + color: #0F1D17; + border: 1px solid rgba(15, 29, 23, 0.12); + border-radius: 999px; + padding: 14px 28px; + font-weight: 700; + transition: background 0.2s ease, border-color 0.2s ease, transform 0.25s ease; +} +.btn-ghost:hover { + background: #F2FBF6; + border-color: #03C75A; + color: #02A149; + transform: translateY(-2px); +} + +/* ----------------------------------------------------------------- + * Card lift + * ----------------------------------------------------------------- */ +.card-lift { + transition: transform 0.4s cubic-bezier(0.22, 1, 0.36, 1), + box-shadow 0.4s ease, + background 0.3s ease; + box-shadow: 0 2px 12px -6px rgba(15, 29, 23, 0.1); +} +.card-lift:hover { + transform: translateY(-4px); + box-shadow: 0 18px 40px -18px rgba(3, 199, 90, 0.25); +} + +/* ----------------------------------------------------------------- + * Link underline + * ----------------------------------------------------------------- */ .link-underline { position: relative; display: inline-block; @@ -100,9 +361,315 @@ bottom: -2px; width: 0; height: 2px; - background: var(--color-warm-600); + background: #03C75A; transition: width 0.3s cubic-bezier(0.22, 1, 0.36, 1); } .link-underline:hover::after { width: 100%; } + +.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, #03C75A, #00C4A7, #0AB070); + 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 decorative ring + * ----------------------------------------------------------------- */ +.conic-ring { + background: conic-gradient( + from 0deg, + #03C75A 0deg, + #00C4A7 120deg, + #2BD673 240deg, + #03C75A 360deg + ); + filter: blur(2px); +} + +@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 LIGHT THEME OVERRIDES + * Remap legacy color tokens (warm / ink / white / sage) to the + * new white + Naver green palette. All sub-pages inherit this + * without code changes. + * ================================================================= */ + +/* --- Page / section backgrounds --- */ +.bg-warm-50, +.bg-warm-50\/50, +.bg-warm-50\/60, +.bg-warm-50\/70, +.bg-warm-50\/80 { background-color: #ffffff !important; } + +.bg-warm-100 { background-color: #F7FAF8 !important; } +.bg-warm-100\/40 { background-color: rgba(247, 250, 248, 0.6) !important; } +.bg-warm-100\/50 { background-color: rgba(247, 250, 248, 0.7) !important; } +.bg-warm-100\/60 { background-color: rgba(247, 250, 248, 0.82) !important; } +.bg-warm-100\/70 { background-color: rgba(247, 250, 248, 0.9) !important; } + +.bg-warm-200 { background-color: #EFF2F0 !important; } +.bg-warm-200\/50 { background-color: rgba(239, 242, 240, 0.7) !important; } + +/* --- Accent tints (warm-400/500/600/700) → Naver green family --- */ +.bg-warm-400\/15 { background-color: rgba(3, 199, 90, 0.12) !important; color: #02A149 !important; } +.bg-warm-400\/30 { background-color: rgba(3, 199, 90, 0.22) !important; color: #02A149 !important; } +.bg-warm-400\/40 { background-color: rgba(3, 199, 90, 0.32) !important; color: #02A149 !important; } +.bg-warm-500 { background-color: #03C75A !important; color: #ffffff !important; } +.bg-warm-500\/10 { background-color: rgba(3, 199, 90, 0.10) !important; } +.bg-warm-500\/15 { background-color: rgba(3, 199, 90, 0.16) !important; } +.bg-warm-500\/20 { background-color: rgba(3, 199, 90, 0.22) !important; } +.bg-warm-600 { background-color: #02A149 !important; color: #ffffff !important; } +.bg-warm-600\/90 { background-color: rgba(2, 161, 73, 0.92) !important; color: #ffffff !important; } +.bg-warm-700 { background-color: #018f40 !important; color: #ffffff !important; } +.bg-warm-800 { background-color: #0F1D17 !important; color: #ffffff !important; } +.bg-warm-900 { background-color: #0A1410 !important; color: #ffffff !important; } + +/* --- Ink (dark) backgrounds → near-black text surfaces remain, tint utilities soft gray --- */ +.bg-ink { background-color: #0F1D17 !important; color: #ffffff !important; } +.bg-ink\/5 { background-color: rgba(15, 29, 23, 0.04) !important; } +.bg-ink\/10 { background-color: rgba(15, 29, 23, 0.08) !important; } +.bg-ink\/20 { background-color: rgba(15, 29, 23, 0.14) !important; } + +/* --- Sage → Naver green (preserve semantic meaning) --- */ +.bg-sage-500 { background-color: #03C75A !important; color: #ffffff !important; } +.bg-sage-500\/5 { background-color: rgba(3, 199, 90, 0.06) !important; } +.bg-sage-500\/10 { background-color: rgba(3, 199, 90, 0.12) !important; } +.bg-sage-500\/15 { background-color: rgba(3, 199, 90, 0.18) !important; } +.bg-sage-500\/90 { background-color: rgba(3, 199, 90, 0.92) !important; color: #ffffff !important; } + +/* --- White backgrounds — keep truly white --- */ +.bg-white { background-color: #ffffff !important; color: #0F1D17 !important; } +.bg-white\/50 { background-color: rgba(255, 255, 255, 0.7) !important; backdrop-filter: blur(12px); -webkit-backdrop-filter: blur(12px); } +.bg-white\/60 { background-color: rgba(255, 255, 255, 0.78) !important; backdrop-filter: blur(14px); -webkit-backdrop-filter: blur(14px); } +.bg-white\/70 { background-color: rgba(255, 255, 255, 0.85) !important; backdrop-filter: blur(16px); -webkit-backdrop-filter: blur(16px); } +.bg-white\/80 { background-color: rgba(255, 255, 255, 0.9) !important; backdrop-filter: blur(18px); -webkit-backdrop-filter: blur(18px); } +.bg-white\/90 { background-color: rgba(255, 255, 255, 0.95) !important; } + +/* --- Night backgrounds (dark legacy) → light --- */ +.bg-night-0 { background-color: #ffffff !important; } +.bg-night-0\/70 { background-color: rgba(255, 255, 255, 0.82) !important; } +.bg-night-1 { background-color: #F7FAF8 !important; } +.bg-night-2 { background-color: #EFF2F0 !important; } +.bg-night-3 { background-color: #E4E8E6 !important; } + +/* --- Text colors --- */ +.text-ink { color: #0F1D17 !important; } +.text-ink-light { color: #3E4A44 !important; } +.text-ink-muted { color: #7B8581 !important; } +.text-warm-50 { color: #ffffff !important; } +.text-warm-100 { color: #F7FAF8 !important; } +.text-warm-200 { color: #7B8581 !important; } +.text-warm-400 { color: #03C75A !important; } +.text-warm-500 { color: #03C75A !important; } +.text-warm-600 { color: #02A149 !important; } +.text-warm-700 { color: #018f40 !important; } +.text-warm-800 { color: #0F1D17 !important; } +.text-warm-900 { color: #0A1410 !important; } +.text-sage-500 { color: #03C75A !important; } +.text-sage-600 { color: #02A149 !important; } + +.text-cloud-0 { color: #0F1D17 !important; } +.text-cloud-1 { color: rgba(15, 29, 23, 0.92) !important; } +.text-cloud-2 { color: rgba(15, 29, 23, 0.68) !important; } +.text-cloud-3 { color: rgba(15, 29, 23, 0.5) !important; } +.text-cloud-4 { color: rgba(15, 29, 23, 0.35) !important; } + +/* --- Borders --- */ +.border-ink { border-color: rgba(15, 29, 23, 0.85) !important; } +.border-ink\/5 { border-color: rgba(15, 29, 23, 0.06) !important; } +.border-ink\/10 { border-color: rgba(15, 29, 23, 0.1) !important; } +.border-ink\/15 { border-color: rgba(15, 29, 23, 0.14) !important; } +.border-ink\/20 { border-color: rgba(15, 29, 23, 0.18) !important; } +.border-ink\/40 { border-color: rgba(15, 29, 23, 0.3) !important; } +.border-warm-200 { border-color: #EFF2F0 !important; } +.border-warm-200\/30 { border-color: rgba(239, 242, 240, 0.6) !important; } +.border-warm-200\/60 { border-color: rgba(228, 232, 230, 0.9) !important; } +.border-warm-300\/40 { border-color: rgba(3, 199, 90, 0.28) !important; } +.border-warm-500 { border-color: #03C75A !important; } + +.border-white { border-color: #ffffff !important; } +.border-white\/5 { border-color: rgba(15, 29, 23, 0.05) !important; } +.border-white\/\[0\.06\] { border-color: rgba(15, 29, 23, 0.06) !important; } +.border-white\/\[0\.08\] { border-color: rgba(15, 29, 23, 0.08) !important; } +.border-white\/10 { border-color: rgba(15, 29, 23, 0.08) !important; } +.border-white\/15 { border-color: rgba(15, 29, 23, 0.1) !important; } +.border-white\/20 { border-color: rgba(15, 29, 23, 0.12) !important; } +.border-white\/30 { border-color: rgba(15, 29, 23, 0.18) !important; } + +/* bg white/0.02, 0.03 etc (glass tints on dark theme) → very subtle gray */ +.bg-white\/\[0\.02\] { background-color: #FAFCFB !important; } +.bg-white\/\[0\.03\] { background-color: #F7FAF8 !important; } +.bg-white\/\[0\.04\] { background-color: #F5F8F6 !important; } +.bg-white\/\[0\.05\] { background-color: #F2F6F4 !important; } +.bg-white\/\[0\.08\] { background-color: #EEF3F0 !important; } + +/* --- Hover variants --- */ +.hover\:bg-warm-50:hover { background-color: #F7FAF8 !important; } +.hover\:bg-warm-100:hover { background-color: #EFF2F0 !important; } +.hover\:bg-warm-200:hover { background-color: #E4E8E6 !important; } +.hover\:bg-warm-400:hover { background-color: #2BD673 !important; color: #ffffff !important; } +.hover\:bg-warm-500:hover { background-color: #02A149 !important; color: #ffffff !important; } +.hover\:bg-warm-600:hover { background-color: #018f40 !important; color: #ffffff !important; } +.hover\:bg-warm-700:hover { background-color: #0F1D17 !important; color: #ffffff !important; } +.hover\:bg-warm-800:hover { background-color: #0A1410 !important; color: #ffffff !important; } +.hover\:text-warm-600:hover { color: #02A149 !important; } +.hover\:text-warm-700:hover { color: #018f40 !important; } +.hover\:text-warm-800:hover { color: #0F1D17 !important; } +.hover\:border-ink\/40:hover { border-color: rgba(15, 29, 23, 0.3) !important; } +.hover\:border-warm-200:hover { border-color: #03C75A !important; } +.hover\:text-cloud-0:hover { color: #03C75A !important; } + +/* --- Form inputs: light theme --- */ +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: #ffffff !important; + border: 1px solid #E4E8E6 !important; + color: #0F1D17 !important; + border-radius: 10px; + transition: border-color 0.2s ease, box-shadow 0.2s ease; +} +input::placeholder, +textarea::placeholder { + color: rgba(15, 29, 23, 0.42) !important; +} +input:focus, +textarea:focus, +select:focus { + border-color: #03C75A !important; + box-shadow: 0 0 0 4px rgba(3, 199, 90, 0.18) !important; + outline: none !important; +} +input[type="checkbox"], +input[type="radio"] { + accent-color: #03C75A; +} +select option { + background-color: #ffffff; + color: #0F1D17; +} + +/* --- Blog article prose --- */ +.prose, +.prose-lg, +.prose-xl { + --tw-prose-body: #3E4A44; + --tw-prose-headings: #0F1D17; + --tw-prose-lead: #3E4A44; + --tw-prose-links: #02A149; + --tw-prose-bold: #0F1D17; + --tw-prose-counters: #7B8581; + --tw-prose-bullets: #B6BEB9; + --tw-prose-hr: #E4E8E6; + --tw-prose-quotes: #0F1D17; + --tw-prose-quote-borders: #03C75A; + --tw-prose-captions: #7B8581; + --tw-prose-code: #02A149; + --tw-prose-pre-code: #0F1D17; + --tw-prose-pre-bg: #F7FAF8; + --tw-prose-th-borders: #E4E8E6; + --tw-prose-td-borders: #EFF2F0; +} + +*:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +html, body { + background-color: #ffffff; + color-scheme: light; +} + +/* ----------------------------------------------------------------- + * Mobile-first helpers for the app-style home layout + * ----------------------------------------------------------------- */ +.category-tile { + position: relative; + overflow: hidden; + border-radius: 24px; + transition: transform 0.3s ease, box-shadow 0.3s ease; +} +.category-tile:active { transform: scale(0.98); } +.category-tile.primary { + background: linear-gradient(135deg, #03C75A 0%, #02A149 55%, #018f40 100%); + color: #ffffff; + box-shadow: 0 16px 40px -12px rgba(3, 199, 90, 0.45); +} +.category-tile.soft { + background: #F2FBF6; + color: #02A149; + border: 1px solid #D5EEE0; +} +.category-tile.neutral { + background: #ffffff; + color: #0F1D17; + border: 1px solid #E4E8E6; +} + +/* Photo hero for property detail */ +.photo-hero { + position: relative; + width: 100%; + aspect-ratio: 4 / 3; + overflow: hidden; + background: #EFF2F0; +} +@media (min-width: 768px) { + .photo-hero { aspect-ratio: 16 / 9; border-radius: 24px; } +} diff --git a/apps/web/src/app/layout.tsx b/apps/web/src/app/layout.tsx index 7b8f44e..64ffd06 100644 --- a/apps/web/src/app/layout.tsx +++ b/apps/web/src/app/layout.tsx @@ -65,93 +65,155 @@ 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' }, +]; + +const MOBILE_TABS = [ + { href: '/', label: '홈', icon: 'M3 12l9-9 9 9M5 10v10h14V10' }, + { href: '/stores', label: '매장', icon: 'M21 21l-4.35-4.35M16 10a6 6 0 10-12 0 6 6 0 0012 0z' }, + { href: '/matching', label: '매칭', icon: 'M7 8h10M7 12h6M7 16h10M3 4h18v16H3z' }, + { href: '/subsidies', label: '지원금', icon: 'M12 3v18M6 8h9a3 3 0 010 6H9a3 3 0 000 6h9' }, +]; + async function Navigation() { const session = await auth(); const isOperator = session?.user && OPERATOR_ROLES.includes(session.user.primaryRole); return ( -