Compare commits

...

59 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
7815ce9587 small change
All checks were successful
continuous-integration/drone/push Build is passing
2026-04-26 23:49:49 +03:00
930522aa97 update docs
All checks were successful
continuous-integration/drone/push Build is passing
2026-04-26 23:11:03 +03:00
2fc4deb9e7 small fix
All checks were successful
continuous-integration/drone/push Build is passing
2026-04-23 08:50:54 +03:00
5213e7b2e5 update
All checks were successful
continuous-integration/drone/push Build is passing
2026-04-22 13:54:18 +03:00
03b2a8306d 2
All checks were successful
continuous-integration/drone/push Build is passing
2026-04-19 00:17:05 +03:00
fdbfb679d8 1
All checks were successful
continuous-integration/drone/push Build is passing
2026-04-19 00:11:55 +03:00
5633ae84ff glass fix
All checks were successful
continuous-integration/drone/push Build is passing
2026-04-19 00:07:32 +03:00
cce5d98e75 f
All checks were successful
continuous-integration/drone/push Build is passing
2026-04-19 00:03:21 +03:00
e985b94ca4 small-fix
All checks were successful
continuous-integration/drone/push Build is passing
2026-04-18 23:59:35 +03:00
0e8cd99212 glass
All checks were successful
continuous-integration/drone/push Build is passing
2026-04-18 23:26:05 +03:00
cd1a571636 small fix
All checks were successful
continuous-integration/drone/push Build is passing
2026-04-18 23:15:05 +03:00
6f5a3cc6cc Delete ~$i18n-2-landing.xlsm
All checks were successful
continuous-integration/drone/push Build is passing
2026-04-18 23:01:13 +03:00
7deca1df27 simple_fix 2026-04-18 23:01:08 +03:00
3d5b079cc5 update_logo_v2
All checks were successful
continuous-integration/drone/push Build is passing
2026-04-18 22:56:33 +03:00
927897bd45 update logo
Some checks failed
continuous-integration/drone/push Build is failing
2026-04-18 22:51:36 +03:00
81cba45eb3 node update
All checks were successful
continuous-integration/drone/push Build is passing
2026-04-18 18:06:19 +03:00
18c37768cb update
Some checks failed
continuous-integration/drone/push Build is failing
dfdsf
2026-04-18 16:45:58 +03:00
6c3a954323 update 2026-01-27 14:53:23 +03:00
df450a2041 update3
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-11 15:46:30 +03:00
9a86ee59f5 update
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-11 12:35:39 +03:00
ccc1824f77 gfd
All checks were successful
continuous-integration/drone/push Build is passing
2025-12-10 22:33:38 +03:00
2757a052d2 update2 2025-12-10 15:19:34 +03:00
1e328b315c update 2025-12-10 14:23:53 +03:00
c84b9788d9 update landing
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-20 13:19:32 +03:00
4771b374ac add docs
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-11 17:50:52 +03:00
d55237f736 test2
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-02 21:04:59 +03:00
78b53fc248 test
Some checks failed
continuous-integration/drone/push Build is failing
2025-08-02 20:10:18 +03:00
38167ee385 dsad
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-02 11:49:18 +03:00
3749fd0d07 change logo
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-01 11:13:44 +03:00
3d415c5342 change logo
All checks were successful
continuous-integration/drone/push Build is passing
2025-08-01 11:10:42 +03:00
c1ba357393 change font
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-29 22:09:33 +03:00
a0df926e56 miniUpdate
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-24 18:34:36 +03:00
bc2dd90e57 Update BaseLogo.vue
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-24 12:24:29 +03:00
adbc1d66c2 обновление favicon
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-24 11:35:50 +03:00
d1f97f9efe изменение цветов бренда
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-24 09:25:48 +03:00
9193fd27ae Update .drone.yml
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-24 08:55:50 +03:00
ef99044b08 Update .drone.yml
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-24 08:54:47 +03:00
8d16a4cc51 Update .drone.yml
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-24 08:50:54 +03:00
21fd41f87c Update .drone.yml
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-23 23:22:34 +03:00
b55acc0f7a Update .drone.yml
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-23 22:42:47 +03:00
1319ed4dfb Update .drone.yml
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-23 22:41:24 +03:00
ef18c3bec6 dsa
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-23 22:38:07 +03:00
0010306bac Update .drone.yml
Some checks failed
continuous-integration/drone/push Build is failing
2025-07-23 22:34:27 +03:00
a87c6b7554 Update .drone.yml
Some checks failed
continuous-integration/drone/push Build is failing
2025-07-23 22:32:54 +03:00
cd590bb81a Update .drone.yml
Some checks failed
continuous-integration/drone/push Build is failing
2025-07-23 22:32:01 +03:00
917b3ef4f0 Update .drone.yml
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-23 22:30:36 +03:00
e79c3242ff Update .drone.yml
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-23 22:22:37 +03:00
5d5819a732 Update .drone.yml
Some checks reported errors
continuous-integration/drone/push Build encountered an error
2025-07-23 22:21:59 +03:00
5bdf75605b Update .drone.yml
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-23 22:19:32 +03:00
b2e242dc71 Update .drone.yml
Some checks failed
continuous-integration/drone/push Build is failing
2025-07-23 22:06:24 +03:00
ae678af314 Update .drone.yml
Some checks failed
continuous-integration/drone/push Build is failing
2025-07-23 22:04:51 +03:00
ca3e80b314 Update .drone.yml
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-23 22:03:35 +03:00
9a0c6c3c3e updareRunner
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-23 22:01:20 +03:00
cdff4592d9 Update BaseLogo.vue
All checks were successful
continuous-integration/drone/push Build is passing
2025-07-23 21:47:08 +03:00
3ded20df7c Update BaseLogo.vue
Some checks failed
continuous-integration/drone/push Build is failing
2025-07-23 21:38:37 +03:00
27f084c5fb teeest 2025-07-23 21:32:24 +03:00
67 changed files with 6534 additions and 1635 deletions

View File

