Files
portfolio/app/globals.css
denshooter 976a6360fd feat: Website-Rework mit verbessertem Design, Sicherheit und Deployment
- Neue About/Skills-Sektion hinzugefügt
- Verbesserte UI/UX für alle Komponenten
- Enhanced Contact Form mit Validierung
- Verbesserte Security Headers und Middleware
- Sichere Deployment-Skripte (safe-deploy.sh)
- Zero-Downtime Deployment Support
- Verbesserte Docker-Sicherheit
- Umfassende Sicherheits-Dokumentation
- Performance-Optimierungen
- Accessibility-Verbesserungen
2025-11-22 19:24:49 +01:00

696 lines
16 KiB
CSS

@tailwind base;
@tailwind components;
@tailwind utilities;
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800&display=swap');
/* Monaco Font for Domain */
@font-face {
font-family: 'Monaco';
src: url('https://fonts.gstatic.com/s/monaco/v1/Monaco-Regular.woff2') format('woff2');
font-weight: normal;
font-style: normal;
font-display: swap;
}
:root {
--background: #0a0a0a;
--foreground: #fafafa;
--card: #0f0f0f;
--card-foreground: #fafafa;
--popover: #0f0f0f;
--popover-foreground: #fafafa;
--primary: #3b82f6;
--primary-foreground: #f8fafc;
--secondary: #1e293b;
--secondary-foreground: #f1f5f9;
--muted: #1e293b;
--muted-foreground: #64748b;
--accent: #1e293b;
--accent-foreground: #f1f5f9;
--destructive: #ef4444;
--destructive-foreground: #f8fafc;
--border: #1e293b;
--input: #1e293b;
--ring: #3b82f6;
--radius: 0.5rem;
}
* {
border-color: hsl(var(--border));
}
html {
scroll-behavior: smooth;
scroll-padding-top: 80px;
}
body {
background-color: hsl(var(--background));
color: hsl(var(--foreground));
font-family: 'Inter', sans-serif;
margin: 0;
padding: 0;
position: relative;
min-height: 100vh;
overflow-x: hidden;
}
/* Custom Scrollbar */
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: hsl(var(--background));
}
::-webkit-scrollbar-thumb {
background: hsl(var(--muted));
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: hsl(var(--muted-foreground));
}
/* Glassmorphism Effects */
.glass {
background: rgba(15, 15, 15, 0.85);
backdrop-filter: blur(20px) saturate(180%);
-webkit-backdrop-filter: blur(20px) saturate(180%);
border: 1px solid rgba(255, 255, 255, 0.1);
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
}
.glass-card {
background: rgba(15, 15, 15, 0.7);
backdrop-filter: blur(16px) saturate(180%);
-webkit-backdrop-filter: blur(16px) saturate(180%);
border: 1px solid rgba(255, 255, 255, 0.1);
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.2);
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.glass-card:hover {
background: rgba(15, 15, 15, 0.8);
border-color: rgba(255, 255, 255, 0.15);
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
}
/* Admin Panel Specific Glassmorphism */
.admin-glass {
background: rgba(255, 255, 255, 0.05) !important;
backdrop-filter: blur(20px) !important;
border: 1px solid rgba(255, 255, 255, 0.15) !important;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4) !important;
}
.admin-glass-card {
background: rgba(255, 255, 255, 0.08) !important;
backdrop-filter: blur(16px) !important;
border: 1px solid rgba(255, 255, 255, 0.2) !important;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3) !important;
}
.admin-glass-light {
background: rgba(255, 255, 255, 0.12) !important;
backdrop-filter: blur(12px) !important;
border: 1px solid rgba(255, 255, 255, 0.25) !important;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2) !important;
}
/* Admin Hover States */
.admin-hover:hover {
background: rgba(255, 255, 255, 0.15) !important;
border: 1px solid rgba(255, 255, 255, 0.3) !important;
transform: scale(1.02) !important;
transition: all 0.2s ease !important;
}
/* Admin Gradient Background */
.admin-gradient {
background:
radial-gradient(circle at 20% 80%, rgba(59, 130, 246, 0.15) 0%, transparent 50%),
radial-gradient(circle at 80% 20%, rgba(139, 92, 246, 0.15) 0%, transparent 50%),
radial-gradient(circle at 40% 40%, rgba(236, 72, 153, 0.08) 0%, transparent 50%),
linear-gradient(-45deg, #0a0a0a, #111111, #0d0d0d, #151515);
background-size: 400% 400%, 400% 400%, 400% 400%, 400% 400%;
animation: gradientShift 25s ease infinite;
min-height: 100vh;
}
/* Admin Glass Header */
.admin-glass-header {
background: rgba(255, 255, 255, 0.08) !important;
backdrop-filter: blur(20px) !important;
border-bottom: 1px solid rgba(255, 255, 255, 0.15) !important;
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3) !important;
}
/* Editor-specific styles */
.editor-content-editable:empty:before {
content: attr(data-placeholder);
color: #9ca3af;
pointer-events: none;
font-style: italic;
opacity: 0.7;
}
.editor-content-editable:focus:before {
content: none;
}
.editor-content-editable:empty {
min-height: 400px;
display: flex;
align-items: flex-start;
padding-top: 1.5rem;
}
.editor-content-editable:not(:empty) {
min-height: 400px;
}
/* Enhanced form styling */
.form-input-enhanced {
background: rgba(17, 24, 39, 0.8) !important;
border: 1px solid rgba(75, 85, 99, 0.5) !important;
color: #ffffff !important;
transition: all 0.3s ease !important;
backdrop-filter: blur(10px) !important;
}
.form-input-enhanced:focus {
border-color: #3b82f6 !important;
box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2), 0 0 20px rgba(59, 130, 246, 0.1) !important;
background: rgba(17, 24, 39, 0.9) !important;
transform: translateY(-1px) !important;
}
.form-input-enhanced::placeholder {
color: #9ca3af !important;
}
/* Select styling */
select.form-input-enhanced {
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e");
background-position: right 0.5rem center;
background-repeat: no-repeat;
background-size: 1.5em 1.5em;
padding-right: 2.5rem;
appearance: none;
cursor: pointer;
}
select.form-input-enhanced:focus {
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%233b82f6' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e");
}
/* Custom dropdown styling */
.custom-select {
position: relative;
display: inline-block;
width: 100%;
}
.custom-select select {
width: 100%;
padding: 0.75rem 2.5rem 0.75rem 0.75rem;
background: rgba(17, 24, 39, 0.8);
border: 1px solid rgba(75, 85, 99, 0.5);
border-radius: 0.5rem;
color: #ffffff;
font-size: 0.875rem;
cursor: pointer;
transition: all 0.3s ease;
backdrop-filter: blur(10px);
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e");
background-position: right 0.75rem center;
background-repeat: no-repeat;
background-size: 1.25em 1.25em;
}
.custom-select select:focus {
outline: none;
border-color: #3b82f6;
box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.2), 0 0 20px rgba(59, 130, 246, 0.1);
background: rgba(17, 24, 39, 0.9);
transform: translateY(-1px);
background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%233b82f6' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e");
}
/* Ensure no default browser arrows show */
.custom-select select::-ms-expand {
display: none;
}
.custom-select select::-webkit-appearance {
-webkit-appearance: none;
}
/* Gradient Text */
.gradient-text {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
/* Domain Text with Monaco Font */
.domain-text {
font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
font-size: 2.5rem;
font-weight: bold;
letter-spacing: 0.1em;
position: relative;
}
@media (min-width: 768px) {
.domain-text {
font-size: 3.5rem;
}
}
@media (min-width: 1024px) {
.domain-text {
font-size: 4rem;
}
}
.gradient-text-blue {
background: linear-gradient(135deg, #3b82f6 0%, #1d4ed8 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
/* Animated Background */
.animated-bg {
background:
radial-gradient(circle at 20% 80%, rgba(59, 130, 246, 0.08) 0%, transparent 50%),
radial-gradient(circle at 80% 20%, rgba(139, 92, 246, 0.08) 0%, transparent 50%),
radial-gradient(circle at 40% 40%, rgba(236, 72, 153, 0.04) 0%, transparent 50%),
linear-gradient(-45deg, #0a0a0a, #111111, #0d0d0d, #151515);
background-size: 400% 400%, 400% 400%, 400% 400%, 400% 400%;
animation: gradientShift 25s ease infinite;
}
/* Film Grain / TV Noise Effect */
.animated-bg::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-image:
radial-gradient(circle at 2px 2px, rgba(255,255,255,0.08) 2px, transparent 0),
radial-gradient(circle at 4px 4px, rgba(0,0,0,0.04) 2px, transparent 0),
radial-gradient(circle at 6px 6px, rgba(255,255,255,0.06) 2px, transparent 0),
radial-gradient(circle at 8px 8px, rgba(0,0,0,0.03) 2px, transparent 0);
background-size: 4px 4px, 6px 6px, 8px 8px, 10px 10px;
pointer-events: none;
opacity: 0.7;
}
@keyframes filmGrain {
0%, 100% {
background-position: 0px 0px, 0px 0px, 0px 0px;
}
10% {
background-position: -1px -1px, 1px 1px, -1px 1px;
}
20% {
background-position: 1px -1px, -1px 1px, 1px -1px;
}
30% {
background-position: -1px 1px, 1px -1px, -1px -1px;
}
40% {
background-position: 1px 1px, -1px -1px, 1px 1px;
}
50% {
background-position: -1px -1px, 1px 1px, -1px 1px;
}
60% {
background-position: 1px -1px, -1px 1px, 1px -1px;
}
70% {
background-position: -1px 1px, 1px -1px, -1px -1px;
}
80% {
background-position: 1px 1px, -1px -1px, 1px 1px;
}
90% {
background-position: -1px -1px, 1px 1px, -1px 1px;
}
}
@keyframes gradientShift {
0% { background-position: 0% 50%; }
50% { background-position: 100% 50%; }
100% { background-position: 0% 50%; }
}
/* Floating Animation */
@keyframes float {
0%, 100% { transform: translateY(0px); }
50% { transform: translateY(-20px); }
}
.animate-float {
animation: float 6s ease-in-out infinite;
}
/* Glow Effects */
.glow {
box-shadow: 0 0 20px rgba(59, 130, 246, 0.3);
}
.glow-hover:hover {
box-shadow: 0 0 30px rgba(59, 130, 246, 0.5);
transition: box-shadow 0.3s ease;
}
/* Particle Background */
.particles {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
overflow: hidden;
z-index: -1;
}
.particle {
position: absolute;
width: 2px;
height: 2px;
background: rgba(59, 130, 246, 0.5);
border-radius: 50%;
animation: particleFloat 20s infinite linear;
}
@keyframes particleFloat {
0% {
transform: translateY(100vh) rotate(0deg);
opacity: 0;
}
10% {
opacity: 1;
}
90% {
opacity: 1;
}
100% {
transform: translateY(-100vh) rotate(360deg);
opacity: 0;
}
}
/* Markdown Styles */
.markdown {
color: #ffffff !important;
line-height: 1.7;
}
.markdown h1 {
font-size: 2.5rem;
font-weight: 700;
margin-top: 2rem;
margin-bottom: 1rem;
color: #ffffff !important;
background: linear-gradient(135deg, #3b82f6, #1d4ed8);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.markdown h2 {
font-size: 2rem;
font-weight: 600;
margin-top: 1.5rem;
margin-bottom: 1rem;
color: #ffffff !important;
}
.markdown h3 {
font-size: 1.5rem;
font-weight: 600;
margin-top: 1.25rem;
margin-bottom: 0.75rem;
color: #ffffff !important;
}
.markdown p {
margin-top: 0.75rem;
margin-bottom: 0.75rem;
line-height: 1.7;
color: #e5e7eb !important;
}
.markdown img {
max-width: 100%;
height: auto;
margin: 1.5rem 0;
border-radius: 12px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
transition: transform 0.3s ease;
}
.markdown img:hover {
transform: scale(1.02);
}
.markdown ul, .markdown ol {
margin: 1rem 0;
padding-left: 2rem;
}
.markdown li {
margin: 0.5rem 0;
color: #e5e7eb !important;
}
.markdown blockquote {
border-left: 4px solid #3b82f6;
background: rgba(59, 130, 246, 0.1);
padding: 1rem 1.5rem;
margin: 1.5rem 0;
border-radius: 8px;
font-style: italic;
color: #e5e7eb !important;
}
.markdown code {
background: rgba(59, 130, 246, 0.1);
color: #3b82f6 !important;
padding: 0.2rem 0.4rem;
border-radius: 4px;
font-size: 0.9em;
}
.markdown pre {
background: #0f0f0f;
border: 1px solid #1e293b;
border-radius: 8px;
padding: 1rem;
overflow-x: auto;
margin: 1.5rem 0;
}
.markdown pre code {
background: none;
color: #ffffff !important;
padding: 0;
}
.markdown a {
color: #3b82f6 !important;
text-decoration: underline;
transition: color 0.2s ease;
}
.markdown a:hover {
color: #1d4ed8 !important;
}
.markdown strong {
color: #ffffff !important;
font-weight: 600;
}
.markdown em {
color: #e5e7eb !important;
font-style: italic;
}
/* Button Styles */
.btn-primary {
background: linear-gradient(135deg, #3b82f6, #1d4ed8);
color: white;
padding: 0.75rem 1.5rem;
border-radius: 12px;
font-weight: 600;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
border: none;
cursor: pointer;
position: relative;
overflow: hidden;
box-shadow: 0 4px 14px rgba(59, 130, 246, 0.3);
}
.btn-primary:hover {
transform: translateY(-2px);
box-shadow: 0 8px 30px rgba(59, 130, 246, 0.5);
background: linear-gradient(135deg, #2563eb, #1e40af);
}
.btn-primary:active {
transform: translateY(0);
}
.btn-primary::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.2), transparent);
transition: left 0.5s;
}
.btn-primary:hover::before {
left: 100%;
}
.btn-secondary {
background: transparent;
color: #e5e7eb;
padding: 0.75rem 1.5rem;
border-radius: 12px;
font-weight: 600;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
border: 2px solid rgba(75, 85, 99, 0.5);
cursor: pointer;
position: relative;
overflow: hidden;
}
.btn-secondary:hover {
border-color: rgba(75, 85, 99, 0.8);
background: rgba(31, 41, 55, 0.5);
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
/* Card Hover Effects */
.card-hover {
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
cursor: pointer;
}
.card-hover:hover {
transform: translateY(-8px) scale(1.02);
box-shadow: 0 20px 40px rgba(0, 0, 0, 0.4);
}
/* Line clamp utility */
.line-clamp-3 {
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}
/* Loading Animation */
@keyframes pulse {
0%, 100% { opacity: 1; }
50% { opacity: 0.5; }
}
.animate-pulse {
animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
}
/* Fade In Animation */
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.fade-in-up {
animation: fadeInUp 0.6s ease-out;
}
/* Focus visible improvements */
*:focus-visible {
outline: 2px solid #3b82f6;
outline-offset: 2px;
border-radius: 4px;
}
/* Selection styling */
::selection {
background-color: rgba(59, 130, 246, 0.3);
color: #ffffff;
}
::-moz-selection {
background-color: rgba(59, 130, 246, 0.3);
color: #ffffff;
}
/* Improved scrollbar for webkit */
::-webkit-scrollbar {
width: 10px;
height: 10px;
}
::-webkit-scrollbar-track {
background: hsl(var(--background));
}
::-webkit-scrollbar-thumb {
background: linear-gradient(180deg, #3b82f6, #1d4ed8);
border-radius: 5px;
border: 2px solid hsl(var(--background));
}
::-webkit-scrollbar-thumb:hover {
background: linear-gradient(180deg, #2563eb, #1e40af);
}
/* Responsive Design */
@media (max-width: 768px) {
.markdown h1 {
font-size: 2rem;
}
.markdown h2 {
font-size: 1.75rem;
}
.markdown h3 {
font-size: 1.25rem;
}
.domain-text {
font-size: 2rem;
}
}