diff --git a/.gitignore b/.gitignore index 3c4017b..bf3bc16 100644 --- a/.gitignore +++ b/.gitignore @@ -415,3 +415,7 @@ fabric.properties # Android studio 3.1+ serialized cache file .idea/caches/build_file_checksums.ser +# packages for node +package.json +package-lock.json + diff --git a/BaseModels/base_models.py b/BaseModels/base_models.py index adc86f7..db6dec5 100644 --- a/BaseModels/base_models.py +++ b/BaseModels/base_models.py @@ -29,12 +29,31 @@ class BaseModel(models.Model): json_data = models.JSONField(verbose_name=_('Дополнительные данные'), default=dict, blank=True) + media_items = GenericRelation('GeneralApp.MediaItem', related_query_name='grel_%(class)s_for_media_item') + def __str__(self): if self.name: return self.name else: return str(self.id) + def get_media_items(self, exclude_kwargs=None): + if not exclude_kwargs: + exclude_kwargs = {} + return self.media_items.exclude( + **exclude_kwargs + ).filter( + enable=True + ).order_by('order') + + def get_video_items(self): + exclude_kwargs = {'video': None} + return self.get_media_items(exclude_kwargs=exclude_kwargs) + + def get_picture_items(self): + exclude_kwargs = {'picture': None} + return self.get_media_items(exclude_kwargs=exclude_kwargs) + def pop_node_by_name(self, node_name): if not self.json_data or not node_name in self.json_data: return None @@ -108,7 +127,6 @@ class BaseModelViewPage(BaseModel): FAQ_title = models.CharField(max_length=250, verbose_name=_(u'FAQ Заголовок'), null=True, blank=True) FAQ_items = GenericRelation('GeneralApp.FAQitem', related_query_name='grel_%(class)s_for_faq_item') - class Meta: abstract = True diff --git a/BillingApp/migrations/0006_alter_subscribeorder_currency.py b/BillingApp/migrations/0006_alter_subscribeorder_currency.py new file mode 100644 index 0000000..8d93ea6 --- /dev/null +++ b/BillingApp/migrations/0006_alter_subscribeorder_currency.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.2 on 2024-07-12 17:23 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('BillingApp', '0005_subscribeorder_last_operation_status'), + ] + + operations = [ + migrations.AlterField( + model_name='subscribeorder', + name='currency', + field=models.CharField(default='KZT', max_length=3, verbose_name='Валюта'), + ), + ] diff --git a/GeneralApp/admin.py b/GeneralApp/admin.py index d315ceb..614dbee 100644 --- a/GeneralApp/admin.py +++ b/GeneralApp/admin.py @@ -3,6 +3,8 @@ from .models import * from django.contrib import admin from django.utils.translation import gettext as _ + + class Admin_StaticPage(Admin_Trans_BaseModelViewPage): fieldsets = [ diff --git a/GeneralApp/migrations/0006_mediaitem.py b/GeneralApp/migrations/0006_mediaitem.py new file mode 100644 index 0000000..a22296f --- /dev/null +++ b/GeneralApp/migrations/0006_mediaitem.py @@ -0,0 +1,41 @@ +# Generated by Django 4.2.2 on 2024-11-15 14:50 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('GeneralApp', '0005_option_name_en_option_name_ru_option_prefix_en_and_more'), + ] + + operations = [ + migrations.CreateModel( + name='MediaItem', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.TextField(blank=True, help_text='Название', null=True, verbose_name='Название')), + ('name_ru', models.TextField(blank=True, help_text='Название', null=True, verbose_name='Название')), + ('name_en', models.TextField(blank=True, help_text='Название', null=True, verbose_name='Название')), + ('name_plural', models.TextField(blank=True, null=True, verbose_name='Название (множественное число)')), + ('order', models.IntegerField(blank=True, null=True, verbose_name='Очередность отображения')), + ('createDT', models.DateTimeField(auto_now_add=True, verbose_name='Дата и время создания')), + ('modifiedDT', models.DateTimeField(blank=True, null=True, verbose_name='Дата и время последнего изменения')), + ('enable', models.BooleanField(db_index=True, default=True, verbose_name='Включено')), + ('json_data', models.JSONField(blank=True, default=dict, verbose_name='Дополнительные данные')), + ('object_id', models.PositiveIntegerField()), + ('picture', models.ImageField(blank=True, null=True, upload_to='media/', verbose_name='Фото')), + ('video', models.FileField(blank=True, null=True, upload_to='media/video/', verbose_name='Видео')), + ('comment', models.TextField(blank=True, null=True, verbose_name='Комментарий')), + ('comment_ru', models.TextField(blank=True, null=True, verbose_name='Комментарий')), + ('comment_en', models.TextField(blank=True, null=True, verbose_name='Комментарий')), + ('content_type', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='contenttypes.contenttype')), + ], + options={ + 'verbose_name': 'Медиа элемент', + 'verbose_name_plural': 'Медиа элементы', + }, + ), + ] diff --git a/GeneralApp/migrations/0007_alter_mediaitem_picture_alter_mediaitem_video.py b/GeneralApp/migrations/0007_alter_mediaitem_picture_alter_mediaitem_video.py new file mode 100644 index 0000000..260bf8f --- /dev/null +++ b/GeneralApp/migrations/0007_alter_mediaitem_picture_alter_mediaitem_video.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.2 on 2024-11-15 15:58 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('GeneralApp', '0006_mediaitem'), + ] + + operations = [ + migrations.AlterField( + model_name='mediaitem', + name='picture', + field=models.ImageField(blank=True, null=True, upload_to='uploads/', verbose_name='Фото'), + ), + migrations.AlterField( + model_name='mediaitem', + name='video', + field=models.FileField(blank=True, null=True, upload_to='uploads/video/', verbose_name='Видео'), + ), + ] diff --git a/GeneralApp/migrations/0008_alter_mediaitem_picture_alter_mediaitem_video.py b/GeneralApp/migrations/0008_alter_mediaitem_picture_alter_mediaitem_video.py new file mode 100644 index 0000000..a125376 --- /dev/null +++ b/GeneralApp/migrations/0008_alter_mediaitem_picture_alter_mediaitem_video.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.2 on 2024-11-15 15:59 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('GeneralApp', '0007_alter_mediaitem_picture_alter_mediaitem_video'), + ] + + operations = [ + migrations.AlterField( + model_name='mediaitem', + name='picture', + field=models.ImageField(blank=True, null=True, upload_to='media_items/photo/', verbose_name='Фото'), + ), + migrations.AlterField( + model_name='mediaitem', + name='video', + field=models.FileField(blank=True, null=True, upload_to='media_items/video/', verbose_name='Видео'), + ), + ] diff --git a/GeneralApp/models.py b/GeneralApp/models.py index bae28a0..15ee8a6 100644 --- a/GeneralApp/models.py +++ b/GeneralApp/models.py @@ -3,6 +3,26 @@ from BaseModels.base_models import BaseModelViewPage, BaseModel from django.utils.translation import gettext_lazy as _ # from ckeditor.fields import RichTextField from ckeditor_uploader.fields import RichTextUploadingField +from django.contrib.contenttypes.models import ContentType +from django.contrib.contenttypes.fields import GenericForeignKey + + +class MediaItem(BaseModel): + + content_type = models.ForeignKey(ContentType, on_delete=models.SET_NULL, null=True) + object_id = models.PositiveIntegerField() + content_object = GenericForeignKey('content_type', 'object_id') + + picture = models.ImageField(upload_to='media_items/photo/', verbose_name=_('Фото'), null=True, blank=True) + video = models.FileField(upload_to='media_items/video/', verbose_name=_('Видео'), null=True, blank=True) + + comment = models.TextField(verbose_name=_('Комментарий'), null=True, blank=True) + + class Meta: + verbose_name = _('Медиа элемент') + verbose_name_plural = _('Медиа элементы') + + class StaticPage(BaseModelViewPage): promo_header = models.BooleanField(verbose_name=_('Промо-хэдер'), default=False) @@ -29,9 +49,6 @@ class Option(BaseModel): class FAQitem(BaseModel): - from django.contrib.contenttypes.models import ContentType - from django.contrib.contenttypes.fields import GenericForeignKey - content_type = models.ForeignKey(ContentType, on_delete=models.SET_NULL, null=True) object_id = models.PositiveIntegerField() content_object = GenericForeignKey('content_type', 'object_id') diff --git a/GeneralApp/translation.py b/GeneralApp/translation.py index 2427687..b83f79b 100644 --- a/GeneralApp/translation.py +++ b/GeneralApp/translation.py @@ -27,3 +27,9 @@ class FAQitem_TranslationOptions(TranslationOptions): ) translator.register(FAQitem, FAQitem_TranslationOptions) +class MediaItem_TranslationOptions(TranslationOptions): + fields = ( + 'name', 'comment', + ) +translator.register(MediaItem, MediaItem_TranslationOptions) + diff --git a/GeneralApp/urls.py b/GeneralApp/urls.py index 239389e..9a59cdd 100644 --- a/GeneralApp/urls.py +++ b/GeneralApp/urls.py @@ -7,6 +7,9 @@ from .views import * urlpatterns = [ path('', MainPage, name='main'), path('mover_landing_page/', LandingMoverPage, name='mover_landing_page'), + path('customer_landing_page/', LandingCustomerPage, name='customer_landing_page'), + + path('page//', StaticPageView, name='static_page'), path('test_code', test_code, name='test_code'), path('generate_routes//', generate_routes, name='generate_routes'), diff --git a/GeneralApp/views.py b/GeneralApp/views.py index 9933d76..ddad45d 100644 --- a/GeneralApp/views.py +++ b/GeneralApp/views.py @@ -73,7 +73,7 @@ def test_code(request): from RoutesApp.search_matches import search_matches from RoutesApp.models import Route - search_matches(Route.objects.filter(from_city__id=57062)) + search_matches(Route.objects.filter(id=16)) # from RoutesApp.funcs import get_city_by_type_transport_and_address_point # from RoutesApp.models import Route @@ -172,6 +172,30 @@ def LandingMoverPage(request): return get_inter_http_response(t, Dict, request) +def LandingCustomerPage(request): + + from .init_options import init_options + init_options() + + + print(f'LOCALE_PATHS = {str(settings.LOCALE_PATHS)}') + + page, is_created = StaticPage.objects.get_or_create(url='landing_customer') + + Dict = { + 'page': page, + } + + + + breadcrumbs_Dict = { + } + Dict.update({'breadcrumbs': breadcrumbs_Dict}) + + t = loader.get_template('pages/p_customer_landing_page.html') + return get_inter_http_response(t, Dict, request) + + def MainPage(request): from RoutesApp.forms import RouteForm diff --git a/RoutesApp/search_matches.py b/RoutesApp/search_matches.py index e024be6..e693eff 100644 --- a/RoutesApp/search_matches.py +++ b/RoutesApp/search_matches.py @@ -116,10 +116,11 @@ def search_matches(for_routes=None): kwargs.update({f"{field_name}__date": field_val.date()}) elif field_name == 'weight': # print(field_name) - params.update({f"{field_name}": field_val}) if route.owner_type == 'mover': + # params.update({f"{field_name}__lte": field_val}) kwargs.update({f"{field_name}__lte": field_val}) else: + # params.update({f"{field_name}__gte": field_val}) kwargs.update({f"{field_name}__gte": field_val}) elif field_name == 'from_city': params.update({'from_address_point': field_val.id}) diff --git a/sets/admin.py b/sets/admin.py index ffa7d01..494302d 100644 --- a/sets/admin.py +++ b/sets/admin.py @@ -1,6 +1,10 @@ -from BaseModels.admin_utils import Admin_GenericBaseIconStackedInline, Admin_BaseIconModel, GenericStackedInline +from BaseModels.admin_utils import ( + Admin_GenericBaseIconStackedInline, Admin_BaseIconModel, GenericStackedInline, + AdminImageWidget, get_image_thumb +) from copy import deepcopy - +from django.db import models +from django.utils.translation import gettext as _ class Admin_BaseModel(Admin_BaseIconModel): @@ -86,12 +90,17 @@ class AdminTranslationBase(TranslationAdmin): 'screen': ('modeltranslation/css/tabbed_translation_fields.css',), } -from modeltranslation.admin import TranslationGenericStackedInline -class AdminStacked_FAQitem(TranslationGenericStackedInline): - from GeneralApp.models import FAQitem - model = FAQitem - extra = 0 - fields = ['order', 'question', 'answer'] +from modeltranslation.admin import TranslationGenericStackedInline, TranslationGenericTabularInline +class TranslationGenericTabularInlineCustom(TranslationGenericTabularInline): + formfield_overrides = { + models.ImageField: {'widget': AdminImageWidget}, + } + + def image_thumb(self, obj): + return get_image_thumb(self, obj) + + image_thumb.short_description = _('Миниатюра') + image_thumb.allow_tags = True class Media: @@ -105,6 +114,46 @@ class AdminStacked_FAQitem(TranslationGenericStackedInline): 'screen': ('modeltranslation/css/tabbed_translation_fields.css',), } +class TranslationGenericStackedInlineCustom(TranslationGenericStackedInline): + formfield_overrides = { + models.ImageField: {'widget': AdminImageWidget}, + } + + def image_thumb(self, obj): + return get_image_thumb(self, obj) + + image_thumb.short_description = _('Миниатюра') + image_thumb.allow_tags = True + + class Media: + + js = ( + 'modeltranslation/js/force_jquery.js', + 'http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js', + 'http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.2/jquery-ui.min.js', + 'modeltranslation/js/tabbed_translation_fields.js', + ) + css = { + 'screen': ('modeltranslation/css/tabbed_translation_fields.css',), + } + + +class AdminStacked_FAQitem(TranslationGenericStackedInlineCustom): + from GeneralApp.models import FAQitem + model = FAQitem + extra = 0 + fields = ['order', 'question', 'answer'] + + + +class AdminTabular_Mediaitem(TranslationGenericTabularInlineCustom): + from GeneralApp.models import MediaItem + model = MediaItem + extra = 0 + fields = ['order', 'video', 'picture'] + + + class Admin_BaseModelViewPage(Admin_BaseIconModel): pass # def get_fieldsets(self, request, obj=None): @@ -129,7 +178,7 @@ class Admin_BaseModelViewPage(Admin_BaseIconModel): # else: # return {} # - inlines = [AdminStacked_FAQitem] + inlines = [AdminStacked_FAQitem, AdminTabular_Mediaitem] diff --git a/static/css/moover.css b/static/css/moover.css index ed64e21..7b091e5 100644 --- a/static/css/moover.css +++ b/static/css/moover.css @@ -1,20 +1,21 @@ -/*.container {*/ -/* margin: 0 auto;*/ -/* width: 1260px*/ -/*}*/ +.container { + margin: 0 auto; + width: 1280px; + position: relative; + min-height: 695px; +} -/*@media (max-width: 1339.98px) {*/ -/* .container {*/ -/* width: 992px*/ -/* }*/ -/*}*/ +@media (min-width: 1720px) { + .container { + width: 1720px; + } +} /*@media (max-width: 1019.98px) {*/ /* .container {*/ /* width: 720px*/ /* }*/ /*}*/ - /*@media (max-width: 767.98px) {*/ /* .container {*/ /* margin: 0 15px;*/ @@ -25,8 +26,58 @@ --color-primary: #FF613A; --color-white: #FFFFFF; --color-black: #000000; + --color-black2: #272424; + --color-grey: #F1F1F1; + --color-grey2: #7A7979; + --color-orange: #FF613A; + --box-shadow-primary: -1px 4px 10px 0 rgba(198, 199, 203, 0.20), + 0 -1px 10px 0 rgba(198, 199, 203, 0.20); + text-align: center; + color: var(--color-black2); } +.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 { + font-weight: 700; +} + +h1, .h1 { + font-size: 44px; + line-height: 52px; +} + +@media (min-width: 1720px) { + h1, .h1 { + font-size: 48px; + line-height: 52px; + } +} + +h2, .h2 { + font-size: 24px; + line-height: 36px; + margin-bottom: 10px; +} + +h3, .h3 { + font-size: 20px; + line-height: 28px; + margin-bottom: 12px; +} + +h4, .h4 { + font-size: 18px; + line-height: 26px; + margin-bottom: 20px; +} + +p { + line-height: 22px; + margin-bottom: 20px; +} + +b { + font-weight: 500; +} .btn { display: inline-flex; @@ -34,12 +85,11 @@ color: black; line-height: 22px; border-radius: 10px; - padding: 20px 76px; + padding: 20px 76px 18px; justify-content: center; align-items: center; - margin: 0px 3px; + margin: 0 3px; letter-spacing: 0.2px; - font-size: 18px; } @@ -48,11 +98,53 @@ color: var(--color-white); } -/***********************presentation******************************************/ +.title { + font-size: 44px; + font-weight: 700; + line-height: 52px; + margin-bottom: 13px; + margin-left: auto; + margin-right: auto; +} + +@media (min-width: 1720px) { + .title { + font-size: 44px; + margin-bottom: 22px; + } +} + +.subtitle { + margin-bottom: 81px; + line-height: 22px; +} + +@media (min-width: 1720px) { + .subtitle { + font-size: 20px; + margin-bottom: 97px; + } +} + +.hide { + display: none; +} + +@media (min-width: 1440px) { + .is-container.wrapper_main { + max-width: initial; + } +} + .presentation { - text-align: center; - margin: 0 -65px 20px; - + margin: 20px -65px 140px; +} + +@media (min-width: 1720px) { + .presentation { + margin-left: 0; + margin-right: 0; + } } .presentation__top { @@ -60,44 +152,38 @@ min-height: 270px; margin: 0 auto 116px; padding: 29px 0 40px; - background-image: url(/static/img/webp/Box9.webp), - url(/static/img/webp/Box10.webp), - url(/static/img/webp/Box11.webp), - url(/static/img/webp/Box12.webp); - background-position: top -6px left 27px, - top -29px right -37px, - bottom 70px left 258px, - bottom 67px right 252px; - background-repeat: no-repeat, - no-repeat, - no-repeat, - no-repeat; + background-image: url(/static/img/png/Box9.png), url(/static/img/png/Box10.png), url(/static/img/png/Box11.png), url(/static/img/png/Box12.png); + background-position: top -4px left 46px, top -30px right -14px, bottom 73px left 278px, bottom 71px right 276px; + background-repeat: no-repeat, no-repeat, no-repeat, no-repeat; + background-size: 17.5%,21.8%,8.5%,8.8%; +} + +@media (min-width: 1720px) { + .presentation__top { + background-size: 18.5%, 22%, 9%, 10.1%; + background-position: top -47px left 58px, top -31px right 20px, bottom 8px left 347px, bottom -5px right 352px; + padding-top: 95px; + margin-bottom: 176px; + } } .presentation__title { - font-size: 44px; - font-style: normal; - font-weight: 700; - line-height: 52px; - margin-bottom: 20px; + margin-bottom: 23px; } .presentation__subtitle { - text-align: center; - padding-left: 5px; - margin-bottom: 40px; - font-size: 18px; + margin-bottom: 41px; font-weight: 600; - line-height: 26px; } .presentation__btn { - margin-bottom: 38px; + margin-bottom: 40px; } .presentation__next { font-weight: 500; line-height: 22px; + padding-right: 5px; } .presentation__arrows { @@ -105,16 +191,11 @@ animation: jump 2s ease-in-out infinite; } -.presentation__desc { - margin-bottom: 50px; -} - @keyframes jump { 0% { transform: translateY(0px); } 50% { - /*transform: translateY(20px);*/ transform: translateY(-5px); } 60% { @@ -131,25 +212,36 @@ } } -/***********************cards*********************/ +.presentation__bottom .presentation__title { + margin-bottom: 13px; +} -.cards { +.presentation__cards { + max-width: 1300px; + margin: 0 auto; } .cards__list { display: grid; grid-template-columns: repeat(4, 1fr); - gap: 5px; } .cards__item { position: relative; } +.cards__img:hover { + scale: 1.05; + transition: scale 0.15s linear; +} + .cards__img { + margin-bottom: 5px; } .cards__desc { + font-weight: 500; + line-height: 22px; } .cards__arrow { @@ -157,6 +249,445 @@ height: 20px; position: absolute; right: -30px; - top: -13px; + top: -21px; background-image: url("/static/img/svg/Arrow23.svg"); } + +.easy { + margin-bottom: 162px; +} + +.easy .title { + max-width: 55%; + margin-bottom: 21px; +} + +.easy .subtitle { + margin-bottom: 41px; +} + +.easy__grid { + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-rows: repeat(2, minmax(186px, auto)); + grid-template-areas: 'a b' 'a c'; + grid-column-gap: 20px; + grid-row-gap: 80px; + margin-bottom: 46px; +} + +.easy__item { + border-radius: 30px; + background-color: var(--color-grey); + /*background-color: #a72525;*/ + text-align: left; + padding: 21px; + box-shadow: var(--box-shadow-primary); +} + +.easy__item--fir { + grid-area: a; + margin-right: 60px; + padding-bottom: 0; +} + +.easy__item--fir p { + width: 93%; + margin-bottom: 29px; +} + +.easy__item--sec img { + margin-bottom: -10px; + margin-right: -5px; +} + +.easy__item--thr img { + margin-bottom: -10px; + margin-right: 24px; +} + +.easy__item--sec { + grid-area: b; + position: relative; + display: flex; + align-items: center; + justify-content: space-between; +} + +.easy__item--sec p, +.easy__item--thr p, +.easy__item--sec, +.easy__item--thr { + margin-bottom: 0; + padding-top: 0; + padding-bottom: 0; +} + +.easy__item--thr { + grid-area: c; + display: flex; + align-items: center; + justify-content: space-between; +} + +.easy__item--thr p { + max-width: 50%; +} + +.easy__arrow { + width: 68px; + height: 18px; + background-image: url("/static/img/svg/Arrow08.svg"); + position: absolute; + z-index: 1; +} + +.easy__arrow--fir { + top: 46%; + right: 101%; +} + +.easy__arrow--sec { + top: 117%; + left: 30%; + transform: rotate(90deg); +} + +.easy__btn { + margin-top: -21px; +} + +.chatterbox { + margin-bottom: 160px; +} + +.chatterbox__slider { + max-width: 1200px; + margin: 0 auto; +} + +.chatterbox__slide { + width: 335px; + height: 615px; + background: url("/static/img/webp/phone-border.webp") center no-repeat; + transition: scale 0.2s ease-in-out; + margin: auto; + position: relative; +} + +.chatterbox__slide.loaded video { + opacity: 1; +} + +.chatterbox__slide.loaded img { + z-index: -10; +} + +.chatterbox__slide video { + max-width: 100%; + opacity: 0; + transition: opacity 0.2s ease-in-out; + pointer-events: none; +} + +.chatterbox__slide img { + position: absolute; + scale: 1.32; + top: 11%; +} + +.chatterbox__wrap { + position: absolute; + left: 8px; + right: 8px; + top: 8px; + bottom: 8px; + border-radius: 25px; + background-color: grey; + overflow: hidden; +} + +.chatterbox__vbtn { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + opacity: 0; + transition: opacity 0.2s ease-in-out; + pointer-events: none; +} + +.loaded .chatterbox__vbtn { + display: none; +} + +.chatterbox__vbtn::before { + width: 80px; + height: 80px; + display: flex; + align-items: center; + justify-content: center; + background: var(--color-primary); + border: 0; + border-radius: 50%; + transition: opacity 100ms linear; +} + +.chatterbox__vbtn::before, .chatterbox__vbtn::after { + content: ""; + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + cursor: pointer; +} + +.chatterbox__vbtn::after { + border-color: transparent transparent transparent #ffffff; + border-style: solid; + border-width: 15px 0 15px 25px; + display: inline-block; + margin-left: 2px; +} + +.chatterbox__vbox { + position: relative; + display: flex; + justify-content: center; + align-items: center; + height: 600px; +} + +.chatterbox .title { + margin-bottom: 60px; +} + +.chatterbox .slick-next { + right: -40px; +} + +.chatterbox .slick-prev { + left: -40px; +} + +.slick-slide:not(.slick-center) .chatterbox__slide { + scale: 0.72; +} + +.slick-center .chatterbox__vbtn { + opacity: 1; + pointer-events: initial; + z-index: 1; +} + +.slick-center .chatterbox__vbox video { + pointer-events: initial; + cursor: pointer; +} + +.use { + margin-bottom: 123px; +} + +.use__img { + width: 67.5%; + margin-left: 16px; + margin-bottom: 31px; +} + +.use__btn { + margin-bottom: 11px; +} + +.use__link { + font-size: 18px; + font-weight: 600; + line-height: 26px; + color: var(--color-grey2); +} + +.use .title { + max-width: 80%; + margin-bottom: 49px; +} + +.use--diff .title { + width: 60%; + margin-bottom: 60px; +} + +.use--diff .use__img { + width: 100%; + margin-left: 0; + margin-bottom: 17px; +} + +.use--lett { + margin-bottom: 120px; +} + +.use--lett .title { + margin-bottom: 51px; +} + +.use--lett .use__img { + margin-left: -5px; + margin-right: -5px; + max-width: 110%; + width: 1290px; +} + +.animate { + padding: 60px 40px 49px; + opacity: 0; + background-color: var(--color-black2); + border-radius: 30px; + color: white; + margin-bottom: 160px; +} + +.animate.left { + transform: translateX(-180px); +} + +.animate.right { + transform: translateX(180px); +} + +.animate__link { + color: var(--color-orange); + text-decoration: underline !important; +} + +.animate .title { + margin-bottom: 25px; + max-width: 87%; + /*width: 90%;*/ +} + +.animate .subtitle { + width: 47%; + margin: 0 auto 23px; +} + +.about { + margin-bottom: 168px; +} + +.about .title { + margin-bottom: 60px; +} + +.about__grid { + display: grid; + grid-template-columns: repeat(2, 1fr); +} + +.about__img { + box-shadow: inset 18.19px 1.21px 18.19px 0 #FFFFFFCC, inset -18.19px -1.21px 18.19px 0 #4052801A, 48.5px 36.38px 36.38px 0 #6B7F9933; + border-radius: 31px; + margin-left: 8px; + margin-top: 8px; +} + +.about__right { + text-align: left; + padding-top: 43px; + padding-left: 50px; +} + +.about__half { + max-width: 50%; + float: left; +} + +.about__half:last-child { + padding-left: 16px; + max-width: 47%; +} + +.about b { + letter-spacing: 0.4px; +} + +.benefits { + margin-bottom: 132px; +} + +.benefits__grid { + text-align: left; + display: grid; + grid-template-columns: 1.5fr 3fr 1.5fr; +} + +.benefits__item { + min-height: 122px; + padding-right: 7px; + margin-bottom: 22px; +} + +.benefits__third { + padding-left: 16px; +} + +.benefits .title { + margin-bottom: 76px; +} + +.benefits img { + position: relative; + top: 14px; + right: -11px; +} + +.uses { + margin-bottom: 122px; +} + +.uses__grid { + text-align: left; + display: grid; + grid-template-columns: repeat(3, 1fr); + /* max-width: 101.5%; */ + /* width: 101.5%; */ +} + +.uses__item { + min-height: 50px; + margin-bottom: 43px; + padding: 0 50px 0 2px; +} + +.uses__icon { + margin-bottom: 11px; +} + +.uses .title { + max-width: 50%; + margin: 0 auto 60px; +} + +.sore { + margin-bottom: 160px; +} + +.sore__img { + margin: 0 auto 26px; + position: relative; + left: -17px; +} + +.sore .title { + margin-bottom: 40px; +} + +.sore .subtitle { + max-width: 62%; + margin: 0 auto -1px; +} + +.sore .h3 { + max-width: 47%; + margin: 0 auto 19px; +} diff --git a/static/css/moover/animate.css b/static/css/moover/animate.css new file mode 100644 index 0000000..f3eb592 --- /dev/null +++ b/static/css/moover/animate.css @@ -0,0 +1,32 @@ +.animate { + padding: 60px 40px 49px; + opacity: 0; + background-color: var(--color-black2); + border-radius: 30px; + color: white; + margin-bottom: 160px; +} + +.animate.left { + transform: translateX(-180px); +} + +.animate.right { + transform: translateX(180px); +} + +.animate__link { + color: var(--color-orange); + text-decoration: underline !important; +} + +.animate .title { + margin-bottom: 25px; + max-width: 87%; + /*width: 90%;*/ +} + +.animate .subtitle { + width: 47%; + margin: 0 auto 23px; +} diff --git a/static/css/moover/benefits.css b/static/css/moover/benefits.css new file mode 100644 index 0000000..fd502f0 --- /dev/null +++ b/static/css/moover/benefits.css @@ -0,0 +1,29 @@ +.benefits { + margin-bottom: 132px; +} + +.benefits__grid { + text-align: left; + display: grid; + grid-template-columns: 1.5fr 3fr 1.5fr; +} + +.benefits__item { + min-height: 122px; + padding-right: 7px; + margin-bottom: 22px; +} + +.benefits__third { + padding-left: 16px; +} + +.benefits .title { + margin-bottom: 76px; +} + +.benefits img { + position: relative; + top: 14px; + right: -11px; +} diff --git a/static/css/moover/chatterbox.css b/static/css/moover/chatterbox.css new file mode 100644 index 0000000..0599c85 --- /dev/null +++ b/static/css/moover/chatterbox.css @@ -0,0 +1,128 @@ +.chatterbox { + margin-bottom: 160px; +} + +.chatterbox__slider { + max-width: 1200px; + margin: 0 auto; +} + +.chatterbox__slide { + width: 335px; + height: 615px; + background: url("/static/img/webp/phone-border.webp") center no-repeat; + transition: scale 0.2s ease-in-out; + margin: auto; + position: relative; +} + +.chatterbox__slide.loaded video { + opacity: 1; +} + +.chatterbox__slide.loaded img { + z-index: -10; +} + +.chatterbox__slide video { + max-width: 100%; + opacity: 0; + transition: opacity 0.2s ease-in-out; + pointer-events: none; +} + +.chatterbox__slide img { + position: absolute; + scale: 1.32; + top: 11%; +} + +.chatterbox__wrap { + position: absolute; + left: 8px; + right: 8px; + top: 8px; + bottom: 8px; + border-radius: 25px; + background-color: grey; + overflow: hidden; +} + +.chatterbox__vbtn { + position: absolute; + left: 0; + right: 0; + top: 0; + bottom: 0; + opacity: 0; + transition: opacity 0.2s ease-in-out; + pointer-events: none; +} + +.loaded .chatterbox__vbtn { + display: none; +} + +.chatterbox__vbtn::before { + width: 80px; + height: 80px; + display: flex; + align-items: center; + justify-content: center; + background: var(--color-primary); + border: 0; + border-radius: 50%; + transition: opacity 100ms linear; +} + +.chatterbox__vbtn::before, .chatterbox__vbtn::after { + content: ""; + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + cursor: pointer; +} + +.chatterbox__vbtn::after { + border-color: transparent transparent transparent #ffffff; + border-style: solid; + border-width: 15px 0 15px 25px; + display: inline-block; + margin-left: 2px; +} + +.chatterbox__vbox { + position: relative; + display: flex; + justify-content: center; + align-items: center; + height: 600px; +} + +.chatterbox .title { + margin-bottom: 60px; +} + +.chatterbox .slick-next { + right: -40px; +} + +.chatterbox .slick-prev { + left: -40px; +} + +.slick-slide:not(.slick-center) .chatterbox__slide { + scale: 0.72; +} + +.slick-center .chatterbox__vbtn { + opacity: 1; + pointer-events: initial; + z-index: 1; +} + +.slick-center .chatterbox__vbox video { + pointer-events: initial; + cursor: pointer; +} diff --git a/static/css/moover/presentation.css b/static/css/moover/presentation.css new file mode 100644 index 0000000..7bbcc8f --- /dev/null +++ b/static/css/moover/presentation.css @@ -0,0 +1,84 @@ +.presentation { + margin: 20px -65px 140px; +} + +@media (min-width: 1720px) { + .presentation { + margin-left: 0; + margin-right: 0; + } +} + +.presentation__top { + position: relative; + min-height: 270px; + margin: 0 auto 116px; + padding: 29px 0 40px; + background-image: url(/static/img/png/Box9.png), url(/static/img/png/Box10.png), url(/static/img/png/Box11.png), url(/static/img/png/Box12.png); + background-position: top -4px left 46px, top -30px right -14px, bottom 73px left 278px, bottom 71px right 276px; + background-repeat: no-repeat, no-repeat, no-repeat, no-repeat; + background-size: 17.5%,21.8%,8.5%,8.8%; +} + +@media (min-width: 1720px) { + .presentation__top { + background-size: 18.5%, 22%, 9%, 10.1%; + background-position: top -47px left 58px, top -31px right 20px, bottom 8px left 347px, bottom -5px right 352px; + padding-top: 95px; + margin-bottom: 176px; + } +} + +.presentation__title { + margin-bottom: 23px; +} + +.presentation__subtitle { + margin-bottom: 41px; + font-weight: 600; +} + +.presentation__btn { + margin-bottom: 40px; +} + +.presentation__next { + font-weight: 500; + line-height: 22px; + padding-right: 5px; +} + +.presentation__arrows { + padding-top: 2px; + animation: jump 2s ease-in-out infinite; +} + +@keyframes jump { + 0% { + transform: translateY(0px); + } + 50% { + transform: translateY(-5px); + } + 60% { + transform: translateY(20px); + } + 70% { + transform: translateY(0px); + } + 80% { + transform: translateY(20px); + } + 100% { + transform: translateY(0px); + } +} + +.presentation__bottom .presentation__title { + margin-bottom: 13px; +} + +.presentation__cards { + max-width: 1300px; + margin: 0 auto; +} diff --git a/static/css/moover/root.css b/static/css/moover/root.css new file mode 100644 index 0000000..81068b6 --- /dev/null +++ b/static/css/moover/root.css @@ -0,0 +1,137 @@ +.container { + margin: 0 auto; + width: 1280px; + position: relative; + min-height: 695px; +} + +@media (min-width: 1720px) { + .container { + width: 1720px; + } +} + +/*@media (max-width: 1019.98px) {*/ +/* .container {*/ +/* width: 720px*/ +/* }*/ +/*}*/ +/*@media (max-width: 767.98px) {*/ +/* .container {*/ +/* margin: 0 15px;*/ +/* width: auto*/ +/* }*/ +/*}*/ +:root { + --color-primary: #FF613A; + --color-white: #FFFFFF; + --color-black: #000000; + --color-black2: #272424; + --color-grey: #F1F1F1; + --color-grey2: #7A7979; + --color-orange: #FF613A; + --box-shadow-primary: -1px 4px 10px 0 rgba(198, 199, 203, 0.20), + 0 -1px 10px 0 rgba(198, 199, 203, 0.20); + text-align: center; + color: var(--color-black2); +} + +.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 { + font-weight: 700; +} + +h1, .h1 { + font-size: 44px; + line-height: 52px; +} + +@media (min-width: 1720px) { + h1, .h1 { + font-size: 48px; + line-height: 52px; + } +} + +h2, .h2 { + font-size: 24px; + line-height: 36px; + margin-bottom: 10px; +} + +h3, .h3 { + font-size: 20px; + line-height: 28px; + margin-bottom: 12px; +} + +h4, .h4 { + font-size: 18px; + line-height: 26px; + margin-bottom: 20px; +} + +p { + line-height: 22px; + margin-bottom: 20px; +} + +b { + font-weight: 500; +} + +.btn { + display: inline-flex; + text-decoration: none; + color: black; + line-height: 22px; + border-radius: 10px; + padding: 20px 76px 18px; + justify-content: center; + align-items: center; + margin: 0 3px; + letter-spacing: 0.2px; + font-size: 18px; +} + +.btn--primary { + background: var(--color-primary); + color: var(--color-white); +} + +.title { + font-size: 44px; + font-weight: 700; + line-height: 52px; + margin-bottom: 13px; + margin-left: auto; + margin-right: auto; +} + +@media (min-width: 1720px) { + .title { + font-size: 44px; + margin-bottom: 22px; + } +} + +.subtitle { + margin-bottom: 81px; + line-height: 22px; +} + +@media (min-width: 1720px) { + .subtitle { + font-size: 20px; + margin-bottom: 97px; + } +} + +.hide { + display: none; +} + +@media (min-width: 1440px) { + .is-container.wrapper_main { + max-width: initial; + } +} diff --git a/static/css/moover/sore.css b/static/css/moover/sore.css new file mode 100644 index 0000000..a6e7efd --- /dev/null +++ b/static/css/moover/sore.css @@ -0,0 +1,23 @@ +.sore { + margin-bottom: 160px; +} + +.sore__img { + margin: 0 auto 26px; + position: relative; + left: -17px; +} + +.sore .title { + margin-bottom: 40px; +} + +.sore .subtitle { + max-width: 62%; + margin: 0 auto -1px; +} + +.sore .h3 { + max-width: 47%; + margin: 0 auto 19px; +} diff --git a/static/css/moover/use.css b/static/css/moover/use.css new file mode 100644 index 0000000..07f4cfc --- /dev/null +++ b/static/css/moover/use.css @@ -0,0 +1,51 @@ +.use { + margin-bottom: 123px; +} + +.use__img { + width: 67.5%; + margin-left: 16px; + margin-bottom: 31px; +} + +.use__btn { + margin-bottom: 11px; +} + +.use__link { + font-size: 18px; + font-weight: 600; + line-height: 26px; + color: var(--color-grey2); +} + +.use .title { + max-width: 80%; + margin-bottom: 49px; +} + +.use--diff .title { + width: 60%; + margin-bottom: 60px; +} + +.use--diff .use__img { + width: 100%; + margin-left: 0; + margin-bottom: 17px; +} + +.use--lett { + margin-bottom: 120px; +} + +.use--lett .title { + margin-bottom: 51px; +} + +.use--lett .use__img { + margin-left: -5px; + margin-right: -5px; + max-width: 110%; + width: 1290px; +} diff --git a/static/css/moover/uses.css b/static/css/moover/uses.css new file mode 100644 index 0000000..57cf5a7 --- /dev/null +++ b/static/css/moover/uses.css @@ -0,0 +1,26 @@ +.uses { + margin-bottom: 122px; +} + +.uses__grid { + text-align: left; + display: grid; + grid-template-columns: repeat(3, 1fr); + /* max-width: 101.5%; */ + /* width: 101.5%; */ +} + +.uses__item { + min-height: 50px; + margin-bottom: 43px; + padding: 0 50px 0 2px; +} + +.uses__icon { + margin-bottom: 11px; +} + +.uses .title { + max-width: 50%; + margin: 0 auto 60px; +} diff --git a/static/css/slick-theme.css b/static/css/slick-theme.css new file mode 100644 index 0000000..1232fca --- /dev/null +++ b/static/css/slick-theme.css @@ -0,0 +1,204 @@ +@charset 'UTF-8'; +/* Slider */ +.slick-loading .slick-list +{ + background: #fff url('./ajax-loader.gif') center center no-repeat; +} + +/* Icons */ +@font-face +{ + font-family: 'slick'; + font-weight: normal; + font-style: normal; + + src: url('./fonts/slick.eot'); + src: url('./fonts/slick.eot?#iefix') format('embedded-opentype'), url('./fonts/slick.woff') format('woff'), url('./fonts/slick.ttf') format('truetype'), url('./fonts/slick.svg#slick') format('svg'); +} +/* Arrows */ +.slick-prev, +.slick-next +{ + font-size: 0; + line-height: 0; + + position: absolute; + top: 50%; + + display: block; + + width: 20px; + height: 20px; + padding: 0; + -webkit-transform: translate(0, -50%); + -ms-transform: translate(0, -50%); + transform: translate(0, -50%); + + cursor: pointer; + + color: transparent; + border: none; + outline: none; + background: transparent; +} +.slick-prev:hover, +.slick-prev:focus, +.slick-next:hover, +.slick-next:focus +{ + color: transparent; + outline: none; + background: transparent; +} +.slick-prev:hover:before, +.slick-prev:focus:before, +.slick-next:hover:before, +.slick-next:focus:before +{ + opacity: 1; +} +.slick-prev.slick-disabled:before, +.slick-next.slick-disabled:before +{ + opacity: .25; +} + +.slick-prev:before, +.slick-next:before +{ + font-family: 'slick'; + font-size: 20px; + line-height: 1; + + opacity: .75; + color: white; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.slick-prev +{ + left: -25px; +} +[dir='rtl'] .slick-prev +{ + right: -25px; + left: auto; +} +.slick-prev:before +{ + content: '←'; +} +[dir='rtl'] .slick-prev:before +{ + content: '→'; +} + +.slick-next +{ + right: -25px; +} +[dir='rtl'] .slick-next +{ + right: auto; + left: -25px; +} +.slick-next:before +{ + content: '→'; +} +[dir='rtl'] .slick-next:before +{ + content: '←'; +} + +/* Dots */ +.slick-dotted.slick-slider +{ + margin-bottom: 30px; +} + +.slick-dots +{ + position: absolute; + bottom: -25px; + + display: block; + + width: 100%; + padding: 0; + margin: 0; + + list-style: none; + + text-align: center; +} +.slick-dots li +{ + position: relative; + + display: inline-block; + + width: 20px; + height: 20px; + margin: 0 5px; + padding: 0; + + cursor: pointer; +} +.slick-dots li button +{ + font-size: 0; + line-height: 0; + + display: block; + + width: 20px; + height: 20px; + padding: 5px; + + cursor: pointer; + + color: transparent; + border: 0; + outline: none; + background: transparent; +} +.slick-dots li button:hover, +.slick-dots li button:focus +{ + outline: none; +} +.slick-dots li button:hover:before, +.slick-dots li button:focus:before +{ + opacity: 1; +} +.slick-dots li button:before +{ + font-family: 'slick'; + font-size: 6px; + line-height: 20px; + + position: absolute; + top: 0; + left: 0; + + width: 20px; + height: 20px; + + content: '•'; + text-align: center; + + opacity: .25; + color: black; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.slick-dots li.slick-active button:before +{ + opacity: .75; + color: black; +} diff --git a/static/css/slick.css b/static/css/slick.css new file mode 100644 index 0000000..d01abad --- /dev/null +++ b/static/css/slick.css @@ -0,0 +1,146 @@ +/* Slider */ +.slick-slider { + position: relative; + display: block; + box-sizing: border-box; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-touch-callout: none; + -khtml-user-select: none; + -ms-touch-action: pan-y; + touch-action: pan-y; + -webkit-tap-highlight-color: transparent; +} + +.slick-list { + position: relative; + display: block; + overflow: hidden; + margin: 0; + padding: 0; +} + +.slick-list:focus { + outline: none; +} + +.slick-list.dragging { + cursor: pointer; + cursor: hand; +} + +.slick-slider .slick-track, +.slick-slider .slick-list { + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); + -o-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); +} + +.slick-track { + position: relative; + top: 0; + left: 0; + display: block; + margin-left: auto; + margin-right: auto; +} + +.slick-track:before, +.slick-track:after { + display: table; + content: ''; +} + +.slick-track:after { + clear: both; +} + +.slick-loading .slick-track { + visibility: hidden; +} + +.slick-slide { + display: none; + float: left; + height: 100%; + min-height: 1px; +} + +[dir='rtl'] .slick-slide { + float: right; +} + +.slick-slide img { + display: block; +} + +.slick-slide.slick-loading img { + display: none; +} + +.slick-slide.dragging img { + pointer-events: none; +} + +.slick-initialized .slick-slide { + display: block; +} + +.slick-loading .slick-slide { + visibility: hidden; +} + +.slick-vertical .slick-slide { + display: block; + + height: auto; + + border: 1px solid transparent; +} + +.slick-arrow.slick-hidden { + display: none; +} + + +.slick-prev, .slick-next { + font-size: 0; + line-height: 0; + position: absolute; + top: 50%; + display: block; + width: 80px; + height: 80px; + padding: 0; + -webkit-transform: translate(0, -50%); + -ms-transform: translate(0, -50%); + transform: translate(0, -50%); + cursor: pointer; + color: transparent; + outline: none; + background: transparent; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + border: 1px solid var(--color-primary); + outline: 0; + border-radius: 50%; + box-sizing: border-box; + text-indent: -9999px; + z-index: 1; + background: var(--color-primary) url("/static/img/svg/slick-arrow.svg") no-repeat center; + transition: background-color .2s ease-in-out; +} + +.slick-next { + right: 0; + transform: rotate(180deg) translate(0, 50%); +} + +.slick-disabled { + display: none !important; +} \ No newline at end of file diff --git a/static/img/png/Box10.png b/static/img/png/Box10.png new file mode 100644 index 0000000..ae48cdc Binary files /dev/null and b/static/img/png/Box10.png differ diff --git a/static/img/png/Box11.png b/static/img/png/Box11.png new file mode 100644 index 0000000..11d95a5 Binary files /dev/null and b/static/img/png/Box11.png differ diff --git a/static/img/png/Box12.png b/static/img/png/Box12.png new file mode 100644 index 0000000..128be65 Binary files /dev/null and b/static/img/png/Box12.png differ diff --git a/static/img/png/Box9.png b/static/img/png/Box9.png new file mode 100644 index 0000000..759d170 Binary files /dev/null and b/static/img/png/Box9.png differ diff --git a/static/img/png/about.png b/static/img/png/about.png new file mode 100644 index 0000000..b73a9d0 Binary files /dev/null and b/static/img/png/about.png differ diff --git a/static/img/png/benefits.png b/static/img/png/benefits.png new file mode 100644 index 0000000..28b600f Binary files /dev/null and b/static/img/png/benefits.png differ diff --git a/static/img/png/sore2.png b/static/img/png/sore2.png new file mode 100644 index 0000000..8a3d14b Binary files /dev/null and b/static/img/png/sore2.png differ diff --git a/static/img/png/use-letterss.png b/static/img/png/use-letterss.png new file mode 100644 index 0000000..decd800 Binary files /dev/null and b/static/img/png/use-letterss.png differ diff --git a/static/img/svg/Arrow08.svg b/static/img/svg/Arrow08.svg new file mode 100644 index 0000000..bfddcb7 --- /dev/null +++ b/static/img/svg/Arrow08.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/img/svg/bax.svg b/static/img/svg/bax.svg new file mode 100644 index 0000000..9f68be4 --- /dev/null +++ b/static/img/svg/bax.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/static/img/svg/books.svg b/static/img/svg/books.svg new file mode 100644 index 0000000..71f375a --- /dev/null +++ b/static/img/svg/books.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/svg/box.svg b/static/img/svg/box.svg new file mode 100644 index 0000000..526c093 --- /dev/null +++ b/static/img/svg/box.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/img/svg/earth.svg b/static/img/svg/earth.svg new file mode 100644 index 0000000..e0bbe3c --- /dev/null +++ b/static/img/svg/earth.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/static/img/svg/files.svg b/static/img/svg/files.svg new file mode 100644 index 0000000..b47f295 --- /dev/null +++ b/static/img/svg/files.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/static/img/svg/present.svg b/static/img/svg/present.svg new file mode 100644 index 0000000..9200fcd --- /dev/null +++ b/static/img/svg/present.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/static/img/svg/slick-arrow.svg b/static/img/svg/slick-arrow.svg new file mode 100644 index 0000000..ef5a9c8 --- /dev/null +++ b/static/img/svg/slick-arrow.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/img/webp/Box10.webp b/static/img/webp/Box10.webp deleted file mode 100644 index c81f80d..0000000 Binary files a/static/img/webp/Box10.webp and /dev/null differ diff --git a/static/img/webp/Box11.webp b/static/img/webp/Box11.webp deleted file mode 100644 index 07d3fdd..0000000 Binary files a/static/img/webp/Box11.webp and /dev/null differ diff --git a/static/img/webp/Box12.webp b/static/img/webp/Box12.webp deleted file mode 100644 index 0cdd4d6..0000000 Binary files a/static/img/webp/Box12.webp and /dev/null differ diff --git a/static/img/webp/Box9.webp b/static/img/webp/Box9.webp deleted file mode 100644 index de27aec..0000000 Binary files a/static/img/webp/Box9.webp and /dev/null differ diff --git a/static/img/webp/diff.webp b/static/img/webp/diff.webp new file mode 100644 index 0000000..98b42ba Binary files /dev/null and b/static/img/webp/diff.webp differ diff --git a/static/img/webp/image2.webp b/static/img/webp/image2.webp index 0e82b76..2622445 100644 Binary files a/static/img/webp/image2.webp and b/static/img/webp/image2.webp differ diff --git a/static/img/webp/phone-border.webp b/static/img/webp/phone-border.webp new file mode 100644 index 0000000..c908ed4 Binary files /dev/null and b/static/img/webp/phone-border.webp differ diff --git a/static/img/webp/sender-card1.webp b/static/img/webp/sender-card1.webp new file mode 100644 index 0000000..cb3da4b Binary files /dev/null and b/static/img/webp/sender-card1.webp differ diff --git a/static/img/webp/sender-card2.webp b/static/img/webp/sender-card2.webp new file mode 100644 index 0000000..69811de Binary files /dev/null and b/static/img/webp/sender-card2.webp differ diff --git a/static/img/webp/sender-card3.webp b/static/img/webp/sender-card3.webp new file mode 100644 index 0000000..19eb20a Binary files /dev/null and b/static/img/webp/sender-card3.webp differ diff --git a/static/img/webp/use.webp b/static/img/webp/use.webp new file mode 100644 index 0000000..3c91f4b Binary files /dev/null and b/static/img/webp/use.webp differ diff --git a/static/js/lazyload.min.js b/static/js/lazyload.min.js new file mode 100644 index 0000000..bb8758b --- /dev/null +++ b/static/js/lazyload.min.js @@ -0,0 +1 @@ +function _extends(){return(_extends=Object.assign||function(t){for(var e=1;e-1&&(I(t,e),h(t,o.class_loading)),b(t,e),function(t){s(t,"was-processed","true")}(t),d(o.callback_reveal,t),d(o.callback_set,t))},O=function(t){return!!n&&(t._observer=new IntersectionObserver(function(e){e.forEach(function(e){return function(t){return t.isIntersecting||t.intersectionRatio>0}(e)?function(t,e){var n=e._settings;d(n.callback_enter,t),n.load_delay?x(t,e):A(t,e)}(e.target,t):function(t,e){var n=e._settings;d(n.callback_exit,t),n.load_delay&&L(t)}(e.target,t)})},{root:(e=t._settings).container===document?null:e.container,rootMargin:e.thresholds||e.threshold+"px"}),!0);var e},N=["IMG","IFRAME"],C=function(t,e){return function(t){return t.filter(function(t){return!c(t)})}((n=t||function(t){return t.container.querySelectorAll(t.elements_selector)}(e),Array.prototype.slice.call(n)));var n},M=function(t,e){this._settings=function(t){return _extends({},r,t)}(t),this._loadingCount=0,O(this),this.update(e)};return M.prototype={update:function(t){var n,o=this,r=this._settings;(this._elements=C(t,r),!e&&this._observer)?(function(t){return t.use_native&&"loading"in HTMLImageElement.prototype}(r)&&((n=this)._elements.forEach(function(t){-1!==N.indexOf(t.tagName)&&(t.setAttribute("loading","lazy"),z(t,n))}),this._elements=C(t,r)),this._elements.forEach(function(t){o._observer.observe(t)})):this.loadAll()},destroy:function(){var t=this;this._observer&&(this._elements.forEach(function(e){t._observer.unobserve(e)}),this._observer=null),this._elements=null,this._settings=null},load:function(t,e){z(t,this,e)},loadAll:function(){var t=this;this._elements.forEach(function(e){A(e,t)})}},t&&function(t,e){if(e)if(e.length)for(var n,o=0;n=e[o];o+=1)a(t,n);else a(t,e)}(M,window.lazyLoadOptions),M}); diff --git a/static/js/push/lazyload.min.js b/static/js/push/lazyload.min.js new file mode 100644 index 0000000..15a0b42 --- /dev/null +++ b/static/js/push/lazyload.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).LazyLoad=t()}(this,(function(){"use strict";const e="undefined"!=typeof window,t=e&&!("onscroll"in window)||"undefined"!=typeof navigator&&/(gle|ing|ro)bot|crawl|spider/i.test(navigator.userAgent),a=e&&window.devicePixelRatio>1,n={elements_selector:".lazy",container:t||e?document:null,threshold:300,thresholds:null,data_src:"src",data_srcset:"srcset",data_sizes:"sizes",data_bg:"bg",data_bg_hidpi:"bg-hidpi",data_bg_multi:"bg-multi",data_bg_multi_hidpi:"bg-multi-hidpi",data_bg_set:"bg-set",data_poster:"poster",class_applied:"applied",class_loading:"loading",class_loaded:"loaded",class_error:"error",class_entered:"entered",class_exited:"exited",unobserve_completed:!0,unobserve_entered:!1,cancel_on_exit:!0,callback_enter:null,callback_exit:null,callback_applied:null,callback_loading:null,callback_loaded:null,callback_error:null,callback_finish:null,callback_cancel:null,use_native:!1,restore_on_error:!1},s=e=>Object.assign({},n,e),l=function(e,t){let a;const n="LazyLoad::Initialized",s=new e(t);try{a=new CustomEvent(n,{detail:{instance:s}})}catch(e){a=document.createEvent("CustomEvent"),a.initCustomEvent(n,!1,!1,{instance:s})}window.dispatchEvent(a)},o="src",r="srcset",i="sizes",d="poster",c="llOriginalAttrs",_="data",u="loading",g="loaded",b="applied",h="error",m="native",p="data-",f="ll-status",v=(e,t)=>e.getAttribute(p+t),E=e=>v(e,f),I=(e,t)=>((e,t,a)=>{const n=p+t;null!==a?e.setAttribute(n,a):e.removeAttribute(n)})(e,f,t),y=e=>I(e,null),k=e=>null===E(e),A=e=>E(e)===m,L=[u,g,b,h],w=(e,t,a,n)=>{e&&"function"==typeof e&&(void 0===n?void 0===a?e(t):e(t,a):e(t,a,n))},x=(t,a)=>{e&&""!==a&&t.classList.add(a)},C=(t,a)=>{e&&""!==a&&t.classList.remove(a)},O=e=>e.llTempImage,M=(e,t)=>{if(!t)return;const a=t._observer;a&&a.unobserve(e)},z=(e,t)=>{e&&(e.loadingCount+=t)},N=(e,t)=>{e&&(e.toLoadCount=t)},T=e=>{let t=[];for(let a,n=0;a=e.children[n];n+=1)"SOURCE"===a.tagName&&t.push(a);return t},R=(e,t)=>{const a=e.parentNode;a&&"PICTURE"===a.tagName&&T(a).forEach(t)},G=(e,t)=>{T(e).forEach(t)},D=[o],H=[o,d],V=[o,r,i],F=[_],j=e=>!!e[c],B=e=>e[c],J=e=>delete e[c],S=(e,t)=>{if(j(e))return;const a={};t.forEach((t=>{a[t]=e.getAttribute(t)})),e[c]=a},P=(e,t)=>{if(!j(e))return;const a=B(e);t.forEach((t=>{((e,t,a)=>{a?e.setAttribute(t,a):e.removeAttribute(t)})(e,t,a[t])}))},U=(e,t,a)=>{x(e,t.class_applied),I(e,b),a&&(t.unobserve_completed&&M(e,t),w(t.callback_applied,e,a))},$=(e,t,a)=>{x(e,t.class_loading),I(e,u),a&&(z(a,1),w(t.callback_loading,e,a))},q=(e,t,a)=>{a&&e.setAttribute(t,a)},K=(e,t)=>{q(e,i,v(e,t.data_sizes)),q(e,r,v(e,t.data_srcset)),q(e,o,v(e,t.data_src))},Q={IMG:(e,t)=>{R(e,(e=>{S(e,V),K(e,t)})),S(e,V),K(e,t)},IFRAME:(e,t)=>{S(e,D),q(e,o,v(e,t.data_src))},VIDEO:(e,t)=>{G(e,(e=>{S(e,D),q(e,o,v(e,t.data_src))})),S(e,H),q(e,d,v(e,t.data_poster)),q(e,o,v(e,t.data_src)),e.load()},OBJECT:(e,t)=>{S(e,F),q(e,_,v(e,t.data_src))}},W=["IMG","IFRAME","VIDEO","OBJECT"],X=(e,t)=>{!t||(e=>e.loadingCount>0)(t)||(e=>e.toLoadCount>0)(t)||w(e.callback_finish,t)},Y=(e,t,a)=>{e.addEventListener(t,a),e.llEvLisnrs[t]=a},Z=(e,t,a)=>{e.removeEventListener(t,a)},ee=e=>!!e.llEvLisnrs,te=e=>{if(!ee(e))return;const t=e.llEvLisnrs;for(let a in t){const n=t[a];Z(e,a,n)}delete e.llEvLisnrs},ae=(e,t,a)=>{(e=>{delete e.llTempImage})(e),z(a,-1),(e=>{e&&(e.toLoadCount-=1)})(a),C(e,t.class_loading),t.unobserve_completed&&M(e,a)},ne=(e,t,a)=>{const n=O(e)||e;ee(n)||((e,t,a)=>{ee(e)||(e.llEvLisnrs={});const n="VIDEO"===e.tagName?"loadeddata":"load";Y(e,n,t),Y(e,"error",a)})(n,(s=>{((e,t,a,n)=>{const s=A(t);ae(t,a,n),x(t,a.class_loaded),I(t,g),w(a.callback_loaded,t,n),s||X(a,n)})(0,e,t,a),te(n)}),(s=>{((e,t,a,n)=>{const s=A(t);ae(t,a,n),x(t,a.class_error),I(t,h),w(a.callback_error,t,n),a.restore_on_error&&P(t,V),s||X(a,n)})(0,e,t,a),te(n)}))},se=(e,t,n)=>{(e=>W.indexOf(e.tagName)>-1)(e)?((e,t,a)=>{ne(e,t,a),((e,t,a)=>{const n=Q[e.tagName];n&&(n(e,t),$(e,t,a))})(e,t,a)})(e,t,n):((e,t,n)=>{(e=>{e.llTempImage=document.createElement("IMG")})(e),ne(e,t,n),(e=>{j(e)||(e[c]={backgroundImage:e.style.backgroundImage})})(e),((e,t,n)=>{const s=v(e,t.data_bg),l=v(e,t.data_bg_hidpi),r=a&&l?l:s;r&&(e.style.backgroundImage=`url("${r}")`,O(e).setAttribute(o,r),$(e,t,n))})(e,t,n),((e,t,n)=>{const s=v(e,t.data_bg_multi),l=v(e,t.data_bg_multi_hidpi),o=a&&l?l:s;o&&(e.style.backgroundImage=o,U(e,t,n))})(e,t,n),((e,t,a)=>{const n=v(e,t.data_bg_set);if(!n)return;let s=n.split("|").map((e=>`image-set(${e})`));e.style.backgroundImage=s.join(),U(e,t,a)})(e,t,n)})(e,t,n)},le=e=>{e.removeAttribute(o),e.removeAttribute(r),e.removeAttribute(i)},oe=e=>{R(e,(e=>{P(e,V)})),P(e,V)},re={IMG:oe,IFRAME:e=>{P(e,D)},VIDEO:e=>{G(e,(e=>{P(e,D)})),P(e,H),e.load()},OBJECT:e=>{P(e,F)}},ie=(e,t)=>{(e=>{const t=re[e.tagName];t?t(e):(e=>{if(!j(e))return;const t=B(e);e.style.backgroundImage=t.backgroundImage})(e)})(e),((e,t)=>{k(e)||A(e)||(C(e,t.class_entered),C(e,t.class_exited),C(e,t.class_applied),C(e,t.class_loading),C(e,t.class_loaded),C(e,t.class_error))})(e,t),y(e),J(e)},de=["IMG","IFRAME","VIDEO"],ce=e=>e.use_native&&"loading"in HTMLImageElement.prototype,_e=(e,t,a)=>{e.forEach((e=>(e=>e.isIntersecting||e.intersectionRatio>0)(e)?((e,t,a,n)=>{const s=(e=>L.indexOf(E(e))>=0)(e);I(e,"entered"),x(e,a.class_entered),C(e,a.class_exited),((e,t,a)=>{t.unobserve_entered&&M(e,a)})(e,a,n),w(a.callback_enter,e,t,n),s||se(e,a,n)})(e.target,e,t,a):((e,t,a,n)=>{k(e)||(x(e,a.class_exited),((e,t,a,n)=>{a.cancel_on_exit&&(e=>E(e)===u)(e)&&"IMG"===e.tagName&&(te(e),(e=>{R(e,(e=>{le(e)})),le(e)})(e),oe(e),C(e,a.class_loading),z(n,-1),y(e),w(a.callback_cancel,e,t,n))})(e,t,a,n),w(a.callback_exit,e,t,n))})(e.target,e,t,a)))},ue=e=>Array.prototype.slice.call(e),ge=e=>e.container.querySelectorAll(e.elements_selector),be=e=>(e=>E(e)===h)(e),he=(e,t)=>(e=>ue(e).filter(k))(e||ge(t)),me=function(t,a){const n=s(t);this._settings=n,this.loadingCount=0,((e,t)=>{ce(e)||(t._observer=new IntersectionObserver((a=>{_e(a,e,t)}),(e=>({root:e.container===document?null:e.container,rootMargin:e.thresholds||e.threshold+"px"}))(e)))})(n,this),((t,a)=>{e&&(a._onlineHandler=()=>{((e,t)=>{var a;(a=ge(e),ue(a).filter(be)).forEach((t=>{C(t,e.class_error),y(t)})),t.update()})(t,a)},window.addEventListener("online",a._onlineHandler))})(n,this),this.update(a)};return me.prototype={update:function(e){const a=this._settings,n=he(e,a);var s,l;N(this,n.length),t?this.loadAll(n):ce(a)?((e,t,a)=>{e.forEach((e=>{-1!==de.indexOf(e.tagName)&&((e,t,a)=>{e.setAttribute("loading","lazy"),ne(e,t,a),((e,t)=>{const a=Q[e.tagName];a&&a(e,t)})(e,t),I(e,m)})(e,t,a)})),N(a,0)})(n,a,this):(l=n,(e=>{e.disconnect()})(s=this._observer),((e,t)=>{t.forEach((t=>{e.observe(t)}))})(s,l))},destroy:function(){this._observer&&this._observer.disconnect(),e&&window.removeEventListener("online",this._onlineHandler),ge(this._settings).forEach((e=>{J(e)})),delete this._observer,delete this._settings,delete this._onlineHandler,delete this.loadingCount,delete this.toLoadCount},loadAll:function(e){const t=this._settings;he(e,t).forEach((e=>{M(e,this),se(e,t,this)}))},restoreAll:function(){const e=this._settings;ge(e).forEach((t=>{ie(t,e)}))}},me.load=(e,t)=>{const a=s(t);se(e,a)},me.resetStatus=e=>{y(e)},e&&((e,t)=>{if(t)if(t.length)for(let a,n=0;a=t[n];n+=1)l(e,a);else l(e,t)})(me,window.lazyLoadOptions),me})); diff --git a/static/js/slick.min.js b/static/js/slick.min.js new file mode 100644 index 0000000..42172c2 --- /dev/null +++ b/static/js/slick.min.js @@ -0,0 +1 @@ +!function(i){"use strict";"function"==typeof define&&define.amd?define(["jquery"],i):"undefined"!=typeof exports?module.exports=i(require("jquery")):i(jQuery)}(function(i){"use strict";var e=window.Slick||{};(e=function(){var e=0;return function(t,o){var s,n=this;n.defaults={accessibility:!0,adaptiveHeight:!1,appendArrows:i(t),appendDots:i(t),arrows:!0,asNavFor:null,prevArrow:'',nextArrow:'',autoplay:!1,autoplaySpeed:3e3,centerMode:!1,centerPadding:"50px",cssEase:"ease",customPaging:function(e,t){return i(' +

