diff --git a/package-lock.json b/package-lock.json index 9fc10b4..1e31c6f 100755 --- a/package-lock.json +++ b/package-lock.json @@ -23,6 +23,8 @@ "react-i18next": "^12.3.1", "react-redux": "^8.0.5", "react-router-dom": "^6.11.2", + "react-slick": "^0.30.2", + "slick-carousel": "^1.8.1", "unique-names-generator": "^4.7.1" }, "devDependencies": { @@ -31,6 +33,7 @@ "@types/react": "^18.2.6", "@types/react-dom": "^18.2.4", "@types/react-router-dom": "^5.3.3", + "@types/react-slick": "^0.23.13", "@typescript-eslint/eslint-plugin": "^5.59.6", "@typescript-eslint/parser": "^5.59.6", "@vitejs/plugin-react": "^4.0.0", @@ -1093,6 +1096,15 @@ "@types/react-router": "*" } }, + "node_modules/@types/react-slick": { + "version": "0.23.13", + "resolved": "https://registry.npmjs.org/@types/react-slick/-/react-slick-0.23.13.tgz", + "integrity": "sha512-bNZfDhe/L8t5OQzIyhrRhBr/61pfBcWaYJoq6UDqFtv5LMwfg4NsVDD2J8N01JqdAdxLjOt66OZEp6PX+dGs/A==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/scheduler": { "version": "0.16.3", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", @@ -1492,6 +1504,11 @@ "node": ">=4" } }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, "node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -1642,6 +1659,11 @@ "integrity": "sha512-TFeOKd98TpJzRHkr4Aorn16QkMnuCQuGAE6IZ0wYF+qkbSfMPqjplvRppR02tMUpVxZz8nyBNvVm9lIZsqrbPQ==", "dev": true }, + "node_modules/enquire.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz", + "integrity": "sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw==" + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -2439,6 +2461,12 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/jquery": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", + "peer": true + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -2480,6 +2508,14 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "dependencies": { + "string-convert": "^0.2.0" + } + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -2520,6 +2556,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -2982,6 +3023,22 @@ "react-dom": ">=16.8" } }, + "node_modules/react-slick": { + "version": "0.30.2", + "resolved": "https://registry.npmjs.org/react-slick/-/react-slick-0.30.2.tgz", + "integrity": "sha512-XvQJi7mRHuiU3b9irsqS9SGIgftIfdV5/tNcURTb5LdIokRA5kIIx3l4rlq2XYHfxcSntXapoRg/GxaVOM1yfg==", + "dependencies": { + "classnames": "^2.2.5", + "enquire.js": "^2.1.6", + "json2mq": "^0.2.0", + "lodash.debounce": "^4.0.8", + "resize-observer-polyfill": "^1.5.0" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^0.14.0 || ^15.0.1 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/redux": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", @@ -3008,6 +3065,11 @@ "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -3152,6 +3214,14 @@ "node": ">=8" } }, + "node_modules/slick-carousel": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.1.tgz", + "integrity": "sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA==", + "peerDependencies": { + "jquery": ">=1.8.0" + } + }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -3161,6 +3231,11 @@ "node": ">=0.10.0" } }, + "node_modules/string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -4146,6 +4221,15 @@ "@types/react-router": "*" } }, + "@types/react-slick": { + "version": "0.23.13", + "resolved": "https://registry.npmjs.org/@types/react-slick/-/react-slick-0.23.13.tgz", + "integrity": "sha512-bNZfDhe/L8t5OQzIyhrRhBr/61pfBcWaYJoq6UDqFtv5LMwfg4NsVDD2J8N01JqdAdxLjOt66OZEp6PX+dGs/A==", + "dev": true, + "requires": { + "@types/react": "*" + } + }, "@types/scheduler": { "version": "0.16.3", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", @@ -4390,6 +4474,11 @@ "supports-color": "^5.3.0" } }, + "classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" + }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -4505,6 +4594,11 @@ "integrity": "sha512-TFeOKd98TpJzRHkr4Aorn16QkMnuCQuGAE6IZ0wYF+qkbSfMPqjplvRppR02tMUpVxZz8nyBNvVm9lIZsqrbPQ==", "dev": true }, + "enquire.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/enquire.js/-/enquire.js-2.1.6.tgz", + "integrity": "sha512-/KujNpO+PT63F7Hlpu4h3pE3TokKRHN26JYmQpPyjkRD/N57R7bPDNojMXdi7uveAKjYB7yQnartCxZnFWr0Xw==" + }, "entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -5094,6 +5188,12 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "jquery": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz", + "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==", + "peer": true + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -5126,6 +5226,14 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "json2mq": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", + "integrity": "sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==", + "requires": { + "string-convert": "^0.2.0" + } + }, "json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -5151,6 +5259,11 @@ "p-locate": "^5.0.0" } }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -5454,6 +5567,18 @@ "react-router": "6.11.2" } }, + "react-slick": { + "version": "0.30.2", + "resolved": "https://registry.npmjs.org/react-slick/-/react-slick-0.30.2.tgz", + "integrity": "sha512-XvQJi7mRHuiU3b9irsqS9SGIgftIfdV5/tNcURTb5LdIokRA5kIIx3l4rlq2XYHfxcSntXapoRg/GxaVOM1yfg==", + "requires": { + "classnames": "^2.2.5", + "enquire.js": "^2.1.6", + "json2mq": "^0.2.0", + "lodash.debounce": "^4.0.8", + "resize-observer-polyfill": "^1.5.0" + } + }, "redux": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", @@ -5478,6 +5603,11 @@ "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" }, + "resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -5572,12 +5702,23 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, + "slick-carousel": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.1.tgz", + "integrity": "sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA==", + "requires": {} + }, "source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "dev": true }, + "string-convert": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-convert/-/string-convert-0.2.1.tgz", + "integrity": "sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==" + }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", diff --git a/package.json b/package.json index a2054d5..7051e7b 100755 --- a/package.json +++ b/package.json @@ -25,6 +25,8 @@ "react-i18next": "^12.3.1", "react-redux": "^8.0.5", "react-router-dom": "^6.11.2", + "react-slick": "^0.30.2", + "slick-carousel": "^1.8.1", "unique-names-generator": "^4.7.1" }, "devDependencies": { @@ -33,6 +35,7 @@ "@types/react": "^18.2.6", "@types/react-dom": "^18.2.4", "@types/react-router-dom": "^5.3.3", + "@types/react-slick": "^0.23.13", "@typescript-eslint/eslint-plugin": "^5.59.6", "@typescript-eslint/parser": "^5.59.6", "@vitejs/plugin-react": "^4.0.0", diff --git a/public/check-mark-1.svg b/public/check-mark-1.svg new file mode 100644 index 0000000..0671ab2 --- /dev/null +++ b/public/check-mark-1.svg @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/public/circle-with-dote.svg b/public/circle-with-dote.svg new file mode 100644 index 0000000..ae17c73 --- /dev/null +++ b/public/circle-with-dote.svg @@ -0,0 +1,17 @@ + + Circle with dot inside + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/crystal_ball.png b/public/crystal_ball.png new file mode 100644 index 0000000..eb45afb Binary files /dev/null and b/public/crystal_ball.png differ diff --git a/public/get_on_appstore.webp b/public/get_on_appstore.webp new file mode 100644 index 0000000..5ef54bb Binary files /dev/null and b/public/get_on_appstore.webp differ diff --git a/public/get_on_google_play.webp b/public/get_on_google_play.webp new file mode 100644 index 0000000..80076d1 Binary files /dev/null and b/public/get_on_google_play.webp differ diff --git a/public/input_numbers.png b/public/input_numbers.png new file mode 100644 index 0000000..17e5914 Binary files /dev/null and b/public/input_numbers.png differ diff --git a/public/premium_intro.webp b/public/premium_intro.webp new file mode 100644 index 0000000..becba8e Binary files /dev/null and b/public/premium_intro.webp differ diff --git a/public/premium_intro_2.webp b/public/premium_intro_2.webp new file mode 100644 index 0000000..0d6d583 Binary files /dev/null and b/public/premium_intro_2.webp differ diff --git a/public/premium_intro_3.webp b/public/premium_intro_3.webp new file mode 100644 index 0000000..d89df43 Binary files /dev/null and b/public/premium_intro_3.webp differ diff --git a/public/premium_intro_4.webp b/public/premium_intro_4.webp new file mode 100644 index 0000000..0e9e868 Binary files /dev/null and b/public/premium_intro_4.webp differ diff --git a/public/premium_intro_5.webp b/public/premium_intro_5.webp new file mode 100644 index 0000000..c1c5c09 Binary files /dev/null and b/public/premium_intro_5.webp differ diff --git a/public/rised_hand.png b/public/rised_hand.png new file mode 100644 index 0000000..15a6522 Binary files /dev/null and b/public/rised_hand.png differ diff --git a/public/smiling-face-with-hearts.png b/public/smiling-face-with-hearts.png new file mode 100644 index 0000000..fdd8af0 Binary files /dev/null and b/public/smiling-face-with-hearts.png differ diff --git a/public/sunset.png b/public/sunset.png new file mode 100644 index 0000000..b697ed6 Binary files /dev/null and b/public/sunset.png differ diff --git a/public/technologist.png b/public/technologist.png new file mode 100644 index 0000000..5c7af46 Binary files /dev/null and b/public/technologist.png differ diff --git a/src/components/App/index.tsx b/src/components/App/index.tsx index 89f8bab..128bce2 100755 --- a/src/components/App/index.tsx +++ b/src/components/App/index.tsx @@ -99,6 +99,10 @@ import MarketingTrialPayment from "../pages/EmailLetters/MarketingTrialPayment"; import { ScrollToTop } from "@/hooks/scrollToTop"; import { EUserDeviceType } from "@/store/userConfig"; import TryAppPage from "../pages/TryApp"; +import AdditionalPurchases from "../pages/AdditionalPurchases"; +import AddReportPage from "../pages/AdditionalPurchases/pages/AddReport"; +import UnlimitedReadingsPage from "../pages/AdditionalPurchases/pages/UnlimitedReadings"; +import AddConsultationPage from "../pages/AdditionalPurchases/pages/AddConsultation"; const isProduction = import.meta.env.MODE === "production"; @@ -323,6 +327,14 @@ function App(): JSX.Element { /> {/* Email Letters End */} + {/* Additional Purchases */} + }> + } /> + } /> + } /> + + {/* Additional Purchases End */} + } diff --git a/src/components/pages/AdditionalPurchases/components/AdditionalPurchasesSteps/checkMark.svg b/src/components/pages/AdditionalPurchases/components/AdditionalPurchasesSteps/checkMark.svg new file mode 100644 index 0000000..e6ce8bc --- /dev/null +++ b/src/components/pages/AdditionalPurchases/components/AdditionalPurchasesSteps/checkMark.svg @@ -0,0 +1,12 @@ + + + + + + + + + + \ No newline at end of file diff --git a/src/components/pages/AdditionalPurchases/components/AdditionalPurchasesSteps/index.tsx b/src/components/pages/AdditionalPurchases/components/AdditionalPurchasesSteps/index.tsx new file mode 100644 index 0000000..f9d3739 --- /dev/null +++ b/src/components/pages/AdditionalPurchases/components/AdditionalPurchasesSteps/index.tsx @@ -0,0 +1,71 @@ +import { IAdditionalPurchasesStep } from "@/data/additionalPurchases"; +import styles from "./styles.module.css"; +import { useRef } from "react"; +import CheckMark from "./checkMark.svg"; + +interface IAdditionalPurchasesStepsProps { + steps: IAdditionalPurchasesStep[]; + activeStep: number; +} + +function AdditionalPurchasesSteps({ + steps, + activeStep, +}: IAdditionalPurchasesStepsProps) { + const containerRef = useRef(null); + const titlesRef = useRef>([]); + const circleSize = 30; + + return ( +
+
+ {steps.map(({ title, id }, index) => ( +
+
+ (titlesRef.current[index] = el)} + className={`${styles.title} ${ + index === 0 && styles["title-first"] + } ${index === steps.length - 1 && styles["title-last"]}`} + key={index} + > + {title} + + {activeStep < id && ( +
+ )} + {activeStep === id && ( + Circle with dote + )} + {activeStep > id && ( + Circle with dote + )} +
+ + {/* {id !== steps.length - 1 && ( +
+ )} */} +
+ ))} +
+
+
+ ); +} + +export default AdditionalPurchasesSteps; diff --git a/src/components/pages/AdditionalPurchases/components/AdditionalPurchasesSteps/styles.module.css b/src/components/pages/AdditionalPurchases/components/AdditionalPurchasesSteps/styles.module.css new file mode 100644 index 0000000..fbf56d9 --- /dev/null +++ b/src/components/pages/AdditionalPurchases/components/AdditionalPurchasesSteps/styles.module.css @@ -0,0 +1,102 @@ +.container { + display: flex; + flex-direction: column; + align-items: center; + width: 100%; + gap: 8px; +} + +.titles-container { + position: relative; + min-height: 32px; + height: fit-content; + display: flex; + flex-direction: row; + align-items: flex-end; + justify-content: space-between; + width: 100%; +} + +.steps-container { + position: relative; + width: 100%; + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + padding-top: 50px; +} + +.step-with-line { + position: relative; + display: flex; + flex-direction: row; + align-items: center; +} + +.step { + display: flex; + flex-direction: column; + align-items: center; + gap: 8px; + position: relative; + z-index: 9; +} + +.title { + position: absolute; + font-weight: 400; + font-size: 10px; + line-height: 16px; + color: #4f4f4f; + width: min-content; + text-align: center; + bottom: 32px; + /* min-width: 74px; */ +} + +.active .title { + font-weight: 600; +} + +.title-first { + width: max-content; + left: 0; +} + +.title-last { + right: 0; + text-align: right; +} + +.circle { + background: rgb(255, 240, 240); + border: 2px solid rgb(236, 200, 188); + width: 30px; + height: 30px; + border-radius: 100%; + display: flex; + align-items: center; + justify-content: center; +} + +.dote { + width: 10px; + height: 10px; + border-radius: 100%; + background: red; +} + +.line { + width: 100%; + height: 2px; + background-color: #ecc8bc; + position: absolute; + bottom: 14px; + left: 0; + z-index: 7; +} + +.active .line { + background-color: green; +} diff --git a/src/components/pages/AdditionalPurchases/components/ConsultationTable/icon.svg b/src/components/pages/AdditionalPurchases/components/ConsultationTable/icon.svg new file mode 100644 index 0000000..94aaea4 --- /dev/null +++ b/src/components/pages/AdditionalPurchases/components/ConsultationTable/icon.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/components/pages/AdditionalPurchases/components/ConsultationTable/index.tsx b/src/components/pages/AdditionalPurchases/components/ConsultationTable/index.tsx new file mode 100644 index 0000000..6b323e4 --- /dev/null +++ b/src/components/pages/AdditionalPurchases/components/ConsultationTable/index.tsx @@ -0,0 +1,40 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.css"; +import Icon from "./icon.svg"; + +function ConsultationTable() { + return ( +
+ + Your unique individual consultation + +
+
+
+ Icon +

+ 30-minute private + consultation with an expert +

+
+

+ You can ask for prediction of the future, live compatibility analysis; + love compatibility etc +

+
+
+
+ One time price offer: + $49.99 +
+ + Original price: + $99.99 + Save 50% + +
+
+ ); +} + +export default ConsultationTable; diff --git a/src/components/pages/AdditionalPurchases/components/ConsultationTable/styles.module.css b/src/components/pages/AdditionalPurchases/components/ConsultationTable/styles.module.css new file mode 100644 index 0000000..4c260ea --- /dev/null +++ b/src/components/pages/AdditionalPurchases/components/ConsultationTable/styles.module.css @@ -0,0 +1,112 @@ +.container { + margin: 24px auto 0; + display: flex; + flex-direction: column; + -webkit-box-align: center; + align-items: center; + max-width: 320px; + position: relative; + background: rgb(251, 251, 255); + border-radius: 16px; + width: 100%; +} + +.title { + font-weight: 700; + font-size: 20px; + line-height: 135%; + color: rgb(40, 40, 97); + text-align: center; + margin-bottom: 20px; + margin-top: 20px; +} + +.line { + width: 100%; + height: 1px; + background: rgb(212, 198, 229); +} + +.center-container { + padding: 20px; +} + +.center-container > .header { + display: flex; +} + +.center-container > .header > img { + width: 44px; + height: 44px; +} + +.center-container > .header > p { + color: rgb(106, 58, 162); + font-weight: 600; + font-size: 16px; + margin-left: 12px; + line-height: 135%; +} + +.center-container > .header > p > span { + -webkit-text-fill-color: transparent; + font-weight: 400; + background: linear-gradient( + 0deg, + rgba(255, 255, 255, 0.2), + rgba(255, 255, 255, 0.2) + ) + text, + linear-gradient(90.6deg, rgb(106, 77, 188) 0.47%, rgb(242, 153, 74) 137.94%); + background-clip: text; + color: rgb(106, 58, 162); +} + +.center-container > .text { + color: rgb(52, 52, 52); + font-size: 14px; + line-height: 135%; + margin-top: 12px; +} + +.footer { + padding: 20px; + width: 100%; +} + +.one-time-price { + color: rgb(40, 40, 97); + font-weight: 600; + font-size: 14px; + line-height: 24px; +} + +.current-price { + font-weight: 700; + font-size: 18px; + line-height: 25px; + color: rgb(40, 40, 97); +} + +.old-price-container { + color: rgb(130, 130, 130); + font-size: 14px; + line-height: 24px; +} + +.old-price { + text-decoration: line-through rgb(130, 130, 130); +} + +.save { + -webkit-text-fill-color: transparent; + font-weight: 700; + background: linear-gradient( + 0deg, + rgba(255, 255, 255, 0.2), + rgba(255, 255, 255, 0.2) + ) + text, + linear-gradient(90.6deg, rgb(106, 77, 188) 0.47%, rgb(242, 153, 74) 137.94%); + background-clip: text; +} diff --git a/src/components/pages/AdditionalPurchases/components/FirstSlide/index.tsx b/src/components/pages/AdditionalPurchases/components/FirstSlide/index.tsx new file mode 100644 index 0000000..a18f263 --- /dev/null +++ b/src/components/pages/AdditionalPurchases/components/FirstSlide/index.tsx @@ -0,0 +1,38 @@ +import { firstSliderList } from "@/data/additionalPurchases"; +import styles from "./styles.module.css"; + +function FirstSlide() { + return ( +
+ Premium Intro +
+ {firstSliderList.map((item, index) => ( +

+ + {item.title} +

+ ))} +

+ 5 + minutes to read +

+
+
+ get on appstore + get on google play +
+

+ $14 + 59 +

+
+
+
+ ); +} + +export default FirstSlide; diff --git a/src/components/pages/AdditionalPurchases/components/FirstSlide/styles.module.css b/src/components/pages/AdditionalPurchases/components/FirstSlide/styles.module.css new file mode 100644 index 0000000..e24ef63 --- /dev/null +++ b/src/components/pages/AdditionalPurchases/components/FirstSlide/styles.module.css @@ -0,0 +1,74 @@ +.container { + width: 100%; + background-color: rgb(241, 225, 247); + border-radius: 4px; + padding: 12px 8px; + display: flex !important; +} + +.image { + width: calc(50% - 8px); + height: 189px; + object-fit: contain; +} + +.right-half { + display: flex; + flex-direction: column; + margin-left: 6px; +} + +.item { + font-size: 10px; + display: flex; + -webkit-box-align: center; + align-items: center; + margin-bottom: 8px; +} + +.item > span { + display: inline-block; + background-size: contain; + background-position: center center; + background-repeat: no-repeat; + width: 18px; + height: 18px; + margin-right: 6px; + position: relative; + flex-shrink: 0; + top: -4px; + font-size: 18px; + font-weight: 700; + color: rgb(85, 84, 144); +} + +.bottom { + margin-top: auto; + display: flex; + align-items: flex-end; +} + +.bottom .links { + display: flex; + flex-direction: column; + margin-right: 12px; + gap: 2px; +} + +.bottom > .price { + border-radius: 4px; + padding: 8px 8px; + background: rgb(60, 60, 132); + color: rgb(251, 251, 255); + font-weight: 700; + display: flex; + -webkit-box-align: center; + align-items: center; + font-size: 28px; +} + +.bottom > .price > sup { + font-size: 14px; + position: relative; + top: -10px; +} diff --git a/src/components/pages/AdditionalPurchases/components/FooterButton/index.tsx b/src/components/pages/AdditionalPurchases/components/FooterButton/index.tsx new file mode 100644 index 0000000..de0eae2 --- /dev/null +++ b/src/components/pages/AdditionalPurchases/components/FooterButton/index.tsx @@ -0,0 +1,36 @@ +import MainButton from "@/components/MainButton"; +import styles from "./styles.module.css"; + +interface IFooterButtonProps { + classNameContainer?: string; + classNameButton?: string; + classNameSkip?: string; + children?: React.ReactNode; + onClick: () => void; + onClickSkip: () => void; +} + +function FooterButton({ + children, + onClick, + onClickSkip, + classNameContainer = "", + classNameButton = "", + classNameSkip = "", +}: IFooterButtonProps) { + return ( +
+ + {children} + +

+ Skip this offer and proceed further +

+
+ ); +} + +export default FooterButton; diff --git a/src/components/pages/AdditionalPurchases/components/FooterButton/styles.module.css b/src/components/pages/AdditionalPurchases/components/FooterButton/styles.module.css new file mode 100644 index 0000000..1109cec --- /dev/null +++ b/src/components/pages/AdditionalPurchases/components/FooterButton/styles.module.css @@ -0,0 +1,55 @@ +.container { + display: flex; + flex-direction: column; + width: 100%; + -webkit-box-align: center; + align-items: center; + position: fixed; + bottom: 0px; + left: 50%; + transform: translateX(-50%); + margin-top: 0px; + padding-bottom: 20px; + z-index: 5; + padding-left: 15px; + padding-right: 15px; +} + +.container::before { + content: ""; + position: absolute; + inset: -10px 0px 0px; + background: linear-gradient( + rgba(255, 240, 240, 0) 0%, + rgba(255, 240, 240, 0.95) 53.81% + ); +} + +.button { + border-radius: 12px; + margin-bottom: 10px; + min-height: 0; + height: 50px; + max-width: 360px; + width: 100%; + background: linear-gradient( + 165.54deg, + rgb(20, 19, 51) -33.39%, + rgb(32, 34, 97) 15.89%, + rgb(84, 60, 151) 55.84%, + #6939a2 74.96% + ); + color: rgb(251, 251, 255); + font-size: 16px; + font-weight: 400; +} + +.skip { + text-decoration: underline; + width: 310px; + font-size: 14px; + text-align: center; + z-index: 5; + user-select: none; + cursor: pointer; +} diff --git a/src/components/pages/AdditionalPurchases/components/PaymentAddress/index.tsx b/src/components/pages/AdditionalPurchases/components/PaymentAddress/index.tsx new file mode 100644 index 0000000..35a69b9 --- /dev/null +++ b/src/components/pages/AdditionalPurchases/components/PaymentAddress/index.tsx @@ -0,0 +1,9 @@ +import styles from "./styles.module.css" + +function PaymentAddress() { + return ( +

500 N RAINBOW BLVD LAS VEGAS, NV 89107

+ ) +} + +export default PaymentAddress \ No newline at end of file diff --git a/src/components/pages/AdditionalPurchases/components/PaymentAddress/styles.module.css b/src/components/pages/AdditionalPurchases/components/PaymentAddress/styles.module.css new file mode 100644 index 0000000..4e8b4f9 --- /dev/null +++ b/src/components/pages/AdditionalPurchases/components/PaymentAddress/styles.module.css @@ -0,0 +1,7 @@ +.address { + max-width: 360px; + font-size: 10px; + text-align: center; + margin-top: 9px; + color: rgb(130, 130, 130); +} diff --git a/src/components/pages/AdditionalPurchases/components/SignUpOffer/check-mark-1.svg b/src/components/pages/AdditionalPurchases/components/SignUpOffer/check-mark-1.svg new file mode 100644 index 0000000..0671ab2 --- /dev/null +++ b/src/components/pages/AdditionalPurchases/components/SignUpOffer/check-mark-1.svg @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/src/components/pages/AdditionalPurchases/components/SignUpOffer/index.tsx b/src/components/pages/AdditionalPurchases/components/SignUpOffer/index.tsx new file mode 100644 index 0000000..9c015b5 --- /dev/null +++ b/src/components/pages/AdditionalPurchases/components/SignUpOffer/index.tsx @@ -0,0 +1,53 @@ +import { ISignUpOffer } from "@/data/additionalPurchases"; +import styles from "./styles.module.css"; +import CheckMark from "./check-mark-1.svg"; + +interface ISignUpOfferProps extends ISignUpOffer { + isActive: boolean; + onClick: () => void; +} + +function SignUpOffer(props: ISignUpOfferProps) { + const { id, title, subtitle, emoji, isActive, onClick } = props; + const { current, old, discount } = props.price; + + return ( +
+
+ {isActive && Checkmark} +
+
+
+

{title}

+ {id === "ultra-pack" && ( + {discount}% OFF + )} +
+ {!!subtitle?.length && ( + {subtitle} + )} +
+ + ${current} ({" "} + {id === "ultra-pack" ? "regular price" : "was"}{" "} + ${old} ) + + {id !== "ultra-pack" && ( +
+ {discount}% OFF +
+ )} +
+
+ +
+ ); +} + +export default SignUpOffer; diff --git a/src/components/pages/AdditionalPurchases/components/SignUpOffer/styles.module.css b/src/components/pages/AdditionalPurchases/components/SignUpOffer/styles.module.css new file mode 100644 index 0000000..692466e --- /dev/null +++ b/src/components/pages/AdditionalPurchases/components/SignUpOffer/styles.module.css @@ -0,0 +1,137 @@ +.container { + display: flex; + -webkit-box-align: center; + align-items: center; + -webkit-box-pack: justify; + justify-content: space-between; + border: unset; + box-sizing: border-box; + cursor: pointer; + padding: 12px 16px; + margin-left: auto; + margin-right: auto; + box-shadow: rgba(84, 60, 151, 0.25) 2px 2px 6px; + border-radius: 12px; + color: rgb(56, 13, 68); + max-width: 450px; + width: 100%; + background: rgb(255, 255, 255); +} + +.container.active { + background: linear-gradient( + 125.02deg, + rgba(100, 43, 115, 0.2) 18.39%, + rgba(198, 66, 110, 0.2) 81.83% + ); + border: 2px solid rgb(214, 166, 232); +} + +.mark { + border-radius: 50%; + width: 24px; + height: 24px; + display: flex; + -webkit-box-align: center; + align-items: center; + -webkit-box-pack: center; + justify-content: center; + border: 1px solid rgb(212, 198, 229); +} + +.active .mark { + background: linear-gradient( + 125.02deg, + rgb(100, 43, 115) 18.39%, + rgb(198, 66, 110) 81.83% + ); +} + +.text-container { + display: flex; + flex-direction: column; + -webkit-box-flex: 1; + flex-grow: 1; + margin-left: 16px; +} + +.title-container { + width: 100%; + display: flex; + -webkit-box-align: center; + align-items: center; +} + +.title { + font-weight: 600; + text-transform: uppercase; + font-size: 16px; + line-height: 135%; +} + +.subtitle { + color: rgb(56, 13, 68); + font-size: 14px; + line-height: 135%; + margin-bottom: 5px; +} + +.price-container { + font-size: 12px; + font-weight: 600; + color: rgb(79, 79, 79); +} + +.current-price { + font-size: 14px; +} + +.old-price { + color: rgb(106, 58, 162); + text-decoration: line-through; +} + +.discount-container { + background: rgb(232, 232, 252); + border-radius: 4px; + display: inline-block; + margin-left: 4px; + padding-left: 4px; + padding-right: 4px; +} + +.discount { + background: linear-gradient( + 165.54deg, + rgb(20, 19, 51) -33.39%, + rgb(32, 34, 97) 15.89%, + rgb(84, 60, 151) 55.84%, + rgb(105, 57, 162) 74.96% + ) + text; + font-size: 12px; + line-height: 170%; + -webkit-text-fill-color: transparent; +} + +.emoji { + display: inline-block; + background-size: contain; + background-position: center center; + background-repeat: no-repeat; + width: 24px; + height: 24px; + margin-left: 3px; +} + +.title-container > .discount { + background: rgb(201, 137, 225); + border-radius: 4px; + margin-left: 12px; + padding-left: 4px; + padding-right: 4px; + font-size: 12px; + line-height: 170%; + color: rgb(251, 251, 255); + -webkit-text-fill-color: unset; +} diff --git a/src/components/pages/AdditionalPurchases/components/SliderNextArrow/arrow.svg b/src/components/pages/AdditionalPurchases/components/SliderNextArrow/arrow.svg new file mode 100644 index 0000000..1430fb2 --- /dev/null +++ b/src/components/pages/AdditionalPurchases/components/SliderNextArrow/arrow.svg @@ -0,0 +1,9 @@ + + White circle with purple arrow pointing to the right + + + \ No newline at end of file diff --git a/src/components/pages/AdditionalPurchases/components/SliderNextArrow/index.tsx b/src/components/pages/AdditionalPurchases/components/SliderNextArrow/index.tsx new file mode 100644 index 0000000..3238e39 --- /dev/null +++ b/src/components/pages/AdditionalPurchases/components/SliderNextArrow/index.tsx @@ -0,0 +1,19 @@ +import { DetailedHTMLProps, HTMLAttributes } from "react"; +import styles from "./styles.module.css"; +import Arrow from "./arrow.svg"; + +function SliderNextArrow( + props: DetailedHTMLProps, HTMLDivElement> +) { + const { className, style, onClick } = props; + return ( + + ); +} + +export default SliderNextArrow; diff --git a/src/components/pages/AdditionalPurchases/components/SliderNextArrow/styles.module.css b/src/components/pages/AdditionalPurchases/components/SliderNextArrow/styles.module.css new file mode 100644 index 0000000..8848ecd --- /dev/null +++ b/src/components/pages/AdditionalPurchases/components/SliderNextArrow/styles.module.css @@ -0,0 +1,6 @@ +.arrow { + z-index: 2 !important; + width: 24px !important; + height: 24px !important; + right: -12px !important; +} diff --git a/src/components/pages/AdditionalPurchases/components/SliderPrevArrow/index.tsx b/src/components/pages/AdditionalPurchases/components/SliderPrevArrow/index.tsx new file mode 100644 index 0000000..51eb8cd --- /dev/null +++ b/src/components/pages/AdditionalPurchases/components/SliderPrevArrow/index.tsx @@ -0,0 +1,19 @@ +import { DetailedHTMLProps, HTMLAttributes } from "react"; +import styles from "./styles.module.css"; +import Arrow from "../SliderNextArrow/arrow.svg"; + +function SliderPrevArrow( + props: DetailedHTMLProps, HTMLDivElement> +) { + const { className, style, onClick } = props; + return ( + + ); +} + +export default SliderPrevArrow; diff --git a/src/components/pages/AdditionalPurchases/components/SliderPrevArrow/styles.module.css b/src/components/pages/AdditionalPurchases/components/SliderPrevArrow/styles.module.css new file mode 100644 index 0000000..be8939c --- /dev/null +++ b/src/components/pages/AdditionalPurchases/components/SliderPrevArrow/styles.module.css @@ -0,0 +1,7 @@ +.arrow { + z-index: 2 !important; + width: 24px !important; + height: 24px !important; + left: -12px !important; + transform: translate(0px, -50%) scale(-1) !important; +} diff --git a/src/components/pages/AdditionalPurchases/components/ThankYouBanner/index.tsx b/src/components/pages/AdditionalPurchases/components/ThankYouBanner/index.tsx new file mode 100644 index 0000000..1cf49fe --- /dev/null +++ b/src/components/pages/AdditionalPurchases/components/ThankYouBanner/index.tsx @@ -0,0 +1,22 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.css"; + +function ThankYouBanner() { + return ( +
+ Love +
+ + Thank you! + +

