@skroz/frontend 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (95) hide show
  1. package/LICENCE.md +21 -0
  2. package/dist/auth/Auth.d.ts +8 -0
  3. package/dist/auth/Auth.js +52 -0
  4. package/dist/auth/AuthFooterLinks.d.ts +4 -0
  5. package/dist/auth/AuthFooterLinks.js +26 -0
  6. package/dist/auth/Forgot.d.ts +7 -0
  7. package/dist/auth/Forgot.js +68 -0
  8. package/dist/auth/Login.d.ts +8 -0
  9. package/dist/auth/Login.js +65 -0
  10. package/dist/auth/LoginForm.d.ts +6 -0
  11. package/dist/auth/LoginForm.js +48 -0
  12. package/dist/auth/RecoverPassword.d.ts +2 -0
  13. package/dist/auth/RecoverPassword.js +96 -0
  14. package/dist/auth/Register.d.ts +8 -0
  15. package/dist/auth/Register.js +68 -0
  16. package/dist/auth/ResendLinkButton.d.ts +11 -0
  17. package/dist/auth/ResendLinkButton.js +50 -0
  18. package/dist/auth/index.d.ts +8 -0
  19. package/dist/auth/index.js +22 -0
  20. package/dist/graphql/ForgotPasswordMutation.graphql.d.ts +24 -0
  21. package/dist/graphql/ForgotPasswordMutation.graphql.js +76 -0
  22. package/dist/graphql/LoginMutation.graphql.d.ts +26 -0
  23. package/dist/graphql/LoginMutation.graphql.js +69 -0
  24. package/dist/graphql/RegisterMutation.graphql.d.ts +26 -0
  25. package/dist/graphql/RegisterMutation.graphql.js +69 -0
  26. package/dist/graphql/ResendLinkButtonMutation.graphql.d.ts +25 -0
  27. package/dist/graphql/ResendLinkButtonMutation.graphql.js +76 -0
  28. package/dist/graphql/index.d.ts +5 -0
  29. package/dist/graphql/index.js +16 -0
  30. package/dist/graphql/recoveryMutation.graphql.d.ts +19 -0
  31. package/dist/graphql/recoveryMutation.graphql.js +67 -0
  32. package/dist/index.d.ts +4 -0
  33. package/dist/index.js +20 -0
  34. package/dist/ui/AreYouSure.d.ts +10 -0
  35. package/dist/ui/AreYouSure.js +43 -0
  36. package/dist/ui/FormError.d.ts +3 -0
  37. package/dist/ui/FormError.js +15 -0
  38. package/dist/ui/FormItem.d.ts +12 -0
  39. package/dist/ui/FormItem.js +27 -0
  40. package/dist/ui/H.d.ts +16 -0
  41. package/dist/ui/H.js +39 -0
  42. package/dist/ui/Panel.d.ts +16 -0
  43. package/dist/ui/Panel.js +24 -0
  44. package/dist/ui/SeoHead.d.ts +13 -0
  45. package/dist/ui/SeoHead.js +14 -0
  46. package/dist/ui/index.d.ts +6 -0
  47. package/dist/ui/index.js +18 -0
  48. package/dist/utils/FrontendContext.d.ts +14 -0
  49. package/dist/utils/FrontendContext.js +30 -0
  50. package/dist/utils/getError.d.ts +11 -0
  51. package/dist/utils/getError.js +73 -0
  52. package/dist/utils/handleFormErrors.d.ts +15 -0
  53. package/dist/utils/handleFormErrors.js +62 -0
  54. package/dist/utils/index.d.ts +5 -0
  55. package/dist/utils/index.js +28 -0
  56. package/dist/utils/isObject.d.ts +2 -0
  57. package/dist/utils/isObject.js +6 -0
  58. package/dist/utils/limitExpiresAt.d.ts +3 -0
  59. package/dist/utils/limitExpiresAt.js +19 -0
  60. package/package.json +48 -0
  61. package/src/auth/Auth.tsx +76 -0
  62. package/src/auth/AuthFooterLinks.tsx +27 -0
  63. package/src/auth/Forgot.tsx +122 -0
  64. package/src/auth/Login.tsx +115 -0
  65. package/src/auth/LoginForm.tsx +74 -0
  66. package/src/auth/RecoverPassword.tsx +185 -0
  67. package/src/auth/Register.tsx +174 -0
  68. package/src/auth/ResendLinkButton.tsx +71 -0
  69. package/src/auth/index.ts +8 -0
  70. package/src/graphql/ForgotPasswordMutation.graphql.ts +100 -0
  71. package/src/graphql/LoginMutation.graphql.ts +95 -0
  72. package/src/graphql/RegisterMutation.graphql.ts +95 -0
  73. package/src/graphql/ResendLinkButtonMutation.graphql.ts +101 -0
  74. package/src/graphql/index.ts +5 -0
  75. package/src/graphql/recoveryMutation.graphql.ts +91 -0
  76. package/src/index.ts +4 -0
  77. package/src/locales/ru/common.json +271 -0
  78. package/src/styles/auth.less +142 -0
  79. package/src/styles/colors.less +55 -0
  80. package/src/styles/components.less +2 -0
  81. package/src/styles/panels.less +61 -0
  82. package/src/styles/sizes.less +92 -0
  83. package/src/ui/AreYouSure.tsx +55 -0
  84. package/src/ui/FormError.tsx +21 -0
  85. package/src/ui/FormItem.tsx +60 -0
  86. package/src/ui/H.tsx +76 -0
  87. package/src/ui/Panel.tsx +44 -0
  88. package/src/ui/SeoHead.tsx +69 -0
  89. package/src/ui/index.ts +6 -0
  90. package/src/utils/FrontendContext.tsx +30 -0
  91. package/src/utils/getError.ts +101 -0
  92. package/src/utils/handleFormErrors.ts +77 -0
  93. package/src/utils/index.ts +5 -0
  94. package/src/utils/isObject.ts +4 -0
  95. package/src/utils/limitExpiresAt.ts +14 -0
