diff --git a/public/payment-form/back-arrow.svg b/public/payment-form/back-arrow.svg new file mode 100644 index 0000000..e4a92f3 --- /dev/null +++ b/public/payment-form/back-arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/payment-form/credit-card.svg b/public/payment-form/credit-card.svg new file mode 100644 index 0000000..766d577 --- /dev/null +++ b/public/payment-form/credit-card.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/payment-form/lock.svg b/public/payment-form/lock.svg new file mode 100644 index 0000000..c255f93 --- /dev/null +++ b/public/payment-form/lock.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/payment-form/security.svg b/public/payment-form/security.svg new file mode 100644 index 0000000..7eb628f --- /dev/null +++ b/public/payment-form/security.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/v1/palmistry/trial-payment/girl2.png b/public/v1/palmistry/trial-payment/girl2.png new file mode 100644 index 0000000..e4672b0 Binary files /dev/null and b/public/v1/palmistry/trial-payment/girl2.png differ diff --git a/public/v2/compatibility/1_1.svg b/public/v2/compatibility/1_1.svg new file mode 100644 index 0000000..2f78341 --- /dev/null +++ b/public/v2/compatibility/1_1.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/v2/compatibility/blue.png b/public/v2/compatibility/blue.png new file mode 100644 index 0000000..fd00d4d Binary files /dev/null and b/public/v2/compatibility/blue.png differ diff --git a/public/v2/compatibility/calendar.svg b/public/v2/compatibility/calendar.svg new file mode 100644 index 0000000..6f0e6f1 --- /dev/null +++ b/public/v2/compatibility/calendar.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/v2/compatibility/check-mark.svg b/public/v2/compatibility/check-mark.svg new file mode 100644 index 0000000..159fc6a --- /dev/null +++ b/public/v2/compatibility/check-mark.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/v2/compatibility/circle-in-ring.svg b/public/v2/compatibility/circle-in-ring.svg new file mode 100644 index 0000000..98dd981 --- /dev/null +++ b/public/v2/compatibility/circle-in-ring.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/v2/compatibility/cosmic.svg b/public/v2/compatibility/cosmic.svg new file mode 100644 index 0000000..b1a0bd1 --- /dev/null +++ b/public/v2/compatibility/cosmic.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/v2/compatibility/daily.svg b/public/v2/compatibility/daily.svg new file mode 100644 index 0000000..620b4eb --- /dev/null +++ b/public/v2/compatibility/daily.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/v2/compatibility/darts.png b/public/v2/compatibility/darts.png new file mode 100644 index 0000000..eeea01a Binary files /dev/null and b/public/v2/compatibility/darts.png differ diff --git a/public/v2/compatibility/discount/fate-line.svg b/public/v2/compatibility/discount/fate-line.svg new file mode 100644 index 0000000..5e7a012 --- /dev/null +++ b/public/v2/compatibility/discount/fate-line.svg @@ -0,0 +1,3510 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v2/compatibility/discount/featured.svg b/public/v2/compatibility/discount/featured.svg new file mode 100644 index 0000000..9a3df4d --- /dev/null +++ b/public/v2/compatibility/discount/featured.svg @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v2/compatibility/discount/fire.png b/public/v2/compatibility/discount/fire.png new file mode 100644 index 0000000..1966e9a Binary files /dev/null and b/public/v2/compatibility/discount/fire.png differ diff --git a/public/v2/compatibility/discount/gift.png b/public/v2/compatibility/discount/gift.png new file mode 100644 index 0000000..bf58560 Binary files /dev/null and b/public/v2/compatibility/discount/gift.png differ diff --git a/public/v2/compatibility/discount/gift.svg b/public/v2/compatibility/discount/gift.svg new file mode 100644 index 0000000..1bfccec --- /dev/null +++ b/public/v2/compatibility/discount/gift.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v2/compatibility/discount/guard.svg b/public/v2/compatibility/discount/guard.svg new file mode 100644 index 0000000..611d6dd --- /dev/null +++ b/public/v2/compatibility/discount/guard.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/v2/compatibility/discount/hand-fingers.svg b/public/v2/compatibility/discount/hand-fingers.svg new file mode 100644 index 0000000..5030a9c --- /dev/null +++ b/public/v2/compatibility/discount/hand-fingers.svg @@ -0,0 +1,3469 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v2/compatibility/discount/hand.svg b/public/v2/compatibility/discount/hand.svg new file mode 100644 index 0000000..be33298 --- /dev/null +++ b/public/v2/compatibility/discount/hand.svg @@ -0,0 +1,1797 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v2/compatibility/discount/head-line.svg b/public/v2/compatibility/discount/head-line.svg new file mode 100644 index 0000000..737c36b --- /dev/null +++ b/public/v2/compatibility/discount/head-line.svg @@ -0,0 +1,3180 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v2/compatibility/discount/life-line.svg b/public/v2/compatibility/discount/life-line.svg new file mode 100644 index 0000000..366ec1f --- /dev/null +++ b/public/v2/compatibility/discount/life-line.svg @@ -0,0 +1,3393 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v2/compatibility/discount/love-line.svg b/public/v2/compatibility/discount/love-line.svg new file mode 100644 index 0000000..0e9e95b --- /dev/null +++ b/public/v2/compatibility/discount/love-line.svg @@ -0,0 +1,2356 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v2/compatibility/discount/money-back.svg b/public/v2/compatibility/discount/money-back.svg new file mode 100644 index 0000000..85c7e35 --- /dev/null +++ b/public/v2/compatibility/discount/money-back.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/v2/compatibility/discount/plus.svg b/public/v2/compatibility/discount/plus.svg new file mode 100644 index 0000000..9c00bef --- /dev/null +++ b/public/v2/compatibility/discount/plus.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/v2/compatibility/fate-line.svg b/public/v2/compatibility/fate-line.svg new file mode 100644 index 0000000..28e82ca --- /dev/null +++ b/public/v2/compatibility/fate-line.svg @@ -0,0 +1,3519 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v2/compatibility/green.png b/public/v2/compatibility/green.png new file mode 100644 index 0000000..6a9b429 Binary files /dev/null and b/public/v2/compatibility/green.png differ diff --git a/public/v2/compatibility/hand-animation.png b/public/v2/compatibility/hand-animation.png new file mode 100644 index 0000000..4c6faaf Binary files /dev/null and b/public/v2/compatibility/hand-animation.png differ diff --git a/public/v2/compatibility/hand-little-finger.svg b/public/v2/compatibility/hand-little-finger.svg new file mode 100644 index 0000000..8557fb4 --- /dev/null +++ b/public/v2/compatibility/hand-little-finger.svg @@ -0,0 +1,3433 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v2/compatibility/hand-with-eye.png b/public/v2/compatibility/hand-with-eye.png new file mode 100644 index 0000000..090ec49 Binary files /dev/null and b/public/v2/compatibility/hand-with-eye.png differ diff --git a/public/v2/compatibility/hand-with-eye.svg b/public/v2/compatibility/hand-with-eye.svg new file mode 100644 index 0000000..0de97e2 --- /dev/null +++ b/public/v2/compatibility/hand-with-eye.svg @@ -0,0 +1,254 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v2/compatibility/hand-with-lines.png b/public/v2/compatibility/hand-with-lines.png new file mode 100644 index 0000000..1e277d9 Binary files /dev/null and b/public/v2/compatibility/hand-with-lines.png differ diff --git a/public/v2/compatibility/hand-with-lines.svg b/public/v2/compatibility/hand-with-lines.svg new file mode 100644 index 0000000..a9b3bb2 --- /dev/null +++ b/public/v2/compatibility/hand-with-lines.svg @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v2/compatibility/hand.svg b/public/v2/compatibility/hand.svg new file mode 100644 index 0000000..0ea43c1 --- /dev/null +++ b/public/v2/compatibility/hand.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/v2/compatibility/head-line.svg b/public/v2/compatibility/head-line.svg new file mode 100644 index 0000000..e212414 --- /dev/null +++ b/public/v2/compatibility/head-line.svg @@ -0,0 +1,3331 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v2/compatibility/headphones.svg b/public/v2/compatibility/headphones.svg new file mode 100644 index 0000000..4498e84 --- /dev/null +++ b/public/v2/compatibility/headphones.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/v2/compatibility/let-scan.png b/public/v2/compatibility/let-scan.png new file mode 100644 index 0000000..f44d331 Binary files /dev/null and b/public/v2/compatibility/let-scan.png differ diff --git a/public/v2/compatibility/life-line.svg b/public/v2/compatibility/life-line.svg new file mode 100644 index 0000000..25eb3ab --- /dev/null +++ b/public/v2/compatibility/life-line.svg @@ -0,0 +1,3331 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v2/compatibility/love-line.svg b/public/v2/compatibility/love-line.svg new file mode 100644 index 0000000..beb9b18 --- /dev/null +++ b/public/v2/compatibility/love-line.svg @@ -0,0 +1,2365 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v2/compatibility/money-back.svg b/public/v2/compatibility/money-back.svg new file mode 100644 index 0000000..33bce07 --- /dev/null +++ b/public/v2/compatibility/money-back.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/v2/compatibility/orange.png b/public/v2/compatibility/orange.png new file mode 100644 index 0000000..96002da Binary files /dev/null and b/public/v2/compatibility/orange.png differ diff --git a/public/v2/compatibility/partners.png b/public/v2/compatibility/partners.png new file mode 100644 index 0000000..c11d03f Binary files /dev/null and b/public/v2/compatibility/partners.png differ diff --git a/public/v2/compatibility/partners.svg b/public/v2/compatibility/partners.svg new file mode 100644 index 0000000..2e7b435 --- /dev/null +++ b/public/v2/compatibility/partners.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/v2/compatibility/question.svg b/public/v2/compatibility/question.svg new file mode 100644 index 0000000..7636e87 --- /dev/null +++ b/public/v2/compatibility/question.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/v2/compatibility/red.png b/public/v2/compatibility/red.png new file mode 100644 index 0000000..4a638c6 Binary files /dev/null and b/public/v2/compatibility/red.png differ diff --git a/public/v2/compatibility/reviews.png b/public/v2/compatibility/reviews.png new file mode 100644 index 0000000..7f0051b Binary files /dev/null and b/public/v2/compatibility/reviews.png differ diff --git a/public/v2/compatibility/reviews/amanda.png b/public/v2/compatibility/reviews/amanda.png new file mode 100644 index 0000000..32c1906 Binary files /dev/null and b/public/v2/compatibility/reviews/amanda.png differ diff --git a/public/v2/compatibility/reviews/mika.png b/public/v2/compatibility/reviews/mika.png new file mode 100644 index 0000000..d1d57e3 Binary files /dev/null and b/public/v2/compatibility/reviews/mika.png differ diff --git a/public/v2/compatibility/reviews/rebecca.png b/public/v2/compatibility/reviews/rebecca.png new file mode 100644 index 0000000..d083cee Binary files /dev/null and b/public/v2/compatibility/reviews/rebecca.png differ diff --git a/public/v2/compatibility/ring.svg b/public/v2/compatibility/ring.svg new file mode 100644 index 0000000..f8a89e2 --- /dev/null +++ b/public/v2/compatibility/ring.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/v2/compatibility/scan-instruction.png b/public/v2/compatibility/scan-instruction.png new file mode 100644 index 0000000..b0fd2ba Binary files /dev/null and b/public/v2/compatibility/scan-instruction.png differ diff --git a/public/v2/compatibility/star.png b/public/v2/compatibility/star.png new file mode 100644 index 0000000..2f2a04e Binary files /dev/null and b/public/v2/compatibility/star.png differ diff --git a/public/v2/compatibility/ticket.svg b/public/v2/compatibility/ticket.svg new file mode 100644 index 0000000..610efd1 --- /dev/null +++ b/public/v2/compatibility/ticket.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/v2/compatibility/trial-payment/avatar-1.png b/public/v2/compatibility/trial-payment/avatar-1.png new file mode 100644 index 0000000..fbf73b8 Binary files /dev/null and b/public/v2/compatibility/trial-payment/avatar-1.png differ diff --git a/public/v2/compatibility/trial-payment/avatar-2.png b/public/v2/compatibility/trial-payment/avatar-2.png new file mode 100644 index 0000000..84b1eb3 Binary files /dev/null and b/public/v2/compatibility/trial-payment/avatar-2.png differ diff --git a/public/v2/compatibility/trial-payment/avatar-3.png b/public/v2/compatibility/trial-payment/avatar-3.png new file mode 100644 index 0000000..760c450 Binary files /dev/null and b/public/v2/compatibility/trial-payment/avatar-3.png differ diff --git a/public/v2/compatibility/trial-payment/avatar-4.png b/public/v2/compatibility/trial-payment/avatar-4.png new file mode 100644 index 0000000..eac488a Binary files /dev/null and b/public/v2/compatibility/trial-payment/avatar-4.png differ diff --git a/public/v2/compatibility/trial-payment/girl.png b/public/v2/compatibility/trial-payment/girl.png new file mode 100644 index 0000000..95824cb Binary files /dev/null and b/public/v2/compatibility/trial-payment/girl.png differ diff --git a/public/v2/compatibility/trial-payment/girl2.png b/public/v2/compatibility/trial-payment/girl2.png new file mode 100644 index 0000000..e4672b0 Binary files /dev/null and b/public/v2/compatibility/trial-payment/girl2.png differ diff --git a/public/v2/compatibility/trial-payment/infinite.svg b/public/v2/compatibility/trial-payment/infinite.svg new file mode 100644 index 0000000..481ddf7 --- /dev/null +++ b/public/v2/compatibility/trial-payment/infinite.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/public/v2/compatibility/trial-payment/people.svg b/public/v2/compatibility/trial-payment/people.svg new file mode 100644 index 0000000..2d33ea5 --- /dev/null +++ b/public/v2/compatibility/trial-payment/people.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/v2/compatibility/violet.png b/public/v2/compatibility/violet.png new file mode 100644 index 0000000..24497d8 Binary files /dev/null and b/public/v2/compatibility/violet.png differ diff --git a/public/v2/compatibility/yellow.png b/public/v2/compatibility/yellow.png new file mode 100644 index 0000000..1ee5298 Binary files /dev/null and b/public/v2/compatibility/yellow.png differ diff --git a/public/v2/compatibility/zodiacs/female/AQUARIUS.webp b/public/v2/compatibility/zodiacs/female/AQUARIUS.webp new file mode 100644 index 0000000..574cc7c Binary files /dev/null and b/public/v2/compatibility/zodiacs/female/AQUARIUS.webp differ diff --git a/public/v2/compatibility/zodiacs/female/ARIES.webp b/public/v2/compatibility/zodiacs/female/ARIES.webp new file mode 100644 index 0000000..fe1ab38 Binary files /dev/null and b/public/v2/compatibility/zodiacs/female/ARIES.webp differ diff --git a/public/v2/compatibility/zodiacs/female/CANCER.webp b/public/v2/compatibility/zodiacs/female/CANCER.webp new file mode 100644 index 0000000..c7415c6 Binary files /dev/null and b/public/v2/compatibility/zodiacs/female/CANCER.webp differ diff --git a/public/v2/compatibility/zodiacs/female/CAPRICORN.webp b/public/v2/compatibility/zodiacs/female/CAPRICORN.webp new file mode 100644 index 0000000..53bef7f Binary files /dev/null and b/public/v2/compatibility/zodiacs/female/CAPRICORN.webp differ diff --git a/public/v2/compatibility/zodiacs/female/GEMINI.webp b/public/v2/compatibility/zodiacs/female/GEMINI.webp new file mode 100644 index 0000000..372800f Binary files /dev/null and b/public/v2/compatibility/zodiacs/female/GEMINI.webp differ diff --git a/public/v2/compatibility/zodiacs/female/LEO.webp b/public/v2/compatibility/zodiacs/female/LEO.webp new file mode 100644 index 0000000..8ba00d8 Binary files /dev/null and b/public/v2/compatibility/zodiacs/female/LEO.webp differ diff --git a/public/v2/compatibility/zodiacs/female/LIBRA.webp b/public/v2/compatibility/zodiacs/female/LIBRA.webp new file mode 100644 index 0000000..7d40824 Binary files /dev/null and b/public/v2/compatibility/zodiacs/female/LIBRA.webp differ diff --git a/public/v2/compatibility/zodiacs/female/PISCES.webp b/public/v2/compatibility/zodiacs/female/PISCES.webp new file mode 100644 index 0000000..2bf3a5e Binary files /dev/null and b/public/v2/compatibility/zodiacs/female/PISCES.webp differ diff --git a/public/v2/compatibility/zodiacs/female/SAGITTARIUS.webp b/public/v2/compatibility/zodiacs/female/SAGITTARIUS.webp new file mode 100644 index 0000000..9cea2cc Binary files /dev/null and b/public/v2/compatibility/zodiacs/female/SAGITTARIUS.webp differ diff --git a/public/v2/compatibility/zodiacs/female/SCORPIO.webp b/public/v2/compatibility/zodiacs/female/SCORPIO.webp new file mode 100644 index 0000000..ca866f4 Binary files /dev/null and b/public/v2/compatibility/zodiacs/female/SCORPIO.webp differ diff --git a/public/v2/compatibility/zodiacs/female/TAURUS.webp b/public/v2/compatibility/zodiacs/female/TAURUS.webp new file mode 100644 index 0000000..7e258ea Binary files /dev/null and b/public/v2/compatibility/zodiacs/female/TAURUS.webp differ diff --git a/public/v2/compatibility/zodiacs/female/VIRGO.webp b/public/v2/compatibility/zodiacs/female/VIRGO.webp new file mode 100644 index 0000000..0978736 Binary files /dev/null and b/public/v2/compatibility/zodiacs/female/VIRGO.webp differ diff --git a/public/v2/compatibility/zodiacs/male/AQUARIUS.webp b/public/v2/compatibility/zodiacs/male/AQUARIUS.webp new file mode 100644 index 0000000..df118bc Binary files /dev/null and b/public/v2/compatibility/zodiacs/male/AQUARIUS.webp differ diff --git a/public/v2/compatibility/zodiacs/male/ARIES.webp b/public/v2/compatibility/zodiacs/male/ARIES.webp new file mode 100644 index 0000000..5754005 Binary files /dev/null and b/public/v2/compatibility/zodiacs/male/ARIES.webp differ diff --git a/public/v2/compatibility/zodiacs/male/CANCER.webp b/public/v2/compatibility/zodiacs/male/CANCER.webp new file mode 100644 index 0000000..48f11c7 Binary files /dev/null and b/public/v2/compatibility/zodiacs/male/CANCER.webp differ diff --git a/public/v2/compatibility/zodiacs/male/CAPRICORN.webp b/public/v2/compatibility/zodiacs/male/CAPRICORN.webp new file mode 100644 index 0000000..497412f Binary files /dev/null and b/public/v2/compatibility/zodiacs/male/CAPRICORN.webp differ diff --git a/public/v2/compatibility/zodiacs/male/GEMINI.webp b/public/v2/compatibility/zodiacs/male/GEMINI.webp new file mode 100644 index 0000000..4962aaa Binary files /dev/null and b/public/v2/compatibility/zodiacs/male/GEMINI.webp differ diff --git a/public/v2/compatibility/zodiacs/male/LEO.webp b/public/v2/compatibility/zodiacs/male/LEO.webp new file mode 100644 index 0000000..22aab53 Binary files /dev/null and b/public/v2/compatibility/zodiacs/male/LEO.webp differ diff --git a/public/v2/compatibility/zodiacs/male/LIBRA.webp b/public/v2/compatibility/zodiacs/male/LIBRA.webp new file mode 100644 index 0000000..7c6b842 Binary files /dev/null and b/public/v2/compatibility/zodiacs/male/LIBRA.webp differ diff --git a/public/v2/compatibility/zodiacs/male/PISCES.webp b/public/v2/compatibility/zodiacs/male/PISCES.webp new file mode 100644 index 0000000..590709a Binary files /dev/null and b/public/v2/compatibility/zodiacs/male/PISCES.webp differ diff --git a/public/v2/compatibility/zodiacs/male/SAGITTARIUS.webp b/public/v2/compatibility/zodiacs/male/SAGITTARIUS.webp new file mode 100644 index 0000000..422b5c8 Binary files /dev/null and b/public/v2/compatibility/zodiacs/male/SAGITTARIUS.webp differ diff --git a/public/v2/compatibility/zodiacs/male/SCORPIO.webp b/public/v2/compatibility/zodiacs/male/SCORPIO.webp new file mode 100644 index 0000000..32d8d5d Binary files /dev/null and b/public/v2/compatibility/zodiacs/male/SCORPIO.webp differ diff --git a/public/v2/compatibility/zodiacs/male/TAURUS.webp b/public/v2/compatibility/zodiacs/male/TAURUS.webp new file mode 100644 index 0000000..d3a76f8 Binary files /dev/null and b/public/v2/compatibility/zodiacs/male/TAURUS.webp differ diff --git a/public/v2/compatibility/zodiacs/male/VIRGO.webp b/public/v2/compatibility/zodiacs/male/VIRGO.webp new file mode 100644 index 0000000..f0d293b Binary files /dev/null and b/public/v2/compatibility/zodiacs/male/VIRGO.webp differ diff --git a/src/api/resources/Paywall.ts b/src/api/resources/Paywall.ts index 605e948..f8997e5 100644 --- a/src/api/resources/Paywall.ts +++ b/src/api/resources/Paywall.ts @@ -20,7 +20,10 @@ export enum EPlacementKeys { "aura.placement.chat" = "aura.placement.chat", "aura.placement.email.palmistry" = "aura.placement.email.palmistry", "aura.placement.email.palmistry.discount" = "aura.placement.email.palmistry.discount", - "aura.placement.email.compatibility.discount" = "aura.placement.email.compatibility.discount" + "aura.placement.email.compatibility.discount" = "aura.placement.email.compatibility.discount", + "aura.placement.palmistry.secret.discount" = "aura.placement.palmistry.secret.discount", + "aura.placement.compatibility.v2" = "aura.placement.compatibility.v2", + "aura.placement.compatibility.v2.secret.discount" = "aura.placement.compatibility.v2.secret.discount" } export interface ResponseGetSuccess { diff --git a/src/api/resources/Session.ts b/src/api/resources/Session.ts index 6e548f9..fdf6501 100644 --- a/src/api/resources/Session.ts +++ b/src/api/resources/Session.ts @@ -21,7 +21,7 @@ export interface PayloadUpdate { profile?: Partial; partner?: Partial>; - answers?: Partial; + answers?: Partial; } } @@ -38,6 +38,23 @@ export interface IAnswersSessionPalmistry { activities_independently: 1 | 2 | 3 | 4 | 5 // Type: number, optional - 1 | 2 | 3 | 4 | 5; } +export interface IAnswersSessionCompatibilityV2 { + what_aspects: 'love_relationships' | 'health_vitality' | 'career_destiny' | 'life_transitions', // Type: string, optional - 'love_relationships' | 'health_vitality' | 'career_destiny'; + relationship_status: 'single' | 'in_relationship' | 'engaged' | 'divorced' | 'complicated', // Type: string, optional - 'single' | 'in_relationship'; + element_resonates: 'water' | 'fire' | 'air' | 'earth' | 'light' | 'darkness', // Type: string, optional - 'water' | 'fire' | 'air' | 'earth'; + favorite_color: 'blue' | 'green' | 'orange' | 'violet' | 'red' | 'yellow' | 'turquoise', // Type: string, optional - 'blue' | 'green' | 'orange' | 'violet' | 'red' | 'yellow'; + head_or_heart: 'head' | 'heart' | 'both' | 'depends', // Type: string, optional - 'head' | 'heart' | 'both'; + time_alone: 1 | 2 | 3 | 4 | 5, // Type: number, optional - 1 | 2 | 3 | 4 | 5; + own_company: 1 | 2 | 3 | 4 | 5, // Type: number, optional - 1 | 2 | 3 | 4 | 5; + socializing_in_groups: 1 | 2 | 3 | 4 | 5, // Type: number, optional - 1 | 2 | 3 | 4 | 5; + loneliness_avoid: 1 | 2 | 3 | 4 | 5, // Type: number, optional - 1 | 2 | 3 | 4 | 5; + activities_independently: 1 | 2 | 3 | 4 | 5, // Type: number, optional - 1 | 2 | 3 | 4 | 5; + date_event: string; // Type: string, optional - ISO Date + partner_expectations: 1 | 2 | 3 | 4 | 5; // Type: number, optional - 1 | 2 | 3 | 4 | 5; + romantic_gestures: "love" | "neutral" | "dislike"; // Type: string, optional - "love" | "neutral" | "dislike"; + checking_phone: "against" | "allow" | "normally"; // Type: string, optional - "against" | "allow" | "normally"; +} + export interface IAnswersSessionChats { psychicReading: string; goal: string; diff --git a/src/api/resources/User.ts b/src/api/resources/User.ts index 39b1af1..927a29e 100644 --- a/src/api/resources/User.ts +++ b/src/api/resources/User.ts @@ -138,7 +138,8 @@ export enum ESourceAuthorization { "aura.moons" = "aura.moons", "aura.main.new" = "aura.main.new", "aura.palmistry.new" = "aura.palmistry.new", - "aura.chats" = "aura.chats" + "aura.chats" = "aura.chats", + "aura.compatibility.v2" = "aura.compatibility.v2" } export enum EGender { diff --git a/src/api/utils.ts b/src/api/utils.ts index fe4fe5d..306e5dd 100644 --- a/src/api/utils.ts +++ b/src/api/utils.ts @@ -24,6 +24,10 @@ export function createMethod(createRequest: (payload: P) => Request) { source = ESourceAuthorization["aura.chats"]; } + if (location.pathname.includes("/v2/compatibility")) { + source = ESourceAuthorization["aura.compatibility.v2"]; + } + const sessionId = localStorage.getItem(`${source}_sessionId`); if (sessionId?.length) { diff --git a/src/components/App/index.tsx b/src/components/App/index.tsx index 9e7edc8..73de9c0 100755 --- a/src/components/App/index.tsx +++ b/src/components/App/index.tsx @@ -29,6 +29,7 @@ import routes, { chatsPrefix, palmistryV2Prefix, emailMarketingV1Prefix, + compatibilityV2Prefix, } from "@/routes"; import BirthdayPage from "../BirthdayPage"; import BirthtimePage from "../BirthtimePage"; @@ -135,6 +136,7 @@ import CookieYesController from "@/routerComponents/CookieYesController"; import PalmistryV2Routes from "@/routerComponents/Palmistry/v2"; import MarketingLandingV1Routes from "@/routerComponents/MarketingLanding/v1"; import { useScrollToTop } from "@/hooks/useScrollToTop"; +import CompatibilityV2Routes from "@/routerComponents/Compatibility/v2"; const isProduction = import.meta.env.MODE === "production"; @@ -164,6 +166,7 @@ function App(): JSX.Element { const availableUrls = [ routes.client.genderV1(), routes.client.palmistryV1Welcome(), + routes.client.compatibilityV2Welcome(), routes.client.palmistryWelcome(), ]; const isPageAvailable = availableUrls.reduce( @@ -281,6 +284,10 @@ function App(): JSX.Element { path={`${palmistryV1Prefix}/*`} element={} /> + } + /> } /> }> + 2024, Wit Apps LLC,
+ 2108 N ST STE 5446 SACRAMENTO, CA 95816, US +

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

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

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

{email}

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

{point.text}

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

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

+
+
+ +

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

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

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

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

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

+

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

+

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

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

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

+
+
+ +

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

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

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

+
+
+ +

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

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

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

+
+
+ +

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

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

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

+
+
+ +

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

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

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

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

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

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

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

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

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

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

{username}

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

{tagline}

+

{text}

+
+ ); +} + +export default Review; diff --git a/src/components/CompatibilityV2/components/Review/styles.module.scss b/src/components/CompatibilityV2/components/Review/styles.module.scss new file mode 100644 index 0000000..8de8b34 --- /dev/null +++ b/src/components/CompatibilityV2/components/Review/styles.module.scss @@ -0,0 +1,38 @@ +.container { + width: 100%; + border-radius: 30px; + background: linear-gradient(to bottom, #4b88ff31 0%, #ffffff30 100%); + padding: 18px 12px 12px; +} + +.header { + margin-left: 8px; + display: flex; + flex-direction: row; + align-items: center; + gap: 6px; + + & > .info { + display: flex; + flex-direction: column; + align-items: start; + gap: 2px; + + & > .stars { + display: flex; + flex-direction: row; + align-items: center; + gap: 1px; + } + } +} + +.tagline { + color: #224e90; + line-height: 125%; +} + +.text { + margin-top: 16px; + line-height: 125%; +} diff --git a/src/components/CompatibilityV2/components/Reviews/index.tsx b/src/components/CompatibilityV2/components/Reviews/index.tsx new file mode 100644 index 0000000..a5c1b68 --- /dev/null +++ b/src/components/CompatibilityV2/components/Reviews/index.tsx @@ -0,0 +1,43 @@ +import { compatibilityV2Prefix } from "@/routes"; +import Review, { IReviewProps } from "../Review"; +import styles from "./styles.module.scss"; +import { useMemo } from "react"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; + +function Reviews() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV2); + const reviews: IReviewProps[] = useMemo( + () => [ + { + avatar: `${compatibilityV2Prefix}/reviews/rebecca.png`, + username: translate("/trial-payment.reviews.username1"), + tagline: translate("/trial-payment.reviews.tagline1"), + text: translate("/trial-payment.reviews.text1"), + }, + { + avatar: `${compatibilityV2Prefix}/reviews/mika.png`, + username: translate("/trial-payment.reviews.username2"), + tagline: translate("/trial-payment.reviews.tagline2"), + text: translate("/trial-payment.reviews.text2"), + }, + { + avatar: `${compatibilityV2Prefix}/reviews/amanda.png`, + username: translate("/trial-payment.reviews.username3"), + tagline: translate("/trial-payment.reviews.tagline3"), + text: translate("/trial-payment.reviews.text3"), + }, + ], + [translate] + ); + + return ( +
+ {reviews.map((review, index) => ( + + ))} +
+ ); +} + +export default Reviews; diff --git a/src/components/CompatibilityV2/components/Reviews/styles.module.scss b/src/components/CompatibilityV2/components/Reviews/styles.module.scss new file mode 100644 index 0000000..5574b33 --- /dev/null +++ b/src/components/CompatibilityV2/components/Reviews/styles.module.scss @@ -0,0 +1,6 @@ +.container { + display: flex; + flex-direction: column; + align-items: center; + gap: 10px; +} diff --git a/src/components/CompatibilityV2/components/SecretDiscountTable/index.tsx b/src/components/CompatibilityV2/components/SecretDiscountTable/index.tsx new file mode 100644 index 0000000..137885d --- /dev/null +++ b/src/components/CompatibilityV2/components/SecretDiscountTable/index.tsx @@ -0,0 +1,68 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.scss"; +import { images } from "../../data"; +import { usePaywall } from "@/hooks/paywall/usePaywall"; +import { addCurrency, ELocalesPlacement } from "@/locales"; +import { EPlacementKeys } from "@/api/resources/Paywall"; +import { Currency } from "@/components/PaymentTable"; +import { useTranslations } from "@/hooks/translations"; + +const placementKey = EPlacementKeys["aura.placement.compatibility.v2.secret.discount"] + +const getPrice = (price: number, currency: Currency) => { + if (price % 100 === 0) { + return addCurrency(price / 100, currency); + } + return addCurrency( + (price / 100).toFixed(2), + currency + ); +} + +function SecretDiscountTable() { + const { products, currency, getText } = usePaywall({ + placementKey, + localesPlacement: ELocalesPlacement.EmailMarketingPalmistryV2, + }); + const { translate } = useTranslations(ELocalesPlacement.EmailMarketingPalmistryV2); + + // const activeProduct = products.find(product => product?.trialPrice === activeProductFromStore?.trialPrice) || products[0] + const activeProduct = products[0] + // const price = activeProduct?.price || 0; + const trialPrice = activeProduct?.trialPrice || 0; + // const trialDuration = activeProduct?.trialDuration || 7; + + return ( +
+ + {translate("secret-discount.secret-discount-table_title")} + +

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

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

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

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

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

