Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 14050cbb24 | |||
| ae63ceac52 | |||
| 31df4fa07d |
@@ -26,7 +26,7 @@
|
|||||||
"require": {
|
"require": {
|
||||||
"php": "^8.5",
|
"php": "^8.5",
|
||||||
"ext-blake3": "^0.1",
|
"ext-blake3": "^0.1",
|
||||||
"mirzaev/minimal": "^3.8",
|
"mirzaev/minimal": "^3.10.4",
|
||||||
"mirzaev/baza": "^3.4",
|
"mirzaev/baza": "^3.4",
|
||||||
"mirzaev/languages": "^1",
|
"mirzaev/languages": "^1",
|
||||||
"twig/twig": "^3.2",
|
"twig/twig": "^3.2",
|
||||||
|
|||||||
@@ -187,47 +187,7 @@ final class index extends core
|
|||||||
];
|
];
|
||||||
|
|
||||||
// Sending the cookie with the team workload (1800 = 30min)
|
// Sending the cookie with the team workload (1800 = 30min)
|
||||||
setcookie('workload', $this->view->workload, time() + 1800, '/');
|
/* setcookie('workload', $this->view->workload, time() + 1800, '/'); */
|
||||||
|
|
||||||
// Initializing the project constructor data
|
|
||||||
$this->view->project = [
|
|
||||||
'architectures' => [
|
|
||||||
'site' => 'Сайт',
|
|
||||||
'chat_robot' => 'Чат-робот',
|
|
||||||
'program' => 'Программа',
|
|
||||||
'game' => 'Видеоигра',
|
|
||||||
'script' => 'Скрипт, парсер, макрос',
|
|
||||||
'module' => 'Модуль, плагин, расширение',
|
|
||||||
],
|
|
||||||
'purposes' => [
|
|
||||||
'funnel' => 'Воронка (обработка пользователя)',
|
|
||||||
'contacts' => 'Контакты (сбор данных)',
|
|
||||||
'ai' => 'Внедрение ИИ',
|
|
||||||
'archive' => 'Архив (галерея, библиотека, реестр)',
|
|
||||||
'crm' => 'Индивидуальная CRM',
|
|
||||||
'landing' => 'Лендинг (посадочная страница)',
|
|
||||||
'marketplace' => 'Маркетплейс, магазин, витрина',
|
|
||||||
'saas' => 'SaaS проект',
|
|
||||||
'search' => 'Поиск и анализ',
|
|
||||||
'calculate' => 'Вычисления (калькулятор)',
|
|
||||||
'individual' => 'Индивидуальная разработка',
|
|
||||||
],
|
|
||||||
'integrations' => [
|
|
||||||
'one_c' => '1C',
|
|
||||||
'bitrix24' => 'Битрикс24',
|
|
||||||
'moy_sklad' => 'Мой Склад',
|
|
||||||
'mail' => 'Почта',
|
|
||||||
'excel' => 'Excel',
|
|
||||||
'ozon' => 'OZON',
|
|
||||||
'wildberries' => 'Wildberries',
|
|
||||||
'yandex_market' => 'Яндекс Маркет',
|
|
||||||
'avito' => 'Авито',
|
|
||||||
'vk' => 'ВКонтакте',
|
|
||||||
'max' => 'МАКС',
|
|
||||||
'telegram' => 'Телеграм',
|
|
||||||
'neural_networks' => 'Нейросети'
|
|
||||||
]
|
|
||||||
];
|
|
||||||
|
|
||||||
// Initializing contacts data
|
// Initializing contacts data
|
||||||
$this->view->integrations = [
|
$this->view->integrations = [
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ use kodorvan\site\controllers\core;
|
|||||||
|
|
||||||
// PHP framework
|
// PHP framework
|
||||||
use mirzaev\minimal\http\enumerations\content,
|
use mirzaev\minimal\http\enumerations\content,
|
||||||
|
mirzaev\minimal\http\enumerations\method,
|
||||||
mirzaev\minimal\http\enumerations\status;
|
mirzaev\minimal\http\enumerations\status;
|
||||||
|
|
||||||
// Mail server
|
// Mail server
|
||||||
@@ -40,85 +41,215 @@ final class project extends core
|
|||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Page: calculator
|
||||||
*
|
*
|
||||||
|
* @return null
|
||||||
|
*/
|
||||||
|
public function calculator(): null
|
||||||
|
{
|
||||||
|
if ($this->request->method === method::get) {
|
||||||
|
// GET
|
||||||
|
|
||||||
|
if (str_contains($this->request->headers['accept'] ?? '', content::html->value)) {
|
||||||
|
// Request for HTML response
|
||||||
|
|
||||||
|
// Initializing the project constructor data
|
||||||
|
$this->view->calculator = [
|
||||||
|
'architectures' => [
|
||||||
|
'site' => 'Сайт',
|
||||||
|
'chat_robot' => 'Чат-робот',
|
||||||
|
'program' => 'Программа',
|
||||||
|
'game' => 'Видеоигра',
|
||||||
|
'script' => 'Скрипт, парсер, макрос',
|
||||||
|
'module' => 'Модуль, плагин, расширение',
|
||||||
|
],
|
||||||
|
'purposes' => [
|
||||||
|
'funnel' => 'Воронка (обработка пользователя)',
|
||||||
|
'contacts' => 'Контакты (сбор данных)',
|
||||||
|
'ai' => 'Внедрение ИИ',
|
||||||
|
'archive' => 'Архив (галерея, библиотека, реестр)',
|
||||||
|
'crm' => 'Индивидуальная CRM',
|
||||||
|
'landing' => 'Лендинг (посадочная страница)',
|
||||||
|
'marketplace' => 'Маркетплейс, магазин, витрина',
|
||||||
|
'saas' => 'SaaS проект',
|
||||||
|
'search' => 'Поиск и анализ',
|
||||||
|
'calculate' => 'Вычисления (калькулятор)',
|
||||||
|
'individual' => 'Индивидуальная разработка',
|
||||||
|
],
|
||||||
|
'integrations' => [
|
||||||
|
'one_c' => '1C',
|
||||||
|
'bitrix24' => 'Битрикс24',
|
||||||
|
'moy_sklad' => 'Мой Склад',
|
||||||
|
'mail' => 'Почта',
|
||||||
|
'excel' => 'Excel',
|
||||||
|
'ozon' => 'OZON',
|
||||||
|
'wildberries' => 'Wildberries',
|
||||||
|
'yandex_market' => 'Яндекс Маркет',
|
||||||
|
'avito' => 'Авито',
|
||||||
|
'vk' => 'ВКонтакте',
|
||||||
|
'max' => 'МАКС',
|
||||||
|
'telegram' => 'Телеграм',
|
||||||
|
'neural_networks' => 'Нейросети'
|
||||||
|
]
|
||||||
|
];
|
||||||
|
|
||||||
|
// Render page
|
||||||
|
$page = $this->view->render(
|
||||||
|
'pages/project/calculator.html',
|
||||||
|
[
|
||||||
|
'uri' => 'https://' . DOMAIN . "/project/calculator",
|
||||||
|
'smartphone' => $this->request->smartphone,
|
||||||
|
'tablet' => $this->request->tablet
|
||||||
|
]
|
||||||
|
);
|
||||||
|
|
||||||
|
// Sending response
|
||||||
|
$this->response
|
||||||
|
->start()
|
||||||
|
->clean()
|
||||||
|
->sse()
|
||||||
|
->write($page)
|
||||||
|
->validate($this->request)
|
||||||
|
?->body()
|
||||||
|
->end();
|
||||||
|
|
||||||
|
// Deinitializing rendered page
|
||||||
|
unset($page);
|
||||||
|
|
||||||
|
// Exit (success)
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Exit (fail)
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Request the project by calculator
|
||||||
*
|
*
|
||||||
* @return null
|
* @return null
|
||||||
*/
|
*/
|
||||||
public function request(string $request): null
|
public function request(string $request): null
|
||||||
{
|
{
|
||||||
// Initializing the project identifier (temporary solution)
|
// Debugging
|
||||||
$identifier = blake3($request, 20);
|
date_default_timezone_set('Asia/Yekaterinburg');
|
||||||
|
$jornal = JOURNAL . '/requests.txt';
|
||||||
|
file_put_contents($jornal, "\n\n\n\n", FILE_APPEND);
|
||||||
|
file_put_contents($jornal, '[' . date('Y.m.d H:i:s') . '] Заказ с сайта: ' . DOMAIN . "\n", FILE_APPEND);
|
||||||
|
file_put_contents($jornal, print_r($request, true) . "\n", FILE_APPEND);
|
||||||
|
file_put_contents($jornal, print_r($this->request->files, true) . "\n", FILE_APPEND);
|
||||||
|
|
||||||
// Initializing the project storage path
|
if ($this->request->method === method::put) {
|
||||||
$path = STORAGE . DIRECTORY_SEPARATOR . 'projects' . DIRECTORY_SEPARATOR . $identifier;
|
// PUT
|
||||||
|
|
||||||
// Initializing the project storage directory in the storage
|
// Initializing the project identifier (temporary solution)
|
||||||
if (!file_exists($path)) mkdir($path, 0775, true);
|
$identifier = blake3($request, 20);
|
||||||
|
|
||||||
// Declaring the project storage files registry
|
// Initializing the project storage path
|
||||||
$files = [];
|
$path = STORAGE . DIRECTORY_SEPARATOR . 'projects' . DIRECTORY_SEPARATOR . $identifier;
|
||||||
|
|
||||||
foreach ($this->request->files as $file) {
|
// Initializing the project storage directory in the storage
|
||||||
// Iterating over files
|
if (!file_exists($path)) mkdir($path, 0775, true);
|
||||||
|
|
||||||
// Initializing the file destination path
|
// Declaring the project storage files registry
|
||||||
$destination = $path . DIRECTORY_SEPARATOR . $file['name'];
|
$files = [];
|
||||||
|
|
||||||
// Writing the file into the project storage
|
foreach ($this->request->files as $file) {
|
||||||
copy($file['tmp_name'], $destination);
|
// Iterating over files
|
||||||
|
|
||||||
// Writing the file destination path into the project storage files registry
|
// Initializing the file destination path
|
||||||
$files[$file['name']] = $destination;
|
$destination = $path . DIRECTORY_SEPARATOR . $file['name'];
|
||||||
}
|
|
||||||
|
|
||||||
// Decoding the request JSON argument
|
// Writing the file into the project storage
|
||||||
$request = json_decode(json: $request, associative: true, depth: 5);
|
copy($file['tmp_name'], $destination);
|
||||||
|
|
||||||
// Initializing the mail server
|
// Writing the file destination path into the project storage files registry
|
||||||
$mail = new mail(true);
|
$files[$file['name']] = $destination;
|
||||||
|
|
||||||
try {
|
|
||||||
// Writing the mail server parameters
|
|
||||||
/* $mail->SMTPDebug = smtp::DEBUG_SERVER; */
|
|
||||||
$mail->setLanguage('ru');
|
|
||||||
$mail->CharSet = mail::CHARSET_UTF8;
|
|
||||||
$mail->isSMTP();
|
|
||||||
$mail->Host = MAIL['host'];
|
|
||||||
$mail->SMTPAuth = true;
|
|
||||||
$mail->Username = MAIL['sender']['mail'];
|
|
||||||
$mail->Password = MAIL['sender']['password'];
|
|
||||||
$mail->SMTPSecure = mail::ENCRYPTION_SMTPS;
|
|
||||||
$mail->Port = 465;
|
|
||||||
$mail->setFrom(MAIL['sender']['mail'], MAIL['sender']['name']);
|
|
||||||
$mail->addAddress(MAIL['receiver']['mail'], MAIL['receiver']['name']);
|
|
||||||
|
|
||||||
// The message
|
|
||||||
$mail->isHTML(true);
|
|
||||||
$mail->Subject = empty($request['project']['name']) ? 'Заказ' : 'Заказ: ' . $request['project']['name'];
|
|
||||||
$mail->Body = $this->view->render('messages/request.html', $request);
|
|
||||||
/* $mail->AltBody = 'This is the body in plain text for non-HTML mail clients'; */
|
|
||||||
|
|
||||||
// Attachments
|
|
||||||
foreach ($files as $name => $file) {
|
|
||||||
// Iterating of project storage files registry
|
|
||||||
|
|
||||||
// Writing the attachment into the message
|
|
||||||
$mail->addAttachment($file, $name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sending the message
|
// Decoding the request JSON argument
|
||||||
$mail->send();
|
$request = json_decode(json: $request, associative: true, depth: 5);
|
||||||
} catch (mail_exception $exception) {
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sending response
|
// Initializing the mail server
|
||||||
$this->response
|
$mail = new mail(true);
|
||||||
->start()
|
|
||||||
->clean()
|
try {
|
||||||
->sse()
|
// Writing the mail server parameters
|
||||||
->validate($this->request)
|
/* $mail->SMTPDebug = smtp::DEBUG_SERVER; */
|
||||||
?->body()
|
$mail->setLanguage('ru');
|
||||||
->end();
|
$mail->CharSet = mail::CHARSET_UTF8;
|
||||||
|
$mail->isSMTP();
|
||||||
|
$mail->Host = MAIL['host'];
|
||||||
|
$mail->SMTPAuth = true;
|
||||||
|
$mail->Username = MAIL['sender']['mail'];
|
||||||
|
$mail->Password = MAIL['sender']['password'];
|
||||||
|
$mail->SMTPSecure = mail::ENCRYPTION_SMTPS;
|
||||||
|
$mail->Port = 465;
|
||||||
|
$mail->setFrom(MAIL['sender']['mail'], MAIL['sender']['name']);
|
||||||
|
$mail->addAddress(MAIL['receiver']['mail'], MAIL['receiver']['name']);
|
||||||
|
|
||||||
|
// The message
|
||||||
|
$mail->isHTML(true);
|
||||||
|
$mail->Subject = empty($request['project']['name']) ? 'Заказ' : 'Заказ: ' . $request['project']['name'];
|
||||||
|
$mail->Body = $this->view->render('messages/request.html', $request);
|
||||||
|
/* $mail->AltBody = 'This is the body in plain text for non-HTML mail clients'; */
|
||||||
|
|
||||||
|
// Attachments
|
||||||
|
foreach ($files as $name => $file) {
|
||||||
|
// Iterating of project storage files registry
|
||||||
|
|
||||||
|
// Writing the attachment into the message
|
||||||
|
$mail->addAttachment($file, $name);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sending the message
|
||||||
|
$mail->send();
|
||||||
|
} catch (mail_exception $exception) {
|
||||||
|
file_put_contents($jornal, '[' . date('Y.m.d H:i:s') . "] ПИЗДЕЦ\n", FILE_APPEND);
|
||||||
|
file_put_contents($jornal, '[' . date('Y.m.d H:i:s') . ']' . $exception->getMessage() . "\n", FILE_APPEND);
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Initializing the mail server
|
||||||
|
$mail = new mail(true);
|
||||||
|
|
||||||
|
$mail->setLanguage('ru');
|
||||||
|
$mail->CharSet = mail::CHARSET_UTF8;
|
||||||
|
$mail->isSMTP();
|
||||||
|
$mail->Host = MAIL['host'];
|
||||||
|
$mail->SMTPAuth = true;
|
||||||
|
$mail->Username = MAIL['sender']['mail'];
|
||||||
|
$mail->Password = MAIL['sender']['password'];
|
||||||
|
$mail->SMTPSecure = mail::ENCRYPTION_SMTPS;
|
||||||
|
$mail->Port = 465;
|
||||||
|
$mail->setFrom(MAIL['sender']['mail'], MAIL['sender']['name']);
|
||||||
|
$mail->addAddress(MAIL['receiver']['mail'], MAIL['receiver']['name']);
|
||||||
|
|
||||||
|
// The message
|
||||||
|
$mail->isHTML(true);
|
||||||
|
$mail->Subject = empty($request['project']['name']) ? 'Заказ без документов' : 'Заказ без документов: ' . $request['project']['name'];
|
||||||
|
$mail->Body = $this->view->render('messages/request.html', $request);
|
||||||
|
|
||||||
|
// Sending the message
|
||||||
|
$mail->send();
|
||||||
|
} catch (mail_exception $exception) {
|
||||||
|
file_put_contents($jornal, '[' . date('Y.m.d H:i:s') . "] ПОВТОРНЫЙ ПИЗДЕЦ\n", FILE_APPEND);
|
||||||
|
file_put_contents($jornal, '[' . date('Y.m.d H:i:s') . ']' . $exception->getMessage() . "\n", FILE_APPEND);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sending response
|
||||||
|
$this->response
|
||||||
|
->start()
|
||||||
|
->clean()
|
||||||
|
->sse()
|
||||||
|
->validate($this->request)
|
||||||
|
?->body()
|
||||||
|
->end();
|
||||||
|
|
||||||
|
// Exit (success)
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
// Exit (fail)
|
// Exit (fail)
|
||||||
return null;
|
return null;
|
||||||
|
|||||||
@@ -66,8 +66,12 @@ final class superpack extends core
|
|||||||
'uri' => 'https://' . DOMAIN . "/superpack/$urn",
|
'uri' => 'https://' . DOMAIN . "/superpack/$urn",
|
||||||
'article' => [
|
'article' => [
|
||||||
'urn' => $superpack->urn,
|
'urn' => $superpack->urn,
|
||||||
'title' => $superpack->title,
|
'head' => [
|
||||||
'html' => $superpack->html
|
'title' => $superpack->title
|
||||||
|
],
|
||||||
|
'body' => [
|
||||||
|
'html' => $superpack->html
|
||||||
|
]
|
||||||
],
|
],
|
||||||
'smartphone' => $this->request->smartphone,
|
'smartphone' => $this->request->smartphone,
|
||||||
'tablet' => $this->request->tablet
|
'tablet' => $this->request->tablet
|
||||||
@@ -172,8 +176,17 @@ final class superpack extends core
|
|||||||
if ($superpack instanceof record) {
|
if ($superpack instanceof record) {
|
||||||
// Created the superpack
|
// Created the superpack
|
||||||
|
|
||||||
// Sending redirect to the superpack
|
// Sending response
|
||||||
header('Location: /superpack/' . $urn);
|
$this->response
|
||||||
|
->start()
|
||||||
|
->clean()
|
||||||
|
->sse()
|
||||||
|
->json([
|
||||||
|
'redirect' => "/superpack/$urn"
|
||||||
|
])
|
||||||
|
->validate($this->request)
|
||||||
|
?->body()
|
||||||
|
->end();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
2
kodorvan/site/system/journal/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
*
|
||||||
|
!.gitignore
|
||||||
@@ -16,27 +16,18 @@ ini_set('display_startup_errors', 1); */
|
|||||||
// Initializing path to the public directory
|
// Initializing path to the public directory
|
||||||
define('INDEX', __DIR__);
|
define('INDEX', __DIR__);
|
||||||
|
|
||||||
// Initializing path to the project root directory
|
// Initializing the system directories
|
||||||
define('ROOT', INDEX . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR);
|
define('ROOT', INDEX . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR);
|
||||||
|
define('JOURNAL', INDEX . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'journal');
|
||||||
// Initializing path to the directory of views
|
|
||||||
define('VIEWS', INDEX . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'views');
|
|
||||||
|
|
||||||
// Initializing path to the directory of settings
|
|
||||||
define('SETTINGS', INDEX . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'settings');
|
define('SETTINGS', INDEX . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'settings');
|
||||||
|
define('LOCALIZATIONS', INDEX . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'localizations');
|
||||||
|
define('DATABASES', INDEX . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'databases');
|
||||||
|
define('STORAGE', INDEX . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'storage');
|
||||||
|
define('VIEWS', INDEX . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'views');
|
||||||
|
|
||||||
// Initializing system settings
|
// Initializing system settings
|
||||||
require SETTINGS . DIRECTORY_SEPARATOR . 'system.php';
|
require SETTINGS . DIRECTORY_SEPARATOR . 'system.php';
|
||||||
|
|
||||||
// Initializing path to the directory of the storage
|
|
||||||
define('STORAGE', INDEX . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'storage');
|
|
||||||
|
|
||||||
// Initializing path to the databases directory
|
|
||||||
define('DATABASES', INDEX . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'databases');
|
|
||||||
|
|
||||||
// Initializing path to the localizations directory
|
|
||||||
define('LOCALIZATIONS', INDEX . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'localizations');
|
|
||||||
|
|
||||||
// Initializing dependencies
|
// Initializing dependencies
|
||||||
require ROOT . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
|
require ROOT . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
|
||||||
|
|
||||||
@@ -50,11 +41,13 @@ $core->router
|
|||||||
->write('/policy', new route('policy', 'index'), 'GET')
|
->write('/policy', new route('policy', 'index'), 'GET')
|
||||||
->write('/recomendations', new route('recomendations', 'index'), 'GET')
|
->write('/recomendations', new route('recomendations', 'index'), 'GET')
|
||||||
|
|
||||||
->write('/system/superpack/create', new route('superpack', 'create'), 'GET')
|
|
||||||
->write('/system/superpack/create', new route('superpack', 'create'), 'PUT')
|
|
||||||
->write('/superpack/$urn', new route('superpack', 'index'), 'GET')
|
->write('/superpack/$urn', new route('superpack', 'index'), 'GET')
|
||||||
|
|
||||||
|
->write('/project/calculator', new route('project', 'calculator'), 'GET')
|
||||||
->write('/project/request', new route('project', 'request'), 'PUT')
|
->write('/project/request', new route('project', 'request'), 'PUT')
|
||||||
|
|
||||||
|
->write('/system/superpack/create', new route('superpack', 'create'), 'GET')
|
||||||
|
->write('/system/superpack/create', new route('superpack', 'create'), 'PUT')
|
||||||
;
|
;
|
||||||
|
|
||||||
// Handling request
|
// Handling request
|
||||||
|
|||||||
@@ -1819,7 +1819,7 @@ export default class project {
|
|||||||
// Iterating over files
|
// Iterating over files
|
||||||
|
|
||||||
// Writing the parameter into the body buffer
|
// Writing the parameter into the body buffer
|
||||||
body.append('file_' + index++, file);
|
body.append('file_' + index++, file, file.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
return await core.request(
|
return await core.request(
|
||||||
@@ -1828,8 +1828,7 @@ export default class project {
|
|||||||
"PUT",
|
"PUT",
|
||||||
{
|
{
|
||||||
"Accept": "application/json",
|
"Accept": "application/json",
|
||||||
},
|
}
|
||||||
null,
|
|
||||||
).then(
|
).then(
|
||||||
async (json) => {
|
async (json) => {
|
||||||
if (json) {
|
if (json) {
|
||||||
|
|||||||
623
kodorvan/site/system/public/js/modules/system/article.mjs
Normal file
@@ -0,0 +1,623 @@
|
|||||||
|
/** @module superpack */
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name superpack.mjs
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Module for creating superpacks
|
||||||
|
*
|
||||||
|
* @class
|
||||||
|
* @public
|
||||||
|
*
|
||||||
|
* {@link https://git.mirzaev.sexy/mirzaev/superpack.mjs}
|
||||||
|
*
|
||||||
|
* @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License
|
||||||
|
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
|
||||||
|
*/
|
||||||
|
export default class superpack {
|
||||||
|
/**
|
||||||
|
* @name Shell
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Shell of all elements, top-level parent HTML-element
|
||||||
|
*
|
||||||
|
* @type {HTMLElement}
|
||||||
|
*
|
||||||
|
* @protected
|
||||||
|
*/
|
||||||
|
#shell;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Elements
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Calculation steps shell elements
|
||||||
|
*
|
||||||
|
* @type {Map}
|
||||||
|
*
|
||||||
|
* @protected
|
||||||
|
*/
|
||||||
|
#elements = new Map();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Elements (get)
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Getter for `this.#elements`
|
||||||
|
*
|
||||||
|
* @return {Map}
|
||||||
|
*
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
get elements() {
|
||||||
|
return this.#elements;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name stages
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Active stages for guide
|
||||||
|
*
|
||||||
|
* @return {Set}
|
||||||
|
*
|
||||||
|
* @protected
|
||||||
|
*/
|
||||||
|
#stages = new Set();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Stages (get)
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Getter for `this.#stages`
|
||||||
|
*
|
||||||
|
* @return {Set}
|
||||||
|
*
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
get stages() {
|
||||||
|
return this.#stages;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Shell (get)
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Getter for `this.#shell`
|
||||||
|
*
|
||||||
|
* @return {HTMLElement}
|
||||||
|
*
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
get shell() {
|
||||||
|
return this.#shell;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name URN
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* The superpack URN (https://kodorvan.tech/superpack/{URN})
|
||||||
|
*
|
||||||
|
* @type {string}
|
||||||
|
*
|
||||||
|
* @protected
|
||||||
|
*/
|
||||||
|
#urn = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name URN (set)
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Setter for `this.#urn`
|
||||||
|
*
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
set urn(value) {
|
||||||
|
// Writing into the hour cost
|
||||||
|
this.#urn = value;
|
||||||
|
|
||||||
|
// Dispatching event: "system.superpack.write"
|
||||||
|
this.#shell.dispatchEvent(
|
||||||
|
new CustomEvent("system.superpack.write", {
|
||||||
|
detail: { name: 'urn', value: value }
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
if (this.#urn.length > 0) {
|
||||||
|
// Has a value
|
||||||
|
|
||||||
|
// Deleting from the stages registry
|
||||||
|
this.#stages.delete('urn');
|
||||||
|
} else {
|
||||||
|
// Has no value
|
||||||
|
|
||||||
|
// Writing into the stages registry
|
||||||
|
this.#stages.add('urn');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reinitializing guide HTML-elements
|
||||||
|
this.guide();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Title
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* The superpack title
|
||||||
|
*
|
||||||
|
* @type {string}
|
||||||
|
*
|
||||||
|
* @protected
|
||||||
|
*/
|
||||||
|
#title = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Title (set)
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Setter for `this.#title`
|
||||||
|
*
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
set title(value) {
|
||||||
|
// Writing into the hour cost
|
||||||
|
this.#title = value;
|
||||||
|
|
||||||
|
// Dispatching event: "system.superpack.write"
|
||||||
|
this.#shell.dispatchEvent(
|
||||||
|
new CustomEvent("system.superpack.write", {
|
||||||
|
detail: { name: 'title', value: value }
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
if (this.#title.length > 0) {
|
||||||
|
// Has a value
|
||||||
|
|
||||||
|
// Deleting from the stages registry
|
||||||
|
this.#stages.delete('title');
|
||||||
|
} else {
|
||||||
|
// Has no value
|
||||||
|
|
||||||
|
// Writing into the stages registry
|
||||||
|
this.#stages.add('title');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reinitializing guide HTML-elements
|
||||||
|
this.guide();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Image
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* The head image of the article
|
||||||
|
*
|
||||||
|
* @type {File}
|
||||||
|
*
|
||||||
|
* @protected
|
||||||
|
*/
|
||||||
|
#image;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Image (set)
|
||||||
|
*
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
set image(value) {
|
||||||
|
if (value instanceof File){
|
||||||
|
// File
|
||||||
|
|
||||||
|
// Writing into the property
|
||||||
|
this.#image = value;
|
||||||
|
} else {
|
||||||
|
// Undefined
|
||||||
|
|
||||||
|
// Deleting the property
|
||||||
|
this.#image = undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.#image.length > 0) {
|
||||||
|
// Has the image
|
||||||
|
|
||||||
|
// Deleting from the stages registry
|
||||||
|
this.#stages.delete('image');
|
||||||
|
} else {
|
||||||
|
// Has no image
|
||||||
|
|
||||||
|
// Writing into the stages registry
|
||||||
|
this.#stages.add('image');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Dispatching event: "article.write"
|
||||||
|
this.shell.dispatchEvent(
|
||||||
|
new CustomEvent("article.write", {
|
||||||
|
detail: { name: 'image', value: this.#image }
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
// Reinitializing guide HTML-elements
|
||||||
|
this.guide();
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Image (get)
|
||||||
|
*
|
||||||
|
* @return {File}
|
||||||
|
*
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
get image() {
|
||||||
|
return this.#image;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name HTML
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* The superpack content (HTML)
|
||||||
|
*
|
||||||
|
* @type {string}
|
||||||
|
*
|
||||||
|
* @protected
|
||||||
|
*/
|
||||||
|
#html = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name HTML (set)
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Setter for `this.#html`
|
||||||
|
*
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
set html(value) {
|
||||||
|
// Writing into the hour cost
|
||||||
|
this.#html = value;
|
||||||
|
|
||||||
|
// Dispatching event: "system.superpack.write"
|
||||||
|
this.#shell.dispatchEvent(
|
||||||
|
new CustomEvent("system.superpack.write", {
|
||||||
|
detail: { name: 'html', value: value }
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
if (this.#html.length > 0) {
|
||||||
|
// Has a value
|
||||||
|
|
||||||
|
// Deleting from the stages registry
|
||||||
|
this.#stages.delete('html');
|
||||||
|
} else {
|
||||||
|
// Has no value
|
||||||
|
|
||||||
|
// Writing into the stages registry
|
||||||
|
this.#stages.add('html');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reinitializing guide HTML-elements
|
||||||
|
this.guide();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Text
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* The superpack content (text)
|
||||||
|
*
|
||||||
|
* @type {string}
|
||||||
|
*
|
||||||
|
* @protected
|
||||||
|
*/
|
||||||
|
#text = '';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Text (set)
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Setter for `this.#text`
|
||||||
|
*
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
set text(value) {
|
||||||
|
// Writing into the hour cost
|
||||||
|
this.#text = value;
|
||||||
|
|
||||||
|
// Dispatching event: "system.superpack.write"
|
||||||
|
this.#shell.dispatchEvent(
|
||||||
|
new CustomEvent("system.superpack.write", {
|
||||||
|
detail: { name: 'text', value: value }
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
if (this.#text.length > 0) {
|
||||||
|
// Has a value
|
||||||
|
|
||||||
|
// Deleting from the stages registry
|
||||||
|
this.#stages.delete('text');
|
||||||
|
} else {
|
||||||
|
// Has no value
|
||||||
|
|
||||||
|
// Writing into the stages registry
|
||||||
|
this.#stages.add('text');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reinitializing guide text-elements
|
||||||
|
this.guide();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Supercost
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* The superpack content (supercost)
|
||||||
|
*
|
||||||
|
* @type {number}
|
||||||
|
*
|
||||||
|
* @protected
|
||||||
|
*/
|
||||||
|
#supercost = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Supercost (set)
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Setter for `this.#supercost`
|
||||||
|
*
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
set supercost(value) {
|
||||||
|
// Writing into the hour cost
|
||||||
|
this.#supercost = value;
|
||||||
|
|
||||||
|
// Dispatching event: "system.superpack.write"
|
||||||
|
this.#shell.dispatchEvent(
|
||||||
|
new CustomEvent("system.superpack.write", {
|
||||||
|
detail: { name: 'supercost', value: value }
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
if (this.#supercost > 0) {
|
||||||
|
// Has a value
|
||||||
|
|
||||||
|
// Deleting from the stages registry
|
||||||
|
this.#stages.delete('supercost');
|
||||||
|
} else {
|
||||||
|
// Has no value
|
||||||
|
|
||||||
|
// Writing into the stages registry
|
||||||
|
this.#stages.add('supercost');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reinitializing guide supercost-elements
|
||||||
|
this.guide();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Constructor
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Initialize an instance
|
||||||
|
*
|
||||||
|
* @param {HTMLElement} shell The shell element
|
||||||
|
**/
|
||||||
|
constructor(
|
||||||
|
shell,
|
||||||
|
urn,
|
||||||
|
title,
|
||||||
|
html,
|
||||||
|
text,
|
||||||
|
supercost
|
||||||
|
) {
|
||||||
|
if (shell instanceof HTMLElement) {
|
||||||
|
// Initialized the shell
|
||||||
|
|
||||||
|
// Writing the shell HTML-element
|
||||||
|
this.#shell = shell;
|
||||||
|
|
||||||
|
if (urn instanceof HTMLElement) this.#elements.set('urn', urn);
|
||||||
|
if (title instanceof HTMLElement) this.#elements.set('title', title);
|
||||||
|
if (html instanceof HTMLElement) this.#elements.set('html', html);
|
||||||
|
if (text instanceof HTMLElement) this.#elements.set('text', text);
|
||||||
|
if (supercost instanceof HTMLElement) this.#elements.set('supercost', supercost);
|
||||||
|
|
||||||
|
Object.assign(
|
||||||
|
this.send,
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @name Send (system)
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Send the superpack data to the server
|
||||||
|
*
|
||||||
|
* @memberof superpack.send
|
||||||
|
*
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
async system(request, resolve, reject) {
|
||||||
|
try {
|
||||||
|
if (
|
||||||
|
// typeof identifier === "string" ||
|
||||||
|
true
|
||||||
|
) {
|
||||||
|
// Validated all required arguments
|
||||||
|
|
||||||
|
return await core.request(
|
||||||
|
"/system/superpack/create",
|
||||||
|
request,
|
||||||
|
"PUT",
|
||||||
|
).then(
|
||||||
|
async (json) => {
|
||||||
|
if (json) {
|
||||||
|
// Received a JSON-response
|
||||||
|
|
||||||
|
if (
|
||||||
|
json.errors !== null &&
|
||||||
|
typeof json.errors === "object" &&
|
||||||
|
json.errors.length > 0
|
||||||
|
) {
|
||||||
|
// Fail (received errors)
|
||||||
|
|
||||||
|
// Exit (fail)
|
||||||
|
reject(json);
|
||||||
|
} else {
|
||||||
|
// Success (not received errors)
|
||||||
|
|
||||||
|
// Reloading the page @todo make something smarter
|
||||||
|
alert("Запрос доставлен");
|
||||||
|
|
||||||
|
if (json.redirect?.length > 0) {
|
||||||
|
// Received the redirect
|
||||||
|
|
||||||
|
// Redirect
|
||||||
|
window.location = json.redirect;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Exit (success)
|
||||||
|
resolve();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
() => reject(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
console.log(e);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
core?.modules.connect("damper").then((connected) => {
|
||||||
|
// Imported the damper.mjs module
|
||||||
|
|
||||||
|
Object.assign(
|
||||||
|
this.send,
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @name Send (damper)
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Send the superpack data to the server
|
||||||
|
*
|
||||||
|
* @memberof superpack.send
|
||||||
|
*
|
||||||
|
* @param {booleanean} [force=false] Ignore the damper?
|
||||||
|
*
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
damper: core.global.damper(
|
||||||
|
(...variables) => this.send.system(...variables),
|
||||||
|
300,
|
||||||
|
2,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Guide
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Set user interface help elements
|
||||||
|
*
|
||||||
|
* @param {(string|Set)} stages
|
||||||
|
*
|
||||||
|
* @public
|
||||||
|
**/
|
||||||
|
guide(stages) {
|
||||||
|
if (stages !== undefined) {
|
||||||
|
// Received stages
|
||||||
|
|
||||||
|
if (stages instanceof Set) {
|
||||||
|
// Set
|
||||||
|
|
||||||
|
// Reinitializing stages
|
||||||
|
this.#stages = stages;
|
||||||
|
} else {
|
||||||
|
// String (expected)
|
||||||
|
|
||||||
|
// Writing into stages
|
||||||
|
this.#stages.add(stages);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const [parameter, element] of this.#elements) {
|
||||||
|
// Iterating over elements
|
||||||
|
|
||||||
|
// Initializing the guide HTML-element
|
||||||
|
const guide = element.querySelector('.guide');
|
||||||
|
|
||||||
|
if (guide instanceof HTMLElement) {
|
||||||
|
// Initialized the guide HTML-element
|
||||||
|
|
||||||
|
// Initializing the input HTML-element
|
||||||
|
const input = element.querySelector('.input');
|
||||||
|
|
||||||
|
if (input.value == "" || this.#stages.has(parameter)) {
|
||||||
|
// Requested guide
|
||||||
|
|
||||||
|
// Showing the guide
|
||||||
|
guide.classList.add('active');
|
||||||
|
} else {
|
||||||
|
// Not requested guide
|
||||||
|
|
||||||
|
// Hiding the guide
|
||||||
|
guide.classList.remove('active');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Pack
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Compose the superpack parameters
|
||||||
|
*
|
||||||
|
* @public
|
||||||
|
*
|
||||||
|
* @returns {string} Parameters row for `application/x-www-form-urlencoded`
|
||||||
|
*/
|
||||||
|
pack() {
|
||||||
|
// Exit (success)
|
||||||
|
return "identifier=" + encodeURIComponent(new Date().valueOf())
|
||||||
|
+ "&urn=" + encodeURIComponent(this.#urn)
|
||||||
|
+ "&title=" + encodeURIComponent(this.#title)
|
||||||
|
+ "&html=" + encodeURIComponent(this.#html)
|
||||||
|
+ "&text=" + encodeURIComponent(this.#text)
|
||||||
|
+ "&supercost=" + encodeURIComponent(this.#supercost)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name Send
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Compose the superpack and send to the server
|
||||||
|
*
|
||||||
|
* @public
|
||||||
|
*
|
||||||
|
* @param {boolean} [force=false] Ignore the damper?
|
||||||
|
*/
|
||||||
|
send(force = false) {
|
||||||
|
core.modules.connect("damper").then(
|
||||||
|
() => {
|
||||||
|
// Imported the damper module
|
||||||
|
|
||||||
|
// Processing under damper
|
||||||
|
this.send.damper(this.pack(), force);
|
||||||
|
},
|
||||||
|
() => {
|
||||||
|
// Not imported the damper module
|
||||||
|
|
||||||
|
// Processing
|
||||||
|
this.send.system(this.pack());
|
||||||
|
},
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -403,6 +403,13 @@ export default class superpack {
|
|||||||
// Reloading the page @todo make something smarter
|
// Reloading the page @todo make something smarter
|
||||||
alert("Запрос доставлен");
|
alert("Запрос доставлен");
|
||||||
|
|
||||||
|
if (json.redirect?.length > 0) {
|
||||||
|
// Received the redirect
|
||||||
|
|
||||||
|
// Redirect
|
||||||
|
window.location = json.redirect;
|
||||||
|
}
|
||||||
|
|
||||||
// Exit (success)
|
// Exit (success)
|
||||||
resolve();
|
resolve();
|
||||||
}
|
}
|
||||||
@@ -437,7 +444,7 @@ export default class superpack {
|
|||||||
*
|
*
|
||||||
* @return {void}
|
* @return {void}
|
||||||
*/
|
*/
|
||||||
damper: core.damper(
|
damper: core.global.damper(
|
||||||
(...variables) => this.send.system(...variables),
|
(...variables) => this.send.system(...variables),
|
||||||
300,
|
300,
|
||||||
2,
|
2,
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
section#project {
|
section#project {
|
||||||
--margin-bottom: 0.8rem;
|
--margin-bottom: 0.8rem;
|
||||||
--width: 480px;
|
--width: 420px;
|
||||||
z-index: 200;
|
z-index: 200;
|
||||||
position: relative;
|
position: relative;
|
||||||
margin-top: 3rem;
|
margin-top: 3rem;
|
||||||
@@ -50,6 +50,22 @@ section#project {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
>section.promotion {
|
||||||
|
>p {
|
||||||
|
margin: unset;
|
||||||
|
margin: 0 0rem 0.4rem 0rem;
|
||||||
|
padding: 0.5rem 0.7rem;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 1.1rem;
|
||||||
|
font-weight: 600;
|
||||||
|
color: #45ff01;
|
||||||
|
border-radius: 1.25rem;
|
||||||
|
border: 2px solid #45ff01;
|
||||||
|
text-shadow: 0px 1px 3px #000C, 0px 1px 1px #000B;
|
||||||
|
backdrop-filter: blur(1.2px);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
>noscript {
|
>noscript {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
@@ -75,8 +91,7 @@ section#project {
|
|||||||
>article {
|
>article {
|
||||||
--shadow: 0px 6px 6px -2px rgba(0, 0, 0, 0.5), 0px 0px 14px 5px rgba(0, 0, 0, 0.4);
|
--shadow: 0px 6px 6px -2px rgba(0, 0, 0, 0.5), 0px 0px 14px 5px rgba(0, 0, 0, 0.4);
|
||||||
position: relative;
|
position: relative;
|
||||||
padding: 2rem 1.4rem;
|
padding: 2rem 1.7rem;
|
||||||
padding: 1.6rem 1.4rem;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
gap: 1.4rem;
|
gap: 1.4rem;
|
||||||
@@ -149,7 +164,7 @@ section#project {
|
|||||||
}
|
}
|
||||||
|
|
||||||
>section {
|
>section {
|
||||||
padding: 0 0.6rem;
|
padding: 0 0.6rem 0 0.2rem;
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
|
||||||
@@ -857,23 +872,40 @@ section#project {
|
|||||||
}
|
}
|
||||||
|
|
||||||
>div.adaptive {
|
>div.adaptive {
|
||||||
display: contents;
|
/* display: contents; */
|
||||||
|
margin-bottom: var(--margin-bottom, 0.8rem);
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
gap: 1rem;
|
||||||
|
|
||||||
|
>* {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
>button#back {
|
>button#back {
|
||||||
--diameter: 7ch;
|
--diameter: 7ch;
|
||||||
--radius: calc(var(--diameter, 4ch) / 2);
|
--radius: calc(var(--diameter, 4ch) / 2);
|
||||||
position: absolute;
|
/* position: absolute;
|
||||||
left: calc(-1.2rem - var(--diameter, 4ch));
|
left: calc(-1.2rem - var(--diameter, 4ch));
|
||||||
top: calc(10rem - var(--radius, 2ch));
|
top: calc(10rem - var(--radius, 2ch)); */
|
||||||
width: var(--diameter, 4ch);
|
/* width: var(--diameter, 4ch); */
|
||||||
height: var(--diameter, 4ch);
|
/* height: var(--diameter, 4ch); */
|
||||||
display: flex;
|
display: flex;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
border-radius: 100%;
|
/* border-radius: 100%; */
|
||||||
border: unset;
|
border: unset;
|
||||||
background-color: var(--button-background-color, #fff);
|
background-color: var(--button-background-color, #fff);
|
||||||
|
|
||||||
|
position: relative;
|
||||||
|
left: unset;
|
||||||
|
top: unset;
|
||||||
|
margin: unset;
|
||||||
|
min-width: var(--diameter, 4ch);
|
||||||
|
width: 30%;
|
||||||
|
height: auto;
|
||||||
|
border-radius: 1.25rem;
|
||||||
|
|
||||||
&:is(:hover, :focus) {
|
&:is(:hover, :focus) {
|
||||||
background-color: var(--button-hover-background-color, #abc7c6);
|
background-color: var(--button-hover-background-color, #abc7c6);
|
||||||
}
|
}
|
||||||
@@ -884,11 +916,13 @@ section#project {
|
|||||||
|
|
||||||
>img {
|
>img {
|
||||||
padding-bottom: 0.15em;
|
padding-bottom: 0.15em;
|
||||||
|
scale: 1.2;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
>section#buttons {
|
>section#buttons {
|
||||||
margin-bottom: var(--margin-bottom, 0.8rem);
|
/* margin-bottom: var(--margin-bottom, 0.8rem); */
|
||||||
|
margin-bottom: unset;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
|
||||||
@@ -964,19 +998,26 @@ section#project {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
>small.description {
|
>small:is(.description, .technologies, .guarantee) {
|
||||||
padding: 0.9em 1.2em;
|
padding: 0.9em 1.2em;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
font-family: Nunito;
|
font-family: Nunito;
|
||||||
font-size: 0.9em;
|
font-size: 0.9em;
|
||||||
color: #d6c1c1;
|
color: #d6c1c1;
|
||||||
background: #b3ced31a;
|
background: #a5c2c724;
|
||||||
border-radius: 1.25rem;
|
border-radius: 1.25rem;
|
||||||
border-top: 1px solid #84d1d526;
|
border-top: 1px solid #84d1d52e;
|
||||||
backdrop-filter: blur(2px) contrast(1.14);
|
backdrop-filter: blur(2px) contrast(1.14);
|
||||||
/* text-shadow: 0px 1px 3px #000C, 0px 1px 1px #000B; */
|
/* text-shadow: 0px 1px 3px #000C, 0px 1px 1px #000B; */
|
||||||
text-shadow: unset;
|
text-shadow: unset;
|
||||||
|
|
||||||
|
>img.icon {
|
||||||
|
margin-right: 0.2em;
|
||||||
|
height: 2ch;
|
||||||
|
padding-top: 0.1em;
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
>:is(strong, b) {
|
>:is(strong, b) {
|
||||||
/* display: block; */
|
/* display: block; */
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
@@ -984,40 +1025,31 @@ section#project {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
>small.guarantee {
|
/* >small.description {}
|
||||||
padding: 0.9em 1.2em;
|
|
||||||
text-align: left;
|
|
||||||
font-family: Nunito;
|
|
||||||
font-size: 0.9em;
|
|
||||||
color: #d6c1c1;
|
|
||||||
background: #b3ced31a;
|
|
||||||
border-radius: 1.25rem;
|
|
||||||
border-top: 1px solid #84d1d526;
|
|
||||||
backdrop-filter: blur(2px) contrast(1.14);
|
|
||||||
/* text-shadow: 0px 1px 3px #000C, 0px 1px 1px #000B; */
|
|
||||||
text-shadow: unset;
|
|
||||||
|
|
||||||
>:is(strong, b) {
|
>small.guarantee {} */
|
||||||
/* display: block; */
|
|
||||||
font-weight: 600;
|
|
||||||
color: #ebdada;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
>b.partners {
|
>div.partners {
|
||||||
margin-top: 1.2rem;
|
margin-top: 1.4rem;
|
||||||
|
margin-bottom: 0.5rem;
|
||||||
padding: 0 1em;
|
padding: 0 1em;
|
||||||
text-align: center;
|
display: flex;
|
||||||
font-family: Bahnschrift;
|
flex-direction: column;
|
||||||
font-weight: 600;
|
|
||||||
font-size: 1.2em;
|
|
||||||
color: #d6c1c1;
|
|
||||||
text-shadow: 0px 1px 3px #000C, 0px 1px 1px #000B;
|
|
||||||
|
|
||||||
>:is(strong, b) {
|
>div.icon {
|
||||||
/* display: block; */
|
height: 24px;
|
||||||
|
scale: 1.2;
|
||||||
|
background: linear-gradient(#ffe24c 30%, #b89301 80%);
|
||||||
|
mask: var(--mask-image) no-repeat center bottom;
|
||||||
|
}
|
||||||
|
|
||||||
|
>b {
|
||||||
|
text-align: center;
|
||||||
|
font-family: Bahnschrift;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
color: #ebdada;
|
font-size: 1.2em;
|
||||||
|
color: #d6d327;
|
||||||
|
text-shadow: 0px 0px 5px #FFB54147, 0px 0px 2px #FFAF313D;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1071,7 +1103,7 @@ section#project {
|
|||||||
--width: 100vw;
|
--width: 100vw;
|
||||||
padding: 0 2rem;
|
padding: 0 2rem;
|
||||||
|
|
||||||
>div.adaptive {
|
/* >div.adaptive {
|
||||||
margin-bottom: var(--margin-bottom, 0.8rem);
|
margin-bottom: var(--margin-bottom, 0.8rem);
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
@@ -1095,7 +1127,7 @@ section#project {
|
|||||||
>section#buttons {
|
>section#buttons {
|
||||||
margin-bottom: unset;
|
margin-bottom: unset;
|
||||||
}
|
}
|
||||||
}
|
} */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,8 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
>article#rofls {
|
>article#rofls {
|
||||||
z-index: 50;
|
z-index: 4000;
|
||||||
|
position: relative;
|
||||||
width: 100vw;
|
width: 100vw;
|
||||||
height: 32px;
|
height: 32px;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|||||||
@@ -12,8 +12,6 @@ main {
|
|||||||
align-items: center;
|
align-items: center;
|
||||||
transition: 0s;
|
transition: 0s;
|
||||||
overflow-x: hidden;
|
overflow-x: hidden;
|
||||||
overflow-y: scroll;
|
|
||||||
overscroll-behavior: none;
|
|
||||||
|
|
||||||
&:not(:has(*)) {
|
&:not(:has(*)) {
|
||||||
display: none;
|
display: none;
|
||||||
|
|||||||
36
kodorvan/site/system/public/themes/default/css/pages/article.css
Executable file
@@ -0,0 +1,36 @@
|
|||||||
|
@charset "UTF-8";
|
||||||
|
|
||||||
|
body {
|
||||||
|
>main {
|
||||||
|
>article#article {
|
||||||
|
z-index: 500;
|
||||||
|
border-radius: 1.25rem;
|
||||||
|
margin: 3rem 0 8rem;
|
||||||
|
width: 880px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: 3rem 4rem;
|
||||||
|
background: #fff;
|
||||||
|
|
||||||
|
>h1 {
|
||||||
|
margin-top: unset;
|
||||||
|
margin-bottom: 2.5rem;
|
||||||
|
text-align: center;
|
||||||
|
font-family: "MT Sans";
|
||||||
|
font-size: 3rem;
|
||||||
|
font-weight: 400;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (width < 1000px) {
|
||||||
|
body {
|
||||||
|
>main {
|
||||||
|
>article#article {
|
||||||
|
margin-bottom: unset;
|
||||||
|
width: 100%;
|
||||||
|
border-radius: unset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -145,6 +145,140 @@ body {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
>div#superpack_image {
|
||||||
|
>img.icon {
|
||||||
|
grid-row: 1;
|
||||||
|
align-self: start;
|
||||||
|
}
|
||||||
|
|
||||||
|
>div {
|
||||||
|
--padding-vertical: 1.7em;
|
||||||
|
grid-row: 1/3;
|
||||||
|
position: relative;
|
||||||
|
min-height: 6ch;
|
||||||
|
height: min-content;
|
||||||
|
padding: 0 1.3em var(--padding-vertical, 1em);
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
justify-content: start;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.2rem;
|
||||||
|
|
||||||
|
&:has(>input[type="file"]:is(:hover, :focus)) {
|
||||||
|
>label.pseudoinput {
|
||||||
|
background-color: #e7e6e0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:has(>input[type="file"]:active) {
|
||||||
|
>label.pseudoinput {
|
||||||
|
background-color: #c0bfb4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
>span.title {
|
||||||
|
z-index: 60;
|
||||||
|
margin: unset;
|
||||||
|
margin-top: calc(var(--padding-vertical, 1em) + 0.3em);
|
||||||
|
font-family: Bahnschrift;
|
||||||
|
font-size: 0.9em;
|
||||||
|
font-weight: 400;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
>ol.files {
|
||||||
|
z-index: 50;
|
||||||
|
margin: unset;
|
||||||
|
margin-top: 0.2em;
|
||||||
|
padding: unset;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 0.2em;
|
||||||
|
font-size: 0.8em;
|
||||||
|
list-style: numbered;
|
||||||
|
|
||||||
|
&:empty {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
>li {
|
||||||
|
position: relative;
|
||||||
|
height: 1.3em;
|
||||||
|
box-sizing: border-box;
|
||||||
|
line-height: 1.1em;
|
||||||
|
|
||||||
|
&:has(>button:is(:hover, :focus)) {
|
||||||
|
border-bottom: 1px dashed #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:has(>button:active) {
|
||||||
|
border-bottom: 1px solid #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
>button.delete {
|
||||||
|
position: absolute;
|
||||||
|
top: -0.05em;
|
||||||
|
right: -1.7em;
|
||||||
|
height: 1.3em;
|
||||||
|
padding: 0.15em;
|
||||||
|
border: unset;
|
||||||
|
background: unset;
|
||||||
|
|
||||||
|
>img {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:is(:hover, :focus) {
|
||||||
|
background-color: #3302;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
background-color: #3304;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
>small.guide {
|
||||||
|
z-index: 60;
|
||||||
|
text-align: center;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
>label.pseudoinput {
|
||||||
|
z-index: 0;
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
box-sizing: border-box;
|
||||||
|
cursor: context-menu;
|
||||||
|
border: 1px dashed #000;
|
||||||
|
|
||||||
|
&:is(:hover, :focus) {
|
||||||
|
>label.pseudoinput {
|
||||||
|
background-color: #e7e6e0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
>label.pseudoinput {
|
||||||
|
background-color: #c0bfb4;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
>input[type="file"] {
|
||||||
|
position: absolute;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
opacity: 0;
|
||||||
|
pointer-events: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
>button {
|
>button {
|
||||||
padding: 1.2rem 1rem;
|
padding: 1.2rem 1rem;
|
||||||
font-size: 1.1rem;
|
font-size: 1.1rem;
|
||||||
@@ -162,7 +296,7 @@ body {
|
|||||||
@media (width < 1000px) {
|
@media (width < 1000px) {
|
||||||
body {
|
body {
|
||||||
>main {
|
>main {
|
||||||
>article#offer {
|
>article#superpack {
|
||||||
margin-bottom: unset;
|
margin-bottom: unset;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
border-radius: unset;
|
border-radius: unset;
|
||||||
|
|||||||
@@ -43,7 +43,11 @@
|
|||||||
body {
|
body {
|
||||||
margin: unset;
|
margin: unset;
|
||||||
width: 100vw;
|
width: 100vw;
|
||||||
|
height: 100%;
|
||||||
|
-webkit-overflow-scrolling: touch;
|
||||||
overflow-x: hidden;
|
overflow-x: hidden;
|
||||||
|
overflow-y: scroll;
|
||||||
|
overscroll-behavior: none;
|
||||||
|
|
||||||
/* background: var(--background-color, #fff);
|
/* background: var(--background-color, #fff);
|
||||||
background: var(--background-gradient); */
|
background: var(--background-gradient); */
|
||||||
@@ -130,6 +134,10 @@ a {
|
|||||||
user-select: none;
|
user-select: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.underline {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
input[type="range"] {
|
input[type="range"] {
|
||||||
cursor: grab;
|
cursor: grab;
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
<svg
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<path d="M9 21.5L17.5 13L13 10L15 2.5L6.5 11L11 14L9 21.5Z" fill="currentColor" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 198 B |
@@ -0,0 +1,14 @@
|
|||||||
|
<svg
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
fill-rule="evenodd"
|
||||||
|
clip-rule="evenodd"
|
||||||
|
d="M2.5 6.09143L7.21997 10.8114L12.0005 6.03088L16.7811 10.8114L21.5 6.09245V14.9691C21.5 16.626 20.1569 17.9691 18.5 17.9691H5.5C3.84314 17.9691 2.5 16.626 2.5 14.9691V6.09143ZM19.5 10.9087V14.9691C19.5 15.5214 19.0523 15.9691 18.5 15.9691H5.5C4.94771 15.9691 4.5 15.5214 4.5 14.9691V10.9077L7.21997 13.6277L12.0005 8.84717L16.7811 13.6277L19.5 10.9087Z"
|
||||||
|
fill="currentColor"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 558 B |
@@ -0,0 +1,14 @@
|
|||||||
|
<svg
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
fill-rule="evenodd"
|
||||||
|
clip-rule="evenodd"
|
||||||
|
d="M17.5354 2.87868C16.3638 1.70711 14.4644 1.70711 13.2928 2.87868L11.8786 4.29289C11.8183 4.35317 11.7611 4.41538 11.707 4.47931C11.653 4.41539 11.5958 4.3532 11.5355 4.29293L10.1213 2.87871C8.94975 1.70714 7.05025 1.70714 5.87868 2.87871C4.70711 4.05029 4.70711 5.94978 5.87868 7.12136L6.75732 8H1V14H3V22H21V14H23V8H16.6567L17.5354 7.12132C18.707 5.94975 18.707 4.05025 17.5354 2.87868ZM14.707 7.12132L16.1212 5.70711C16.5117 5.31658 16.5117 4.68342 16.1212 4.29289C15.7307 3.90237 15.0975 3.90237 14.707 4.29289L13.2928 5.70711C12.9023 6.09763 12.9023 6.7308 13.2928 7.12132C13.6833 7.51184 14.3165 7.51184 14.707 7.12132ZM10.1213 5.70714L8.70711 4.29293C8.31658 3.9024 7.68342 3.9024 7.29289 4.29293C6.90237 4.68345 6.90237 5.31662 7.29289 5.70714L8.70711 7.12136C9.09763 7.51188 9.7308 7.51188 10.1213 7.12136C10.5118 6.73083 10.5118 6.09767 10.1213 5.70714ZM21 10V12H3V10H21ZM12.9167 14H19V20H12.9167V14ZM11.0834 14V20H5V14H11.0834Z"
|
||||||
|
fill="currentColor"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
@@ -0,0 +1,14 @@
|
|||||||
|
<svg
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
fill-rule="evenodd"
|
||||||
|
clip-rule="evenodd"
|
||||||
|
d="M12.0122 5.57169L10.9252 4.48469C8.77734 2.33681 5.29493 2.33681 3.14705 4.48469C0.999162 6.63258 0.999162 10.115 3.14705 12.2629L11.9859 21.1017L11.9877 21.0999L12.014 21.1262L20.8528 12.2874C23.0007 10.1395 23.0007 6.65711 20.8528 4.50923C18.705 2.36134 15.2226 2.36134 13.0747 4.50923L12.0122 5.57169ZM11.9877 18.2715L16.9239 13.3352L18.3747 11.9342L18.3762 11.9356L19.4386 10.8732C20.8055 9.50635 20.8055 7.29028 19.4386 5.92344C18.0718 4.55661 15.8557 4.55661 14.4889 5.92344L12.0133 8.39904L12.006 8.3918L12.005 8.39287L9.51101 5.89891C8.14417 4.53207 5.92809 4.53207 4.56126 5.89891C3.19442 7.26574 3.19442 9.48182 4.56126 10.8487L7.10068 13.3881L7.10248 13.3863L11.9877 18.2715Z"
|
||||||
|
fill="currentColor"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 893 B |
@@ -0,0 +1,9 @@
|
|||||||
|
<svg
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<path d="M9 21.5L17.5 13L13 10L15 2.5L6.5 11L11 14L9 21.5Z" fill="#fff" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 191 B |
@@ -0,0 +1,14 @@
|
|||||||
|
<svg
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
fill-rule="evenodd"
|
||||||
|
clip-rule="evenodd"
|
||||||
|
d="M2.5 6.09143L7.21997 10.8114L12.0005 6.03088L16.7811 10.8114L21.5 6.09245V14.9691C21.5 16.626 20.1569 17.9691 18.5 17.9691H5.5C3.84314 17.9691 2.5 16.626 2.5 14.9691V6.09143ZM19.5 10.9087V14.9691C19.5 15.5214 19.0523 15.9691 18.5 15.9691H5.5C4.94771 15.9691 4.5 15.5214 4.5 14.9691V10.9077L7.21997 13.6277L12.0005 8.84717L16.7811 13.6277L19.5 10.9087Z"
|
||||||
|
fill="#fff"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 551 B |
@@ -0,0 +1,12 @@
|
|||||||
|
<svg
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
d="M2.5 6.09143L7.21997 10.8114L12.0005 6.03088L16.7811 10.8114L21.5 6.09245V14.9691C21.5 16.626 20.1569 17.9691 18.5 17.9691H5.5C3.84314 17.9691 2.5 16.626 2.5 14.9691V6.09143ZM19.5 10.9087V14.9691C19.5 15.5214 19.0523 15.9691 18.5 15.9691H5.5C4.94771 15.9691 4.5 15.5214 4.5 14.9691V10.9077L7.21997 13.6277L12.0005 8.84717L16.7811 13.6277L19.5 10.9087Z"
|
||||||
|
fill="#fff"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 503 B |
@@ -0,0 +1,16 @@
|
|||||||
|
<svg
|
||||||
|
width="24"
|
||||||
|
height="24"
|
||||||
|
viewBox="0 0 24 24"
|
||||||
|
fill="none"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
>
|
||||||
|
<path
|
||||||
|
fill-rule="evenodd"
|
||||||
|
clip-rule="evenodd"
|
||||||
|
d="M13 15.9C15.2822 15.4367 17 13.419 17 11V4H7V11C7 13.419 8.71776 15.4367 11 15.9V18H9V20H15V18H13V15.9ZM9 6H15V11C15 12.6569 13.6569 14 12 14C10.3431 14 9 12.6569 9 11V6Z"
|
||||||
|
fill="#fff"
|
||||||
|
/>
|
||||||
|
<path d="M18 6H20V11H18V6Z" fill="#fff" />
|
||||||
|
<path d="M6 6H4V11H6V6Z" fill="#fff" />
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 457 B |
@@ -31,7 +31,7 @@
|
|||||||
oninput="core.global.project.architecture = this.value"
|
oninput="core.global.project.architecture = this.value"
|
||||||
>
|
>
|
||||||
<option value="" selected="true" disabled="true" hidden="true" data-project-select-title="true">Выберите архитектуру</option>
|
<option value="" selected="true" disabled="true" hidden="true" data-project-select-title="true">Выберите архитектуру</option>
|
||||||
{% for value, label in project.architectures %}
|
{% for value, label in calculator.architectures %}
|
||||||
<option value="{{ value }}">{{ label }}</option>
|
<option value="{{ value }}">{{ label }}</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
@@ -48,7 +48,7 @@
|
|||||||
oninput="core.global.project.purpose = this.value"
|
oninput="core.global.project.purpose = this.value"
|
||||||
>
|
>
|
||||||
<option value="" selected="true" disabled="true" hidden="true" data-project-select-title="true">Выберите назначение</option>
|
<option value="" selected="true" disabled="true" hidden="true" data-project-select-title="true">Выберите назначение</option>
|
||||||
{% for value, label in project.purposes %}
|
{% for value, label in calculator.purposes %}
|
||||||
<option value="{{ value }}">{{ label }}</option>
|
<option value="{{ value }}">{{ label }}</option>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</select>
|
</select>
|
||||||
@@ -57,7 +57,7 @@
|
|||||||
<div id="integrations" style="display: none;">
|
<div id="integrations" style="display: none;">
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<legend>Интеграции</legend>
|
<legend>Интеграции</legend>
|
||||||
{% for value, label in project.integrations %}
|
{% for value, label in calculator.integrations %}
|
||||||
<div class="integration hidden">
|
<div class="integration hidden">
|
||||||
<input
|
<input
|
||||||
id="integration_input_{{ value }}"
|
id="integration_input_{{ value }}"
|
||||||
|
|||||||
@@ -10,6 +10,10 @@
|
|||||||
<span class="unselectable">Отправьте заявку и получите бесплатный<br/>расчёт с индивидуальными рекомендациями!</span>
|
<span class="unselectable">Отправьте заявку и получите бесплатный<br/>расчёт с индивидуальными рекомендациями!</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<section class="promotion unselectable">
|
||||||
|
<p>Скидка <b>10%</b> в честь запуска сайта</p>
|
||||||
|
</section>
|
||||||
|
|
||||||
<noscript>
|
<noscript>
|
||||||
<b>Калькулятор не загрузится в вашем браузере</b></br>
|
<b>Калькулятор не загрузится в вашем браузере</b></br>
|
||||||
<i>Оформите заказ через звонок оператору по номеру {{ contacts.sim.requests.full ?? 'Ошибка' }}</i>
|
<i>Оформите заказ через звонок оператору по номеру {{ contacts.sim.requests.full ?? 'Ошибка' }}</i>
|
||||||
@@ -154,7 +158,7 @@
|
|||||||
<img src="/themes/default/images/icons/circle.svg" alt="lock kodorvan" style="display: var(--display, none)" ondragstart="return false"/>
|
<img src="/themes/default/images/icons/circle.svg" alt="lock kodorvan" style="display: var(--display, none)" ondragstart="return false"/>
|
||||||
<img src="/themes/default/images/icons/circle_dot.svg" alt="unlock kodorvan" style="display: var(--display, none)" ondragstart="return false"/>
|
<img src="/themes/default/images/icons/circle_dot.svg" alt="unlock kodorvan" style="display: var(--display, none)" ondragstart="return false"/>
|
||||||
</div>
|
</div>
|
||||||
<span class="title">Разрешаю запись, обработку и хранение моих персональных данных</span>
|
<span class="title">Разрешаю запись, обработку и хранение моих персональных данных, <span class="underline">без передачи третьим лицам</span></span>
|
||||||
</label>
|
</label>
|
||||||
</section>
|
</section>
|
||||||
</section>
|
</section>
|
||||||
@@ -162,7 +166,7 @@
|
|||||||
|
|
||||||
<div class="adaptive">
|
<div class="adaptive">
|
||||||
<button id="back" class="unselectable" onclick="core.global.paginator.relative(-1)" style="display: none">
|
<button id="back" class="unselectable" onclick="core.global.paginator.relative(-1)" style="display: none">
|
||||||
<img src="/themes/default/images/icons/arrow_left.svg" alt="back button kodorvan" ondragstart="return false"/>
|
<img class="icon" src="/themes/default/images/icons/arrow_left.svg" alt="back button kodorvan" ondragstart="return false"/>
|
||||||
</button>
|
</button>
|
||||||
|
|
||||||
<section id="buttons">
|
<section id="buttons">
|
||||||
@@ -183,9 +187,16 @@
|
|||||||
</script>
|
</script>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<small class="description unselectable"><strong>Команда разработчиков</strong> - мы реальные исполнители из <strong>Перми</strong>! <wbr/>Передача кода заказчику в его полную собственность и подпись <b>NDA</b>. Не используем ИИ в разработке! <wbr/><b>Полная анонимность</b> проектов - никто не узнает кто разработчик. <wbr/><b>Не оставляем</b> блокировки и скрытую рекламу в коде!</small>
|
<small class="description unselectable" aria-label="Описание"><strong>Команда разработчиков</strong> с большой историей!</strong> <wbr/>Передаём проект в <b>полную собственность</b>. <wbr>Не используем ИИ в разработке! <wbr><b>Не оставляем блокировки</b> и скрытые метки в коде! <wbr><strong>Юридическая броня!</strong> <wbr><strong>Грамотный SEO</strong> - не текстами, а глубоко в архитектуре. <wbr><strong>Собственные сервера в Перми!</strong></small>
|
||||||
<small class="guarantee unselectable"><strong>Гарантия качества</strong><b>:</b> небольшие и простые проекты мы передаём нашим студентам, но за качество кода и соблюдение сроков всегда отвечает наставник!</small>
|
|
||||||
<b class="partners unselectable">Поддерживаем проекты наших<br/>партнёров с 2014 года!</b>
|
<small class="technologies text unselectable" aria-label="Технологии"><img class="icon" src="/themes/default/images/icons/white/bolt.svg" alt="technologies kodorvan" ondragstart="return false"/><strong>Уникальные технологии</strong><b>:</b> наши разработки, проверенные годами в проектах с большой ответственностью и высокой нагрузкой.</small>
|
||||||
|
|
||||||
|
<small class="guarantee unselectable" aria-label="Гарантия"><img class="icon" src="/themes/default/images/icons/white/trophy.svg" alt="technologies kodorvan" ondragstart="return false"/><strong>Гарантия качества</strong><b>:</b> небольшие проекты мы передаём нашим студентам, но за <b>качество</b> кода и <b>соблюдение сроков</b> всегда отвечает наставник!</small>
|
||||||
|
|
||||||
|
<div class="partners unselectable" aria-label="Партнёры">
|
||||||
|
<div class="icon" style="--mask-image: url('/themes/default/images/icons/white/solid/crown.svg')"></div>
|
||||||
|
<b>Поддерживаем проекты наших<br/>партнёров с 2014 года!</b>
|
||||||
|
</div>
|
||||||
|
|
||||||
<section id="contacts_shortcut">
|
<section id="contacts_shortcut">
|
||||||
{% include '/themes/default/interface/media.html' %}
|
{% include '/themes/default/interface/media.html' %}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
{{ parent() }}
|
{{ parent() }}
|
||||||
|
|
||||||
<link type="text/css" rel="stylesheet" href="/css/icons/loading_spinner.css" />
|
<link type="text/css" rel="stylesheet" href="/css/icons/loading_spinner.css" />
|
||||||
<link type="text/css" rel="stylesheet" href="/themes/default/css/pages/offer.css" />
|
<link type="text/css" rel="stylesheet" href="/themes/default/css/pages/article.css" />
|
||||||
<link type="text/css" rel="stylesheet" href="/themes/default/css/elements/cookies.css" />
|
<link type="text/css" rel="stylesheet" href="/themes/default/css/elements/cookies.css" />
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
@@ -14,10 +14,23 @@
|
|||||||
{% block main %}
|
{% block main %}
|
||||||
{% include '/themes/default/interface/logotype.html' %}
|
{% include '/themes/default/interface/logotype.html' %}
|
||||||
|
|
||||||
<article id="{{ article.identifier }}" aria-label="{{ article.title }}">
|
<article id="article" aria-label="Статья">
|
||||||
<h1>{{ article.title }}</h1>
|
<section class="head" aria-label="Верхний колонтинул статьи">
|
||||||
|
<h1 aria-label="Заголовок статьи">{{ article.head.title }}</h1>
|
||||||
|
{% if article.head.image.src is not empty %}
|
||||||
|
<img
|
||||||
|
src="{{ article.head.image.src }}"
|
||||||
|
{% if article.head.image.width is not empty %}width="{{ article.head.image.width }}"{% endif %}
|
||||||
|
{% if article.head.image.height is not empty %}height="{{ article.head.image.height }}"{% endif %}
|
||||||
|
{% if article.head.image.alt is not empty %}alt="{{ article.head.image.alt }}"{% endif %}
|
||||||
|
aria-label="Фоновое изображение верхнего колонтинула статьи"
|
||||||
|
/>
|
||||||
|
{% endif %}
|
||||||
|
</section>
|
||||||
|
|
||||||
{{ article.html|raw }}
|
<section class="body" aria-label="Содержимое статьи">
|
||||||
|
{{ article.body.html|raw }}
|
||||||
|
</section>
|
||||||
</article>
|
</article>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,134 @@
|
|||||||
|
{% extends "/themes/default/index.html" %}
|
||||||
|
|
||||||
|
|
||||||
|
{% block css %}
|
||||||
|
{{ parent() }}
|
||||||
|
|
||||||
|
<link type="text/css" rel="stylesheet" href="/css/icons/loading_spinner.css" />
|
||||||
|
<link type="text/css" rel="stylesheet" href="/themes/default/css/pages/system/superpack/create.css" />
|
||||||
|
<link type="text/css" rel="stylesheet" href="/themes/default/css/elements/cookies.css" />
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block before %}
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block main %}
|
||||||
|
{% include '/themes/default/interface/logotype.html' %}
|
||||||
|
|
||||||
|
<article id="superpack" aria-label="Форма создания суперпака">
|
||||||
|
<h1 class="unselectable">СОЗДАНИЕ СУПЕРПАКА</h1>
|
||||||
|
|
||||||
|
<section class="unselectable">
|
||||||
|
<label id="superpack_urn" class="input icon" for="superpack_urn_input">
|
||||||
|
<img class="icon" src="/themes/default/images/icons/nametag.svg" alt="nametag kodorvan" ondragstart="return false"/>
|
||||||
|
<span class="title">URN</span>
|
||||||
|
<input
|
||||||
|
id="superpack_urn_input"
|
||||||
|
class="input domain"
|
||||||
|
name="superpack_urn_input"
|
||||||
|
type="text"
|
||||||
|
placeholder="chat-bot-market"
|
||||||
|
value=""
|
||||||
|
autocomplete="off"
|
||||||
|
onkeyup="core.system.superpack.urn = this.value"
|
||||||
|
/>
|
||||||
|
<small class="guide active">Введите URN суперпака</small>
|
||||||
|
</label>
|
||||||
|
<label id="superpack_title" class="input icon" for="superpack_title_input">
|
||||||
|
<img class="icon" src="/themes/default/images/icons/notes.svg" alt="notes kodorvan" ondragstart="return false"/>
|
||||||
|
<span class="title">Название</span>
|
||||||
|
<input
|
||||||
|
id="superpack_title_input"
|
||||||
|
class="input"
|
||||||
|
name="superpack_title_input"
|
||||||
|
type="text"
|
||||||
|
placeholder="Чат-бот для магазина"
|
||||||
|
value=""
|
||||||
|
autocomplete="off"
|
||||||
|
onkeyup="core.system.superpack.title = this.value"
|
||||||
|
/>
|
||||||
|
<small class="guide active">Введите название суперпака</small>
|
||||||
|
</label>
|
||||||
|
<div id="superpack_image" class="input icon">
|
||||||
|
<img class="icon" src="/themes/default/images/icons/import.svg" alt="import kodorvan" ondragstart="return false"/>
|
||||||
|
<div>
|
||||||
|
<span class="title">Импорт</span>
|
||||||
|
<ol style="display: none;" class="files"></ol>
|
||||||
|
<small class="guide active">Загрузите фоновое изображение верхнего колонтинула</small>
|
||||||
|
<label class="pseudoinput" for="superpack_image_input"></label>
|
||||||
|
<input
|
||||||
|
id="superpack_image_input"
|
||||||
|
class="input"
|
||||||
|
name="superpack_image_input"
|
||||||
|
type="file",
|
||||||
|
accept="image/*"
|
||||||
|
value=""
|
||||||
|
autocomplete="off"
|
||||||
|
oninput="core.system.superpack.files = this.files"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<label id="superpack_text" class="input icon" for="superpack_text_input">
|
||||||
|
<img class="icon" src="/themes/default/images/icons/notes.svg" alt="notes kodorvan" ondragstart="return false"/>
|
||||||
|
<span class="title">Описание</span>
|
||||||
|
<textarea
|
||||||
|
id="superpack_text_input"
|
||||||
|
class="input"
|
||||||
|
name="superpack_text_input"
|
||||||
|
cols="100%"
|
||||||
|
maxlength="4096"
|
||||||
|
value=""
|
||||||
|
autocomplete="off"
|
||||||
|
placeholder="Готовое техническое решение для открытия новой точки продаж в сети"
|
||||||
|
onkeyup="core.system.superpack.text = this.value"
|
||||||
|
></textarea>
|
||||||
|
<small class="guide active">Введите описание суперпака</small>
|
||||||
|
</label>
|
||||||
|
<label id="superpack_html" class="input icon" for="superpack_html_input">
|
||||||
|
<img class="icon" src="/themes/default/images/icons/notes.svg" alt="notes kodorvan" ondragstart="return false"/>
|
||||||
|
<span class="title">Описание в формате HTML</span>
|
||||||
|
<textarea
|
||||||
|
id="superpack_html_input"
|
||||||
|
class="input"
|
||||||
|
name="superpack_html_input"
|
||||||
|
cols="100%"
|
||||||
|
maxlength="4096"
|
||||||
|
value=""
|
||||||
|
autocomplete="off"
|
||||||
|
placeholder="<p>Готовое техническое решение для открытия новой точки продаж в сети</p>"
|
||||||
|
onkeyup="core.system.superpack.html = this.value"
|
||||||
|
></textarea>
|
||||||
|
<small class="guide active">Введите описание суперпака в формате HTML</small>
|
||||||
|
</label>
|
||||||
|
<label id="superpack_supercost" class="input icon" for="superpack_supercost_input">
|
||||||
|
<img class="icon" src="/themes/default/images/icons/notes.svg" alt="notes kodorvan" ondragstart="return false"/>
|
||||||
|
<span class="title">Стоимость</span>
|
||||||
|
<input
|
||||||
|
id="superpack_supercost_input"
|
||||||
|
class="input"
|
||||||
|
name="superpack_supercost_input"
|
||||||
|
type="number"
|
||||||
|
placeholder="2000"
|
||||||
|
value=""
|
||||||
|
autocomplete="off"
|
||||||
|
onkeyup="core.system.superpack.supercost = this.value"
|
||||||
|
/>
|
||||||
|
<small class="guide active">Введите стоимость суперпака</small>
|
||||||
|
</label>
|
||||||
|
<button
|
||||||
|
id="send"
|
||||||
|
onclick="core.system.superpack.send();"
|
||||||
|
>Отправить на сервер</button>
|
||||||
|
</section>
|
||||||
|
</article>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block after %}
|
||||||
|
<div class="vignette"></div>
|
||||||
|
<div class="dots"></div>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block js %}
|
||||||
|
{{ parent() }}
|
||||||
|
<script src="/js/pages/system/superpack.js" type="module" defer></script>
|
||||||
|
{% endblock %}
|
||||||