diff --git a/public/locales/compatibility-v2/en/female_en.json b/public/locales/compatibility-v2/en/female_en.json index d7da9e5..05d5398 100644 --- a/public/locales/compatibility-v2/en/female_en.json +++ b/public/locales/compatibility-v2/en/female_en.json @@ -25,6 +25,41 @@ "female": "Female", "males": "Males", "females": "Females", + "/try-app": { + "header": { + "title": "Your Personalized Offer Reserved", + "get-prediction-in-app": "Get prediction in
the App" + }, + "palm_lines": { + "head": "Head line ✅", + "heart": "Love line ✅", + "fate": "Fate line ✅", + "life": "Life line ✅" + }, + "reading_ready": { + "title": "Your Palm Reading is READY and available in the app for your iPhone!" + }, + "your_access_code": "Your Access Code", + "copy": "COPY", + "instruction_point_1": "1. Copy Your Access Code", + "instruction_point_2": "2. Download the App", + "instruction_point_3": "3. Enter Your Access Code in the App", + "instruction_point_4": "1. Copy Your Access Code", + "instruction_point_5": "2. Enter Your Access Code in the App 👇", + "your_palm_reading_is_ready": "Your Palm Reading is READY", + "not_share_description": "Enter your access code in the app to access Your Personalized Reading. Do not share your code with anyone.", + "get_prediction_in_app": "Get personal prediction in the App", + "enter-code-title": "Enter Your Access Code:", + "code-copied": "Code copied", + "copy-code-title": "Click to copy code", + "how_work": { + "title": "How does AURA work?" + }, + "get-my-reading-in-app": "GET MY READING IN THE APP", + "why_love": "Why does everyone ?", + "why_love_color": "love AURA", + "as_seen_in": " As Seen in " + }, "/find-your-happiness": { "title": "Gain Clarity and Confidence in Life", "text": "Use astrology and palmistry to strengthen yourself and your relationships", @@ -35,7 +70,28 @@ "/gender": { "title": "What is Your Gender?", "description": "In palmistry, everyone has both masculine and feminine traits.

Let's determine yours for a more accurate palm reading.", - "already_have_account": "Already have an account? Sign in" + "already_have_account": "Already have an account? Sign in", + "v1": { + "title": "Compatibility Test
👩‍❤️‍👨", + "subtitle": "It all starts with you!
Select your gender 👇", + "points": { + "point1": "The test takes less than a minute.", + "point2": "You’ll receive an analysis of your compatibility based on the lines on your hand.", + "point3": "100% data accuracy.", + "point4": "Over 50 pages of analysis." + } + }, + "v2": { + "title": "Compatibility Test", + "subtitle": "It all starts with you! Choose your gender.", + "points": { + "point1": "The test takes less than a minute.", + "point2": "You'll receive a compatibility analysis through palmistry based on the lines on your hand.", + "point3": "Resolve relationship issues in a month.", + "point4": "Save hundreds of dollars on unreliable forecasts.", + "point5": "Get a personalized analysis." + } + } }, "/birthdate": { "title": "When Were You Born?", @@ -296,12 +352,14 @@ "why_love": "Why does everyone ?", "why_love_color": "love AURA", "reviews": { - "username1": "Rebecca Bauman", + "username1": "Emma Johnson", "tagline1": "\"It’s changed my life!\"", - "text1": "I'm thankful for this app and Akho! She's an excellent palm reader and astrologer—clear, thorough, and reassuring. I eagerly look forward to more sessions with her!", - "username2": "Mika Ryan", + "date1": "Jan 25", + "text1": "I used to keep running into failed relationships—things would start off well, but then everything would fall apart. It was exhausting, and I started wondering if the problem was me. Your service immediately felt different: instead of generic advice and random matches, I got precise insights about who I actually have a real chance of building something strong with. I still remember seeing my first compatibility analysis—it aligned so perfectly that I just knew: this was it. Now, I waste less time on pointless connections and am finally building a relationship that feels effortless and right.", + "username2": "Olivia Smith", "tagline2": "\"After years of seeking, I’ve finally found a true love.\"", - "text2": "I was hesitant about whether it was really worth trying, but now I have no regrets and I'm enjoying my new relationships!", + "date2": "1m ago", + "text2": "I spent a long time doubting whether we were truly right for each other. Everything seemed fine, but at times, I felt like we were just too different. I searched online for answers, but all I found were vague, contradictory pieces of advice. The feelings were there, but so were the doubts. I just wanted to know if we had a future together, but nothing gave me a clear answer. Then I came across your service, decided to give it a shot—and I’m so glad I did. Your analysis of our personalities, compatibility, and potential challenges in the relationship matched perfectly from the very first pages. And suddenly, it hit me! I finally understood why he acts the way he does and how to build a stronger relationship with him. Your 30-day step-by-step guide is already making a difference—there’s more trust between us, and we argue less. Thank you!", "username3": "Amanda Holmes", "tagline3": "\"I’ve found a job I really enjoy.\"", "text3": "Thanks to Vladana, I've finally discovered a clue about what my life's purpose really is and what kind of job resonates with me better!" @@ -335,6 +393,12 @@ "app_number_one": "The #1 Astrology app trusted by over " }, "/scanned-photo": { + "palm_lines": { + "head": "Head line ✅", + "heart": "Love line ✅", + "fate": "Fate line ✅", + "life": "Life line ✅" + }, "title": "Your In-Depth Palmistry Compatibility Analysis Is Almost Ready!", "text": "Judging by your lines, you have an exciting future ahead. Let's dive into all the details!", "without-partner": { diff --git a/public/locales/compatibility-v2/en/male_en.json b/public/locales/compatibility-v2/en/male_en.json index 1767c8e..05d5398 100644 --- a/public/locales/compatibility-v2/en/male_en.json +++ b/public/locales/compatibility-v2/en/male_en.json @@ -25,6 +25,41 @@ "female": "Female", "males": "Males", "females": "Females", + "/try-app": { + "header": { + "title": "Your Personalized Offer Reserved", + "get-prediction-in-app": "Get prediction in
the App" + }, + "palm_lines": { + "head": "Head line ✅", + "heart": "Love line ✅", + "fate": "Fate line ✅", + "life": "Life line ✅" + }, + "reading_ready": { + "title": "Your Palm Reading is READY and available in the app for your iPhone!" + }, + "your_access_code": "Your Access Code", + "copy": "COPY", + "instruction_point_1": "1. Copy Your Access Code", + "instruction_point_2": "2. Download the App", + "instruction_point_3": "3. Enter Your Access Code in the App", + "instruction_point_4": "1. Copy Your Access Code", + "instruction_point_5": "2. Enter Your Access Code in the App 👇", + "your_palm_reading_is_ready": "Your Palm Reading is READY", + "not_share_description": "Enter your access code in the app to access Your Personalized Reading. Do not share your code with anyone.", + "get_prediction_in_app": "Get personal prediction in the App", + "enter-code-title": "Enter Your Access Code:", + "code-copied": "Code copied", + "copy-code-title": "Click to copy code", + "how_work": { + "title": "How does AURA work?" + }, + "get-my-reading-in-app": "GET MY READING IN THE APP", + "why_love": "Why does everyone ?", + "why_love_color": "love AURA", + "as_seen_in": " As Seen in " + }, "/find-your-happiness": { "title": "Gain Clarity and Confidence in Life", "text": "Use astrology and palmistry to strengthen yourself and your relationships", @@ -306,10 +341,10 @@ "point3_color": "Head line", "point4": "A long index finger indicates a natural leader", "point5": " defines the quality of your life and what you will achieve", - "point5_color": "Live line", + "point5_color": "Life line", "point6": "A short middle finger reveals a free spirit", "point7": " represents your material achievement and career goals", - "point7_color": "Money line", + "point7_color": "Fate line", "point8": "A long ring finger reveals that a person tends to take risks", "point9": "A short little finger indicates the person's lack of self-confidence" }, @@ -358,6 +393,12 @@ "app_number_one": "The #1 Astrology app trusted by over " }, "/scanned-photo": { + "palm_lines": { + "head": "Head line ✅", + "heart": "Love line ✅", + "fate": "Fate line ✅", + "life": "Life line ✅" + }, "title": "Your In-Depth Palmistry Compatibility Analysis Is Almost Ready!", "text": "Judging by your lines, you have an exciting future ahead. Let's dive into all the details!", "without-partner": { @@ -517,40 +558,5 @@ "capricorn": "Capricorn", "aquarius": "Aquarius", "pisces": "Pisces" - }, - "/try-app": { - "header": { - "title": "Your Personalized Offer Reserved", - "get-prediction-in-app": "Get prediction in
the App" - }, - "palm_lines": { - "head": "Head line ✅", - "heart": "Love line ✅", - "fate": "Fate line ✅", - "life": "Life line ✅" - }, - "reading_ready": { - "title": "Your Palm Reading is READY and available in the app for your iPhone!" - }, - "your_access_code": "Your Access Code", - "copy": "COPY", - "instruction_point_1": "1. Copy Your Access Code", - "instruction_point_2": "2. Download the App", - "instruction_point_3": "3. Enter Your Access Code in the App", - "instruction_point_4": "1. Copy Your Access Code", - "instruction_point_5": "2. Enter Your Access Code in the App 👇", - "your_palm_reading_is_ready": "Your Palm Reading is READY", - "not_share_description": "Enter your access code in the app to access Your Personalized Reading. Do not share your code with anyone.", - "get_prediction_in_app": "Get personal prediction in the App", - "enter-code-title": "Enter Your Access Code:", - "code-copied": "Code copied", - "copy-code-title": "Click to copy code", - "how_work": { - "title": "How does AURA work?" - }, - "get-my-reading-in-app": "GET MY READING IN THE APP", - "why_love": "Why does everyone ?", - "why_love_color": "love AURA", - "as_seen_in": " As Seen in " } } \ No newline at end of file diff --git a/public/locales/compatibility-v3/en/female_en.json b/public/locales/compatibility-v3/en/female_en.json new file mode 100644 index 0000000..05d5398 --- /dev/null +++ b/public/locales/compatibility-v3/en/female_en.json @@ -0,0 +1,562 @@ +{ + "next": "Next", + "biometric_data": "We don’t collect any biometric data. All recognition processes occur on your device.", + "went_wrong": "Something went wrong.", + "v": "v1", + "config": "en.male", + "threadId": "thread_uBoB6htpYLoPp1bHDUXnrVKS", + "assistantId": "asst_ZClw0fzJaQlhxUigjxHp87Nc", + "privacy_policy": "By continuing, you agree to our and . Have a question? Reach out to our support team ", + "eula_link": "End User License Agreement", + "privacy_notice": "Privacy Notice", + "policy_here": "here", + "thumb": "Thumb", + "index_finger": "Index finger", + "middle_finger": "Middle finger", + "ring_finger": "Ring finger", + "pinky": "Little finger", + "skip_trial": "Skip trial period", + "add_consultant": "Add consultant", + "add_guides": "Add guides", + "access_product": "Access product", + "thank_you": "Thank you!", + "order_successful": "Your order was successfully processed!", + "male": "Male", + "female": "Female", + "males": "Males", + "females": "Females", + "/try-app": { + "header": { + "title": "Your Personalized Offer Reserved", + "get-prediction-in-app": "Get prediction in
the App" + }, + "palm_lines": { + "head": "Head line ✅", + "heart": "Love line ✅", + "fate": "Fate line ✅", + "life": "Life line ✅" + }, + "reading_ready": { + "title": "Your Palm Reading is READY and available in the app for your iPhone!" + }, + "your_access_code": "Your Access Code", + "copy": "COPY", + "instruction_point_1": "1. Copy Your Access Code", + "instruction_point_2": "2. Download the App", + "instruction_point_3": "3. Enter Your Access Code in the App", + "instruction_point_4": "1. Copy Your Access Code", + "instruction_point_5": "2. Enter Your Access Code in the App 👇", + "your_palm_reading_is_ready": "Your Palm Reading is READY", + "not_share_description": "Enter your access code in the app to access Your Personalized Reading. Do not share your code with anyone.", + "get_prediction_in_app": "Get personal prediction in the App", + "enter-code-title": "Enter Your Access Code:", + "code-copied": "Code copied", + "copy-code-title": "Click to copy code", + "how_work": { + "title": "How does AURA work?" + }, + "get-my-reading-in-app": "GET MY READING IN THE APP", + "why_love": "Why does everyone ?", + "why_love_color": "love AURA", + "as_seen_in": " As Seen in " + }, + "/find-your-happiness": { + "title": "Gain Clarity and Confidence in Life", + "text": "Use astrology and palmistry to strengthen yourself and your relationships", + "advantage1": "In-depth Analysis: We scan the lines on your palm", + "advantage2": "Personalized Approach: Compatibility and Future Analysis", + "advantage3": "Quick Results: Takes no more than 5 minutes" + }, + "/gender": { + "title": "What is Your Gender?", + "description": "In palmistry, everyone has both masculine and feminine traits.

Let's determine yours for a more accurate palm reading.", + "already_have_account": "Already have an account? Sign in", + "v1": { + "title": "Compatibility Test
👩‍❤️‍👨", + "subtitle": "It all starts with you!
Select your gender 👇", + "points": { + "point1": "The test takes less than a minute.", + "point2": "You’ll receive an analysis of your compatibility based on the lines on your hand.", + "point3": "100% data accuracy.", + "point4": "Over 50 pages of analysis." + } + }, + "v2": { + "title": "Compatibility Test", + "subtitle": "It all starts with you! Choose your gender.", + "points": { + "point1": "The test takes less than a minute.", + "point2": "You'll receive a compatibility analysis through palmistry based on the lines on your hand.", + "point3": "Resolve relationship issues in a month.", + "point4": "Save hundreds of dollars on unreliable forecasts.", + "point5": "Get a personalized analysis." + } + } + }, + "/birthdate": { + "title": "When Were You Born?", + "text": "Your birth date can reveal strengths and values that may help you move forward" + }, + "/palms-information": { + "aries": { + "title": "♈ Aries", + "description": "Your palms are a map of destiny, reflecting your strength and character. According to our data, 76 million Aries have a clear and straight head line, indicating decisiveness and independence. In 81% of successful relationships, their partners share their passion for action. Your palms will reveal how well your ambitions and energy align with your partner." + }, + "taurus": { + "title": "♉ Taurus", + "description": "The patterns on your palms reveal your true self. Our research shows that 83 million Taurus have a long and smooth life line, a sign of resilience and desire for stability. In 86% of harmonious relationships, partners value reliability and comfort. Take a look at your palm—it will indicate how strong your union is." + }, + "gemini": { + "title": "♊ Gemini", + "description": "Your palms are a mirror of your mind and character. According to our data, 72 million Gemini have a bifurcated or branched head line, suggesting flexibility and multitasking ability. In 78% of successful relationships, partners are ready for change and spontaneity. Check your lines—they will show how well your partner matches your pace." + }, + "cancer": { + "title": "♋ Cancer", + "description": "Your palm lines hide secrets of emotions and attachments. Our data shows that 78 million Cancers have a clear and expressive heart line, indicating deep sensitivity. In 82% of strong relationships, Cancer partners have well-developed empathy. Your palm will help reveal how well you and your loved one understand each other." + }, + "leo": { + "title": "♌ Leo", + "description": "Palms store the history of your personality. Our data indicates that 80 million Leos have a noticeable Sun line, which suggests innate charisma and a drive for recognition. In 84% of happy relationships, Leo partners are admired and share their ambitions. Your palm will show how ready your partner is to be part of your shine." + }, + "virgo": { + "title": "♍ Virgo", + "description": "Every line on your palm is a trace of your character. Our observations show that 75 million Virgos have fine but distinct lines, reflecting attention to detail and rationality. In 79% of successful Virgo relationships, trust and predictability are key. Your palms will reveal how well your values align with your partner." + }, + "libra": { + "title": "♎ Libra", + "description": "The harmony of your palms reflects the harmony of your soul. Our data shows that 77 million Libras have a curved and smooth heart line, indicating diplomacy and balanced relationships. In 80% of successful partnerships, their partners appreciate honesty and compromise. Look at your palm—it will indicate how much your relationship is based on mutual understanding." + }, + "scorpio": { + "title": "♏ Scorpio", + "description": "The depth of your palm lines reflects the depth of your feelings. Our research shows that 81 million Scorpios have a deep and straight heart line, indicating passion and devotion. In 83% of successful relationships, their partners share the same emotional intensity. Your palm will show how genuine the connection between you and your partner is." + }, + "sagittarius": { + "title": "♐ Sagittarius", + "description": "The lines on your palm are a map of your life journey. Our data shows that 74 million Sagittarians have a long and prominent head line, symbolizing curiosity and a quest for freedom. In 77% of long-term relationships, their partners share an adventurous spirit. Your palm will tell you how ready your partner is for your ambitious dreams." + }, + "capricorn": { + "title": "♑ Capricorn", + "description": "Your palms are a reflection of your strength and determination. Our data shows that 79 million Capricorns have a pronounced fate line, indicating their ambitions and discipline. In 85% of happy marriages, their partners support their pursuit of success. Look at your palm—it will reveal how much your union is based on shared goals." + }, + "aquarius": { + "title": "♒ Aquarius", + "description": "The lines on your palm are the mark of your uniqueness. Our research shows that 71 million Aquarians have an unconventional head line, indicating originality and non-standard thinking. In 75% of harmonious relationships, their partners respect their freedom and independence. Your palm will reveal how ready your partner is for your innovative ideas." + }, + "pisces": { + "title": "♓ Pisces", + "description": "Palms conceal the secrets of your soul. Our data shows that 82 million Pisces have a long and smooth heart line, indicating their intuition and deep sense of love. In 84% of strong relationships, their partners share a similar sensitivity. Your palm will tell you how well your partner can feel you on an emotional level." + } + }, + "/what-aspects": { + "title": "Which Areas of Life Do You Want to Gain a Deeper Understanding Of?", + "answer1": "Love and Relationships", + "answer2": "Health and Energy", + "answer3": "Career and Purpose", + "answer4": "Life Transitions" + }, + "/relationship-status": { + "title": "To Better Understand You, Indicate Your Current Relationship Status", + "answer1": "Single", + "answer2": "In a Relationship", + "answer3": "Married", + "answer4": "Divorced" + }, + "/element-resonates": { + "title": "Which Element Empowers You the Most?", + "answer1": "Water", + "answer2": "Fire", + "answer3": "Air", + "answer4": "Earth", + "answer5": "Light", + "answer6": "Darkness" + }, + "/favorite-color": { + "title": "Which Color Best Reflects Your Personality?", + "answer1": "Blue", + "answer2": "Green", + "answer3": "Orange", + "answer4": "Violet", + "answer5": "Red", + "answer6": "Yellow", + "answer7": "Turquoise" + }, + "/head-or-heart": { + "title": "What Guides You in Life: The Call of the Heart or the Voice of Reason?", + "answer1": "Follow My Heart", + "answer2": "Rely on Reason", + "answer3": "Combine Both Approaches", + "answer4": "Depends on the Situation" + }, + "/relate-following": { + "title": "How Important Is It for You to Meet Your Partner's Expectations?", + "question1": "", + "question2": "I value and enjoy my own company.", + "question3": "I prefer socializing in groups rather than spending time alone.", + "question4": "Loneliness is something I actively try to avoid.", + "question5": "I enjoy activities that I can do independently.", + "strongly_agree": "Very Important", + "strongly_disagree": "Not Important at All" + }, + "/gender-partner": { + "title": "Your Partner's Gender", + "description": "Select your partner's gender for a personalized astrological analysis. The stars consider every detail! ✨", + "already_have_account": "" + }, + "/birthdate-partner": { + "title": "Your Partner's Birth Date?", + "text": "We'll incorporate zodiac influences for a more precise compatibility assessment" + }, + "/date-event": { + "single": { + "title": "Enter a Significant Date Important to You.", + "text": "💫 A significant date can help reveal planetary influences on your life and provide a more personalized analysis." + }, + "relationship": { + "title": "Enter a Significant Date Important to You or Your Partner.", + "text": "💫 A significant date can help reveal planetary influences on your relationship and provide a more personalized analysis." + } + }, + "/palms-information-partner": { + "aries": { + "title": "♈ Aries", + "description": "Passionate, straightforward, and initiative-driven. Falls in love quickly, acts decisively, but can be impatient and jealous. Loves leadership and craves intense emotions, hates routine. If the feelings fade, they leave without regret. You form an intriguing combination, and we have a lot to share with you!" + }, + "taurus": { + "title": "♉ Taurus", + "description": "Reliable, sensual, and loyal. Moves slowly but thoroughly in love. Values stability, comfort, and physical connection. Can be possessive and reluctant to let go of the past. Doesn't tolerate betrayal or sudden changes. How will your relationship fare? We have the answers!" + }, + "gemini": { + "title": "♊ Gemini", + "description": "Light-hearted, sociable, and unpredictable. Gets interested quickly but might lose interest just as fast. Enjoys intellectual interaction, flirting, and freedom. Sometimes inconsistent, but with someone who can keep their interest, they're committed. What are your chances for harmony? Let's find out together!" + }, + "cancer": { + "title": "♋ Cancer", + "description": "Sensitive, caring, and loyal. Emotions are their main element. Falls deeply in love but opens up slowly. Can be vulnerable and needs emotional safety. If disappointed, they leave but linger long over it. What's your emotional compatibility? We have the answer!" + }, + "leo": { + "title": "♌ Leo", + "description": "Bright, charismatic, and generous. Loves attention, compliments, and drama. Acts like a conqueror in love but desires admiration and loyalty. Can be self-centered but loyal to those who appreciate them. Can you become a true power couple? Let’s check!" + }, + "virgo": { + "title": "♍ Virgo", + "description": "Rational, reliable, and demanding. Cautious in love, doesn't rush to open up. Values order, honesty, and depth. Can be critical and reserved, but becomes a loyal partner once they trust. Your combination might be incredibly strong—let's discover the details!" + }, + "libra": { + "title": "♎ Libra", + "description": "Charming, diplomatic, and romantic. Loves harmony, elegant courtship, and intellectual conversation. May hesitate before making decisions but strives for equality and understanding in relationships. What role will you play in this connection? We'll tell you!" + }, + "scorpio": { + "title": "♏ Scorpio", + "description": "Deep, passionate, and magnetic. Loves seriously and long, but can be jealous and possessive. Trust and emotional connection are vital, and betrayal is unforgivable. Loves deeply. What secrets lie in your union? We know!" + }, + "sagittarius": { + "title": "♐ Sagittarius", + "description": "Free-spirited, energetic, and optimistic. Loves adventure, novelty, and independence. Falls in love quickly but doesn't tolerate pressure. May avoid commitments but becomes a loyal partner with someone who shares their spirit of freedom. Will your union be full of passion or freedom? Let's find out!" + }, + "capricorn": { + "title": "♑ Capricorn", + "description": "Reserved, goal-oriented, and reliable. Serious and practical in love, dislikes games and frivolity. Observes for a long time but builds strong, lasting relationships once decided. Faithful, but can be too strict. Compatibility with them can be life-changing—want to know more?" + }, + "aquarius": { + "title": "♒ Aquarius", + "description": "Original, independent, and intellectual. Loves freedom, experimentation, and friendship in relationships. Can be emotionally detached but with someone who shares their views, becomes a loyal ally. Your bond with them might be unconventional—let’s explore the details!" + }, + "pisces": { + "title": "♓ Pisces", + "description": "Romantic, intuitive, and dreamy. Falls deeply in love but can be prone to illusions. Seeks spiritual connection, tenderness, and care. May lose themselves in a partner, but if disillusioned, leaves behind a mystery. Will your union be magical or illusory? We know the answer!\n🔮 You form a unique combination, and we can tell you so much more! Let's dive into the details!" + } + }, + "/let-scan": { + "title": "We Are Scanning Your Palm", + "text": "Follow the on-screen instructions so we can analyze the lines of your palm, revealing the future and the secrets of your destiny!" + }, + "/scan-instruction": { + "title": "Photograph Your Palm as Shown", + "button": "Take Photo Now" + }, + "/email": { + "title": "Enter Your Email to Receive a Detailed Palmistry Compatibility Analysis!", + "not_share": "We do not share your personal information with third parties.", + "placeholder_email": "Your email", + "placeholder_name": "Your name" + }, + "app_number_one": { + "text": "The app trusted by over 25 million people.", + "color": "#1 Astrology" + }, + "/trial-payment": { + "information-title": "We're Ready to Give You All the Answers, Don't Spend Years in Doubt!", + "information-description-single": "Ever wondered why some relationships flow smoothly while others feel tense like a tightrope? Coincidence or a sign of destiny? Hands tell more than you think. The lines on your palm are a map of your relationships. there are hidden signs in your life that you haven't noticed yet.

Receive a detailed palmistry compatibility analysis and discover the answers that are already written in your destiny.", + "information-description-single-color": " ()", + "information-description-single-event-description": "Your date may have been a turning point or a hidden signal.", + "information-description-with-partner": "Hands tell more than you think. The lines on your palm are a map of your relationships. — two signs created for depth, but what secrets does your union hold? Receive a detailed palmistry compatibility analysis and discover the answers that are already written in your destiny.", + "information-description-with-partner-color": " () + ()", + "information-description-with-partner-event-description": "Your date may have been a turning point or a hidden signal.", + "palm_is_ready": { + "title": "Your Palm Reading ", + "title_color": "Is Ready", + "description": "“I’ve just received your palm scan results. Let’s discuss!”", + "text1": " 6 years in palmistry readings and spiritual guidance.", + "text1_color": "Akho", + "text2": "Choose from 80+ palm readers and astrologers." + }, + "joined_today": { + "text1": "Unlimited chats with a palm reader", + "text2": " people joined today" + }, + "get_personal_prediction": "Get personal prediction", + "how_work": { + "title": "How does AURA work?", + "point1_title": "Send us your palm scan", + "point1_text": "We analyze your palm lines to get hints about your future", + "point2_title": "Your palm reading is generated", + "point2_text": "One of our professional palm readers puts together a report filled with hints about your future", + "point3_title": "Start your trial to receive your prediction", + "point3_text": "Once you’re an AURA member, we’ll send over your prediction report so you can begin living a better life.", + "point4_title": "Talk with a palm reading specialist anytime", + "point4_text": "Get ongoing support by discussing your readings, personal horoscopes, and compatibilities with our expert team." + }, + "money_back_guarantee": { + "title": "100% Money-back Guarantee", + "text": "If you don’t notice any progress after using the app for at least a week, we are ready to make a complete refund within 14 days." + }, + "begin_trial_now": "Begin Trial Now", + "what_included": { + "title": "What’s included?", + "point1": " palm readings", + "point1_bold": "Unlimited", + "point2": " with professional astrologers", + "point2_bold": "1:1 live chats", + "point3": " readings", + "point3_bold": "Daily compatibility", + "point4": "Cosmic relationship tips", + "point5": "Daily horoscopes" + }, + "palms_say_about": { + "title": "What do your palms say about you?", + "point1": " shows your attitude to love and the quality of love", + "point1_color": "Love line", + "point2": "A long thumb indicates good fortune", + "point3": " reflects your intelligence and mentality", + "point3_color": "Head line", + "point4": "A long index finger indicates a natural leader", + "point5": " defines the quality of your life and what you will achieve", + "point5_color": "Life line", + "point6": "A short middle finger reveals a free spirit", + "point7": " represents your material achievement and career goals", + "point7_color": "Fate line", + "point8": "A long ring finger reveals that a person tends to take risks", + "point9": "A short little finger indicates the person's lack of self-confidence" + }, + "discover_more": "Discover More", + "why_love": "Why does everyone ?", + "why_love_color": "love AURA", + "reviews": { + "username1": "Emma Johnson", + "tagline1": "\"It’s changed my life!\"", + "date1": "Jan 25", + "text1": "I used to keep running into failed relationships—things would start off well, but then everything would fall apart. It was exhausting, and I started wondering if the problem was me. Your service immediately felt different: instead of generic advice and random matches, I got precise insights about who I actually have a real chance of building something strong with. I still remember seeing my first compatibility analysis—it aligned so perfectly that I just knew: this was it. Now, I waste less time on pointless connections and am finally building a relationship that feels effortless and right.", + "username2": "Olivia Smith", + "tagline2": "\"After years of seeking, I’ve finally found a true love.\"", + "date2": "1m ago", + "text2": "I spent a long time doubting whether we were truly right for each other. Everything seemed fine, but at times, I felt like we were just too different. I searched online for answers, but all I found were vague, contradictory pieces of advice. The feelings were there, but so were the doubts. I just wanted to know if we had a future together, but nothing gave me a clear answer. Then I came across your service, decided to give it a shot—and I’m so glad I did. Your analysis of our personalities, compatibility, and potential challenges in the relationship matched perfectly from the very first pages. And suddenly, it hit me! I finally understood why he acts the way he does and how to build a stronger relationship with him. Your 30-day step-by-step guide is already making a difference—there’s more trust between us, and we argue less. Thank you!", + "username3": "Amanda Holmes", + "tagline3": "\"I’ve found a job I really enjoy.\"", + "text3": "Thanks to Vladana, I've finally discovered a clue about what my life's purpose really is and what kind of job resonates with me better!" + }, + "success_story": "Become a AURA Success Story!", + "as_seen_in": " As Seen in", + "footer": { + "text1": "Questions? We’re here to help", + "text2": "Customer Support", + "text3": "Help Center" + } + }, + "/payment": { + "will_be_charged": "You will be charged only . Save now. Then per week. We’ll before your trial ends.", + "will_be_charged_email_reminder": "email you a reminder", + "will_be_charged_trial_info": " for your -day trial", + "payment_information": { + "personalized_offer": "Personalized offer reserved", + "title": "Start your -day trial", + "total_today": "Total today", + "code_applied_bold": "AURA24", + "code_applied": "Code applied!" + }, + "guarantees": { + "no_commitment": "No commitment. Cancel anytime.", + "30_day_money_back": "30-Day Money-Back Guarantee" + }, + "get_personal_prediction": "Get personal prediction", + "total_due": "Total due today: ", + "app_number_one_color": "25 million people.", + "app_number_one": "The #1 Astrology app trusted by over " + }, + "/scanned-photo": { + "palm_lines": { + "head": "Head line ✅", + "heart": "Love line ✅", + "fate": "Fate line ✅", + "life": "Life line ✅" + }, + "title": "Your In-Depth Palmistry Compatibility Analysis Is Almost Ready!", + "text": "Judging by your lines, you have an exciting future ahead. Let's dive into all the details!", + "without-partner": { + "loaders": { + "title-1-1": "Analyzing your key traits...", + "title-1-2": "Reading astrological parameters...", + "title-2-1": "Calculating your unique compatibility chart...", + "title-2-2": "Creating a personalized love strategy...", + "title-3-1": "Comparing you across 1,120,000 potential astrological combinations...", + "title-3-2": "Checking forecast accuracy—almost there..." + }, + "modals": { + "title-1": "Clarifying question.", + "description-1": "Have you noticed recurring cycles in your life?", + "answer-1-left": "NO", + "answer-1-right": "YES", + "title-2": "Clarifying question.", + "description-2": "What's more important to you: fate or choice?", + "answer-2-left": "CHOICE", + "answer-2-right": "FATE", + "title-3": "Clarifying question.", + "description-3": "Do you believe there's more to love than chance?", + "answer-3-left": "NO", + "answer-3-right": "YES" + } + }, + "with-partner": { + "loaders": { + "title-1-1": "Analyzing both your and your partner's key traits...", + "title-1-2": "Reading astrological parameters...", + "title-2-1": "Calculating your unique compatibility chart...", + "title-2-2": "Checking key intersections of your destinies...", + "title-3-1": "Comparing your match across 1,120,000 potential astrological combinations...", + "title-3-2": "Inputting data: evaluating the depth of your connection—almost there..." + }, + "modals": { + "title-1": "Clarifying question.", + "description-1": "Have you noticed recurring cycles in your life?", + "answer-1-left": "NO", + "answer-1-right": "YES", + "title-2": "Clarifying question.", + "description-2": "What's more important to you: fate or choice?", + "answer-2-left": "CHOICE", + "answer-2-right": "FATE", + "title-3": "Clarifying question.", + "description-3": "Do you believe love is more than just luck?", + "answer-3-left": "NO", + "answer-3-right": "YES" + } + } + }, + "aura_paywall_palmistry_main": { + "text_0": "We have helped millions of people unveil the destiny of their love life and understand what's in store for their future and families.", + "text_1": "It costs us $13.21 to compensate our AURA team for the trial period, but please choose an amount that is comfortable for you." + }, + "/skip-trial": { + "title": "Not Looking to Look Back?", + "price_per_week": " per week", + "billing_period": "Billing Period", + "billed_amount": "Billed Amount", + "billed_in_4_weeks": "Billed in 4 weeks", + "start_trial": { + "every_week": "Every week", + "start_trial": "Start Trial" + }, + "skip_trial": { + "save": "save %", + "every_4_weeks": "Every 4 weeks", + "skip_trial": "Accept Offer and Skip Trial Period" + } + }, + "/add-consultant": { + "more_for_you": "More for You", + "exclusive_offer": "Exclusive offer just for you to help reach your goals faster", + "your_unique_consultation": "Your Unique Personal Consultation", + "30-minute": "30-minute private consultation with an expert", + "description": "You can request insights into your future, analyze life compatibility, check love compatibility, and more", + "one_time_price_offer": "Special one-time price:", + "original_price": "Original price: ", + "you_will_be_charged": "*You will be charged for any additional services or offers selected at the time of purchase.\n This is a one-time payment.", + "get_my_consultation": "Get My Consultation", + "discount_save": "Save", + "caution": "Caution!", + "caution_text": "To avoid double charging, please do not close the page or go back.", + "unlock_profound": "Unlock profound insights into your personality, relationships, career path, and key life moments with astrology. This will allow you to make more informed decisions and achieve greater satisfaction.", + "choose_from": "Choose from over 80 expert astrologers." + }, + "/camera": { + "bad_photo": "Bad Photo!", + "try_again": "Try Again", + "do_better": "You Can Do Better", + "no_access_camera": "No Access to Camera", + "give_access": "Give Access", + "reload_page": "Please reload the page to continue.", + "reload_page_button": "Reload Page", + "next": "Next", + "modal": { + "title": "To scan your hand, access to the Camera is required.", + "cancel": "Cancel", + "allow": "Allow" + } + }, + "/depends": { + "with-partner": { + "title": "Based on our data, only 9% of born under the have a distinct logical clarity—a rare gift. We'll definitely take this trait into account in your palm lines when preparing your Compatibility analysis with ." + }, + "single": { + "title": "Based on our data, only 9% of born under the sign possess a clear logical clarity—a rare gift. We'll certainly take this trait into account in your lines." + } + }, + "/with-heart": { + "with-partner": { + "title": "Your choice is natural. According to our data, 52% of follow their heart. We will consider this in your palm analysis for Compatibility with !" + }, + "single": { + "title": "Your choice is natural—based on our data, 51% of with the sign follow their heart. We'll take this into account in your lines!" + } + }, + "/with-head": { + "with-partner": { + "title": "Even among , not everything is decided by the heart – Based on our data, 35% of in your sign make decisions based on reason. We will take this aspect into account in your compatibility analysis with ." + }, + "single": { + "title": "Even among , not everything is decided by the heart—based on our data, 35% of of your sign make decisions guided by reason. We'll factor this into your analysis." + } + }, + "/both": { + "with-partner": { + "title": "The facts speak for themselves! According to our data, only 15% of born under the equally follow both their mind and heart. This is the secret to harmonious relationships with , and we'll consider this in your readings." + }, + "single": { + "title": "The facts speak for themselves! According to our data, only 15% of born under the sign follow both heart and mind equally. That's the secret to harmonious relationships, and we'll reflect this in your lines." + } + }, + "/romantic-gestures": { + "title": "How Do You Feel About Romantic Gestures?", + "answer1": "Love them", + "answer2": "Neutral", + "answer3": "Don't see the point" + }, + "/checking-phone": { + "title": "What Are Your Thoughts on Checking a Partner's Phone or Messages?", + "answer1": "Strongly against", + "answer2": "Only in extreme cases", + "answer3": "Fine with it" + }, + "zodiac_signs": { + "aries": "Aries", + "taurus": "Taurus", + "gemini": "Gemini", + "cancer": "Cancer", + "leo": "Leo", + "virgo": "Virgo", + "libra": "Libra", + "scorpio": "Scorpio", + "sagittarius": "Sagittarius", + "capricorn": "Capricorn", + "aquarius": "Aquarius", + "pisces": "Pisces" + } +} \ No newline at end of file diff --git a/public/locales/compatibility-v3/en/male_en.json b/public/locales/compatibility-v3/en/male_en.json new file mode 100644 index 0000000..c27f9cd --- /dev/null +++ b/public/locales/compatibility-v3/en/male_en.json @@ -0,0 +1,562 @@ +{ + "next": "Next", + "biometric_data": "We don’t collect any biometric data. All recognition processes occur on your device.", + "went_wrong": "Something went wrong.", + "v": "v1", + "config": "en.male", + "threadId": "thread_uBoB6htpYLoPp1bHDUXnrVKS", + "assistantId": "asst_ZClw0fzJaQlhxUigjxHp87Nc", + "privacy_policy": "By continuing, you agree to our and . Have a question? Reach out to our support team ", + "eula_link": "End User License Agreement", + "privacy_notice": "Privacy Notice", + "policy_here": "here", + "thumb": "Thumb", + "index_finger": "Index finger", + "middle_finger": "Middle finger", + "ring_finger": "Ring finger", + "pinky": "Little finger", + "skip_trial": "Skip trial period", + "add_consultant": "Add consultant", + "add_guides": "Add guides", + "access_product": "Access product", + "thank_you": "Thank you!", + "order_successful": "Your order was successfully processed!", + "male": "Male", + "female": "Female", + "males": "Males", + "females": "Females", + "/try-app": { + "header": { + "title": "Your Personalized Offer Reserved", + "get-prediction-in-app": "Get prediction in
the App" + }, + "palm_lines": { + "head": "Head line ✅", + "heart": "Love line ✅", + "fate": "Fate line ✅", + "life": "Life line ✅" + }, + "reading_ready": { + "title": "Your Compatibility Reading is READY and available in the app for your iPhone!" + }, + "your_access_code": "Your Access Code", + "copy": "COPY", + "instruction_point_1": "1. Copy Your Access Code", + "instruction_point_2": "2. Download the App and Enter Your Access Code", + "instruction_point_3": "3. Enter Your Access Code in the App", + "instruction_point_4": "1. Copy Your Access Code", + "instruction_point_5": "2. Enter Your Access Code in the App 👇", + "your_palm_reading_is_ready": "Your Palm Reading is READY", + "not_share_description": "Enter your access code in the app to access Your Personalized Reading. Do not share your code with anyone.", + "get_prediction_in_app": "Get personal prediction in the App", + "enter-code-title": "Enter Your Access Code:", + "code-copied": "Code copied", + "copy-code-title": "Click to copy code", + "how_work": { + "title": "How does AURA work?" + }, + "get-my-reading-in-app": "GET MY READING IN THE APP", + "why_love": "Why does everyone ?", + "why_love_color": "love AURA", + "as_seen_in": " As Seen in " + }, + "/find-your-happiness": { + "title": "Gain Clarity and Confidence in Life", + "text": "Use astrology and palmistry to strengthen yourself and your relationships", + "advantage1": "In-depth Analysis: We scan the lines on your palm", + "advantage2": "Personalized Approach: Compatibility and Future Analysis", + "advantage3": "Quick Results: Takes no more than 5 minutes" + }, + "/gender": { + "title": "What is Your Gender?", + "description": "In palmistry, everyone has both masculine and feminine traits.

Let's determine yours for a more accurate palm reading.", + "already_have_account": "Already have an account? Sign in", + "v1": { + "title": "Compatibility Test
👩‍❤️‍👨", + "subtitle": "It all starts with you!
Select your gender 👇", + "points": { + "point1": "The test takes less than a minute.", + "point2": "You’ll receive an analysis of your compatibility based on the lines on your hand.", + "point3": "100% data accuracy.", + "point4": "Over 50 pages of analysis." + } + }, + "v2": { + "title": "Compatibility Test", + "subtitle": "It all starts with you! Choose your gender.", + "points": { + "point1": "The test takes less than a minute.", + "point2": "You'll receive a compatibility analysis through palmistry based on the lines on your hand.", + "point3": "Resolve relationship issues in a month.", + "point4": "Save hundreds of dollars on unreliable forecasts.", + "point5": "Get a personalized analysis." + } + } + }, + "/birthdate": { + "title": "When Were You Born?", + "text": "Your birth date can reveal strengths and values that may help you move forward" + }, + "/palms-information": { + "aries": { + "title": "♈ Aries", + "description": "Совместимость – это ключ к гармонии в отношениях, и твоя энергия играет в этом главную роль. Согласно нашим данным, в 81% удачных союзов партнеры Овнов разделяют их страсть к действию и независимость. Решительность и амбиции определяют, насколько легко вы находите общий ритм с партнером.
Как влияет твой характер на совместимость? Что делает отношения прочными, а где могут возникнуть сложности? Далее мы подробно разберем, какие знаки и типы личности лучше всего подходят тебе, а также дадим советы, как усилить связь с партнером." + }, + "taurus": { + "title": "♉ Taurus", + "description": "Совместимость для тебя – это прочность и стабильность, ведь надежность в отношениях имеет первостепенное значение. Согласно нашим исследованиям, в 86% гармоничных союзов партнеры Тельцов разделяют их стремление к комфорту и верности. Спокойствие, преданность и терпение – вот что делает тебя идеальным спутником для долгосрочных отношений.
Но с какими партнерами тебе будет особенно легко, а с кем могут возникнуть противоречия? Как усилить связь и избежать недопонимания? Далее мы подробно разберем, какие союзы для тебя наиболее перспективны и как создать гармонию в отношениях." + }, + "gemini": { + "title": "♊ Gemini", + "description": "Твоя совместимость зависит от динамики и интеллектуального взаимодействия. Согласно нашим данным, в 78% удачных союзов партнеры Близнецов готовы к переменам, легкости и спонтанности. Остроумие, коммуникабельность и жажда новизны делают тебя увлекательным спутником, но требуют от партнера гибкости и умения идти в ногу с твоими идеями.
С кем твой союз будет самым гармоничным? А какие черты могут стать камнем преткновения? Далее мы подробно разберем, какие партнеры способны поддерживать твой ритм и как сделать отношения насыщенными, но устойчивыми." + }, + "cancer": { + "title": "♋ Cancer", + "description": "Совместимость для тебя строится на эмоциях, глубокой привязанности и доверии. Согласно нашим данным, в 82% крепких отношений партнеры Раков обладают развитой эмпатией и интуитивным пониманием друг друга. Ты ценишь заботу, стабильность и душевную близость, а значит, гармония возможна только с тем, кто умеет разделять твои чувства.
Но какие партнеры подходят тебе лучше всего? А с кем могут возникнуть сложности в понимании? Далее мы подробно разберем, какие союзы помогут тебе обрести настоящую гармонию и как укрепить эмоциональную связь с любимым человеком." + }, + "leo": { + "title": "♌ Leo", + "description": "Твоя совместимость строится на восхищении, страсти и признании. Согласно нашим данным, в 84% счастливых союзов партнеры Львов искренне восхищаются ими и поддерживают их амбиции. Ты стремишься к ярким, вдохновляющим отношениям, где тебя ценят, уважают и не пытаются затмить.
Но с кем твой союз будет наиболее гармоничным? А какие отношения могут привести к борьбе за лидерство? Далее мы подробно разберем, какие партнеры подходят тебе лучше всего и как построить прочный, но захватывающий союз." + }, + "virgo": { + "title": "♍ Virgo", + "description": "Твоя совместимость строится на доверии, стабильности и общем взгляде на жизнь. Согласно нашим наблюдениям, в 79% успешных союзов партнеры Дев ценят предсказуемость, заботу и рациональный подход к отношениям. Ты стремишься к порядку и гармонии, а значит, идеальный партнер – тот, кто разделяет твои ценности и уважает твой перфекционизм.
Но с кем твои отношения будут наиболее крепкими? А какие союзы могут потребовать больше компромиссов? Далее мы подробно разберем, какие партнеры подходят тебе лучше всего и как создать гармонию в отношениях, не жертвуя своими принципами." + }, + "libra": { + "title": "♎ Libra", + "description": "Твоя совместимость строится на балансе, честности и умении находить компромиссы. Согласно нашим данным, в 80% удачных союзов партнеры Весов разделяют их стремление к гармонии и открытому диалогу. Ты ценишь красивые, легкие и справедливые отношения, где оба партнера готовы работать над взаимопониманием.
Но кто станет твоим идеальным партнером? А с кем может быть сложнее найти общий язык? Далее мы подробно разберем, какие союзы помогут тебе обрести настоящую гармонию и как выстроить отношения, в которых будет царить равновесие." + }, + "scorpio": { + "title": "♏ Scorpio", + "description": "Твоя совместимость строится на страсти, глубине чувств и абсолютной преданности. Согласно нашим исследованиям, в 83% успешных союзов партнеры Скорпионов обладают такой же эмоциональной интенсивностью, не боясь глубокой связи и полной вовлеченности. Ты не приемлешь поверхностности в отношениях – тебе нужен партнер, который готов разделить с тобой и взлеты, и падения.
Но с кем твоя связь будет по-настоящему крепкой? А какие союзы могут столкнуться с испытаниями на доверие? Далее мы подробно разберем, какие партнеры способны выдержать накал твоих эмоций и как построить отношения, основанные на страсти и искренности." + }, + "sagittarius": { + "title": "♐ Sagittarius", + "description": "Твоя совместимость строится на свободе, приключениях и общем взгляде на жизнь. Согласно нашим данным, в 77% долгосрочных союзов партнеры Стрельцов разделяют их жажду новых впечатлений и открытий. Ты ценишь легкость, оптимизм и независимость, а значит, тебе нужен человек, который не станет ограничивать тебя, а будет готов идти рядом в новом путешествии.
Но с кем твой союз будет наполнен яркими эмоциями, а с кем могут возникнуть разногласия? Далее мы подробно разберем, какие партнеры идеально подходят тебе и как построить отношения, где свобода и близость будут дополнять друг друга." + }, + "capricorn": { + "title": "♑ Capricorn", + "description": "Твоя совместимость строится на общих целях, надежности и умении строить прочные отношения. Согласно нашим данным, в 85% счастливых браков партнеры Козерогов поддерживают их стремление к успеху и стабильности. Ты ценишь верность, ответственность и долгосрочные перспективы, а значит, тебе нужен партнер, который разделит твои амбиции и будет готов идти к общему будущему.
Но кто станет твоей надежной опорой, а с кем могут возникнуть разногласия? Далее мы подробно разберем, какие партнеры помогут тебе построить крепкий и стабильный союз, основанный на доверии и уважении." + }, + "aquarius": { + "title": "♒ Aquarius", + "description": "Твоя совместимость строится на свободе, интеллектуальном обмене и умении уважать индивидуальность друг друга. Согласно нашим исследованиям, в 75% гармоничных союзов партнеры Водолеев разделяют их стремление к независимости и нестандартный взгляд на жизнь. Ты ценишь оригинальность, свободу мысли и дружеские отношения в паре, а значит, тебе нужен партнер, который не будет тебя ограничивать, а будет вдохновлять.
Но с кем твои отношения будут особенно яркими и гармоничными? А какие союзы могут потребовать больше компромиссов? Далее мы подробно разберем, какие партнеры идеально подходят тебе и как построить отношения, в которых свобода и близость будут сочетаться в идеальном балансе." + }, + "pisces": { + "title": "♓ Pisces", + "description": "Твоя совместимость строится на глубокой эмоциональной связи, интуиции и способности чувствовать партнера. Согласно нашим данным, в 84% крепких отношений партнеры Рыб обладают схожей чувствительностью и умением понимать друг друга без слов. Ты ценишь романтику, душевную близость и тонкие невидимые нити, связывающие сердца.
Но с кем твой союз будет наполнен гармонией, а какие отношения могут столкнуться с испытаниями? Далее мы подробно разберем, какие партнеры подходят тебе лучше всего и как построить связь, основанную на доверии, искренности и взаимном понимании." + } + }, + "/what-aspects": { + "title": "Which Areas of Life Do You Want to Gain a Deeper Understanding Of?", + "answer1": "Love and Relationships", + "answer2": "Health and Energy", + "answer3": "Career and Purpose", + "answer4": "Life Transitions" + }, + "/relationship-status": { + "title": "To Better Understand You, Indicate Your Current Relationship Status", + "answer1": "Single", + "answer2": "In a Relationship", + "answer3": "Married", + "answer4": "Divorced" + }, + "/element-resonates": { + "title": "Which Element Empowers You the Most?", + "answer1": "Water", + "answer2": "Fire", + "answer3": "Air", + "answer4": "Earth", + "answer5": "Light", + "answer6": "Darkness" + }, + "/favorite-color": { + "title": "Which Color Best Reflects Your Personality?", + "answer1": "Blue", + "answer2": "Green", + "answer3": "Orange", + "answer4": "Violet", + "answer5": "Red", + "answer6": "Yellow", + "answer7": "Turquoise" + }, + "/head-or-heart": { + "title": "What Guides You in Life: The Call of the Heart or the Voice of Reason?", + "answer1": "Follow My Heart", + "answer2": "Rely on Reason", + "answer3": "Combine Both Approaches", + "answer4": "Depends on the Situation" + }, + "/relate-following": { + "title": "How Important Is It for You to Meet Your Partner's Expectations?", + "question1": "", + "question2": "I value and enjoy my own company.", + "question3": "I prefer socializing in groups rather than spending time alone.", + "question4": "Loneliness is something I actively try to avoid.", + "question5": "I enjoy activities that I can do independently.", + "strongly_agree": "Very Important", + "strongly_disagree": "Not Important at All" + }, + "/gender-partner": { + "title": "Your Partner's Gender", + "description": "Select your partner's gender for a personalized astrological analysis. The stars consider every detail! ✨", + "already_have_account": "" + }, + "/birthdate-partner": { + "title": "Your Partner's Birth Date?", + "text": "We'll incorporate zodiac influences for a more precise compatibility assessment" + }, + "/date-event": { + "single": { + "title": "Enter a Significant Date Important to You.", + "text": "💫 A significant date can help reveal planetary influences on your life and provide a more personalized analysis." + }, + "relationship": { + "title": "Enter a Significant Date Important to You or Your Partner.", + "text": "💫 A significant date can help reveal planetary influences on your relationship and provide a more personalized analysis." + } + }, + "/palms-information-partner": { + "aries": { + "title": "♈ Aries", + "description": "Passionate, straightforward, and initiative-driven. Falls in love quickly, acts decisively, but can be impatient and jealous. Loves leadership and craves intense emotions, hates routine. If the feelings fade, they leave without regret. You form an intriguing combination, and we have a lot to share with you!" + }, + "taurus": { + "title": "♉ Taurus", + "description": "Reliable, sensual, and loyal. Moves slowly but thoroughly in love. Values stability, comfort, and physical connection. Can be possessive and reluctant to let go of the past. Doesn't tolerate betrayal or sudden changes. How will your relationship fare? We have the answers!" + }, + "gemini": { + "title": "♊ Gemini", + "description": "Light-hearted, sociable, and unpredictable. Gets interested quickly but might lose interest just as fast. Enjoys intellectual interaction, flirting, and freedom. Sometimes inconsistent, but with someone who can keep their interest, they're committed. What are your chances for harmony? Let's find out together!" + }, + "cancer": { + "title": "♋ Cancer", + "description": "Sensitive, caring, and loyal. Emotions are their main element. Falls deeply in love but opens up slowly. Can be vulnerable and needs emotional safety. If disappointed, they leave but linger long over it. What's your emotional compatibility? We have the answer!" + }, + "leo": { + "title": "♌ Leo", + "description": "Bright, charismatic, and generous. Loves attention, compliments, and drama. Acts like a conqueror in love but desires admiration and loyalty. Can be self-centered but loyal to those who appreciate them. Can you become a true power couple? Let’s check!" + }, + "virgo": { + "title": "♍ Virgo", + "description": "Rational, reliable, and demanding. Cautious in love, doesn't rush to open up. Values order, honesty, and depth. Can be critical and reserved, but becomes a loyal partner once they trust. Your combination might be incredibly strong—let's discover the details!" + }, + "libra": { + "title": "♎ Libra", + "description": "Charming, diplomatic, and romantic. Loves harmony, elegant courtship, and intellectual conversation. May hesitate before making decisions but strives for equality and understanding in relationships. What role will you play in this connection? We'll tell you!" + }, + "scorpio": { + "title": "♏ Scorpio", + "description": "Deep, passionate, and magnetic. Loves seriously and long, but can be jealous and possessive. Trust and emotional connection are vital, and betrayal is unforgivable. Loves deeply. What secrets lie in your union? We know!" + }, + "sagittarius": { + "title": "♐ Sagittarius", + "description": "Free-spirited, energetic, and optimistic. Loves adventure, novelty, and independence. Falls in love quickly but doesn't tolerate pressure. May avoid commitments but becomes a loyal partner with someone who shares their spirit of freedom. Will your union be full of passion or freedom? Let's find out!" + }, + "capricorn": { + "title": "♑ Capricorn", + "description": "Reserved, goal-oriented, and reliable. Serious and practical in love, dislikes games and frivolity. Observes for a long time but builds strong, lasting relationships once decided. Faithful, but can be too strict. Compatibility with them can be life-changing—want to know more?" + }, + "aquarius": { + "title": "♒ Aquarius", + "description": "Original, independent, and intellectual. Loves freedom, experimentation, and friendship in relationships. Can be emotionally detached but with someone who shares their views, becomes a loyal ally. Your bond with them might be unconventional—let’s explore the details!" + }, + "pisces": { + "title": "♓ Pisces", + "description": "Romantic, intuitive, and dreamy. Falls deeply in love but can be prone to illusions. Seeks spiritual connection, tenderness, and care. May lose themselves in a partner, but if disillusioned, leaves behind a mystery. Will your union be magical or illusory? We know the answer!\n🔮 You form a unique combination, and we can tell you so much more! Let's dive into the details!" + } + }, + "/let-scan": { + "title": "We Are Scanning Your Palm", + "text": "Follow the on-screen instructions so we can analyze the lines of your palm, revealing the future and the secrets of your destiny!" + }, + "/scan-instruction": { + "title": "Photograph Your Palm as Shown", + "button": "Take Photo Now" + }, + "/email": { + "title": "Enter Your Email to Receive a Detailed Palmistry Compatibility Analysis!", + "not_share": "We do not share your personal information with third parties.", + "placeholder_email": "Your email", + "placeholder_name": "Your name" + }, + "app_number_one": { + "text": "The app trusted by over 25 million people.", + "color": "#1 Astrology" + }, + "/trial-payment": { + "information-title": "We're Ready to Give You All the Answers, Don't Spend Years in Doubt!", + "information-description-single": "Ты когда-нибудь задумывался, почему одни отношения развиваются легко, а другие будто натянуты, как струна? Совпадение или знак судьбы? в вашей жизни есть скрытые знаки, которые вы ещё не заметили.
Получите детальный анализ совместимости и откройте ответы, которые уже написаны в вашей судьбе.", + "information-description-single-color": " ()", + "information-description-single-event-description": "Ваша дата могла стать поворотной точкой или скрытым сигналом.", + "information-description-with-partner": "Ты когда-нибудь задумывался, почему одни отношения развиваются легко, а другие будто натянуты, как струна? Совпадение или знак судьбы? — два знака, созданные для глубины, но какие тайны скрывает ваш союз? Получите детальный анализ совместимости и откройте ответы, которые уже написаны в вашей судьбе.", + "information-description-with-partner-color": " () + ()", + "information-description-with-partner-event-description": "Ваша дата могла стать поворотной точкой или скрытым сигналом.", + "palm_is_ready": { + "title": "Your Palm Reading ", + "title_color": "Is Ready", + "description": "“I’ve just received your palm scan results. Let’s discuss!”", + "text1": " 6 years in palmistry readings and spiritual guidance.", + "text1_color": "Akho", + "text2": "Choose from 80+ palm readers and astrologers." + }, + "joined_today": { + "text1": "Unlimited chats with a palm reader", + "text2": " people joined today" + }, + "get_personal_prediction": "Get personal prediction", + "how_work": { + "title": "How does AURA work?", + "point1_title": "Send us your palm scan", + "point1_text": "We analyze your palm lines to get hints about your future", + "point2_title": "Your palm reading is generated", + "point2_text": "One of our professional palm readers puts together a report filled with hints about your future", + "point3_title": "Start your trial to receive your prediction", + "point3_text": "Once you’re an AURA member, we’ll send over your prediction report so you can begin living a better life.", + "point4_title": "Talk with a palm reading specialist anytime", + "point4_text": "Get ongoing support by discussing your readings, personal horoscopes, and compatibilities with our expert team." + }, + "money_back_guarantee": { + "title": "100% Money-back Guarantee", + "text": "If you don’t notice any progress after using the app for at least a week, we are ready to make a complete refund within 14 days." + }, + "begin_trial_now": "Begin Trial Now", + "what_included": { + "title": "What’s included?", + "point1": " palm readings", + "point1_bold": "Unlimited", + "point2": " with professional astrologers", + "point2_bold": "1:1 live chats", + "point3": " readings", + "point3_bold": "Daily compatibility", + "point4": "Cosmic relationship tips", + "point5": "Daily horoscopes" + }, + "palms_say_about": { + "title": "What do your palms say about you?", + "point1": " shows your attitude to love and the quality of love", + "point1_color": "Love line", + "point2": "A long thumb indicates good fortune", + "point3": " reflects your intelligence and mentality", + "point3_color": "Head line", + "point4": "A long index finger indicates a natural leader", + "point5": " defines the quality of your life and what you will achieve", + "point5_color": "Life line", + "point6": "A short middle finger reveals a free spirit", + "point7": " represents your material achievement and career goals", + "point7_color": "Fate line", + "point8": "A long ring finger reveals that a person tends to take risks", + "point9": "A short little finger indicates the person's lack of self-confidence" + }, + "discover_more": "Discover More", + "why_love": "Why does everyone ?", + "why_love_color": "love AURA", + "reviews": { + "username1": "Emma Johnson", + "tagline1": "\"It’s changed my life!\"", + "date1": "Jan 25", + "text1": "I used to keep running into failed relationships—things would start off well, but then everything would fall apart. It was exhausting, and I started wondering if the problem was me. Your service immediately felt different: instead of generic advice and random matches, I got precise insights about who I actually have a real chance of building something strong with. I still remember seeing my first compatibility analysis—it aligned so perfectly that I just knew: this was it. Now, I waste less time on pointless connections and am finally building a relationship that feels effortless and right.", + "username2": "Olivia Smith", + "tagline2": "\"After years of seeking, I’ve finally found a true love.\"", + "date2": "1m ago", + "text2": "I spent a long time doubting whether we were truly right for each other. Everything seemed fine, but at times, I felt like we were just too different. I searched online for answers, but all I found were vague, contradictory pieces of advice. The feelings were there, but so were the doubts. I just wanted to know if we had a future together, but nothing gave me a clear answer. Then I came across your service, decided to give it a shot—and I’m so glad I did. Your analysis of our personalities, compatibility, and potential challenges in the relationship matched perfectly from the very first pages. And suddenly, it hit me! I finally understood why he acts the way he does and how to build a stronger relationship with him. Your 30-day step-by-step guide is already making a difference—there’s more trust between us, and we argue less. Thank you!", + "username3": "Amanda Holmes", + "tagline3": "\"I’ve found a job I really enjoy.\"", + "text3": "Thanks to Vladana, I've finally discovered a clue about what my life's purpose really is and what kind of job resonates with me better!" + }, + "success_story": "Become a AURA Success Story!", + "as_seen_in": " As Seen in", + "footer": { + "text1": "Questions? We’re here to help", + "text2": "Customer Support", + "text3": "Help Center" + } + }, + "/payment": { + "will_be_charged": "You will be charged only . Save now. Then per week. We’ll before your trial ends.", + "will_be_charged_email_reminder": "email you a reminder", + "will_be_charged_trial_info": " for your -day trial", + "payment_information": { + "personalized_offer": "Personalized offer reserved", + "title": "Start your -day trial", + "total_today": "Total today", + "code_applied_bold": "AURA24", + "code_applied": "Code applied!" + }, + "guarantees": { + "no_commitment": "No commitment. Cancel anytime.", + "30_day_money_back": "30-Day Money-Back Guarantee" + }, + "get_personal_prediction": "Get personal prediction", + "total_due": "Total due today: ", + "app_number_one_color": "25 million people.", + "app_number_one": "The #1 Astrology app trusted by over " + }, + "/scanned-photo": { + "palm_lines": { + "head": "Head line ✅", + "heart": "Love line ✅", + "fate": "Fate line ✅", + "life": "Life line ✅" + }, + "title": "Your In-Depth Palmistry Compatibility Analysis Is Almost Ready!", + "text": "Judging by your lines, you have an exciting future ahead. Let's dive into all the details!", + "without-partner": { + "loaders": { + "title-1-1": "Analyzing your key traits...", + "title-1-2": "Reading astrological parameters...", + "title-2-1": "Calculating your unique compatibility chart...", + "title-2-2": "Creating a personalized love strategy...", + "title-3-1": "Comparing you across 1,120,000 potential astrological combinations...", + "title-3-2": "Checking forecast accuracy—almost there..." + }, + "modals": { + "title-1": "Clarifying question.", + "description-1": "Have you noticed recurring cycles in your life?", + "answer-1-left": "NO", + "answer-1-right": "YES", + "title-2": "Clarifying question.", + "description-2": "What's more important to you: fate or choice?", + "answer-2-left": "CHOICE", + "answer-2-right": "FATE", + "title-3": "Clarifying question.", + "description-3": "Do you believe there's more to love than chance?", + "answer-3-left": "NO", + "answer-3-right": "YES" + } + }, + "with-partner": { + "loaders": { + "title-1-1": "Analyzing both your and your partner's key traits...", + "title-1-2": "Reading astrological parameters...", + "title-2-1": "Calculating your unique compatibility chart...", + "title-2-2": "Checking key intersections of your destinies...", + "title-3-1": "Comparing your match across 1,120,000 potential astrological combinations...", + "title-3-2": "Inputting data: evaluating the depth of your connection—almost there..." + }, + "modals": { + "title-1": "Clarifying question.", + "description-1": "Have you noticed recurring cycles in your life?", + "answer-1-left": "NO", + "answer-1-right": "YES", + "title-2": "Clarifying question.", + "description-2": "What's more important to you: fate or choice?", + "answer-2-left": "CHOICE", + "answer-2-right": "FATE", + "title-3": "Clarifying question.", + "description-3": "Do you believe love is more than just luck?", + "answer-3-left": "NO", + "answer-3-right": "YES" + } + } + }, + "aura_paywall_palmistry_main": { + "text_0": "We have helped millions of people unveil the destiny of their love life and understand what's in store for their future and families.", + "text_1": "It costs us $13.21 to compensate our AURA team for the trial period, but please choose an amount that is comfortable for you." + }, + "/skip-trial": { + "title": "Not Looking to Look Back?", + "price_per_week": " per week", + "billing_period": "Billing Period", + "billed_amount": "Billed Amount", + "billed_in_4_weeks": "Billed in 4 weeks", + "start_trial": { + "every_week": "Every week", + "start_trial": "Start Trial" + }, + "skip_trial": { + "save": "save %", + "every_4_weeks": "Every 4 weeks", + "skip_trial": "Accept Offer and Skip Trial Period" + } + }, + "/add-consultant": { + "more_for_you": "More for You", + "exclusive_offer": "Exclusive offer just for you to help reach your goals faster", + "your_unique_consultation": "Your Unique Personal Consultation", + "30-minute": "30-minute private consultation with an expert", + "description": "You can request insights into your future, analyze life compatibility, check love compatibility, and more", + "one_time_price_offer": "Special one-time price:", + "original_price": "Original price: ", + "you_will_be_charged": "*You will be charged for any additional services or offers selected at the time of purchase.\n This is a one-time payment.", + "get_my_consultation": "Get My Consultation", + "discount_save": "Save", + "caution": "Caution!", + "caution_text": "To avoid double charging, please do not close the page or go back.", + "unlock_profound": "Unlock profound insights into your personality, relationships, career path, and key life moments with astrology. This will allow you to make more informed decisions and achieve greater satisfaction.", + "choose_from": "Choose from over 80 expert astrologers." + }, + "/camera": { + "bad_photo": "Bad Photo!", + "try_again": "Try Again", + "do_better": "You Can Do Better", + "no_access_camera": "No Access to Camera", + "give_access": "Give Access", + "reload_page": "Please reload the page to continue.", + "reload_page_button": "Reload Page", + "next": "Next", + "modal": { + "title": "To scan your hand, access to the Camera is required.", + "cancel": "Cancel", + "allow": "Allow" + } + }, + "/depends": { + "with-partner": { + "title": "На основонии наших данных лишь 9% рожденных под знаком имеют четкую логическую ясность — редкий дар. Мы обязательно это учтем в вашем анализе на совместимость с ." + }, + "single": { + "title": "На основонии наших данных лишь 9% рожденных под знаком имеют четкую логическую ясность — редкий дар. Мы обязательно это учтем в вашем анализе на совместимость." + } + }, + "/with-heart": { + "with-partner": { + "title": "Your choice is natural. According to our data, 52% of follow their heart. We will consider this in your palm analysis for Compatibility with !" + }, + "single": { + "title": "Your choice is natural—based on our data, 51% of with the sign follow their heart. We'll take this into account in your lines!" + } + }, + "/with-head": { + "with-partner": { + "title": "Even among , not everything is decided by the heart – Based on our data, 35% of in your sign make decisions based on reason. We will take this aspect into account in your compatibility analysis with ." + }, + "single": { + "title": "Even among , not everything is decided by the heart—based on our data, 35% of of your sign make decisions guided by reason. We'll factor this into your analysis." + } + }, + "/both": { + "with-partner": { + "title": "Факты говорят сами за себя! По нашим данным, только 15% , рожденных под знаком , одинаково следуют и разуму, и сердцу. Именно в этом скрыт секрет гармоничных отношений. Мы учтем эту особенность в вашем анализе на совместимость с ." + }, + "single": { + "title": "Факты говорят сами за себя! По нашим данным, только 15% , рожденных под знаком , одинаково следуют и разуму, и сердцу. Именно в этом скрыт секрет гармоничных отношений и мы учтем эту особенность в вашем анализе на совместимость." + } + }, + "/romantic-gestures": { + "title": "How Do You Feel About Romantic Gestures?", + "answer1": "Love them", + "answer2": "Neutral", + "answer3": "Don't see the point" + }, + "/checking-phone": { + "title": "What Are Your Thoughts on Checking a Partner's Phone or Messages?", + "answer1": "Strongly against", + "answer2": "Only in extreme cases", + "answer3": "Fine with it" + }, + "zodiac_signs": { + "aries": "Aries", + "taurus": "Taurus", + "gemini": "Gemini", + "cancer": "Cancer", + "leo": "Leo", + "virgo": "Virgo", + "libra": "Libra", + "scorpio": "Scorpio", + "sagittarius": "Sagittarius", + "capricorn": "Capricorn", + "aquarius": "Aquarius", + "pisces": "Pisces" + } +} \ No newline at end of file diff --git a/public/locales/email-marketing-comp-v2/en/female_en.json b/public/locales/email-marketing-comp-v2/en/female_en.json new file mode 100644 index 0000000..c187733 --- /dev/null +++ b/public/locales/email-marketing-comp-v2/en/female_en.json @@ -0,0 +1,81 @@ +{ + "trial-payment": { + "transform_your_life": "Transform your\nlife with the Power\nof Palmistry — Get your\npersonalized plan today", + "get_trial_days": "GET -day trial", + "personalized_reading_ready": "Personalized Palmistry\nReading is ready!", + "hands_reveal_title": "What your hands and fingers can reveal about you", + "hands_reveal_description": "Your hands and fingers are like a personal storybook, with each line representing a chapter of your life.", + "prepare_personalized_plan": "We will prepare your\npersonalized plan", + "aura_users_stories": "Here are a few stories from\nAURA Users", + "as_featured_in": "As featured in", + "discount_expires": "Discount expires", + "min": "min", + "sec": "sec", + "payment_table_special_offer": "Special offer", + "payment_table_title": "Personalized plan for ", + "payment_table_total_today": "Total today", + "payment_table_cost": "Including 1-week trial personal reading", + "guaranteed_security_payments": "Guaranteed security payments", + "policy_link": "Subscription policy", + "subscription_policy": "You are enrolling in 1 week subscription. By continuing you agree that if you don't cancel prior to the end of the -day trial for the you will automatically be charged every 1 week until you cancel in settings. Learn more about cancellation and refund policy in ", + "money_back_guarantee_title": "100% Money-back Guarantee", + "money_back_guarantee_text": "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.", + "palms_say_about_point5": " is a symbol of vitality, holds clues about your health, energy, and passion for life", + "palms_say_about_point5_color": "Life line", + "palms_say_about_point3": " reflects intellectual pursuits and mental strengths", + "palms_say_about_point3_color": "Head line", + "palms_say_about_point7": " reveals insights into your financial potential and approach towards wealth", + "palms_say_about_point7_color": "Fate line", + "palms_say_about_point1": " can reveal insights into your romantic journey, mapping your heart's desires", + "palms_say_about_point1_color": "Love line", + "palms_say_about_point9": "Each finger is a pillar of your personality, from leadership and ambition to creativity and self- expression", + "zodiac_sign": "Zodiac sign", + "zodiac_signs_aries": "Aries", + "zodiac_signs_taurus": "Taurus", + "zodiac_signs_gemini": "Gemini", + "zodiac_signs_cancer": "Cancer", + "zodiac_signs_leo": "Leo", + "zodiac_signs_virgo": "Virgo", + "zodiac_signs_libra": "Libra", + "zodiac_signs_scorpio": "Scorpio", + "zodiac_signs_sagittarius": "Sagittarius", + "zodiac_signs_capricorn": "Capricorn", + "zodiac_signs_aquarius": "Aquarius", + "zodiac_signs_pisces": "Pisces", + "gender": "Gender", + "male": "Male", + "female": "Female", + "date_of_birth": "Date of birth", + "place_of_birth": "Place of birth", + "reviews_username1": "Rebecca Bauman", + "reviews_tagline1": "\"It’s changed my life!\"", + "reviews_text1": "I'm thankful for this app and Akho! She's an excellent palm reader and astrologer—clear, thorough, and reassuring. I eagerly look forward to more sessions with her!", + "reviews_username2": "Mika Ryan", + "reviews_tagline2": "\"After years of seeking, I’ve finally found a true love.\"", + "reviews_text2": "I was hesitant about whether it was really worth trying, but now I have no regrets and I'm enjoying my new relationships!", + "reviews_username3": "Amanda Holmes", + "reviews_tagline3": "\"I’ve found a job I really enjoy.\"", + "reviews_text3": "Thanks to Vladana, I've finally discovered a clue about what my life's purpose really is and what kind of job resonates with me better!", + "copyright": ", Wit Apps LLC,
2108 N ST STE 5446 SACRAMENTO, CA 95816, US" + }, + "save-off": { + "title": "SAVE % OFF!", + "instead": " instead ", + "instead-old-price": "of ", + "trial-duration": "-days trial instead of ", + "old-trial-duration": " days", + "discount-offer": "% off on your Personalized Plan", + "button-trial": "GET -day trial" + }, + "secret-discount": { + "title": "You get a secret discount!", + "button-trial": "GET -DAY TRIAL", + "policy": "By continuing you agree that if you don't cancel prior to the end of the -days trial, you will automatically be charged the standard rate of every seven days until you cancel in settings. Learn more about cancellation and refund policy in Subscription terms.", + "secret-discount-table_title": "You get a secret discount!", + "secret-discount-table_subtitle": "No pressure. Cancel anytime.", + "secret-discount-table_discount-applied": "Secret discount applied!", + "secret-discount-table_cost-after-trial": "Your cost per days after trial:", + "secret-discount-table_you-save": "You save ", + "secret-discount-table_total-today": "Total today" + } +} \ No newline at end of file diff --git a/public/locales/email-marketing-comp-v2/en/male_en.json b/public/locales/email-marketing-comp-v2/en/male_en.json new file mode 100644 index 0000000..c187733 --- /dev/null +++ b/public/locales/email-marketing-comp-v2/en/male_en.json @@ -0,0 +1,81 @@ +{ + "trial-payment": { + "transform_your_life": "Transform your\nlife with the Power\nof Palmistry — Get your\npersonalized plan today", + "get_trial_days": "GET -day trial", + "personalized_reading_ready": "Personalized Palmistry\nReading is ready!", + "hands_reveal_title": "What your hands and fingers can reveal about you", + "hands_reveal_description": "Your hands and fingers are like a personal storybook, with each line representing a chapter of your life.", + "prepare_personalized_plan": "We will prepare your\npersonalized plan", + "aura_users_stories": "Here are a few stories from\nAURA Users", + "as_featured_in": "As featured in", + "discount_expires": "Discount expires", + "min": "min", + "sec": "sec", + "payment_table_special_offer": "Special offer", + "payment_table_title": "Personalized plan for ", + "payment_table_total_today": "Total today", + "payment_table_cost": "Including 1-week trial personal reading", + "guaranteed_security_payments": "Guaranteed security payments", + "policy_link": "Subscription policy", + "subscription_policy": "You are enrolling in 1 week subscription. By continuing you agree that if you don't cancel prior to the end of the -day trial for the you will automatically be charged every 1 week until you cancel in settings. Learn more about cancellation and refund policy in ", + "money_back_guarantee_title": "100% Money-back Guarantee", + "money_back_guarantee_text": "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.", + "palms_say_about_point5": " is a symbol of vitality, holds clues about your health, energy, and passion for life", + "palms_say_about_point5_color": "Life line", + "palms_say_about_point3": " reflects intellectual pursuits and mental strengths", + "palms_say_about_point3_color": "Head line", + "palms_say_about_point7": " reveals insights into your financial potential and approach towards wealth", + "palms_say_about_point7_color": "Fate line", + "palms_say_about_point1": " can reveal insights into your romantic journey, mapping your heart's desires", + "palms_say_about_point1_color": "Love line", + "palms_say_about_point9": "Each finger is a pillar of your personality, from leadership and ambition to creativity and self- expression", + "zodiac_sign": "Zodiac sign", + "zodiac_signs_aries": "Aries", + "zodiac_signs_taurus": "Taurus", + "zodiac_signs_gemini": "Gemini", + "zodiac_signs_cancer": "Cancer", + "zodiac_signs_leo": "Leo", + "zodiac_signs_virgo": "Virgo", + "zodiac_signs_libra": "Libra", + "zodiac_signs_scorpio": "Scorpio", + "zodiac_signs_sagittarius": "Sagittarius", + "zodiac_signs_capricorn": "Capricorn", + "zodiac_signs_aquarius": "Aquarius", + "zodiac_signs_pisces": "Pisces", + "gender": "Gender", + "male": "Male", + "female": "Female", + "date_of_birth": "Date of birth", + "place_of_birth": "Place of birth", + "reviews_username1": "Rebecca Bauman", + "reviews_tagline1": "\"It’s changed my life!\"", + "reviews_text1": "I'm thankful for this app and Akho! She's an excellent palm reader and astrologer—clear, thorough, and reassuring. I eagerly look forward to more sessions with her!", + "reviews_username2": "Mika Ryan", + "reviews_tagline2": "\"After years of seeking, I’ve finally found a true love.\"", + "reviews_text2": "I was hesitant about whether it was really worth trying, but now I have no regrets and I'm enjoying my new relationships!", + "reviews_username3": "Amanda Holmes", + "reviews_tagline3": "\"I’ve found a job I really enjoy.\"", + "reviews_text3": "Thanks to Vladana, I've finally discovered a clue about what my life's purpose really is and what kind of job resonates with me better!", + "copyright": ", Wit Apps LLC,
2108 N ST STE 5446 SACRAMENTO, CA 95816, US" + }, + "save-off": { + "title": "SAVE % OFF!", + "instead": " instead ", + "instead-old-price": "of ", + "trial-duration": "-days trial instead of ", + "old-trial-duration": " days", + "discount-offer": "% off on your Personalized Plan", + "button-trial": "GET -day trial" + }, + "secret-discount": { + "title": "You get a secret discount!", + "button-trial": "GET -DAY TRIAL", + "policy": "By continuing you agree that if you don't cancel prior to the end of the -days trial, you will automatically be charged the standard rate of every seven days until you cancel in settings. Learn more about cancellation and refund policy in Subscription terms.", + "secret-discount-table_title": "You get a secret discount!", + "secret-discount-table_subtitle": "No pressure. Cancel anytime.", + "secret-discount-table_discount-applied": "Secret discount applied!", + "secret-discount-table_cost-after-trial": "Your cost per days after trial:", + "secret-discount-table_you-save": "You save ", + "secret-discount-table_total-today": "Total today" + } +} \ No newline at end of file diff --git a/public/locales/email-marketing-comp-v3/en/female_en.json b/public/locales/email-marketing-comp-v3/en/female_en.json new file mode 100644 index 0000000..c187733 --- /dev/null +++ b/public/locales/email-marketing-comp-v3/en/female_en.json @@ -0,0 +1,81 @@ +{ + "trial-payment": { + "transform_your_life": "Transform your\nlife with the Power\nof Palmistry — Get your\npersonalized plan today", + "get_trial_days": "GET -day trial", + "personalized_reading_ready": "Personalized Palmistry\nReading is ready!", + "hands_reveal_title": "What your hands and fingers can reveal about you", + "hands_reveal_description": "Your hands and fingers are like a personal storybook, with each line representing a chapter of your life.", + "prepare_personalized_plan": "We will prepare your\npersonalized plan", + "aura_users_stories": "Here are a few stories from\nAURA Users", + "as_featured_in": "As featured in", + "discount_expires": "Discount expires", + "min": "min", + "sec": "sec", + "payment_table_special_offer": "Special offer", + "payment_table_title": "Personalized plan for ", + "payment_table_total_today": "Total today", + "payment_table_cost": "Including 1-week trial personal reading", + "guaranteed_security_payments": "Guaranteed security payments", + "policy_link": "Subscription policy", + "subscription_policy": "You are enrolling in 1 week subscription. By continuing you agree that if you don't cancel prior to the end of the -day trial for the you will automatically be charged every 1 week until you cancel in settings. Learn more about cancellation and refund policy in ", + "money_back_guarantee_title": "100% Money-back Guarantee", + "money_back_guarantee_text": "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.", + "palms_say_about_point5": " is a symbol of vitality, holds clues about your health, energy, and passion for life", + "palms_say_about_point5_color": "Life line", + "palms_say_about_point3": " reflects intellectual pursuits and mental strengths", + "palms_say_about_point3_color": "Head line", + "palms_say_about_point7": " reveals insights into your financial potential and approach towards wealth", + "palms_say_about_point7_color": "Fate line", + "palms_say_about_point1": " can reveal insights into your romantic journey, mapping your heart's desires", + "palms_say_about_point1_color": "Love line", + "palms_say_about_point9": "Each finger is a pillar of your personality, from leadership and ambition to creativity and self- expression", + "zodiac_sign": "Zodiac sign", + "zodiac_signs_aries": "Aries", + "zodiac_signs_taurus": "Taurus", + "zodiac_signs_gemini": "Gemini", + "zodiac_signs_cancer": "Cancer", + "zodiac_signs_leo": "Leo", + "zodiac_signs_virgo": "Virgo", + "zodiac_signs_libra": "Libra", + "zodiac_signs_scorpio": "Scorpio", + "zodiac_signs_sagittarius": "Sagittarius", + "zodiac_signs_capricorn": "Capricorn", + "zodiac_signs_aquarius": "Aquarius", + "zodiac_signs_pisces": "Pisces", + "gender": "Gender", + "male": "Male", + "female": "Female", + "date_of_birth": "Date of birth", + "place_of_birth": "Place of birth", + "reviews_username1": "Rebecca Bauman", + "reviews_tagline1": "\"It’s changed my life!\"", + "reviews_text1": "I'm thankful for this app and Akho! She's an excellent palm reader and astrologer—clear, thorough, and reassuring. I eagerly look forward to more sessions with her!", + "reviews_username2": "Mika Ryan", + "reviews_tagline2": "\"After years of seeking, I’ve finally found a true love.\"", + "reviews_text2": "I was hesitant about whether it was really worth trying, but now I have no regrets and I'm enjoying my new relationships!", + "reviews_username3": "Amanda Holmes", + "reviews_tagline3": "\"I’ve found a job I really enjoy.\"", + "reviews_text3": "Thanks to Vladana, I've finally discovered a clue about what my life's purpose really is and what kind of job resonates with me better!", + "copyright": ", Wit Apps LLC,
2108 N ST STE 5446 SACRAMENTO, CA 95816, US" + }, + "save-off": { + "title": "SAVE % OFF!", + "instead": " instead ", + "instead-old-price": "of ", + "trial-duration": "-days trial instead of ", + "old-trial-duration": " days", + "discount-offer": "% off on your Personalized Plan", + "button-trial": "GET -day trial" + }, + "secret-discount": { + "title": "You get a secret discount!", + "button-trial": "GET -DAY TRIAL", + "policy": "By continuing you agree that if you don't cancel prior to the end of the -days trial, you will automatically be charged the standard rate of every seven days until you cancel in settings. Learn more about cancellation and refund policy in Subscription terms.", + "secret-discount-table_title": "You get a secret discount!", + "secret-discount-table_subtitle": "No pressure. Cancel anytime.", + "secret-discount-table_discount-applied": "Secret discount applied!", + "secret-discount-table_cost-after-trial": "Your cost per days after trial:", + "secret-discount-table_you-save": "You save ", + "secret-discount-table_total-today": "Total today" + } +} \ No newline at end of file diff --git a/public/locales/email-marketing-comp-v3/en/male_en.json b/public/locales/email-marketing-comp-v3/en/male_en.json new file mode 100644 index 0000000..c187733 --- /dev/null +++ b/public/locales/email-marketing-comp-v3/en/male_en.json @@ -0,0 +1,81 @@ +{ + "trial-payment": { + "transform_your_life": "Transform your\nlife with the Power\nof Palmistry — Get your\npersonalized plan today", + "get_trial_days": "GET -day trial", + "personalized_reading_ready": "Personalized Palmistry\nReading is ready!", + "hands_reveal_title": "What your hands and fingers can reveal about you", + "hands_reveal_description": "Your hands and fingers are like a personal storybook, with each line representing a chapter of your life.", + "prepare_personalized_plan": "We will prepare your\npersonalized plan", + "aura_users_stories": "Here are a few stories from\nAURA Users", + "as_featured_in": "As featured in", + "discount_expires": "Discount expires", + "min": "min", + "sec": "sec", + "payment_table_special_offer": "Special offer", + "payment_table_title": "Personalized plan for ", + "payment_table_total_today": "Total today", + "payment_table_cost": "Including 1-week trial personal reading", + "guaranteed_security_payments": "Guaranteed security payments", + "policy_link": "Subscription policy", + "subscription_policy": "You are enrolling in 1 week subscription. By continuing you agree that if you don't cancel prior to the end of the -day trial for the you will automatically be charged every 1 week until you cancel in settings. Learn more about cancellation and refund policy in ", + "money_back_guarantee_title": "100% Money-back Guarantee", + "money_back_guarantee_text": "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.", + "palms_say_about_point5": " is a symbol of vitality, holds clues about your health, energy, and passion for life", + "palms_say_about_point5_color": "Life line", + "palms_say_about_point3": " reflects intellectual pursuits and mental strengths", + "palms_say_about_point3_color": "Head line", + "palms_say_about_point7": " reveals insights into your financial potential and approach towards wealth", + "palms_say_about_point7_color": "Fate line", + "palms_say_about_point1": " can reveal insights into your romantic journey, mapping your heart's desires", + "palms_say_about_point1_color": "Love line", + "palms_say_about_point9": "Each finger is a pillar of your personality, from leadership and ambition to creativity and self- expression", + "zodiac_sign": "Zodiac sign", + "zodiac_signs_aries": "Aries", + "zodiac_signs_taurus": "Taurus", + "zodiac_signs_gemini": "Gemini", + "zodiac_signs_cancer": "Cancer", + "zodiac_signs_leo": "Leo", + "zodiac_signs_virgo": "Virgo", + "zodiac_signs_libra": "Libra", + "zodiac_signs_scorpio": "Scorpio", + "zodiac_signs_sagittarius": "Sagittarius", + "zodiac_signs_capricorn": "Capricorn", + "zodiac_signs_aquarius": "Aquarius", + "zodiac_signs_pisces": "Pisces", + "gender": "Gender", + "male": "Male", + "female": "Female", + "date_of_birth": "Date of birth", + "place_of_birth": "Place of birth", + "reviews_username1": "Rebecca Bauman", + "reviews_tagline1": "\"It’s changed my life!\"", + "reviews_text1": "I'm thankful for this app and Akho! She's an excellent palm reader and astrologer—clear, thorough, and reassuring. I eagerly look forward to more sessions with her!", + "reviews_username2": "Mika Ryan", + "reviews_tagline2": "\"After years of seeking, I’ve finally found a true love.\"", + "reviews_text2": "I was hesitant about whether it was really worth trying, but now I have no regrets and I'm enjoying my new relationships!", + "reviews_username3": "Amanda Holmes", + "reviews_tagline3": "\"I’ve found a job I really enjoy.\"", + "reviews_text3": "Thanks to Vladana, I've finally discovered a clue about what my life's purpose really is and what kind of job resonates with me better!", + "copyright": ", Wit Apps LLC,
2108 N ST STE 5446 SACRAMENTO, CA 95816, US" + }, + "save-off": { + "title": "SAVE % OFF!", + "instead": " instead ", + "instead-old-price": "of ", + "trial-duration": "-days trial instead of ", + "old-trial-duration": " days", + "discount-offer": "% off on your Personalized Plan", + "button-trial": "GET -day trial" + }, + "secret-discount": { + "title": "You get a secret discount!", + "button-trial": "GET -DAY TRIAL", + "policy": "By continuing you agree that if you don't cancel prior to the end of the -days trial, you will automatically be charged the standard rate of every seven days until you cancel in settings. Learn more about cancellation and refund policy in Subscription terms.", + "secret-discount-table_title": "You get a secret discount!", + "secret-discount-table_subtitle": "No pressure. Cancel anytime.", + "secret-discount-table_discount-applied": "Secret discount applied!", + "secret-discount-table_cost-after-trial": "Your cost per days after trial:", + "secret-discount-table_you-save": "You save ", + "secret-discount-table_total-today": "Total today" + } +} \ No newline at end of file diff --git a/public/v3/compatibility/1_1.svg b/public/v3/compatibility/1_1.svg new file mode 100644 index 0000000..2f78341 --- /dev/null +++ b/public/v3/compatibility/1_1.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/v3/compatibility/apple-icon.png b/public/v3/compatibility/apple-icon.png new file mode 100644 index 0000000..699c606 Binary files /dev/null and b/public/v3/compatibility/apple-icon.png differ diff --git a/public/v3/compatibility/blue.png b/public/v3/compatibility/blue.png new file mode 100644 index 0000000..fd00d4d Binary files /dev/null and b/public/v3/compatibility/blue.png differ diff --git a/public/v3/compatibility/calendar.svg b/public/v3/compatibility/calendar.svg new file mode 100644 index 0000000..6f0e6f1 --- /dev/null +++ b/public/v3/compatibility/calendar.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/v3/compatibility/check-mark.svg b/public/v3/compatibility/check-mark.svg new file mode 100644 index 0000000..159fc6a --- /dev/null +++ b/public/v3/compatibility/check-mark.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/v3/compatibility/circle-in-ring.svg b/public/v3/compatibility/circle-in-ring.svg new file mode 100644 index 0000000..98dd981 --- /dev/null +++ b/public/v3/compatibility/circle-in-ring.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/v3/compatibility/copy-icon-white.png b/public/v3/compatibility/copy-icon-white.png new file mode 100644 index 0000000..d3d49e1 Binary files /dev/null and b/public/v3/compatibility/copy-icon-white.png differ diff --git a/public/v3/compatibility/copy-icon.png b/public/v3/compatibility/copy-icon.png new file mode 100644 index 0000000..848b98d Binary files /dev/null and b/public/v3/compatibility/copy-icon.png differ diff --git a/public/v3/compatibility/cosmic.svg b/public/v3/compatibility/cosmic.svg new file mode 100644 index 0000000..b1a0bd1 --- /dev/null +++ b/public/v3/compatibility/cosmic.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/v3/compatibility/daily.svg b/public/v3/compatibility/daily.svg new file mode 100644 index 0000000..620b4eb --- /dev/null +++ b/public/v3/compatibility/daily.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/v3/compatibility/darts.png b/public/v3/compatibility/darts.png new file mode 100644 index 0000000..eeea01a Binary files /dev/null and b/public/v3/compatibility/darts.png differ diff --git a/public/v3/compatibility/discount/fate-line.svg b/public/v3/compatibility/discount/fate-line.svg new file mode 100644 index 0000000..5e7a012 --- /dev/null +++ b/public/v3/compatibility/discount/fate-line.svg @@ -0,0 +1,3510 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v3/compatibility/discount/featured.svg b/public/v3/compatibility/discount/featured.svg new file mode 100644 index 0000000..9a3df4d --- /dev/null +++ b/public/v3/compatibility/discount/featured.svg @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v3/compatibility/discount/fire.png b/public/v3/compatibility/discount/fire.png new file mode 100644 index 0000000..1966e9a Binary files /dev/null and b/public/v3/compatibility/discount/fire.png differ diff --git a/public/v3/compatibility/discount/gift.png b/public/v3/compatibility/discount/gift.png new file mode 100644 index 0000000..bf58560 Binary files /dev/null and b/public/v3/compatibility/discount/gift.png differ diff --git a/public/v3/compatibility/discount/gift.svg b/public/v3/compatibility/discount/gift.svg new file mode 100644 index 0000000..1bfccec --- /dev/null +++ b/public/v3/compatibility/discount/gift.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v3/compatibility/discount/guard.svg b/public/v3/compatibility/discount/guard.svg new file mode 100644 index 0000000..611d6dd --- /dev/null +++ b/public/v3/compatibility/discount/guard.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/v3/compatibility/discount/hand-fingers.svg b/public/v3/compatibility/discount/hand-fingers.svg new file mode 100644 index 0000000..5030a9c --- /dev/null +++ b/public/v3/compatibility/discount/hand-fingers.svg @@ -0,0 +1,3469 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v3/compatibility/discount/hand.svg b/public/v3/compatibility/discount/hand.svg new file mode 100644 index 0000000..be33298 --- /dev/null +++ b/public/v3/compatibility/discount/hand.svg @@ -0,0 +1,1797 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v3/compatibility/discount/head-line.svg b/public/v3/compatibility/discount/head-line.svg new file mode 100644 index 0000000..737c36b --- /dev/null +++ b/public/v3/compatibility/discount/head-line.svg @@ -0,0 +1,3180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v3/compatibility/discount/life-line.svg b/public/v3/compatibility/discount/life-line.svg new file mode 100644 index 0000000..366ec1f --- /dev/null +++ b/public/v3/compatibility/discount/life-line.svg @@ -0,0 +1,3393 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v3/compatibility/discount/love-line.svg b/public/v3/compatibility/discount/love-line.svg new file mode 100644 index 0000000..0e9e95b --- /dev/null +++ b/public/v3/compatibility/discount/love-line.svg @@ -0,0 +1,2356 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v3/compatibility/discount/money-back.svg b/public/v3/compatibility/discount/money-back.svg new file mode 100644 index 0000000..85c7e35 --- /dev/null +++ b/public/v3/compatibility/discount/money-back.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/v3/compatibility/discount/plus.svg b/public/v3/compatibility/discount/plus.svg new file mode 100644 index 0000000..9c00bef --- /dev/null +++ b/public/v3/compatibility/discount/plus.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/v3/compatibility/download-app.png b/public/v3/compatibility/download-app.png new file mode 100644 index 0000000..c4610ff Binary files /dev/null and b/public/v3/compatibility/download-app.png differ diff --git a/public/v3/compatibility/fate-line.svg b/public/v3/compatibility/fate-line.svg new file mode 100644 index 0000000..28e82ca --- /dev/null +++ b/public/v3/compatibility/fate-line.svg @@ -0,0 +1,3519 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v3/compatibility/green.png b/public/v3/compatibility/green.png new file mode 100644 index 0000000..6a9b429 Binary files /dev/null and b/public/v3/compatibility/green.png differ diff --git a/public/v3/compatibility/hand-animation.png b/public/v3/compatibility/hand-animation.png new file mode 100644 index 0000000..4c6faaf Binary files /dev/null and b/public/v3/compatibility/hand-animation.png differ diff --git a/public/v3/compatibility/hand-little-finger.svg b/public/v3/compatibility/hand-little-finger.svg new file mode 100644 index 0000000..8557fb4 --- /dev/null +++ b/public/v3/compatibility/hand-little-finger.svg @@ -0,0 +1,3433 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v3/compatibility/hand-with-eye.png b/public/v3/compatibility/hand-with-eye.png new file mode 100644 index 0000000..090ec49 Binary files /dev/null and b/public/v3/compatibility/hand-with-eye.png differ diff --git a/public/v3/compatibility/hand-with-eye.svg b/public/v3/compatibility/hand-with-eye.svg new file mode 100644 index 0000000..0de97e2 --- /dev/null +++ b/public/v3/compatibility/hand-with-eye.svg @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v3/compatibility/hand-with-lines-v1.png b/public/v3/compatibility/hand-with-lines-v1.png new file mode 100644 index 0000000..1c508f4 Binary files /dev/null and b/public/v3/compatibility/hand-with-lines-v1.png differ diff --git a/public/v3/compatibility/hand-with-lines.png b/public/v3/compatibility/hand-with-lines.png new file mode 100644 index 0000000..1e277d9 Binary files /dev/null and b/public/v3/compatibility/hand-with-lines.png differ diff --git a/public/v3/compatibility/hand-with-lines.svg b/public/v3/compatibility/hand-with-lines.svg new file mode 100644 index 0000000..a9b3bb2 --- /dev/null +++ b/public/v3/compatibility/hand-with-lines.svg @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v3/compatibility/hand.svg b/public/v3/compatibility/hand.svg new file mode 100644 index 0000000..0ea43c1 --- /dev/null +++ b/public/v3/compatibility/hand.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/v3/compatibility/head-line.svg b/public/v3/compatibility/head-line.svg new file mode 100644 index 0000000..e212414 --- /dev/null +++ b/public/v3/compatibility/head-line.svg @@ -0,0 +1,3331 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v3/compatibility/headphones.svg b/public/v3/compatibility/headphones.svg new file mode 100644 index 0000000..4498e84 --- /dev/null +++ b/public/v3/compatibility/headphones.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/v3/compatibility/let-scan.png b/public/v3/compatibility/let-scan.png new file mode 100644 index 0000000..f44d331 Binary files /dev/null and b/public/v3/compatibility/let-scan.png differ diff --git a/public/v3/compatibility/life-line.svg b/public/v3/compatibility/life-line.svg new file mode 100644 index 0000000..25eb3ab --- /dev/null +++ b/public/v3/compatibility/life-line.svg @@ -0,0 +1,3331 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v3/compatibility/love-line.svg b/public/v3/compatibility/love-line.svg new file mode 100644 index 0000000..beb9b18 --- /dev/null +++ b/public/v3/compatibility/love-line.svg @@ -0,0 +1,2365 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v3/compatibility/money-back.svg b/public/v3/compatibility/money-back.svg new file mode 100644 index 0000000..33bce07 --- /dev/null +++ b/public/v3/compatibility/money-back.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/v3/compatibility/orange.png b/public/v3/compatibility/orange.png new file mode 100644 index 0000000..96002da Binary files /dev/null and b/public/v3/compatibility/orange.png differ diff --git a/public/v3/compatibility/partners.png b/public/v3/compatibility/partners.png new file mode 100644 index 0000000..c11d03f Binary files /dev/null and b/public/v3/compatibility/partners.png differ diff --git a/public/v3/compatibility/partners.svg b/public/v3/compatibility/partners.svg new file mode 100644 index 0000000..2e7b435 --- /dev/null +++ b/public/v3/compatibility/partners.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v3/compatibility/question.svg b/public/v3/compatibility/question.svg new file mode 100644 index 0000000..7636e87 --- /dev/null +++ b/public/v3/compatibility/question.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/v3/compatibility/red.png b/public/v3/compatibility/red.png new file mode 100644 index 0000000..4a638c6 Binary files /dev/null and b/public/v3/compatibility/red.png differ diff --git a/public/v3/compatibility/reviews.png b/public/v3/compatibility/reviews.png new file mode 100644 index 0000000..7f0051b Binary files /dev/null and b/public/v3/compatibility/reviews.png differ diff --git a/public/v3/compatibility/reviews/amanda.png b/public/v3/compatibility/reviews/amanda.png new file mode 100644 index 0000000..32c1906 Binary files /dev/null and b/public/v3/compatibility/reviews/amanda.png differ diff --git a/public/v3/compatibility/reviews/mika.png b/public/v3/compatibility/reviews/mika.png new file mode 100644 index 0000000..d1d57e3 Binary files /dev/null and b/public/v3/compatibility/reviews/mika.png differ diff --git a/public/v3/compatibility/reviews/rebecca.png b/public/v3/compatibility/reviews/rebecca.png new file mode 100644 index 0000000..d083cee Binary files /dev/null and b/public/v3/compatibility/reviews/rebecca.png differ diff --git a/public/v3/compatibility/ring.svg b/public/v3/compatibility/ring.svg new file mode 100644 index 0000000..f8a89e2 --- /dev/null +++ b/public/v3/compatibility/ring.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/v3/compatibility/scan-instruction.png b/public/v3/compatibility/scan-instruction.png new file mode 100644 index 0000000..b0fd2ba Binary files /dev/null and b/public/v3/compatibility/scan-instruction.png differ diff --git a/public/v3/compatibility/star.png b/public/v3/compatibility/star.png new file mode 100644 index 0000000..2f2a04e Binary files /dev/null and b/public/v3/compatibility/star.png differ diff --git a/public/v3/compatibility/ticket.svg b/public/v3/compatibility/ticket.svg new file mode 100644 index 0000000..610efd1 --- /dev/null +++ b/public/v3/compatibility/ticket.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/v3/compatibility/trial-payment/avatar-1.png b/public/v3/compatibility/trial-payment/avatar-1.png new file mode 100644 index 0000000..fbf73b8 Binary files /dev/null and b/public/v3/compatibility/trial-payment/avatar-1.png differ diff --git a/public/v3/compatibility/trial-payment/avatar-2.png b/public/v3/compatibility/trial-payment/avatar-2.png new file mode 100644 index 0000000..84b1eb3 Binary files /dev/null and b/public/v3/compatibility/trial-payment/avatar-2.png differ diff --git a/public/v3/compatibility/trial-payment/avatar-3.png b/public/v3/compatibility/trial-payment/avatar-3.png new file mode 100644 index 0000000..760c450 Binary files /dev/null and b/public/v3/compatibility/trial-payment/avatar-3.png differ diff --git a/public/v3/compatibility/trial-payment/avatar-4.png b/public/v3/compatibility/trial-payment/avatar-4.png new file mode 100644 index 0000000..eac488a Binary files /dev/null and b/public/v3/compatibility/trial-payment/avatar-4.png differ diff --git a/public/v3/compatibility/trial-payment/girl.png b/public/v3/compatibility/trial-payment/girl.png new file mode 100644 index 0000000..95824cb Binary files /dev/null and b/public/v3/compatibility/trial-payment/girl.png differ diff --git a/public/v3/compatibility/trial-payment/girl2.png b/public/v3/compatibility/trial-payment/girl2.png new file mode 100644 index 0000000..e4672b0 Binary files /dev/null and b/public/v3/compatibility/trial-payment/girl2.png differ diff --git a/public/v3/compatibility/trial-payment/infinite.svg b/public/v3/compatibility/trial-payment/infinite.svg new file mode 100644 index 0000000..481ddf7 --- /dev/null +++ b/public/v3/compatibility/trial-payment/infinite.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/v3/compatibility/trial-payment/people.svg b/public/v3/compatibility/trial-payment/people.svg new file mode 100644 index 0000000..2d33ea5 --- /dev/null +++ b/public/v3/compatibility/trial-payment/people.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/v3/compatibility/violet.png b/public/v3/compatibility/violet.png new file mode 100644 index 0000000..24497d8 Binary files /dev/null and b/public/v3/compatibility/violet.png differ diff --git a/public/v3/compatibility/yellow.png b/public/v3/compatibility/yellow.png new file mode 100644 index 0000000..1ee5298 Binary files /dev/null and b/public/v3/compatibility/yellow.png differ diff --git a/public/v3/compatibility/zodiacs/female/AQUARIUS.webp b/public/v3/compatibility/zodiacs/female/AQUARIUS.webp new file mode 100644 index 0000000..574cc7c Binary files /dev/null and b/public/v3/compatibility/zodiacs/female/AQUARIUS.webp differ diff --git a/public/v3/compatibility/zodiacs/female/ARIES.webp b/public/v3/compatibility/zodiacs/female/ARIES.webp new file mode 100644 index 0000000..fe1ab38 Binary files /dev/null and b/public/v3/compatibility/zodiacs/female/ARIES.webp differ diff --git a/public/v3/compatibility/zodiacs/female/CANCER.webp b/public/v3/compatibility/zodiacs/female/CANCER.webp new file mode 100644 index 0000000..c7415c6 Binary files /dev/null and b/public/v3/compatibility/zodiacs/female/CANCER.webp differ diff --git a/public/v3/compatibility/zodiacs/female/CAPRICORN.webp b/public/v3/compatibility/zodiacs/female/CAPRICORN.webp new file mode 100644 index 0000000..53bef7f Binary files /dev/null and b/public/v3/compatibility/zodiacs/female/CAPRICORN.webp differ diff --git a/public/v3/compatibility/zodiacs/female/GEMINI.webp b/public/v3/compatibility/zodiacs/female/GEMINI.webp new file mode 100644 index 0000000..372800f Binary files /dev/null and b/public/v3/compatibility/zodiacs/female/GEMINI.webp differ diff --git a/public/v3/compatibility/zodiacs/female/LEO.webp b/public/v3/compatibility/zodiacs/female/LEO.webp new file mode 100644 index 0000000..8ba00d8 Binary files /dev/null and b/public/v3/compatibility/zodiacs/female/LEO.webp differ diff --git a/public/v3/compatibility/zodiacs/female/LIBRA.webp b/public/v3/compatibility/zodiacs/female/LIBRA.webp new file mode 100644 index 0000000..7d40824 Binary files /dev/null and b/public/v3/compatibility/zodiacs/female/LIBRA.webp differ diff --git a/public/v3/compatibility/zodiacs/female/PISCES.webp b/public/v3/compatibility/zodiacs/female/PISCES.webp new file mode 100644 index 0000000..2bf3a5e Binary files /dev/null and b/public/v3/compatibility/zodiacs/female/PISCES.webp differ diff --git a/public/v3/compatibility/zodiacs/female/SAGITTARIUS.webp b/public/v3/compatibility/zodiacs/female/SAGITTARIUS.webp new file mode 100644 index 0000000..9cea2cc Binary files /dev/null and b/public/v3/compatibility/zodiacs/female/SAGITTARIUS.webp differ diff --git a/public/v3/compatibility/zodiacs/female/SCORPIO.webp b/public/v3/compatibility/zodiacs/female/SCORPIO.webp new file mode 100644 index 0000000..ca866f4 Binary files /dev/null and b/public/v3/compatibility/zodiacs/female/SCORPIO.webp differ diff --git a/public/v3/compatibility/zodiacs/female/TAURUS.webp b/public/v3/compatibility/zodiacs/female/TAURUS.webp new file mode 100644 index 0000000..7e258ea Binary files /dev/null and b/public/v3/compatibility/zodiacs/female/TAURUS.webp differ diff --git a/public/v3/compatibility/zodiacs/female/VIRGO.webp b/public/v3/compatibility/zodiacs/female/VIRGO.webp new file mode 100644 index 0000000..0978736 Binary files /dev/null and b/public/v3/compatibility/zodiacs/female/VIRGO.webp differ diff --git a/public/v3/compatibility/zodiacs/male/AQUARIUS.webp b/public/v3/compatibility/zodiacs/male/AQUARIUS.webp new file mode 100644 index 0000000..df118bc Binary files /dev/null and b/public/v3/compatibility/zodiacs/male/AQUARIUS.webp differ diff --git a/public/v3/compatibility/zodiacs/male/ARIES.webp b/public/v3/compatibility/zodiacs/male/ARIES.webp new file mode 100644 index 0000000..5754005 Binary files /dev/null and b/public/v3/compatibility/zodiacs/male/ARIES.webp differ diff --git a/public/v3/compatibility/zodiacs/male/CANCER.webp b/public/v3/compatibility/zodiacs/male/CANCER.webp new file mode 100644 index 0000000..48f11c7 Binary files /dev/null and b/public/v3/compatibility/zodiacs/male/CANCER.webp differ diff --git a/public/v3/compatibility/zodiacs/male/CAPRICORN.webp b/public/v3/compatibility/zodiacs/male/CAPRICORN.webp new file mode 100644 index 0000000..497412f Binary files /dev/null and b/public/v3/compatibility/zodiacs/male/CAPRICORN.webp differ diff --git a/public/v3/compatibility/zodiacs/male/GEMINI.webp b/public/v3/compatibility/zodiacs/male/GEMINI.webp new file mode 100644 index 0000000..4962aaa Binary files /dev/null and b/public/v3/compatibility/zodiacs/male/GEMINI.webp differ diff --git a/public/v3/compatibility/zodiacs/male/LEO.webp b/public/v3/compatibility/zodiacs/male/LEO.webp new file mode 100644 index 0000000..22aab53 Binary files /dev/null and b/public/v3/compatibility/zodiacs/male/LEO.webp differ diff --git a/public/v3/compatibility/zodiacs/male/LIBRA.webp b/public/v3/compatibility/zodiacs/male/LIBRA.webp new file mode 100644 index 0000000..7c6b842 Binary files /dev/null and b/public/v3/compatibility/zodiacs/male/LIBRA.webp differ diff --git a/public/v3/compatibility/zodiacs/male/PISCES.webp b/public/v3/compatibility/zodiacs/male/PISCES.webp new file mode 100644 index 0000000..590709a Binary files /dev/null and b/public/v3/compatibility/zodiacs/male/PISCES.webp differ diff --git a/public/v3/compatibility/zodiacs/male/SAGITTARIUS.webp b/public/v3/compatibility/zodiacs/male/SAGITTARIUS.webp new file mode 100644 index 0000000..422b5c8 Binary files /dev/null and b/public/v3/compatibility/zodiacs/male/SAGITTARIUS.webp differ diff --git a/public/v3/compatibility/zodiacs/male/SCORPIO.webp b/public/v3/compatibility/zodiacs/male/SCORPIO.webp new file mode 100644 index 0000000..32d8d5d Binary files /dev/null and b/public/v3/compatibility/zodiacs/male/SCORPIO.webp differ diff --git a/public/v3/compatibility/zodiacs/male/TAURUS.webp b/public/v3/compatibility/zodiacs/male/TAURUS.webp new file mode 100644 index 0000000..d3a76f8 Binary files /dev/null and b/public/v3/compatibility/zodiacs/male/TAURUS.webp differ diff --git a/public/v3/compatibility/zodiacs/male/VIRGO.webp b/public/v3/compatibility/zodiacs/male/VIRGO.webp new file mode 100644 index 0000000..f0d293b Binary files /dev/null and b/public/v3/compatibility/zodiacs/male/VIRGO.webp differ diff --git a/src/api/resources/Paywall.ts b/src/api/resources/Paywall.ts index ef523ef..3907309 100644 --- a/src/api/resources/Paywall.ts +++ b/src/api/resources/Paywall.ts @@ -24,6 +24,8 @@ export enum EPlacementKeys { "aura.placement.palmistry.secret.discount" = "aura.placement.palmistry.secret.discount", "aura.placement.compatibility.v2" = "aura.placement.compatibility.v2", "aura.placement.compatibility.v2.secret.discount" = "aura.placement.compatibility.v2.secret.discount", + "aura.placement.compatibility.v3" = "aura.placement.compatibility.v3", + "aura.placement.compatibility.v3.secret.discount" = "aura.placement.compatibility.v3.secret.discount", "aura.placement.payment" = "aura.placement.payment" // anonymous payment } diff --git a/src/api/resources/Session.ts b/src/api/resources/Session.ts index fdf6501..9c63001 100644 --- a/src/api/resources/Session.ts +++ b/src/api/resources/Session.ts @@ -55,6 +55,23 @@ export interface IAnswersSessionCompatibilityV2 { checking_phone: "against" | "allow" | "normally"; // Type: string, optional - "against" | "allow" | "normally"; } +export interface IAnswersSessionCompatibilityV3 { + what_aspects: 'love_relationships' | 'health_vitality' | 'career_destiny' | 'life_transitions', // Type: string, optional - 'love_relationships' | 'health_vitality' | 'career_destiny'; + relationship_status: 'single' | 'in_relationship' | 'engaged' | 'divorced' | 'complicated', // Type: string, optional - 'single' | 'in_relationship'; + element_resonates: 'water' | 'fire' | 'air' | 'earth' | 'light' | 'darkness', // Type: string, optional - 'water' | 'fire' | 'air' | 'earth'; + favorite_color: 'blue' | 'green' | 'orange' | 'violet' | 'red' | 'yellow' | 'turquoise', // Type: string, optional - 'blue' | 'green' | 'orange' | 'violet' | 'red' | 'yellow'; + head_or_heart: 'head' | 'heart' | 'both' | 'depends', // Type: string, optional - 'head' | 'heart' | 'both'; + time_alone: 1 | 2 | 3 | 4 | 5, // Type: number, optional - 1 | 2 | 3 | 4 | 5; + own_company: 1 | 2 | 3 | 4 | 5, // Type: number, optional - 1 | 2 | 3 | 4 | 5; + socializing_in_groups: 1 | 2 | 3 | 4 | 5, // Type: number, optional - 1 | 2 | 3 | 4 | 5; + loneliness_avoid: 1 | 2 | 3 | 4 | 5, // Type: number, optional - 1 | 2 | 3 | 4 | 5; + activities_independently: 1 | 2 | 3 | 4 | 5, // Type: number, optional - 1 | 2 | 3 | 4 | 5; + date_event: string; // Type: string, optional - ISO Date + partner_expectations: 1 | 2 | 3 | 4 | 5; // Type: number, optional - 1 | 2 | 3 | 4 | 5; + romantic_gestures: "love" | "neutral" | "dislike"; // Type: string, optional - "love" | "neutral" | "dislike"; + checking_phone: "against" | "allow" | "normally"; // Type: string, optional - "against" | "allow" | "normally"; +} + export interface IAnswersSessionChats { psychicReading: string; goal: string; diff --git a/src/api/resources/User.ts b/src/api/resources/User.ts index 364b431..673a620 100644 --- a/src/api/resources/User.ts +++ b/src/api/resources/User.ts @@ -140,6 +140,7 @@ export enum ESourceAuthorization { "aura.palmistry.new" = "aura.palmistry.new", "aura.chats" = "aura.chats", "aura.compatibility.v2" = "aura.compatibility.v2", + "aura.compatibility.v3" = "aura.compatibility.v3", "aura.test.payment" = "aura.test.payment" // anonymous payment } diff --git a/src/api/utils.ts b/src/api/utils.ts index 306e5dd..ec574b2 100644 --- a/src/api/utils.ts +++ b/src/api/utils.ts @@ -28,6 +28,10 @@ export function createMethod(createRequest: (payload: P) => Request) { source = ESourceAuthorization["aura.compatibility.v2"]; } + if (location.pathname.includes("/v3/compatibility")) { + source = ESourceAuthorization["aura.compatibility.v3"]; + } + const sessionId = localStorage.getItem(`${source}_sessionId`); if (sessionId?.length) { diff --git a/src/components/App/index.tsx b/src/components/App/index.tsx index eb3e664..4c5b336 100755 --- a/src/components/App/index.tsx +++ b/src/components/App/index.tsx @@ -31,6 +31,7 @@ import routes, { emailMarketingV1Prefix, compatibilityV2Prefix, anonymousPrefix, + compatibilityV3Prefix, } from "@/routes"; import BirthdayPage from "../BirthdayPage"; import BirthtimePage from "../BirthtimePage"; @@ -139,6 +140,7 @@ import MarketingLandingV1Routes from "@/routerComponents/MarketingLanding/v1"; import { useScrollToTop } from "@/hooks/useScrollToTop"; import CompatibilityV2Routes from "@/routerComponents/Compatibility/v2"; import AnonymousRoutes from "@/routerComponents/Anonymous"; +import CompatibilityV3Routes from "@/routerComponents/Compatibility/v3"; const isProduction = import.meta.env.MODE === "production"; @@ -295,6 +297,10 @@ function App(): JSX.Element { path={`${compatibilityV2Prefix}/*`} element={} /> + } + /> } /> }> - +
+ {animationData && + } +
{translate("/let-scan.title")} diff --git a/src/components/CompatibilityV2/pages/LetScan/styles.module.scss b/src/components/CompatibilityV2/pages/LetScan/styles.module.scss index 5baae3c..5660910 100644 --- a/src/components/CompatibilityV2/pages/LetScan/styles.module.scss +++ b/src/components/CompatibilityV2/pages/LetScan/styles.module.scss @@ -28,12 +28,17 @@ line-height: 125%; margin-top: 20px; - & > svg { + &>svg { display: none; } } +.lottie-animation-container { + width: 323px; + min-height: 245px; +} + .lottie-animation { aspect-ratio: 116 / 87; - max-width: 360px; + width: 323px; } \ No newline at end of file diff --git a/src/components/CompatibilityV2/pages/TryApp/index.tsx b/src/components/CompatibilityV2/pages/TryApp/index.tsx index 2ed50ca..0b43e35 100644 --- a/src/components/CompatibilityV2/pages/TryApp/index.tsx +++ b/src/components/CompatibilityV2/pages/TryApp/index.tsx @@ -34,17 +34,13 @@ function TryApp() { const [isHeaderVisible, setIsHeaderVisible] = useState(false); const downloadApp = async () => { + metricService.reachGoal(EGoals.DOWNLOAD_APP, [EMetrics.YANDEX]); await copyToClipboard(code); // TODO window.location.href = "https://apps.apple.com/us/app/aura-astrology-horoscope/id1601978549"; }; - useEffect(() => { - metricService.reachGoal(EGoals.TRIAL_PAYMENT_PAGE_VISIT, [EMetrics.YANDEX, EMetrics.KLAVIYO]); - metricService.reachGoal(EGoals.AURA_TRIAL_PAYMENT_PAGE_VISIT, [EMetrics.KLAVIYO]); - }, []); - useEffect(() => { const handleScroll = () => { if (readingReadyRef.current) { diff --git a/src/components/CompatibilityV3/components/Address/index.tsx b/src/components/CompatibilityV3/components/Address/index.tsx new file mode 100644 index 0000000..946aa70 --- /dev/null +++ b/src/components/CompatibilityV3/components/Address/index.tsx @@ -0,0 +1,12 @@ +import styles from "./styles.module.scss"; + +function Address() { + return ( +

+ 2024, Wit Apps LLC,
+ 2108 N ST STE 5446 SACRAMENTO, CA 95816, US +

+ ); +} + +export default Address; diff --git a/src/components/CompatibilityV3/components/Address/styles.module.scss b/src/components/CompatibilityV3/components/Address/styles.module.scss new file mode 100644 index 0000000..df6890f --- /dev/null +++ b/src/components/CompatibilityV3/components/Address/styles.module.scss @@ -0,0 +1,7 @@ +.address { + font-size: 16px; + color: #2c2c2c; + text-align: center; + line-height: 125%; + margin-top: 12px; +} diff --git a/src/components/CompatibilityV3/components/Answer/index.tsx b/src/components/CompatibilityV3/components/Answer/index.tsx new file mode 100644 index 0000000..2829ab5 --- /dev/null +++ b/src/components/CompatibilityV3/components/Answer/index.tsx @@ -0,0 +1,36 @@ +import { ButtonHTMLAttributes } from "react"; +import styles from "./styles.module.scss"; + +interface IAnswer { + id: string; + title: string; +} + +type TAnswerProps = { + answer: IAnswer; + isSelected?: boolean; + selectedClassName?: string; +} & ButtonHTMLAttributes; + +function Answer({ + answer, + isSelected, + className = "", + selectedClassName = styles.selected, + ...props +}: TAnswerProps) { + return ( + + ); +} + +export default Answer; diff --git a/src/components/CompatibilityV3/components/Answer/styles.module.scss b/src/components/CompatibilityV3/components/Answer/styles.module.scss new file mode 100644 index 0000000..4fdc96e --- /dev/null +++ b/src/components/CompatibilityV3/components/Answer/styles.module.scss @@ -0,0 +1,26 @@ +.container { + width: 100%; + height: 71px; + border-radius: 20px; + display: flex; + align-items: center; + justify-content: center; + margin-top: 20px; + font-size: 27px; + font-weight: normal; + background-color: #f1f1f1; + box-shadow: 2px 5px 3px #00000020; + border: none; + color: #000; + transition: background 0.4s ease-in-out, transform 0.4s ease-in-out; + line-height: 100%; + cursor: pointer; + + &.selected { + background: linear-gradient(to right, #057dd4 23%, #224e90 74%, #0c6bc3 94%), + linear-gradient(-45deg, #3a617120 9%, #21212120 72%, #21895120 96%); + background-blend-mode: color; + color: #fff; + // transform: scale(1.03); + } +} diff --git a/src/components/CompatibilityV3/components/AppNumberOne/index.tsx b/src/components/CompatibilityV3/components/AppNumberOne/index.tsx new file mode 100644 index 0000000..7657257 --- /dev/null +++ b/src/components/CompatibilityV3/components/AppNumberOne/index.tsx @@ -0,0 +1,20 @@ +import { compatibilityV3Prefix } from "@/routes"; +import styles from "./styles.module.scss"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; + +function AppNumberOne() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + return ( +
+ Reviews +

+ {translate("app_number_one.text", { + color: {translate("app_number_one.color")}, + })} +

+
+ ); +} + +export default AppNumberOne; diff --git a/src/components/CompatibilityV3/components/AppNumberOne/styles.module.scss b/src/components/CompatibilityV3/components/AppNumberOne/styles.module.scss new file mode 100644 index 0000000..4ae1e47 --- /dev/null +++ b/src/components/CompatibilityV3/components/AppNumberOne/styles.module.scss @@ -0,0 +1,18 @@ +.container { + width: 100%; + display: flex; + flex-direction: column; + align-items: center; +} + +.text { + font-size: 14px; + text-align: center; + line-height: 125%; + max-width: 305px; + + & > span { + color: #275ca7; + font-weight: 500; + } +} diff --git a/src/components/CompatibilityV3/components/Button/index.tsx b/src/components/CompatibilityV3/components/Button/index.tsx new file mode 100644 index 0000000..d16d940 --- /dev/null +++ b/src/components/CompatibilityV3/components/Button/index.tsx @@ -0,0 +1,12 @@ +import MainButton, { ButtonProps } from "@/components/MainButton"; +import styles from "./styles.module.scss"; + +function Button(props: ButtonProps) { + return ( + + {props.children} + + ); +} + +export default Button; diff --git a/src/components/CompatibilityV3/components/Button/styles.module.scss b/src/components/CompatibilityV3/components/Button/styles.module.scss new file mode 100644 index 0000000..1972f83 --- /dev/null +++ b/src/components/CompatibilityV3/components/Button/styles.module.scss @@ -0,0 +1,10 @@ +.button { + min-height: 71px; + border-radius: 8px; + font-size: 28px; + font-weight: normal; + background: linear-gradient(to right, #057dd4 23%, #224e90 74%, #0c6bc3 94%), + linear-gradient(-45deg, #3a617120 9%, #21212120 72%, #21895120 96%); + background-blend-mode: color; + box-shadow: 2px 5px 2.5px #00000025; +} diff --git a/src/components/CompatibilityV3/components/CameraModal/index.tsx b/src/components/CompatibilityV3/components/CameraModal/index.tsx new file mode 100644 index 0000000..ffd2ce5 --- /dev/null +++ b/src/components/CompatibilityV3/components/CameraModal/index.tsx @@ -0,0 +1,112 @@ +import Webcam from "react-webcam"; +import styles from "./styles.module.scss"; +import ModalOverlay, { ModalOverlayType } from "@/components/palmistry/modal-overlay/modal-overlay"; +import Modal from "@/components/palmistry/modal/modal"; +import { useRef, useState } from "react"; +// import { useDynamicSize } from "@/hooks/useDynamicSize"; + +interface CameraModalProps { + onClose: () => void; + onTakePhoto: (photo: string) => void; + onError: (error: string | DOMException) => void; + reinitializeKey?: number; // for reinitializing the camera (change the key to reinitialize the camera) + isCameraVisible?: boolean; +} + +function CameraModal({ + onClose, + onTakePhoto, + onError, + reinitializeKey = 0, + isCameraVisible = true +}: CameraModalProps) { + const [isVideoReady, setIsVideoReady] = useState(false); + // const { + // width: _width, height: _height, + // elementRef: containerRef } = useDynamicSize({}); + // const [width, height] = [720, 1280]; + // const width = _width * 2; + // const height = _height * 2; + + // const isLandscape = height <= width; + // const ratio = isLandscape ? width / height : height / width; + const cameraRef = useRef(null); + + // useEffect(() => { + // setIsVideoReady(false); + // }, [reinitializeKey]); + + const onClickOverlay = (e: React.MouseEvent) => { + if (e.target === e.currentTarget) { + onClose(); + } + }; + + const onClickTakePhoto = () => { + if (!isVideoReady) return onError("Video is not ready"); + const photo = cameraRef.current?.getScreenshot( + // { + // width, + // height, + // } + ); + if (photo) { + onTakePhoto(photo); + } + }; + + return + +
+ {/* {width} {height} */} + + + + + {isCameraVisible && setIsVideoReady(true)} + onUserMediaError={(error) => { + setIsVideoReady(false); + console.error(error); + onError(error); + }} + />} +
+
+ + ; +} + +export default CameraModal; + diff --git a/src/components/CompatibilityV3/components/CameraModal/styles.module.scss b/src/components/CompatibilityV3/components/CameraModal/styles.module.scss new file mode 100644 index 0000000..7cf7f91 --- /dev/null +++ b/src/components/CompatibilityV3/components/CameraModal/styles.module.scss @@ -0,0 +1,66 @@ +.overlay { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100dvh; + min-height: 0; + background: rgba(0, 0, 0, 0.7); + z-index: 1000; +} + +// .modal { +// width: 100vw !important; +// height: 100dvh !important; +// margin: 0 !important; +// padding: 0 !important; +// max-width: none !important; +// background: transparent !important; +// } + +.cameraContainer { + width: 100%; + height: 100dvh; + position: relative; + overflow: hidden; +} + +.camera { + width: 100%; + height: 100dvh; + object-fit: cover; +} + +.shutterButton { + position: fixed; + bottom: calc(0dvh + 22px); + left: 50%; + opacity: 0.5; + width: 70px; + height: 70px; + transform: translate(-50%, 0); + background: #fff; + border-radius: 50%; + + &::after { + content: ""; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: calc(100% + 6px); + height: calc(100% + 6px); + border-radius: 50%; + border: 3px solid rgba(129, 169, 245, 1); + } +} + +.handIcon { + position: absolute; + height: calc(100dvh - 140px); + left: 50%; + top: 20px; + transform: translate(-50%); + width: auto; + z-index: 9; +} \ No newline at end of file diff --git a/src/components/CompatibilityV3/components/EmailSubstrate/index.tsx b/src/components/CompatibilityV3/components/EmailSubstrate/index.tsx new file mode 100644 index 0000000..af2ad80 --- /dev/null +++ b/src/components/CompatibilityV3/components/EmailSubstrate/index.tsx @@ -0,0 +1,20 @@ +import { HTMLAttributes } from "react"; +import styles from "./styles.module.scss"; + +interface IEmailSubstrateProps { + email: string; +} + +function EmailSubstrate({ + email, + ...props +}: IEmailSubstrateProps & HTMLAttributes) { + return ( +
+

{email}

+
{email[0]?.toUpperCase()}
+
+ ); +} + +export default EmailSubstrate; diff --git a/src/components/CompatibilityV3/components/EmailSubstrate/styles.module.scss b/src/components/CompatibilityV3/components/EmailSubstrate/styles.module.scss new file mode 100644 index 0000000..19fca5b --- /dev/null +++ b/src/components/CompatibilityV3/components/EmailSubstrate/styles.module.scss @@ -0,0 +1,35 @@ +.container { + width: 100%; + height: 46px; + padding: 13px; + display: grid; + grid-template-columns: 1fr 36px; + align-content: center; + justify-content: flex-end; + align-items: center; + gap: 4px; + background-color: #9ab6ca; + border-radius: 8px 0 0 8px; +} + +.email { + font-size: 16px; + line-height: 125%; + color: #fff; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + text-align: right; +} + +.icon { + width: 36px; + height: 36px; + background-color: #4c596c83; + font-size: 24px; + color: #fff; + border-radius: 50%; + display: flex; + justify-content: center; + align-items: center; +} diff --git a/src/components/CompatibilityV3/components/Footer/index.tsx b/src/components/CompatibilityV3/components/Footer/index.tsx new file mode 100644 index 0000000..7bf2733 --- /dev/null +++ b/src/components/CompatibilityV3/components/Footer/index.tsx @@ -0,0 +1,29 @@ +import { compatibilityV3Prefix } from "@/routes"; +import styles from "./styles.module.scss"; +import Address from "../Address"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; + +function Footer() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + + return ( + + ); +} + +export default Footer; diff --git a/src/components/CompatibilityV3/components/Footer/styles.module.scss b/src/components/CompatibilityV3/components/Footer/styles.module.scss new file mode 100644 index 0000000..ae37d88 --- /dev/null +++ b/src/components/CompatibilityV3/components/Footer/styles.module.scss @@ -0,0 +1,41 @@ +.footer { + width: 100%; + margin: 30px 0 62px; + display: flex; + flex-direction: column; + align-items: center; + + & > hr { + width: 100%; + height: 2px; + background-color: #224e90; + border: none; + margin-bottom: 40px; + } +} + +.text { + font-size: 18px; + font-weight: 500; +} + +.links { + width: 100%; + display: flex; + flex-direction: row; + justify-content: center; + flex-wrap: wrap; + gap: 20px; + margin-top: 26px; + + & > .link { + display: flex; + flex-direction: row; + align-items: end; + gap: 5px; + font-size: 18px; + font-weight: 500; + color: #224e90; + text-decoration: none; + } +} diff --git a/src/components/CompatibilityV3/components/Guarantees/index.tsx b/src/components/CompatibilityV3/components/Guarantees/index.tsx new file mode 100644 index 0000000..dd0a418 --- /dev/null +++ b/src/components/CompatibilityV3/components/Guarantees/index.tsx @@ -0,0 +1,65 @@ +import { ELocalesPlacement } from "@/locales"; +import styles from "./styles.module.scss"; +import { useTranslations } from "@/hooks/translations"; + +function Guarantees() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + return ( +
+
+ + + + + + + + + + + + + + + + + {translate("/payment.guarantees.no_commitment")} +
+ +
+ + + + + + {translate("/payment.guarantees.30_day_money_back")} +
+
+ ); +} + +export default Guarantees; diff --git a/src/components/CompatibilityV3/components/Guarantees/styles.module.scss b/src/components/CompatibilityV3/components/Guarantees/styles.module.scss new file mode 100644 index 0000000..02c4fb8 --- /dev/null +++ b/src/components/CompatibilityV3/components/Guarantees/styles.module.scss @@ -0,0 +1,29 @@ +.guarantees { + width: 100%; + display: flex; + justify-content: space-between; + gap: 30px; + margin-top: 30px; +} + +.guarantee { + width: 100%; + display: flex; + justify-content: space-between; + gap: 8px; + max-width: 155px; + align-items: center; + & > svg { + min-width: 24px; + min-height: 24px; + max-width: 24px; + max-height: 24px; + } + + & > span { + color: #4b536a; + font-weight: 600; + font-size: 12px; + line-height: 18px; + } +} diff --git a/src/components/CompatibilityV3/components/Header/index.tsx b/src/components/CompatibilityV3/components/Header/index.tsx new file mode 100644 index 0000000..59652bb --- /dev/null +++ b/src/components/CompatibilityV3/components/Header/index.tsx @@ -0,0 +1,42 @@ +import styles from "./styles.module.css"; +// import Title from "@/components/Title"; +import { useNavigate } from "react-router-dom"; +import BackButton from "@/components/PalmistryV1/components/BackButton"; + +interface IHeaderProps { + isBackButtonVisible?: boolean; + className?: string; + classNameTitle?: string; + arrowColor?: string; + onBack?: () => void; +} + +function Header({ + className = "", + classNameTitle = "", + isBackButtonVisible = true, + arrowColor = "#353E75", + onBack, +}: IHeaderProps) { + classNameTitle + const navigate = useNavigate(); + const handleBack = onBack ? onBack : () => navigate(-1); + return ( +
+ {!isBackButtonVisible &&
} + {isBackButtonVisible && } + {/* + AURA + */} + + + + + + + +
+ ); +} + +export default Header; diff --git a/src/components/CompatibilityV3/components/Header/styles.module.css b/src/components/CompatibilityV3/components/Header/styles.module.css new file mode 100644 index 0000000..553b22f --- /dev/null +++ b/src/components/CompatibilityV3/components/Header/styles.module.css @@ -0,0 +1,15 @@ +.container { + display: grid; + width: 100%; + grid-template-columns: 23px 1fr 23px; + align-items: center; + justify-items: center; +} + +.title { + color: #2c2c2c; + font-size: 32px; + margin: 0; + line-height: 100%; +} + \ No newline at end of file diff --git a/src/components/CompatibilityV3/components/HowWork/index.tsx b/src/components/CompatibilityV3/components/HowWork/index.tsx new file mode 100644 index 0000000..4a9ba1c --- /dev/null +++ b/src/components/CompatibilityV3/components/HowWork/index.tsx @@ -0,0 +1,77 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.scss"; +import { compatibilityV3Prefix } from "@/routes"; +import { useMemo, useRef } from "react"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; + +interface IPoint { + icon: string; + title: string; + text: string; +} + +function HowWork() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + const textContainersRef = useRef([] as HTMLDivElement[]); + + const points: IPoint[] = useMemo( + () => [ + { + icon: `${compatibilityV3Prefix}/check-mark.svg`, + title: translate("/trial-payment.how_work.point1_title"), + text: translate("/trial-payment.how_work.point1_text"), + }, + { + icon: `${compatibilityV3Prefix}/check-mark.svg`, + title: translate("/trial-payment.how_work.point2_title"), + text: translate("/trial-payment.how_work.point2_text"), + }, + { + icon: `${compatibilityV3Prefix}/circle-in-ring.svg`, + title: translate("/trial-payment.how_work.point3_title"), + text: translate("/trial-payment.how_work.point3_text"), + }, + { + icon: `${compatibilityV3Prefix}/ring.svg`, + title: translate("/trial-payment.how_work.point4_title"), + text: translate("/trial-payment.how_work.point4_text"), + }, + ], + [translate] + ); + + return ( +
+ {points.map((point, index) => ( +
+
+ Check mark +
+
+
+ (textContainersRef.current[index] = el as HTMLDivElement) + } + > + + {point.title} + +

{point.text}

+
+
+ ))} + {/* */} +
+ ); +} + +export default HowWork; diff --git a/src/components/CompatibilityV3/components/HowWork/styles.module.scss b/src/components/CompatibilityV3/components/HowWork/styles.module.scss new file mode 100644 index 0000000..ec0831c --- /dev/null +++ b/src/components/CompatibilityV3/components/HowWork/styles.module.scss @@ -0,0 +1,53 @@ +.container { + width: 100vw; + max-width: 508px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 16px; + background: linear-gradient(to bottom, #4b88ff31, #ffffff30); + border-radius: 30px; + padding: 24px 28px 40px; +} + +.block { + display: flex; + flex-direction: row; + gap: 6px; + & > .left-side { + display: flex; + flex-direction: column; + align-items: center; + gap: 18px; + + & > .vertical-line { + width: 3px; + height: 60px; + background-color: #057dd4; + border-radius: 3px; + } + } + + & > .text-container { + display: flex; + flex-direction: column; + gap: 5px; + height: fit-content; + & > .title { + font-size: 24px; + line-height: 100%; + color: #057dd4; + text-align: left; + margin: 0; + font-weight: 500; + } + & > .text { + font-size: 20px; + line-height: 125%; + color: #2f2e37; + text-align: left; + margin: 0; + } + } +} diff --git a/src/components/CompatibilityV3/components/JoinedToday/index.tsx b/src/components/CompatibilityV3/components/JoinedToday/index.tsx new file mode 100644 index 0000000..fa066bd --- /dev/null +++ b/src/components/CompatibilityV3/components/JoinedToday/index.tsx @@ -0,0 +1,41 @@ +import styles from "./styles.module.scss"; +import { useEffect, useState } from "react"; +import { getRandomArbitrary } from "@/services/random-value"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; +import Infinite from "../../images/SVG/Infinite"; +import People from "../../images/SVG/People"; + +function JoinedToday() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + const [countUsers, setCountUsers] = useState(752); + + useEffect(() => { + const randomDelay = getRandomArbitrary(3000, 5000); + const countUsersTimeOut = setTimeout(() => { + setCountUsers((prevState) => prevState + 1); + }, randomDelay); + return () => clearTimeout(countUsersTimeOut); + }, [countUsers]); + + return ( +
+
+ +

+ {translate("/trial-payment.joined_today.text1")} +

+
+
+ +

+ {translate("/trial-payment.joined_today.text2", { + count: countUsers, + })} +

+
+
+ ); +} + +export default JoinedToday; diff --git a/src/components/CompatibilityV3/components/JoinedToday/styles.module.scss b/src/components/CompatibilityV3/components/JoinedToday/styles.module.scss new file mode 100644 index 0000000..f646c84 --- /dev/null +++ b/src/components/CompatibilityV3/components/JoinedToday/styles.module.scss @@ -0,0 +1,19 @@ +.container { + width: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 5px; + background-color: #c8dbff30; + border-radius: 30px; + padding: 19px 12px; + margin-top: 12px; +} + +.row { + width: 100%; + display: grid; + grid-template-columns: 41px 1fr; + gap: 10px; +} diff --git a/src/components/CompatibilityV3/components/MoneyBackGuarantee/index.tsx b/src/components/CompatibilityV3/components/MoneyBackGuarantee/index.tsx new file mode 100644 index 0000000..663f287 --- /dev/null +++ b/src/components/CompatibilityV3/components/MoneyBackGuarantee/index.tsx @@ -0,0 +1,22 @@ +import { compatibilityV3Prefix } from "@/routes"; +import styles from "./styles.module.scss"; +import Title from "@/components/Title"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; + +function MoneyBackGuarantee() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + return ( +
+ Money back + + {translate("/trial-payment.money_back_guarantee.title")} + +

+ {translate("/trial-payment.money_back_guarantee.text")} +

+
+ ); +} + +export default MoneyBackGuarantee; diff --git a/src/components/CompatibilityV3/components/MoneyBackGuarantee/styles.module.scss b/src/components/CompatibilityV3/components/MoneyBackGuarantee/styles.module.scss new file mode 100644 index 0000000..199ce3c --- /dev/null +++ b/src/components/CompatibilityV3/components/MoneyBackGuarantee/styles.module.scss @@ -0,0 +1,20 @@ +.container { + width: 100%; + display: flex; + flex-direction: column; + align-items: center; + gap: 6px; +} + +.title { + font-size: 20px; + font-weight: 600; + line-height: 125%; + color: #224e90; + margin: 0; +} + +.text { + font-size: 18px; + max-width: 288px; +} diff --git a/src/components/CompatibilityV3/components/PalmIsReady/index.tsx b/src/components/CompatibilityV3/components/PalmIsReady/index.tsx new file mode 100644 index 0000000..f714d9d --- /dev/null +++ b/src/components/CompatibilityV3/components/PalmIsReady/index.tsx @@ -0,0 +1,65 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.scss"; +import { compatibilityV3Prefix } from "@/routes"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; + +function PalmIsReady() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + + return ( +
+ + {translate("/trial-payment.palm_is_ready.title", { + color: ( + <span>{translate("/trial-payment.palm_is_ready.title_color")}</span> + ), + })} + +
+ Smile girl +

+ {translate("/trial-payment.palm_is_ready.description")} +

+

+ {translate("/trial-payment.palm_is_ready.text1", { + color: ( + + {translate("/trial-payment.palm_is_ready.text1_color")} + + ), + })} +

+

+ {translate("/trial-payment.palm_is_ready.text2")} +

+
+ Avatar + Avatar + Avatar + Avatar +
+
+
+ ); +} + +export default PalmIsReady; diff --git a/src/components/CompatibilityV3/components/PalmIsReady/styles.module.scss b/src/components/CompatibilityV3/components/PalmIsReady/styles.module.scss new file mode 100644 index 0000000..ce96598 --- /dev/null +++ b/src/components/CompatibilityV3/components/PalmIsReady/styles.module.scss @@ -0,0 +1,72 @@ +.container { + width: 100%; + height: fit-content; + background: linear-gradient(to bottom, #c8dbff 0%, #ffffff 100%); + border-radius: 30px; + padding: 35px 0 0 15px; + margin-top: 16px; + overflow: hidden; +} + +.title { + margin: 0; + font-size: 32px; + line-height: 125%; + text-align: left; + + &>span { + color: #275ca7; + } +} + +.description { + font-size: 22px; + line-height: 125%; + margin-top: 26px; + font-weight: 500; +} + +.text { + font-size: 16px; + line-height: 125%; + margin-top: 12px; + + &>span { + color: #275ca7; + font-size: 18px; + font-weight: 500; + } +} + +.choose-text { + font-size: 16px; + line-height: 125%; + margin-top: 18px; + font-weight: 500; +} + +.avatars-container { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + margin: 12px 0 0 15px; + + &>img { + margin-right: -18px; + width: 49px; + height: 49px; + } +} + +.girl-image { + float: right; + margin-top: 33px; + margin-right: 10px; + width: 144px; + shape-outside: var(--compatibilityV3-prefix-girl-image); + -webkit-shape-outside: var(--compatibilityV3-prefix-girl-image); + shape-image-threshold: 0; + -webkit-shape-image-threshold: 0; + // shape-margin: 10px; + // -webkit-shape-margin: 10px; +} \ No newline at end of file diff --git a/src/components/CompatibilityV3/components/PalmsSayAbout/PointRing.tsx b/src/components/CompatibilityV3/components/PalmsSayAbout/PointRing.tsx new file mode 100644 index 0000000..53ce3f9 --- /dev/null +++ b/src/components/CompatibilityV3/components/PalmsSayAbout/PointRing.tsx @@ -0,0 +1,46 @@ +import { getRandomArbitrary } from "@/services/random-value"; + +interface IPointRingProps { + gradientColor?: string[]; +} + +function PointRing({ + gradientColor = ["#C68829", "#95661F"], +}: IPointRingProps) { + const id = getRandomArbitrary(0, 10000); + + return ( + + + + + {gradientColor.map((color, index) => ( + + ))} + + + + ); +} + +export default PointRing; diff --git a/src/components/CompatibilityV3/components/PalmsSayAbout/index.tsx b/src/components/CompatibilityV3/components/PalmsSayAbout/index.tsx new file mode 100644 index 0000000..e60466f --- /dev/null +++ b/src/components/CompatibilityV3/components/PalmsSayAbout/index.tsx @@ -0,0 +1,242 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.scss"; +import PointRing from "./PointRing"; +import { ELocalesPlacement } from "@/locales"; +import { useTranslations } from "@/hooks/translations"; +import PhotoReady from "../PhotoReady"; +import { useSelector } from "react-redux"; +import { selectors } from "@/store"; +import { useMemo } from "react"; +import { compatibilityV3Prefix } from "@/routes"; +import { IPalmistryLine } from "@/api/resources/Palmistry"; +import { ICompatibilityV3FingerLocal } from "@/store/compatibilityV3"; +import { useMetricABFlags } from "@/services/metric/metricService"; + +function PalmsSayAbout() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + const lines = useSelector(selectors.selectCompatibilityV3Lines); + const fingers = useSelector(selectors.selectCompatibilityV3Fingers); + + const { flags } = useMetricABFlags(); + const isReal = flags?.palmOnPayment?.[0] === "real"; + + const filterByName = ( + array: Array, + name: string + ) => { + return array.filter((value: IPalmistryLine | ICompatibilityV3FingerLocal) => value.name === name); + }; + + const love = useMemo(() => { + return { + lines: filterByName(lines, "heart") as IPalmistryLine[], + fingers: filterByName(fingers, "thumb") as ICompatibilityV3FingerLocal[], + }; + }, [fingers, lines]); + + const head = useMemo(() => { + return { + lines: filterByName(lines, "head") as IPalmistryLine[], + fingers: filterByName(fingers, "index_finger") as ICompatibilityV3FingerLocal[], + }; + }, [fingers, lines]); + + const life = useMemo(() => { + return { + lines: filterByName(lines, "life") as IPalmistryLine[], + fingers: filterByName( + fingers, + "middle_finger" + ) as ICompatibilityV3FingerLocal[], + }; + }, [fingers, lines]); + + const fate = useMemo(() => { + return { + lines: filterByName(lines, "fate") as IPalmistryLine[], + fingers: filterByName(fingers, "ring_finger") as ICompatibilityV3FingerLocal[], + }; + }, [fingers, lines]); + + const pinky = useMemo(() => { + return { + lines: [], + fingers: filterByName(fingers, "pinky") as ICompatibilityV3FingerLocal[], + }; + }, [fingers]); + + return ( +
+ + {translate("/trial-payment.palms_say_about.title")} + +
+
+ {!!love.lines.length && !!love.fingers.length && isReal && ( + + )} + {(!love.lines.length || !love.fingers.length || !isReal) && ( + Hand with love line + )} +
+
+ +

+ {translate("/trial-payment.palms_say_about.point1", { + color: ( + + {translate("/trial-payment.palms_say_about.point1_color")} + + ), + })} +

+
+
+ +

+ {translate("/trial-payment.palms_say_about.point2")} +

+
+
+
+
+ {!!head.lines.length && !!head.fingers.length && isReal && ( + + )} + {(!head.lines.length || !head.fingers.length || !isReal) && ( + Hand with head line + )} +
+
+ +

+ {translate("/trial-payment.palms_say_about.point3", { + color: ( + + {translate("/trial-payment.palms_say_about.point3_color")} + + ), + })} +

+
+
+ +

+ {translate("/trial-payment.palms_say_about.point4")} +

+
+
+
+
+ {!!life.lines.length && !!life.fingers.length && isReal && ( + + )} + {(!life.lines.length || !life.fingers.length || !isReal) && ( + Hand with life line + )} +
+
+ +

+ {translate("/trial-payment.palms_say_about.point5", { + color: ( + + {translate("/trial-payment.palms_say_about.point5_color")} + + ), + })} +

+
+
+ +

+ {translate("/trial-payment.palms_say_about.point6")} +

+
+
+
+
+ {!!fate.lines.length && !!fate.fingers.length && isReal && ( + + )} + {(!fate.lines.length || !fate.fingers.length || !isReal) && ( + Hand with fate line + )} +
+
+ +

+ {translate("/trial-payment.palms_say_about.point7", { + color: ( + + {translate("/trial-payment.palms_say_about.point7_color")} + + ), + })} +

+
+
+ +

+ {translate("/trial-payment.palms_say_about.point8")} +

+
+
+
+
+ {!!pinky.fingers.length && isReal && ( + + )} + {(!pinky.fingers.length || !isReal) && ( + Hand with little finger + )} +
+
+ +

+ {translate("/trial-payment.palms_say_about.point9")} +

+
+
+
+
+
+ ); +} + +export default PalmsSayAbout; diff --git a/src/components/CompatibilityV3/components/PalmsSayAbout/styles.module.scss b/src/components/CompatibilityV3/components/PalmsSayAbout/styles.module.scss new file mode 100644 index 0000000..e012fc5 --- /dev/null +++ b/src/components/CompatibilityV3/components/PalmsSayAbout/styles.module.scss @@ -0,0 +1,65 @@ +.container { + width: 100%; + display: flex; + flex-direction: column; + align-items: center; + border-radius: 30px; + background: linear-gradient(to bottom, #5891ff31, #ffffff31); + padding: 15px 6px 27px; + margin-top: 40px; +} + +.title { + font-size: 28px; + font-weight: 600; + max-width: 274px; +} + +.row { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + gap: 12px; + margin-bottom: 12px; + + &>img[src$=".svg"] { + shape-rendering: geometricPrecision; + text-rendering: geometricPrecision; + image-rendering: smooth; + -webkit-font-smoothing: antialiased; + } + + &:nth-child(even) { + flex-direction: row-reverse; + } +} + +.points { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 10px; +} + +.point { + display: grid; + grid-template-columns: 16px 1fr; + gap: 2px; + + &>.text { + font-size: 16px; + line-height: 125%; + color: #000; + + &>span { + color: #cc8551; + font-weight: 600; + font-size: 18px; + } + } +} + +.photo-ready { + max-width: 90px; +} \ No newline at end of file diff --git a/src/components/CompatibilityV3/components/PaymentInformation/index.tsx b/src/components/CompatibilityV3/components/PaymentInformation/index.tsx new file mode 100644 index 0000000..e3bd979 --- /dev/null +++ b/src/components/CompatibilityV3/components/PaymentInformation/index.tsx @@ -0,0 +1,52 @@ +import Title from "@/components/Title"; +import Timer from "../Timer"; +import styles from "./styles.module.scss"; +import { useSelector } from "react-redux"; +import { selectors } from "@/store"; +import { getFormattedPrice } from "@/utils/price.utils"; +import { addCurrency, ELocalesPlacement } from "@/locales"; +import { compatibilityV3Prefix } from "@/routes"; +import { useTranslations } from "@/hooks/translations"; + +function PaymentInformation() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + const activeProductFromStore = useSelector(selectors.selectActiveProduct); + const fullPrice = activeProductFromStore?.price || 0; + const trialPrice = activeProductFromStore?.trialPrice || 0; + const currency = useSelector(selectors.selectCurrency); + + return ( +
+
+

{translate("/payment.payment_information.personalized_offer")}

+ +
+ + {translate("/payment.payment_information.title", { + trialDuration: activeProductFromStore?.trialDuration, + })} + +
+
+
+

{translate("/payment.payment_information.total_today")}

+
+ {addCurrency(getFormattedPrice(fullPrice), currency)} + + {addCurrency(getFormattedPrice(trialPrice), currency)} + +
+
+
+
+
+ Ticket + {translate("/payment.payment_information.code_applied", { + bold: {translate("/payment.payment_information.code_applied_bold")}, + })} +
+
+ ); +} + +export default PaymentInformation; diff --git a/src/components/CompatibilityV3/components/PaymentInformation/styles.module.scss b/src/components/CompatibilityV3/components/PaymentInformation/styles.module.scss new file mode 100644 index 0000000..2e98102 --- /dev/null +++ b/src/components/CompatibilityV3/components/PaymentInformation/styles.module.scss @@ -0,0 +1,92 @@ +.container { + width: calc(100% + 34px); + display: flex; + flex-direction: column; + align-items: center; + gap: 12px; + border-radius: 8px; + background: linear-gradient(to bottom, #c8dbff 0%, #ffffff 100%); + padding: 13px 40px 10px 15px; + margin-top: 16px; +} + +.offer-reserved { + width: 100%; + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + gap: 12px; + font-size: 15px; + color: #2c2c2c; +} + +.title { + font-style: 20px; + font-weight: 600; + line-height: 125%; + color: #000; + margin: 0; + text-align: left; + width: 100%; +} + +hr { + width: calc(100% + 39px); + height: 1px; + background-color: #224e9026; + border: none; + margin: 0; + margin-left: -7px; +} + +.total-container { + width: 100%; +} + +.total-today { + width: 100%; + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + gap: 12px; + font-size: 16px; + padding: 0; + + &>.total-today-price { + display: flex; + flex-direction: row; + align-items: center; + gap: 12px; + + &>s { + font-size: 16px; + color: #726D6D; + line-height: 125%; + margin-top: 3px; + } + + &>strong { + font-size: 24px; + font-weight: 800; + line-height: 125%; + color: #224e90; + margin: 0; + } + } +} + +.code-applied { + width: 100%; + display: flex; + flex-direction: row; + align-items: center; + gap: 6px; + font-size: 14px; + color: #1b811f; + + &>b { + font-weight: 500; + } +} \ No newline at end of file diff --git a/src/components/CompatibilityV3/components/PaymentModal/index.tsx b/src/components/CompatibilityV3/components/PaymentModal/index.tsx new file mode 100644 index 0000000..2dd9733 --- /dev/null +++ b/src/components/CompatibilityV3/components/PaymentModal/index.tsx @@ -0,0 +1,77 @@ +import { useSearchParams } from "react-router-dom"; +import styles from "./styles.module.scss"; +import { HTMLAttributes, useState } from "react"; +import { useSelector } from "react-redux"; +import { selectors } from "@/store"; +import PaymentModalNew from "@/components/PaymentModalNew"; +import { EPlacementKeys } from "@/api/resources/Paywall"; +import routes from "@/routes"; + +function PaymentModal(props: HTMLAttributes) { + const activeProductFromStore = useSelector(selectors.selectActiveProduct); + + const [searchParams] = useSearchParams(); + const subscriptionStatus = + searchParams.get("redirect_status") === "succeeded" ? "subscribed" : "lead"; + const [height, setHeight] = useState( + subscriptionStatus === "subscribed" ? 246 : 146 + ); + + const returnUrl = window.location.origin + routes.client.compatibilityV3Payment(); + + return ( + <> + {activeProductFromStore && ( +
+
+ {subscriptionStatus !== "subscribed" && ( + + )} + + {subscriptionStatus === "subscribed" && ( +
+ + + + +
Payment success
+
+ )} +
+
+ )} + + ); +} + +export default PaymentModal; diff --git a/src/components/CompatibilityV3/components/PaymentModal/styles.module.scss b/src/components/CompatibilityV3/components/PaymentModal/styles.module.scss new file mode 100644 index 0000000..2134380 --- /dev/null +++ b/src/components/CompatibilityV3/components/PaymentModal/styles.module.scss @@ -0,0 +1,66 @@ +.container { + height: 100%; +} + +.widget { + position: fixed; + background: #fff; + bottom: 0; + box-shadow: 0 -2px 16px rgba(18, 22, 32, 0.1); + width: 100%; + padding: 12px 20px; + text-align: center; + text-align: -webkit-center; + transition: 0.5s height; + max-width: 560px; + // margin-left: -66px; + // left: 50%; + // transform: translate(-50%, 0); + left: 0; + right: 0; + margin: 0 auto; +} + +.widget_success { + height: 400px; +} + +.success { + width: 100%; + height: 100%; + background: #fff; + z-index: 99; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 30px; + padding: 40px; + + & > .icon { + width: 100px; + height: 100px; + max-width: 50%; + flex-shrink: 0; + } + + & > .text { + font-size: 24px; + line-height: 32px; + text-align: center; + color: #121620; + } +} + +@media screen and (max-width: 560px) { + .widget { + width: 100%; + padding: 12px 20px; + text-align: center; + text-align: -webkit-center; + transition: height 1s linear; + max-width: 560px; + margin-left: 0; + left: 0; + } +} diff --git a/src/components/CompatibilityV3/components/PaymentModalV1/PaymentForm/index.tsx b/src/components/CompatibilityV3/components/PaymentModalV1/PaymentForm/index.tsx new file mode 100644 index 0000000..ab6762c --- /dev/null +++ b/src/components/CompatibilityV3/components/PaymentModalV1/PaymentForm/index.tsx @@ -0,0 +1,174 @@ +import { useTranslations } from '@/hooks/translations'; +import { addCurrency, ELocalesPlacement } from '@/locales'; +import styles from "./styles.module.scss"; +import { LegacyRef, useRef, useState } from 'react'; +import { useSelector } from 'react-redux'; +import { selectors } from '@/store'; +import { EPlacementKeys, IPaywallProduct } from '@/api/resources/Paywall'; +import cn from "classnames"; +import { getFormattedPrice } from '@/utils/price.utils'; +import SecurityPayments from '@/components/pages/TrialPayment/components/SecurityPayments'; +import Title from '@/components/Title'; +import { useNavigate } from 'react-router-dom'; +import routes from '@/routes'; +import CreditCardIcon from '@/components/PaymentModalNew/PaymentCardModal/CreditCardIcon'; +import NMIPaymentForm from '@/components/Payment/nmi/PaymentForm'; +import PaymentModal from '@/components/Payment/PaymentModal'; + +const placementKey = EPlacementKeys['aura.placement.compatibility.v3']; + +interface IPaymentFormProps { + activeProduct: IPaywallProduct; +} + +function PaymentForm({ + activeProduct, +}: IPaymentFormProps) { + const navigate = useNavigate(); + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + const ref = useRef(); + const currency = useSelector(selectors.selectCurrency); + const [isPaymentSuccess, setIsPaymentSuccess] = useState(false); + const [isPaymentError, setIsPaymentError] = useState(false); + const [isPaymentModalOpen, setIsPaymentModalOpen] = useState(false); + + + // const { + // error, + // isPaymentSuccess, + // } = usePayment({ + // placementKey, + // activeProduct, + // paymentFormType: "lightbox" + // }); + + // useEffect(() => { + // if (error) { + // onPaymentError(); + // } + // }, [error]) + + // useEffect(() => { + // if (isPaymentSuccess) { + // onPaymentSuccess(); + // } + // }, [isPaymentSuccess]) + + const onPaymentError = (error?: string) => { + setIsPaymentError(true); + if (error === "Product not found") { + navigate(routes.client.compatibilityV3TrialChoice()); + } + } + + const onPaymentSuccess = () => { + setIsPaymentSuccess(true); + // metricService.reachGoal(EGoals.PAYMENT_SUCCESS); + // if (activeProduct) { + // metricService.reachGoal(EGoals.PURCHASE, [EMetrics.FACEBOOK], { + // currency: "USD", + // value: ((activeProduct.trialPrice || 100) / 100).toFixed(2), + // }); + // } + setTimeout(() => { + navigate(routes.client.compatibilityV3SkipTrial()); + }, 1500); + } + + const onModalClosed = () => { + setIsPaymentModalOpen(false); + navigate(routes.client.compatibilityV3SaveOff()); + } + + if (isPaymentError) { + return ( +
} + className={styles["payment-modal"]} + > + + Something went wrong + +
+ ); + } + + if (isPaymentSuccess) { + return ( +
} + className={styles["payment-modal"]} + > +
+ + + + +
Payment success
+
+
+ ); + } + + return ( +
} + className={cn( + styles.paymentModalContainer + )} + > + + + + + +
+ {translate( + "/payment.total_due", + { + trialPrice: addCurrency( + getFormattedPrice(activeProduct.trialPrice || 0), + currency + ), + }, + ELocalesPlacement.CompatibilityV3 + )} +
+
setIsPaymentModalOpen(true)} + // onClick={() => showCreditCardForm()} + > + +
Credit / Debit Card
+
+ {/* + */} +
+ +

