HEX
Server: nginx/1.18.0
System: Linux test-ipsremont 5.4.0-214-generic #234-Ubuntu SMP Fri Mar 14 23:50:27 UTC 2025 x86_64
User: ips (1000)
PHP: 8.0.30
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/quadcode.com/src/components/blocks/turnkey-solution/Services.svelte
<script lang="ts">
  import img1 from '../../../assets/images/turnkey-solution/services/payment-gates.svg';
  import img2 from '../../../assets/images/turnkey-solution/services/trading-platform.svg';
  import img3 from '../../../assets/images/turnkey-solution/services/back-office.svg';
  import img4 from '../../../assets/images/turnkey-solution/services/dealing-desk.svg';
  import img5 from '../../../assets/images/turnkey-solution/services/risk-management.svg';
  import img6 from '../../../assets/images/turnkey-solution/services/client-support.svg';
  import billing from '../../../assets/images/turnkey-solution/services/Billing_Services.webp';
  import tp from '../../../assets/images/turnkey-solution/services/TP_Services.webp';
  import backOffice from '../../../assets/images/turnkey-solution/services/BackOffice_Services.webp';
  import dealing from '../../../assets/images/turnkey-solution/services/Dealing.webp';
  import risk from '../../../assets/images/turnkey-solution/services/Risk_Services.webp';
  import chats from '../../../assets/images/turnkey-solution/services/Chats.webp';
  import Button from '../../button/Button.svelte';
  import { locale, localeLink, t } from '$lib/translations';

  let active = 1;
  let animation = false;
  let stop = true;
  let disabled = false;

  const handleClick = (id: number) => {
    animation = true;
    disabled = true;
    stop = false;

    const timeout = setTimeout(() => {
      active = id;
      animation = false;

      clearTimeout(timeout);
    }, 300);

    const timeoutStop = setTimeout(() => {
      stop = true;

      clearTimeout(timeoutStop);
    }, 600);

    const timeoutDisabled = setTimeout(() => {
      disabled = false;

      clearTimeout(timeoutDisabled);
    }, 900);
  };

  const renderContent = (id: number) => {
    switch (id) {
      case 1:
        return {
          text: $t('turnkey-solution.Get access to 100+ PSP out of the box with our flexible and hassle-free billing system.'),
          img: billing,
          link: `${localeLink()}/back-office#billing`,
        };
      case 2:
        return {
          text: $t("turnkey-solution.This client-facing module provides an intuitive trading environment with an array of investment tools and over 250 assets to trade on. It's available on web, desktop, and mobile (iOS, Android) platforms, ensuring a seamless trading experience no matter where your clients are."),
          img: tp,
          link: `${localeLink()}/trading-platform`,  
        };
      case 3:
        return {
          text: $t('turnkey-solution.Manage your traders, admins and affiliates in one place with ease. Powerful CRM, comprehensive ticket support system, pre-integrated KYC providers and even more within single back office solution.'),
          img: backOffice,
          link: `${localeLink()}/back-office`,        
        };
      case 4:
        return {
          text: $t('turnkey-solution.Set aside dealing and concentrate solely on user acquisition. We handle execution on our side letting you to focus on your business goals.'),
          img: dealing,
          link: `${localeLink()}/back-office#dealing`,
        };
      case 5:
        return {
          text: $t('turnkey-solution.Forget about risk managements. Make sure your platform safe and secure with robust security policies, constant fraud monitoring and management.'),
          img: risk,
          link: `${localeLink()}/back-office#reports`,
        };
      case 6:
        return {
          text: $t("turnkey-solution.Manage your clients' request with robust ticket support system and increase customer satisfaction."),
          img: chats,
          link: `${localeLink()}/back-office#chats`,
        };
      default:
        return {
          text: '',
          img: '',
        };
    }
  };
</script>

