_loader.scss 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. /* ========================================
  2. TECH PAGE LOADER - ITAgency
  3. ======================================== */
  4. @use '../abstracts/variables' as v;
  5. @use '../abstracts/mixins' as m;
  6. @use 'sass:map';
  7. .page-loader {
  8. position: fixed;
  9. top: 0;
  10. left: 0;
  11. width: 100%;
  12. height: 100vh;
  13. background: v.$primary-dark;
  14. z-index: map.get(v.$z-indices, 'modal') - 1;
  15. opacity: 1;
  16. visibility: visible;
  17. @include m.flex(row, center, center);
  18. @include m.transition(all 0.8s cubic-bezier(0.4, 0, 0.2, 1));
  19. // Tech grid background pattern
  20. &::before {
  21. content: '';
  22. position: absolute;
  23. top: 0;
  24. left: 0;
  25. width: 100%;
  26. height: 100%;
  27. background-image:
  28. linear-gradient(rgba(v.$primary, 0.1) 1px, transparent 1px),
  29. linear-gradient(90deg, rgba(v.$primary, 0.1) 1px, transparent 1px);
  30. background-size: 50px 50px;
  31. animation: gridMove 20s linear infinite;
  32. opacity: 0.3;
  33. }
  34. &.loaded {
  35. opacity: 0;
  36. visibility: hidden;
  37. @include m.transform(scale(1.1));
  38. }
  39. }
  40. .loader-container {
  41. text-align: center;
  42. color: v.$white;
  43. animation: fadeInUp 0.8s ease-out;
  44. position: relative;
  45. z-index: 2;
  46. }
  47. .loader-content {
  48. @include m.flex(column, center, center);
  49. gap: map.get(v.$spacers, 4); // 2rem
  50. }
  51. /* Logo styles removed - no logo needed */
  52. /* ========================================
  53. TECH LOADING SPINNER
  54. ======================================== */
  55. .loader-spinner {
  56. position: relative;
  57. width: 120px;
  58. height: 120px;
  59. }
  60. .spinner-ring {
  61. position: absolute;
  62. top: 50%;
  63. left: 50%;
  64. @include m.transform(translate(-50%, -50%));
  65. // Outer ring
  66. &::before {
  67. content: '';
  68. position: absolute;
  69. width: 120px;
  70. height: 120px;
  71. border: 2px solid transparent;
  72. border-top: 2px solid v.$primary-light;
  73. border-right: 2px solid v.$primary-light;
  74. @include m.border-radius(50%);
  75. animation: spinnerRotate 2s linear infinite;
  76. filter: drop-shadow(0 0 10px rgba(v.$primary-light, 0.6));
  77. }
  78. // Middle ring
  79. &::after {
  80. content: '';
  81. position: absolute;
  82. top: 15px;
  83. left: 15px;
  84. width: 90px;
  85. height: 90px;
  86. border: 2px solid transparent;
  87. border-bottom: 2px solid v.$primary;
  88. border-left: 2px solid v.$primary;
  89. @include m.border-radius(50%);
  90. animation: spinnerRotate 1.5s linear infinite reverse;
  91. filter: drop-shadow(0 0 8px rgba(v.$primary, 0.8));
  92. }
  93. // Inner ring
  94. div {
  95. position: absolute;
  96. top: 30px;
  97. left: 30px;
  98. width: 60px;
  99. height: 60px;
  100. border: 1px solid transparent;
  101. border-top: 1px solid v.$white;
  102. @include m.border-radius(50%);
  103. animation: spinnerRotate 1s linear infinite;
  104. filter: drop-shadow(0 0 5px rgba(v.$white, 0.9));
  105. &::before {
  106. content: '';
  107. position: absolute;
  108. top: 50%;
  109. left: 50%;
  110. width: 8px;
  111. height: 8px;
  112. background: v.$primary-light;
  113. @include m.border-radius(50%);
  114. @include m.transform(translate(-50%, -50%));
  115. animation: centerPulse 1.5s ease-in-out infinite;
  116. box-shadow: 0 0 15px rgba(v.$primary-light, 0.8);
  117. }
  118. }
  119. }
  120. /* ========================================
  121. TECH PROGRESS BAR
  122. ======================================== */
  123. .loader-progress {
  124. width: 300px;
  125. height: 4px;
  126. background: rgba(v.$white, 0.1);
  127. @include m.border-radius(10px);
  128. overflow: hidden;
  129. position: relative;
  130. border: 1px solid rgba(v.$primary, 0.3);
  131. &::before {
  132. content: '';
  133. position: absolute;
  134. top: -1px;
  135. left: -1px;
  136. right: -1px;
  137. bottom: -1px;
  138. background: linear-gradient(90deg, transparent, rgba(v.$primary-light, 0.5), transparent);
  139. animation: progressScan 2s linear infinite;
  140. }
  141. }
  142. .progress-bar {
  143. height: 100%;
  144. background: linear-gradient(90deg, v.$primary, v.$primary-light, v.$white);
  145. @include m.border-radius(10px);
  146. width: 0%;
  147. @include m.transition(width 0.3s ease);
  148. position: relative;
  149. box-shadow: 0 0 20px rgba(v.$primary-light, 0.6);
  150. &::after {
  151. content: '';
  152. position: absolute;
  153. top: 0;
  154. right: 0;
  155. width: 20px;
  156. height: 100%;
  157. background: linear-gradient(90deg, transparent, rgba(v.$white, 0.8));
  158. animation: progressGlow 1s ease-in-out infinite;
  159. }
  160. }
  161. /* ========================================
  162. TECH ANIMATIONS
  163. ======================================== */
  164. @keyframes fadeInUp {
  165. from {
  166. opacity: 0;
  167. @include m.transform(translateY(50px) scale(0.8));
  168. }
  169. to {
  170. opacity: 1;
  171. @include m.transform(translateY(0) scale(1));
  172. }
  173. }
  174. @keyframes spinnerRotate {
  175. 0% {
  176. @include m.transform(translate(-50%, -50%) rotate(0deg));
  177. }
  178. 100% {
  179. @include m.transform(translate(-50%, -50%) rotate(360deg));
  180. }
  181. }
  182. @keyframes centerPulse {
  183. 0%, 100% {
  184. @include m.transform(translate(-50%, -50%) scale(1));
  185. opacity: 1;
  186. }
  187. 50% {
  188. @include m.transform(translate(-50%, -50%) scale(1.8));
  189. opacity: 0.6;
  190. }
  191. }
  192. @keyframes progressScan {
  193. 0% {
  194. @include m.transform(translateX(-100%));
  195. }
  196. 100% {
  197. @include m.transform(translateX(300px));
  198. }
  199. }
  200. @keyframes progressGlow {
  201. 0%, 100% {
  202. opacity: 0.5;
  203. }
  204. 50% {
  205. opacity: 1;
  206. }
  207. }
  208. @keyframes gridMove {
  209. 0% {
  210. @include m.transform(translate(0, 0));
  211. }
  212. 100% {
  213. @include m.transform(translate(50px, 50px));
  214. }
  215. }
  216. /* ========================================
  217. RESPONSIVE DESIGN
  218. ======================================== */
  219. @include m.respond-to-max('md') {
  220. .loader-spinner {
  221. width: 100px;
  222. height: 100px;
  223. &::before {
  224. width: 100px;
  225. height: 100px;
  226. }
  227. &::after {
  228. top: 12px;
  229. left: 12px;
  230. width: 76px;
  231. height: 76px;
  232. }
  233. div {
  234. top: 25px;
  235. left: 25px;
  236. width: 50px;
  237. height: 50px;
  238. }
  239. }
  240. .loader-progress {
  241. width: 250px;
  242. }
  243. }
  244. @include m.respond-to-max('sm') {
  245. .loader-spinner {
  246. width: 80px;
  247. height: 80px;
  248. &::before {
  249. width: 80px;
  250. height: 80px;
  251. }
  252. &::after {
  253. top: 10px;
  254. left: 10px;
  255. width: 60px;
  256. height: 60px;
  257. }
  258. div {
  259. top: 20px;
  260. left: 20px;
  261. width: 40px;
  262. height: 40px;
  263. }
  264. }
  265. .loader-progress {
  266. width: 200px;
  267. height: 3px;
  268. }
  269. }
  270. /* ========================================
  271. BODY OVERFLOW CONTROL
  272. ======================================== */
  273. body {
  274. &.loading {
  275. overflow: hidden;
  276. height: 100vh;
  277. }
  278. &.loaded {
  279. overflow: hidden;
  280. height: auto;
  281. }
  282. }