+ {translate( + "payment_modal.address", + undefined, + ELocalesPlacement.V1 + )} +

+
+
+ ); +} + +export default PaymentForm \ No newline at end of file diff --git a/src/components/CompatibilityV3/components/PaymentModalV1/PaymentForm/styles.module.scss b/src/components/CompatibilityV3/components/PaymentModalV1/PaymentForm/styles.module.scss new file mode 100644 index 0000000..7967d39 --- /dev/null +++ b/src/components/CompatibilityV3/components/PaymentModalV1/PaymentForm/styles.module.scss @@ -0,0 +1,94 @@ +.paymentModalContainer { + display: flex; + flex-direction: column; + position: relative; + margin: -12px -20px; + padding: 12px 20px; + gap: 6px; + + transition: height 1s ease-out; + + .address { + color: gray; + font-size: 10px; + margin-bottom: 16px; + text-transform: uppercase; + } + + .infoContainer>* { + padding-top: 16px; + } + + .paymentCreditCard { + background: #066fde; + color: #fff !important; + gap: 6px; + display: flex; + font-size: 14px; + line-height: 18px; + align-items: center; + font-weight: 400; + min-height: 48px; + border-radius: 5px; + justify-content: center; + cursor: pointer; + } + + &Loading { + background: rgba(215, 213, 213, .5); + } + + .paymentModalLoader { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 25px; + color: #2f2e37; + position: absolute; + width: 100%; + margin-left: -20px; + } + + .paymentModalPrice { + color: #066fde; + font-size: 16px; + font-weight: 700; + line-height: 25px; + text-align: center; + margin-bottom: 12px; + } +} + + +.success { + width: 100%; + height: 100%; + background: #fff; + z-index: 99; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 30px; + padding: 40px; + + &>.icon { + width: 100px; + height: 100px; + max-width: 50%; + flex-shrink: 0; + } + + &>.text { + font-size: 24px; + line-height: 32px; + text-align: center; + color: #121620; + } +} + +.modal-content { + overflow-x: hidden; + +} \ No newline at end of file diff --git a/src/components/CompatibilityV3/components/PaymentModalV1/index.tsx b/src/components/CompatibilityV3/components/PaymentModalV1/index.tsx new file mode 100644 index 0000000..1e07d48 --- /dev/null +++ b/src/components/CompatibilityV3/components/PaymentModalV1/index.tsx @@ -0,0 +1,32 @@ +import { selectors } from '@/store'; +import { HTMLAttributes } from 'react'; +import { useSelector } from 'react-redux'; +import styles from "./styles.module.scss"; +import PaymentForm from './PaymentForm'; + +function PaymentModalV1(props: HTMLAttributes) { + const activeProductFromStore = useSelector(selectors.selectActiveProduct); + + return ( + <> + { + activeProductFromStore && ( +
+
+ +
+
+ ) + } + + ); +} + +export default PaymentModalV1; \ No newline at end of file diff --git a/src/components/CompatibilityV3/components/PaymentModalV1/styles.module.scss b/src/components/CompatibilityV3/components/PaymentModalV1/styles.module.scss new file mode 100644 index 0000000..2134380 --- /dev/null +++ b/src/components/CompatibilityV3/components/PaymentModalV1/styles.module.scss @@ -0,0 +1,66 @@ +.container { + height: 100%; +} + +.widget { + position: fixed; + background: #fff; + bottom: 0; + box-shadow: 0 -2px 16px rgba(18, 22, 32, 0.1); + width: 100%; + padding: 12px 20px; + text-align: center; + text-align: -webkit-center; + transition: 0.5s height; + max-width: 560px; + // margin-left: -66px; + // left: 50%; + // transform: translate(-50%, 0); + left: 0; + right: 0; + margin: 0 auto; +} + +.widget_success { + height: 400px; +} + +.success { + width: 100%; + height: 100%; + background: #fff; + z-index: 99; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 30px; + padding: 40px; + + & > .icon { + width: 100px; + height: 100px; + max-width: 50%; + flex-shrink: 0; + } + + & > .text { + font-size: 24px; + line-height: 32px; + text-align: center; + color: #121620; + } +} + +@media screen and (max-width: 560px) { + .widget { + width: 100%; + padding: 12px 20px; + text-align: center; + text-align: -webkit-center; + transition: height 1s linear; + max-width: 560px; + margin-left: 0; + left: 0; + } +} diff --git a/src/components/CompatibilityV3/components/PhotoReady/index.tsx b/src/components/CompatibilityV3/components/PhotoReady/index.tsx new file mode 100644 index 0000000..92e70c9 --- /dev/null +++ b/src/components/CompatibilityV3/components/PhotoReady/index.tsx @@ -0,0 +1,105 @@ +import { useCallback, useEffect, useRef, useState } from "react"; +import styles from "./styles.module.scss"; +import { useSelector } from "react-redux"; +import { selectors } from "@/store"; +import { IPalmistryLine, IPalmistryPoint } from "@/api/resources/Palmistry"; +import { ICompatibilityV3FingerLocal } from "@/store/compatibilityV3"; + +interface IPhotoReadyProps { + className?: string; + lines: IPalmistryLine[]; + fingers: ICompatibilityV3FingerLocal[]; +} + +function PhotoReady({ className = "", lines, fingers }: IPhotoReadyProps) { + const photo = useSelector(selectors.selectCompatibilityV3Photo); + + const imageRef = useRef(null); + const [isImageLoaded, setIsImageLoaded] = useState(false); + const [imageWidth, setImageWidth] = useState(0); + const [imageHeight, setImageHeight] = useState(0); + const linesRef = useRef([]); + + useEffect(() => { + if (isImageLoaded && imageRef.current) { + setImageWidth(imageRef.current.width || 0); + setImageHeight(imageRef.current.height || 0); + } + }, [isImageLoaded]); + + const getCoordinatesString = useCallback( + (points: IPalmistryPoint[]) => { + const coordinatesString = `M ${points[0]?.x * imageWidth} ${ + points[0]?.y * imageHeight + }`; + return points.reduce( + (acc, point) => + `${acc} L ${point?.x * imageWidth} ${point?.y * imageHeight}`, + coordinatesString + ); + }, + // eslint-disable-next-line react-hooks/exhaustive-deps + [lines, isImageLoaded, imageWidth, imageHeight] + ); + + return ( +
+ PalmIcon setIsImageLoaded(true)} + /> + {!!imageHeight && !!imageWidth && ( + + {!!fingers.length && + fingers?.map((finger, index) => { + return ( + + {/* */} + + + ); + })} + + <> + {lines.map((line, index) => ( + (linesRef.current[index] = el as SVGPathElement)} + /> + ))} + + + )} +
+ ); +} + +export default PhotoReady; diff --git a/src/components/CompatibilityV3/components/PhotoReady/styles.module.scss b/src/components/CompatibilityV3/components/PhotoReady/styles.module.scss new file mode 100644 index 0000000..9f5ba6b --- /dev/null +++ b/src/components/CompatibilityV3/components/PhotoReady/styles.module.scss @@ -0,0 +1,43 @@ +.container { + position: relative; +} + +.svg-objects { + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.line { + stroke-linecap: round; + stroke-linejoin: round; + stroke-width: 2px; + fill-rule: evenodd; + clip-rule: evenodd; + stroke-miterlimit: 1.5; + stroke-dasharray: 500; + stroke: #fff; + fill: none; + stroke-dashoffset: 0; +} + +.line-heart { + stroke: #f8d90f; + /* animation-delay: 4.5s; */ +} + +.line-life { + stroke: #e51c39; +} + +.line-head { + stroke: #00d114; + /* animation-delay: 1.5s; */ +} + +.line-fate { + stroke: #05ced8; + /* animation-delay: 3s; */ +} diff --git a/src/components/CompatibilityV3/components/Review/index.tsx b/src/components/CompatibilityV3/components/Review/index.tsx new file mode 100644 index 0000000..29540a6 --- /dev/null +++ b/src/components/CompatibilityV3/components/Review/index.tsx @@ -0,0 +1,42 @@ +import { compatibilityV3Prefix } from "@/routes"; +import styles from "./styles.module.scss"; + +export interface IReviewProps { + username: string; + tagline?: string; + stars?: number; + date?: string; + avatar: string; + text: string; +} + +function Review({ username, tagline, stars = 5, date, avatar, text }: IReviewProps) { + return ( +
+
+ Avatar +
+

{username}

+
+ {Array.from({ length: stars }).map((_, index) => ( + star + ))} +
+
+ {date &&

{date}

} +
+ {tagline &&

{tagline}

} +

{text}

+
+ ); +} + +export default Review; diff --git a/src/components/CompatibilityV3/components/Review/styles.module.scss b/src/components/CompatibilityV3/components/Review/styles.module.scss new file mode 100644 index 0000000..504f3bd --- /dev/null +++ b/src/components/CompatibilityV3/components/Review/styles.module.scss @@ -0,0 +1,50 @@ +.container { + width: 100%; + border-radius: 30px; + background: linear-gradient(to bottom, #4b88ff31 0%, #ffffff30 100%); + padding: 18px 12px 12px; +} + +.header { + position: relative; + margin-left: 8px; + display: flex; + flex-direction: row; + align-items: center; + gap: 6px; + + &>.info { + display: flex; + flex-direction: column; + align-items: start; + gap: 2px; + + &>.stars { + display: flex; + flex-direction: row; + align-items: center; + gap: 1px; + } + } + + &>.date { + position: absolute; + right: 0; + font-family: SF Pro Text; + font-weight: 500; + font-size: 16px; + line-height: 20px; + text-align: right; + color: rgba(0, 0, 0, 0.45); + } +} + +.tagline { + color: #224e90; + line-height: 125%; +} + +.text { + margin-top: 16px; + line-height: 125%; +} \ No newline at end of file diff --git a/src/components/CompatibilityV3/components/Reviews/index.tsx b/src/components/CompatibilityV3/components/Reviews/index.tsx new file mode 100644 index 0000000..f95d042 --- /dev/null +++ b/src/components/CompatibilityV3/components/Reviews/index.tsx @@ -0,0 +1,46 @@ +import { compatibilityV3Prefix } from "@/routes"; +import Review, { IReviewProps } from "../Review"; +import styles from "./styles.module.scss"; +import { useMemo } from "react"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; + +function Reviews() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + const reviews: IReviewProps[] = useMemo( + () => [ + { + avatar: `${compatibilityV3Prefix}/reviews/rebecca.png`, + username: translate("/trial-payment.reviews.username1"), + // tagline: translate("/trial-payment.reviews.tagline1"), + text: translate("/trial-payment.reviews.text1"), + date: translate("/trial-payment.reviews.date1") + }, + { + avatar: `${compatibilityV3Prefix}/reviews/mika.png`, + username: translate("/trial-payment.reviews.username2"), + // tagline: translate("/trial-payment.reviews.tagline2"), + text: translate("/trial-payment.reviews.text2"), + date: translate("/trial-payment.reviews.date2") + }, + // { + // avatar: `${compatibilityV3Prefix}/reviews/amanda.png`, + // username: translate("/trial-payment.reviews.username3"), + // // tagline: translate("/trial-payment.reviews.tagline3"), + // text: translate("/trial-payment.reviews.text3"), + // date: translate("/trial-payment.reviews.date3") + // }, + ], + [translate] + ); + + return ( +
+ {reviews.map((review, index) => ( + + ))} +
+ ); +} + +export default Reviews; diff --git a/src/components/CompatibilityV3/components/Reviews/styles.module.scss b/src/components/CompatibilityV3/components/Reviews/styles.module.scss new file mode 100644 index 0000000..5574b33 --- /dev/null +++ b/src/components/CompatibilityV3/components/Reviews/styles.module.scss @@ -0,0 +1,6 @@ +.container { + display: flex; + flex-direction: column; + align-items: center; + gap: 10px; +} diff --git a/src/components/CompatibilityV3/components/SecretDiscountTable/index.tsx b/src/components/CompatibilityV3/components/SecretDiscountTable/index.tsx new file mode 100644 index 0000000..56ef95e --- /dev/null +++ b/src/components/CompatibilityV3/components/SecretDiscountTable/index.tsx @@ -0,0 +1,68 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.scss"; +import { images } from "../../data"; +import { usePaywall } from "@/hooks/paywall/usePaywall"; +import { addCurrency, ELocalesPlacement } from "@/locales"; +import { EPlacementKeys } from "@/api/resources/Paywall"; +import { Currency } from "@/components/PaymentTable"; +import { useTranslations } from "@/hooks/translations"; + +const placementKey = EPlacementKeys["aura.placement.compatibility.v3.secret.discount"] + +const getPrice = (price: number, currency: Currency) => { + if (price % 100 === 0) { + return addCurrency(price / 100, currency); + } + return addCurrency( + (price / 100).toFixed(2), + currency + ); +} + +function SecretDiscountTable() { + const { products, currency, getText } = usePaywall({ + placementKey, + localesPlacement: ELocalesPlacement.EmailMarketingPalmistryV2, + }); + const { translate } = useTranslations(ELocalesPlacement.EmailMarketingPalmistryV2); + + // const activeProduct = products.find(product => product?.trialPrice === activeProductFromStore?.trialPrice) || products[0] + const activeProduct = products[0] + // const price = activeProduct?.price || 0; + const trialPrice = activeProduct?.trialPrice || 0; + const trialDuration = activeProduct?.trialDuration || 7; + + return ( +
+ + {translate("secret-discount.secret-discount-table_title")} + +

