Compare commits

..

3 Commits

Author SHA1 Message Date
74d7171d4b add intro video
All checks were successful
continuous-integration/drone/push Build is passing
2026-05-18 22:26:14 +03:00
685aa14c3a update xls
All checks were successful
continuous-integration/drone/push Build is passing
2026-05-14 18:05:42 +03:00
7c120c4f0b update cards 2026-05-14 18:05:19 +03:00
32 changed files with 184 additions and 131 deletions

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 352 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 988 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

View File

@@ -0,0 +1,11 @@
<!-- Place these tags in your HTML head section -->
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="48x48" href="/favicon-48x48.png">
<link rel="icon" type="image/png" sizes="64x64" href="/favicon-64x64.png">
<link rel="icon" type="image/png" sizes="128x128" href="/favicon-128x128.png">
<link rel="icon" type="image/png" sizes="256x256" href="/favicon-256x256.png">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="apple-touch-icon" sizes="192x192" href="/android-chrome-192x192.png">
<link rel="manifest" href="/site.webmanifest">

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View File

@@ -1,18 +1,17 @@
{ {
"name": "MyWebSite", "name": "Your Website",
"short_name": "MySite", "short_name": "Website",
"description": "Description of your website",
"icons": [ "icons": [
{ {
"src": "/web-app-manifest-192x192.png", "src": "/android-chrome-192x192.png",
"sizes": "192x192", "sizes": "192x192",
"type": "image/png", "type": "image/png"
"purpose": "maskable"
}, },
{ {
"src": "/web-app-manifest-512x512.png", "src": "/android-chrome-512x512.png",
"sizes": "512x512", "sizes": "512x512",
"type": "image/png", "type": "image/png"
"purpose": "maskable"
} }
], ],
"theme_color": "#ffffff", "theme_color": "#ffffff",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

View File

@@ -5,7 +5,7 @@
'is-animated': animated, 'is-animated': animated,
'hide-bg': !withBackground 'hide-bg': !withBackground
}" }"
:style="{ color: iconColor, transform: 'scale(1.08)', height: '1cap' }" :style="iconStyle"
/> />
<div <div
@@ -20,26 +20,41 @@
</template> </template>
<script setup> <script setup>
import { computed } from 'vue'
import { getCssVar } from 'quasar'
import LogoIcon from 'components/BaseLogoSvg.vue' import LogoIcon from 'components/BaseLogoSvg.vue'
defineProps({ const props = defineProps({
textColor: { textColor: {
type: String, type: String,
default: 'primary' default: 'primary'
}, },
iconColor: { iconColor: {
type: String, type: String,
default: 'white' default: 'primary'
}, },
withBackground: { withBackground: {
type: Boolean, type: Boolean,
default: true default: false
}, },
animated: { animated: {
type: Boolean, type: Boolean,
default: true default: true
} }
}) })
const iconStyle = computed(() => {
const color = getCssVar(props.iconColor) || props.iconColor
return {
color: color,
transform: 'scale(1.08)',
height: '1cap'
}
})
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.hide-bg :deep(.logo-bg) {
display: none;
}
</style> </style>

View File

@@ -1,79 +1,85 @@
<template> <template>
<div class="w100 flex justify-between text-caption q-pa-md q-gutter-y-md text-grey-9"> <div>
<div class="flex column col-12 col-sm"> <div class="w100 flex items-center justify-between q-px-md">
<div class="q-pl-sm"> <div id="contact-block" class="flex column items-start q-py-sm">
<base-logo <base-logo
withBackground animated
animated class="text-h6"
class="text-h4" />
/>
<div class="flex items-center no-wrap"> <div class="flex items-center no-wrap">
<q-icon name="mdi-map-marker-outline" color="brand" class="q-pr-sm"/> <q-icon name="mdi-map-marker-outline" color="brand" class="q-pr-xs"/>
<span>{{ $t('footer__contacts_location') }}</span> <span>{{ $t('footer__contacts_location') }}</span>
</div>
<div class="flex items-center no-wrap">
<q-icon name="mdi-phone-outline" color="brand" class="q-pr-sm" />
<span>+7 (916) 439-04-25</span>
</div>
<div class="flex items-center no-wrap">
<q-icon name="mdi-email-outline" color="brand" class="q-pr-sm"/>
<a
href="mailto:info@tgcrew.ru"
style="text-decoration: none; color: inherit"
>
info@tgcrew.ru
</a>
</div>
<br>
<div class="">
{{ $t('footer__contacts_ogrnip') + ' ' }}
<span class="text-no-wrap">
318774600262084
</span>
</div>
<div class="">
{{ $t('footer__contacts_inn') + ' ' }}
<span class="text-no-wrap">
366316608346
</span>
</div>
<div class="">
{{ $t('footer__contacts_pdn') + ' ' }}
<span class="text-no-wrap">
77-25-471585
</span>
</div>
</div>
</div> </div>
<div class="flex column col-12 col-sm"> <div class="flex items-center no-wrap">
<div class="q-pl-sm"> <q-icon name="mdi-phone-outline" color="brand" class="q-pr-xs"/>
<span class="text-body1 text-bold"> <span>+7 (916) 439-04-25</span>
{{ $t('footer__docs') }} </div>
</span>
<div <div class="flex items-center no-wrap">
v-for="item in docs" <q-icon name="mdi-email-outline" color="brand" class="q-pr-xs"/>
:key="item.id" <a
class="text-caption" href="mailto:info@tgcrew.ru"
style="text-decoration: none; color: inherit"
> >
<span info@tgcrew.ru
@click="router.push({ name: item.route })" </a>
class="cursor-pointer"
style="text-decoration: underline; color: inherit"
>
{{ $t(item.translationKey) }}
</span>
</div>
</div> </div>
</div> </div>
<div class="flex column col-12 col-sm"> <div id="doc-block" class="text-grey q-py-sm">
<div class="text-grey q-pl-sm"> <div
{{ $t('footer__description_user_data') }} v-for="item in docs"
:key="item.id"
class="text-caption"
>
<span
@click="router.push({ name: item.route })"
class="cursor-pointer"
style="color: inherit"
>
{{ $t(item.translationKey) }}
</span>
</div> </div>
</div> </div>
</div> </div>
<q-separator/>
<div class="column q-py-sm q-px-md" id="law-block">
<div class="flex justify-center text-caption text-grey">
<span class="q-pr-md">
<span class="text-no-wrap">
{{ $t('footer__contacts_ip') }}
</span>
</span>
<span class="q-pr-md">
{{ $t('footer__contacts_ogrnip') + ' ' }}
<span class="text-no-wrap">
318774600262084
</span>
</span>
<span class="q-pr-md">
{{ $t('footer__contacts_inn') + ' ' }}
<span class="text-no-wrap">
366316608346
</span>
</span>
<span class="q-pr-md">
{{ $t('footer__contacts_pdn') + ' ' }}
<span class="text-no-wrap">
77-25-471585
</span>
</span>
</div>
<div class="text-grey-5 text-center text-caption">
{{ $t('footer__description_user_data') }}
</div>
</div>
</div>
</template> </template>
<script setup lang="ts"> <script setup lang="ts">

View File

@@ -18,9 +18,9 @@
object-position: center center; object-position: center center;
width: 100%; width: 100%;
height: 100%; height: 100%;
filter: blur(2px) brightness(0.75); filter: blur(2px) brightness(0.9);
" "
@canplay="$event.target.playbackRate = 0.5" @canplay="$event.target.playbackRate = 0.4"
/> />
<div <div
class="column items-center no-wrap" class="column items-center no-wrap"
@@ -33,8 +33,9 @@
</div> </div>
<div <div
class="text-white text-center q-py-lg center-block" class="text-white text-center q-py-lg center-block text-bold"
:class="$q.screen.lt.sm ? 'text-h4' : 'text-h3'" :class="$q.screen.lt.sm ? 'text-h4' : 'text-h3'"
style="line-height: 1.5em;"
> >
{{ $t('banner__slogan_body') }} {{ $t('banner__slogan_body') }}
<span class="text-no-wrap" color="primary"> <span class="text-no-wrap" color="primary">
@@ -62,7 +63,7 @@
<q-icon name="keyboard_arrow_right"/> <q-icon name="keyboard_arrow_right"/>
</div> </div>
</q-btn> </q-btn>
<div class="text-white q-pt-sm edge-block justify-start text-grey-2"> <div class="text-white q-pt-sm edge-block justify-start text-grey-4">
{{ $t('banner__main_btn_description')}} {{ $t('banner__main_btn_description')}}
</div> </div>
</div> </div>

View File

@@ -12,12 +12,23 @@
<div class="relative-position w60 q-pt-md"> <div class="relative-position w60 q-pt-md">
<div style="height: 60vh; position: relative;"> <div style="height: 60vh; position: relative;">
<iframe <iframe
v-if="item.name === 'intro'"
:key="item.name" :key="item.name"
:src="item.url" :src="item.url"
allow="autoplay; fullscreen; picture-in-picture; encrypted-media; gyroscope; accelerometer; clipboard-write; screen-wake-lock; fullscreen;" allow="autoplay; fullscreen; picture-in-picture; encrypted-media; gyroscope; accelerometer; clipboard-write; screen-wake-lock; fullscreen;"
frameborder="0" frameborder="0"
style="position: absolute; width: 100%; height: 100%; top: 0; left: 0;" style="position: absolute; width: 100%; height: 100%; top: 0; left: 0;"
/> />
<div v-else class="relative-position fit">
<q-skeleton
type="rect"
class="fit"
style="border-radius: var(--base-radius);"
/>
<div class="absolute-center text-h4 text-uppercase text-grey-8">
{{ $t('how_it_works__coming_soon') }}
</div>
</div>
</div> </div>
</div> </div>
</template> </template>
@@ -37,7 +48,7 @@
{ {
name: 'intro', name: 'intro',
label: 'how_it_works__intro', label: 'how_it_works__intro',
url: 'https://kinescope.io/embed/5yesvjfi6XAYRuxzbsYGHZ' url: 'https://kinescope.io/8fMxE2gUwNk5HH8jFUgHD2'
}, },
{ {
name: 'admin', name: 'admin',

View File

@@ -84,10 +84,10 @@
] ]
const tariffs = [ const tariffs = [
{ id: 1, name: 'TEST', price: null, price_rub: null, chatsQty: 5 }, { id: 1, name: 'TEST', price: 0, price_rub: 0, chatsQty: 5 },
{ id: 2, name: 'START', price: 1000, price_rub: 2000, chatsQty: 15 }, { id: 2, name: 'START', price: 1000, price_rub: 2000, chatsQty: 15 },
{ id: 3, name: 'PRO', price: 5000, price_rub: 10000, chatsQty: 40 }, { id: 3, name: 'PRO', price: 5000, price_rub: 10000, chatsQty: 40 },
{ id: 4, name: 'VIP', price: 12000, price_rub: 24000, chatsQty: null } { id: 4, name: 'VIP', price: 12000, price_rub: null, chatsQty: null }
] ]
</script> </script>

View File

@@ -1,5 +1,7 @@
<template> <template>
<div class="flex column items-center bg-white rounded-card q-pa-md"> <div
class="flex column items-center bg-white rounded-card q-pa-md crew-card fit"
>
<div class="text-h5 text-primary text-bold"> <div class="text-h5 text-primary text-bold">
{{ name }} {{ name }}
</div> </div>
@@ -23,9 +25,23 @@
</div> </div>
<span class="text-caption">{{ $t('price__per_month') }}</span> <span class="text-caption">{{ $t('price__per_month') }}</span>
</div> </div>
<div v-else class="text-bold text-h5"> <div v-else-if="price === 0" class="text-bold text-h5">
{{ $t('price__free_tax') }} {{ $t('price__free_tax') }}
</div> </div>
<div v-else>
<div class="text-center q-pt-md">
<a
href="mailto:info@tgcrew.ru"
style="text-decoration: none; color: inherit"
>
{{ $t('price__request') }}<br>
info@tgcrew.ru
</a>
</div>
</div>
</div> </div>
<div class="flex items-center q-pt-md" style="min-height: 50px;"> <div class="flex items-center q-pt-md" style="min-height: 50px;">

View File

@@ -3,7 +3,8 @@
<div <div
class="fit row" class="fit row"
> >
<div class="col-sm-6 col-xs-12 q-pa-lg" <div
class="flex col-sm-6 col-xs-12 q-pa-lg"
v-for="(item, idx) in problems" v-for="(item, idx) in problems"
:key="idx" :key="idx"
> >
@@ -11,6 +12,7 @@
:icon="item.icon" :icon="item.icon"
:title="item.title" :title="item.title"
:description="item.description" :description="item.description"
class="bg-red"
/> />
</div> </div>
</div> </div>

View File

@@ -1,13 +1,17 @@
<template> <template>
<div class="column items-center bg-white fit q-pa-lg rounded-card fit"> <div
class="crew-card column items-center q-pa-xl cursor-pointer fit"
>
<q-icon <q-icon
:name="icon" :name="icon"
size="xl" size="xl"
color="primary" color="primary"
/> />
<div class="text-bold text-h5 text-center q-pt-md"> <div class="text-bold text-h5 text-center q-pt-md">
{{ $t(title ?? '') }} {{ $t(title ?? '') }}
</div> </div>
<div class="text-grey text-body1 text-center q-pt-sm text-wrap"> <div class="text-grey text-body1 text-center q-pt-sm text-wrap">
{{ $t(description ?? '') }} {{ $t(description ?? '') }}
</div> </div>
@@ -15,12 +19,14 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
defineProps({ defineProps({
icon: String, icon: String,
title: String, title: String,
description: String description: String
}) })
</script> </script>
<style scoped> <style scoped lang="scss">
</style> </style>

View File

@@ -107,6 +107,24 @@ body, html, #q-app {
border-radius: var(--base-radius); border-radius: var(--base-radius);
} }
.crew-card {
background: linear-gradient(
135deg,
rgba(255, 255, 255, 0.9) 0%,
rgba(255, 255, 255, 0.5) 100%
) !important;
backdrop-filter: blur(12px);
-webkit-backdrop-filter: blur(12px);
border-radius: 24px;
border: 1px solid rgba(255, 255, 255, 0.3);
transition: all 0.4s cubic-bezier(0.25, 0.8, 0.25, 1);
&.is-hovered {
transform: translateY(-1px);
background: white;
}
}
@font-face { @font-face {
font-family: 'myFont'; font-family: 'myFont';
src: url(./fonts/Inter-Regular.woff2); src: url(./fonts/Inter-Regular.woff2);

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
export default { EN: 'EN', RU: 'RU', '': '', main__how_it_works: 'How it works?', main__price: 'Price', main__faq: 'FAQ', main__contacts: 'Contacts', banner__slogan_prepend: 'banner__slogan_prepend', banner__slogan_body: 'banner__slogan_body', banner__main_btn: 'Join!', problem__title: 'problem__title', problem__address_book: 'problem__address_book', problem__address_book_description: 'problem__address_book_description', problem__task_manager: 'problem__task_manager', problem__task_manager_description: 'problem__task_manager_description', problem__meeting: 'problem__meeting', problem__meeting_description: 'problem__meeting_description', problem__files: 'problem__files', problem__files_description: 'problem__files_description', problem__privacy: 'problem__privacy', problem__privacy_description: 'problem__privacy_description', how_it_works__title: 'how_it_works__title', how_works__step1: 'how_works__step1', how_works__step1_description: 'how_works__step1_description', how_works__step2: 'how_works__step2', how_works__step2_description: 'how_works__step2_description', how_works__step3: 'how_works__step3', how_works__step3_description: 'how_works__step3_description', price__title: 'price__title', price__chat_per_day: 'price__chat_per_day', price__sale_date: 'price__sale_date', price__stars_pay: 'price__stars_pay', price__stars_description: 'price__stars_description', price__include: 'price__include', price_unlimited_users: 'price_unlimited_users', price_unlimited_projects: 'price_unlimited_projects', price_free_chats: 'price_free_chats', price_support: 'price_support', FAQ__title: 'FAQ__title', faq__question_1: 'faq__question_1', faq__answer_1: 'faq__answer_1', faq__question_2: 'faq__question_2', faq__answer_2: 'faq__answer_2', faq__question_3: 'faq__question_3', faq__answer_3: 'faq__answer_3', faq__question_4: 'faq__question_4', faq__answer_4: 'faq__answer_4', faq__question_5: 'faq__question_5', faq__answer_5: 'faq__answer_5' }

File diff suppressed because one or more lines are too long

View File

@@ -1 +0,0 @@
export default { EN: 'EN', RU: 'RU', '': '', main__how_it_works: 'Как это работает?', main__price: 'Цены', main__faq: 'Вопросы', main__contacts: 'Контакты', banner__slogan_prepend: 'Больше чем просто чаты', banner__slogan_body: 'Управление проектами внутри Telegram', banner__main_btn: 'Присоединиться', problem__title: 'Преимущества', problem__address_book: 'Адресная книга', problem__address_book_description: 'Не нужно угадывать, кто есть кто.', problem__task_manager: 'Задачи', problem__task_manager_description: 'Задачи из разных чатов в одном месте - все будет сделано!', problem__meeting: 'Совещания', problem__meeting_description: 'problem__meeting_description', problem__files: 'Файлы', problem__files_description: 'Не нужно помнить в каком именно чате был нужный файл. Теперь они все в одном месте.', problem__privacy: 'Доступ к информации', problem__privacy_description: 'Пользователям доступна только та информация, что есть в их чатах.', how_it_works__title: 'Как это работает?', how_works__step1: 'how_works__step1', how_works__step1_description: 'how_works__step1_description', how_works__step2: 'how_works__step2', how_works__step2_description: 'how_works__step2_description', how_works__step3: 'how_works__step3', how_works__step3_description: 'how_works__step3_description', price__title: 'price__title', price__chat_per_day: 'price__chat_per_day', price__sale_date: 'price__sale_date', price__stars_pay: 'price__stars_pay', price__stars_description: 'price__stars_description', price__include: 'price__include', price_unlimited_users: 'price_unlimited_users', price_unlimited_projects: 'price_unlimited_projects', price_free_chats: 'price_free_chats', price_support: 'price_support', FAQ__title: 'FAQ__title', faq__question_1: 'faq__question_1', faq__answer_1: 'faq__answer_1', faq__question_2: 'faq__question_2', faq__answer_2: 'faq__answer_2', faq__question_3: 'faq__question_3', faq__answer_3: 'faq__answer_3', faq__question_4: 'faq__question_4', faq__answer_4: 'faq__answer_4', faq__question_5: 'faq__question_5', faq__answer_5: 'faq__answer_5' }

View File

@@ -23,6 +23,7 @@
<base-logo <base-logo
ref="logo" ref="logo"
class="text-h5" class="text-h5"
:icon-color="isHeroScroll ? 'white' : 'primary'"
:text-color="isHeroScroll ? 'white' : 'primary'" :text-color="isHeroScroll ? 'white' : 'primary'"
/> />
<div <div

View File

@@ -15,7 +15,7 @@
@click="router.push({ name: 'main' })" @click="router.push({ name: 'main' })"
/> />
<div class="text-h5 text-bold"> <div class="text-h5 text-bold">
{{ $t(getDoc(documentName)) }} {{ $te(getDoc(documentName)) ? $t(getDoc(documentName)) : '' }}
</div> </div>
<markdown-viewver <markdown-viewver
v-if="documentName" v-if="documentName"
@@ -47,7 +47,7 @@
const documentName = ref(null) const documentName = ref(null)
const getDoc = (fileName) => { const getDoc = (fileName) => {
return docs.find(d => d.file === fileName)?.translationKey ?? '' return docs.find(d => d.file === fileName)?.translationKey
} }
onMounted(() => { onMounted(() => {