<div class="block-services">
  <div class="container">
    <div class="block-services__wrapper">
      <p class="block-services__title">{$t('turnkey-solution.All services for brokers in one place')}</p>
      <div class="block-services__header {disabled ? 'animation' : ''}">
        <div class="block-services__headerScroll">
          <div
            class="block-services__headerItem {active === 1 ? 'active' : ''}"
            on:click={() => handleClick(1)}
            on:keydown={() => undefined}
            role="tab"
            tabindex="0"
            aria-label="tab"
          >
            <img src={img1} alt="" class="block-services__headerItemIcon" loading="lazy" />
            <p class="block-services__headerItemText">{$t('turnkey-solution.Payment Gates')}</p>
          </div>
          <div
            class="block-services__headerItem {active === 2 ? 'active' : ''}"
            on:click={() => handleClick(2)}
            on:keydown={() => undefined}
            role="tab"
            tabindex="0"
            aria-label="tab"
          >
            <img src={img2} alt="" class="block-services__headerItemIcon" loading="lazy" />
            <p class="block-services__headerItemText">{$t('turnkey-solution.Trading Platform')}</p>
          </div>
          <div
            class="block-services__headerItem {active === 3 ? 'active' : ''}"
            on:click={() => handleClick(3)}
            on:keydown={() => undefined}
            role="tab"
            tabindex="0"
            aria-label="tab"
          >
            <img src={img3} alt="" class="block-services__headerItemIcon" loading="lazy" />
            <p class="block-services__headerItemText">{$t('turnkey-solution.Back Office')}</p>
          </div>
          <div
            class="block-services__headerItem {active === 4 ? 'active' : ''}"
            on:click={() => handleClick(4)}
            on:keydown={() => undefined}
            role="tab"
            tabindex="0"
            aria-label="tab"
          >
            <img src={img4} alt="" class="block-services__headerItemIcon" loading="lazy" />
            <p class="block-services__headerItemText">{$t('turnkey-solution.Dealing Desk')}</p>
          </div>
          <div
            class="block-services__headerItem {active === 5 ? 'active' : ''}"
            on:click={() => handleClick(5)}
            on:keydown={() => undefined}
            role="tab"
            tabindex="0"
            aria-label="tab"
          >
            <img src={img5} alt="" class="block-services__headerItemIcon" loading="lazy" />
            <p class="block-services__headerItemText">{$t('turnkey-solution.Risk Management')}</p>
          </div>
          <div
            class="block-services__headerItem {active === 6 ? 'active' : ''}"
            on:click={() => handleClick(6)}
            on:keydown={() => undefined}
            role="tab"
            tabindex="0"
            aria-label="tab"
          >
            <img src={img6} alt="" class="block-services__headerItemIcon" loading="lazy" />
            <p class="block-services__headerItemText">{$t('turnkey-solution.Client Support')}</p>
          </div>
        </div>
      </div>
      <div class="block-services__content {animation ? 'animation' : ''} {stop ? 'stop' : ''}">
        <img src={renderContent(active).img} alt="" class="block-services__contentImg" loading="lazy" />
        <div class="block-services__contentBlock">
          <p class="block-services__contentText">{renderContent(active).text}</p>
          <Button text={$t('Learn more')} className="block-services__contentButton" link={renderContent(active).link} ghost />
        </div>
      </div>
    </div>
  </div>
</div>