+ {translate("secret-discount.secret-discount-table_subtitle")} +

+
+ Gift + + {translate("secret-discount.secret-discount-table_discount-applied")} + + {getText("old.discount")} + {getText("new.discount")} +
+
+

{translate("secret-discount.secret-discount-table_cost-after-trial", { days: trialDuration })}

+ {addCurrency(Number(getText("old.price")), currency)} + {getPrice(trialPrice, currency)} +
+
+

{translate("secret-discount.secret-discount-table_you-save", { amount: addCurrency(Number(getText("save")), currency) })}

+
+
+
+

{translate("secret-discount.secret-discount-table_total-today")}

+ {getPrice(trialPrice, currency)} +
+
+ ) +} + +export default SecretDiscountTable \ No newline at end of file diff --git a/src/components/CompatibilityV3/components/SecretDiscountTable/styles.module.scss b/src/components/CompatibilityV3/components/SecretDiscountTable/styles.module.scss new file mode 100644 index 0000000..f8b1ced --- /dev/null +++ b/src/components/CompatibilityV3/components/SecretDiscountTable/styles.module.scss @@ -0,0 +1,110 @@ +.container { + background-color: #fff; + border-radius: 13px; + width: calc(100% + 24px); + padding: 16px 0 22px; + box-shadow: 2px 11px 17px -1px rgba(0, 0, 0, 0.13); + margin-top: 42px; + color: #363636; +} + +.title { + font-size: 20px; + font-weight: 600; + line-height: 24px; + margin-bottom: 0; +} + +.subtitle { + font-size: 13px; + font-weight: 400; + line-height: 16px; + margin-top: 5px; + text-align: center; +} + +.applied { + width: 100%; + background-color: #293D68; + padding: 7px 10px; + margin-top: 12px; + display: flex; + align-items: center; + justify-content: start; + gap: 10px; + color: #fff; + + &>img { + width: 17px; + } + + &>.title { + font-size: 15px; + font-weight: 500; + line-height: 19px; + } + + &>.old-discount { + font-size: 15px; + color: #B2B2B2; + text-decoration: line-through; + margin-left: 4px; + } + + &>.new-discount { + color: #fff; + font-size: 20px; + font-weight: 600; + line-height: 19px; + margin-left: 4px; + } +} + +.grid-line { + display: grid; + grid-template-columns: 1fr 22px 22px; + align-items: center; + gap: 28px; + margin-top: 8px; + padding: 0 24px 0 10px; + + &>p { + font-size: 12px; + font-weight: 400; + line-height: 130%; + margin-bottom: 0; + } + + &.days-14>span { + font-size: 12px; + font-weight: 400; + line-height: 130%; + + &.old-price { + text-decoration: line-through; + } + } + + &.save { + margin-top: 2px; + } + + &.total-today { + + &>p, + span { + font-size: 16px; + font-weight: 800; + line-height: 130%; + margin-top: 8px; + } + } +} + +hr { + display: block; + width: 100%; + margin: 0; + background-color: #363636; + margin-top: 6px; +} \ No newline at end of file diff --git a/src/components/CompatibilityV3/components/Stars/index.tsx b/src/components/CompatibilityV3/components/Stars/index.tsx new file mode 100644 index 0000000..3e40d10 --- /dev/null +++ b/src/components/CompatibilityV3/components/Stars/index.tsx @@ -0,0 +1,18 @@ +import StarSVG from "../../images/SVG/Star"; +import styles from "./styles.module.scss"; + +interface IStarsProps { + stars?: number; +} + +function Stars({ stars = 5 }: IStarsProps) { + return ( +
+ {Array.from({ length: stars }).map((_, index) => ( + + ))} +
+ ); +} + +export default Stars; diff --git a/src/components/CompatibilityV3/components/Stars/styles.module.scss b/src/components/CompatibilityV3/components/Stars/styles.module.scss new file mode 100644 index 0000000..795cd11 --- /dev/null +++ b/src/components/CompatibilityV3/components/Stars/styles.module.scss @@ -0,0 +1,6 @@ +.container { + display: flex; + flex-direction: row; + gap: 1px; + width: fit-content; +} diff --git a/src/components/CompatibilityV3/components/StepperBar/index.tsx b/src/components/CompatibilityV3/components/StepperBar/index.tsx new file mode 100644 index 0000000..15c26c6 --- /dev/null +++ b/src/components/CompatibilityV3/components/StepperBar/index.tsx @@ -0,0 +1,35 @@ +import styles from "./styles.module.scss"; +import { useDynamicSize } from "@/hooks/useDynamicSize"; +import CircleArrow from "@/components/pages/ABDesign/v1/ui/CircleArrow"; + +interface IStepperBarProps { + length: number; + currentStep: number; + color?: string; + className?: string; +} + +function StepperBar({ + length, + currentStep, + color = "#7337A8", + className = "", +}: IStepperBarProps) { + const { width, elementRef } = useDynamicSize({}); + + return ( +
+ +
+ ); +} + +export default StepperBar; diff --git a/src/components/CompatibilityV3/components/StepperBar/styles.module.scss b/src/components/CompatibilityV3/components/StepperBar/styles.module.scss new file mode 100644 index 0000000..97d7ee8 --- /dev/null +++ b/src/components/CompatibilityV3/components/StepperBar/styles.module.scss @@ -0,0 +1,38 @@ +.container { + width: 100%; + display: grid; + gap: 15px; +} + +.step-container { + display: flex; + flex-direction: row; + align-items: center; + justify-content: center; + gap: 0; + width: 100%; +} + +.circle { + width: 16px; + height: 16px; + border-radius: 50%; + border-width: 1px; + border-style: solid; + display: flex; + align-items: center; + justify-content: center; + font-size: 8px; +} + +.line-container { + height: 6px; + width: 100%; + background-color: #d2d1f9; +} + +.line { + height: 100%; + /* width: 0; */ + transition: width 0.4s linear 0s; +} diff --git a/src/components/CompatibilityV3/components/Timer/index.tsx b/src/components/CompatibilityV3/components/Timer/index.tsx new file mode 100644 index 0000000..f2fc96c --- /dev/null +++ b/src/components/CompatibilityV3/components/Timer/index.tsx @@ -0,0 +1,15 @@ +import useTimer from "@/hooks/palmistry/use-timer"; +import styles from "./styles.module.scss"; + +function Timer() { + const time = useTimer(); + const [minutes, seconds] = time.split(":"); + return ( +
+
{minutes}
: +
{seconds}
+
+ ); +} + +export default Timer; diff --git a/src/components/CompatibilityV3/components/Timer/styles.module.scss b/src/components/CompatibilityV3/components/Timer/styles.module.scss new file mode 100644 index 0000000..9114fcb --- /dev/null +++ b/src/components/CompatibilityV3/components/Timer/styles.module.scss @@ -0,0 +1,16 @@ +.container { + display: flex; + flex-direction: row; + align-items: center; + gap: 12px; +} + +.minutes, +.seconds { + font-size: 20px; + color: #000; + font-weight: 500; + background-color: #fff; + border-radius: 4px; + padding: 8px 4px; +} diff --git a/src/components/CompatibilityV3/components/WhatIncluded/index.tsx b/src/components/CompatibilityV3/components/WhatIncluded/index.tsx new file mode 100644 index 0000000..2126498 --- /dev/null +++ b/src/components/CompatibilityV3/components/WhatIncluded/index.tsx @@ -0,0 +1,60 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.scss"; +import { compatibilityV3Prefix } from "@/routes"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; + +function WhatIncluded() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + return ( +
+ + {translate("/trial-payment.what_included.title")} + +
+ Hand +

+ {translate("/trial-payment.what_included.point1", { + bold: ( + {translate("/trial-payment.what_included.point1_bold")} + ), + })} +

+
+
+ 1 : 1 +

+ {translate("/trial-payment.what_included.point2", { + bold: ( + {translate("/trial-payment.what_included.point2_bold")} + ), + })} +

+
+
+ Daily +

+ {translate("/trial-payment.what_included.point3", { + bold: ( + {translate("/trial-payment.what_included.point3_bold")} + ), + })} +

+
+
+ Cosmic +

+ {translate("/trial-payment.what_included.point4")} +

+
+
+ Calendar +

+ {translate("/trial-payment.what_included.point5")} +

+
+
+ ); +} + +export default WhatIncluded; diff --git a/src/components/CompatibilityV3/components/WhatIncluded/styles.module.scss b/src/components/CompatibilityV3/components/WhatIncluded/styles.module.scss new file mode 100644 index 0000000..bc5f4d9 --- /dev/null +++ b/src/components/CompatibilityV3/components/WhatIncluded/styles.module.scss @@ -0,0 +1,32 @@ +.container { + width: 100%; + display: flex; + flex-direction: column; + align-items: center; + border-radius: 30px; + background: linear-gradient(to bottom, #5891ff31, #ffffff31); + padding: 18px 29px 35px; + margin-top: 31px; +} + +.title { + font-size: 28px; + color: #222222; +} + +.row { + width: 100%; + display: grid; + grid-template-columns: 42px 1fr; + align-items: center; + gap: 12px; + margin-bottom: 12px; + + & > .text { + font-size: 16px; + + & > b { + font-size: 18px; + } + } +} diff --git a/src/components/CompatibilityV3/data/index.tsx b/src/components/CompatibilityV3/data/index.tsx new file mode 100644 index 0000000..3b72b9a --- /dev/null +++ b/src/components/CompatibilityV3/data/index.tsx @@ -0,0 +1,2 @@ +export const answerTimeOut = 600; +export const images = (path: string) => (`/v3/compatibility/${path}`) diff --git a/src/components/CompatibilityV3/images/SVG/Air/index.tsx b/src/components/CompatibilityV3/images/SVG/Air/index.tsx new file mode 100644 index 0000000..1326401 --- /dev/null +++ b/src/components/CompatibilityV3/images/SVG/Air/index.tsx @@ -0,0 +1,75 @@ +function AirSVG() { + return ( + + + + + + + + + + + + + + + + ); +} + +export default AirSVG; diff --git a/src/components/CompatibilityV3/images/SVG/Blob/index.tsx b/src/components/CompatibilityV3/images/SVG/Blob/index.tsx new file mode 100644 index 0000000..6273fff --- /dev/null +++ b/src/components/CompatibilityV3/images/SVG/Blob/index.tsx @@ -0,0 +1,18 @@ +import { SVGProps } from "react" + +function Blob(props: SVGProps) { + return ( + + + + + + + + + + + ) +} + +export default Blob \ No newline at end of file diff --git a/src/components/CompatibilityV3/images/SVG/Blob2/index.tsx b/src/components/CompatibilityV3/images/SVG/Blob2/index.tsx new file mode 100644 index 0000000..6403d80 --- /dev/null +++ b/src/components/CompatibilityV3/images/SVG/Blob2/index.tsx @@ -0,0 +1,17 @@ +import { SVGProps } from "react" + +function Blob2(props: SVGProps) { + return ( + + + + + + + + + + ) +} + +export default Blob2 \ No newline at end of file diff --git a/src/components/CompatibilityV3/images/SVG/Blob3/index.tsx b/src/components/CompatibilityV3/images/SVG/Blob3/index.tsx new file mode 100644 index 0000000..dd7c6ca --- /dev/null +++ b/src/components/CompatibilityV3/images/SVG/Blob3/index.tsx @@ -0,0 +1,18 @@ +import { SVGProps } from "react" + +function Blob3(props: SVGProps) { + return ( + + + + + + + + + + + ) +} + +export default Blob3 \ No newline at end of file diff --git a/src/components/CompatibilityV3/images/SVG/Blob4/index.tsx b/src/components/CompatibilityV3/images/SVG/Blob4/index.tsx new file mode 100644 index 0000000..6001c5c --- /dev/null +++ b/src/components/CompatibilityV3/images/SVG/Blob4/index.tsx @@ -0,0 +1,21 @@ +import { SVGProps } from "react" + +function Blob4(props: SVGProps) { + const width = props.width ? Number(props.width) : 419; + const height = props.height ? Number(props.height) : 193; + return ( + + + + + + + + + + + + ) +} + +export default Blob4 \ No newline at end of file diff --git a/src/components/CompatibilityV3/images/SVG/Darkness/index.tsx b/src/components/CompatibilityV3/images/SVG/Darkness/index.tsx new file mode 100644 index 0000000..3cf37ce --- /dev/null +++ b/src/components/CompatibilityV3/images/SVG/Darkness/index.tsx @@ -0,0 +1,17 @@ +function DarknessSVG() { + return ( + + + + + + + + + + + + ); +} + +export default DarknessSVG; diff --git a/src/components/CompatibilityV3/images/SVG/Earth/index.tsx b/src/components/CompatibilityV3/images/SVG/Earth/index.tsx new file mode 100644 index 0000000..566be07 --- /dev/null +++ b/src/components/CompatibilityV3/images/SVG/Earth/index.tsx @@ -0,0 +1,40 @@ +function EarthSVG() { + return ( + + + + + + + + ); +} + +export default EarthSVG; diff --git a/src/components/CompatibilityV3/images/SVG/Fire/index.tsx b/src/components/CompatibilityV3/images/SVG/Fire/index.tsx new file mode 100644 index 0000000..be7c78c --- /dev/null +++ b/src/components/CompatibilityV3/images/SVG/Fire/index.tsx @@ -0,0 +1,18 @@ +function FireSVG() { + return ( + + + + ); +} + +export default FireSVG; diff --git a/src/components/CompatibilityV3/images/SVG/Infinite/index.tsx b/src/components/CompatibilityV3/images/SVG/Infinite/index.tsx new file mode 100644 index 0000000..4c99185 --- /dev/null +++ b/src/components/CompatibilityV3/images/SVG/Infinite/index.tsx @@ -0,0 +1,22 @@ +function Infinite() { + return ( + + + + + + + ); +} + +export default Infinite; diff --git a/src/components/CompatibilityV3/images/SVG/Light/index.tsx b/src/components/CompatibilityV3/images/SVG/Light/index.tsx new file mode 100644 index 0000000..3958a9b --- /dev/null +++ b/src/components/CompatibilityV3/images/SVG/Light/index.tsx @@ -0,0 +1,15 @@ +function LightSVG() { + return ( + + + + + + + + + + ); +} + +export default LightSVG; diff --git a/src/components/CompatibilityV3/images/SVG/People/index.tsx b/src/components/CompatibilityV3/images/SVG/People/index.tsx new file mode 100644 index 0000000..779d48f --- /dev/null +++ b/src/components/CompatibilityV3/images/SVG/People/index.tsx @@ -0,0 +1,21 @@ +import { SVGProps } from "react"; + +function People(props: SVGProps) { + return ( + + + + ); +} + +export default People; diff --git a/src/components/CompatibilityV3/images/SVG/ScanInstruction/index.tsx b/src/components/CompatibilityV3/images/SVG/ScanInstruction/index.tsx new file mode 100644 index 0000000..b435c49 --- /dev/null +++ b/src/components/CompatibilityV3/images/SVG/ScanInstruction/index.tsx @@ -0,0 +1,72 @@ +function ScanInstructionSVG() { + return ( + + + + + + + + + + + + + + + + ); +} + +export default ScanInstructionSVG; diff --git a/src/components/CompatibilityV3/images/SVG/Star/index.tsx b/src/components/CompatibilityV3/images/SVG/Star/index.tsx new file mode 100644 index 0000000..2f2873c --- /dev/null +++ b/src/components/CompatibilityV3/images/SVG/Star/index.tsx @@ -0,0 +1,19 @@ +function StarSVG() { + return ( + + + + ); +} + +export default StarSVG; diff --git a/src/components/CompatibilityV3/images/SVG/Tab/index.tsx b/src/components/CompatibilityV3/images/SVG/Tab/index.tsx new file mode 100644 index 0000000..7b5b5dc --- /dev/null +++ b/src/components/CompatibilityV3/images/SVG/Tab/index.tsx @@ -0,0 +1,28 @@ +import { SVGProps } from "react"; + +interface Props { + color?: string; +} + +function TabSVG({ + color = "#247DCF", + ...props +}: Props & SVGProps) { + return ( + + + + ); +} + +export default TabSVG; diff --git a/src/components/CompatibilityV3/images/SVG/Water/index.tsx b/src/components/CompatibilityV3/images/SVG/Water/index.tsx new file mode 100644 index 0000000..302e68e --- /dev/null +++ b/src/components/CompatibilityV3/images/SVG/Water/index.tsx @@ -0,0 +1,18 @@ +function WaterSVG() { + return ( + + + + ); +} + +export default WaterSVG; diff --git a/src/components/CompatibilityV3/pages/Birthdate/index.tsx b/src/components/CompatibilityV3/pages/Birthdate/index.tsx new file mode 100644 index 0000000..fc57155 --- /dev/null +++ b/src/components/CompatibilityV3/pages/Birthdate/index.tsx @@ -0,0 +1,88 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.scss"; +import { DatePicker } from "@/components/DateTimePicker"; +import { useState } from "react"; +import { useDispatch, useSelector } from "react-redux"; +import { actions, selectors } from "@/store"; +import Button from "../../components/Button"; +import metricService from "@/services/metric/metricService"; +import routes, { compatibilityV3Prefix } from "@/routes"; +import { useNavigate } from "react-router-dom"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; +import { useSession } from "@/hooks/session/useSession"; +import { ESourceAuthorization } from "@/api/resources/User"; + +function Birthdate() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + const { updateSession } = useSession(); + const navigate = useNavigate(); + const dispatch = useDispatch(); + const birthdateFromStore = useSelector(selectors.selectBirthdate); + const [birthdate, setBirthdate] = useState(birthdateFromStore); + const [isDisabled, setIsDisabled] = useState(true); + + const handleValid = (_birthdate: string) => { + setBirthdate(_birthdate); + setIsDisabled(_birthdate === ""); + }; + + const getAge = () => { + const today = new Date(); + const birthDate = new Date(birthdate); + let age = today?.getFullYear() - birthDate?.getFullYear(); + const m = today?.getMonth() - birthDate?.getMonth(); + if (m < 0 || (m === 0 && today?.getDate() < birthDate?.getDate())) { + age--; + } + return age; + }; + + const handleNext = () => { + const age = getAge(); + metricService.userParams({ + age, + }); + updateSession( + { + profile: { + birthdate: `${birthdate} 00:00`, + }, + }, + ESourceAuthorization["aura.compatibility.v3"] + ); + dispatch(actions.form.addDate(birthdate)); + dispatch(actions.questionnaire.update({ birthdate })); + navigate(routes.client.compatibilityV3PalmsInformation()); + }; + + return ( +
+ + {translate("/birthdate.title")} + +

{translate("/birthdate.text")}

+ setIsDisabled(true)} + inputClassName="date-picker-input" + /> + + Hand with eye +
+ ); +} + +export default Birthdate; diff --git a/src/components/CompatibilityV3/pages/Birthdate/styles.module.scss b/src/components/CompatibilityV3/pages/Birthdate/styles.module.scss new file mode 100644 index 0000000..0d9f9df --- /dev/null +++ b/src/components/CompatibilityV3/pages/Birthdate/styles.module.scss @@ -0,0 +1,22 @@ +.page-container { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; +} + +.title { + margin-bottom: 0; + font-size: 27px; +} + +.description { + margin: 16px 0 25px; + text-align: center; + font-size: 20px; +} + +.image { + margin-top: 56px; +} diff --git a/src/components/CompatibilityV3/pages/BirthdatePartner/index.tsx b/src/components/CompatibilityV3/pages/BirthdatePartner/index.tsx new file mode 100644 index 0000000..5bc7232 --- /dev/null +++ b/src/components/CompatibilityV3/pages/BirthdatePartner/index.tsx @@ -0,0 +1,88 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.scss"; +import { DatePicker } from "@/components/DateTimePicker"; +import { useState } from "react"; +import { useDispatch, useSelector } from "react-redux"; +import { actions, selectors } from "@/store"; +import Button from "../../components/Button"; +import metricService from "@/services/metric/metricService"; +import routes, { compatibilityV3Prefix } from "@/routes"; +import { useNavigate } from "react-router-dom"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; +import { useSession } from "@/hooks/session/useSession"; +import { ESourceAuthorization } from "@/api/resources/User"; + +function BirthdatePartner() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + const { updateSession } = useSession(); + const navigate = useNavigate(); + const dispatch = useDispatch(); + const { partnerBirthdate } = useSelector(selectors.selectQuestionnaire); + const [birthdate, setBirthdate] = useState(partnerBirthdate || ""); + const [isDisabled, setIsDisabled] = useState(true); + + const handleValid = (_birthdate: string) => { + setBirthdate(_birthdate); + setIsDisabled(_birthdate === ""); + }; + + const getAge = () => { + const today = new Date(); + const birthDate = new Date(birthdate); + let age = today?.getFullYear() - birthDate?.getFullYear(); + const m = today?.getMonth() - birthDate?.getMonth(); + if (m < 0 || (m === 0 && today?.getDate() < birthDate?.getDate())) { + age--; + } + return age; + }; + + const handleNext = () => { + const age = getAge(); + metricService.userParams({ + age, + }); + // dispatch(actions.form.addDate(birthdate)); + dispatch(actions.questionnaire.update({ partnerBirthdate: birthdate })); + navigate(routes.client.compatibilityV3PalmsInformationPartner()); + updateSession( + { + partner: { + birthdate: `${birthdate} 00:00`, + }, + }, + ESourceAuthorization["aura.compatibility.v3"] + ); + }; + + return ( +
+ + {translate("/birthdate-partner.title")} + +