+
+
+
+

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

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

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

+
+
+ 1 : 1 +

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

+
+
+ Daily +

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

+
+
+ Cosmic +

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

+
+
+ Calendar +

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

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

{translate("/birthdate.text")}

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

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

+ setIsDisabled(true)} + inputClassName="date-picker-input" + /> + + Hand with eye +
+ ); +} + +export default BirthdatePartner; diff --git a/src/components/CompatibilityV2/pages/BirthdatePartner/styles.module.scss b/src/components/CompatibilityV2/pages/BirthdatePartner/styles.module.scss new file mode 100644 index 0000000..0d9f9df --- /dev/null +++ b/src/components/CompatibilityV2/pages/BirthdatePartner/styles.module.scss @@ -0,0 +1,22 @@ +.page-container { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; +} + +.title { + margin-bottom: 0; + font-size: 27px; +} + +.description { + margin: 16px 0 25px; + text-align: center; + font-size: 20px; +} + +.image { + margin-top: 56px; +} diff --git a/src/components/CompatibilityV2/pages/Camera/index.tsx b/src/components/CompatibilityV2/pages/Camera/index.tsx new file mode 100644 index 0000000..8649f40 --- /dev/null +++ b/src/components/CompatibilityV2/pages/Camera/index.tsx @@ -0,0 +1,221 @@ +import styles from "./styles.module.scss"; +import { DataURIToBlob } from "@/services/data"; +import { useApi } from "@/api"; +import { IPalmistryFinger, IPalmistryLine } from "@/api/resources/Palmistry"; +import { ICompatibilityV2FingerLocal } from "@/store/compatibilityV2"; +import { useDispatch } from "react-redux"; +import { actions } from "@/store"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; +import { useState } from "react"; +import Loader, { LoaderColor } from "@/components/Loader"; +import UploadModal from "@/components/palmistry/upload-modal/upload-modal"; +import Toast from "@/components/pages/ABDesign/v1/components/Toast"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; +import CameraModal from "../../components/CameraModal"; + +const isProduction = import.meta.env.MODE === "production"; + +enum EToastVisible { + "try_again" = "try_again", + "try_again_or_next" = "try_again_or_next", +} + +function Camera() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV2); + const navigate = useNavigate(); + const api = useApi(); + const dispatch = useDispatch(); + const [isLoading, setIsLoading] = useState(false); + const [uploadMenuModalIsOpen, setUploadMenuModalIsOpen] = useState(false); + const [toastVisible, setToastVisible] = useState(null); + + const handleNext = () => { + navigate(routes.client.compatibilityV2ScannedPhoto()); + }; + + const fingersNames = { + thumb: translate("thumb"), + index_finger: translate("index_finger"), + middle_finger: translate("middle_finger"), + ring_finger: translate("ring_finger"), + pinky: translate("pinky"), + }; + + const setFingersNames = ( + fingers: IPalmistryFinger[] + ): ICompatibilityV2FingerLocal[] => { + if (!fingers) return []; + return fingers.map((finger) => { + return { + ...finger, + fingerName: fingersNames[finger.name as keyof typeof fingersNames], + }; + }); + }; + + /** + * Check if the palmistry lines are valid for the next step. + * If the length of the lines is less than 2, show the "try_again" toast. + * If the length of the lines is 2, show the "try_again_or_next" toast. + * Otherwise, return true. + * @param {IPalmistryLine[]} lines - The palmistry lines. + * @returns {boolean} Whether the palmistry lines are valid for the next step. + */ + const checkPalmistryLines = (lines: IPalmistryLine[]): boolean => { + if (!lines.length || lines.length < 2) { + setToastVisible(EToastVisible.try_again); + return false; + } + if (lines.length === 2) { + setToastVisible(EToastVisible.try_again_or_next); + return false; + } + return true; + }; + + const getLines = async (file: File | Blob) => { + setIsLoading(true); + const formData = new FormData(); + formData.append("file", file); + try { + const result = await api.getPalmistryLines({ formData }); + const fingers = setFingersNames(result?.fingers); + + dispatch( + actions.compatibilityV2.update({ + lines: result?.lines, + fingers, + }) + ); + return result; + } catch (error) { + dispatch( + actions.compatibilityV2.update({ + lines: [], + fingers: [], + }) + ); + return null; + } finally { + setIsLoading(false); + } + }; + + const onTakePhoto = async (photo: string) => { + setUploadMenuModalIsOpen(false); + + try { + const file = DataURIToBlob(photo); + + const result = await getLines(file); + + URL.revokeObjectURL(URL.createObjectURL(file)); + + dispatch( + actions.compatibilityV2.update({ + photo, + }) + ); + if (!checkPalmistryLines(result?.lines || [])) return; + handleNext(); + } catch (error) { + console.error('Ошибка при обработке фото:', error); + } finally { + // Принудительный запуск сборщика мусора (не гарантировано, но может помочь) + if (window.gc) { + window.gc(); + } + } + }; + + const onSelectFile = async (event: React.ChangeEvent) => { + setUploadMenuModalIsOpen(false); + + if (!event.target.files || event.target.files.length === 0) return; + + const result = await getLines(event.target.files[0]); + + const reader = new FileReader(); + + reader.onloadend = () => { + dispatch( + actions.compatibilityV2.update({ + photo: reader.result as string, + }) + ); + if (!checkPalmistryLines(result?.lines || [])) return; + handleNext(); + }; + + reader.readAsDataURL(event.target.files[0]); + }; + + return ( + <> + {!isProduction && uploadMenuModalIsOpen && ( + setUploadMenuModalIsOpen(false)} + onSelectFile={onSelectFile} + onChooseCamera={() => true} + /> + )} + {!isProduction && ( + + )} + {!isLoading && !uploadMenuModalIsOpen && ( + // console.log("close")} + // onTakePhoto={onTakePhoto} + // /> + console.log("close")} + onTakePhoto={onTakePhoto} + onError={(error) => { + console.error(error) + setToastVisible(EToastVisible.try_again) + }} + /> + )} + {isLoading && ( + + )} + {toastVisible === EToastVisible.try_again && ( + +
+ {translate("/camera.bad_photo")} + +
+
+ )} + {toastVisible === EToastVisible.try_again_or_next && ( + +
+ {translate("/camera.do_better")} +
+ + +
+
+
+ )} + + ); +} + +export default Camera; diff --git a/src/components/CompatibilityV2/pages/Camera/styles.module.scss b/src/components/CompatibilityV2/pages/Camera/styles.module.scss new file mode 100644 index 0000000..af74740 --- /dev/null +++ b/src/components/CompatibilityV2/pages/Camera/styles.module.scss @@ -0,0 +1,50 @@ +.loader { + transform: translate(-50%, -50%); + position: absolute; + top: 50%; + left: 50%; +} + +.upload-button { + position: fixed; + top: 32px; + right: 32px; + z-index: 3000; +} + +.toast-container { + position: fixed; + bottom: calc(0dvh + 16px); + width: 100%; + z-index: 3000; + padding: 0 16px; +} + +.toast-content { + display: flex; + flex-direction: row; + gap: 8px; + align-items: center; + justify-content: space-between; + + & > button, + & > .buttons-container > button { + padding: 6px 18px; + border: none; + background-color: #fff; + color: #000; + border-radius: 4px; + font-size: 14px; + font-weight: 500; + } + + & > .buttons-container > button { + width: 100%; + } + + & > .buttons-container { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 8px; + } +} diff --git a/src/components/CompatibilityV2/pages/CheckingPhone/index.tsx b/src/components/CompatibilityV2/pages/CheckingPhone/index.tsx new file mode 100644 index 0000000..1d937d9 --- /dev/null +++ b/src/components/CompatibilityV2/pages/CheckingPhone/index.tsx @@ -0,0 +1,83 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.scss"; +import Answer from "../../components/Answer"; +import { useDispatch, useSelector } from "react-redux"; +import { actions, selectors } from "@/store"; +import { sleep } from "@/services/date"; +import { useNavigate } from "react-router-dom"; +import routes from "@/routes"; +import { answerTimeOut } from "../../data"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; +import { useMemo } from "react"; +import { ELottieKeys, useLottie } from "@/hooks/lottie/useLottie"; +import { useSession } from "@/hooks/session/useSession"; +import { IAnswersSessionCompatibilityV2 } from "@/api/resources/Session"; +import { ESourceAuthorization } from "@/api/resources/User"; + +function CheckingPhone() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV2); + const { updateSession } = useSession(); + const navigate = useNavigate(); + const dispatch = useDispatch(); + const { checkingPhone, relationshipStatus } = useSelector( + selectors.selectCompatibilityV2Answers + ); + useLottie({ + preloadKey: ELottieKeys.scalesNeutralPalmistry, + }); + + const answers: { + id: IAnswersSessionCompatibilityV2["checking_phone"]; + title: string; + }[] = useMemo( + () => [ + { + id: "against", + title: translate("/checking-phone.answer1"), + }, + { + id: "allow", + title: translate("/checking-phone.answer2"), + }, + { + id: "normally", + title: translate("/checking-phone.answer3"), + }, + ], + [translate] + ); + + const handleClick = async (id: IAnswersSessionCompatibilityV2["checking_phone"]) => { + dispatch(actions.compatibilityV2Answers.update({ checkingPhone: id })); + updateSession({ + answers: { + checking_phone: id, + }, + }, ESourceAuthorization["aura.compatibility.v2"]); + if (id !== checkingPhone) await sleep(answerTimeOut); + + if (relationshipStatus === "single") { + return navigate(routes.client.compatibilityV2DateEvent()); + } + return navigate(routes.client.compatibilityV2GenderPartner()); + }; + + return ( +
+ + {translate("/checking-phone.title")} + + {answers.map((answers, index) => ( + handleClick(answers.id)} + /> + ))} +
+ ); +} + +export default CheckingPhone; diff --git a/src/components/CompatibilityV2/pages/CheckingPhone/styles.module.scss b/src/components/CompatibilityV2/pages/CheckingPhone/styles.module.scss new file mode 100644 index 0000000..5bfbb7c --- /dev/null +++ b/src/components/CompatibilityV2/pages/CheckingPhone/styles.module.scss @@ -0,0 +1,3 @@ +.container { + width: 100%; +} diff --git a/src/components/CompatibilityV2/pages/DateEvent/index.tsx b/src/components/CompatibilityV2/pages/DateEvent/index.tsx new file mode 100644 index 0000000..fd7a471 --- /dev/null +++ b/src/components/CompatibilityV2/pages/DateEvent/index.tsx @@ -0,0 +1,91 @@ +import Title from "@/components/Title"; +import styles from "./styles.module.scss"; +import { DatePicker } from "@/components/DateTimePicker"; +import { useState } from "react"; +import { useDispatch, useSelector } from "react-redux"; +import { actions, selectors } from "@/store"; +import Button from "../../components/Button"; +import metricService from "@/services/metric/metricService"; +import routes, { compatibilityV2Prefix } from "@/routes"; +import { useNavigate } from "react-router-dom"; +import { useTranslations } from "@/hooks/translations"; +import { ELocalesPlacement } from "@/locales"; +import { useSession } from "@/hooks/session/useSession"; +import { ESourceAuthorization } from "@/api/resources/User"; + +function DateEvent() { + const { translate } = useTranslations(ELocalesPlacement.CompatibilityV2); + const { updateSession } = useSession(); + const navigate = useNavigate(); + const dispatch = useDispatch(); + const { dateEvent: dateEventFromStore, relationshipStatus } = useSelector(selectors.selectCompatibilityV2Answers); + const translateSeparator = relationshipStatus === "single" ? "single" : "relationship"; + + const [dateEvent, setDateEvent] = useState(dateEventFromStore); + const [isDisabled, setIsDisabled] = useState(true); + + const handleValid = (_birthdate: string) => { + setDateEvent(_birthdate); + setIsDisabled(_birthdate === ""); + }; + + const getAge = () => { + const today = new Date(); + const date = new Date(dateEvent); + let age = today?.getFullYear() - date?.getFullYear(); + const m = today?.getMonth() - date?.getMonth(); + if (m < 0 || (m === 0 && today?.getDate() < date?.getDate())) { + age--; + } + return age; + }; + + const handleNext = () => { + const age = getAge(); + metricService.userParams({ + age, + }); + // dispatch(actions.form.addDate(birthdate)); + dispatch(actions.compatibilityV2Answers.update({ dateEvent })); + navigate(routes.client.compatibilityV2HeadOrHeart()); + updateSession( + { + answers: { + date_event: `${dateEvent} 00:00`, + } + }, + ESourceAuthorization["aura.compatibility.v2"] + ); + }; + + return ( +
+ + {translate(`/date-event.${translateSeparator}.title`)} + +

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

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

{answers.title}

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

{translate("/email.not_share")}

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

{answers.title}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Something went wrong

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

Payment successful

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

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

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

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

+

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

+

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

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

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

+ +

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

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

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

+
+
setIsPause(false)}> +

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

+
+
setIsPause(false)}> +

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

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

+ {getProgressValue(index)}% +

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

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

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

{getLongText(locale)}

+ +
+ +

{getText("text.1")}

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

{getText("text.1")}

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

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

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

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

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