@@ -0,0 +1,271 @@
1
+ {
2
+ "websiteUrl": "vikneska.com",
3
+ "httpsWebsiteUrl": "https://vikneska.com",
4
+ "websiteEmail": "support@vikneska.com",
5
+ "sec": "сек",
6
+ "chooseLanguage": "Выбрать язык",
7
+ "topMenu": {
8
+ "home": "Ссылки",
9
+ "feedback": "Отзывы",
10
+ "shop": "Магазин",
11
+ "help": "Помощь",
12
+ "about": "О нас",
13
+ "profile": "Профиль",
14
+ "admin": "Админ",
15
+ "logo": "Логотип Vikneska",
16
+ "adminTag": "Аккаунт администратора"
17
+ },
18
+ "sections": {
19
+ "packs": {
20
+ "title": "Доступные паки для покупки",
21
+ "viewAll": "Посмотреть все паки"
22
+ },
23
+ "purchase": {
24
+ "title": "Можно купить полные наборы и видео",
25
+ "gumroad": {
26
+ "title": "Gumroad",
27
+ "description": "Покупайте полные наборы фото и видео"
28
+ },
29
+ "boosty": {
30
+ "title": "Boosty",
31
+ "description": "Покупайте полные наборы фото и видео"
32
+ }
33
+ },
34
+ "links": {
35
+ "title": "Больше контента от меня",
36
+ "subtitle": "Найдёте много дополнительного контента"
37
+ },
38
+ "accounts": {
39
+ "title": "Мои аккаунты",
40
+ "subtitle": "У меня несколько аккаунтов. Все они настоящие и принадлежат мне"
41
+ }
42
+ },
43
+ "shopPage": {
44
+ "metaTitle": "Магазин паков - Vikneska",
45
+ "metaDescription": "Эксклюзивные паки фотографий и видео от Vikneska. Покупайте напрямую через Boosty, Fansly и другие платформы.",
46
+ "backToPacks": "← Назад к пакам",
47
+ "whereToBuy": "Где купить?"
48
+ },
49
+ "indexPage": {
50
+ "metaTitle": "Vikneska - Контент, общение и бесплатные материалы",
51
+ "metaDescription": "Магазин эксклюзивного контента Vikneska. Получайте бесплатный контент, общайтесь и покупайте премиум наборы фото и видео"
52
+ },
53
+ "areYouSure": {
54
+ "title": "Вы уверены?",
55
+ "Yes": "Да",
56
+ "No": "Нет"
57
+ },
58
+ "error": {
59
+ "title404": "Страница не найдена: 404",
60
+ "title": "Что-то случилось. Попробуйте позже",
61
+ "goToHome": "Перейти на Главную",
62
+ "refresh": "Обновить"
63
+ },
64
+ "buttons": {
65
+ "login": "Вход",
66
+ "register": "Регистрация",
67
+ "logout": "Выйти из аккаунта",
68
+ "save": "Сохранить",
69
+ "edit": "Редактировать",
70
+ "loadMore": "Загрузить ещё",
71
+ "confirm": "Подтвердить",
72
+ "sendCode": "Отправить код"
73
+ },
74
+ "footer": {
75
+ "help": "Вопрос-ответ",
76
+ "about": "О сервисе",
77
+ "contacts": "Контакты"
78
+ },
79
+ "profile": {
80
+ "title": "Мой профиль",
81
+ "role": "Роль:",
82
+ "admin": "Админ",
83
+ "manager": "Менеджер",
84
+ "balance": "Баланс",
85
+ "profileId": "ID профиля на сайте:",
86
+ "copy": "Копировать",
87
+ "copied": "Скопировано в буфер",
88
+ "telegramAccount": "Telegram аккаунт:",
89
+ "password": "Пароль: ********",
90
+ "payments": "Платежи",
91
+ "settings": "Настройки",
92
+ "changeTempPassword": {
93
+ "title": "Задайте пароль для сайта",
94
+ "subtitle": "Вы вошли на сайт по временному паролю, укажите постоянный"
95
+ },
96
+ "updatePassword": {
97
+ "oldPassword": "Старый пароль",
98
+ "newPassword": "Новый пароль",
99
+ "repeatPassword": "Повторите пароль",
100
+ "passwordMismatch": "Пароли не совпадают",
101
+ "saved": "Сохранено"
102
+ },
103
+ "confirmEmail": {
104
+ "title": "Подтвердить email",
105
+ "subtitle": "Мы отправим код подтверждения на этот адрес",
106
+ "codeLabel": "Код из письма",
107
+ "success": "Успешно",
108
+ "error": "Ошибка подтверждения",
109
+ "checkEmail": "Проверьте email",
110
+ "codeNotSent": "Код не отправлен",
111
+ "spamNote": "Если код не приходит, проверьте папку Спам"
112
+ },
113
+ "updateEmail": {
114
+ "label": "Ваш email",
115
+ "confirmButton": "Подтвердить email"
116
+ }
117
+ },
118
+ "userForm": {
119
+ "banned": "Забанен",
120
+ "testPayments": "Тест. платежи",
121
+ "yes": "Да",
122
+ "no": "Нет",
123
+ "success": "Успешно",
124
+ "editing": "Редактирование"
125
+ },
126
+ "formItem": {
127
+ "required": "Обязательно"
128
+ },
129
+ "auth": {
130
+ "loginError": "Ошибка входа",
131
+ "successRegister": "Успешно",
132
+ "acceptUserAgreement": "Принимаю",
133
+ "acceptPrivacyPolicy": "Соглашаюсь с",
134
+ "loginMetaTitle": "Вход",
135
+ "loginMetaDescription": "Страница входа",
136
+ "registerMetaTitle": "Регистрация",
137
+ "registerMetaDescription": "Создать аккаунт",
138
+ "recoveryMetaTitle": "Новый пароль",
139
+ "recoveryMetaDescription": "Установка нового пароля",
140
+ "openEmailMetaTitle": "Проверьте email",
141
+ "openEmailMetaDescription": "Проверьте email",
142
+ "forgotMetaTitle": "Восстановление доступа",
143
+ "forgotMetaDescription": "Восстановите доступ к аккаунту",
144
+ "loginSuccess": "Добро пожаловать!",
145
+ "forgot": "Забыли пароль?",
146
+ "loginLabel": "И снова здравствуйте!",
147
+ "loginTitle": "Вход",
148
+ "loginSubtitle": "Нет аккаунта?",
149
+ "agreeRegisterLabel": "Создавая аккаунт, вы принимаете",
150
+ "agreeLoginLabel": "Используя сервис, вы принимаете",
151
+ "registerErrorSendingEmail": "Ошибка отправки подтверждающего письма",
152
+ "registerLabel": "Это бесплатно",
153
+ "registerTitle": "Регистрация",
154
+ "registerSubtitle": "Уже есть аккаунт?",
155
+ "passwordPlaceholder": "Пароль",
156
+ "recoverySuccess": "Пароль сохранен",
157
+ "recoveryTokenWrong": "Токен истек или имеет неверный формат",
158
+ "recoveryCodeWrong": "Код восстановления истек или имеет неверный формат",
159
+ "newPassword": "Новый пароль",
160
+ "setNewPassword": "Придумайте новый пароль",
161
+ "newPasswordPlaceholder": "Новый пароль",
162
+ "saveNewPassword": "Сохранить новый пароль",
163
+ "openEmailResendOk": "Email с кодом отправлен",
164
+ "openEmailResendError": "Ошибка отправки письма",
165
+ "openEmailResendDenied": "Повторное письмо через",
166
+ "openEmailResend": "Получить новый код",
167
+ "openEmailLabel": "Остался последний шаг",
168
+ "openEmailTitle": "Проверьте свой email",
169
+ "openEmailSubtitle": "Нужна помощь?",
170
+ "check": "Проверьте",
171
+ "clickToConfirm": "Мы отправили письмо со ссылкой. Найдите эту ссылку и кликните по ней, чтобы подтвердить свой email-адрес",
172
+ "findCodeOnEmail": "Мы отправили письмо с кодом на указанный email. Найдите этот код и вставьте в форму ниже. Если письма нет, проверьте спам",
173
+ "forgotSendError": "Ошибка отправки письма",
174
+ "forgotLabel": "Не волнуйтесь",
175
+ "forgotTitle": "Восстановление доступа",
176
+ "forgotSubtitle": "Вспомнили пароль?",
177
+ "forgotSendInstructions": "Восстановить аккаунт",
178
+ "forgotIssues": "Введите email адрес, который использовали при регистрации, и мы отправим на него инструкции по восстановлению доступа к аккаунту",
179
+ "confirmationMetaTitle": "Подтверждение email адреса",
180
+ "confirmationMetaDescription": "Подтверждение email адреса",
181
+ "confirmationSendError": "Ошибка отправки письма",
182
+ "confirmationWrongToken": "Ваш токен истёк или содержит ошибку. Запросите новое письмо с правильной ссылкой:",
183
+ "confirmationSendLink": "Получить письмо"
184
+ },
185
+ "links": {
186
+ "publicOffer": "Публичная оферта",
187
+ "publicOfferRecurrent": "Оферта повторяющихся платежей",
188
+ "userAgreement": "Пользовательское соглашение",
189
+ "privacyPolicy": "Политика конфиденциальности",
190
+ "cookiePolicy": "Политика куки",
191
+ "helpCenter": "Центр помощи"
192
+ },
193
+ "payment": {
194
+ "paidTitle": "Успешная оплата",
195
+ "notPaidTitle": "Неуспешная оплата",
196
+ "paidDescription": "Платеж успешно проведён",
197
+ "notPaidDescription": "При проведении платежа произошла ошибка. Попробуйте снова или обратитесь в поддержку",
198
+ "toMyPurchases": "К моим покупкам",
199
+ "method": {
200
+ "CARD": "Карта",
201
+ "BALANCE": "Баланс",
202
+ "COMPANY_BILL": "Р/сч",
203
+ "CREDIT": "Кредит",
204
+ "PHYSICAL_BILL": "Б/сч",
205
+ "%future added value": ""
206
+ },
207
+ "status": {
208
+ "ERROR": "Ошибка",
209
+ "PENDING": "Оформление покупки",
210
+ "PAID": "Оплачено, обрабатываем",
211
+ "FINISHED": "Завершено",
212
+ "%future added value": ""
213
+ },
214
+ "saleChannel": {
215
+ "TELEGRAM_BOT": "Телеграм бот",
216
+ "WEBSITE": "Сайт",
217
+ "%future added value": ""
218
+ }
219
+ },
220
+ "currency": {
221
+ "RUB": "₽",
222
+ "USD": "$",
223
+ "EUR": "€",
224
+ "%future added value": ""
225
+ },
226
+ "currencyTitle": {
227
+ "RUB": "Рубль РФ",
228
+ "USD": "Доллар США",
229
+ "EUR": "Евро",
230
+ "%future added value": ""
231
+ },
232
+ "help": {
233
+ "metaTitle": "Помощь",
234
+ "metaDescription": "Ответы на вопросы и поддержка",
235
+ "title": "Помощь и FAQ",
236
+ "subtitle": "Ответы на частые вопросы",
237
+ "faq": {
238
+ "passwordRecovery": {
239
+ "question": "Как восстановить пароль",
240
+ "answer": "Для восстановления пароля перейдите на страницу Восстановление пароля, укажите email, с которого регистрировались на сайте и следуйте дальнейшим инструкциям"
241
+ },
242
+ "scam": {
243
+ "question": "Меня не обманут?",
244
+ "answer": "Нет, мы не мошенники. Мы отвечаем за свои слова и всегда идём на встречу нашим покупателям. Нам очень выгодно строить с Вами долгосрочное сотрудничество. Работаем мы уже давно, у нас много довольных клиентов"
245
+ },
246
+ "somethingWrong": {
247
+ "question": "Если что-то пошло не так",
248
+ "answer": "Обратитесь по нашим контактам наверху этой страницы, и мы обязательно поможем"
249
+ },
250
+ "otherGames": {
251
+ "question": "Если нужна другая игра или сервис",
252
+ "answer": "Напишите нам по любому из наших контактов и расскажите, какие пополнения нужно сделать. Мы стараемся добавлять самые актуальные игры и сервисы в наш каталог"
253
+ },
254
+ "blogger": {
255
+ "question": "Я блогер и хочу сотрудничать",
256
+ "answer": "Мы с удовольствием поработаем с вами. У нас отличные условия для блогеров. Будем рады. Больше подробностей здесь"
257
+ }
258
+ }
259
+ },
260
+ "sitemap": {
261
+ "metaTitle": "Карта сайта Vikneska.com",
262
+ "title": "Карта сайта"
263
+ },
264
+ "docsPage": {
265
+ "user-agreement": "Пользовательское соглашение",
266
+ "public-offer": "Публичная оферта",
267
+ "public-offer-recurrent": "Оферта повторяющихся платежей",
268
+ "privacy-policy": "Политика конфиденциальности",
269
+ "agency-agreement": "Агентский договор"
270
+ }
271
+ }
@@ -0,0 +1,142 @@
1
+ @media (max-width: @md-width) {
2
+ .auth {
3
+ &-email-confirmation {
4
+ flex-direction: column;
5
+ }
6
+ }
7
+ }
8
+
9
+ .auth {
10
+ max-width: 400px;
11
+ margin: auto;
12
+
13
+ &-label {
14
+ color: @secondary-text-color;
15
+ text-align: center;
16
+ line-height: 1em;
17
+ }
18
+
19
+ &-title {
20
+ font-size: 2em;
21
+ color: @primary-text-color;
22
+ text-align: center;
23
+ font-weight: 500;
24
+ line-height: 1em;
25
+ margin-top: 0.5em;
26
+ }
27
+
28
+ &-subtitle {
29
+ color: @secondary-text-color;
30
+ text-align: center;
31
+ line-height: 1em;
32
+ margin-top: 0.5em;
33
+ }
34
+
35
+ form {
36
+ margin-top: 1em;
37
+
38
+ .ant-form-item {
39
+ margin-bottom: 10px;
40
+ }
41
+ }
42
+
43
+ &-button {
44
+ //margin-bottom: 0.5em;
45
+ width: 100%;
46
+
47
+ button {
48
+ width: 100%;
49
+ }
50
+ }
51
+
52
+ &-footer {
53
+ margin-top: 1em;
54
+ display: flex;
55
+ flex-direction: column;
56
+ align-items: center;
57
+ justify-content: center;
58
+
59
+ &-issues {
60
+ margin-top: 10px;
61
+ font-size: 0.8em;
62
+ color: @secondary-text-color;
63
+ text-align: center;
64
+
65
+ a {
66
+ color: @secondary-text-color;
67
+
68
+ @media (hover: hover) {
69
+
70
+ &:focus,
71
+ &:hover {
72
+ text-decoration: underline;
73
+ }
74
+ }
75
+ }
76
+ }
77
+ }
78
+
79
+ &-socials {
80
+ &-title {
81
+ margin-top: 1em;
82
+
83
+ span {
84
+ color: @secondary-text-color;
85
+ }
86
+ }
87
+
88
+ &-buttons {
89
+ text-align: center;
90
+ margin-top: 1em;
91
+ }
92
+ }
93
+
94
+ &-email-confirmation {
95
+ margin: 0 auto;
96
+ background-color: @secondary-bg-color;
97
+ border-radius: @panel-border-radius;
98
+ max-width: 800px;
99
+ padding: @page-s-padding;
100
+ border: .5px solid @contrast-bg-color;
101
+ display: flex;
102
+ justify-content: space-between;
103
+ align-items: center;
104
+ gap: @page-xs-padding;
105
+
106
+ &-container {
107
+ padding: @page-s-padding @page-s-padding 0;
108
+ }
109
+ }
110
+
111
+ /*.register-link {
112
+ color: @pink-color;
113
+
114
+ @media (hover: hover) {
115
+ &:focus,
116
+ &:hover {
117
+ color: @pink-color;
118
+ opacity: .7;
119
+ }
120
+ }
121
+ }*/
122
+ }
123
+
124
+ .auth-buttons {
125
+ text-align: center;
126
+
127
+ &-item {
128
+ display: inline-flex;
129
+ gap: @page-xxs-padding;
130
+ //margin-right: @page-xxs-padding;
131
+ //margin-bottom: @page-xxs-padding;
132
+
133
+ &:last-child {
134
+ margin-right: 0;
135
+ }
136
+ }
137
+ }
138
+
139
+ .logout-button {
140
+ margin-left: 0.3em;
141
+ margin-right: 0.3em;
142
+ }
@@ -0,0 +1,55 @@
1
+ // Все цвета меняем здесь
2
+ // Фон
3
+ // @primary-bg-color: #f4f8fc; сделал темнее, потому что затемнил фон
4
+
5
+ /* экспериментирую с цветами */
6
+ //@secondary-bg-color: #fafafc;
7
+ //@primary-bg-color: rgb(18, 18, 18);
8
+ @primary-bg-color: #e7eaef;
9
+ @white-bg-color: #ffffff;
10
+ @secondary-bg-color: #f1f3f6;
11
+ //@tertiary-bg-color: rgb(70, 70, 70);
12
+ @middle-bg-color: rgb(40, 40, 40);
13
+ //@contrast-bg-color: #fff;
14
+ //@primary-bg-color: #fff;
15
+ @contrast-bg-color: #ffffff;
16
+
17
+ // Цвет бренда
18
+ //@primary-brand-color: #1976d2;
19
+ //@primary-brand-color: #9D3CD7;
20
+ //@primary-brand-color: #1890ff;
21
+ @primary-brand-color: #ff0066; // #E9336A;
22
+ @light-primary-color: rgba(24, 144, 255, 0.5);
23
+ @pink-color: #ff0066;
24
+ @pink-color-transparent: rgba(255, 0, 102, 0.76);
25
+ @limitationColor: #965354;
26
+ @goldColor: gold;
27
+ @contentsColor: #7d709a;
28
+ @delayColor: #86a9b4;
29
+
30
+ // Текст
31
+ //@primary-text-color: #eee; // #000000;
32
+ @primary-text-color: #444444; // #000000;
33
+ //@secondary-text-color: #888; // #000000;
34
+ @secondary-text-color: #777777; // #000000;
35
+ @white-text-color: #ffffff;
36
+ @grey-text-color: #eeeeee;
37
+ @contrast-text-color: #000;
38
+
39
+ // Ссылки
40
+ @nav-item-color: @primary-text-color;
41
+ @nav-item-button-color: @primary-brand-color;
42
+ @link-color: #707a8a;
43
+ @link-hover-color: @primary-brand-color;
44
+
45
+ // Границы
46
+ //@border: 1px solid #e1e3e8;
47
+ @border-color: rgba(168, 169, 169, 0.24);
48
+ @border: .5px solid @border-color;
49
+
50
+ // Тени
51
+ @top-menu-box-shadow: 0 4px 16px rgba(255, 205, 100, .03), 0 2px 2px rgba(255, 205, 100, .07);
52
+ //@top-menu-box-shadow: 0 4px 16px rgba(0, 50, 150, .03), 0 2px 2px rgba(0, 50, 150, .07);
53
+ @box-shadow: 0 4px 16px -8px #989fa6;
54
+ @text-shadow: 1px 1px 2px rgba(0, 0, 0, .2);
55
+ @text-shadow-invert: 1px 1px 2px rgba(255, 255, 255, .2);
@@ -0,0 +1,2 @@
1
+ @import "auth";
2
+ @import "panels";
@@ -0,0 +1,61 @@
1
+ @media (max-width: @xxs-width) {
2
+ .panel {
3
+ padding: @page-xxs-padding;
4
+ }
5
+ }
6
+
7
+ @media (min-width: @xxs-width) and (max-width: @xs-width) {
8
+ .panel {
9
+ padding: @page-xs-padding;
10
+ }
11
+ }
12
+
13
+ @media (min-width: @xs-width) and (max-width: @md-width) {
14
+ .panel {
15
+ padding: @page-s-padding;
16
+ }
17
+ }
18
+
19
+ @media (min-width: @md-width) {
20
+ .panel {
21
+ padding: @page-s-padding;
22
+ }
23
+ }
24
+
25
+ .panel {
26
+ display: block;
27
+ border-radius: @panel-border-radius;
28
+ position: relative;
29
+ overflow: hidden;
30
+
31
+ &-image {
32
+ position: absolute;
33
+ left: 50%;
34
+ top: 50%;
35
+ height: 70%;
36
+ width: 70%;
37
+ z-index: 0;
38
+
39
+ img {
40
+ width: 100%;
41
+ border-radius: @panel-border-radius;
42
+ }
43
+ }
44
+
45
+ &-content {
46
+ position: relative;
47
+ z-index: 1;
48
+ }
49
+ }
50
+
51
+ .is-panel-link {
52
+ transition: box-shadow .1s linear;
53
+
54
+ @media(hover: hover) {
55
+
56
+ &:focus,
57
+ &:hover {
58
+ box-shadow: @box-shadow;
59
+ }
60
+ }
61
+ }
@@ -0,0 +1,92 @@
1
+ // Размеры для сайта
2
+ @xxs-width: 350px;
3
+ @xs-width: 576px;
4
+ @md-width: 768px;
5
+ @lg-width: 992px;
6
+ @xlg-width: 1200px;
7
+ @xxlg-width: 1600px;
8
+ @xxxlg-width: 2000px;
9
+ // @page-header-padding: 25px; // используется в футере
10
+
11
+ // Отступы на странице
12
+ @page-xxxs-padding: 2px;
13
+ @page-xxs-padding: 5px;
14
+ @page-xs-padding: 10px;
15
+ @page-s-padding: 15px;
16
+ @page-md-padding: 25px;
17
+ @page-lg-padding: 50px; // используется в лендинге для больших отступов
18
+ @page-xlg-padding: 100px; // используется в лендинге для больших отступов
19
+
20
+ // header
21
+ @header-height: 60px;
22
+ // @header-additional-height: 45px;
23
+ @header-top-page-padding: 75px;
24
+ // Меню поиска, фиксированное
25
+ @search-menu-height-desktop: 55px; // в самом меню не используется! задавать вручную!
26
+ @search-menu-height-mobile: 45px; // в самом меню не используется! задавать вручную!
27
+
28
+ // fixed mobile menu
29
+ @mobile-menu-height: 80px;
30
+
31
+ // Страница
32
+ @left-sidebar-width: 190px;
33
+ @right-sidebar-width: 190px; // 210
34
+
35
+ // максимальная ширина контента на широких экранах
36
+ @max-page-width: 1200px;
37
+ @max-content-width: 900px; // на сдвоенных страницах максимальная ширина контентной части
38
+ @min-sidebar-width: 350px; // на сдвоенных страницах минимальная ширина сайдбара
39
+
40
+ // Скругления
41
+ @panel-border-radius: 15px;
42
+ @button-border-radius: 10px;
43
+ @link-border-radius: 20px;
44
+ @tooltip-border-radius: 10px;
45
+
46
+ // формы
47
+ @xs-form-width: 450px;
48
+
49
+ // Анимация
50
+ @fantasticZIndex: 100;
51
+
52
+ /* Шрифт */
53
+ @smallFontSize: 17px;
54
+ @baseFontSize: 19px;
55
+ @h1SizeXXS: 22px;
56
+ @h1SizeXS: 24px;
57
+ @h1Size: 25px;
58
+ @h1SizeMD: 27px;
59
+ @h1SizeLG: 30px;
60
+ @h1WeightXXS: 400;
61
+ @h1WeightXS: 600;
62
+ @h1WeightMD: 900;
63
+ @h1WeightLG: 900;
64
+
65
+ @h2SizeXXS: 19px;
66
+ @h2SizeXS: 21px;
67
+ @h2Size: 22px;
68
+ @h2SizeMD: 23px;
69
+ @h2SizeLG: 25px;
70
+
71
+ @h3SizeXS: 24px;
72
+ @h3Size: 26px;
73
+ @h3SizeMD: 28px;
74
+ @h3SizeLG: 28px;
75
+
76
+ @h4SizeXXS: 18px;
77
+ @h4SizeXS: 18px;
78
+ @h4SizeMD: 19px;
79
+ @h4SizeLG: 20px;
80
+
81
+ @baseFontWeight: 300;
82
+
83
+ /* Шрифт текста */
84
+ @megaFontSize: 2rem;
85
+ @hugeFontSize: 1.5rem;
86
+ @lgFontSize: 1.2rem;
87
+ @mdFontSize: 1.1rem;
88
+ @normalFontSize: 1rem;
89
+ @sFontSize: .9rem;
90
+ @xsFontSize: .8rem;
91
+ @xxsFontSize: .6rem;
92
+ @xxxsFontSize: .4rem;
@@ -0,0 +1,55 @@
1
+ import React from 'react';
2
+ import { Dropdown } from 'antd';
3
+ import { useTranslation } from 'next-i18next';
4
+
5
+ interface AreYouSureProps {
6
+ children: React.ReactNode;
7
+ onYes: () => void;
8
+ yesLabel?: React.ReactNode;
9
+ onNo?: () => void;
10
+ danger?: boolean;
11
+ }
12
+
13
+ const AreYouSure: React.FC<AreYouSureProps> = ({
14
+ children,
15
+ yesLabel,
16
+ onYes,
17
+ onNo,
18
+ danger,
19
+ }) => {
20
+ const { t } = useTranslation();
21
+
22
+ return (
23
+ <Dropdown
24
+ overlayClassName='no-text-selection'
25
+ menu={{
26
+ items: [
27
+ {
28
+ key: 'group',
29
+ label: t('common:areYouSure.title'),
30
+ type: 'group',
31
+ children: [
32
+ {
33
+ key: 'yes',
34
+ label: yesLabel || t('common:areYouSure.Yes'),
35
+ danger,
36
+ onClick: onYes,
37
+ },
38
+ {
39
+ key: 'no',
40
+ label: t('common:areYouSure.No'),
41
+ onClick: onNo,
42
+ },
43
+ ],
44
+ },
45
+ ],
46
+ }}
47
+ trigger={['click']}
48
+ placement='topLeft'
49
+ >
50
+ {children}
51
+ </Dropdown>
52
+ );
53
+ };
54
+
55
+ export default AreYouSure;