{translate("/birthdate-partner.text")}

+ setIsDisabled(true)} + inputClassName="date-picker-input" + /> + + Hand with eye +
+ ); +} + +export default BirthdatePartner; diff --git a/src/components/CompatibilityV3/pages/BirthdatePartner/styles.module.scss b/src/components/CompatibilityV3/pages/BirthdatePartner/styles.module.scss new file mode 100644 index 0000000..0d9f9df --- /dev/null +++ b/src/components/CompatibilityV3/pages/BirthdatePartner/styles.module.scss @@ -0,0 +1,22 @@ +.page-container { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; +} + +.title { + margin-bottom: 0; + font-size: 27px; +} + +.description { + margin: 16px 0 25px; + text-align: center; + font-size: 20px; +} + +.image { + margin-top: 56px; +} diff --git a/src/components/CompatibilityV3/pages/Camera/index.tsx b/src/components/CompatibilityV3/pages/Camera/index.tsx new file mode 100644 index 0000000..2ae0714 --- /dev/null +++ b/src/components/CompatibilityV3/pages/Camera/index.tsx @@ -0,0 +1,341 @@ +import styles from "./styles.module.scss"; +import { DataURIToBlob } from "@/services/data"; +import { useApi } from "@/api"; +import { IPalmistryFinger, IPalmistryLine } from "@/api/resources/Palmistry"; +import { ICompatibilityV3FingerLocal } from "@/store/compatibilityV3"; +import { useDispatch } from "react-redux"; +import { actions } from "@/store"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; +import { useEffect, useMemo, useState } from "react"; +import Loader, { LoaderColor } from "@/components/Loader"; +import UploadModal from "@/components/palmistry/upload-modal/upload-modal"; +import Toast from "@/components/pages/ABDesign/v1/components/Toast"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; +import CameraModal from "../../components/CameraModal"; +import metricService, { EGoals, EMetrics } from "@/services/metric/metricService"; +import Modal from "@/components/Modal"; +import Title from "@/components/Title"; + +const isProduction = import.meta.env.MODE === "production"; + +enum EToastVisible { + "try_again" = "try_again", + "try_again_or_next" = "try_again_or_next", + "no_access_camera" = "no_access_camera", + "reload_page" = "reload_page", +} + +function Camera() { + const isIphoneSafari = useMemo((): boolean => { + const userAgent = navigator.userAgent; + const isIOS = /iPhone/i.test(userAgent); + const isSafari = /Safari/i.test(userAgent) && + !/CriOS/i.test(userAgent) && // не Chrome + !/FxiOS/i.test(userAgent) && // не Firefox + !/EdgiOS/i.test(userAgent) && // не Edge + !/OPiOS/i.test(userAgent); // не Opera + + return isIOS && isSafari; + }, []); + + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + const navigate = useNavigate(); + const api = useApi(); + const dispatch = useDispatch(); + const [isLoading, setIsLoading] = useState(false); + const [uploadMenuModalIsOpen, setUploadMenuModalIsOpen] = useState(false); + const [toastVisible, setToastVisible] = useState(null); + const [isRequestCameraModalOpen, setIsRequestCameraModalOpen] = useState(isIphoneSafari ? false : true); + const [cameraKey, setCameraKey] = useState(0); + const [isCameraModalOpen, setIsCameraModalOpen] = useState(false); + + const handleNext = () => { + metricService.reachGoal(EGoals.CAMERA_SUCCESS, [EMetrics.YANDEX, EMetrics.KLAVIYO]); + navigate(routes.client.compatibilityV3ScannedPhoto()); + }; + + const fingersNames = { + thumb: translate("thumb"), + index_finger: translate("index_finger"), + middle_finger: translate("middle_finger"), + ring_finger: translate("ring_finger"), + pinky: translate("pinky"), + }; + + const setFingersNames = ( + fingers: IPalmistryFinger[] + ): ICompatibilityV3FingerLocal[] => { + if (!fingers) return []; + return fingers.map((finger) => { + return { + ...finger, + fingerName: fingersNames[finger.name as keyof typeof fingersNames], + }; + }); + }; + + /** + * Check if the palmistry lines are valid for the next step. + * If the length of the lines is less than 2, show the "try_again" toast. + * If the length of the lines is 2, show the "try_again_or_next" toast. + * Otherwise, return true. + * @param {IPalmistryLine[]} lines - The palmistry lines. + * @returns {boolean} Whether the palmistry lines are valid for the next step. + */ + const checkPalmistryLines = (lines: IPalmistryLine[]): boolean => { + if (!lines.length || lines.length < 2) { + setToastVisible(EToastVisible.try_again); + return false; + } + if (lines.length === 2) { + setToastVisible(EToastVisible.try_again_or_next); + return false; + } + return true; + }; + + const getLines = async (file: File | Blob) => { + setIsLoading(true); + const formData = new FormData(); + formData.append("file", file); + try { + const result = await api.getPalmistryLines({ formData }); + const fingers = setFingersNames(result?.fingers); + + dispatch( + actions.compatibilityV3.update({ + lines: result?.lines, + fingers, + }) + ); + return result; + } catch (error) { + dispatch( + actions.compatibilityV3.update({ + lines: [], + fingers: [], + }) + ); + return null; + } finally { + setIsLoading(false); + } + }; + + const onTakePhoto = async (photo: string) => { + setUploadMenuModalIsOpen(false); + + try { + const file = DataURIToBlob(photo); + + const result = await getLines(file); + + URL.revokeObjectURL(URL.createObjectURL(file)); + + dispatch( + actions.compatibilityV3.update({ + photo, + }) + ); + if (!checkPalmistryLines(result?.lines || [])) return; + handleNext(); + } catch (error) { + console.error('Ошибка при обработке фото:', error); + } finally { + // Принудительный запуск сборщика мусора (не гарантировано, но может помочь) + if (window.gc) { + window.gc(); + } + } + }; + + const onSelectFile = async (event: React.ChangeEvent) => { + setUploadMenuModalIsOpen(false); + + if (!event.target.files || event.target.files.length === 0) return; + + const result = await getLines(event.target.files[0]); + + const reader = new FileReader(); + + reader.onloadend = () => { + dispatch( + actions.compatibilityV3.update({ + photo: reader.result as string, + }) + ); + if (!checkPalmistryLines(result?.lines || [])) return; + handleNext(); + }; + + reader.readAsDataURL(event.target.files[0]); + }; + + useEffect(() => { + metricService.reachGoal(EGoals.CAMERA_OPEN, [EMetrics.YANDEX, EMetrics.KLAVIYO]); + }, []); + + useEffect(() => { + if (toastVisible === EToastVisible.try_again) { + metricService.reachGoal(EGoals.CAMERA_ERROR, [EMetrics.YANDEX, EMetrics.KLAVIYO]); + } + }, [toastVisible]); + + const cameraError = (error: string | DOMException) => { + console.error("Camera error", error) + if (!isIphoneSafari) return; + if (error === "Video is not ready") { + return setToastVisible(EToastVisible.no_access_camera) + } + return setIsRequestCameraModalOpen(true) + } + + const requestCameraPermission = async () => { + if (cameraKey > 2) { + setIsRequestCameraModalOpen(false); + setToastVisible(EToastVisible.reload_page); + return; + } + try { + const stream = await navigator.mediaDevices.getUserMedia({ video: true }); + setToastVisible(null); + stream.getTracks().forEach(track => track.stop()); + setCameraKey(prev => prev + 1); + } catch (error) { + setCameraKey(prev => prev + 1); + console.error("Ошибка при запросе доступа к камере:", error); + setIsRequestCameraModalOpen(true); + } + }; + + return ( + <> + { }} + className={styles.modal} + containerClassName={styles["modal-container"]} + > + + {translate("/camera.modal.title")} + +
+
{ + setIsRequestCameraModalOpen(false); + setToastVisible(EToastVisible.no_access_camera); + }}> +

+ {translate("/camera.modal.cancel")} +

+
+
{ + setIsRequestCameraModalOpen(false) + if (isIphoneSafari) { + requestCameraPermission() + } else { + setIsCameraModalOpen(true) + } + }}> +

+ {translate("/camera.modal.allow")} +

+
+
+
+ {!isProduction && uploadMenuModalIsOpen && ( + setUploadMenuModalIsOpen(false)} + onSelectFile={onSelectFile} + onChooseCamera={() => true} + /> + )} + {!isProduction && ( + + )} + {!isLoading && !uploadMenuModalIsOpen && ( + // console.log("close")} + // onTakePhoto={onTakePhoto} + // /> + console.log("close")} + onTakePhoto={onTakePhoto} + onError={cameraError} + isCameraVisible={isIphoneSafari ? true : isCameraModalOpen} + reinitializeKey={cameraKey} + /> + )} + {isLoading && ( + + )} + {toastVisible === EToastVisible.try_again && ( + +
+ {translate("/camera.bad_photo")} + +
+
+ )} + {toastVisible === EToastVisible.no_access_camera && ( + +
+ {translate("/camera.no_access_camera")} + +
+
+ )} + {toastVisible === EToastVisible.reload_page && ( + +
+ {translate("/camera.reload_page")} + +
+
+ )} + {toastVisible === EToastVisible.try_again_or_next && ( + +
+ {translate("/camera.do_better")} +
+ + +
+
+
+ )} + + ); +} + +export default Camera; diff --git a/src/components/CompatibilityV3/pages/Camera/styles.module.scss b/src/components/CompatibilityV3/pages/Camera/styles.module.scss new file mode 100644 index 0000000..bea602f --- /dev/null +++ b/src/components/CompatibilityV3/pages/Camera/styles.module.scss @@ -0,0 +1,88 @@ +.loader { + transform: translate(-50%, -50%); + position: absolute; + top: 50%; + left: 50%; +} + +.upload-button { + position: fixed; + top: 32px; + right: 32px; + z-index: 3000; +} + +.toast-container { + position: fixed; + bottom: calc(0dvh + 16px); + width: 100%; + z-index: 3000; + padding: 0 16px; +} + +.toast-content { + display: flex; + flex-direction: row; + gap: 8px; + align-items: center; + justify-content: space-between; + + &>button, + &>.buttons-container>button { + padding: 6px 18px; + border: none; + background-color: #fff; + color: #000; + border-radius: 4px; + font-size: 14px; + font-weight: 500; + } + + &>.buttons-container>button { + width: 100%; + } + + &>.buttons-container { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 8px; + } +} + +.modal { + z-index: 4000; +} + +.modal-container { + max-width: 290px; + padding: 24px 0px 0px; + + + &>.modal-title { + font-weight: 600; + margin-bottom: 16px; + padding-inline: 32px; + } + + &>.modal-answers { + display: flex; + flex-direction: row; + margin-top: 24px; + border-top: 1px solid #D9D9D9; + + &>.modal-answer { + width: 50%; + height: 52px; + display: flex; + align-items: center; + justify-content: center; + color: #275DA7; + font-weight: 600; + cursor: pointer; + + &:first-child { + border-right: 1px solid #D9D9D9; + } + } + } +} \ No newline at end of file diff --git a/src/components/CompatibilityV3/pages/CheckingPhone/index.tsx b/src/components/CompatibilityV3/pages/CheckingPhone/index.tsx new file mode 100644 index 0000000..5e6849e --- /dev/null +++ b/src/components/CompatibilityV3/pages/CheckingPhone/index.tsx @@ -0,0 +1,83 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.scss"; +import Answer from "../../components/Answer"; +import { useDispatch, useSelector } from "react-redux"; +import { actions, selectors } from "@/store"; +import { sleep } from "@/services/date"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; +import { answerTimeOut } from "../../data"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; +import { useMemo } from "react"; +import { ELottieKeys, useLottie } from "@/hooks/lottie/useLottie"; +import { useSession } from "@/hooks/session/useSession"; +import { IAnswersSessionCompatibilityV3 } from "@/api/resources/Session"; +import { ESourceAuthorization } from "@/api/resources/User"; + +function CheckingPhone() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + const { updateSession } = useSession(); + const navigate = useNavigate(); + const dispatch = useDispatch(); + const { checkingPhone, relationshipStatus } = useSelector( + selectors.selectCompatibilityV3Answers + ); + useLottie({ + preloadKey: ELottieKeys.scalesNeutralPalmistry, + }); + + const answers: { + id: IAnswersSessionCompatibilityV3["checking_phone"]; + title: string; + }[] = useMemo( + () => [ + { + id: "against", + title: translate("/checking-phone.answer1"), + }, + { + id: "allow", + title: translate("/checking-phone.answer2"), + }, + { + id: "normally", + title: translate("/checking-phone.answer3"), + }, + ], + [translate] + ); + + const handleClick = async (id: IAnswersSessionCompatibilityV3["checking_phone"]) => { + dispatch(actions.compatibilityV3Answers.update({ checkingPhone: id })); + updateSession({ + answers: { + checking_phone: id, + }, + }, ESourceAuthorization["aura.compatibility.v3"]); + if (id !== checkingPhone) await sleep(answerTimeOut); + + if (relationshipStatus === "single") { + return navigate(routes.client.compatibilityV3DateEvent()); + } + return navigate(routes.client.compatibilityV3GenderPartner()); + }; + + return ( +
+ + {translate("/checking-phone.title")} + + {answers.map((answers, index) => ( + handleClick(answers.id)} + /> + ))} +
+ ); +} + +export default CheckingPhone; diff --git a/src/components/CompatibilityV3/pages/CheckingPhone/styles.module.scss b/src/components/CompatibilityV3/pages/CheckingPhone/styles.module.scss new file mode 100644 index 0000000..5bfbb7c --- /dev/null +++ b/src/components/CompatibilityV3/pages/CheckingPhone/styles.module.scss @@ -0,0 +1,3 @@ +.container { + width: 100%; +} diff --git a/src/components/CompatibilityV3/pages/DateEvent/index.tsx b/src/components/CompatibilityV3/pages/DateEvent/index.tsx new file mode 100644 index 0000000..253356f --- /dev/null +++ b/src/components/CompatibilityV3/pages/DateEvent/index.tsx @@ -0,0 +1,91 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.scss"; +import { DatePicker } from "@/components/DateTimePicker"; +import { useState } from "react"; +import { useDispatch, useSelector } from "react-redux"; +import { actions, selectors } from "@/store"; +import Button from "../../components/Button"; +import metricService from "@/services/metric/metricService"; +import routes, { compatibilityV3Prefix } from "@/routes"; +import { useNavigate } from "react-router-dom"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; +import { useSession } from "@/hooks/session/useSession"; +import { ESourceAuthorization } from "@/api/resources/User"; + +function DateEvent() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + const { updateSession } = useSession(); + const navigate = useNavigate(); + const dispatch = useDispatch(); + const { dateEvent: dateEventFromStore, relationshipStatus } = useSelector(selectors.selectCompatibilityV3Answers); + const translateSeparator = relationshipStatus === "single" ? "single" : "relationship"; + + const [dateEvent, setDateEvent] = useState(dateEventFromStore); + const [isDisabled, setIsDisabled] = useState(true); + + const handleValid = (_birthdate: string) => { + setDateEvent(_birthdate); + setIsDisabled(_birthdate === ""); + }; + + const getAge = () => { + const today = new Date(); + const date = new Date(dateEvent); + let age = today?.getFullYear() - date?.getFullYear(); + const m = today?.getMonth() - date?.getMonth(); + if (m < 0 || (m === 0 && today?.getDate() < date?.getDate())) { + age--; + } + return age; + }; + + const handleNext = () => { + const age = getAge(); + metricService.userParams({ + age, + }); + // dispatch(actions.form.addDate(birthdate)); + dispatch(actions.compatibilityV3Answers.update({ dateEvent })); + navigate(routes.client.compatibilityV3HeadOrHeart()); + updateSession( + { + answers: { + date_event: `${dateEvent} 00:00`, + } + }, + ESourceAuthorization["aura.compatibility.v3"] + ); + }; + + return ( +
+ + {translate(`/date-event.${translateSeparator}.title`)} + +

