/* ======================================== TECH PAGE LOADER - ITAgency ======================================== */ @use '../abstracts/variables' as v; @use '../abstracts/mixins' as m; @use 'sass:map'; .page-loader { position: fixed; top: 0; left: 0; width: 100%; height: 100vh; background: v.$primary-dark; z-index: map.get(v.$z-indices, 'modal') - 1; opacity: 1; visibility: visible; @include m.flex(row, center, center); @include m.transition(all 0.8s cubic-bezier(0.4, 0, 0.2, 1)); // Tech grid background pattern &::before { content: ''; position: absolute; top: 0; left: 0; width: 100%; height: 100%; background-image: linear-gradient(rgba(v.$primary, 0.1) 1px, transparent 1px), linear-gradient(90deg, rgba(v.$primary, 0.1) 1px, transparent 1px); background-size: 50px 50px; animation: gridMove 20s linear infinite; opacity: 0.3; } &.loaded { opacity: 0; visibility: hidden; @include m.transform(scale(1.1)); } } .loader-container { text-align: center; color: v.$white; animation: fadeInUp 0.8s ease-out; position: relative; z-index: 2; } .loader-content { @include m.flex(column, center, center); gap: map.get(v.$spacers, 4); // 2rem } /* Logo styles removed - no logo needed */ /* ======================================== TECH LOADING SPINNER ======================================== */ .loader-spinner { position: relative; width: 120px; height: 120px; } .spinner-ring { position: absolute; top: 50%; left: 50%; @include m.transform(translate(-50%, -50%)); // Outer ring &::before { content: ''; position: absolute; width: 120px; height: 120px; border: 2px solid transparent; border-top: 2px solid v.$primary-light; border-right: 2px solid v.$primary-light; @include m.border-radius(50%); animation: spinnerRotate 2s linear infinite; filter: drop-shadow(0 0 10px rgba(v.$primary-light, 0.6)); } // Middle ring &::after { content: ''; position: absolute; top: 15px; left: 15px; width: 90px; height: 90px; border: 2px solid transparent; border-bottom: 2px solid v.$primary; border-left: 2px solid v.$primary; @include m.border-radius(50%); animation: spinnerRotate 1.5s linear infinite reverse; filter: drop-shadow(0 0 8px rgba(v.$primary, 0.8)); } // Inner ring div { position: absolute; top: 30px; left: 30px; width: 60px; height: 60px; border: 1px solid transparent; border-top: 1px solid v.$white; @include m.border-radius(50%); animation: spinnerRotate 1s linear infinite; filter: drop-shadow(0 0 5px rgba(v.$white, 0.9)); &::before { content: ''; position: absolute; top: 50%; left: 50%; width: 8px; height: 8px; background: v.$primary-light; @include m.border-radius(50%); @include m.transform(translate(-50%, -50%)); animation: centerPulse 1.5s ease-in-out infinite; box-shadow: 0 0 15px rgba(v.$primary-light, 0.8); } } } /* ======================================== TECH PROGRESS BAR ======================================== */ .loader-progress { width: 300px; height: 4px; background: rgba(v.$white, 0.1); @include m.border-radius(10px); overflow: hidden; position: relative; border: 1px solid rgba(v.$primary, 0.3); &::before { content: ''; position: absolute; top: -1px; left: -1px; right: -1px; bottom: -1px; background: linear-gradient(90deg, transparent, rgba(v.$primary-light, 0.5), transparent); animation: progressScan 2s linear infinite; } } .progress-bar { height: 100%; background: linear-gradient(90deg, v.$primary, v.$primary-light, v.$white); @include m.border-radius(10px); width: 0%; @include m.transition(width 0.3s ease); position: relative; box-shadow: 0 0 20px rgba(v.$primary-light, 0.6); &::after { content: ''; position: absolute; top: 0; right: 0; width: 20px; height: 100%; background: linear-gradient(90deg, transparent, rgba(v.$white, 0.8)); animation: progressGlow 1s ease-in-out infinite; } } /* ======================================== TECH ANIMATIONS ======================================== */ @keyframes fadeInUp { from { opacity: 0; @include m.transform(translateY(50px) scale(0.8)); } to { opacity: 1; @include m.transform(translateY(0) scale(1)); } } @keyframes spinnerRotate { 0% { @include m.transform(translate(-50%, -50%) rotate(0deg)); } 100% { @include m.transform(translate(-50%, -50%) rotate(360deg)); } } @keyframes centerPulse { 0%, 100% { @include m.transform(translate(-50%, -50%) scale(1)); opacity: 1; } 50% { @include m.transform(translate(-50%, -50%) scale(1.8)); opacity: 0.6; } } @keyframes progressScan { 0% { @include m.transform(translateX(-100%)); } 100% { @include m.transform(translateX(300px)); } } @keyframes progressGlow { 0%, 100% { opacity: 0.5; } 50% { opacity: 1; } } @keyframes gridMove { 0% { @include m.transform(translate(0, 0)); } 100% { @include m.transform(translate(50px, 50px)); } } /* ======================================== RESPONSIVE DESIGN ======================================== */ @include m.respond-to-max('md') { .loader-spinner { width: 100px; height: 100px; &::before { width: 100px; height: 100px; } &::after { top: 12px; left: 12px; width: 76px; height: 76px; } div { top: 25px; left: 25px; width: 50px; height: 50px; } } .loader-progress { width: 250px; } } @include m.respond-to-max('sm') { .loader-spinner { width: 80px; height: 80px; &::before { width: 80px; height: 80px; } &::after { top: 10px; left: 10px; width: 60px; height: 60px; } div { top: 20px; left: 20px; width: 40px; height: 40px; } } .loader-progress { width: 200px; height: 3px; } } /* ======================================== BODY OVERFLOW CONTROL ======================================== */ body { &.loading { overflow: hidden; height: 100vh; } &.loaded { overflow: hidden; height: auto; } }