@@ -4,7 +4,7 @@ name: deploy
steps:
- name: build
image: node:22
image: node:22.22.0
commands:
- npm install -g @quasar/cli
- npm install
@@ -17,7 +17,8 @@ steps:
username: root
key:
from_secret: SSH-nginx-key
source: dist/spa/*
source: ./dist/spa/*
strip_components: 2
target: /usr/share/nginx/tgCrewLanding
rm: true
when:

BIN
i18n-2-landing.xlsm Normal file

Binary file not shown.

Binary file not shown.

View File

@@ -9,11 +9,9 @@
<meta name="msapplication-tap-highlight" content="no">
<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width<% if (ctx.mode.cordova || ctx.mode.capacitor) { %>, viewport-fit=cover<% } %>">
<link rel="icon" type="image/png" sizes="128x128" href="icons/favicon-128x128.png">
<link rel="icon" type="image/png" sizes="96x96" href="icons/favicon-96x96.png">
<link rel="icon" type="image/png" sizes="32x32" href="icons/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="icons/favicon-16x16.png">
<link rel="icon" type="image/ico" href="favicon.ico">
<link rel="icon" href="icons/favicon.svg" type="image/svg+xml">
<link rel="icon" type="image/ico" href="icons/favicon.ico">
<link rel="apple-touch-icon" href="icons/apple-touch-icon.png">
</head>
<body>
<!-- quasar:entry-point -->

4740
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,8 +1,8 @@
{
"name": "projectsnodelandingpage",
"name": "tgCrewLandingPage",
"version": "0.0.1",
"description": "A Quasar Project",
"productName": "LandingPage",
"description": "Landing Page for telegram mini app tgCrew",
"productName": "tgCrew",
"author": "AlexMart",
"type": "module",
"private": true,
@@ -15,24 +15,25 @@
"postinstall": "quasar prepare"
},
"dependencies": {
"vue-i18n": "^11.0.0",
"@quasar/extras": "^1.16.4",
"quasar": "^2.16.0",
"@quasar/extras": "^1.18.0",
"quasar": "^2.19.3",
"vue": "^3.4.18",
"vue-i18n": "^11.0.0",
"vue-router": "^4.0.0"
},
"devDependencies": {
"@intlify/unplugin-vue-i18n": "^4.0.0",
"@eslint/js": "^9.14.0",
"@intlify/unplugin-vue-i18n": "^4.0.0",
"@quasar/app-vite": "^2.6.0",
"@quasar/quasar-app-extension-qmarkdown": "^2.0.5",
"@vue/eslint-config-prettier": "^10.1.0",
"autoprefixer": "^10.4.2",
"eslint": "^9.14.0",
"eslint-plugin-vue": "^9.30.0",
"globals": "^15.12.0",
"vite-plugin-checker": "^0.9.0",
"@vue/eslint-config-prettier": "^10.1.0",
"postcss": "^8.4.14",
"prettier": "^3.3.3",
"@quasar/app-vite": "^2.1.0",
"autoprefixer": "^10.4.2",
"postcss": "^8.4.14"
"vite-plugin-checker": "^0.9.0"
},
"engines": {
"node": "^28 || ^26 || ^24 || ^22 || ^20 || ^18",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

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: 12 KiB

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 859 B

After

Width:  |  Height:  |  Size: 352 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

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: 9.4 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">

BIN
public/icons/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

3
public/icons/favicon.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 32 KiB

View File

@@ -0,0 +1,20 @@
{
"name": "Your Website",
"short_name": "Website",
"description": "Description of your website",
"icons": [
{
"src": "/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"theme_color": "#ffffff",
"background_color": "#ffffff",
"display": "standalone"
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

BIN
public/img/samolet.mp4 Normal file

Binary file not shown.

View File

@@ -31,7 +31,7 @@ export default defineConfig((ctx) => {
// 'line-awesome',
// 'roboto-font-latin-ext', // this or either 'roboto-font', NEVER both!
'roboto-font', // optional, you are not bound to it
// 'roboto-font', // optional, you are not bound to it
'material-icons', // optional, you are not bound to it
],
@@ -94,7 +94,8 @@ export default defineConfig((ctx) => {
// https://v2.quasar.dev/quasar-cli-vite/quasar-config-file#framework
framework: {
config: {},
config: {
},
// iconSet: 'material-icons', // Quasar icon set
// lang: 'en-US', // Quasar language pack

5
quasar.extensions.json Normal file
View File

@@ -0,0 +1,5 @@
{
"@quasar/qmarkdown": {
"import_md": true
}
}

View File

@@ -3,5 +3,4 @@
</template>
<script setup>
//
</script>

View File

@@ -0,0 +1,70 @@
###### Version 1.05 dated April 15, 2026
In accordance with the requirements of the Federal Law dated July 27, 2006 No. 152-FZ "On Personal Data", acting freely, of my own will and in my own interest, as well as confirming my legal capacity, I (hereinafter — the **User**) hereby give my consent to individual entrepreneur Martynshkin Alexey Alexandrovich (OGRNIP 318774600262084, INN 366316608346, PData operator reg. number 77-25-471585; hereinafter — the **Operator**) for the processing of my personal data under the conditions set forth below.
The following terms and definitions are used in this Consent:
**Bot** — an account named @tgCrewBot and located at [https://t.me/tgCrewBot](https://t.me/tgCrewBot) in the Telegram messenger, managed programmatically by the Operator via API (Application Programming Interface). The Bot provides access to the Application and can be used for basic interaction from the text string (inline-mode).
**Application** — the tgCrew mini-application operating within the Telegram messenger environment as part of the Telegram Mini Apps (TMA) ecosystem and accessible through interaction with the Bot. Although the Application uses the Telegram platform for its functioning and distribution, it is developed and provided exclusively by the Operator. The Application is not a product of the Telegram messenger development company, is not supported by it, is not approved by it, and is not associated with it legally or organizationally in any way.
**Personal Data (or PData)** — any information relating to a directly or indirectly identified or identifiable individual (subject of personal data) (according to No. 152-FZ, Chapter 1, Article 3, Clause 1).
**Administrator** — a User of the Application who manages the Application using the Admin Panel.
**Administrator Account** — the account through which the Administrator authenticates to access the Admin Panel.
**Admin Panel** — the Application interface for managing the Application, including the following functions:
- connecting chats to the Application (within the meaning of the term Connected Chat);
- entering additional information data for Users;
- controlling the payment of the License Fee to the Developer for using the Application.
**Connected Chat** (to the Application) — a chat in Telegram to which the Bot has been added with the necessary access rights. Information is available in the Application only from Connected Chats.
1. This consent is specific, informed, conscious, and unambiguous.
2. Consent is given to the Operator for the processing of the User's personal data (using automation tools), including the following actions:
a) Collection, recording, systematization, accumulation.
b) Storage for the period necessary to achieve the purposes of processing, but no less than the periods established by the Operator's Privacy Policy and the legislation of the Russian Federation.
c) Clarification (updating, modification).
d) Extraction, use.
e) Transfer (provision, access) to state bodies, courts, or law enforcement agencies exclusively upon official request within the framework of the legislation of the Russian Federation.
f) Transfer (provision, access) to other Users of the Application who have a common Connected Chat with the User, in the scope provided by the Application functionality (displaying the first name, last name, avatar, position or role in participant lists, in the description of meetings and tasks, etc.).
g) Blocking, deletion, destruction.
h) Implementation of other actions provided for by the legislation of the Russian Federation.
3. Consent is given for the processing of the following personal data of the User, which may be provided by the User themselves and (or) entered by the Application Administrator (if the User is a participant of a Connected Chat) and (or) automatically collected by the Application:
a) Surname, first name, patronymic.
b) Email address.
c) Contact phone number.
d) Information about the place of work (name of the organization, structural unit, position and/or functional role).
e) Data of the account in the Telegram messenger: user name (Name, including first_name and last_name), pseudonym (Username), user identifier (ID), profile image identifier (used to display an avatar without saving copies of files on the Operator's servers), language settings of the Telegram client, as well as, if the User is an Administrator, Telegram Stars transaction data (user identifier, number of Telegram Stars, transaction identifier, operation timestamp), which are automatically transmitted via the Telegram API. Processing of biometric personal data is not performed by the Operator.
f) Data on interaction with the Application servers (technical data): IP address from which the request is made, date and time the request was received by the Application server, requested URL, HTTP response code of the Application server, response size in bytes, User-Agent (information about the browser and operating system of the client), Referrer (URL of the page from which the request was made, if available).
4. Personal data processing is carried out for the following purposes:
a) Identification and authentication in the Application (sub-clauses 3.b and 3.e).
b) Provision of technical support and processing of inquiries (sub-clauses 3.a-3.d).
c) Sending system notifications if the User is an Application Administrator and uses email for authentication (sub-clauses 3.b and 3.e).
d) Accounting and confirmation of payment transactions via Telegram Stars, in case the User is an Application Administrator (sub-clauses 3.b and 3.e).
e) Formation of an address book of contacts within Connected Chats (sub-clauses 3.a-3.d).
f) Ensuring the correct operation of the Application functionality (sub-clauses 3.a-3.d).
g) Implementation of technical measures aimed at preventing technical failures, identifying errors, and ensuring the information security of the Application (clause 3.f).
5. I express my consent that checking the corresponding interactive element (checkbox) of the Application interface next to the text: "I give Consent for the processing of my personal data and accept the terms of the Privacy Policy" is recognized by the Operator and the User as an analogue of the User's handwritten signature (simple electronic signature), certifying the fact of familiarization and agreement with the terms of this Consent and the Operator's Privacy Policy, posted in the Application and in public access on the Internet at: [https://tgcrew.ru/privacy-policy](https://tgcrew.ru/privacy-policy).
6. This consent enters into force from the moment it is provided by performing the actions specified in clause 5 of this Consent and is valid until the moment of withdrawal.
7. Withdrawal of this Consent is carried out by clicking on the "Refusal to use the application" button and subsequently clicking the "Confirm" button in the dialog that opens. The "Refusal to use the application" button is located in the Settings section (both for the User part and for the Admin Panel). Also, the withdrawal of Consent can be sent to the Operator in writing to the email address [support@tgcrew.ru](mailto:support@tgcrew.ru). Withdrawal of Consent entails the termination of personal data processing and its destruction, except for cases provided for in clause 8 of this Consent.
8. In case of withdrawal of this consent, the Operator has the right to continue processing the User's personal data without their consent if there are grounds provided for by clauses 2-11 of part 1 of article 6, part 2 of article 10 and part 2 of article 11 of the Federal Law dated July 27, 2006 No. 152-FZ "On Personal Data".
9. Contact Information and Details of the Operator
Individual Entrepreneur Martynshkin Alexey Alexandrovich
Legal address: 111394, Russian Federation, Moscow, Perovskaya street, house 66, building 3, apartment 187
OGRNIP 318774600262084
INN 366316608346
Phone: +7 (916) 439-04-25
Email: [info@tgcrew.ru](mailto:info@tgcrew.ru)

View File

@@ -0,0 +1,70 @@
###### Версия 1.05 от 15.04.2026
В соответствии с требованиями Федерального закона от 27.07.2006 № 152-ФЗ «О персональных данных», действуя свободно, своей волей и в своем интересе, а также подтверждая свою дееспособность, я (далее -- **Пользователь**) даю свое согласие индивидуальному предпринимателю Мартышкину Алексею Александровичу (ОГРНИП 318774600262084, ИНН 366316608346, оператор ПДн регистр. номер 77-25-471585; далее -- **Оператор**) на обработку своих персональных данных на изложенных ниже условиях.
В настоящем Согласии используются следующие термины и определения:
**Бот** -- аккаунт с именем @tgCrewBot и адресом [https://t.me/tgCrewBot](https://t.me/tgCrewBot) в мессенджере Telegram, управляемый программно Оператором через API (Application Programming Interface, программный интерфейс приложений). Бот предоставляет доступ к Приложению и может использоваться для базового взаимодействия из текстовой строки (inline-mode).
**Приложение** -- мини-приложение tgCrew, работающее в среде мессенджера Telegram как часть экосистемы Telegram Mini Apps (TMA) и доступное через взаимодействие с Ботом. Хотя Приложение использует платформу Telegram для своего функционирования и распространения, оно разработано и предоставляется исключительно Оператором. Приложение не является продуктом компании-разработчика мессенджера Telegram, не поддерживается ею, не одобрено ею и никак не связано с ней юридически или организационно.
**Персональные данные (или ПДн)** -- любая информация, относящаяся к прямо или косвенно определенному или определяемому физическому лицу (субъекту персональных данных) (согласно № 152-ФЗ, Глава 1, Статья 3, п. 1).
**Администратор** -- Пользователь Приложения, который осуществляет управление Приложением с помощью Панели администратора.
**Учетная запись Администратора** -- учетная запись, с помощью которой Администратор осуществляет аутентификацию для доступа к Панели администратора.
**Панель администратора** -- интерфейс Приложения для управления Приложением, в том числе осуществления следующих функций:
- подключение чатов к Приложению (в значении термина Подключенный чат);
- внесение дополнительных информационных данных для Пользователей;
- контроль оплаты Лицензионного вознаграждения Разработчику за использование Приложения.
**Подключенный чат** (к Приложению) -- чат в Telegram, в который добавлен Бот с необходимыми правами доступа. В Приложении доступна информация только из Подключенных чатов.
1. Настоящее согласие является конкретным, информированным, сознательным и однозначным.
2. Согласие дано Оператору на обработку персональных данных Пользователя (с использованием средств автоматизации), включающую следующие действия:
а) Сбор, запись, систематизация, накопление.
б) Хранение в течение срока, необходимого для достижения целей обработки, но не менее сроков, установленных Политикой конфиденциальности Оператора и законодательством Российской Федерации.
в) Уточнение (обновление, изменение).
г) Извлечение, использование.
д) Передача (предоставление, доступ) государственным органам, судам или правоохранительным структурам исключительно по официальному запросу в рамках законодательства РФ.
е) Передачу (предоставление, доступ) другим Пользователям Приложения, имеющим общий Подключенный чат с Пользователем, в объёме, предусмотренном функционалом Приложения (отображение имени, фамилии, аватара, должности или роли в списках участников, в описании совещаний и задач и т.п.).
ж) Блокирование, удаление, уничтожение.
з) Осуществление иных действий, предусмотренных законодательством РФ.
3. Согласие дается на обработку следующих персональных данных Пользователя, которые могут быть предоставлены самим Пользователем и (или) внесены Администратором Приложения (если Пользователь является участником Подключенного чата) и (или) автоматически собраны Приложением:
а) Фамилия, имя, отчество.
б) Адрес электронной почты.
в) Контактный телефон.
г) Сведения о месте работы (наименование организации, структурное подразделение, должность и/или функциональная роль).
д) Данные учетной записи в мессенджере Telegram: имя пользователя (Name, включающее в себя first_name и last_name), псевдоним (Username), идентификатор пользователя (ID), идентификатор изображения профиля (используется для отображения аватара без сохранения копий файлов на серверах Оператора), языковые настройки клиента Telegram, а также, если Пользователь является Администратором, данные транзакций Telegram Stars (идентификатор пользователя, количество Telegram Stars, идентификатор транзакции, временная метка операции), которые автоматически передаются через API Telegram. Обработка биометрических персональных данных Оператором не осуществляется.
е) Данные о взаимодействии с серверами Приложения (технические данные): IP-адрес, с которого осуществляется запрос, дата и время получения запроса сервером Приложения, запрошенный URL, HTTP-код ответа сервера Приложения, размер ответа в байтах, User-Agent (информация о браузере и операционной системе клиента), Referrer (URL страницы, с которой был сделан запрос, если доступно).
4. Обработка персональных данных осуществляется в следующих целях:
а) Идентификация и аутентификация в Приложении (пп. 3.б и 3.д).
б) Предоставление технической поддержки и обработка обращений (пп. 3.а-3.д).
в) Отправка системных уведомлений, если Пользователь является Администратором Приложения и использует электронную почту для аутентификации (пп. 3.б и 3.д).
г) Учет и подтверждение платежных транзакций через Telegram Stars, в случае если Пользователь является Администратором Приложения (пп. 3.б и 3.д).
д) Формирование адресной книги контактов в рамках Подключенных чатов (пп. 3.а-3.д).
е) Обеспечение корректной работы функционала Приложения (пп. 3.а-3.д).
ж) Осуществление технических мер, направленных на профилактику технических сбоев, выявление ошибок и обеспечение информационной безопасности Приложения (п. 3.е).
5. Я выражаю согласие, что проставление отметки в соответствующем интерактивном элементе (поле для отметки) интерфейса Приложения рядом с текстом: «Я даю Согласие на обработку своих персональных данных и принимаю условия Политики конфиденциальности» признается Оператором и Пользователем аналогом собственноручной подписи Пользователя (простой электронной подписью), удостоверяющей факт ознакомления и согласия с условиями настоящего Согласия и Политики конфиденциальности Оператора, размещенной в Приложении и в открытом доступе в сети Интернет по адресу: [https://tgcrew.ru/privacy-policy](https://tgcrew.ru/privacy-policy).
6. Настоящее согласие вступает в силу с момента его предоставления путем совершения действий, указанных в пункте 5 настоящего Согласия, и действует до момента отзыва.
7. Отзыв настоящего Согласия осуществляется путем нажатия на кнопку «Отказ от использования приложения» и последующим нажатием в открывшемся диалоге кнопки «Подтвердить». Кнопка «Отказ от использования приложения» размещена в разделе Настройки (как для Пользовательской части, так и для Панели Администратора). Также отзыв Согласия может быть направлен Оператору в письменной форме по адресу электронной почты [support@tgcrew.ru](mailto:support@tgcrew.ru). Отзыв Согласия влечет прекращение обработки персональных данных и их уничтожение, за исключением случаев, предусмотренных пунктом 8 настоящего Согласия.
8. В случае отзыва настоящего согласия Оператор вправе продолжить обработку персональных данных Пользователя без его согласия при наличии оснований, предусмотренных пунктами 2-11 части 1 статьи 6, частью 2 статьи 10 и частью 2 статьи 11 Федерального закона от 27.07.2006 № 152-ФЗ «О персональных данных».
9. Контактная информация и реквизиты Оператора
Индивидуальный предприниматель Мартышкин Алексей Александрович
Юридический адрес: 111394, Российская Федерация, город Москва, улица Перовская, дом 66, корпус 3, квартира 187
ОГРНИП 318774600262084
ИНН 366316608346
Телефон: +7 (916) 439-04-25
Электронная почта: [info@tgcrew.ru](mailto:info@tgcrew.ru)

View File

@@ -0,0 +1,190 @@
###### Version 1.05 dated April 15, 2026
This document is an English adaptation of «Политика конфиденциальности» originally drafted in Russian. In the event of any disputes subject to resolution in courts of the Russian Federation, the Russian-language version shall prevail.
In this Privacy Policy, the Developer provides information on the scope of collection of data (including personal data) of Users in the Application, explains the reasons for its collection and the ways of its use.
Current versions of the Terms of Use and the Privacy Policy are available within the Application interface. Information posted on the Website is for reference purposes only. In case of discrepancies between the text on the Website and in the Application, the version placed in the Application shall have legal force.
## 1. Terms and Definitions
1.1. **Bot** — an account named @tgCrewBot and located at [https://t.me/tgCrewBot](https://t.me/tgCrewBot) in the Telegram messenger, managed programmatically by the Developer via API (Application Programming Interface). The Bot provides access to the Application and can be used for basic interaction from the text string (inline-mode).
1.2. **Application** — the tgCrew mini-application operating within the Telegram messenger environment as part of the Telegram Mini Apps (TMA) ecosystem and accessible through interaction with the Bot. Although the Application uses the Telegram platform for its functioning and distribution, it is developed and provided exclusively by the Developer. The Application is not a product of the Telegram messenger development company, is not supported by it, is not approved by it, and is not associated with it legally or organizationally in any way. The functionality of the Application is available only after acceptance of the Terms of Use and the Privacy Policy.
1.3. **Website** — the website located at [https://tgcrew.ru](https://tgcrew.ru), where information about the Application and its documentation is posted.
1.4. **Terms of Use** — this document, the current version of which is posted in the Application and on the Website at [https://tgcrew.ru/terms-of-use](https://tgcrew.ru/terms-of-use). Contractual relations between the Developer and the User arise only after acceptance of the Terms of Use within the Application.
1.5. **Privacy Policy** — a document regulating the procedure for collecting, storing, and processing data (including personal data) of the User entered during the registration procedure, use of the Application, as well as other data. It is an integral annex to the Terms of Use. The current version of the Privacy Policy is posted in the Application and on the Website at [https://tgcrew.ru/privacy-policy](https://tgcrew.ru/privacy-policy). Consent for data processing within the framework of the Privacy Policy is provided by the User within the Application.
1.6. **Developer** — individual entrepreneur Martynshkin Alexey Alexandrovich (IP Martynshkin A.A.), OGRNIP 318774600262084, INN 366316608346 (Russian Federation).
1.7. **User** — an individual, individual entrepreneur, legal entity, or their authorized representative who has accepted the terms of the Terms of Use and the Privacy Policy by their explicit confirmation within the Application interface.
1.8. **Administrator** — a User of the Application who manages the Application using the Admin Panel.
1.9. **Administrator Account** — the account through which the Administrator authenticates to access the Admin Panel.
1.10. **Chat Participant** — a participant of a Connected Chat who may not be a User of the Application.
1.11. **Admin Panel** — the Application interface for managing the Application, including the following functions:
- connecting chats to the Application (see clause 1.12 Connected Chat);
- entering additional information data for Users;
- controlling the payment of the License Fee to the Developer for using the Application.
1.12. **Connected Chat** (to the Application) — a chat in Telegram to which the Bot has been added with the necessary access rights. Information is available in the Application only from Connected Chats.
1.13. **Use of the Application** — the User performing actions to view and (or) use the available functionality of the Application through reproducible online interfaces on the screen of the User's device.
1.14. **Developer's Representatives** — the circle of persons engaged by the Developer within the framework of development and support of the Application, acting on behalf of and (or) on the instructions of the Developer.
1.15. **Personal Data (or PData)** — any information relating to a directly or indirectly identified or identifiable individual (subject of personal data) (according to Federal Law No. 152-FZ, Chapter 1, Article 3, Clause 1).
1.16. **Processing of Personal Data** — any action (operation) or set of actions (operations) performed with personal data using automation tools or without using such tools, including collection, recording, systematization, accumulation, storage, clarification (updating, modification), extraction, use, transfer (distribution, provision, access), depersonalization, blocking, deletion, destruction of personal data (according to Federal Law No. 152-FZ, Chapter 1, Article 3, Clause 3).
1.17. **Operator** — a state body, municipal body, legal entity or individual, independently or jointly with other persons organizing and (or) performing the processing of personal data, as well as determining the purposes of processing personal data, the composition of personal data subject to processing, and actions (operations) performed with personal data (according to Federal Law No. 152-FZ, Chapter 1, Article 3, Clause 2).
1.18. **Automated Processing of Personal Data** — processing of personal data using computer technology (according to Federal Law No. 152-FZ, Chapter 1, Article 3, Clause 4).
1.19. **Provision of Personal Data** — actions aimed at disclosing personal data to a specific person or a specific circle of persons (according to Federal Law No. 152-FZ, Chapter 1, Article 3, Clause 6).
1.20. **Cross-border Transfer of Personal Data** — the transfer of personal data to the territory of a foreign state to an authority of a foreign state, a foreign individual, or a foreign legal entity (according to Federal Law No. 152-FZ, Chapter 1, Article 3, Clause 11).
1.21. **Destruction of Personal Data** — actions as a result of which it becomes impossible to restore the content of personal data in the personal data information system and (or) as a result of which physical carriers of personal data are destroyed (according to Federal Law No. 152-FZ, Chapter 1, Article 3, Clause 8).
## 2. General Provisions
2.1. This Privacy Policy exclusively regulates the relationship between the Developer and the User. It cannot regulate the relationship between the Telegram messenger (hereinafter - Telegram) and its users and does not replace the Telegram Privacy Policy.
2.2. This Privacy Policy is drawn up in accordance with the requirements of:
- Federal Law dated July 27, 2006 No. 152-FZ "On Personal Data".
- Requirements of section "4. Privacy" of the document "Telegram Bot Platform Developer Terms of Service" by Telegram FZ-LLC (the developer of the Telegram messenger).
2.3. The Developer acts as the Operator when Processing personal data of Application Users.
## 3. Acceptance of the Terms of this Privacy Policy
3.1. Evidence of full and unconditional acceptance of the terms of this Privacy Policy (acceptance) is the performance of the procedure for accepting the Privacy Policy by activating (checking) the corresponding interactive element (checkbox) of the Application interface next to the text: "I give Consent for the processing of my personal data and accept the terms of the Privacy Policy" on the relevant screens in the Application.
3.2. Use of the Application signifies the User's consent to the collection and processing of information from Connected Chats in accordance with the Privacy Policy (see clauses 4.2-4.4).
3.3. In the event that the User does not agree with the terms of the Privacy Policy, they are obliged to immediately leave the Application and not start/cease the Use of the Application.
## 4. Data Collection and Processing
4.1. To provide the User with access to the Application, the User must provide the Developer with access to important information about themselves.
4.2. Personal Data Collected by the Application
4.2.1. The Application automatically collects the following data of Users, which may be defined as Personal Data:
a) Data provided by Telegram via API: user name (Name, including first_name and last_name), pseudonym (Username), user identifier (ID), profile image identifier (used to display an avatar without saving copies of files on the Developer's servers), Telegram client language settings, as well as Telegram Stars transaction data (for the Administrator only).
b) Data on the User's interaction with the Application servers (technical data): IP address from which the request is made, date and time the request was received by the Application server, requested URL, HTTP response code of the Application server, response size in bytes, User-Agent (information about the browser and operating system of the client), Referrer (URL of the page from which the request was made, if available).
4.2.2. The Administrator provides:
- email address, if authentication in the Application is performed using it.
4.2.3. The Administrator in the Admin Panel can specify data for each participant of the Connected Chat, which may be defined as Personal Data:
- surname, first name, patronymic;
- contact phone number;
- email address;
- information about the place of work (name of the organization, structural unit, position and (or) functional role).
The Developer is not responsible for the correctness and accuracy of the specified data, but as the Operator ensures the legality of its processing. The Administrator is obliged to ensure the existence of legal grounds for the provision of personal data of Users in accordance with applicable legislation (in the case of specifying real data).
The provision of specified data about a User in the Application, which may be defined as Personal Data, to other Users is carried out only for Users who have a common Connected Chat. By accepting this Privacy Policy, the User consents to such provision of their data. If necessary, the user may contact the Administrator to delete or change the above data.
4.2.4. Users, when contacting the Developer (for example, when requesting technical support for the Application), are entitled to provide any following data, which may be defined as Personal Data:
- surname, first name, patronymic;
- contact phone number;
- email address;
- information about the place of work (name of the organization, structural unit, position and (or) functional role).
4.3. When creating and maintaining an http connection, the Application uses HttpOnly cookie files, which are inaccessible from JavaScript via Document.cookie API properties and are used to reduce the risk of XSS (Cross-Site Scripting). Other cookie files are not set or used.
4.4. The Application, with the help of the Bot, monitors events in Connected Chats (such as adding/changing/deleting messages, adding/deleting files, etc.), but only on condition that the Bot is granted Administrator rights to access messages in Connected Chats.
4.5. The Application stores data that Users enter in the Application, including:
- project data (name, description, logo, etc.),
- company data (name, address, contact phone, website, etc.),
- data on tasks and meetings (description, date and time, etc.).
4.6. The Developer does not store or analyze correspondence from Connected Chats on its own computing facilities (servers).
4.7. The Developer does not store files from chats, tasks, and meetings on its own computing facilities (servers). Storage is carried out within Telegram or on third-party cloud storage services connected by the Administrator (Yandex Disk or Google Drive).
The responsibility for choosing a third-party storage service, complying with its terms of use and privacy policy, as well as for the existence of legal grounds for transferring data to such services, lies entirely with the Administrator. The Developer is not a storage operator in relation to these third-party services and is not responsible for their availability, data safety, or information security incidents on the part of cloud service providers.
When the Administrator connects third-party storage services (Yandex Disk or Google Drive), the Application's interaction with these services is carried out exclusively through the API of the respective services. The Developer does not request, collect, or store authorization data of these services. Authorization in such services occurs on the side of the respective providers.
4.8. The Application does not collect any additional information on the User's side that can be defined as Personal Data, except for that specified in clause 4.2, and does not perform an analysis of information that is available to it in chats.
## 5. Purposes and Terms of Data Processing
5.1. Data collection is carried out for the following purposes:
- Identification and authentication of Users in the Application (clauses 4.2.1.a and 4.2.2).
- Provision of technical support and processing of inquiries (clauses 4.2.1, 4.2.2 and 4.2.4).
- Sending system notifications to the Administrator (clauses 4.2.1.a and 4.2.2).
- Accounting and confirmation of payment transactions via Telegram Stars (clause 4.2.1.a).
- Formation of an address book of contacts within Connected Chats (clauses 4.2.1.a and 4.2.3).
- Ensuring the correct operation of the Application's functionality (clauses 4.2 and 4.4).
- Implementation of technical measures aimed at preventing technical failures, identifying errors, and ensuring the information security of the Application (clauses 4.2.1.b and 4.3).
5.2. The Developer undertakes to collect and use User data only for the above purposes, except for cases when the collection and use of data is necessary for other purposes compatible with the original purpose of data collection, or when provided for by the legislation of the Russian Federation. If the Developer needs to use User data for other purposes not mentioned above, the Developer has the right to notify the User by updating this Privacy Policy.
5.3. The processing of personal data of Users is carried out by the Developer using automation tools.
5.4. Terms of data processing and storage. The Developer processes Personal Data during the term of the Terms of Use.
5.5. The Developer has the right to continue storing data after the termination of the Terms of Use or withdrawal of consent in the following cases:
- For 5 (five) years in relation to transaction information (according to the tax legislation of the Russian Federation).
- For 3 (three) years (general statute of limitations) to ensure the possibility of protecting the Developer's interests in court.
5.6. Due to technical characteristics, data may be stored in encrypted backup copies of systems for up to 6 (six) months after its actual deletion from active databases. Such copies are used only for disaster recovery.
## 6. Data Protection
6.1. The Developer has implemented a series of technical, organizational, and administrative measures to ensure the confidentiality, integrity, availability, and inviolability and protection of your data (including PData) from loss, theft, unauthorized access, improper use, modification, or destruction.
6.2. These measures include, among other things, the implementation of modern security technologies: Secure Sockets Layered (SSL) technology to ensure full encryption of User data and its secure transmission over the Internet.
6.3. Only authorized personnel of the Developer have access to Users' Personal Data, and this personnel is obliged to treat Personal Data as confidential. Developer's Representatives do not gain access to User data (including personal data). Security measures may be periodically reviewed in accordance with legal and technical changes.
## 7. Data Transfer
7.1. The Developer does not transfer data received from Users (including technical metrics, project data, and other information) to third parties for marketing, advertising, or other commercial purposes. Data transfer is carried out exclusively to the extent necessary to ensure the functionality of the Application: to the Telegram messenger and cloud storage services (according to clause 4.7) initiated by the Administrator.
7.2. The Developer does not transfer personal data received from Users to third parties, except in cases of providing data to courts and (or) state bodies and (or) law enforcement agencies in cases when required by the laws and regulations of the Russian Federation.
7.3. The Developer guarantees to the User that it will not sell, exchange, or transfer your data (including PData) to third parties without your explicit consent.
7.4. All Application servers are located on the territory of the Russian Federation. Cross-border transfer of personal data is not carried out.
## 8. User Rights
8.1. The main rights of the User as a subject of Personal Data include:
- **Right to access Personal Data.** The User can request the Developer to provide them with a copy of their Personal Data to which the Developer has access. The Developer provides information to the User within 10 (ten) working days from the moment the request is received. This period may be extended by no more than 5 (five) working days in case the Developer sends a motivated notification to the User about the reasons for the extension.
- **Right to correct Personal Data.** The User can demand the Developer to correct or update any of their Personal Data. The User can do this using the corresponding functionality of the Application, by requesting the Administrator, or by contacting the Developer directly. The Developer reserves the right to refuse personal assistance in cases where the correction of Personal Data is available through the functionality of the Application or with the help of the Administrator.
- **Right to delete Personal Data.** The User can demand the Developer to delete their Personal Data, subject to applicable legislation. In some cases, the Application will automatically delete Personal Data upon closing the Account in the Application. If the User closes their Account, the Developer will not use their Personal Data for any further purposes, nor will it transfer them to third parties, except as provided by law. The Developer may be unable to fulfill the User's request for deletion due to legal obligations, which will be communicated to the User if there are appropriate grounds (for example, if processing is necessary to achieve purposes provided for by law, for the execution of a judicial act, for the exercise of rights and legitimate interests of the Developer or third parties).
- **Right to withdraw consent.** To the extent that the processing of the User's Personal Data is based solely on their consent, the User can withdraw their consent at any time. This will not affect the lawfulness of any processing that was carried out before the withdrawal. Any processing actions not based on the User's consent will remain unaffected.
8.2. None of the rights are absolute, which means that they generally must be weighed against the Developer's own legal obligations, as well as its legitimate interests and the interests of third parties. If a decision is made to reject the User's request, the Developer will inform them of this along with the reasons for such a decision.
## 9. Data Storage
9.1. The Developer stores User data (including PData) for no longer than necessary for the purpose of its collection or processing (with subsequent deletion).
9.2. As a rule, the Developer stores data (including PData) throughout the lifetime of the Administrator Account.
9.3. In cases provided for by applicable law, Personal Data may be stored after the closure of the Administrator Account for the period established by such laws.
9.4. The Developer may store User data (including PData) for a longer period if required by relevant laws and regulations. The Developer may retain some User data (including PData) after the closure of the Administrator Account to prevent fraud, ensuring that persons attempting to commit fraud cannot avoid detection simply by closing an account and opening a new one, as well as to fulfill the Developer's legal obligations.
## 10. Changes to the Privacy Policy
10.1. This Privacy Policy may be revised, updated, and (or) changed at any time without prior notice at the Developer's discretion. If such changes are made, the update date of this Privacy Policy will be displayed on the first page of the Privacy Policy.
10.2. The User is advised to independently and regularly monitor changes to the Privacy Policy by familiarizing themselves with the current version of the Privacy Policy on the Website or in the Application.
10.3. After the publication of the updated version of the Privacy Policy, further use of the Application is considered acceptance of the terms of the updated Privacy Policy.
## 11. Other Provisions
11.1. If any provisions of this Privacy Policy remain unclear, the Developer is ready to clarify its provisions. To do this, contact the Developer at the email address [support@tgcrew.ru](mailto:support@tgcrew.ru).
11.2. The User can use the contact details provided in section 12 for any reason provided for by this Policy.
## 12. Contact Information and Details of the Developer
Individual Entrepreneur Martynshkin Alexey Alexandrovich
Legal address: 111394, Russian Federation, Moscow, Perovskaya street, house 66, building 3, apartment 187
OGRNIP 318774600262084
INN 366316608346
Phone: +7 (916) 439-04-25
Email: [info@tgcrew.ru](mailto:info@tgcrew.ru)

View File

@@ -0,0 +1,187 @@
###### Версия 1.05 от 15.04.2026
В настоящей Политике конфиденциальности Разработчик предоставляет информацию о пределах сбора данных (в том числе персональных) Пользователей в Приложении, объясняет причины их сбора и способы их использования.
Актуальные версии Пользовательского соглашения и Политики конфиденциальности доступны внутри интерфейса Приложения. Информация, размещенная на Сайте, носит справочный характер. В случае расхождений между текстом на Сайте и в Приложении, юридическую силу имеет версия, размещенная в Приложении.
## 1. Термины и определения
1.1. **Бот** -- аккаунт с именем @tgCrewBot и адресом [https://t.me/tgCrewBot](https://t.me/tgCrewBot) в мессенджере Telegram, управляемый программно Разработчиком через API (Application Programming Interface, программный интерфейс приложений). Бот предоставляет доступ к Приложению и может использоваться для базового взаимодействия из текстовой строки (inline-mode).
1.2. **Приложение** -- мини-приложение tgCrew, работающее в среде мессенджера Telegram как часть экосистемы Telegram Mini Apps (TMA) и доступное через взаимодействие с Ботом. Хотя Приложение использует платформу Telegram для своего функционирования и распространения, оно разработано и предоставляется исключительно Разработчиком. Приложение не является продуктом компании-разработчика мессенджера Telegram, не поддерживается ею, не одобрено ею и никак не связано с ней юридически или организационно. Функционал Приложения доступен только после принятия Пользовательского соглашения и Политики конфиденциальности.
1.3. **Сайт** -- веб-сайт, расположенный по адресу: [https://tgcrew.ru](https://tgcrew.ru), на котором размещается информация о Приложении и его документация.
1.4. **Пользовательское соглашение** -- настоящий документ, актуальная (текущая) версия которого размещается в Приложении и на Сайте по ссылке [https://tgcrew.ru/terms-of-use](https://tgcrew.ru/terms-of-use). Договорные отношения между Разработчиком и Пользователем возникают только после принятия Пользовательского соглашения внутри Приложения.
1.5. **Политика конфиденциальности** -- документ, регулирующий порядок сбора, хранения и обработки данных (в том числе персональных) Пользователя, введенных им в ходе процедуры регистрации, использования Приложения, а также иных данных. Является неотъемлемым приложением к Пользовательскому соглашению. Актуальная (текущая) версия Политики конфиденциальности размещается в Приложении и на Сайте по ссылке [https://tgcrew.ru/privacy-policy](https://tgcrew.ru/privacy-policy). Согласие на обработку данных в рамках Политики конфиденциальности предоставляется Пользователем внутри Приложения.
1.6. **Разработчик** -- индивидуальный предприниматель Мартышкин Алексей Александрович (ИП Мартышкин А.А.), ОГРНИП 318774600262084, ИНН 366316608346 (Российская Федерация).
1.7. **Пользователь** -- физическое лицо, индивидуальный предприниматель, юридическое лицо или их уполномоченный представитель, принявшее условия Пользовательского соглашения и Политики конфиденциальности путем их явного подтверждения внутри интерфейса Приложения.
1.8. **Администратор** -- Пользователь Приложения, который осуществляет управление Приложением с помощью Панели администратора.
1.9. **Учетная запись Администратора** -- учетная запись, с помощью которой Администратор осуществляет аутентификацию для доступа к Панели администратора.
1.10. **Участник чата** -- участник Подключенного чата, который может не являться Пользователем Приложения.
1.11. **Панель администратора** -- интерфейс Приложения для управления Приложением, в том числе осуществления следующих функций:
- подключение чатов к Приложению (см. п. 1.12 Подключенный чат);
- внесение дополнительных информационных данных для Пользователей;
- контроль оплаты Лицензионного вознаграждения Разработчику за использование Приложения.
1.12. **Подключенный чат** (к Приложению) -- чат в Telegram, в который добавлен Бот с необходимыми правами доступа. В Приложении доступна информация только из Подключенных чатов.
1.13. **Использование Приложения** -- совершение Пользователем действий по просмотру и (или) использованию доступного функционала Приложения посредством воспроизводимых онлайн-интерфейсов на экране устройства Пользователя.
1.14. **Представители Разработчика** -- круг лиц, привлекаемых Разработчиком в рамках разработки и поддержки Приложения, действующие от имени и (или) по поручению Разработчика.
1.15. **Персональные данные (или ПДн)** -- любая информация, относящаяся к прямо или косвенно определенному или определяемому физическому лицу (субъекту персональных данных) (согласно № 152-ФЗ, Глава 1, Статья 3, п. 1).
1.16. **Обработка персональных данных** -- любое действие (операция) или совокупность действий (операций), совершаемых с использованием средств автоматизации или без использования таких средств с персональными данными, включая сбор, запись, систематизацию, накопление, хранение, уточнение (обновление, изменение), извлечение, использование, передачу (распространение, предоставление, доступ), обезличивание, блокирование, удаление, уничтожение персональных данных (согласно № 152-ФЗ, Глава 1, Статья 3, п. 3).
1.17. **Оператор** -- государственный орган, муниципальный орган, юридическое или физическое лицо, самостоятельно или совместно с другими лицами организующие и (или) осуществляющие обработку персональных данных, а также определяющие цели обработки персональных данных, состав персональных данных, подлежащих обработке, действия (операции), совершаемые с персональными данными (согласно № 152-ФЗ, Глава 1, Статья 3, п. 2).
1.18. **Автоматизированная обработка персональных данных** -- обработка персональных данных с помощью средств вычислительной техники (согласно № 152-ФЗ, Глава 1, Статья 3, п. 4).
1.19. **Предоставление персональных данных** -- действия, направленные на раскрытие персональных данных определенному лицу или определенному кругу лиц (согласно № 152-ФЗ, Глава 1, Статья 3, п. 6).
1.20. **Трансграничная передача персональных данных** -- передача персональных данных на территорию иностранного государства органу власти иностранного государства, иностранному физическому лицу или иностранному юридическому лицу (согласно № 152-ФЗ, Глава 1, Статья 3, п. 11).
1.21. **Уничтожение персональных данных** -- действия, в результате которых становится невозможным восстановить содержание персональных данных в информационной системе персональных данных и (или) в результате которых уничтожаются материальные носители персональных данных (согласно № 152-ФЗ, Глава 1, Статья 3, п. 8).
## 2. Общие положения
2.1. Настоящая Политика конфиденциальности регулирует исключительно отношения между Разработчиком и Пользователем. Она не может регулировать отношения между мессенджером Telegram (далее - Telegram) и его пользователями и не заменяет Политику конфиденциальности Telegram.
2.2. Настоящая Политика конфиденциальности составлена согласно требованиям:
- Федерального закона от 27.07.2006 № 152-ФЗ «О персональных данных».
- Требованиям раздела «4. Privacy» документа «Telegram Bot Platform Developer Terms of Service» от компании Telegram FZ-LLC (разработчик мессенджера Telegram).
2.3. Разработчик выступает в роли Оператора при Обработке персональных данных Пользователей Приложения.
## 3. Прием условий настоящей Политики конфиденциальности
3.1. Свидетельством полного и безоговорочного принятия условий настоящей Политики конфиденциальности (акцептом) является осуществление процедуры принятия Политики конфиденциальности путем активации (проставления отметки) в соответствующем интерактивном элементе (поле для отметки) интерфейса Приложения рядом с текстом: «Я даю Согласие на обработку своих персональных данных и принимаю условия Политики конфиденциальности» на соответствующих экранах в Приложении.
3.2. Использование Приложения означает согласие Пользователя на сбор и обработку информации из Подключенных чатов в соответствии с Политикой конфиденциальности (см. пп. 4.2-4.4).
3.3. В случае, если Пользователь не согласен с условиями Политики конфиденциальности, он обязан немедленно покинуть Приложение и не начинать/прекратить Использование Приложения.
## 4. Сбор и обработка данных
4.1. Чтобы предоставить Пользователю доступ к Приложению, ему необходимо предоставить Разработчику доступ к важной информации о себе.
4.2. Персональные данные, собираемые Приложением
4.2.1. Приложение в автоматическом режиме собирает следующие данные Пользователей, которые могут быть определены как Персональные данные:
а) Данные предоставляемые Telegram через API: имя пользователя (Name, включающее в себя first_name и last_name), псевдоним (Username), идентификатор пользователя (ID), идентификатор изображения профиля (используется для отображения аватара без сохранения копий файлов на серверах Разработчика), языковые настройки клиента Telegram, а также данные транзакций Telegram Stars (только для Администратора).
б) Данные о взаимодействии Пользователя с серверами Приложения (технические данные): IP-адрес с которого осуществляется запрос, дата и время получения запроса сервером Приложения, запрошенный URL, HTTP-код ответа сервера Приложения, размер ответа в байтах, User-Agent (информация о браузере и операционной системе клиента), Referrer (URL страницы, с которой был сделан запрос, если доступно).
4.2.2. Администратор предоставляет:
- адрес электронной почты, если используется аутентификация в Приложении с ее использованием.
4.2.3. Администратор в Панели администратора может указать данные для каждого участника Подключенного чата, которые могут быть определены как Персональные данные:
- фамилия, имя, отчество;
- контактный телефон;
- адрес электронной почты;
- сведения о месте работы (наименование организации, структурное подразделение, должность и (или) функциональная роль).
Разработчик не несет ответственности за корректность и точность указанных данных, но как Оператор обеспечивает законность их обработки. Администратор обязан обеспечить наличие правовых оснований для предоставления персональных данных Пользователей в соответствии с применимым законодательством (в случае указания реальных данных).
Предоставление указанных данных о Пользователе в Приложении, которые могут быть определены как Персональные данные, другим Пользователям, осуществляется только для Пользователей, имеющих общий Подключенный чат. Принимая данную Политику конфиденциальности, Пользователь согласен с таким предоставлением его данных. При необходимости, пользователь может обратиться к Администратору для удаления или изменения вышеуказанных данных.
4.2.4. Пользователи при обращении к Разработчику (например, при запросе в техническую поддержку Приложения) вправе предоставить любые следующие данные, которые могут быть определены как Персональные данные:
- фамилия, имя, отчество;
- контактный телефон;
- адрес электронной почты;
- сведения о месте работы (наименование организации, структурное подразделение, должность и (или) функциональная роль).
4.3. Приложение при создании и поддержании http-соединения использует HttpOnly cookie-файлы, которые недоступны из JavaScript через свойства Document.cookie API и используются для снижения риска XSS (Cross-Site Scripting - «межсайтовый скриптинг»). Другие cookie-файлы не устанавливаются и не используются.
4.4. Приложение с помощью Бота отслеживает события в Подключенных чатах (такие как добавление/изменение/удаление сообщений, добавление/удаление файлов и т.п.), но только при условии - Боту предоставлены права Администратора на доступ к сообщениям в Подключенных чатах.
4.5. Приложение хранит данные, которые Пользователи вводят в Приложении, в том числе:
- данные проектов (имя, описание, логотип и т.п.),
- данные компаний (название, адрес, контактный телефон, веб-сайт и т.п.),
- данные задач и совещаний (описание, дата и время и т.п.).
4.6. Разработчик не хранит и не анализирует на собственных вычислительных мощностях (серверах) переписку из Подключенных чатов.
4.7. Разработчик не хранит на собственных вычислительных мощностях (серверах) файлы из чатов, задач и совещаний. Хранение осуществляется внутри Telegram либо на подключаемых Администратором сторонних сервисах облачного хранения (Яндекс Диск или Google Drive).
Ответственность за выбор стороннего сервиса хранения, соблюдение его условий использования и политики конфиденциальности, а также за наличие правовых оснований для передачи данных в такие сервисы, целиком лежит на Администраторе. Разработчик не является оператором хранения в отношении указанных сторонних сервисов и не несет ответственности за их доступность, сохранность данных или инциденты информационной безопасности на стороне провайдеров облачных услуг.
При подключении Администратором сторонних сервисов хранения (Яндекс Диск или Google Drive), взаимодействие Приложения с указанными сервисами осуществляется исключительно через API соответствующих сервисов. Разработчик не запрашивает, не собирает и не хранит авторизационные данные этих сервисов. Авторизация в таких сервисах происходит на стороне соответствующих провайдеров.
4.8. Приложение не собирает на стороне Пользователя никакую дополнительную информацию, которая может быть определена как Персональные данные, кроме той, что указана в п. 4.2, а также не осуществляет анализ информации, которая доступна ему в чатах.
## 5. Цели и сроки обработки данных
5.1. Сбор данных осуществляется со следующими целями:
- Идентификация и аутентификация Пользователей в Приложении (пп. 4.2.1.а и 4.2.2).
- Предоставление технической поддержки и обработка обращений (пп. 4.2.1, 4.2.2 и 4.2.4).
- Отправка системных уведомлений Администратору (пп. 4.2.1.а и 4.2.2).
- Учет и подтверждение платежных транзакций через Telegram Stars (пп. 4.2.1.а).
- Формирование адресной книги контактов в рамках Подключенных чатов (пп. 4.2.1.а и 4.2.3).
- Обеспечение корректной работы функционала Приложения (пп. 4.2 и 4.4).
- Осуществление технических мер, направленных на профилактику технических сбоев, выявление ошибок и обеспечение информационной безопасности Приложения (пп. 4.2.1.б и 4.3).
5.2. Разработчик обязуется собирать и использовать данные Пользователя только для вышеуказанных целей, за исключением случаев, когда сбор и использование данных необходим для других целей, совместимых с первоначальной целью сбора данных, или когда это предусмотрено законодательством Российской Федерации. Если Разработчику потребуется использовать данные Пользователя для других целей, не упомянутых выше, Разработчик вправе уведомить Пользователя путем обновления настоящей Политики конфиденциальности.
5.3. Обработка персональных данных Пользователей осуществляется Разработчиком с использованием средств автоматизации.
5.4. Сроки обработки и хранения данных. Разработчик осуществляет обработку Персональных данных в течение срока действия Пользовательского соглашения.
5.5. Разработчик вправе продолжить хранение данных после прекращения действия Пользовательского соглашения или отзыва согласия в следующих случаях:
- В течение 5 (пяти) лет в отношении сведений о транзакциях (согласно налоговому законодательству РФ).
- В течение 3 (трех) лет (общий срок исковой давности) для обеспечения возможности защиты интересов Разработчика в суде.
5.6. В силу технических особенностей, данные могут сохраняться в зашифрованных резервных копиях систем до 6 (шести) месяцев после их фактического удаления из активных баз данных. Такие копии используются только для аварийного восстановления.
## 6. Защита данных
6.1. Разработчик внедрил ряд технических, организационных и административных мер для обеспечения конфиденциальности, целостности, доступности и неприкосновенности и защиты Ваших данных (в том числе ПДн) от потери, кражи, несанкционированного доступа, неправомерного использования, изменения или уничтожения.
6.2. Эти меры включают, помимо прочего, внедрение современных технологий безопасности: технологию Secure Sockets Layered (SSL) для обеспечения полного шифрования данных Пользователя и их безопасной передачи через Интернет.
6.3. Только уполномоченный персонал Разработчика имеет доступ к Персональным данным Пользователей, и этот персонал обязан относиться к Персональным данным как к конфиденциальным. Представители Разработчика не получают доступа к данным Пользователей (в том числе персональным). Меры безопасности могут периодически пересматриваться в соответствии с юридическими и техническими изменениями.
## 7. Передача данных
7.1. Разработчик не осуществляет передачу данных, полученных от Пользователей (включая технические метрики, данные проектов и иную информацию), третьим сторонам для маркетинговых, рекламных или иных коммерческих целей. Передача данных осуществляется исключительно в объеме, необходимом для обеспечения функциональности Приложения: мессенджеру Telegram и сервисам облачного хранения (согласно п.4.7), инициируемым Администратором.
7.2. Разработчик не осуществляет передачу персональных данных, полученных от Пользователей, третьим лицам, кроме случаев предоставления данных судам и(или) государственным органам и(или) правоохранительным органам в случаях, когда это требуется законами и нормативными актами Российской Федерации.
7.3. Разработчик гарантирует Пользователю, что не будет продавать, обменивать или передавать ваши данные (в том числе ПДн) третьим лицам без вашего явного согласия.
7.4. Все сервера Приложения находятся на территории Российской Федерации. Трансграничная передача персональных данных не осуществляется.
## 8. Права пользователей
8.1. Основные права Пользователя как субъекта Персональных данных включают:
- **Право на доступ к Персональным данным.** Пользователь может запросить у Разработчика предоставление ему копии своих Персональных данных, к которым у Разработчика есть доступ. Разработчик предоставляет информацию Пользователю в течение 10 (десяти) рабочих дней с момента получения запроса. Этот срок может быть продлен не более чем на 5 (пять) рабочих дней в случае направления Разработчиком в адрес Пользователя мотивированного уведомления о причинах продления.
- **Право на исправление Персональных данных.** Пользователь может потребовать от Разработчика исправить или обновить любые свои Персональные данные. Пользователь может сделать это с помощью соответствующей функциональности Приложения, запросив Администратора или связавшись с Разработчиком напрямую. Разработчик оставляет за собой право отказывать в персональной помощи в случаях, когда исправление Персональных данных доступно через функциональность Приложения или с помощью Администратора.
- **Право на удаление Персональных данных.** Пользователь может потребовать от Разработчика удалить свои Персональные данные, с учетом применимого законодательства. В некоторых случаях Приложение автоматически удалит Персональные данные при закрытии Учетной записи в Приложении. Если Пользователь закрывает свою Учетную запись, Разработчик не будет использовать его Персональные данные для каких-либо дальнейших целей, а также передавать их третьим лицам, за исключением случаев, предусмотренных законом. Разработчик может быть лишен возможности выполнить запрос Пользователя на удаление в силу юридических обязательств, о которых будет сообщено Пользователю при наличии соответствующих оснований (например, если обработка необходима для достижения целей, предусмотренных законом, для исполнения судебного акта, для осуществления прав и законных интересов Разработчика или третьих лиц).
- **Право на отзыв согласия.** В той мере, в какой обработка Персональных данных Пользователя основана исключительно на его согласии, Пользователь может отозвать свое согласие в любое время. Это не повлияет на правомерность любой обработки, которая была осуществлена до отзыва. Любые действия по обработке, не основанные на согласии Пользователя, останутся незатронутыми.
8.2. Ни одно из прав не является абсолютным, что означает, что они, как правило, должны быть взвешены против собственных юридических обязательств Разработчика, а также его законных интересов и интересов третьих лиц. Если будет принято решение отклонить запрос Пользователя, то Разработчик проинформирует его об этом вместе с причинами такого решения.
## 9. Хранение данных
9.1. Разработчик хранит данные (в том числе ПДн) Пользователя не дольше, чем это необходимо для цели их сбора или обработки (с последующим удалением).
9.2. Как правило, Разработчик хранит данные (в том числе ПДн) на протяжении всего срока существования Учетной записи Администратора.
9.3. В случаях, предусмотренных применимым законодательством, Персональные данные могут храниться после закрытия Учетной записи Администратора в течение периода, установленного такими законами.
9.4. Разработчик может хранить данные (в том числе ПДн) Пользователя в течение более длительного периода, если это требуется соответствующими законами и нормативными актами. Разработчик может сохранять некоторые данные (в том числе ПДн) Пользователя после закрытия Учетной записи Администратора для предотвращения мошенничества, обеспечивая, чтобы лица, пытающиеся совершить мошенничество, не могли избежать обнаружения, просто закрыв учетную запись и открыв новую, а также для выполнения юридических обязательств Разработчика.
## 10. Изменения в Политике конфиденциальности
10.1. Настоящая Политика конфиденциальности может быть пересмотрена, обновлена и(или) изменена в любое время без предварительного уведомления по усмотрению Разработчика. Если такие изменения будут внесены, дата обновления настоящей Политики конфиденциальности будет отображена на первой странице Политики конфиденциальности.
10.2. Пользователю рекомендуется самостоятельно и регулярно отслеживать изменения Политики конфиденциальности, путем ознакомления с актуальной версией Политики конфиденциальности на Сайте или в Приложении.
10.3. После публикации обновленной версии Политики конфиденциальности дальнейшее использование Приложения считается принятием условий обновленной Политики конфиденциальности.
## 11. Прочие положения
11.1. Если какие-либо положения настоящей Политики конфиденциальности остались неясными, Разработчик готов разъяснить ее положения. Для этого свяжитесь с Разработчиком по адресу электронной почты [support@tgcrew.ru](mailto:support@tgcrew.ru).
11.2. Пользователь может использовать контактные данные, приведенные в разделе 12, по любой причине, предусмотренной настоящей Политикой.
## 12. Контактная информация и реквизиты Разработчика
Индивидуальный предприниматель Мартышкин Алексей Александрович
Юридический адрес: 111394, Российская Федерация, город Москва, улица Перовская, дом 66, корпус 3, квартира 187
ОГРНИП 318774600262084
ИНН 366316608346
Телефон: +7 (916) 439-04-25
Электронная почта: [info@tgcrew.ru](mailto:info@tgcrew.ru)

View File

@@ -0,0 +1,75 @@
###### Version 1.05 dated April 15, 2026
This document is an English adaptation of «Положение о тарифных планах подписки» originally drafted in Russian. In the event of any disputes subject to resolution in courts of the Russian Federation, the Russian-language version shall prevail.
The text of this document is an integral part of the Terms of Use. All terms and definitions used in this Provision on subscription tariffs (hereinafter the "Provision") are adopted according to Section 1 of the Terms of Use.
## 1. General Principles
1.1. The License is provided under the terms of the Tariff selected by the Administrator.
1.2. All Tariffs provide identical functionality, except for restrictions on the number of supported (active) Connected Chats. Tariffs can be paid and/or free (not requiring payment).
1.3. Tariffs may be changed by the Developer no more than once every 30 (Thirty) calendar days. Changes in Tariffs do not apply to the already paid period of use of the Application. New Tariffs apply only to subsequent payment periods (access renewals).
1.4. The License is considered active until the expiration date specified in the Application interface. If no expiration date is specified, the License is considered to have the maximum duration (according to clause 1.6).
1.5. The term "day" in the Application refers to an interval of 24 hours.
1.6. The maximum allowable period from the current moment to the expiration date is 730 days (2 years).
1.7. Under "Subscription" in the Application is meant a combination of a selected Tariff and the number of days of the License.
## 2. Order of Access Provision
2.1. Upon first launch of the Application, the Administrator is automatically assigned a free Tariff.
2.2. To increase the number of supported Connected Chats, the Administrator must change the Tariff in the Admin Panel and pay the License Fee (for paid Tariffs).
2.3. The right to use the Application is considered granted to the Administrator for the period paid by them (or provided free of charge under the terms of the Tariff) from the moment the corresponding information about the License activation appears in the Application interface.
## 3. Financial Terms
3.1. The amount of the License Fee is determined in accordance with the Tariffs active at the time of payment, which are available in the Application interface.
3.2. All payments are made in the internal currency of the Telegram messenger — Telegram Stars.
3.3. Payment for the License (Subscription renewal) is carried out through the tools and interface provided by the Telegram messenger. The Developer does not collect or store the User's bank card data or other payment information, as the payment process is entirely on the side of Telegram.
3.4. Changing the Tariff and Subscription
3.4.1. The Administrator can change the current Tariff to another one at any time.
3.4.2. Changing the Tariff with an increase in the number of Connected Chats (Upgrade) requires payment for at least 1 (One) day of the License under the new Tariff.
3.4.3. When performing an Upgrade, the remaining unused days of the previous Tariff are converted into additional days of the new Tariff according to the cost ratio of the Tariffs.
3.4.4. Changing the Tariff with a decrease in the number of Connected Chats (Downgrade) is possible only if the number of currently active Connected Chats does not exceed the limit of the new Tariff.
3.4.5. When performing a Downgrade, the current number of days of the License is recalculated towards an increase according to the cost ratio of the Tariffs.
3.4.6. Conversion and recalculation of the number of days occur automatically in the Application at the time of changing the Tariff.
3.4.7. The cost of one day under the Tariff is calculated by dividing the cost of the Tariff for 30 days by 30.
3.4.8. When calculating the cost of one day, rounding is performed to the second decimal place (0.01 Telegram Stars) according to mathematical rules.
3.4.9. The final number of License days after recalculation is always rounded down to the nearest whole integer.
3.4.10. Fractional residues of Telegram Stars arising during calculations and rounding (clause 3.4.9) are not returned to the Administrator and are recognized as the Developer's expenses for processing the operation.
3.4.11. Transition to a free Tariff is possible at any time, provided that the number of active Connected Chats corresponds to the limits of the free Tariff. In this case, the remaining paid days of the License are canceled without automatic refund (see section 3.5).
3.5. Refund Policy
3.5.1. The License Fee for the granted right to use the Application is not subject to refund after the start of the period of use of the Application.
3.5.2. Refund of the License Fee is made for full unused days of the License in the following cases:
- upon unilateral refusal of the Licensee to use the Application;
- upon transition to a free Tariff (clause 3.4.11);
- upon the Licensor's decision to terminate support for the Application or its liquidation.
3.5.3. In the event of termination of the Application's operation at the initiative of the Licensor, the Licensor shall notify the Licensee at least 30 (Thirty) calendar days in advance via the Application interface or by email.
3.5.4. The refund amount is calculated based on the monetary equivalent of the unused balance on the date of processing the request by the support service according to the rules set forth in clauses 3.4.7-3.4.9 of this Provision.
3.5.5. To carry out a refund, the Licensee sends the Licensor an official application (a scanned copy on the organization's letterhead with signature and seal) to the email address [support@tgcrew.ru](mailto:support@tgcrew.ru) with the mandatory indication of the technical identifier of the Administrator's account in the Application.
3.5.6. The refund of funds is carried out by the Licensor within 10 (Ten) working days from the moment of confirmation of receipt of the application using the Licensee's details from which the payment was made.

View File

@@ -0,0 +1,177 @@
###### Версия 1.05 от 15.04.2026
Текст настоящего документа является неотъемлемой частью Пользовательского соглашения. Все термины и определения, используемые в данном Положении о Тарифных планах (далее «Положение»), принимаются согласно разделу 1 Пользовательского соглашения.
## 1. Общие принципы
1.1. Лицензия предоставляется на условиях выбранного Администратором Тарифа.
1.2. Все Тарифы обеспечивают идентичный функционал, за исключением ограничений на количество поддерживаемых (активных) Подключенных чатов. Тарифы могут быть платными и/или бесплатными (не требующими оплаты).
1.3. Тарифы могут изменяться Разработчиком не чаще одного раза в 30 (Тридцать) календарных дней. Изменение Тарифов не распространяется на уже оплаченный период использования Приложения. Новые Тарифы применяются только к последующим периодам оплаты (продлениям доступа).
1.4. Лицензия считается активной до наступления даты окончания, указанной в интерфейсе Приложения. Если дата окончания не указана, то Лицензия считается максимального срока действия (согласно п. 1.6).
1.5. Под понятием «день» в Приложении принимается интервал длительностью 24 часа.
1.6. Максимально допустимый срок от текущего момента до даты окончания составляет 730 дней (2 года).
1.7. Под Подпиской в Приложении подразумевается комбинация выбранного Тарифа и срока действия Лицензии.
1.8. Разработчик вправе в одностороннем порядке продлить действие Подписки без взимания дополнительной платы (в рамках маркетинговых акций или по иным причинам).
1.9. Лицензия считается предоставленной и активной в течение всего оплаченного периода, вне зависимости от того, используют ли Участники чатов и Администратор Приложение или нет.
1.10. При использовании Приложения идентификация Администратора осуществляется по его техническому идентификатору, доступному в Приложении (см. раздел Настройки > Подписка). Технический идентификатор Администратора Приложения автоматически прикрепляется в Приложении к Telegram ID или адресу электронной почты (только один вариант).
1.11. По вопросам предположительно некорректных или ошибочных списаний Администратор должен незамедлительно сообщить Разработчику по электронной почте [support@tgcrew.ru](mailto:support@tgcrew.ru). Разработчик обязуется рассмотреть обращение в разумный срок, обычно не превышающий 10 (Десять) рабочих дней.
1.12. При прекращении действия подписки Разработчик вправе приостановить доступ к функционалу Приложения. Данные, созданные в период отсутствия активной подписки, могут не отображаться в Приложении до момента продления подписки.
1.13. Уведомление о необходимости продления Подписки (только для платных Тарифов) направляется Администратору через бота или по электронной почте (в зависимости от способа аутентификации) не позднее чем за 14 календарных дней до истечения её срока действия.
1.14. Все расчеты производятся с применением округлений. Погрешность до 3 (Трех) дополнительных дней признается Администратором и Разработчиком допустимым техническим допуском, претензии по которому не предъявляются.
## 2. Расчеты с физическими лицами
2.1. Способы и условия оплаты
2.1.1. Стоимость Лицензии определяется Тарифами, размещенными в интерфейсе Приложения. Разработчик вправе изменять стоимость Тарифов в одностороннем порядке, что не влияет на уже оплаченные и активные Подписки.
2.1.2. Физические лица осуществляют оплату Лицензии исключительно через интерфейс Приложения с использованием внутренней валюты (цифровые единицы) мессенджера Telegram (Telegram Stars).
2.1.3. Порядок приобретения и использования Telegram Stars регулируется правилами платформы Telegram. Разработчик не контролирует и не несет ответственности за работу платежной системы Telegram Stars. Разработчик не предоставляет услуги хранения средств. Telegram Stars, переведенные Разработчику, не являются банковским вкладом или иным финансовым инструментом и предназначены исключительно для оплаты вознаграждения Разработчику в соответствии с Тарифом.
2.2. Порядок активации
2.2.1. Лицензия активируется автоматически в момент выбора Подписки (Тарифа и срока действия) Администратором. По умолчанию, Приложение применяет Тариф без оплаты.
2.2.2. Техническим подтверждением активации является указание выбранного Тарифа и соответствующей даты окончания в качестве текущих в интерфейсе Приложения.
2.2.3. Активация Подписки на условиях платного Тарифа производится в момент подтверждения успешной транзакции от Telegram в сторону Разработчика с необходимым количеством Telegram Stars.
2.2.4. С момента активации (установки) Подписки обязательства Разработчика по предоставлению Лицензии считаются исполненными в полном объеме.
2.3. Продление срока действия
2.3.1. Если при совершении транзакции в Telegram Stars выбранный Тариф совпадает с текущим, то такое действие считается продлением Подписки. В противном случае действие расценивается как смена Подписки (согласно п. 2.4).
2.3.2. Продление осуществляется путем сдвига даты окончания текущего периода на количество дней, соответствующих транзакции. Неиспользованные дни текущего периода сохраняются и суммируются с новым периодом. Максимальный срок, на который может быть продлена Подписка, ограничен максимально допустимым сроком, установленным в п. 1.6.
2.3.3. При продлении Подписки применяется скидка, соответствующая выбранному периоду продления.
2.4. Смена Тарифа
2.4.1. Администратор Приложения может изменять Тариф не ранее чем через 1 (Один) день с момента предыдущего изменения Тарифа.
2.4.2. Переход на новый Тариф производится в автоматическом режиме (за исключением случая, указанного в п. 2.4.10). При переходе с бесплатного Тарифа активация платного Тарифа происходит в момент подтверждения транзакции от Telegram в сторону Разработчика с необходимым количеством Telegram Stars. Смена одного платного Тарифа на другой и пересчет срока действия происходят мгновенно в момент выбора в интерфейсе Приложения.
2.4.3. При смене Тарифа ограничения нового Тарифа (максимальное количество чатов) применяются немедленно.
2.4.4. Переход на Тариф с меньшим количеством чатов возможен, только если количество текущих (активных) Подключенных чатов в Приложении не превышает ограничения нового Тарифа.
2.4.5. При смене Тарифа эквивалент неиспользованного периода текущей Подписки засчитывается в счёт нового периода в виде дополнительных дней согласно правилам расчета, изложенным в пп.2.4.62.4.8 настоящего Положения.
2.4.6. Для платных Тарифов базовая стоимость дня для целей перерасчета принимается согласно формуле:
**Базовая стоимость дня = (Базовая стоимость Тарифа / 30) * (100% - Скидка за период)**
2.4.7. Расчет количества дополнительных дней производится по формуле:
**Количество дополнительных дней = (Базовая стоимость дня на текущем Тарифе * Количество неиспользованных дней) / Базовая стоимость дня на новом Тарифе**
2.4.8. Размер скидки при расчете Базовой стоимости дня принимается:
- на текущем Тарифе: скидка за последний оплаченный период,
- на новом Тарифе: скидка за выбранный период.
2.4.9. При выявлении признаков злоупотребления механизмом смены Тарифов (например, частых переключений между Тарифами) Разработчик оставляет за собой право на приостановку действия аккаунта Администратора, отмены результатов перерасчета, а в особых случаях и полной блокировки без возврата Telegram Stars (согласно пп. 8.12-8.13 Пользовательского соглашения).
2.4.10. Переход с платного на бесплатный Тариф осуществляется только через обращение в службу поддержки Приложения с последующим ручным перерасчетом и возвратом средств (см. п. 2.6).
2.5. Использование промокодов
2.5.1. Промокоды предоставляются на количество Telegram Stars, которые конвертируются в дополнительные дни согласно действующему Тарифу. Базовая стоимость дня учитывает скидку за период в оплаченной подписке (при ее наличии).
2.5.2. На бесплатных Тарифах промокоды недоступны.
2.6. Возврат средств
2.6.1. Возврат вознаграждения, уплаченного в виде Telegram Stars, после активации Лицензии не производится, за исключением случаев:
- расторжения Пользовательского соглашения по инициативе Администратора (полный отказ от использования Приложения);
- принятия Разработчиком решения о прекращении поддержки Приложения или его ликвидации.
2.6.2. При принятии решения о ликвидации или прекращении поддержки Приложения, Разработчик уведомляет об этом Администратора не менее чем за 30 (Тридцать) календарных дней через интерфейс Приложения, через бота или по электронной почте.
2.6.3. При необходимости возврата средств Администратор должен уведомить Разработчика по электронной почте [support@tgcrew.ru](mailto:support@tgcrew.ru) с указанием технического идентификатора учетной записи Администратора в Приложении.
2.6.4. Возврат средств осуществляется Разработчиком в течение 30 (Тридцати) календарных дней с момента подтверждения Разработчиком размера возврата и его возможности, учитывая технический функционал Telegram.
2.6.5. Возврат средств осуществляется за вычетом фактически понесенных Разработчиком расходов, связанных с исполнением настоящего Пользовательского соглашения и осуществлением возврата (включая комиссии платежных систем, транзакционные издержки и банковские комиссии). Стороны признают, что при сумме остатка менее 300 (Трехсот) Telegram Stars размер фактически понесенных расходов на обработку возврата превышает сумму самого возврата, в связи с чем возврат сумм менее указанного порога признается Сторонами экономически нецелесообразным и не производится.
## 3. Расчеты с юридическими лицами и индивидуальными предпринимателями
3.1. Способы и условия оплаты
3.1.1. Положения раздела 3 применимы только для резидентов РФ.
3.1.2. Оплата Лицензионного вознаграждения юридическими лицами и индивидуальными предпринимателями (далее — «Лицензиат») осуществляется в безналичном порядке в рублях РФ на основании выставляемого Разработчиком (далее «Лицензиар») счета. Данный счет является офертой, а его оплата Лицензиатом признается полным и безоговорочным акцептом (принятием) условий такой оферты и заключением Лицензионного договора на условиях настоящего Положения и Пользовательского соглашения (далее — «Счет-договор»). Цена в Счете-договоре имеет приоритет над Тарифами в Приложении или на Сайте. Лицензиар вправе указать Тариф в Счете-договоре, который не приведен в Тарифах в Приложении или на Сайте.
3.1.3. Выставление Счета-договора производится Лицензиаром по запросу Лицензиата по электронной почте [support@tgcrew.ru](mailto:support@tgcrew.ru).
3.1.4. Оплата Счета-договора подтверждает, что лицо, принявшее условия Пользовательского соглашения в интерфейсе Приложения и получившее технический идентификатор Администратора, обладает всеми необходимыми полномочиями для совершения данных действий и заключения договора от имени Лицензиата.
3.1.5. Обязательства Лицензиата по оплате считаются исполненными в момент зачисления денежных средств на расчетный счет Разработчика в полном объеме.
3.1.6. Владельцем прав на использование Приложения признается Лицензиат, совершивший оплату на счет с указанием технического идентификатора Администратора.
3.2. Порядок активации
3.2.1. Лицензия активируется Лицензиаром в течение 1 (Одного) рабочего дня (по московскому времени) с момента фактического зачисления денежных средств на расчетный счет Лицензиара.
3.2.2. Техническим подтверждением активации является указание Тарифа (согласно Счету-договору) и соответствующей даты окончания в качестве текущих в интерфейсе Приложения.
3.2.3. Лицензиар предоставляет Лицензиату документы, подтверждающие передачу прав (акты приема-передачи прав или универсальные передаточные документы), в электронном виде (через системы электронного документооборота или путем направления скан-копии на электронную почту Лицензиата). По запросу Лицензиата Лицензиар направляет оригиналы документов на бумажном носителе посредством почтового отправления по адресу, указанному Лицензиатом.
3.2.4. Акт считается подписанным Лицензиатом (права считаются переданными в полном объеме и надлежащего качества), если в течение 5 (Пяти) рабочих дней с момента направления Лицензиаром электронной версии документа Лицензиату не поступило мотивированных письменных возражений.
3.2.5. С момента активации Лицензии обязательства Лицензиара по её предоставлению на оплаченный период считаются исполненными в полном объеме.
3.3. Продление срока действия
3.3.1. Если в Счете-договоре выбранный Тариф совпадает с текущим активным Тарифом Лицензиата, то такая оплата считается продлением Лицензии. В противном случае действие расценивается как смена Тарифа (согласно п. 3.4).
3.3.2. Продление осуществляется путем сдвига даты окончания текущего периода на количество дней, оплаченных по Счету-договору. Неиспользованные дни текущего периода сохраняются и суммируются с новым периодом. Максимальный срок, на который может быть продлена Лицензия, ограничен сроком, установленным в п. 1.6.
3.3.3. При продлении Лицензии применяется скидка (при её наличии), соответствующая выбранному периоду продления и зафиксированная в Счете-договоре.
3.4. Смена Тарифа
3.4.1. Лицензиат (Администратор Приложения) вправе изменять Тариф самостоятельно в интерфейсе Приложения не ранее чем через 1 (Один) день с момента предыдущего изменения Тарифа. Также Лицензиат может обратиться по электронной почте [support@tgcrew.ru](mailto:support@tgcrew.ru) для смены Тарифа.
3.4.2. Стороны признают, что самостоятельная смена Тарифа Лицензиатом является изменением количественных характеристик Лицензии за счет пропорционального изменения срока её действия. Такая смена не влечет за собой изменения общей стоимости Лицензионного вознаграждения, зафиксированной в Счете-договоре, и не требует оформления дополнительных документов.
3.4.3. Переход на новый Тариф производится в автоматическом режиме (за исключением случая, указанного в п.3.4.11). При переходе с бесплатного Тарифа на платный активация Тарифа производится Лицензиаром в соответствии с п. 3.2.1 настоящего Положения. Смена одного платного Тарифа на другой и пересчет срока действия происходят мгновенно в момент выбора Лицензиатом нового Тарифа в интерфейсе Приложения.
3.4.4. При смене Тарифа ограничения нового Тарифа (максимальное количество чатов) применяются немедленно.
3.4.5. Переход на Тариф с меньшим количеством чатов возможен, только если количество текущих (активных) Подключенных чатов в Приложении не превышает ограничения нового Тарифа.
3.4.6. При смене Тарифа эквивалент неиспользованного периода текущей Подписки засчитывается в счёт нового периода в виде дополнительных дней согласно правилам расчета, изложенным в пп. 3.4.7-3.4.9 настоящего Положения.
3.4.7. Для платных Тарифов базовая стоимость дня для целей перерасчета принимается согласно формуле:
**Базовая стоимость дня = (Базовая стоимость Тарифа / 30) * (100% - Скидка за период)**
3.4.8. Расчет количества дополнительных дней производится по формуле:
**Количество дополнительных дней = (Базовая стоимость дня на текущем Тарифе * Количество неиспользованных дней) / Базовая стоимость дня на новом Тарифе**
3.4.9. Размер скидки при расчете Базовой стоимости дня принимается:
- на текущем Тарифе: скидка за последний оплаченный период,
- на новом Тарифе: скидка за выбранный период.
3.4.10. При выявлении признаков злоупотребления механизмом смены Тарифов (например, частых переключений между Тарифами) Лицензиар оставляет за собой право на приостановку действия аккаунта Администратора, отмены результатов перерасчета, а в особых случаях и полной блокировки без возврата средств (согласно пп. 8.12-8.13 Пользовательского соглашения).
3.4.11. Переход с платного на бесплатный Тариф осуществляется только через обращение в службу поддержки Приложения с последующим ручным перерасчетом и возвратом средств (см. п. 3.5).
3.5. Возврат средств
3.5.1. Лицензиат вправе в любое время в одностороннем порядке отказаться от использования Приложения.
3.5.2. Возврат Лицензионного вознаграждения производится за полные неиспользованные дни Лицензии в следующих случаях:
- при одностороннем отказе Лицензиата от использования Приложения;
- при переходе на бесплатный Тариф (п. 3.4.11);
- при принятии Лицензиаром решения о прекращении поддержки Приложения или его ликвидации.
3.5.3. В случае прекращения работы Приложения по инициативе Лицензиара, Лицензиар уведомляет об этом Лицензиата не менее чем за 30 (Тридцать) календарных дней через интерфейс Приложения или по электронной почте.
3.5.4. Сумма возврата рассчитывается исходя из денежного эквивалента неиспользованного остатка на дату обработки обращения службой поддержки по правилам, изложенным в пп. 3.4.7-3.4.9 настоящего Положения.
3.5.5. Для осуществления возврата Лицензиат направляет Лицензиару официальное заявление (скан-копию на бланке организации с подписью и печатью) на адрес электронной почты [support@tgcrew.ru](mailto:support@tgcrew.ru) с обязательным указанием технического идентификатора учетной записи Администратора в Приложении.
3.5.6. Возврат денежных средств осуществляется Лицензиаром в течение 10 (Десяти) рабочих дней с момента подтверждения получения заявления по реквизитам Лицензиата, с которых была произведена оплата.
3.5.7. В случае блокировки доступа к Приложению за нарушение условий Пользовательского соглашения или выявления признаков злоупотребления (согласно п. 3.4.10) возврат денежных средств не производится.

View File

@@ -0,0 +1,198 @@
###### Version 1.05 dated April 15, 2026
This document is an English adaptation of «Пользовательское соглашение» originally drafted in Russian. In the event of any disputes subject to resolution in courts of the Russian Federation, the Russian-language version shall prevail.
The text of this Terms of Use constitutes a public offer of IP Martynshkin A.A. and is addressed to any individual, individual entrepreneur, and/or legal entity under the conditions set forth herein.
Current versions of the Terms of Use and Privacy Policy are available within the Application interface. Information posted on the Website is for reference purposes only. In case of discrepancies between the text on the Website and in the Application, the version placed in the Application shall have legal force.
## 1. Terms and Definitions
1.1. **Bot** — an account named @tgCrewBot and located at [https://t.me/tgCrewBot](https://t.me/tgCrewBot) in the Telegram messenger, managed programmatically by the Developer via API (Application Programming Interface). The Bot provides access to the Application and can be used for basic interaction from the text string (inline-mode).
1.2. **Application** — the tgCrew mini-application operating within the Telegram messenger environment as part of the Telegram Mini Apps (TMA) ecosystem and accessible through interaction with the Bot. Although the Application uses the Telegram platform for its functioning and distribution, it is developed and provided exclusively by the Developer. The Application is not a product of the Telegram messenger development company, is not supported by it, is not approved by it, and is not associated with it legally or organizationally in any way. The functionality of the Application is available only after acceptance of the Terms of Use and the Privacy Policy.
1.3. **Website** — the website located at [https://tgcrew.ru](https://tgcrew.ru), where information about the Application and its documentation is posted.
1.4. **Terms of Use** — this document, the current version of which is posted in the Application and on the Website at [https://tgcrew.ru/terms-of-use](https://tgcrew.ru/terms-of-use). Contractual relations between the Developer and the User arise only after acceptance of the Terms of Use within the Application.
1.5. **Privacy Policy** — a document regulating the procedure for collecting, storing, and processing data (including personal data) of the User entered during the registration procedure, use of the Application, as well as other data. It is an integral annex to the Terms of Use. The current version of the Privacy Policy is posted in the Application and on the Website at [https://tgcrew.ru/privacy-policy](https://tgcrew.ru/privacy-policy). Consent for data processing within the framework of the Privacy Policy is provided by the User within the Application.
1.6. **Developer** — individual entrepreneur Martynshkin Alexey Alexandrovich (IP Martynshkin A.A.), OGRNIP 318774600262084, INN 366316608346 (Russian Federation).
1.7. **User** — an individual, individual entrepreneur, legal entity, or their authorized representative who has accepted the terms of the Terms of Use and the Privacy Policy by their explicit confirmation within the Application interface.
1.8. **Administrator** — a User of the Application who manages the Application using the Admin Panel.
1.9. **Administrator Account** — the account through which the Administrator authenticates to access the Admin Panel.
1.10. **Chat Participant** — a participant of a Connected Chat who may not be a User of the Application.
1.11. **Admin Panel** — the Application interface for managing the Application, including the following functions:
- connecting chats to the Application (see clause 1.12 Connected Chat);
- entering additional information data for Users;
- controlling the payment of the License Fee to the Developer for using the Application.
1.12. **Connected Chat** (to the Application) — a chat in Telegram to which the Bot has been added with the necessary access rights. Information is available in the Application only from Connected Chats.
1.13. **Use of the Application** — the User performing actions to view and (or) use the available functionality of the Application through reproducible online interfaces on the screen of the User's device.
1.14. **Developer's Representatives** — the circle of persons engaged by the Developer within the framework of development and support of the Application, acting on behalf of and (or) on the instructions of the Developer.
1.15. **Tariff** (or Tariff Plans) — an offer formed by the Developer for the Administrator regarding the use of the Application, which includes, among other things: functionality and the Developer's remuneration for using the Application. The description of the Tariff/Tariffs is available on the Website and in the Application. If discrepancies arise between the information about the Tariff/Tariffs posted on the Website and the information available in the Application, the information available in the Application shall prevail.
1.16. **License** — a simple non-exclusive license for the right to use the Application under the terms of this Terms of Use.
1.17. **License Fee** — the fee for granting the right to use the Application in accordance with the selected Tariff.
## 2. Subject of the Terms of Use
2.1. This Terms of Use is a license agreement. The Developer provides the User with the right to use the Application (a simple non-exclusive license) under the terms of the selected Tariff, and the User undertakes to comply with the terms of this Terms of Use.
2.2. To use the Application in the Telegram messenger (hereinafter - Telegram), the User may be required to register an account.
## 3. Warranties and Representations of the User
3.1. By accepting this Terms of Use, the User warrants:
3.1.1. The User has reached the age of 18 (as well as the age of majority in their country of residence) and that there are no circumstances preventing the User from fully performing their obligations under this Terms of Use.
3.1.2. The legislation of the User's country of residence allows the use of the Application. In case of prohibition, the User is obliged to immediately stop using it.
3.1.3. The User has fully read the text of the Terms of Use and the Privacy Policy, understands their terms, and accepts them in full.
3.1.4. The use of the Application will be carried out within the framework of applicable legislation.
3.1.5. The User takes reasonable measures to maintain control over their Telegram account. In case of loss of access to the account used to manage the Application in the role of Administrator, the User is obliged to immediately notify the Developer by email at [support@tgcrew.ru](mailto:support@tgcrew.ru) and cooperate to resolve the situation.
3.1.6. Upon termination of compliance with the warranties (clauses 3.1.1-3.1.5), the User is obliged to immediately stop using the Application and notify the Developer. In this case, the Developer has the right to suspend or terminate the User's access to the Application (by blocking the Administrator Account).
3.2. The User is not entitled to use the Application if they do not comply with the warranties in clause 3.1.
## 4. Acceptance of the Offer
4.1. Evidence of full and unconditional acceptance of the terms of this Terms of Use (acceptance) is the performance of the procedure for accepting the Terms of Use by activating (checking) the corresponding interactive element (checkbox) of the Application interface next to the text: "I accept the Terms of Use" on the relevant screens in the Application.
4.2. Use of the Application signifies the User's consent to the collection and processing of information from Connected Chats in accordance with the Privacy Policy.
4.3. All actions performed within the functionality of the Application by the User are recognized by the Developer and such User as conclusive actions giving rise to corresponding legal consequences. At the same time, the User agrees that the main evidence of the performance or non-performance of a certain action using the Application interfaces for the Developer can be the provision of an extract from its database about the presence of information fixed by software recording (logging) of the history of actions of such person or other similar method. In case of a dispute, such information is provided in the form chosen by the Developer and is recognized as exhaustive evidence of the actions specified in this clause.
4.4. In the event that the User does not agree with the terms of the Terms of Use, they are obliged to immediately leave the Application and not start/cease the Use of the Application.
4.5. The Parties recognize the use of the Application interface and the Telegram account (Telegram ID) as the use of a simple electronic signature. Actions performed through the Application are recognized as having legal force similar to documents on paper.
## 5. Term of the Terms of Use
5.1. The Terms of Use is valid from the moment of acceptance by the User until the full fulfillment of obligations by the Parties or the termination of this agreement.
5.2. Early termination of access to the Application entails the termination of the Terms of Use.
## 6. Description of the Application
6.1. The User acknowledges and agrees that the functionality of the Application is provided "AS IS" and "AS AVAILABLE", without any warranties, including warranties regarding commercial value, fitness for specific purposes, constant availability, etc. The Developer does not guarantee error-free operation of the Application, compliance of its functionality with the User's expectations, or the absence of defects, viruses, or other harmful components.
6.2. The Application allows the Administrator, using the Admin Panel, to combine information from different Telegram chats by adding the Bot to these chats. After adding the Bot (with the necessary rights pre-configured in the Application) to the chat, the Bot gains access to all messages in that chat and consolidates the received information into the Application's database.
6.3. Participants of Connected Chats can, using the graphical interface of the Application, track information from these chats, such as: uploaded files, assigned tasks, and scheduled meetings, as well as see the list of connected chats.
6.4. Only information from those chats of which the User is a participant and which were connected to the Application by the Administrator is available to the User in the Application.
6.5. Access of the Bot to messages in the chat is carried out exclusively after its explicit addition to the chat by a participant possessing the necessary chat administrator rights in Telegram (the chat owner or an administrator with corresponding rights) and granting the Bot these chat administrator rights.
## 7. Payment Procedure
7.1. For the provision of the License, the Administrator pays the License Fee to the Developer. For Chat Participants, the use of the Application is free of charge.
7.2. Taxes and fees applicable to the remuneration are determined in accordance with the current legislation of the Russian Federation on the date of payment.
7.3. Remuneration is paid in the manner and on the terms according to the document "Provision on subscription tariffs", which is an integral part of this Terms of Use. The text of the document can be found on the website [https://tgcrew.ru](https://tgcrew.ru) or in the Application in the Admin Panel.
## 8. Liability of the Parties
8.1. The Developer has the right to carry out technical and other works aimed at improving and (or) changing the functionality of the Application. During the period of such works, the Application may be completely or partially unavailable. The Developer will, if possible, notify Users of lengthy scheduled works through the Application and (or) the Website at least 1 (One) business day (Moscow time) in advance.
8.2. The Developer reserves the right to change, modify, or introduce additional restrictions on the functionality of the Application at its discretion at any time without prior notice, except for changes to Tariffs (see the document "Provision on subscription tariffs") and material changes to the terms of this Terms of Use (clause 13.1).
8.3. The Developer and its Representatives are not liable for any losses (direct, indirect, lost profit) arising in connection with the use of the Application.
8.4. The User is independently responsible for the safety and confidentiality of their Telegram account data. All actions carried out using the User's account are considered to have been carried out by the User. The User is independently liable to third parties for all actions performed using the User's account. The Developer is not liable for unauthorized use of the User's account by third parties.
8.5. The User is prohibited from:
- decompiling, disassembling, performing reverse engineering, reconstructing the source code of the Application or attempting to obtain it by other means;
- creating derivative works based on the Application;
- removing, hiding, or changing notifications about the Developer's intellectual property in the Application.
8.6. The User must not abuse the Application by intentionally introducing viruses, trojans, worms, logic bombs, or other malicious or technologically dangerous material. The User must not use any kind of robots, spiders, automated information collection (page scraping), or other automatic devices, algorithms, methodologies, or similar manual processes to copy, monitor, obtain, or access any part of the Application, to attempt to obtain any information or materials by any means that are not specifically available through the Application.
8.7. The User must not attempt to gain unauthorized access to any part or function of the Application, computing devices (servers) where the Application is stored. The User must not attack the Application via a denial-of-service attack or a distributed denial-of-service attack. The Developer has the right to report any such violation to the relevant law enforcement authorities and will cooperate with these authorities by disclosing the User's identity to them. In the event of such a violation, the User's right to use the Application ceases immediately.
8.8. The User may not use the Application for any purposes prohibited by this Terms of Use, or which are illegal, indecent, or offensive, or to induce the commission of any activity that violates the rights of any third parties, or any illegal activity.
8.9. The User is responsible for configuring their information technologies, computer programs, and platform for access to the Application.
8.10. The User undertakes not to use the Application to perform actions that violate the laws of the Russian Federation, including but not limited to: distribution of materials containing public calls for terrorist activities or justifying terrorism, extremist materials, propaganda of narcotic drugs, psychotropic substances, as well as any other information for the distribution of which criminal or administrative liability is provided.
8.11. The Developer has the right to suspend or prematurely terminate the User's access to the Use of the Application if the Developer has reason to believe that the use of the Application is or will be carried out by the User in violation of this Terms of Use, or the User, at the Developer's discretion, performs actions that cause or may cause damage to the Developer's reputation or the security of the Application.
8.12. The Developer has the right to terminate access to the Application in case of violation of the Privacy Policy or legislation.
8.13. In case of violation by the User of the terms of this Terms of Use, the Developer has the right to unilaterally and extrajudicially suspend access to the Application or terminate this Terms of Use. In this case, the remuneration paid for the current period of the License (subscription) is not refundable. The Parties recognize that the specified amount is proportionate compensation for the expenses and losses actually incurred by the Developer related to processing the violation and early termination of service due to the User's fault.
8.14. The Developer is not responsible for the content (messages, files, data) processed, transmitted, or displayed through the Application, as well as for the actions of Users in connected chats. The Developer does not perform pre-moderation, content analysis, storage, or modification of information provided by the User, including the Administrator. Responsibility for the content of placed files, compliance with copyrights and legislation on information protection during their upload to the chat lies entirely with the User who uploaded the file and the Chat Administrator.
8.15. In the event of the Developer's decision to terminate support for the Application or its liquidation, the refund of the unused portion of the License Fee is carried out in the manner, terms, and subject to the restrictions (including the minimum refund amount threshold) established in the document "Provision on subscription tariffs".
8.16. When using the functionality of connecting third-party cloud storages (Yandex Disk or Google Drive), the Administrator understands and agrees that:
- The Developer does not control the performance, limits, and security policy of these services.
- Loss of access to the cloud storage, deletion of files by the service provider, or failures in the API of the third-party service are not within the Developer's area of responsibility.
- Any disputes related to access to files in third-party storages are resolved by the Administrator directly with the corresponding storage service provider.
- The Administrator independently bears the risks associated with cross-border data transfer or violation of the terms of use of third-party services.
- The Administrator is independently responsible for the safety of authorization data used for integration with third-party cloud storages.
## 9. Intellectual Property
9.1. Subject to the User's compliance with the Terms of Use, the Developer grants the User a limited, non-exclusive, non-sublicensable, revocable, non-transferable license to access the Application. Any rights not expressly granted in this section are reserved by the Developer. The license automatically terminates without notice upon termination of this Terms of Use.
9.2. All intellectual property rights in relation to the Application worldwide belong to the Developer, and rights to the Application are licensed (not sold) to the User. The User has no intellectual property rights in relation to the Application, except for the right to use them in accordance with this Terms of Use.
## 10. Force Majeure
10.1. The Parties are released from liability upon the occurrence of force majeure circumstances (natural disasters, wars, decisions of state bodies, telecommunication failures, etc.).
10.2. The period for fulfilling obligations is postponed for the duration of the force majeure, but not more than 30 (Thirty) calendar days.
10.3. In case of force majeure lasting more than 30 calendar days, the Parties shall conduct negotiations on alternative solutions or termination of the Terms of Use without compensation for losses.
## 11. Severability
11.1. The User and the Developer agree that if any part of this Terms of Use or the Privacy Policy is found by a competent court to be invalid or unenforceable, in whole or in part, then only such part of this Terms of Use or the Privacy Policy that is declared invalid or unenforceable will be considered invalid in that jurisdiction, and only to the extent that it was found to be such, and this will not affect the validity or enforceability in any aspect and in any jurisdiction of other parts of this Terms of Use or the Privacy Policy, which remain in full force and effect. In this case, such invalid provisions are subject to replacement by provisions as close as possible in meaning to the original ones, which will be recognized as valid in the relevant jurisdiction, and are subject to application in modified form (including to already established legal relations).
11.2. The recognition of any provision as invalid or unenforceable does not affect the validity or enforceability of the provisions of sections 7 (Payment Procedure), 9 (Intellectual Property), 12 (Applicable Law and Dispute Resolution), 15.4 (Indemnification), and 15.6 (Inaction).
## 12. Applicable Law and Dispute Resolution
12.1. This Terms of Use is governed by and construed in accordance with the laws of the Russian Federation. Issues not regulated by the Terms of Use are subject to resolution in accordance with the laws of the Russian Federation.
12.2. All disputes of the Parties under this Terms of Use are subject to resolution through correspondence and negotiations using the mandatory pre-trial (claim) procedure. In case of impossibility to reach an agreement between the Parties through negotiations within 30 (Thirty) calendar days from the date of receipt by the other Party of a written claim sent by mail in accordance with clause 15.2 of this Terms of Use, the consideration of the dispute must be transferred by any interested Party to the court at the location of the Developer (Russian Federation, Moscow) in accordance with the rules of jurisdiction established by the GPC RF or APC RF.
## 13. Procedure for Changing the Terms of Use
13.1. This Terms of Use (including additions) may be changed by the Developer with notification to the User by posting a new edition of the changed Terms of Use on the Website or in the Application. The changes made by the Developer to the Terms of Use enter into force on the day following the day of publication of such changes on the Website or in the Application (whichever comes first). The User undertakes to independently check this Terms of Use for any changes. Failure of the User to familiarize themselves cannot serve as a basis for non-fulfillment of their obligations and non-compliance with the restrictions established by this Terms of Use. The Developer recommends that Users regularly familiarize themselves with the current edition of the Terms of Use.
13.2. The User has the right to refuse to accept changes and additions to this Terms of Use, which means the User's refusal to use all previously granted rights.
## 14. Assignment of Rights (Claims)
14.1. The Developer may assign or transfer rights under this Terms of Use and (or) the Privacy Policy in whole or in part to any individual or legal entity at any time with or without the User's consent. The User is not entitled to assign or transfer any rights and obligations arising from the Terms of Use or the Privacy Policy without the prior written consent of the Developer, and any assignment or transfer of rights made by the User without such consent will be invalid.
14.2. Assignment by the Developer of rights under this Terms of Use to a third party does not release the Developer from liability to the User for the performance of obligations under this Terms of Use that arose before the moment of assignment, unless otherwise agreed with the User or provided by law.
## 15. Final Provisions
15.1. This Terms of Use is drawn up in the Russian language. In case of contradictions between the Russian version and any translations, the Russian version shall prevail.
15.2. All notifications, requests, and claims in connection with this Terms of Use or the use of the Application are sent by the User to the Developer by email at [support@tgcrew.ru](mailto:support@tgcrew.ru) or by other means explicitly indicated by the Developer in the Application or on the Website. The Developer's notifications to the User are considered sent properly if they are posted in the Application and (or) on the Website and (or) sent to the contact email address (if any) associated with the Administrator's Telegram account and are considered received by the User on the next day after their placement/sending. It is also allowed to send notifications, requests, and claims on paper by mail to the Developer's address specified in section 16 of this Terms of Use.
15.3. The Developer processes personal data of Users exclusively in the manner and for the purposes defined by the Privacy Policy, which is an integral part of this Terms of Use.
15.4. The User undertakes to indemnify the Developer for any losses (including legal costs and reasonable expenses for legal services) incurred by the Developer in connection with the User's violation of this Terms of Use, legislation, or the rights of third parties when using the Application, including losses resulting from the User's violation of third-party rights (including intellectual property rights and privacy rights) when using the Application.
15.5. This Terms of Use constitutes the entire agreement between the User and the Developer regarding the use of the Application and supersedes all previous oral or written agreements and understandings between the Parties on this subject (if any).
15.6. Inaction on the part of the Developer in case of violation by the User of the provisions of this Terms of Use does not deprive the Developer of the right to take appropriate actions to protect its interests in the future, nor does it mean a waiver of its rights in case of subsequent similar or related violations.
15.7. This Terms of Use does not create agency, partnership, joint venture, or franchise relationships between the User and the Developer.
15.8. The Developer does not guarantee the compatibility of the Application with all devices, operating systems, and versions of the Telegram messenger.
## 16. Contact Information and Details of the Developer
Individual Entrepreneur Martynshkin Alexey Alexandrovich
Legal address: 111394, Russian Federation, Moscow, Perovskaya street, house 66, building 3, apartment 187
OGRNIP 318774600262084
INN 366316608346
Phone: +7 (916) 439-04-25
Email: [info@tgcrew.ru](mailto:info@tgcrew.ru)

View File

@@ -0,0 +1,194 @@
###### Версия 1.05 от 15.04.2026
Текст настоящего Пользовательского соглашения является публичной офертой ИП Мартышкин А.А. и адресован любому физическому лицу, индивидуальному предпринимателю и (или) юридическому лицу на изложенных в нём условиях.
Актуальные версии Пользовательского соглашения и Политики конфиденциальности доступны внутри интерфейса Приложения. Информация, размещенная на Сайте, носит справочный характер. В случае расхождений между текстом на Сайте и в Приложении, юридическую силу имеет версия, размещенная в Приложении.
## 1. Термины и определения
1.1. **Бот** -- аккаунт с именем @tgCrewBot и адресом [https://t.me/tgCrewBot](https://t.me/tgCrewBot) в мессенджере Telegram, управляемый программно Разработчиком через API (Application Programming Interface, программный интерфейс приложений). Бот предоставляет доступ к Приложению и может использоваться для базового взаимодействия из текстовой строки (inline-mode).
1.2. **Приложение** -- мини-приложение tgCrew, работающее в среде мессенджера Telegram как часть экосистемы Telegram Mini Apps (TMA) и доступное через взаимодействие с Ботом. Хотя Приложение использует платформу Telegram для своего функционирования и распространения, оно разработано и предоставляется исключительно Разработчиком. Приложение не является продуктом компании-разработчика мессенджера Telegram, не поддерживается ею, не одобрено ею и никак не связано с ней юридически или организационно. Функционал Приложения доступен только после принятия Пользовательского соглашения и Политики конфиденциальности.
1.3. **Сайт** -- веб-сайт, расположенный по адресу: [https://tgcrew.ru](https://tgcrew.ru), на котором размещается информация о Приложении и его документация.
1.4. **Пользовательское соглашение** -- настоящий документ, актуальная (текущая) версия которого размещается в Приложении и на Сайте по ссылке [https://tgcrew.ru/terms-of-use](https://tgcrew.ru/terms-of-use). Договорные отношения между Разработчиком и Пользователем возникают только после принятия Пользовательского соглашения внутри Приложения.
1.5. **Политика конфиденциальности** -- документ, регулирующий порядок сбора, хранения и обработки данных (в том числе персональных) Пользователя, введенных им в ходе процедуры регистрации, использования Приложения, а также иных данных. Является неотъемлемым приложением к Пользовательскому соглашению. Актуальная (текущая) версия Политики конфиденциальности размещается в Приложении и на Сайте по ссылке [https://tgcrew.ru/privacy-policy](https://tgcrew.ru/privacy-policy). Согласие на обработку данных в рамках Политики конфиденциальности предоставляется Пользователем внутри Приложения.
1.6. **Разработчик** -- индивидуальный предприниматель Мартышкин Алексей Александрович (ИП Мартышкин А.А.), ОГРНИП 318774600262084, ИНН 366316608346 (Российская Федерация).
1.7. **Пользователь** -- физическое лицо, индивидуальный предприниматель, юридическое лицо или их уполномоченный представитель, принявшее условия Пользовательского соглашения и Политики конфиденциальности путем их явного подтверждения внутри интерфейса Приложения.
1.8. **Администратор** -- Пользователь Приложения, который осуществляет управление Приложением с помощью Панели администратора.
1.9. **Учетная запись Администратора** -- учетная запись, с помощью которой Администратор осуществляет аутентификацию для доступа к Панели администратора.
1.10. **Участник чата** -- участник Подключенного чата, который может не являться Пользователем Приложения.
1.11. **Панель администратора** -- интерфейс Приложения для управления Приложением, в том числе осуществления следующих функций:
- подключение чатов к Приложению (см. п. 1.12 Подключенный чат);
- внесение дополнительных информационных данных для Пользователей;
- контроль оплаты Лицензионного вознаграждения Разработчику за использование Приложения.
1.12. **Подключенный чат** (к Приложению) -- чат в Telegram, в который добавлен Бот с необходимыми правами доступа. В Приложении доступна информация только из Подключенных чатов.
1.13. **Использование Приложения** -- совершение Пользователем действий по просмотру и (или) использованию доступного функционала Приложения посредством воспроизводимых онлайн-интерфейсов на экране устройства Пользователя.
1.14. **Представители Разработчика** -- круг лиц, привлекаемых Разработчиком в рамках разработки и поддержки Приложения, действующие от имени и (или) по поручению Разработчика.
1.15. **Тариф** (или Тарифные планы) -- предложение, сформированное Разработчиком для Администратора по использованию Приложения, которое включает, в том числе: функциональность и вознаграждение Разработчика за использование Приложения. Описание Тарифа/Тарифов доступно на Сайте и в Приложении. Если между информацией о Тарифе/Тарифах, размещенной на Сайте, и информацией, доступной в Приложении, возникают расхождения, то приоритет имеет информация, доступная в Приложении.
1.16. **Лицензия** -- простая неисключительная лицензия на право использования Приложения на условиях настоящего Пользовательского соглашения.
1.17. **Лицензионное вознаграждение** -- плата за предоставление права использования Приложения в соответствии с выбранным Тарифом.
## 2. Предмет Пользовательского соглашения
2.1. Настоящее Пользовательское соглашение является лицензионным договором. Разработчик предоставляет Пользователю право использования Приложения (простую неисключительную лицензию) на условиях выбранного Тарифа, а Пользователь обязуется соблюдать условия данного Пользовательского соглашения.
2.2. Для использования Приложения в мессенджере Telegram (далее - Telegram) от Пользователя может потребоваться регистрация учетной записи.
## 3. Гарантии и заверения Пользователя
3.1. Принимая данное Пользовательское соглашение, Пользователь гарантирует:
3.1.1. Пользователь достиг возраста 18 лет (а также возраста совершеннолетия в своей стране проживания) и что не существует обстоятельств, препятствующих Пользователю в полном объеме исполнять свои обязательства по данному Пользовательскому соглашению.
3.1.2. Законодательство страны проживания Пользователя разрешает использование Приложения. В случае запрета Пользователь обязан немедленно прекратить использование.
3.1.3. Полностью ознакомился с текстом Пользовательского соглашения и Политикой конфиденциальности, понимает их условия и принимает их в полном объеме.
3.1.4. Использование Приложения будет осуществляться в рамках применимого законодательства.
3.1.5. Пользователь принимает разумные меры для сохранения контроля над своей учетной записью Telegram. В случае утраты доступа к учетной записи, используемой для управления Приложением в роли Администратора, Пользователь обязан незамедлительно уведомить Разработчика по электронной почте [support@tgcrew.ru](mailto:support@tgcrew.ru) и сотрудничать для разрешения ситуации.
3.1.6. При прекращении соответствия гарантиям (пп. 3.1.1-3.1.5) Пользователь обязан немедленно прекратить использование Приложения и уведомить Разработчика. В этом случае Разработчик вправе приостановить или прекратить доступ Пользователя к Приложению (путем блокировки Учетной записи Администратора).
3.2. Пользователь не вправе использовать Приложение, если не соответствует гарантиям в п. 3.1.
## 4. Прием оферты
4.1. Свидетельством полного и безоговорочного принятия условий настоящего Пользовательского соглашения (акцептом), является осуществление процедуры принятия Пользовательского соглашения путем активации (проставления отметки) в соответствующем интерактивном элементе (поле для отметки) интерфейса Приложения рядом с текстом: «Я принимаю Пользовательское соглашение» на соответствующих экранах в Приложении.
4.2. Использование Приложения означает согласие Пользователя на сбор и обработку информации из Подключенных чатов в соответствии с Политикой конфиденциальности.
4.3. Все действия, совершенные в рамках функциональности Приложения Пользователем, признаются Разработчиком и таким Пользователем как конклюдентные действия, порождающие соответствующие юридические последствия. При этом Пользователь соглашается с тем, что основным доказательством совершения или несовершения определенного действия с использованием интерфейсов Приложения может служить для Разработчика предоставление выписки из своей базы данных о наличии информации, зафиксированной путем программной фиксации (записи) истории действий такого лица или иным аналогичным способом. В случае спора такая информация предоставляется в выбранной Разработчиком форме и признается исчерпывающим доказательством действий, указанных в настоящем пункте.
4.4. В случае, если Пользователь не согласен с условиями Пользовательского соглашения, он обязан немедленно покинуть Приложение и не начинать/прекратить Использование Приложения.
4.5. Стороны признают использование интерфейса Приложения и учетной записи Telegram (Telegram ID) использованием простой электронной подписи. Действия, совершенные через Приложение, признаются имеющими юридическую силу, аналогичную документам на бумажном носителе
## 5. Срок действия Пользовательского соглашения
5.1. Пользовательское соглашение действует с момента акцепта Пользователем до полного исполнения обязательств Сторонами или прекращения этого соглашения.
5.2. Досрочное прекращение доступа к Приложению влечет прекращение действия Пользовательского соглашения.
## 6. Описание Приложения
6.1. Пользователь признает и соглашается с тем, что функциональность Приложения предоставляется "КАК ЕСТЬ" и "ПО МЕРЕ ДОСТУПНОСТИ" ("AS IS" и "AS AVAILABLE"), без каких-либо гарантий, включая гарантии в отношении коммерческой ценности, пригодности для конкретных целей, постоянной доступности и т.п. Разработчик не гарантирует безошибочную работу Приложения, соответствие его функциональности ожиданиям Пользователя, а также отсутствие дефектов, вирусов или иных вредоносных компонентов.
6.2. Приложение позволяет Администратору с помощью Панели администратора объединять информацию из разных чатов Telegram путем добавления Бота в эти чаты. После добавления Бота (с предварительно настроенными в Приложении необходимыми правами) в чат, Бот получает доступ ко всем сообщениям в этом чате и сводит полученную информацию в базу данных Приложения.
6.3. Участники Подключенных чатов могут с помощью графического интерфейса Приложения отслеживать информацию из этих чатов, такую как: загруженные файлы, поставленные задачи и назначенные совещания, а также видеть перечень подключенных чатов.
6.4. Пользователю в Приложении доступна информация только из тех чатов, участником которых он является и которые были подключены к Приложению Администратором.
6.5. Доступ Бота к сообщениям в чате осуществляется исключительно после его явного добавления в чат участником, обладающим необходимыми правами администратора чата в Telegram (владелец чата или администратор с соответствующими правами), и предоставления Боту этих прав администратора чата.
## 7. Порядок расчетов
7.1. За предоставление Лицензии Администратор уплачивает Разработчику Лицензионное вознаграждение. Для Участников чатов использование Приложения является бесплатным.
7.2. Налоги и сборы, применимые к вознаграждению, определяются в соответствии с действующим законодательством РФ на дату оплаты.
7.3. Вознаграждение выплачивается в порядке и на условиях, согласно документу «Положение о Тарифных планах подписки», который является неотъемлемой частью настоящего Пользовательского соглашения. С текстом документа можно ознакомиться на сайте [https://tgcrew.ru](https://tgcrew.ru) или в Приложении в Панели администратора.
## 8. Ответственность сторон
8.1. Разработчик вправе проводить технические и иные работы, направленные на улучшение и (или) изменение функциональности Приложения. В период проведения таких работ Приложение может быть недоступно полностью или частично. Разработчик по возможности будет уведомлять Пользователей о длительных плановых работах через Приложение и (или) Сайт не менее чем на 1 (Один) рабочий день (по московскому времени).
8.2. Разработчик оставляет за собой право изменять, модифицировать или вводить дополнительные ограничения на функционал Приложения по своему усмотрению в любое время без предварительного уведомления, за исключением изменений Тарифов (см. документ «Положение о Тарифных планах подписки») и существенных изменений условий настоящего Пользовательского соглашения (п. 13.1).
8.3. Разработчик и его Представители не несут ответственности за любые убытки (прямые, косвенные, упущенная выгода), возникшие в связи с использованием Приложения.
8.4. Пользователь самостоятельно несет ответственность за сохранность и конфиденциальность данных своей учетной записи в Telegram. Все действия, осуществленные с использованием учетной записи Пользователя, считаются осуществленными Пользователем. Пользователь самостоятельно несет ответственность перед третьими лицами за все действия, совершенные с использованием учетной записи Пользователя. Разработчик не несет ответственности за несанкционированное использование учетной записи Пользователя третьими лицами.
8.5. Пользователю запрещается:
- декомпилировать, дизассемблировать, осуществлять обратное проектирование (реверс-инжиниринг), реконструировать исходный код Приложения или пытаться получить его иными способами;
- создавать производные работы на основе Приложения;
- удалять, скрывать или изменять уведомления об интеллектуальной собственности Разработчика в Приложении.
8.6. Пользователь не должен злоупотреблять Приложением путем умышленного внедрения вирусов, троянов, червей, логических бомб или иного вредоносного или технологически опасного материала. Пользователь не должен использовать любого рода роботов, пауков (spider), автоматизированный сбор информации (скрапинг страниц) или иные автоматические устройства, алгоритмы, методологии или аналогичные ручные процессы для копирования, мониторинга, получения или доступа к любой части Приложения, для попытки получения любой информации или материалов любыми средствами, которые специально не доступны через Приложение.
8.7. Пользователь не должен пытаться получить несанкционированный доступ к любой части или функции Приложения, вычислительным устройствам (серверам), на которых хранится Приложение. Пользователь не должен атаковать Приложение посредством атаки типа "отказ в обслуживании" (denial-of-service) или распределенной атаки типа "отказ в обслуживании" (distributed denial-of-service attack). Разработчик имеет право сообщить о любом таком нарушении в соответствующие правоохранительные органы и будет сотрудничать с этими органами, раскрывая им личность Пользователя. В случае такого нарушения право Пользователя на использование Приложения немедленно прекращается.
8.8. Пользователь не может использовать Приложение для любых целей, запрещенных настоящим Пользовательским соглашением, или которые являются незаконными, неприличными или оскорбительными, или для побуждения к совершению любой деятельности, нарушающей права любых третьих лиц, или любой незаконной деятельности.
8.9. Пользователь несет ответственность за настройку своих информационных технологий, компьютерных программ и платформы для доступа к Приложению.
8.10. Пользователь обязуется не использовать Приложение для совершения действий, нарушающих законодательство РФ, включая, но не ограничиваясь: распространение материалов, содержащих публичные призывы к осуществлению террористической деятельности или оправдывающих терроризм, экстремистских материалов, пропаганду наркотических средств, психотропных веществ, а также любой иной информации, за распространение которой предусмотрена уголовная или административная ответственность.
8.11. Разработчик вправе приостановить или досрочно прекратить доступ Пользователя к Использованию Приложения, если у Разработчика есть основания полагать, что использование Приложения осуществляется или будет осуществляться Пользователем с нарушением настоящего Пользовательского соглашения, или Пользователь, по усмотрению Разработчика, совершает действия, наносящие или могущие нанести ущерб репутации Разработчика или безопасности Приложения.
8.12. Разработчик имеет право прекратить доступ к Приложению при нарушении Политики конфиденциальности или законодательства.
8.13. В случае нарушения Пользователем условий настоящего Пользовательского соглашения, Разработчик имеет право в одностороннем внесудебном порядке приостановить доступ к Приложению или расторгнуть настоящее Пользовательское соглашение. При этом вознаграждение, уплаченное за текущий период действия Лицензии (подписки), возврату не подлежит. Стороны признают, что указанная сумма является соразмерной компенсацией фактически понесенных Разработчиком расходов и убытков, связанных с обработкой нарушения и досрочным прекращением обслуживания по вине Пользователя.
8.14. Разработчик не несет ответственности за контент (сообщения, файлы, данные), обрабатываемый, передаваемый или отображаемый через Приложение, а также за действия Пользователей в подключенных чатах. Разработчик не осуществляет премодерацию, анализ содержимого, хранение или изменение информации, предоставляемой Пользователем, в том числе Администратором. Ответственность за содержание размещаемых файлов, соблюдение авторских прав и законодательства о защите информации при их загрузке в чат целиком лежит на Пользователе, загрузившем файл, и Администраторе чата.
8.15. В случае принятия Разработчиком решения о прекращении поддержки Приложения или его ликвидации, возврат неиспользованной части Лицензионного вознаграждения осуществляется в порядке, сроки и с учетом ограничений (включая минимальный порог суммы возврата), установленных в документе «Положение о Тарифных планах подписки».
8.16. При использовании функционала подключения сторонних облачных хранилищ (Яндекс Диск или Google Drive), Администратор понимает и соглашается, что:
- Разработчик не контролирует работоспособность, лимиты и политику безопасности данных сервисов.
- Утрата доступа к облачному хранилищу, удаление файлов провайдером сервиса или сбои в API стороннего сервиса не являются зоной ответственности Разработчика.
- Любые споры, связанные с доступом к файлам в сторонних хранилищах, решаются Администратором напрямую с соответствующим провайдером сервиса хранения.
- Администратор самостоятельно несет риски, связанные с трансграничной передачей данных или нарушением условий использования сторонних сервисов.
- Администратор самостоятельно несет ответственность за сохранность авторизационных данных, используемых для интеграции со сторонними облачными хранилищами.
## 9. Интеллектуальная собственность
9.1. При условии соблюдения Пользователем Пользовательского соглашения, Разработчик предоставляет Пользователю ограниченную, неисключительную, непередаваемую по сублицензии, отзывную, не подлежащую передаче лицензию на доступ к Приложению. Любые права, прямо не предоставленные в данном разделе, сохраняются за Разработчиком. Лицензия автоматически прекращается без уведомления при прекращении действия настоящего Пользовательского соглашения.
9.2. Все права на интеллектуальную собственность в отношении Приложения по всему миру принадлежат Разработчику, и права на Приложение лицензированы (не проданы) Пользователю. Пользователь не имеет никаких прав на интеллектуальную собственность в отношении Приложения или на них, за исключением права использовать их в соответствии с настоящим Пользовательским соглашением.
## 10. Обстоятельства непреодолимой силы (форс-мажор)
10.1. Стороны освобождаются от ответственности при наступлении обстоятельств непреодолимой силы (стихийные бедствия, войны, решения госорганов, телекоммуникационные сбои и т.п.).
10.2. Срок исполнения обязательств отодвигается на время действия форс-мажора, но не более чем на 30 (Тридцать) календарных дней.
10.3. При форс-мажоре длительностью более 30 календарных дней Стороны проводят переговоры об альтернативных решениях или расторжении Пользовательского соглашения без возмещения убытков.
## 11. Разделимость положений
11.1. Пользователь и Разработчик соглашаются с тем, что если какая-либо часть настоящего Пользовательского соглашения или Политики конфиденциальности будет признана компетентным судом недействительной или не подлежащей защите, полностью или частично, то только такая часть настоящего Пользовательского соглашения или Политики конфиденциальности, которая объявлена недействительной или не подлежащей защите, будет считаться недействительной в данной юрисдикции, и только в той части, в которой она была признана таковой, и это не повлияет на действительность или возможность защиты в каком-либо аспекте и в любой юрисдикции других частей настоящего Пользовательского соглашения или Политики конфиденциальности, которые остаются в полной силе и действии. При этом такие недействительные положения подлежат замене положениями, максимально близкими по смыслу к исходным, которые будут признаны действительными в соответствующей юрисдикции, и подлежат применению в измененной форме (в том числе к уже установленным правоотношениям).
11.2. Признание какого-либо положения недействительным или неисполнимым не затрагивает действительность или исполнимость положений разделов 7 (Порядок расчетов), 9 (Интеллектуальная собственность), 12 (Применимое право и разрешение споров), 15.4 (Возмещение убытков) и 15.6 (Бездействие).
## 12. Применимое право и разрешение споров
12.1. Настоящее Пользовательское соглашение регулируется и толкуется в соответствии с законодательством Российской Федерации. Вопросы, не урегулированные Пользовательским соглашением, подлежат разрешению в соответствии с законодательством Российской Федерации.
12.2. Все споры Сторон по настоящему Пользовательскому соглашению подлежат разрешению путем переписки и переговоров с использованием обязательного досудебного (претензионного) порядка. В случае невозможности достичь согласия между Сторонами путем переговоров в течение 30 (Тридцати) календарных дней с момента получения другой Стороной письменной претензии, направленной почтовым отправлением в соответствии с п. 15.2 настоящего Пользовательского соглашения, рассмотрение спора должно быть передано любой заинтересованной Стороной в суде по месту нахождения Разработчика (Российская Федерация, г. Москва) в соответствии с правилами о подсудности, установленными ГПК РФ или АПК РФ.
## 13. Порядок изменения Пользовательского соглашения
13.1. Настоящее Пользовательское соглашение (включая дополнения) могут быть изменены Разработчиком с уведомлением Пользователя посредством размещения новой редакции изменяемого Пользовательского соглашения на Сайте или в Приложении. Внесенные Разработчиком изменения в Пользовательском соглашении вступают в силу в день, следующий за днем опубликования таких изменений на Сайте или в Приложении (смотря что наступит раньше). Пользователь обязуется самостоятельно проверять настоящее Пользовательское соглашение на предмет внесенных изменений. Неосуществление Пользователем действий по ознакомлению не может служить основанием для неисполнения Пользователем своих обязательств и несоблюдения Пользователем ограничений, установленных настоящим Пользовательским соглашением. Разработчик рекомендует Пользователям регулярно знакомиться с актуальной редакцией Пользовательского соглашения.
13.2. Пользователь вправе отказаться от принятия изменений и дополнений в настоящее Пользовательское соглашение, что означает отказ Пользователя от использования всех предоставленных ему ранее прав.
## 14. Уступка прав (требований)
14.1. Разработчик может уступить или передать права по настоящему Пользовательскому соглашению и (или) Политике конфиденциальности полностью или частично любому физическому или юридическому лицу в любое время с согласия Пользователя или без такового. Пользователь не вправе уступать или передавать какие-либо права и обязательства, вытекающие из Пользовательского соглашения или Политики конфиденциальности, без предварительного письменного согласия Разработчика, и любая уступка или передача прав, совершенная Пользователем без такого согласия, будет недействительной.
14.2. Уступка Разработчиком прав по настоящему Пользовательскому соглашению третьему лицу не освобождает Разработчика от ответственности перед Пользователем за исполнение обязательств по настоящему Пользовательскому соглашению, возникших до момента уступки, если иное не согласовано с Пользователем или не предусмотрено законодательством.
## 15. Заключительные положения
15.1. Настоящее Пользовательское соглашение составлено на русском языке. В случае возникновения противоречий между русской версией и любыми переводами, приоритет имеет русская версия.
15.2. Все уведомления, запросы и претензии в связи с настоящим Пользовательским соглашением или использованием Приложения направляются Пользователем Разработчику по электронной почте [support@tgcrew.ru](mailto:support@tgcrew.ru) или иными способами, явно указанными Разработчиком в Приложении или на Сайте. Уведомления Разработчика Пользователю считаются направленными надлежащим образом, если они размещены в Приложении и (или) на Сайте и (или) отправлены на контактный адрес электронной почты (при наличии), связанный с учетной записью Администратора в Telegram и считаются полученными Пользователем на следующий день после их размещения/отправки. Также допускается отправка уведомлений, запросов и претензий на бумажном носителе посредством почтового отправления по адресу Разработчика, указанному в разделе 16 настоящего Пользовательского соглашения.
15.3. Разработчик осуществляет обработку персональных данных Пользователей исключительно в порядке и целях, определенных Политикой конфиденциальности, являющейся неотъемлемой частью настоящего Пользовательского соглашения.
15.4. Пользователь обязуется возместить Разработчику любые убытки (включая судебные издержки и разумные расходы на юридические услуги), понесенные Разработчиком в связи с нарушением Пользователем настоящего Пользовательского соглашения, законодательства или прав третьих лиц при использовании Приложения, включая убытки, возникшие в результате нарушения Пользователем прав третьих лиц (в том числе права на интеллектуальную собственность и права на конфиденциальность) при использовании Приложения.
15.5. Настоящее Пользовательское соглашение представляет собой полное соглашение между Пользователем и Разработчиком в отношении использования Приложения и заменяет собой все предыдущие устные или письменные договоренности и понимания между Сторонами по данному предмету (при их наличии).
15.6. Бездействие со стороны Разработчика в случае нарушения Пользователем положений настоящего Пользовательского соглашения не лишает Разработчика права предпринять соответствующие действия для защиты своих интересов в будущем, а также не означает отказа от своих прав в случае последующих подобных или сходных нарушений.
15.7. Настоящее Пользовательское соглашение не создает агентских, партнерских, совместных отношений или отношений франчайзинга между Пользователем и Разработчиком.
15.8. Разработчик не гарантирует совместимость Приложения со всеми устройствами, операционными системами и версиями мессенджера Telegram.
## 16. Контактная информация и реквизиты Разработчика
Индивидуальный предприниматель Мартышкин Алексей Александрович
Юридический адрес: 111394, Российская Федерация, город Москва, улица Перовская, дом 66, корпус 3, квартира 187
ОГРНИП 318774600262084
ИНН 366316608346
Телефон: +7 (916) 439-04-25
Электронная почта: [info@tgcrew.ru](mailto:info@tgcrew.ru)

41
src/assets/logo.svg Normal file
View File

@@ -0,0 +1,41 @@
<svg viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
<style>
.x { fill: white; transform-box: fill-box; animation: expand-r 6s ease-in-out infinite;}
@keyframes expand-r { 50% { r: 8px; } }
.c { fill: white; transform-box: fill-box; animation: o 6s ease-in-out infinite; }
@keyframes o { 50% { transform: var(--t); } }
.l {
stroke: white;
stroke-dasharray: 1;
stroke-dashoffset: 1;
stroke-width: 1.5;
animation: draw 6s ease-in-out infinite;
}
@keyframes draw {
0%, 100% { stroke-dashoffset: 0; }
50% { stroke-dashoffset: 1; }
}
</style>
<defs>
<linearGradient x1="50%" y1="0%" x2="50%" y2="100%" id="linearGradient-1">
<stop stop-color="#2AABEE" offset="0%"></stop>
<stop stop-color="#229ED9" offset="100%"></stop>
</linearGradient>
</defs>
<rect width="32" height="32" rx="4" ry="4" fill="url(#linearGradient-1)" />
<circle class="x" cx="16" cy="16" r="6" style="--t:scale(1.2)" />
<circle class="c" cx="7" cy="7" r="3" style="--t:translate(9px,9px)"/>
<circle class="c" cx="28" cy="4" r="2" style="--t:translate(-12px,12px)"/>
<circle class="c" cx="6" cy="26" r="4" style="--t:translate(10px,-10px)"/>
<circle class="c" cx="26" cy="26" r="5" style="--t:translate(-10px,-10px)"/>
<line class="l" x1="16" y1="16" x2="7" y2="7" pathLength="1"/>
<line class="l" x1="16" y1="16" x2="28" y2="4" pathLength="1"/>
<line class="l" x1="16" y1="16" x2="6" y2="26" pathLength="1"/>
<line class="l" x1="16" y1="16" x2="26" y2="26" pathLength="1"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -1,15 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 356 360">
<path
d="M43.4 303.4c0 3.8-2.3 6.3-7.1 6.3h-15v-22h14.4c4.3 0 6.2 2.2 6.2 5.2 0 2.6-1.5 4.4-3.4 5 2.8.4 4.9 2.5 4.9 5.5zm-8-13H24.1v6.9H35c2.1 0 4-1.3 4-3.8 0-2.2-1.3-3.1-3.7-3.1zm5.1 12.6c0-2.3-1.8-3.7-4-3.7H24.2v7.7h11.7c3.4 0 4.6-1.8 4.6-4zm36.3 4v2.7H56v-22h20.6v2.7H58.9v6.8h14.6v2.3H58.9v7.5h17.9zm23-5.8v8.5H97v-8.5l-11-13.4h3.4l8.9 11 8.8-11h3.4l-10.8 13.4zm19.1-1.8V298c0-7.9 5.2-10.7 12.7-10.7 7.5 0 13 2.8 13 10.7v1.4c0 7.9-5.5 10.8-13 10.8s-12.7-3-12.7-10.8zm22.7 0V298c0-5.7-3.9-8-10-8-6 0-9.8 2.3-9.8 8v1.4c0 5.8 3.8 8.1 9.8 8.1 6 0 10-2.3 10-8.1zm37.2-11.6v21.9h-2.9l-15.8-17.9v17.9h-2.8v-22h3l15.6 18v-18h2.9zm37.9 10.2v1.3c0 7.8-5.2 10.4-12.4 10.4H193v-22h11.2c7.2 0 12.4 2.8 12.4 10.3zm-3 0c0-5.3-3.3-7.6-9.4-7.6h-8.4V307h8.4c6 0 9.5-2 9.5-7.7V298zm50.8-7.6h-9.7v19.3h-3v-19.3h-9.7v-2.6h22.4v2.6zm34.4-2.6v21.9h-3v-10.1h-16.8v10h-2.8v-21.8h2.8v9.2H296v-9.2h2.9zm34.9 19.2v2.7h-20.7v-22h20.6v2.7H316v6.8h14.5v2.3H316v7.5h17.8zM24 340.2v7.3h13.9v2.4h-14v9.6H21v-22h20v2.7H24zm41.5 11.4h-9.8v7.9H53v-22h13.3c5.1 0 8 1.9 8 6.8 0 3.7-2 6.3-5.6 7l6 8.2h-3.3l-5.8-8zm-9.8-2.6H66c3.1 0 5.3-1.5 5.3-4.7 0-3.3-2.2-4.1-5.3-4.1H55.7v8.8zm47.9 6.2H89l-2 4.3h-3.2l10.7-22.2H98l10.7 22.2h-3.2l-2-4.3zm-1-2.3l-6.3-13-6 13h12.2zm46.3-15.3v21.9H146v-17.2L135.7 358h-2.1l-10.2-15.6v17h-2.8v-21.8h3l11 16.9 11.3-17h3zm35 19.3v2.6h-20.7v-22h20.6v2.7H166v6.8h14.5v2.3H166v7.6h17.8zm47-19.3l-8.3 22h-3l-7.1-18.6-7 18.6h-3l-8.2-22h3.3L204 356l6.8-18.5h3.4L221 356l6.6-18.5h3.3zm10 11.6v-1.4c0-7.8 5.2-10.7 12.7-10.7 7.6 0 13 2.9 13 10.7v1.4c0 7.9-5.4 10.8-13 10.8-7.5 0-12.7-3-12.7-10.8zm22.8 0v-1.4c0-5.7-4-8-10-8s-9.9 2.3-9.9 8v1.4c0 5.8 3.8 8.2 9.8 8.2 6.1 0 10-2.4 10-8.2zm28.3 2.4h-9.8v7.9h-2.8v-22h13.2c5.2 0 8 1.9 8 6.8 0 3.7-2 6.3-5.6 7l6 8.2h-3.3l-5.8-8zm-9.8-2.6h10.2c3 0 5.2-1.5 5.2-4.7 0-3.3-2.1-4.1-5.2-4.1h-10.2v8.8zm40.3-1.5l-6.8 5.6v6.4h-2.9v-22h2.9v12.3l15.2-12.2h3.7l-9.9 8.1 10.3 13.8h-3.6l-8.9-12z" />
<path fill="#050A14"
d="M188.4 71.7a10.4 10.4 0 01-20.8 0 10.4 10.4 0 1120.8 0zM224.2 45c-2.2-3.9-5-7.5-8.2-10.7l-12 7c-3.7-3.2-8-5.7-12.6-7.3a49.4 49.4 0 00-9.7 13.9 59 59 0 0140.1 14l7.6-4.4a57 57 0 00-5.2-12.5zM178 125.1c4.5 0 9-.6 13.4-1.7v-14a40 40 0 0012.5-7.2 47.7 47.7 0 00-7.1-15.3 59 59 0 01-32.2 27.7v8.7c4.4 1.2 8.9 1.8 13.4 1.8zM131.8 45c-2.3 4-4 8.1-5.2 12.5l12 7a40 40 0 000 14.4c5.7 1.5 11.3 2 16.9 1.5a59 59 0 01-8-41.7l-7.5-4.3c-3.2 3.2-6 6.7-8.2 10.6z" />
<path fill="#00B4FF"
d="M224.2 98.4c2.3-3.9 4-8 5.2-12.4l-12-7a40 40 0 000-14.5c-5.7-1.5-11.3-2-16.9-1.5a59 59 0 018 41.7l7.5 4.4c3.2-3.2 6-6.8 8.2-10.7zm-92.4 0c2.2 4 5 7.5 8.2 10.7l12-7a40 40 0 0012.6 7.3c4-4.1 7.3-8.8 9.7-13.8a59 59 0 01-40-14l-7.7 4.4c1.2 4.3 3 8.5 5.2 12.4zm46.2-80c-4.5 0-9 .5-13.4 1.7V34a40 40 0 00-12.5 7.2c1.5 5.7 4 10.8 7.1 15.4a59 59 0 0132.2-27.7V20a53.3 53.3 0 00-13.4-1.8z" />
<path fill="#00B4FF"
d="M178 9.2a62.6 62.6 0 11-.1 125.2A62.6 62.6 0 01178 9.2m0-9.2a71.7 71.7 0 100 143.5A71.7 71.7 0 00178 0z" />
<path fill="#050A14"
d="M96.6 212v4.3c-9.2-.8-15.4-5.8-15.4-17.8V180h4.6v18.4c0 8.6 4 12.6 10.8 13.5zm16-31.9v18.4c0 8.9-4.3 12.8-10.9 13.5v4.4c9.2-.7 15.5-5.6 15.5-18v-18.3h-4.7zM62.2 199v-2.2c0-12.7-8.8-17.4-21-17.4-12.1 0-20.7 4.7-20.7 17.4v2.2c0 12.8 8.6 17.6 20.7 17.6 1.5 0 3-.1 4.4-.3l11.8 6.2 2-3.3-8.2-4-6.4-3.1a32 32 0 01-3.6.2c-9.8 0-16-3.9-16-13.3v-2.2c0-9.3 6.2-13.1 16-13.1 9.9 0 16.3 3.8 16.3 13.1v2.2c0 5.3-2.1 8.7-5.6 10.8l4.8 2.4c3.4-2.8 5.5-7 5.5-13.2zM168 215.6h5.1L156 179.7h-4.8l17 36zM143 205l7.4-15.7-2.4-5-15.1 31.4h5.1l3.3-7h18.3l-1.8-3.7H143zm133.7 10.7h5.2l-17.3-35.9h-4.8l17 36zm-25-10.7l7.4-15.7-2.4-5-15.1 31.4h5.1l3.3-7h18.3l-1.7-3.7h-14.8zm73.8-2.5c6-1.2 9-5.4 9-11.4 0-8-4.5-10.9-12.9-10.9h-21.4v35.5h4.6v-31.3h16.5c5 0 8.5 1.4 8.5 6.7 0 5.2-3.5 7.7-8.5 7.7h-11.4v4.1h10.7l9.3 12.8h5.5l-9.9-13.2zm-117.4 9.9c-9.7 0-14.7-2.5-18.6-6.3l-2.2 3.8c5.1 5 11 6.7 21 6.7 1.6 0 3.1-.1 4.6-.3l-1.9-4h-3zm18.4-7c0-6.4-4.7-8.6-13.8-9.4l-10.1-1c-6.7-.7-9.3-2.2-9.3-5.6 0-2.5 1.4-4 4.6-5l-1.8-3.8c-4.7 1.4-7.5 4.2-7.5 8.9 0 5.2 3.4 8.7 13 9.6l11.3 1.2c6.4.6 8.9 2 8.9 5.4 0 2.7-2.1 4.7-6 5.8l1.8 3.9c5.3-1.6 8.9-4.7 8.9-10zm-20.3-21.9c7.9 0 13.3 1.8 18.1 5.7l1.8-3.9a30 30 0 00-19.6-5.9c-2 0-4 .1-5.7.3l1.9 4 3.5-.2z" />
<path fill="#00B4FF"
d="M.5 251.9c29.6-.5 59.2-.8 88.8-1l88.7-.3 88.7.3 44.4.4 44.4.6-44.4.6-44.4.4-88.7.3-88.7-.3a7981 7981 0 01-88.8-1z" />
<path fill="none" d="M-565.2 324H-252v15.8h-313.2z" />
</svg>

Before

Width:  |  Height:  |  Size: 4.4 KiB

View File

@@ -1,118 +1,60 @@
<template>
<div class="flex row items-center no-wrap">
<svg
class="iconcolor q-mr-sm"
viewBox="0 0 8.4666662 8.4666662"
width="32"
height="32"
version="1.1"
id="svg1"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
<div class="flex row items-center no-wrap logo-component">
<LogoIcon
:class="{
'is-animated': animated,
'hide-bg': !withBackground
}"
:style="iconStyle"
/>
<div
:class="'text-' + textColor"
class="logo-text"
style="margin-left: 0.15em;"
>
<defs id="defs1" />
<g id="layer1">
<rect
style="fill:var(--icon-color);stroke-width:0.233149"
id="rect5"
width="6.9885192"
height="0.35581663"
x="3.114475"
y="0.86827624"
transform="matrix(0.77578367,0.63099897,-0.77578367,0.63099897,0,0)"
/>
<rect
style="fill:var(--icon-color);stroke-width:0.24961"
id="rect5-7"
width="7.4819207"
height="0.3809379"
x="-3.9267058"
y="5.7988153"
transform="matrix(-0.70756824,0.70664502,0.70756824,0.70664502,0,0)"
/>
<circle
style="fill:var(--icon-color);stroke-width:0.134869"
id="path5-8"
cx="1.5875"
cy="6.8791666"
r="1.0583333"
/>
<circle
style="fill:var(--icon-color);stroke-width:0.168586"
id="path5-8-5"
cx="7.1437502"
cy="7.1437502"
r="1.3229166"
/>
<circle
style="fill:var(--icon-color);stroke-width:0.118011"
id="path5-8-5-1"
cx="1.4552083"
cy="2.5135417"
r="0.92604166"
/>
<circle
style="fill:var(--icon-color);stroke-width:0.101152"
id="path5-8-5-1-7"
cx="7.1437502"
cy="1.3229166"
r="0.79374999"
/>
<circle
style="stroke-width:0.23602"
id="path5"
cx="3.96875"
cy="4.4979167"
r="1.8520833"
/>
</g>
</svg>
<span class="text-h4 text-bold q-pr-xs" style="color: var(--logo-color-bg-white);">
tgвыфвыф
</span>
<span class="text-h4 text-brand text-bold q-pa-0">
Projects
</span>
<span>tg</span>
<span class="text-bold">Crew</span>
</div>
</div>
</template>
<script setup lang="ts">
<script setup>
import { computed } from 'vue'
import { getCssVar } from 'quasar'
import LogoIcon from 'components/BaseLogoSvg.vue'
const props = defineProps({
textColor: {
type: String,
default: 'primary'
},
iconColor: {
type: String,
default: 'primary'
},
withBackground: {
type: Boolean,
default: false
},
animated: {
type: Boolean,
default: true
}
})
const iconStyle = computed(() => {
const color = getCssVar(props.iconColor) || props.iconColor
return {
color: color,
transform: 'scale(1.08)',
height: '1cap'
}
})
</script>
<style lang="scss">
body {
background: white;
margin: 0rem;
min-height: 100vh;
font-family: Futura, sans-serif;
}
#canvas {
position: absolute;
display: block;
top: 0;
left: 0;
z-index: -1;
}
.iconcolor {
--icon-color: var(--logo-color-bg-white);
}
@keyframes blink {
100%,
0% {
fill: $light-green-14;
}
60% {
fill: $green-14;
}
}
#path5 {
animation: blink 3s infinite;
<style lang="scss" scoped>
.hide-bg :deep(.logo-bg) {
display: none;
}
</style>

View File

@@ -0,0 +1,69 @@
<template>
<svg
viewBox="0 0 32 32"
xmlns="http://www.w3.org/2000/svg"
:class="{ 'is-animated': animated }"
class="base-logo-svg"
>
<defs>
<radialGradient id="logo-gradient" cx="50%" cy="50%" r="50%" fx="50%" fy="50%">
<stop offset="0%" stop-color="white" />
<stop offset="25%" stop-color="var(--q-primary, #1976D2)" stop-opacity="0.5" />
<stop offset="50%" stop-color="var(--q-primary, #1976D2)">
<animate
attributeName="offset"
values="1;0.6;1"
dur="6s"
repeatCount="indefinite"
/>
</stop>
</radialGradient>
</defs>
<rect class="logo-bg" width="32" height="32" rx="4" ry="4" fill="url(#logo-gradient)" />
<circle class="x" cx="16" cy="16" r="6" style="--t:scale(1.2)" fill="currentColor" />
<circle class="c" cx="7" cy="7" r="3" style="--t:translate(9px,9px)" fill="currentColor" />
<circle class="c" cx="28" cy="4" r="2" style="--t:translate(-12px,12px)" fill="currentColor" />
<circle class="c" cx="6" cy="26" r="4" style="--t:translate(10px,-10px)" fill="currentColor" />
<circle class="c" cx="26" cy="26" r="5" style="--t:translate(-10px,-10px)" fill="currentColor" />
<line class="l" x1="16" y1="16" x2="7" y2="7" pathLength="1" stroke="currentColor" />
<line class="l" x1="16" y1="16" x2="28" y2="4" pathLength="1" stroke="currentColor" />
<line class="l" x1="16" y1="16" x2="6" y2="26" pathLength="1" stroke="currentColor" />
<line class="l" x1="16" y1="16" x2="26" y2="26" pathLength="1" stroke="currentColor" />
</svg>
</template>
<script setup>
defineProps({
animated: {
type: Boolean,
default: true
}
})
</script>
<style lang="scss" scoped>
.base-logo-svg {
.x, .c { transform-box: fill-box; }
.l { stroke-width: 1.5; }
&.is-animated {
.x { animation: expand-r 6s infinite; }
.c { animation: o 6s infinite; }
.l {
stroke-dasharray: 1;
stroke-dashoffset: 1;
animation: draw 6s infinite;
}
}
}
@keyframes expand-r { 50% { r: 8px; } }
@keyframes o { 50% { transform: var(--t); } }
@keyframes draw {
0%, 100% { stroke-dashoffset: 0; }
50% { stroke-dashoffset: 1; }
}
</style>

View File

@@ -0,0 +1,179 @@
<template>
<div class="w100">
<div class="row justify-center w100">
<q-resize-observer @resize="checkSpace" />
<div
class="tabs-wrapper no-pointer-events"
style="position: absolute !important; visibility: hidden; height: 0"
>
<q-tabs
ref="hiddenTabsRef"
dense
shrink
align="center"
class="text-grey custom-tabs"
active-color="primary"
indicator-color="primary"
narrow-indicator
:arrows="false"
:outside-arrows="false"
:mobile-arrows="false"
>
<q-tab
v-for="tabItem in tabItems"
:key="tabItem.name"
:name="tabItem.name"
:label="$t(tabItem.label)"
class="custom-tab-item"
/>
</q-tabs>
</div>
<div :class="['tabs-wrapper', fogClass]">
<q-tabs
v-model="tab"
ref="tabsRef"
dense
shrink
align="center"
class="text-grey custom-tabs"
active-color="primary"
indicator-color="primary"
narrow-indicator
:arrows="false"
:outside-arrows="false"
:mobile-arrows="false"
:no-caps="isOverflowing || useTabsNoCaps"
@update:model-value="onTabChange"
>
<q-tab
v-for="tabItem in tabItems"
:key="tabItem.name"
:name="tabItem.name"
:label="$t(tabItem.label)"
class="custom-tab-item"
/>
<q-resize-observer @resize="updateScrollInfo" />
</q-tabs>
</div>
</div>
<div class="column items-center w100">
<slot :item="activeItem"/>
</div>
</div>
</template>
<script setup>
import { ref, computed, nextTick, onMounted } from 'vue'
const props = defineProps({
tabItems: { type: Array, required: true },
useTabsNoCaps: {
type: Boolean,
default: false
}
})
const emit = defineEmits(['update:tabs-no-caps'])
const tab = ref(props.tabItems[0]?.name)
const tabsRef = ref(null)
const hiddenTabsRef = ref(null)
const canScroll = ref(false)
const isOverflowing = ref(false)
const updateScrollInfo = () => {
const el = tabsRef.value?.$el.querySelector('.q-tabs__content')
if (el) canScroll.value = el.scrollWidth > el.clientWidth + 1
}
const checkSpace = (size) => {
const hiddenTabs = hiddenTabsRef.value?.$el.querySelector('.q-tabs__content')
if (hiddenTabs) {
isOverflowing.value = hiddenTabs.scrollWidth > size.width
if (isOverflowing.value !== props.useTabsNoCaps) {
emit('update:tabs-no-caps', isOverflowing.value)
}
}
}
const activeItem = computed(() =>
props.tabItems.find(t => t.name === tab.value) || props.tabItems[0]
)
const fogClass = computed(() => {
const activeNoCaps = isOverflowing.value || props.useTabsNoCaps
if (!canScroll.value || !activeNoCaps) return ''
const index = props.tabItems.findIndex(t => t.name === tab.value)
if (index === 0) return 'is-right'
if (index === props.tabItems.length - 1) return 'is-left'
return 'is-both'
})
const onTabChange = async() => {
await nextTick()
if (tabsRef.value) updateScrollInfo()
}
onMounted(async () => {
await nextTick()
updateScrollInfo()
})
</script>
<style scoped lang="scss">
.tabs-wrapper {
position: relative;
display: inline-block;
max-width: 100%;
&::before,
&::after {
content: '';
position: absolute;
top: 0;
bottom: 0;
width: 60px;
z-index: 10;
pointer-events: none;
transition: opacity 0.3s;
opacity: 0;
}
&::before {
left: 0;
background: linear-gradient(to right, $grey-11, transparent);
}
&::after {
right: 0;
background: linear-gradient(to left, $grey-11, transparent);
}
&.is-left::before,
&.is-both::before { opacity: 1; }
&.is-right::after,
&.is-both::after { opacity: 1; }
}
.custom-tabs {
background: transparent !important;
:deep(.q-tabs__content) {
overflow: hidden !important;
}
:deep(.q-tabs__arrow),
:deep(.q-icon) {
display: none !important;
}
:deep(.q-tab--no-caps) {
padding: 0 8px;
}
}
.custom-tab-item {
flex-shrink: 0;
white-space: nowrap;
}
</style>

View File

@@ -4,42 +4,42 @@
class="q-pa-md w100 flex justify-center"
style="max-width: 800px"
>
<q-list separator>
<q-expansion-item
group="FAQgroup"
v-for="item in 5"
<q-list>
<faq-section-item
v-for="item in 8"
:key="item"
switch-toggle-side
header-class="text-h5"
expand-icon="mdi-plus"
expanded-icon="mdi-close"
>
<template #header="{ expanded }">
<div :class="expanded ? 'text-brand' : ''" class="w100">
{{ $t('faq__question_' + item) }}
</div>
</template>
<q-card>
<q-card-section class="text-h6">
{{ $t('faq__answer_' + item) }}
</q-card-section>
</q-card>
</q-expansion-item>
:question="'faq__question_' + item"
:answer="'faq__answer_' + item"
class="q-my-md"
/>
</q-list>
<div
class="text-h6 text-primary q-py-md text-center"
>
{{ $t('faq__description') }}
<a
href="mailto:support@tgcrew.ru"
style="text-decoration: none; color: inherit"
>
support@tgcrew.ru
</a>
</div>
</div>
</slide-template>
</template>
<script setup lang="ts">
import SlideTemplate from 'components/SlideTemplate.vue';
import SlideTemplate from 'components/SlideTemplate.vue'
import FaqSectionItem from 'components/FAQSectionItem.vue'
</script>
<style scoped>
.custom-expansion.q-expansion-item--collapsed :deep(.q-item__section--side .q-icon) {
transition: transform 0.3s;
}
.custom-expansion.q-expansion-item--expanded :deep(.q-item__section--side .q-icon) {
transform: rotate(180deg);
}
<style scoped lang="scss">
.q-expansion-item--expanded.fix-icon-color:deep(i) {
color: $primary;
transition: transform 0.3s ease;
transform: rotate(45deg);
}
</style>

View File

@@ -0,0 +1,52 @@
<template>
<div class="column bg-grey-4 rounded-card q-px-xl q-pt-md">
<div class="row no-wrap items-center q-pb-md">
<div class="text-h6" style="flex-grow: 2;">
{{ $t(question ?? '') }}
</div>
<div class="q-pl-md">
<q-btn
@click="showAnswer=!showAnswer"
round unelevated color="white"
>
<q-icon
name="add"
:color="showAnswer ? 'primary' : 'grey'"
:class="showAnswer ? 'icon-rotated' : 'icon-rotated-back'"
/>
</q-btn>
</div>
</div>
<q-slide-transition>
<div v-if="showAnswer">
<div class="text-body text-grey-9 q-pb-md">
{{ $t(answer ?? '') }}
</div>
</div>
</q-slide-transition>
</div>
</template>
<script setup>
import { ref } from 'vue'
defineProps({
question: String,
answer: String
})
const showAnswer = ref(false)
</script>
<style scoped>
.icon-rotated {
transition: transform 0.3s ease;
transform: rotate(45deg);
}
.icon-rotated-back {
transition: transform 0.3s ease;
transform: rotate(0deg);
}
</style>

View File

@@ -1,58 +1,93 @@
<template>
<div class="q-pa-md w100 flex justify-between">
<div class="flex column q-mx-lg justify-center">
<div
v-for="item in Docs"
:key="item.id"
>
<a
:href="item.href"
target="_blank"
style="text-decoration: none; color: inherit"
<div>
<div class="w100 flex items-center justify-between q-px-md">
<div id="contact-block" class="flex column items-start q-py-sm">
<base-logo
animated
class="text-h6"
>
{{ $t(item.name) }}
</a>
</div>
</div>
/>
<div class="flex column q-mx-lg">
<div class="text-h6 bold">
{{ $t('footer__contacts_ip') }}
</div>
<div class="text-caption">
{{ $t('footer__contacts_ip_detail') }}
</div>
<div class="flex items-center">
<q-icon name="mdi-map-marker-outline" color="brand" class="q-pr-sm"/>
<div class="flex items-center no-wrap">
<q-icon name="mdi-map-marker-outline" color="brand" class="q-pr-xs"/>
<span>{{ $t('footer__contacts_location') }}</span>
</div>
<div class="flex items-center">
<q-icon name="mdi-phone-outline" color="brand" class="q-pr-sm" />
<span>+7 (926) 339-04-25</span>
<div class="flex items-center no-wrap">
<q-icon name="mdi-phone-outline" color="brand" class="q-pr-xs"/>
<span>+7 (916) 439-04-25</span>
</div>
<div class="flex items-center">
<q-icon name="mdi-email-outline" color="brand" class="q-pr-sm"/>
<div class="flex items-center no-wrap">
<q-icon name="mdi-email-outline" color="brand" class="q-pr-xs"/>
<a
href="mailto:a-mart@ya.ru"
href="mailto:info@tgcrew.ru"
style="text-decoration: none; color: inherit"
>
a-mart@ya.ru
info@tgcrew.ru
</a>
</div>
</div>
<div id="doc-block" class="text-grey q-py-sm">
<div
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>
<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>
<script setup lang="ts">
import BaseLogo from 'components/BaseLogo.vue'
import { useRouter } from 'vue-router'
import { docs } from 'src/docs'
const Docs = [
{ id: 1, name: 'footer__doc_terms_of_use', href: '' },
{ id: 2, name: 'footer__doc_privacy_policy', href: '' }
]
const router = useRouter()
</script>
<style scoped>

View File

@@ -1,77 +1,80 @@
<template>
<div
class="flex w100 q-pa-lg text-white relative-position"
:class="!isAlignTop ? 'justify-center' : 'justify-around vert-height'"
class="flex w100 justify-center items-center relative-position overflow-hidden"
style="
background-size: cover;
height: 100vh;
"
>
<svg v-if ="isAlignTop" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" preserveAspectRatio="none">
<polygon fill="white" points="0,0 55,0 45,101 0,101"/>
</svg>
<mesh-background v-if ="isAlignTop" style="z-index: -2"/>
<video
loop
autoplay
muted
src="/img/samolet.mp4"
class="absolute-full"
style="
z-index: 0;
object-fit: cover;
object-position: center center;
width: 100%;
height: 100%;
filter: blur(2px) brightness(0.9);
"
@canplay="$event.target.playbackRate = 0.4"
/>
<div
ref="slogan"
class="flex items-center"
>
class="column items-center no-wrap"
style="max-width: 75%; height: 100%; z-index: 10;" >
<div
class="flex column justify-center q-pa-lg q-ma-lg q-gutter-y-md no-wrap bg-transperant"
style="max-width: 400px; "
:style="!isAlignTop ? 'text-align : center' : ''"
class="column justify-end text-grey-4 text-center edge-block"
:class="$q.screen.lt.sm ? 'text-h5' : 'text-h4'"
>
<div class="text-h5 text-grey">
{{ $t('banner__slogan_prepend') }} &mdash;
{{ $t('banner__slogan_prepend') }}
</div>
<div class="text-h4 text-brand">
{{ $t('banner__slogan_body') }}
<span class="text-no-wrap">
<q-icon dense name="telegram" style="color: #27a7e7"/>
<span style="color: #27a7e7">Telegram</span>
</span>
</div>
<div>
<q-btn
size="lg"
color="brand"
class="q-mt-xl"
<div
class="text-white text-center q-py-lg center-block text-bold"
:class="$q.screen.lt.sm ? 'text-h4' : 'text-h3'"
style="line-height: 1.5em;"
>
<div class="flex items-center no-wrap">
<div>{{ $t('banner__main_btn')}}</div>
{{ $t('banner__slogan_body') }}
<span class="text-no-wrap" color="primary">
<q-icon dense name="telegram"/>
<span>Telegram</span>
</span>
</div>
<div class="column items-center edge-block">
<div class="edge-block"/>
<q-btn
size="xl"
color="primary"
class="q-mt-lg"
rounded
href="https://t.me/tgCrewBot"
>
<div class="flex items-center no-wrap center-block">
<div
class="q-pl-md"
:class="$q.screen.lt.sm ? 'text-h5' : 'text-h4'"
>
{{ $t('banner__main_btn')}}
</div>
<q-icon name="keyboard_arrow_right"/>
</div>
</q-btn>
<div class="text-white q-pt-sm edge-block justify-start text-grey-4">
{{ $t('banner__main_btn_description')}}
</div>
</div>
</div>
<div
ref="image"
class="text-red flex"
>
<img
src="/img/1.png"
class="q-ma-lg"
style="object-fit: scale-down;"
/>
</div>
<q-resize-observer @resize="checkAlign"/>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import meshBackground from 'components/meshBackground.vue'
const slogan = ref(null)
const image = ref(null)
const isAlignTop = ref(false)
const checkAlign = () => {
if (slogan.value && image.value)
isAlignTop.value = (slogan.value.offsetTop === image.value.offsetTop)
}
<script setup>
</script>
<style scoped>
<style scoped lang="scss">
.vert-height {
min-height: calc(100vh * 0.75);
}
@@ -86,5 +89,13 @@
width: 100%;
height: 100%;
z-index:-1;
}
}
.center-block {
flex: 0 0 auto;
}
.edge-block {
flex: 1
}
</style>

View File

@@ -1,120 +1,67 @@
<template>
<slide-template title="how_it_works__title">
<q-resize-observer @resize="updateBlock"/>
<div
v-if="typeComponent !== 'tablet'"
class="flex row q-col-gutter-lg q-pa-md justify-center"
<slide-template
title="how_it_works__title"
class="overflow-hidden w100"
>
<div
:class="typeComponent === 'wide' ? 'col' : 'col-12'"
v-for="item in 4"
:key="item"
style="align-items: stretch;"
<custom-tabs
v-bind="$attrs"
:tabItems
:useTabsNoCaps
>
<q-card
class="q-pa-md fit"
>
<div class="flex column justify-between fit no-wrap">
<div class="flex column w100">
<span class="text-uppercase text-grey text-h6">
{{ $t('how_works__step' + item) }}
</span>
<span class="text-h6">
{{ $t('how_works__step' + item + '_description') }}
</span>
<div class="text-grey">
{{ $t(item !== 4 ? 'how_works__step_admin': 'how_works__step_user') }}
</div>
</div>
<div
class="flex column items-center justify-end q-mt-md text-grey col-grow"
>
<img
:src="'/img/' + item +'.png'"
style="object-fit: contain; max-width: 100%;"
<template #default="{ item }">
<div class="relative-position w60 q-pt-md">
<div style="height: 60vh; position: relative;">
<iframe
v-if="item.name === 'intro'"
:key="item.name"
:src="item.url"
allow="autoplay; fullscreen; picture-in-picture; encrypted-media; gyroscope; accelerometer; clipboard-write; screen-wake-lock; fullscreen;"
frameborder="0"
style="position: absolute; width: 100%; height: 100%; top: 0; left: 0;"
/>
</div>
</div>
</q-card>
</div>
</div>
<div
v-if="typeComponent === 'tablet'"
class="flex row w100 q-pa-none no-wrap items-center no-scroll"
>
<div class="col-8">
<q-list>
<q-item
v-for="item in 4"
:key="item"
clickable
v-ripple
@click="activeItem=item"
:active="activeItem===item"
active-class="primary"
>
<q-item-section avatar>
<q-avatar color="brand" text-color="white">
<span v-if="item !== 4">{{item}}</span>
<q-icon v-else name="mdi-check"/>
</q-avatar>
</q-item-section>
<q-item-section>
<span class="text-h6">
{{ $t('how_works__step' + item + '_description') }}
</span>
</q-item-section>
</q-item>
</q-list>
</div>
<div class="col-4">
<q-tab-panels v-model="activeItem" animated>
<q-tab-panel
v-for="item in 4"
:key="item"
:name="item"
>
<div class="flex column items-center">
<div class="text-grey">
{{ $t(item !== 4 ? 'how_works__step_admin': 'how_works__step_user') }}
</div>
<img
:src="'/img/' + item +'.png'"
style="object-fit: contain; max-width: 100%;"
<div v-else class="relative-position fit">
<q-skeleton
type="rect"
class="fit"
style="border-radius: var(--base-radius);"
/>
</div>
</q-tab-panel>
</q-tab-panels>
<div class="absolute-center text-h4 text-uppercase text-grey-8">
{{ $t('how_it_works__coming_soon') }}
</div>
</div>
</slide-template>
</div>
</div>
</template>
</custom-tabs>
</slide-template>
</template>
<script setup lang="ts">
import { ref } from 'vue'
<script setup>
import SlideTemplate from 'components/SlideTemplate.vue'
import CustomTabs from 'components/CustomTabs.vue'
const typeComponent = ref('wide')
defineProps({
useTabsNoCaps: Boolean
})
const updateBlock = ({ width }) => {
typeComponent.value = width >= 1000
? 'wide'
: width < 600
? 'mobile'
: 'tablet'
const tabItems = [
{
name: 'intro',
label: 'how_it_works__intro',
url: 'https://kinescope.io/8fMxE2gUwNk5HH8jFUgHD2'
},
{
name: 'admin',
label: 'how_it_works__admin',
url: 'https://kinescope.io/embed/5yesvjfi6XAYRuxzbsYGHZ'
},
{
name: 'user',
label: 'how_it_works__user',
url: 'https://kinescope.io/embed/5yesvjfi6XAYRuxzbsYGHZ'
}
const activeItem = ref(1)
]
</script>
<style scoped lang="scss">
</style>

View File

@@ -0,0 +1,48 @@
<template>
<q-markdown
:src="markdownContent"
no-heading-anchor-links
linkify
/>
</template>
<script setup lang="ts">
import { computed } from 'vue'
const props = defineProps({
locale: {
type: String,
required: true
},
documentName: {
type: String,
required: true
}
})
// Импорт всех Markdown-файлов как raw-строк
const mdFiles = import.meta.glob('assets/docs/*.md', {
query: '?raw',
import: 'default',
eager: true
})
const markdownContent = computed(() => {
const baseLang = props.locale.split('-')[0].toLowerCase()
// Формируем имена файлов
const localizedFileName = `${props.documentName}_${baseLang}.md`
const fallbackFileName = `${props.documentName}_en.md`
// Находим пути к файлам
const filePaths = Object.keys(mdFiles)
const localizedPath = filePaths.find(path => path.endsWith(localizedFileName))
const fallbackPath = filePaths.find(path => path.endsWith(fallbackFileName))
// Возвращаем контент в порядке приоритета
if (localizedPath) return mdFiles[localizedPath]
if (fallbackPath) return mdFiles[fallbackPath]
return `# Document load error\n> Missing files for ${props.documentName}`
})
</script>

View File

@@ -1,28 +1,52 @@
<template>
<slide-template title="price__title">
<q-card
class="flex column justify-center q-my-md items-center q-gutter-y-md"
style="max-width: 400px"
<slide-template
title="price__title"
subtitle="price__subtitle"
>
<div class="flex column items-center">
<div class="flex text-h6">
<telegram-star color="gold" size="24px"/>
<span class="q-ml-sm" style="text-decoration: line-through;">2</span>&nbsp;
<span class="text-bold text-red">0</span>&nbsp;
<span>- {{ $t('price__chat_per_day') }}</span>
</div>
<div class="flex items-center">
<q-badge color="red" class="q-mr-sm">100% OFF</q-badge>
<span>{{ $t('price__sale_date') }}</span>
<custom-tabs
v-bind="$attrs"
:tabItems
:useTabsNoCaps
>
<template #default="{ item }">
<div
class="fit row q-pb-lg"
>
<div class="col-md-3 col-sm-6 col-xs-12 q-pa-lg"
v-for="(tariff, idx) in tariffs"
:key="idx"
>
<price-section-item
:name="tariff.name"
:chats-qty="tariff.chatsQty ?? 0"
:price="item.name === 'legal' ? tariff.price_rub : tariff.price"
:price_unit="item.name === 'legal' ? 'rub' : 'stars'"
/>
</div>
</div>
<q-card
flat
class="bg-grey-3"
style="border-radius: 12px;"
class="bg-white rounded-card"
>
<q-item>
<q-item v-if="item.name === 'legal'">
<q-item-section avatar>
<span class="text-h4 text-grey q-px-sm">
</span>
</q-item-section>
<q-item-section>
<q-item-label class="text-grey">
{{ $t('price__rub_pay') }}
</q-item-label>
<q-item-label class="text-h6">
{{ $t('price__rub_resident') }}
</q-item-label>
<q-item-label class="text-grey">
{{ $t('price__rub_closing_documents') }}
</q-item-label>
</q-item-section>
</q-item>
<q-item v-if="item.name === 'individual'">
<q-item-section avatar>
<telegram-star color="gold" size="48px"/>
</q-item-section>
@@ -39,40 +63,34 @@
</q-item-section>
</q-item>
</q-card>
<q-list class="q-my-none q-pa-md">
<q-item
v-for="item in priceItems"
:key="item.id"
dense
>
<q-item-section avatar>
<q-avatar text-color="brand">
<q-icon v-if="item.icon" :name="item.icon" size="md"/>
<span v-else class="text-bold">{{ item.text }}</span>
</q-avatar>
</q-item-section>
<q-item-section>
{{ $t(item.label)}}
</q-item-section>
</q-item>
</q-list>
</q-card>
</template>
</custom-tabs>
</slide-template>
</template>
<script setup lang="ts">
import telegramStar from 'components/TelegramStar.vue'
<script setup>
import SlideTemplate from 'components/SlideTemplate.vue'
import CustomTabs from 'components/CustomTabs.vue'
import PriceSectionItem from 'components/PriceSectionItem.vue'
import TelegramStar from 'components/TelegramStar.vue'
const priceItems = [
{ id: 1, icon: 'mdi-all-inclusive', label: 'price_unlimited_users' },
{ id: 2, icon: 'mdi-all-inclusive', label: 'price_unlimited_projects' },
{ id: 3, text: '5', label: 'price_free_chats' },
{ id: 4, icon: 'mdi-lifebuoy', label: 'price_support' }
defineProps({
useTabsNoCaps: Boolean
})
const tabItems = [
{ name: 'legal', label: 'price__legal'},
{ name: 'individual', label: 'price__individual'}
]
const tariffs = [
{ id: 1, name: 'TEST', price: 0, price_rub: 0, chatsQty: 5 },
{ id: 2, name: 'START', price: 1000, price_rub: 2000, chatsQty: 15 },
{ id: 3, name: 'PRO', price: 5000, price_rub: 10000, chatsQty: 40 },
{ id: 4, name: 'VIP', price: 12000, price_rub: null, chatsQty: null }
]
</script>
<style scoped>
<style scoped lang="scss">
</style>

View File

@@ -0,0 +1,73 @@
<template>
<div
class="flex column items-center bg-white rounded-card q-pa-md crew-card fit"
>
<div class="text-h5 text-primary text-bold">
{{ name }}
</div>
<div class="flex items-center" style="min-height: 50px;">
<div v-if="price" class="flex column items-center">
<div class="flex no-wrap items-center">
<span
v-if="price_unit === 'rub'"
class="text-h4 text-grey q-pr-xs">
</span>
<telegram-star
v-if="price_unit === 'stars'"
color="gold"
size="24px"
class="q-mr-xs"
/>
<span class="text-h4">{{ price.toLocaleString(locale) }}</span>
</div>
<span class="text-caption">{{ $t('price__per_month') }}</span>
</div>
<div v-else-if="price === 0" class="text-bold text-h5">
{{ $t('price__free_tax') }}
</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 class="flex items-center q-pt-md" style="min-height: 50px;">
<div class="flex no-wrap items-center">
<span v-if="chatsQty" class="text-amber-8 text-bold text-h5">
{{ chatsQty }}
</span>
<q-icon v-else name="mdi-all-inclusive" size="md" color="amber-8"/>
<span class="q-pl-sm">
{{ $t('price__chats')}}
</span>
</div>
</div>
</div>
</template>
<script setup lang="ts">
import telegramStar from 'components/TelegramStar.vue'
import { useI18n } from 'vue-i18n'
const { locale } = useI18n({ useScope: 'global' })
defineProps({
name: String,
price: Number,
chatsQty: Number,
price_unit: String
})
</script>

View File

@@ -1,88 +1,35 @@
<template>
<slide-template title="problem__title">
<div ref="container" class="w100">
<q-resize-observer @resize="updateWidth" />
<div
v-for="(row, rowIndex) in rows"
:key="rowIndex"
class="row q-py-none"
:class="rowClass(row.length)"
class="fit row"
>
<div
v-for="(item, itemIndex) in row"
:key="itemIndex"
class="flex-item"
:style="itemStyle(row.length)"
class="flex col-sm-6 col-xs-12 q-pa-lg"
v-for="(item, idx) in problems"
:key="idx"
>
<problem-section-item
:icon="item.icon"
:title="item.title"
:description="item.description"
style="overflow: hidden; min-width: 200px; max-width: 100%"
class="bg-red"
/>
</div>
</div>
</div>
</slide-template>
</template>
<script setup lang="ts">
import { ref, computed } from 'vue'
import ProblemSectionItem from 'components/ProblemSectionItem.vue'
import SlideTemplate from 'components/SlideTemplate.vue'
import ProblemSectionItem from 'components/ProblemSectionItem.vue'
const problems = [
{ id: 1, icon: 'mdi-account-group-outline', title: 'problem__address_book', description: 'problem__address_book_description' },
{ id: 2, icon: 'mdi-clipboard-outline', title: 'problem__task_manager', description: 'problem__task_manager_description' },
{ id: 3, icon: 'mdi-calendar-month', title: 'problem__meeting', description: 'problem__meeting_description' },
{ id: 4, icon: 'mdi-folder-open-outline', title: 'problem__files', description: 'problem__files_description' },
{ id: 5, icon: 'mdi-lock-outline', title: 'problem__privacy', description: 'problem__privacy_description' }
{ id: 1, icon: 'mdi-folder-multiple-outline', title: 'problem__1', description: 'problem__1_description' },
{ id: 2, icon: 'mdi-account-group-outline', title: 'problem__2', description: 'problem__2_description' },
{ id: 3, icon: 'mdi-chat-processing-outline', title: 'problem__3', description: 'problem__3_description' },
{ id: 4, icon: 'mdi-lock-check-outline', title: 'problem__4', description: 'problem__4_description' },
]
const baseWidth = 250
const containerWidth = ref(0)
const updateWidth = ({ width }) => {
containerWidth.value = width
}
const maxPerRow = computed(() => {
return Math.max(1, Math.floor(containerWidth.value / baseWidth))
})
const rows = computed(() => {
const total = problems.length
const maxRow = maxPerRow.value
if (maxRow >= total) return [problems]
const rowCount = Math.ceil(total / maxRow)
const baseItems = Math.floor(total / rowCount)
const extra = total % rowCount
const result = []
let start = 0
for (let i = 0; i < rowCount; i++) {
const take = baseItems + (i < extra ? 1 : 0)
result.push(problems.slice(start, start + take))
start += take
}
return result
})
const rowClass = (count) => {
return count === 1 ? 'justify-center' : 'justify-between'
}
const itemStyle = (count) => {
return {
flex: `0 0 ${100 / count}%`,
maxWidth: `${100 / count}%`
}
}
</script>
<style scoped>

View File

@@ -1,31 +1,32 @@
<template>
<div class="flex column items-center q-pa-md q-ma-md">
<div>
<q-avatar
color="brand"
text-color="white"
:icon
font-size="65px"
size="100px"
class="q-my-md"
<div
class="crew-card column items-center q-pa-xl cursor-pointer fit"
>
<q-icon
:name="icon"
size="xl"
color="primary"
/>
<div class="text-bold text-h5 text-center q-pt-md">
{{ $t(title ?? '') }}
</div>
<div class="text-bold text-h4">
{{ $t(title) }}
</div>
<div class="text-h6 text-grey-8" style="max-width: 250px; text-align: center;">
{{ $t(description) }}
<div class="text-grey text-body1 text-center q-pt-sm text-wrap">
{{ $t(description ?? '') }}
</div>
</div>
</template>
<script setup lang="ts">
defineProps({
icon: String,
title: String,
description: String
})
</script>
<style scoped>
<style scoped lang="scss">
</style>

View File

@@ -1,8 +1,17 @@
<template>
<div class="flex column no-wrap">
<div class="flex w100 justify-center text-h4 q-mt-md text-bold q-pa-md text-grey">
<div class="flex column no-wrap q-mt-lg">
<div
v-if="title"
class="w100 q-my-md q-px-md text-h4 text-bold text-grey text-center"
>
{{ $t(title) }}
</div>
<div
v-if="subtitle"
class="w100 q-mb-md q-px-xl text-h6 text-grey-7 text-center"
>
{{ $t(subtitle) }}
</div>
<div class="flex w100 justify-center q-pb-md column items-center">
<slot/>
</div>
@@ -12,7 +21,8 @@
<script setup lang="ts">
defineProps({
title: String
title: String,
subtitle: String
})
</script>

View File

@@ -1,145 +0,0 @@
<template>
<div
id="background-canvas-wrapper"
class="flex fit column"
style="background-color: #00c853; opacity:0.65"
>
<canvas id="canvas" class="fit"/>
</div>
</template>
<script setup>
import { onMounted } from 'vue'
onMounted(() => {
const canvasBody = document.getElementById("canvas")
const drawArea = canvasBody.getContext("2d")
const opts = {
particleColor: "rgb(255,255,255)",
lineColor: "rgb(200,200,200)",
particleAmount: 50,
defaultSpeed: 0.1,
variantSpeed: 1,
defaultRadius: 3,
variantRadius: 2,
linkRadius: 200
}
const delay = 200
let tid
const rgb = opts.lineColor.match(/\d+/g)
let w
let h
const particles = []
function resizeReset () {
w = canvasBody.width = window.innerWidth
h = canvasBody.height = window.innerHeight
}
function deBouncer () {
clearTimeout(tid)
tid = setTimeout(function() {
resizeReset()
}, delay)
}
function checkDistance (x1, y1, x2, y2) {
return Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2))
}
function setup () {
resizeReset()
for (let i = 0; i < opts.particleAmount; i++){
particles.push(new Particle())
}
window.requestAnimationFrame(loop)
}
function loop() {
window.requestAnimationFrame(loop)
drawArea.clearRect(0, 0, w, h)
for (let i = 0; i < particles.length; i++){
particles[i].update()
particles[i].draw()
}
for (let i = 0; i < particles.length; i++){
linkPoints(particles[i], particles)
}
}
function linkPoints (point1, hubs){
for (let i = 0; i < hubs.length; i++) {
const distance = checkDistance(point1.x, point1.y, hubs[i].x, hubs[i].y)
const opacity = 1 - distance / opts.linkRadius
if (opacity > 0) {
drawArea.lineWidth = 0.5
drawArea.strokeStyle = `rgba(${rgb[0]}, ${rgb[1]}, ${rgb[2]}, ${opacity})`
drawArea.beginPath()
drawArea.moveTo(point1.x, point1.y)
drawArea.lineTo(hubs[i].x, hubs[i].y)
drawArea.closePath()
drawArea.stroke()
}
}
}
function Particle () {
this.x = Math.random() * w
this.y = Math.random() * h
this.speed = opts.defaultSpeed + Math.random() * opts.variantSpeed
this.directionAngle = Math.floor(Math.random() * 360)
this.color = opts.particleColor
this.radius = opts.defaultRadius + Math.random() * opts. variantRadius
this.vector = {
x: Math.cos(this.directionAngle) * this.speed,
y: Math.sin(this.directionAngle) * this.speed
};
this.update = function(){
this.border();
this.x += this.vector.x
this.y += this.vector.y
};
this.border = function(){
if (this.x >= w || this.x <= 0) {
this.vector.x *= -1;
}
if (this.y >= h || this.y <= 0) {
this.vector.y *= -1;
}
if (this.x > w) this.x = w
if (this.y > h) this.y = h
if (this.x < 0) this.x = 0
if (this.y < 0) this.y = 0
}
this.draw = function(){
drawArea.beginPath()
drawArea.arc(this.x, this.y, this.radius, 0, Math.PI*2)
drawArea.closePath()
drawArea.fillStyle = this.color
drawArea.fill()
}
}
window.addEventListener("resize", function(){ deBouncer() })
resizeReset()
setup()
})
</script>
<style>
#background-canvas-wrapper {
position: absolute !important;
display: block;
top: 0;
left: 0;
z-index: -1;
margin: 0;
min-height: 100%;
}
</style>

View File

@@ -1,9 +1,58 @@
// app global css in SCSS form
.bg-t-primary {
background: $t-bg-color !important;
}
.bg-t-secondary {
background: $t-secondary-bg-color !important;
}
.bg-t-bottom-bar {
background: $t-bottom-bar-bg-color !important;
}
.t-section-separator {
color: $t-section-separator-color !important;
}
.t-text {
color: $t-text-color !important;
}
.t-text-hint {
color: $t-hint-color !important;
}
.t-text-subtitle {
color: $t-subtitle-text-color !important;
}
.t-text-accent {
color: $t-accent-text-color !important;
}
.t-text-section-header {
color: $t-section-header-text-color !important;
}
.text-brand {
color: $green-14 !important;
color: $brand !important;
}
.bg-brand {
background: $green-14 !important;
background: $brand !important;
}
.bg-base {
background: $base-bg !important;
}
.text-tgcolor {
color: $tgcolor !important;
}
.bg-tgcolor {
background: $tgcolor !important;
}
$base-width: 100;
@@ -12,12 +61,71 @@ $base-width: 100;
$base-width: $base-width - 10;
}
body, html, #q-app {
font-family: $typography-font-family;
background-color: transparent !important;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
* {
font-family: inherit;
}
:root {
--body-width: 1200px;
--body-width: 1240px;
--logo-color-bg-white: grey;
--base-radius: 24px;
--t-bg-color: #{$t-bg-color};
--t-secondary-bg-color: #{$t-secondary-bg-color};
--t-section-bg-color: #{$t-section-bg-color};
--t-header-bg-color: #{$t-header-bg-color};
--t-bottom-bar-bg-color: #{$t-bottom-bar-bg-color};
--t-text-color: #{$t-text-color};
--t-hint-color: #{$t-hint-color};
--t-subtitle-text-color: #{$t-subtitle-text-color};
--t-accent-text-color: #{$t-accent-text-color};
--t-section-header-text-color: #{$t-section-header-text-color};
--t-button-color: #{$t-button-color};
--t-button-text-color: #{$t-button-text-color};
--t-link-color: #{$t-link-color};
--t-destructive-text-color: #{$t-destructive-text-color};
--t-section-separator-color: #{$t-section-separator-color};
}
.main-content {
max-width: var(--body-width) !important;
margin: 0 auto;
}
.rounded-card {
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-family: 'myFont';
src: url(./fonts/Inter-Regular.woff2);
}

Binary file not shown.

View File

@@ -1,18 +1,45 @@
// Quasar SCSS (& Sass) Variables
// --------------------------------------------------
// To customize the look and feel of this app, you can override
// the Sass/SCSS variables found in Quasar's source Sass/SCSS files.
/* telegram theme on Android 2026
bg-color: #ffffff
secondary-bg-color: #f1f1f3
section-bg-color: #ffffff
header-bg-color: #ffffff
bottom-bar-bg-color: #f1f1f3
// Check documentation for full list of Quasar variables
text-color: #1a1d21
hint-color: #a8a8a8
subtitle-text-color: #82868a
accent-text-color: #1c93e3
section-header-text-color: #298acf
// Your own variables (that are declared here) and Quasar's own
// ones will be available out of the box in your .vue/.scss/.sass files
// It's highly recommended to change the default colors
// to match your app's branding.
// Tip: Use the "Theme Builder" on Quasar's documentation website.
button-color: #229af0
button-text-color: #ffffff
link-color: #2678b6
destructive-text-color: #cc2929
$primary : #1976D2;
section-separator-color: #d9d9d9
*/
$t-bg-color: #ffffff;
$t-secondary-bg-color: #f1f1f3;
$t-section-bg-color: #ffffff;
$t-header-bg-color: #ffffff;
$t-bottom-bar-bg-color: #f1f1f3;
$t-text-color: #1a1d21;
$t-hint-color: #a8a8a8;
$t-subtitle-text-color: #82868a;
$t-accent-text-color: #1c93e3;
$t-section-header-text-color: #298acf;
$t-button-color: #229af0;
$t-button-text-color: #ffffff;
$t-link-color: #2678b6;
$t-destructive-text-color: #cc2929;
$t-section-separator-color: #d9d9d9;
$primary : $t-button-color;
$secondary : #26A69A;
$accent : #9C27B0;
@@ -20,6 +47,17 @@ $dark : #1D1D1D;
$dark-page : #121212;
$positive : #21BA45;
$negative : #C10015;
$negative : $t-destructive-text-color;
$info : #31CCEC;
$warning : #F2C037;
$lightgrey : $t-secondary-bg-color;
$brand: #419FD9;
$base-bg: #517DA2;
$tgcolor: #419FD9;
$body-font-size: var(--dynamic-font-size);
$typography-font-family: 'myFont', Roboto !default;