Your order was successful!

+
+
+ ); +} + +export default ThankYouBanner; diff --git a/src/components/pages/AdditionalPurchases/components/ThankYouBanner/styles.module.css b/src/components/pages/AdditionalPurchases/components/ThankYouBanner/styles.module.css new file mode 100644 index 0000000..f6a1b89 --- /dev/null +++ b/src/components/pages/AdditionalPurchases/components/ThankYouBanner/styles.module.css @@ -0,0 +1,32 @@ +.container { + width: 100%; + padding: 6px 20px; + background-color: #a5a3f3; + border-radius: 8px; + display: flex; + flex-direction: row; + align-items: center; + gap: 15px; + color: #fff; + height: min-content; + margin-top: 12px; +} + +.image { + height: 34px; + aspect-ratio: 1 / 1; +} + +.title { + text-align: left; + margin-bottom: 4px; + font-size: 14px; + font-weight: 700; + line-height: 135%; +} + +.text { + font-size: 14px; + line-height: 20px; + font-weight: 400; +} diff --git a/src/components/pages/AdditionalPurchases/index.tsx b/src/components/pages/AdditionalPurchases/index.tsx new file mode 100644 index 0000000..36a39aa --- /dev/null +++ b/src/components/pages/AdditionalPurchases/index.tsx @@ -0,0 +1,19 @@ +import { Outlet } from "react-router-dom"; +import AdditionalPurchasesSteps from "./components/AdditionalPurchasesSteps"; +import styles from "./styles.module.css"; +import { steps } from "@/data/additionalPurchases"; + +function AdditionalPurchases() { + const activeStep = steps.findIndex((value) => + window.location.href.includes(value.link) + ); + + return ( +
+ + +
+ ); +} + +export default AdditionalPurchases; diff --git a/src/components/pages/AdditionalPurchases/pages/AddConsultation/index.tsx b/src/components/pages/AdditionalPurchases/pages/AddConsultation/index.tsx new file mode 100644 index 0000000..7e98855 --- /dev/null +++ b/src/components/pages/AdditionalPurchases/pages/AddConsultation/index.tsx @@ -0,0 +1,39 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.css"; +import ConsultationTable from "../../components/ConsultationTable"; +import PaymentAddress from "../../components/PaymentAddress"; +import FooterButton from "../../components/FooterButton"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; + +function AddConsultationPage() { + const navigate = useNavigate(); + const handleNext = () => { + navigate(routes.client.home()); + }; + return ( +
+ + More for you + + + Exclusive offer recommended for you to achieve your goals faster + + +