<style lang="scss">
  @import 'src/scss/media';
  @import 'src/scss/mixins';
  @import 'src/scss/variables';

  .block-services {
    padding-top: 106px;
    padding-bottom: 116px;

    @include breakpoint-down('deskL') {
      padding-top: 120px;
      padding-bottom: 61px;
    }

    @include breakpoint-down('deskS') {
      padding-top: 64px;
      padding-bottom: 0;
    }

    @include breakpoint-down('tabM') {
      padding-bottom: 68px;
    }

    .container {
      @include breakpoint-down('deskS') {
        padding: 0;
      }
    }

    &__title {
      @include titleL;

      text-align: center;
      margin-bottom: 59px;
      width: 100%;

      @include breakpoint-down('deskL') {
        max-width: 380px;
        margin-inline: auto;
        margin-bottom: 64px;
      }

      @include breakpoint-down('deskS') {
        display: none;
      }
    }

    &__header {
      width: 100%;
      display: flex;
      gap: 44px;
      margin-bottom: 95px;

      @include breakpoint-down('deskL') {
        margin-bottom: 24px;
      }

      @include breakpoint-down('deskS') {
        overflow: auto;
        padding: 0 40px;
        margin-bottom: 16px;

        &::-webkit-scrollbar {
          width: 0;
          display: none;
        }
      }

      @include breakpoint-down('tabM') {
        padding: 0 20px;
        margin-bottom: 16px;
      }

      &:global(.animation) {
        pointer-events: none;
      }
    }

    &__headerScroll {
      display: flex;
      gap: 40px;
      min-width: max-content;
      width: 100%;

      @include breakpoint-down('deskL') {
        gap: 32px;
      }

      @include breakpoint-down('deskS') {
        gap: 20px;
      }
    }

    &__headerItem {
      cursor: pointer;
      position: relative;
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      padding: 14px 0;
      width: 200px;
      transition: 0.3s cubic-bezier(0.65, 0.05, 0.36, 1);

      @include breakpoint-down('deskL') {
        width: 160px;
        padding: 13px 0 11px;
      }

      @include breakpoint-down('deskS') {
        width: 137px;
      }

      @include breakpoint-down('tabM') {
        width: 100px;
        padding-top: 0;
        padding-bottom: 16px;
      }

      &:after {
        content: '';
        position: absolute;
        bottom: 0;
        right: 0;
        height: 2px;
        width: 0;
        transition: 0.3s cubic-bezier(0.65, 0.05, 0.36, 1);
        background: $redPrimary;
      }

      &:hover {
        background: $techBlue2;
      }
    }

    :global(.block-services__headerItem.active) {
      pointer-events: none;

      &:after {
        width: 100%;
        right: auto;
        left: 0;
      }
    }

    &__headerItemIcon {
      margin-bottom: 4px;
      width: 40px;

      @include breakpoint-down('deskL') {
        width: 38px;
      }
    }

    &__headerItemText {
      text-align: center;
      @include smallCTA;
    }

    &__content {
      display: flex;
      align-items: center;
      justify-content: space-between;
      padding-right: 120px;
      transition: 0.3s cubic-bezier(0.65, 0.05, 0.36, 1);
      opacity: 0;

      @include breakpoint-down('deskL') {
        padding-right: 0;
      }

      @include breakpoint-down('deskS') {
        padding: 0 40px;
        gap: 20px;
      }

      @include breakpoint-down('tabM') {
        flex-wrap: wrap;
        padding: 0 20px;
        gap: 16px;
      }

      &:global(.animation) {
        opacity: 0;

        .block-services__contentImg {
          top: 15px;
        }

        .block-services__contentText {
          top: 5px;
        }

        & :global(.block-services__contentButton) {
          top: 5px;
        }
      }
      &:global(.stop) {
        opacity: 1;

        .block-services__contentImg {
          top: 0;
        }

        .block-services__contentText {
          top: 0;
        }

        & :global(.block-services__contentButton) {
          top: 0;
        }
      }
    }

    &__contentImg {
      width: 680px;
      height: 680px;
      transition: 0.3s cubic-bezier(0.65, 0.05, 0.36, 1);
      position: relative;
      top: -15px;

      @include breakpoint-down('deskL') {
        width: 544px;
        height: 544px;
      }

      @include breakpoint-down('deskS') {
        width: 54.216%;
        height: auto;
      }

      @include breakpoint-down('tabM') {
        margin-left: -20px;
        width: calc(100% + 40px);
      }
    }

    &__contentBlock {
      width: 440px;

      @include breakpoint-down('deskL') {
        width: 448px;
      }

      @include breakpoint-down('deskS') {
        width: 52.699%;
        max-width: 295px;
      }

      @include breakpoint-down('tabM') {
        width: 100%;
        max-width: none;
      }
    }

    &__contentText {
      margin-bottom: 40px;
      transition: 0.3s cubic-bezier(0.65, 0.05, 0.36, 1);
      position: relative;
      top: -5px;

      @include breakpoint-down('deskS') {
        margin-bottom: 24px;
      }
    }

    & :global(.block-services__contentButton) {
      @include baseCTA;

      width: 260px;
      transition: 0.3s cubic-bezier(0.65, 0.05, 0.36, 1);
      position: relative;
      top: -5px;

      @include breakpoint-down('deskS') {
        width: max-content;
      }

      @include breakpoint-down('tabM') {
        margin-inline: auto;
      }
    }
  }
</style>