26
src/docs.js Normal file
View File

@@ -0,0 +1,26 @@
export const docs = [
{
id: 1,
route: 'terms',
file: 'Terms_of_use',
translationKey: 'footer__doc_terms_of_use'
},
{
id: 2,
route: 'privacy_policy',
file: 'Privacy-Policy',
translationKey: 'footer__doc_privacy_policy'
},
{
id: 3,
route: 'consent',
file: 'Consent_to_Personal_Data_Processing',
translationKey: 'footer__doc_consent'
},
{
id: 4,
route: 'subscription_guide',
file: 'Subscription_guide',
translationKey: 'footer__doc_subscription_guide'
}
]

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

@@ -1,8 +1,31 @@
<template>
<q-layout view="lHr lpr lFr" class="bg-transparent">
<q-header class="main-content text-grey glass">
<div ref="headerContainer" class="flex q-ma-md justify-between no-wrap items-center">
<base-logo ref="logo"/>
<q-layout view="lHr lpr lFr" class="bg-grey-11 relative-position">
<q-header
class="main-content bg-transparent"
reveal
style="transition: all 0.5s ease"
ref="headerRef"
>
<div
class="q-mx-md q-mt-lg q-py-sm q-px-md"
:class="isHeroScroll ? 'text-white' : 'text-white glass shadow-6'"
:style="{
'backdrop-filter': isHeroScroll ? 'none' : 'blur(12px) saturate(180%)',
'-webkit-backdrop-filter': isHeroScroll ? 'none' : 'blur(12px) saturate(180%)',
'border-radius': 'var(--base-radius)',
'transition': 'all 0.5s ease'
}"
>
<div
ref="headerContainer"
class="flex justify-between no-wrap items-center"
>
<base-logo
ref="logo"
class="text-h5"
:icon-color="isHeroScroll ? 'white' : 'primary'"
:text-color="isHeroScroll ? 'white' : 'primary'"
/>
<div
ref="menuContainer"
class="row items-center q-ml-md no-wrap"
@@ -20,18 +43,26 @@
no-caps
@click="scrollToElement(item.ref)"
ref="menuButtons"
:color="isHeroScroll ? 'white' : 'black'"
>
<span class="text-no-wrap">{{ $t(item.title) }}</span>
</q-btn>
</div>
<q-btn
v-if="!showFullMenu"
flat
round
icon="menu"
@click="showDrawer = !showDrawer"
:color="isHeroScroll ? 'white' : 'black'"
/>
<q-btn outline color="primary" class="q-ml-sm">
<q-btn
outline
:color="isHeroScroll ? 'white' : 'black'"
class="q-ml-sm"
>
<div class="flex items-center no-wrap">
<span class="text-bold">{{ locale.split('-')[0] }}</span>
</div>
@@ -40,20 +71,23 @@
<q-list style="min-width: 100px">
<q-item
v-for="lang in langNames"
:key="lang"
:key="lang.locale"
clickable
v-close-popup
@click="setLocale(lang)"
>
<q-item-section>
<q-item-label :class="isCurrentLang(lang.locale) ? 'text-primary' : ''">{{ lang.label }}</q-item-label>
<q-item-label :class="isCurrentLang(lang.locale) ? 'text-primary' : ''">
{{ lang.label }}
</q-item-label>
</q-item-section>
</q-item>
</q-list>
</q-menu>
</q-btn>
</div>
<q-resize-observer @resize="checkSpace"/>
<q-resize-observer @resize="checkSpace" />
</div>
</div>
</q-header>
@@ -77,33 +111,63 @@
</div>
</q-drawer>
<q-page-container
class="main-content q-pa-none q-ma-none bg-transparent"
>
<q-page-container class="main-content q-pa-none q-ma-none bg-transparent">
<q-scroll-observer axis="vertical" @scroll="updateHeaderStyle" />
<q-page class="column">
<hero-banner/>
<problem-section/>
<how-works-section id='how_works'/>
<price-section id='price'/>
<faq-section id='FAQ'/>
<footer-section id='contacts' class="bg-grey-14 text-white"/>
<hero-banner
class="q-pa-none q-pt-xl"
style="margin-top: -100px"
id="hero_banner"
/>
<problem-section id="problems"/>
<how-works-section
id="how_works"
@update:tabs-no-caps="val => tab1 = val"
:useTabsNoCaps
/>
<price-section
id="price"
@update:tabs-no-caps="val => tab2 = val"
:useTabsNoCaps
/>
<faq-section id="FAQ" />
<footer-section id="contacts" />
</q-page>
</q-page-container>
</q-layout>
</template>
<script setup>
import { ref, onMounted, nextTick } from 'vue'
import { ref, onMounted, nextTick, watch } from 'vue'
import { useRoute } from 'vue-router'
import { scroll } from 'quasar'
import { useI18n } from 'vue-i18n'
import { setGlobalLocale } from 'src/boot/i18n'
import baseLogo from 'components/BaseLogo.vue'
import heroBanner from 'components/HeroBanner.vue'
import problemSection from 'components/ProblemSection.vue'
import HeroBanner from 'components/HeroBanner.vue'
import ProblemSection from 'components/ProblemSection.vue'
import HowWorksSection from 'components/HowWorksSection.vue'
import PriceSection from 'components/PriceSection.vue'
import FaqSection from 'components/FAQSection.vue'
import FooterSection from 'components/FooterSection.vue'
const { locale } = useI18n({ useScope: 'global' })
const { getScrollTarget, setVerticalScrollPosition } = scroll
const route = useRoute()
const isHeroScroll = ref(true)
const showDrawer = ref(false)
const showFullMenu = ref(true)
const isManualScrolling = ref(false)
const menuButtons = ref([])
const headerContainer = ref(null)
const logo = ref(null)
const menuContainer = ref(null)
const headerRef = ref(null)
const HEADER_OFFSET = 60
const menuItems = [
{ id: 0, title: 'main__how_it_works', ref: 'how_works' },
@@ -112,64 +176,108 @@
{ id: 3, title: 'main__contacts', ref: 'contacts' }
]
const showFullMenu = ref(true)
const menuButtons = ref([])
const headerContainer = ref(null)
const logo = ref(null)
const menuContainer = ref(null)
const allSections = [
'hero_banner',
'problems',
'how_works',
'price',
'FAQ',
'contacts'
]
const calculateButtonsWidth = () => {
return menuButtons.value.reduce(
(total, btn) => total + (btn?.$el.offsetWidth || 0), 0
)
const langNames = [
{ locale: 'en-US', label: 'English' },
{ locale: 'ru-RU', label: 'Русский' }
]
const updateHeaderStyle = (e) => {
isHeroScroll.value = e.position.top <= 15
if (isManualScrolling.value) return
for (const id of allSections) {
const el = document.getElementById(id)
if (el) {
const rect = el.getBoundingClientRect()
if (rect.top >= -100 && rect.top <= 150) {
if (id === 'hero_banner') {
if (window.location.hash !== '') {
history.replaceState(null, '', window.location.pathname + window.location.search)
}
} else {
const newHash = `#${id}`
if (window.location.hash !== newHash) {
history.replaceState(null, '', newHash)
}
}
break
}
}
}
}
const checkSpace = () => {
if (!headerContainer.value || !logo.value || !menuContainer.value) return
const headerWidth = headerContainer.value.offsetWidth
const logoWidth = logo.value.$el.offsetWidth
const menuMargin = parseFloat(getComputedStyle(menuContainer.value).marginLeft) || 0
const availableWidth = headerWidth - logoWidth - menuMargin - 40 // 40px - запас
const buttonsWidth = calculateButtonsWidth()
const availableWidth = headerWidth - logoWidth - menuMargin - 80
const buttonsWidth = menuButtons.value.reduce(
(total, btn) => total + (btn?.$el.offsetWidth || 0), 0
)
showFullMenu.value = buttonsWidth <= availableWidth
}
const scrollToElement = (id, animate = true) => {
const el = document.getElementById(id)
if (!el) return
const target = getScrollTarget(el)
const headerNativeEl = headerRef.value?.$el
if (animate) isManualScrolling.value = true
const duration = animate ? 350 : 0
setVerticalScrollPosition(target, el.offsetTop, duration)
const checkAction = () => {
if (headerNativeEl?.classList.contains('q-header--hidden')) {
setVerticalScrollPosition(target, el.offsetTop + HEADER_OFFSET, 100)
}
if (animate) {
setTimeout(() => { isManualScrolling.value = false }, 100)
}
}
if (animate) {
setTimeout(checkAction, 350)
showDrawer.value = false
history.pushState(null, '', `#${id}`)
} else {
setTimeout(checkAction, 350)
}
}
const isCurrentLang = (lang) => locale.value === lang
const setLocale = (newLocale) => setGlobalLocale(newLocale.locale)
onMounted(async () => {
await nextTick()
checkSpace()
if (route.hash) {
const id = route.hash.replace('#', '')
setTimeout(() => {
scrollToElement(id, false)
}, 450)
}
})
const useTabsNoCaps = ref(false)
const tab1 = ref(false)
const tab2 = ref(false)
import { scroll } from 'quasar'
const { getScrollTarget, setVerticalScrollPosition } = scroll
const scrollToElement = (id) => {
const el = document.querySelector('#' + id)
const target = getScrollTarget(el)
const offset = el.offsetTop - 12
const duration = 300
setVerticalScrollPosition(target, offset, duration)
showDrawer.value = false
}
import { useI18n } from 'vue-i18n'
import { setGlobalLocale } from 'src/boot/i18n'
const { locale } = useI18n({ useScope: 'global' })
const langNames = [
{ locale: 'en-US', label: 'English'},
{ locale: 'ru-RU', label: 'Русский'}
]
const isCurrentLang = (lang) => locale.value === lang
const setLocale = (newLocale) => {
setGlobalLocale(newLocale.locale)
}
watch([tab1, tab2], () => useTabsNoCaps.value = tab1.value || tab2.value)
</script>
<style scoped>
@@ -177,9 +285,8 @@
opacity: 0;
pointer-events: none;
}
.glass {
background-color: rgba(255, 255, 255, 0.8) !important;
backdrop-filter: blur(8px);
background-color: rgba(255, 255, 255, 0.451) !important;
border: 1px solid rgba(255, 255, 255, 0.3);
}
</style>

