Blog

  • Cách public localhost để test trên nhiều thiết bị

    Cách public localhost để test trên nhiều thiết bị

    Yêu cầu: Đã login github account vào visual studio code Run môi trường local (port bất kỳ)

    Command + Shift + P: Nhập Forward port hoặc chọn tab PORTS ở trong phần panel của visual

    Click button Forward a port Nhập port của local vào ô Port => Enter => Chờ 3s để Vscode generate ra 1 forwarded address

    Đổi Visibility từ Private => Public (private thì sẽ check authen bằng github đã login vào visual) Copy Forwarded Address và test thử

    Xem thêm tại: https://code.visualstudio.com/docs/debugtest/port-forwarding

    Ngoài ra hãy tìm hiểu thêm:

    Dùng Cloudflare Tunnels đi, public internet luôn

  • Run WordPress by Local Site

    Run WordPress by Local Site

    LocalWP (trước đây gọi là Local by Flywheel) là một công cụ mạnh mẽ giúp bạn cài đặt và quản lý nhiều website WordPress trên máy tính một cách nhanh chóng. Bài viết này sẽ hướng dẫn chi tiết cách chạy WordPress bằng LocalWP và liên kết code theme từ máy tính vào.


    1. Pull code về máy

    Đầu tiên, bạn cần pull source code của project WordPress từ repository (GitHub, GitLab, Bitbucket, …). Hãy lưu lại path (đường dẫn) tới thư mục code này, vì chúng ta sẽ cần sử dụng ở bước sau.

    Ví dụ:

    /Users/username/Documents/my-wordpress-theme


    2. Tải và cài đặt LocalWP

    Truy cập trang chủ LocalWP để tải về: 👉 https://localwp.com/

    Sau khi tải xong, tiến hành cài đặt ứng dụng như bình thường.


    3. Tạo mới một site WordPress

    • Mở ứng dụng LocalWP.
    • Nhấn nút Create a new site.
    • Làm theo các bước hướng dẫn để tạo mới một site WordPress.

    Sau khi tạo xong, site của bạn sẽ xuất hiện trong danh sách quản lý.


    4. Lấy path tới thư mục theme của site

    Trong giao diện LocalWP:

    • Chọn site bạn vừa tạo.
    • Ở phần Site Details, nhấn nút Site folder để mở thư mục chứa mã nguồn WordPress.
    • Điều hướng tới thư mục:

    app/public/wp-content/themes

    Ví dụ path đầy đủ:

    /Users/hieuhuynht./Local Sites/test-site/app/public/wp-content/themes


    5. Liên kết code theme bằng symlink

    Mở terminal và chạy lệnh sau để tạo liên kết (symlink):

    ln-s <path tới thư mục code ở bước 1> <path tới thư mục themes ở bước 4>

    Ví dụ:

    ln-s /Users/username/Documents/my-wordpress-theme \

    /Users/hieuhuynht./Local Sites/test-site/app/public/wp-content/themes/my-wordpress-theme

    Lúc này, code của bạn sẽ được link trực tiếp tới thư mục theme của WordPress site.


    6. Khởi động site và active theme

    • Trong LocalWP, nhấn Start site để khởi động WordPress.
    • Truy cập vào Admin Dashboard.
    • Vào menu Appearance > Themes.
    • Tìm theme bạn vừa link và nhấn Activate để kích hoạt.

    Kết luận

    Chỉ với vài bước đơn giản, bạn đã có thể chạy WordPress bằng LocalWP và phát triển theme ngay trên máy tính của mình. Việc sử dụng symlink giúp bạn dễ dàng quản lý code trên repo, đồng thời vẫn chạy trực tiếp được trong LocalWP mà không cần copy/paste mỗi lần chỉnh sửa.

  • How to export file from design figma

    How to export file from design figma

    1. SVG – phù hợp cho hình ít chi tiết, dạng vector

    • Dùng cho: icon, logo, hình minh họa đơn giản, hình vẽ bằng vector.
    • Ưu điểm:
      • Nhẹ, dung lượng cực nhỏ.
      • Phóng to/thu nhỏ không bị vỡ hình.
      • Thay đổi màu sắc dễ dàng bằng CSS.
    • Hạn chế:
      • Không phù hợp cho ảnh chụp hoặc hình có nhiều chi tiết phức tạp.

    2. PNG – phù hợp cho hình nhiều chi tiết, cần nền trong suốt

    • Dùng cho: hình minh họa có nhiều chi tiết, hình cần độ sắc nét cao, hoặc cần nền trong suốt.
    • Cách export:
      • Chọn @3x, @4x để ảnh rõ nét hơn trên màn hình Retina.
    • Ưu điểm:
      • Giữ chi tiết sắc nét.
      • Hỗ trợ nền trong suốt.
    • Hạn chế:
      • Dung lượng nặng hơn JPEG và WebP.

    3. JPEG – phù hợp cho ảnh chụp, ảnh thật nhiều màu sắc

    • Dùng cho: ảnh chụp, banner nhiều màu, background có gradient.
    • Ưu điểm:
      • Giữ được cảm giác “ảnh thật” với nhiều điểm ảnh.
      • Dung lượng nhẹ hơn PNG nếu cùng kích thước.
    • Hạn chế:
      • Không hỗ trợ nền trong suốt.
      • Có thể bị giảm chất lượng khi nén quá nhiều.

    4. WebP – lựa chọn tối ưu để ảnh nhẹ

    • Dùng cho: ảnh cần giảm dung lượng nhưng vẫn giữ chất lượng tốt.
    • Ưu điểm:
      • Nhẹ hơn PNG/JPEG.
      • Hỗ trợ cả trong suốt và ảnh động.
    • Hạn chế:
      • Một số trình duyệt cũ có thể chưa hỗ trợ (nhưng hiện nay đa phần đã hỗ trợ tốt).

    Kết luận

    • SVG: icon, logo, hình vector ít chi tiết.
    • PNG: ảnh minh họa nhiều chi tiết, cần trong suốt, export 3x hoặc 4x cho rõ nét.
    • JPEG: ảnh chụp, banner nhiều màu, muốn ảnh thật và tự nhiên.
    • WebP: tối ưu dung lượng, giữ chất lượng, dùng cho web hiện đại.
  • Ways to Center aTag Using HTML and CSS

    Ways to Center aTag Using HTML and CSS

    1. Dùng margin: auto (theo chiều ngang)

    &lt;div class="parent">
      &lt;div class="child">Center&lt;/div>
    &lt;/div>
    
    
    .parent {
      width: 400px;
      border: 1px solid #ccc;
    }
    .child {
      width: 100px;
      margin: 0 auto; /* Căn giữa ngang */
      background: lightblue;
    }
    

    2. Dùng Flexbox

    .parent {
      display: flex;
      justify-content: center; /* center ngang */
      align-items: center;     /* center dọc */
      height: 300px;
      border: 1px solid #ccc;
    }
    .child {
      background: lightgreen;
    }
    

    3. Dùng Grid

    .parent {
      display: grid;
      place-items: center; /* center cả ngang + dọc */
      height: 300px;
      border: 1px solid #ccc;
    }
    .child {
      background: lightcoral;
    }
    

    4. Dùng position: absolute + transform

    .parent {
      position: relative;
      height: 300px;
      border: 1px solid #ccc;
    }
    .child {
      position: absolute;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%); /* đẩy ngược lại để center */
      background: lightyellow;
    }
    

    5. Chỉ căn giữa ngang bằng text-align: center (nếu child là inline-block)

    .parent {
      text-align: center;
    }
    .child {
      display: inline-block;
      background: lightpink;
    }
    

    Kết luận

    • Nếu chỉ cần căn ngang → dùng margin: auto hoặc text-align: center.
    • Nếu cần cả ngang + dọc → nên ưu tiên Flexbox hoặc Grid.
    • Với layout phức tạp, position + transform vẫn là giải pháp linh hoạt.
  • Handle slider for SVG file

    Handle slider for SVG file

    Yêu cầu của bài toán:

    Slide Autoplay

    Nếu click từng item thì sẽ active đến item đó.

    Click item nào ở bên trái thì svg bên phải sẻ trỏ đến item đó.

    <section class="section activities-sprint-section">
      <div class="container">
        <div class="section-body">
          <div class="section-left">
            <div>
              <h3 class="section-title">
                Activities in a Sprint
              </h3>
              <div class="slides-container">
                <div class="slides-sprint">
                  <div class="slide-sprint">
                    <div class="sprint-step">
                      <h4 class="step-title">
                        INTRODUCTION
                      </h4>
                      <p class="step-description">
                        The development stage is separated into 1 to 3 weeks time-box called 'Sprint'.Each sprint starts with a planning meeting and ends with the delivery of a stable working product or functionality.
                      </p>
                    </div>
                  </div>
                  <div class="slide-sprint">
                    <div class="sprint-step">
                      <h4 class="step-title">
                        1. SPRINT PLANING
                      </h4>
                      <p class="step-description">
                      Analyse requirement, detail discussion about how to implement and deliver features.
                      </p>
                    </div>
                  </div>
                  <div class="slide-sprint">
                    <div class="sprint-step">
                      <h4 class="step-title">
                        2. IMPLEMENTATION
                      </h4>
                      <p class="step-description">
                        Repeat the following steps: Develop > Integrate > Internal Deploy > Test.
                      </p>
                    </div>
                  </div>
                  <div class="slide-sprint">
                    <div class="sprint-step">
                      <h4 class="step-title">
                        3. BACKLOG REFINEMENT
                      </h4>
                      <p class="step-description">
                        Update backlog with new information from development and business team. Prepare stories for the next sprint planning.
                      </p>
                    </div>
                  </div>
                  <div class="slide-sprint">
                    <div class="sprint-step">
                      <h4 class="step-title">
                        4. DAILY SCRUM
                      </h4>
                      <p class="step-description">
                        15min stand-up meeting every day. Daily Scrums improve communications, identify impediments, promote quick decision-making.
                      </p>
                    </div>
                  </div>
                  <div class="slide-sprint">
                    <div class="sprint-step">
                      <h4 class="step-title">
                        5. REVIEW
                      </h4>
                      <p class="step-description">
                        Deploy the most stable version of the sprint. Move through new features together with all stakeholders. Review quality, performance report.
                      </p>
                    </div>
                  </div>
                  <div class="slide-sprint">
                    <div class="sprint-step">
                      <h4 class="step-title">
                        6. RETROSPECTIVE
                      </h4>
                      <p class="step-description">
                        Reflect on the sprint activities, kaizen, and celebrate!
                      </p>
                    </div>
                  </div>
                </div>
              </div>
              <ul class="slide-dots">
                <li class="slide-dot" data-step="0"></li>
                <li class="slide-dot" data-step="1"></li>
                <li class="slide-dot" data-step="2"></li>
                <li class="slide-dot" data-step="3"></li>
                <li class="slide-dot" data-step="4"></li>
                <li class="slide-dot" data-step="5"></li>
                <li class="slide-dot" data-step="6"></li>
              </ul>
            </div>
            <div class="slide-arrows">
              <div class="arrow arrow-back disable">
                <img class="light" src="<?php echo get_template_directory_uri() . '/images/arrow-back-blue.svg' ?>" alt="Arrow back blue" title="Arrow back blue" width="100%" height="100%">
                <img class="grey" src="<?php echo get_template_directory_uri() . '/images/arrow-back-grey.svg' ?>" alt="Arrow back grey" title="Arrow back grey" width="100%" height="100%">
              </div>
              <div class="arrow arrow-next">
                <img class="light" src="<?php echo get_template_directory_uri() . '/images/arrow-next-blue.svg' ?>" alt="Arrow back blue" title="Arrow back blue" width="100%" height="100%">
                <img class="grey" src="<?php echo get_template_directory_uri() . '/images/arrow-next-grey.svg' ?>" alt="Arrow back grey" title="Arrow back grey" width="100%" height="100%">
              </div>
            </div>
          </div>
          <div class="section-right">
            <svg
              width="655"
              height="410"
              viewBox="0 0 655 410"
              fill="none"
              xmlns="http://www.w3.org/2000/svg"
              class="sprint-lyfecycle"
            >
              <g clip-path="url(#clip0_4698_4314)">
                <path
                  fill-rule="evenodd"
                  clip-rule="evenodd"
                  d="M623.625 395.793V409.999L655 370.503L623.625 335.143V350.39H482.94C462.909 370.842 438.042 386.583 410.173 395.793H623.625Z"
                  fill="#FF9C48"
                />
                <g class="step step-1" data-step="1">
                  <path
                    fill-rule="evenodd"
                    clip-rule="evenodd"
                    d="M0 348.247L226.181 348.919L241.933 372.507L226.336 396.766H0L15.6538 372.507L0 348.247Z"
                    fill="#4196F2"
                    class="background"
                  />
                  <path
                    d="M82.2593 377.092C81.6113 377.092 80.9873 377.008 80.3873 376.84C79.7953 376.664 79.3033 376.42 78.9113 376.108L79.5113 374.764C80.3353 375.34 81.2553 375.628 82.2713 375.628C82.8153 375.628 83.2313 375.544 83.5193 375.376C83.8153 375.2 83.9633 374.956 83.9633 374.644C83.9633 374.372 83.8273 374.16 83.5553 374.008C83.2913 373.848 82.8233 373.696 82.1513 373.552C81.3993 373.4 80.7993 373.216 80.3513 373C79.9113 372.776 79.5873 372.508 79.3793 372.196C79.1793 371.876 79.0793 371.48 79.0793 371.008C79.0793 370.496 79.2193 370.036 79.4993 369.628C79.7873 369.22 80.1873 368.904 80.6993 368.68C81.2113 368.448 81.8033 368.332 82.4753 368.332C83.0833 368.332 83.6673 368.42 84.2273 368.596C84.7873 368.772 85.2353 369.012 85.5713 369.316L84.9713 370.66C84.2193 370.084 83.3913 369.796 82.4873 369.796C82.0073 369.796 81.6233 369.892 81.3353 370.084C81.0473 370.276 80.9033 370.536 80.9033 370.864C80.9033 371.056 80.9553 371.216 81.0593 371.344C81.1713 371.472 81.3553 371.588 81.6113 371.692C81.8673 371.788 82.2313 371.884 82.7033 371.98C83.7993 372.22 84.5873 372.532 85.0673 372.916C85.5553 373.3 85.7993 373.824 85.7993 374.488C85.7993 375.288 85.4873 375.924 84.8633 376.396C84.2393 376.86 83.3713 377.092 82.2593 377.092ZM87.158 368.44H91.034C91.978 368.44 92.71 368.668 93.23 369.124C93.758 369.58 94.022 370.2 94.022 370.984C94.022 371.76 93.758 372.38 93.23 372.844C92.702 373.3 91.97 373.528 91.034 373.528H89.03V376.984H87.158V368.44ZM90.794 372.1C91.77 372.1 92.258 371.732 92.258 370.996C92.258 370.252 91.77 369.88 90.794 369.88H89.03V372.1H90.794ZM102.468 376.984H100.488L99.3957 374.14C99.3077 373.916 99.1717 373.76 98.9877 373.672C98.8117 373.584 98.5877 373.54 98.3157 373.54H97.1037V376.984H95.2557V368.44H99.0597C100.052 368.44 100.804 368.656 101.316 369.088C101.828 369.52 102.084 370.14 102.084 370.948C102.084 371.516 101.932 372.004 101.628 372.412C101.332 372.82 100.904 373.112 100.344 373.288C100.848 373.392 101.212 373.74 101.436 374.332L102.468 376.984ZM98.7837 372.112C99.3197 372.112 99.7117 372.024 99.9597 371.848C100.208 371.664 100.332 371.38 100.332 370.996C100.332 370.612 100.208 370.332 99.9597 370.156C99.7117 369.972 99.3197 369.88 98.7837 369.88H97.0797V372.112H98.7837ZM103.752 368.44H105.624V376.984H103.752V368.44ZM114.742 368.44V376.984H113.35L109.09 371.536V376.984H107.338V368.44H108.718L112.978 373.876V368.44H114.742ZM118.423 369.964H115.747V368.44H122.995V369.964H120.319V376.984H118.423V369.964ZM127.365 368.44H131.241C132.185 368.44 132.917 368.668 133.437 369.124C133.965 369.58 134.229 370.2 134.229 370.984C134.229 371.76 133.965 372.38 133.437 372.844C132.909 373.3 132.177 373.528 131.241 373.528H129.237V376.984H127.365V368.44ZM131.001 372.1C131.977 372.1 132.465 371.732 132.465 370.996C132.465 370.252 131.977 369.88 131.001 369.88H129.237V372.1H131.001ZM135.463 368.44H137.335V375.46H141.151V376.984H135.463V368.44ZM147.995 375.088H143.999L143.183 376.984H141.299L145.223 368.44H146.735L150.659 376.984H148.811L147.995 375.088ZM147.383 373.66L146.003 370.456L144.623 373.66H147.383ZM158.792 368.44V376.984H157.4L153.14 371.536V376.984H151.388V368.44H152.768L157.028 373.876V368.44H158.792ZM167.91 368.44V376.984H166.518L162.258 371.536V376.984H160.506V368.44H161.886L166.146 373.876V368.44H167.91ZM169.623 368.44H171.495V376.984H169.623V368.44ZM180.613 368.44V376.984H179.221L174.961 371.536V376.984H173.209V368.44H174.589L178.849 373.876V368.44H180.613ZM189.658 372.268V376.456C189.242 376.656 188.754 376.812 188.194 376.924C187.642 377.036 187.074 377.092 186.49 377.092C185.586 377.092 184.802 376.916 184.138 376.564C183.474 376.212 182.962 375.708 182.602 375.052C182.25 374.396 182.074 373.612 182.074 372.7C182.074 371.812 182.25 371.04 182.602 370.384C182.962 369.728 183.466 369.224 184.114 368.872C184.77 368.512 185.534 368.332 186.406 368.332C187.022 368.332 187.594 368.416 188.122 368.584C188.658 368.752 189.098 368.988 189.442 369.292L188.842 370.636C188.442 370.348 188.054 370.14 187.678 370.012C187.302 369.884 186.894 369.82 186.454 369.82C184.806 369.82 183.982 370.78 183.982 372.7C183.982 374.66 184.842 375.64 186.562 375.64C187.034 375.64 187.506 375.58 187.978 375.46V373.576H186.298V372.268H189.658Z"
                    fill="white"
                  />
                  <path
                    d="M68.8994 372.707C68.8994 377.71 64.8191 381.772 59.7776 381.772C54.736 381.772 50.6558 377.71 50.6558 372.707C50.6558 367.704 54.736 363.642 59.7776 363.642C64.8191 363.642 68.8994 367.704 68.8994 372.707Z"
                    stroke="white"
                    stroke-width="1.34473"
                    class="number-wrapper"
                  />
                  <path
                    d="M61.6948 374.739V376H57.0151V374.739H58.5683V370.574L57.116 371.431V370.05L59.2239 368.819H60.1416V374.739H61.6948Z"
                    fill="white"
                    class="number"
                  />
                </g>
                <g class="step step-2" data-step="2">
                  <path
                    fill-rule="evenodd"
                    clip-rule="evenodd"
                    d="M356.073 396.42C425.402 396.42 484.984 354.933 511.071 295.565L510.946 295.562L495.616 272.9L466.679 277.192C448.651 318.488 407.746 347.153 356.073 350.262L235.483 348.919L251.215 371.466L235.463 396.756L352.24 396.42V396.377C353.513 396.404 354.79 396.42 356.073 396.42Z"
                    fill="#4196F2"
                    class="background"
                  />
                  <path
                    d="M349.757 368.395L351.308 368.423L351.131 376.945L349.579 376.917L349.757 368.395Z"
                    fill="white"
                  />
                  <path
                    d="M361.582 368.309L361.779 376.83L360.408 376.864L360.286 371.575L358.135 376.922L357.113 376.948L354.707 371.776L354.828 377.006L353.457 377.04L353.26 368.52L354.487 368.489L357.587 375.08L360.355 368.34L361.582 368.309Z"
                    fill="white"
                  />
                  <path
                    d="M363.962 368.175L367.666 367.861C368.585 367.783 369.319 367.946 369.868 368.348C370.416 368.742 370.722 369.32 370.785 370.084C370.849 370.847 370.64 371.473 370.158 371.963C369.683 372.451 368.99 372.734 368.079 372.811L365.921 372.994L366.217 376.536L364.671 376.667L363.962 368.175ZM367.8 371.634C368.335 371.588 368.73 371.447 368.984 371.209C369.245 370.963 369.358 370.633 369.324 370.219C369.289 369.798 369.126 369.491 368.837 369.3C368.546 369.1 368.129 369.023 367.586 369.069L365.608 369.237L365.822 371.801L367.8 371.634Z"
                    fill="white"
                  />
                  <path
                    d="M372.332 367.419L373.871 367.212L374.837 374.399L378.808 373.864L378.977 375.122L373.468 375.864L372.332 367.419Z"
                    fill="white"
                  />
                  <path
                    d="M379.297 366.451L384.93 365.414L385.151 366.614L381.01 367.377L381.438 369.695L385.331 368.978L385.553 370.178L381.659 370.896L382.114 373.355L386.255 372.592L386.477 373.793L380.844 374.83L379.297 366.451Z"
                    fill="white"
                  />
                  <path
                    d="M394.717 363.086L396.795 371.349L395.465 371.682L394.175 366.553L393.258 372.234L392.266 372.482L388.773 367.966L390.048 373.037L388.718 373.37L386.64 365.107L387.83 364.809L392.316 370.558L393.527 363.384L394.717 363.086Z"
                    fill="white"
                  />
                  <path
                    d="M396.978 362.421L402.431 360.67L402.807 361.832L398.797 363.119L399.523 365.362L403.292 364.152L403.668 365.313L399.899 366.524L400.669 368.903L404.678 367.616L405.054 368.777L399.601 370.528L396.978 362.421Z"
                    fill="white"
                  />
                  <path
                    d="M410.77 357.495L413.91 365.416L412.835 365.839L406.334 361.977L408.535 367.529L407.191 368.057L404.051 360.135L405.126 359.713L411.611 363.568L409.415 358.027L410.77 357.495Z"
                    fill="white"
                  />
                  <path
                    d="M415.2 356.886L412.676 358.078L412.13 356.932L418.603 353.876L419.149 355.021L416.614 356.218L419.736 362.766L418.321 363.434L415.2 356.886Z"
                    fill="white"
                  />
                  <path
                    d="M426.97 356.772L423.297 358.78L423.503 360.945L422.131 361.695L421.41 352.376L422.518 351.77L430.047 357.368L428.685 358.113L426.97 356.772ZM425.937 355.972L422.79 353.531L423.172 357.484L425.937 355.972Z"
                    fill="white"
                  />
                  <path
                    d="M428.448 349.789L426.084 351.27L425.405 350.198L431.468 346.398L432.147 347.47L429.773 348.958L433.656 355.088L432.331 355.918L428.448 349.789Z"
                    fill="white"
                  />
                  <path
                    d="M432.627 345.569L433.903 344.687L438.79 351.673L437.515 352.556L432.627 345.569Z"
                    fill="white"
                  />
                  <path
                    d="M443.865 348.014C443.224 348.534 442.552 348.851 441.85 348.968C441.149 349.073 440.46 348.978 439.784 348.683C439.108 348.377 438.487 347.877 437.921 347.185C437.36 346.499 436.999 345.799 436.84 345.086C436.675 344.366 436.719 343.679 436.97 343.024C437.227 342.364 437.679 341.771 438.327 341.247C438.975 340.723 439.647 340.405 440.343 340.294C441.045 340.177 441.731 340.275 442.4 340.586C443.07 340.886 443.685 341.379 444.247 342.065C444.813 342.757 445.179 343.463 445.343 344.183C445.503 344.896 445.459 345.584 445.213 346.245C444.963 346.9 444.513 347.49 443.865 348.014ZM443.084 347.059C443.701 346.56 444.008 345.962 444.007 345.264C444.006 344.567 443.684 343.826 443.042 343.041C442.404 342.262 441.745 341.804 441.063 341.668C440.377 341.525 439.725 341.703 439.108 342.202C438.492 342.701 438.182 343.296 438.178 343.988C438.174 344.679 438.493 345.417 439.136 346.202C439.778 346.987 440.443 347.451 441.129 347.594C441.816 347.737 442.467 347.559 443.084 347.059Z"
                    fill="white"
                  />
                  <path
                    d="M448.383 332.761L454.083 339.108L453.22 339.874L445.774 338.49L449.769 342.938L448.69 343.896L442.991 337.548L443.853 336.782L451.282 338.166L447.296 333.726L448.383 332.761Z"
                    fill="white"
                  />
                  <path
                    d="M339.819 372.461C339.771 377.475 335.654 381.51 330.624 381.474C325.595 381.439 321.554 377.347 321.602 372.332C321.649 367.318 325.767 363.283 330.796 363.319C335.826 363.354 339.866 367.447 339.819 372.461Z"
                    stroke="white"
                    stroke-width="1.34473"
                    class="number-wrapper"
                  />
                  <path
                    d="M333.603 374.756L333.591 376.014L328.648 375.979L328.659 374.822L331.079 372.303C331.582 371.77 331.836 371.282 331.84 370.839C331.843 370.557 331.761 370.346 331.594 370.203C331.433 370.055 331.195 369.979 330.878 369.977C330.265 369.973 329.626 370.2 328.961 370.658L328.466 369.527C328.759 369.281 329.131 369.089 329.584 368.952C330.037 368.807 330.496 368.737 330.961 368.74C331.709 368.745 332.3 368.93 332.735 369.296C333.176 369.654 333.394 370.136 333.388 370.739C333.384 371.155 333.293 371.54 333.114 371.895C332.942 372.242 332.652 372.629 332.244 373.056L330.601 374.735L333.603 374.756Z"
                    fill="white"
                    class="number"
                  />
                </g>
                <g class="step step-3" data-step="3">
                  <path
                    fill-rule="evenodd"
                    clip-rule="evenodd"
                    d="M417.797 71.8076L397.216 90.4765L406 119.151C437.828 133.559 462.249 161.318 472.03 195.23L475.491 211.411C476.289 217.019 476.687 222.676 476.684 228.341C476.684 242.389 474.417 255.773 470.176 268.187L499.453 263.274L514.915 286.036C521.531 268.042 525.138 248.611 525.138 228.341C525.141 219.406 524.435 210.827 523.024 201.67L523.047 201.989C522.429 198.927 520.947 191.399 520.227 187.951C507.029 134.751 468.348 91.5241 417.797 71.8076Z"
                    fill="#4196F2"
                    class="background"
                  />
                  <path
                    d="M451.685 119.847C451.999 120.301 452.144 120.765 452.118 121.241C452.099 121.722 451.91 122.181 451.552 122.618C451.057 123.22 450.452 123.519 449.738 123.513C449.036 123.505 448.303 123.192 447.539 122.572L444.321 119.962L450.127 112.892L453.245 115.421C453.976 116.014 454.414 116.646 454.561 117.316C454.713 117.98 454.552 118.6 454.08 119.176C453.775 119.546 453.409 119.79 452.982 119.906C452.566 120.021 452.134 120.002 451.685 119.847ZM448.936 116.889L450.59 118.231C451.48 118.953 452.196 118.983 452.74 118.321C453.012 117.99 453.106 117.652 453.023 117.309C452.94 116.966 452.672 116.611 452.22 116.245L450.567 114.903L448.936 116.889ZM448.215 121.466C448.68 121.843 449.086 122.035 449.435 122.042C449.79 122.055 450.114 121.882 450.408 121.524C450.707 121.16 450.817 120.803 450.74 120.453C450.668 120.109 450.4 119.748 449.935 119.371L448.112 117.892L446.392 119.987L448.215 121.466Z"
                    fill="white"
                  />
                  <path
                    d="M456.857 128.133L453.64 125.04L451.478 125.939L450.276 124.783L459.635 121.085L460.606 122.018L457.208 131.449L456.016 130.303L456.857 128.133ZM457.356 126.829L458.879 122.855L454.934 124.501L457.356 126.829Z"
                    fill="white"
                  />
                  <path
                    d="M460.255 135.034C459.652 134.369 459.268 133.658 459.102 132.9C458.942 132.149 459.003 131.405 459.285 130.67C459.574 129.93 460.073 129.242 460.782 128.607C461.484 127.977 462.218 127.561 462.982 127.358C463.753 127.149 464.503 127.166 465.231 127.408C465.972 127.651 466.644 128.105 467.246 128.769C467.659 129.225 467.973 129.719 468.188 130.249C468.415 130.78 468.521 131.293 468.506 131.788L467.245 132.196C467.218 131.669 467.122 131.204 466.955 130.803C466.8 130.403 466.568 130.031 466.258 129.69C465.667 129.037 464.994 128.722 464.239 128.745C463.49 128.773 462.716 129.145 461.918 129.86C461.113 130.581 460.655 131.313 460.542 132.057C460.435 132.795 460.681 133.493 461.277 134.152C461.587 134.494 461.931 134.765 462.31 134.965C462.7 135.166 463.157 135.307 463.682 135.388L463.143 136.593C462.647 136.556 462.141 136.401 461.627 136.127C461.125 135.854 460.668 135.49 460.255 135.034Z"
                    fill="white"
                  />
                  <path
                    d="M466.997 142.946L467.717 136.977L464.353 139.629L463.323 138.336L470.516 132.667L471.546 133.96L468.323 136.5L474.086 137.146L475.324 138.7L469.105 137.955L468.258 144.529L466.997 142.946Z"
                    fill="white"
                  />
                  <path
                    d="M476.016 139.713L476.971 141.061L470.586 145.535L473.051 149.017L471.934 149.799L468.514 144.969L476.016 139.713Z"
                    fill="white"
                  />
                  <path
                    d="M474.353 153.809C473.888 153.062 473.641 152.311 473.615 151.555C473.6 150.802 473.797 150.088 474.205 149.414C474.626 148.743 475.245 148.155 476.063 147.65C476.873 147.15 477.67 146.863 478.454 146.791C479.245 146.714 479.973 146.851 480.638 147.203C481.307 147.563 481.877 148.119 482.347 148.873C482.817 149.626 483.063 150.378 483.085 151.126C483.112 151.883 482.913 152.593 482.488 153.257C482.074 153.923 481.463 154.507 480.652 155.007C479.835 155.512 479.03 155.803 478.239 155.88C477.455 155.952 476.727 155.815 476.055 155.467C475.391 155.115 474.823 154.562 474.353 153.809ZM475.481 153.112C475.928 153.829 476.525 154.234 477.27 154.326C478.015 154.418 478.851 154.178 479.778 153.605C480.697 153.037 481.278 152.403 481.518 151.703C481.766 150.998 481.666 150.287 481.219 149.569C480.771 148.852 480.179 148.445 479.441 148.349C478.703 148.252 477.871 148.49 476.944 149.063C476.017 149.635 475.429 150.274 475.182 150.979C474.934 151.684 475.034 152.395 475.481 153.112Z"
                    fill="white"
                  />
                  <path
                    d="M485.469 163.215L481.571 165.26C481.193 164.986 480.813 164.616 480.43 164.152C480.048 163.687 479.713 163.183 479.426 162.64C478.986 161.81 478.772 161.002 478.782 160.216C478.793 159.429 479.024 158.71 479.475 158.059C479.927 157.408 480.585 156.855 481.452 156.4C482.303 155.954 483.126 155.729 483.921 155.727C484.716 155.724 485.438 155.933 486.088 156.354C486.742 156.782 487.283 157.4 487.711 158.207C488.01 158.773 488.207 159.345 488.299 159.923C488.396 160.508 488.38 161.047 488.252 161.538L486.917 161.602C487.013 161.07 487.03 160.588 486.967 160.158C486.905 159.729 486.76 159.299 486.532 158.869C486.092 158.039 485.508 157.54 484.779 157.374C484.053 157.214 483.208 157.388 482.243 157.894C481.247 158.416 480.611 159.03 480.334 159.734C480.064 160.435 480.159 161.219 480.618 162.087C480.898 162.615 481.246 163.097 481.662 163.535L483.714 162.458L482.791 160.716L483.851 160.159L485.469 163.215Z"
                    fill="white"
                  />
                  <path
                    d="M486.174 177.146L485.505 175.539L487.877 173.299C488.099 173.096 488.221 172.875 488.242 172.635C488.263 172.396 488.208 172.118 488.077 171.803L487.442 170.279L483.919 171.734L483.289 170.221L491.762 166.721L493.263 170.326C493.661 171.279 493.752 172.091 493.539 172.761C493.325 173.431 492.826 173.928 492.04 174.252C491.477 174.485 490.935 174.534 490.413 174.398C489.903 174.267 489.451 173.964 489.058 173.489C489.162 174.028 488.962 174.531 488.459 174.997L486.174 177.146ZM489.414 171.666C489.654 172.241 489.938 172.623 490.268 172.81C490.597 172.997 490.979 173.001 491.416 172.82C491.844 172.643 492.104 172.374 492.195 172.014C492.298 171.657 492.228 171.188 491.985 170.605L491.192 168.702L488.622 169.763L489.414 171.666Z"
                    fill="white"
                  />
                  <path
                    d="M495.3 175.442L497.301 181.198L496.06 181.626L494.588 177.394L492.191 178.221L493.574 182.199L492.332 182.627L490.949 178.649L488.405 179.527L489.877 183.759L488.635 184.187L486.634 178.432L495.3 175.442Z"
                    fill="white"
                  />
                  <path
                    d="M497.868 183.012L499.518 188.731L498.243 189.097L497.047 184.952L494.633 185.643L495.758 189.542L494.471 189.911L493.346 186.012L489.509 187.112L489.055 185.538L497.868 183.012Z"
                    fill="white"
                  />
                  <path
                    d="M499.901 190.337L500.296 191.94L491.391 194.122L490.996 192.518L499.901 190.337Z"
                    fill="white"
                  />
                  <path
                    d="M502.355 201.71L493.359 203.478L493.122 202.273L498.476 196.211L492.171 197.45L491.874 195.943L500.87 194.174L501.107 195.38L495.764 201.427L502.055 200.19L502.355 201.71Z"
                    fill="white"
                  />
                  <path
                    d="M502.728 204.088L503.546 210.127L502.245 210.304L501.643 205.863L499.13 206.205L499.695 210.379L498.394 210.555L497.829 206.382L495.162 206.744L495.763 211.184L494.462 211.361L493.644 205.323L502.728 204.088Z"
                    fill="white"
                  />
                  <path
                    d="M504.437 220.932L495.296 221.607L495.19 220.151L500.865 219.732L495.016 217.738L494.937 216.653L500.372 213.812L494.762 214.226L494.656 212.771L503.798 212.096L503.892 213.398L496.967 217.055L504.343 219.63L504.437 220.932Z"
                    fill="white"
                  />
                  <path
                    d="M504.5 223.349L504.574 229.444L503.261 229.463L503.207 224.982L500.671 225.019L500.722 229.232L499.409 229.251L499.358 225.038L496.668 225.078L496.723 229.559L495.41 229.579L495.335 223.484L504.5 223.349Z"
                    fill="white"
                  />
                  <path
                    d="M504.243 239L495.085 238.648L495.136 237.42L501.757 232.752L495.339 232.506L495.403 230.97L504.56 231.322L504.51 232.551L497.902 237.205L504.307 237.451L504.243 239Z"
                    fill="white"
                  />
                  <path
                    d="M502.516 243.346L502.792 240.387L504.151 240.51L503.443 248.098L502.084 247.975L502.362 245.004L494.595 244.304L494.749 242.646L502.516 243.346Z"
                    fill="white"
                  />
                  <path
                    d="M439.419 108.295C436.929 112.655 431.363 114.191 426.986 111.724C422.61 109.258 421.08 103.724 423.57 99.3639C426.059 95.0042 431.625 93.4689 436.002 95.9354C440.379 98.4019 441.908 103.936 439.419 108.295Z"
                    stroke="white"
                    stroke-width="1.34473"
                    class="number-wrapper"
                  />
                  <path
                    d="M432.246 104.913C432.55 105.223 432.723 105.564 432.766 105.936C432.819 106.305 432.737 106.679 432.52 107.058C432.207 107.607 431.752 107.922 431.156 108.003C430.56 108.084 429.905 107.923 429.19 107.52C428.756 107.276 428.375 106.98 428.047 106.633C427.722 106.28 427.498 105.926 427.375 105.572L428.375 104.838C428.701 105.555 429.158 106.078 429.743 106.408C430.124 106.623 430.436 106.714 430.679 106.681C430.932 106.646 431.14 106.485 431.303 106.199C431.46 105.925 431.485 105.677 431.38 105.455C431.283 105.231 431.044 105.012 430.664 104.797L429.767 104.292L430.377 103.223L431.124 103.644C431.487 103.849 431.792 103.94 432.038 103.916C432.287 103.887 432.485 103.744 432.631 103.487C432.778 103.23 432.811 102.99 432.729 102.766C432.653 102.546 432.472 102.355 432.185 102.193C431.916 102.042 431.61 101.939 431.269 101.886C430.931 101.826 430.571 101.82 430.188 101.867L430.309 100.638C430.684 100.564 431.103 100.576 431.565 100.675C432.031 100.768 432.472 100.931 432.888 101.166C433.31 101.404 433.639 101.682 433.875 102C434.117 102.322 434.252 102.656 434.278 103.003C434.311 103.353 434.23 103.697 434.037 104.036C433.844 104.374 433.59 104.621 433.277 104.777C432.967 104.926 432.624 104.972 432.246 104.913Z"
                    fill="white"
                    class="number"
                  />
                </g>
                <g class="step step-4" data-step="4">
                  <path
                    fill-rule="evenodd"
                    clip-rule="evenodd"
                    d="M452.914 80.8655C443.849 74.923 434.206 69.7901 424.087 65.5696C431.457 28.6413 463.963 0.565258 503.35 0.0103088C548.626 -0.627656 585.851 35.3469 586.496 80.3603C586.681 92.1996 584.26 103.935 579.403 114.747L589.086 118.766L555.874 127.043L540.841 98.7404L551.341 103.099C555.185 94.8556 556.755 85.7461 555.897 76.7004C555.039 67.6548 551.78 58.9986 546.451 51.6183C541.125 44.2347 533.925 38.3923 525.583 34.682C517.241 30.9751 508.058 29.5347 498.97 30.5118C489.885 31.4889 481.225 34.8466 473.873 40.239C466.517 45.6349 460.739 52.8741 457.122 61.218C454.421 67.4483 453 74.128 452.914 80.8655Z"
                    fill="#4196F2"
                    class="background"
                  />
                  <path
                    d="M465.864 28.19C468.915 32.1772 468.169 37.9026 464.196 40.9781C460.224 44.0535 454.53 43.3139 451.479 39.3268C448.428 35.3396 449.175 29.6142 453.147 26.5387C457.12 23.4633 462.813 24.2029 465.864 28.19Z"
                    stroke="white"
                    stroke-width="1.34473"
                    class="number-wrapper"
                  />
                  <path
                    d="M462.718 34.3634L461.944 34.9624L462.741 36.0035L461.52 36.9483L460.724 35.9071L458.339 37.7534L457.628 36.8244L457.38 31.0732L458.377 30.3013L461.202 33.9933L461.976 33.3944L462.718 34.3634ZM459.982 34.9381L458.609 33.1441L458.738 35.9014L459.982 34.9381Z"
                    fill="white"
                    class="number"
                  />
                  <path
                    d="M469.089 21.7434L471.563 20.3619C472.665 19.7467 473.683 19.5626 474.616 19.8094C475.556 20.0527 476.325 20.7052 476.923 21.767C477.524 22.835 477.686 23.8348 477.408 24.7664C477.132 25.6881 476.444 26.4566 475.342 27.0717L472.868 28.4532L469.089 21.7434ZM474.709 26.1244C476.258 25.2597 476.587 24.0357 475.695 22.4525C474.81 20.8818 473.594 20.5289 472.045 21.3936L470.865 22.0527L473.529 26.7835L474.709 26.1244Z"
                    fill="white"
                  />
                  <path
                    d="M483.802 21.1776L480.301 22.5598L480.246 24.5231L478.939 25.0395L479.322 16.609L480.378 16.1919L486.484 22.0606L485.186 22.573L483.802 21.1776ZM482.968 20.3439L480.426 17.8007L480.332 21.3845L482.968 20.3439Z"
                    fill="white"
                  />
                  <path
                    d="M485.019 14.6104L486.36 14.2275L488.497 21.6262L487.155 22.0091L485.019 14.6104Z"
                    fill="white"
                  />
                  <path
                    d="M488.443 13.6602L489.811 13.3891L491.099 19.8156L494.632 19.1158L494.858 20.2399L489.956 21.2109L488.443 13.6602Z"
                    fill="white"
                  />
                  <path
                    d="M497.334 16.9508L497.649 19.9846L496.261 20.1274L495.946 17.0936L492.357 12.7875L493.938 12.6248L496.514 15.8609L498.382 12.1676L499.963 12.0049L497.334 16.9508Z"
                    fill="white"
                  />
                  <path
                    d="M506.421 20.0315C505.831 19.9919 505.282 19.8756 504.775 19.6825C504.275 19.49 503.855 19.2341 503.515 18.915L504.059 17.9326C504.414 18.2382 504.788 18.473 505.182 18.6367C505.583 18.7937 506.025 18.8884 506.507 18.9208C507.039 18.9565 507.455 18.8905 507.756 18.7228C508.064 18.5556 508.229 18.3029 508.252 17.9648C508.271 17.677 508.149 17.4484 507.886 17.279C507.631 17.1029 507.198 16.9257 506.589 16.7475C505.639 16.4741 504.956 16.1572 504.539 15.7969C504.123 15.4365 503.936 14.9398 503.979 14.3067C504.01 13.8535 504.16 13.4588 504.428 13.1228C504.697 12.7867 505.061 12.5329 505.52 12.3614C505.987 12.1904 506.516 12.1247 507.105 12.1643C507.645 12.2006 508.15 12.3176 508.621 12.5154C509.1 12.7065 509.484 12.9564 509.774 13.2649L509.241 14.2481C508.594 13.6554 507.858 13.3314 507.03 13.2758C506.534 13.2425 506.135 13.3205 505.833 13.5098C505.531 13.6919 505.369 13.9592 505.345 14.3117C505.324 14.6138 505.435 14.8525 505.676 15.0276C505.924 15.2033 506.353 15.3802 506.962 15.5585C507.592 15.7525 508.103 15.953 508.493 16.1599C508.884 16.3596 509.178 16.607 509.375 16.902C509.573 17.1899 509.657 17.5425 509.629 17.9597C509.598 18.4201 509.448 18.8148 509.18 19.1436C508.913 19.4653 508.542 19.7042 508.069 19.8604C507.596 20.0165 507.047 20.0735 506.421 20.0315Z"
                    fill="white"
                  />
                  <path
                    d="M514.016 21.0409C513.271 20.9047 512.648 20.6258 512.147 20.2043C511.652 19.784 511.31 19.2559 511.119 18.62C510.93 17.977 510.908 17.2619 511.053 16.4748C511.197 15.6948 511.472 15.0414 511.877 14.5144C512.284 13.9803 512.792 13.6079 513.403 13.397C514.022 13.1804 514.704 13.1402 515.449 13.2764C515.96 13.3698 516.424 13.5389 516.84 13.7837C517.265 14.0227 517.601 14.3113 517.846 14.6494L517.215 15.5675C516.926 15.2287 516.622 14.9679 516.304 14.7851C515.994 14.5965 515.647 14.4671 515.264 14.3971C514.534 14.2635 513.922 14.3973 513.43 14.7984C512.946 15.2009 512.621 15.8453 512.458 16.7317C512.293 17.6251 512.365 18.3492 512.673 18.904C512.982 19.4518 513.506 19.7931 514.244 19.928C514.627 19.998 514.996 20.0032 515.352 19.9437C515.716 19.8783 516.093 19.7385 516.485 19.5242L516.747 20.6057C516.397 20.8349 515.98 20.9895 515.496 21.0696C515.02 21.1438 514.527 21.1343 514.016 21.0409Z"
                    fill="white"
                  />
                  <path
                    d="M523.723 23.513L522.316 23.0864L522.125 20.3502C522.112 20.0976 522.033 19.9004 521.888 19.7585C521.743 19.6166 521.532 19.5038 521.256 19.4201L519.921 19.0155L518.983 22.0764L517.658 21.6749L519.915 14.3122L523.072 15.2689C523.907 15.522 524.486 15.897 524.809 16.3942C525.131 16.8913 525.188 17.4811 524.979 18.1636C524.829 18.653 524.57 19.0304 524.202 19.2956C523.843 19.556 523.403 19.6865 522.883 19.687C523.29 19.9083 523.511 20.3068 523.546 20.8824L523.723 23.513ZM521.884 18.4802C522.388 18.6328 522.789 18.6527 523.087 18.5397C523.386 18.4268 523.593 18.1807 523.71 17.8016C523.824 17.4293 523.788 17.1169 523.601 16.8645C523.423 16.6073 523.079 16.4013 522.569 16.2465L520.902 15.7415L520.217 17.9751L521.884 18.4802Z"
                    fill="white"
                  />
                  <path
                    d="M527.563 25.2571C526.594 24.827 525.97 24.2542 525.69 23.5385C525.421 22.8192 525.501 21.9794 525.933 21.019L527.811 16.8357L529.067 17.393L527.157 21.6454C526.885 22.2505 526.82 22.7739 526.962 23.2154C527.106 23.6503 527.459 23.9921 528.019 24.2408C528.566 24.4836 529.052 24.5101 529.477 24.3202C529.909 24.1332 530.259 23.7404 530.528 23.1418L532.438 18.8894L533.693 19.4467L531.815 23.6301C531.386 24.5838 530.809 25.1995 530.084 25.477C529.359 25.7546 528.518 25.6813 527.563 25.2571Z"
                    fill="white"
                  />
                  <path
                    d="M542.305 24.8759L537.749 31.0848L536.751 30.3609L539.579 26.5065L535.096 29.1606L534.352 28.6208L535.484 23.6034L532.688 27.4142L531.69 26.6903L536.246 20.4814L537.139 21.1291L535.72 27.5422L541.412 24.2282L542.305 24.8759Z"
                    fill="white"
                  />
                </g>
                <g class="step step-5" data-step="5">
                  <path
                    fill-rule="evenodd"
                    clip-rule="evenodd"
                    d="M408.429 68.4683C391.945 63.1362 374.349 60.252 356.075 60.252C351.34 60.252 346.655 60.4433 342.018 60.8261L338.58 61.1082L338.526 61.2089C335.909 61.5346 332.241 62.0349 329.695 62.5218C296.077 68.4448 264.246 84.3536 239.578 106.954L246.545 134.028L275.509 139.669C279.528 135.807 283.753 132.211 288.198 129.203C301.815 119.986 316.138 113.64 332.315 110.55L342.91 109.15L342.913 109.154L344.987 108.925L347.831 108.704L347.851 108.7L347.881 108.774L347.932 108.697C350.624 108.519 353.336 108.428 356.075 108.428C369.911 108.428 383.204 110.745 395.582 115.01L386.751 88.0471L408.429 68.4683Z"
                    fill="#4196F2"
                    class="background"
                  />
                  <path
                    d="M311.129 96.3647L309.478 96.9462L307.36 94.475C307.169 94.2437 306.953 94.1114 306.714 94.078C306.474 94.0447 306.193 94.085 305.869 94.199L304.303 94.7506L305.568 98.323L304.014 98.8702L300.97 90.2773L304.674 88.9732C305.653 88.6283 306.473 88.5793 307.134 88.8261C307.795 89.073 308.267 89.5947 308.549 90.3912C308.752 90.9625 308.77 91.5034 308.605 92.014C308.445 92.5137 308.116 92.9464 307.617 93.3121C308.164 93.2371 308.658 93.4614 309.098 93.985L311.129 96.3647ZM305.806 92.8639C306.397 92.6558 306.795 92.3933 307.002 92.0763C307.208 91.7593 307.233 91.3795 307.076 90.937C306.922 90.5025 306.667 90.2306 306.309 90.1211C305.957 90.0008 305.481 90.0461 304.882 90.257L302.927 90.9454L303.851 93.5523L305.806 92.8639Z"
                    fill="white"
                  />
                  <path
                    d="M309.781 87.2433L315.638 85.4419L316.024 86.6897L311.717 88.0142L312.462 90.4241L316.51 89.179L316.896 90.4268L312.847 91.6719L313.638 94.2285L317.944 92.904L318.33 94.1517L312.473 95.9531L309.781 87.2433Z"
                    fill="white"
                  />
                  <path
                    d="M325.558 82.8162L323.911 92.6652L322.603 93.0058L316.352 85.2129L318.021 84.7783L322.752 90.8236L323.926 83.2411L325.558 82.8162Z"
                    fill="white"
                  />
                  <path
                    d="M326.685 82.6175L328.306 82.2584L330.283 91.1587L328.662 91.5178L326.685 82.6175Z"
                    fill="white"
                  />
                  <path
                    d="M330.499 81.7859L336.524 80.6695L336.761 81.9539L332.331 82.7748L332.79 85.2555L336.954 84.4839L337.191 85.7683L333.028 86.5399L333.514 89.1718L337.944 88.3509L338.181 89.6353L332.157 90.7517L330.499 81.7859Z"
                    fill="white"
                  />
                  <path
                    d="M351.639 78.8915L349.347 88.3014L348.004 88.4424L345.041 82.1594L343.396 88.9258L342.052 89.0668L337.906 80.3324L339.582 80.1565L342.557 86.6828L344.228 79.669L345.406 79.5455L348.424 86.1187L350.052 79.058L351.639 78.8915Z"
                    fill="white"
                  />
                  <path
                    d="M292.485 97.8545C295.021 102.171 293.55 107.725 289.195 110.259C284.841 112.793 279.256 111.346 276.719 107.03C274.183 102.714 275.655 97.1598 280.009 94.6255C284.364 92.0913 289.949 93.5384 292.485 97.8545Z"
                    stroke="white"
                    stroke-width="1.34473"
                    class="number-wrapper"
                  />
                  <path
                    d="M283.787 101.898C284.172 101.674 284.562 101.56 284.957 101.555C285.355 101.541 285.724 101.636 286.064 101.842C286.409 102.045 286.698 102.343 286.929 102.736C287.174 103.153 287.291 103.578 287.28 104.011C287.271 104.435 287.134 104.841 286.869 105.228C286.607 105.606 286.234 105.935 285.751 106.217C285.355 106.447 284.924 106.612 284.459 106.712C284 106.808 283.59 106.822 283.229 106.753L283.094 105.527C283.882 105.604 284.564 105.475 285.141 105.139C285.869 104.716 286.044 104.183 285.667 103.541C285.487 103.234 285.249 103.05 284.955 102.988C284.664 102.917 284.355 102.977 284.029 103.166C283.825 103.285 283.64 103.443 283.475 103.64C283.315 103.834 283.193 104.045 283.108 104.273L282.33 104.725L280.184 101.072L284.176 98.749L284.788 99.7902L282.124 101.341L282.934 102.72C283.113 102.399 283.397 102.125 283.787 101.898Z"
                    fill="white"
                    class="number"
                  />
                </g>
                <g class="step step-6" data-step="6">
                  <path
                    d="M235.719 236.088C235.551 233.502 235.466 230.907 235.466 228.308C235.466 221.646 236.02 214.588 237.114 207.51C241.427 183.358 252.815 165.525 260.556 155.724C263.025 152.894 265.585 149.989 268.25 147.112L239.472 142.075L232.319 114.021C232.319 114.021 172.48 165.102 189.143 254.965C191.683 270.733 196.465 286.108 203.395 300.616L184.57 308.742L245.399 321.219L266.838 273.221L247.888 281.403C240.434 265.085 236.79 249.915 235.719 236.088Z"
                    fill="#4196F2"
                    class="background"
                  />
                  <path
                    d="M219.597 253.049L220.056 254.537L217.762 256.33C217.547 256.492 217.42 256.678 217.381 256.89C217.343 257.102 217.368 257.353 217.458 257.645L217.894 259.057L221.143 258.062L221.575 259.463L213.759 261.857L212.73 258.519C212.457 257.636 212.444 256.905 212.69 256.327C212.936 255.748 213.422 255.348 214.146 255.126C214.666 254.967 215.151 254.97 215.603 255.135C216.045 255.295 216.42 255.603 216.729 256.06C216.682 255.571 216.902 255.14 217.388 254.768L219.597 253.049ZM216.259 257.653C216.095 257.12 215.875 256.757 215.598 256.562C215.322 256.367 214.983 256.331 214.58 256.455C214.185 256.576 213.931 256.793 213.82 257.107C213.699 257.415 213.722 257.84 213.888 258.379L214.431 260.142L216.803 259.415L216.259 257.653Z"
                    fill="white"
                  />
                  <path
                    d="M211.061 253.319L209.826 248.008L210.967 247.744L211.875 251.649L214.078 251.139L213.225 247.468L214.365 247.204L215.219 250.875L217.556 250.334L216.648 246.429L217.789 246.164L219.024 251.475L211.061 253.319Z"
                    fill="white"
                  />
                  <path
                    d="M210.375 244.299L210.823 246.919L209.624 247.124L208.475 240.405L209.674 240.2L210.124 242.831L216.98 241.659L217.231 243.128L210.375 244.299Z"
                    fill="white"
                  />
                  <path
                    d="M215.645 231.309L215.818 232.858L213.23 234.198C212.99 234.317 212.83 234.477 212.753 234.678C212.675 234.879 212.653 235.131 212.687 235.435L212.851 236.904L216.226 236.525L216.389 237.982L208.269 238.895L207.882 235.421C207.779 234.503 207.903 233.782 208.253 233.258C208.602 232.735 209.154 232.43 209.906 232.346C210.446 232.285 210.922 232.378 211.334 232.624C211.738 232.863 212.049 233.235 212.267 233.741C212.313 233.252 212.609 232.868 213.155 232.592L215.645 231.309ZM211.508 235.221C211.447 234.667 211.298 234.269 211.063 234.026C210.829 233.783 210.502 233.686 210.084 233.733C209.673 233.779 209.384 233.946 209.216 234.234C209.039 234.515 208.983 234.936 209.045 235.498L209.249 237.332L211.713 237.055L211.508 235.221Z"
                    fill="white"
                  />
                  <path
                    d="M215.571 227.414C215.609 228.2 215.473 228.896 215.165 229.5C214.849 230.097 214.386 230.572 213.775 230.924C213.156 231.268 212.418 231.462 211.563 231.504C210.715 231.547 209.97 231.427 209.328 231.146C208.679 230.864 208.173 230.442 207.809 229.879C207.444 229.308 207.243 228.626 207.205 227.832C207.167 227.039 207.302 226.343 207.611 225.747C207.919 225.142 208.382 224.672 209.002 224.335C209.613 223.99 210.343 223.797 211.191 223.755C212.047 223.712 212.799 223.831 213.448 224.113C214.09 224.394 214.596 224.816 214.968 225.379C215.332 225.942 215.533 226.621 215.571 227.414ZM214.391 227.473C214.354 226.718 214.066 226.143 213.527 225.749C212.987 225.356 212.232 225.183 211.262 225.231C210.299 225.28 209.572 225.526 209.08 225.972C208.581 226.417 208.349 227.018 208.385 227.773C208.422 228.529 208.706 229.104 209.238 229.498C209.77 229.892 210.521 230.065 211.491 230.016C212.462 229.968 213.196 229.721 213.696 229.275C214.195 228.829 214.427 228.229 214.391 227.473Z"
                    fill="white"
                  />
                  <path
                    d="M215.182 220.038C215.166 220.665 215.068 221.251 214.886 221.798C214.704 222.336 214.452 222.793 214.129 223.169L213.063 222.641C213.371 222.25 213.603 221.842 213.759 221.418C213.908 220.985 213.988 220.513 214.001 220.001C214.015 219.436 213.926 218.998 213.735 218.688C213.544 218.371 213.268 218.208 212.909 218.2C212.603 218.194 212.366 218.334 212.199 218.621C212.023 218.9 211.855 219.366 211.694 220.02C211.447 221.039 211.141 221.777 210.778 222.236C210.415 222.694 209.897 222.916 209.224 222.902C208.742 222.891 208.317 222.752 207.949 222.484C207.581 222.216 207.295 221.843 207.093 221.365C206.891 220.879 206.797 220.323 206.813 219.696C206.827 219.123 206.928 218.583 207.117 218.075C207.298 217.559 207.545 217.14 207.859 216.818L208.925 217.334C208.326 218.047 208.016 218.843 207.994 219.722C207.981 220.249 208.082 220.668 208.296 220.978C208.503 221.288 208.793 221.448 209.168 221.456C209.489 221.463 209.737 221.334 209.912 221.071C210.087 220.799 210.255 220.337 210.417 219.683C210.594 219.006 210.783 218.456 210.985 218.032C211.179 217.609 211.428 217.285 211.732 217.063C212.028 216.84 212.398 216.733 212.842 216.743C213.331 216.753 213.756 216.893 214.117 217.16C214.47 217.428 214.74 217.808 214.926 218.301C215.113 218.795 215.198 219.374 215.182 220.038Z"
                    fill="white"
                  />
                  <path
                    d="M207.755 213.875L208.103 210.35C208.189 209.475 208.469 208.814 208.943 208.368C209.41 207.921 210.009 207.732 210.74 207.802C211.47 207.871 212.024 208.174 212.402 208.709C212.78 209.236 212.927 209.933 212.841 210.8L212.639 212.854L216.03 213.177L215.885 214.649L207.755 213.875ZM211.683 210.863C211.733 210.353 211.668 209.959 211.488 209.681C211.301 209.395 211.01 209.233 210.614 209.195C210.21 209.157 209.893 209.257 209.662 209.496C209.423 209.734 209.279 210.112 209.228 210.629L209.042 212.512L211.497 212.746L211.683 210.863Z"
                    fill="white"
                  />
                  <path
                    d="M208.622 205.856L209.514 200.471L210.669 200.658L210.013 204.617L212.243 204.978L212.859 201.256L214.014 201.443L213.397 205.165L215.763 205.548L216.419 201.588L217.574 201.775L216.682 207.16L208.622 205.856Z"
                    fill="white"
                  />
                  <path
                    d="M218.761 196.982C218.576 197.764 218.246 198.409 217.772 198.919C217.299 199.421 216.721 199.758 216.036 199.928C215.344 200.097 214.585 200.085 213.759 199.893C212.94 199.702 212.262 199.38 211.726 198.925C211.182 198.469 210.815 197.913 210.625 197.256C210.43 196.59 210.425 195.867 210.61 195.086C210.737 194.55 210.942 194.068 211.224 193.639C211.501 193.201 211.825 192.86 212.197 192.617L213.135 193.33C212.76 193.62 212.467 193.928 212.256 194.256C212.039 194.574 211.883 194.934 211.788 195.336C211.606 196.103 211.714 196.756 212.112 197.296C212.512 197.829 213.178 198.203 214.108 198.42C215.046 198.638 215.818 198.598 216.423 198.299C217.02 197.998 217.411 197.461 217.594 196.687C217.69 196.286 217.715 195.895 217.672 195.516C217.622 195.128 217.495 194.721 217.289 194.296L218.45 194.072C218.674 194.454 218.815 194.903 218.873 195.419C218.926 195.925 218.889 196.447 218.761 196.982Z"
                    fill="white"
                  />
                  <path
                    d="M213.643 188.63L212.847 191.17L211.686 190.812L213.725 184.298L214.887 184.656L214.088 187.207L220.727 189.251L220.281 190.674L213.643 188.63Z"
                    fill="white"
                  />
                  <path
                    d="M214.263 182.711L214.775 181.322L222.444 184.11L221.931 185.499L214.263 182.711Z"
                    fill="white"
                  />
                  <path
                    d="M218.822 172.478L224.874 179.024L224.394 180.129L215.445 180.256L216.057 178.846L222.935 178.831L218.223 173.856L218.822 172.478Z"
                    fill="white"
                  />
                  <path
                    d="M219.463 171.031L221.999 166.192L223.037 166.729L221.172 170.287L223.177 171.324L224.93 167.979L225.968 168.516L224.215 171.86L226.342 172.96L228.207 169.402L229.245 169.939L226.709 174.778L219.463 171.031Z"
                    fill="white"
                  />
                  <path
                    d="M221.304 268.348C226.251 267.363 231.052 270.548 232.034 275.451C233.016 280.353 229.81 285.131 224.863 286.116C219.916 287.1 215.115 283.916 214.133 279.013C213.151 274.11 216.357 269.332 221.304 268.348Z"
                    stroke="white"
                    stroke-width="1.34473"
                    class="number-wrapper"
                  />
                  <path
                    d="M222.564 276.798C222.482 276.389 222.507 276.004 222.641 275.641C222.766 275.274 222.986 274.966 223.3 274.719C223.606 274.466 223.98 274.296 224.422 274.208C224.877 274.117 225.307 274.141 225.712 274.28C226.116 274.412 226.457 274.642 226.736 274.97C227.013 275.292 227.198 275.684 227.29 276.145C227.473 277.061 227.311 277.826 226.803 278.442C226.295 279.057 225.481 279.476 224.359 279.699C223.587 279.852 222.9 279.866 222.299 279.739C221.69 279.613 221.194 279.359 220.808 278.977C220.423 278.594 220.169 278.096 220.046 277.484C219.959 277.049 219.944 276.613 220 276.177C220.057 275.741 220.182 275.353 220.374 275.013L221.584 275.297C221.247 275.98 221.136 276.606 221.249 277.172C221.342 277.634 221.602 277.955 222.029 278.137C222.45 278.321 223.023 278.354 223.747 278.238C223.453 278.139 223.202 277.962 222.993 277.709C222.777 277.451 222.634 277.147 222.564 276.798ZM226.1 276.474C226.037 276.158 225.885 275.928 225.643 275.784C225.4 275.634 225.111 275.592 224.774 275.659C224.425 275.728 224.169 275.875 224.008 276.099C223.841 276.324 223.789 276.598 223.854 276.921C223.917 277.238 224.074 277.474 224.325 277.629C224.568 277.78 224.858 277.821 225.194 277.754C225.524 277.689 225.775 277.536 225.946 277.296C226.111 277.058 226.162 276.784 226.1 276.474Z"
                    fill="white"
                    class="number"
                  />
                </g>
              </g>
              <defs>
                <filter
                  id="filter0_d_4698_4314"
                  x="-9"
                  y="340.247"
                  width="259.933"
                  height="66.519"
                  filterUnits="userSpaceOnUse"
                  color-interpolation-filters="sRGB"
                >
                  <feFlood flood-opacity="0" result="BackgroundImageFix" />
                  <feColorMatrix
                    in="SourceAlpha"
                    type="matrix"
                    values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
                    result="hardAlpha"
                  />
                  <feOffset dy="1" />
                  <feGaussianBlur stdDeviation="4.5" />
                  <feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.15 0" />
                  <feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_4698_4314" />
                  <feBlend
                    mode="normal"
                    in="SourceGraphic"
                    in2="effect1_dropShadow_4698_4314"
                    result="shape"
                  />
                </filter>
                <clipPath id="clip0_4698_4314">
                  <rect width="655" height="410" fill="white" />
                </clipPath>
              </defs>
            </svg>
          </div>
        </div>
      </div>
    </section>
    .activities-sprint-section {
      padding-top: 0;
      padding-bottom: 60px;
    }
    .activities-sprint-section .section-title {
      margin-bottom: 20px;
      font-weight: 800;
      text-align: left;
      text-transform: unset;
    }
    .activities-sprint-section .section-title::after {
      text-align: left;
      left: 0;
      transform: translateX(0);
    }
    .activities-sprint-section .section-body {
      display: flex;
    }
    .activities-sprint-section .section-body .section-left {
      padding-top: 100px;
      width: calc(100% - 655px);
      display: flex;
      flex-direction: column;
      justify-content: space-between;
    }
    .activities-sprint-section .section-body .section-right {
      width: 655px;
    }
    .activities-sprint-section .sprint-step .step-title {
      margin-bottom: 8px;
      font-size: var(--font-md-3);
      font-weight: 800;
      text-transform: uppercase;
    }
    .activities-sprint-section .sprint-step .step-description {
      font-size: var(--font-md);
      font-weight: 400;
    }
    .activities-sprint-section .slides-container {
      margin-bottom: 24px;
    }
    html:lang(ja) .activities-sprint-section .slides-container {
      padding-right: 30px;
    }
    .activities-sprint-section .slide-dots {
      display: flex;
    }
    .activities-sprint-section .slide-dot {
      margin-right: 8px;
      width: 8px;
      height: 8px;
      transition: all 0.3s;
      border-radius: 4px;
      background-color: var(--gray-border);
      cursor: pointer;
    }
    .activities-sprint-section .slide-dot.active {
      width: 32px;
      background-color: var(--secondary-color);
    }
    .activities-sprint-section .slide-arrows {
      margin-bottom: 27px;
      display: flex;
      display: none;
    }
    html:lang(ja) .activities-sprint-section .slide-arrows {
      margin-top: 27px;
      margin-bottom: 0;
    }
    .activities-sprint-section .slide-arrows .arrow {
      cursor: pointer;
    }
    .activities-sprint-section .slide-arrows .arrow .grey {
      display: none;
    }
    .activities-sprint-section .slide-arrows .arrow.disable .grey {
      display: initial;
    }
    .activities-sprint-section .slide-arrows .arrow.disable .light {
      display: none;
    }
    .activities-sprint-section .slide-arrows .arrow-back {
      margin-right: 26px;
    }
    
    @media screen and (max-width: 1120px) {
      .activities-sprint-section .section-body .section-left {
        padding-top: 20px;
        width: 45%;
      }
      .activities-sprint-section .section-body .section-right {
        width: 55%;
      }
      .activities-sprint-section .slide-arrows {
        display: none;
      }
    }
    @media screen and (max-width: 1100px) {
      .activities-sprint-section .section-body .section-left {
        z-index: 1;
      }
    }
    
    @media screen and (max-width: 834px) {
      .activities-sprint-section .section-body {
        flex-direction: column;
      }
      .activities-sprint-section .section-body .section-left {
        margin-bottom: 24px;
        padding-top: 0;
        width: 100%;
      }
      .activities-sprint-section .section-body .section-right {
        width: 100%;
      }
    }
    
    @media screen and (max-width: 414px) {
      .activities-sprint-section .section-body {
        flex-direction: column;
      }
      .activities-sprint-section .section-title {
        margin-bottom: 16px;
        font-size: var(--font-lg);
      }
      .activities-sprint-section .sprint-step .step-title {
        font-size: var(--font-md-2);
      }
      .activities-sprint-section .slides-container {
        margin-bottom: 16px;
      }
    }
        function activitiesSprintSlider() {
          const sprintSlider = document.querySelector('.slides-sprint');
          if(sprintSlider) {
            $(sprintSlider).slick({
              autoplay: true,
              autoplaySpeed: 2000,
              arrows: false,
              infinite: true,
              dots: false,
              pauseOnHover: false,
              pauseOnFocus: false,
              pauseOnDotsHover: false
            });
            $(sprintSlider).on('touchcancel touchmove', e => {
              $(sprintSlider).slick('slickPlay');
            });
            $(sprintSlider).on('beforeChange', (event, slick, currentSlide, nextSlide) => {
              if (nextSlide === 0) {
                document.querySelector('.activities-sprint-section .arrow-back').classList.add('disable');
              } else {
                document.querySelector('.activities-sprint-section .arrow-back').classList.remove('disable');
              }
              if (nextSlide === 6) {
                document.querySelector('.activities-sprint-section .arrow-next').classList.add('disable');
              } else {
                document.querySelector('.activities-sprint-section .arrow-next').classList.remove('disable');
              }
              document.querySelectorAll('.activities-sprint-section .slide-dot').forEach(e => {
                let stepActive = +e.dataset['step'];
                if (stepActive === nextSlide) {
                  e.classList.add('active');
                } else {
                  e.classList.remove('active');
                }
              })
              document.querySelectorAll('.sprint-lyfecycle g.step').forEach(e => {
                let stepActive = +e.dataset['step'];
                if (stepActive === nextSlide) {
                  e.classList.add('active');
                } else {
                  e.classList.remove('active');
                }
              })
            });
            $('.activities-sprint-section .slide-dot').click(e => {
              let stepActive = +e.target.dataset['step'];
              $(sprintSlider).slick('slickGoTo', stepActive);
              document.querySelectorAll('.activities-sprint-section .slide-dot').forEach(e => {
                e.classList.remove('active');
              })
              e.target.classList.add('active');
            });
            $('.sprint-lyfecycle g.step').click(e => {
              let stepActive = +e.currentTarget.dataset['step'];
              $(sprintSlider).slick('slickGoTo', stepActive);
              document.querySelectorAll('.sprint-lyfecycle g.step').forEach(e => {
                e.classList.remove('active');
              })
              e.currentTarget.classList.add('active');
            });
            $('.activities-sprint-section .arrow-back .light').click(e => {
              $(sprintSlider).slick('slickPrev');
            })
            $('.activities-sprint-section .arrow-next .light').click(e => {
              $(sprintSlider).slick('slickNext');
            })
          }
        }
        activitiesSprintSlider();
  • karate

    karate

    Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry’s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.

  • boxing

    boxing

    Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry’s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.

  • Custom Input

    Custom Input

    Trong quá trình phát triển UI. Tôi thường xuyên làm responsive cho trang từ PC, Tablet và Mobile. Đặc biệt là tôi đều cố gắng xử lý cho cả trường hợp khi mà user resize từ PC cho tới tận Moblie.

    Tôi gặp một vấn đề đó là khi nội dung trong text-placehoder của thẻ input rất dài thì chúng ta sẽ muốn hiện thị dấu ba chấm.

    Tuy nhiên ở một số trường hợp device mobile, đặc biệt là các thiết bị hệ điều hành iOS thì sẽ không nhận được thuộc tính ellipsis, cụ thể là đoạn code sau:

    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    
      useEffect(() => {
        document.querySelectorAll('pre[class^="brush:"]').forEach((el) => {
          const lang = el.className.replace('brush: ', '').trim();
          el.className = '';
          const code = document.createElement('code');
          code.className = `language-${lang}`;
          code.innerHTML = el.innerHTML;
          el.innerHTML = '';
          el.appendChild(code);
        });
      
        Prism.highlightAll();
      }, [blogDetail]);
    
    
      --font-xs: 12px;
      --font-sm: 14px;
      --font-md: 16px;
      --font-md-2: 18px;
      --font-md-3: 20px;
      --font-md-4: 22px;
      --font-lg: 24px;
      --font-lg-2: 28px;
      --font-xl: 30px;
      --font-xxl: 32px;
      --font-xxxl: 36px;
      --font-4xl: 46px;
      --font-5xl: 60px;
      --font-heading-large: 52px;
      --font-heading-medium: 40px;
    

    Vì vậy trong trường hợp này chúng ta phải xử lý bằng JS để giả lập một thẻ div có chức năng giống với thẻ input. Mục đích chỉ là giả lập thuộc tính placehoder.

    Dưới đây là cách tôi thực hiện.

  • scuba diving

    scuba diving

    Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry’s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.

  • rattan

    rattan

    Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry’s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.