diff --git a/public/aboutPlan.webp b/public/aboutPlan.webp
new file mode 100644
index 0000000..e1c3081
Binary files /dev/null and b/public/aboutPlan.webp differ
diff --git a/public/credit-card-white.svg b/public/credit-card-white.svg
new file mode 100644
index 0000000..5c54400
--- /dev/null
+++ b/public/credit-card-white.svg
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/guide.webp b/public/guide.webp
new file mode 100644
index 0000000..a2a841c
Binary files /dev/null and b/public/guide.webp differ
diff --git a/public/horoscopePhone.webp b/public/horoscopePhone.webp
new file mode 100644
index 0000000..9a09ae0
Binary files /dev/null and b/public/horoscopePhone.webp differ
diff --git a/public/info.svg b/public/info.svg
new file mode 100644
index 0000000..0cfa433
--- /dev/null
+++ b/public/info.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/public/medal.svg b/public/medal.svg
new file mode 100644
index 0000000..883986c
--- /dev/null
+++ b/public/medal.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/messanging.webp b/public/messanging.webp
new file mode 100644
index 0000000..f4a0422
Binary files /dev/null and b/public/messanging.webp differ
diff --git a/public/payments.svg b/public/payments.svg
new file mode 100644
index 0000000..c87f470
--- /dev/null
+++ b/public/payments.svg
@@ -0,0 +1,302 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/timerBackground.png b/public/timerBackground.png
new file mode 100644
index 0000000..f253d45
Binary files /dev/null and b/public/timerBackground.png differ
diff --git a/public/understanding.webp b/public/understanding.webp
new file mode 100644
index 0000000..8a1db4d
Binary files /dev/null and b/public/understanding.webp differ
diff --git a/public/user1.webp b/public/user1.webp
new file mode 100644
index 0000000..ec9f152
Binary files /dev/null and b/public/user1.webp differ
diff --git a/public/user2.webp b/public/user2.webp
new file mode 100644
index 0000000..4159e23
Binary files /dev/null and b/public/user2.webp differ
diff --git a/public/user3.webp b/public/user3.webp
new file mode 100644
index 0000000..b752c17
Binary files /dev/null and b/public/user3.webp differ
diff --git a/public/wrapped-gift.webp b/public/wrapped-gift.webp
new file mode 100644
index 0000000..0187815
Binary files /dev/null and b/public/wrapped-gift.webp differ
diff --git a/src/components/App/index.tsx b/src/components/App/index.tsx
index 331b8dc..9522749 100755
--- a/src/components/App/index.tsx
+++ b/src/components/App/index.tsx
@@ -93,6 +93,8 @@ import TrialPaymentPage from "../pages/TrialPayment";
import ReactGA from "react-ga4";
import AdditionalDiscount from "../pages/AdditionalDiscount";
import TrialPaymentWithDiscount from "../pages/TrialPaymentWithDiscount";
+import MarketingLanding from "../pages/EmailLetters/MarketingLanding";
+import MarketingTrialPayment from "../pages/EmailLetters/MarketingTrialPayment";
const isProduction = import.meta.env.MODE === "production";
@@ -279,6 +281,17 @@ function App(): JSX.Element {
{/* Test Routes End */}
+ {/* Email Letters */}
+ }
+ />
+ }
+ />
+ {/* Email Letters End */}
+
}
diff --git a/src/components/StripePage/ApplePayButton/index.tsx b/src/components/StripePage/ApplePayButton/index.tsx
index abf3c9a..201ec02 100644
--- a/src/components/StripePage/ApplePayButton/index.tsx
+++ b/src/components/StripePage/ApplePayButton/index.tsx
@@ -70,17 +70,6 @@ function ApplePayButton({
);
paymentIntent;
- fetch("https://9bbb-78-85-20-145.ngrok-free.app/test", {
- method: "POST",
- body: JSON.stringify({
- paymentIntent: JSON.stringify(paymentIntent),
- stripeError: JSON.stringify(stripeError),
- }),
- headers: {
- "Content-type": "application/json; charset=UTF-8",
- },
- });
-
if (stripeError) {
// Show error to your customer (e.g., insufficient funds)
navigate(
diff --git a/src/components/pages/EmailLetters/MarketingLanding/components/ComparePrices/index.tsx b/src/components/pages/EmailLetters/MarketingLanding/components/ComparePrices/index.tsx
new file mode 100644
index 0000000..5427f4b
--- /dev/null
+++ b/src/components/pages/EmailLetters/MarketingLanding/components/ComparePrices/index.tsx
@@ -0,0 +1,32 @@
+import Title from "@/components/Title";
+import styles from "./styles.module.css";
+
+function ComparePrices() {
+ return (
+
+
+
+
free
+
+
+ new price
+
+
+
+
+
+ );
+}
+
+export default ComparePrices;
diff --git a/src/components/pages/EmailLetters/MarketingLanding/components/ComparePrices/styles.module.css b/src/components/pages/EmailLetters/MarketingLanding/components/ComparePrices/styles.module.css
new file mode 100644
index 0000000..2b1814e
--- /dev/null
+++ b/src/components/pages/EmailLetters/MarketingLanding/components/ComparePrices/styles.module.css
@@ -0,0 +1,98 @@
+.container {
+ width: 100%;
+ display: flex;
+ flex-direction: row;
+ justify-content: center;
+ gap: 18px;
+ margin-top: 40px;
+}
+
+.old-price {
+ display: flex;
+ flex-direction: column;
+ border-radius: 16px;
+ width: 135px;
+ border: 1px solid rgb(106, 58, 162);
+ position: relative;
+}
+
+.header-container {
+ border-radius: 16px 16px 0px 0px;
+ display: flex;
+ -webkit-box-pack: center;
+ justify-content: center;
+ -webkit-box-align: center;
+ align-items: center;
+ padding-top: 10px;
+ padding-bottom: 10px;
+ border-bottom: 1px solid rgb(106, 58, 162);
+ font-weight: 600;
+ font-size: 16px;
+ line-height: 140%;
+}
+
+.header-container > .title {
+ text-transform: uppercase;
+ font-weight: 600;
+ font-size: 16px;
+ line-height: 140%;
+ margin: 0;
+}
+
+.main-container {
+ padding-top: 30px;
+ padding-bottom: 30px;
+}
+
+.main-container > .text {
+ font-weight: 600;
+ font-size: 24px;
+ line-height: 120%;
+ color: #333333;
+}
+
+.new-price {
+ border-radius: 16px;
+ border: none;
+ width: 160px;
+ padding: 4px;
+ background: rgb(142, 140, 240);
+}
+
+.new-price > .header-container > .title {
+ color: rgb(251, 251, 255);
+}
+
+.new-price > .main-container {
+ background-color: #fff;
+ border-radius: 0px 0px 16px 16px;
+ display: flex;
+ -webkit-box-pack: center;
+ justify-content: center;
+ -webkit-box-align: center;
+ align-items: center;
+}
+
+.new-price > .main-container > .text {
+ font-weight: bold;
+ font-size: 48px;
+ -webkit-text-fill-color: rgb(52, 52, 52);
+}
+
+.price-container {
+ position: relative;
+}
+
+.free {
+ position: absolute;
+ top: calc(-0.5em - 5px);
+ left: 50%;
+ transform: translateX(-50%);
+ background: rgb(86, 204, 242);
+ padding: 6px 15px;
+ color: #fff;
+ border-radius: 20px;
+ text-transform: uppercase;
+ font-size: 14px;
+ font-weight: 600;
+}
diff --git a/src/components/pages/EmailLetters/MarketingLanding/components/LastWeek/index.tsx b/src/components/pages/EmailLetters/MarketingLanding/components/LastWeek/index.tsx
new file mode 100644
index 0000000..e252cad
--- /dev/null
+++ b/src/components/pages/EmailLetters/MarketingLanding/components/LastWeek/index.tsx
@@ -0,0 +1,14 @@
+import styles from "./styles.module.css";
+
+function LastWeek() {
+ return (
+
+
+ Last week alone 2000+ people got this relationship guide
+
+
+
+ );
+}
+
+export default LastWeek;
diff --git a/src/components/pages/EmailLetters/MarketingLanding/components/LastWeek/styles.module.css b/src/components/pages/EmailLetters/MarketingLanding/components/LastWeek/styles.module.css
new file mode 100644
index 0000000..afa1dfa
--- /dev/null
+++ b/src/components/pages/EmailLetters/MarketingLanding/components/LastWeek/styles.module.css
@@ -0,0 +1,22 @@
+.container {
+ display: flex;
+ -webkit-box-pack: justify;
+ justify-content: space-between;
+ -webkit-box-align: center;
+ align-items: center;
+ width: 100%;
+ padding: 20px;
+ margin: 20px 0;
+ background: rgb(106, 58, 162);
+ border-radius: 15px;
+}
+
+.text {
+ color: rgb(251, 251, 255);
+ font-size: 14px;
+ line-height: 140%;
+}
+
+.image {
+ width: 32px;
+}
diff --git a/src/components/pages/EmailLetters/MarketingLanding/components/MoneyBack/index.tsx b/src/components/pages/EmailLetters/MarketingLanding/components/MoneyBack/index.tsx
new file mode 100644
index 0000000..67c02df
--- /dev/null
+++ b/src/components/pages/EmailLetters/MarketingLanding/components/MoneyBack/index.tsx
@@ -0,0 +1,22 @@
+import Title from "@/components/Title";
+import styles from "./styles.module.css";
+
+function MoneyBack() {
+ return (
+
+
+ Money-back guarantee
+
+
+
+ We are convinced that we will help you get a deeper understanding of
+ your partner and how you can improve your relationship. After all of our
+ stellar customer reviews, we are ready to return your money if you feel
+ that this report doesn’t provide any value. Find more about applicable
+ limitations in our Money-back policy.
+
+
+ );
+}
+
+export default MoneyBack;
diff --git a/src/components/pages/EmailLetters/MarketingLanding/components/MoneyBack/styles.module.css b/src/components/pages/EmailLetters/MarketingLanding/components/MoneyBack/styles.module.css
new file mode 100644
index 0000000..2323a41
--- /dev/null
+++ b/src/components/pages/EmailLetters/MarketingLanding/components/MoneyBack/styles.module.css
@@ -0,0 +1,34 @@
+.container {
+ 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%
+ );
+ border-radius: 20px;
+ position: relative;
+ padding: 30px 15px 20px;
+ width: 100%;
+}
+
+.title {
+ text-align: start;
+ font-weight: 600;
+ font-size: 20px;
+ line-height: 120%;
+ color: rgb(251, 251, 255);
+ max-width: calc(100% - 60px);
+}
+
+.text {
+ font-size: 14px;
+ line-height: 24px;
+ color: rgb(251, 251, 255);
+}
+
+.image {
+ position: absolute;
+ top: 0;
+ right: 12px;
+}
diff --git a/src/components/pages/EmailLetters/MarketingLanding/components/SpecialOfferBanner/index.tsx b/src/components/pages/EmailLetters/MarketingLanding/components/SpecialOfferBanner/index.tsx
new file mode 100644
index 0000000..e2ae749
--- /dev/null
+++ b/src/components/pages/EmailLetters/MarketingLanding/components/SpecialOfferBanner/index.tsx
@@ -0,0 +1,18 @@
+import Title from "@/components/Title";
+import styles from "./styles.module.css";
+
+function SpecialOfferBanner() {
+ return (
+
+
+
+
+ Special Offer!
+
+
Everything for free. Trial include!
+
+
+ );
+}
+
+export default SpecialOfferBanner;
diff --git a/src/components/pages/EmailLetters/MarketingLanding/components/SpecialOfferBanner/styles.module.css b/src/components/pages/EmailLetters/MarketingLanding/components/SpecialOfferBanner/styles.module.css
new file mode 100644
index 0000000..03f7eda
--- /dev/null
+++ b/src/components/pages/EmailLetters/MarketingLanding/components/SpecialOfferBanner/styles.module.css
@@ -0,0 +1,32 @@
+.container {
+ position: -webkit-sticky;
+ position: sticky;
+ width: 100%;
+ max-width: 360px;
+ top: 0px;
+ z-index: 3;
+ background: rgb(142, 140, 240);
+ padding: 20px;
+ display: flex;
+ gap: 10px;
+ color: #e8e8fc;
+}
+
+.text-container {
+ display: flex;
+ flex-direction: column;
+ gap: 3px;
+}
+
+.title {
+ font-size: 24px;
+ line-height: 29px;
+ margin: 0;
+ text-align: left;
+}
+
+.text {
+ font-size: 14px;
+ font-weight: 600;
+ line-height: 140%;
+}
diff --git a/src/components/pages/EmailLetters/MarketingLanding/index.tsx b/src/components/pages/EmailLetters/MarketingLanding/index.tsx
new file mode 100644
index 0000000..a1a6d1b
--- /dev/null
+++ b/src/components/pages/EmailLetters/MarketingLanding/index.tsx
@@ -0,0 +1,86 @@
+import Title from "@/components/Title";
+import SpecialOfferBanner from "./components/SpecialOfferBanner";
+import styles from "./styles.module.css";
+import ComparePrices from "./components/ComparePrices";
+import PointsList from "../../TrialPayment/components/PointsList";
+import { marketingLandingPointsList } from "@/data/pointsLists";
+import Reviews from "../../TrialPayment/components/Reviews";
+import { marketingLandingReviews } from "@/data/reviews";
+import LastWeek from "./components/LastWeek";
+import MoneyBack from "./components/MoneyBack";
+import GuardPayments from "../../TrialPayment/components/GuardPayments";
+import MainButton from "@/components/MainButton";
+import { useSelector } from "react-redux";
+import { selectors } from "@/store";
+import { getZodiacSignByDate } from "@/services/zodiac-sign";
+import { useNavigate } from "react-router-dom";
+import routes from "@/routes";
+
+function MarketingLanding() {
+ const birthdate = useSelector(selectors.selectBirthdate);
+ const zodiacSign = getZodiacSignByDate(birthdate);
+ const navigate = useNavigate();
+
+ const handleNext = () => {
+ navigate(routes.client.email("marketing-trial-payment"));
+ };
+
+ return (
+
+
+
+
+ Hey, {zodiacSign} Sun 👋
+
+
+ Your wellness and happiness are key for us!
+
+
+
Highlights of your plan:
+
+
+
+
+
+
+
Customer reviews
+
+
+ Over 247 254 happy customers
+
+
+
+
+
+
+
+
+ );
+}
+
+export default MarketingLanding;
diff --git a/src/components/pages/EmailLetters/MarketingLanding/styles.module.css b/src/components/pages/EmailLetters/MarketingLanding/styles.module.css
new file mode 100644
index 0000000..0c9d8c8
--- /dev/null
+++ b/src/components/pages/EmailLetters/MarketingLanding/styles.module.css
@@ -0,0 +1,91 @@
+.page {
+ position: relative;
+ height: fit-content;
+ min-height: 100dvh;
+ background-color: #fff0f0;
+ overflow: visible;
+ padding-bottom: 70px;
+}
+
+.wrapper {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ max-width: 330px;
+}
+
+.image {
+ width: 100%;
+ margin-top: 20px;
+}
+
+.title {
+ font-size: 18px;
+ line-height: 28px;
+ text-align: center;
+ color: rgb(51, 51, 51);
+ width: 100%;
+ margin: 0;
+ font-weight: 700;
+ margin-top: 30px;
+}
+
+.hi-title {
+ text-align: left;
+}
+
+.subtitle {
+ font-size: 15px;
+ line-height: 180%;
+ font-weight: 600;
+ margin-bottom: 10px;
+}
+
+.points-title {
+ margin-bottom: 20px;
+}
+
+.title.customers-counter {
+ font-weight: 700;
+ font-size: 24px;
+}
+
+.points-container {
+ margin: 0;
+}
+
+.payments {
+ margin-top: 20px;
+}
+
+.footer {
+ position: fixed;
+ bottom: 0px;
+ top: auto;
+ height: 70px;
+ background: rgba(255, 240, 240, 0.3);
+ backdrop-filter: blur(4px);
+ display: flex;
+ -webkit-box-pack: center;
+ justify-content: center;
+ -webkit-box-align: center;
+ align-items: center;
+ width: 100%;
+}
+
+.button {
+ max-width: 280px;
+ margin-bottom: 0px;
+ border-radius: 16px;
+ min-height: 0;
+ height: 49px;
+ font-weight: 600;
+ font-size: 14px;
+ 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%
+ );
+}
diff --git a/src/components/pages/EmailLetters/MarketingTrialPayment/components/ReservedTimer/index.tsx b/src/components/pages/EmailLetters/MarketingTrialPayment/components/ReservedTimer/index.tsx
new file mode 100644
index 0000000..bcac6a6
--- /dev/null
+++ b/src/components/pages/EmailLetters/MarketingTrialPayment/components/ReservedTimer/index.tsx
@@ -0,0 +1,54 @@
+import { useEffect, useMemo, useState } from "react";
+import styles from "./styles.module.css";
+
+function ReservedTimer() {
+ const [currentDate, setCurrentDate] = useState(new Date());
+ const endDate = useMemo(
+ () => new Date().setMinutes(currentDate.getMinutes() + 20),
+ // eslint-disable-next-line react-hooks/exhaustive-deps
+ []
+ );
+
+ useEffect(() => {
+ const interval = setInterval(() => {
+ setCurrentDate(new Date());
+ }, 1000);
+ return () => clearInterval(interval);
+ }, [endDate, currentDate]);
+
+ const getMinutes = () => {
+ const diff = endDate - currentDate.getTime();
+ let minutes = Math.floor(diff / 1000 / 60);
+ if (minutes < 0) {
+ minutes = 0;
+ }
+ return minutes.toString().padStart(2, "0");
+ };
+
+ const getSeconds = () => {
+ const diff = endDate - currentDate.getTime();
+ let seconds = Math.floor(diff / 1000) % 60;
+ if (seconds < 0) {
+ seconds = 0;
+ }
+ return seconds.toString().padStart(2, "0");
+ };
+
+ return (
+
+
+
+
Reserved for
+
+ {getMinutes()}:{getSeconds()}
+
+
+
+ );
+}
+
+export default ReservedTimer;
diff --git a/src/components/pages/EmailLetters/MarketingTrialPayment/components/ReservedTimer/styles.module.css b/src/components/pages/EmailLetters/MarketingTrialPayment/components/ReservedTimer/styles.module.css
new file mode 100644
index 0000000..9e1171f
--- /dev/null
+++ b/src/components/pages/EmailLetters/MarketingTrialPayment/components/ReservedTimer/styles.module.css
@@ -0,0 +1,41 @@
+.container {
+ position: relative;
+ height: 24px;
+ width: 165px;
+}
+
+.background {
+ position: absolute;
+ inset: 0px;
+ max-width: 100%;
+}
+
+.text-container {
+ position: relative;
+ display: flex;
+ -webkit-box-pack: center;
+ justify-content: center;
+ -webkit-box-align: center;
+ align-items: center;
+ color: rgb(251, 251, 255);
+ padding-left: 12px;
+ font-weight: 400 !important;
+ font-size: 14px !important;
+ line-height: 1.4;
+}
+
+.text-container > span {
+ margin-right: -10px;
+ color: rgb(251, 251, 255);
+ font-weight: 400 !important;
+ font-size: 14px !important;
+}
+
+.text-container > .value {
+ padding: 3px 15px;
+ display: flex;
+ -webkit-box-align: center;
+ align-items: center;
+ -webkit-box-pack: center;
+ justify-content: center;
+}
diff --git a/src/components/pages/EmailLetters/MarketingTrialPayment/index.tsx b/src/components/pages/EmailLetters/MarketingTrialPayment/index.tsx
new file mode 100644
index 0000000..43113f9
--- /dev/null
+++ b/src/components/pages/EmailLetters/MarketingTrialPayment/index.tsx
@@ -0,0 +1,77 @@
+import Title from "@/components/Title";
+import styles from "./styles.module.css";
+import ReservedTimer from "./components/ReservedTimer";
+import MainButton from "@/components/MainButton";
+import Modal from "@/components/Modal";
+import PaymentModal from "../../TrialPayment/components/PaymentModal";
+import { useState } from "react";
+
+function MarketingTrialPayment() {
+ const [isOpenPaymentModal, setIsOpenPaymentModal] = useState(false);
+
+ const openStripeModal = () => {
+ setIsOpenPaymentModal(true);
+ };
+
+ const handleCloseModal = () => {
+ setIsOpenPaymentModal(false);
+ };
+
+ return (
+ <>
+
+
+
+
+
+
Special Offer
+
+ Start your 7-day trial
+
+
No pressure. Cancel anytime
+
+
+
+
+
+ Your cost per 2 weeks after trial
+
+
+ $29
+ $19
+
+
+
Save $10 every period
+
+
+ You will be charged only $0 for your 7-day trial. {" "}
+ Subscription renews automatically until cancelled. You{" "}
+ can cancel at any time before the end of the trial.
+
+
+
+ Get access
+
+
+ By continuing you agree that if you don't cancel prior to the end of
+ the 3-days trial, you will automatically be charged $19 every 2
+ weeks until you cancel in settings. Learn more about cancellation
+ and refund policy in Subscription terms
+
+
+
+ >
+ );
+}
+
+export default MarketingTrialPayment;
diff --git a/src/components/pages/EmailLetters/MarketingTrialPayment/styles.module.css b/src/components/pages/EmailLetters/MarketingTrialPayment/styles.module.css
new file mode 100644
index 0000000..d718370
--- /dev/null
+++ b/src/components/pages/EmailLetters/MarketingTrialPayment/styles.module.css
@@ -0,0 +1,150 @@
+.page {
+ background-color: #fff0f0;
+ padding: 60px 45px;
+ min-width: 100vw;
+ height: fit-content;
+ min-height: 100dvh;
+}
+
+.wrapper {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 20px;
+ max-width: 330px;
+}
+
+.banner {
+ border: 1px solid rgb(39, 174, 96);
+ color: rgb(39, 174, 96);
+ border-radius: 8px;
+ margin-bottom: 10px;
+ padding: 5px 10px;
+ font-size: 13px;
+ font-weight: 600;
+ line-height: 1.5;
+}
+
+.title {
+ margin-bottom: -10px;
+ font-size: 19px;
+ line-height: 28px;
+ text-align: center;
+ color: rgb(51, 51, 51);
+ font-weight: 800;
+}
+
+.description {
+ margin-bottom: 10px;
+ font-size: 15px;
+ font-weight: 500;
+}
+
+.total-today {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: space-between;
+ width: 100%;
+}
+
+.total-today .description {
+ font-size: 15px;
+ font-weight: 800;
+ margin: 0;
+}
+
+.total-today .value {
+ font-size: 17px;
+ font-weight: 800;
+ color: #9974f6;
+}
+
+.code-container {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: space-between;
+ width: 100%;
+}
+
+.code-container > p {
+ font-size: 15px;
+ color: rgb(39, 174, 96);
+ font-weight: 500;
+}
+
+.line {
+ margin-top: 0px;
+ background: rgb(153, 116, 246);
+ height: 1px;
+ width: 100%;
+}
+
+.sale-container {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: space-between;
+ width: 100%;
+}
+
+.sale-container > .description {
+ margin: 0;
+ font-weight: 600;
+ font-size: 14px;
+}
+
+.sale-container > .value {
+ margin: 0;
+}
+
+.sale-container > .value > .old-price {
+ font-weight: normal;
+ font-size: 18px;
+ text-decoration: line-through;
+ color: rgb(130, 130, 130);
+}
+
+.sale-container > .value > .new-price {
+ font-size: 18px;
+ margin-left: 20px;
+}
+
+.sale-description {
+ font-size: 14px;
+ margin: 0;
+ font-weight: 600;
+ color: rgb(130, 130, 130);
+ align-self: flex-start;
+}
+
+.text-description {
+ font-size: 12px;
+ line-height: 20px;
+}
+
+.text-description > b {
+ font-weight: 600;
+}
+
+.button {
+ background: rgb(105, 177, 63);
+ box-shadow: rgba(0, 0, 0, 0.25) 0px 4px 4px;
+ border-radius: 30px;
+ min-height: 0;
+ height: 49px;
+ font-size: 18px;
+ gap: 10px;
+}
+
+.policy {
+ font-size: 12px;
+ line-height: 20px;
+ padding: 0px 6px;
+}
+
+.modal {
+ max-height: calc(100dvh - 40px);
+}
diff --git a/src/components/pages/TrialPayment/components/PaymentMethodsChoice/styles.module.css b/src/components/pages/TrialPayment/components/PaymentMethodsChoice/styles.module.css
index fb9e06c..bcdd5ae 100644
--- a/src/components/pages/TrialPayment/components/PaymentMethodsChoice/styles.module.css
+++ b/src/components/pages/TrialPayment/components/PaymentMethodsChoice/styles.module.css
@@ -2,6 +2,7 @@
width: 100%;
display: flex;
justify-content: space-between;
+ gap: 8px;
}
.payment-method {
@@ -15,6 +16,7 @@
height: 68px;
padding-top: 8px;
padding-bottom: 8px;
+ cursor: pointer;
}
.payment-method.active {
diff --git a/src/components/pages/TrialPayment/components/PointsList/index.tsx b/src/components/pages/TrialPayment/components/PointsList/index.tsx
new file mode 100644
index 0000000..2189ed0
--- /dev/null
+++ b/src/components/pages/TrialPayment/components/PointsList/index.tsx
@@ -0,0 +1,34 @@
+import Title from "@/components/Title";
+import styles from "./styles.module.css";
+
+interface IPointsListProps {
+ points: string[];
+ title: string;
+ titleClassName?: string;
+ containerClassName?: string;
+}
+
+function PointsList({
+ points,
+ title,
+ titleClassName = "",
+ containerClassName = "",
+}: IPointsListProps) {
+ return (
+
+
+ {title}
+
+
+ {points.map((point, index) => (
+
+
+ {point}
+
+ ))}
+
+
+ );
+}
+
+export default PointsList;
diff --git a/src/components/pages/TrialPayment/components/YouGet/styles.module.css b/src/components/pages/TrialPayment/components/PointsList/styles.module.css
old mode 100755
new mode 100644
similarity index 100%
rename from src/components/pages/TrialPayment/components/YouGet/styles.module.css
rename to src/components/pages/TrialPayment/components/PointsList/styles.module.css
diff --git a/src/components/pages/TrialPayment/components/Reviews/Review.tsx b/src/components/pages/TrialPayment/components/Reviews/Review.tsx
index cebf9fb..39625d6 100755
--- a/src/components/pages/TrialPayment/components/Reviews/Review.tsx
+++ b/src/components/pages/TrialPayment/components/Reviews/Review.tsx
@@ -1,19 +1,18 @@
import Title from "@/components/Title";
import styles from "./styles.module.css";
+import { IReview } from "@/data/reviews";
-interface IReviewProps {
- username: string;
- date: string;
- text: string;
- mark: number;
-}
+type IReviewProps = IReview;
-function Review({ username, date, text, mark }: IReviewProps) {
+function Review({ username, date, text, mark, image }: IReviewProps) {
return (
-
-
{username.slice(0, 2)}
+
+ {!image?.length &&
{username.slice(0, 2)} }
+ {!!image?.length && (
+
+ )}
@@ -21,16 +20,18 @@ function Review({ username, date, text, mark }: IReviewProps) {
{date}
-
+ }}
+ >
+ )}
diff --git a/src/components/pages/TrialPayment/components/Reviews/index.tsx b/src/components/pages/TrialPayment/components/Reviews/index.tsx
index 2af3efd..2c72054 100755
--- a/src/components/pages/TrialPayment/components/Reviews/index.tsx
+++ b/src/components/pages/TrialPayment/components/Reviews/index.tsx
@@ -1,14 +1,14 @@
-import Title from "@/components/Title";
import styles from "./styles.module.css";
-import { reviews } from "@/data/reviews";
+import { IReview } from "@/data/reviews";
import Review from "./Review";
-function Reviews() {
+interface IReviewsProps {
+ reviews: IReview[];
+}
+
+function Reviews({ reviews }: IReviewsProps) {
return (
-
- Users love us
-
{reviews.map((review, index) => (
diff --git a/src/components/pages/TrialPayment/components/Reviews/styles.module.css b/src/components/pages/TrialPayment/components/Reviews/styles.module.css
index e839398..bc1315f 100755
--- a/src/components/pages/TrialPayment/components/Reviews/styles.module.css
+++ b/src/components/pages/TrialPayment/components/Reviews/styles.module.css
@@ -2,7 +2,6 @@
display: flex;
flex-direction: column;
justify-content: center;
- margin-top: 88px;
}
.reviews > ul > li {
@@ -34,6 +33,11 @@
justify-content: center;
}
+.avatar.middle {
+ width: 45px;
+ height: 45px;
+}
+
.avatar > span {
font-weight: 600;
font-size: 16px;
@@ -94,3 +98,9 @@
line-height: 140%;
color: rg#0f0f0f;
}
+
+.image {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+}
diff --git a/src/components/pages/TrialPayment/components/YouGet/index.tsx b/src/components/pages/TrialPayment/components/YouGet/index.tsx
deleted file mode 100755
index 323b6af..0000000
--- a/src/components/pages/TrialPayment/components/YouGet/index.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-import Title from "@/components/Title";
-import styles from "./styles.module.css";
-
-function YouGet() {
- return (
-
- );
-}
-
-export default YouGet;
diff --git a/src/components/pages/TrialPayment/index.tsx b/src/components/pages/TrialPayment/index.tsx
index 05a86c4..94513fd 100755
--- a/src/components/pages/TrialPayment/index.tsx
+++ b/src/components/pages/TrialPayment/index.tsx
@@ -11,7 +11,7 @@ import routes from "@/routes";
import { getZodiacSignByDate } from "@/services/zodiac-sign";
import YourReading from "./components/YourReading";
import Reviews from "./components/Reviews";
-import YouGet from "./components/YouGet";
+import PointsList from "./components/PointsList";
import OftenAsk from "./components/OftenAsk";
import { ISubscriptionPlan } from "@/api/resources/SubscriptionPlans";
import { useEffect, useState } from "react";
@@ -21,6 +21,8 @@ import { Locale } from "@/components/PaymentTable";
import WithPartnerInformation from "./components/WithPartnerInformation";
import Modal from "@/components/Modal";
import PaymentModal from "./components/PaymentModal";
+import { trialPaymentPointsList } from "@/data/pointsLists";
+import { trialPaymentReviews } from "@/data/reviews";
const locale = getClientLocale() as Locale;
@@ -119,7 +121,11 @@ function TrialPaymentPage() {
return (
-
+
@@ -158,8 +164,15 @@ function TrialPaymentPage() {
buttonClick={openStripeModal}
singleOrWithPartner={singleOrWithPartner}
/>
-
-
+
+ Users love us
+
+
+
diff --git a/src/data/pointsLists.ts b/src/data/pointsLists.ts
new file mode 100644
index 0000000..f15e221
--- /dev/null
+++ b/src/data/pointsLists.ts
@@ -0,0 +1,14 @@
+export const trialPaymentPointsList = [
+ "Your personalised plan",
+ "1:1 advice from your own astrologer",
+ "Finding the most compatible partner",
+ "Insights into your relationship patterns, and emotional and sexual needs",
+ "Better understanding of yourself",
+];
+
+export const marketingLandingPointsList = [
+ "Unlimited daily/weekly/monthly/yearly horoscopes",
+ "Astrology lessons and articles inside the app",
+ "Beauty/health/travel and more calendars",
+ "Compatibility check with zodiac signs inside the app",
+];
diff --git a/src/data/reviews.ts b/src/data/reviews.ts
index a661646..2ce568d 100755
--- a/src/data/reviews.ts
+++ b/src/data/reviews.ts
@@ -1,11 +1,12 @@
-interface IReview {
+export interface IReview {
username: string;
date: string;
text: string;
mark: number;
+ image?: string;
}
-export const reviews: IReview[] = [
+export const trialPaymentReviews: IReview[] = [
{
username: "ria._.panwar",
date: "02/17/2024",
@@ -25,3 +26,27 @@ export const reviews: IReview[] = [
mark: 4.6,
},
];
+
+export const marketingLandingReviews: IReview[] = [
+ {
+ username: "@ria._.panwar",
+ date: "01/17/2024",
+ text: "Horoscope tells realistic facts about day to day life, which can be easily relatable. It shows direction.",
+ mark: 0,
+ image: "/user1.webp",
+ },
+ {
+ username: "@jp63_",
+ date: "01/29/2024",
+ text: "It makes me feel safe, seeing, warm and smart.",
+ mark: 0,
+ image: "/user2.webp",
+ },
+ {
+ username: "@therealslimmazi",
+ date: "01/28/2024",
+ text: "I love that we have the “my profile” option. I love learning about myself.",
+ mark: 0,
+ image: "/user3.webp",
+ },
+];
diff --git a/src/routes.ts b/src/routes.ts
index 7b67cfb..8f35750 100755
--- a/src/routes.ts
+++ b/src/routes.ts
@@ -42,7 +42,6 @@ const routes = {
energyVampirismResult: () => [host, "energy-vampirism"].join("/"),
nameHoroscopeResult: () => [host, "name-horoscope"].join("/"),
- // test routes
gender: () => [host, "gender"].join("/"),
questionnaire: () => [host, "questionnaire"].join("/"),
goalSetup: () => [host, "goal-setup"].join("/"),
@@ -77,6 +76,9 @@ const routes = {
additionalDiscount: () => [host, "additional-discount"].join("/"),
trialPaymentWithDiscount: () =>
[host, "trial-payment-with-discount"].join("/"),
+
+ // Email letters
+ email: (path: string) => [host, "email", path].join("/"),
notFound: () => [host, "404"].join("/"),
},
server: {
@@ -226,6 +228,8 @@ export const withoutFooterRoutes = [
routes.client.trialPayment(),
routes.client.additionalDiscount(),
routes.client.trialPaymentWithDiscount(),
+ routes.client.email("marketing-landing"),
+ routes.client.email("marketing-trial-payment"),
];
export const withoutFooterPartOfRoutes = [routes.client.questionnaire()];
@@ -288,9 +292,19 @@ export const withoutHeaderRoutes = [
routes.client.trialPayment(),
routes.client.additionalDiscount(),
routes.client.trialPaymentWithDiscount(),
+ routes.client.email("marketing-landing"),
+ routes.client.email("marketing-trial-payment"),
];
export const hasNoHeader = (path: string) => {
- return !withoutHeaderRoutes.includes(`/${path.split("/")[1]}`);
+ let result = true;
+
+ withoutHeaderRoutes.forEach((route) => {
+ if (path.includes(route)) {
+ result = false;
+ }
+ });
+
+ return result;
};
export const withFullDataModalRoutes = [routes.client.home()];