{translate(`/date-event.${translateSeparator}.text`)}

+ setIsDisabled(true)} + inputClassName="date-picker-input" + differenceOfMaximumAndCurrentYear={0} + /> + + Hand with eye +
+ ); +} + +export default DateEvent; diff --git a/src/components/CompatibilityV3/pages/DateEvent/styles.module.scss b/src/components/CompatibilityV3/pages/DateEvent/styles.module.scss new file mode 100644 index 0000000..0d9f9df --- /dev/null +++ b/src/components/CompatibilityV3/pages/DateEvent/styles.module.scss @@ -0,0 +1,22 @@ +.page-container { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; +} + +.title { + margin-bottom: 0; + font-size: 27px; +} + +.description { + margin: 16px 0 25px; + text-align: center; + font-size: 20px; +} + +.image { + margin-top: 56px; +} diff --git a/src/components/CompatibilityV3/pages/ElementResonates/index.tsx b/src/components/CompatibilityV3/pages/ElementResonates/index.tsx new file mode 100644 index 0000000..8cb1d51 --- /dev/null +++ b/src/components/CompatibilityV3/pages/ElementResonates/index.tsx @@ -0,0 +1,106 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.scss"; +import Answer from "../../components/Answer"; +import { useDispatch, useSelector } from "react-redux"; +import { actions, selectors } from "@/store"; +import { sleep } from "@/services/date"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; +import { answerTimeOut } from "../../data"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; +import { useMemo } from "react"; +import WaterSVG from "../../images/SVG/Water"; +import FireSVG from "../../images/SVG/Fire"; +import AirSVG from "../../images/SVG/Air"; +import EarthSVG from "../../images/SVG/Earth"; +import { ELottieKeys, useLottie } from "@/hooks/lottie/useLottie"; +import { IAnswersSessionCompatibilityV3 } from "@/api/resources/Session"; +import { useSession } from "@/hooks/session/useSession"; +import { ESourceAuthorization } from "@/api/resources/User"; +import DarknessSVG from "../../images/SVG/Darkness"; +import LightSVG from "../../images/SVG/Light"; + +function ElementResonates() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + const { updateSession } = useSession(); + const navigate = useNavigate(); + const dispatch = useDispatch(); + const { elementResonates } = useSelector(selectors.selectCompatibilityV3Answers); + useLottie({ + preloadKey: ELottieKeys.letScan, + }); + + const answers: { + id: IAnswersSessionCompatibilityV3["element_resonates"]; + title: string; + Icon: JSX.Element; + }[] = useMemo( + () => [ + { + id: "air", + title: translate("/element-resonates.answer3"), + Icon: , + }, + { + id: "water", + title: translate("/element-resonates.answer1"), + Icon: , + }, + { + id: "fire", + title: translate("/element-resonates.answer2"), + Icon: , + }, + { + id: "earth", + title: translate("/element-resonates.answer4"), + Icon: , + }, + { + id: "light", + title: translate("/element-resonates.answer5"), + Icon: , + }, + { + id: "darkness", + title: translate("/element-resonates.answer6"), + Icon: , + }, + ], + [translate] + ); + + const handleClick = async (id: IAnswersSessionCompatibilityV3["element_resonates"]) => { + dispatch(actions.compatibilityV3Answers.update({ elementResonates: id })); + updateSession({ + answers: { + element_resonates: id, + }, + }, ESourceAuthorization["aura.compatibility.v3"]); + if (id !== elementResonates) await sleep(answerTimeOut); + navigate(routes.client.compatibilityV3FavoriteColor()); + }; + + return ( +
+ + {translate("/element-resonates.title")} + + {answers.map(({ Icon, ...answers }, index) => ( + handleClick(answers.id)} + className={styles.answer} + > + {Icon} +

{answers.title}

+
+ ))} +
+ ); +} + +export default ElementResonates; diff --git a/src/components/CompatibilityV3/pages/ElementResonates/styles.module.scss b/src/components/CompatibilityV3/pages/ElementResonates/styles.module.scss new file mode 100644 index 0000000..4a0a092 --- /dev/null +++ b/src/components/CompatibilityV3/pages/ElementResonates/styles.module.scss @@ -0,0 +1,9 @@ +.container { + width: 100%; +} + +.answer { + justify-content: flex-start; + padding-left: 15px; + gap: 6px; +} diff --git a/src/components/CompatibilityV3/pages/Email/index.tsx b/src/components/CompatibilityV3/pages/Email/index.tsx new file mode 100644 index 0000000..b6e28c5 --- /dev/null +++ b/src/components/CompatibilityV3/pages/Email/index.tsx @@ -0,0 +1,192 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.scss"; +import EmailInput from "@/components/pages/ABDesign/v1/pages/EmailEnterPage/EmailInput"; +import { useCallback, useEffect, useState } from "react"; +import { useDispatch } from "react-redux"; +import { actions } from "@/store"; +import Button from "../../components/Button"; +import { useAuthentication } from "@/hooks/authentication/use-authentication"; +import { ESourceAuthorization } from "@/api/resources/User"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; +import Loader, { LoaderColor } from "@/components/Loader"; +import Policy from "@/components/Policy"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; +import { + useMetricABFlags, +} from "@/services/metric/metricService"; +import NameInput from "@/components/pages/ABDesign/v1/pages/EmailEnterPage/NameInput"; +import { useSession } from "@/hooks/session/useSession"; + +function Email() { + const { updateSession } = useSession(); + const dispatch = useDispatch(); + const navigate = useNavigate(); + const { error, isLoading, token, user, authorization } = useAuthentication(); + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + + const [email, setEmail] = useState(""); + const [name, setName] = useState(""); + const [isValidEmail, setIsValidEmail] = useState(false); + const [isValidName, setIsValidName] = useState(true); + const [isDisabled, setIsDisabled] = useState(true); + const [isAuth, setIsAuth] = useState(false); + + const { flags } = useMetricABFlags(); + const auraVideoTrial = flags?.auraVideoTrial?.[0]; + + const handleValidEmail = (email: string) => { + dispatch(actions.form.addEmail(email)); + setEmail(email); + setIsValidEmail(true); + }; + + const handleValidName = (name: string) => { + if (name) { + dispatch( + actions.user.update({ + username: name, + }) + ); + } + setName(name); + setIsValidName(true); + }; + + useEffect(() => { + if (isValidName && isValidEmail) { + setIsDisabled(false); + } else { + setIsDisabled(true); + } + }, [isValidEmail, email, isValidName, name]); + + const handleClick = () => { + authorize(); + // metricService.reachGoal(EGoals.ENTERED_EMAIL, [ + // EMetrics.KLAVIYO, + // EMetrics.YANDEX, + // EMetrics.FACEBOOK, + // ]); + }; + + const authorize = async () => { + updateSession( + { + profile: { + name, + }, + }, + ESourceAuthorization["aura.compatibility.v3"] + ); + // metricService.reachGoal(EGoals.LEAD, [EMetrics.FACEBOOK]); + // metricService.reachGoal(EGoals.ENTERED_EMAIL, [ + // EMetrics.KLAVIYO, + // EMetrics.YANDEX, + // EMetrics.FACEBOOK, + // ]); + // metricService.reachGoal(EGoals.ENTERED_EMAIL, [EMetrics.YANDEX]); + await authorization(email, ESourceAuthorization["aura.compatibility.v3"]); + }; + + const handleNext = useCallback(() => { + if (auraVideoTrial === "on") { + return navigate(routes.client.compatibilityV3TrialChoiceVideo()); + } + return navigate(routes.client.compatibilityV3TrialChoice()); + }, [auraVideoTrial, navigate]); + + useEffect(() => { + if (user && token?.length && !isLoading && !error) { + setIsAuth(true); + dispatch(actions.paywalls.resetIsMustUpdate()); + const timeout = setTimeout(() => { + handleNext(); + }, 1000); + return () => { + clearTimeout(timeout); + }; + } + }, [dispatch, error, handleNext, isLoading, token?.length, user]); + + return ( + <> + + {translate("/email.title")} + + setIsValidEmail(false)} + /> + setIsValidName(true)} + /> +