62
src/pages/DocPage.vue Normal file
View File

@@ -0,0 +1,62 @@
<template>
<div
class="flex justify-center"
style="height: 100vh"
>
<q-layout container style="max-width: 800px !important">
<q-page-container>
<q-page class="flex w100 column">
<div >
<div
class="main-content flex items-center column w100 q-px-lg q-pb-xl"
>
<base-logo
class="q-pa-md text-h4 cursor-pointer"
@click="router.push({ name: 'main' })"
/>
<div class="text-h5 text-bold">
{{ $te(getDoc(documentName)) ? $t(getDoc(documentName)) : '' }}
</div>
<markdown-viewver
v-if="documentName"
:locale
:documentName
/>
</div>
</div>
<q-page-scroller position="bottom-right" :scroll-offset="300" :offset="[18, 18]">
<q-btn fab icon="mdi-arrow-up" color="primary"/>
</q-page-scroller>
</q-page>
</q-page-container>
</q-layout>
</div>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import BaseLogo from 'components/BaseLogo.vue'
import MarkdownViewver from 'components/MarkdownViewver.vue'
import { useRoute, useRouter } from 'vue-router'
import { useI18n } from 'vue-i18n'
import { docs } from 'src/docs'
const { locale } = useI18n({ useScope: 'global' })
const route = useRoute()
const router = useRouter()
const documentName = ref(null)
const getDoc = (fileName) => {
return docs.find(d => d.file === fileName)?.translationKey
}
onMounted(() => {
const doc = docs.find(d => d.route === route.name)
if (doc) {
documentName.value = doc.file
} else {
router.replace('/404')
}
})
</script>

