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/builds/-DFbjr9L/0/foach/quadcode.com/src/components/blocks/main/Plans.svelte
<script lang="ts">
  import close from '../../../assets/images/main/plans/close.svg';
  import stick from '../../../assets/images/main/plans/stick.svg';
  import stickW from '../../../assets/images/main/plans/stickW.svg';
  import { popupForm } from '../../../store';

  const items = [
    {
      title: 'Standard',
      price: '$ 20.000',
      popular: false,
      options: [
        {
          title: 'Web-Mobile Traderoom',
          active: true,
        },
        {
          title: 'Quotes & Liquidity',
          active: true,
        },
        {
          title: 'CRM',
          active: true,
        },
        {
          title: 'Dealing desk',
          active: true,
        },
        {
          title: 'KYC',
          active: false,
        },
        {
          title: 'Antifraud',
          active: false,
        },
        {
          title: 'Intergrated PSPs',
          active: false,
        },
        {
          title: 'Technical SMS',
          active: false,
        },
        {
          title: 'Technical emails',
          active: false,
        },
        {
          title: 'iOS app',
          active: false,
        },
        {
          title: 'Android app',
          active: false,
        },
        {
          title: 'UCC',
          active: false,
        },
        {
          title: 'Affiliate Module',
          active: false,
        },
        {
          title: 'Sales Module',
          active: false,
        },
      ],
    },
    {
      title: 'Turnkey',
      price: '$ 42.000',
      popular: true,
      options: [
        {
          title: 'Web-Mobile Traderoom',
          active: true,
        },
        {
          title: 'Quotes & Liquidity',
          active: true,
        },
        {
          title: 'CRM',
          active: true,
        },
        {
          title: 'Dealing desk',
          active: true,
        },
        {
          title: 'KYC',
          active: true,
        },
        {
          title: 'Antifraud',
          active: true,
        },
        {
          title: 'Intergrated PSPs',
          active: true,
        },
        {
          title: 'Technical SMS',
          active: true,
        },
        {
          title: 'Technical emails',
          active: true,
        },
        {
          title: 'iOS app',
          active: true,
        },
        {
          title: 'Android app',
          active: true,
        },
        {
          title: 'UCC',
          active: true,
        },
        {
          title: 'Affiliate Module',
          active: true,
        },
        {
          title: 'Sales Module',
          active: true,
        },
      ],
    },
    {
      title: 'Advanced',
      price: '$ 30.000',
      popular: false,
      options: [
        {
          title: 'Web-Mobile Traderoom',
          active: true,
        },
        {
          title: 'Quotes & Liquidity',
          active: true,
        },
        {
          title: 'CRM',
          active: true,
        },
        {
          title: 'Dealing desk',
          active: true,
        },
        {
          title: 'KYC',
          active: true,
        },
        {
          title: 'Antifraud',
          active: true,
        },
        {
          title: 'Intergrated PSPs',
          active: true,
        },
        {
          title: 'Technical SMS',
          active: true,
        },
        {
          title: 'Technical emails',
          active: true,
        },
        {
          title: 'iOS app',
          active: false,
        },
        {
          title: 'Android app',
          active: false,
        },
        {
          title: 'UCC',
          active: false,
        },
        {
          title: 'Affiliate Module',
          active: false,
        },
        {
          title: 'Sales Module',
          active: false,
        },
      ],
    },
  ];

  let optionActive: null | number = null;

  const handleClick = (id: number) => {
    optionActive = id === optionActive ? null : id;
  };
</script>