{translate("/email.not_share")}

+ + + {translate( + "/email.policy", + { + eulaLink: ( + + {translate( + "/email.policy_eula", + undefined, + ELocalesPlacement.V1 + )} + + ), + privacyPolicy: ( + + {translate("privacy_policy", undefined, ELocalesPlacement.V1)} + + ), + }, + ELocalesPlacement.V1 + )} + + {!!error?.length && ( + + {translate("went_wrong", undefined, ELocalesPlacement.CompatibilityV3)} + + )} + + ); +} + +export default Email; diff --git a/src/components/CompatibilityV3/pages/Email/styles.module.scss b/src/components/CompatibilityV3/pages/Email/styles.module.scss new file mode 100644 index 0000000..da86796 --- /dev/null +++ b/src/components/CompatibilityV3/pages/Email/styles.module.scss @@ -0,0 +1,36 @@ +.title { + font-size: 28px; + line-height: 125%; + font-weight: 500; +} + +.input { + background-color: #f3f3f3; + min-height: 60px; +} + +.not-share { + padding-top: 5px; + font-size: 20px; + line-height: 125%; + text-align: center; +} + +.button { + margin-top: 50px; +} + +.policy { + font-size: 16px; + margin-top: 20px; + line-height: 125%; + + & .link { + color: #057dd4; + } +} + +.success-icon { + height: 46px; + width: auto; +} diff --git a/src/components/CompatibilityV3/pages/FavoriteColor/index.tsx b/src/components/CompatibilityV3/pages/FavoriteColor/index.tsx new file mode 100644 index 0000000..79d38a0 --- /dev/null +++ b/src/components/CompatibilityV3/pages/FavoriteColor/index.tsx @@ -0,0 +1,111 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.scss"; +import Answer from "../../components/Answer"; +import { useDispatch, useSelector } from "react-redux"; +import { actions, selectors } from "@/store"; +import { sleep } from "@/services/date"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; +import { answerTimeOut } from "../../data"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; +import { useMemo } from "react"; +import TabSVG from "../../images/SVG/Tab"; +import { usePreloadImages } from "@/hooks/preload/images"; +import { IAnswersSessionCompatibilityV3 } from "@/api/resources/Session"; +import { useSession } from "@/hooks/session/useSession"; +import { ESourceAuthorization } from "@/api/resources/User"; + +function FavoriteColor() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + const { updateSession } = useSession(); + const navigate = useNavigate(); + const dispatch = useDispatch(); + const { favoriteColor } = useSelector(selectors.selectCompatibilityV3Answers); + usePreloadImages([ + "/v1/palmistry/trial-payment/girl.png", + "/v1/palmistry/reviews.png", + "/v1/palmistry/trial-payment/avatar-1.png", + "/v1/palmistry/trial-payment/avatar-2.png", + "/v1/palmistry/trial-payment/avatar-3.png", + "/v1/palmistry/trial-payment/avatar-4.png", + ]); + + const answers: { + id: IAnswersSessionCompatibilityV3["favorite_color"]; + title: string; + color?: string; + }[] = useMemo( + () => [ + { + id: "blue", + title: translate("/favorite-color.answer1"), + }, + { + id: "green", + title: translate("/favorite-color.answer2"), + color: "#20C63B", + }, + { + id: "red", + title: translate("/favorite-color.answer5"), + color: "#FB3334", + }, + { + id: "yellow", + title: translate("/favorite-color.answer6"), + color: "#E4DD29", + }, + { + id: "violet", + title: translate("/favorite-color.answer4"), + color: "#7B29E4", + }, + // { + // id: "orange", + // title: translate("/favorite-color.answer3"), + // color: "#EFA006", + // }, + { + id: "turquoise", + title: translate("/favorite-color.answer7"), + color: "#00C6C6", + }, + ], + [translate] + ); + + const handleClick = async (id: IAnswersSessionCompatibilityV3["favorite_color"]) => { + dispatch(actions.compatibilityV3Answers.update({ favoriteColor: id })); + updateSession({ + answers: { + favorite_color: id, + }, + }, ESourceAuthorization["aura.compatibility.v3"]); + if (id !== favoriteColor) await sleep(answerTimeOut); + navigate(routes.client.compatibilityV3HeadOrHeart()); + }; + + return ( +
+ + {translate("/favorite-color.title")} + + {answers.map((answers, index) => ( + handleClick(answers.id)} + className={styles.answer} + selectedClassName={styles.selected} + > + +

{answers.title}

+
+ ))} +
+ ); +} + +export default FavoriteColor; diff --git a/src/components/CompatibilityV3/pages/FavoriteColor/styles.module.scss b/src/components/CompatibilityV3/pages/FavoriteColor/styles.module.scss new file mode 100644 index 0000000..d33ee7a --- /dev/null +++ b/src/components/CompatibilityV3/pages/FavoriteColor/styles.module.scss @@ -0,0 +1,23 @@ +.container { + width: 100%; +} + +.answer { + justify-content: flex-start; + padding-left: 70px; + gap: 6px; + object-fit: cover; + background-repeat: no-repeat; + position: relative; + overflow: hidden; + + &.selected { + transform: scale(1.02); + } +} + +.tab { + position: absolute; + left: 0; + top: 0; +} diff --git a/src/components/CompatibilityV3/pages/FindHappiness/index.tsx b/src/components/CompatibilityV3/pages/FindHappiness/index.tsx new file mode 100644 index 0000000..5fcf178 --- /dev/null +++ b/src/components/CompatibilityV3/pages/FindHappiness/index.tsx @@ -0,0 +1,104 @@ +import routes, { compatibilityV3Prefix } from "@/routes"; +import styles from "./styles.module.scss"; +import Title from "@/components/Title"; +import Button from "../../components/Button"; +import { Navigate, useLocation, useNavigate } from "react-router-dom"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; +import { useDispatch } from "react-redux"; +import { useEffect } from "react"; +import { actions } from "@/store"; +// import StarSVG from "../../images/SVG/Star"; +import { usePreloadImages } from "@/hooks/preload/images"; +import { DotLottieReact } from "@lottiefiles/dotlottie-react"; +import { useMetricABFlags } from "@/services/metric/metricService"; + +function FindHappiness() { + const navigate = useNavigate(); + const dispatch = useDispatch(); + const location = useLocation(); + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + usePreloadImages(["/male-gender.webp", "/female-gender.webp"]); + const { flags, ready } = useMetricABFlags(); + const imageType = flags?.welcomePageImage?.[0]; + const image = imageType === "v1" ? "/hand-with-lines-v1.png" : "/hand-with-lines.png"; + + useEffect(() => { + const feature = location.pathname.replace( + routes.client.compatibilityV3Welcome(), + "" + ); + if (!!feature?.length) { + dispatch(actions.userConfig.setFeature(feature)); + } + }, [dispatch, location.pathname]); + + return + + if (!ready) return null; + + return ( + <> + {/*
+
+ darts +
    +
  1. {translate("/find-your-happiness.point1")}
  2. +
  3. + {translate("/find-your-happiness.point2")} +
  4. +
+
+
+ +
    +
  1. {translate("/find-your-happiness.point3")}
  2. +
  3. {translate("/find-your-happiness.point4")}
  4. +
+
+
*/} + + Hand with lines + + {translate("/find-your-happiness.title")} + +
+
    +
  • + {translate("/find-your-happiness.advantage1")} +
  • +
  • + {translate("/find-your-happiness.advantage2")} +
  • +
  • + {translate("/find-your-happiness.advantage3")} +
  • +
+
+
+ +
+

+ {translate("/find-your-happiness.text")} +