View File

@@ -1,13 +0,0 @@
<template>
<q-page class="flex flex-center">
<img
alt="Quasar logo"
src="~assets/quasar-logo-vertical.svg"
style="width: 200px; height: 200px"
>
</q-page>
</template>
<script setup>
//
</script>

View File

@@ -2,15 +2,6 @@ import { defineRouter } from '#q-app/wrappers'
import { createRouter, createMemoryHistory, createWebHistory, createWebHashHistory } from 'vue-router'
import routes from './routes'
/*
* If not building with SSR mode, you can
* directly export the Router instantiation;
*
* The function below can be async too; either use
* async/await or return a Promise which resolves
* with the Router instance.
*/
export default defineRouter(function (/* { store, ssrContext } */) {
const createHistory = process.env.SERVER
? createMemoryHistory
@@ -19,10 +10,6 @@ export default defineRouter(function (/* { store, ssrContext } */) {
const Router = createRouter({
scrollBehavior: () => ({ left: 0, top: 0 }),
routes,
// Leave this as is and make changes in quasar.conf.js instead!
// quasar.conf.js -> build -> vueRouterMode
// quasar.conf.js -> build -> publicPath
history: createHistory(process.env.VUE_ROUTER_BASE)
})

View File

@@ -1,14 +1,29 @@
const routes = [
{
name: 'main',
path: '/',
component: () => import('layouts/MainLayout.vue'),
children: [
{ path: '', component: () => import('pages/IndexPage.vue') }
]
component: () => import('layouts/MainLayout.vue')
},
{
name: 'privacy_policy',
path: '/privacy-policy',
component: () => import('pages/DocPage.vue')
},
{
name: 'terms',
path: '/terms-of-use',
component: () => import('pages/DocPage.vue')
},
{
name: 'consent',
path: '/consent',
component: () => import('pages/DocPage.vue')
},
{
name: 'subscription_guide',
path: '/subscription-guide',
component: () => import('pages/DocPage.vue')
},
// Always leave this as last one,
// but you can also remove it
{
path: '/:catchAll(.*)*',
component: () => import('pages/ErrorNotFound.vue')

BIN
~$i18n-2-landing.xlsm Normal file

Binary file not shown.