<div class="block-plans">
  <div class="container">
    <p class="block-plans__title">Don't even think about development!</p>
    <p class="block-plans__subtitle">Let us do it right for you!</p>
    <div class="block-plans__list">
      {#each items as item, index}
        <div class="block-plans__plan {item.popular ? 'popular' : ''}">
          <div class="block-plans__planHeader">
            <p class="block-plans__planName">{item.title}</p>
            <div class="block-plans__planPrice">
              <p class="block-plans__planPriceNumber">{item.price}</p>
            </div>
          </div>
          <div class="block-plans__planOptions {index === optionActive ? 'active' : ''}">
            {#each item.options as option}
              <div class="block-plans__planOption">
                <div class="block-plans__planOptionName">{option.title}</div>
                {#if item.popular}
                  <img
                    src={option.active ? stickW : close}
                    alt=""
                    class="block-plans__planOptionActive"
                    loading="lazy"
                  />
                {:else}
                  <img
                    src={option.active ? stick : close}
                    alt=""
                    class="block-plans__planOptionActive"
                    loading="lazy"
                  />
                {/if}
              </div>
            {/each}
          </div>
          <div
            class="block-plans__planButton"
            on:click={() => popupForm.set(true)}
            on:keydown={(event) => {
              if (event.key === 'Escape') {
                popupForm.set(false);
              }
            }}
            role="button"
            tabindex="0"
          >
            Get started
          </div>
          <div
            class="block-plans__planOptionsBtn {item.popular ? 'white' : ''} {index === optionActive ? 'active' : ''}"
            role="button"
            tabindex="0"
            on:click={() => handleClick(index)}
            on:keydown={() => false}
          >
            <span>{index === optionActive ? 'Hide' : 'Details'}</span>
            <svg width="23" height="22" viewBox="0 0 23 22" fill="none" xmlns="http://www.w3.org/2000/svg">
              <rect x="0.5" width="22" height="22" rx="11" fill="#323232" fill-opacity="0.05" />
              <path d="M7.5 9L11.5 13L15.5 9" stroke="#141414" stroke-width="2" />
            </svg>
          </div>
        </div>
      {/each}
    </div>
  </div>
</div>

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

  .block-plans {
    padding: 120px 0 118px;
    background: $techBlue1;

    @include breakpoint-down('deskL') {
      padding: 80px 0 115px;
    }

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

    @include breakpoint-down('tabM') {
      padding: 56px 0 96px;
    }

    &__title {
      @include titleXL;

      text-align: center;
      width: 100%;
      max-width: 560px;
      margin-inline: auto;
      margin-bottom: 50px;
      position: relative;

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

      @include breakpoint-down('deskS') {
        max-width: 360px;
        margin-bottom: 34px;
      }

      &:after {
        content: '';
        position: absolute;
        top: calc(100% + 24px);
        left: 50%;
        transform: translateX(-50%);
        height: 2px;
        width: 77px;
        background: $redPrimary;

        @include breakpoint-down('deskS') {
          top: calc(100% + 16px);
        }

        @include breakpoint-down('tabM') {
          width: 49px;
        }
      }
    }

    &__subtitle {
      @include titleM;

      text-align: center;
      margin-bottom: 80px;

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

      @include breakpoint-down('tabM') {
        margin-bottom: 56px;
      }
    }

    &__list {
      display: flex;
      align-items: center;
      gap: 40px;

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

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

      @include breakpoint-down('tabM') {
        flex-wrap: wrap;
        gap: 24px;
        margin-left: -20px;
        width: calc(100% + 20px * 2);
      }
    }

    &__plan {
      flex: 1;
      border-radius: 16px;
      border: 1px solid $techBlue2;
      background: $techWhite;
      padding: 23px 0;

      @include breakpoint-down('deskS') {
        width: calc((100% - 20px * 2) / 3);
      }

      @include breakpoint-down('tabM') {
        min-width: 100%;
        display: flex;
        flex-direction: column;
      }

      &.popular {
        background: $redPrimary;
        border: none;
        padding: 40px 0;

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

        @include breakpoint-down('tabM') {
          padding: 23px 0;
        }

        .block-plans__planName,
        .block-plans__planPrice,
        .block-plans__planOptionName {
          color: $techWhite;
        }

        .block-plans__planPriceNumber {
          font-size: 34px;
          font-weight: 700;
          line-height: 37px;

          @include breakpoint-down('deskS') {
            font-size: 28px;
            line-height: 32px;
          }
        }

        .block-plans__planOption {
          border-bottom: 1px solid $techWhite15;
        }

        .block-plans__planButton {
          background: $fontPrimary;
          color: $techWhite;
        }
      }
    }

    &__planHeader {
      padding: 0 66.5px;
      margin-bottom: 18px;

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

      @include breakpoint-down('deskS') {
        padding: 0 21px;
        margin-bottom: 8px;
      }

      @include breakpoint-down('tabM') {
        margin-bottom: 24px;
        padding-bottom: 8px;
        border-bottom: 1px solid #3232320d;
        order: 1;
      }
    }

    &__planName {
      @include baseTitle;

      margin-bottom: 8px;
      text-align: center;

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

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

    &__planPrice {
      display: flex;
      justify-content: center;
      align-items: center;
      gap: 5px;
    }

    &__planPriceNumber {
      font-size: 28px;
      font-weight: 700;
      line-height: 31px;

      @include breakpoint-down('deskS') {
        font-size: 24px;
        line-height: 26px;
      }
    }

    &__planPriceTime {
      min-width: 114px;

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

    &__planOptions {
      padding: 24px;
      margin-bottom: 18px;

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

      @include breakpoint-down('tabM') {
        display: none;
        padding: 24px 36.5px;
        order: 3;
      }

      &.active {
        display: block;
      }
    }

    &__planOption {
      display: flex;
      align-items: center;
      justify-content: space-between;
      padding: 3.2px 0;
      border-bottom: 1px solid $techBlue2;

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

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

      @include breakpoint-down('tabM') {
        margin-bottom: 4px;
      }
    }

    &__planOptionName {
      @include smallCTA;
    }

    &__planOptionActive {
      width: 30px;
      height: 30px;

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

    &__planButton {
      @include baseCTA;

      cursor: pointer;
      border-radius: 64px;
      border: 1px solid $fontPrimary;
      padding: 12px 49px;
      width: max-content;
      margin-inline: auto;

      @include breakpoint-down('deskL') {
        padding: 12px 55px;
      }

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

      @include breakpoint-down('tabM') {
        padding: 7px 55px;
        margin-bottom: 8px;
        order: 2;
      }
    }

    &__planOptionsBtn {
      align-items: center;
      gap: 10px;
      width: max-content;
      margin-inline: auto;
      display: none;

      @include breakpoint-down('tabM') {
        display: flex;
        order: 4;
      }

      &.white {
        color: white;

        svg {
          path {
            stroke: $techWhite;
          }
        }
      }

      &.active {
        > svg {
          transform: rotate(180deg);
        }
      }
    }
  }
</style>