From 6d484f346e737d91354791cf5bd01a02c7283672 Mon Sep 17 00:00:00 2001 From: AdamBtech <60339324+AdamBtech@users.noreply.github.com> Date: Mon, 26 May 2025 22:11:05 +0200 Subject: [PATCH] Added fade in animation about and projects pages --- src/app/pages/about/about.component.css | 551 +++++++++ src/app/pages/about/about.component.html | 98 +- src/app/pages/projects/projects.component.css | 1018 +++++++++++++++++ .../pages/projects/projects.component.html | 58 +- 4 files changed, 1655 insertions(+), 70 deletions(-) diff --git a/src/app/pages/about/about.component.css b/src/app/pages/about/about.component.css index e69de29..4bf9d26 100644 --- a/src/app/pages/about/about.component.css +++ b/src/app/pages/about/about.component.css @@ -0,0 +1,551 @@ +/* ===================== NEURAL PROFILE SECTION ANIMATIONS ===================== */ + +/* Section Container Animation */ +.neural-section { + opacity: 0; + transform: translateY(30px); + animation: neuralSectionMaterialize 1.2s ease-out 0.1s forwards; +} + +@keyframes neuralSectionMaterialize { + 0% { + opacity: 0; + transform: translateY(30px); + filter: blur(2px); + } + 60% { + opacity: 0.8; + transform: translateY(-5px); + filter: blur(0.5px); + } + 100% { + opacity: 1; + transform: translateY(0); + filter: blur(0px); + } +} + +/* Header Section Animation */ +.neural-header { + opacity: 0; + transform: translateY(-20px); + animation: neuralHeaderSlideDown 1s ease-out 0.3s forwards; +} + +@keyframes neuralHeaderSlideDown { + 0% { + opacity: 0; + transform: translateY(-20px); + filter: blur(1px); + } + 70% { + opacity: 0.9; + transform: translateY(3px); + filter: blur(0.3px); + } + 100% { + opacity: 1; + transform: translateY(0); + filter: blur(0px); + } +} + +/* Divider Line Animation */ +.neural-divider { + opacity: 0; + transform: scaleX(0); + transform-origin: left; + animation: neuralDividerExpand 0.8s ease-out 0.8s forwards; +} + +@keyframes neuralDividerExpand { + 0% { + opacity: 0; + transform: scaleX(0); + } + 50% { + opacity: 0.3; + transform: scaleX(0.7); + } + 100% { + opacity: 0.5; + transform: scaleX(1); + } +} + +/* Main Content Grid Animation */ +.neural-content-grid { + opacity: 0; + transform: translateY(40px); + animation: neuralContentReveal 1.2s ease-out 0.5s forwards; +} + +@keyframes neuralContentReveal { + 0% { + opacity: 0; + transform: translateY(40px); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} + +/* Left Panel - Neural Profile Tree Animation */ +.neural-left-panel { + opacity: 0; + transform: translateX(-40px) scale(0.95); + animation: neuralLeftPanelSlideIn 1.2s ease-out 0.7s forwards; +} + +@keyframes neuralLeftPanelSlideIn { + 0% { + opacity: 0; + transform: translateX(-40px) scale(0.95); + border-color: transparent; + background-color: rgba(41, 41, 37, 0); + } + 40% { + opacity: 0.6; + transform: translateX(-10px) scale(0.98); + border-color: var(--color-nier-border); + } + 80% { + opacity: 0.9; + transform: translateX(2px) scale(1.01); + background-color: var(--color-nier-bg); + } + 100% { + opacity: 1; + transform: translateX(0) scale(1); + border-color: var(--color-nier-border); + background-color: var(--color-nier-bg); + } +} + +/* Neural Profile Tree Content */ +.neural-tree-container { + opacity: 0; + transform: translateY(20px); + animation: neuralTreeContentFadeUp 0.8s ease-out 1.2s forwards; +} + +@keyframes neuralTreeContentFadeUp { + 0% { + opacity: 0; + transform: translateY(20px); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} + +/* Right Panel Container Animation */ +.neural-right-panel { + opacity: 0; + transform: translateX(40px); + animation: neuralRightPanelSlideIn 1s ease-out 0.9s forwards; +} + +@keyframes neuralRightPanelSlideIn { + 0% { + opacity: 0; + transform: translateX(40px); + } + 100% { + opacity: 1; + transform: translateX(0); + } +} + +/* Video Display Panel Animation */ +.neural-video-panel { + opacity: 0; + transform: scale(0.95) translateY(20px); + animation: neuralVideoPanelMaterialize 1.2s ease-out 1.1s forwards; +} + +@keyframes neuralVideoPanelMaterialize { + 0% { + opacity: 0; + transform: scale(0.95) translateY(20px); + border-color: transparent; + background-color: rgba(41, 41, 37, 0); + } + 30% { + opacity: 0.4; + transform: scale(0.98) translateY(10px); + border-color: var(--color-nier-accent); + } + 70% { + opacity: 0.8; + transform: scale(1.01) translateY(-2px); + background-color: var(--color-nier-dark); + } + 100% { + opacity: 1; + transform: scale(1) translateY(0); + border-color: var(--color-nier-accent); + background-color: var(--color-nier-dark); + } +} + +/* Video Container Inner Animation */ +.neural-video-inner { + opacity: 0; + transform: scale(0.9); + animation: neuralVideoInnerExpand 0.8s ease-out 1.5s forwards; +} + +@keyframes neuralVideoInnerExpand { + 0% { + opacity: 0; + transform: scale(0.9); + border-color: transparent; + background-color: rgba(0, 0, 0, 0); + } + 60% { + opacity: 0.7; + transform: scale(1.02); + border-color: rgba(255, 201, 102, 0.3); + } + 100% { + opacity: 1; + transform: scale(1); + border-color: rgba(255, 201, 102, 0.5); + background-color: rgba(41, 41, 37, 0.1); + } +} + +/* Holo Video Component Animation */ +.neural-holo-video { + opacity: 0; + animation: neuralHoloVideoFadeIn 1s ease-out 1.8s forwards; +} + +@keyframes neuralHoloVideoFadeIn { + 0% { + opacity: 0; + filter: blur(2px) brightness(0.5); + } + 50% { + opacity: 0.7; + filter: blur(1px) brightness(0.8); + } + 100% { + opacity: 1; + filter: blur(0px) brightness(1); + } +} + +/* Status Panel Animation */ +.neural-status-panel { + opacity: 0; + transform: translateY(30px) scale(0.95); + animation: neuralStatusPanelRise 1s ease-out 1.3s forwards; +} + +@keyframes neuralStatusPanelRise { + 0% { + opacity: 0; + transform: translateY(30px) scale(0.95); + border-color: transparent; + background-color: rgba(41, 41, 37, 0); + } + 40% { + opacity: 0.6; + transform: translateY(10px) scale(0.98); + border-color: var(--color-nier-border); + } + 80% { + opacity: 0.9; + transform: translateY(-2px) scale(1.01); + background-color: var(--color-nier-mid); + } + 100% { + opacity: 1; + transform: translateY(0) scale(1); + border-color: var(--color-nier-border); + background-color: var(--color-nier-mid); + } +} + +/* Status Grid Content Animation */ +.neural-status-grid { + opacity: 0; + transform: translateY(15px); + animation: neuralStatusGridFadeUp 0.6s ease-out 1.7s forwards; +} + +@keyframes neuralStatusGridFadeUp { + 0% { + opacity: 0; + transform: translateY(15px); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} + +/* Status Items Staggered Animation */ +.neural-status-item { + opacity: 0; + transform: translateX(-15px); + animation: neuralStatusItemSlideIn 0.5s ease-out forwards; +} + +.neural-status-item:nth-child(1) { animation-delay: 1.9s; } +.neural-status-item:nth-child(2) { animation-delay: 2.1s; } + +@keyframes neuralStatusItemSlideIn { + 0% { + opacity: 0; + transform: translateX(-15px); + } + 100% { + opacity: 1; + transform: translateX(0); + } +} + +/* Status Labels Animation */ +.neural-status-label { + opacity: 0; + transform: translateY(-5px); + animation: neuralStatusLabelFadeDown 0.4s ease-out forwards; +} + +.neural-status-item:nth-child(1) .neural-status-label { animation-delay: 2.0s; } +.neural-status-item:nth-child(2) .neural-status-label { animation-delay: 2.2s; } + +@keyframes neuralStatusLabelFadeDown { + 0% { + opacity: 0; + transform: translateY(-5px); + } + 100% { + opacity: 0.6; + transform: translateY(0); + } +} + +/* Status Values Animation */ +.neural-status-value { + opacity: 0; + transform: scale(0.9); + animation: neuralStatusValuePop 0.4s ease-out forwards; +} + +.neural-status-item:nth-child(1) .neural-status-value { animation-delay: 2.1s; } +.neural-status-item:nth-child(2) .neural-status-value { animation-delay: 2.3s; } + +@keyframes neuralStatusValuePop { + 0% { + opacity: 0; + transform: scale(0.9); + } + 50% { + opacity: 0.8; + transform: scale(1.05); + } + 100% { + opacity: 1; + transform: scale(1); + } +} + +/* Pulse Animation for Status Indicator */ +.neural-pulse-dot { + opacity: 0; + animation: neuralPulseDotAppear 0.6s ease-out forwards; +} + +.neural-status-item:nth-child(1) .neural-pulse-dot { animation-delay: 2.2s; } + +@keyframes neuralPulseDotAppear { + 0% { + opacity: 0; + transform: scale(0.5); + } + 50% { + opacity: 0.8; + transform: scale(1.2); + } + 100% { + opacity: 1; + transform: scale(1); + } +} + +/* Background Checkered Pattern Enhancement */ +.neural-checkered-bg { + position: relative; +} + +.neural-checkered-bg::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + opacity: 0; + background-image: + linear-gradient(45deg, rgba(255, 201, 102, 0.01) 25%, transparent 25%), + linear-gradient(-45deg, rgba(255, 201, 102, 0.01) 25%, transparent 25%), + linear-gradient(45deg, transparent 75%, rgba(255, 201, 102, 0.01) 75%), + linear-gradient(-45deg, transparent 75%, rgba(255, 201, 102, 0.01) 75%); + background-size: 30px 30px; + background-position: 0 0, 0 15px, 15px -15px, -15px 0px; + animation: neuralBgPatternFadeIn 3s ease-out 0.2s forwards; + pointer-events: none; + z-index: 0; +} + +@keyframes neuralBgPatternFadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +/* Scanning Line Effect for Neural Section */ +.neural-scan-line { + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 2px; + background: linear-gradient(90deg, + transparent, + rgba(255, 201, 102, 0.6), + transparent + ); + animation: neuralScanLine 4s ease-in-out 1s forwards; + z-index: 1; +} + +@keyframes neuralScanLine { + 0% { + left: -100%; + opacity: 0; + } + 20% { + opacity: 1; + } + 80% { + opacity: 1; + } + 100% { + left: 100%; + opacity: 0; + } +} + +/* ===================== RESPONSIVE DESIGN ===================== */ + +@media (max-width: 1024px) { + /* Faster animations on tablets */ + .neural-section { + animation-duration: 1s; + } + + .neural-left-panel, + .neural-video-panel { + animation-duration: 1s; + } + + .neural-right-panel { + animation-duration: 0.8s; + animation-delay: 0.7s; + } +} + +@media (max-width: 768px) { + /* Much faster animations on mobile */ + .neural-section { + animation-duration: 0.8s; + animation-delay: 0.05s; + } + + .neural-header { + animation-duration: 0.6s; + animation-delay: 0.2s; + } + + .neural-divider { + animation-duration: 0.5s; + animation-delay: 0.4s; + } + + .neural-content-grid { + animation-duration: 0.8s; + animation-delay: 0.3s; + } + + .neural-left-panel { + animation-duration: 0.8s; + animation-delay: 0.4s; + } + + .neural-right-panel { + animation-duration: 0.6s; + animation-delay: 0.5s; + } + + .neural-video-panel { + animation-duration: 0.8s; + animation-delay: 0.6s; + } + + .neural-status-panel { + animation-duration: 0.6s; + animation-delay: 0.7s; + } + + .neural-status-item:nth-child(1) { animation-delay: 0.9s; } + .neural-status-item:nth-child(2) { animation-delay: 1.0s; } + + .neural-status-item:nth-child(1) .neural-status-label { animation-delay: 1.0s; } + .neural-status-item:nth-child(2) .neural-status-label { animation-delay: 1.1s; } + + .neural-status-item:nth-child(1) .neural-status-value { animation-delay: 1.1s; } + .neural-status-item:nth-child(2) .neural-status-value { animation-delay: 1.2s; } + + .neural-status-item:nth-child(1) .neural-pulse-dot { animation-delay: 1.2s; } +} + +/* ===================== ACCESSIBILITY ===================== */ + +/* Respect reduced motion preferences */ +@media (prefers-reduced-motion: reduce) { + .neural-section, + .neural-header, + .neural-divider, + .neural-content-grid, + .neural-left-panel, + .neural-tree-container, + .neural-right-panel, + .neural-video-panel, + .neural-video-inner, + .neural-holo-video, + .neural-status-panel, + .neural-status-grid, + .neural-status-item, + .neural-status-label, + .neural-status-value, + .neural-pulse-dot { + animation: none !important; + opacity: 1 !important; + transform: none !important; + } + + .neural-checkered-bg::before, + .neural-scan-line { + display: none !important; + } +} diff --git a/src/app/pages/about/about.component.html b/src/app/pages/about/about.component.html index 657678b..4e9b415 100644 --- a/src/app/pages/about/about.component.html +++ b/src/app/pages/about/about.component.html @@ -1,58 +1,64 @@ -
+
- -
- - -
-
+ +
- -
- - -
-
- -
- -
-
+ +
+ + +
- -
+ +
- -
-
-
- -
+ +
+
+ +
+ +
+
-
- -
-
- -
-
-
STATUS
-
-
- NEURAL SCAN ACTIVE -
+ +
+ + +
+
+
+ +
+
-
-
MODE
-
REAL-TIME ANALYSIS
+ + +
+
+ +
+ +
+
STATUS
+
+
+ NEURAL SCAN ACTIVE +
+
+ +
+
MODE
+
REAL-TIME ANALYSIS
+
+ +
+
-
-
-
diff --git a/src/app/pages/projects/projects.component.css b/src/app/pages/projects/projects.component.css index b14fbf3..29c8c11 100644 --- a/src/app/pages/projects/projects.component.css +++ b/src/app/pages/projects/projects.component.css @@ -1,3 +1,5 @@ +/* ===================== EXISTING ANIMATIONS ===================== */ + .animate-scan { background: linear-gradient(90deg, transparent, rgba(0, 0, 0, 0.1), transparent); animation: scan 3s infinite; @@ -28,3 +30,1019 @@ grid-template-columns: 1fr; } } + +/* ===================== NEW PAGE-LEVEL ANIMATIONS ===================== */ + +/* Section Title Animation */ +.section-title-container { + opacity: 0; + transform: translateY(-30px); + animation: sectionTitleSlideDown 1s ease-out 0.2s forwards; +} + +@keyframes sectionTitleSlideDown { + 0% { + opacity: 0; + transform: translateY(-30px); + filter: blur(2px); + } + 60% { + opacity: 0.8; + transform: translateY(5px); + filter: blur(0.5px); + } + 100% { + opacity: 1; + transform: translateY(0); + filter: blur(0px); + } +} + +/* Terminal Header Animation */ +.terminal-header { + opacity: 0; + transform: scale(0.95) translateY(20px); + animation: terminalHeaderMaterialize 1.2s ease-out 0.4s forwards; +} + +@keyframes terminalHeaderMaterialize { + 0% { + opacity: 0; + transform: scale(0.95) translateY(20px); + border-color: transparent; + background-color: rgba(41, 41, 37, 0); + } + 30% { + opacity: 0.4; + transform: scale(0.98) translateY(10px); + border-color: var(--color-nier-border); + } + 70% { + opacity: 0.8; + transform: scale(1.01) translateY(-2px); + background-color: var(--color-nier-checkered-bg); + } + 100% { + opacity: 1; + transform: scale(1) translateY(0); + border-color: var(--color-nier-border); + background-color: var(--color-nier-checkered-bg); + } +} + +/* Terminal Header Text Lines */ +.terminal-line { + opacity: 0; + transform: translateX(-20px); + animation: terminalLineType 0.6s ease-out forwards; +} + +.terminal-line:nth-child(1) { animation-delay: 0.8s; } +.terminal-line:nth-child(2) { animation-delay: 1.2s; } +.terminal-line:nth-child(3) { animation-delay: 1.6s; } + +@keyframes terminalLineType { + 0% { + opacity: 0; + transform: translateX(-20px); + } + 50% { + opacity: 0.7; + transform: translateX(-5px); + } + 100% { + opacity: 1; + transform: translateX(0); + } +} + +/* Progress Bar Container Animation */ +.progress-container { + opacity: 0; + transform: scaleX(0.8); + animation: progressContainerExpand 0.8s ease-out 1.0s forwards; +} + +@keyframes progressContainerExpand { + 0% { + opacity: 0; + transform: scaleX(0.8); + border-color: transparent; + } + 100% { + opacity: 1; + transform: scaleX(1); + border-color: var(--color-nier-accent); + } +} + +/* Directory Tree Animation */ +.directory-tree { + opacity: 0; + transform: translateY(30px); + animation: directoryTreeRise 1s ease-out 0.6s forwards; +} + +@keyframes directoryTreeRise { + 0% { + opacity: 0; + transform: translateY(30px); + border-color: transparent; + background-color: rgba(41, 41, 37, 0); + } + 40% { + opacity: 0.6; + transform: translateY(10px); + border-color: var(--color-nier-accent); + } + 100% { + opacity: 1; + transform: translateY(0); + border-color: var(--color-nier-accent); + background-color: var(--color-nier-dark); + } +} + +/* Directory Tree Header */ +.directory-header { + opacity: 0; + transform: translateX(-30px); + animation: directoryHeaderSlide 0.7s ease-out 1.2s forwards; +} + +@keyframes directoryHeaderSlide { + 0% { + opacity: 0; + transform: translateX(-30px); + border-bottom-color: transparent; + } + 100% { + opacity: 1; + transform: translateX(0); + border-bottom-color: var(--color-nier-mid); + } +} + +/* Enhanced Directory Lines Animation */ +.animate-fade-in-line { + opacity: 0; + transform: translateX(-15px); + animation: directoryLineFadeIn 0.4s ease-out forwards; +} + +@keyframes directoryLineFadeIn { + 0% { + opacity: 0; + transform: translateX(-15px); + } + 100% { + opacity: 1; + transform: translateX(0); + } +} + +/* Projects Grid Container Animation */ +.projects-grid { + opacity: 0; + transform: translateY(40px); + animation: projectsGridReveal 1s ease-out 0.8s forwards; +} + +@keyframes projectsGridReveal { + 0% { + opacity: 0; + transform: translateY(40px); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} + +/* Footer Animation */ +.directory-footer { + opacity: 0; + transform: translateY(20px); + animation: footerSlideUp 0.8s ease-out 1.4s forwards; +} + +@keyframes footerSlideUp { + 0% { + opacity: 0; + transform: translateY(20px); + border-top-color: transparent; + } + 100% { + opacity: 1; + transform: translateY(0); + border-top-color: var(--color-nier-border); + } +} + +/* Enhanced Scan Animation for Terminal Header */ +.enhanced-scan { + background: linear-gradient(90deg, + transparent, + rgba(255, 201, 102, 0.3), + transparent + ); + animation: enhancedScanAnimation 3s ease-in-out infinite; +} + +@keyframes enhancedScanAnimation { + 0% { + transform: translateX(-100%); + } + 50% { + transform: translateX(100%); + } + 100% { + transform: translateX(-100%); + } +} + +/* Background Pattern Animation */ +.checkered-background { + position: relative; +} + +.checkered-background::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + opacity: 0; + background-image: + linear-gradient(45deg, rgba(255, 201, 102, 0.02) 25%, transparent 25%), + linear-gradient(-45deg, rgba(255, 201, 102, 0.02) 25%, transparent 25%), + linear-gradient(45deg, transparent 75%, rgba(255, 201, 102, 0.02) 75%), + linear-gradient(-45deg, transparent 75%, rgba(255, 201, 102, 0.02) 75%); + background-size: 20px 20px; + background-position: 0 0, 0 10px, 10px -10px, -10px 0px; + animation: backgroundPatternFadeIn 2s ease-out 0.1s forwards; + pointer-events: none; +} + +@keyframes backgroundPatternFadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +/* ===================== EXISTING PROJECT CARD ANIMATIONS ===================== */ + +/* Base styles with fade-in animations */ +.project-card { + min-height: 300px; + cursor: pointer; + /* Animation - initially hidden */ + opacity: 0; + transform: scale(0.95) translateY(20px); + animation: cardMaterialize 1.2s ease-out forwards; +} + +/* Main card materialization animation */ +@keyframes cardMaterialize { + 0% { + opacity: 0; + transform: scale(0.95) translateY(20px); + filter: blur(2px); + } + 20% { + opacity: 0.3; + transform: scale(0.98) translateY(10px); + filter: blur(1px); + } + 60% { + opacity: 0.8; + transform: scale(1.01) translateY(-2px); + filter: blur(0px); + } + 100% { + opacity: 1; + transform: scale(1) translateY(0); + filter: blur(0px); + } +} + +/* Scanning line effect during load */ +.project-card::before { + content: ''; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 2px; + background: linear-gradient(90deg, + transparent, + var(--color-nier-accent), + transparent + ); + animation: scanLine 2s ease-out 0.2s forwards; + z-index: 20; +} + +@keyframes scanLine { + 0% { + left: -100%; + opacity: 0; + } + 50% { + opacity: 1; + } + 100% { + left: 100%; + opacity: 0; + } +} + +.project-card:not(.redacted):hover .click-indicator { + opacity: 1; + transition: opacity 0.3s cubic-bezier(0.4, 0, 0.2, 1); +} + +/* Header section animation */ +.project-header { + opacity: 0; + transform: translateX(-30px); + animation: headerSlideIn 0.8s ease-out 0.3s forwards; +} + +@keyframes headerSlideIn { + 0% { + opacity: 0; + transform: translateX(-30px); + border-bottom-color: transparent; + } + 50% { + opacity: 0.6; + transform: translateX(-5px); + } + 100% { + opacity: 1; + transform: translateX(0); + border-bottom-color: var(--color-nier-border); + } +} + +/* Status text fade-in effect (reduced glitch) */ +.project-status { + opacity: 0; + animation: statusFadeIn 0.6s ease-out 0.5s forwards; +} + +@keyframes statusFadeIn { + 0% { + opacity: 0; + transform: translateX(-10px); + } + 100% { + opacity: 1; + transform: translateX(0); + } +} + +/* Title fade and scale */ +.project-title { + opacity: 0; + transform: scale(0.9); + animation: titleExpand 0.7s ease-out 0.7s forwards; +} + +@keyframes titleExpand { + 0% { + opacity: 0; + transform: scale(0.9); + letter-spacing: -0.1em; + } + 70% { + opacity: 0.8; + transform: scale(1.02); + letter-spacing: 0.05em; + } + 100% { + opacity: 1; + transform: scale(1); + letter-spacing: 0.1em; + } +} + +/* Body content staggered animation */ +.project-body { + opacity: 0; + animation: bodyFadeUp 0.8s ease-out 0.9s forwards; +} + +@keyframes bodyFadeUp { + 0% { + opacity: 0; + transform: translateY(15px); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} + +.project-detail { + display: flex; + align-items: flex-start; + font-size: 0.875rem; + line-height: 1.5; + /* Animation */ + opacity: 0; + transform: translateX(-20px); + animation: detailSlideIn 0.5s ease-out forwards; +} + +.project-detail:nth-child(1) { animation-delay: 1.1s; } +.project-detail:nth-child(2) { animation-delay: 1.2s; } +.project-detail:nth-child(3) { animation-delay: 1.3s; } + +@keyframes detailSlideIn { + 0% { + opacity: 0; + transform: translateX(-20px); + } + 100% { + opacity: 1; + transform: translateX(0); + } +} + +.detail-label { + font-weight: 500; + color: var(--color-nier-accent); + min-width: 120px; + margin-right: 1rem; + flex-shrink: 0; +} + +.detail-value { + flex: 1; + word-break: break-word; +} + +.tech-grid { + display: flex; + flex-wrap: wrap; + gap: 0.5rem; +} + +.tech-item { + background-color: var(--color-nier-mid); + color: var(--color-nier-text-dark); + border: 1px solid var(--color-nier-border); + padding: 0.375rem 0.75rem; + font-size: 0.75rem; + font-weight: 500; + letter-spacing: 0.05em; + border-radius: 2px; + /* Animation */ + opacity: 0; + transform: scale(0.8); + animation: techItemPop 0.3s ease-out forwards; + animation-delay: 1.6s; /* Default delay, overridden by Angular */ +} + +@keyframes techItemPop { + 0% { + opacity: 0; + transform: scale(0.8); + border-color: transparent; + } + 50% { + opacity: 0.8; + transform: scale(1.1); + } + 100% { + opacity: 1; + transform: scale(1); + border-color: var(--color-nier-border); + } +} + +/* Tech stack animation */ +.tech-stack { + opacity: 0; + animation: techStackReveal 0.6s ease-out 1.4s forwards; +} + +@keyframes techStackReveal { + 0% { + opacity: 0; + transform: translateY(10px); + border-top-color: transparent; + } + 100% { + opacity: 1; + transform: translateY(0); + border-top-color: var(--color-nier-border); + } +} + +.access-section { + padding: 1rem 1.5rem; + background-color: var(--color-nier-checkered-bg); + background-size: 0.2rem 0.2rem; + background-image: + linear-gradient(to right, var(--color-nier-checkered-grid) 1px, rgba(0, 0, 0, 0) 1px), + linear-gradient(to bottom, var(--color-nier-checkered-grid) 1px, rgba(0, 0, 0, 0) 1px); + border-top: 1px solid var(--color-nier-border); + display: flex; + gap: 1rem; + /* Animation */ + opacity: 0; + transform: translateY(20px); + animation: accessSectionRise 0.7s ease-out 1.8s forwards; +} + +@keyframes accessSectionRise { + 0% { + opacity: 0; + transform: translateY(20px); + border-top-color: transparent; + } + 50% { + opacity: 0.7; + transform: translateY(-2px); + } + 100% { + opacity: 1; + transform: translateY(0); + border-top-color: var(--color-nier-border); + } +} + +.access-btn { + background-color: transparent; + border: 2px solid var(--color-nier-accent); + color: var(--color-nier-accent); + padding: 0.5rem 1rem; + font-family: var(--font-terminal); + font-size: 0.875rem; + font-weight: 500; + cursor: pointer; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + letter-spacing: 0.05em; + flex: 1; + /* Animation */ + opacity: 0; + transform: scale(0.9); + animation: buttonMaterialize 0.4s ease-out forwards; +} + +.access-btn:first-child { animation-delay: 2.0s; } +.access-btn:last-child { animation-delay: 2.1s; } + +@keyframes buttonMaterialize { + 0% { + opacity: 0; + transform: scale(0.9); + border-color: transparent; + box-shadow: none; + } + 30% { + opacity: 0.6; + transform: scale(1.05); + border-color: var(--color-nier-accent); + box-shadow: 0 0 10px rgba(255, 201, 102, 0.3); + } + 100% { + opacity: 1; + transform: scale(1); + border-color: var(--color-nier-accent); + box-shadow: none; + } +} + +.access-btn:hover { + background-color: var(--color-nier-accent); + color: var(--color-nier-text-light); + transform: translateY(-1px); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3); +} + +.click-indicator { + position: absolute; + bottom: 0.5rem; + right: 1rem; + font-size: 0.7rem; + color: var(--color-nier-mid); + font-family: var(--font-terminal-retro); + opacity: 0; + transition: opacity 0.3s ease; + pointer-events: none; + /* Animation */ + animation: indicatorFade 0.5s ease-out 2.3s forwards; +} + +@keyframes indicatorFade { + 0% { + opacity: 0; + transform: translateY(5px); + } + 100% { + opacity: 0; /* Still hidden until hover */ + transform: translateY(0); + } +} + +/* Status Colors */ +.status-completed { color: var(--color-nier-accent); } +.status-active { color: #4a7c59; } +.status-experimental { color: #7c5a4a; } +.status-archived { color: var(--color-nier-mid); } + +/* Redacted Styles */ +.project-card.redacted { + cursor: not-allowed; + /* Special animation for redacted cards */ + animation: redactedMaterialize 1.5s ease-out forwards; +} + +@keyframes redactedMaterialize { + 0% { + opacity: 0; + transform: scale(0.95); + filter: blur(3px); + } + 30% { + opacity: 0.4; + transform: scale(0.98); + filter: blur(2px); + } + 60% { + opacity: 0.7; + transform: scale(1.01); + filter: blur(1px); + } + 100% { + opacity: 1; + transform: scale(1); + filter: blur(0px); + } +} + +.project-card.redacted:hover { + transform: none; + border-color: var(--color-nier-border); +} + +.redacted-background { + position: relative; + min-height: 300px; + background-color: var(--color-nier-checkered-bg); + background-size: 0.5rem 0.5rem; + background-image: + linear-gradient(45deg, var(--color-nier-mid) 25%, transparent 25%), + linear-gradient(-45deg, var(--color-nier-mid) 25%, transparent 25%), + linear-gradient(45deg, transparent 75%, var(--color-nier-mid) 75%), + linear-gradient(-45deg, transparent 75%, var(--color-nier-mid) 75%); +} + +.redacted-content { + filter: blur(1px); + user-select: none; + opacity: 0.6; +} + +.redacted-overlay { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + background-color: var(--color-nier-accent); + color: var(--color-nier-text-light); + padding: 1.5rem 2rem; + border: 2px solid var(--color-nier-text-light); + text-align: center; + z-index: 10; + /* Animation */ + opacity: 0; + animation: redactedOverlaySlam 0.6s ease-out 1.2s forwards; +} + +@keyframes redactedOverlaySlam { + 0% { + opacity: 0; + transform: translate(-50%, -50%) scale(0.8) rotate(-2deg); + } + 50% { + opacity: 0.9; + transform: translate(-50%, -50%) scale(1.1) rotate(1deg); + } + 100% { + opacity: 1; + transform: translate(-50%, -50%) scale(1) rotate(0deg); + } +} + +/* Static overlay animation for redacted cards */ +.static-overlay { + opacity: 0; + animation: staticFadeIn 0.8s ease-out 1.0s forwards; +} + +@keyframes staticFadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +/* Corner accent animation */ +.corner-accent { + opacity: 0; + animation: cornerAccentGlow 0.8s ease-out 2.5s forwards; +} + +@keyframes cornerAccentGlow { + 0% { + opacity: 0; + transform: scale(0.5); + } + 50% { + opacity: 0.8; + transform: scale(1.2); + } + 100% { + opacity: 1; + transform: scale(1); + } +} + +/* Glitch layers animation for added cyberpunk effect */ +.glitch-layer { + opacity: 0; + animation: glitchLayerFlicker 0.1s ease-in-out forwards; +} + +.glitch-layer-1 { animation-delay: 0.8s; } +.glitch-layer-2 { animation-delay: 1.0s; } +.glitch-layer-3 { animation-delay: 1.2s; } + +@keyframes glitchLayerFlicker { + 0%, 100% { opacity: 0; } + 50% { opacity: 0.1; } +} + +/* ===================== MODAL ANIMATIONS ===================== */ + +/* Modal Animations */ +.modal-overlay { + opacity: 0; + animation: modalOverlayFadeIn 0.4s ease-out forwards; +} + +@keyframes modalOverlayFadeIn { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +.modal-container { + opacity: 0; + transform: scale(0.9) translateY(-20px); + animation: modalContainerSlideIn 0.5s ease-out 0.1s forwards; +} + +@keyframes modalContainerSlideIn { + 0% { + opacity: 0; + transform: scale(0.9) translateY(-20px); + filter: blur(1px); + } + 60% { + opacity: 0.9; + transform: scale(1.02) translateY(-5px); + filter: blur(0px); + } + 100% { + opacity: 1; + transform: scale(1) translateY(0); + filter: blur(0px); + } +} + +.modal-header { + opacity: 0; + transform: translateY(-10px); + animation: modalHeaderFadeIn 0.4s ease-out 0.3s forwards; +} + +@keyframes modalHeaderFadeIn { + 0% { + opacity: 0; + transform: translateY(-10px); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} + +.modal-content { + opacity: 0; + transform: translateY(15px); + animation: modalContentFadeUp 0.5s ease-out 0.4s forwards; +} + +@keyframes modalContentFadeUp { + 0% { + opacity: 0; + transform: translateY(15px); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} + +.modal-section { + opacity: 0; + transform: translateX(-10px); + animation: modalSectionSlideIn 0.3s ease-out forwards; +} + +.modal-section:nth-child(1) { animation-delay: 0.6s; } +.modal-section:nth-child(2) { animation-delay: 0.7s; } +.modal-section:nth-child(3) { animation-delay: 0.8s; } +.modal-section:nth-child(4) { animation-delay: 0.9s; } +.modal-section:nth-child(5) { animation-delay: 1.0s; } + +@keyframes modalSectionSlideIn { + 0% { + opacity: 0; + transform: translateX(-10px); + } + 100% { + opacity: 1; + transform: translateX(0); + } +} + +.modal-close-btn { + opacity: 0; + transform: scale(0.8); + animation: modalCloseBtnPop 0.3s ease-out 0.5s forwards; +} + +@keyframes modalCloseBtnPop { + 0% { + opacity: 0; + transform: scale(0.8); + } + 50% { + opacity: 0.8; + transform: scale(1.1); + } + 100% { + opacity: 1; + transform: scale(1); + } +} + +/* Modal exit animations */ +.modal-overlay.closing { + animation: modalOverlayFadeOut 0.3s ease-in forwards; +} + +@keyframes modalOverlayFadeOut { + 0% { + opacity: 1; + } + 100% { + opacity: 0; + } +} + +.modal-container.closing { + animation: modalContainerSlideOut 0.3s ease-in forwards; +} + +@keyframes modalContainerSlideOut { + 0% { + opacity: 1; + transform: scale(1) translateY(0); + } + 100% { + opacity: 0; + transform: scale(0.95) translateY(-10px); + filter: blur(1px); + } +} + +/* ===================== RESPONSIVE DESIGN ===================== */ + +@media (max-width: 768px) { + .detail-label { + min-width: 100px; + } + + .access-section { + flex-direction: column; + } + + .access-btn { + flex: none; + } + + .grid-project-cards { + grid-template-columns: 1fr; + } + + /* Faster animations on mobile */ + .project-card { + animation-duration: 1s; + } + + .project-header { + animation-duration: 0.6s; + animation-delay: 0.2s; + } + + .project-status { + animation-delay: 0.4s; + } + + .project-title { + animation-delay: 0.5s; + } + + .project-body { + animation-delay: 0.6s; + } + + /* Faster page-level animations on mobile */ + .section-title-container { + animation-duration: 0.8s; + animation-delay: 0.1s; + } + + .terminal-header { + animation-duration: 1s; + animation-delay: 0.3s; + } + + .directory-tree { + animation-duration: 0.8s; + animation-delay: 0.5s; + } + + .projects-grid { + animation-duration: 0.8s; + animation-delay: 0.7s; + } +} + +/* ===================== ACCESSIBILITY ===================== */ + +/* Accessibility - Respect reduced motion preferences */ +@media (prefers-reduced-motion: reduce) { + .project-card, + .project-header, + .project-status, + .project-title, + .project-body, + .project-detail, + .tech-stack, + .tech-item, + .access-section, + .access-btn, + .click-indicator, + .corner-accent, + .glitch-layer, + .static-overlay, + .redacted-overlay, + .section-title-container, + .terminal-header, + .terminal-line, + .progress-container, + .directory-tree, + .directory-header, + .animate-fade-in-line, + .projects-grid, + .directory-footer { + animation: none !important; + opacity: 1 !important; + transform: none !important; + } + + .project-card::before, + .animate-scan, + .enhanced-scan, + .checkered-background::before { + display: none !important; + } +} diff --git a/src/app/pages/projects/projects.component.html b/src/app/pages/projects/projects.component.html index e3055e3..1defc54 100644 --- a/src/app/pages/projects/projects.component.html +++ b/src/app/pages/projects/projects.component.html @@ -1,30 +1,35 @@
- -
+ +
- -
- -
-
>> ACCESSING PROJECT DATABASE...
-
+ +
+ +
+ + +
>> ACCESSING PROJECT DATABASE...
+ + +
-
>> CONNECTION ESTABLISHED
-
>> DISPLAYING ARCHIVED MISSIONS
+ +
>> CONNECTION ESTABLISHED
+
>> DISPLAYING ARCHIVED MISSIONS
- -
-
SYSTEM DIRECTORY
+ +
+
SYSTEM DIRECTORY
@for (line of directoryLines(); track $index) {
- -
+ +
@for (project of projects(); track project.id) { - -
+ +
- + @if (selectedProject()) { -
-
-
+ +