diff --git a/messages/de.json b/messages/de.json
index 9e3ddcd..b55f3f2 100644
--- a/messages/de.json
+++ b/messages/de.json
@@ -248,7 +248,6 @@
"payment_error": "Something went wrong. Please try again later.",
"select_product_error": "Please select a product",
"skip_offer": "Skip offer",
-
"products": {
"main_ultra_pack": {
"title": "ULTRA PACK",
@@ -396,6 +395,7 @@
"reserved-for": "Reserved for {time}"
}
}
- }
+ },
+ "Soulmate": {}
}
-}
+}
\ No newline at end of file
diff --git a/messages/en.json b/messages/en.json
index 0b19c3c..01d5494 100644
--- a/messages/en.json
+++ b/messages/en.json
@@ -255,7 +255,6 @@
"payment_error": "Something went wrong. Please try again later.",
"select_product_error": "Please select a product",
"skip_offer": "Skip offer",
-
"products": {
"main_ultra_pack": {
"title": "ULTRA PACK",
@@ -402,6 +401,416 @@
"pricing-summary-trial-description": "You will be charged only {totalToday} for your {trialDuration}-day trial. Subscription renews automatically until cancelled. You can cancel at any time before the end of the trial.",
"reserved-for": "Reserved for {time}"
}
+ },
+ "v2": {
+ "Landing": {
+ "header-timer": {
+ "title": "Reserved for {time}"
+ },
+ "header": {
+ "title": "Special Offer!",
+ "description": "Everything is free, trial period included!"
+ },
+ "hi-block": {
+ "title": "Hello, Sunshine 👋",
+ "description": "Your well-being and happiness are our top priority!",
+ "card": {
+ "title": "That's why we've decided to give you a personalised plan and access to a trial version of our app for FREE!",
+ "image-description": "soulmate portraits delivered today",
+ "count": "900+"
+ }
+ },
+ "what-get": {
+ "title": "What you will receive:",
+ "detailed-portrait": {
+ "header": {
+ "title": "A detailed portrait of your other half is ready"
+ }
+ },
+ "guide": {
+ "header": {
+ "title": "Guide “Finding the One”"
+ },
+ "list": {
+ "1": "Why love doesn't come - and how to open the way to it",
+ "2": "7 signs that you have met your soulmate",
+ "3": "The main secret of couples who stay together",
+ "4": "Mistakes that destroy even the strongest feelings",
+ "5": "5 habits that make relationships happy"
+ }
+ },
+ "individual-advice": {
+ "header": {
+ "title": "Personalized advice from a personal relationship psychologist"
+ },
+ "messages": {
+ "me": {
+ "text": "Why do I still doubt whether he loves me?",
+ "time": "16:38 AM"
+ },
+ "advisor": {
+ "text": "Because you feel that the connection is special. Fate was right—you are reflections of each other.",
+ "time": "16:39 AM"
+ }
+ },
+ "typing": "typing "
+ },
+ "search-compatible-partner": {
+ "header": {
+ "title": "Search for the most compatible partner"
+ },
+ "content": {
+ "partner-name": "Your significant other",
+ "percent": "97%",
+ "compatibility": "Compatibility",
+ "bars": {
+ "1": {
+ "percent": "92",
+ "text": "Love",
+ "colors": {
+ "path": "#FD4B4B",
+ "trail": "#FCE7F3"
+ }
+ },
+ "2": {
+ "percent": "88",
+ "text": "Sex",
+ "colors": {
+ "path": "#8B5CF6",
+ "trail": "#EDE9FE"
+ }
+ },
+ "3": {
+ "percent": "79",
+ "text": "Family",
+ "colors": {
+ "path": "#4F46E5",
+ "trail": "##EEF2FF"
+ }
+ }
+ }
+ }
+ }
+ },
+ "special-offer": {
+ "title": "Special price",
+ "prices": {
+ "old-price": {
+ "description": "Regular price"
+ },
+ "new-price": {
+ "description": "Today"
+ }
+ },
+ "trial-offer": {
+ "title": "DOUBLED!",
+ "description": "Full access to all materials"
+ }
+ },
+ "plan-also-includes": {
+ "title": "Your plan also includes:",
+ "list": {
+ "items": {
+ "1": {
+ "title": "Чат с экспертом",
+ "text": "Задай свой вопрос и получи первый совет уже сегодня."
+ },
+ "2": {
+ "title": "Анализ совместимости",
+ "text": "Пойми, почему вы притягиваетесь друг к другу - и какие различия могут мешать гармонии."
+ },
+ "3": {
+ "title": "Как говорить о чувствах и быть понятым",
+ "text": "Пошаговый гайд, который поможет восстановить близость и искреннее общение."
+ },
+ "4": {
+ "title": "Медитации и аффирмации для сердца",
+ "text": "Практики, которые открывают внутреннюю уверенность и притягивают любовь."
+ }
+ }
+ }
+ },
+ "reviews": {
+ "title": "What our users say:",
+ "items": {
+ "1": {
+ "username": "@anna.smith28",
+ "flag": "🇺🇸",
+ "text": "The drawing was made before we met, and it matched down to the smallest detail: the same gaze, the same mole. We simply couldn't believe it! Now the portrait hangs in our home as a sign of destiny.",
+ "answer": {
+ "title": "Response from the support team",
+ "text": "Anna, it's just the magic of fate! We are very happy that your portrait has become part of your love story. May it remind you how important it is to believe in the signs of the universe 🌹"
+ }
+ },
+ "2": {
+ "username": "@mike.andrews_89",
+ "flag": "🇺🇸",
+ "text": "I decided to check whether my wife was truly my other half. The portrait matched her down to the last detail—the same gaze, the same energy. We both felt as if fate had just confirmed our union.",
+ "answer": {
+ "title": "Response from the support team",
+ "text": "That's amazing! Stories like this prove that true love really does have an impact on an energetic level. May your portrait preserve the warmth of your connection for many years to come!"
+ }
+ },
+ "3": {
+ "username": "@emily.harris_ang...",
+ "flag": "🇬🇧",
+ "text": "The “Finding the One” guide changed my life! The portrait was 100% accurate, and I met my love in a museum, just as predicted! ✨",
+ "answer": {
+ "title": "Response from the support team",
+ "text": "Elena, your story inspires us! Thank you for sharing your success. May your love be strong and long-lasting!"
+ }
+ }
+ }
+ },
+ "statistics": {
+ "title": "899,247",
+ "description": "People have already found love",
+ "more-avatars": "+2K",
+ "period-statistics": {
+ "month": {
+ "title": "54K",
+ "text": "Per month"
+ },
+ "today": {
+ "title": "2K",
+ "text": "Today"
+ }
+ }
+ },
+ "real-time-activity": {
+ "title": "Real-time activity",
+ "text": "@elena_art received a portrait",
+ "time": "2 мин назад"
+ },
+ "money-back-guarantee": {
+ "title": "100% Money Back Guarantee",
+ "term": "30 DAYS",
+ "description": "We are confident that we can help you gain a deeper understanding of your partner and show you what they are really like. After receiving excellent customer reviews, we are ready to give you a 100% refund if this report and portrait are not useful to you.",
+ "footer": "Без вопросов. Без риска."
+ },
+ "guaranteed-security-payments": "Guaranteed security payments",
+ "button-continue": "CONTINUE"
+ },
+ "SpecialOffer": {
+ "title": "Special Offer!",
+ "start-trial": "Start your {days}-day trial",
+ "cancel-anytime": "No pressure. Cancel anytime",
+ "policy": "By continuing you agree that if you don't cancel prior to the end of the {days}-days trial, you will automatically be charged {price} every {billingPeriod} until you cancel in settings. Learn more about cancellation and Refund policy in Subscription terms",
+ "button-continue": "CONTINUE",
+ "pricing-summary-total-today": "Total today:",
+ "pricing-summary-code-applied": "Code applied!",
+ "pricing-summary-cost-after-trial": "Your cost per 2 weeks after trial",
+ "pricing-summary-trial-description": "You will be charged only {trialPrice} for your {trialPeriod} trial. Your plan will then cost {price} per {billingPeriod}. Subscription renews automatically until cancelled. You can cancel at any time before the end of the trial.",
+ "reserved-for": "Reserved for {time}",
+ "save-every-period": "Save {price} every period",
+ "cost-for-one-day": "Your cost for one day after the trial is {cost}"
+ }
+ }
+ },
+ "Soulmate": {
+ "v1": {
+ "Landing": {
+ "header-timer": {
+ "title": "Reserved for {time}"
+ },
+ "header": {
+ "title": "Special Offer!",
+ "description": "Everything is free, trial period included!"
+ },
+ "hi-block": {
+ "title": "Hello, Sunshine 👋",
+ "description": "Your well-being and happiness are our top priority!",
+ "card": {
+ "title": "That's why we've decided to give you a personalised plan and access to a trial version of our app for FREE!",
+ "image-description": "soulmate portraits delivered today",
+ "count": "900+"
+ }
+ },
+ "what-get": {
+ "title": "What you will receive:",
+ "detailed-portrait": {
+ "header": {
+ "title": "A detailed portrait of your other half is ready"
+ }
+ },
+ "guide": {
+ "header": {
+ "title": "Guide “Finding the One”"
+ },
+ "list": {
+ "1": "Why love doesn't come - and how to open the way to it",
+ "2": "7 signs that you have met your soulmate",
+ "3": "The main secret of couples who stay together",
+ "4": "Mistakes that destroy even the strongest feelings",
+ "5": "5 habits that make relationships happy"
+ }
+ },
+ "individual-advice": {
+ "header": {
+ "title": "Personalized advice from a personal relationship psychologist"
+ },
+ "messages": {
+ "me": {
+ "text": "Why do I still doubt whether he loves me?",
+ "time": "16:38 AM"
+ },
+ "advisor": {
+ "text": "Because you feel that the connection is special. Fate was right—you are reflections of each other.",
+ "time": "16:39 AM"
+ }
+ },
+ "typing": "typing "
+ },
+ "search-compatible-partner": {
+ "header": {
+ "title": "Search for the most compatible partner"
+ },
+ "content": {
+ "partner-name": "Your significant other",
+ "percent": "97%",
+ "compatibility": "Compatibility",
+ "bars": {
+ "1": {
+ "percent": "92",
+ "text": "Love",
+ "colors": {
+ "path": "#FD4B4B",
+ "trail": "#FCE7F3"
+ }
+ },
+ "2": {
+ "percent": "88",
+ "text": "Sex",
+ "colors": {
+ "path": "#8B5CF6",
+ "trail": "#EDE9FE"
+ }
+ },
+ "3": {
+ "percent": "79",
+ "text": "Family",
+ "colors": {
+ "path": "#4F46E5",
+ "trail": "##EEF2FF"
+ }
+ }
+ }
+ }
+ }
+ },
+ "special-offer": {
+ "title": "Special price",
+ "prices": {
+ "old-price": {
+ "description": "Regular price"
+ },
+ "new-price": {
+ "description": "Today"
+ }
+ },
+ "trial-offer": {
+ "title": "DOUBLED!",
+ "description": "Full access to all materials"
+ }
+ },
+ "plan-also-includes": {
+ "title": "Your plan also includes:",
+ "list": {
+ "items": {
+ "1": {
+ "title": "Чат с экспертом",
+ "text": "Задай свой вопрос и получи первый совет уже сегодня."
+ },
+ "2": {
+ "title": "Анализ совместимости",
+ "text": "Пойми, почему вы притягиваетесь друг к другу - и какие различия могут мешать гармонии."
+ },
+ "3": {
+ "title": "Как говорить о чувствах и быть понятым",
+ "text": "Пошаговый гайд, который поможет восстановить близость и искреннее общение."
+ },
+ "4": {
+ "title": "Медитации и аффирмации для сердца",
+ "text": "Практики, которые открывают внутреннюю уверенность и притягивают любовь."
+ }
+ }
+ }
+ },
+ "reviews": {
+ "title": "What our users say:",
+ "items": {
+ "1": {
+ "username": "@anna.smith28",
+ "flag": "🇺🇸",
+ "text": "The drawing was made before we met, and it matched down to the smallest detail: the same gaze, the same mole. We simply couldn't believe it! Now the portrait hangs in our home as a sign of destiny.",
+ "answer": {
+ "title": "Response from the support team",
+ "text": "Anna, it's just the magic of fate! We are very happy that your portrait has become part of your love story. May it remind you how important it is to believe in the signs of the universe 🌹"
+ }
+ },
+ "2": {
+ "username": "@mike.andrews_89",
+ "flag": "🇺🇸",
+ "text": "I decided to check whether my wife was truly my other half. The portrait matched her down to the last detail—the same gaze, the same energy. We both felt as if fate had just confirmed our union.",
+ "answer": {
+ "title": "Response from the support team",
+ "text": "That's amazing! Stories like this prove that true love really does have an impact on an energetic level. May your portrait preserve the warmth of your connection for many years to come!"
+ }
+ },
+ "3": {
+ "username": "@emily.harris_ang...",
+ "flag": "🇬🇧",
+ "text": "The “Finding the One” guide changed my life! The portrait was 100% accurate, and I met my love in a museum, just as predicted! ✨",
+ "answer": {
+ "title": "Response from the support team",
+ "text": "Elena, your story inspires us! Thank you for sharing your success. May your love be strong and long-lasting!"
+ }
+ }
+ }
+ },
+ "statistics": {
+ "title": "899,247",
+ "description": "People have already found love",
+ "more-avatars": "+2K",
+ "period-statistics": {
+ "month": {
+ "title": "54K",
+ "text": "Per month"
+ },
+ "today": {
+ "title": "2K",
+ "text": "Today"
+ }
+ }
+ },
+ "real-time-activity": {
+ "title": "Real-time activity",
+ "text": "@elena_art received a portrait",
+ "time": "2 мин назад"
+ },
+ "money-back-guarantee": {
+ "title": "100% Money Back Guarantee",
+ "term": "30 DAYS",
+ "description": "We are confident that we can help you gain a deeper understanding of your partner and show you what they are really like. After receiving excellent customer reviews, we are ready to give you a 100% refund if this report and portrait are not useful to you.",
+ "footer": "Без вопросов. Без риска."
+ },
+ "guaranteed-security-payments": "Guaranteed security payments",
+ "button-continue": "CONTINUE"
+ },
+ "SpecialOffer": {
+ "title": "Special Offer!",
+ "start-trial": "Start your {days}-day trial",
+ "cancel-anytime": "No pressure. Cancel anytime",
+ "policy": "By continuing you agree that if you don't cancel prior to the end of the {days}-days trial, you will automatically be charged {price} every {billingPeriod} until you cancel in settings. Learn more about cancellation and Refund policy in Subscription terms",
+ "button-continue": "CONTINUE",
+ "pricing-summary-total-today": "Total today:",
+ "pricing-summary-code-applied": "Code applied!",
+ "pricing-summary-cost-after-trial": "Your cost per 2 weeks after trial",
+ "pricing-summary-trial-description": "You will be charged only {trialPrice} for your {trialPeriod} trial. Your plan will then cost {price} per {billingPeriod}. Subscription renews automatically until cancelled. You can cancel at any time before the end of the trial.",
+ "reserved-for": "Reserved for {time}",
+ "save-every-period": "Save {price} every period",
+ "cost-for-one-day": "Your cost for one day after the trial is {cost}"
+ }
}
}
},
@@ -436,4 +845,4 @@
"month": "{count, plural, zero {#-months} one {#-month} two {#-months} few {#-months} many {#-months} other {#-months}}",
"year": "{count, plural, zero {#-years} one {#-year} two {#-years} few {#-years} many {#-years} other {#-years}}"
}
-}
+}
\ No newline at end of file
diff --git a/messages/es.json b/messages/es.json
index 1529272..4dccde1 100644
--- a/messages/es.json
+++ b/messages/es.json
@@ -248,7 +248,6 @@
"payment_error": "Something went wrong. Please try again later.",
"select_product_error": "Please select a product",
"skip_offer": "Skip offer",
-
"products": {
"main_ultra_pack": {
"title": "ULTRA PACK",
@@ -396,6 +395,7 @@
"reserved-for": "Reserved for {time}"
}
}
- }
+ },
+ "Soulmate": {}
}
-}
+}
\ No newline at end of file
diff --git a/next.config.ts b/next.config.ts
index 19e9765..3833d3d 100644
--- a/next.config.ts
+++ b/next.config.ts
@@ -31,6 +31,14 @@ const nextConfig: NextConfig = {
},
],
},
+ turbopack: {
+ rules: {
+ "*.svg": {
+ loaders: ["@svgr/webpack"],
+ as: "*.js",
+ },
+ },
+ },
};
const withNextIntl = createNextIntlPlugin();
diff --git a/package-lock.json b/package-lock.json
index 4994245..ed08e02 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -26,6 +26,7 @@
},
"devDependencies": {
"@eslint/eslintrc": "^3",
+ "@svgr/webpack": "^8.1.0",
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
@@ -40,6 +41,1761 @@
"typescript": "^5"
}
},
+ "node_modules/@babel/code-frame": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
+ "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz",
+ "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz",
+ "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/generator": "^7.28.3",
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-module-transforms": "^7.28.3",
+ "@babel/helpers": "^7.28.4",
+ "@babel/parser": "^7.28.4",
+ "@babel/template": "^7.27.2",
+ "@babel/traverse": "^7.28.4",
+ "@babel/types": "^7.28.4",
+ "@jridgewell/remapping": "^2.3.5",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/core/node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@babel/core/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz",
+ "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.28.3",
+ "@babel/types": "^7.28.2",
+ "@jridgewell/gen-mapping": "^0.3.12",
+ "@jridgewell/trace-mapping": "^0.3.28",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.27.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz",
+ "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.27.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.27.2",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
+ "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.27.2",
+ "@babel/helper-validator-option": "^7.27.1",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.3.tgz",
+ "integrity": "sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.3",
+ "@babel/helper-member-expression-to-functions": "^7.27.1",
+ "@babel/helper-optimise-call-expression": "^7.27.1",
+ "@babel/helper-replace-supers": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
+ "@babel/traverse": "^7.28.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.1.tgz",
+ "integrity": "sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.1",
+ "regexpu-core": "^6.2.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/helper-define-polyfill-provider": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz",
+ "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "debug": "^4.4.1",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.22.10"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/helper-globals": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
+ "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.27.1.tgz",
+ "integrity": "sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
+ "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz",
+ "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "@babel/traverse": "^7.28.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz",
+ "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz",
+ "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-remap-async-to-generator": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz",
+ "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.1",
+ "@babel/helper-wrap-function": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz",
+ "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-member-expression-to-functions": "^7.27.1",
+ "@babel/helper-optimise-call-expression": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz",
+ "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.27.1",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
+ "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
+ "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz",
+ "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.27.2",
+ "@babel/traverse": "^7.28.3",
+ "@babel/types": "^7.28.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz",
+ "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.27.2",
+ "@babel/types": "^7.28.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz",
+ "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.28.4"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.27.1.tgz",
+ "integrity": "sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz",
+ "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz",
+ "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz",
+ "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
+ "@babel/plugin-transform-optional-chaining": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.13.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz",
+ "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/traverse": "^7.28.3"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.21.0-placeholder-for-preset-env.2",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
+ "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-assertions": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz",
+ "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-attributes": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz",
+ "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz",
+ "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-typescript": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz",
+ "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
+ "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-arrow-functions": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz",
+ "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-generator-functions": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz",
+ "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-remap-async-to-generator": "^7.27.1",
+ "@babel/traverse": "^7.28.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-to-generator": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz",
+ "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-remap-async-to-generator": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz",
+ "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoping": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.4.tgz",
+ "integrity": "sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-properties": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz",
+ "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-static-block": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz",
+ "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.28.3",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.12.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz",
+ "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.3",
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-globals": "^7.28.0",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-replace-supers": "^7.27.1",
+ "@babel/traverse": "^7.28.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-computed-properties": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz",
+ "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/template": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-destructuring": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.0.tgz",
+ "integrity": "sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/traverse": "^7.28.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dotall-regex": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz",
+ "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-keys": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz",
+ "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz",
+ "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dynamic-import": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz",
+ "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-explicit-resource-management": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz",
+ "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/plugin-transform-destructuring": "^7.28.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.27.1.tgz",
+ "integrity": "sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-export-namespace-from": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz",
+ "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-for-of": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz",
+ "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz",
+ "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-json-strings": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz",
+ "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-literals": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz",
+ "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-logical-assignment-operators": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.27.1.tgz",
+ "integrity": "sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-member-expression-literals": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz",
+ "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-amd": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz",
+ "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-commonjs": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz",
+ "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-systemjs": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.27.1.tgz",
+ "integrity": "sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1",
+ "@babel/traverse": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-umd": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz",
+ "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz",
+ "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-new-target": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz",
+ "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz",
+ "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-numeric-separator": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz",
+ "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-rest-spread": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz",
+ "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/plugin-transform-destructuring": "^7.28.0",
+ "@babel/plugin-transform-parameters": "^7.27.7",
+ "@babel/traverse": "^7.28.4"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-super": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz",
+ "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-replace-supers": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-catch-binding": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz",
+ "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-chaining": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.27.1.tgz",
+ "integrity": "sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-parameters": {
+ "version": "7.27.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz",
+ "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-methods": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz",
+ "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-property-in-object": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz",
+ "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.1",
+ "@babel/helper-create-class-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-property-literals": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz",
+ "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-constant-elements": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz",
+ "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-display-name": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz",
+ "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz",
+ "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.1",
+ "@babel/helper-module-imports": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/plugin-syntax-jsx": "^7.27.1",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-development": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz",
+ "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/plugin-transform-react-jsx": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-pure-annotations": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz",
+ "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regenerator": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz",
+ "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regexp-modifiers": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz",
+ "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-reserved-words": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz",
+ "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-shorthand-properties": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz",
+ "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-spread": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz",
+ "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-sticky-regex": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz",
+ "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-template-literals": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz",
+ "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typeof-symbol": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz",
+ "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typescript": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.0.tgz",
+ "integrity": "sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.27.3",
+ "@babel/helper-create-class-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1",
+ "@babel/plugin-syntax-typescript": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-escapes": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz",
+ "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-property-regex": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz",
+ "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-regex": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz",
+ "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-sets-regex": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz",
+ "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.27.1",
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/preset-env": {
+ "version": "7.28.3",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.28.3.tgz",
+ "integrity": "sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.28.0",
+ "@babel/helper-compilation-targets": "^7.27.2",
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-validator-option": "^7.27.1",
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.27.1",
+ "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1",
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3",
+ "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
+ "@babel/plugin-syntax-import-assertions": "^7.27.1",
+ "@babel/plugin-syntax-import-attributes": "^7.27.1",
+ "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
+ "@babel/plugin-transform-arrow-functions": "^7.27.1",
+ "@babel/plugin-transform-async-generator-functions": "^7.28.0",
+ "@babel/plugin-transform-async-to-generator": "^7.27.1",
+ "@babel/plugin-transform-block-scoped-functions": "^7.27.1",
+ "@babel/plugin-transform-block-scoping": "^7.28.0",
+ "@babel/plugin-transform-class-properties": "^7.27.1",
+ "@babel/plugin-transform-class-static-block": "^7.28.3",
+ "@babel/plugin-transform-classes": "^7.28.3",
+ "@babel/plugin-transform-computed-properties": "^7.27.1",
+ "@babel/plugin-transform-destructuring": "^7.28.0",
+ "@babel/plugin-transform-dotall-regex": "^7.27.1",
+ "@babel/plugin-transform-duplicate-keys": "^7.27.1",
+ "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1",
+ "@babel/plugin-transform-dynamic-import": "^7.27.1",
+ "@babel/plugin-transform-explicit-resource-management": "^7.28.0",
+ "@babel/plugin-transform-exponentiation-operator": "^7.27.1",
+ "@babel/plugin-transform-export-namespace-from": "^7.27.1",
+ "@babel/plugin-transform-for-of": "^7.27.1",
+ "@babel/plugin-transform-function-name": "^7.27.1",
+ "@babel/plugin-transform-json-strings": "^7.27.1",
+ "@babel/plugin-transform-literals": "^7.27.1",
+ "@babel/plugin-transform-logical-assignment-operators": "^7.27.1",
+ "@babel/plugin-transform-member-expression-literals": "^7.27.1",
+ "@babel/plugin-transform-modules-amd": "^7.27.1",
+ "@babel/plugin-transform-modules-commonjs": "^7.27.1",
+ "@babel/plugin-transform-modules-systemjs": "^7.27.1",
+ "@babel/plugin-transform-modules-umd": "^7.27.1",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1",
+ "@babel/plugin-transform-new-target": "^7.27.1",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1",
+ "@babel/plugin-transform-numeric-separator": "^7.27.1",
+ "@babel/plugin-transform-object-rest-spread": "^7.28.0",
+ "@babel/plugin-transform-object-super": "^7.27.1",
+ "@babel/plugin-transform-optional-catch-binding": "^7.27.1",
+ "@babel/plugin-transform-optional-chaining": "^7.27.1",
+ "@babel/plugin-transform-parameters": "^7.27.7",
+ "@babel/plugin-transform-private-methods": "^7.27.1",
+ "@babel/plugin-transform-private-property-in-object": "^7.27.1",
+ "@babel/plugin-transform-property-literals": "^7.27.1",
+ "@babel/plugin-transform-regenerator": "^7.28.3",
+ "@babel/plugin-transform-regexp-modifiers": "^7.27.1",
+ "@babel/plugin-transform-reserved-words": "^7.27.1",
+ "@babel/plugin-transform-shorthand-properties": "^7.27.1",
+ "@babel/plugin-transform-spread": "^7.27.1",
+ "@babel/plugin-transform-sticky-regex": "^7.27.1",
+ "@babel/plugin-transform-template-literals": "^7.27.1",
+ "@babel/plugin-transform-typeof-symbol": "^7.27.1",
+ "@babel/plugin-transform-unicode-escapes": "^7.27.1",
+ "@babel/plugin-transform-unicode-property-regex": "^7.27.1",
+ "@babel/plugin-transform-unicode-regex": "^7.27.1",
+ "@babel/plugin-transform-unicode-sets-regex": "^7.27.1",
+ "@babel/preset-modules": "0.1.6-no-external-plugins",
+ "babel-plugin-polyfill-corejs2": "^0.4.14",
+ "babel-plugin-polyfill-corejs3": "^0.13.0",
+ "babel-plugin-polyfill-regenerator": "^0.6.5",
+ "core-js-compat": "^3.43.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-env/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/@babel/preset-modules": {
+ "version": "0.1.6-no-external-plugins",
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
+ "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/preset-react": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.27.1.tgz",
+ "integrity": "sha512-oJHWh2gLhU9dW9HHr42q0cI0/iHHXTLGe39qvpAZZzagHy0MzYLCnCVV0symeRvzmjHyVU7mw2K06E6u/JwbhA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-validator-option": "^7.27.1",
+ "@babel/plugin-transform-react-display-name": "^7.27.1",
+ "@babel/plugin-transform-react-jsx": "^7.27.1",
+ "@babel/plugin-transform-react-jsx-development": "^7.27.1",
+ "@babel/plugin-transform-react-pure-annotations": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-typescript": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.27.1.tgz",
+ "integrity": "sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1",
+ "@babel/helper-validator-option": "^7.27.1",
+ "@babel/plugin-syntax-jsx": "^7.27.1",
+ "@babel/plugin-transform-modules-commonjs": "^7.27.1",
+ "@babel/plugin-transform-typescript": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.27.2",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
+ "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/parser": "^7.27.2",
+ "@babel/types": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz",
+ "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@babel/generator": "^7.28.3",
+ "@babel/helper-globals": "^7.28.0",
+ "@babel/parser": "^7.28.4",
+ "@babel/template": "^7.27.2",
+ "@babel/types": "^7.28.4",
+ "debug": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.28.4",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz",
+ "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@emnapi/core": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz",
@@ -749,6 +2505,56 @@
"url": "https://opencollective.com/libvips"
}
},
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
"node_modules/@lottiefiles/dotlottie-react": {
"version": "0.14.1",
"resolved": "https://registry.npmjs.org/@lottiefiles/dotlottie-react/-/dotlottie-react-0.14.1.tgz",
@@ -1294,6 +3100,277 @@
"integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==",
"license": "MIT"
},
+ "node_modules/@svgr/babel-plugin-add-jsx-attribute": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz",
+ "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-remove-jsx-attribute": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz",
+ "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz",
+ "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz",
+ "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-svg-dynamic-title": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz",
+ "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-svg-em-dimensions": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz",
+ "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-transform-react-native-svg": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz",
+ "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-transform-svg-component": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz",
+ "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-preset": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz",
+ "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@svgr/babel-plugin-add-jsx-attribute": "8.0.0",
+ "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0",
+ "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0",
+ "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0",
+ "@svgr/babel-plugin-svg-dynamic-title": "8.0.0",
+ "@svgr/babel-plugin-svg-em-dimensions": "8.0.0",
+ "@svgr/babel-plugin-transform-react-native-svg": "8.1.0",
+ "@svgr/babel-plugin-transform-svg-component": "8.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/core": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz",
+ "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.21.3",
+ "@svgr/babel-preset": "8.1.0",
+ "camelcase": "^6.2.0",
+ "cosmiconfig": "^8.1.3",
+ "snake-case": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/hast-util-to-babel-ast": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz",
+ "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.21.3",
+ "entities": "^4.4.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/plugin-jsx": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz",
+ "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.21.3",
+ "@svgr/babel-preset": "8.1.0",
+ "@svgr/hast-util-to-babel-ast": "8.0.0",
+ "svg-parser": "^2.0.4"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@svgr/core": "*"
+ }
+ },
+ "node_modules/@svgr/plugin-svgo": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz",
+ "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cosmiconfig": "^8.1.3",
+ "deepmerge": "^4.3.1",
+ "svgo": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@svgr/core": "*"
+ }
+ },
+ "node_modules/@svgr/webpack": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz",
+ "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.21.3",
+ "@babel/plugin-transform-react-constant-elements": "^7.21.3",
+ "@babel/preset-env": "^7.20.2",
+ "@babel/preset-react": "^7.18.6",
+ "@babel/preset-typescript": "^7.21.0",
+ "@svgr/core": "8.1.0",
+ "@svgr/plugin-jsx": "8.1.0",
+ "@svgr/plugin-svgo": "8.1.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
"node_modules/@swc/counter": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz",
@@ -1336,6 +3413,16 @@
"url": "https://github.com/sponsors/tannerlinsley"
}
},
+ "node_modules/@trysound/sax": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
+ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
"node_modules/@tybys/wasm-util": {
"version": "0.9.0",
"resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz",
@@ -2240,6 +4327,58 @@
"node": ">= 0.4"
}
},
+ "node_modules/babel-plugin-polyfill-corejs2": {
+ "version": "0.4.14",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz",
+ "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.27.7",
+ "@babel/helper-define-polyfill-provider": "^0.6.5",
+ "semver": "^6.3.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz",
+ "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.5",
+ "core-js-compat": "^3.43.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-regenerator": {
+ "version": "0.6.5",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz",
+ "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.5"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -2247,6 +4386,23 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.8.17",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.17.tgz",
+ "integrity": "sha512-j5zJcx6golJYTG6c05LUZ3Z8Gi+M62zRT/ycz4Xq4iCOdpcxwg7ngEYD4KA0eWZC7U17qh/Smq8bYbACJ0ipBA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.js"
+ }
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/brace-expansion": {
"version": "1.1.12",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
@@ -2271,6 +4427,40 @@
"node": ">=8"
}
},
+ "node_modules/browserslist": {
+ "version": "4.26.3",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz",
+ "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "baseline-browser-mapping": "^2.8.9",
+ "caniuse-lite": "^1.0.30001746",
+ "electron-to-chromium": "^1.5.227",
+ "node-releases": "^2.0.21",
+ "update-browserslist-db": "^1.1.3"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
"node_modules/busboy": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
@@ -2342,10 +4532,23 @@
"node": ">=6"
}
},
+ "node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/caniuse-lite": {
- "version": "1.0.30001723",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001723.tgz",
- "integrity": "sha512-1R/elMjtehrFejxwmexeXAtae5UO9iSyFn6G/I806CYC/BLyyBk1EPhrKBkWhy6wM6Xnm47dSJQec+tLJ39WHw==",
+ "version": "1.0.30001751",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz",
+ "integrity": "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==",
"funding": [
{
"type": "opencollective",
@@ -2454,6 +4657,16 @@
"simple-swizzle": "^0.2.2"
}
},
+ "node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 10"
+ }
+ },
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
@@ -2461,6 +4674,54 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.46.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.46.0.tgz",
+ "integrity": "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "browserslist": "^4.26.3"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/cosmiconfig": {
+ "version": "8.3.6",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
+ "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0",
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
"node_modules/cross-spawn": {
"version": "7.0.6",
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
@@ -2476,6 +4737,86 @@
"node": ">= 8"
}
},
+ "node_modules/css-select": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.2.2.tgz",
+ "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.1.0",
+ "domhandler": "^5.0.2",
+ "domutils": "^3.0.1",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-tree": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
+ "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.0.30",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz",
+ "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/csso": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
+ "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "css-tree": "~2.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/css-tree": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
+ "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mdn-data": "2.0.28",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/mdn-data": {
+ "version": "2.0.28",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
+ "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==",
+ "dev": true,
+ "license": "CC0-1.0"
+ },
"node_modules/csstype": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
@@ -2575,6 +4916,16 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/define-data-property": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
@@ -2637,6 +4988,76 @@
"node": ">=0.10.0"
}
},
+ "node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.2.tgz",
+ "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/dot-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
+ "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
"node_modules/dunder-proto": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
@@ -2652,6 +5073,13 @@
"node": ">= 0.4"
}
},
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.237",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.237.tgz",
+ "integrity": "sha512-icUt1NvfhGLar5lSWH3tHNzablaA5js3HVHacQimfP8ViEBOQv+L7DKEuHdbTZ0SKCO1ogTJTIL1Gwk9S6Qvcg==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/emoji-regex": {
"version": "9.2.2",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
@@ -2698,6 +5126,36 @@
"node": ">=10.0.0"
}
},
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
+ "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/error-ex/node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/es-abstract": {
"version": "1.24.0",
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz",
@@ -2875,6 +5333,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/escape-string-regexp": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
@@ -3522,6 +5990,16 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/get-intrinsic": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
@@ -4285,6 +6763,19 @@
"js-yaml": "bin/js-yaml.js"
}
},
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/json-buffer": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
@@ -4292,6 +6783,13 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/json-schema-traverse": {
"version": "0.4.1",
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
@@ -4379,6 +6877,13 @@
"node": ">= 0.8.0"
}
},
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/locate-path": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@@ -4395,6 +6900,13 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
@@ -4415,6 +6927,26 @@
"loose-envify": "cli.js"
}
},
+ "node_modules/lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
@@ -4425,6 +6957,13 @@
"node": ">= 0.4"
}
},
+ "node_modules/mdn-data": {
+ "version": "2.0.30",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
+ "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
+ "dev": true,
+ "license": "CC0-1.0"
+ },
"node_modules/merge2": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
@@ -4609,6 +7148,17 @@
}
}
},
+ "node_modules/no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ }
+ },
"node_modules/node-addon-api": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
@@ -4616,6 +7166,26 @@
"license": "MIT",
"optional": true
},
+ "node_modules/node-releases": {
+ "version": "2.0.25",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.25.tgz",
+ "integrity": "sha512-4auku8B/vw5psvTiiN9j1dAOsXvMoGqJuKJcR+dTdqiXEK20mMTk1UEo3HS16LeGQsVG6+qKTPM9u/qQ2LqATA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
@@ -4820,6 +7390,25 @@
"node": ">=6"
}
},
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/path-exists": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
@@ -4847,6 +7436,16 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/picocolors": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
@@ -5046,6 +7645,26 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/regenerate-unicode-properties": {
+ "version": "10.2.2",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz",
+ "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regenerate": "^1.4.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/regexp.prototype.flags": {
"version": "1.5.4",
"resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz",
@@ -5067,6 +7686,44 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/regexpu-core": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.4.0.tgz",
+ "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "regenerate": "^1.4.2",
+ "regenerate-unicode-properties": "^10.2.2",
+ "regjsgen": "^0.8.0",
+ "regjsparser": "^0.13.0",
+ "unicode-match-property-ecmascript": "^2.0.0",
+ "unicode-match-property-value-ecmascript": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regjsgen": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz",
+ "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/regjsparser": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.13.0.tgz",
+ "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "jsesc": "~3.1.0"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
"node_modules/resolve": {
"version": "1.22.10",
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz",
@@ -5453,6 +8110,17 @@
"is-arrayish": "^0.3.1"
}
},
+ "node_modules/snake-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz",
+ "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
"node_modules/socket.io-client": {
"version": "4.8.1",
"resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz",
@@ -5738,6 +8406,39 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/svg-parser": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz",
+ "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/svgo": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz",
+ "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@trysound/sax": "0.2.0",
+ "commander": "^7.2.0",
+ "css-select": "^5.1.0",
+ "css-tree": "^2.3.1",
+ "css-what": "^6.1.0",
+ "csso": "^5.0.5",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "svgo": "bin/svgo"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/svgo"
+ }
+ },
"node_modules/tinyglobby": {
"version": "0.2.14",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz",
@@ -5959,6 +8660,50 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/unicode-canonical-property-names-ecmascript": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz",
+ "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "unicode-canonical-property-names-ecmascript": "^2.0.0",
+ "unicode-property-aliases-ecmascript": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-value-ecmascript": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz",
+ "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-property-aliases-ecmascript": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz",
+ "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/unrs-resolver": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.9.0.tgz",
@@ -5994,6 +8739,37 @@
"@unrs/resolver-binding-win32-x64-msvc": "1.9.0"
}
},
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+ "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
"node_modules/uri-js": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
@@ -6162,6 +8938,13 @@
"node": ">=0.4.0"
}
},
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
diff --git a/package.json b/package.json
index bef9539..9e94def 100644
--- a/package.json
+++ b/package.json
@@ -31,6 +31,7 @@
},
"devDependencies": {
"@eslint/eslintrc": "^3",
+ "@svgr/webpack": "^8.1.0",
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
diff --git a/public/email-marketing/comp/v2/anna_smith28.png b/public/email-marketing/comp/v2/anna_smith28.png
new file mode 100644
index 0000000..e20d734
Binary files /dev/null and b/public/email-marketing/comp/v2/anna_smith28.png differ
diff --git a/public/email-marketing/comp/v2/avatar1.jpg b/public/email-marketing/comp/v2/avatar1.jpg
new file mode 100644
index 0000000..71c2c06
Binary files /dev/null and b/public/email-marketing/comp/v2/avatar1.jpg differ
diff --git a/public/email-marketing/comp/v2/avatar2.jpg b/public/email-marketing/comp/v2/avatar2.jpg
new file mode 100644
index 0000000..71151dd
Binary files /dev/null and b/public/email-marketing/comp/v2/avatar2.jpg differ
diff --git a/public/email-marketing/comp/v2/avatar3.jpg b/public/email-marketing/comp/v2/avatar3.jpg
new file mode 100644
index 0000000..2d409d0
Binary files /dev/null and b/public/email-marketing/comp/v2/avatar3.jpg differ
diff --git a/public/email-marketing/comp/v2/avatar4.jpg b/public/email-marketing/comp/v2/avatar4.jpg
new file mode 100644
index 0000000..1bf6519
Binary files /dev/null and b/public/email-marketing/comp/v2/avatar4.jpg differ
diff --git a/public/email-marketing/comp/v2/dmitry_32.png b/public/email-marketing/comp/v2/dmitry_32.png
new file mode 100644
index 0000000..7d95962
Binary files /dev/null and b/public/email-marketing/comp/v2/dmitry_32.png differ
diff --git a/public/email-marketing/comp/v2/elena_art.png b/public/email-marketing/comp/v2/elena_art.png
new file mode 100644
index 0000000..01655b8
Binary files /dev/null and b/public/email-marketing/comp/v2/elena_art.png differ
diff --git a/public/email-marketing/comp/v2/emily_harris_ang.png b/public/email-marketing/comp/v2/emily_harris_ang.png
new file mode 100644
index 0000000..2df9b6e
Binary files /dev/null and b/public/email-marketing/comp/v2/emily_harris_ang.png differ
diff --git a/public/email-marketing/comp/v2/empty-face-portrait.jpg b/public/email-marketing/comp/v2/empty-face-portrait.jpg
new file mode 100644
index 0000000..b69cb43
Binary files /dev/null and b/public/email-marketing/comp/v2/empty-face-portrait.jpg differ
diff --git a/public/email-marketing/comp/v2/gpt-portrait-1.jpg b/public/email-marketing/comp/v2/gpt-portrait-1.jpg
new file mode 100644
index 0000000..4bde877
Binary files /dev/null and b/public/email-marketing/comp/v2/gpt-portrait-1.jpg differ
diff --git a/public/email-marketing/comp/v2/gpt-portrait-2.jpg b/public/email-marketing/comp/v2/gpt-portrait-2.jpg
new file mode 100644
index 0000000..91f565f
Binary files /dev/null and b/public/email-marketing/comp/v2/gpt-portrait-2.jpg differ
diff --git a/public/email-marketing/comp/v2/gpt-portrait.jpg b/public/email-marketing/comp/v2/gpt-portrait.jpg
new file mode 100644
index 0000000..b39ef03
Binary files /dev/null and b/public/email-marketing/comp/v2/gpt-portrait.jpg differ
diff --git a/public/email-marketing/comp/v2/guaranteed.svg b/public/email-marketing/comp/v2/guaranteed.svg
new file mode 100644
index 0000000..21859eb
--- /dev/null
+++ b/public/email-marketing/comp/v2/guaranteed.svg
@@ -0,0 +1,16 @@
+
diff --git a/public/email-marketing/comp/v2/mike_andrews_89.png b/public/email-marketing/comp/v2/mike_andrews_89.png
new file mode 100644
index 0000000..95272a0
Binary files /dev/null and b/public/email-marketing/comp/v2/mike_andrews_89.png differ
diff --git a/public/email-marketing/comp/v2/payments.png b/public/email-marketing/comp/v2/payments.png
new file mode 100644
index 0000000..326b6ac
Binary files /dev/null and b/public/email-marketing/comp/v2/payments.png differ
diff --git a/public/email-marketing/comp/v2/real-time-activity/avatar.jpg b/public/email-marketing/comp/v2/real-time-activity/avatar.jpg
new file mode 100644
index 0000000..9dc9c75
Binary files /dev/null and b/public/email-marketing/comp/v2/real-time-activity/avatar.jpg differ
diff --git a/public/email-marketing/comp/v2/statistics/avatar1.png b/public/email-marketing/comp/v2/statistics/avatar1.png
new file mode 100644
index 0000000..c40aded
Binary files /dev/null and b/public/email-marketing/comp/v2/statistics/avatar1.png differ
diff --git a/public/email-marketing/comp/v2/statistics/avatar2.png b/public/email-marketing/comp/v2/statistics/avatar2.png
new file mode 100644
index 0000000..6fa6205
Binary files /dev/null and b/public/email-marketing/comp/v2/statistics/avatar2.png differ
diff --git a/public/email-marketing/comp/v2/statistics/avatar3.png b/public/email-marketing/comp/v2/statistics/avatar3.png
new file mode 100644
index 0000000..73a2dcf
Binary files /dev/null and b/public/email-marketing/comp/v2/statistics/avatar3.png differ
diff --git a/public/email-marketing/comp/v2/statistics/avatar4.png b/public/email-marketing/comp/v2/statistics/avatar4.png
new file mode 100644
index 0000000..fb5b769
Binary files /dev/null and b/public/email-marketing/comp/v2/statistics/avatar4.png differ
diff --git a/public/email-marketing/comp/v2/statistics/avatar5.png b/public/email-marketing/comp/v2/statistics/avatar5.png
new file mode 100644
index 0000000..4679ee2
Binary files /dev/null and b/public/email-marketing/comp/v2/statistics/avatar5.png differ
diff --git a/public/email-marketing/comp/v2/statistics/avatar6.png b/public/email-marketing/comp/v2/statistics/avatar6.png
new file mode 100644
index 0000000..01560cf
Binary files /dev/null and b/public/email-marketing/comp/v2/statistics/avatar6.png differ
diff --git a/src/app/[locale]/(core)/portraits/[id]/page.tsx b/src/app/[locale]/(core)/portraits/[id]/page.tsx
index 28321a3..3f30d94 100644
--- a/src/app/[locale]/(core)/portraits/[id]/page.tsx
+++ b/src/app/[locale]/(core)/portraits/[id]/page.tsx
@@ -1,9 +1,9 @@
import { notFound } from "next/navigation";
import { PortraitView } from "@/components/domains/portraits";
+import { DashboardData, DashboardSchema } from "@/entities/dashboard/types";
import { http } from "@/shared/api/httpClient";
import { API_ROUTES } from "@/shared/constants/api-routes";
-import { DashboardData, DashboardSchema } from "@/entities/dashboard/types";
// Force dynamic to always get fresh data
export const dynamic = "force-dynamic";
@@ -20,7 +20,7 @@ export default async function PortraitPage({
cache: "no-store",
schema: DashboardSchema,
});
-
+
const portrait = dashboard.partnerPortraits?.find(p => p._id === id);
if (!portrait || portrait.status !== "done" || !portrait.imageUrl) {
diff --git a/src/app/[locale]/(email-marketing)/em/(soulmate)/s/v1/landing/page.module.scss b/src/app/[locale]/(email-marketing)/em/(soulmate)/s/v1/landing/page.module.scss
new file mode 100644
index 0000000..b290ea6
--- /dev/null
+++ b/src/app/[locale]/(email-marketing)/em/(soulmate)/s/v1/landing/page.module.scss
@@ -0,0 +1,14 @@
+.container {
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ width: 100%;
+ max-width: 460px;
+ margin: 0 auto;
+ padding-inline: 16px;
+ padding-bottom: 140px;
+ height: fit-content;
+ min-height: 100dvh;
+ background-color: #f3f4f6;
+}
diff --git a/src/app/[locale]/(email-marketing)/em/(soulmate)/s/v1/landing/page.tsx b/src/app/[locale]/(email-marketing)/em/(soulmate)/s/v1/landing/page.tsx
new file mode 100644
index 0000000..a3d7658
--- /dev/null
+++ b/src/app/[locale]/(email-marketing)/em/(soulmate)/s/v1/landing/page.tsx
@@ -0,0 +1,64 @@
+import {
+ GuaranteedSecurityPayments,
+ Header,
+ HeaderTimer,
+ HiBlock,
+ LandingButtonWrapper,
+ MoneyBackGuarantee,
+ Payments,
+ PlanAlsoIncludes,
+ RealTimeActivity,
+ Reviews,
+ SpecialOffer,
+ Statistics,
+ WhatGet,
+} from "@/components/domains/email-marketing/compatibility/v2";
+import { loadFunnelPaymentById } from "@/entities/session/funnel/loaders";
+import {
+ IFunnelPaymentPlacement,
+ IFunnelPaymentVariant,
+} from "@/entities/session/funnel/types";
+import { Currency, ELocalesPlacement } from "@/types";
+
+import styles from "./page.module.scss";
+
+const payload = {
+ funnel: ELocalesPlacement.EmailMarketingSoulmateV1,
+};
+
+export default async function EmailMarketingSoulmateV1Landing() {
+ const payment = (await loadFunnelPaymentById(
+ payload,
+ "main"
+ )) as IFunnelPaymentPlacement | null;
+
+ const variant = payment?.variants?.[0];
+ const currency = payment?.currency || Currency.USD;
+ const oldTrialInterval = 7; // TODO
+ const newTrialInterval = payment?.trialInterval || 7;
+ const trialPeriod = payment?.trialPeriod || "DAY";
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/src/app/[locale]/(email-marketing)/em/(soulmate)/s/v1/special-offer/guarantee.svg b/src/app/[locale]/(email-marketing)/em/(soulmate)/s/v1/special-offer/guarantee.svg
new file mode 100644
index 0000000..28a468f
--- /dev/null
+++ b/src/app/[locale]/(email-marketing)/em/(soulmate)/s/v1/special-offer/guarantee.svg
@@ -0,0 +1,10 @@
+
diff --git a/src/app/[locale]/(email-marketing)/em/(soulmate)/s/v1/special-offer/page.module.scss b/src/app/[locale]/(email-marketing)/em/(soulmate)/s/v1/special-offer/page.module.scss
new file mode 100644
index 0000000..e522c51
--- /dev/null
+++ b/src/app/[locale]/(email-marketing)/em/(soulmate)/s/v1/special-offer/page.module.scss
@@ -0,0 +1,75 @@
+.container {
+ width: 100%;
+ max-width: 560px;
+ height: fit-content;
+ min-height: 100dvh;
+ // overflow-x: hidden;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ background: linear-gradient(90deg, #a355f6 0%, #634ae9 100%);
+ color: #fff;
+ margin: 0 auto;
+
+ & > .headerTimer {
+ width: 100%;
+ }
+}
+
+.title {
+ font-size: 36px;
+ font-weight: 800;
+ letter-spacing: -1.4px;
+ margin-top: 16px;
+}
+
+.content {
+ width: 100%;
+ height: fit-content;
+ background-color: #fff;
+ border-radius: 30px 30px 0 0;
+ min-height: calc(100dvh - 39px - 26px * 1.25 - 29px);
+ margin-top: 12px;
+ padding: 24px 16px 160px;
+ color: #000;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+
+ & > .contentTitle {
+ font-size: 24px;
+ line-height: 32px;
+ font-weight: 700;
+ color: #111827;
+ }
+
+ & > .contentDescription {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ font-size: 18px;
+ font-weight: 600;
+ line-height: 28px;
+ color: #111827;
+ margin-top: 19px;
+ }
+
+ & > .contentPolicy {
+ font-size: 12px;
+ line-height: 125%;
+ font-weight: 300;
+ margin-bottom: 0;
+ margin-top: 39px;
+ text-align: center;
+ color: #6f6d6d;
+
+ & > a {
+ text-decoration: underline;
+ }
+ }
+
+ & > .button {
+ margin-top: 59px;
+ max-width: 307px;
+ }
+}
diff --git a/src/app/[locale]/(email-marketing)/em/(soulmate)/s/v1/special-offer/page.tsx b/src/app/[locale]/(email-marketing)/em/(soulmate)/s/v1/special-offer/page.tsx
new file mode 100644
index 0000000..b48acac
--- /dev/null
+++ b/src/app/[locale]/(email-marketing)/em/(soulmate)/s/v1/special-offer/page.tsx
@@ -0,0 +1,101 @@
+import Link from "next/link";
+import { getTranslations } from "next-intl/server";
+
+import {
+ HeaderTimer,
+ PricingSummary,
+ SpecialOfferButtonWrapper,
+} from "@/components/domains/email-marketing/compatibility/v2";
+import { Typography } from "@/components/ui";
+import { loadFunnelPaymentById } from "@/entities/session/funnel/loaders";
+import { IFunnelPaymentPlacement } from "@/entities/session/funnel/types";
+import { translatePathEmailMarketingSoulmateV1 } from "@/shared/constants/translate";
+import { getPeriodTextServer } from "@/shared/utils/period-server";
+import { getFormattedPrice } from "@/shared/utils/price";
+import { Currency, ELocalesPlacement } from "@/types";
+
+import GuaranteeIcon from "./guarantee.svg";
+
+import styles from "./page.module.scss";
+
+const payload = {
+ funnel: ELocalesPlacement.EmailMarketingSoulmateV1,
+};
+
+export default async function SpecialOfferPage() {
+ const t = await getTranslations(
+ translatePathEmailMarketingSoulmateV1("SpecialOffer")
+ );
+
+ const payment = (await loadFunnelPaymentById(
+ payload,
+ "main"
+ )) as IFunnelPaymentPlacement | null;
+
+ const trialInterval = payment?.trialInterval || 7;
+ const trialPeriod = payment?.trialPeriod || "DAY";
+ const billingInterval = payment?.billingInterval || 7;
+ const billingPeriod = payment?.billingPeriod || "DAY";
+ const variant = payment?.variants?.[0];
+ const productId = variant?.id || "";
+ const placementId = payment?.placementId || "";
+ const paywallId = payment?.paywallId || "";
+ const trialPrice = variant?.trialPrice || 0;
+ const price = variant?.price || 0;
+ const currency = payment?.currency || Currency.USD;
+
+ return (
+
+
+
+ {t("title")}
+
+
+
+ {t("start-trial", { days: trialInterval })}
+
+
+
+ {t("cancel-anytime")}
+
+
+
+
+
+
+
+ {t.rich("policy", {
+ days: trialInterval,
+ price: getFormattedPrice(price, currency),
+ billingPeriod: await getPeriodTextServer(
+ billingPeriod,
+ billingInterval
+ ),
+ refundLink: chunks => (
+
+ {chunks}
+
+ ),
+ subscriptionLink: chunks => (
+
+ {chunks}
+
+ ),
+ })}
+
+
+
+ );
+}
diff --git a/src/components/domains/chat/ChatMessage/MessageBubble/MessageBubble.tsx b/src/components/domains/chat/ChatMessage/MessageBubble/MessageBubble.tsx
index 3446299..b5c503c 100644
--- a/src/components/domains/chat/ChatMessage/MessageBubble/MessageBubble.tsx
+++ b/src/components/domains/chat/ChatMessage/MessageBubble/MessageBubble.tsx
@@ -2,14 +2,24 @@ import clsx from "clsx";
import styles from "./MessageBubble.module.scss";
-interface MessageBubbleProps {
+interface MessageBubbleProps extends React.ComponentProps<"div"> {
isOwn: boolean;
children: React.ReactNode;
}
-export default function MessageBubble({ isOwn, children }: MessageBubbleProps) {
+export default function MessageBubble({
+ isOwn,
+ children,
+ className,
+}: MessageBubbleProps) {
return (
-
+
{children}
);
diff --git a/src/components/domains/chat/ChatMessage/MessageMeta/MessageMeta.tsx b/src/components/domains/chat/ChatMessage/MessageMeta/MessageMeta.tsx
index 8358043..84e0dac 100644
--- a/src/components/domains/chat/ChatMessage/MessageMeta/MessageMeta.tsx
+++ b/src/components/domains/chat/ChatMessage/MessageMeta/MessageMeta.tsx
@@ -1,17 +1,25 @@
+import clsx from "clsx";
+
import { Typography } from "@/components/ui";
import styles from "./MessageMeta.module.scss";
-interface MessageMetaProps {
+interface MessageMetaProps extends React.ComponentProps<"div"> {
time: string | null;
+ timeClassName?: string;
children?: React.ReactNode;
}
-export default function MessageMeta({ time, children }: MessageMetaProps) {
+export default function MessageMeta({
+ time,
+ timeClassName,
+ children,
+ className,
+}: MessageMetaProps) {
return (
-
+
{time && (
-
+
{time}
)}
diff --git a/src/components/domains/chat/ChatMessage/MessageText/MessageText.tsx b/src/components/domains/chat/ChatMessage/MessageText/MessageText.tsx
index e6c7bd6..54ad362 100644
--- a/src/components/domains/chat/ChatMessage/MessageText/MessageText.tsx
+++ b/src/components/domains/chat/ChatMessage/MessageText/MessageText.tsx
@@ -1,3 +1,5 @@
+"use client";
+
import clsx from "clsx";
import { Typography } from "@/components/ui";
diff --git a/src/components/domains/chat/index.ts b/src/components/domains/chat/index.ts
index 905530e..577936a 100644
--- a/src/components/domains/chat/index.ts
+++ b/src/components/domains/chat/index.ts
@@ -11,6 +11,10 @@ export {
default as ChatMessage,
type ChatMessageProps,
} from "./ChatMessage/ChatMessage";
+export { default as MessageBubble } from "./ChatMessage/MessageBubble/MessageBubble";
+export { default as MessageMeta } from "./ChatMessage/MessageMeta/MessageMeta";
+export { default as MessageStatus } from "./ChatMessage/MessageStatus/MessageStatus";
+export { default as MessageText } from "./ChatMessage/MessageText/MessageText";
export { default as ChatMessages } from "./ChatMessages/ChatMessages";
export {
default as ChatMessagesWrapper,
diff --git a/src/components/domains/dashboard/sections/AdvisersSection/AdvisersSection.tsx b/src/components/domains/dashboard/sections/AdvisersSection/AdvisersSection.tsx
index b8747c5..addacd3 100644
--- a/src/components/domains/dashboard/sections/AdvisersSection/AdvisersSection.tsx
+++ b/src/components/domains/dashboard/sections/AdvisersSection/AdvisersSection.tsx
@@ -16,7 +16,7 @@ interface AdvisersSectionProps {
}
const getChatByAssistantId = (assistantId: string, chats: IChat[]) => {
- return chats.find(chat => chat.assistantId === assistantId) || null;
+ return chats?.find(chat => chat.assistantId === assistantId) || null;
};
const getOptimalColumns = (count: number) => {
diff --git a/src/components/domains/email-marketing/compatibility/v2/DetailedPortraitCard/DetailedPortraitCard.module.scss b/src/components/domains/email-marketing/compatibility/v2/DetailedPortraitCard/DetailedPortraitCard.module.scss
new file mode 100644
index 0000000..2084e80
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/DetailedPortraitCard/DetailedPortraitCard.module.scss
@@ -0,0 +1,43 @@
+.card {
+ width: 100%;
+ margin-top: 21px;
+ background-color: #fff;
+ box-shadow: 0px 2px 11px 0px #00000024;
+ padding: 24px 5px 5px 5px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 8px;
+ border-radius: 24px;
+
+ & > .header {
+ display: flex;
+ gap: 16px;
+ padding-left: 19px;
+ padding-right: 10px;
+
+ & > .icon-container {
+ width: 48px;
+ height: 48px;
+ border-radius: 16px;
+ background-color: #fce7f3;
+ flex-shrink: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ & > .title {
+ font-size: 18px;
+ font-weight: 600;
+ line-height: 28px;
+ color: #111827;
+ }
+ }
+
+ & > .portrait {
+ max-height: 311px;
+ object-fit: cover;
+ border-radius: 24px;
+ }
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/DetailedPortraitCard/DetailedPortraitCard.tsx b/src/components/domains/email-marketing/compatibility/v2/DetailedPortraitCard/DetailedPortraitCard.tsx
new file mode 100644
index 0000000..1fc6854
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/DetailedPortraitCard/DetailedPortraitCard.tsx
@@ -0,0 +1,69 @@
+"use client";
+
+import Image from "next/image";
+import { useTranslations } from "next-intl";
+
+import { Typography } from "@/components/ui";
+import { useUser } from "@/providers/user-provider";
+import { emailMarketingCompV2Images } from "@/shared/constants/images";
+import { translatePathEmailMarketingSoulmateV1 } from "@/shared/constants/translate";
+
+import styles from "./DetailedPortraitCard.module.scss";
+
+export default function DetailedPortraitCard() {
+ const t = useTranslations(
+ translatePathEmailMarketingSoulmateV1(
+ "Landing.what-get.detailed-portrait"
+ )
+ );
+ const { user } = useUser();
+ const gender = user?.profile?.gender;
+
+ return (
+
+
+
+
+ {t("header.title")}{" "}
+
+
+
+
+
+ );
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/GuaranteedSecurityPayments/GuaranteedSecurityPayments.module.scss b/src/components/domains/email-marketing/compatibility/v2/GuaranteedSecurityPayments/GuaranteedSecurityPayments.module.scss
new file mode 100644
index 0000000..6ffabb4
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/GuaranteedSecurityPayments/GuaranteedSecurityPayments.module.scss
@@ -0,0 +1,14 @@
+.container {
+ width: 100%;
+ max-width: 265px;
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ margin-top: 30px;
+
+ & > .text {
+ font-size: 15px;
+ line-height: 25px;
+ color: #000;
+ }
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/GuaranteedSecurityPayments/GuaranteedSecurityPayments.tsx b/src/components/domains/email-marketing/compatibility/v2/GuaranteedSecurityPayments/GuaranteedSecurityPayments.tsx
new file mode 100644
index 0000000..5c084e2
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/GuaranteedSecurityPayments/GuaranteedSecurityPayments.tsx
@@ -0,0 +1,27 @@
+import Image from "next/image";
+import { useTranslations } from "next-intl";
+
+import { Typography } from "@/components/ui";
+import { emailMarketingCompV2Images } from "@/shared/constants/images";
+import { translatePathEmailMarketingSoulmateV1 } from "@/shared/constants/translate";
+
+import styles from "./GuaranteedSecurityPayments.module.scss";
+
+export default function GuaranteedSecurityPayments() {
+ const t = useTranslations(
+ translatePathEmailMarketingSoulmateV1("Landing")
+ );
+ return (
+
+
+
+ {t("guaranteed-security-payments")}
+
+
+ );
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/GuideCard/GuideCard.module.scss b/src/components/domains/email-marketing/compatibility/v2/GuideCard/GuideCard.module.scss
new file mode 100644
index 0000000..63ccd4f
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/GuideCard/GuideCard.module.scss
@@ -0,0 +1,83 @@
+.card {
+ position: relative;
+ width: 100%;
+ margin-top: 30px;
+ background: linear-gradient(135deg, #a855f7 0%, #4f46e5 70.71%);
+ box-shadow: 0px 2px 11px 0px #00000024;
+ padding: 24px 24px 0;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 16px;
+ border-radius: 24px;
+ overflow: hidden;
+
+ & > .header {
+ display: flex;
+ gap: 16px;
+
+ & > .icon-container {
+ width: 48px;
+ height: 48px;
+ border-radius: 16px;
+ background: #ffffff33;
+ flex-shrink: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ & > .title {
+ font-size: 18px;
+ font-weight: 600;
+ line-height: 28px;
+ }
+ }
+
+ & > .list-container {
+ width: 100%;
+ padding: 20px 16px 0 16px;
+ display: flex;
+ flex-direction: column;
+ gap: 12px;
+ background: #ffffff1a;
+ border-radius: 16px 16px 0 0;
+
+ & > .item {
+ display: flex;
+ gap: 12px;
+
+ & > .number {
+ background: #ffffff33;
+ border-radius: 50%;
+ width: 32px;
+ height: 32px;
+ flex-shrink: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: #fff;
+ font-weight: 700;
+ font-size: 14px;
+ }
+
+ & > .item-text {
+ font-size: 14px;
+ line-height: 20px;
+ }
+ }
+ }
+
+ & > .blur.blur {
+ position: absolute;
+ width: 100%;
+ height: 94px;
+ bottom: 0;
+ left: 0;
+ background: #f8fafc8f;
+
+ & > .blur-gradient {
+ inset: -30px -100px -30px;
+ }
+ }
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/GuideCard/GuideCard.tsx b/src/components/domains/email-marketing/compatibility/v2/GuideCard/GuideCard.tsx
new file mode 100644
index 0000000..cc58c49
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/GuideCard/GuideCard.tsx
@@ -0,0 +1,60 @@
+import { getTranslations } from "next-intl/server";
+
+import { Typography } from "@/components/ui";
+import { BlurComponent } from "@/components/widgets";
+import { translatePathEmailMarketingSoulmateV1 } from "@/shared/constants/translate";
+
+import styles from "./GuideCard.module.scss";
+
+export default async function GuideCard() {
+ const t = await getTranslations(
+ translatePathEmailMarketingSoulmateV1("Landing.what-get.guide")
+ );
+
+ const list = t.raw("list") as Record;
+ const listItems = Object.values(list);
+
+ return (
+
+
+
+
+ {t("header.title")}
+
+
+
+ {listItems.map((item, index) => (
+
+
{index + 1}
+
+ {item}
+
+
+ ))}
+
+
+
+ );
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/Header/Header.module.scss b/src/components/domains/email-marketing/compatibility/v2/Header/Header.module.scss
new file mode 100644
index 0000000..e4ac45a
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/Header/Header.module.scss
@@ -0,0 +1,29 @@
+.header {
+ background: linear-gradient(135deg, #eef2ff 0%, #faf5ff 70.71%);
+ padding: 26px 0 22px;
+ width: 100%;
+ display: flex;
+ align-items: flex-start;
+ gap: 8px;
+
+ & > .text-container {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 12px;
+
+ & > .title {
+ font-size: 36px;
+ font-weight: 700;
+ line-height: 40px;
+ color: #111827;
+ }
+
+ & > .description {
+ font-size: 20px;
+ font-weight: 500;
+ line-height: 24px;
+ color: #4b5563;
+ }
+ }
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/Header/Header.tsx b/src/components/domains/email-marketing/compatibility/v2/Header/Header.tsx
new file mode 100644
index 0000000..08328cc
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/Header/Header.tsx
@@ -0,0 +1,37 @@
+import { getTranslations } from "next-intl/server";
+
+import { Typography } from "@/components/ui";
+import { translatePathEmailMarketingSoulmateV1 } from "@/shared/constants/translate";
+
+import styles from "./Header.module.scss";
+
+export default async function Header() {
+ const t = await getTranslations(
+ translatePathEmailMarketingSoulmateV1("Landing.header")
+ );
+
+ return (
+
+ );
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/HeaderTimer/HeaderTimer.module.scss b/src/components/domains/email-marketing/compatibility/v2/HeaderTimer/HeaderTimer.module.scss
new file mode 100644
index 0000000..e6a0004
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/HeaderTimer/HeaderTimer.module.scss
@@ -0,0 +1,13 @@
+.container {
+ width: calc(100% + 32px);
+ padding: 14px 31px;
+ background: #ef4444;
+ position: sticky;
+ top: 0;
+ z-index: 8888;
+
+ & > .title {
+ font-size: 18px;
+ font-weight: 600;
+ }
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/HeaderTimer/HeaderTimer.tsx b/src/components/domains/email-marketing/compatibility/v2/HeaderTimer/HeaderTimer.tsx
new file mode 100644
index 0000000..c7a64f9
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/HeaderTimer/HeaderTimer.tsx
@@ -0,0 +1,31 @@
+"use client";
+
+import { useTranslations } from "next-intl";
+import clsx from "clsx";
+
+import { Typography } from "@/components/ui";
+import { useTimer } from "@/hooks/timer/useTimer";
+import { translatePathEmailMarketingSoulmateV1 } from "@/shared/constants/translate";
+
+import styles from "./HeaderTimer.module.scss";
+
+type IHeaderTimerProps = React.ComponentProps<"div">;
+
+export default function HeaderTimer({ className }: IHeaderTimerProps) {
+ const t = useTranslations(
+ translatePathEmailMarketingSoulmateV1("Landing.header-timer")
+ );
+ const { time } = useTimer({
+ initialSeconds: 600,
+ persist: true,
+ storageKey: "email-marketing-v2-timer",
+ });
+
+ return (
+
+
+ {t("title", { time })}
+
+
+ );
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/HiBlock/HiBlock.module.scss b/src/components/domains/email-marketing/compatibility/v2/HiBlock/HiBlock.module.scss
new file mode 100644
index 0000000..220b96e
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/HiBlock/HiBlock.module.scss
@@ -0,0 +1,98 @@
+.container {
+ display: flex;
+ flex-direction: column;
+ gap: 14px;
+
+ & > .text-container {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 8px;
+ padding-left: 15px;
+
+ & > .title {
+ font-size: 24px;
+ font-weight: 600;
+ line-height: 32px;
+ color: #111827;
+ }
+
+ & > .description {
+ font-size: 18px;
+ font-weight: 500;
+ line-height: 24px;
+ color: #4b5563;
+ }
+ }
+
+ & > .card {
+ width: 100%;
+ border-radius: 28px;
+ padding: 15px 5px 5px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 32px;
+ background: linear-gradient(135deg, #f37eb7 0%, #9333ea 70.71%);
+
+ & > .title {
+ font-size: 20px;
+ font-weight: 500;
+ line-height: 30px;
+ padding-inline: 18px;
+ }
+
+ & > .image-container {
+ width: 100%;
+ height: 220px;
+ background-size: cover;
+ background-position: top;
+ background-repeat: no-repeat;
+ border-radius: 24px;
+ box-shadow: 0px 6px 50px 0px #00000040;
+ display: flex;
+ align-items: flex-end;
+ justify-content: space-around;
+ gap: 9px;
+ padding: 15px 10px 15px 20px;
+
+ & > .avatars {
+ display: flex;
+
+ & > .avatar {
+ border: 2px solid #fff;
+ box-shadow: 0px 4px 4px 0px #00000040;
+ width: 36px;
+ }
+
+ & > .count {
+ height: 36px;
+ background-color: #fff;
+ border-radius: 9999px;
+ color: #ff6b9d;
+ font-size: 12px;
+ font-weight: 700;
+ padding-inline: 6px;
+ box-shadow:
+ 0px 4px 6px 0px #0000001a,
+ 0px 2px 4px 0px #0000001a;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ z-index: 1;
+ }
+
+ & > *:not(:first-child) {
+ margin-left: -8px;
+ }
+ }
+
+ & > .description {
+ font-size: 14px;
+ line-height: 20px;
+ text-shadow: 0px 1px 5px 0px #000000fc;
+ width: fit-content;
+ }
+ }
+ }
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/HiBlock/HiBlock.tsx b/src/components/domains/email-marketing/compatibility/v2/HiBlock/HiBlock.tsx
new file mode 100644
index 0000000..2c8cde6
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/HiBlock/HiBlock.tsx
@@ -0,0 +1,72 @@
+import { getTranslations } from "next-intl/server";
+
+import { Typography, UserAvatar } from "@/components/ui";
+import { emailMarketingCompV2Images } from "@/shared/constants/images";
+import { translatePathEmailMarketingSoulmateV1 } from "@/shared/constants/translate";
+
+import styles from "./HiBlock.module.scss";
+
+export default async function HiBlock() {
+ const t = await getTranslations(
+ translatePathEmailMarketingSoulmateV1("Landing.hi-block")
+ );
+
+ return (
+
+
+
+ {t("title")}
+
+
+ {t("description")}
+
+
+
+
+ {t("card.title")}
+
+
+
+
+
+
+ {t("card.count")}
+
+
+ {t("card.image-description")}
+
+
+
+
+ );
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/IndividualAdviceCard/IndividualAdviceCard.module.scss b/src/components/domains/email-marketing/compatibility/v2/IndividualAdviceCard/IndividualAdviceCard.module.scss
new file mode 100644
index 0000000..8ed5fe9
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/IndividualAdviceCard/IndividualAdviceCard.module.scss
@@ -0,0 +1,97 @@
+.card {
+ width: 100%;
+ margin-top: 30px;
+ background-color: #fff;
+ box-shadow: 0px 2px 11px 0px #00000024;
+ padding: 24px 5px 5px 5px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 21px;
+ border-radius: 24px;
+
+ & > .header {
+ display: flex;
+ gap: 16px;
+ padding-left: 19px;
+ padding-right: 10px;
+
+ & > .icon-container {
+ width: 48px;
+ height: 48px;
+ border-radius: 16px;
+ background-color: #fce7f3;
+ flex-shrink: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ & > .title {
+ font-size: 18px;
+ font-weight: 600;
+ line-height: 28px;
+ color: #111827;
+ }
+ }
+
+ & > .messages {
+ display: flex;
+ flex-direction: column;
+ padding-left: 13px;
+ padding-right: 11px;
+ gap: 27px;
+
+ & > .message-container {
+ width: fit-content;
+ display: flex;
+ flex-direction: column;
+ max-width: calc(100% - 35px);
+ gap: 8px;
+
+ &.own {
+ align-items: flex-end;
+ align-self: flex-end;
+ margin-left: auto;
+ }
+
+ & > .message {
+ &.advisor {
+ background: #efeded;
+ box-shadow: 0px 1px 5px 0px #00000054;
+ }
+
+ &.own > .meta > .metaTime {
+ color: #fff;
+ }
+
+ & > .meta {
+ justify-content: flex-end;
+ margin-top: -12px;
+ padding-right: 12px;
+ padding-bottom: 7px;
+ }
+ }
+ }
+ }
+
+ & > .typingContainer {
+ width: 100%;
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ padding-inline: 13px;
+ padding-bottom: 13px;
+ margin-top: -6px;
+
+ & > .text {
+ color: #6b7280;
+ font-size: 14px;
+ line-height: 16px;
+
+ & > svg {
+ display: inline-block;
+ }
+ }
+ }
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/IndividualAdviceCard/IndividualAdviceCard.tsx b/src/components/domains/email-marketing/compatibility/v2/IndividualAdviceCard/IndividualAdviceCard.tsx
new file mode 100644
index 0000000..5290c7a
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/IndividualAdviceCard/IndividualAdviceCard.tsx
@@ -0,0 +1,108 @@
+import { getTranslations } from "next-intl/server";
+import clsx from "clsx";
+
+import {
+ MessageBubble,
+ MessageMeta,
+ MessageStatus,
+ MessageText,
+} from "@/components/domains/chat";
+import { Typography, UserAvatar } from "@/components/ui";
+import { emailMarketingCompV2Images } from "@/shared/constants/images";
+import { translatePathEmailMarketingSoulmateV1 } from "@/shared/constants/translate";
+
+import styles from "./IndividualAdviceCard.module.scss";
+
+interface IMessage {
+ text: string;
+ time: string;
+}
+
+type TMessagesKey = "me" | "advisor";
+
+export default async function IndividualAdviceCard() {
+ const t = await getTranslations(
+ translatePathEmailMarketingSoulmateV1(
+ "Landing.what-get.individual-advice"
+ )
+ );
+
+ const messages = t.raw("messages") as Record;
+
+ return (
+
+
+
+
+ {t("header.title")}
+
+
+
+ {(Object.keys(messages) as TMessagesKey[]).map((key, index) => {
+ const isOwn = key === "me";
+ return (
+
+
+
+
+
+
+
+
+
+ );
+ })}
+
+
+
+
+ {t("typing")}
+
+
+
+
+ );
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/LandingButtonWrapper/LandingButtonWrapper.module.scss b/src/components/domains/email-marketing/compatibility/v2/LandingButtonWrapper/LandingButtonWrapper.module.scss
new file mode 100644
index 0000000..8bec40a
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/LandingButtonWrapper/LandingButtonWrapper.module.scss
@@ -0,0 +1,26 @@
+.buttonContainer {
+ width: 100%;
+ display: flex;
+ justify-content: center;
+ position: fixed;
+ bottom: 0;
+ pointer-events: none;
+ z-index: 9999;
+ padding-inline: 8px;
+
+ .buttonContinue {
+ position: relative;
+ z-index: 1000;
+ max-width: 358px;
+ min-height: 62px;
+ margin-top: 48px;
+ margin-bottom: 25px;
+ pointer-events: all;
+ background: linear-gradient(90deg, #3b82f6 0%, #2563eb 100%);
+
+ & > .text {
+ font-size: 18px;
+ font-weight: 500;
+ }
+ }
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/LandingButtonWrapper/LandingButtonWrapper.tsx b/src/components/domains/email-marketing/compatibility/v2/LandingButtonWrapper/LandingButtonWrapper.tsx
new file mode 100644
index 0000000..33ef6ef
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/LandingButtonWrapper/LandingButtonWrapper.tsx
@@ -0,0 +1,34 @@
+"use client";
+
+import { useRouter } from "next/navigation";
+import { useTranslations } from "next-intl";
+
+import { Button, Typography } from "@/components/ui";
+import { BlurComponent } from "@/components/widgets";
+import { ROUTES } from "@/shared/constants/client-routes";
+import { translatePathEmailMarketingSoulmateV1 } from "@/shared/constants/translate";
+
+import styles from "./LandingButtonWrapper.module.scss";
+
+export default function LandingButtonWrapper() {
+ const router = useRouter();
+ const t = useTranslations(
+ translatePathEmailMarketingSoulmateV1("Landing")
+ );
+
+ const handleContinue = () => {
+ router.push(ROUTES.emailMarketingSoulmateV1SpecialOffer());
+ };
+
+ return (
+
+
+
+
+
+ );
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/MoneyBackGuarantee/MoneyBackGuarantee.module.scss b/src/components/domains/email-marketing/compatibility/v2/MoneyBackGuarantee/MoneyBackGuarantee.module.scss
new file mode 100644
index 0000000..377d6c5
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/MoneyBackGuarantee/MoneyBackGuarantee.module.scss
@@ -0,0 +1,77 @@
+.container {
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ padding: 25px 34px;
+ background: linear-gradient(135deg, #17a34c 0%, #064e3b 70.71%);
+ border: 2px solid #15803d;
+ border-radius: 28px;
+ box-shadow:
+ 0px 10px 15px 0px #0000001a,
+ 0px 4px 6px 0px #0000001a;
+ margin-top: 30px;
+
+ & > .iconContainer {
+ width: 68px;
+ height: 68px;
+ border-radius: 50%;
+ background: #d9d9d9e5;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ & > .title {
+ font-size: 20px;
+ font-weight: 700;
+ line-height: 28px;
+ margin-top: 9px;
+ }
+
+ & > .term {
+ padding: 8px 13px;
+ border-radius: 9999px;
+ background: #d9d9d9e5;
+ margin-top: 8px;
+ font-size: 12px;
+ font-weight: 700;
+ color: #252525;
+ }
+
+ & > .descriptionContainer {
+ margin-top: 28px;
+ width: 100%;
+ background: #15803d;
+ border: 1px solid #16a34a;
+ border-radius: 24px;
+ box-shadow: 0px 1px 2px 0px #0000000d;
+ padding: 19px 20px 12px;
+
+ & > .description {
+ font-size: 14px;
+ font-weight: 300;
+ line-height: 21px;
+ color: #f4f4f4;
+
+ & > b {
+ font-weight: 700;
+ color: #fff;
+ }
+ }
+ }
+
+ & > .footer {
+ margin-top: 18px;
+ display: grid;
+ grid-template-columns: 16px 1fr;
+ gap: 8px;
+
+ & > .text {
+ font-size: 14px;
+ font-weight: 600;
+ line-height: 20px;
+ color: #bbf7d0;
+ }
+ }
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/MoneyBackGuarantee/MoneyBackGuarantee.tsx b/src/components/domains/email-marketing/compatibility/v2/MoneyBackGuarantee/MoneyBackGuarantee.tsx
new file mode 100644
index 0000000..0291ee3
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/MoneyBackGuarantee/MoneyBackGuarantee.tsx
@@ -0,0 +1,51 @@
+import { getTranslations } from "next-intl/server";
+
+import { Typography } from "@/components/ui";
+import { translatePathEmailMarketingSoulmateV1 } from "@/shared/constants/translate";
+
+import GuaranteeIcon from "./guarantee.svg";
+
+import styles from "./MoneyBackGuarantee.module.scss";
+
+export default async function MoneyBackGuarantee() {
+ const t = await getTranslations(
+ translatePathEmailMarketingSoulmateV1("Landing.money-back-guarantee")
+ );
+ return (
+
+
+
+
+
+ {t("title")}
+
+
+ {t("term")}
+
+
+
+ {t.rich("description", {
+ bold: chunks => {chunks},
+ })}
+
+
+
+
+
+ {t("footer")}
+
+
+
+ );
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/MoneyBackGuarantee/guarantee.svg b/src/components/domains/email-marketing/compatibility/v2/MoneyBackGuarantee/guarantee.svg
new file mode 100644
index 0000000..2d6d30b
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/MoneyBackGuarantee/guarantee.svg
@@ -0,0 +1,24 @@
+
diff --git a/src/components/domains/email-marketing/compatibility/v2/Payments/Payments.module.scss b/src/components/domains/email-marketing/compatibility/v2/Payments/Payments.module.scss
new file mode 100644
index 0000000..77b0df2
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/Payments/Payments.module.scss
@@ -0,0 +1,8 @@
+.container {
+ width: 100%;
+ margin: 20px auto 0;
+
+ & > img {
+ width: 100%;
+ }
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/Payments/Payments.tsx b/src/components/domains/email-marketing/compatibility/v2/Payments/Payments.tsx
new file mode 100644
index 0000000..1737f94
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/Payments/Payments.tsx
@@ -0,0 +1,20 @@
+import Image from "next/image";
+
+import {
+ emailMarketingCompV2Images,
+} from "@/shared/constants/images";
+
+import styles from "./Payments.module.scss";
+
+export default function Payments() {
+ return (
+
+
+
+ );
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/PlanAlsoIncludes/PlanAlsoIncludes.module.scss b/src/components/domains/email-marketing/compatibility/v2/PlanAlsoIncludes/PlanAlsoIncludes.module.scss
new file mode 100644
index 0000000..c1ae751
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/PlanAlsoIncludes/PlanAlsoIncludes.module.scss
@@ -0,0 +1,48 @@
+.container {
+ width: 100%;
+ margin-top: 41px;
+
+ & > .title {
+ font-size: 18px;
+ font-weight: 600;
+ color: #111827;
+ }
+
+ & > .list {
+ width: calc(100% - 48px);
+ margin-inline: auto;
+ margin-top: 16px;
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 8px;
+
+ & > .item {
+ display: grid;
+ grid-template-columns: 13px 1fr;
+ gap: 17px;
+
+ & > svg {
+ margin-top: 12px;
+ }
+
+ & > .textContainer {
+ display: flex;
+ flex-direction: column;
+ & > .title {
+ font-size: 16px;
+ font-weight: 500;
+ line-height: 24px;
+ color: #374151;
+ }
+
+ & > .text {
+ font-size: 14px;
+ font-weight: 400;
+ line-height: 24px;
+ color: #374151;
+ }
+ }
+ }
+ }
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/PlanAlsoIncludes/PlanAlsoIncludes.tsx b/src/components/domains/email-marketing/compatibility/v2/PlanAlsoIncludes/PlanAlsoIncludes.tsx
new file mode 100644
index 0000000..75f1ef8
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/PlanAlsoIncludes/PlanAlsoIncludes.tsx
@@ -0,0 +1,55 @@
+import { getTranslations } from "next-intl/server";
+
+import { Typography } from "@/components/ui";
+import { translatePathEmailMarketingSoulmateV1 } from "@/shared/constants/translate";
+
+import styles from "./PlanAlsoIncludes.module.scss";
+
+interface IListItem {
+ title: string;
+ text: string;
+}
+
+export default async function PlanAlsoIncludes() {
+ const t = await getTranslations(
+ translatePathEmailMarketingSoulmateV1("Landing.plan-also-includes")
+ );
+
+ const listItems = Object.values(
+ t.raw("list.items") as Record
+ );
+
+ return (
+
+ );
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/Prices/Prices.module.scss b/src/components/domains/email-marketing/compatibility/v2/Prices/Prices.module.scss
new file mode 100644
index 0000000..5b01cb0
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/Prices/Prices.module.scss
@@ -0,0 +1,117 @@
+.container {
+ width: 100%;
+ max-width: 300px;
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-top: 19px;
+ margin-inline: auto;
+}
+
+.oldPriceContainer {
+ position: relative;
+ // width: fit-content;
+ width: 128px;
+ aspect-ratio: 1 / 1;
+ padding: 16px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 4px;
+
+ &::before {
+ background: linear-gradient(135deg, #d1d5db 0%, #767b83 70.71%);
+ border: 6px solid #ffffff;
+ border-radius: 24px;
+ box-shadow: 0px 4px 6px 0px #0000001a;
+ content: "";
+ position: absolute;
+ inset: 0;
+ z-index: 0;
+ opacity: 0.6;
+ }
+
+ & * {
+ z-index: 1;
+ }
+
+ & > .discount {
+ position: absolute;
+ top: -15px;
+ right: -8px;
+ padding: 6px;
+ padding-inline: 8px;
+ background-color: #ef4444;
+ border-radius: 9999px;
+ font-size: 16px;
+ font-weight: 700;
+ color: #fff;
+ }
+
+ & > .oldPrice {
+ font-size: 24px;
+ font-weight: 700;
+ text-decoration: line-through;
+ }
+
+ & > .oldPriceDescription {
+ font-size: 14px;
+ font-weight: 600;
+ line-height: 16px;
+ }
+}
+
+.newPriceContainer {
+ position: relative;
+ // width: fit-content;
+ width: 128px;
+ aspect-ratio: 1 / 1;
+ padding: 16px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ gap: 8px;
+
+ &::before {
+ background: linear-gradient(90deg, #ffc7f3 0%, #c590ff 100%);
+ border-radius: 28px;
+ content: "";
+ position: absolute;
+ inset: -8px;
+ z-index: 0;
+ opacity: 0.75;
+ }
+
+ &::after {
+ content: "";
+ position: absolute;
+ inset: 0px;
+ z-index: 0;
+ background: linear-gradient(
+ 135deg,
+ #ec4899 0%,
+ #9333ea 35.36%,
+ #4338ca 70.71%
+ );
+ box-shadow: 0px 2px 7px 0px #000000ad;
+ border-radius: 24px;
+ }
+
+ & * {
+ z-index: 1;
+ }
+
+ & > .newPrice {
+ font-size: 36px;
+ font-weight: 900;
+ }
+
+ & > .newPriceDescription {
+ font-size: 16px;
+ font-weight: 700;
+ line-height: 20px;
+ color: #ffffffe5;
+ }
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/Prices/Prices.tsx b/src/components/domains/email-marketing/compatibility/v2/Prices/Prices.tsx
new file mode 100644
index 0000000..46b00f8
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/Prices/Prices.tsx
@@ -0,0 +1,52 @@
+import { getTranslations } from "next-intl/server";
+
+import { Typography } from "@/components/ui";
+import { translatePathEmailMarketingSoulmateV1 } from "@/shared/constants/translate";
+import { getFormattedPrice } from "@/shared/utils/price";
+import { Currency } from "@/types";
+
+import styles from "./Prices.module.scss";
+
+interface IPricesProps {
+ oldPrice: number;
+ newPrice: number;
+ currency: Currency;
+}
+
+const computeDiscount = (oldPrice: number, newPrice: number) => {
+ return Math.ceil(((oldPrice - newPrice) / oldPrice) * 100);
+};
+
+export default async function Prices({
+ oldPrice,
+ newPrice,
+ currency,
+}: IPricesProps) {
+ const t = await getTranslations(
+ translatePathEmailMarketingSoulmateV1("Landing.special-offer.prices")
+ );
+
+ return (
+
+
+
+ -{computeDiscount(oldPrice, newPrice)}%
+
+
+ {getFormattedPrice(oldPrice, currency)}
+
+
+ {t("old-price.description")}
+
+
+
+
+ {getFormattedPrice(newPrice, currency)}
+
+
+ {t("new-price.description")}
+
+
+
+ );
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/PricingSummary/PricingSummary.module.scss b/src/components/domains/email-marketing/compatibility/v2/PricingSummary/PricingSummary.module.scss
new file mode 100644
index 0000000..4c935f4
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/PricingSummary/PricingSummary.module.scss
@@ -0,0 +1,124 @@
+.container {
+ display: flex;
+ align-items: center;
+ flex-direction: column;
+ width: 100%;
+
+ & > .title {
+ margin-top: 8px;
+ font-size: 18px;
+ font-weight: 700;
+ line-height: 28px;
+ color: #22c55e;
+ }
+
+ & > .description {
+ max-width: 327px;
+ font-size: 12px;
+ line-height: 20px;
+ margin-top: 20px;
+ text-align: center;
+ color: #6b7280;
+ }
+}
+
+.table {
+ background: #ededed;
+ border-radius: 24px;
+ padding: 12px 16px;
+ width: 100%;
+ margin-top: 18px;
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+
+ & > .description {
+ font-size: 14px;
+ line-height: 20px;
+ color: #6b7280;
+ max-width: 196px;
+ }
+}
+
+.row {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ width: 100%;
+ padding: 12px 32px 12px 17px;
+ background: #ffffff;
+ box-shadow: 0px 1px 2px 0px #0000000d;
+ border-radius: 20px;
+
+ & > .label {
+ font-size: 18px;
+ font-weight: 500;
+ color: #111827;
+ }
+}
+
+.totalRow {
+ & > .price {
+ font-size: 24px;
+ font-weight: 700;
+ line-height: 32px;
+ color: #111827;
+ }
+}
+
+.codeRow {
+ & > .prices {
+ display: flex;
+ align-items: center;
+ gap: 16px;
+
+ & > .oldPrice {
+ font-size: 18px;
+ line-height: 28px;
+ text-decoration: line-through;
+ color: #9ca3af;
+ }
+
+ & > .price {
+ font-size: 18px;
+ font-weight: 700;
+ line-height: 32px;
+ color: #111827;
+ }
+ }
+}
+
+.costRow {
+ background-color: #ededed;
+ border-radius: 32px;
+ font-size: 17px;
+ line-height: 125%;
+ margin-top: 17px;
+
+ .label {
+ font-size: 14px;
+ font-weight: 500;
+ max-width: 60%;
+ line-height: 125%;
+ }
+
+ .prices {
+ display: flex;
+ gap: 14px;
+ align-items: flex-end;
+ }
+
+ .originalPrice {
+ font-size: 13px;
+ text-decoration: line-through;
+ color: #5a5a5a;
+ line-height: 125%;
+ font-weight: 500;
+ }
+
+ .discountedPrice {
+ font-weight: 700;
+ font-size: 17px;
+ line-height: 125%;
+ }
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/PricingSummary/PricingSummary.tsx b/src/components/domains/email-marketing/compatibility/v2/PricingSummary/PricingSummary.tsx
new file mode 100644
index 0000000..a920511
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/PricingSummary/PricingSummary.tsx
@@ -0,0 +1,90 @@
+import { getTranslations } from "next-intl/server";
+import clsx from "clsx";
+
+import { Typography } from "@/components/ui";
+import { translatePathEmailMarketingSoulmateV1 } from "@/shared/constants/translate";
+import { getPeriodTextServer } from "@/shared/utils/period-server";
+import { getFormattedPrice } from "@/shared/utils/price";
+import { Currency } from "@/types";
+import { PeriodType } from "@/types/period";
+
+import styles from "./PricingSummary.module.scss";
+
+interface PricingSummaryProps {
+ trialPrice: number;
+ trialInterval: number;
+ trialPeriod: PeriodType;
+ price: number;
+ billingInterval: number;
+ billingPeriod: PeriodType;
+ currency: Currency;
+}
+
+export default async function PricingSummary({
+ trialPrice,
+ trialInterval,
+ trialPeriod,
+ price,
+ billingInterval,
+ billingPeriod,
+ currency,
+}: PricingSummaryProps) {
+ const t = await getTranslations(
+ translatePathEmailMarketingSoulmateV1("SpecialOffer")
+ );
+
+ return (
+
+
+
+
+ {t("pricing-summary-total-today")}
+
+
+ {getFormattedPrice(Number(trialPrice), currency)}
+
+
+
+
+
+ {t("pricing-summary-code-applied")}
+
+
+
+ {getFormattedPrice(Number(trialPrice), currency)}
+
+
+ {getFormattedPrice(Number(trialPrice), currency)}
+
+
+
+
+
+ {t("cost-for-one-day", {
+ cost: getFormattedPrice(price / billingInterval, currency),
+ })}
+
+
+
+ {t("save-every-period", {
+ price: getFormattedPrice(price - trialPrice, currency),
+ })}
+
+
+ {t("pricing-summary-trial-description", {
+ trialPrice: getFormattedPrice(trialPrice, currency),
+ trialPeriod: await getPeriodTextServer(
+ trialPeriod,
+ trialInterval,
+ "period_adjective"
+ ),
+ price: getFormattedPrice(price, currency),
+ billingPeriod: await getPeriodTextServer(
+ billingPeriod,
+ billingInterval
+ ),
+ })}
+
+
+ );
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/RealTimeActivity/RealTimeActivity.module.scss b/src/components/domains/email-marketing/compatibility/v2/RealTimeActivity/RealTimeActivity.module.scss
new file mode 100644
index 0000000..1f53069
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/RealTimeActivity/RealTimeActivity.module.scss
@@ -0,0 +1,51 @@
+.container {
+ background: linear-gradient(
+ 90deg,
+ rgba(236, 72, 153, 0.1) 0%,
+ rgba(168, 85, 247, 0.1) 100%
+ );
+ width: 100%;
+ padding: 16px 11px 8px 9px;
+ border-radius: 28px;
+ margin-top: 21px;
+ display: flex;
+ flex-direction: column;
+ gap: 16px;
+
+ & > .title {
+ padding-inline: 7px;
+ font-size: 16px;
+ font-weight: 500;
+ line-height: 20px;
+ color: #374151;
+
+ & > .indicator {
+ width: 8px;
+ height: 8px;
+ border-radius: 50%;
+ background-color: #4ade80;
+ display: inline-block;
+ margin-right: 8px;
+ }
+ }
+
+ & > .content {
+ display: grid;
+ grid-template-columns: 36px 1fr fit-content(80px);
+ align-items: start;
+
+ & > .text {
+ font-size: 14px;
+ line-height: 16px;
+ color: #4b5563;
+ padding-left: 11px;
+ padding-right: 6px;
+ }
+
+ & > .time {
+ font-size: 12px;
+ line-height: 16px;
+ color: #22c55e;
+ }
+ }
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/RealTimeActivity/RealTimeActivity.tsx b/src/components/domains/email-marketing/compatibility/v2/RealTimeActivity/RealTimeActivity.tsx
new file mode 100644
index 0000000..5695890
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/RealTimeActivity/RealTimeActivity.tsx
@@ -0,0 +1,35 @@
+import { getTranslations } from "next-intl/server";
+
+import { Typography, UserAvatar } from "@/components/ui";
+import { emailMarketingCompV2Images } from "@/shared/constants/images";
+import { translatePathEmailMarketingSoulmateV1 } from "@/shared/constants/translate";
+
+import styles from "./RealTimeActivity.module.scss";
+
+export default async function RealTimeActivity() {
+ const t = await getTranslations(
+ translatePathEmailMarketingSoulmateV1("Landing.real-time-activity")
+ );
+
+ return (
+
+
+
+ {t("title")}
+
+
+
+
+ {t.rich("text", {
+ bold: chunks => {chunks},
+ })}
+
+ {t("time")}
+
+
+ );
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/Review/Review.module.scss b/src/components/domains/email-marketing/compatibility/v2/Review/Review.module.scss
new file mode 100644
index 0000000..057d238
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/Review/Review.module.scss
@@ -0,0 +1,98 @@
+.container {
+ width: 100%;
+ border-radius: 24px;
+ padding: 26px 40px 24px 24px;
+ background-color: #fff;
+
+ & > .text {
+ margin-top: 16px;
+ font-size: 14px;
+ line-height: 20px;
+ color: #4b5563;
+ }
+}
+
+.header {
+ display: grid;
+ grid-template-columns: 48px 1fr;
+ align-items: center;
+
+ gap: 12px;
+
+ & > .avatar {
+ width: 48px;
+ height: 48px;
+ border-radius: 50%;
+ }
+
+ & > .avatar-chars {
+ width: 48px;
+ height: 48px;
+ border-radius: 50%;
+ background-color: #e37fd9;
+ color: #0f1323;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 14px;
+ text-transform: uppercase;
+ }
+
+ & > .info {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+
+ & > .name {
+ font-size: 18px;
+ font-weight: 600;
+ line-height: 28px;
+ color: #111827;
+
+ & > .flag {
+ font-size: 18px;
+ line-height: 28px;
+ margin-left: 7px;
+ }
+ }
+
+ & > .stars {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ gap: 3px;
+
+ & > img {
+ width: 14px;
+ }
+ }
+ }
+}
+
+.answer {
+ width: 100%;
+ padding: 12px 16px;
+ background-color: #eff6ff;
+ border-left: 4px solid #60a5fa;
+ border-radius: 0 12px 12px 0;
+ margin-top: 16px;
+
+ & > .title {
+ font-size: 12px;
+ font-weight: 600;
+ line-height: 16px;
+ color: #1d4ed8;
+
+ & > svg {
+ display: inline-block;
+ margin-right: 8px;
+ }
+ }
+
+ & > .text {
+ margin-top: 4px;
+ font-size: 12px;
+ line-height: 16px;
+ color: #2563eb;
+ }
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/Review/Review.tsx b/src/components/domains/email-marketing/compatibility/v2/Review/Review.tsx
new file mode 100644
index 0000000..8110f90
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/Review/Review.tsx
@@ -0,0 +1,92 @@
+import Image from "next/image";
+
+import { Typography } from "@/components/ui";
+
+import styles from "./Review.module.scss";
+
+export interface IReviewProps {
+ username: string;
+ stars?: number;
+ avatar: string;
+ text: string;
+ flag?: string;
+ answer?: {
+ title: string;
+ text: string;
+ };
+}
+
+export default function Review({
+ username,
+ stars = 5,
+ avatar,
+ text,
+ flag,
+ answer,
+}: IReviewProps) {
+ return (
+
+
+ {!!avatar?.length && (
+
+ )}
+ {!avatar?.length && (
+
{username.slice(0, 2)}
+ )}
+
+
+ {username}
+ {flag}
+
+
+ {Array.from({ length: stars }).map((_, index) => (
+
+ ))}
+
+
+
+
+ {text}
+
+
+
+
+
+ {answer?.title}
+
+
+ {answer?.text}
+
+
+
+ );
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/Reviews/Reviews.module.scss b/src/components/domains/email-marketing/compatibility/v2/Reviews/Reviews.module.scss
new file mode 100644
index 0000000..5524bfb
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/Reviews/Reviews.module.scss
@@ -0,0 +1,20 @@
+.container {
+ width: 100%;
+ margin-top: 53px;
+
+ & > .title {
+ font-size: 24px;
+ font-weight: 700;
+ line-height: 32px;
+ color: #111827;
+ }
+
+ & > .reviews {
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 16px;
+ margin-top: 24px;
+ }
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/Reviews/Reviews.tsx b/src/components/domains/email-marketing/compatibility/v2/Reviews/Reviews.tsx
new file mode 100644
index 0000000..f152fe3
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/Reviews/Reviews.tsx
@@ -0,0 +1,53 @@
+import { useTranslations } from "next-intl";
+
+import { Typography } from "@/components/ui";
+import { emailMarketingCompV2Images } from "@/shared/constants/images";
+import { translatePathEmailMarketingSoulmateV1 } from "@/shared/constants/translate";
+
+import Review, { IReviewProps } from "../Review/Review";
+
+import styles from "./Reviews.module.scss";
+
+type IReviewFromTranslate = Omit;
+
+type ILocalReview = Pick;
+
+export default function Reviews() {
+ const t = useTranslations(
+ translatePathEmailMarketingSoulmateV1("Landing.reviews")
+ );
+
+ const reviewsFromTranslate = Object.values(
+ t.raw("items") as Record
+ );
+
+ const reviews: ILocalReview[] = [
+ {
+ avatar: emailMarketingCompV2Images("anna_smith28.png"),
+ },
+ {
+ avatar: emailMarketingCompV2Images("mike_andrews_89.png"),
+ },
+ {
+ avatar: emailMarketingCompV2Images("emily_harris_ang.png"),
+ },
+ ];
+
+ const mergedReviews: IReviewProps[] = reviewsFromTranslate.map((item, i) => ({
+ ...item,
+ ...(reviews[i] || {}),
+ }));
+
+ return (
+
+
+ {t("title")}
+
+
+ {mergedReviews.map((review, index) => (
+
+ ))}
+
+
+ );
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/SearchCompatiblePartnerCard/SearchCompatiblePartnerCard.module.scss b/src/components/domains/email-marketing/compatibility/v2/SearchCompatiblePartnerCard/SearchCompatiblePartnerCard.module.scss
new file mode 100644
index 0000000..5318c63
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/SearchCompatiblePartnerCard/SearchCompatiblePartnerCard.module.scss
@@ -0,0 +1,151 @@
+.card {
+ width: 100%;
+ margin-top: 21px;
+ background: linear-gradient(135deg, #faf5ff 0%, #eef2ff 70.71%);
+ box-shadow: 0px 2px 11px 0px #00000024;
+ padding: 24px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 8px;
+ border-radius: 24px;
+
+ & > .header {
+ display: flex;
+ gap: 16px;
+ padding-inline: 9px;
+
+ & > .icon-container {
+ width: 40px;
+ height: 40px;
+ border-radius: 16px;
+ background-color: #fce7f3;
+ flex-shrink: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 21px;
+ line-height: 28px;
+ font-weight: 600;
+ }
+
+ & > .title {
+ font-size: 18px;
+ font-weight: 600;
+ line-height: 28px;
+ color: #111827;
+ }
+ }
+
+ & > .content {
+ width: 100%;
+ background-color: #fff;
+ border-radius: 24px;
+ padding: 19px 16px 32px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+
+ & > .partners {
+ display: grid;
+ grid-template-columns: 1fr 20px 1fr;
+ justify-items: center;
+ align-items: start;
+ justify-content: center;
+ gap: 12px;
+
+ & > .partner {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 8px;
+
+ & > .avatar {
+ width: 64px;
+ height: 64px;
+ flex-shrink: 0;
+ border: solid 2px #e9d5ff;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 24px;
+ font-weight: 500;
+ color: #6b7280;
+ background-size: cover;
+ background-position: center;
+ background-repeat: no-repeat;
+ }
+ }
+ }
+
+ & > .percent {
+ font-size: 25px;
+ font-weight: 700;
+ color: #ec4899;
+ margin-top: 32px;
+ }
+
+ & > .compatibility {
+ font-size: 14px;
+ font-weight: 700;
+ color: #ec4899;
+ margin-top: 8px;
+ }
+
+ & > .progress {
+ width: 100%;
+ height: 8px;
+ border-radius: 1000px;
+ background-color: #f3e8ff;
+ margin-top: 12px;
+ overflow: hidden;
+
+ & > div {
+ width: 92%;
+ height: 100%;
+ border-radius: 1000px;
+ background-color: #ec4899;
+ }
+ }
+
+ & > .bars {
+ width: 100%;
+ max-width: 200px;
+ display: flex;
+ justify-content: space-between;
+ gap: 12px;
+ margin-top: 26px;
+
+ & > .barContainer {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 6px;
+
+ & > .progressBarContainer {
+ position: relative;
+ width: 46px;
+ height: 46px;
+
+ & > .value {
+ font-size: 12px;
+ font-weight: 600;
+ line-height: 16px;
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ }
+ }
+
+ & > .barName {
+ font-size: 12px;
+ font-weight: 600;
+ line-height: 21px;
+ color: #5a5858;
+ }
+ }
+ }
+ }
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/SearchCompatiblePartnerCard/SearchCompatiblePartnerCard.tsx b/src/components/domains/email-marketing/compatibility/v2/SearchCompatiblePartnerCard/SearchCompatiblePartnerCard.tsx
new file mode 100644
index 0000000..ed95d64
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/SearchCompatiblePartnerCard/SearchCompatiblePartnerCard.tsx
@@ -0,0 +1,122 @@
+"use client";
+
+import { CircularProgressbar } from "react-circular-progressbar";
+import { useTranslations } from "next-intl";
+
+import { Typography } from "@/components/ui";
+import { emailMarketingCompV2Images } from "@/shared/constants/images";
+import { translatePathEmailMarketingSoulmateV1 } from "@/shared/constants/translate";
+
+import styles from "./SearchCompatiblePartnerCard.module.scss";
+
+// TODO
+const username = "@annAgejsdbvjsbdv";
+
+interface IBar {
+ text: string;
+ percent: string;
+ colors: {
+ path: string;
+ trail: string;
+ };
+}
+
+export default function SearchCompatiblePartnerCard() {
+ const t = useTranslations(
+ translatePathEmailMarketingSoulmateV1(
+ "Landing.what-get.search-compatible-partner"
+ )
+ );
+
+ const bars = t.raw("content.bars") as Record;
+
+ return (
+
+
+
💞
+
+ {t("header.title")}
+
+
+
+
+
+
+ {username.charAt(1).toUpperCase()}
+
+
+ {username.slice(0, 7)}...
+
+
+
+
+
+
+ ?
+
+
+ {t("content.partner-name")}
+
+
+
+
+ {t("content.percent")}
+
+
+ {t("content.compatibility")}
+
+
+
+ {Object.values(bars).map((bar, index) => (
+
+
+
+
+
+ {bar.percent}%
+
+
+
{bar.text}
+
+ ))}
+
+
+
+ );
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/SpecialOffer/SpecialOffer.module.scss b/src/components/domains/email-marketing/compatibility/v2/SpecialOffer/SpecialOffer.module.scss
new file mode 100644
index 0000000..b2a0bb4
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/SpecialOffer/SpecialOffer.module.scss
@@ -0,0 +1,12 @@
+.container {
+ width: 100%;
+ margin-top: 30px;
+
+ & > .title {
+ width: 100%;
+ padding-left: 6px;
+ font-size: 24px;
+ font-weight: 700;
+ line-height: 32px;
+ }
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/SpecialOffer/SpecialOffer.tsx b/src/components/domains/email-marketing/compatibility/v2/SpecialOffer/SpecialOffer.tsx
new file mode 100644
index 0000000..5e67811
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/SpecialOffer/SpecialOffer.tsx
@@ -0,0 +1,50 @@
+import { getTranslations } from "next-intl/server";
+
+import { Typography } from "@/components/ui";
+import { IFunnelPaymentVariant } from "@/entities/session/funnel/types";
+import { translatePathEmailMarketingSoulmateV1 } from "@/shared/constants/translate";
+import { Currency } from "@/types";
+import { PeriodType } from "@/types/period";
+
+import Prices from "../Prices/Prices";
+import TrialIntervalOffer from "../TrialIntervalOffer/TrialIntervalOffer";
+
+import styles from "./SpecialOffer.module.scss";
+
+interface ISpecialOfferProps {
+ variant: IFunnelPaymentVariant;
+ currency: Currency;
+ oldTrialInterval: number;
+ newTrialInterval: number;
+ trialPeriod: PeriodType;
+}
+
+export default async function SpecialOffer({
+ variant,
+ currency,
+ oldTrialInterval,
+ newTrialInterval,
+ trialPeriod,
+}: ISpecialOfferProps) {
+ const t = await getTranslations(
+ translatePathEmailMarketingSoulmateV1("Landing.special-offer")
+ );
+
+ return (
+
+ );
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/SpecialOfferButtonWrapper/SpecialOfferButtonWrapper.module.scss b/src/components/domains/email-marketing/compatibility/v2/SpecialOfferButtonWrapper/SpecialOfferButtonWrapper.module.scss
new file mode 100644
index 0000000..54e2356
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/SpecialOfferButtonWrapper/SpecialOfferButtonWrapper.module.scss
@@ -0,0 +1,32 @@
+.buttonContainer {
+ width: 100%;
+ display: flex;
+ justify-content: center;
+ position: sticky;
+ bottom: calc(0dvh + 25px);
+ pointer-events: none;
+ z-index: 1000;
+
+ .button {
+ position: relative;
+ z-index: 1000;
+ max-width: 327px;
+ margin-top: 24px;
+ pointer-events: all;
+ background-color: #3b82f6;
+ border-radius: 16px;
+ padding-block: 21px;
+
+ & > .text {
+ font-size: 18px;
+ font-weight: 700;
+ letter-spacing: 0.9px;
+ }
+ }
+}
+
+.gradientBlur.gradientBlur {
+ left: -16px !important;
+ right: -16px !important;
+ inset: -25px 0 !important;
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/SpecialOfferButtonWrapper/SpecialOfferButtonWrapper.tsx b/src/components/domains/email-marketing/compatibility/v2/SpecialOfferButtonWrapper/SpecialOfferButtonWrapper.tsx
new file mode 100644
index 0000000..153f343
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/SpecialOfferButtonWrapper/SpecialOfferButtonWrapper.tsx
@@ -0,0 +1,53 @@
+"use client";
+
+import { useRouter } from "next/navigation";
+import { useTranslations } from "next-intl";
+
+import { Button, Typography } from "@/components/ui";
+import { BlurComponent } from "@/components/widgets";
+import { ROUTES } from "@/shared/constants/client-routes";
+import { translatePathEmailMarketingSoulmateV1 } from "@/shared/constants/translate";
+
+import styles from "./SpecialOfferButtonWrapper.module.scss";
+
+interface SpecialOfferButtonWrapperProps {
+ productId: string;
+ placementId: string;
+ paywallId: string;
+}
+
+export default function SpecialOfferButtonWrapper({
+ productId,
+ placementId,
+ paywallId,
+}: SpecialOfferButtonWrapperProps) {
+ const router = useRouter();
+ const t = useTranslations(
+ translatePathEmailMarketingSoulmateV1("SpecialOffer")
+ );
+
+ const openPaymentModal = () => {
+ router.push(
+ ROUTES.payment({
+ productId,
+ placementId,
+ paywallId,
+ })
+ );
+ };
+
+ return (
+
+
+
+
+
+ );
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/Statistics/Statistics.module.scss b/src/components/domains/email-marketing/compatibility/v2/Statistics/Statistics.module.scss
new file mode 100644
index 0000000..ff1493c
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/Statistics/Statistics.module.scss
@@ -0,0 +1,125 @@
+.container {
+ width: 100%;
+ margin-top: 42px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+
+ & > .title {
+ background-image: linear-gradient(
+ 117.07deg,
+ #d041b4 12.17%,
+ #ae3ad2 71.63%
+ );
+ color: transparent;
+ background-clip: text;
+ font-size: 48px;
+ font-weight: 700;
+ }
+
+ & > .description {
+ margin-top: 5px;
+ font-size: 19px;
+ font-weight: 500;
+ line-height: 28px;
+ color: #000;
+ max-width: 280px;
+ }
+
+ & > .avatars {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-top: 16px;
+
+ & > .avatar {
+ width: 48px;
+ height: 48px;
+ flex-shrink: 0;
+ border-radius: 50%;
+ object-fit: cover;
+
+ &:not(:first-child) {
+ margin-left: -12px;
+ }
+ }
+
+ & > .more {
+ width: 48px;
+ height: 48px;
+ flex-shrink: 0;
+ border-radius: 50%;
+ background: linear-gradient(135deg, #f472b6 0%, #a855f7 70.71%);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-left: -12px;
+
+ & > .moreText {
+ font-size: 12px;
+ font-weight: 700;
+ line-height: 16px;
+ }
+ }
+ }
+
+ & > .periodStatistics {
+ width: 100%;
+ display: flex;
+ justify-content: center;
+ gap: 20px;
+ margin-top: 36px;
+
+ & .iconContainer {
+ width: 56px;
+ height: 56px;
+ border-radius: 16px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+
+ & .title {
+ font-size: 24px;
+ font-weight: 700;
+ line-height: 32px;
+ color: #111827;
+ margin-top: 4px;
+ }
+
+ & .description {
+ font-size: 16px;
+ font-weight: 500;
+ line-height: 20px;
+ color: #4b5563;
+ }
+
+ & > .monthContainer {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+
+ & > .iconContainer {
+ background: linear-gradient(
+ 135deg,
+ rgba(236, 72, 153, 0.1) 0%,
+ rgba(236, 72, 153, 0.2) 70.71%
+ );
+ }
+ }
+
+ & > .todayContainer {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+
+ & > .iconContainer {
+ background: linear-gradient(
+ 135deg,
+ rgba(168, 85, 247, 0.1) 0%,
+ rgba(168, 85, 247, 0.2) 70.71%
+ );
+ }
+ }
+ }
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/Statistics/Statistics.tsx b/src/components/domains/email-marketing/compatibility/v2/Statistics/Statistics.tsx
new file mode 100644
index 0000000..59c45e6
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/Statistics/Statistics.tsx
@@ -0,0 +1,92 @@
+import Image from "next/image";
+import { getTranslations } from "next-intl/server";
+
+import { Typography } from "@/components/ui";
+import { emailMarketingCompV2Images } from "@/shared/constants/images";
+import { translatePathEmailMarketingSoulmateV1 } from "@/shared/constants/translate";
+
+import styles from "./Statistics.module.scss";
+
+const avatarsUrl = Array.from({ length: 6 }, (_, i) =>
+ emailMarketingCompV2Images(`statistics/avatar${i + 1}.png`)
+);
+
+export default async function Statistics() {
+ const t = await getTranslations(
+ translatePathEmailMarketingSoulmateV1("Landing.statistics")
+ );
+
+ return (
+
+
+ {t("title")}
+
+
+ {t("description")}
+
+
+ {avatarsUrl.map((url, index) => (
+
+ ))}
+
+
+ {t("more-avatars")}
+
+
+
+
+
+
+
+ {t("period-statistics.month.title")}
+
+
+ {t("period-statistics.month.text")}
+
+
+
+
+
+ {t("period-statistics.today.title")}
+
+
+ {t("period-statistics.today.text")}
+
+
+
+
+ );
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/TrialIntervalOffer/TrialIntervalOffer.module.scss b/src/components/domains/email-marketing/compatibility/v2/TrialIntervalOffer/TrialIntervalOffer.module.scss
new file mode 100644
index 0000000..be2862a
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/TrialIntervalOffer/TrialIntervalOffer.module.scss
@@ -0,0 +1,55 @@
+.container {
+ padding: 20px;
+ padding-top: 30px;
+ width: 100%;
+ background: linear-gradient(90deg, #f0fdf4 0%, #ecfdf5 100%);
+ border: 1px solid #3ace70;
+ border-radius: 24px;
+ margin-top: 32px;
+
+ & > .title {
+ font-size: 18px;
+ font-weight: 700;
+ line-height: 28px;
+ color: #15803d;
+
+ & > svg {
+ display: inline-block;
+ margin-right: 13px;
+ margin-left: -16px;
+ }
+ }
+
+ & > .trialIntervals {
+ margin-top: 16px;
+ vertical-align: middle;
+
+ & > .oldInterval {
+ font-size: 18px;
+ font-weight: 700;
+ line-height: 28px;
+ text-decoration: line-through;
+ color: #16a34a80;
+ text-transform: uppercase;
+ }
+
+ & > svg {
+ display: inline-block;
+ margin-inline: 8px;
+ }
+
+ & > .newInterval {
+ font-size: 24px;
+ font-weight: 900;
+ color: #16a34a;
+ text-transform: uppercase;
+ }
+ }
+
+ & > .description {
+ margin-top: 12px;
+ font-size: 14px;
+ line-height: 20px;
+ color: #16a34a;
+ }
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/TrialIntervalOffer/TrialIntervalOffer.tsx b/src/components/domains/email-marketing/compatibility/v2/TrialIntervalOffer/TrialIntervalOffer.tsx
new file mode 100644
index 0000000..f07aa6f
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/TrialIntervalOffer/TrialIntervalOffer.tsx
@@ -0,0 +1,70 @@
+import { getTranslations } from "next-intl/server";
+
+import { Typography } from "@/components/ui";
+import { translatePathEmailMarketingSoulmateV1 } from "@/shared/constants/translate";
+import { getPeriodTextServer } from "@/shared/utils/period-server";
+import { PeriodType } from "@/types/period";
+
+import styles from "./TrialIntervalOffer.module.scss";
+
+interface ITrialIntervalOfferProps {
+ periodType: PeriodType;
+ oldTrialInterval: number;
+ newTrialInterval: number;
+}
+
+export default async function TrialIntervalOffer({
+ periodType,
+ oldTrialInterval,
+ newTrialInterval,
+}: ITrialIntervalOfferProps) {
+ const t = await getTranslations(
+ translatePathEmailMarketingSoulmateV1(
+ "Landing.special-offer.trial-offer"
+ )
+ );
+
+ return (
+
+
+
+
+ {t("title")}
+
+
+
+ {await getPeriodTextServer(periodType, oldTrialInterval)}
+
+
+
+ {await getPeriodTextServer(periodType, newTrialInterval)}
+
+
+
+ {t("description")}
+
+
+ );
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/WhatGet/WhatGet.module.scss b/src/components/domains/email-marketing/compatibility/v2/WhatGet/WhatGet.module.scss
new file mode 100644
index 0000000..e51b57a
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/WhatGet/WhatGet.module.scss
@@ -0,0 +1,13 @@
+.container {
+ margin-top: 25px;
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+
+ & > .title {
+ font-size: 24px;
+ line-height: 32px;
+ font-weight: 700;
+ color: #111827;
+ }
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/WhatGet/WhatGet.tsx b/src/components/domains/email-marketing/compatibility/v2/WhatGet/WhatGet.tsx
new file mode 100644
index 0000000..076ed4d
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/WhatGet/WhatGet.tsx
@@ -0,0 +1,29 @@
+import { getTranslations } from "next-intl/server";
+
+import { Typography } from "@/components/ui";
+import { translatePathEmailMarketingSoulmateV1 } from "@/shared/constants/translate";
+
+import DetailedPortraitCard from "../DetailedPortraitCard/DetailedPortraitCard";
+import GuideCard from "../GuideCard/GuideCard";
+import IndividualAdviceCard from "../IndividualAdviceCard/IndividualAdviceCard";
+import SearchCompatiblePartnerCard from "../SearchCompatiblePartnerCard/SearchCompatiblePartnerCard";
+
+import styles from "./WhatGet.module.scss";
+
+export default async function WhatGet() {
+ const t = await getTranslations(
+ translatePathEmailMarketingSoulmateV1("Landing.what-get")
+ );
+
+ return (
+
+
+ {t("title")}
+
+
+
+
+
+
+ );
+}
diff --git a/src/components/domains/email-marketing/compatibility/v2/index.ts b/src/components/domains/email-marketing/compatibility/v2/index.ts
new file mode 100644
index 0000000..8a0f16a
--- /dev/null
+++ b/src/components/domains/email-marketing/compatibility/v2/index.ts
@@ -0,0 +1,15 @@
+export { default as GuaranteedSecurityPayments } from "./GuaranteedSecurityPayments/GuaranteedSecurityPayments";
+export { default as Header } from "./Header/Header";
+export { default as HeaderTimer } from "./HeaderTimer/HeaderTimer";
+export { default as HiBlock } from "./HiBlock/HiBlock";
+export { default as LandingButtonWrapper } from "./LandingButtonWrapper/LandingButtonWrapper";
+export { default as MoneyBackGuarantee } from "./MoneyBackGuarantee/MoneyBackGuarantee";
+export { default as Payments } from "./Payments/Payments";
+export { default as PlanAlsoIncludes } from "./PlanAlsoIncludes/PlanAlsoIncludes";
+export { default as PricingSummary } from "./PricingSummary/PricingSummary";
+export { default as RealTimeActivity } from "./RealTimeActivity/RealTimeActivity";
+export { default as Reviews } from "./Reviews/Reviews";
+export { default as SpecialOffer } from "./SpecialOffer/SpecialOffer";
+export { default as SpecialOfferButtonWrapper } from "./SpecialOfferButtonWrapper/SpecialOfferButtonWrapper";
+export { default as Statistics } from "./Statistics/Statistics";
+export { default as WhatGet } from "./WhatGet/WhatGet";
diff --git a/src/components/ui/UserAvatar/UserAvatar.tsx b/src/components/ui/UserAvatar/UserAvatar.tsx
index 6d53e94..624a46e 100644
--- a/src/components/ui/UserAvatar/UserAvatar.tsx
+++ b/src/components/ui/UserAvatar/UserAvatar.tsx
@@ -1,19 +1,21 @@
import Image from "next/image";
+import clsx from "clsx";
import { OnlineIndicator } from "..";
import styles from "./UserAvatar.module.scss";
-export interface UserAvatarProps {
+export interface UserAvatarProps extends React.ComponentProps<"div"> {
src: string;
alt: string;
- size?: "sm" | "md" | "lg";
+ size?: "s" | "sm" | "md" | "lg";
isOnline?: boolean;
isOnlineIndicator?: boolean;
}
const sizes = {
- sm: 48,
+ s: 32,
+ sm: 36,
md: 48,
lg: 48,
};
@@ -24,9 +26,10 @@ export default function UserAvatar({
size = "md",
isOnline,
isOnlineIndicator = true,
+ className,
}: UserAvatarProps) {
return (
-
+
(() => {
- if (persist && storageKey) {
- const saved = localStorage.getItem(storageKey);
- if (saved !== null) {
- const parsed = parseInt(saved, 10);
- if (!isNaN(parsed)) return parsed;
- }
- }
- return initialSeconds;
- });
+ // Always initialize with initialSeconds to match SSR
+ const [seconds, setSeconds] = useState(initialSeconds);
const intervalRef = useRef(null);
+ // Load from localStorage after mount (client-only)
useEffect(() => {
- if (persist && storageKey) {
+ if (persist && storageKey && typeof window !== 'undefined') {
+ const saved = localStorage.getItem(storageKey);
+ if (saved !== null) {
+ const parsed = parseInt(saved, 10);
+ if (!isNaN(parsed)) {
+ setSeconds(parsed);
+ return; // Don't save again if we just loaded
+ }
+ }
+ }
+ }, [persist, storageKey]); // Run once on mount
+
+ // Save to localStorage when seconds change
+ useEffect(() => {
+ if (persist && storageKey && typeof window !== 'undefined') {
localStorage.setItem(storageKey, seconds.toString());
}
}, [seconds, persist, storageKey]);
@@ -54,7 +61,7 @@ export function useTimer({
const reset = useCallback(() => {
setSeconds(initialSeconds);
- if (persist && storageKey) {
+ if (persist && storageKey && typeof window !== 'undefined') {
localStorage.setItem(storageKey, initialSeconds.toString());
}
}, [initialSeconds, persist, storageKey]);
diff --git a/src/shared/constants/client-routes.ts b/src/shared/constants/client-routes.ts
index c9f15a8..462b5a8 100644
--- a/src/shared/constants/client-routes.ts
+++ b/src/shared/constants/client-routes.ts
@@ -15,6 +15,7 @@ const profilePrefix = "profile";
const retainingFunnelPrefix = "retaining";
const emailMarketingPrefix = "em";
const emailMarketingCompatibilityV1Prefix = `${emailMarketingPrefix}/c/v1`;
+const emailMarketingSoulmateV1Prefix = `${emailMarketingPrefix}/s/v1`;
export const ROUTES = {
home: () => createRoute([]),
@@ -90,6 +91,12 @@ export const ROUTES = {
emailMarketingCompatibilityV1SpecialOffer: () =>
createRoute([emailMarketingCompatibilityV1Prefix, "special-offer"]),
+ // Email Marketing Soulmate V1
+ emailMarketingSoulmateV1Landing: () =>
+ createRoute([emailMarketingSoulmateV1Prefix, "landing"]),
+ emailMarketingSoulmateV1SpecialOffer: () =>
+ createRoute([emailMarketingSoulmateV1Prefix, "special-offer"]),
+
// // Compatibility
// compatibilities: () => createRoute(["compatibilities"]),
diff --git a/src/shared/constants/images/email-marketing.ts b/src/shared/constants/images/email-marketing.ts
index 219f856..cdb2c0e 100644
--- a/src/shared/constants/images/email-marketing.ts
+++ b/src/shared/constants/images/email-marketing.ts
@@ -1,2 +1,5 @@
export const emailMarketingCompV1Images = (path: string) =>
`/email-marketing/comp/v1/${path}`;
+
+export const emailMarketingCompV2Images = (path: string) =>
+ `/email-marketing/comp/v2/${path}`;
diff --git a/src/shared/constants/translate/translate-path.ts b/src/shared/constants/translate/translate-path.ts
index 07f6cf3..e22e1c4 100644
--- a/src/shared/constants/translate/translate-path.ts
+++ b/src/shared/constants/translate/translate-path.ts
@@ -1,2 +1,5 @@
export const translatePathEmailMarketingCompatibilityV1 = (path: string) =>
`EmailMarketing.Compatibility.v1.${path}`;
+
+export const translatePathEmailMarketingSoulmateV1 = (path: string) =>
+ `EmailMarketing.Soulmate.v1.${path}`;
diff --git a/src/types/index.ts b/src/types/index.ts
index d6731b3..05207f8 100644
--- a/src/types/index.ts
+++ b/src/types/index.ts
@@ -72,6 +72,7 @@ export enum ELocalesPlacement {
EmailMarketingCompatibilityV1 = "email-marketing-comp-v1",
EmailMarketingPalmistryV2 = "email-marketing-palmistry-v2",
EmailMarketingCompatibilityV2 = "email-marketing-comp-v2",
+ EmailMarketingSoulmateV1 = "email-marketing-soulmate-v1",
EmailMarketingCompatibilityV3 = "email-marketing-comp-v3",
EmailMarketingCompatibilityV4 = "email-marketing-comp-v4",
CompatibilityV2 = "compatibility-v2",