_page-header.scss 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  1. @use '../abstracts/variables' as v;
  2. @use '../abstracts/mixins' as mix;
  3. @use 'sass:map';
  4. .page-header {
  5. position: relative;
  6. min-height: 400px;
  7. @include mix.flex(row, center, center);
  8. overflow: hidden;
  9. @include mix.respond-to-max('md') {
  10. min-height: 350px;
  11. }
  12. @include mix.respond-to-max('sm') {
  13. min-height: 300px;
  14. }
  15. // Background container
  16. .page-header-bg {
  17. position: absolute;
  18. top: 0;
  19. left: 0;
  20. width: 100%;
  21. height: 100%;
  22. z-index: 1;
  23. // Digital grid pattern
  24. .digital-grid {
  25. position: absolute;
  26. top: 0;
  27. left: 0;
  28. width: 100%;
  29. height: 100%;
  30. background-image:
  31. linear-gradient(rgba(255, 255, 255, 0.03) 1px, transparent 1px),
  32. linear-gradient(90deg, rgba(255, 255, 255, 0.03) 1px, transparent 1px);
  33. background-size: 50px 50px;
  34. animation: grid-move 20s linear infinite;
  35. @include mix.respond-to-max('md') {
  36. background-size: 40px 40px;
  37. }
  38. @include mix.respond-to-max('sm') {
  39. background-size: 30px 30px;
  40. }
  41. }
  42. // Particles container
  43. .particles-container {
  44. position: absolute;
  45. top: 0;
  46. left: 0;
  47. width: 100%;
  48. height: 100%;
  49. overflow: hidden;
  50. .particle {
  51. position: absolute;
  52. width: 4px;
  53. height: 4px;
  54. background: rgba(255, 255, 255, 0.6);
  55. border-radius: 50%;
  56. animation: particle-float 15s infinite ease-in-out;
  57. &:nth-child(1) {
  58. top: 20%;
  59. left: 10%;
  60. animation-delay: 0s;
  61. animation-duration: 12s;
  62. }
  63. &:nth-child(2) {
  64. top: 60%;
  65. left: 20%;
  66. animation-delay: -2s;
  67. animation-duration: 14s;
  68. width: 6px;
  69. height: 6px;
  70. }
  71. &:nth-child(3) {
  72. top: 40%;
  73. left: 80%;
  74. animation-delay: -4s;
  75. animation-duration: 16s;
  76. }
  77. &:nth-child(4) {
  78. top: 80%;
  79. left: 30%;
  80. animation-delay: -6s;
  81. animation-duration: 18s;
  82. width: 3px;
  83. height: 3px;
  84. }
  85. &:nth-child(5) {
  86. top: 30%;
  87. left: 60%;
  88. animation-delay: -8s;
  89. animation-duration: 13s;
  90. width: 5px;
  91. height: 5px;
  92. }
  93. &:nth-child(6) {
  94. top: 70%;
  95. left: 70%;
  96. animation-delay: -10s;
  97. animation-duration: 15s;
  98. }
  99. &:nth-child(7) {
  100. top: 10%;
  101. left: 40%;
  102. animation-delay: -12s;
  103. animation-duration: 17s;
  104. width: 7px;
  105. height: 7px;
  106. }
  107. &:nth-child(8) {
  108. top: 90%;
  109. left: 50%;
  110. animation-delay: -14s;
  111. animation-duration: 11s;
  112. }
  113. &:nth-child(9) {
  114. top: 50%;
  115. left: 15%;
  116. animation-delay: -16s;
  117. animation-duration: 19s;
  118. width: 8px;
  119. height: 8px;
  120. }
  121. &:nth-child(10) {
  122. top: 25%;
  123. left: 85%;
  124. animation-delay: -18s;
  125. animation-duration: 14s;
  126. }
  127. &:nth-child(11) {
  128. top: 75%;
  129. left: 5%;
  130. animation-delay: -20s;
  131. animation-duration: 16s;
  132. width: 6px;
  133. height: 6px;
  134. }
  135. &:nth-child(12) {
  136. top: 45%;
  137. left: 95%;
  138. animation-delay: -22s;
  139. animation-duration: 12s;
  140. }
  141. }
  142. }
  143. // Geometric overlay
  144. .geometric-overlay {
  145. position: absolute;
  146. top: 0;
  147. left: 0;
  148. width: 100%;
  149. height: 100%;
  150. .geometric-shape {
  151. position: absolute;
  152. border: 1px solid rgba(255, 255, 255, 0.1);
  153. &.shape-1 {
  154. width: 200px;
  155. height: 200px;
  156. top: 10%;
  157. left: -50px;
  158. border-radius: 50%;
  159. animation: geometric-rotate 25s linear infinite;
  160. }
  161. &.shape-2 {
  162. width: 150px;
  163. height: 150px;
  164. top: 60%;
  165. right: -30px;
  166. @include mix.transform(rotate(45deg));
  167. animation: geometric-pulse 8s ease-in-out infinite;
  168. }
  169. &.shape-3 {
  170. width: 100px;
  171. height: 100px;
  172. top: 30%;
  173. right: 15%;
  174. border-radius: 50%;
  175. animation: geometric-float 12s ease-in-out infinite;
  176. }
  177. &.shape-4 {
  178. width: 80px;
  179. height: 80px;
  180. bottom: 20%;
  181. left: 20%;
  182. @include mix.transform(rotate(30deg));
  183. animation: geometric-rotate 20s linear infinite reverse;
  184. }
  185. }
  186. }
  187. }
  188. // Content
  189. .page-header-content {
  190. @include mix.flex(row, center, center);
  191. position: relative;
  192. z-index: 10;
  193. text-align: center;
  194. max-width: 800px;
  195. padding: 0 map.get(v.$spacers, 3);
  196. @include mix.respond-to-max('sm') {
  197. padding: 0 map.get(v.$spacers, 2);
  198. }
  199. }
  200. // Breadcrumb
  201. .breadcrumb {
  202. @include mix.flex(row, center, center);
  203. gap: map.get(v.$spacers, 2);
  204. margin-bottom: map.get(v.$spacers, 3);
  205. font-size: map.get(v.$font-sizes, 'sm');
  206. @include mix.respond-to-max('sm') {
  207. margin-bottom: map.get(v.$spacers, 2);
  208. }
  209. .breadcrumb-link {
  210. color: rgba(255, 255, 255, 0.8);
  211. text-decoration: none;
  212. @include mix.transition(v.$transition-base);
  213. &:hover {
  214. color: v.$white;
  215. }
  216. }
  217. .breadcrumb-separator {
  218. color: rgba(255, 255, 255, 0.6);
  219. @include mix.flex(row, center, center);
  220. svg {
  221. width: 16px;
  222. height: 16px;
  223. fill: currentColor;
  224. }
  225. }
  226. .breadcrumb-current {
  227. color: v.$white;
  228. font-weight: map.get(v.$font-weights, 'medium');
  229. }
  230. }
  231. // Page title
  232. .page-title {
  233. font-family: v.$font-family-heading;
  234. font-size: map.get(v.$font-sizes, '4xl');
  235. font-weight: map.get(v.$font-weights, 'bold');
  236. color: v.$white;
  237. margin-bottom: map.get(v.$spacers, 3);
  238. line-height: 1.2;
  239. text-align: center;
  240. @include mix.respond-to-max('md') {
  241. font-size: map.get(v.$font-sizes, '3xl');
  242. }
  243. @include mix.respond-to-max('sm') {
  244. font-size: map.get(v.$font-sizes, '2xl');
  245. margin-bottom: map.get(v.$spacers, 2);
  246. }
  247. }
  248. // Page description
  249. .page-description {
  250. font-size: map.get(v.$font-sizes, 'lg');
  251. color: rgba(255, 255, 255, 0.9);
  252. line-height: 1.6;
  253. max-width: 600px;
  254. margin: 0 auto;
  255. text-align: center;
  256. @include mix.respond-to-max('md') {
  257. font-size: map.get(v.$font-sizes, 'base');
  258. }
  259. @include mix.respond-to-max('sm') {
  260. font-size: map.get(v.$font-sizes, 'sm');
  261. }
  262. }
  263. // Floating elements
  264. .floating-elements {
  265. position: absolute;
  266. top: 0;
  267. left: 0;
  268. width: 100%;
  269. height: 100%;
  270. z-index: 2;
  271. pointer-events: none;
  272. .floating-circle {
  273. position: absolute;
  274. border-radius: 50%;
  275. background: rgba(255, 255, 255, 0.05);
  276. &.floating-circle-1 {
  277. width: 120px;
  278. height: 120px;
  279. top: 15%;
  280. right: 10%;
  281. animation: floating-1 20s ease-in-out infinite;
  282. }
  283. &.floating-circle-2 {
  284. width: 80px;
  285. height: 80px;
  286. bottom: 25%;
  287. left: 8%;
  288. animation: floating-2 15s ease-in-out infinite;
  289. }
  290. &.floating-circle-3 {
  291. width: 60px;
  292. height: 60px;
  293. top: 40%;
  294. left: 5%;
  295. animation: floating-3 18s ease-in-out infinite;
  296. }
  297. }
  298. }
  299. }
  300. // Animations
  301. @keyframes particle-float {
  302. 0%, 100% {
  303. @include mix.transform(translateY(0px) translateX(0px));
  304. opacity: 0.6;
  305. }
  306. 25% {
  307. @include mix.transform(translateY(-20px) translateX(10px));
  308. opacity: 1;
  309. }
  310. 50% {
  311. @include mix.transform(translateY(-10px) translateX(-15px));
  312. opacity: 0.8;
  313. }
  314. 75% {
  315. @include mix.transform(translateY(-30px) translateX(5px));
  316. opacity: 0.9;
  317. }
  318. }
  319. @keyframes grid-move {
  320. 0% {
  321. @include mix.transform(translate(0, 0));
  322. }
  323. 100% {
  324. @include mix.transform(translate(50px, 50px));
  325. }
  326. }
  327. @keyframes geometric-rotate {
  328. 0% {
  329. @include mix.transform(rotate(0deg));
  330. }
  331. 100% {
  332. @include mix.transform(rotate(360deg));
  333. }
  334. }
  335. @keyframes geometric-pulse {
  336. 0%, 100% {
  337. @include mix.transform(rotate(45deg) scale(1));
  338. opacity: 0.1;
  339. }
  340. 50% {
  341. @include mix.transform(rotate(45deg) scale(1.1));
  342. opacity: 0.2;
  343. }
  344. }
  345. @keyframes geometric-float {
  346. 0%, 100% {
  347. @include mix.transform(translateY(0px));
  348. }
  349. 50% {
  350. @include mix.transform(translateY(-20px));
  351. }
  352. }
  353. @keyframes floating-1 {
  354. 0%, 100% {
  355. @include mix.transform(translateY(0px) translateX(0px));
  356. }
  357. 33% {
  358. @include mix.transform(translateY(-30px) translateX(20px));
  359. }
  360. 66% {
  361. @include mix.transform(translateY(20px) translateX(-10px));
  362. }
  363. }
  364. @keyframes floating-2 {
  365. 0%, 100% {
  366. @include mix.transform(translateY(0px) translateX(0px));
  367. }
  368. 50% {
  369. @include mix.transform(translateY(-25px) translateX(15px));
  370. }
  371. }
  372. @keyframes floating-3 {
  373. 0%, 100% {
  374. @include mix.transform(translateY(0px) translateX(0px));
  375. }
  376. 25% {
  377. @include mix.transform(translateY(15px) translateX(-20px));
  378. }
  379. 75% {
  380. @include mix.transform(translateY(-20px) translateX(10px));
  381. }
  382. }
  383. // Reduced motion support
  384. @media (prefers-reduced-motion: reduce) {
  385. .page-header {
  386. .particle,
  387. .geometric-shape,
  388. .floating-circle,
  389. .digital-grid {
  390. animation: none;
  391. }
  392. }
  393. }