+ + ); +} + +export default FindHappiness; diff --git a/src/components/CompatibilityV3/pages/FindHappiness/styles.module.scss b/src/components/CompatibilityV3/pages/FindHappiness/styles.module.scss new file mode 100644 index 0000000..b4e8207 --- /dev/null +++ b/src/components/CompatibilityV3/pages/FindHappiness/styles.module.scss @@ -0,0 +1,83 @@ +.blocks-container { + width: 100%; + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + gap: 10px; + + & > .block { + display: flex; + flex-direction: row; + align-items: center; + max-height: 80px; + padding: 12px 9px; + border: solid 2px #3871c1; + border-radius: 10px; + gap: 6px; + + & > ol { + list-style-type: disc; + padding-left: 15px; + + & > li { + margin-bottom: 2px; + font-size: 12px; + } + } + } +} + +.image { + width: 100%; + max-width: 250px; + margin-top: -21px; + min-height: 341px; +} + +.title { + margin-bottom: 0; +} + +.description { + text-align: center; + font-size: 14px; +} + +.button-container { + display: flex; + flex-direction: column; + align-items: center; + width: 100%; + position: sticky; + bottom: 0dvh; + padding: 16px 0; + -webkit-backdrop-filter: blur(2px); + backdrop-filter: blur(2px); +} + +.advantages { + width: 100%; + text-align: center; + margin: 16px 0; + display: flex; + flex-direction: column; + gap: 8px; +} + +.list { + list-style: disc; + padding-left: 20px; + margin: 0; + text-align: left; +} + +.list li { + margin-bottom: 8px; +} + +.lottie-animation { + width: 0; + height: 0; + opacity: 0; +} \ No newline at end of file diff --git a/src/components/CompatibilityV3/pages/Gender/index.tsx b/src/components/CompatibilityV3/pages/Gender/index.tsx new file mode 100644 index 0000000..c81b05d --- /dev/null +++ b/src/components/CompatibilityV3/pages/Gender/index.tsx @@ -0,0 +1,214 @@ +import styles from "./styles.module.scss"; +import Title from "@/components/Title"; +import { useDispatch, useSelector } from "react-redux"; +import { actions, selectors } from "@/store"; +import { Gender } from "@/data"; +import PrivacyPolicy from "@/components/pages/ABDesign/v1/components/PrivacyPolicy"; +// import Toast from "@/components/pages/ABDesign/v1/components/Toast"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; +import { useCallback, useEffect, useState } from "react"; +import { sleep } from "@/services/date"; +import metricService, { useMetricABFlags } from "@/services/metric/metricService"; +import { genders } from "@/components/pages/ABDesign/v1/data/genders"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; +import { usePreloadImages } from "@/hooks/preload/images"; +import { ELottieKeys, useLottie } from "@/hooks/lottie/useLottie"; +import { useSession } from "@/hooks/session/useSession"; +import { EGender, ESourceAuthorization } from "@/api/resources/User"; +import AlreadyHaveAccount from "@/components/ui/AlreadyHaveAccount"; +import Answer from "../../components/Answer"; +import Loader, { LoaderColor } from "@/components/Loader"; + +function GenderPage() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + const dispatch = useDispatch(); + const navigate = useNavigate(); + const { createSession, updateSession } = useSession(); + const { checked: privacyPolicyChecked } = useSelector( + selectors.selectPrivacyPolicy + ); + + const { gender } = useSelector(selectors.selectQuestionnaire); + const [isSelected, setIsSelected] = useState(false); + usePreloadImages(["/v1/palmistry/hand-with-eye.svg"]); + useLottie({ + preloadKey: ELottieKeys.handSymbols, + }); + + const { flags, ready } = useMetricABFlags(); + const pageType = flags?.genderPageType?.[0]; + const localGenders = genders.map((gender) => ({ + id: gender.id, + title: translate(gender.id, undefined, ELocalesPlacement.V1), + })); + + useEffect(() => { + const feature = location.pathname.replace( + routes.client.compatibilityV3Gender(), + "" + ); + if (!!feature?.length) { + dispatch(actions.userConfig.setFeature(feature)); + } + }, [dispatch, location.pathname]); + + const selectGender = (_gender: Gender | null) => { + dispatch(actions.privacyPolicy.updateChecked(true)); + setIsSelected(true); + dispatch(actions.questionnaire.update({ gender: _gender?.id })); + }; + + const handleNext = useCallback(async () => { + if (!gender) return; + dispatch(actions.privacyPolicy.updateChecked(true)); + await sleep(1000); + metricService.userParams({ + gender: genders.find((g) => g.id === gender)?.name, + }); + const session = await createSession( + ESourceAuthorization["aura.compatibility.v3"] + ); + if (session?.sessionId?.length) { + updateSession( + { + profile: { + gender: EGender[gender as keyof typeof EGender], + }, + }, + ESourceAuthorization["aura.compatibility.v3"], + session.sessionId + ); + metricService.userParams({ + sessionId: session.sessionId, + }); + } + return navigate(routes.client.compatibilityV3Birthdate()); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [gender, navigate]); + + useEffect(() => { + if (privacyPolicyChecked && gender && isSelected) { + handleNext(); + } + }, [gender, handleNext, isSelected, privacyPolicyChecked]); + + if (!ready) return ; + + switch (pageType) { + case "v1": + return ( + <> + + {translate("/gender.v1.title", { + br: <br />, + })} + +

{translate("/gender.v1.subtitle", { + br:
, + })}

+
    + {Array.from({ length: 4 }).map((_, index) => ( +
  • + {translate(`/gender.v1.points.point${index + 1}`)} +
  • + ))} +
+ {/* */} +
+ {localGenders.map((_gender, index) => ( + selectGender(genders.find((g) => g.id === _gender.id) ?? null)} + /> + ))} +
+ + + {/* {gender && !privacyPolicyChecked && ( + + {translate("/gender.toast", undefined, ELocalesPlacement.V1)} + + )} */} + + ) + case "v2": + return ( + <> + + {translate("/gender.v2.title", { + br: <br />, + })} + +
    + {Array.from({ length: 5 }).map((_, index) => ( +
  • + {translate(`/gender.v2.points.point${index + 1}`)} +
  • + ))} +
+

{translate("/gender.v2.subtitle", { + br:
, + })}

+ {/* */} +
+ {localGenders.map((_gender, index) => ( + selectGender(genders.find((g) => g.id === _gender.id) ?? null)} + /> + ))} +
+ + + {/* {gender && !privacyPolicyChecked && ( + + {translate("/gender.toast", undefined, ELocalesPlacement.V1)} + + )} */} + + ) + default: + return ( + <> + + {translate("/gender.title")} + +

{translate("/gender.description", { + br:
, + })}

+ {/* */} + +
+ {localGenders.map((_gender, index) => ( + selectGender(genders.find((g) => g.id === _gender.id) ?? null)} + /> + ))} +
+ + {/* {gender && !privacyPolicyChecked && ( + + {translate("/gender.toast", undefined, ELocalesPlacement.V1)} + + )} */} + + ); + } + +} + +export default GenderPage; diff --git a/src/components/CompatibilityV3/pages/Gender/styles.module.scss b/src/components/CompatibilityV3/pages/Gender/styles.module.scss new file mode 100644 index 0000000..d23c15c --- /dev/null +++ b/src/components/CompatibilityV3/pages/Gender/styles.module.scss @@ -0,0 +1,65 @@ +.title { + margin-top: 30px; + font-size: 28px; + font-weight: 500; + line-height: 125%; + margin-bottom: 0; +} + +.description { + margin-top: 16px; + font-size: 20px; + line-height: 125%; + text-align: center; + max-width: 302px; +} + +.leftAlign { + text-align: left; +} + +.privacy-policy { + max-width: 316px; + margin-top: 26px; + text-align: center; +} + +.toast-container { + position: fixed; + bottom: calc(0dvh + 16px); + margin-top: 16px; + max-width: 460px; + padding: 0 24px; +} + +.genders-container { + display: flex; + flex-direction: column-reverse; + width: 100%; +} + +.subtitle { + margin-top: 8px; + text-align: center; + font-size: 23px; + line-height: 125%; + font-weight: 300; + color: #2C2C2C; +} + +.points { + margin-top: 22px; + color: #2C2C2C; + list-style-type: disc; + + li { + font-size: 20px; + line-height: 125%; + font-weight: 300; + margin-left: 28px; + + &::marker { + font-size: 16px; + } + } +} \ No newline at end of file diff --git a/src/components/CompatibilityV3/pages/GenderPartner/index.tsx b/src/components/CompatibilityV3/pages/GenderPartner/index.tsx new file mode 100644 index 0000000..f6d51dd --- /dev/null +++ b/src/components/CompatibilityV3/pages/GenderPartner/index.tsx @@ -0,0 +1,115 @@ +import styles from "./styles.module.scss"; +import Title from "@/components/Title"; +import { useDispatch, useSelector } from "react-redux"; +import { actions, selectors } from "@/store"; +import { Gender } from "@/data"; +// import Toast from "@/components/pages/ABDesign/v1/components/Toast"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; +import { useCallback, useEffect, useState } from "react"; +import { sleep } from "@/services/date"; +import { genders } from "@/components/pages/ABDesign/v1/data/genders"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; +import { usePreloadImages } from "@/hooks/preload/images"; +import { ELottieKeys, useLottie } from "@/hooks/lottie/useLottie"; +import { useSession } from "@/hooks/session/useSession"; +import { EGender, ESourceAuthorization } from "@/api/resources/User"; +import Answer from "../../components/Answer"; +import metricService from "@/services/metric/metricService"; + +function GenderPartner() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + const dispatch = useDispatch(); + const navigate = useNavigate(); + const { createSession, updateSession } = useSession(); + const { checked: privacyPolicyChecked } = useSelector( + selectors.selectPrivacyPolicy + ); + + const { partnerGender } = useSelector(selectors.selectQuestionnaire); + const [isSelected, setIsSelected] = useState(false); + usePreloadImages(["/v1/palmistry/hand-with-eye.svg"]); + useLottie({ + preloadKey: ELottieKeys.handSymbols, + }); + + const localGenders = genders.map((gender) => ({ + id: gender.id, + title: translate(gender.id, undefined, ELocalesPlacement.V1), + })); + + const selectGender = (_gender: Gender | null) => { + dispatch(actions.privacyPolicy.updateChecked(true)); + setIsSelected(true); + dispatch(actions.questionnaire.update({ partnerGender: _gender?.id })); + }; + + const handleNext = useCallback(async () => { + if (!partnerGender) return; + dispatch(actions.privacyPolicy.updateChecked(true)); + await sleep(1000); + // metricService.userParams({ + // gender: genders.find((g) => g.id === gender)?.name, + // }); + const session = await createSession( + ESourceAuthorization["aura.compatibility.v3"] + ); + if (session?.sessionId?.length) { + updateSession( + { + // profile: { + // gender: EGender[gender as keyof typeof EGender], + // }, + partner: { + gender: EGender[partnerGender as keyof typeof EGender], + } + }, + ESourceAuthorization["aura.compatibility.v3"], + session.sessionId + ); + metricService.userParams({ + sessionId: session.sessionId, + }); + } + return navigate(routes.client.compatibilityV3BirthdatePartner()); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [partnerGender, navigate]); + + useEffect(() => { + if (privacyPolicyChecked && partnerGender && isSelected) { + handleNext(); + } + }, [partnerGender, handleNext, isSelected, privacyPolicyChecked]); + + return ( + <> + + {translate("/gender-partner.title")} + +

{translate("/gender-partner.description", { + br:
, + })}

+ {/* */} + {/* */} +
+ {localGenders?.map((_gender, index) => ( + selectGender(genders.find((g) => g.id === _gender?.id) ?? null)} + /> + ))} +
+ {/* */} + {/* {gender && !privacyPolicyChecked && ( + + {translate("/gender.toast", undefined, ELocalesPlacement.V1)} + + )} */} + + ); +} + +export default GenderPartner; diff --git a/src/components/CompatibilityV3/pages/GenderPartner/styles.module.scss b/src/components/CompatibilityV3/pages/GenderPartner/styles.module.scss new file mode 100644 index 0000000..0922519 --- /dev/null +++ b/src/components/CompatibilityV3/pages/GenderPartner/styles.module.scss @@ -0,0 +1,39 @@ +.title { + margin-top: 30px; + font-size: 28px; + font-weight: 500; + line-height: 125%; + margin-bottom: 0; +} + +.description { + margin-top: 16px; + font-size: 20px; + line-height: 125%; + text-align: center; + max-width: 302px; +} + +.leftAlign { + text-align: left; +} + +.privacy-policy { + max-width: 316px; + margin-top: 26px; + text-align: center; +} + +.toast-container { + position: fixed; + bottom: calc(0dvh + 16px); + margin-top: 16px; + max-width: 460px; + padding: 0 24px; +} + +.genders-container { + display: flex; + flex-direction: column-reverse; + width: 100%; +} diff --git a/src/components/CompatibilityV3/pages/HeadOrHeart/index.tsx b/src/components/CompatibilityV3/pages/HeadOrHeart/index.tsx new file mode 100644 index 0000000..c609929 --- /dev/null +++ b/src/components/CompatibilityV3/pages/HeadOrHeart/index.tsx @@ -0,0 +1,95 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.scss"; +import Answer from "../../components/Answer"; +import { useDispatch, useSelector } from "react-redux"; +import { actions, selectors } from "@/store"; +import { sleep } from "@/services/date"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; +import { answerTimeOut } from "../../data"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; +import { useMemo } from "react"; +import { usePreloadImages } from "@/hooks/preload/images"; +import { useSession } from "@/hooks/session/useSession"; +import { IAnswersSessionCompatibilityV3 } from "@/api/resources/Session"; +import { ESourceAuthorization } from "@/api/resources/User"; +import { ELottieKeys, useLottie } from "@/hooks/lottie/useLottie"; + +function HeadOrHeart() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + const { updateSession } = useSession(); + const navigate = useNavigate(); + const dispatch = useDispatch(); + const { headOrHeart } = useSelector(selectors.selectCompatibilityV3Answers); + usePreloadImages([ + "/v1/palmistry/money-back.svg", + "/v1/palmistry/hand.svg", + "/v1/palmistry/1_1.svg", + "/v1/palmistry/daily.svg", + "/v1/palmistry/cosmic.svg", + "/v1/palmistry/calendar.svg", + "/v1/palmistry/reviews/rebecca.png", + "/v1/palmistry/reviews/mika.png", + "/v1/palmistry/reviews/amanda.png", + "/v1/palmistry/partners.png", + ]); + useLottie({ + preloadKey: ELottieKeys.letScan, + }); + + const answers: { id: IAnswersSessionCompatibilityV3["head_or_heart"]; title: string }[] = + useMemo( + () => [ + { + id: "heart", + title: translate("/head-or-heart.answer1"), + }, + { + id: "head", + title: translate("/head-or-heart.answer2"), + }, + { + id: "both", + title: translate("/head-or-heart.answer3"), + }, + { + id: "depends", + title: translate("/head-or-heart.answer4"), + }, + ], + [translate] + ); + + const handleClick = async (id: IAnswersSessionCompatibilityV3["head_or_heart"]) => { + dispatch(actions.compatibilityV3Answers.update({ headOrHeart: id })); + updateSession( + { + answers: { + head_or_heart: id, + }, + }, + ESourceAuthorization["aura.compatibility.v3"] + ); + if (id !== headOrHeart) await sleep(answerTimeOut); + navigate(routes.client.compatibilityV3HeadOrHeartResult()); + }; + + return ( +
+ + {translate("/head-or-heart.title")} + + {answers.map((answers, index) => ( + handleClick(answers.id)} + /> + ))} +
+ ); +} + +export default HeadOrHeart; diff --git a/src/components/CompatibilityV3/pages/HeadOrHeart/styles.module.scss b/src/components/CompatibilityV3/pages/HeadOrHeart/styles.module.scss new file mode 100644 index 0000000..5bfbb7c --- /dev/null +++ b/src/components/CompatibilityV3/pages/HeadOrHeart/styles.module.scss @@ -0,0 +1,3 @@ +.container { + width: 100%; +} diff --git a/src/components/CompatibilityV3/pages/HeadOrHeartResult/index.tsx b/src/components/CompatibilityV3/pages/HeadOrHeartResult/index.tsx new file mode 100644 index 0000000..6373eb0 --- /dev/null +++ b/src/components/CompatibilityV3/pages/HeadOrHeartResult/index.tsx @@ -0,0 +1,141 @@ +// import { ELottieKeys, useLottie } from "@/hooks/lottie/useLottie"; +import styles from "./styles.module.scss"; +// import { DotLottieReact } from "@lottiefiles/dotlottie-react"; +import Title from "@/components/Title"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; +import { getZodiacSignByDate } from "@/services/zodiac-sign"; +import { useSelector } from "react-redux"; +import { selectors } from "@/store"; +import Button from "../../components/Button"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; + +// const animations = { +// both: ELottieKeys.scalesNeutralPalmistry, +// heart: ELottieKeys.scalesHeartPalmistry, +// head: ELottieKeys.scalesHeadPalmistry, +// depends: ELottieKeys.scalesNeutralPalmistry, +// }; + +function HeadOrHeartResult() { + const navigate = useNavigate(); + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + const { headOrHeart, relationshipStatus } = useSelector(selectors.selectCompatibilityV3Answers); + const { gender, partnerGender, partnerBirthdate } = useSelector(selectors.selectQuestionnaire); + const translatePrefix = relationshipStatus === "single" ? "single" : "with-partner"; + + // const { animationData } = useLottie({ + // loadKey: animations[headOrHeart as keyof typeof animations], + // }); + + const birthdate = useSelector(selectors.selectBirthdate); + const zodiacSign = getZodiacSignByDate(birthdate); + const zodiacSignPartner = getZodiacSignByDate(partnerBirthdate); + + const handleBack = () => { + navigate(-1); + }; + + const handleNext = () => { + // navigate(`${routes.client.compatibilityV3RelateFollowing()}/1`); + navigate(routes.client.compatibilityV3ScannedPhoto()); + }; + + return ( +
+ {/*
+ {animationData && ( + + )} +
*/} + + {headOrHeart === "both" && + translate(`/both.${translatePrefix}.title`, { + wonderful: ( + <b style={{ color: "#224e90" }}>{translate(`/both.${translatePrefix}.wonderful`)}</b> + ), + zodiacSign: ( + <b style={{ color: "#224e90" }}> + {translate(`zodiac_signs.${zodiacSign?.toLowerCase()}`)} + </b> + ), + partnerZodiacSign: ( + <b style={{ color: "#224e90" }}> + {translate(`zodiac_signs.${zodiacSignPartner?.toLowerCase()}`)} + </b> + ), + gender: translate(gender?.toLowerCase()).toLowerCase(), + partnerGender: translate(partnerGender?.toLowerCase()).toLowerCase() + })} + {headOrHeart === "head" && + translate(`/with-head.${translatePrefix}.title`, { + zodiacSign: ( + <b style={{ color: "#224e90" }}> + {translate(`zodiac_signs.${zodiacSign?.toLowerCase()}`)} + </b> + ), + partnerZodiacSign: ( + <b style={{ color: "#224e90" }}> + {translate(`zodiac_signs.${zodiacSignPartner?.toLowerCase()}`)} + </b> + ), + gender: translate(gender?.toLowerCase()).toLowerCase(), + partnerGender: translate(partnerGender?.toLowerCase()).toLowerCase() + })} + {headOrHeart === "heart" && + translate(`/with-heart.${translatePrefix}.title`, { + zodiacSign: ( + <b style={{ color: "#224e90" }}> + {translate(`zodiac_signs.${zodiacSign?.toLowerCase()}`)} + </b> + ), + partnerZodiacSign: ( + <b style={{ color: "#224e90" }}> + {translate(`zodiac_signs.${zodiacSignPartner?.toLowerCase()}`)} + </b> + ), + gender: translate(gender?.toLowerCase()).toLowerCase(), + partnerGender: translate(partnerGender?.toLowerCase()).toLowerCase() + })} + {headOrHeart === "depends" && + translate(`/depends.${translatePrefix}.title`, { + zodiacSign: ( + <b style={{ color: "#224e90" }}> + {translate(`zodiac_signs.${zodiacSign?.toLowerCase()}`)} + </b> + ), + partnerZodiacSign: ( + <b style={{ color: "#224e90" }}> + {translate(`zodiac_signs.${zodiacSignPartner?.toLowerCase()}`)} + </b> + ), + gender: translate(gender?.toLowerCase()).toLowerCase(), + partnerGender: translate(partnerGender?.toLowerCase()).toLowerCase() + }) + } + +
+ + +
+
+ ); +} + +export default HeadOrHeartResult; diff --git a/src/components/CompatibilityV3/pages/HeadOrHeartResult/styles.module.scss b/src/components/CompatibilityV3/pages/HeadOrHeartResult/styles.module.scss new file mode 100644 index 0000000..1923935 --- /dev/null +++ b/src/components/CompatibilityV3/pages/HeadOrHeartResult/styles.module.scss @@ -0,0 +1,29 @@ +.title { + font-size: 23px; + font-weight: normal; +} + +.buttons-container { + display: flex; + flex-direction: row; + justify-content: space-between; + padding-top: 24px; + + & > .button { + width: 48%; + min-width: 0px; + font-size: 23px; + height: 44px; + min-height: 0px; + + &.back-button { + background: none; + color: #2c2c2c; + border: solid #2c2c2c 2px; + } + } +} + +.lottie-animation { + aspect-ratio: 128 / 82; +} diff --git a/src/components/CompatibilityV3/pages/LetScan/index.tsx b/src/components/CompatibilityV3/pages/LetScan/index.tsx new file mode 100644 index 0000000..d49f00b --- /dev/null +++ b/src/components/CompatibilityV3/pages/LetScan/index.tsx @@ -0,0 +1,47 @@ +import routes from "@/routes"; +import styles from "./styles.module.scss"; +import Title from "@/components/Title"; +import Button from "../../components/Button"; +import { useNavigate } from "react-router-dom"; +import BiometricData from "@/components/palmistry/biometric-data/biometric-data"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; +import { ELottieKeys, useLottie } from "@/hooks/lottie/useLottie"; +import { DotLottieReact } from "@lottiefiles/dotlottie-react"; + +function LetScan() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + const navigate = useNavigate(); + const { animationData } = useLottie({ + loadKey: ELottieKeys.letScan, + }); + + const handleNext = () => { + navigate(routes.client.compatibilityV3ScanInstruction()); + }; + + return ( +
+
+ {animationData && + } +
+ + {translate("/let-scan.title")} + +

{translate("/let-scan.text")}

+ + +
+ ); +} + +export default LetScan; diff --git a/src/components/CompatibilityV3/pages/LetScan/styles.module.scss b/src/components/CompatibilityV3/pages/LetScan/styles.module.scss new file mode 100644 index 0000000..5660910 --- /dev/null +++ b/src/components/CompatibilityV3/pages/LetScan/styles.module.scss @@ -0,0 +1,44 @@ +.page { + width: 100%; + display: flex; + flex-direction: column; + align-items: center; +} + +.image { + margin-top: 80px; +} + +.title { + margin-top: 36px; +} + +.text { + font-size: 20px; + text-align: center; + line-height: 125%; +} + +.button { + margin-top: 30px; +} + +.biometric { + text-align: center; + line-height: 125%; + margin-top: 20px; + + &>svg { + display: none; + } +} + +.lottie-animation-container { + width: 323px; + min-height: 245px; +} + +.lottie-animation { + aspect-ratio: 116 / 87; + width: 323px; +} \ No newline at end of file diff --git a/src/components/CompatibilityV3/pages/PalmsInformation/index.tsx b/src/components/CompatibilityV3/pages/PalmsInformation/index.tsx new file mode 100644 index 0000000..debe2b7 --- /dev/null +++ b/src/components/CompatibilityV3/pages/PalmsInformation/index.tsx @@ -0,0 +1,95 @@ +import routes from "@/routes"; +import styles from "./styles.module.scss"; +import Title from "@/components/Title"; +import Button from "../../components/Button"; +import Policy from "@/components/Policy"; +import { useTranslations } from "@/hooks/translations"; +import { useNavigate } from "react-router-dom"; +import { ELocalesPlacement } from "@/locales"; +// import { DotLottieReact } from "@lottiefiles/dotlottie-react"; +import { ELottieKeys, useLottie } from "@/hooks/lottie/useLottie"; +import { selectors } from "@/store"; +import { useSelector } from "react-redux"; +import { images } from "../../data"; +import { getZodiacSignByDate } from "@/services/zodiac-sign"; + +function PalmsInformation() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + const { gender, birthdate } = useSelector(selectors.selectQuestionnaire); + const zodiacSign = getZodiacSignByDate(birthdate); + const navigate = useNavigate(); + // const { animationData } = + useLottie({ + // loadKey: ELottieKeys.handSymbols, + preloadKey: ELottieKeys.scalesHeadPalmistry, + }); + + const handleNext = () => { + navigate(routes.client.compatibilityV3RelationshipStatus()); + }; + + return ( +
+ {/* {animationData && ( + + )} */} +
+ Zodiac sign +
+ + {translate(`/palms-information.${zodiacSign.toLowerCase()}.title`)} + +

+ {translate(`/palms-information.${zodiacSign.toLowerCase()}.description`, { + br:
, + })} +

+ + + {translate("privacy_policy", { + eulaLink: ( + + {translate("eula_link")} + + ), + privacyLink: ( + + {translate("privacy_notice")} + + ), + clickHere: ( + + {translate("policy_here")} + + ), + })} + +
+ ); +} + +export default PalmsInformation; diff --git a/src/components/CompatibilityV3/pages/PalmsInformation/styles.module.scss b/src/components/CompatibilityV3/pages/PalmsInformation/styles.module.scss new file mode 100644 index 0000000..bd40adf --- /dev/null +++ b/src/components/CompatibilityV3/pages/PalmsInformation/styles.module.scss @@ -0,0 +1,59 @@ +.page-container { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + padding-top: 16px; +} + +.title { + font-size: 27px; + text-align: left; + font-weight: 500; + margin-top: 42px; + max-width: 400px; +} + +.lottie-animation { + aspect-ratio: 233 / 261; + max-width: 360px; +} + +.zodiac { + position: relative; + width: 100%; + display: flex; + justify-content: center; + align-items: center; + margin-bottom: -150px; + + & > img { + height: 100%; + position: relative; + z-index: -2; + } + + &::after { + content: ""; + position: absolute; + bottom: 0; + left: 0; + width: 100%; + height: 60%; + background: linear-gradient(to bottom, + rgba(255, 255, 255, 0) 0%, + rgba(255, 255, 255, .7) 10%, + rgba(255, 255, 255, 1) 15%, + rgba(255, 255, 255, 1) 30%, + rgba(255, 255, 255, 1) 40%, + rgba(255, 255, 255, 1) 100%); + pointer-events: none; + z-index: -1; + } +} + +.description { + white-space: pre-line; + margin-bottom: 24px; +} \ No newline at end of file diff --git a/src/components/CompatibilityV3/pages/PalmsInformationPartner/index.tsx b/src/components/CompatibilityV3/pages/PalmsInformationPartner/index.tsx new file mode 100644 index 0000000..8dfca37 --- /dev/null +++ b/src/components/CompatibilityV3/pages/PalmsInformationPartner/index.tsx @@ -0,0 +1,93 @@ +import routes from "@/routes"; +import styles from "./styles.module.scss"; +import Title from "@/components/Title"; +import Button from "../../components/Button"; +import { useTranslations } from "@/hooks/translations"; +import { useNavigate } from "react-router-dom"; +import { ELocalesPlacement } from "@/locales"; +// import { DotLottieReact } from "@lottiefiles/dotlottie-react"; +import { ELottieKeys, useLottie } from "@/hooks/lottie/useLottie"; +import { selectors } from "@/store"; +import { useSelector } from "react-redux"; +import { images } from "../../data"; +import { getZodiacSignByDate } from "@/services/zodiac-sign"; + +function PalmsInformationPartner() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + const { partnerGender, partnerBirthdate } = useSelector(selectors.selectQuestionnaire); + + const zodiacSign = getZodiacSignByDate(partnerBirthdate); + const navigate = useNavigate(); + // const { animationData } = + useLottie({ + // loadKey: ELottieKeys.handSymbols, + preloadKey: ELottieKeys.scalesHeadPalmistry, + }); + + const handleNext = () => { + navigate(routes.client.compatibilityV3DateEvent()); + }; + + return ( +
+ {/* {animationData && ( + + )} */} +
+ Zodiac sign +
+ + {translate(`/palms-information-partner.${zodiacSign?.toLowerCase()}.title`)} + +

+ {translate(`/palms-information-partner.${zodiacSign?.toLowerCase()}.description`)} +

+ + {/* + {translate("privacy_policy", { + eulaLink: ( + + {translate("eula_link")} + + ), + privacyLink: ( + + {translate("privacy_notice")} + + ), + clickHere: ( + + {translate("policy_here")} + + ), + })} + */} +
+ ); +} + +export default PalmsInformationPartner; diff --git a/src/components/CompatibilityV3/pages/PalmsInformationPartner/styles.module.scss b/src/components/CompatibilityV3/pages/PalmsInformationPartner/styles.module.scss new file mode 100644 index 0000000..bd40adf --- /dev/null +++ b/src/components/CompatibilityV3/pages/PalmsInformationPartner/styles.module.scss @@ -0,0 +1,59 @@ +.page-container { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + padding-top: 16px; +} + +.title { + font-size: 27px; + text-align: left; + font-weight: 500; + margin-top: 42px; + max-width: 400px; +} + +.lottie-animation { + aspect-ratio: 233 / 261; + max-width: 360px; +} + +.zodiac { + position: relative; + width: 100%; + display: flex; + justify-content: center; + align-items: center; + margin-bottom: -150px; + + & > img { + height: 100%; + position: relative; + z-index: -2; + } + + &::after { + content: ""; + position: absolute; + bottom: 0; + left: 0; + width: 100%; + height: 60%; + background: linear-gradient(to bottom, + rgba(255, 255, 255, 0) 0%, + rgba(255, 255, 255, .7) 10%, + rgba(255, 255, 255, 1) 15%, + rgba(255, 255, 255, 1) 30%, + rgba(255, 255, 255, 1) 40%, + rgba(255, 255, 255, 1) 100%); + pointer-events: none; + z-index: -1; + } +} + +.description { + white-space: pre-line; + margin-bottom: 24px; +} \ No newline at end of file diff --git a/src/components/CompatibilityV3/pages/Payment/index.tsx b/src/components/CompatibilityV3/pages/Payment/index.tsx new file mode 100644 index 0000000..a848418 --- /dev/null +++ b/src/components/CompatibilityV3/pages/Payment/index.tsx @@ -0,0 +1,180 @@ +import { useSelector } from "react-redux"; +import PaymentInformation from "../../components/PaymentInformation"; +import styles from "./styles.module.scss"; +import { selectors } from "@/store"; +import { getFormattedPrice } from "@/utils/price.utils"; +import Guarantees from "../../components/Guarantees"; +import Button from "../../components/Button"; +import { addCurrency, ELocalesPlacement } from "@/locales"; +import { useTranslations } from "@/hooks/translations"; +import Stars from "../../components/Stars"; +import { usePaywall } from "@/hooks/paywall/usePaywall"; +import { EPlacementKeys } from "@/api/resources/Paywall"; +import { useNavigate } from "react-router-dom"; +import { useEffect } from "react"; +import routes from "@/routes"; + +// const placementKey = EPlacementKeys['aura.placement.compatibility.v3']; + +function Payment() { + const navigate = useNavigate(); + const { products, currency, getText } = usePaywall({ + placementKey: EPlacementKeys["aura.placement.compatibility.v3"], + localesPlacement: ELocalesPlacement.CompatibilityV3, + }); + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + const activeProductFromStore = useSelector(selectors.selectActiveProduct); + + const trialPrice = activeProductFromStore?.trialPrice || 0; + const fullPrice = activeProductFromStore?.price || 0; + // const isShowPaymentModal = useSelector( + // selectors.selectCompatibilityV3IsShowPaymentModalV1 + // ); + // const [isPaymentSuccess, setIsPaymentSuccess] = useState(false); + // const [isPaymentError, setIsPaymentError] = useState(false); + // const [isPaymentModalOpen, setIsPaymentModalOpen] = useState(false); + + // const onPaymentError = (error?: string) => { + // setIsPaymentError(true); + // if (error === "Product not found") { + // return navigate(routes.client.compatibilityV3TrialChoice()); + // } + // metricService.reachGoal(EGoals.PAYMENT_ERROR, [EMetrics.YANDEX, EMetrics.KLAVIYO]); + // } + + // const onPaymentSuccess = () => { + // setIsPaymentSuccess(true); + // // metricService.reachGoal(EGoals.PAYMENT_SUCCESS); + // // if (activeProductFromStore) { + // // metricService.reachGoal(EGoals.PURCHASE, [EMetrics.FACEBOOK], { + // // currency: "USD", + // // value: ((activeProductFromStore.trialPrice || 100) / 100).toFixed(2), + // // }); + // // } + + // metricService.reachGoal(EGoals.PAYMENT_SUCCESS, [EMetrics.YANDEX, EMetrics.KLAVIYO]); + // metricService.reachGoal(EGoals.PURCHASE, [EMetrics.FACEBOOK], { + // currency: "USD", + // value: ((activeProductFromStore?.trialPrice || 100) / 100).toFixed(2), + // }); + // setTimeout(() => { + // navigate(routes.client.compatibilityV3SkipTrial()); + // }, 1500); + // } + + // const onModalClosed = () => { + // setIsPaymentModalOpen(false); + // navigate(routes.client.compatibilityV3SaveOff()); + // } + + const handlePayment = () => { + // dispatch(actions.compatibilityV3.setIsShowPaymentModalV1(true)); + // metricService.reachGoal(EGoals.PAYMENT_METHODS_OPENED, [EMetrics.YANDEX, EMetrics.KLAVIYO]); + // metricService.reachGoal(EGoals.AURA_PAYMENT_METHODS_OPENED, [EMetrics.KLAVIYO]); + // setIsPaymentModalOpen(true); + navigate(routes.client.compatibilityV3PaymentModal()); + }; + + // useEffect(() => { + // window.onpopstate = function (_event) { + // if (document.location.toString() === `${window.location.origin}${routes.client.compatibilityV3TrialPayment()}`) { + // return navigate(routes.client.compatibilityV3SaveOff()); + // } + // }; + // return () => { + // setTimeout(() => { + // window.onpopstate = null; + // }, 0); + // }; + + // }, []) + + useEffect(() => { + if (!products.length) return; + const _targetProduct = products.find(product => product._id === activeProductFromStore?._id); + if (!_targetProduct || !activeProductFromStore) { + navigate(routes.client.compatibilityV3TrialChoice()); + } + }, [products, activeProductFromStore]); + + return ( + <> + {/* + + */} +
+

+ {translate("/payment.app_number_one", { + color: {translate("/payment.app_number_one_color")}, + })} +

+ +
+ +
+ {translate("/payment.will_be_charged", { + // trialPrice: addCurrency(getFormattedPrice(trialPrice), currency), + // fullPrice: ( + // {addCurrency(getFormattedPrice(fullPrice), currency)} + // ), + splitPrice: addCurrency(getFormattedPrice( + ( + fullPrice / ( + Number(getText("split.price.value")) || 2 + ) + ) + ), currency), + save: addCurrency( + getFormattedPrice(fullPrice - trialPrice), + currency + ), + emailReminder: ( + {translate("/payment.will_be_charged_email_reminder")} + ), + trialInfo: ( + + {translate("/payment.will_be_charged_trial_info", { + trialDuration: activeProductFromStore?.trialDuration, + trialPrice: addCurrency( + getFormattedPrice(trialPrice), + currency + ), + })} + + ), + })} +
+ + {/* {!isShowPaymentModal && ( */} + + {/* )} */} + {/* {isPaymentError && ( + +

Something went wrong

+
+ + )} + {isPaymentSuccess && ( + +

Payment successful

+
+ + )} */} + + + ); +} + +export default Payment; diff --git a/src/components/CompatibilityV3/pages/Payment/styles.module.scss b/src/components/CompatibilityV3/pages/Payment/styles.module.scss new file mode 100644 index 0000000..deb04c4 --- /dev/null +++ b/src/components/CompatibilityV3/pages/Payment/styles.module.scss @@ -0,0 +1,56 @@ +.prices-description { + font-size: 14px; + line-height: 125%; + margin-top: 12px; +} + +.button { + position: sticky; + bottom: calc(0dvh + 26px); + max-width: 343px; + font-size: 24px; + margin-top: 16px; +} + +.payment-modal-hide { + transform: translateY(150%); +} + +.payment-modal-active { + animation: appearance 1s; +} + +@keyframes appearance { + 0% { + transform: translateY(150%); + } + + 100% { + transform: translateY(0); + } +} + +.app-number-one { + max-width: 240px; + text-align: center; + font-size: 14px; + line-height: 18.2px; + display: flex; + flex-direction: column; + align-items: center; + gap: 8px; + + & span { + color: #224e90; + } +} + +.toast { + position: fixed; + bottom: calc(0dvh + 16px); + width: 100%; + max-width: 343px; + left: 50%; + transform: translateX(-50%); + z-index: 1000; +} \ No newline at end of file diff --git a/src/components/CompatibilityV3/pages/RelateFollowing/index.tsx b/src/components/CompatibilityV3/pages/RelateFollowing/index.tsx new file mode 100644 index 0000000..2b29174 --- /dev/null +++ b/src/components/CompatibilityV3/pages/RelateFollowing/index.tsx @@ -0,0 +1,94 @@ +import { Navigate, useNavigate, useParams } from "react-router-dom"; +import styles from "./styles.module.scss"; +import routes from "@/routes"; +import Title from "@/components/Title"; +import { useEffect, useMemo, useState } from "react"; +import { sleep } from "@/services/date"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; +import { useSession } from "@/hooks/session/useSession"; +import { ESourceAuthorization } from "@/api/resources/User"; + +function RelateFollowing() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + const { updateSession } = useSession(); + const navigate = useNavigate(); + const { questionId } = useParams(); + const [activeButton, setActiveButton] = useState(); + + const questions: { + id: "partner_expectations"; + title: string; + }[] = useMemo( + () => [ + { + id: "partner_expectations", + title: translate("/relate-following.question1"), + }, + // { + // id: "romantic_gestures", + // title: translate("/relate-following.question2"), + // }, + // { + // id: "checking_phone", + // title: translate("/relate-following.question3"), + // }, + ], + [translate] + ); + useEffect(() => { + setActiveButton(null); + }, [questionId]); + + if (!questionId) + return ; + + const handleClick = async (answerIndex: number) => { + setActiveButton(answerIndex); + updateSession( + { + answers: { + [questions[parseInt(questionId) - 1].id]: answerIndex + 1 as 1 | 2 | 3 | 4 | 5, + }, + }, + ESourceAuthorization["aura.compatibility.v3"] + ); + await sleep(400); + if (Number(questionId) < questions.length) { + return navigate( + `${routes.client.compatibilityV3RelateFollowing()}/${Number(questionId) + 1 + }` + ); + } + return navigate(routes.client.compatibilityV3RomanticGestures()); + }; + + return ( +
+ + {translate("/relate-following.title")} + + {/*

+ {questions[parseInt(questionId) - 1].title} +

*/} +
+ {Array.from({ length: 5 }).map((_, index) => ( + + ))} +
+
+ {translate("/relate-following.strongly_disagree")} + {translate("/relate-following.strongly_agree")} +
+
+ ); +} + +export default RelateFollowing; diff --git a/src/components/CompatibilityV3/pages/RelateFollowing/styles.module.scss b/src/components/CompatibilityV3/pages/RelateFollowing/styles.module.scss new file mode 100644 index 0000000..bde342c --- /dev/null +++ b/src/components/CompatibilityV3/pages/RelateFollowing/styles.module.scss @@ -0,0 +1,62 @@ +.title { + font-size: 27px; + text-align: center; + margin-bottom: 16px; +} + +.question { + width: 85%; + margin: 0 auto; + text-align: center; + line-height: 125%; + font-size: 20px; +} + +.buttons-container { + width: 100%; + display: flex; + flex-direction: row; + justify-content: center; + gap: 11px; + margin-top: 30px; + + & > .button { + display: flex; + align-items: center; + justify-content: center; + text-align: center; + width: 60px; + height: 60px; + background-color: #f1f1f1; + border: none; + border-radius: 5px; + box-shadow: 0px 3px 3px #00000024; + font-size: 29px; + color: #000; + cursor: pointer; + + &.selected { + background-color: #fff; + outline: solid #3f70b8 2px; + } + } +} + +.buttons-text-container { + width: 100%; + max-width: 344px; + display: flex; + flex-direction: row; + justify-content: space-between; + margin: 30px auto 0; + gap: 8px; + + & > span { + width: fit-content; + font-size: 20px; + line-height: 125%; + font-weight: 500; + max-width: 84px; + text-align: left; + } +} diff --git a/src/components/CompatibilityV3/pages/RelationshipStatus/index.tsx b/src/components/CompatibilityV3/pages/RelationshipStatus/index.tsx new file mode 100644 index 0000000..3a54fd5 --- /dev/null +++ b/src/components/CompatibilityV3/pages/RelationshipStatus/index.tsx @@ -0,0 +1,87 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.scss"; +import Answer from "../../components/Answer"; +import { useDispatch, useSelector } from "react-redux"; +import { actions, selectors } from "@/store"; +import { sleep } from "@/services/date"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; +import { answerTimeOut } from "../../data"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; +import { useMemo } from "react"; +import { ELottieKeys, useLottie } from "@/hooks/lottie/useLottie"; +import { useSession } from "@/hooks/session/useSession"; +import { IAnswersSessionCompatibilityV3 } from "@/api/resources/Session"; +import { ESourceAuthorization } from "@/api/resources/User"; + +function RelationshipStatus() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + const { updateSession } = useSession(); + const navigate = useNavigate(); + const dispatch = useDispatch(); + const { relationshipStatus } = useSelector( + selectors.selectCompatibilityV3Answers + ); + useLottie({ + preloadKey: ELottieKeys.scalesNeutralPalmistry, + }); + + const answers: { + id: IAnswersSessionCompatibilityV3["relationship_status"]; + title: string; + }[] = useMemo( + () => [ + { + id: "single", + title: translate("/relationship-status.answer1"), + }, + { + id: "in_relationship", + title: translate("/relationship-status.answer2"), + }, + { + id: "engaged", + title: translate("/relationship-status.answer3"), + }, + { + id: "divorced", + title: translate("/relationship-status.answer4"), + }, + // { + // id: "complicated", + // title: translate("/relationship-status.answer5"), + // }, + ], + [translate] + ); + + const handleClick = async (id: IAnswersSessionCompatibilityV3["relationship_status"]) => { + dispatch(actions.compatibilityV3Answers.update({ relationshipStatus: id })); + updateSession({ + answers: { + relationship_status: id, + }, + }, ESourceAuthorization["aura.compatibility.v3"]); + if (id !== relationshipStatus) await sleep(answerTimeOut); + navigate(`${routes.client.compatibilityV3RelateFollowing()}/1`); + }; + + return ( +
+ + {translate("/relationship-status.title")} + + {answers.map((answers, index) => ( + handleClick(answers.id)} + /> + ))} +
+ ); +} + +export default RelationshipStatus; diff --git a/src/components/CompatibilityV3/pages/RelationshipStatus/styles.module.scss b/src/components/CompatibilityV3/pages/RelationshipStatus/styles.module.scss new file mode 100644 index 0000000..5bfbb7c --- /dev/null +++ b/src/components/CompatibilityV3/pages/RelationshipStatus/styles.module.scss @@ -0,0 +1,3 @@ +.container { + width: 100%; +} diff --git a/src/components/CompatibilityV3/pages/RomanticGestures/index.tsx b/src/components/CompatibilityV3/pages/RomanticGestures/index.tsx new file mode 100644 index 0000000..b172ba8 --- /dev/null +++ b/src/components/CompatibilityV3/pages/RomanticGestures/index.tsx @@ -0,0 +1,79 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.scss"; +import Answer from "../../components/Answer"; +import { useDispatch, useSelector } from "react-redux"; +import { actions, selectors } from "@/store"; +import { sleep } from "@/services/date"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; +import { answerTimeOut } from "../../data"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; +import { useMemo } from "react"; +import { ELottieKeys, useLottie } from "@/hooks/lottie/useLottie"; +import { useSession } from "@/hooks/session/useSession"; +import { IAnswersSessionCompatibilityV3 } from "@/api/resources/Session"; +import { ESourceAuthorization } from "@/api/resources/User"; + +function RomanticGestures() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + const { updateSession } = useSession(); + const navigate = useNavigate(); + const dispatch = useDispatch(); + const { romanticGestures } = useSelector( + selectors.selectCompatibilityV3Answers + ); + useLottie({ + preloadKey: ELottieKeys.scalesNeutralPalmistry, + }); + + const answers: { + id: IAnswersSessionCompatibilityV3["romantic_gestures"]; + title: string; + }[] = useMemo( + () => [ + { + id: "love", + title: translate("/romantic-gestures.answer1"), + }, + { + id: "neutral", + title: translate("/romantic-gestures.answer2"), + }, + { + id: "dislike", + title: translate("/romantic-gestures.answer3"), + }, + ], + [translate] + ); + + const handleClick = async (id: IAnswersSessionCompatibilityV3["romantic_gestures"]) => { + dispatch(actions.compatibilityV3Answers.update({ romanticGestures: id })); + updateSession({ + answers: { + romantic_gestures: id, + }, + }, ESourceAuthorization["aura.compatibility.v3"]); + if (id !== romanticGestures) await sleep(answerTimeOut); + navigate(routes.client.compatibilityV3CheckingPhone()); + }; + + return ( +
+ + {translate("/romantic-gestures.title")} + + {answers.map((answers, index) => ( + handleClick(answers.id)} + /> + ))} +
+ ); +} + +export default RomanticGestures; diff --git a/src/components/CompatibilityV3/pages/RomanticGestures/styles.module.scss b/src/components/CompatibilityV3/pages/RomanticGestures/styles.module.scss new file mode 100644 index 0000000..5bfbb7c --- /dev/null +++ b/src/components/CompatibilityV3/pages/RomanticGestures/styles.module.scss @@ -0,0 +1,3 @@ +.container { + width: 100%; +} diff --git a/src/components/CompatibilityV3/pages/SaveOff/index.tsx b/src/components/CompatibilityV3/pages/SaveOff/index.tsx new file mode 100644 index 0000000..3e3b462 --- /dev/null +++ b/src/components/CompatibilityV3/pages/SaveOff/index.tsx @@ -0,0 +1,79 @@ +import styles from "./styles.module.scss"; +import Blob from "../../images/SVG/Blob"; +import { images } from "../../data"; +import Title from "@/components/Title"; +import Button from "../../components/Button"; +import Blob2 from "../../images/SVG/Blob2"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; +import { usePaywall } from "@/hooks/paywall/usePaywall"; +import { EPlacementKeys } from "@/api/resources/Paywall"; +import { addCurrency, ELocalesPlacement } from "@/locales"; +import { useTranslations } from "@/hooks/translations"; +import { useEffect } from "react"; +import metricService, { EGoals, EMetrics } from "@/services/metric/metricService"; + +const placementKey = EPlacementKeys["aura.placement.compatibility.v3.secret.discount"] + +function SaveOff() { + const { translate } = useTranslations(ELocalesPlacement.EmailMarketingCompatibilityV3); + const { products, currency, getText } = usePaywall({ + placementKey, + localesPlacement: ELocalesPlacement.EmailMarketingCompatibilityV3, + }); + // const activeProductFromStore = useSelector(selectors.selectActiveProduct); + // const activeProduct = products.find(product => product?.trialPrice === activeProductFromStore?.trialPrice) || products[0] + const activeProduct = products[0] + const trialPrice = (activeProduct?.trialPrice || 0) / 100; + const trialDuration = activeProduct?.trialDuration || 7; + + const navigate = useNavigate(); + + const handleNext = () => { + navigate(routes.client.compatibilityV3SecretDiscount()); + } + + useEffect(() => { + metricService.reachGoal(EGoals.DISCOUNT_PAGE_VISIT, [EMetrics.YANDEX, EMetrics.KLAVIYO]); + }, []); + + return ( + <> + + + gift + + {translate("save-off.title", { discount: getText("discount") })} + +

+ {translate("save-off.instead", { + price: {addCurrency(trialPrice, currency)}, + oldPrice: + {translate("save-off.instead-old-price", { + oldPrice: addCurrency(getText("old.price") as string, currency) + })} + + })} +

+

+ fire + {translate("save-off.trial-duration", { + // days: trialDuration + trialDuration: trialDuration, + oldTrialDuration: {translate("save-off.old-trial-duration", { + oldTrialDuration: getText("old.trial.duration") + })}, + })} +

+

+ gift + {translate("save-off.discount-offer", { discount: getText("discount") })} +

+ + + ) +} + +export default SaveOff \ No newline at end of file diff --git a/src/components/CompatibilityV3/pages/SaveOff/styles.module.scss b/src/components/CompatibilityV3/pages/SaveOff/styles.module.scss new file mode 100644 index 0000000..7da3cfa --- /dev/null +++ b/src/components/CompatibilityV3/pages/SaveOff/styles.module.scss @@ -0,0 +1,66 @@ +.blob { + position: absolute; + top: 0; + right: 0; + z-index: -1; +} + +.blob2 { + position: absolute; + bottom: 0; + right: 0; + z-index: -1; +} + +.gift { + margin-top: 24px; +} + +.title { + margin-top: 32px; + margin-bottom: 14px; + font-size: 32px; + line-height: 26px; + font-weight: 600; + color: #275CA7; +} + +.description { + font-size: 18px; + line-height: 24px; + font-weight: 400; + color: #363636; + + &>.price { + font-weight: 600; + background: linear-gradient(90deg, #FFA1BA 0%, #9A55FF 100%); + background-clip: text; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + } + + &>.discount { + text-decoration: line-through; + } +} + +.point { + width: 100%; + display: flex; + align-items: center; + justify-content: start; + gap: 8px; + font-size: 14px; + line-height: 21px; + font-weight: 600; + color: #2c2c2c; + margin-top: 6px; +} + +.button { + height: 54px; + margin-top: 16px; + font-size: 18px; + line-height: 21px; + font-weight: 600; +} \ No newline at end of file diff --git a/src/components/CompatibilityV3/pages/ScanInstruction/index.tsx b/src/components/CompatibilityV3/pages/ScanInstruction/index.tsx new file mode 100644 index 0000000..6a02ef6 --- /dev/null +++ b/src/components/CompatibilityV3/pages/ScanInstruction/index.tsx @@ -0,0 +1,41 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.scss"; +import routes from "@/routes"; +import Button from "../../components/Button"; +import BiometricData from "@/components/palmistry/biometric-data/biometric-data"; +import { useNavigate } from "react-router-dom"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; +import ScanInstructionSVG from "../../images/SVG/ScanInstruction"; +import { usePreloadImages } from "@/hooks/preload/images"; + +function ScanInstruction() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + const navigate = useNavigate(); + usePreloadImages([ + "/v1/palmistry/love-line.svg", + "/v1/palmistry/head-line.svg", + "/v1/palmistry/life-line.svg", + "/v1/palmistry/fate-line.svg", + "/v1/palmistry/hand-little-finger.svg", + ]); + + const handleClick = () => { + navigate(routes.client.compatibilityV3Camera()); + }; + + return ( +
+ + {translate("/scan-instruction.title")} + + + + +
+ ); +} + +export default ScanInstruction; diff --git a/src/components/CompatibilityV3/pages/ScanInstruction/styles.module.scss b/src/components/CompatibilityV3/pages/ScanInstruction/styles.module.scss new file mode 100644 index 0000000..b5e2f5f --- /dev/null +++ b/src/components/CompatibilityV3/pages/ScanInstruction/styles.module.scss @@ -0,0 +1,27 @@ +.page { + width: 100%; + display: flex; + flex-direction: column; + align-items: center; +} + +.button { + margin-top: 40px; +} + +.description { + font-style: 14px; + line-height: 125%; + text-align: center; + margin-top: 20px; +} + +.biometric { + text-align: center; + line-height: 125%; + margin-top: 20px; + + & > svg { + display: none; + } +} diff --git a/src/components/CompatibilityV3/pages/ScannedPhoto/index.tsx b/src/components/CompatibilityV3/pages/ScannedPhoto/index.tsx new file mode 100644 index 0000000..4128360 --- /dev/null +++ b/src/components/CompatibilityV3/pages/ScannedPhoto/index.tsx @@ -0,0 +1,322 @@ +import { useSelector } from "react-redux"; +import styles from "./styles.module.scss"; +import { selectors } from "@/store"; +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; +// import { IPalmistryLine } from "@/api/resources/Palmistry"; +import Title from "@/components/Title"; +// import { ICompatibilityV3FingerLocal } from "@/store/compatibilityV3"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; +// import ScannedPhotoElement from "@/components/palmistry/scanned-photo/scanned-photo"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; +import ProgressBarLine from "@/components/ui/ProgressBarLine"; +import Modal from "@/components/Modal"; +import { useAuthentication } from "@/hooks/authentication/use-authentication"; +import { ESourceAuthorization } from "@/api/resources/User"; + +// const drawElementChangeDelay = 1500; +// const startDelay = 500; + +interface IPoint { + title1: string; + title2: string; + modal: { + title: string; + description: string; + answerLeft: string; + answerRight: string; + } +} + +function ScannedPhoto() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + const navigate = useNavigate(); + // const photo = useSelector(selectors.selectCompatibilityV3Photo); + // const fingers = useSelector(selectors.selectCompatibilityV3Fingers); + // const lines = useSelector(selectors.selectCompatibilityV3Lines); + + // const changeTitleTimeOut = useRef(); + + // const [currentElementIndex, setCurrentElementIndex] = useState(0); + // const [title, setTitle] = useState(""); + // const [shouldDisplayPalmLines, setShouldDisplayPalmLines] = useState(false); + // const [smallPhotoState, setSmallPhotoState] = useState(false); + const [isDecorationShown, setIsDecorationShown] = useState(true); + // const [classNameScannedPhoto, setClassNameScannedPhoto] = useState(""); + + const feature = useSelector(selectors.selectFeature); + const isIOSPath = useMemo(() => feature?.toLowerCase()?.includes("ios"), [feature]); + const authCode = useSelector(selectors.selectAuthCode); + + const { authorization } = useAuthentication(); + + // const drawElements = useMemo(() => [...fingers, ...lines], [fingers, lines]); + + const { relationshipStatus } = useSelector(selectors.selectCompatibilityV3Answers) + + const loadingProfilePoints: IPoint[] = useMemo(() => { + const prefix = relationshipStatus === "single" ? "without-partner" : "with-partner"; + return [ + { + title1: `/scanned-photo.${prefix}.loaders.title-1-1`, + title2: `/scanned-photo.${prefix}.loaders.title-1-2`, + modal: { + title: `/scanned-photo.${prefix}.modals.title-1`, + description: `/scanned-photo.${prefix}.modals.description-1`, + answerLeft: `/scanned-photo.${prefix}.modals.answer-1-left`, + answerRight: `/scanned-photo.${prefix}.modals.answer-1-right`, + } + }, + { + title1: `/scanned-photo.${prefix}.loaders.title-2-1`, + title2: `/scanned-photo.${prefix}.loaders.title-2-2`, + modal: { + title: `/scanned-photo.${prefix}.modals.title-2`, + description: `/scanned-photo.${prefix}.modals.description-2`, + answerLeft: `/scanned-photo.${prefix}.modals.answer-2-left`, + answerRight: `/scanned-photo.${prefix}.modals.answer-2-right`, + } + }, + { + title1: `/scanned-photo.${prefix}.loaders.title-3-1`, + title2: `/scanned-photo.${prefix}.loaders.title-3-2`, + modal: { + title: `/scanned-photo.${prefix}.modals.title-3`, + description: `/scanned-photo.${prefix}.modals.description-3`, + answerLeft: `/scanned-photo.${prefix}.modals.answer-3-left`, + answerRight: `/scanned-photo.${prefix}.modals.answer-3-right`, + } + }, + ] + }, []); + + useEffect(() => { + if (isIOSPath) { + (async () => { + await authorization("", ESourceAuthorization["aura.compatibility.v3"], true); + })(); + } + }, [isIOSPath, authorization]) + + // useEffect(() => { + // if (!drawElements[currentElementIndex]) return; + // changeTitleTimeOut.current = setTimeout(() => { + // const title = + // (drawElements[currentElementIndex] as ICompatibilityV3FingerLocal) + // .fingerName || drawElements[currentElementIndex].name; + // setTitle(title); + // if (currentElementIndex < drawElements.length - 1) { + // setCurrentElementIndex((prevState) => prevState + 1); + // } + // }, drawElementChangeDelay); + + // return () => { + // if (changeTitleTimeOut.current) { + // clearTimeout(changeTitleTimeOut.current); + // } + // }; + // }, [currentElementIndex, drawElements]); + + // useEffect(() => { + // if (currentElementIndex < drawElements.length - 1) return; + + // const timer = setTimeout(() => { + // setTitle(""); + // }, drawElementChangeDelay * 2) + + // return () => { + // if (timer) { + // clearTimeout(timer); + // } + // } + // }, [currentElementIndex, drawElements]) + + // useEffect(() => { + // setShouldDisplayPalmLines( + // lines.includes(drawElements[currentElementIndex] as IPalmistryLine) + // ); + // }, [currentElementIndex, drawElements, lines]); + + // useEffect(() => { + // if (currentElementIndex < drawElements.length - 1) return; + // const timer = setTimeout(() => { + // setSmallPhotoState(true); + // }, drawElementChangeDelay * 2); + // const goNextTimer = setTimeout( + // () => { + // // navigate(routes.client.3Email()) + // setIsDecorationShown(false); + // setClassNameScannedPhoto(styles.scannedPhotoSmall); + // }, + // drawElementChangeDelay * drawElements.length + 8000 + // ); + + // return () => { + // if (timer) { + // clearTimeout(timer); + // } + // if (goNextTimer) { + // clearTimeout(goNextTimer); + // } + // }; + // }, [currentElementIndex, drawElements.length, navigate]); + + + const [progress, setProgress] = useState(0); + const [isPause, setIsPause] = useState(false); + const interval = useRef(); + + const getProgressValue = useCallback( + (index: number) => { + const integerDivision = Math.floor(progress / 100); + if (integerDivision > index) { + return 100; + } + if (integerDivision === index) { + return progress % 100; + } + return 0; + }, + [progress] + ); + + const onEndLoading = useCallback(() => { + const isIOS = /iPhone|iPad|iPod/i.test(navigator.userAgent); + if (isIOSPath && !!authCode && isIOS) { + return navigate(routes.client.compatibilityV3TryApp()); + } + navigate(routes.client.compatibilityV3Email()); + }, [isIOSPath, authCode, navigate]); + + useEffect(() => { + if (progress === 75) { + setIsPause(true); + } + if (progress !== 0 && (progress / 50) % 2 === 1 && progress > 100) { + return setIsPause(true); + } + }, [progress]); + + useEffect(() => { + if (progress >= loadingProfilePoints.length * 100) { + return onEndLoading(); + } + interval.current = setTimeout(() => { + setProgress((prevProgress) => { + if (!isPause && !isDecorationShown) return prevProgress + 1; + return prevProgress; + }); + }, 100); + return () => { + clearTimeout(interval.current); + }; + }, [progress, onEndLoading, isPause, isDecorationShown]); + + const getCurrentIndex = () => { + return Math.floor(progress / 100); + }; + + useEffect(() => { + setIsDecorationShown(false); + }, []) + + return ( +
+ {/* + {title} + */} + {/* */} + {/*

+ {translate("/scanned-photo.title")} +

+ +

+ {translate("/scanned-photo.text")} +

*/} + + + {isPause && ( + setIsPause(false)} + className={styles.modal} + containerClassName={styles["modal-container"]} + > + + {translate(loadingProfilePoints[getCurrentIndex()].modal.title)} + +

+ {translate(loadingProfilePoints[getCurrentIndex()].modal.description)} +

+
+
setIsPause(false)}> +

+ {translate(loadingProfilePoints[getCurrentIndex()].modal.answerLeft)} +

+
+
setIsPause(false)}> +

