dvorakmortonxd.dev/src/app/page.css
2026-05-15 23:44:30 +02:00

1068 lines
22 KiB
CSS

@font-face {
font-family: 'Monocraft';
src: url('/Monocraft.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'Monocraft';
src: url('/Monocraft-Bold.ttf') format('truetype');
font-weight: bold;
font-style: normal;
}
@font-face {
font-family: 'Monocraft';
src: url('/Monocraft-Italic.ttf') format('truetype');
font-weight: normal;
font-style: italic;
}
:root {
/* Gruvbox Dark Theme */
--bg: #1d2021;
--bg-soft: #282828;
--bg-hard: #32302f;
--fg: #ebdbb2;
--gray: #a89984;
--accent: #fabd2f; /* Gruvbox Yellow */
--accent2: #fe8019; /* Gruvbox Orange */
--accent3: #d79921; /* Gruvbox Dark Yellow */
--green: #b8bb26; /* Gruvbox Green */
--aqua: #8ec07c; /* Gruvbox Aqua */
--blue: #83a598; /* Gruvbox Blue */
--purple: #d3869b; /* Gruvbox Purple */
--red: #fb4934; /* Gruvbox Red */
--darkpink: #ff0043; /* Custom Dark Pink */
--font-custom-mono: 'Monocraft', 'JetBrains Mono', 'Fira Code', 'Source Code Pro', 'Courier New', monospace;
--card-bg: rgba(40, 40, 40, 0.65);
--card-border: rgba(168, 153, 132, 0.35);
--tui-border: var(--gray);
--tui-border-highlight: var(--accent);
--radius: 0px;
}
/* RESET */
* {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html {
scroll-behavior: smooth;
}
body {
min-height: 100vh;
background: var(--bg);
color: var(--fg);
font-family: var(--font-custom-mono);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
overflow-x: hidden;
font-size: 14px;
line-height: 1.5;
}
/* Container */
.container {
width: 100%;
max-width: 1080px;
margin: 0 auto;
padding: 0 16px;
position: relative;
z-index: 1;
}
/* ============================================
HEADER - TUI top bar
============================================ */
.header {
position: sticky;
top: 0;
left: 0;
width: 100%;
z-index: 1000;
border-bottom: 1px solid var(--tui-border);
background-color: rgba(29, 32, 33, 0.4) !important;
backdrop-filter: blur(20px) saturate(150%) !important;
-webkit-backdrop-filter: blur(20px) saturate(150%) !important;
padding: 0;
}
.header-center {
max-width: 1100px;
margin: 0 auto;
display: flex;
align-items: center;
padding: 8px 16px;
gap: 10px;
}
.logo {
height: 28px;
width: 28px;
border-radius: 4px;
object-fit: cover;
border: 1px solid var(--accent);
opacity: 0.9;
transition: opacity 0.15s ease;
}
.logo:hover {
opacity: 1;
box-shadow: 0 0 8px rgba(250, 189, 47, 0.4);
}
.site-name {
font-weight: 700;
font-size: 1rem;
font-family: var(--font-custom-mono), 'JetBrains Mono', monospace;
color: var(--accent);
letter-spacing: 0.02em;
}
/* ============================================
HERO - TUI welcome panel
============================================ */
.hero {
text-align: left;
padding: 0;
position: relative;
z-index: 2;
margin-top: 16px;
}
.hero-panel {
border: 1px solid var(--accent);
background: rgba(29, 32, 33, 0.75);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
padding: 20px 24px;
position: relative;
}
.hero-panel-label {
position: absolute;
top: -1px;
left: 16px;
transform: translateY(-50%);
background: rgba(29, 32, 33, 0.95);
padding: 0 8px;
font-size: 0.8rem;
font-weight: 700;
color: var(--accent);
letter-spacing: 0.08em;
text-transform: uppercase;
}
.hero-title {
font-size: 1.6rem;
font-weight: 800;
color: var(--accent);
margin-bottom: 8px;
letter-spacing: -0.01em;
}
.hero-subtitle {
font-size: 0.9rem;
color: var(--gray);
line-height: 1.6;
max-width: none;
margin: 0;
}
.text-green {
color: var(--green);
}
.text-blue {
color: var(--blue);
}
.mail-contact {
text-align: center;
margin-bottom: 18px;
color: var(--fg);
font-size: 0.9rem;
}
.mail-contact a {
color: var(--blue);
text-decoration: none;
}
.about-section {
margin-top: 16px;
}
.about-content {
padding: 20px 24px;
color: var(--fg);
font-family: var(--font-custom-mono);
font-size: 0.9rem;
line-height: 1.6;
}
.label-blue { color: var(--blue); }
.label-yellow { color: var(--accent); }
.label-green { color: var(--green); }
.cursor-blink {
display: inline-block;
width: 8px;
height: 1.1em;
background: var(--accent);
margin-left: 4px;
vertical-align: text-bottom;
animation: cursorBlink 1s step-end infinite;
}
@keyframes cursorBlink {
0%, 100% { opacity: 1; }
50% { opacity: 0; }
}
/* ============================================
SOCIAL BUTTONS - TUI list style
============================================ */
.social-section {
margin-top: 16px;
}
.tui-panel {
border: 1px solid var(--tui-border);
background: rgba(29, 32, 33, 0.75);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
position: relative;
}
.tui-panel-label {
position: absolute;
top: -1px;
left: 16px;
transform: translateY(-50%);
background: rgba(29, 32, 33, 0.95);
padding: 0 8px;
font-size: 0.8rem;
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
}
.social-buttons {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
gap: 0;
padding: 12px 0;
}
.social-button {
display: flex;
align-items: center;
gap: 10px;
padding: 6px 20px;
background: transparent;
border: none;
color: var(--fg);
text-decoration: none;
font-weight: 500;
font-size: 0.85rem;
font-family: var(--font-custom-mono), 'JetBrains Mono', monospace;
transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);
position: relative;
border-bottom: 2px solid transparent;
border-radius: 0;
overflow: hidden;
z-index: 1;
}
.social-button::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent, rgba(250, 189, 47, 0.2), transparent);
transition: left 0.5s ease;
z-index: -1;
}
.social-button:hover::before {
left: 100%;
}
.social-button:hover {
background: rgba(250, 189, 47, 0.08);
color: var(--accent);
}
.social-icon {
width: 16px;
height: 16px;
opacity: 0.7;
transition: opacity 0.15s ease;
}
.social-button:hover .social-icon {
opacity: 1;
filter: drop-shadow(0 0 4px rgba(250, 189, 47, 0.4));
}
.social-label {
transition: color 0.15s ease;
}
/* ============================================
SERVICES SECTION - TUI grid
============================================ */
.services-section {
margin-top: 16px;
padding-top: 0;
}
.services-title {
display: none;
}
.services-buttons {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 0;
padding: 12px 0;
}
.service-button {
display: flex;
align-items: center;
gap: 12px;
padding: 10px 20px;
background: transparent;
border: none;
border-radius: 0;
text-decoration: none;
color: var(--fg);
font-family: var(--font-custom-mono), 'JetBrains Mono', monospace;
min-width: 0;
position: relative;
overflow: hidden;
z-index: 1;
transition: all 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);
}
.service-button::before {
content: '';
position: absolute;
top: -100%;
left: 0;
width: 100%;
height: 100%;
background: linear-gradient(180deg, transparent, rgba(250, 189, 47, 0.15), transparent);
transition: top 0.4s ease;
z-index: -1;
}
.service-button:hover::before {
top: 100%;
}
.service-button:last-child {
border-bottom: none;
}
.service-button:hover {
background: rgba(250, 189, 47, 0.08);
transform: translateY(-3px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}
.service-icon {
font-size: 1.4rem;
transition: transform 0.15s ease;
width: 28px;
text-align: center;
filter: none;
}
.service-button:hover .service-icon {
transform: scale(1.1);
}
.service-button.friend .service-icon {
display: grid;
place-items: center;
width: 56px;
height: 56px;
border-radius: 50%;
overflow: hidden;
flex-shrink: 0;
}
.friend-icon {
display: block;
width: 56px;
height: 56px;
border-radius: 50%;
object-fit: cover;
}
.service-text {
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 1px;
}
.service-name {
font-size: 0.9rem;
font-weight: 700;
color: var(--fg);
transition: color 0.15s ease;
}
.service-button.proxmox:hover .service-name { color: var(--blue); }
.service-button.ai:hover .service-name { color: var(--green); }
.service-button.jellyfin:hover .service-name { color: var(--purple); }
.service-button.pterodactyl:hover .service-name { color: var(--red); }
.service-button.funkwhale:hover .service-name { color: var(--darkpink); }
.service-button.mailcow:hover .service-name { color: var(--accent); }
.service-button.searxng:hover .service-name { color: var(--aqua); }
.service-button.convertx:hover .service-name { color: var(--gray); }
.service-button.gitdxd:hover .service-name { color: var(--purple); }
.service-button.proxmox { border-color: rgba(168, 153, 132, 0.1); }
.service-button.ai { border-color: rgba(168, 153, 132, 0.1); }
.service-button.jellyfin { border-color: rgba(168, 153, 132, 0.1); }
.service-button.pterodactyl { border-color: rgba(168, 153, 132, 0.1); }
.service-button.funkwhale { border-color: rgba(255, 0, 67, 0.1); }
.service-button.mailcow { border-color: rgba(168, 153, 132, 0.1); }
.service-button.searxng { border-color: rgba(168, 153, 132, 0.1); }
.service-button.convertx { border-color: rgba(168, 153, 132, 0.1); }
.service-button.gitdxd { border-color: rgba(255, 0, 67, 0.1); }
.service-desc {
font-size: 0.75rem;
color: var(--gray);
transition: color 0.15s ease;
font-family: var(--font-custom-mono), 'JetBrains Mono', monospace;
}
.service-button:hover .service-desc {
color: var(--fg);
}
/* ============================================
PROJECTS - TUI sections
============================================ */
.projects {
margin-top: 16px;
padding: 0;
text-align: left;
position: relative;
z-index: 2;
}
.section-title {
display: none;
}
.subsection-title {
display: none;
}
.subsection-wrapper {
margin-top: 16px;
}
.subsection-panel {
border: 1px solid var(--tui-border);
background: rgba(29, 32, 33, 0.75);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
position: relative;
padding: 20px 16px 16px;
}
.subsection-panel-label {
position: absolute;
top: -1px;
left: 16px;
transform: translateY(-50%);
background: rgba(29, 32, 33, 0.95);
padding: 0 8px;
font-size: 0.8rem;
font-weight: 700;
color: var(--accent2);
letter-spacing: 0.08em;
text-transform: uppercase;
}
.subsection-panel.coding-panel .subsection-panel-label {
color: var(--purple);
}
.subsection-panel.friends-panel {
background: rgba(255, 255, 255, 0.08); /* slightly light */
backdrop-filter: blur(16px);
-webkit-backdrop-filter: blur(16px);
}
.subsection-panel.friends-panel .subsection-panel-label {
color: var(--aqua);
}
/* Project grid & cards */
.project-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(310px, 1fr));
gap: 12px;
max-width: none;
margin: 0;
padding: 0;
}
.friends-grid {
grid-template-columns: repeat(auto-fill, minmax(45%, 1fr));
}
.video-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 16px;
max-width: none;
margin: 0;
padding: 0;
}
.project-card {
background: rgba(50, 48, 47, 0.35);
border: 1px solid rgba(168, 153, 132, 0.18);
border-radius: 0;
padding: 12px;
width: 100%;
text-decoration: none;
color: inherit;
transition: all 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
position: relative;
overflow: hidden;
box-shadow: none;
backdrop-filter: none;
transform: translateZ(0);
will-change: transform;
}
.project-card::after {
content: '';
position: absolute;
top: 0;
left: -150%;
width: 50%;
height: 100%;
background: linear-gradient(to right, rgba(255,255,255,0) 0%, rgba(255,255,255,0.06) 50%, rgba(255,255,255,0) 100%);
transform: skewX(-25deg);
transition: all 0.6s ease;
z-index: 2;
pointer-events: none;
}
.project-card:hover::after {
left: 167%;
}
.project-card:hover {
border-color: var(--accent);
background: rgba(50, 48, 47, 0.6);
transform: translateY(-6px) scale(1.01);
}
.project-image {
height: 160px;
width: 100%;
background-size: cover;
background-position: center;
background-repeat: no-repeat;
border-radius: 0;
margin-bottom: 10px;
border: 1px solid rgba(168, 153, 132, 0.15);
transition: all 0.2s ease;
box-shadow: none;
}
.project-card:hover .project-image {
border-color: rgba(250, 189, 47, 0.3);
transform: none;
}
.project-title {
font-size: 0.95rem;
font-weight: 700;
color: var(--fg);
margin-bottom: 4px;
font-family: var(--font-custom-mono), 'JetBrains Mono', monospace;
transition: color 0.15s ease;
}
.project-card:hover .project-title {
color: var(--accent);
text-shadow: none;
}
.project-desc {
color: var(--gray);
font-size: 0.8rem;
line-height: 1.5;
margin-top: 4px;
font-family: var(--font-custom-mono), 'JetBrains Mono', monospace;
}
.project-card:hover .project-desc {
color: var(--fg);
}
/* Friends section styles */
.friend-card-wrapper {
display: flex;
flex-direction: column;
}
.friend-header {
display: flex;
align-items: center;
background-color: #3c3836;
padding: 4px 8px;
border-top-left-radius: 3px;
border-top-right-radius: 3px;
}
.window-icon {
width: 16px;
height: 16px;
margin-right: 8px;
}
.friend-iframe-container {
flex-grow: 1;
overflow: hidden;
border: 1px solid var(--card-border);
border-top: none;
aspect-ratio: 16 / 9;
transform: translateZ(0);
will-change: transform;
}
.friend-iframe {
width: 100%;
height: 100%;
border: none;
}
/* ============================================
FOOTER - TUI status bar
============================================ */
.footer {
margin-top: 16px;
margin-bottom: 24px;
padding: 10px 20px;
text-align: center;
color: var(--gray);
border: 1px solid var(--tui-border);
font-size: 0.8rem;
font-family: var(--font-custom-mono), 'JetBrains Mono', monospace;
position: relative;
z-index: 2;
background: rgba(29, 32, 33, 0.75);
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
box-shadow: none;
}
.footer-label {
position: absolute;
top: -1px;
right: 16px;
transform: translateY(-50%);
background: rgba(29, 32, 33, 0.95);
padding: 0 8px;
font-size: 0.7rem;
font-weight: 700;
color: var(--gray);
letter-spacing: 0.08em;
text-transform: uppercase;
}
/* ============================================
ANIMATIONS
============================================ */
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
.hero { animation: fadeIn 0.5s ease both; }
.social-section { animation: fadeIn 0.5s ease 0.1s both; }
.services-section { animation: fadeIn 0.5s ease 0.2s both; }
.projects { animation: fadeIn 0.5s ease 0.3s both; }
.footer { animation: fadeIn 0.5s ease 0.4s both; }
.project-card {
opacity: 0;
animation: fadeIn 0.3s ease forwards;
}
.project-grid .project-card:nth-child(1) { animation-delay: 0.05s; }
.project-grid .project-card:nth-child(2) { animation-delay: 0.1s; }
.project-grid .project-card:nth-child(3) { animation-delay: 0.15s; }
.project-grid .project-card:nth-child(4) { animation-delay: 0.2s; }
.project-grid .project-card:nth-child(5) { animation-delay: 0.25s; }
.project-grid .project-card:nth-child(6) { animation-delay: 0.3s; }
.project-grid .project-card:nth-child(7) { animation-delay: 0.35s; }
.project-grid .project-card:nth-child(8) { animation-delay: 0.4s; }
.project-grid .project-card:nth-child(9) { animation-delay: 0.45s; }
.project-grid .project-card:nth-child(10) { animation-delay: 0.5s; }
.project-grid .project-card:nth-child(11) { animation-delay: 0.55s; }
.project-grid .project-card:nth-child(12) { animation-delay: 0.6s; }
.project-grid .project-card:nth-child(13) { animation-delay: 0.65s; }
.project-grid .project-card:nth-child(14) { animation-delay: 0.7s; }
/* Custom scrollbar - thin TUI style */
::-webkit-scrollbar {
width: 8px;
}
::-webkit-scrollbar-track {
background: var(--bg);
}
::-webkit-scrollbar-thumb {
background: var(--gray);
border: 2px solid var(--bg);
}
::-webkit-scrollbar-thumb:hover {
background: var(--accent);
}
/* Selection styling */
::selection {
background: rgba(250, 189, 47, 0.35);
color: var(--fg);
}
/* ============================================
RESPONSIVE
============================================ */
@media (max-width: 768px) {
.container {
padding: 0 8px;
}
.hero-panel {
padding: 16px 20px;
}
.hero-title {
font-size: 1.4rem;
}
.project-grid {
grid-template-columns: 1fr;
gap: 10px;
}
.social-buttons {
grid-template-columns: 1fr 1fr;
}
.services-buttons {
grid-template-columns: 1fr;
}
.friends-buttons {
grid-template-columns: 1fr;
}
.friends-grid {
grid-template-columns: 1fr;
}
.video-grid {
grid-template-columns: repeat(2, 1fr);
gap: 10px;
}
.friend-iframe-container {
aspect-ratio: 16 / 9;
}
.gym-grid {
gap: 12px;
padding: 16px;
}
.gym-item {
padding: 12px;
gap: 8px;
}
.gym-weight {
font-size: 1.4rem;
}
}
@media (max-width: 520px) {
.container {
padding: 0 4px;
}
.hero-title {
font-size: 1.2rem;
}
.social-buttons {
grid-template-columns: 1fr;
}
.gym-grid {
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 4px;
padding: 12px 4px;
}
.gym-item {
padding: 8px 2px;
gap: 4px;
min-width: 0;
}
.gym-icon {
max-width: 32px !important;
}
.gym-label {
font-size: 0.55rem;
letter-spacing: 0.02em;
}
.gym-weight {
font-size: 0.95rem;
}
.project-grid {
grid-template-columns: 1fr;
}
.video-grid {
grid-template-columns: 1fr;
gap: 10px;
}
.project-image {
height: 130px;
}
.subsection-panel {
padding: 12px 8px;
}
}
/* Reduced motion for accessibility */
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
/* ============================================
SEARCH BAR
============================================ */
.search-section {
margin-top: 16px;
}
.search-form {
display: flex;
padding: 20px 24px;
}
.search-bar {
width: 100%;
padding: 12px 16px;
background: rgba(255, 255, 255, 0.05); /* very transparent */
backdrop-filter: blur(10px) saturate(120%);
-webkit-backdrop-filter: blur(10px) saturate(120%);
border: 1px solid var(--tui-border);
color: var(--fg);
font-family: var(--font-custom-mono), monospace;
font-size: 1rem;
outline: none;
transition: all 0.3s ease;
}
.search-bar:focus {
border-color: var(--red);
box-shadow: 0 0 10px rgba(74, 233, 52, 0.3);
}
.search-bar::placeholder {
color: var(--gray);
}
/* Joker Animation */
.joker-flash-overlay {
position: fixed;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
z-index: 99999;
pointer-events: none;
display: flex;
justify-content: center;
align-items: center;
background: rgba(0, 0, 0, 0.1);
}
.joker-img {
max-width: 90vw;
max-height: 90vh;
animation: jokerFlash 1.2s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards;
filter: drop-shadow(0 0 50px rgba(255, 0, 67, 0.8));
}
@keyframes jokerFlash {
0% {
opacity: 0;
transform: scale(0.1);
}
15% {
opacity: 1;
transform: scale(2.5) rotate(-5deg);
}
60% {
opacity: 1;
transform: scale(1.5) rotate(5deg);
}
100% {
opacity: 0;
transform: scale(0) rotate(-20deg);
}
}
/* ============================================
GYM PANEL
============================================ */
.gym-section {
margin-top: 16px;
}
.gym-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 16px;
padding: 24px;
text-align: center;
}
.gym-item {
display: flex;
flex-direction: column;
align-items: center;
gap: 10px;
padding: 16px;
background: rgba(255, 255, 255, 0.02);
border: 1px solid rgba(168, 153, 132, 0.1);
transition: all 0.3s ease;
}
.gym-item:hover {
background: rgba(250, 189, 47, 0.05);
border-color: rgba(250, 189, 47, 0.3);
transform: translateY(-4px);
}
.gym-icon {
opacity: 0.9;
transition: opacity 0.3s ease, filter 0.3s ease;
width: 100%;
max-width: 48px;
height: auto;
}
.gym-item:hover .gym-icon {
opacity: 1;
filter: drop-shadow(0 0 8px rgba(250, 189, 47, 0.8));
}
.gym-label {
font-size: 0.85rem;
font-weight: 700;
color: var(--gray);
letter-spacing: 0.08em;
text-transform: uppercase;
}
.gym-weight {
font-size: 1.6rem;
font-weight: 800;
color: var(--fg);
font-family: var(--font-custom-mono), monospace;
}
/* ============================================
HEATMAP
============================================ */
.heatmap-container {
display: flex;
width: 100%;
overflow-x: auto;
gap: 2px;
scrollbar-width: none;
scrollbar-color: var(--gray) transparent;
}
.heatmap-week {
display: flex;
flex-direction: column;
flex: 1;
gap: 2px;
}
.heatmap-cell {
width: 100%;
aspect-ratio: 1;
border-radius: 2px;
background-color: var(--bg-hard);
transition: transform 0.1s ease;
}
.heatmap-cell:hover {
transform: scale(1.2);
z-index: 10;
box-shadow: 0 0 6px rgba(184, 187, 38, 0.5);
}
.heatmap-cell[data-level="1"] { background-color: rgba(184, 187, 38, 0.4); }
.heatmap-cell[data-level="2"] { background-color: rgba(184, 187, 38, 0.6); }
.heatmap-cell[data-level="3"] { background-color: rgba(184, 187, 38, 0.8); }
.heatmap-cell[data-level="4"] { background-color: rgba(184, 187, 38, 1); }
.heatmap-legend-cell {
width: 11px;
height: 11px;
border-radius: 2px;
background-color: var(--bg-hard);
flex-shrink: 0;
}
.heatmap-legend-cell[data-level="1"] { background-color: rgba(184, 187, 38, 0.4); }
.heatmap-legend-cell[data-level="2"] { background-color: rgba(184, 187, 38, 0.6); }
.heatmap-legend-cell[data-level="3"] { background-color: rgba(184, 187, 38, 0.8); }
.heatmap-legend-cell[data-level="4"] { background-color: rgba(184, 187, 38, 1); }