| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439 |
- // Import Sass modules for variables, mixins, and built-in functions
- @use '../abstracts/variables' as v;
- @use '../abstracts/mixins' as mix;
- @use 'sass:map';
- @use 'sass:color';
- // Base body styling with background image and overflow settings
- html,
- body {
- overflow: hidden;
- overflow-y: auto;
- padding-top: 40px;
- background-color: none;
- background-image: none;
- }
- .body-1 {
- background-color:var(--color-background);
- @include mix.background(
- url('../images/backgrounds/hand-ia-bgremove.png'),
- var(--color-background),
- contain,
- no-repeat,
- left center,
- fixed
- );
- }
- .body-2 {
- @include mix.background(
- url('../images/backgrounds/geometry-tech.png'),
- var(--color-background),
- cover,
- no-repeat,
- center center,
- fixed
- );
- }
- .body-3 {
- @include mix.background(
- url('../images/backgrounds/line-tech.png'),
- var(--color-background),
- cover,
- no-repeat,
- center center,
- fixed
- );
- }
- // Data Lines animation background layer
- #dataLinesCanvas {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100%;
- pointer-events: none;
- }
- // Particles animation background layer
- .particles-background,
- .meteorShowerCanvas {
- position: absolute;
- top: 0;
- left: 0;
- width: 100%;
- height: 100vh;
- z-index: 0; // Behind all content
- }
- // Hero section - main landing area
- .hero {
- position: relative;
- height: 92vh; // Almost full viewport height
- z-index: 1; // Above particles background
- padding: 0;
-
- @include mix.respond-to-max('md') {
- @include mix.flex(column, center, center);
- height: 800px;
- padding-bottom: 10px;
- }
- .hero-content,
- .hero-content-home-1,
- .hero-content-home-4 {
- @include mix.flex(row, space-between, center, wrap);
-
- @include mix.respond-to-max('md') {
- @include mix.flex(column, center, center);
- gap: map.get(v.$spacers, 4);
- }
- .hero-info {
- .hero-info-content {
- .heading-hero {
- font-size: map.get(v.$font-sizes, '2xl');
- font-weight: map.get(v.$font-weights, 'bold');
- margin-bottom: map.get(v.$spacers, 3);
- // Progressively larger on bigger screens
- @include mix.respond-to-min('md') {
- font-size: map.get(v.$font-sizes, '3xl');
- }
-
- @include mix.respond-to-min('lg') {
- font-size: map.get(v.$font-sizes, '4xl');
- }
- }
- }
- .cta {
- .social-links {
- max-width: 150px;
- .social-link {
- svg {
- color: v.$primary;
- }
- }
- }
- }
- @include mix.respond-to-max('md') {
- text-align: center;
- .hero-info-content {
- @include mix.flex(column, center, center);
- }
- .cta {
- @include mix.flex(column, center, center);
- .social-links {
- width: 100%;
- }
- .cta-buttons {
- @include mix.flex(column, center, center);
- }
- }
- }
- }
- .hero-image {
- position: relative;
- max-width: 500px;
- height: auto;
- display: block;
- @include mix.respond-to-max('md') {
- max-width: 300px;
- margin-top: map.get(v.$spacers, 4);
- }
- }
- }
- .hero-content-home-1 {
- @include mix.flex(column, center, flex-end);
- max-width: 1150px;
- }
- .hero-content-home-4 {
- @include mix.flex(column, center, center, wrap);
- .hero-info {
- text-align: center;
- .cta {
- @include mix.flex(column, center, center, wrap);
- }
- }
- }
- }
- // Main content area with white background
- .main {
- background-color: var(--color-surface);
- .main-content {
- // Single column grid with large gap
- @include mix.grid(1, map.get(v.$spacers, 9));
- // Services section with card grid layout
- .service-cards-modern {
- .services-grid {
- display: grid;
- grid-template-columns: repeat(3, 1fr); // 3 columns on desktop
- gap: map.get(v.$spacers, 3);
- align-self: center;
-
- // Responsive breakpoints: 3 -> 2 -> 1 columns
- @include mix.respond-to-max('md') {
- grid-template-columns: repeat(2, 1fr);
- gap: map.get(v.$spacers, 4);
- }
-
- @include mix.respond-to-max('sm') {
- grid-template-columns: 1fr;
- gap: map.get(v.$spacers, 3);
- }
- // Individual service cards
- .service-card {
- width: 100%;
- height: 292px;
- background-color: var(--color-surface);
- padding: map.get(v.$spacers, 4);
- gap: map.get(v.$spacers, 3);
- @include mix.flex(column, center, center); // Centered content
- @include mix.box-shadow(var(--box-shadow));
- @include mix.transition(v.$transition-smooth);
- // Hover effect with scale and lift animation
- &:hover {
- @include mix.transform(scale(1.02) translateY(-5px));
- @include mix.box-shadow(var(--box-shadow-hover));
- @include mix.transition(v.$transition-smooth);
- }
- // AOS (Animate On Scroll) integration
- &[data-aos] {
- will-change: transform, opacity; // Performance optimization
-
- &:hover {
- @include mix.transform(scale(1.02) translateY(-5px));
- }
-
- &.aos-animate:hover {
- @include mix.transform(scale(1.02) translateY(-5px));
- }
- }
- // Service icon styling
- .service-icon {
- color: v.$primary-dark;
-
- svg {
- width: 100px;
- height: 100px; // Large, prominent icons
- }
- }
- .service-description {
- text-align: center;
- }
- }
- }
- }
- .service-cards-classic {
- .services-grid {
- display: grid;
- grid-template-columns: repeat(3, 1fr); // 3 columns on desktop
- gap: map.get(v.$spacers, 4);
- align-self: center;
-
- // Responsive breakpoints: 3 -> 2 -> 1 columns
- @include mix.respond-to-max('md') {
- grid-template-columns: repeat(2, 1fr);
- gap: map.get(v.$spacers, 4);
- }
-
- @include mix.respond-to-max('sm') {
- grid-template-columns: 1fr;
- gap: map.get(v.$spacers, 3);
- }
- // Individual service cards
- .service-card {
- width: 100%;
- height: 292px;
- background-color: var(--color-surface);
- padding: map.get(v.$spacers, 4);
- gap: map.get(v.$spacers, 4);
- border: 1px solid var(--color-primary);
- border-radius: 5px;
- @include mix.flex(column, center, center); // Centered content
- // Service icon styling
- .service-icon {
- color: v.$primary-dark;
-
- svg {
- width: 100px;
- height: 100px; // Large, prominent icons
- }
- }
- .service-description {
- text-align: center;
- }
- }
- }
- }
- // About Us section animation
- .about-us-modern {
- overflow: hidden;
- .container {
- @include mix.flex(row, space-between, center);
- max-width: 1200px;
- margin: 0 auto;
- padding: 0 map.get(v.$spacers, 3);
- @include mix.respond-to-max('md') {
- flex-direction: column;
- text-align: center;
- }
- }
- .about-content {
- max-width: 600px;
- .section-title {
- font-family: v.$font-family-heading;
- font-size: map.get(v.$font-sizes, '4xl');
- color: var(--color-text-primary);
- margin-bottom: map.get(v.$spacers, 3);
- .highlighted-year {
- color: var(--color-primary);
- position: relative;
- &::after {
- content: '';
- position: absolute;
- bottom: -5px;
- left: 0;
- width: 100%;
- height: 3px;
- background: var(--color-primary);
- }
- }
- }
- .section-description {
- color: var(--color-text-secondary);
- font-size: map.get(v.$font-sizes, 'lg');
- margin-bottom: map.get(v.$spacers, 4);
- line-height: 1.7;
- }
- .features-grid {
- display: grid;
- grid-template-columns: repeat(2, 1fr);
- gap: map.get(v.$spacers, 3);
- @include mix.respond-to-max('sm') {
- grid-template-columns: 1fr;
- }
- .feature-item {
- background: var(--color-surface-scase);
- padding: map.get(v.$spacers, 3);
- border-radius: 10px;
- box-shadow: var(--box-shadow);
- border: 1px solid transparent;
- @include mix.transition(v.$transition-base);
- &:hover {
- box-shadow: var(--box-shadow-hover);
- background: var(--color-surface-scase);
- border: 1px solid var(--color-primary-light);
- @include mix.transition(v.$transition-base);
- }
- .feature-icon {
- font-size: 2rem;
- color: var(--color-primary);
- margin-bottom: map.get(v.$spacers, 2);
- }
- h4 {
- color: var(--color-text-primary);
- margin-bottom: map.get(v.$spacers, 2);
- font-size: map.get(v.$font-sizes, 'xl');
- }
- p {
- color: var(--color-text-muted);
- font-size: map.get(v.$font-sizes, 'sm');
- }
- }
- }
- }
- .about-image {
- max-width: 500px;
- @include mix.border-radius(v.$border-radius);
- overflow: hidden;
- img {
- width: 100%;
- display: block;
- }
- @include mix.respond-to-max('md') {
- margin-top: map.get(v.$spacers, 4);
- }
- }
- }
- /* Styles for the 'About Our Company' section */
- .about-our-company {
- @include mix.grid(2);
- @include mix.respond-to-max('md') {
- @include mix.grid(1);
- padding-bottom: map.get(v.$spacers, 2);
- }
- .about-info {
- max-width: 515px;
- @include mix.respond-to-max('md') {
- max-width: 100%;
- }
- .about-texts {
- @include mix.grid(1, map.get(v.$spacers, 1));
- .about-info-title {
- color: var(--color-text-primary);
- }
- }
- .about-progress {
- @include mix.grid(1, map.get(v.$spacers, 4));
- }
- }
- .about-image {
- @include mix.flex(column, center, center);
- max-width: 100%;
- height: 90%;
- overflow: hidden;
- img {
- width: 100%;
- height: 100%;
- object-fit: cover;
- border-radius: 10px;
- }
- }
- }
- // Step info section with circular layout on desktop
- .step-info {
- .box-step-info {
- position: relative;
- @include mix.flex(column, center, center);
- width: 100%;
- height: 800px;
- @include mix.respond-to-max('md') {
- height: auto;
- }
- .step {
- @include mix.flex(column, center, center);
- position: absolute;
- height: auto;
- @include mix.respond-to-max('md') {
- position: relative;
- }
- &.up,
- &.down {
- left: 0px;
- width: 100%;
- }
- &.up {
- top: 0px;
- }
- &.right {
- right: 0px;
- }
- &.down {
- bottom: 0px;
- }
- &.left {
- left: 0px;
- }
- // Process cards
- .process-info {
- @include mix.respond-to-max('md') {
- position: relative;
- width: 100%;
- max-width: 400px;
- margin: 0 auto map.get(v.$spacers, 3) auto;
- padding: map.get(v.$spacers, 3);
- background-color: rgba(v.$white, 0.05);
- @include mix.border-radius(v.$border-radius-lg);
- backdrop-filter: blur(10px);
- border: 1px solid rgba(v.$primary, 0.1);
- @include mix.transition(v.$transition-base);
- &:hover {
- background-color: rgba(v.$white, 0.1);
- border-color: rgba(v.$primary, 0.3);
- @include mix.transform(translateY(-5px));
- }
- @include mix.flex(column, flex-start, center);
- gap: map.get(v.$spacers, 2);
- }
- .process-icon {
- position: relative;
- color: var(--color-text-primary);
- @include mix.transition(all 0.5s);
- svg {
- width: 128px;
- height: 128px;
- }
- @include mix.respond-to-max('md') {
- flex-shrink: 0;
- svg {
- width: 90px;
- height: 90px;
- }
- }
- }
- .process-text {
- position: relative;
- @include mix.respond-to-min('md') {
- top: 10px;
- left: 10px;
- max-width: 220px;
- }
- @include mix.respond-to-max('md') {
- flex: 1;
- top: 0;
- left: 0;
- max-width: none;
- }
- .text {
- color: var(--color-text-primary);
- font-weight: map.get(v.$font-weights, 'bold');
- display: block;
- margin-bottom: map.get(v.$spacers, 2);
- @include mix.respond-to-min('md') {
- font-size: map.get(v.$font-sizes, '2xl');
- max-width: 220px;
- }
- @include mix.respond-to-max('md') {
- font-size: map.get(v.$font-sizes, 'base');
- }
- }
- p {
- line-height: 1.6;
- margin: 0;
- font-size: 0.97rem;
- }
- }
- // Icon hover (desktop)
- @include mix.respond-to-min('md') {
- &:hover {
- .process-icon {
- transform: translateY(-20px);
- }
- }
- }
- }
- }
- // Central image
- .central-image {
- width: 300px;
- height: 300px;
- margin-top: 10px;
- overflow: hidden;
- @include mix.transition(all 0.5s);
- @include mix.transform(scale(1));
- transform-origin: center center;
- border-radius: 50%;
- @include mix.respond-to-min('md') {
- position: absolute;
- top: 50%;
- left: 50%;
- @include mix.transform(translate(-50%, -50%));
- z-index: 1;
- }
- @include mix.respond-to-max('md') {
- position: relative !important;
- top: auto !important;
- left: auto !important;
- right: auto !important;
- @include mix.transform(none);
- width: 200px;
- height: 200px;
- margin: map.get(v.$spacers, 3) auto !important;
- display: block;
- }
- .image {
- width: 100%;
- height: 100%;
- object-fit: cover;
- }
- &:hover {
- @include mix.transition(all 0.5s);
- @include mix.respond-to-min('md') {
- @include mix.transform(translate(-50%, -50%) scale(1.02) translateY(-5px));
- }
- @include mix.respond-to-max('md') {
- @include mix.transform(scale(1.05));
- }
- }
- }
- }
- }
-
- // Portfolio section with filtering and grid layout
- .portfolio {
- .portfolio-filters-container {
- margin-bottom: map.get(v.$spacers, 5);
- }
- // Filter buttons for portfolio categories
- .portfolio-filters {
- list-style: none;
- margin: 0;
- padding: 0;
- @include mix.flex(row, center, center, wrap);
- gap: map.get(v.$spacers, 2);
- @include mix.respond-to-max('sm') {
- gap: map.get(v.$spacers, 1);
- }
- .filter-btn {
- padding: map.get(v.$spacers, 2) map.get(v.$spacers, 3);
- background-color: transparent;
- color: var(--color-text-secondary);
- border: 2px solid v.$light-gray;
- @include mix.border-radius(v.$border-radius);
- cursor: pointer;
- font-weight: map.get(v.$font-weights, 'medium');
- font-size: map.get(v.$font-sizes, 'sm');
- @include mix.transition(v.$transition-smooth);
- white-space: nowrap; // Prevent text wrapping
- @include mix.respond-to-max('sm') {
- padding: map.get(v.$spacers, 1) map.get(v.$spacers, 2);
- font-size: map.get(v.$font-sizes, 'xs');
- }
- // Hover state
- &:hover {
- color: v.$primary;
- border-color: v.$primary;
- @include mix.transform(translateY(-2px));
- }
- // Active/selected state
- &.active {
- background-color: v.$primary;
- color: v.$white;
- border-color: v.$primary;
- @include mix.box-shadow(v.$box-shadow);
- }
- }
- }
- // Portfolio grid with responsive columns
- .portfolio-grid {
- display: grid;
- grid-template-columns: repeat(4, 1fr); // 4 columns on largest screens
- gap: map.get(v.$spacers, 3);
-
- // Progressive column reduction: 4 -> 3 -> 2 -> 1
- @include mix.respond-to-max('xl') {
- grid-template-columns: repeat(3, 1fr);
- }
-
- @include mix.respond-to-max('md') {
- grid-template-columns: repeat(2, 1fr);
- gap: map.get(v.$spacers, 3);
- }
-
- @include mix.respond-to-max('sm') {
- grid-template-columns: 1fr;
- gap: map.get(v.$spacers, 3);
- }
- .portfolio-item {
- width: 100%;
- @include mix.box-shadow(var(--box-shadow));
- // Custom easing curve for smooth animations
- @include mix.transition(all 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94));
-
- // Isotope.js integration classes
- &.isotope-item {
- z-index: 2;
- }
-
- &.isotope-hidden.isotope-item {
- pointer-events: none; // Disable interactions when hidden
- z-index: 1;
- }
- // AOS integration with hover effects
- &[data-aos] {
- will-change: transform, opacity;
-
- &:hover .portfolio-card {
- @include mix.transform(translateY(-8px));
- }
-
- &.aos-animate:hover .portfolio-card {
- @include mix.transform(translateY(-8px));
- }
- }
- // Portfolio card container
- .portfolio-card {
- background-color: var(--color-surface);
- @include mix.border-radius(v.$border-radius-lg);
- @include mix.box-shadow(v.$box-shadow);
- @include mix.transition(v.$transition-smooth);
- overflow: hidden;
- height: 100%; // Full height for equal card heights
- @include mix.flex(column, stretch, stretch);
- &:hover {
- @include mix.transform(translateY(-8px));
- @include mix.box-shadow(v.$box-shadow-lg);
- // Image zoom effect on hover
- .portfolio-image .image {
- @include mix.transform(scale(1.1));
- }
- }
- // Portfolio image container
- .portfolio-image {
- position: relative;
- height: 200px; // Fixed height for consistency
- overflow: hidden;
- @include mix.border-radius(v.$border-radius-lg v.$border-radius-lg 0 0);
- .image {
- width: 100%;
- height: 100%;
- object-fit: cover;
- @include mix.transition(transform 0.5s ease);
- }
- }
- // Portfolio card content
- .portfolio-info {
- padding: map.get(v.$spacers, 4);
- flex-grow: 1;
- @include mix.flex(column, flex-start, stretch);
- h4 {
- font-size: map.get(v.$font-sizes, 'lg');
- font-weight: map.get(v.$font-weights, 'semibold');
- margin-bottom: map.get(v.$spacers, 2);
- line-height: 1.3;
- }
- .portfolio-category {
- font-size: map.get(v.$font-sizes, 'sm');
- color: v.$primary;
- font-weight: map.get(v.$font-weights, 'medium');
- text-transform: uppercase;
- letter-spacing: 0.5px;
- }
- }
- }
- }
- }
- // Empty state when no portfolio items match filter
- .portfolio-empty {
- text-align: center;
- padding: map.get(v.$spacers, 8) map.get(v.$spacers, 4);
- color: v.$gray;
-
- h3 {
- font-size: map.get(v.$font-sizes, 'xl');
- margin-bottom: map.get(v.$spacers, 2);
- }
-
- p {
- font-size: map.get(v.$font-sizes, 'base');
- }
- }
- // Loading state indicator
- .portfolio-loading {
- text-align: center;
- padding: map.get(v.$spacers, 6);
-
- // CSS-only spinner using pseudo-element
- &::after {
- content: '';
- display: inline-block;
- width: 40px;
- height: 40px;
- border: 4px solid v.$light-gray;
- border-top: 4px solid v.$primary;
- border-radius: 50%;
- animation: spin 1s linear infinite;
- }
- }
- // Keyframe animation for loading spinner
- @keyframes spin {
- 0% { transform: rotate(0deg); }
- 100% { transform: rotate(360deg); }
- }
- }
- // Pricing section for service plans
- .pricing-plants {
- .options-plants {
- display: grid;
- grid-template-columns: repeat(3, 1fr);
- gap: map.get(v.$spacers, 4);
-
- @include mix.respond-to-max('xl') {
- grid-template-columns: repeat(3, 1fr);
- }
-
- @include mix.respond-to-max('md') {
- grid-template-columns: repeat(2, 1fr);
- gap: map.get(v.$spacers, 3);
- }
-
- @include mix.respond-to-max('sm') {
- grid-template-columns: 1fr;
- gap: map.get(v.$spacers, 3);
- }
- // Base styles for both regular and popular pricing cards
- .plants,
- .most-popular {
- position: relative;
- display: grid;
- gap: map.get(v.$spacers, 2);
- background-color: var(--color-surface);
- padding: map.get(v.$spacers, 4);
- box-shadow: v.$box-shadow-lg;
- border-radius: 20px;
- border: 1px solid var(--color-primary);
- @include mix.transition(all 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94));
- // "Most Popular" badge (hidden by default)
- .tag-most-popular {
- position: absolute;
- top: 0px;
- right: map.get(v.$spacers, 4);
- color: v.$black;
- background-color: v.$white;
- padding: 10px;
- border-radius: 0px 0px 10px 10px;
- visibility: hidden; // Only visible on .most-popular
- }
- .plant-header {
- h2 {
- font-size: map.get(v.$spacers, 4);
- font-weight: 500;
- }
- }
- .price {
- .price-main {
- color: var(--color-text-primary);
- font-size: 2.2rem;
- font-weight: 600;
- .price-discount {
- color: v.$gray;
- text-decoration: line-through;
- }
- }
- }
- // Benefits list section
- .benefits {
- padding-top: 10px;
- .line {
- border: 1px solid rgba(250, 247, 247, 0.1);
- }
- .benefits-list {
- padding-top: 10px;
- .benefit-item {
- display: flex;
- align-items: center;
- justify-content: baseline;
- margin-bottom: 5px;
- .benefit-icon {
- width: 20px;
- height: 20px;
- margin-right: 10px;
- }
- .circle-x-svg {
- display: inline-flex;
- align-items: center;
- justify-content: center;
- margin-right: 10px;
- }
- .circle-x-svg svg {
- color: inherit;
- }
- .text {
- color: var(--color-text-muted);
- }
- }
- }
- }
- // Hover effect with scale animation
- &:hover {
- @include mix.transition(all 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94));
- transform: scale(1.1);
- }
- }
- // Special styling for the highlighted "most popular" plan
- .most-popular {
- background-color: v.$primary-dark;
- .tag-most-popular {
- visibility: visible; // Show the badge
- }
- .plant-header {
- color: v.$gray;
- h2 {
- color: v.$white;
- }
- }
- .price {
- .price-main {
- color: v.$white;
- }
- }
- // Different colors for benefits in popular plan
- .benefits-list {
- .benefit-item {
- .benefit-icon {
- color: v.$gray;
- }
- .text {
- color: v.$white !important;
- }
- .circle-x-svg svg {
- color: v.$gray !important;
- }
- }
- }
- }
- }
- }
- // Team section with member cards
- .team {
- .team-content {
- display: grid;
- grid-template-columns: repeat(4, 1fr);
- gap: map.get(v.$spacers, 4);
-
- @include mix.respond-to-max('xl') {
- grid-template-columns: repeat(3, 1fr);
- }
-
- @include mix.respond-to-max('md') {
- grid-template-columns: repeat(2, 1fr);
- gap: map.get(v.$spacers, 3);
- }
-
- @include mix.respond-to-max('sm') {
- grid-template-columns: 1fr;
- gap: map.get(v.$spacers, 3);
- }
- .item-team {
- position: relative;
- background-color: var(--color-surface);
- @include mix.border-radius(v.$border-radius-lg);
- @include mix.transition(all 0.6s);
- @include mix.box-shadow(var(--box-shadow));
- overflow: hidden;
- height: 350px;
-
- &:hover {
- @include mix.transform(scale(1.05));
- }
- .image {
- width: 100%;
- height: 100%;
- object-fit: cover;
- object-position: center top;
- }
- // Floating social info overlay
- .social-info {
- position: absolute;
- bottom: 20px;
- left: 50%;
- transform: translateX(-50%);
- background-color: var(--color-surface);
- width: 100%;
- max-width: 200px;
- padding: map.get(v.$spacers, 2);
- @include mix.border-radius(v.$border-radius-lg);
- @include mix.respond-to-max('sm') {
- bottom: 0px;
- left: -30px;
- transform: translateX(0);
- border-radius: 0px 10px 0px 0px;
- }
- .info {
- display: flex;
- align-items: center;
- flex-direction: column;
- margin-bottom: map.get(v.$spacers, 2);
- .name {
- font-size: map.get(v.$font-sizes, 'lg');
- font-weight: map.get(v.$font-weights, 'semibold');
- color: var(--color-text-primary);
- margin-bottom: map.get(v.$spacers, 1);
- text-align: center;
- }
- .rol {
- font-size: map.get(v.$font-sizes, 'sm');
- font-weight: map.get(v.$font-weights, 'regular');
- color: v.$primary;
- text-align: center;
- }
- }
- // Social media links
- .social-links {
- display: flex;
- justify-content: center;
- gap: 10px;
- svg {
- width: 20px;
- height: 20px;
- color: var(--color-text-muted);
- @include mix.transition(v.$transition-base);
- &:hover {
- color: v.$primary;
- @include mix.transform(scale(1.1));
- }
- }
- }
- }
- }
- }
- }
-
- // Team Member section
- .member-profile-page {
- display: grid;
- grid-template-columns: 300px 1fr;
- gap: map.get(v.$spacers, 6);
- color: var(--color-text-primary);
- @include mix.respond-to-max('md') {
- grid-template-columns: 1fr;
- }
- .section-header {
- grid-column: 1 / -1;
- }
- }
- // Left column: image, name, role, and social
- .member-aside {
- text-align: center;
- background-color: var(--color-surface);
- padding: map.get(v.$spacers, 4);
- border-radius: v.$border-radius;
- box-shadow: v.$box-shadow;
- .image-wrapper {
- img {
- width: 100%;
- border-radius: v.$border-radius;
- margin-bottom: map.get(v.$spacers, 3);
- }
- }
- .member-name {
- font-size: map.get(v.$font-sizes, 'lg');
- font-weight: map.get(v.$font-weights, 'bold');
- margin-bottom: 0.25rem;
- }
- .member-role {
- font-size: map.get(v.$font-sizes, 'sm');
- color: var(--color-text-muted);
- margin-bottom: map.get(v.$spacers, 3);
- }
- .social-links {
- display: flex;
- justify-content: center;
- gap: map.get(v.$spacers, 2);
- }
- }
- // Right column: bio, skills, specialties
- .member-main-content {
- display: flex;
- flex-direction: column;
- gap: map.get(v.$spacers, 5);
- }
- // Biography section
- .biography {
- h3 {
- font-size: map.get(v.$font-sizes, 'lg');
- font-weight: map.get(v.$font-weights, 'bold');
- margin-bottom: map.get(v.$spacers, 2);
- }
- p {
- margin-bottom: map.get(v.$spacers, 2);
- line-height: 1.7;
- }
- }
- // Skills section using custom-progress
- .skills {
- h3 {
- font-size: map.get(v.$font-sizes, 'lg');
- font-weight: map.get(v.$font-weights, 'bold');
- margin-bottom: map.get(v.$spacers, 3);
- }
- .about-progress {
- display: flex;
- flex-direction: column;
- gap: map.get(v.$spacers, 3);
- }
- }
- // Specialty section
- .specialties {
- h3 {
- font-size: map.get(v.$font-sizes, 'lg');
- font-weight: map.get(v.$font-weights, 'bold');
- margin-bottom: map.get(v.$spacers, 3);
- }
- .specialty-list {
- display: grid;
- grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
- gap: map.get(v.$spacers, 2);
- list-style: none;
- padding: 0;
- li {
- background-color: var(--color-surface-scase);
- padding: 0.75rem 1rem;
- border-radius: v.$border-radius-sm;
- color: var(--color-text-primary);
- font-size: map.get(v.$font-sizes, 'sm');
- }
- }
- }
- // Blog section with article cards
- .blog {
- display: grid;
- grid-template-columns: 1fr 300px;
- gap: map.get(v.$spacers, 4);
- @include mix.respond-to-max('md') {
- grid-template-columns: repeat(1, 1fr);
- gap: map.get(v.$spacers, 3);
- }
- &.no-blog-sidebar {
- grid-template-columns: repeat(1, 1fr);
- }
- .blog-grid {
- display: grid;
- @include mix.grid(1, map.get(v.$spacers, 4));
- &.blog-grid-col2 {
- @include mix.grid(2, map.get(v.$spacers, 4));
- }
- &.blog-grid-col3 {
- @include mix.grid(3, map.get(v.$spacers, 4));
- }
- &.blog-grid-col2,
- &.blog-grid-col3 {
- @include mix.respond-to-max('md') {
- grid-template-columns: repeat(1, 1fr);
- gap: map.get(v.$spacers, 3);
- }
- }
- .blog-card {
- position: relative;
- @include mix.flex(column, stretch, stretch);
- height: 430px; // Fixed height for consistency
- background-color: var(--color-surface);
- @include mix.border-radius(v.$border-radius-lg);
- @include mix.box-shadow(var(--box-shadow));
- @include mix.transition(v.$transition-smooth);
- overflow: hidden;
-
- // AOS integration
- &[data-aos] {
- will-change: transform, opacity;
-
- &:hover {
- @include mix.transform(translateY(-8px));
- }
-
- &.aos-animate:hover {
- @include mix.transform(translateY(-8px));
- }
- }
- &:hover {
- @include mix.transform(translateY(-8px));
- @include mix.box-shadow(v.$box-shadow-lg);
- // Image zoom effect
- .blog-image .image {
- @include mix.transform(scale(1.05));
- }
- // Read more link animation
- .read-more {
- color: v.$primary-light;
- svg {
- @include mix.transform(translateX(5px));
- }
- }
- }
- // Blog post featured image
- .blog-image {
- position: relative;
- overflow: hidden;
- .image {
- width: 100%;
- height: 100%;
- object-fit: cover;
- object-position: center -50px;
- @include mix.transition(v.$transition-smooth);
- }
- // Category tag overlay
- .blog-category {
- position: absolute;
- top: map.get(v.$spacers, 3);
- left: map.get(v.$spacers, 3);
- z-index: 10;
- .category-tag {
- background: rgba(0, 0, 0, 0.6);
- color: v.$white;
- padding: map.get(v.$spacers, 1) map.get(v.$spacers, 2);
- @include mix.border-radius(v.$border-radius-sm);
- font-size: map.get(v.$font-sizes, 'xs');
- font-weight: map.get(v.$font-weights, 'medium');
- text-transform: uppercase;
- letter-spacing: 0.5px;
- backdrop-filter: blur(4px);
- @include mix.transition(v.$transition-base);
- }
- }
- }
- // Blog post content area
- .blog-content {
- padding: map.get(v.$spacers, 4);
- @include mix.flex(column, flex-start, stretch);
- gap: map.get(v.$spacers, 2);
- height: 100%;
- flex-grow: 1;
- }
- // Blog metadata (date, author)
- .blog-meta {
- @include mix.flex(row, space-between, center);
- flex-wrap: wrap;
- gap: map.get(v.$spacers, 2);
- margin-bottom: map.get(v.$spacers, 2);
- .blog-date,
- .blog-author {
- @include mix.flex(row, flex-start, center);
- gap: map.get(v.$spacers, 1);
- color: v.$gray;
- font-size: map.get(v.$font-sizes, 'sm');
- svg {
- width: 16px;
- height: 16px;
- fill: currentColor;
- }
- }
- @include mix.respond-to-max('sm') {
- @include mix.flex(column, flex-start, flex-start);
- gap: map.get(v.$spacers, 1);
- }
- }
- // Blog post title
- .blog-title {
- font-size: map.get(v.$font-sizes, 'lg');
- font-weight: map.get(v.$font-weights, 'semibold');
- line-height: 1.4;
- margin-bottom: map.get(v.$spacers, 2);
- @include mix.transition(v.$transition-base);
- &:hover {
- color: v.$primary;
- }
- }
- // Blog post excerpt
- .blog-excerpt {
- font-size: map.get(v.$font-sizes, 'sm');
- line-height: 1.6;
- margin-bottom: map.get(v.$spacers, 3);
- flex-grow: 1; // Take remaining space
- }
- // Blog post footer with actions and stats
- .blog-footer {
- @include mix.flex(row, space-between, center);
- margin-top: auto;
- padding-top: map.get(v.$spacers, 3);
- border-top: 1px solid v.$light-gray;
- .read-more {
- @include mix.flex(row, flex-start, center);
- gap: map.get(v.$spacers, 1);
- color: v.$primary;
- font-weight: map.get(v.$font-weights, 'medium');
- font-size: map.get(v.$font-sizes, 'sm');
- text-decoration: none;
- @include mix.transition(v.$transition-base);
- svg {
- width: 16px;
- height: 16px;
- fill: currentColor;
- @include mix.transition(v.$transition-base);
- }
- &:hover {
- color: v.$primary-light;
- }
- }
- .blog-stats {
- .reading-time {
- @include mix.flex(row, flex-start, center);
- gap: map.get(v.$spacers, 1);
- color: v.$gray;
- font-size: map.get(v.$font-sizes, 'xs');
- svg {
- width: 14px;
- height: 14px;
- fill: currentColor;
- }
- }
- }
- @include mix.respond-to-max('sm') {
- @include mix.flex(column, flex-start, flex-start);
- gap: map.get(v.$spacers, 2);
- }
- }
- }
- // Responsive adjustments for blog cards
- @include mix.respond-to-max('md') {
- .blog-card {
- .blog-image {
- height: 180px;
- }
- .blog-content {
- padding: map.get(v.$spacers, 3);
- }
- .blog-title {
- font-size: map.get(v.$font-sizes, 'base');
- }
- }
- }
- }
- .blog-sidebar {
- background-color: var(--color-surface);
- padding: map.get(v.$spacers, 4);
- border-radius: v.$border-radius;
- color: var(--color-text-primary);
- .search-box {
- display: flex;
- margin-bottom: map.get(v.$spacers, 4);
- input {
- flex: 1;
- padding: 0.5rem;
- border: 1px solid var(--color-border);
- border-radius: v.$border-radius 0 0 v.$border-radius;
- background-color: var(--color-surface-scase);
- color: var(--color-text-primary);
- }
- button {
- background-color: var(--color-primary);
- color: v.$white;
- border: none;
- padding: 0 1rem;
- border-radius: 0 v.$border-radius v.$border-radius 0;
- cursor: pointer;
- i {
- font-size: 1rem;
- }
- }
- }
- h4 {
- font-weight: map.get(v.$font-weights, 'bold');
- margin-bottom: map.get(v.$spacers, 3);
- color: var(--color-text-primary);
- }
- .title {
- padding: 20px 0px;
- }
- .categories ul,
- .recent-posts ul {
- list-style: none;
- padding: 0;
- li {
- display: flex;
- justify-content: space-between;
- padding: 0.5rem 0;
- border-bottom: 1px solid var(--color-border);
- color: var(--color-text-primary);
- &:last-child {
- border-bottom: none;
- }
- span {
- font-weight: map.get(v.$font-weights, 'bold');
- }
- }
- }
- .categories ul li {
- display: flex;
- justify-content: space-between;
- padding: 0.5rem 0;
- border-bottom: 1px solid var(--color-border);
- &:last-child {
- border-bottom: none;
- }
- a {
- display: flex;
- justify-content: space-between;
- width: 100%;
- color: var(--color-text-primary);
- text-decoration: none;
- padding: 0.3rem 0.5rem;
- border-radius: v.$border-radius-sm;
- transition: background-color 0.3s ease, color 0.3s ease;
- &:hover {
- background-color: var(--color-primary);
- }
- &.active {
- background-color: var(--color-primary);
- color: v.$white;
- span {
- color: v.$white;
- }
- }
- span {
- font-weight: map.get(v.$font-weights, 'bold');
- }
- }
- }
- .recent-posts ul li {
- display: flex;
- align-items: center;
- img {
- width: 50px;
- height: 50px;
- border-radius: v.$border-radius-sm;
- margin-right: map.get(v.$spacers, 2);
- object-fit: cover;
- }
- div a {
- font-weight: map.get(v.$font-weights, 'bold');
- color: var(--color-text-primary);
- text-decoration: none;
- &:hover {
- color: var(--color-primary);
- }
- }
- div span {
- display: block;
- font-size: map.get(v.$font-sizes, 'sm');
- color: var(--color-text-muted);
- }
- }
- .tags .tag-list {
- display: flex;
- flex-wrap: wrap;
- gap: map.get(v.$spacers, 2);
- a {
- background-color: var(--color-surface-scase);
- color: var(--color-text-primary);
- padding: 0.3rem 0.6rem;
- border-radius: v.$border-radius-sm;
- text-decoration: none;
- font-size: map.get(v.$font-sizes, 'sm');
- &:hover {
- background-color: var(--color-primary);
- color: v.$white;
- }
- }
- }
- .social-icons {
- display: flex;
- gap: map.get(v.$spacers, 4);
- .social-link {
- svg {
- color: var(--color-text-primary);
- &:hover {
- color: var(--color-primary);
- }
- }
- }
- }
- }
- }
- // Contact form section with two-column layout
- .contact-form {
- .contact-form-container {
- max-width: 1000px;
- margin: 0 auto;
- }
- .contact-form-content {
- display: grid;
- grid-template-columns: 1fr 1.3fr; // Unequal columns (form is wider)
- gap: map.get(v.$spacers, 4);
-
- @include mix.respond-to-max('lg') {
- grid-template-columns: 1fr; // Single column on mobile
- gap: map.get(v.$spacers, 4);
- }
- }
- // Contact information card with gradient background
- .contact-info-card {
- background: linear-gradient(135deg, v.$primary-dark 0%, v.$primary 100%);
- color: v.$white;
- padding: map.get(v.$spacers, 4);
- @include mix.border-radius(v.$border-radius-lg);
- height: fit-content;
- position: relative;
- overflow: hidden;
- // Decorative circle element
- &::before {
- content: '';
- position: absolute;
- top: 0;
- right: 0;
- width: 150px;
- height: 150px;
- background: rgba(v.$white, 0.1);
- border-radius: 50%;
- transform: translate(30%, -30%);
- }
- .contact-info-header {
- margin-bottom: map.get(v.$spacers, 4);
- position: relative;
- z-index: 1;
- h3 {
- font-size: map.get(v.$font-sizes, 'xl');
- font-weight: map.get(v.$font-weights, 'bold');
- margin-bottom: map.get(v.$spacers, 2);
- color: v.$white;
- }
- p {
- font-size: map.get(v.$font-sizes, 'sm');
- line-height: 1.6;
- opacity: 0.9;
- margin: 0;
- }
- }
- // Contact details list
- .contact-details {
- margin-bottom: map.get(v.$spacers, 4);
- position: relative;
- z-index: 1;
- .contact-detail-item {
- @include mix.flex(row, flex-start, flex-start);
- gap: map.get(v.$spacers, 2);
- margin-bottom: map.get(v.$spacers, 3);
- &:last-child {
- margin-bottom: 0;
- }
- .contact-icon {
- flex-shrink: 0;
- width: 20px;
- height: 20px;
- margin-top: 2px;
- svg {
- width: 100%;
- height: 100%;
- fill: currentColor;
- }
- }
- .contact-text {
- @include mix.flex(column, flex-start, flex-start);
- gap: map.get(v.$spacers, 1);
- .label {
- font-size: map.get(v.$font-sizes, 'xs');
- font-weight: map.get(v.$font-weights, 'medium');
- opacity: 0.8;
- text-transform: uppercase;
- letter-spacing: 0.5px;
- }
- .value {
- font-size: map.get(v.$font-sizes, 'sm');
- font-weight: map.get(v.$font-weights, 'regular');
- line-height: 1.5;
- }
- }
- }
- }
- // Social media links
- .contact-social {
- position: relative;
- z-index: 1;
- .social-label {
- font-size: map.get(v.$font-sizes, 'xs');
- font-weight: map.get(v.$font-weights, 'medium');
- opacity: 0.8;
- text-transform: uppercase;
- letter-spacing: 0.5px;
- display: block;
- margin-bottom: map.get(v.$spacers, 2);
- }
- .social-links {
- @include mix.flex(row, flex-start, center);
- gap: map.get(v.$spacers, 2);
- .social-link {
- width: 36px;
- height: 36px;
- background: rgba(v.$white, 0.2);
- @include mix.border-radius(50%);
- @include mix.flex(row, center, center);
- @include mix.transition(v.$transition-base);
- svg {
- width: 18px;
- height: 18px;
- fill: currentColor;
- }
- &:hover {
- background: rgba(v.$white, 0.3);
- @include mix.transform(translateY(-2px));
- }
- }
- }
- }
- }
- // Contact form card
- .contact-form-card {
- background-color: var(--color-surface);
- padding: map.get(v.$spacers, 4);
- @include mix.border-radius(v.$border-radius-lg);
- border: 1px solid var(--color-primary);
- .contact-form-fields {
- display: grid;
- grid-template-columns: 1fr 1fr; // Two-column form layout
- gap: map.get(v.$spacers, 3);
- @include mix.respond-to-max('md') {
- grid-template-columns: 1fr; // Single column on mobile
- gap: map.get(v.$spacers, 3);
- }
- .form-group {
- @include mix.flex(column, flex-start, stretch);
- gap: map.get(v.$spacers, 1);
- // Full-width form groups span both columns
- &.form-group-full {
- grid-column: 1 / -1;
- }
- .form-label {
- font-size: map.get(v.$font-sizes, 'sm');
- font-weight: map.get(v.$font-weights, 'medium');
- color: v.$dark-gray;
- margin: 0;
- }
- // Base styles for form inputs
- .form-input,
- .form-select,
- .form-textarea {
- width: 100%;
- padding: map.get(v.$spacers, 2);
- border: 2px solid v.$light-gray;
- @include mix.border-radius(v.$border-radius);
- font-size: map.get(v.$font-sizes, 'sm');
- font-family: v.$font-family-sans;
- @include mix.transition(v.$transition-base);
- background: v.$white;
- &:focus {
- outline: none;
- border-color: v.$primary;
- @include mix.box-shadow(0 0 0 3px rgba(v.$primary, 0.1));
- }
- &:invalid:not(:focus):not(:placeholder-shown) {
- border-color: #dc3545; // Red for validation errors
- }
- &::placeholder {
- color: v.$gray;
- opacity: 0.7;
- }
- }
- // Textarea specific styles
- .form-textarea {
- resize: vertical;
- min-height: 100px;
- line-height: 1.6;
- }
- // Select dropdown with custom arrow
- .form-select {
- cursor: pointer;
- 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");
- background-position: right 12px center;
- background-repeat: no-repeat;
- background-size: 16px;
- padding-right: 40px;
- appearance: none; // Remove default browser styling
- }
- // Custom checkbox styling
- .form-checkbox-container {
- @include mix.flex(row, flex-start, flex-start);
- gap: map.get(v.$spacers, 2);
- cursor: pointer;
- font-size: map.get(v.$font-sizes, 'xs');
- line-height: 1.5;
- .form-checkbox {
- position: absolute;
- opacity: 0;
- cursor: pointer;
- &:checked + .form-checkmark {
- background-color: v.$primary;
- border-color: v.$primary;
- &::after {
- display: block;
- }
- }
- }
- // Custom checkmark design
- .form-checkmark {
- position: relative;
- width: 18px;
- height: 18px;
- border: 2px solid v.$light-gray;
- @include mix.border-radius(v.$border-radius-sm);
- @include mix.transition(v.$transition-base);
- flex-shrink: 0;
- margin-top: 1px;
- // Checkmark icon using CSS
- &::after {
- content: '';
- position: absolute;
- display: none;
- left: 5px;
- top: 1px;
- width: 5px;
- height: 9px;
- border: solid v.$white;
- border-width: 0 2px 2px 0;
- transform: rotate(45deg);
- }
- }
- .form-checkbox-text {
- color: v.$dark-gray;
-
- .form-link {
- color: v.$primary;
- text-decoration: none;
-
- &:hover {
- text-decoration: underline;
- }
- }
- }
- }
- // Form validation error messages
- .form-error {
- font-size: map.get(v.$font-sizes, 'xs');
- color: #dc3545;
- margin-top: -8px;
- display: none;
- &.show {
- display: block;
- }
- }
- }
- // Form submission section
- .form-actions {
- grid-column: 1 / -1;
- margin-top: map.get(v.$spacers, 1);
- .form-submit-btn {
- width: 100%;
- position: relative;
- @include mix.flex(row, center, center);
- gap: map.get(v.$spacers, 2);
- @include mix.respond-to-min('md') {
- width: auto;
- min-width: 180px;
- }
- // Loading state content
- .btn-loading {
- @include mix.flex(row, center, center);
- gap: map.get(v.$spacers, 2);
- .loading-spinner {
- width: 18px;
- height: 18px;
- animation: spin 1s linear infinite;
- }
- }
- &:disabled {
- opacity: 0.7;
- cursor: not-allowed;
- }
- }
- }
- // Form status messages
- .form-status {
- grid-column: 1 / -1;
- margin-top: map.get(v.$spacers, 2);
- .form-success,
- .form-error-general {
- @include mix.flex(row, flex-start, center);
- gap: map.get(v.$spacers, 2);
- padding: map.get(v.$spacers, 2);
- @include mix.border-radius(v.$border-radius);
- font-size: map.get(v.$font-sizes, 'sm');
- svg {
- width: 18px;
- height: 18px;
- flex-shrink: 0;
- }
- }
- // Success message styling
- .form-success {
- background: rgba(#22c55e, 0.1);
- color: #15803d;
- border: 1px solid rgba(#22c55e, 0.3);
- svg {
- fill: #22c55e;
- }
- }
- // Error message styling
- .form-error-general {
- background: rgba(#dc3545, 0.1);
- color: #dc3545;
- border: 1px solid rgba(#dc3545, 0.3);
- svg {
- fill: #dc3545;
- }
- }
- }
- }
- }
- // Spinner animation keyframes
- @keyframes spin {
- 0% { transform: rotate(0deg); }
- 100% { transform: rotate(360deg); }
- }
- // Responsive contact form adjustments
- @include mix.respond-to-max('lg') {
- .contact-info-card {
- padding: map.get(v.$spacers, 4);
- }
- .contact-form-card {
- padding: map.get(v.$spacers, 4);
- }
- }
- @include mix.respond-to-max('md') {
- .contact-info-card {
- padding: map.get(v.$spacers, 3);
- }
- .contact-form-card {
- padding: map.get(v.$spacers, 3);
- }
- }
- }
- }
- }
- // Statistics/counting section with background
- .counting-info {
- @include mix.flex(row, center, center);
- height: 500px;
-
- @include mix.respond-to-max('lg') {
- padding: 100px 0;
- }
-
- @include mix.respond-to-max('md') {
- height: auto;
- padding: 80px 0;
- }
-
- @include mix.respond-to-max('sm') {
- padding: 60px 0;
- }
- .counting-content {
- max-width: 900px;
- @include mix.grid(2, map.get(v.$spacers, 6)); // Two-column layout
-
- @include mix.respond-to-max('md') {
- max-width: 600px;
- @include mix.grid(1, map.get(v.$spacers, 4)); // Single column on mobile
- text-align: center;
- margin: 0 auto;
-
- // Reorder content on mobile
- .info {
- order: 1;
- }
-
- .box-counting {
- order: 2;
- justify-self: center;
- }
- }
- // Information/description section
- .info {
- max-width: 299px;
-
- @include mix.respond-to-max('md') {
- max-width: 80%;
- margin: 0 auto;
- }
- .title,
- .text {
- color: v.$white;
- }
- .title {
- max-width: 250px;
- font-size: map.get(v.$font-sizes, '2xl');
- font-weight: map.get(v.$font-weights, 'bold');
- line-height: 1.3;
- margin-bottom: map.get(v.$spacers, 3);
-
- @include mix.respond-to-max('md') {
- max-width: 100%;
- margin-left: auto;
- margin-right: auto;
- }
- .subinfo {
- color: v.$primary;
- font-weight: map.get(v.$font-weights, 'semibold');
- }
- }
- .text {
- font-size: map.get(v.$font-sizes, 'base');
- font-weight: map.get(v.$font-weights, 'regular');
- line-height: 1.6;
- margin-bottom: map.get(v.$spacers, 4);
- }
- }
- // Statistics counters section
- .box-counting {
- align-self: center;
- @include mix.align-items(center);
- @include mix.grid(3, map.get(v.$spacers, 3)); // 3 columns of counters
-
- @include mix.respond-to-max('md') {
- @include mix.grid(2, map.get(v.$spacers, 4)); // 2 columns on tablet
- }
-
- @include mix.respond-to-max('sm') {
- @include mix.grid(1, map.get(v.$spacers, 3)); // 1 column on mobile
- }
- // Individual counter cards
- .counts {
- @include mix.flex(column, center, center);
- color: v.$white;
- background-color: rgba(v.$primary, 0.2);
- width: 180px;
- height: 160px;
- .number {
- font-size: map.get(v.$font-sizes, '2xl');
- font-weight: map.get(v.$font-weights, 'bold');
- line-height: 1;
- margin-bottom: map.get(v.$spacers, 1);
- }
- .label {
- font-size: map.get(v.$font-sizes, 'sm');
- font-weight: map.get(v.$font-weights, 'medium');
- text-align: center;
- line-height: 1.4;
- }
- svg {
- width: 50px;
- height: 50px;
- margin-bottom: map.get(v.$spacers, 2);
- }
- }
- }
- }
- }
- // Client companies section with logo carousel
- .client-companies {
- .customers-carousel {
- .slider-container {
- gap: 30px;
- }
-
- .client-company {
- height: 140px;
- margin-top: 20px;
- margin-bottom: 20px;
- @include mix.border-radius(v.$border-radius-lg);
- @include mix.transition(all 0.6s);
- .image {
- width: 100%;
- height: 100%;
- object-fit: cover; // Maintain aspect ratio
- filter: grayscale(100%); // Black and white by default
- @include mix.transition(all 0.6s);
- @include mix.border-radius(v.$border-radius-lg);
- }
- &:hover {
- @include mix.transform(scale(1.1));
- .image {
- filter: grayscale(0%); // Full color on hover
- }
- }
- }
- }
- }
- // Testimonials section with dual layout support
- .testimonials {
- @include mix.flex(column, center, center);
-
- // Grid version of testimonials
- .testimonials-grid {
- position: relative;
- @include mix.flex(row, center, center);
- gap: map.get(v.$spacers, 4);
- width: 1250px;
- height: 300px;
- overflow: hidden;
- z-index: 1;
- @include mix.respond-to-max('md') {
- width: 824px;
- }
- @include mix.respond-to-max('sm') {
- width: 100%;
- }
-
- // Shared styles for testimonial cards
- .comment {
- @include mix.flex(column, center, center);
- background-color: var(--color-surface);
- width: 400px;
- height: 300px;
- padding: map.get(v.$spacers, 4);
- border-radius: 20px;
- box-sizing: border-box;
- border: 1px solid var(--color-primary);
- visibility: hidden;
- transition: v.$transition-smooth;
- @include mix.respond-to-max('sm') {
- width: 100%;
- }
-
- // Quote icon with flip transformation
- .quote-icon {
- width: 70px;
- height: 70px;
- color: var(--color-primary);
- transform: scaleX(-1) scaleY(-1); // Flip both horizontally and vertically
- opacity: 0.8;
-
- @media (max-width: 575px) {
- width: 50px;
- height: 50px;
- }
- }
- // Testimonial message text
- .message {
- .text {
- font-size: map.get(v.$font-sizes, 'base');
- font-weight: map.get(v.$font-weights, 'regular');
- display: -webkit-box;
- -webkit-line-clamp: 4;
- line-clamp: 4;
- -webkit-box-orient: vertical;
- overflow: hidden;
- text-overflow: ellipsis;
- line-height: 1.5;
- margin: 0;
-
- @media (max-width: 575px) {
- font-size: map.get(v.$font-sizes, 'sm');
- -webkit-line-clamp: 5;
- line-clamp: 5;
- }
- }
- }
- // User information section
- .info-user {
- display: flex;
- flex-direction: row;
- justify-content: baseline;
- align-items: center;
- gap: 15px;
- height: auto;
- min-height: 60px;
- // User avatar image
- .image {
- width: 50px;
- height: 50px;
- border-radius: 50%;
- overflow: hidden;
- flex-shrink: 0;
-
- @media (max-width: 575px) {
- width: 40px;
- height: 40px;
- }
- img {
- width: 100%;
- height: 100%;
- object-fit: cover;
- }
- }
- // User details
- .info {
- display: flex;
- flex-direction: column;
- flex: 1;
- .name {
- font-weight: map.get(v.$font-weights, 'semibold');
- color: var(--color-text-primary);
- margin-bottom: 2px;
-
- @media (max-width: 575px) {
- font-size: map.get(v.$font-sizes, 'sm');
- }
- }
- .role {
- font-size: map.get(v.$font-sizes, 'sm');
- font-weight: map.get(v.$font-weights, 'bold');
- color: var(--color-primary);;
- margin-bottom: 5px;
-
- @media (max-width: 575px) {
- font-size: map.get(v.$font-sizes, 'xs');
- }
- }
- // Star rating display
- .rating {
- display: flex;
- gap: 1px;
- .star {
- width: 20px;
- height: 20px;
- color: #ffd700;
-
- @media (max-width: 575px) {
- width: 16px;
- height: 16px;
- }
- }
- }
- }
- }
- }
- }
- }
- // Contact call-to-action section
- .contact-info {
- @include mix.flex(column, center, center);
- background-color: transparent;
- position: relative;
- height: 500px;
- .contact-content {
- max-width: 800px;
- margin: 0 auto;
- text-align: center;
- }
- .contact-header {
- margin-bottom: map.get(v.$spacers, 5);
- @include mix.respond-to-max('md') {
- margin-bottom: map.get(v.$spacers, 4);
- }
- @include mix.respond-to-max('sm') {
- margin-bottom: map.get(v.$spacers, 3);
- }
- .contact-title {
- font-size: map.get(v.$font-sizes, '3xl');
- font-weight: map.get(v.$font-weights, 'bold');
- color: v.$white;
- margin-bottom: map.get(v.$spacers, 3);
- line-height: 1.2;
-
- @include mix.respond-to-max('sm') {
- font-size: map.get(v.$font-sizes, '2xl');
- }
- }
- .contact-description {
- font-size: map.get(v.$font-sizes, 'base');
- font-weight: map.get(v.$font-weights, 'regular');
- color: rgba(v.$white, 0.9);
- line-height: 1.6;
- max-width: 600px;
- margin: 0 auto;
-
- @include mix.respond-to-max('md') {
- font-size: map.get(v.$font-sizes, 'base');
- }
-
- @include mix.respond-to-max('sm') {
- font-size: map.get(v.$font-sizes, 'sm');
- }
- }
- }
- .contact-actions {
- .contact-cta {
- margin-bottom: map.get(v.$spacers, 2);
- padding: map.get(v.$spacers, 3) map.get(v.$spacers, 5);
- font-size: map.get(v.$font-sizes, 'lg');
- font-weight: map.get(v.$font-weights, 'semibold');
- text-decoration: none;
- @include mix.transition(v.$transition-smooth);
-
- @include mix.respond-to-max('md') {
- padding: map.get(v.$spacers, 3) map.get(v.$spacers, 4);
- font-size: map.get(v.$font-sizes, 'base');
- }
-
- @include mix.respond-to-max('sm') {
- padding: map.get(v.$spacers, 2) map.get(v.$spacers, 3);
- font-size: map.get(v.$font-sizes, 'sm');
- width: 100%;
- max-width: 280px;
- }
- // Call-to-action button hover effects
- &:hover {
- @include mix.transform(translateY(-2px));
- @include mix.box-shadow(0 10px 25px rgba(v.$primary, 0.3));
- }
- }
- }
- }
|