+ *You will be charged for the add-on services or offers selected at the + time of purchase. +
+ This is a non-recuring payment. +

+ + +
+ ); +} + +export default AddConsultationPage; diff --git a/src/components/pages/AdditionalPurchases/pages/AddConsultation/styles.module.css b/src/components/pages/AdditionalPurchases/pages/AddConsultation/styles.module.css new file mode 100644 index 0000000..345f5a5 --- /dev/null +++ b/src/components/pages/AdditionalPurchases/pages/AddConsultation/styles.module.css @@ -0,0 +1,38 @@ +.container { + width: 100%; + padding-bottom: 120px; +} + +.title { + text-align: center; + font-size: 18px; + font-weight: bold; + line-height: 135%; + color: rgb(51, 51, 51); + margin-top: 12px; + margin-bottom: 0; +} + +.subtitle { + font-size: 18px; + text-align: center; + font-weight: 400; + color: rgb(106, 58, 162); + margin-bottom: 0; + max-width: 460px; + margin-left: auto; + margin-right: auto; + line-height: 135%; +} + +.description { + margin-top: 24px; + margin-bottom: 20px; + font-size: 12px; + max-width: 330px; + margin-left: auto; + margin-right: auto; + text-align: center; + line-height: 140%; + color: rgb(79, 79, 79); +} diff --git a/src/components/pages/AdditionalPurchases/pages/AddReport/index.tsx b/src/components/pages/AdditionalPurchases/pages/AddReport/index.tsx new file mode 100644 index 0000000..51b7fd5 --- /dev/null +++ b/src/components/pages/AdditionalPurchases/pages/AddReport/index.tsx @@ -0,0 +1,55 @@ +import Title from "@/components/Title"; +import ThankYouBanner from "../../components/ThankYouBanner"; +import styles from "./styles.module.css"; +import { signUpOffers } from "@/data/additionalPurchases"; +import SignUpOffer from "../../components/SignUpOffer"; +import { useState } from "react"; +import { useNavigate } from "react-router-dom"; +import FooterButton from "../../components/FooterButton"; +import routes from "@/routes"; +import PaymentAddress from "../../components/PaymentAddress"; + +function AddReportPage() { + const navigate = useNavigate(); + const [activeOffer, setActiveOffer] = useState(signUpOffers[0].id); + + const handleClick = () => { + navigate(routes.client.unlimitedReadings()); + }; + + return ( +
+ + + Choose your sign-up offer 🔥 + + + Available only now + +
+ {signUpOffers.map((offer, index) => ( + setActiveOffer(offer.id)} + /> + ))} +
+

+ *You will be charged for the add-on services or offers selected at the + time of purchase. This is a non-recuring payment. +

+ + + Get my copy + +
+ ); +} + +export default AddReportPage; diff --git a/src/components/pages/AdditionalPurchases/pages/AddReport/styles.module.css b/src/components/pages/AdditionalPurchases/pages/AddReport/styles.module.css new file mode 100644 index 0000000..4aa5861 --- /dev/null +++ b/src/components/pages/AdditionalPurchases/pages/AddReport/styles.module.css @@ -0,0 +1,58 @@ +.container { + width: 100%; + padding-bottom: 120px; +} + +.offers-container { + width: 100%; + display: flex; + flex-direction: column; + align-items: center; + gap: 16px; +} + +.description { + text-align: center; + font-size: 14px; + margin-top: 16px; +} + +.address { + color: gray; + font-size: 10px; + text-align: center; + margin-top: 16px; +} + +.title { + text-align: center; + font-size: 18px; + font-weight: bold; + line-height: 135%; + color: rgb(51, 51, 51); + margin-top: 16px; + margin-bottom: 0; +} + +.subtitle { + font-size: 18px; + text-align: center; + font-weight: 400; + color: rgb(106, 58, 162); + margin-bottom: 8px; + max-width: 460px; + margin-left: auto; + margin-right: auto; + line-height: 135%; +} + +.description { + max-width: 526px; + margin-left: auto; + margin-right: auto; + text-align: center; + font-size: 12px; + line-height: 140%; + margin-bottom: 20px; + color: rgb(79, 79, 79); +} diff --git a/src/components/pages/AdditionalPurchases/pages/UnlimitedReadings/index.tsx b/src/components/pages/AdditionalPurchases/pages/UnlimitedReadings/index.tsx new file mode 100644 index 0000000..50e8db8 --- /dev/null +++ b/src/components/pages/AdditionalPurchases/pages/UnlimitedReadings/index.tsx @@ -0,0 +1,79 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.css"; +import { unlimitedReadings } from "@/data/additionalPurchases"; +import FooterButton from "../../components/FooterButton"; +import { useNavigate } from "react-router-dom"; +import Slider from "react-slick"; +import FirstSlide from "../../components/FirstSlide"; +import SliderNextArrow from "../../components/SliderNextArrow"; +import SliderPrevArrow from "../../components/SliderPrevArrow"; +import routes from "@/routes"; +import PaymentAddress from "../../components/PaymentAddress"; + +function UnlimitedReadingsPage() { + const navigate = useNavigate(); + const handleClick = () => { + navigate(routes.client.addConsultation()); + }; + + const sliderSettings = { + dots: false, + infinite: false, + speed: 500, + slidesToShow: 1, + slidesToScroll: 1, + className: styles["slider-container"], + nextArrow: , + prevArrow: , + }; + + return ( +
+ + +
+ Premium Intro + Premium Intro +
+
+ Premium Intro + Premium Intro +
+
+ + Access the unlimited astrology guides and compatibility readings + +
    + {unlimitedReadings.map(({ title, icon }, index) => ( +
  • + + {title} +
  • + ))} +
