From 4abf32dd4ed2207dfd1cf44db22b37396708d7df Mon Sep 17 00:00:00 2001 From: muhammad-ahmed Date: Tue, 26 Nov 2024 13:07:54 +0800 Subject: [PATCH 1/8] ahmed/DAPI-816/feat--add-deriv-fix-and-redesign-webpage --- .../Home/About/__tests__/About.test.tsx | 16 ++ src/features/Home/About/index.tsx | 28 ++ .../Home/ApiFeatures/ApiFeatures.module.scss | 68 ----- src/features/Home/ApiFeatures/ApiFeatures.tsx | 76 ------ .../__tests__/ApiFeatures.test.tsx | 63 ----- .../Home/Benefits/Benefits.module.scss | 141 ---------- src/features/Home/Benefits/Benefits.tsx | 112 -------- .../Home/Benefits/__tests__/Benefits.test.tsx | 35 +-- src/features/Home/Benefits/index.tsx | 65 +++++ .../Home/Carousel/Carousel.module.scss | 17 -- src/features/Home/Carousel/Carousel.tsx | 52 ---- .../NextButton/NextButton.module.scss | 16 -- .../Home/Carousel/NextButton/index.tsx | 16 -- .../PrevButton/PrevButton.module.scss | 15 -- .../Home/Carousel/PrevButton/index.tsx | 16 -- .../SlideContent/SlideContent.module.scss | 18 -- .../Carousel/SlideContent/SlideContent.tsx | 24 -- .../Home/Carousel/__tests__/Carousel.test.tsx | 94 ------- src/features/Home/Carousel/swiper-custom.scss | 19 -- .../ClientLibraries.module.scss | 76 ------ .../Home/ClientLibraries/ClientLibraries.tsx | 82 ------ .../__tests__/ClientLibraries.test.tsx | 28 +- src/features/Home/ClientLibraries/index.tsx | 49 ++++ .../Home/Features/__tests__/Features.test.tsx | 16 ++ src/features/Home/Features/constant.ts | 43 +++ src/features/Home/Features/index.tsx | 36 +++ .../Home/GetStarted/GetStarted.module.scss | 127 --------- src/features/Home/GetStarted/GetStarted.tsx | 85 ------ .../GetStarted/__tests__/GetStarted.test.tsx | 31 --- src/features/Home/GetStarted/index.tsx | 124 +++++++++ .../Home/HeroHeader/HeroHeader.module.scss | 90 +++---- src/features/Home/HeroHeader/HeroHeader.tsx | 33 --- .../HeroHeader/__tests__/HeroHeader.test.tsx | 14 +- src/features/Home/HeroHeader/index.tsx | 34 +++ src/features/Home/ProductInfo/constant.ts | 26 ++ src/features/Home/ProductInfo/index.tsx | 55 ++++ .../Home/WaysToEarn/WaysToEarn.module.scss | 63 ----- src/features/Home/WaysToEarn/WaysToEarn.tsx | 72 ----- .../WaysToEarn/__tests__/WaysToEarn.test.tsx | 28 -- src/features/Home/__tests__/index.test.tsx | 2 +- src/features/Home/index.tsx | 55 ++-- src/features/Home/styles.module.scss | 236 +++++++++++++++- src/styles/index.scss | 1 + static/img/banner-homepage.jpeg | Bin 0 -> 321176 bytes static/img/banner-homepage.jpg | Bin 213973 -> 0 bytes static/img/customization.svg | 32 +++ static/img/derivFix.svg | 134 +++++++++ static/img/easy-integration.svg | 22 ++ static/img/fast-execution.svg | 36 +++ static/img/getStarted.png | Bin 0 -> 2630577 bytes static/img/number_1.svg | 3 + static/img/number_2.svg | 3 + static/img/number_3.svg | 3 + static/img/websocket.svg | 159 +++++++++++ static/img/who_we_are.svg | 254 ++++++++++++++++++ 55 files changed, 1447 insertions(+), 1496 deletions(-) create mode 100644 src/features/Home/About/__tests__/About.test.tsx create mode 100644 src/features/Home/About/index.tsx delete mode 100644 src/features/Home/ApiFeatures/ApiFeatures.module.scss delete mode 100644 src/features/Home/ApiFeatures/ApiFeatures.tsx delete mode 100644 src/features/Home/ApiFeatures/__tests__/ApiFeatures.test.tsx delete mode 100644 src/features/Home/Benefits/Benefits.module.scss delete mode 100644 src/features/Home/Benefits/Benefits.tsx create mode 100644 src/features/Home/Benefits/index.tsx delete mode 100644 src/features/Home/Carousel/Carousel.module.scss delete mode 100644 src/features/Home/Carousel/Carousel.tsx delete mode 100644 src/features/Home/Carousel/NextButton/NextButton.module.scss delete mode 100644 src/features/Home/Carousel/NextButton/index.tsx delete mode 100644 src/features/Home/Carousel/PrevButton/PrevButton.module.scss delete mode 100644 src/features/Home/Carousel/PrevButton/index.tsx delete mode 100644 src/features/Home/Carousel/SlideContent/SlideContent.module.scss delete mode 100644 src/features/Home/Carousel/SlideContent/SlideContent.tsx delete mode 100644 src/features/Home/Carousel/__tests__/Carousel.test.tsx delete mode 100644 src/features/Home/Carousel/swiper-custom.scss delete mode 100644 src/features/Home/ClientLibraries/ClientLibraries.module.scss delete mode 100644 src/features/Home/ClientLibraries/ClientLibraries.tsx create mode 100644 src/features/Home/ClientLibraries/index.tsx create mode 100644 src/features/Home/Features/__tests__/Features.test.tsx create mode 100644 src/features/Home/Features/constant.ts create mode 100644 src/features/Home/Features/index.tsx delete mode 100644 src/features/Home/GetStarted/GetStarted.module.scss delete mode 100644 src/features/Home/GetStarted/GetStarted.tsx delete mode 100644 src/features/Home/GetStarted/__tests__/GetStarted.test.tsx create mode 100644 src/features/Home/GetStarted/index.tsx delete mode 100644 src/features/Home/HeroHeader/HeroHeader.tsx create mode 100644 src/features/Home/HeroHeader/index.tsx create mode 100644 src/features/Home/ProductInfo/constant.ts create mode 100644 src/features/Home/ProductInfo/index.tsx delete mode 100644 src/features/Home/WaysToEarn/WaysToEarn.module.scss delete mode 100644 src/features/Home/WaysToEarn/WaysToEarn.tsx delete mode 100644 src/features/Home/WaysToEarn/__tests__/WaysToEarn.test.tsx create mode 100644 static/img/banner-homepage.jpeg delete mode 100644 static/img/banner-homepage.jpg create mode 100644 static/img/customization.svg create mode 100644 static/img/derivFix.svg create mode 100644 static/img/easy-integration.svg create mode 100644 static/img/fast-execution.svg create mode 100644 static/img/getStarted.png create mode 100644 static/img/number_1.svg create mode 100644 static/img/number_2.svg create mode 100644 static/img/number_3.svg create mode 100644 static/img/websocket.svg create mode 100644 static/img/who_we_are.svg diff --git a/src/features/Home/About/__tests__/About.test.tsx b/src/features/Home/About/__tests__/About.test.tsx new file mode 100644 index 000000000..079c23cc5 --- /dev/null +++ b/src/features/Home/About/__tests__/About.test.tsx @@ -0,0 +1,16 @@ +import React from 'react'; +import { cleanup, render, screen } from '@site/src/test-utils'; +import ClientLibraries from '..'; + +describe('ClientLibraries', () => { + beforeEach(() => { + render(); + }); + + afterEach(cleanup); + + it('should render properly', () => { + const client_header = screen.getByTestId('about_section'); + expect(client_header).toBeInTheDocument(); + }); +}); diff --git a/src/features/Home/About/index.tsx b/src/features/Home/About/index.tsx new file mode 100644 index 000000000..120c01499 --- /dev/null +++ b/src/features/Home/About/index.tsx @@ -0,0 +1,28 @@ +import React from 'react'; +import { Button, Heading, Text } from '@deriv-com/quill-ui'; +import styles from '../styles.module.scss'; +import Translate from '@docusaurus/Translate'; + +const About = () => { + return ( +
+
+
+ + Who we are + + + + Join over 2.5 million traders who have chosen Deriv as their trusted broker. + + +
+ +
+
+ ); +}; + +export default About; diff --git a/src/features/Home/ApiFeatures/ApiFeatures.module.scss b/src/features/Home/ApiFeatures/ApiFeatures.module.scss deleted file mode 100644 index 4c496e88a..000000000 --- a/src/features/Home/ApiFeatures/ApiFeatures.module.scss +++ /dev/null @@ -1,68 +0,0 @@ -@use 'src/styles/utility' as *; -.FeaturesContainer { - font-family: var(--ibm-font-family-base); - display: flex; - width: 100%; - align-items: center; - justify-content: center; - flex-wrap: wrap; - gap: rem(2); - - > img { - padding: 0 rem(2); - } - - .ApiFeaturesImage { - display: inline-block; - width: rem(70); - } - - .FeatureText { - width: rem(48.6); - padding: 0 rem(1); - box-sizing: border-box; - display: flex; - flex-direction: column; - - header { - display: flex; - flex-direction: column; - gap: rem(2); - @media screen and (max-width: 992px) { - > h2 { - text-align: center; - } - } - } - - @media (min-width: 500px) { - margin-left: rem(4); - } - .FeatureParagraph { - font-weight: 400; - line-height: rem(3); - } - .FeatureList { - margin-left: rem(-2); - font-weight: 400; - padding-left: rem(2); - @media screen and (max-width: 992px) { - font-size: rem(1.4); - } - - .FeatureOptions { - align-items: center; - list-style-type: none; - display: flex; - flex-direction: row; - gap: rem(0.4); - margin: rem(1.6) 0; - - .FeatureContent { - margin-bottom: 0; - margin-left: rem(1); - } - } - } - } -} diff --git a/src/features/Home/ApiFeatures/ApiFeatures.tsx b/src/features/Home/ApiFeatures/ApiFeatures.tsx deleted file mode 100644 index cf82c3373..000000000 --- a/src/features/Home/ApiFeatures/ApiFeatures.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import React from 'react'; -import { Text } from '@deriv/ui'; -import styles from './ApiFeatures.module.scss'; -import Translate, { translate } from '@docusaurus/Translate'; - -export const ApiFeatures = () => { - return ( -
-
-
- - Deriv API features - - - - Deriv API gives you full access to all the trading functionalities of DTrader and - allows you to build your own comprehensive trading systems and analysis tools. - - - - With our API, you'll be able to: - -
-
-
    -
  • - -
    - Trade digital options and multipliers -
    -
  • -
  • - -
    - Monitor real-time pricing -
    -
  • -
  • - -
    - Buy/sell contracts -
    -
  • -
  • - -
    - {"Manage user's accounts"} -
    -
  • -
  • - -
    - Monitor existing contracts -
    -
  • -
  • - -
    - {"View user's historical transactions"} -
    -
  • -
-
-
- {translate({ -
- ); -}; diff --git a/src/features/Home/ApiFeatures/__tests__/ApiFeatures.test.tsx b/src/features/Home/ApiFeatures/__tests__/ApiFeatures.test.tsx deleted file mode 100644 index 8daf3e335..000000000 --- a/src/features/Home/ApiFeatures/__tests__/ApiFeatures.test.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import React from 'react'; -import { cleanup, render, RenderResult, screen, within } from '@site/src/test-utils'; -import { ApiFeatures } from '../ApiFeatures'; - -describe('ApiFeatures', () => { - let render_result: RenderResult; - beforeEach(() => { - render_result = render(); - }); - - afterEach(cleanup); - - it('should render properly', () => { - const api_features = screen.getByTestId('api-features'); - expect(api_features).toBeInTheDocument(); - }); - it('should render title properly', () => { - const api_heading = screen.getByRole('heading', { level: 1 }); - expect(api_heading).toHaveTextContent('Deriv API features'); - }); - it('should render title properly', () => { - const api_text = screen.getByRole('definition'); - expect(api_text).toHaveTextContent( - 'Deriv API gives you full access to all the trading functionalities of DTrader and allows you to build your own comprehensive trading systems and analysis tools.', - ); - }); - it('should render subtitle text properly', () => { - const note_text = screen.getByRole('note'); - expect(note_text).toHaveTextContent("With our API, you'll be able to:"); - }); - it('should render list properly', () => { - const api_list = screen.getByRole('list'); - expect(api_list).toBeInTheDocument(); - const api_list_items = api_list.childElementCount; - expect(api_list_items).toBe(6); - }); - it('should render list items properly', () => { - const api_list = screen.getByRole('list'); - const { getAllByRole } = within(api_list); - const list_items = getAllByRole('listitem'); - expect(list_items.length).toBe(6); - }); - - it('should render list items texts properly', () => { - const api_list = screen.getByRole('list'); - const { getAllByRole } = within(api_list); - const list_items = getAllByRole('listitem'); - const contents = list_items.map((item) => item.textContent); - expect(contents).toEqual([ - 'Trade digital options and multipliers', - 'Monitor real-time pricing', - 'Buy/sell contracts', - "Manage user's accounts", - 'Monitor existing contracts', - "View user's historical transactions", - ]); - }); - - it('should render feature image', () => { - const image = screen.getByTestId('api-features-img'); - expect(image).toBeInTheDocument(); - }); -}); diff --git a/src/features/Home/Benefits/Benefits.module.scss b/src/features/Home/Benefits/Benefits.module.scss deleted file mode 100644 index da85facac..000000000 --- a/src/features/Home/Benefits/Benefits.module.scss +++ /dev/null @@ -1,141 +0,0 @@ -@use 'src/styles/utility' as *; -@use 'src/styles/mixins' as *; - -.BenefitsContainer { - font-family: var(--ibm-font-family-base); - width: 100%; - - .Heading { - margin-bottom: rem(4); - padding: 0 rem(2); - } - - .BenefitsIcons { - width: 100%; - flex-wrap: nowrap; - margin-bottom: rem(6.4); - gap: rem(20); - display: flex; - justify-content: center; - padding: 0 rem(1); - - @media screen and (max-width: 992px) { - margin-top: rem(3); - gap: rem(8.8); - } - - @media screen and (max-width: 500px) { - flex-direction: column; - gap: rem(3); - } - } - - .BenefitsInformation { - display: flex; - flex-wrap: wrap; - flex-direction: column; - justify-content: space-evenly; - width: 100%; - gap: rem(4); - margin: 0 auto; - - img { - margin-bottom: rem(4); - } - - @media screen and (max-width: 992px) { - flex-wrap: wrap; - width: 90%; - - div { - width: 100%; - } - - img { - height: auto; - } - } - .InformationContainer { - display: flex; - width: 100%; - justify-content: center; - align-items: center; - gap: rem(6); - @media screen and (max-width: 992px) { - > img { - width: 100%; - } - } - &:first-child { - flex-direction: row-reverse; - } - .InformationContent { - width: rem(46.8); - > h3 { - margin-bottom: rem(0.8); - } - > p { - line-height: rem(3.6); - font-size: rem(2.4); - } - - .headingSize { - font-size: rem(3.2); - } - } - @media screen and (max-width: 992px) { - flex-direction: column; - &:first-child { - flex-direction: column-reverse; - } - .InformationContent { - width: 100%; - - > h3 { - margin-bottom: rem(0.8); - font-size: rem(2.4); - } - > p { - line-height: rem(3.6); - font-size: rem(1.8); - } - } - } - } - } -} - -.SingleIconContainer { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - @media screen and (max-width: 992px) { - > figcaption { - font-size: var(--fontSizes-sm); - } - } - - .BenefitsImage { - background-size: contain; - display: inline-block; - width: rem(4); - height: rem(4.2); - margin: rem(0.8); - } -} - -.InformationImage { - background-size: 100% auto; - background-repeat: no-repeat; - background-position: center; - width: rem(48.6); - height: rem(26); - @media screen and (max-width: 992px) { - max-width: rem(48.6); - height: rem(22); - } - @media screen and (min-width: 320px) and (max-width: 375px) { - height: rem(15); - } -} diff --git a/src/features/Home/Benefits/Benefits.tsx b/src/features/Home/Benefits/Benefits.tsx deleted file mode 100644 index 603016173..000000000 --- a/src/features/Home/Benefits/Benefits.tsx +++ /dev/null @@ -1,112 +0,0 @@ -import React from 'react'; -import { Text } from '@deriv/ui'; -import styles from './Benefits.module.scss'; -import Translate, { translate } from '@docusaurus/Translate'; - -type TBenefitsIcon = { - icon: string; - text: string; - alt: string; -}; - -const BenefitsIcon = ({ icon, text, alt }: TBenefitsIcon) => { - return ( -
- {alt} - - {text} - -
- ); -}; - -const ImageContainer = ({ image, alt }: { image: string; alt: string }) => { - return ( - {alt} - ); -}; - -export const Benefits = () => { - return ( -
-
- - Benefits of using Deriv API - -
- - - -
-
-
-
- -
- - Personalise your trading - - - - Personalise your trading apps to match your needs. Create charts and views the way - you like them. Develop your trading app using any common programming language and - extend your trading opportunities. - - -
-
-
- -
- - Build a business and earn more - - - - Create your own trading apps by taking advantage of the power of Deriv's - trading services. Share your apps with fellow traders or customers, and get a chance - to earn more or build your own business. - - -
-
-
-
- ); -}; diff --git a/src/features/Home/Benefits/__tests__/Benefits.test.tsx b/src/features/Home/Benefits/__tests__/Benefits.test.tsx index 1793259b2..8f9f6d271 100644 --- a/src/features/Home/Benefits/__tests__/Benefits.test.tsx +++ b/src/features/Home/Benefits/__tests__/Benefits.test.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { cleanup, render, screen } from '@site/src/test-utils'; -import { Benefits } from '../Benefits'; +import Benefits from '..'; describe('Benefits', () => { beforeEach(() => { @@ -10,38 +10,7 @@ describe('Benefits', () => { afterEach(cleanup); it('should render the component', () => { - const benefits = screen.getByTestId('benefits'); + const benefits = screen.getByTestId('benefits_section'); expect(benefits).toBeInTheDocument(); }); - it('should render benefits icons', () => { - const automation = screen.getByText(/automation/i); - const integration = screen.getByText(/integration/i); - const execution = screen.getByText(/execution/i); - - expect(automation).toBeInTheDocument(); - expect(integration).toBeInTheDocument(); - expect(execution).toBeInTheDocument(); - }); - it('should render personalise your trading information', () => { - const title = screen.getByText(/Personalise your trading$/i); - const information = screen.getByText(/create charts and views/i); - - expect(title).toBeInTheDocument(); - expect(information).toBeInTheDocument(); - }); - it('should render build a business information', () => { - const title = screen.getByText(/build a business and earn more/i); - const information = screen.getByText(/create your own trading apps/i); - - expect(title).toBeInTheDocument(); - expect(information).toBeInTheDocument(); - }); - it('should render personalise image', () => { - const image = screen.getByTestId('personalisation'); - expect(image).toBeInTheDocument(); - }); - it('should render business image', () => { - const image = screen.getByTestId('build-business'); - expect(image).toBeInTheDocument(); - }); }); diff --git a/src/features/Home/Benefits/index.tsx b/src/features/Home/Benefits/index.tsx new file mode 100644 index 000000000..7b7929504 --- /dev/null +++ b/src/features/Home/Benefits/index.tsx @@ -0,0 +1,65 @@ +import React from 'react'; +import { Heading, Text } from '@deriv-com/quill-ui'; +import Translate, { translate } from '@docusaurus/Translate'; +import styles from '../styles.module.scss'; +import clsx from 'clsx'; +import useDeviceType from '@site/src/hooks/useDeviceType'; + +type TBenefitsIcon = { + icon: string; + text: string; + alt: string; + description: string; +}; + +const BenefitsIcon = ({ icon, text, alt, description }: TBenefitsIcon) => { + return ( +
+ {alt} + {text} + {description} +
+ ); +}; + +const Benefits = () => { + const { deviceType } = useDeviceType(); + const isMobile = deviceType === 'mobile'; + + return ( +
+ + Benefits of Deriv API + +
+ + + +
+
+ ); +}; + +export default Benefits; \ No newline at end of file diff --git a/src/features/Home/Carousel/Carousel.module.scss b/src/features/Home/Carousel/Carousel.module.scss deleted file mode 100644 index a91c31e5e..000000000 --- a/src/features/Home/Carousel/Carousel.module.scss +++ /dev/null @@ -1,17 +0,0 @@ -@use 'src/styles/utility' as *; - -.carouselComponent { - .carouselHeading { - margin-bottom: rem(6); - padding: 0 rem(2.5); - } - - .carouselContainer { - display: flex; - flex-direction: row; - width: fit-content; - margin: 0 auto; - align-items: center; - overflow: visible; - } -} diff --git a/src/features/Home/Carousel/Carousel.tsx b/src/features/Home/Carousel/Carousel.tsx deleted file mode 100644 index 355ac8bde..000000000 --- a/src/features/Home/Carousel/Carousel.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import React from 'react'; -import { Text } from '@deriv/ui'; -import { Swiper, SwiperSlide } from 'swiper/react'; -import { SlideContent } from './SlideContent/SlideContent'; -import NextButton from './NextButton'; -import PrevButton from './PrevButton'; -import styles from './Carousel.module.scss'; -import './swiper-custom.scss'; -import Translate from '@docusaurus/Translate'; - -export const Carousel = () => { - return ( -
-
- - See what our clients say - -
-
- - -
- - - - - - - - - -
- -
-
-
- ); -}; diff --git a/src/features/Home/Carousel/NextButton/NextButton.module.scss b/src/features/Home/Carousel/NextButton/NextButton.module.scss deleted file mode 100644 index 0207bf13b..000000000 --- a/src/features/Home/Carousel/NextButton/NextButton.module.scss +++ /dev/null @@ -1,16 +0,0 @@ -@use 'src/styles/utility' as *; - -.next { - width: rem(2); - height: rem(2); - cursor: pointer; - position: absolute; - top: 50%; - transform: translateY(-50%); - z-index: 2; - background: url(/img/arrow_right.svg) no-repeat; - background-size: rem(2); - background-position: center; - overflow: auto; - right: 0; -} diff --git a/src/features/Home/Carousel/NextButton/index.tsx b/src/features/Home/Carousel/NextButton/index.tsx deleted file mode 100644 index ef1d675c1..000000000 --- a/src/features/Home/Carousel/NextButton/index.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import React from 'react'; -import { useSwiper } from 'swiper/react'; -import styles from './NextButton.module.scss'; - -const NextButton = () => { - const swiper = useSwiper(); - return ( -
swiper.slideNext()} - data-testid='carousel-arrow-next' - /> - ); -}; - -export default NextButton; diff --git a/src/features/Home/Carousel/PrevButton/PrevButton.module.scss b/src/features/Home/Carousel/PrevButton/PrevButton.module.scss deleted file mode 100644 index 3277b94a4..000000000 --- a/src/features/Home/Carousel/PrevButton/PrevButton.module.scss +++ /dev/null @@ -1,15 +0,0 @@ -@use 'src/styles/utility' as *; - -.prev { - width: rem(2); - height: rem(2); - cursor: pointer; - position: absolute; - top: 50%; - transform: translateY(-50%); - z-index: 2; - background: url(/img/arrow_left.svg) no-repeat; - background-size: rem(2); - background-position: center; - left: 0; -} diff --git a/src/features/Home/Carousel/PrevButton/index.tsx b/src/features/Home/Carousel/PrevButton/index.tsx deleted file mode 100644 index 13f1676af..000000000 --- a/src/features/Home/Carousel/PrevButton/index.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import React from 'react'; -import { useSwiper } from 'swiper/react'; -import styles from './PrevButton.module.scss'; - -const PrevButton = () => { - const swiper = useSwiper(); - return ( -
swiper.slidePrev()} - data-testid='carousel-arrow-prev' - /> - ); -}; - -export default PrevButton; diff --git a/src/features/Home/Carousel/SlideContent/SlideContent.module.scss b/src/features/Home/Carousel/SlideContent/SlideContent.module.scss deleted file mode 100644 index e83ce0d18..000000000 --- a/src/features/Home/Carousel/SlideContent/SlideContent.module.scss +++ /dev/null @@ -1,18 +0,0 @@ -@use 'src/styles/utility' as *; -.sliderContent { - text-align: left; - border-left: none; - - &:after { - box-sizing: border-box; - content: '\201c'; - position: absolute; - font-size: rem(17); - font-weight: 700; - z-index: -1; - left: 0; - top: rem(-8); - color: var(--colors-blue100); - opacity: 56%; - } -} diff --git a/src/features/Home/Carousel/SlideContent/SlideContent.tsx b/src/features/Home/Carousel/SlideContent/SlideContent.tsx deleted file mode 100644 index 8d28a3934..000000000 --- a/src/features/Home/Carousel/SlideContent/SlideContent.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import React from 'react'; -import { Text } from '@deriv/ui'; -import styles from './SlideContent.module.scss'; - -type TSlideContent = { - name: React.ReactNode; - name_info: React.ReactNode; - content: React.ReactNode; -}; - -export const SlideContent = ({ name, name_info, content }: TSlideContent) => ( - -
- - {content} - -
-

- - {name}, {name_info} - -

-
-); diff --git a/src/features/Home/Carousel/__tests__/Carousel.test.tsx b/src/features/Home/Carousel/__tests__/Carousel.test.tsx deleted file mode 100644 index c5a7f485a..000000000 --- a/src/features/Home/Carousel/__tests__/Carousel.test.tsx +++ /dev/null @@ -1,94 +0,0 @@ -import React from 'react'; -import { Carousel } from '../Carousel'; -import { cleanup, render, screen } from '@site/src/test-utils'; -import userEvent from '@testing-library/user-event'; - -const mockSlidePrev = jest.fn(); -const mockSlideNext = jest.fn(); - -jest.mock('swiper/react', () => ({ - ...jest.requireActual('swiper/react'), - useSwiper: jest.fn().mockImplementation(() => { - return { - slidePrev: mockSlidePrev, - slideNext: mockSlideNext, - }; - }), -})); - -describe('Homepage carousel', () => { - beforeEach(() => { - render(); - }); - - afterEach(() => { - cleanup(); - jest.clearAllMocks(); - }); - - it('Should render the carousel', () => { - const carousel = screen.getByTestId('carousel-component'); - expect(carousel).toBeInTheDocument(); - }); - - it('Should render the title', () => { - const title = screen.getByText(/See what our clients say/i); - expect(title).toBeInTheDocument(); - }); - - it('Should render previous arrow', () => { - const prev_arrow = screen.getByTestId('carousel-arrow-prev'); - expect(prev_arrow).toBeInTheDocument(); - }); - - it('Should render next arrow', () => { - const prev_arrow = screen.getByTestId('carousel-arrow-next'); - expect(prev_arrow).toBeInTheDocument(); - }); - - it('Should render Alessandro slide', () => { - const alessandro_slide = screen.getAllByText(/is one of the best APIs in the trading market/i); - expect(alessandro_slide[0]).toBeInTheDocument(); - }); - - it('Should render Thiago slide', () => { - const thiago_slide = screen.getAllByText(/Probably the best API for making your business/i); - expect(thiago_slide[0]).toBeInTheDocument(); - }); - - it('Should render Josh slide', () => { - const josh_slide = screen.getAllByText(/I have been using the deriv API for 13 years/i); - expect(josh_slide[0]).toBeInTheDocument(); - }); - - it('Should show author Alessandro', () => { - const alessandro = screen.getAllByText(/Alessandro, CEO | Italy/i); - expect(alessandro[0]).toBeInTheDocument(); - }); - - it('Should show author Thiago', () => { - const thiago = screen.getAllByText(/Thiago, entrepreneur | brazil/i); - expect(thiago[0]).toBeInTheDocument(); - }); - - it('Should show author Josh', () => { - const josh = screen.getAllByText(/josh, trader | australia/i); - expect(josh[0]).toBeInTheDocument(); - }); - - it('Should go to prev slide on arrow left click', async () => { - const leftArrow = screen.getByTestId('carousel-arrow-prev'); - - await userEvent.click(leftArrow); - - expect(mockSlidePrev).toHaveBeenCalledTimes(1); - }); - - it('Should go to next slide on arrow right click', async () => { - const rightArrow = screen.getByTestId('carousel-arrow-next'); - - await userEvent.click(rightArrow); - - expect(mockSlideNext).toHaveBeenCalledTimes(1); - }); -}); diff --git a/src/features/Home/Carousel/swiper-custom.scss b/src/features/Home/Carousel/swiper-custom.scss deleted file mode 100644 index bf282895c..000000000 --- a/src/features/Home/Carousel/swiper-custom.scss +++ /dev/null @@ -1,19 +0,0 @@ -@use 'src/styles/utility' as *; -@use 'swiper/scss'; - -.swiper { - min-width: rem(32); - max-width: rem(58.6); - text-align: center; - cursor: pointer; - .swiper-slide { - height: auto; - display: flex; - flex-direction: column; - justify-content: space-between; - align-items: center; - span { - font-size: rem(1.4); - } - } -} diff --git a/src/features/Home/ClientLibraries/ClientLibraries.module.scss b/src/features/Home/ClientLibraries/ClientLibraries.module.scss deleted file mode 100644 index 9286338d6..000000000 --- a/src/features/Home/ClientLibraries/ClientLibraries.module.scss +++ /dev/null @@ -1,76 +0,0 @@ -@use 'src/styles/utility' as *; - -.ClientLibrary { - background-repeat: no-repeat; - background-position: center; - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - width: 100%; - background-size: auto; - - .Heading { - margin: rem(1) 0; - padding: 0 rem(2); - } - .SubText { - font-family: var(--ibm-font-family-base); - text-align: center; - font-size: rem(2.4); - font-weight: 400; - margin: rem(2) 0; - padding: 0 rem(2); - @media (max-width: 992px) { - text-align: center; - font-size: rem(1.8); - line-height: rem(2.6); - } - } - .IconJS { - display: flex; - justify-content: center; - background-repeat: no-repeat; - background-position: center; - } - - .LibraryLogo { - display: flex; - justify-content: space-between; - - @media (max-width: 992px) { - justify-content: center; - flex-wrap: wrap; - } - - .LogoAndLink { - padding: rem(1) rem(2); - - .LibraryGoTo { - display: flex; - flex-wrap: wrap; - align-items: center; - color: var(--ifm-color-danger); - gap: rem(1); - - label { - cursor: pointer; - } - - .LibraryChevron { - background-repeat: no-repeat; - background-position: center; - width: rem(1.2); - height: rem(1.2); - margin-left: rem(0.5); - } - } - } - } -} - -@media screen and (max-width: 400px) { - .Link { - max-width: 260px; - } -} diff --git a/src/features/Home/ClientLibraries/ClientLibraries.tsx b/src/features/Home/ClientLibraries/ClientLibraries.tsx deleted file mode 100644 index 7f5f5d89f..000000000 --- a/src/features/Home/ClientLibraries/ClientLibraries.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import React from 'react'; -import { Text } from '@deriv/ui'; -import styles from './ClientLibraries.module.scss'; -import Translate from '@docusaurus/Translate'; - -export const ClientLibraries = () => { - return ( - - ); -}; diff --git a/src/features/Home/ClientLibraries/__tests__/ClientLibraries.test.tsx b/src/features/Home/ClientLibraries/__tests__/ClientLibraries.test.tsx index 41642df25..5d99923a4 100644 --- a/src/features/Home/ClientLibraries/__tests__/ClientLibraries.test.tsx +++ b/src/features/Home/ClientLibraries/__tests__/ClientLibraries.test.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { cleanup, render, screen } from '@site/src/test-utils'; -import { ClientLibraries } from '../ClientLibraries'; +import ClientLibraries from '..'; describe('ClientLibraries', () => { beforeEach(() => { @@ -10,31 +10,7 @@ describe('ClientLibraries', () => { afterEach(cleanup); it('should render properly', () => { - const client_header = screen.getByTestId('client-header'); + const client_header = screen.getByTestId('client_section'); expect(client_header).toBeInTheDocument(); }); - it('should render title properly', () => { - const client_text = screen.getByText('Comprehensive all-in-one client library'); - expect(client_text).toBeInTheDocument(); - }); - it('should render subtitle text properly', () => { - const regex = - /Simplify your development processes and get your app up and running\s*faster with the client library of your choice\./i; - - expect(screen.getByText(regex)).toBeInTheDocument(); - }); - it('should navigate to the correct links on click', () => { - expect(screen.getByText('Go to the JavaScript library').closest('a')).toHaveAttribute( - 'href', - 'https://deriv-com.github.io/deriv-api/', - ); - expect(screen.getByText('Go to the Python library').closest('a')).toHaveAttribute( - 'href', - 'https://deriv-com.github.io/python-deriv-api/', - ); - expect(screen.getByText('Go to the Flutter library').closest('a')).toHaveAttribute( - 'href', - 'https://github.com/deriv-com/flutter-deriv-api', - ); - }); }); diff --git a/src/features/Home/ClientLibraries/index.tsx b/src/features/Home/ClientLibraries/index.tsx new file mode 100644 index 000000000..acb3f56db --- /dev/null +++ b/src/features/Home/ClientLibraries/index.tsx @@ -0,0 +1,49 @@ +import React from 'react'; +import { Heading, Text } from '@deriv-com/quill-ui'; +import styles from '../styles.module.scss'; +import Translate from '@docusaurus/Translate'; + +const ClientLibraries = () => { + return ( +
+ + Comprehensive all-in-one library + + + + Supports JavaScript, Python, and Flutter: Pick the language that fits your app best. + + + +
+ ); +}; + +export default ClientLibraries; diff --git a/src/features/Home/Features/__tests__/Features.test.tsx b/src/features/Home/Features/__tests__/Features.test.tsx new file mode 100644 index 000000000..6eaf129b1 --- /dev/null +++ b/src/features/Home/Features/__tests__/Features.test.tsx @@ -0,0 +1,16 @@ +import React from 'react'; +import { cleanup, render, screen } from '@site/src/test-utils'; +import Features from '..'; + +describe('ClientLibraries', () => { + beforeEach(() => { + render(); + }); + + afterEach(cleanup); + + it('should render properly', () => { + const client_header = screen.getByTestId('feature_section'); + expect(client_header).toBeInTheDocument(); + }); +}); diff --git a/src/features/Home/Features/constant.ts b/src/features/Home/Features/constant.ts new file mode 100644 index 000000000..fb365e0e2 --- /dev/null +++ b/src/features/Home/Features/constant.ts @@ -0,0 +1,43 @@ +import { translate } from "@docusaurus/Translate"; + +export const webSocketFeatures = [ + { + title: translate({ message: 'Real-time data' }), + description: translate({ message: 'Get real-time data updates for your trading platform.' }), + }, + { + title: translate({ message: 'Multiple connections' }), + description: translate({ message: 'Connect multiple clients to the same server.' }), + }, + { + title: translate({ message: 'Multiple streams' }), + description: translate({ message: 'Stream multiple data types simultaneously.' }), + }, + { + title: translate({ message: 'Multiple connections' }), + description: translate({ message: 'Connect multiple clients to the same server.' }), + }, + { + title: translate({ message: 'Multiple streams' }), + description: translate({ message: 'Stream multiple data types simultaneously.' }), + }, + ]; + + export const derivFixFeatures = [ + { + title: translate({ message: 'High-frequency trading' }), + description: translate({ message: 'Trade with minimal latency for high-frequency trading.' }), + }, + { + title: translate({ message: 'High-stakes trading' }), + description: translate({ message: 'Trade with high stakes and high volumes.' }), + }, + { + title: translate({ message: 'Customisable' }), + description: translate({ message: 'Customise your trading experience.' }), + }, + { + title: translate({ message: 'Secure' }), + description: translate({ message: 'Trade with peace of mind.' }), + }, + ]; \ No newline at end of file diff --git a/src/features/Home/Features/index.tsx b/src/features/Home/Features/index.tsx new file mode 100644 index 000000000..8502bcd6e --- /dev/null +++ b/src/features/Home/Features/index.tsx @@ -0,0 +1,36 @@ +import React from 'react'; +import { Heading, Text } from '@deriv-com/quill-ui'; +import styles from '../styles.module.scss'; + +type FeaturesProps = { + title: string; + description: string; + features?: { + title: string; + description: string; + }[]; +}; + +const Features = (props: FeaturesProps) => { + const { title, description } = props; + + return ( +
+ {title} + {description} + +
+ {props.features?.map((feature, idx) => ( +
+ {feature.title} + {feature.description} +
+ ))} +
+
+ ); +}; + +export default Features; diff --git a/src/features/Home/GetStarted/GetStarted.module.scss b/src/features/Home/GetStarted/GetStarted.module.scss deleted file mode 100644 index ddc770b4e..000000000 --- a/src/features/Home/GetStarted/GetStarted.module.scss +++ /dev/null @@ -1,127 +0,0 @@ -@use 'src/styles/utility' as *; - -.mainPageRow { - display: flex; - flex-direction: column; - width: 100%; - height: fit-content; - flex-wrap: wrap; - align-items: center; - justify-content: center; - - .columnContainer { - font-family: var(--ibm-font-family-base); - display: flex; - flex-direction: column; - flex-wrap: nowrap; - width: 100%; - align-items: center; - justify-content: center; - - .getStartedHeading { - text-align: center; - padding: 0 rem(2.5) rem(4) rem(2.5); - } - - .termConditions { - padding: 0 rem(2.5); - @media screen and (max-width: 992px) { - font-size: rem(1.2); - } - } - - .cardContainer { - display: flex; - flex-direction: row; - margin-bottom: rem(4); - gap: rem(2.4); - @media screen and (max-width: 992px) { - flex-direction: column; - gap: rem(2); - } - } - .mainPageCard { - display: flex; - flex-direction: column; - gap: rem(2.7); - width: 100%; - max-width: rem(31.6); - padding: rem(3.2) rem(2.4); - border-radius: 4px; - box-shadow: 0 rem(0.7) rem(1.3) 0 rgb(14, 14, 14, 0.1); - background-color: var(--ifm-color-white); - font-size: rem(1.6); - line-height: 1.5; - color: var(--ifm-color-black); - margin-bottom: 0; - position: relative; - transition: box-shadow 0.2s; - - section { - display: flex; - flex-direction: column; - gap: rem(0.8); - - > p { - font-family: var(--ibm-font-family-base); - @media screen and (max-width: 992px) { - font-size: rem(1.4); - } - } - } - - .cardIcon { - width: rem(4.5); - } - - .arrowIcon { - display: flex; - justify-content: end; - > img { - width: rem(0.8); - } - } - - &:hover { - text-decoration: none; - box-shadow: 0 rem(0.2) rem(0.2) 0 rgb(0, 0, 0, 0.3); - } - - .header { - display: flex; - width: 100%; - justify-content: space-between; - .guideIcon, - .signUpIcon, - .registerYourAppIcon { - width: rem(3.2); - height: rem(3.2); - background-repeat: no-repeat; - background-position: center; - } - } - .arrow { - display: flex; - position: absolute; - justify-content: end; - bottom: rem(2); - right: rem(2); - } - .arrowMiddle { - display: flex; - position: relative; - justify-content: end; - top: rem(1.5); - } - } - } -} - -.guideIcon, -.signUpIcon, -.registerYourAppIcon { - width: rem(3.2); - height: rem(3.2); - background-repeat: no-repeat; - background-position: center; -} diff --git a/src/features/Home/GetStarted/GetStarted.tsx b/src/features/Home/GetStarted/GetStarted.tsx deleted file mode 100644 index bd9358ef1..000000000 --- a/src/features/Home/GetStarted/GetStarted.tsx +++ /dev/null @@ -1,85 +0,0 @@ -import React from 'react'; -import styles from './GetStarted.module.scss'; -import { Text } from '@deriv/ui'; -import Link from '@docusaurus/Link'; -import Translate from '@docusaurus/Translate'; - -export const GetStarted = () => { - return ( -
-
- - Get started with our API in 3 simple steps: - - - - By using our API, you confirm that you have read and agreed to our - - {' '} - terms and conditions. - - -
-
- ); -}; diff --git a/src/features/Home/GetStarted/__tests__/GetStarted.test.tsx b/src/features/Home/GetStarted/__tests__/GetStarted.test.tsx deleted file mode 100644 index c8cbcb8b2..000000000 --- a/src/features/Home/GetStarted/__tests__/GetStarted.test.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import React from 'react'; -import { cleanup, render, screen } from '@site/src/test-utils'; -import { GetStarted } from '../GetStarted'; - -describe('GetStarted', () => { - beforeEach(() => { - render(); - }); - - afterEach(cleanup); - - it('should render properly', () => { - const get_started = screen.getByTestId('started-header'); - expect(get_started).toBeInTheDocument(); - }); - it('should render title properly', () => { - const started_header = screen.getByRole('heading', { level: 2, name: /Get started with/ }); - expect(started_header).toHaveTextContent('Get started with our API in 3 simple steps:'); - }); - it('should navigate to the correct links on click', () => { - expect(screen.getByTestId('signUp').closest('a')).toHaveAttribute( - 'href', - 'https://deriv.com/signup/', - ); - expect(screen.getByTestId('register').closest('a')).toHaveAttribute('href', '/dashboard'); - expect(screen.getByTestId('guide').closest('a')).toHaveAttribute( - 'href', - 'https://developers.deriv.com', - ); - }); -}); diff --git a/src/features/Home/GetStarted/index.tsx b/src/features/Home/GetStarted/index.tsx new file mode 100644 index 000000000..14fa2decc --- /dev/null +++ b/src/features/Home/GetStarted/index.tsx @@ -0,0 +1,124 @@ +import React from 'react'; +import { Text, Heading, Button } from '@deriv-com/quill-ui'; +import styles from '../styles.module.scss'; +import Translate, { translate } from '@docusaurus/Translate'; + +const GetStarted = () => { + const [isWebsocket, setIsWebsocket] = React.useState(true); + + const handleBtnClick = (is_websocket) => setIsWebsocket(is_websocket); + + const getStartedSteps = { + websocket: [ + { + title: `${translate({ message: 'Sign up and explore' })}`, + description: `${translate({ + message: 'Lorem Ipsum is simply dummy text of the printing and typesetting industry.', + })}`, + }, + { + title: `${translate({ message: 'Sign up and explore' })}`, + description: `${translate({ + message: 'Lorem Ipsum is simply dummy text of the printing and typesetting industry.', + })}`, + }, + { + title: `${translate({ message: 'Sign up and explore' })}`, + description: `${translate({ + message: 'Lorem Ipsum is simply dummy text of the printing and typesetting industry.', + })}`, + }, + ], + derivFIX: [ + { + title: `${translate({ message: 'Sign up and explore' })}`, + description: `${translate({ + message: 'Lorem Ipsum is simply dummy text of the printing and typesetting industry.', + })}`, + }, + { + title: `${translate({ message: 'Sign up and explore' })}`, + description: `${translate({ + message: 'Lorem Ipsum is simply dummy text of the printing and typesetting industry.', + })}`, + }, + { + title: `${translate({ message: 'Sign up and explore' })}`, + description: `${translate({ + message: 'Lorem Ipsum is simply dummy text of the printing and typesetting industry.', + })}`, + }, + ], + }; + + const renderSteps = () => { + const steps = isWebsocket ? getStartedSteps.websocket : getStartedSteps.derivFIX; + + return ( + + {steps.map((step, idx) => ( +
+
+ {translate({ +
+
+
+ {step.title} + {step.description} +
+
+ ))} + + ); + }; + + return ( +
+ {translate({ +
+
+ + +
+ + How to get started + + {renderSteps()} +
+ +
+
+
+ ); +}; + +export default GetStarted; diff --git a/src/features/Home/HeroHeader/HeroHeader.module.scss b/src/features/Home/HeroHeader/HeroHeader.module.scss index 7099d13e3..410673439 100644 --- a/src/features/Home/HeroHeader/HeroHeader.module.scss +++ b/src/features/Home/HeroHeader/HeroHeader.module.scss @@ -1,70 +1,48 @@ @use 'src/styles/utility' as *; +@use 'src/styles/mixins' as *; -.HeroImageStyle { - background-image: linear-gradient(rgba(0, 0, 0, 0.16), rgba(0, 0, 0, 0.16)), - url(/img/banner-homepage.jpg); - background-position: center; - object-fit: cover; - background-repeat: no-repeat; - background-size: cover; - width: 100%; - height: rem(60); +.heroContainer { display: flex; - justify-content: center; align-items: center; - padding-top: rem(4); + height: 95svh; + min-height: rem(50); + background-image: linear-gradient(to right, rgb(0 0 0 / 80%), rgb(0 0 0 / 0%)), + url(/img/banner-homepage.jpeg); + background-position: center; + background-size: cover; + background-attachment: fixed; - @media screen and (max-width: 992px) { - padding-top: unset; + .description { + width: 50%; + margin-bottom: rem(4); } - @media screen and (min-width: 320px) and (max-width: 500px) { - height: rem(35); - } - .HeroContainerStyle { + .heroBtnContainer { display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - padding: rem(16) 0; - width: 100%; + gap: rem(1); + } - @media screen and (max-width: 992px) { - width: 100%; - padding: rem(8) rem(4); - } - .heading { - color: var(--ifm-color-white); - @media screen and (max-width: 992px) { - font-size: rem(3.2); - } - } + .heroTitle, + .description { + color: var(--solid-slate-50); + } - .SubHeading { - color: var(--ifm-color-white); - font-weight: 400; - font-family: var(--ibm-font-family-base); - @media screen and (max-width: 992px) { - text-align: center; - font-size: rem(1.6); - margin-top: rem(0.8); - } + @include mobile-sm { + background-repeat: no-repeat; + background-position-x: 73%; + background-image: linear-gradient(to top, rgb(0 0 0), rgb(0 0 0 / 0%)), + url(/img/banner-homepage.jpeg); + align-items: flex-end; + + .heroBtnContainer { + flex-direction: column; + margin-bottom: 3rem; } - .HeroButton { - display: flex; - flex-direction: row; - justify-content: center; - align-items: center; - margin-top: rem(1.6); - padding: rem(1) rem(1.6); - width: rem(13.6); - height: rem(2.6); - background: #ff444f; - border-radius: rem(1.5); - font-size: rem(1.6); - @media screen { - font-size: rem(1.4); - } + + .heroTitle, + .description { + width: 100%; + text-align: center; } } } diff --git a/src/features/Home/HeroHeader/HeroHeader.tsx b/src/features/Home/HeroHeader/HeroHeader.tsx deleted file mode 100644 index c53ee8045..000000000 --- a/src/features/Home/HeroHeader/HeroHeader.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import React from 'react'; -import { Button, Text } from '@deriv/ui'; -import styles from './HeroHeader.module.scss'; -import Translate from '@docusaurus/Translate'; - -export const HeroHeader = () => { - return ( -
-
- - Deriv API - - - Use our powerful, flexible, and free API to build a custom trading{' '} -
- platform - for yourself or for your business. -
- - - -
-
- ); -}; diff --git a/src/features/Home/HeroHeader/__tests__/HeroHeader.test.tsx b/src/features/Home/HeroHeader/__tests__/HeroHeader.test.tsx index d35b738f6..e7b97612e 100644 --- a/src/features/Home/HeroHeader/__tests__/HeroHeader.test.tsx +++ b/src/features/Home/HeroHeader/__tests__/HeroHeader.test.tsx @@ -1,6 +1,6 @@ import React from 'react'; import { cleanup, render, screen } from '@site/src/test-utils'; -import { HeroHeader } from '../HeroHeader'; +import HeroHeader from '..'; beforeEach(() => { render(); @@ -13,16 +13,4 @@ describe('HeroHeader', () => { const hero_header = screen.getByTestId('hero-header'); expect(hero_header).toBeInTheDocument(); }); - - it('should render hero title properly', () => { - const hero_title = screen.getByRole('heading', { level: 2 }); - expect(hero_title).toHaveTextContent('Deriv API'); - }); - - it('should render hero subtitle text properly', () => { - const hero_subtitle = screen.getByTestId('hero-header-subtitle'); - expect(hero_subtitle).toHaveTextContent( - 'Use our powerful, flexible, and free API to build a custom trading platform - for yourself or for your business.', - ); - }); }); diff --git a/src/features/Home/HeroHeader/index.tsx b/src/features/Home/HeroHeader/index.tsx new file mode 100644 index 000000000..03a9ce0e9 --- /dev/null +++ b/src/features/Home/HeroHeader/index.tsx @@ -0,0 +1,34 @@ +import React from 'react'; +import { Button, Heading, Text } from '@deriv-com/quill-ui'; +import Translate from '@docusaurus/Translate'; +import styles from './HeroHeader.module.scss'; +import { useHistory } from '@docusaurus/router'; + +const HeroHeader = () => { + const history = useHistory(); + + return ( +
+
+
+ + Deriv API + + + {`Leverage Deriv's powerful API suite to enhance your trading solutions. Our Websocket API delivers real-time data for options, multipliers, and accumulators, ensuring a smooth trading experience. For high-frequency CFD trading, our DerivFIX API offers ultra-low latency and institutional-grade reliability.`} + +
+
+ + +
+
+
+ ); +}; + +export default HeroHeader; diff --git a/src/features/Home/ProductInfo/constant.ts b/src/features/Home/ProductInfo/constant.ts new file mode 100644 index 000000000..de25e28b6 --- /dev/null +++ b/src/features/Home/ProductInfo/constant.ts @@ -0,0 +1,26 @@ +export interface IProduct { + [key: string]: { + title: string; + description: string; + id: string; + imgName: string; + btnString?: string; + }; +} + +export const products: IProduct = { + Websocket: { + title: 'Websocket API', + description: + 'Our Websocket API is flexible, powerful, and ready to support your unique trading platform, including trading with Options, Multipliers, and Accumulators.', + id: 'WebsocketAPI', + imgName: 'websocket', + }, + DerivFIX: { + title: 'DerivFIX engineered for stability and speed', + description: + 'DerivFIX - Engineered for speed, built for control. Experience unmatched stability and low latency with DerivFIX, crafted for professional and institutional CFD trading.', + id: 'derivFix', + imgName: 'derivFix', + }, +}; diff --git a/src/features/Home/ProductInfo/index.tsx b/src/features/Home/ProductInfo/index.tsx new file mode 100644 index 000000000..bbf48e5e7 --- /dev/null +++ b/src/features/Home/ProductInfo/index.tsx @@ -0,0 +1,55 @@ +import React from 'react'; +import { Text, Heading, Button } from '@deriv-com/quill-ui'; +import styles from '../styles.module.scss'; +import Translate, { translate } from '@docusaurus/Translate'; +import clsx from 'clsx'; +import useDeviceType from '@site/src/hooks/useDeviceType'; + +type ProductInfoProps = { + product: { + id: string; + title: string; + description: string; + imgName: string; + btnString?: string; + }; + reverse?: boolean; +}; + +const ProductInfo = (props: ProductInfoProps) => { + const { product, reverse = false } = props; + const { id, title, description, imgName, btnString } = product; + + const { deviceType } = useDeviceType(); + const isMobile = deviceType === 'mobile'; + + return ( +
+ {translate({ +
+ + {title} + + {description} + +
+
+ ); +}; + +export default ProductInfo; diff --git a/src/features/Home/WaysToEarn/WaysToEarn.module.scss b/src/features/Home/WaysToEarn/WaysToEarn.module.scss deleted file mode 100644 index b94471d42..000000000 --- a/src/features/Home/WaysToEarn/WaysToEarn.module.scss +++ /dev/null @@ -1,63 +0,0 @@ -@use 'src/styles/utility' as *; -.WaysContainer { - margin-top: rem(2); - @media screen and (max-width: 992px) { - margin-top: 0; - } - - .WaysWrapper { - font-family: var(--ibm-font-family-base); - width: 80%; - display: flex; - flex-wrap: wrap; - align-items: center; - justify-content: space-around; - margin: 0 auto; - - @media screen and (min-width: 1400px) { - width: fit-content; - gap: rem(20); - } - - @media screen and (max-width: 992px) { - width: 100%; - } - .WaysHeading { - max-width: 384px; - margin-bottom: rem(2.5); - padding: 0 rem(2); - } - - .Ways { - span { - display: flex; - align-items: center; - width: unset; - max-width: rem(62.8); - margin: rem(2) rem(1.2); - padding: rem(1.6); - background-color: var(--ifm-color-emphasis-0); - box-shadow: 0 rem(0.4) rem(0.8) rgb(14 14 14 / 10%); - } - .Margin { - margin: 0; - } - p { - width: 92%; - } - .WaysImg { - width: 32px; - height: auto; - margin-right: 8px; - } - - @media screen and (max-width: 992px) { - span { - max-width: rem(32.8); - margin: rem(1.6); - align-items: flex-start; - } - } - } - } -} diff --git a/src/features/Home/WaysToEarn/WaysToEarn.tsx b/src/features/Home/WaysToEarn/WaysToEarn.tsx deleted file mode 100644 index ed140d605..000000000 --- a/src/features/Home/WaysToEarn/WaysToEarn.tsx +++ /dev/null @@ -1,72 +0,0 @@ -import React from 'react'; -import { Badge, Text } from '@deriv/ui'; -import styles from './WaysToEarn.module.scss'; -import Translate from '@docusaurus/Translate'; - -const CheckIcon = () => { - return ; -}; - -export const WaysToEarn = () => { - return ( -
-
-
- - Ways to earn with Deriv API - -
-
-
- } - label='regular' - size='large' - spacing='loose' - visibility='icon-and-label' - > - - - Register your app with Deriv, and add a percentage markup to the contract prices - to profit from every purchased contract. - - - -
-
- } - label='regular' - size='large' - spacing='loose' - visibility='icon-and-label' - > - - - Sign up as an affiliate, build your app, and get commissions on trades completed - via your app and the affiliate plan you select. - - - -
-
- } - label='regular' - size='large' - spacing='loose' - visibility='icon-and-label' - > - - - Sign up as a payment agent, build your own custom payment website, and use our API - to earn commission on every payment you process for Deriv's clients. - - - -
-
-
-
- ); -}; diff --git a/src/features/Home/WaysToEarn/__tests__/WaysToEarn.test.tsx b/src/features/Home/WaysToEarn/__tests__/WaysToEarn.test.tsx deleted file mode 100644 index 66fd181bb..000000000 --- a/src/features/Home/WaysToEarn/__tests__/WaysToEarn.test.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import React from 'react'; -import { cleanup, render, screen } from '@site/src/test-utils'; -import { WaysToEarn } from '../WaysToEarn'; - -beforeEach(() => { - render(); -}); - -afterEach(cleanup); - -describe('WaysToEarn', () => { - it('renders properly', () => { - const main_element = screen.getByTestId('ways-to-earn'); - expect(main_element).toBeInTheDocument(); - }); - it('renders the title', () => { - const title = screen.getByText(/ways to earn with deriv api/i); - expect(title).toBeInTheDocument(); - }); - it('renders the badges', () => { - const badge_one = screen.getByText(/register your app with deriv/i); - const badge_two = screen.getByText(/sign up as an affiliate/i); - const badge_three = screen.getByText(/sign up as a payment agent/i); - expect(badge_one).toBeVisible(); - expect(badge_two).toBeVisible(); - expect(badge_three).toBeVisible(); - }); -}); diff --git a/src/features/Home/__tests__/index.test.tsx b/src/features/Home/__tests__/index.test.tsx index 67909c676..9a6f742d3 100644 --- a/src/features/Home/__tests__/index.test.tsx +++ b/src/features/Home/__tests__/index.test.tsx @@ -22,6 +22,6 @@ describe('Home Page', () => { it('should render section with features class', () => { const { container } = render_result; const main_section = container.querySelector('main'); - expect(main_section).toHaveAttribute('class', 'features'); + expect(main_section).toBeVisible(); }); }); diff --git a/src/features/Home/index.tsx b/src/features/Home/index.tsx index 5da905ac0..6d20827e7 100644 --- a/src/features/Home/index.tsx +++ b/src/features/Home/index.tsx @@ -1,33 +1,52 @@ import React from 'react'; -import { ApiFeatures } from './ApiFeatures/ApiFeatures'; -import { Benefits } from './Benefits/Benefits'; -import { ClientLibraries } from './ClientLibraries/ClientLibraries'; -import { HeroHeader } from './HeroHeader/HeroHeader'; -import { WaysToEarn } from './WaysToEarn/WaysToEarn'; -// import { Carousel } from './Carousel/Carousel'; +import { translate } from '@docusaurus/Translate'; +import RenderOfficialContents from '@site/src/components/RenderOfficialContents'; import Footer from '@site/src/components/Footer'; +import ProductInfo from './ProductInfo'; +import Benefits from './Benefits'; +import ClientLibraries from './ClientLibraries'; +import HeroHeader from './HeroHeader'; +import Features from './Features'; +import { derivFixFeatures, webSocketFeatures } from './Features/constant'; + import styles from './styles.module.scss'; -import { GetStarted } from './GetStarted/GetStarted'; -import RenderOfficialContents from '@site/src/components/RenderOfficialContents'; +import { products } from './ProductInfo/constant'; +import GetStarted from './GetStarted'; +import About from './About'; export default function HomepageFeatures() { return ( -
+
- - +
- - - - {/* Carousel requires new quote's before it should be enabled again */} - {/* */} -
- + + + + + + +
+ {/* */} +
+
+
); } diff --git a/src/features/Home/styles.module.scss b/src/features/Home/styles.module.scss index cc24c0f9c..0336eb4a2 100644 --- a/src/features/Home/styles.module.scss +++ b/src/features/Home/styles.module.scss @@ -1,16 +1,242 @@ @use 'src/styles/utility' as *; +@use 'src/styles/mixins' as *; .features { width: 100%; display: flex; flex-direction: column; - gap: rem(16); - @media (max-width: 992px) { + margin-top: rem(5); + gap: rem(10); + + @include tablet { gap: rem(5.2); } + + @include mobile-sm { + gap: rem(5); + } + + h2 { + line-height: 55.15px; + + @include mobile-sm { + line-height: 32.17px; + } + } + + p { + margin-top: rem(1); + } + +} + +.contentFlex { + display: flex; +} + +.centerContent { + @extend .contentFlex; + justify-content: center; + align-items: center; +} + +.spaceAroundContent { + @extend .contentFlex; + justify-content: space-around; + align-items: center; + + @include mobile-sm { + flex-direction: column; + } +} + +.spaceEvenContent { + @extend .contentFlex; + justify-content: space-evenly; + align-items: center; + align-self: baseline; + scroll-margin-top: 10rem; + + @include mobile-sm { + flex-direction: column; + } +} + +.flexColumn { + flex-direction: column; +} + +.mh3 { + margin-block: rem(3); +} + +.mv3 { + margin-inline: rem(3); +} + +.mh5 { + margin-block: rem(5); +} + +.mv5 { + margin-inline: rem(5); +} + +.ph5 { + padding-block: rem(5); +} + +.pv5 { + padding-inline: rem(5); +} + +.justifyCenter { + justify-content: center; +} + +.gap1 { + gap: rem(1); +} + +.gap4 { + gap: rem(4); +} + +.featuresContainer { + flex-direction: row; + flex-wrap: wrap; + justify-content: flex-start; + + > div { + padding-left: rem(5); + align-self: flex-start; + width: 32%; + } + + @include mobile-sm { + flex-direction: column; + margin-inline: 1.5rem; + margin-block: 1rem; + + > div { + width: 100%; + padding-left: 0; + } + } +} + +.flexReverse { + @extend .spaceEvenContent; + flex-direction: row-reverse; + + @include mobile-sm { + flex-direction: column-reverse; + } } -.featureSvg { - height: 20rem; - width: 20rem; +.getStartedImg { + width: 608px; + height: 480px; + object-fit: cover; + border-radius: 24px; + + @include mobile-sm { + height: 280px; + } +} + +.aboutContainer { + background-image: url(/img/who_we_are.svg); + margin-block: 5rem; + padding-top: 5rem; + background-position: center; + + .aboutContent { + background-color: #414652; + color: #ffffff; + justify-content: space-between; + padding: 48px; + border-radius: 24px; + margin-bottom: 8rem; + width: 1024px; + + h2, + p { + color: #ffffff; + } + } +} + +.getStartedBtnContainer { + button { + border-radius: 96px; + } +} + +.getStartedStepContainer { + @extend .contentFlex; + align-items: center; + + .stepIconContainer { + @extend .contentFlex; + flex-direction: column; + align-items: center; + margin-right: rem(3); + margin-bottom: rem(1); + + img { + height: 64px; + object-fit: cover; + } + + .stepCenterOutline { + width: 2px; + height: 40px; + background-color: #9498a2; + margin-top: 8px; + } + } + + .description { + margin-bottom: rem(1); + } +} + +.benefitContainerMbl { + overflow-x: auto; + flex-direction: row; + scrollbar-width: none; + margin-bottom: 0; + + > div { + background-color: #f6f7f8; + border-radius: 24px; + } +} + +.client_libraries { + @include mobile-sm { + flex-direction: row; + justify-content: space-around; + } +} + +.productInfo { + @include mobile-sm { + > div { + margin-inline: 0; + text-align: center; + } + } +} + +.getStarted { + @include mobile-sm { + flex-direction: column; + gap: rem(3); + + > div { + margin-inline: 0; + } + } } diff --git a/src/styles/index.scss b/src/styles/index.scss index b85bfba7c..87b14a788 100644 --- a/src/styles/index.scss +++ b/src/styles/index.scss @@ -71,6 +71,7 @@ } html { + scroll-behavior: smooth; font: var(--ifm-font-size-base) / var(--ifm-line-height-base) var(--ifm-font-family-base) !important; } diff --git a/static/img/banner-homepage.jpeg b/static/img/banner-homepage.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..1d1091b93b44b28bcb78027a02a49ee9024913a5 GIT binary patch literal 321176 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

D^Jw0M+n9A@%3GsM{erIuK7gNeai7(IFP-x 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

); } diff --git a/src/features/Home/styles.module.scss b/src/features/Home/styles.module.scss index 0336eb4a2..3a97e50f9 100644 --- a/src/features/Home/styles.module.scss +++ b/src/features/Home/styles.module.scss @@ -27,7 +27,6 @@ p { margin-top: rem(1); } - } .contentFlex { @@ -54,11 +53,12 @@ @extend .contentFlex; justify-content: space-evenly; align-items: center; - align-self: baseline; + align-self: normal; scroll-margin-top: 10rem; @include mobile-sm { flex-direction: column; + scroll-margin-top: 5rem; } } @@ -108,7 +108,7 @@ justify-content: flex-start; > div { - padding-left: rem(5); + padding: 3rem; align-self: flex-start; width: 32%; } @@ -120,6 +120,7 @@ > div { width: 100%; + padding: rem(3); padding-left: 0; } } @@ -165,6 +166,17 @@ color: #ffffff; } } + + @include mobile-sm { + margin-block: 1rem; + + .aboutContent { + width: 90%; + text-align: center; + padding: 24px; + margin-bottom: 0; + } + } } .getStartedBtnContainer { @@ -175,14 +187,12 @@ .getStartedStepContainer { @extend .contentFlex; - align-items: center; .stepIconContainer { @extend .contentFlex; flex-direction: column; align-items: center; - margin-right: rem(3); - margin-bottom: rem(1); + margin-right: rem(2); img { height: 64px; @@ -191,26 +201,63 @@ .stepCenterOutline { width: 2px; - height: 40px; + height: 28px; background-color: #9498a2; margin-top: 8px; } + + @include mobile-sm { + margin-right: 1rem; + + img { + height: 48px; + } + } + } + + h3 { + margin-top: rem(1); + + @include mobile-sm { + margin-top: rem(0.6); + } } .description { - margin-bottom: rem(1); + width: rem(48); + margin: 0; + + @include mobile-sm { + width: rem(30); + } } } +.benefitContent { + margin-bottom: rem(10); +} + .benefitContainerMbl { - overflow-x: auto; + @extend .contentFlex; + width: 100%; + overflow: auto; flex-direction: row; scrollbar-width: none; margin-bottom: 0; + gap: rem(3); + padding-inline: 1.5rem; + + img { + margin-bottom: 10px; + } > div { + min-width: 90%; background-color: #f6f7f8; border-radius: 24px; + padding: 25px; + gap: 0.5rem; + } } @@ -238,5 +285,10 @@ > div { margin-inline: 0; } + + h2 { + text-align: center; + margin-block: 0 rem(1.6); + } } } From 9214aacccf05ece1433092fe9d0e12a503e20e36 Mon Sep 17 00:00:00 2001 From: muhammad-ahmed Date: Thu, 28 Nov 2024 15:52:47 +0800 Subject: [PATCH 3/8] fix scrolling behavior on benefit section --- src/features/Home/styles.module.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/features/Home/styles.module.scss b/src/features/Home/styles.module.scss index 3a97e50f9..98a72ef56 100644 --- a/src/features/Home/styles.module.scss +++ b/src/features/Home/styles.module.scss @@ -57,7 +57,6 @@ scroll-margin-top: 10rem; @include mobile-sm { - flex-direction: column; scroll-margin-top: 5rem; } } @@ -239,6 +238,7 @@ .benefitContainerMbl { @extend .contentFlex; + width: 100%; overflow: auto; flex-direction: row; From 891aebf52f7fc7a331b03aad4f386c815584101e Mon Sep 17 00:00:00 2001 From: muhammad-ahmed Date: Thu, 28 Nov 2024 15:55:41 +0800 Subject: [PATCH 4/8] fix about content section --- src/features/Home/styles.module.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/src/features/Home/styles.module.scss b/src/features/Home/styles.module.scss index 98a72ef56..3d3f1bb0d 100644 --- a/src/features/Home/styles.module.scss +++ b/src/features/Home/styles.module.scss @@ -170,6 +170,7 @@ margin-block: 1rem; .aboutContent { + flex-direction: column; width: 90%; text-align: center; padding: 24px; From 2ca489fb0e5c2751b2ac89d5d904b881ba0e178a Mon Sep 17 00:00:00 2001 From: muhammad-ahmed Date: Thu, 28 Nov 2024 16:05:19 +0800 Subject: [PATCH 5/8] fix header background styling --- src/features/Home/HeroHeader/HeroHeader.module.scss | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/features/Home/HeroHeader/HeroHeader.module.scss b/src/features/Home/HeroHeader/HeroHeader.module.scss index 410673439..5b168562e 100644 --- a/src/features/Home/HeroHeader/HeroHeader.module.scss +++ b/src/features/Home/HeroHeader/HeroHeader.module.scss @@ -6,7 +6,12 @@ align-items: center; height: 95svh; min-height: rem(50); - background-image: linear-gradient(to right, rgb(0 0 0 / 80%), rgb(0 0 0 / 0%)), + background-image: linear-gradient( + to right, + rgba(0, 0, 0, 0.843), + rgb(0 0 0 / 20%), + rgba(0, 0, 0, 0) + ), url(/img/banner-homepage.jpeg); background-position: center; background-size: cover; @@ -30,7 +35,7 @@ @include mobile-sm { background-repeat: no-repeat; background-position-x: 73%; - background-image: linear-gradient(to top, rgb(0 0 0), rgb(0 0 0 / 0%)), + background-image: linear-gradient(to top, rgba(0, 0, 0), rgb(0 0 0 / 22%), rgba(0, 0, 0, 0)), url(/img/banner-homepage.jpeg); align-items: flex-end; From 99982a40a34593f1ca52559b9748444b0f3b4b77 Mon Sep 17 00:00:00 2001 From: muhammad-ahmed Date: Wed, 4 Dec 2024 15:14:30 +0800 Subject: [PATCH 6/8] fix styling and update content --- src/features/Home/About/index.tsx | 13 ++--- src/features/Home/Benefits/index.tsx | 12 ++--- src/features/Home/ClientLibraries/index.tsx | 2 +- src/features/Home/GetStarted/index.tsx | 5 -- .../Home/HeroHeader/HeroHeader.module.scss | 8 ++- src/features/Home/ProductInfo/constant.ts | 5 +- src/features/Home/ProductInfo/index.tsx | 28 +++++++++-- src/features/Home/styles.module.scss | 49 ++++++++++++++++--- 8 files changed, 88 insertions(+), 34 deletions(-) diff --git a/src/features/Home/About/index.tsx b/src/features/Home/About/index.tsx index 40b14824c..b2ce7faa2 100644 --- a/src/features/Home/About/index.tsx +++ b/src/features/Home/About/index.tsx @@ -16,7 +16,7 @@ const About = () => { >
- Who we are + Start building with Deriv @@ -25,14 +25,9 @@ const About = () => {
-
); diff --git a/src/features/Home/Benefits/index.tsx b/src/features/Home/Benefits/index.tsx index 93e8f83ce..e5e854dcb 100644 --- a/src/features/Home/Benefits/index.tsx +++ b/src/features/Home/Benefits/index.tsx @@ -5,16 +5,16 @@ import styles from '../styles.module.scss'; import clsx from 'clsx'; import useDeviceType from '@site/src/hooks/useDeviceType'; -type TBenefitsIcon = { +type TBenefitsContext = { icon: string; text: string; alt: string; description: string; }; -const BenefitsIcon = ({ icon, text, alt, description }: TBenefitsIcon) => { +const BenefitsContext = ({ icon, text, alt, description }: TBenefitsContext) => { return ( -
+
{alt} {text} {description} @@ -42,7 +42,7 @@ const Benefits = () => { [styles.benefitContainerMbl]: isMobile, })}`} > - { message: `Create a trading platform that’s uniquely yours by leveraging features and specs from Deriv’s platforms with our APIs.`, })} /> - { message: `Quickly connect to your existing tech stack and start trading with minimal setup.`, })} /> - { return ( -
+
All-in-one support for every developer diff --git a/src/features/Home/GetStarted/index.tsx b/src/features/Home/GetStarted/index.tsx index 813961ce7..95d380369 100644 --- a/src/features/Home/GetStarted/index.tsx +++ b/src/features/Home/GetStarted/index.tsx @@ -75,11 +75,6 @@ const GetStarted = () => { How to get started {renderSteps()} -
- -
); diff --git a/src/features/Home/HeroHeader/HeroHeader.module.scss b/src/features/Home/HeroHeader/HeroHeader.module.scss index 5b168562e..4e5e28ca1 100644 --- a/src/features/Home/HeroHeader/HeroHeader.module.scss +++ b/src/features/Home/HeroHeader/HeroHeader.module.scss @@ -25,6 +25,10 @@ .heroBtnContainer { display: flex; gap: rem(1); + + button { + font-weight: bold; + } } .heroTitle, @@ -35,9 +39,10 @@ @include mobile-sm { background-repeat: no-repeat; background-position-x: 73%; - background-image: linear-gradient(to top, rgba(0, 0, 0), rgb(0 0 0 / 22%), rgba(0, 0, 0, 0)), + background-image: linear-gradient(to top, rgba(0, 0, 0), rgb(0 0 0 / 35%), rgba(0, 0, 0, 0)), url(/img/banner-homepage.jpeg); align-items: flex-end; + padding-bottom: 2rem; .heroBtnContainer { flex-direction: column; @@ -48,6 +53,7 @@ .description { width: 100%; text-align: center; + padding-inline: 14px; } } } diff --git a/src/features/Home/ProductInfo/constant.ts b/src/features/Home/ProductInfo/constant.ts index 66f5f6171..a30615efe 100644 --- a/src/features/Home/ProductInfo/constant.ts +++ b/src/features/Home/ProductInfo/constant.ts @@ -6,7 +6,7 @@ export interface IProduct { description: string[]; id: string; imgName: string; - btnString?: string; + redirectUrl: string; }; } @@ -23,6 +23,8 @@ export const products: IProduct = { ], id: 'WebsocketAPI', imgName: 'websocket', + redirectUrl: 'https://developers.deriv.com/docs/getting-started' + }, DerivFIX: { title: translate({ message: 'DerivFIX API' }), @@ -38,5 +40,6 @@ export const products: IProduct = { ], id: 'derivFix', imgName: 'derivFix', + redirectUrl: 'https://developers.deriv.com/docs/getting-started' }, }; diff --git a/src/features/Home/ProductInfo/index.tsx b/src/features/Home/ProductInfo/index.tsx index 7a25c21d1..c1629d865 100644 --- a/src/features/Home/ProductInfo/index.tsx +++ b/src/features/Home/ProductInfo/index.tsx @@ -11,14 +11,14 @@ type ProductInfoProps = { title: string; description: string[]; imgName: string; - btnString?: string; + redirectUrl?: string; }; reverse?: boolean; }; const ProductInfo = (props: ProductInfoProps) => { const { product, reverse = false } = props; - const { id, title, description, imgName, btnString } = product; + const { id, title, description, imgName, redirectUrl } = product; const { deviceType } = useDeviceType(); const isMobile = deviceType === 'mobile'; @@ -48,9 +48,27 @@ const ProductInfo = (props: ProductInfoProps) => { {desc} ))} - +
+ + +
); diff --git a/src/features/Home/styles.module.scss b/src/features/Home/styles.module.scss index 3d3f1bb0d..cb2f0f72c 100644 --- a/src/features/Home/styles.module.scss +++ b/src/features/Home/styles.module.scss @@ -18,15 +18,28 @@ h2 { line-height: 55.15px; + margin-bottom: 1rem; @include mobile-sm { line-height: 32.17px; + padding-inline: 0.5rem; } } p { margin-top: rem(1); } + + > div { + + button { + font-weight: bold; + } + + button:first-child { + border: 1px solid var(--component-button-bg-coral-primary-default); + } + } } .contentFlex { @@ -175,6 +188,10 @@ text-align: center; padding: 24px; margin-bottom: 0; + + button { + font-weight: bold; + } } } } @@ -204,6 +221,10 @@ height: 28px; background-color: #9498a2; margin-top: 8px; + + @include mobile-sm { + height: 40px; + } } @include mobile-sm { @@ -235,6 +256,11 @@ .benefitContent { margin-bottom: rem(10); + + .benefitContext { + max-width: 28rem; + align-self: flex-start; + } } .benefitContainerMbl { @@ -256,16 +282,27 @@ min-width: 90%; background-color: #f6f7f8; border-radius: 24px; - padding: 25px; + padding: 25px 30px; gap: 0.5rem; - } } -.client_libraries { - @include mobile-sm { - flex-direction: row; - justify-content: space-around; +.clientLibrariesContainer { + h2 { + width: 60%; + margin: 0 auto; + margin-bottom: 1rem; + + @include mobile-sm { + width: 100%; + } + } + + .client_libraries { + @include mobile-sm { + flex-direction: row; + justify-content: space-around; + } } } From 96ddd95eaadae6586b873bc30a166f90a8e1085c Mon Sep 17 00:00:00 2001 From: muhammad-ahmed Date: Wed, 4 Dec 2024 15:30:02 +0800 Subject: [PATCH 7/8] mobile cta button alignment fix --- src/features/Home/styles.module.scss | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/features/Home/styles.module.scss b/src/features/Home/styles.module.scss index cb2f0f72c..e0bbf7a3a 100644 --- a/src/features/Home/styles.module.scss +++ b/src/features/Home/styles.module.scss @@ -312,6 +312,15 @@ margin-inline: 0; text-align: center; } + + .contentFlex { + flex-direction: column; + margin-block: 2rem; + + button { + margin: 0; + } + } } } From 058c568812bdb59c8a17287ec78e6d7e825e6ae2 Mon Sep 17 00:00:00 2001 From: muhammad-ahmed Date: Wed, 4 Dec 2024 17:00:57 +0800 Subject: [PATCH 8/8] tablet and mobile style fixes --- src/features/Home/About/index.tsx | 8 ++- src/features/Home/GetStarted/index.tsx | 6 +- .../Home/HeroHeader/HeroHeader.module.scss | 4 ++ src/features/Home/ProductInfo/index.tsx | 12 ++-- src/features/Home/styles.module.scss | 64 ++++++++++++++++++- 5 files changed, 77 insertions(+), 17 deletions(-) diff --git a/src/features/Home/About/index.tsx b/src/features/Home/About/index.tsx index b2ce7faa2..c8137a959 100644 --- a/src/features/Home/About/index.tsx +++ b/src/features/Home/About/index.tsx @@ -2,7 +2,6 @@ import React from 'react'; import { Button, Heading, Text } from '@deriv-com/quill-ui'; import styles from '../styles.module.scss'; import Translate from '@docusaurus/Translate'; -import { LabelPairedArrowUpRightMdRegularIcon } from '@deriv/quill-icons'; import useDeviceType from '@site/src/hooks/useDeviceType'; const About = () => { @@ -25,7 +24,12 @@ const About = () => {
- diff --git a/src/features/Home/GetStarted/index.tsx b/src/features/Home/GetStarted/index.tsx index 95d380369..ebb05b6ad 100644 --- a/src/features/Home/GetStarted/index.tsx +++ b/src/features/Home/GetStarted/index.tsx @@ -1,13 +1,9 @@ import React from 'react'; -import { Text, Heading, Button } from '@deriv-com/quill-ui'; +import { Text, Heading } from '@deriv-com/quill-ui'; import styles from '../styles.module.scss'; import Translate, { translate } from '@docusaurus/Translate'; -import useDeviceType from '@site/src/hooks/useDeviceType'; const GetStarted = () => { - const { deviceType } = useDeviceType(); - const isMobile = deviceType === 'mobile'; - const getStartedSteps = { websocket: [ { diff --git a/src/features/Home/HeroHeader/HeroHeader.module.scss b/src/features/Home/HeroHeader/HeroHeader.module.scss index 4e5e28ca1..dd6e38ea8 100644 --- a/src/features/Home/HeroHeader/HeroHeader.module.scss +++ b/src/features/Home/HeroHeader/HeroHeader.module.scss @@ -56,4 +56,8 @@ padding-inline: 14px; } } + + @include mobile { + background-position: 70%; + } } diff --git a/src/features/Home/ProductInfo/index.tsx b/src/features/Home/ProductInfo/index.tsx index c1629d865..cb76407f2 100644 --- a/src/features/Home/ProductInfo/index.tsx +++ b/src/features/Home/ProductInfo/index.tsx @@ -40,13 +40,9 @@ const ProductInfo = (props: ProductInfoProps) => { })} />
- - {title} - + {title} {description.map((desc, idx) => ( - - {desc} - + {desc} ))}
diff --git a/src/features/Home/styles.module.scss b/src/features/Home/styles.module.scss index e0bbf7a3a..1bf8ba8cb 100644 --- a/src/features/Home/styles.module.scss +++ b/src/features/Home/styles.module.scss @@ -31,7 +31,6 @@ } > div { - button { font-weight: bold; } @@ -125,6 +124,12 @@ width: 32%; } + @include mobile { + > div { + width: 50%; + } + } + @include mobile-sm { flex-direction: column; margin-inline: 1.5rem; @@ -153,6 +158,16 @@ object-fit: cover; border-radius: 24px; + @include tablet-lg { + width: 500px; + height: 400px; + } + + @include mobile { + width: 350px; + height: 500px; + } + @include mobile-sm { height: 280px; } @@ -173,6 +188,20 @@ margin-bottom: 8rem; width: 1024px; + @include tablet-lg { + max-width: 90%; + + button { + width: 30%; + } + } + + @include mobile-sm { + button { + width: 92%; + } + } + h2, p { color: #ffffff; @@ -251,6 +280,10 @@ @include mobile-sm { width: rem(30); } + + @include tablet-lg { + width: rem(28); + } } } @@ -279,11 +312,18 @@ } > div { - min-width: 90%; background-color: #f6f7f8; border-radius: 24px; padding: 25px 30px; gap: 0.5rem; + + @include mobile { + min-width: 40%; + } + + @include mobile-sm { + min-width: 90%; + } } } @@ -307,7 +347,21 @@ } .productInfo { + @include tablet-lg { + img { + width: 50%; + } + + > div { + margin-inline: 1.5rem; + } + } + @include mobile-sm { + img { + width: 100%; + } + > div { margin-inline: 0; text-align: center; @@ -338,4 +392,10 @@ margin-block: 0 rem(1.6); } } + + @include mobile { + > div { + margin-inline: 1.5rem; + } + } }