_home.scss 64 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439
  1. // Import Sass modules for variables, mixins, and built-in functions
  2. @use '../abstracts/variables' as v;
  3. @use '../abstracts/mixins' as mix;
  4. @use 'sass:map';
  5. @use 'sass:color';
  6. // Base body styling with background image and overflow settings
  7. html,
  8. body {
  9. overflow: hidden;
  10. overflow-y: auto;
  11. padding-top: 40px;
  12. background-color: none;
  13. background-image: none;
  14. }
  15. .body-1 {
  16. background-color:var(--color-background);
  17. @include mix.background(
  18. url('../images/backgrounds/hand-ia-bgremove.png'),
  19. var(--color-background),
  20. contain,
  21. no-repeat,
  22. left center,
  23. fixed
  24. );
  25. }
  26. .body-2 {
  27. @include mix.background(
  28. url('../images/backgrounds/geometry-tech.png'),
  29. var(--color-background),
  30. cover,
  31. no-repeat,
  32. center center,
  33. fixed
  34. );
  35. }
  36. .body-3 {
  37. @include mix.background(
  38. url('../images/backgrounds/line-tech.png'),
  39. var(--color-background),
  40. cover,
  41. no-repeat,
  42. center center,
  43. fixed
  44. );
  45. }
  46. // Data Lines animation background layer
  47. #dataLinesCanvas {
  48. position: absolute;
  49. top: 0;
  50. left: 0;
  51. width: 100%;
  52. height: 100%;
  53. pointer-events: none;
  54. }
  55. // Particles animation background layer
  56. .particles-background,
  57. .meteorShowerCanvas {
  58. position: absolute;
  59. top: 0;
  60. left: 0;
  61. width: 100%;
  62. height: 100vh;
  63. z-index: 0; // Behind all content
  64. }
  65. // Hero section - main landing area
  66. .hero {
  67. position: relative;
  68. height: 92vh; // Almost full viewport height
  69. z-index: 1; // Above particles background
  70. padding: 0;
  71. @include mix.respond-to-max('md') {
  72. @include mix.flex(column, center, center);
  73. height: 800px;
  74. padding-bottom: 10px;
  75. }
  76. .hero-content,
  77. .hero-content-home-1,
  78. .hero-content-home-4 {
  79. @include mix.flex(row, space-between, center, wrap);
  80. @include mix.respond-to-max('md') {
  81. @include mix.flex(column, center, center);
  82. gap: map.get(v.$spacers, 4);
  83. }
  84. .hero-info {
  85. .hero-info-content {
  86. .heading-hero {
  87. font-size: map.get(v.$font-sizes, '2xl');
  88. font-weight: map.get(v.$font-weights, 'bold');
  89. margin-bottom: map.get(v.$spacers, 3);
  90. // Progressively larger on bigger screens
  91. @include mix.respond-to-min('md') {
  92. font-size: map.get(v.$font-sizes, '3xl');
  93. }
  94. @include mix.respond-to-min('lg') {
  95. font-size: map.get(v.$font-sizes, '4xl');
  96. }
  97. }
  98. }
  99. .cta {
  100. .social-links {
  101. max-width: 150px;
  102. .social-link {
  103. svg {
  104. color: v.$primary;
  105. }
  106. }
  107. }
  108. }
  109. @include mix.respond-to-max('md') {
  110. text-align: center;
  111. .hero-info-content {
  112. @include mix.flex(column, center, center);
  113. }
  114. .cta {
  115. @include mix.flex(column, center, center);
  116. .social-links {
  117. width: 100%;
  118. }
  119. .cta-buttons {
  120. @include mix.flex(column, center, center);
  121. }
  122. }
  123. }
  124. }
  125. .hero-image {
  126. position: relative;
  127. max-width: 500px;
  128. height: auto;
  129. display: block;
  130. @include mix.respond-to-max('md') {
  131. max-width: 300px;
  132. margin-top: map.get(v.$spacers, 4);
  133. }
  134. }
  135. }
  136. .hero-content-home-1 {
  137. @include mix.flex(column, center, flex-end);
  138. max-width: 1150px;
  139. }
  140. .hero-content-home-4 {
  141. @include mix.flex(column, center, center, wrap);
  142. .hero-info {
  143. text-align: center;
  144. .cta {
  145. @include mix.flex(column, center, center, wrap);
  146. }
  147. }
  148. }
  149. }
  150. // Main content area with white background
  151. .main {
  152. background-color: var(--color-surface);
  153. .main-content {
  154. // Single column grid with large gap
  155. @include mix.grid(1, map.get(v.$spacers, 9));
  156. // Services section with card grid layout
  157. .service-cards-modern {
  158. .services-grid {
  159. display: grid;
  160. grid-template-columns: repeat(3, 1fr); // 3 columns on desktop
  161. gap: map.get(v.$spacers, 3);
  162. align-self: center;
  163. // Responsive breakpoints: 3 -> 2 -> 1 columns
  164. @include mix.respond-to-max('md') {
  165. grid-template-columns: repeat(2, 1fr);
  166. gap: map.get(v.$spacers, 4);
  167. }
  168. @include mix.respond-to-max('sm') {
  169. grid-template-columns: 1fr;
  170. gap: map.get(v.$spacers, 3);
  171. }
  172. // Individual service cards
  173. .service-card {
  174. width: 100%;
  175. height: 292px;
  176. background-color: var(--color-surface);
  177. padding: map.get(v.$spacers, 4);
  178. gap: map.get(v.$spacers, 3);
  179. @include mix.flex(column, center, center); // Centered content
  180. @include mix.box-shadow(var(--box-shadow));
  181. @include mix.transition(v.$transition-smooth);
  182. // Hover effect with scale and lift animation
  183. &:hover {
  184. @include mix.transform(scale(1.02) translateY(-5px));
  185. @include mix.box-shadow(var(--box-shadow-hover));
  186. @include mix.transition(v.$transition-smooth);
  187. }
  188. // AOS (Animate On Scroll) integration
  189. &[data-aos] {
  190. will-change: transform, opacity; // Performance optimization
  191. &:hover {
  192. @include mix.transform(scale(1.02) translateY(-5px));
  193. }
  194. &.aos-animate:hover {
  195. @include mix.transform(scale(1.02) translateY(-5px));
  196. }
  197. }
  198. // Service icon styling
  199. .service-icon {
  200. color: v.$primary-dark;
  201. svg {
  202. width: 100px;
  203. height: 100px; // Large, prominent icons
  204. }
  205. }
  206. .service-description {
  207. text-align: center;
  208. }
  209. }
  210. }
  211. }
  212. .service-cards-classic {
  213. .services-grid {
  214. display: grid;
  215. grid-template-columns: repeat(3, 1fr); // 3 columns on desktop
  216. gap: map.get(v.$spacers, 4);
  217. align-self: center;
  218. // Responsive breakpoints: 3 -> 2 -> 1 columns
  219. @include mix.respond-to-max('md') {
  220. grid-template-columns: repeat(2, 1fr);
  221. gap: map.get(v.$spacers, 4);
  222. }
  223. @include mix.respond-to-max('sm') {
  224. grid-template-columns: 1fr;
  225. gap: map.get(v.$spacers, 3);
  226. }
  227. // Individual service cards
  228. .service-card {
  229. width: 100%;
  230. height: 292px;
  231. background-color: var(--color-surface);
  232. padding: map.get(v.$spacers, 4);
  233. gap: map.get(v.$spacers, 4);
  234. border: 1px solid var(--color-primary);
  235. border-radius: 5px;
  236. @include mix.flex(column, center, center); // Centered content
  237. // Service icon styling
  238. .service-icon {
  239. color: v.$primary-dark;
  240. svg {
  241. width: 100px;
  242. height: 100px; // Large, prominent icons
  243. }
  244. }
  245. .service-description {
  246. text-align: center;
  247. }
  248. }
  249. }
  250. }
  251. // About Us section animation
  252. .about-us-modern {
  253. overflow: hidden;
  254. .container {
  255. @include mix.flex(row, space-between, center);
  256. max-width: 1200px;
  257. margin: 0 auto;
  258. padding: 0 map.get(v.$spacers, 3);
  259. @include mix.respond-to-max('md') {
  260. flex-direction: column;
  261. text-align: center;
  262. }
  263. }
  264. .about-content {
  265. max-width: 600px;
  266. .section-title {
  267. font-family: v.$font-family-heading;
  268. font-size: map.get(v.$font-sizes, '4xl');
  269. color: var(--color-text-primary);
  270. margin-bottom: map.get(v.$spacers, 3);
  271. .highlighted-year {
  272. color: var(--color-primary);
  273. position: relative;
  274. &::after {
  275. content: '';
  276. position: absolute;
  277. bottom: -5px;
  278. left: 0;
  279. width: 100%;
  280. height: 3px;
  281. background: var(--color-primary);
  282. }
  283. }
  284. }
  285. .section-description {
  286. color: var(--color-text-secondary);
  287. font-size: map.get(v.$font-sizes, 'lg');
  288. margin-bottom: map.get(v.$spacers, 4);
  289. line-height: 1.7;
  290. }
  291. .features-grid {
  292. display: grid;
  293. grid-template-columns: repeat(2, 1fr);
  294. gap: map.get(v.$spacers, 3);
  295. @include mix.respond-to-max('sm') {
  296. grid-template-columns: 1fr;
  297. }
  298. .feature-item {
  299. background: var(--color-surface-scase);
  300. padding: map.get(v.$spacers, 3);
  301. border-radius: 10px;
  302. box-shadow: var(--box-shadow);
  303. border: 1px solid transparent;
  304. @include mix.transition(v.$transition-base);
  305. &:hover {
  306. box-shadow: var(--box-shadow-hover);
  307. background: var(--color-surface-scase);
  308. border: 1px solid var(--color-primary-light);
  309. @include mix.transition(v.$transition-base);
  310. }
  311. .feature-icon {
  312. font-size: 2rem;
  313. color: var(--color-primary);
  314. margin-bottom: map.get(v.$spacers, 2);
  315. }
  316. h4 {
  317. color: var(--color-text-primary);
  318. margin-bottom: map.get(v.$spacers, 2);
  319. font-size: map.get(v.$font-sizes, 'xl');
  320. }
  321. p {
  322. color: var(--color-text-muted);
  323. font-size: map.get(v.$font-sizes, 'sm');
  324. }
  325. }
  326. }
  327. }
  328. .about-image {
  329. max-width: 500px;
  330. @include mix.border-radius(v.$border-radius);
  331. overflow: hidden;
  332. img {
  333. width: 100%;
  334. display: block;
  335. }
  336. @include mix.respond-to-max('md') {
  337. margin-top: map.get(v.$spacers, 4);
  338. }
  339. }
  340. }
  341. /* Styles for the 'About Our Company' section */
  342. .about-our-company {
  343. @include mix.grid(2);
  344. @include mix.respond-to-max('md') {
  345. @include mix.grid(1);
  346. padding-bottom: map.get(v.$spacers, 2);
  347. }
  348. .about-info {
  349. max-width: 515px;
  350. @include mix.respond-to-max('md') {
  351. max-width: 100%;
  352. }
  353. .about-texts {
  354. @include mix.grid(1, map.get(v.$spacers, 1));
  355. .about-info-title {
  356. color: var(--color-text-primary);
  357. }
  358. }
  359. .about-progress {
  360. @include mix.grid(1, map.get(v.$spacers, 4));
  361. }
  362. }
  363. .about-image {
  364. @include mix.flex(column, center, center);
  365. max-width: 100%;
  366. height: 90%;
  367. overflow: hidden;
  368. img {
  369. width: 100%;
  370. height: 100%;
  371. object-fit: cover;
  372. border-radius: 10px;
  373. }
  374. }
  375. }
  376. // Step info section with circular layout on desktop
  377. .step-info {
  378. .box-step-info {
  379. position: relative;
  380. @include mix.flex(column, center, center);
  381. width: 100%;
  382. height: 800px;
  383. @include mix.respond-to-max('md') {
  384. height: auto;
  385. }
  386. .step {
  387. @include mix.flex(column, center, center);
  388. position: absolute;
  389. height: auto;
  390. @include mix.respond-to-max('md') {
  391. position: relative;
  392. }
  393. &.up,
  394. &.down {
  395. left: 0px;
  396. width: 100%;
  397. }
  398. &.up {
  399. top: 0px;
  400. }
  401. &.right {
  402. right: 0px;
  403. }
  404. &.down {
  405. bottom: 0px;
  406. }
  407. &.left {
  408. left: 0px;
  409. }
  410. // Process cards
  411. .process-info {
  412. @include mix.respond-to-max('md') {
  413. position: relative;
  414. width: 100%;
  415. max-width: 400px;
  416. margin: 0 auto map.get(v.$spacers, 3) auto;
  417. padding: map.get(v.$spacers, 3);
  418. background-color: rgba(v.$white, 0.05);
  419. @include mix.border-radius(v.$border-radius-lg);
  420. backdrop-filter: blur(10px);
  421. border: 1px solid rgba(v.$primary, 0.1);
  422. @include mix.transition(v.$transition-base);
  423. &:hover {
  424. background-color: rgba(v.$white, 0.1);
  425. border-color: rgba(v.$primary, 0.3);
  426. @include mix.transform(translateY(-5px));
  427. }
  428. @include mix.flex(column, flex-start, center);
  429. gap: map.get(v.$spacers, 2);
  430. }
  431. .process-icon {
  432. position: relative;
  433. color: var(--color-text-primary);
  434. @include mix.transition(all 0.5s);
  435. svg {
  436. width: 128px;
  437. height: 128px;
  438. }
  439. @include mix.respond-to-max('md') {
  440. flex-shrink: 0;
  441. svg {
  442. width: 90px;
  443. height: 90px;
  444. }
  445. }
  446. }
  447. .process-text {
  448. position: relative;
  449. @include mix.respond-to-min('md') {
  450. top: 10px;
  451. left: 10px;
  452. max-width: 220px;
  453. }
  454. @include mix.respond-to-max('md') {
  455. flex: 1;
  456. top: 0;
  457. left: 0;
  458. max-width: none;
  459. }
  460. .text {
  461. color: var(--color-text-primary);
  462. font-weight: map.get(v.$font-weights, 'bold');
  463. display: block;
  464. margin-bottom: map.get(v.$spacers, 2);
  465. @include mix.respond-to-min('md') {
  466. font-size: map.get(v.$font-sizes, '2xl');
  467. max-width: 220px;
  468. }
  469. @include mix.respond-to-max('md') {
  470. font-size: map.get(v.$font-sizes, 'base');
  471. }
  472. }
  473. p {
  474. line-height: 1.6;
  475. margin: 0;
  476. font-size: 0.97rem;
  477. }
  478. }
  479. // Icon hover (desktop)
  480. @include mix.respond-to-min('md') {
  481. &:hover {
  482. .process-icon {
  483. transform: translateY(-20px);
  484. }
  485. }
  486. }
  487. }
  488. }
  489. // Central image
  490. .central-image {
  491. width: 300px;
  492. height: 300px;
  493. margin-top: 10px;
  494. overflow: hidden;
  495. @include mix.transition(all 0.5s);
  496. @include mix.transform(scale(1));
  497. transform-origin: center center;
  498. border-radius: 50%;
  499. @include mix.respond-to-min('md') {
  500. position: absolute;
  501. top: 50%;
  502. left: 50%;
  503. @include mix.transform(translate(-50%, -50%));
  504. z-index: 1;
  505. }
  506. @include mix.respond-to-max('md') {
  507. position: relative !important;
  508. top: auto !important;
  509. left: auto !important;
  510. right: auto !important;
  511. @include mix.transform(none);
  512. width: 200px;
  513. height: 200px;
  514. margin: map.get(v.$spacers, 3) auto !important;
  515. display: block;
  516. }
  517. .image {
  518. width: 100%;
  519. height: 100%;
  520. object-fit: cover;
  521. }
  522. &:hover {
  523. @include mix.transition(all 0.5s);
  524. @include mix.respond-to-min('md') {
  525. @include mix.transform(translate(-50%, -50%) scale(1.02) translateY(-5px));
  526. }
  527. @include mix.respond-to-max('md') {
  528. @include mix.transform(scale(1.05));
  529. }
  530. }
  531. }
  532. }
  533. }
  534. // Portfolio section with filtering and grid layout
  535. .portfolio {
  536. .portfolio-filters-container {
  537. margin-bottom: map.get(v.$spacers, 5);
  538. }
  539. // Filter buttons for portfolio categories
  540. .portfolio-filters {
  541. list-style: none;
  542. margin: 0;
  543. padding: 0;
  544. @include mix.flex(row, center, center, wrap);
  545. gap: map.get(v.$spacers, 2);
  546. @include mix.respond-to-max('sm') {
  547. gap: map.get(v.$spacers, 1);
  548. }
  549. .filter-btn {
  550. padding: map.get(v.$spacers, 2) map.get(v.$spacers, 3);
  551. background-color: transparent;
  552. color: var(--color-text-secondary);
  553. border: 2px solid v.$light-gray;
  554. @include mix.border-radius(v.$border-radius);
  555. cursor: pointer;
  556. font-weight: map.get(v.$font-weights, 'medium');
  557. font-size: map.get(v.$font-sizes, 'sm');
  558. @include mix.transition(v.$transition-smooth);
  559. white-space: nowrap; // Prevent text wrapping
  560. @include mix.respond-to-max('sm') {
  561. padding: map.get(v.$spacers, 1) map.get(v.$spacers, 2);
  562. font-size: map.get(v.$font-sizes, 'xs');
  563. }
  564. // Hover state
  565. &:hover {
  566. color: v.$primary;
  567. border-color: v.$primary;
  568. @include mix.transform(translateY(-2px));
  569. }
  570. // Active/selected state
  571. &.active {
  572. background-color: v.$primary;
  573. color: v.$white;
  574. border-color: v.$primary;
  575. @include mix.box-shadow(v.$box-shadow);
  576. }
  577. }
  578. }
  579. // Portfolio grid with responsive columns
  580. .portfolio-grid {
  581. display: grid;
  582. grid-template-columns: repeat(4, 1fr); // 4 columns on largest screens
  583. gap: map.get(v.$spacers, 3);
  584. // Progressive column reduction: 4 -> 3 -> 2 -> 1
  585. @include mix.respond-to-max('xl') {
  586. grid-template-columns: repeat(3, 1fr);
  587. }
  588. @include mix.respond-to-max('md') {
  589. grid-template-columns: repeat(2, 1fr);
  590. gap: map.get(v.$spacers, 3);
  591. }
  592. @include mix.respond-to-max('sm') {
  593. grid-template-columns: 1fr;
  594. gap: map.get(v.$spacers, 3);
  595. }
  596. .portfolio-item {
  597. width: 100%;
  598. @include mix.box-shadow(var(--box-shadow));
  599. // Custom easing curve for smooth animations
  600. @include mix.transition(all 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94));
  601. // Isotope.js integration classes
  602. &.isotope-item {
  603. z-index: 2;
  604. }
  605. &.isotope-hidden.isotope-item {
  606. pointer-events: none; // Disable interactions when hidden
  607. z-index: 1;
  608. }
  609. // AOS integration with hover effects
  610. &[data-aos] {
  611. will-change: transform, opacity;
  612. &:hover .portfolio-card {
  613. @include mix.transform(translateY(-8px));
  614. }
  615. &.aos-animate:hover .portfolio-card {
  616. @include mix.transform(translateY(-8px));
  617. }
  618. }
  619. // Portfolio card container
  620. .portfolio-card {
  621. background-color: var(--color-surface);
  622. @include mix.border-radius(v.$border-radius-lg);
  623. @include mix.box-shadow(v.$box-shadow);
  624. @include mix.transition(v.$transition-smooth);
  625. overflow: hidden;
  626. height: 100%; // Full height for equal card heights
  627. @include mix.flex(column, stretch, stretch);
  628. &:hover {
  629. @include mix.transform(translateY(-8px));
  630. @include mix.box-shadow(v.$box-shadow-lg);
  631. // Image zoom effect on hover
  632. .portfolio-image .image {
  633. @include mix.transform(scale(1.1));
  634. }
  635. }
  636. // Portfolio image container
  637. .portfolio-image {
  638. position: relative;
  639. height: 200px; // Fixed height for consistency
  640. overflow: hidden;
  641. @include mix.border-radius(v.$border-radius-lg v.$border-radius-lg 0 0);
  642. .image {
  643. width: 100%;
  644. height: 100%;
  645. object-fit: cover;
  646. @include mix.transition(transform 0.5s ease);
  647. }
  648. }
  649. // Portfolio card content
  650. .portfolio-info {
  651. padding: map.get(v.$spacers, 4);
  652. flex-grow: 1;
  653. @include mix.flex(column, flex-start, stretch);
  654. h4 {
  655. font-size: map.get(v.$font-sizes, 'lg');
  656. font-weight: map.get(v.$font-weights, 'semibold');
  657. margin-bottom: map.get(v.$spacers, 2);
  658. line-height: 1.3;
  659. }
  660. .portfolio-category {
  661. font-size: map.get(v.$font-sizes, 'sm');
  662. color: v.$primary;
  663. font-weight: map.get(v.$font-weights, 'medium');
  664. text-transform: uppercase;
  665. letter-spacing: 0.5px;
  666. }
  667. }
  668. }
  669. }
  670. }
  671. // Empty state when no portfolio items match filter
  672. .portfolio-empty {
  673. text-align: center;
  674. padding: map.get(v.$spacers, 8) map.get(v.$spacers, 4);
  675. color: v.$gray;
  676. h3 {
  677. font-size: map.get(v.$font-sizes, 'xl');
  678. margin-bottom: map.get(v.$spacers, 2);
  679. }
  680. p {
  681. font-size: map.get(v.$font-sizes, 'base');
  682. }
  683. }
  684. // Loading state indicator
  685. .portfolio-loading {
  686. text-align: center;
  687. padding: map.get(v.$spacers, 6);
  688. // CSS-only spinner using pseudo-element
  689. &::after {
  690. content: '';
  691. display: inline-block;
  692. width: 40px;
  693. height: 40px;
  694. border: 4px solid v.$light-gray;
  695. border-top: 4px solid v.$primary;
  696. border-radius: 50%;
  697. animation: spin 1s linear infinite;
  698. }
  699. }
  700. // Keyframe animation for loading spinner
  701. @keyframes spin {
  702. 0% { transform: rotate(0deg); }
  703. 100% { transform: rotate(360deg); }
  704. }
  705. }
  706. // Pricing section for service plans
  707. .pricing-plants {
  708. .options-plants {
  709. display: grid;
  710. grid-template-columns: repeat(3, 1fr);
  711. gap: map.get(v.$spacers, 4);
  712. @include mix.respond-to-max('xl') {
  713. grid-template-columns: repeat(3, 1fr);
  714. }
  715. @include mix.respond-to-max('md') {
  716. grid-template-columns: repeat(2, 1fr);
  717. gap: map.get(v.$spacers, 3);
  718. }
  719. @include mix.respond-to-max('sm') {
  720. grid-template-columns: 1fr;
  721. gap: map.get(v.$spacers, 3);
  722. }
  723. // Base styles for both regular and popular pricing cards
  724. .plants,
  725. .most-popular {
  726. position: relative;
  727. display: grid;
  728. gap: map.get(v.$spacers, 2);
  729. background-color: var(--color-surface);
  730. padding: map.get(v.$spacers, 4);
  731. box-shadow: v.$box-shadow-lg;
  732. border-radius: 20px;
  733. border: 1px solid var(--color-primary);
  734. @include mix.transition(all 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94));
  735. // "Most Popular" badge (hidden by default)
  736. .tag-most-popular {
  737. position: absolute;
  738. top: 0px;
  739. right: map.get(v.$spacers, 4);
  740. color: v.$black;
  741. background-color: v.$white;
  742. padding: 10px;
  743. border-radius: 0px 0px 10px 10px;
  744. visibility: hidden; // Only visible on .most-popular
  745. }
  746. .plant-header {
  747. h2 {
  748. font-size: map.get(v.$spacers, 4);
  749. font-weight: 500;
  750. }
  751. }
  752. .price {
  753. .price-main {
  754. color: var(--color-text-primary);
  755. font-size: 2.2rem;
  756. font-weight: 600;
  757. .price-discount {
  758. color: v.$gray;
  759. text-decoration: line-through;
  760. }
  761. }
  762. }
  763. // Benefits list section
  764. .benefits {
  765. padding-top: 10px;
  766. .line {
  767. border: 1px solid rgba(250, 247, 247, 0.1);
  768. }
  769. .benefits-list {
  770. padding-top: 10px;
  771. .benefit-item {
  772. display: flex;
  773. align-items: center;
  774. justify-content: baseline;
  775. margin-bottom: 5px;
  776. .benefit-icon {
  777. width: 20px;
  778. height: 20px;
  779. margin-right: 10px;
  780. }
  781. .circle-x-svg {
  782. display: inline-flex;
  783. align-items: center;
  784. justify-content: center;
  785. margin-right: 10px;
  786. }
  787. .circle-x-svg svg {
  788. color: inherit;
  789. }
  790. .text {
  791. color: var(--color-text-muted);
  792. }
  793. }
  794. }
  795. }
  796. // Hover effect with scale animation
  797. &:hover {
  798. @include mix.transition(all 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94));
  799. transform: scale(1.1);
  800. }
  801. }
  802. // Special styling for the highlighted "most popular" plan
  803. .most-popular {
  804. background-color: v.$primary-dark;
  805. .tag-most-popular {
  806. visibility: visible; // Show the badge
  807. }
  808. .plant-header {
  809. color: v.$gray;
  810. h2 {
  811. color: v.$white;
  812. }
  813. }
  814. .price {
  815. .price-main {
  816. color: v.$white;
  817. }
  818. }
  819. // Different colors for benefits in popular plan
  820. .benefits-list {
  821. .benefit-item {
  822. .benefit-icon {
  823. color: v.$gray;
  824. }
  825. .text {
  826. color: v.$white !important;
  827. }
  828. .circle-x-svg svg {
  829. color: v.$gray !important;
  830. }
  831. }
  832. }
  833. }
  834. }
  835. }
  836. // Team section with member cards
  837. .team {
  838. .team-content {
  839. display: grid;
  840. grid-template-columns: repeat(4, 1fr);
  841. gap: map.get(v.$spacers, 4);
  842. @include mix.respond-to-max('xl') {
  843. grid-template-columns: repeat(3, 1fr);
  844. }
  845. @include mix.respond-to-max('md') {
  846. grid-template-columns: repeat(2, 1fr);
  847. gap: map.get(v.$spacers, 3);
  848. }
  849. @include mix.respond-to-max('sm') {
  850. grid-template-columns: 1fr;
  851. gap: map.get(v.$spacers, 3);
  852. }
  853. .item-team {
  854. position: relative;
  855. background-color: var(--color-surface);
  856. @include mix.border-radius(v.$border-radius-lg);
  857. @include mix.transition(all 0.6s);
  858. @include mix.box-shadow(var(--box-shadow));
  859. overflow: hidden;
  860. height: 350px;
  861. &:hover {
  862. @include mix.transform(scale(1.05));
  863. }
  864. .image {
  865. width: 100%;
  866. height: 100%;
  867. object-fit: cover;
  868. object-position: center top;
  869. }
  870. // Floating social info overlay
  871. .social-info {
  872. position: absolute;
  873. bottom: 20px;
  874. left: 50%;
  875. transform: translateX(-50%);
  876. background-color: var(--color-surface);
  877. width: 100%;
  878. max-width: 200px;
  879. padding: map.get(v.$spacers, 2);
  880. @include mix.border-radius(v.$border-radius-lg);
  881. @include mix.respond-to-max('sm') {
  882. bottom: 0px;
  883. left: -30px;
  884. transform: translateX(0);
  885. border-radius: 0px 10px 0px 0px;
  886. }
  887. .info {
  888. display: flex;
  889. align-items: center;
  890. flex-direction: column;
  891. margin-bottom: map.get(v.$spacers, 2);
  892. .name {
  893. font-size: map.get(v.$font-sizes, 'lg');
  894. font-weight: map.get(v.$font-weights, 'semibold');
  895. color: var(--color-text-primary);
  896. margin-bottom: map.get(v.$spacers, 1);
  897. text-align: center;
  898. }
  899. .rol {
  900. font-size: map.get(v.$font-sizes, 'sm');
  901. font-weight: map.get(v.$font-weights, 'regular');
  902. color: v.$primary;
  903. text-align: center;
  904. }
  905. }
  906. // Social media links
  907. .social-links {
  908. display: flex;
  909. justify-content: center;
  910. gap: 10px;
  911. svg {
  912. width: 20px;
  913. height: 20px;
  914. color: var(--color-text-muted);
  915. @include mix.transition(v.$transition-base);
  916. &:hover {
  917. color: v.$primary;
  918. @include mix.transform(scale(1.1));
  919. }
  920. }
  921. }
  922. }
  923. }
  924. }
  925. }
  926. // Team Member section
  927. .member-profile-page {
  928. display: grid;
  929. grid-template-columns: 300px 1fr;
  930. gap: map.get(v.$spacers, 6);
  931. color: var(--color-text-primary);
  932. @include mix.respond-to-max('md') {
  933. grid-template-columns: 1fr;
  934. }
  935. .section-header {
  936. grid-column: 1 / -1;
  937. }
  938. }
  939. // Left column: image, name, role, and social
  940. .member-aside {
  941. text-align: center;
  942. background-color: var(--color-surface);
  943. padding: map.get(v.$spacers, 4);
  944. border-radius: v.$border-radius;
  945. box-shadow: v.$box-shadow;
  946. .image-wrapper {
  947. img {
  948. width: 100%;
  949. border-radius: v.$border-radius;
  950. margin-bottom: map.get(v.$spacers, 3);
  951. }
  952. }
  953. .member-name {
  954. font-size: map.get(v.$font-sizes, 'lg');
  955. font-weight: map.get(v.$font-weights, 'bold');
  956. margin-bottom: 0.25rem;
  957. }
  958. .member-role {
  959. font-size: map.get(v.$font-sizes, 'sm');
  960. color: var(--color-text-muted);
  961. margin-bottom: map.get(v.$spacers, 3);
  962. }
  963. .social-links {
  964. display: flex;
  965. justify-content: center;
  966. gap: map.get(v.$spacers, 2);
  967. }
  968. }
  969. // Right column: bio, skills, specialties
  970. .member-main-content {
  971. display: flex;
  972. flex-direction: column;
  973. gap: map.get(v.$spacers, 5);
  974. }
  975. // Biography section
  976. .biography {
  977. h3 {
  978. font-size: map.get(v.$font-sizes, 'lg');
  979. font-weight: map.get(v.$font-weights, 'bold');
  980. margin-bottom: map.get(v.$spacers, 2);
  981. }
  982. p {
  983. margin-bottom: map.get(v.$spacers, 2);
  984. line-height: 1.7;
  985. }
  986. }
  987. // Skills section using custom-progress
  988. .skills {
  989. h3 {
  990. font-size: map.get(v.$font-sizes, 'lg');
  991. font-weight: map.get(v.$font-weights, 'bold');
  992. margin-bottom: map.get(v.$spacers, 3);
  993. }
  994. .about-progress {
  995. display: flex;
  996. flex-direction: column;
  997. gap: map.get(v.$spacers, 3);
  998. }
  999. }
  1000. // Specialty section
  1001. .specialties {
  1002. h3 {
  1003. font-size: map.get(v.$font-sizes, 'lg');
  1004. font-weight: map.get(v.$font-weights, 'bold');
  1005. margin-bottom: map.get(v.$spacers, 3);
  1006. }
  1007. .specialty-list {
  1008. display: grid;
  1009. grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  1010. gap: map.get(v.$spacers, 2);
  1011. list-style: none;
  1012. padding: 0;
  1013. li {
  1014. background-color: var(--color-surface-scase);
  1015. padding: 0.75rem 1rem;
  1016. border-radius: v.$border-radius-sm;
  1017. color: var(--color-text-primary);
  1018. font-size: map.get(v.$font-sizes, 'sm');
  1019. }
  1020. }
  1021. }
  1022. // Blog section with article cards
  1023. .blog {
  1024. display: grid;
  1025. grid-template-columns: 1fr 300px;
  1026. gap: map.get(v.$spacers, 4);
  1027. @include mix.respond-to-max('md') {
  1028. grid-template-columns: repeat(1, 1fr);
  1029. gap: map.get(v.$spacers, 3);
  1030. }
  1031. &.no-blog-sidebar {
  1032. grid-template-columns: repeat(1, 1fr);
  1033. }
  1034. .blog-grid {
  1035. display: grid;
  1036. @include mix.grid(1, map.get(v.$spacers, 4));
  1037. &.blog-grid-col2 {
  1038. @include mix.grid(2, map.get(v.$spacers, 4));
  1039. }
  1040. &.blog-grid-col3 {
  1041. @include mix.grid(3, map.get(v.$spacers, 4));
  1042. }
  1043. &.blog-grid-col2,
  1044. &.blog-grid-col3 {
  1045. @include mix.respond-to-max('md') {
  1046. grid-template-columns: repeat(1, 1fr);
  1047. gap: map.get(v.$spacers, 3);
  1048. }
  1049. }
  1050. .blog-card {
  1051. position: relative;
  1052. @include mix.flex(column, stretch, stretch);
  1053. height: 430px; // Fixed height for consistency
  1054. background-color: var(--color-surface);
  1055. @include mix.border-radius(v.$border-radius-lg);
  1056. @include mix.box-shadow(var(--box-shadow));
  1057. @include mix.transition(v.$transition-smooth);
  1058. overflow: hidden;
  1059. // AOS integration
  1060. &[data-aos] {
  1061. will-change: transform, opacity;
  1062. &:hover {
  1063. @include mix.transform(translateY(-8px));
  1064. }
  1065. &.aos-animate:hover {
  1066. @include mix.transform(translateY(-8px));
  1067. }
  1068. }
  1069. &:hover {
  1070. @include mix.transform(translateY(-8px));
  1071. @include mix.box-shadow(v.$box-shadow-lg);
  1072. // Image zoom effect
  1073. .blog-image .image {
  1074. @include mix.transform(scale(1.05));
  1075. }
  1076. // Read more link animation
  1077. .read-more {
  1078. color: v.$primary-light;
  1079. svg {
  1080. @include mix.transform(translateX(5px));
  1081. }
  1082. }
  1083. }
  1084. // Blog post featured image
  1085. .blog-image {
  1086. position: relative;
  1087. overflow: hidden;
  1088. .image {
  1089. width: 100%;
  1090. height: 100%;
  1091. object-fit: cover;
  1092. object-position: center -50px;
  1093. @include mix.transition(v.$transition-smooth);
  1094. }
  1095. // Category tag overlay
  1096. .blog-category {
  1097. position: absolute;
  1098. top: map.get(v.$spacers, 3);
  1099. left: map.get(v.$spacers, 3);
  1100. z-index: 10;
  1101. .category-tag {
  1102. background: rgba(0, 0, 0, 0.6);
  1103. color: v.$white;
  1104. padding: map.get(v.$spacers, 1) map.get(v.$spacers, 2);
  1105. @include mix.border-radius(v.$border-radius-sm);
  1106. font-size: map.get(v.$font-sizes, 'xs');
  1107. font-weight: map.get(v.$font-weights, 'medium');
  1108. text-transform: uppercase;
  1109. letter-spacing: 0.5px;
  1110. backdrop-filter: blur(4px);
  1111. @include mix.transition(v.$transition-base);
  1112. }
  1113. }
  1114. }
  1115. // Blog post content area
  1116. .blog-content {
  1117. padding: map.get(v.$spacers, 4);
  1118. @include mix.flex(column, flex-start, stretch);
  1119. gap: map.get(v.$spacers, 2);
  1120. height: 100%;
  1121. flex-grow: 1;
  1122. }
  1123. // Blog metadata (date, author)
  1124. .blog-meta {
  1125. @include mix.flex(row, space-between, center);
  1126. flex-wrap: wrap;
  1127. gap: map.get(v.$spacers, 2);
  1128. margin-bottom: map.get(v.$spacers, 2);
  1129. .blog-date,
  1130. .blog-author {
  1131. @include mix.flex(row, flex-start, center);
  1132. gap: map.get(v.$spacers, 1);
  1133. color: v.$gray;
  1134. font-size: map.get(v.$font-sizes, 'sm');
  1135. svg {
  1136. width: 16px;
  1137. height: 16px;
  1138. fill: currentColor;
  1139. }
  1140. }
  1141. @include mix.respond-to-max('sm') {
  1142. @include mix.flex(column, flex-start, flex-start);
  1143. gap: map.get(v.$spacers, 1);
  1144. }
  1145. }
  1146. // Blog post title
  1147. .blog-title {
  1148. font-size: map.get(v.$font-sizes, 'lg');
  1149. font-weight: map.get(v.$font-weights, 'semibold');
  1150. line-height: 1.4;
  1151. margin-bottom: map.get(v.$spacers, 2);
  1152. @include mix.transition(v.$transition-base);
  1153. &:hover {
  1154. color: v.$primary;
  1155. }
  1156. }
  1157. // Blog post excerpt
  1158. .blog-excerpt {
  1159. font-size: map.get(v.$font-sizes, 'sm');
  1160. line-height: 1.6;
  1161. margin-bottom: map.get(v.$spacers, 3);
  1162. flex-grow: 1; // Take remaining space
  1163. }
  1164. // Blog post footer with actions and stats
  1165. .blog-footer {
  1166. @include mix.flex(row, space-between, center);
  1167. margin-top: auto;
  1168. padding-top: map.get(v.$spacers, 3);
  1169. border-top: 1px solid v.$light-gray;
  1170. .read-more {
  1171. @include mix.flex(row, flex-start, center);
  1172. gap: map.get(v.$spacers, 1);
  1173. color: v.$primary;
  1174. font-weight: map.get(v.$font-weights, 'medium');
  1175. font-size: map.get(v.$font-sizes, 'sm');
  1176. text-decoration: none;
  1177. @include mix.transition(v.$transition-base);
  1178. svg {
  1179. width: 16px;
  1180. height: 16px;
  1181. fill: currentColor;
  1182. @include mix.transition(v.$transition-base);
  1183. }
  1184. &:hover {
  1185. color: v.$primary-light;
  1186. }
  1187. }
  1188. .blog-stats {
  1189. .reading-time {
  1190. @include mix.flex(row, flex-start, center);
  1191. gap: map.get(v.$spacers, 1);
  1192. color: v.$gray;
  1193. font-size: map.get(v.$font-sizes, 'xs');
  1194. svg {
  1195. width: 14px;
  1196. height: 14px;
  1197. fill: currentColor;
  1198. }
  1199. }
  1200. }
  1201. @include mix.respond-to-max('sm') {
  1202. @include mix.flex(column, flex-start, flex-start);
  1203. gap: map.get(v.$spacers, 2);
  1204. }
  1205. }
  1206. }
  1207. // Responsive adjustments for blog cards
  1208. @include mix.respond-to-max('md') {
  1209. .blog-card {
  1210. .blog-image {
  1211. height: 180px;
  1212. }
  1213. .blog-content {
  1214. padding: map.get(v.$spacers, 3);
  1215. }
  1216. .blog-title {
  1217. font-size: map.get(v.$font-sizes, 'base');
  1218. }
  1219. }
  1220. }
  1221. }
  1222. .blog-sidebar {
  1223. background-color: var(--color-surface);
  1224. padding: map.get(v.$spacers, 4);
  1225. border-radius: v.$border-radius;
  1226. color: var(--color-text-primary);
  1227. .search-box {
  1228. display: flex;
  1229. margin-bottom: map.get(v.$spacers, 4);
  1230. input {
  1231. flex: 1;
  1232. padding: 0.5rem;
  1233. border: 1px solid var(--color-border);
  1234. border-radius: v.$border-radius 0 0 v.$border-radius;
  1235. background-color: var(--color-surface-scase);
  1236. color: var(--color-text-primary);
  1237. }
  1238. button {
  1239. background-color: var(--color-primary);
  1240. color: v.$white;
  1241. border: none;
  1242. padding: 0 1rem;
  1243. border-radius: 0 v.$border-radius v.$border-radius 0;
  1244. cursor: pointer;
  1245. i {
  1246. font-size: 1rem;
  1247. }
  1248. }
  1249. }
  1250. h4 {
  1251. font-weight: map.get(v.$font-weights, 'bold');
  1252. margin-bottom: map.get(v.$spacers, 3);
  1253. color: var(--color-text-primary);
  1254. }
  1255. .title {
  1256. padding: 20px 0px;
  1257. }
  1258. .categories ul,
  1259. .recent-posts ul {
  1260. list-style: none;
  1261. padding: 0;
  1262. li {
  1263. display: flex;
  1264. justify-content: space-between;
  1265. padding: 0.5rem 0;
  1266. border-bottom: 1px solid var(--color-border);
  1267. color: var(--color-text-primary);
  1268. &:last-child {
  1269. border-bottom: none;
  1270. }
  1271. span {
  1272. font-weight: map.get(v.$font-weights, 'bold');
  1273. }
  1274. }
  1275. }
  1276. .categories ul li {
  1277. display: flex;
  1278. justify-content: space-between;
  1279. padding: 0.5rem 0;
  1280. border-bottom: 1px solid var(--color-border);
  1281. &:last-child {
  1282. border-bottom: none;
  1283. }
  1284. a {
  1285. display: flex;
  1286. justify-content: space-between;
  1287. width: 100%;
  1288. color: var(--color-text-primary);
  1289. text-decoration: none;
  1290. padding: 0.3rem 0.5rem;
  1291. border-radius: v.$border-radius-sm;
  1292. transition: background-color 0.3s ease, color 0.3s ease;
  1293. &:hover {
  1294. background-color: var(--color-primary);
  1295. }
  1296. &.active {
  1297. background-color: var(--color-primary);
  1298. color: v.$white;
  1299. span {
  1300. color: v.$white;
  1301. }
  1302. }
  1303. span {
  1304. font-weight: map.get(v.$font-weights, 'bold');
  1305. }
  1306. }
  1307. }
  1308. .recent-posts ul li {
  1309. display: flex;
  1310. align-items: center;
  1311. img {
  1312. width: 50px;
  1313. height: 50px;
  1314. border-radius: v.$border-radius-sm;
  1315. margin-right: map.get(v.$spacers, 2);
  1316. object-fit: cover;
  1317. }
  1318. div a {
  1319. font-weight: map.get(v.$font-weights, 'bold');
  1320. color: var(--color-text-primary);
  1321. text-decoration: none;
  1322. &:hover {
  1323. color: var(--color-primary);
  1324. }
  1325. }
  1326. div span {
  1327. display: block;
  1328. font-size: map.get(v.$font-sizes, 'sm');
  1329. color: var(--color-text-muted);
  1330. }
  1331. }
  1332. .tags .tag-list {
  1333. display: flex;
  1334. flex-wrap: wrap;
  1335. gap: map.get(v.$spacers, 2);
  1336. a {
  1337. background-color: var(--color-surface-scase);
  1338. color: var(--color-text-primary);
  1339. padding: 0.3rem 0.6rem;
  1340. border-radius: v.$border-radius-sm;
  1341. text-decoration: none;
  1342. font-size: map.get(v.$font-sizes, 'sm');
  1343. &:hover {
  1344. background-color: var(--color-primary);
  1345. color: v.$white;
  1346. }
  1347. }
  1348. }
  1349. .social-icons {
  1350. display: flex;
  1351. gap: map.get(v.$spacers, 4);
  1352. .social-link {
  1353. svg {
  1354. color: var(--color-text-primary);
  1355. &:hover {
  1356. color: var(--color-primary);
  1357. }
  1358. }
  1359. }
  1360. }
  1361. }
  1362. }
  1363. // Contact form section with two-column layout
  1364. .contact-form {
  1365. .contact-form-container {
  1366. max-width: 1000px;
  1367. margin: 0 auto;
  1368. }
  1369. .contact-form-content {
  1370. display: grid;
  1371. grid-template-columns: 1fr 1.3fr; // Unequal columns (form is wider)
  1372. gap: map.get(v.$spacers, 4);
  1373. @include mix.respond-to-max('lg') {
  1374. grid-template-columns: 1fr; // Single column on mobile
  1375. gap: map.get(v.$spacers, 4);
  1376. }
  1377. }
  1378. // Contact information card with gradient background
  1379. .contact-info-card {
  1380. background: linear-gradient(135deg, v.$primary-dark 0%, v.$primary 100%);
  1381. color: v.$white;
  1382. padding: map.get(v.$spacers, 4);
  1383. @include mix.border-radius(v.$border-radius-lg);
  1384. height: fit-content;
  1385. position: relative;
  1386. overflow: hidden;
  1387. // Decorative circle element
  1388. &::before {
  1389. content: '';
  1390. position: absolute;
  1391. top: 0;
  1392. right: 0;
  1393. width: 150px;
  1394. height: 150px;
  1395. background: rgba(v.$white, 0.1);
  1396. border-radius: 50%;
  1397. transform: translate(30%, -30%);
  1398. }
  1399. .contact-info-header {
  1400. margin-bottom: map.get(v.$spacers, 4);
  1401. position: relative;
  1402. z-index: 1;
  1403. h3 {
  1404. font-size: map.get(v.$font-sizes, 'xl');
  1405. font-weight: map.get(v.$font-weights, 'bold');
  1406. margin-bottom: map.get(v.$spacers, 2);
  1407. color: v.$white;
  1408. }
  1409. p {
  1410. font-size: map.get(v.$font-sizes, 'sm');
  1411. line-height: 1.6;
  1412. opacity: 0.9;
  1413. margin: 0;
  1414. }
  1415. }
  1416. // Contact details list
  1417. .contact-details {
  1418. margin-bottom: map.get(v.$spacers, 4);
  1419. position: relative;
  1420. z-index: 1;
  1421. .contact-detail-item {
  1422. @include mix.flex(row, flex-start, flex-start);
  1423. gap: map.get(v.$spacers, 2);
  1424. margin-bottom: map.get(v.$spacers, 3);
  1425. &:last-child {
  1426. margin-bottom: 0;
  1427. }
  1428. .contact-icon {
  1429. flex-shrink: 0;
  1430. width: 20px;
  1431. height: 20px;
  1432. margin-top: 2px;
  1433. svg {
  1434. width: 100%;
  1435. height: 100%;
  1436. fill: currentColor;
  1437. }
  1438. }
  1439. .contact-text {
  1440. @include mix.flex(column, flex-start, flex-start);
  1441. gap: map.get(v.$spacers, 1);
  1442. .label {
  1443. font-size: map.get(v.$font-sizes, 'xs');
  1444. font-weight: map.get(v.$font-weights, 'medium');
  1445. opacity: 0.8;
  1446. text-transform: uppercase;
  1447. letter-spacing: 0.5px;
  1448. }
  1449. .value {
  1450. font-size: map.get(v.$font-sizes, 'sm');
  1451. font-weight: map.get(v.$font-weights, 'regular');
  1452. line-height: 1.5;
  1453. }
  1454. }
  1455. }
  1456. }
  1457. // Social media links
  1458. .contact-social {
  1459. position: relative;
  1460. z-index: 1;
  1461. .social-label {
  1462. font-size: map.get(v.$font-sizes, 'xs');
  1463. font-weight: map.get(v.$font-weights, 'medium');
  1464. opacity: 0.8;
  1465. text-transform: uppercase;
  1466. letter-spacing: 0.5px;
  1467. display: block;
  1468. margin-bottom: map.get(v.$spacers, 2);
  1469. }
  1470. .social-links {
  1471. @include mix.flex(row, flex-start, center);
  1472. gap: map.get(v.$spacers, 2);
  1473. .social-link {
  1474. width: 36px;
  1475. height: 36px;
  1476. background: rgba(v.$white, 0.2);
  1477. @include mix.border-radius(50%);
  1478. @include mix.flex(row, center, center);
  1479. @include mix.transition(v.$transition-base);
  1480. svg {
  1481. width: 18px;
  1482. height: 18px;
  1483. fill: currentColor;
  1484. }
  1485. &:hover {
  1486. background: rgba(v.$white, 0.3);
  1487. @include mix.transform(translateY(-2px));
  1488. }
  1489. }
  1490. }
  1491. }
  1492. }
  1493. // Contact form card
  1494. .contact-form-card {
  1495. background-color: var(--color-surface);
  1496. padding: map.get(v.$spacers, 4);
  1497. @include mix.border-radius(v.$border-radius-lg);
  1498. border: 1px solid var(--color-primary);
  1499. .contact-form-fields {
  1500. display: grid;
  1501. grid-template-columns: 1fr 1fr; // Two-column form layout
  1502. gap: map.get(v.$spacers, 3);
  1503. @include mix.respond-to-max('md') {
  1504. grid-template-columns: 1fr; // Single column on mobile
  1505. gap: map.get(v.$spacers, 3);
  1506. }
  1507. .form-group {
  1508. @include mix.flex(column, flex-start, stretch);
  1509. gap: map.get(v.$spacers, 1);
  1510. // Full-width form groups span both columns
  1511. &.form-group-full {
  1512. grid-column: 1 / -1;
  1513. }
  1514. .form-label {
  1515. font-size: map.get(v.$font-sizes, 'sm');
  1516. font-weight: map.get(v.$font-weights, 'medium');
  1517. color: v.$dark-gray;
  1518. margin: 0;
  1519. }
  1520. // Base styles for form inputs
  1521. .form-input,
  1522. .form-select,
  1523. .form-textarea {
  1524. width: 100%;
  1525. padding: map.get(v.$spacers, 2);
  1526. border: 2px solid v.$light-gray;
  1527. @include mix.border-radius(v.$border-radius);
  1528. font-size: map.get(v.$font-sizes, 'sm');
  1529. font-family: v.$font-family-sans;
  1530. @include mix.transition(v.$transition-base);
  1531. background: v.$white;
  1532. &:focus {
  1533. outline: none;
  1534. border-color: v.$primary;
  1535. @include mix.box-shadow(0 0 0 3px rgba(v.$primary, 0.1));
  1536. }
  1537. &:invalid:not(:focus):not(:placeholder-shown) {
  1538. border-color: #dc3545; // Red for validation errors
  1539. }
  1540. &::placeholder {
  1541. color: v.$gray;
  1542. opacity: 0.7;
  1543. }
  1544. }
  1545. // Textarea specific styles
  1546. .form-textarea {
  1547. resize: vertical;
  1548. min-height: 100px;
  1549. line-height: 1.6;
  1550. }
  1551. // Select dropdown with custom arrow
  1552. .form-select {
  1553. cursor: pointer;
  1554. background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='m6 8 4 4 4-4'/%3e%3c/svg%3e");
  1555. background-position: right 12px center;
  1556. background-repeat: no-repeat;
  1557. background-size: 16px;
  1558. padding-right: 40px;
  1559. appearance: none; // Remove default browser styling
  1560. }
  1561. // Custom checkbox styling
  1562. .form-checkbox-container {
  1563. @include mix.flex(row, flex-start, flex-start);
  1564. gap: map.get(v.$spacers, 2);
  1565. cursor: pointer;
  1566. font-size: map.get(v.$font-sizes, 'xs');
  1567. line-height: 1.5;
  1568. .form-checkbox {
  1569. position: absolute;
  1570. opacity: 0;
  1571. cursor: pointer;
  1572. &:checked + .form-checkmark {
  1573. background-color: v.$primary;
  1574. border-color: v.$primary;
  1575. &::after {
  1576. display: block;
  1577. }
  1578. }
  1579. }
  1580. // Custom checkmark design
  1581. .form-checkmark {
  1582. position: relative;
  1583. width: 18px;
  1584. height: 18px;
  1585. border: 2px solid v.$light-gray;
  1586. @include mix.border-radius(v.$border-radius-sm);
  1587. @include mix.transition(v.$transition-base);
  1588. flex-shrink: 0;
  1589. margin-top: 1px;
  1590. // Checkmark icon using CSS
  1591. &::after {
  1592. content: '';
  1593. position: absolute;
  1594. display: none;
  1595. left: 5px;
  1596. top: 1px;
  1597. width: 5px;
  1598. height: 9px;
  1599. border: solid v.$white;
  1600. border-width: 0 2px 2px 0;
  1601. transform: rotate(45deg);
  1602. }
  1603. }
  1604. .form-checkbox-text {
  1605. color: v.$dark-gray;
  1606. .form-link {
  1607. color: v.$primary;
  1608. text-decoration: none;
  1609. &:hover {
  1610. text-decoration: underline;
  1611. }
  1612. }
  1613. }
  1614. }
  1615. // Form validation error messages
  1616. .form-error {
  1617. font-size: map.get(v.$font-sizes, 'xs');
  1618. color: #dc3545;
  1619. margin-top: -8px;
  1620. display: none;
  1621. &.show {
  1622. display: block;
  1623. }
  1624. }
  1625. }
  1626. // Form submission section
  1627. .form-actions {
  1628. grid-column: 1 / -1;
  1629. margin-top: map.get(v.$spacers, 1);
  1630. .form-submit-btn {
  1631. width: 100%;
  1632. position: relative;
  1633. @include mix.flex(row, center, center);
  1634. gap: map.get(v.$spacers, 2);
  1635. @include mix.respond-to-min('md') {
  1636. width: auto;
  1637. min-width: 180px;
  1638. }
  1639. // Loading state content
  1640. .btn-loading {
  1641. @include mix.flex(row, center, center);
  1642. gap: map.get(v.$spacers, 2);
  1643. .loading-spinner {
  1644. width: 18px;
  1645. height: 18px;
  1646. animation: spin 1s linear infinite;
  1647. }
  1648. }
  1649. &:disabled {
  1650. opacity: 0.7;
  1651. cursor: not-allowed;
  1652. }
  1653. }
  1654. }
  1655. // Form status messages
  1656. .form-status {
  1657. grid-column: 1 / -1;
  1658. margin-top: map.get(v.$spacers, 2);
  1659. .form-success,
  1660. .form-error-general {
  1661. @include mix.flex(row, flex-start, center);
  1662. gap: map.get(v.$spacers, 2);
  1663. padding: map.get(v.$spacers, 2);
  1664. @include mix.border-radius(v.$border-radius);
  1665. font-size: map.get(v.$font-sizes, 'sm');
  1666. svg {
  1667. width: 18px;
  1668. height: 18px;
  1669. flex-shrink: 0;
  1670. }
  1671. }
  1672. // Success message styling
  1673. .form-success {
  1674. background: rgba(#22c55e, 0.1);
  1675. color: #15803d;
  1676. border: 1px solid rgba(#22c55e, 0.3);
  1677. svg {
  1678. fill: #22c55e;
  1679. }
  1680. }
  1681. // Error message styling
  1682. .form-error-general {
  1683. background: rgba(#dc3545, 0.1);
  1684. color: #dc3545;
  1685. border: 1px solid rgba(#dc3545, 0.3);
  1686. svg {
  1687. fill: #dc3545;
  1688. }
  1689. }
  1690. }
  1691. }
  1692. }
  1693. // Spinner animation keyframes
  1694. @keyframes spin {
  1695. 0% { transform: rotate(0deg); }
  1696. 100% { transform: rotate(360deg); }
  1697. }
  1698. // Responsive contact form adjustments
  1699. @include mix.respond-to-max('lg') {
  1700. .contact-info-card {
  1701. padding: map.get(v.$spacers, 4);
  1702. }
  1703. .contact-form-card {
  1704. padding: map.get(v.$spacers, 4);
  1705. }
  1706. }
  1707. @include mix.respond-to-max('md') {
  1708. .contact-info-card {
  1709. padding: map.get(v.$spacers, 3);
  1710. }
  1711. .contact-form-card {
  1712. padding: map.get(v.$spacers, 3);
  1713. }
  1714. }
  1715. }
  1716. }
  1717. }
  1718. // Statistics/counting section with background
  1719. .counting-info {
  1720. @include mix.flex(row, center, center);
  1721. height: 500px;
  1722. @include mix.respond-to-max('lg') {
  1723. padding: 100px 0;
  1724. }
  1725. @include mix.respond-to-max('md') {
  1726. height: auto;
  1727. padding: 80px 0;
  1728. }
  1729. @include mix.respond-to-max('sm') {
  1730. padding: 60px 0;
  1731. }
  1732. .counting-content {
  1733. max-width: 900px;
  1734. @include mix.grid(2, map.get(v.$spacers, 6)); // Two-column layout
  1735. @include mix.respond-to-max('md') {
  1736. max-width: 600px;
  1737. @include mix.grid(1, map.get(v.$spacers, 4)); // Single column on mobile
  1738. text-align: center;
  1739. margin: 0 auto;
  1740. // Reorder content on mobile
  1741. .info {
  1742. order: 1;
  1743. }
  1744. .box-counting {
  1745. order: 2;
  1746. justify-self: center;
  1747. }
  1748. }
  1749. // Information/description section
  1750. .info {
  1751. max-width: 299px;
  1752. @include mix.respond-to-max('md') {
  1753. max-width: 80%;
  1754. margin: 0 auto;
  1755. }
  1756. .title,
  1757. .text {
  1758. color: v.$white;
  1759. }
  1760. .title {
  1761. max-width: 250px;
  1762. font-size: map.get(v.$font-sizes, '2xl');
  1763. font-weight: map.get(v.$font-weights, 'bold');
  1764. line-height: 1.3;
  1765. margin-bottom: map.get(v.$spacers, 3);
  1766. @include mix.respond-to-max('md') {
  1767. max-width: 100%;
  1768. margin-left: auto;
  1769. margin-right: auto;
  1770. }
  1771. .subinfo {
  1772. color: v.$primary;
  1773. font-weight: map.get(v.$font-weights, 'semibold');
  1774. }
  1775. }
  1776. .text {
  1777. font-size: map.get(v.$font-sizes, 'base');
  1778. font-weight: map.get(v.$font-weights, 'regular');
  1779. line-height: 1.6;
  1780. margin-bottom: map.get(v.$spacers, 4);
  1781. }
  1782. }
  1783. // Statistics counters section
  1784. .box-counting {
  1785. align-self: center;
  1786. @include mix.align-items(center);
  1787. @include mix.grid(3, map.get(v.$spacers, 3)); // 3 columns of counters
  1788. @include mix.respond-to-max('md') {
  1789. @include mix.grid(2, map.get(v.$spacers, 4)); // 2 columns on tablet
  1790. }
  1791. @include mix.respond-to-max('sm') {
  1792. @include mix.grid(1, map.get(v.$spacers, 3)); // 1 column on mobile
  1793. }
  1794. // Individual counter cards
  1795. .counts {
  1796. @include mix.flex(column, center, center);
  1797. color: v.$white;
  1798. background-color: rgba(v.$primary, 0.2);
  1799. width: 180px;
  1800. height: 160px;
  1801. .number {
  1802. font-size: map.get(v.$font-sizes, '2xl');
  1803. font-weight: map.get(v.$font-weights, 'bold');
  1804. line-height: 1;
  1805. margin-bottom: map.get(v.$spacers, 1);
  1806. }
  1807. .label {
  1808. font-size: map.get(v.$font-sizes, 'sm');
  1809. font-weight: map.get(v.$font-weights, 'medium');
  1810. text-align: center;
  1811. line-height: 1.4;
  1812. }
  1813. svg {
  1814. width: 50px;
  1815. height: 50px;
  1816. margin-bottom: map.get(v.$spacers, 2);
  1817. }
  1818. }
  1819. }
  1820. }
  1821. }
  1822. // Client companies section with logo carousel
  1823. .client-companies {
  1824. .customers-carousel {
  1825. .slider-container {
  1826. gap: 30px;
  1827. }
  1828. .client-company {
  1829. height: 140px;
  1830. margin-top: 20px;
  1831. margin-bottom: 20px;
  1832. @include mix.border-radius(v.$border-radius-lg);
  1833. @include mix.transition(all 0.6s);
  1834. .image {
  1835. width: 100%;
  1836. height: 100%;
  1837. object-fit: cover; // Maintain aspect ratio
  1838. filter: grayscale(100%); // Black and white by default
  1839. @include mix.transition(all 0.6s);
  1840. @include mix.border-radius(v.$border-radius-lg);
  1841. }
  1842. &:hover {
  1843. @include mix.transform(scale(1.1));
  1844. .image {
  1845. filter: grayscale(0%); // Full color on hover
  1846. }
  1847. }
  1848. }
  1849. }
  1850. }
  1851. // Testimonials section with dual layout support
  1852. .testimonials {
  1853. @include mix.flex(column, center, center);
  1854. // Grid version of testimonials
  1855. .testimonials-grid {
  1856. position: relative;
  1857. @include mix.flex(row, center, center);
  1858. gap: map.get(v.$spacers, 4);
  1859. width: 1250px;
  1860. height: 300px;
  1861. overflow: hidden;
  1862. z-index: 1;
  1863. @include mix.respond-to-max('md') {
  1864. width: 824px;
  1865. }
  1866. @include mix.respond-to-max('sm') {
  1867. width: 100%;
  1868. }
  1869. // Shared styles for testimonial cards
  1870. .comment {
  1871. @include mix.flex(column, center, center);
  1872. background-color: var(--color-surface);
  1873. width: 400px;
  1874. height: 300px;
  1875. padding: map.get(v.$spacers, 4);
  1876. border-radius: 20px;
  1877. box-sizing: border-box;
  1878. border: 1px solid var(--color-primary);
  1879. visibility: hidden;
  1880. transition: v.$transition-smooth;
  1881. @include mix.respond-to-max('sm') {
  1882. width: 100%;
  1883. }
  1884. // Quote icon with flip transformation
  1885. .quote-icon {
  1886. width: 70px;
  1887. height: 70px;
  1888. color: var(--color-primary);
  1889. transform: scaleX(-1) scaleY(-1); // Flip both horizontally and vertically
  1890. opacity: 0.8;
  1891. @media (max-width: 575px) {
  1892. width: 50px;
  1893. height: 50px;
  1894. }
  1895. }
  1896. // Testimonial message text
  1897. .message {
  1898. .text {
  1899. font-size: map.get(v.$font-sizes, 'base');
  1900. font-weight: map.get(v.$font-weights, 'regular');
  1901. display: -webkit-box;
  1902. -webkit-line-clamp: 4;
  1903. line-clamp: 4;
  1904. -webkit-box-orient: vertical;
  1905. overflow: hidden;
  1906. text-overflow: ellipsis;
  1907. line-height: 1.5;
  1908. margin: 0;
  1909. @media (max-width: 575px) {
  1910. font-size: map.get(v.$font-sizes, 'sm');
  1911. -webkit-line-clamp: 5;
  1912. line-clamp: 5;
  1913. }
  1914. }
  1915. }
  1916. // User information section
  1917. .info-user {
  1918. display: flex;
  1919. flex-direction: row;
  1920. justify-content: baseline;
  1921. align-items: center;
  1922. gap: 15px;
  1923. height: auto;
  1924. min-height: 60px;
  1925. // User avatar image
  1926. .image {
  1927. width: 50px;
  1928. height: 50px;
  1929. border-radius: 50%;
  1930. overflow: hidden;
  1931. flex-shrink: 0;
  1932. @media (max-width: 575px) {
  1933. width: 40px;
  1934. height: 40px;
  1935. }
  1936. img {
  1937. width: 100%;
  1938. height: 100%;
  1939. object-fit: cover;
  1940. }
  1941. }
  1942. // User details
  1943. .info {
  1944. display: flex;
  1945. flex-direction: column;
  1946. flex: 1;
  1947. .name {
  1948. font-weight: map.get(v.$font-weights, 'semibold');
  1949. color: var(--color-text-primary);
  1950. margin-bottom: 2px;
  1951. @media (max-width: 575px) {
  1952. font-size: map.get(v.$font-sizes, 'sm');
  1953. }
  1954. }
  1955. .role {
  1956. font-size: map.get(v.$font-sizes, 'sm');
  1957. font-weight: map.get(v.$font-weights, 'bold');
  1958. color: var(--color-primary);;
  1959. margin-bottom: 5px;
  1960. @media (max-width: 575px) {
  1961. font-size: map.get(v.$font-sizes, 'xs');
  1962. }
  1963. }
  1964. // Star rating display
  1965. .rating {
  1966. display: flex;
  1967. gap: 1px;
  1968. .star {
  1969. width: 20px;
  1970. height: 20px;
  1971. color: #ffd700;
  1972. @media (max-width: 575px) {
  1973. width: 16px;
  1974. height: 16px;
  1975. }
  1976. }
  1977. }
  1978. }
  1979. }
  1980. }
  1981. }
  1982. }
  1983. // Contact call-to-action section
  1984. .contact-info {
  1985. @include mix.flex(column, center, center);
  1986. background-color: transparent;
  1987. position: relative;
  1988. height: 500px;
  1989. .contact-content {
  1990. max-width: 800px;
  1991. margin: 0 auto;
  1992. text-align: center;
  1993. }
  1994. .contact-header {
  1995. margin-bottom: map.get(v.$spacers, 5);
  1996. @include mix.respond-to-max('md') {
  1997. margin-bottom: map.get(v.$spacers, 4);
  1998. }
  1999. @include mix.respond-to-max('sm') {
  2000. margin-bottom: map.get(v.$spacers, 3);
  2001. }
  2002. .contact-title {
  2003. font-size: map.get(v.$font-sizes, '3xl');
  2004. font-weight: map.get(v.$font-weights, 'bold');
  2005. color: v.$white;
  2006. margin-bottom: map.get(v.$spacers, 3);
  2007. line-height: 1.2;
  2008. @include mix.respond-to-max('sm') {
  2009. font-size: map.get(v.$font-sizes, '2xl');
  2010. }
  2011. }
  2012. .contact-description {
  2013. font-size: map.get(v.$font-sizes, 'base');
  2014. font-weight: map.get(v.$font-weights, 'regular');
  2015. color: rgba(v.$white, 0.9);
  2016. line-height: 1.6;
  2017. max-width: 600px;
  2018. margin: 0 auto;
  2019. @include mix.respond-to-max('md') {
  2020. font-size: map.get(v.$font-sizes, 'base');
  2021. }
  2022. @include mix.respond-to-max('sm') {
  2023. font-size: map.get(v.$font-sizes, 'sm');
  2024. }
  2025. }
  2026. }
  2027. .contact-actions {
  2028. .contact-cta {
  2029. margin-bottom: map.get(v.$spacers, 2);
  2030. padding: map.get(v.$spacers, 3) map.get(v.$spacers, 5);
  2031. font-size: map.get(v.$font-sizes, 'lg');
  2032. font-weight: map.get(v.$font-weights, 'semibold');
  2033. text-decoration: none;
  2034. @include mix.transition(v.$transition-smooth);
  2035. @include mix.respond-to-max('md') {
  2036. padding: map.get(v.$spacers, 3) map.get(v.$spacers, 4);
  2037. font-size: map.get(v.$font-sizes, 'base');
  2038. }
  2039. @include mix.respond-to-max('sm') {
  2040. padding: map.get(v.$spacers, 2) map.get(v.$spacers, 3);
  2041. font-size: map.get(v.$font-sizes, 'sm');
  2042. width: 100%;
  2043. max-width: 280px;
  2044. }
  2045. // Call-to-action button hover effects
  2046. &:hover {
  2047. @include mix.transform(translateY(-2px));
  2048. @include mix.box-shadow(0 10px 25px rgba(v.$primary, 0.3));
  2049. }
  2050. }
  2051. }
  2052. }