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")}{" "} + + + + +
+ portrait +
+ ); +} 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 ( +
+ guaranteed + + {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 ( +
+
+ + {t("title")} + + + {t("description")} + +
+ + + +
+ ); +} 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 ( +
+ payments +
+ ); +} 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 ( +
+ + {t("title")} + +
    + {listItems.map((item, index) => ( +
  • + + + +
    + + {item.title} + + + {item.text} + +
    +
  • + ))} +
+
+ ); +} 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 + )} + {!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 ( +
+ + {t("title")} + + + +
+ ); +} 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) => ( + {`avatar-${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 ( -
+
{alt}(() => { - 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",