+ {translate(loadingProfilePoints[getCurrentIndex()].modal.answerRight)} +

+
+
+
+ )} + {!isDecorationShown &&
+ {loadingProfilePoints.map(({ title1, title2 }, index) => ( +
(pointsRef.current[index] = el as HTMLDivElement)} + key={`point-${index}`} + > +
+ + {translate(getProgressValue(index) > 50 ? title2 : title1)} + + +
+

+ {getProgressValue(index)}% +

+
+ ))} +
} +
+ ); +} + +export default ScannedPhoto; diff --git a/src/components/CompatibilityV3/pages/ScannedPhoto/styles.module.scss b/src/components/CompatibilityV3/pages/ScannedPhoto/styles.module.scss new file mode 100644 index 0000000..dd7389b --- /dev/null +++ b/src/components/CompatibilityV3/pages/ScannedPhoto/styles.module.scss @@ -0,0 +1,315 @@ +.page { + width: 100%; + padding: 0 16px 16px; + margin: 0 auto; + max-width: 560px; + height: fit-content; + min-height: 100dvh; + display: flex; + flex-direction: column; + align-items: center; + gap: 0px; + + --font-family-main: "SF Pro Text", sans-serif; + --stone-grey: #95959d; + --button-color: #121620; + --svg-blue: var(--strong-blue); + --pale-lavender: #dee5f9; + --pale-lavender-20: #dee5f9; + --orange: #ff9649; + --coral: #ff5c5d; + --rich-blue: #2b7cf6; + --bright-white: #fbfbfb; + --bright-red: #ff5758; + --light-gray: #d9d9d9; + --vivid-yellow: #ffc700; + --pale-gray: #c2cad8; + --pale-green: #75db9c; + --pale-cerulean: #82b7ef; + --greyish: #afafaf; + --vivid-green: #00ff38; + --dark-charcoal: #191f2d; + --blueish-gray: #6b76aa; + --violet: #9949ff; + --light-lavender: #c5c5d1; + --pale-pink: #fcd3df; + --cream-yellow: #fffbcd; + --pale-aqua: #c9fae6; + --pale-seafoam: #d3f1e1; + --pale-lilac: #dec6fe; + --pale-peach: #fdddc8; + --deep-charcoal: #1e1e1e; + --black: #000; + --bright-sea-green: #04a777; + --deep-cornflower-blue: #4663b7; + --charcoal-grey: #505051; + --pale-light-cerulean: #acd1ff; + --main-gradient: #fff; + --strong-blue: #066fde; + --strong-blue-text: #066fde; + --strong-blue-80: rgba(6, 111, 222, 0.8); + --midnight-black: #121620; + --footer-small-text: #121620; + --button-active: #fff; + --button-background: var(--pale-blue); + --button-active-bg: var(--strong-blue); + --slate-blue: #6b7baa; + --slate-blue-placeholder: #6b7baa; + --pale-blue: #eff2fd; + --pale-blue-input: #eff2fd; + --midnight-black-input: #121620; + --greyish-blue: #8e8e93; + --soft-blue: #4a567a; + --soft-blue-gray: #4a567a; + --soft-blue-periwinkle: #4a567a; + --gentle-blue: #9babd9; + --gentle-blue-svg: #9babd9; + --light-silver: #c7c7c7; + --light-silver-to-white: #c7c7c7; + --light-silver-to-lilac-blue: #c7c7c7; + --light-cornflower-blue: #c2ceee; + --white: #fff; + --dark-blue: #202b47; + --progress-line: #00a3ff; + --footer-shield: #b5c4ff; + --blue-color-text: #0066fd; + --black-color-text: #0066fd; + --transparent-to-gold: transparent; + --transparent-to-white: transparent; + --transparent-to-periwinkle: transparent; + --white-to-transparent: #fff; + --loader-background: rgba(16, 32, 77, 0.35); +} + +.title { + min-height: 36px; + margin: 0; + font-size: 24px; + margin-bottom: 16px; + + &::first-letter { + text-transform: uppercase; + } +} + +.photo-container { + width: 100%; + height: fit-content; + position: relative; + // background-color: #cbcbcb; +} + +.scanned-photo { + width: 100%; +} + +.scannedPhotoSmall { + animation: small 2s ease-in-out forwards !important; + + :global(.scanned-photo__image-container) { + position: relative; + + &:after { + content: "✅"; + position: absolute; + top: 0; + right: 0; + font-size: 26px; + transform: translate(50%, -50%); + opacity: 0; + animation: appear 2s ease-in-out forwards; + } + } +} + +@keyframes appear { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} + +@keyframes small { + 0% { + height: 207px; + // align-items: center; + margin-top: 0; + margin-bottom: 0; + } + + 100% { + height: 157px; + // align-items: flex-start; + margin-top: -75px; + margin-bottom: -23px; + } +} + +.svg-objects { + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100%; +} + +.finger-point { + animation: finger-show 1s linear; + animation-fill-mode: forwards; + transform: scale(0); + transform-origin: center center; +} + +.line { + stroke-linecap: round; + stroke-linejoin: round; + stroke-width: 2px; + fill-rule: evenodd; + clip-rule: evenodd; + stroke-miterlimit: 1.5; + stroke-dasharray: 500; + stroke: #fff; + fill: none; + animation: line-show 1.5s linear; + animation-fill-mode: forwards; + + &.heart { + stroke: #f8d90f; + /* animation-delay: 4.5s; */ + } + + &.life { + stroke: #e51c39; + } + + &.head { + stroke: #00d114; + /* animation-delay: 1.5s; */ + } + + &.fate { + stroke: #05ced8; + /* animation-delay: 3s; */ + } +} + +@keyframes finger-show { + 100% { + transform: scale(1); + } +} + +@keyframes line-show { + 100% { + stroke-dashoffset: 0; + } +} + +.hidden { + opacity: 0; + display: none; +} + +@keyframes hide { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + display: none; + } +} + +.points-container { + width: 100%; + display: flex; + flex-direction: column; + margin-top: 24px; +} + +.points-container { + padding: 0 17px; + gap: 50px; +} + +.point { + display: flex; + flex-direction: row; + align-items: flex-end; + justify-content: space-between; + gap: 20px; +} + +.point__text-container { + width: calc(100% - 60px); + display: flex; + flex-direction: column; + gap: 4px; +} + +.point__title { + font-size: 15px; + line-height: 125%; + font-weight: normal; + margin: 0; + color: #000; + text-align: left; +} + +.point__percentage { + font-size: 16px; + font-weight: 600; + line-height: 125%; + color: #275DA6; +} + +.progress-bar__container { + background-color: #e6e6e6; + height: 8px; +} + +.progress-bar__line { + background-color: #908cf2; +} + +.modal-container { + max-width: 290px; + padding: 24px 0px 0px; +} + +.modal-title { + font-weight: 600; + margin-bottom: 16px; +} + +.modal-description { + padding-inline: 24px; + text-align: center; +} + +.modal-answers { + display: flex; + flex-direction: row; + margin-top: 24px; + border-top: 1px solid #D9D9D9; + +} + +.modal-answer { + width: 50%; + height: 52px; + display: flex; + align-items: center; + justify-content: center; + color: #275DA7; + font-weight: 600; + cursor: pointer; + + &:first-child { + border-right: 1px solid #D9D9D9; + } +} \ No newline at end of file diff --git a/src/components/CompatibilityV3/pages/SecretDiscount/index.tsx b/src/components/CompatibilityV3/pages/SecretDiscount/index.tsx new file mode 100644 index 0000000..0b243b5 --- /dev/null +++ b/src/components/CompatibilityV3/pages/SecretDiscount/index.tsx @@ -0,0 +1,158 @@ +import styles from "./styles.module.scss"; +import Blob3 from "../../images/SVG/Blob3"; +import Blob4 from "../../images/SVG/Blob4"; +import Title from "@/components/Title"; +import SecretDiscountTable from "../../components/SecretDiscountTable"; +import Button from "../../components/Button"; +import { usePaywall } from "@/hooks/paywall/usePaywall"; +import { EPlacementKeys } from "@/api/resources/Paywall"; +import { addCurrency, ELocalesPlacement } from "@/locales"; +import { useEffect } from "react"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; +import { useDispatch } from "react-redux"; +import { actions } from "@/store"; +import { useTranslations } from "@/hooks/translations"; +import { useDynamicSize } from "@/hooks/useDynamicSize"; + +import Header from "../../components/Header"; + +const placementKey = EPlacementKeys["aura.placement.compatibility.v3.secret.discount"] + +function SecretDiscount() { + const { width, elementRef } = useDynamicSize({ defaultWidth: 560 }); + const { height, elementRef: policyContainerRef } = useDynamicSize({ defaultWidth: 560, defaultHeight: 193 }); + const dispatch = useDispatch(); + const navigate = useNavigate(); + const { products, currency, getText } = usePaywall({ + placementKey, + localesPlacement: ELocalesPlacement.EmailMarketingCompatibilityV3, + }); + const { translate } = useTranslations(ELocalesPlacement.EmailMarketingCompatibilityV3); + + // const activeProductFromStore = useSelector(selectors.selectActiveProduct); + // const activeProduct = products.find(product => product?.trialPrice === activeProductFromStore?.trialPrice) || products[0] + const activeProduct = products[0] + // const price = (activeProduct?.price || 0) / 100; + const trialPrice = (activeProduct?.trialPrice || 0) / 100; + const trialDuration = activeProduct?.trialDuration || 7; + + + useEffect(() => { + if (!activeProduct) return; + dispatch(actions.payment.update({ + activeProduct + })) + }, [activeProduct]) + + // const [isPaymentModalOpen, setIsPaymentModalOpen] = useState(false); + + // const { + // error, + // isPaymentSuccess, + // showCreditCardForm, + // } = usePayment({ + // placementKey, + // activeProduct, + // paymentFormType: "lightbox" + // }); + + // const onPaymentSuccess = () => { + // metricService.reachGoal(EGoals.PAYMENT_SUCCESS, [EMetrics.YANDEX, EMetrics.KLAVIYO]); + // metricService.reachGoal(EGoals.PURCHASE, [EMetrics.FACEBOOK], { + // currency: "USD", + // value: ((activeProduct?.trialPrice || 100) / 100).toFixed(2), + // }); + // return navigate(routes.client.paymentSuccess()) + // } + + // const onModalClosed = () => { + // setIsPaymentModalOpen(false); + // } + + // const onPaymentError = () => { + // metricService.reachGoal(EGoals.PAYMENT_ERROR, [EMetrics.YANDEX, EMetrics.KLAVIYO]); + // return navigate(routes.client.paymentFail()) + // } + + const openPaymentModal = () => { + // metricService.reachGoal(EGoals.PAYMENT_METHODS_OPENED, [EMetrics.YANDEX, EMetrics.KLAVIYO]); + // metricService.reachGoal(EGoals.AURA_PAYMENT_METHODS_OPENED, [EMetrics.KLAVIYO]); + // setIsPaymentModalOpen(true); + // showCreditCardForm(); + navigate(routes.client.compatibilityV3SecretDiscountPaymentModal()); + }; + + // useEffect(() => { + // if (error) { + // onPaymentError(); + // } + // }, [error]) + + // useEffect(() => { + // if (isPaymentSuccess) { + // onPaymentSuccess(); + // } + // }, [isPaymentSuccess]) + + return ( +
+ {/* + + */} +
+ {/* {activeProduct && ( + + + + )} */} + + + {translate("secret-discount.title")} + + + + +
+

+ {translate("secret-discount.policy", { + days: trialDuration, + oldDays: getText("old.trial.duration"), + trialPrice: addCurrency(trialPrice, currency), + price: addCurrency( + ( + Number(getText("old.price")) + / ( + Number(getText("split.price.value")) || 2 + ) + ), currency), + })} +

+ +
+
+ ) +} + +export default SecretDiscount \ No newline at end of file diff --git a/src/components/CompatibilityV3/pages/SecretDiscount/styles.module.scss b/src/components/CompatibilityV3/pages/SecretDiscount/styles.module.scss new file mode 100644 index 0000000..8454dba --- /dev/null +++ b/src/components/CompatibilityV3/pages/SecretDiscount/styles.module.scss @@ -0,0 +1,75 @@ +.container { + width: 100%; + display: flex; + flex-direction: column; + align-items: center; + padding: 20px 26px; + min-height: 100dvh; + max-width: 560px; + margin: 0 auto; + position: relative; + overflow: hidden; +} + +.header { + padding: 8px 0 30px; + + &>button { + margin-left: -12px; + } +} + +.blob3 { + position: absolute; + top: 0; + left: 0; + z-index: -1; +} + +.title { + padding: 15px 0; + background-color: #F096C4; + margin: 0; + margin-top: 32px; + line-height: 100%; + width: calc(100% + 52px); + font-size: 20px; + font-weight: 600; + color: #fff; + text-transform: uppercase; + white-space: nowrap; +} + +.button { + font-size: 18px; + font-weight: 600; + padding: 16px 0; + margin-top: 30px; +} + +.policy-container { + position: absolute; + width: calc(100%); + max-width: 560px; + height: fit-content; + bottom: 0; + left: 50%; + transform: translateX(-50%); + + &>.policy { + width: 100%; + margin: 34px 0; + padding: 0 14px; + font-size: 13px; + font-weight: 400; + line-height: 130%; + color: #fff; + } + + .blob4 { + position: absolute; + bottom: 0; + left: 0; + z-index: -1; + } +} \ No newline at end of file diff --git a/src/components/CompatibilityV3/pages/TrialChoice/abText.tsx b/src/components/CompatibilityV3/pages/TrialChoice/abText.tsx new file mode 100644 index 0000000..aaa1560 --- /dev/null +++ b/src/components/CompatibilityV3/pages/TrialChoice/abText.tsx @@ -0,0 +1,80 @@ +export const getLongText = (locale: string) => { + if (locale === "es") { + return ( + <> + AURA es la única aplicación precisa con un análisis fiable de la línea + del destino, verificado por profesionales y garantizado para + proporcionar predicciones precisas. +
+
+ AURA ya ha ayudado a millones de personas a encontrar la felicidad y + descubrir toda la verdad sobre sus relaciones. +
+
+ Tu análisis del destino, que cambiará tu vida por completo, ¡está casi + listo! Antes de proporcionártelo, nos gustaría ofrecerte la oportunidad + de elegir la cantidad que consideres razonable para probar AURA durante + 7 días y que creas justa para los cambios que te sucederán: +
+
+ • Descubrirás todos los secretos más íntimos que las estrellas tienen + preparados para ti y resolverás problemas de relación en solo un mes; +
+
+ • Pondrás fin, de una vez por todas, a asuntos pendientes y olvidarás + los problemas que te han estado atormentando durante años (si no + décadas); +
+
+ • Ahorrarás cientos de dólares en predicciones astrológicas falsas y + adivinos no profesionales; +
+
+ • Recibirás no solo un análisis personal, sino también horóscopos + diarios personalizados, aprenderás quién y cómo está drenando tu energía + y obtendrás otras lecturas personalizadas. +
+
+ El período de prueba de 7 días nos cuesta $13.76, pero por favor elige + la cantidad que más te convenga: + + ); + } + return ( + <> + AURA is the only accurate app with reliable fate line analysis, verified + by professionals and guaranteed to provide precise predictions. +
+
+ AURA has already helped millions of people find happiness and discover the + whole truth about their relationships. +
+
+ Your fate analysis, which will completely change your life, is almost + ready! Before we provide it to you, we would like to offer you the + opportunity to choose the amount you consider reasonable to try AURA for 7 + days and which you think is fair for the changes that will happen to you: +
+
+ You will discover all the most intimate secrets that the stars have + prepared for you and solve relationship issues within just one month; +
+
+ You will once and for all put the finishing touches on unresolved issues + and forget about problems that have been haunting you for years (if not + decades); +
+
+ You will save hundreds of dollars on fake and unprofessional astrological + predictions and fortune tellers; +
+
+ You will receive not only a personal analysis but also personalized daily + horoscopes, learn who and how is draining your energy, and get other + personalized readings. +
+
A 7-day trial period costs us $13.76, but please choose the amount + that suits you best: + + ); +}; diff --git a/src/components/CompatibilityV3/pages/TrialChoice/index.tsx b/src/components/CompatibilityV3/pages/TrialChoice/index.tsx new file mode 100644 index 0000000..4cda0d5 --- /dev/null +++ b/src/components/CompatibilityV3/pages/TrialChoice/index.tsx @@ -0,0 +1,106 @@ +import { useDispatch, useSelector } from "react-redux"; +import EmailSubstrate from "../../components/EmailSubstrate"; +import styles from "./styles.module.scss"; +import { actions, selectors } from "@/store"; +// import Title from "@/components/Title"; +import PriceList from "@/components/pages/ABDesign/v1/components/PriceList"; +import { usePaywall } from "@/hooks/paywall/usePaywall"; +import { EPlacementKeys } from "@/api/resources/Paywall"; +import { + ELocalesPlacement, + getDefaultLocaleByLanguage, + language, +} from "@/locales"; +import { useEffect, useState } from "react"; +import Button from "../../components/Button"; +import routes from "@/routes"; +import { useNavigate } from "react-router-dom"; +import Loader from "@/components/Loader"; +import { useTranslations } from "@/hooks/translations"; +// import { useMetricABFlags } from "@/services/metric/metricService"; +import { getLongText } from "./abText"; +import metricService, { EGoals, EMetrics } from "@/services/metric/metricService"; + +function TrialChoice() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + const navigate = useNavigate(); + const dispatch = useDispatch(); + const { products, isLoading, currency, getText } = usePaywall({ + placementKey: EPlacementKeys["aura.placement.compatibility.v3"], + localesPlacement: ELocalesPlacement.CompatibilityV3, + }); + + const locale = getDefaultLocaleByLanguage(language); + + // const { flags } = useMetricABFlags(); + // const isLongText = flags?.text?.[0] === "on"; + + const [isDisabled, setIsDisabled] = useState(true); + + const selectedPrice = useSelector(selectors.selectSelectedPrice); + const email = useSelector(selectors.selectEmail); + const homeConfig = useSelector(selectors.selectHome); + + const handlePriceItem = () => { + metricService.reachGoal(EGoals.SELECT_TRIAL, [EMetrics.YANDEX, EMetrics.KLAVIYO]); + metricService.reachGoal(EGoals.AURA_SELECT_TRIAL, [EMetrics.KLAVIYO]); + setIsDisabled(false); + }; + + const handleNext = () => { + if (isDisabled) { + return; + } + dispatch( + actions.siteConfig.update({ + home: { pathFromHome: homeConfig.pathFromHome, isShowNavbar: false }, + }) + ); + navigate(routes.client.compatibilityV3TrialPayment()); + }; + + useEffect(() => { + metricService.reachGoal(EGoals.TRIAL_CHOICE_PAGE_VISIT, [EMetrics.YANDEX, EMetrics.KLAVIYO]); + metricService.reachGoal(EGoals.AURA_TRIAL_CHOICE_PAGE_VISIT, [EMetrics.KLAVIYO]); + }, []); + + return ( +
+ {!isLoading && ( + <> + + {/* {!isLongText && ( + + {getText("text.0")} + + )} */} +

{getLongText(locale)}

+ +
+ +

{getText("text.1")}

+
+ + + + )} + {isLoading && } +
+ ); +} + +export default TrialChoice; diff --git a/src/components/CompatibilityV3/pages/TrialChoice/styles.module.scss b/src/components/CompatibilityV3/pages/TrialChoice/styles.module.scss new file mode 100644 index 0000000..f470c34 --- /dev/null +++ b/src/components/CompatibilityV3/pages/TrialChoice/styles.module.scss @@ -0,0 +1,108 @@ +.container { + position: relative; + display: flex; + flex-direction: column; + align-items: center; +} + +.email-substrate { + display: grid; + grid-template-columns: 1fr 36px; + align-content: center; + position: absolute; + max-width: calc(100% + 9px); + top: -18px; + right: -26px; + height: 46px; +} + +.title { + font-size: 28px; + line-height: 125%; + margin-top: 44px; + color: #2c2c2c; + font-weight: 500; +} + +.prices-container { + justify-content: center; + gap: 10px; + width: fit-content; + margin: 0 auto; +} + +.price-item { + border: solid #2c2c2c 1px; + width: 70px; + height: 65px; + font-size: 20px; + font-weight: 500; + + &:last-child::after { + content: ""; + position: absolute; + width: 2px; + height: 20px; + background-color: #224e90; + bottom: -30px; + left: 50%; + } + + &.price-item-active { + border: solid #224e90 3px !important; + background-color: transparent; + color: #224e90; + } +} + +.price-container { + position: relative; + width: 100%; + margin-top: 10px; + display: flex; + flex-direction: column; + gap: 32px; +} + +.auxiliary-text { + font-size: 15px; + line-height: 125%; + font-weight: 600; + color: #0244a5; + width: 100%; + text-align: center; +} + +.cursor { + position: absolute; + width: 2px; + height: 20px; + background-color: #224e90; + top: 71px; + right: 34px; +} + +.loader { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} + +.button { + margin-top: 20px; + transition: background 0.2s ease, color 0.2s ease; + + &:disabled { + border: solid #224e90 1px; + background: none; + color: #120d0d; + opacity: 1; + } +} + +.text { + white-space: pre-wrap; + margin-top: 40px; + margin-bottom: 6px; +} diff --git a/src/components/CompatibilityV3/pages/TrialChoiceVideo/index.tsx b/src/components/CompatibilityV3/pages/TrialChoiceVideo/index.tsx new file mode 100644 index 0000000..b42d41b --- /dev/null +++ b/src/components/CompatibilityV3/pages/TrialChoiceVideo/index.tsx @@ -0,0 +1,96 @@ +import { useDispatch, useSelector } from "react-redux"; +import EmailSubstrate from "../../components/EmailSubstrate"; +import styles from "./styles.module.scss"; +import { actions, selectors } from "@/store"; +import PriceList from "@/components/pages/ABDesign/v1/components/PriceList"; +import { usePaywall } from "@/hooks/paywall/usePaywall"; +import { EPlacementKeys } from "@/api/resources/Paywall"; +import { ELocalesPlacement } from "@/locales"; +import { useEffect, useRef, useState } from "react"; +import Button from "../../components/Button"; +import routes from "@/routes"; +import { useNavigate, useOutletContext } from "react-router-dom"; +import Loader from "@/components/Loader"; +import { useTranslations } from "@/hooks/translations"; +import { IOutletContext } from "@/routerComponents/Compatibility/v3/LayoutPersonalVideo"; + +function TrialChoiceVideo() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + const navigate = useNavigate(); + const dispatch = useDispatch(); + const { products, isLoading, currency, getText } = usePaywall({ + placementKey: EPlacementKeys["aura.placement.compatibility.v3"], + localesPlacement: ELocalesPlacement.V1, + }); + + const [isDisabled, setIsDisabled] = useState(true); + + const selectedPrice = useSelector(selectors.selectSelectedPrice); + const email = useSelector(selectors.selectEmail); + const homeConfig = useSelector(selectors.selectHome); + + const containerVideoRef = useRef(null); + + const { containerVideoRef: videoRef, isVisibleElements } = + useOutletContext(); + + const handlePriceItem = () => { + setIsDisabled(false); + }; + + const handleNext = () => { + if (isDisabled) { + return; + } + dispatch( + actions.siteConfig.update({ + home: { pathFromHome: homeConfig.pathFromHome, isShowNavbar: false }, + }) + ); + navigate(routes.client.compatibilityV3TrialPayment()); + }; + + useEffect(() => { + if (!containerVideoRef.current || !videoRef.current) return; + containerVideoRef.current?.appendChild(videoRef.current); + videoRef.current.classList.add(styles["personal-video"]); + }, [videoRef]); + + useEffect(() => { + dispatch(actions.personalVideo.updateIsVideoPlaying(true)); + }, [dispatch]); + + return ( +
+
+ {!isLoading && isVisibleElements && ( + <> + +
+ +

{getText("text.1")}

+
+ + + + )} + {isLoading && } +
+ ); +} + +export default TrialChoiceVideo; diff --git a/src/components/CompatibilityV3/pages/TrialChoiceVideo/styles.module.scss b/src/components/CompatibilityV3/pages/TrialChoiceVideo/styles.module.scss new file mode 100644 index 0000000..87bcdd7 --- /dev/null +++ b/src/components/CompatibilityV3/pages/TrialChoiceVideo/styles.module.scss @@ -0,0 +1,134 @@ +.container { + position: relative; + display: flex; + flex-direction: column; + align-items: center; +} + +.email-substrate { + display: grid; + grid-template-columns: 1fr 36px; + align-content: center; + position: absolute; + max-width: calc(100% + 9px); + top: -18px; + right: -26px; + height: 46px; + filter: opacity(0); + will-change: opacity; + animation: appearance 1s forwards; +} + +.title { + font-size: 28px; + line-height: 125%; + margin-top: 44px; + color: #2c2c2c; + font-weight: 500; + filter: opacity(0); + will-change: opacity; + animation: appearance 1s forwards 0.5s; +} + +.prices-container { + justify-content: center; + gap: 10px; + width: fit-content; + margin: 0 auto; + filter: opacity(0); + will-change: opacity; + animation: appearance 1s forwards 1s; +} + +.price-item { + border: solid #2c2c2c 1px; + width: 70px; + height: 65px; + font-size: 20px; + font-weight: 500; + + &:last-child::after { + content: ""; + position: absolute; + width: 2px; + height: 20px; + background-color: #224e90; + bottom: -30px; + left: 50%; + } + + &.price-item-active { + border: solid #224e90 3px !important; + background-color: transparent; + color: #224e90; + } +} + +.price-container { + position: relative; + width: 100%; + margin-top: 10px; + display: flex; + flex-direction: column; + gap: 32px; +} + +.auxiliary-text { + font-size: 15px; + line-height: 125%; + font-weight: 600; + color: #0244a5; + width: 100%; + text-align: center; + filter: opacity(0); + will-change: opacity; + animation: appearance 1s forwards 1s; +} + +.cursor { + position: absolute; + width: 2px; + height: 20px; + background-color: #224e90; + top: 71px; + right: 34px; +} + +.loader { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} + +.button { + margin-top: 20px; + transition: background 0.2s ease, color 0.2s ease; + filter: opacity(0); + will-change: opacity; + animation: appearance 1s forwards 1.5s; + + &:disabled { + border: solid #224e90 1px; + background: none; + color: #120d0d; + opacity: 1; + } +} + +.personal-video { + display: block; + margin-top: 44px !important; + border-radius: 0 !important; + background-image: url("/trial-choice-preview.png") !important; +} + +@keyframes appearance { + 0% { + filter: opacity(0); + } + + 100% { + filter: opacity(1); + } +} diff --git a/src/components/CompatibilityV3/pages/TrialPayment/index.tsx b/src/components/CompatibilityV3/pages/TrialPayment/index.tsx new file mode 100644 index 0000000..ffbc61b --- /dev/null +++ b/src/components/CompatibilityV3/pages/TrialPayment/index.tsx @@ -0,0 +1,167 @@ +import Title from "@/components/Title"; +import AppNumberOne from "../../components/AppNumberOne"; +import Button from "../../components/Button"; +import JoinedToday from "../../components/JoinedToday"; +import PalmIsReady from "../../components/PalmIsReady"; +import styles from "./styles.module.scss"; +import HowWork from "../../components/HowWork"; +import WhatIncluded from "../../components/WhatIncluded"; +import PalmsSayAbout from "../../components/PalmsSayAbout"; +import Reviews from "../../components/Reviews"; +import routes, { compatibilityV3Prefix } from "@/routes"; +import Footer from "../../components/Footer"; +import { useNavigate } from "react-router-dom"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement, language } from "@/locales"; +import { usePreloadImages } from "@/hooks/preload/images"; +import useTimer from "@/hooks/palmistry/use-timer"; +import { images } from "../../data"; +import { useSelector } from "react-redux"; +import { selectors } from "@/store"; +import { getZodiacSignByDate } from "@/services/zodiac-sign"; +import { useDynamicSize } from "@/hooks/useDynamicSize"; +import { formatDateToLocale } from "@/locales/localFormats"; +import { useEffect } from "react"; +import metricService, { EGoals, EMetrics } from "@/services/metric/metricService"; +import MoneyBackGuarantee from "../../components/MoneyBackGuarantee"; + +function TrialPayment() { + const { height, elementRef } = useDynamicSize({}); + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV3); + const { gender, birthdate, partnerGender, partnerBirthdate } = useSelector(selectors.selectQuestionnaire); + const { dateEvent } = useSelector(selectors.selectCompatibilityV3Answers); + + const { relationshipStatus } = useSelector(selectors.selectCompatibilityV3Answers); + // const relationshipStatus = "single"; + const zodiacSign = getZodiacSignByDate(birthdate); + const partnerZodiacSign = getZodiacSignByDate(partnerBirthdate); + const time = useTimer(); + const navigate = useNavigate(); + usePreloadImages([ + "/v1/palmistry/ticket.svg", + ]) + + const handleNext = () => { + navigate(routes.client.compatibilityV3Payment()); + }; + + useEffect(() => { + metricService.reachGoal(EGoals.TRIAL_PAYMENT_PAGE_VISIT, [EMetrics.YANDEX, EMetrics.KLAVIYO]); + metricService.reachGoal(EGoals.AURA_TRIAL_PAYMENT_PAGE_VISIT, [EMetrics.KLAVIYO]); + }, []); + + return ( + <> + + {translate("/trial-payment.information-title")} + +
+ Profile zodiac sign + {relationshipStatus !== "single" && Partner zodiac sign} +
+ {(relationshipStatus === "single" || !partnerBirthdate) && +

+ {translate("/trial-payment.information-description-single", { + color: + {translate("/trial-payment.information-description-single-color", { + zodiacSign: zodiacSign?.toLowerCase().charAt(0).toUpperCase() + zodiacSign?.toLowerCase().slice(1), + birthdate: formatDateToLocale(birthdate, language), + })} + , + eventDescription: dateEvent ? + {translate("/trial-payment.information-description-single-event-description", { + dateEvent: formatDateToLocale(dateEvent, language), + })} + : "", + br:
+ })} +

+ } + {relationshipStatus !== "single" && partnerBirthdate && +

+ {translate("/trial-payment.information-description-with-partner", { + color: + {translate("/trial-payment.information-description-with-partner-color", { + zodiacSign: zodiacSign?.toLowerCase().charAt(0).toUpperCase() + zodiacSign?.toLowerCase().slice(1), + partnerZodiacSign: partnerZodiacSign?.toLowerCase().charAt(0).toUpperCase() + partnerZodiacSign?.toLowerCase().slice(1), + birthdate: formatDateToLocale(birthdate, language), + partnerBirthdate: formatDateToLocale(partnerBirthdate, language), + })} + , + eventDescription: dateEvent ? + {translate("/trial-payment.information-description-with-partner-event-description", { + dateEvent: formatDateToLocale(dateEvent, language), + })} + : "", + })} +

+ } + + + + + + + {translate("/trial-payment.how_work.title")} + + + + + + + + + {translate("/trial-payment.why_love", { + color: <span>{translate("/trial-payment.why_love_color")}</span>, + })} + + + + + {translate("/trial-payment.as_seen_in", { + color: ( + <span> + {translate("app_name", undefined, ELocalesPlacement.V1)} + </span> + ), + })} + + Partners +