+ {% blocktrans %} + Сервис попутных посылок + {% endblocktrans %} +

+
+ {% translate "Отправляй посылки с попутчиками в любую точку, быстро и недорого" %} +
+ {% translate "Узнать подробнее" %}
{% translate "Как это работает?" %}
- - + +
-
-
+
+
{% translate "Как это работает" %}
-

+

{% translate "Маленькая история о том, как работает наш сервис" %}

+ {############cards###############}
-
-
img1

- {% translate "Мария, хочет отправить посылку, но её не устраивает цена доставки почтовых сервисов и она устала искать в чатах тех, кто сможет перевезти посылку." %} + {% translate "Мария, хочет отправить
посылку, но её не устраивает
цена доставки почтовых
" %} + {% translate "сервисов и она устала искать в
чатах тех, кто сможет перевезти
посылку." %}

img1

- {% translate "Мария, узнаёт о нашем сервисе TripWB.com. Регистрируется и очень быстро размещает объявление." %} + + {% translate "Мария, узнаёт о нашем сервисе
" %} + TripWB.com. + {% translate "Регистрируется
и очень быстро размещает
объявление." %}

img1

- {% translate "Попутчик Егор увидел объявление Марии, нажал откликнуться и получил возможность связаться с ней, удобным для него способом." %} + {% translate "Попутчик Егор увидел
объявление Марии, нажал
откликнуться и получил
возможность связаться с ней,
удобным для него способом." %}

img1

- {% translate "Мария и Егор обговорили детали доставки и потом встретились в удобном для всех месте. После чего Мария передала посылку Егору и он её доставил." %} + {% translate "Мария и Егор обговорили детали
доставки и потом встретились в
удобном для всех месте. После
чего Мария передала посылку
Егору и он её доставил." %}

-
- - - - - - {# #} - -
-
-
- {% include "blocks/b_find_route_form.html" %} -
-
- -
-
- - +
+
+ {% translate "Один простой шаг, чтобы отправить посылку" %}
- -
- - +
+ {% translate "Еще легче, чем писать в чаты и группы в социальных сетях" %}
-
- -
-
- {% include "blocks/b_find_route_form.html" %} -
-
- -
- -

{% translate "О сервисе Trip With Bonus" %}

- -

- {% translate "TripWithBonus — это сервис, созданный для того, чтобы отправитель и перевозчик нашли друг-друга!" %} - {% translate "Наш сервис предлагает вам прямые контакты, а не является посредником!" %} -

-
- - -
- -
-
- {% translate "Как отправить?" %} -
- -
- {% translate "Как перевезти?" %} -
- +
+
+

{% translate "Один простой шаг" %}

+

{% translate "За пару кликов размещаешь объявление на нашем сайте, о том, что необходимо перевезти посылку, а также указываешь удобный способ связи." %}

+ sender1
- -
-

{% translate "Вам нужно отправить посылку быстро и недорого?" %}

-
- -
- -

{% translate "Найдите перевозчика" %}

- {% translate "Зайдите на сайт Trip With Bonus и в форме вверху страницы, заполните данные для поиска перевозчика." %} -
- - - -
- -

{% translate "Свяжитесь с перевозчиком" %}

- {% translate "Откройте контакты на сайте и договоритесь о месте встречи и условиях перевозки. В случае, если Вы не нашли объявления о перевозчиках по Вашему запросу, Вы можете разместить свое объявление воспользовавшись формой в личном кабинете." %} -
- - - -
- -

{% translate "Передайте посылку" %}

- {% translate "Встречайтесь, знакомьтесь и передавайте посылку" %} -
- -
- - +
+
+
+

{% translate "Попутчики видят твое объявление и оставляют отклики на него." %}

+ sender1
-
-

{% translate "Вы путешествуете и можете взять посылку по-пути?" %}

-
+
+

{% translate "Тебе остаётся только выбрать перевозчика, связаться и обсудить детали перевозки." %}

+ sender1 -
- -

{% translate "Найдите отправителя" %}

- {% translate "Зайдите на сайт Trip With Bonus и в форме вверху страницы, заполните данные для поиска отправителя посылки." %} - -
- - - -
- -

{% translate "Свяжитесь с отправителем" %}

- {% translate "Откройте контакты на сайте и договоритесь о месте встречи и условиях перевозки. В случае, если Вы не нашли объявления об отправителях по Вашему запросу, Вы можете разместить свое объявление воспользовавшись формой в личном кабинете." %} - -
- - - -
- -

{% translate "Принимайте посылку" %}

- {% translate "Встречайтесь, знакомьтесь и принимайте посылку" %} - -
- -
- - - -
- -
- - -
- -
-

{% translate "Trip With Bonus это комфорт и эффективность!" %}

- -
-
- -
- -
- -
-
{% translate "+5%" %}
-
{% translate "рост путешествий ежегодно" %}
-
{% translate "В среднем на 5% растёт количество путешествий ежегодно. Просто путешествуй и получай бонусы." %}
-
-
- -
- -
- -
- -
-
{% translate "в 3 раза" %}
-
{% translate "быстрее других сервисов" %}
-
{% translate "Почтовые сервисы доставляет посылки в среднем за 10 дней. С нами - быстрее!" %}
-
- - - {#
#} -
-
- -
- -
- -
-
{% translate "+142" %}
-
{% translate "заявки ежедневно" %}
-
{% translate "На перевозку или отправку посылок в разные уголки мира" %}
-
- - - {#
#} - {#
#} - {#
#} -
-
- -
- -
- -
-
{% translate "30+" %}
-
{% translate "стран" %}
-
{% translate "С TripWB отправляй посылки по всему миру! С нами нет границ!" %}
-
- - - {#
#} - {#
#} - {#
#}
- -
- - - {% if page.get_FAQ_items %} -
-

- {% if page.FAQ_title %}{{ page.FAQ_title }}{% else %}{% translate "Частые вопросы" %}{% endif %} -

- {% for faq_item in page.get_FAQ_items %} -
- {{ faq_item.question }} -

{{ faq_item.answer }}

-
- {% endfor %} - {% endif %} - - - -
- - - - -
-

{% translate "Последние новости" %}

- {# {% for art in articles %}#} - {##} - {#
#} - {#
#} - {#
{{ art.name }}
#} - {#
#} - {# {{ art.description|truncatechars:100 }}#} - {#
#} - {#
#} - {#
#} - {##} - {# {% endfor %}#} - {#
+
+
{% translate "Уже пользуются сайтом и находят перевозчиков" %}
+ list users +
+ {% translate "Нужно отправить посылку партнеру, родителям или знакомым?" %} +
+ {% translate "Найти перевозчика" %} +
+ {% translate "Зарегистрироваться" %} +
+
+
{% translate "Чем мы отличаемся от классических почтовых сервисов" %}
+ list differences +
+
+
{% translate "Что о нас говорят люди" %}
+
+ {# {% for media_item in page.get_media_items %}#} + {#
#} + {#
#} + {#
#} + {#
#} + {#
#} + {##} + {# #} + {#
#} + {#
#} + {#
#} + {#
#} + {# {% endfor %}#} +
+
+
+
+
+ user +
- - {% endfor %} +
+ +
+
+
+
+
+
+ user + +
+
+
+
+
+
+
+
+
+ user + +
+
+
+ +
+
+
+
+
+
+ user + +
+
+
+
+
+
+
+
+
+ user + +
+
+ + +
+
+ +
+
+
{% translate "Что о нас пишут люди" %}
+ list letters +
+
+
+ {% translate "Хочешь отправить посылку партнеру, родным или знакомым людям быстро и недорого?" %} +
+
+ {% translate "Зарегистрируйся на Trip With Bonus прямо сейчас, размести бесплатно объявление и получи запросы на перевозку твоей посылки" %} +
+ {% translate "Разместить объявление" %} + +
+
+
{% translate "О сервисе Trip With Bonus" %}
+
+ +
+

{% translate "TripWB - это сервис попутных посылок, который соединяет отправителя посылки того, кому нужно что-то передать в другой город или страну, и перевозчика посылки, а именно попутчика или путешественника, который следует по пути назначения." %}

+

{% translate "Тебе не нужно больше бежать в чаты и группы в социальных сетях и искать тех, кто сможет перевезти посылку, а достаточно просто зайти на сайт, разместить объявление в пару кликов и дождаться откликов от попутчиков." %} +

{% translate "Мы не являемся почтовым сервисом, т.к. мы не доставляем посылки, а только даем возможность отправителю и перевозчику найти друг друга." %}

+

{% translate "Если не хочешь размещать объявление и ждать, то можешь самостоятельно на нашем сайте найти перевозчика через удобную систему поиска" %}

+
+
+ {#
#} + +
+
{% translate "Преимущества сервиса" %}
+
+
+
+

{% translate "Прямой контакт" %}

+

{% translate "Общаешься напрямую с перевозчиком, никаких посредников" %}

+
+
+

{% translate "Своя цена" %}

+

{% translate "Стоимость перевозки самостоятельно обговариваете с перевозчиком." %}

+
+
+

{% translate "Нет доп. расходов" %}

+

{% translate "Никаких комиссий, переплат и дополнительных расходов за отправку." %}

+
+
+
+ benefits +
+
+
+

{% translate "Уведомления" %}

+

{% translate "Можешь самостоятельно найти перевозчиков или разместить объявление на сайте." %}

+
+
+

{% translate "Удобный поиск" %}

+

{% translate "Как только по твоему объявлению найдется перевозчик мы сообщим на E-mail." %}

+
+
+

{% translate "Экономия времени" %}

+

{% translate "Не нужно искать группы, чаты, и кидать «клич», а просто достаточно разместить объявление на сайте." %}

+
+
+
+
+
+
{% translate "Для каких целей можно использовать наш сервис" %}
- {# {% url "article_one" art.url %}#} - {# {{ MEDIA_URL }}{{ art.picture }}#} - {# {{ art.description|truncatechars:100 }}#} - - - {#
#} -
- +
+
+ image icon +
+ {% translate "Когда нужно отправить документы партнеру или родственнику" %} +
+
+
+ image icon +
+ {% translate "Когда необходимо отправить посылку в другую страну" %} +
+
+
+ image icon +
+ {% translate "Когда нужно отправить подарок семье, друзьям или знакомым" %} +
+
+
+ image icon +
+ {% translate "Когда стоимость пересылки через почтовый сервис высокая или перевозка занимает длительное время" %} +
+
+
+ image icon +
+ {% translate "Когда нужно отправить не только маленькую посылку, но и крупногабаритный груз" %} +
+
+
+ image icon +
+ {% translate "Когда нет прямого сообщения из пункта А в пункт Б обычными сервисами доставки" %} +
+
+
+ +
+
+ {% translate "Размести свое объявление о необходимости перевозки посылки прямо сейчас" %} +
+
+ {% translate "Достаточно просто зайти на сайт, разместить объявление в пару кликов и дождаться откликов от попутчиков." %} +
+ {% translate "Разместить объявление" %} +
+
+
+ {% translate "О наболевшем..." %} +
+
+ {% translate "Мы знаем, каково это без конца и края закидывать сообщения в чаты и группы в социальных сетях, в надежде найти человека, который едет или летит в нужном направлении, чтобы передать посылоку своим родным или близким. Очень часто ещё и стоимость пересылки в обычных почтовых сервисах выше стоимости самой посылки." %} +
+ sore image +
+ {% translate "Зарегистрируйте бесплатно прямо сейчас и размести свое первое объявление об отправке посылки" %} +
+ {% translate "Зарегистрироваться и разместить" %} +
+ +
{% endblock %} \ No newline at end of file diff --git a/templates/tb_base.html b/templates/tb_base.html index b50cbcd..2439e96 100644 --- a/templates/tb_base.html +++ b/templates/tb_base.html @@ -176,7 +176,7 @@ function gtag_report_conversion(url) { {% if mobile == 'false' or mobile %} {% endif %}
-
+
{% include 'blocks/b_header.html' %} @@ -213,7 +213,7 @@ function gtag_report_conversion(url) {
{% endif %} -
+
{% block content %} {% endblock %} @@ -232,8 +232,7 @@ function gtag_report_conversion(url) { } document.cookie = "user_tz=" + tz + ";path=/"; +{% block before_close %} +{% endblock %} - - - \ No newline at end of file