+ + Add unlimited readings + +

+ Please note: In addition to your subscription, your account will be + charged €14.59 for the selected add-ons as you click Add unlimited + readings. Items on this page are 30 days subscriptions. Unless you + cancel it in your profile before the end of the then-current period, you + agree that the subscription will renew automatically at the end of each + period. If you need help with how to cancel, visit our +

+ +
+ ); +} + +export default UnlimitedReadingsPage; diff --git a/src/components/pages/AdditionalPurchases/pages/UnlimitedReadings/styles.module.css b/src/components/pages/AdditionalPurchases/pages/UnlimitedReadings/styles.module.css new file mode 100644 index 0000000..271d6e7 --- /dev/null +++ b/src/components/pages/AdditionalPurchases/pages/UnlimitedReadings/styles.module.css @@ -0,0 +1,84 @@ +.container { + width: 100%; +} + +.title { + text-align: center; + font-size: 18px; + font-weight: bold; + line-height: 135%; + color: rgb(51, 51, 51); + margin-top: 30px; + margin-bottom: 20px; +} + +.list .item { + display: flex; + margin-bottom: 12px; + font-size: 14px; +} + +.item > .image { + display: inline-block; + background-size: contain; + background-position: center center; + background-repeat: no-repeat; + width: 20px; + height: 20px; + margin-right: 8px; + position: relative; + top: 2px; + flex-shrink: 0; +} + +.buttons-container { + position: relative; + padding: 0; + margin-top: 20px; +} + +.button { + font-weight: 600; + box-shadow: rgba(0, 0, 0, 0.25) 0px 4px 4px 0px; + position: sticky; + bottom: 10px; + max-width: 400px; + margin-top: 20px; + height: 53px; +} + +.skip { + text-decoration: underline; + font-size: 14px; + text-align: center; + z-index: 5; + color: rgb(130, 130, 130); + margin-top: 16px; + width: 100%; +} + +.policy { + color: rgb(79, 79, 79); + font-size: 10px; + max-width: 474px; + margin-top: 24px; + line-height: 1.5; +} + +.slider-container { + margin-top: 12px; +} + +.slider { + width: 100%; + background-color: transparent; + border-radius: 4px; + padding: 12px 8px; + display: flex !important; +} + +.slider > img { + width: calc(50% - 8px); + height: 189px; + object-fit: contain; +} diff --git a/src/components/pages/AdditionalPurchases/styles.module.css b/src/components/pages/AdditionalPurchases/styles.module.css new file mode 100644 index 0000000..533a347 --- /dev/null +++ b/src/components/pages/AdditionalPurchases/styles.module.css @@ -0,0 +1,11 @@ +.page { + position: relative; + height: fit-content; + min-height: calc(100dvh - 50px); + display: flex; + justify-content: start; + align-items: center; + flex-direction: column; + background: rgb(255, 240, 240); + width: 100%; +} diff --git a/src/components/pages/QuestionnaireIntermediate/index.tsx b/src/components/pages/QuestionnaireIntermediate/index.tsx index d9302d9..1425252 100644 --- a/src/components/pages/QuestionnaireIntermediate/index.tsx +++ b/src/components/pages/QuestionnaireIntermediate/index.tsx @@ -6,6 +6,7 @@ import routes from "@/routes"; import { useSelector } from "react-redux"; import { selectors } from "@/store"; import { textVariables } from "@/data"; +import StaryKey from "./starry_key.svg"; function QuestionnaireIntermediatePage() { const navigate = useNavigate(); @@ -38,6 +39,7 @@ function QuestionnaireIntermediatePage() { backgroundImage: `url(${backgroundImage})`, }} > + svg-animation The starry key + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/data/additionalPurchases.ts b/src/data/additionalPurchases.ts new file mode 100644 index 0000000..c21cc51 --- /dev/null +++ b/src/data/additionalPurchases.ts @@ -0,0 +1,140 @@ +export interface IAdditionalPurchasesStep { + id: number; + title: string; + link: string; +} + +export const steps: IAdditionalPurchasesStep[] = [ + { + id: 0, + title: "Add Report", + link: "add-report", + }, + { + id: 1, + title: "Unlimited Readings", + link: "unlimited-readings", + }, + { + id: 2, + title: "Add Consultation", + link: "add-consultation", + }, + { + id: 3, + title: "Access Product", + link: "", + }, +]; + +interface ISignUpOfferPrice { + current: number; + old?: number; + discount?: number; +} + +export interface ISignUpOffer { + id: string; + title: string; + subtitle?: string; + price: ISignUpOfferPrice; + emoji: string; +} + +export const signUpOffers: ISignUpOffer[] = [ + { + id: "ultra-pack", + title: "ULTRA PACK", + subtitle: "(3 in 1 + 2 secret bonus reading)", + price: { + current: 49.99, + old: 99.99, + discount: 50, + }, + emoji: "star_struck.png", + }, + { + id: "numerology-analyses", + title: "NUMEROLOGY ANALYSIS", + price: { + current: 14.99, + old: 29.99, + discount: 50, + }, + emoji: "input_numbers.png", + }, + { + id: "tarot-reading", + title: "TAROT READING", + price: { + current: 19.99, + old: 34.99, + discount: 45, + }, + emoji: "sunset.png", + }, + { + id: "palmistry-guide", + title: "PALMISTRY GUIDE", + price: { + current: 19.99, + old: 29.99, + discount: 30, + }, + emoji: "rised_hand.png", + }, +]; + +interface IUnlimitedReadings { + id: number; + title: string; + icon: string; +} + +export const unlimitedReadings: IUnlimitedReadings[] = [ + { + id: 0, + title: "check compatibility as many times as you need", + icon: "/woman-heart-man.png", + }, + { + id: 1, + title: + "hundreds of insights to help you to achieve your relationship goals", + icon: "/sparkles.png", + }, + { + id: 2, + title: "personalized daily horoscopes and astrological guides with no ads", + icon: "/crystal_ball.png", + }, + { + id: 3, + title: "auto-renewable 1-month plan, cancel anytime", + icon: "/check_mark_button.png", + }, +]; + +interface IFirstSliderItem { + id: number; + title: string; + icon: string; +} + +export const firstSliderList: IFirstSliderItem[] = [ + { + id: 0, + title: "personal affirmations for everyday", + icon: "/crystal_ball.png", + }, + { + id: 1, + title: "more insight in less time", + icon: "/sparkles.png", + }, + { + id: 2, + title: "learn visually", + icon: "/technologist.png", + }, +]; diff --git a/src/index.css b/src/index.css index 14688f7..8127ccf 100644 --- a/src/index.css +++ b/src/index.css @@ -1,3 +1,6 @@ +@import "slick-carousel/slick/slick.css"; +@import "slick-carousel/slick/slick-theme.css"; + * { box-sizing: border-box; font-family: SF Pro Text, sans-serif; @@ -162,10 +165,10 @@ div[class^="divider"] { font-family: SF Pro Text Regular, sans-serif; } -* { +/* * { scrollbar-color: #cde8f9 #fff; scrollbar-width: auto; -} +} */ ::-webkit-scrollbar { width: 0px; @@ -239,3 +242,7 @@ textarea { position: fixed; overflow: hidden; } + +.slick-disabled { + opacity: 0.5 !important; +} diff --git a/src/routes.ts b/src/routes.ts index f4ba80c..7212a4f 100755 --- a/src/routes.ts +++ b/src/routes.ts @@ -81,6 +81,12 @@ const routes = { // Email letters email: (path: string) => [host, "email", path].join("/"), + + // Additional Purchases + addReport: () => [host, "add-report"].join("/"), + unlimitedReadings: () => [host, "unlimited-readings"].join("/"), + addConsultation: () => [host, "add-consultation"].join("/"), + notFound: () => [host, "404"].join("/"), }, server: { @@ -233,6 +239,9 @@ export const withoutFooterRoutes = [ routes.client.email("marketing-landing"), routes.client.email("marketing-trial-payment"), routes.client.tryApp(), + routes.client.addReport(), + routes.client.unlimitedReadings(), + routes.client.addConsultation(), ]; export const withoutFooterPartOfRoutes = [routes.client.questionnaire()];