From 0ec34d5eed6764e47c3cb55420ff8994bac62ec5 Mon Sep 17 00:00:00 2001 From: repi Date: Mon, 1 Jan 2001 00:00:00 +0000 Subject: [PATCH] feat: add global styles with animations and effects --- apps/web/src/app/globals.css | 365 +++++++++++++++++++++++++++++++++++ 1 file changed, 365 insertions(+) create mode 100644 apps/web/src/app/globals.css diff --git a/apps/web/src/app/globals.css b/apps/web/src/app/globals.css new file mode 100644 index 0000000..276341c --- /dev/null +++ b/apps/web/src/app/globals.css @@ -0,0 +1,365 @@ +@import "tailwindcss"; + +:root { + --background: #0a0a0f; + --surface: rgba(255, 255, 255, 0.03); + --surface-hover: rgba(255, 255, 255, 0.06); + --border: rgba(255, 255, 255, 0.08); + --border-strong: rgba(255, 255, 255, 0.15); + + --text-primary: #ffffff; + --text-secondary: #a1a1aa; + --text-muted: #71717a; + + --accent-blue: #3b82f6; + --accent-indigo: #6366f1; + --accent-purple: #9333ea; + --accent-cyan: #06b6d4; + + --gradient-primary: linear-gradient(135deg, #3b82f6 0%, #6366f1 50%, #9333ea 100%); + --gradient-subtle: linear-gradient(135deg, rgba(59, 130, 246, 0.1) 0%, rgba(147, 51, 234, 0.1) 100%); + + --shadow-glow: 0 0 40px rgba(59, 130, 246, 0.3); + --shadow-card: 0 4px 24px rgba(0, 0, 0, 0.4); +} + +* { + box-sizing: border-box; +} + +html { + scroll-behavior: smooth; +} + +body { + background-color: var(--background); + color: var(--text-primary); + font-feature-settings: "rlig" 1, "calt" 1; +} + +::selection { + background: rgba(59, 130, 246, 0.3); + color: white; +} + +.glass { + background: var(--surface); + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); + border: 1px solid var(--border); +} + +.glass-strong { + background: rgba(255, 255, 255, 0.05); + backdrop-filter: blur(24px); + -webkit-backdrop-filter: blur(24px); + border: 1px solid var(--border-strong); +} + +.gradient-text { + background: var(--gradient-primary); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; +} + +.gradient-border { + position: relative; +} + +.gradient-border::before { + content: ""; + position: absolute; + inset: 0; + border-radius: inherit; + padding: 1px; + background: var(--gradient-primary); + -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); + mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0); + -webkit-mask-composite: xor; + mask-composite: exclude; + pointer-events: none; +} + +.glow { + box-shadow: var(--shadow-glow); +} + +.glow-subtle { + box-shadow: 0 0 60px rgba(59, 130, 246, 0.15); +} + +@keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +@keyframes slide-up { + from { + opacity: 0; + transform: translateY(24px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes slide-down { + from { + opacity: 0; + transform: translateY(-12px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes scale-in { + from { + opacity: 0; + transform: scale(0.95); + } + to { + opacity: 1; + transform: scale(1); + } +} + +@keyframes pulse-glow { + 0%, 100% { + box-shadow: 0 0 20px rgba(59, 130, 246, 0.4); + } + 50% { + box-shadow: 0 0 40px rgba(59, 130, 246, 0.6), 0 0 60px rgba(147, 51, 234, 0.3); + } +} + +@keyframes shimmer { + 0% { + background-position: -200% 0; + } + 100% { + background-position: 200% 0; + } +} + +@keyframes float { + 0%, 100% { + transform: translateY(0); + } + 50% { + transform: translateY(-10px); + } +} + +@keyframes spin-slow { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +.animate-fade-in { + animation: fade-in 0.6s ease-out forwards; +} + +.animate-slide-up { + animation: slide-up 0.6s ease-out forwards; +} + +.animate-slide-down { + animation: slide-down 0.4s ease-out forwards; +} + +.animate-scale-in { + animation: scale-in 0.4s ease-out forwards; +} + +.animate-pulse-glow { + animation: pulse-glow 2s ease-in-out infinite; +} + +.animate-shimmer { + background: linear-gradient(90deg, transparent, rgba(255,255,255,0.1), transparent); + background-size: 200% 100%; + animation: shimmer 2s infinite; +} + +.animate-float { + animation: float 6s ease-in-out infinite; +} + +.animate-spin-slow { + animation: spin-slow 20s linear infinite; +} + +.stagger-1 { animation-delay: 0.1s; } +.stagger-2 { animation-delay: 0.2s; } +.stagger-3 { animation-delay: 0.3s; } +.stagger-4 { animation-delay: 0.4s; } +.stagger-5 { animation-delay: 0.5s; } + +.scrollbar-thin { + scrollbar-width: thin; + scrollbar-color: rgba(255, 255, 255, 0.2) transparent; +} + +.scrollbar-thin::-webkit-scrollbar { + width: 6px; + height: 6px; +} + +.scrollbar-thin::-webkit-scrollbar-track { + background: transparent; +} + +.scrollbar-thin::-webkit-scrollbar-thumb { + background: rgba(255, 255, 255, 0.2); + border-radius: 3px; +} + +.scrollbar-thin::-webkit-scrollbar-thumb:hover { + background: rgba(255, 255, 255, 0.3); +} + +.bg-grid { + background-image: + linear-gradient(rgba(255, 255, 255, 0.03) 1px, transparent 1px), + linear-gradient(90deg, rgba(255, 255, 255, 0.03) 1px, transparent 1px); + background-size: 60px 60px; +} + +.bg-gradient-radial { + background: radial-gradient(ellipse at top, rgba(59, 130, 246, 0.15) 0%, transparent 50%), + radial-gradient(ellipse at bottom, rgba(147, 51, 234, 0.1) 0%, transparent 50%); +} + +.noise { + position: relative; +} + +.noise::after { + content: ""; + position: absolute; + inset: 0; + background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)'/%3E%3C/svg%3E"); + opacity: 0.03; + pointer-events: none; +} + +.btn-primary { + background: var(--gradient-primary); + color: white; + font-weight: 500; + padding: 0.75rem 1.5rem; + border-radius: 0.5rem; + transition: all 0.2s ease; + position: relative; + overflow: hidden; +} + +.btn-primary:hover { + transform: translateY(-1px); + box-shadow: 0 8px 30px rgba(59, 130, 246, 0.4); +} + +.btn-primary:active { + transform: translateY(0); +} + +.btn-secondary { + background: var(--surface); + color: var(--text-primary); + font-weight: 500; + padding: 0.75rem 1.5rem; + border-radius: 0.5rem; + border: 1px solid var(--border); + transition: all 0.2s ease; +} + +.btn-secondary:hover { + background: var(--surface-hover); + border-color: var(--border-strong); +} + +.input-field { + background: rgba(0, 0, 0, 0.3); + border: 1px solid var(--border); + border-radius: 0.5rem; + padding: 0.75rem 1rem; + color: var(--text-primary); + transition: all 0.2s ease; + width: 100%; +} + +.input-field:focus { + outline: none; + border-color: var(--accent-blue); + box-shadow: 0 0 3px rgba(59, 130, 246, 0.1); +} + +.input-field::placeholder { + color: var(--text-muted); +} + +.card { + background: var(--surface); + border: 1px solid var(--border); + border-radius: 1rem; + padding: 1.5rem; + transition: all 0.3s ease; +} + +.card:hover { + background: var(--surface-hover); + border-color: var(--border-strong); + transform: translateY(-2px); +} + +.icon-box { + width: 3rem; + height: 3rem; + border-radius: 0.75rem; + background: var(--gradient-subtle); + border: 1px solid var(--border); + display: flex; + align-items: center; + justify-content: center; + color: var(--accent-blue); +} + +.badge { + display: inline-flex; + align-items: center; + gap: 0.375rem; + padding: 0.25rem 0.75rem; + background: var(--surface); + border: 1px solid var(--border); + border-radius: 9999px; + font-size: 0.75rem; + font-weight: 500; + color: var(--text-secondary); +} + +.code-block { + background: rgba(0, 0, 0, 0.5); + border: 1px solid var(--border); + border-radius: 0.75rem; + padding: 1rem; + font-family: var(--font-mono), ui-monospace, monospace; + font-size: 0.875rem; + overflow-x: auto; +} + +.divider { + height: 1px; + background: linear-gradient(90deg, transparent, var(--border), transparent); +}