Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7c8524066b | |||
| 14050cbb24 | |||
| ae63ceac52 | |||
| 31df4fa07d | |||
| 0d48c55530 | |||
| aa9b2e722c | |||
| b304c89698 | |||
| 3d851a2087 | |||
| e6c0c57b1f |
@@ -26,13 +26,15 @@
|
||||
"require": {
|
||||
"php": "^8.5",
|
||||
"ext-blake3": "^0.1",
|
||||
"mirzaev/minimal": "^3.8",
|
||||
"mirzaev/minimal": "^3.10.4",
|
||||
"mirzaev/baza": "^3.4",
|
||||
"mirzaev/languages": "^1",
|
||||
"twig/twig": "^3.2",
|
||||
"twig/extra-bundle": "^3.7",
|
||||
"twig/intl-extra": "^3.10",
|
||||
"phpmailer/phpmailer": "^7.0"
|
||||
"phpmailer/phpmailer": "^7.0",
|
||||
"mirzaev/record": "^2.2",
|
||||
"svoboda/time": "^1.0"
|
||||
},
|
||||
"suggest": {
|
||||
"mirzaev/files": "Easy working with files",
|
||||
|
||||
77
composer.lock
generated
@@ -4,7 +4,7 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "3d3b850ebd1027cf1790dfa901746eab",
|
||||
"content-hash": "15ac0ce9a39edb330d95b578175d5636",
|
||||
"packages": [
|
||||
{
|
||||
"name": "mirzaev/baza",
|
||||
@@ -141,6 +141,48 @@
|
||||
},
|
||||
"time": "2026-04-17T06:08:04+00:00"
|
||||
},
|
||||
{
|
||||
"name": "mirzaev/record",
|
||||
"version": "2.2.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://git.svoboda.works/mirzaev/record",
|
||||
"reference": "71360614d6cbab0fe33ec0feca15005ca913397a"
|
||||
},
|
||||
"require": {
|
||||
"mirzaev/baza": "^3.4",
|
||||
"php": "^8.4",
|
||||
"svoboda/time": "^1.0"
|
||||
},
|
||||
"type": "pattern",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"mirzaev\\record\\": "mirzaev/record/system"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"WTFPL"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Arsen Mirzaev Tatyano-Muradovich",
|
||||
"email": "arsen@mirzaev.sexy",
|
||||
"homepage": "https://mirzaev.sexy",
|
||||
"role": "Creator"
|
||||
}
|
||||
],
|
||||
"description": "Active Record pattern for Baza",
|
||||
"homepage": "https://git.svoboda.works/mirzaev/record",
|
||||
"keywords": [
|
||||
"baza"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://git.svoboda.works/mirzaev/record/issues",
|
||||
"wiki": "https://git.svoboda.works/mirzaev/record/wiki"
|
||||
},
|
||||
"time": "2026-03-08T18:23:49+00:00"
|
||||
},
|
||||
{
|
||||
"name": "mobiledetect/mobiledetectlib",
|
||||
"version": "4.8.10",
|
||||
@@ -540,6 +582,39 @@
|
||||
},
|
||||
"time": "2021-10-29T13:26:27+00:00"
|
||||
},
|
||||
{
|
||||
"name": "svoboda/time",
|
||||
"version": "1.0.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://git.svoboda.works/svoboda/time",
|
||||
"reference": "0764960606d56a9f0865ebb07671d30a7d232b6a"
|
||||
},
|
||||
"require": {
|
||||
"php": "^8.4"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"svoboda\\time\\": "svoboda/time/system"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"WTFPL"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Arsen Mirzaev Tatyano-Muradovich",
|
||||
"email": "arsen@mirzaev.sexy",
|
||||
"homepage": "https://mirzaev.sexy",
|
||||
"role": "Programmer"
|
||||
}
|
||||
],
|
||||
"description": "Time since Svoboda was created",
|
||||
"homepage": "https://git.svoboda.works/svoboda/time",
|
||||
"time": "2025-02-02T11:04:25+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/cache",
|
||||
"version": "v8.0.8",
|
||||
|
||||
197
kodorvan/site/system/controllers/article.php
Executable file
@@ -0,0 +1,197 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace kodorvan\site\controllers;
|
||||
|
||||
// Files of the project
|
||||
use kodorvan\site\controllers\core,
|
||||
kodorvan\site\models\superpack as model;
|
||||
|
||||
// Framework for PHP
|
||||
use mirzaev\minimal\http\enumerations\content,
|
||||
mirzaev\minimal\http\enumerations\method,
|
||||
mirzaev\minimal\http\enumerations\status;
|
||||
|
||||
// Baza database
|
||||
use mirzaev\baza\database,
|
||||
mirzaev\baza\column,
|
||||
mirzaev\baza\record,
|
||||
mirzaev\baza\enumerations\encoding,
|
||||
mirzaev\baza\enumerations\type;
|
||||
|
||||
/**
|
||||
* Offer
|
||||
*
|
||||
* @package kodorvan\site\controllers
|
||||
*
|
||||
* @param array $errors Registry of errors
|
||||
*
|
||||
* @method null index() Main page
|
||||
*
|
||||
* @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License
|
||||
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
|
||||
*/
|
||||
final class article extends core
|
||||
{
|
||||
/**
|
||||
* Errors
|
||||
*
|
||||
* @var array $errors Registry of errors
|
||||
*/
|
||||
protected array $errors = [
|
||||
'system' => []
|
||||
];
|
||||
|
||||
/**
|
||||
* Page: superpack
|
||||
*
|
||||
* @return null
|
||||
*/
|
||||
public function index(string $urn): null
|
||||
{
|
||||
if (str_contains($this->request->headers['accept'] ?? '', content::html->value)) {
|
||||
// Request for HTML response
|
||||
|
||||
// Initializing the superpack
|
||||
$superpack = new model()->read(filter: fn(record $record) => $record->urn === $urn && $record->active === 1);
|
||||
|
||||
if ($superpack instanceof model) {
|
||||
// Initialized the superpack
|
||||
|
||||
// Render page
|
||||
$page = $this->view->render(
|
||||
'pages/article.html',
|
||||
[
|
||||
'uri' => 'https://' . DOMAIN . "/superpack/$urn",
|
||||
'article' => [
|
||||
'urn' => $superpack->urn,
|
||||
'head' => [
|
||||
'title' => $superpack->title
|
||||
],
|
||||
'body' => [
|
||||
'html' => $superpack->html
|
||||
]
|
||||
],
|
||||
'smartphone' => $this->request->smartphone,
|
||||
'tablet' => $this->request->tablet
|
||||
]
|
||||
);
|
||||
} else {
|
||||
// Not initialized the superpack
|
||||
}
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
/**
|
||||
* Page: superpack
|
||||
*
|
||||
* @return null
|
||||
*/
|
||||
public function create(
|
||||
?string $identifier = null,
|
||||
?string $urn = null,
|
||||
?string $title = null,
|
||||
?string $html = null,
|
||||
?string $text = null,
|
||||
string|int|float|null $supercost = null
|
||||
): null {
|
||||
if ($this->request->method === method::get) {
|
||||
// GET
|
||||
|
||||
if (str_contains($this->request->headers['accept'] ?? '', content::html->value)) {
|
||||
// Request for HTML response
|
||||
|
||||
// Render page
|
||||
$page = $this->view->render(
|
||||
'pages/system/superpack/create.html',
|
||||
[
|
||||
'uri' => 'https://' . DOMAIN . "/system/superpack/create",
|
||||
'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;
|
||||
}
|
||||
} else if ($this->request->method === method::put) {
|
||||
// PUT
|
||||
|
||||
// Initializing the superpack
|
||||
$superpack = new model()->read(filter: fn(record $record) => $record->urn === $urn);
|
||||
|
||||
if ($superpack instanceof model) {
|
||||
// The superpack is already created
|
||||
|
||||
} else {
|
||||
// The superpack is not already created
|
||||
|
||||
// Sanitizing
|
||||
$urn = preg_replace('/[^\w\d\-.]+/', '', $urn);
|
||||
$title = preg_replace('/[^\w\d\s\-.,!]+/u', '', $title);
|
||||
$supercost = (float) preg_replace('/[^\d.]+/', '', $supercost);
|
||||
|
||||
// Creating the superpack
|
||||
$superpack = new model()->write(
|
||||
urn: $urn,
|
||||
title: $title,
|
||||
html: $html,
|
||||
text: $text,
|
||||
supercost: $supercost
|
||||
);
|
||||
|
||||
if ($superpack instanceof record) {
|
||||
// Created the superpack
|
||||
|
||||
// Sending response
|
||||
$this->response
|
||||
->start()
|
||||
->clean()
|
||||
->sse()
|
||||
->json([
|
||||
'redirect' => "/superpack/$urn"
|
||||
])
|
||||
->validate($this->request)
|
||||
?->body()
|
||||
->end();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Exit (fail)
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -47,227 +47,220 @@ final class index extends core
|
||||
// Initializing the team workload
|
||||
$this->view->workload = (string) ($_COOKIE['workload'] ?? rand(20, 80));
|
||||
|
||||
// Initializing services
|
||||
$this->view->services = [
|
||||
// Initializing superpacks
|
||||
$this->view->superpacks = [
|
||||
[
|
||||
'class' => 'telegram voronka',
|
||||
'title' => 'Телеграм воронка',
|
||||
'icon_left' => '',
|
||||
/* 'icon_center' => 'import', */
|
||||
'class' => 'site direct',
|
||||
'icon_center' => 'crown',
|
||||
'icon_right' => '',
|
||||
'description' => <<<TXT
|
||||
Поступательно запросит данные пользователя, скомпонует, запишет в базу данных и синхронизирует в CRM
|
||||
<br><br>
|
||||
Используя иммерсивные технологии и многофакторный сбор обеспечивает максимальное удержание пользователя
|
||||
TXT,
|
||||
'howto' => 'Направьте к нему клиентов и ждите новых заказов в вашей CRM, на сайте или в чате',
|
||||
'buttons' => [
|
||||
[
|
||||
'icon' => 'comment',
|
||||
'href' => 'https://t.me/' . TELEGRAM_ROBOT['domain'] . '?start=telegram voronka'
|
||||
]
|
||||
'image' => [
|
||||
'src' => '/themes/' . THEME . '/images/site_example.jpg',
|
||||
'alt' => 'Сайт для рекламы'
|
||||
],
|
||||
'theses' => [
|
||||
'title' => 'Лендинг',
|
||||
'description' => 'Сайт для рекламной компании',
|
||||
'features' => [
|
||||
[
|
||||
'class' => 'yellow',
|
||||
'characteristic' => '-80%',
|
||||
'text' => 'НАГРУЗКА'
|
||||
'icon' => 'template',
|
||||
'text' => 'Авангардный дизайн'
|
||||
],
|
||||
[
|
||||
'class' => 'blue',
|
||||
'colored' => true,
|
||||
'characteristic' => '+5%',
|
||||
'text' => 'КОНВЕРСИИ'
|
||||
'icon' => '',
|
||||
'text' => 'Продумана каждая деталь'
|
||||
],
|
||||
[
|
||||
'class' => 'green',
|
||||
'characteristic' => '0₽',
|
||||
'text' => 'НИКАКОЙ АРЕНДЫ'
|
||||
'icon' => 'list-tree',
|
||||
'text' => 'Глубокий SEO'
|
||||
],
|
||||
/* [
|
||||
'icon' => 'document',
|
||||
'text' => 'Юридическая броня'
|
||||
], */
|
||||
[
|
||||
'icon' => 'bell',
|
||||
'text' => 'Регистрация в Роскомнадзор'
|
||||
]
|
||||
],
|
||||
'background_image_src' => '/themes/default/images/telegram_voronka.png',
|
||||
'background_image_alt' => 'Телеграм воронка КОДОРВАНЬ',
|
||||
'cost' => '2000',
|
||||
'canceled' => 'ЗАБЛОКИРОВАН'
|
||||
'deal' => [
|
||||
'cost' => '30 000',
|
||||
'text' => 'ПОЛНАЯ СТОИМОСТЬ'
|
||||
],
|
||||
'button' => [
|
||||
'class' => 'request',
|
||||
'text' => 'ВЫБРАТЬ',
|
||||
'label' => 'Кнопка для заказа'
|
||||
]
|
||||
],
|
||||
[
|
||||
'class' => 'parser',
|
||||
'title' => 'Парсер',
|
||||
'icon_left' => '',
|
||||
'icon_center' => 'search',
|
||||
'icon_right' => '',
|
||||
'description' => <<<TXT
|
||||
Любая работа за компьютером может быть автоматизирована
|
||||
<br><br>
|
||||
Парсер берёт данные с сайтов через API, либо эмулируя пользователя, а так же из excel-документов, CRM и бухгалтерии, затем просчитывает, анализирует и записывает результат
|
||||
TXT,
|
||||
'howto' => 'Подключите источники и снизьте нагрузку на операторов, оптимизируйте процессы',
|
||||
'extra' => [
|
||||
'Wildberries',
|
||||
'OZON',
|
||||
'Yandex Market',
|
||||
'Avito',
|
||||
'CDEK',
|
||||
'1C',
|
||||
'Bitrix',
|
||||
'Мой Склад'
|
||||
'class' => 'voronka',
|
||||
'icon_center' => 'crown',
|
||||
'image' => [
|
||||
'src' => '/themes/' . THEME . '/images/telegram_voronka.png',
|
||||
'alt' => 'Воронка в Телеграм'
|
||||
],
|
||||
'buttons' => [
|
||||
'title' => 'Воронка',
|
||||
/* 'description' => '', */
|
||||
'features' => [
|
||||
[
|
||||
'icon' => 'comment',
|
||||
/* 'href' => 'https://t.me/' . TELEGRAM_ROBOT['domain'] . '?start=parser' */
|
||||
'href' => 'https://t.me/' . TELEGRAM_ROBOT['domain'] . '?start=parser'
|
||||
]
|
||||
],
|
||||
'theses' => [
|
||||
[
|
||||
'class' => 'yellow',
|
||||
'colored' => true,
|
||||
'characteristic' => '-100%',
|
||||
'text' => 'НАГРУЗКА'
|
||||
'icon' => 'phone',
|
||||
'text' => 'Сбор данных'
|
||||
],
|
||||
[
|
||||
'class' => 'cyan',
|
||||
'icon' => 'infinity',
|
||||
'text' => 'ВЕЧНАЯ ПОДДЕРЖКА'
|
||||
'icon' => 'copy',
|
||||
'text' => 'Синхронизация с CRM'
|
||||
],
|
||||
[
|
||||
'class' => 'green',
|
||||
'icon' => 'play forwards',
|
||||
'text' => 'РЕКОРД СКОРОСТИ'
|
||||
'icon' => 'track',
|
||||
'text' => 'Аналитика всех этапов'
|
||||
],
|
||||
/* [
|
||||
'icon' => '',
|
||||
'text' => 'Повышение конверсий'
|
||||
], */
|
||||
[
|
||||
'icon' => 'style',
|
||||
'text' => 'Иммерсивные техники'
|
||||
],
|
||||
[
|
||||
'icon' => 'smile',
|
||||
'text' => 'Никакой аренды'
|
||||
]
|
||||
],
|
||||
'background_image_src' => '/themes/default/images/excel_small_compressed.jpg',
|
||||
'background_image_alt' => 'Парсеры КОДОРВАНЬ',
|
||||
'cost' => '3000'
|
||||
'deal' => [
|
||||
'cost' => '10 000',
|
||||
'text' => 'ПОЛНАЯ СТОИМОСТЬ'
|
||||
],
|
||||
'button' => [
|
||||
'class' => 'request',
|
||||
'text' => 'ВЫБРАТЬ',
|
||||
'label' => 'Кнопка для заказа'
|
||||
]
|
||||
],
|
||||
[
|
||||
'class' => 'calculator',
|
||||
'title' => 'Калькулятор',
|
||||
'icon_left' => '',
|
||||
'icon_center' => 'calculator',
|
||||
'icon_right' => '',
|
||||
'description' => <<<TXT
|
||||
Составление алгоритма обработки большого объёма данных с использованием нейросетей и грамотно выбранной сортировки
|
||||
<br><br>
|
||||
Оператор вводит данные, нажимает на кнопки, двигает ползунки и мгновенно получает точный результат вычислений
|
||||
TXT,
|
||||
'howto' => 'Настройте параметры в панели управления и в долгосрочной перспективе сэкономьте тысячи часов рабочего времени',
|
||||
'extra' => [],
|
||||
'buttons' => [
|
||||
[
|
||||
'icon' => 'comment',
|
||||
'href' => 'https://t.me/' . TELEGRAM_ROBOT['domain'] . '?start=calculator'
|
||||
]
|
||||
'class' => 'ai assistent telegram',
|
||||
'icon_center' => '',
|
||||
'image' => [
|
||||
'src' => '/themes/' . THEME . '/images/telegram_voronka.png',
|
||||
'alt' => 'Воронка в Телеграм'
|
||||
],
|
||||
'theses' => [
|
||||
'title' => 'ИИ-ассистент',
|
||||
'description' => 'Личный консультант',
|
||||
'features' => [
|
||||
[
|
||||
'class' => 'yellow',
|
||||
'characteristic' => '-95%',
|
||||
'text' => 'НАГРУЗКА'
|
||||
'icon' => 'assign',
|
||||
'text' => 'Самообучение',
|
||||
],
|
||||
[
|
||||
'class' => 'green',
|
||||
'characteristic' => '-80%',
|
||||
'text' => 'ОШИБОК ВЫЧИСЛЕНИЙ'
|
||||
'icon' => 'performance',
|
||||
'text' => 'Индивидуальная настройка'
|
||||
],
|
||||
[
|
||||
'class' => 'red',
|
||||
'colored' => true,
|
||||
'characteristic' => '+20%',
|
||||
'text' => 'ОБУЧАЕМОСТЬ'
|
||||
'icon' => 'extension',
|
||||
'text' => 'Актуализация базы данных'
|
||||
],
|
||||
[
|
||||
'icon' => '',
|
||||
'text' => 'Передовая ИИ-модель'
|
||||
],
|
||||
[
|
||||
'icon' => 'smile',
|
||||
'text' => 'Никакой аренды'
|
||||
]
|
||||
],
|
||||
'background_image_src' => '/themes/default/images/tordv_compressed.jpg',
|
||||
'background_image_alt' => 'Калькулятор КОДОРВАНЬ',
|
||||
'cost' => '10 000'
|
||||
]
|
||||
|
||||
'deal' => [
|
||||
'cost' => '15 000',
|
||||
'text' => 'ПОЛНАЯ СТОИМОСТЬ'
|
||||
],
|
||||
'button' => [
|
||||
'class' => 'request',
|
||||
'text' => 'ВЫБРАТЬ',
|
||||
'label' => 'Кнопка для заказа'
|
||||
]
|
||||
],
|
||||
[
|
||||
'class' => 'marketplace',
|
||||
'icon_center' => 'crown',
|
||||
'image' => [
|
||||
'src' => '/themes/' . THEME . '/images/site_example.jpg',
|
||||
'alt' => 'Сайт для рекламы'
|
||||
],
|
||||
'title' => 'Маркетплейс',
|
||||
'description' => 'Бюджет разработки >2млн',
|
||||
'features' => [
|
||||
[
|
||||
'icon' => 'trophy',
|
||||
'text' => 'Чистый код, без конструкторов'
|
||||
],
|
||||
[
|
||||
'icon' => 'template',
|
||||
'text' => 'Индивидуальный дизайн'
|
||||
],
|
||||
/* [
|
||||
'icon' => 'import',
|
||||
'text' => 'Годовая подписка на обновления'
|
||||
], */
|
||||
[
|
||||
'icon' => 'extension',
|
||||
'text' => 'Подключение к Мой Склад'
|
||||
],
|
||||
[
|
||||
'icon' => 'performance',
|
||||
'text' => 'Физический сервер с личным администратором'
|
||||
]
|
||||
],
|
||||
'article' => <<<HTML
|
||||
Изначально проект создавался как чат-робот Telegram с Web App, где по нажатию на кнопку пользователь попадал в мини-приложение, автоматически авторизовавшись через мессенджер.<br>
|
||||
<br>
|
||||
Там он видел весь каталог товаров с категориями, ценами, фильтрами и умным поиском. Всего за 2 минуты он проходил все этапы: наполнял корзину товарами, заполнял адрес доставки (в первый раз) и оплачивал через СБП! Сессия сохраняла данные между устройствами (смартфон и компьютер). Была проведена огромная аналитическая работа с фокус-группами и сбором статистики. Каждый элемент на экране размещён очень обоснованно.<br>
|
||||
<br>
|
||||
После оплаты приложение автоматически закрывается и пользователь возвращается в чат с роботом, где он видит список купленных товаров, статус заказа, оплаченный счёт, а так же подтверждение от оператора. Операторам в чат прилетает заказ с кнопкой "написать покупателю" прямо в Telegram!<br>
|
||||
<br>
|
||||
Сейчас мы развиваем проект как полноценный сайт, оставляя поддержку версии для мессенджеров.<br>
|
||||
<br>
|
||||
В покупку лицензии включена стоимость разработки индивидуального дизайна<br>
|
||||
<br>
|
||||
После покупки вам нужно будет оплачивать размещение проекта на наших серверах - так мы гарантируем сохранность нашего кода, а вы экономите сотни тысяч рублей на системном администраторе, бекапах, юридических заморочках с роскомнадзором (берём ответственность на себя) и постоянным масштабированием. Цена небольшая, особенно учитывая, что туда входит наша постоянная тех. поддержка<br>
|
||||
<br>
|
||||
Не берём никаких процент с продаж!<br>
|
||||
<br>
|
||||
По желанию добавляем или удаляем функции, а критические обновления безопасности устанавливаем бесплатно. В случае проблем, тех.работ или утечек оповещаем моментально.
|
||||
HTML,
|
||||
'deal' => [
|
||||
'cost' => '120 000',
|
||||
'text' => 'ВЕЧНАЯ ЛИЦЕНЗИЯ НА КОД'
|
||||
],
|
||||
'button' => [
|
||||
'class' => 'deal blue',
|
||||
'text' => 'ВЫБРАТЬ',
|
||||
'label' => 'Кнопка выбора суперпака для калькулятора'
|
||||
]
|
||||
],
|
||||
];
|
||||
|
||||
// Sending the cookie with the team workload (1800 = 30min)
|
||||
setcookie('workload', $this->view->workload, time() + 1800, '/');
|
||||
|
||||
// Initializing the project constructor data
|
||||
$this->view->project = [
|
||||
'architectures' => [
|
||||
'site' => 'Сайт',
|
||||
'chat_robot' => 'Чат-робот',
|
||||
'program' => 'Программа',
|
||||
'module' => 'Модуль',
|
||||
'parser' => 'Парсер',
|
||||
'script' => 'Скрипт',
|
||||
'game' => 'Видеоигра',
|
||||
/* 'site' => 'Сайты и браузерные расширения',
|
||||
'chat_robot' => 'Чат-роботы (любой мессенджер)',
|
||||
'program' => 'Программа (Android, iOS, Windows)',
|
||||
'module' => 'Модуль для любой программы',
|
||||
'parser' => 'Парсер данных API, HTTP и эмуляция',
|
||||
'script' => 'Скрипт (автоматизация процессов)',
|
||||
'game' => 'Видеоигра (Android, iOS, Windows)' */
|
||||
],
|
||||
'purposes' => [
|
||||
'funnel' => 'Воронка',
|
||||
'contacts' => 'Контакты',
|
||||
'neural_network' => 'Нейросети',
|
||||
'gallery' => 'Галерея',
|
||||
'crm' => 'CRM',
|
||||
'landing' => 'Лендинг',
|
||||
'marketplace' => 'Маркетплейс',
|
||||
'search' => 'Поиск',
|
||||
'calculate' => 'Расчёты',
|
||||
'logic' => 'Логика',
|
||||
'game' => 'Игра',
|
||||
'special' => 'Особенный',
|
||||
],
|
||||
'integrations' => [
|
||||
'one_c' => '1C',
|
||||
'bitrix24' => 'Битрикс24',
|
||||
'moy_sklad' => 'Мой Склад',
|
||||
'telegram' => 'Телеграм',
|
||||
'mail' => 'Почта',
|
||||
'excel' => 'Excel'
|
||||
]
|
||||
];
|
||||
|
||||
// Initializing contacts data
|
||||
$this->view->contacts = [
|
||||
'sim' => [
|
||||
'requests' => [
|
||||
'full' => PROJECT_CONTACTS_SIM_REQUESTS ?? 'Ошибка',
|
||||
'country' => PROJECT_CONTACTS_SIM_REQUESTS_COUNTRY ?? 'Ошибка',
|
||||
'operator' => PROJECT_CONTACTS_SIM_REQUESTS_OPERATOR ?? 'Ошибка',
|
||||
'number' => [
|
||||
PROJECT_CONTACTS_SIM_REQUESTS_NUMBER_1 ?? 'Ошибка',
|
||||
PROJECT_CONTACTS_SIM_REQUESTS_NUMBER_2 ?? 'Ошибка',
|
||||
PROJECT_CONTACTS_SIM_REQUESTS_NUMBER_3 ?? 'Ошибка'
|
||||
]
|
||||
]
|
||||
]
|
||||
];
|
||||
/* setcookie('workload', $this->view->workload, time() + 1800, '/'); */
|
||||
|
||||
// Initializing contacts data
|
||||
$this->view->integrations = [
|
||||
'Вайлдберриз' => 'wildberries',
|
||||
'ОЗОН' => 'ozon',
|
||||
'Мой Склад' => 'moy_sklad',
|
||||
'1С Предприятие' => '1c',
|
||||
'Битрикс 24' => 'bitrix24',
|
||||
'ВКонтакте' => 'vk',
|
||||
'МАКС' => 'max',
|
||||
/* 'yandex_direct', */
|
||||
'Яндекс Директ' => 'yandex_market',
|
||||
'ОЗОН' => 'ozon',
|
||||
'Вайлдберриз' => 'wildberries',
|
||||
'Авито' => 'avito',
|
||||
'YClients' => 'yclients',
|
||||
'ЮКасса' => 'yookassa',
|
||||
'OpenAI' => 'openai'
|
||||
'OpenAI' => 'openai',
|
||||
/* 'yandex_direct', */
|
||||
'Яндекс Директ' => 'yandex_market',
|
||||
];
|
||||
|
||||
// Render page
|
||||
$page = $this->view->render(
|
||||
'main/index.html',
|
||||
'pages/index.html',
|
||||
[
|
||||
'uri' => 'https://' . DOMAIN,
|
||||
'smartphone' => $this->request->smartphone,
|
||||
'tablet' => $this->request->tablet
|
||||
]
|
||||
|
||||
@@ -44,26 +44,11 @@ final class offer extends core
|
||||
if (str_contains($this->request->headers['accept'] ?? '', content::html->value)) {
|
||||
// Request for HTML response
|
||||
|
||||
// Initializing contacts data
|
||||
$this->view->contacts = [
|
||||
'sim' => [
|
||||
'requests' => [
|
||||
'full' => PROJECT_CONTACTS_SIM_REQUESTS ?? 'Ошибка',
|
||||
'country' => PROJECT_CONTACTS_SIM_REQUESTS_COUNTRY ?? 'Ошибка',
|
||||
'operator' => PROJECT_CONTACTS_SIM_REQUESTS_OPERATOR ?? 'Ошибка',
|
||||
'number' => [
|
||||
PROJECT_CONTACTS_SIM_REQUESTS_NUMBER_1 ?? 'Ошибка',
|
||||
PROJECT_CONTACTS_SIM_REQUESTS_NUMBER_2 ?? 'Ошибка',
|
||||
PROJECT_CONTACTS_SIM_REQUESTS_NUMBER_3 ?? 'Ошибка'
|
||||
]
|
||||
]
|
||||
]
|
||||
];
|
||||
|
||||
// Render page
|
||||
$page = $this->view->render(
|
||||
'main/offer.html',
|
||||
'pages/offer.html',
|
||||
[
|
||||
'uri' => 'https://' . DOMAIN . '/offer',
|
||||
'smartphone' => $this->request->smartphone,
|
||||
'tablet' => $this->request->tablet
|
||||
]
|
||||
|
||||
@@ -9,6 +9,7 @@ use kodorvan\site\controllers\core;
|
||||
|
||||
// PHP framework
|
||||
use mirzaev\minimal\http\enumerations\content,
|
||||
mirzaev\minimal\http\enumerations\method,
|
||||
mirzaev\minimal\http\enumerations\status;
|
||||
|
||||
// Mail server
|
||||
@@ -40,85 +41,216 @@ final class project extends core
|
||||
];
|
||||
|
||||
/**
|
||||
*
|
||||
* Page: constructor
|
||||
*
|
||||
* @return null
|
||||
*/
|
||||
public function constructor(): 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
|
||||
*/
|
||||
public function request(string $request): null
|
||||
{
|
||||
// Initializing the project identifier (temporary solution)
|
||||
$identifier = blake3($request, 20);
|
||||
// Debugging
|
||||
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
|
||||
$path = STORAGE . DIRECTORY_SEPARATOR . 'projects' . DIRECTORY_SEPARATOR . $identifier;
|
||||
if ($this->request->method === method::put) {
|
||||
// PUT
|
||||
|
||||
// Initializing the project storage directory in the storage
|
||||
if (!file_exists($path)) mkdir($path, 0775, true);
|
||||
// Initializing the project identifier (temporary solution)
|
||||
$identifier = blake3($request, 20);
|
||||
|
||||
// Declaring the project storage files registry
|
||||
$files = [];
|
||||
// Initializing the project storage path
|
||||
$path = STORAGE . DIRECTORY_SEPARATOR . 'projects' . DIRECTORY_SEPARATOR . $identifier;
|
||||
|
||||
foreach ($this->request->files as $file) {
|
||||
// Iterating over files
|
||||
// Initializing the project storage directory in the storage
|
||||
if (!file_exists($path)) mkdir($path, 0775, true);
|
||||
|
||||
// Initializing the file destination path
|
||||
$destination = $path . DIRECTORY_SEPARATOR . $file['name'];
|
||||
// Declaring the project storage files registry
|
||||
$files = [];
|
||||
|
||||
// Writing the file into the project storage
|
||||
copy($file['tmp_name'], $destination);
|
||||
foreach ($this->request->files as $file) {
|
||||
// Iterating over files
|
||||
|
||||
// Writing the file destination path into the project storage files registry
|
||||
$files[$file['name']] = $destination;
|
||||
}
|
||||
// Initializing the file destination path
|
||||
$destination = $path . DIRECTORY_SEPARATOR . $file['name'];
|
||||
|
||||
// Decoding the request JSON argument
|
||||
$request = json_decode(json: $request, associative: true, depth: 5);
|
||||
// Writing the file into the project storage
|
||||
copy($file['tmp_name'], $destination);
|
||||
|
||||
// Initializing the mail server
|
||||
$mail = new mail(true);
|
||||
|
||||
try {
|
||||
// Writing the mail server parameters
|
||||
/* $mail->SMTPDebug = smtp::DEBUG_SERVER; */
|
||||
$mail->setLanguage('ru');
|
||||
$mail->CharSet = mail::CHARSET_UTF8;
|
||||
$mail->isSMTP();
|
||||
$mail->Host = 'smtp.mail.ru';
|
||||
$mail->SMTPAuth = true;
|
||||
$mail->Username = 'system@kodorvan.tech';
|
||||
$mail->Password = 'c6oQF2nY0javI312eDS0';
|
||||
$mail->SMTPSecure = mail::ENCRYPTION_SMTPS;
|
||||
$mail->Port = 465;
|
||||
$mail->setFrom('system@kodorvan.tech', 'Система');
|
||||
$mail->addAddress('request@kodorvan.tech', 'Заявки');
|
||||
|
||||
// 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);
|
||||
// Writing the file destination path into the project storage files registry
|
||||
$files[$file['name']] = $destination;
|
||||
}
|
||||
|
||||
// Sending the message
|
||||
$mail->send();
|
||||
} catch (mail_exception $exception) {
|
||||
}
|
||||
// Decoding the request JSON argument
|
||||
$request = json_decode(json: $request, associative: true, depth: 5);
|
||||
|
||||
// Sending response
|
||||
$this->response
|
||||
->start()
|
||||
->clean()
|
||||
->sse()
|
||||
->validate($this->request)
|
||||
?->body()
|
||||
->end();
|
||||
// Initializing the mail server
|
||||
$mail = new mail(true);
|
||||
|
||||
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
|
||||
$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()
|
||||
->json(['errors' => []])
|
||||
->validate($this->request)
|
||||
?->body()
|
||||
->end();
|
||||
|
||||
// Exit (success)
|
||||
return null;
|
||||
}
|
||||
|
||||
// Exit (fail)
|
||||
return null;
|
||||
|
||||
197
kodorvan/site/system/controllers/superpack.php
Executable file
@@ -0,0 +1,197 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace kodorvan\site\controllers;
|
||||
|
||||
// Files of the project
|
||||
use kodorvan\site\controllers\core,
|
||||
kodorvan\site\models\superpack as model;
|
||||
|
||||
// Framework for PHP
|
||||
use mirzaev\minimal\http\enumerations\content,
|
||||
mirzaev\minimal\http\enumerations\method,
|
||||
mirzaev\minimal\http\enumerations\status;
|
||||
|
||||
// Baza database
|
||||
use mirzaev\baza\database,
|
||||
mirzaev\baza\column,
|
||||
mirzaev\baza\record,
|
||||
mirzaev\baza\enumerations\encoding,
|
||||
mirzaev\baza\enumerations\type;
|
||||
|
||||
/**
|
||||
* Offer
|
||||
*
|
||||
* @package kodorvan\site\controllers
|
||||
*
|
||||
* @param array $errors Registry of errors
|
||||
*
|
||||
* @method null index() Main page
|
||||
*
|
||||
* @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License
|
||||
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
|
||||
*/
|
||||
final class superpack extends core
|
||||
{
|
||||
/**
|
||||
* Errors
|
||||
*
|
||||
* @var array $errors Registry of errors
|
||||
*/
|
||||
protected array $errors = [
|
||||
'system' => []
|
||||
];
|
||||
|
||||
/**
|
||||
* Page: superpack
|
||||
*
|
||||
* @return null
|
||||
*/
|
||||
public function index(string $urn): null
|
||||
{
|
||||
if (str_contains($this->request->headers['accept'] ?? '', content::html->value)) {
|
||||
// Request for HTML response
|
||||
|
||||
// Initializing the superpack
|
||||
$superpack = new model()->read(filter: fn(record $record) => $record->urn === $urn && $record->active === 1);
|
||||
|
||||
if ($superpack instanceof model) {
|
||||
// Initialized the superpack
|
||||
|
||||
// Render page
|
||||
$page = $this->view->render(
|
||||
'pages/article.html',
|
||||
[
|
||||
'uri' => 'https://' . DOMAIN . "/superpack/$urn",
|
||||
'article' => [
|
||||
'urn' => $superpack->urn,
|
||||
'head' => [
|
||||
'title' => $superpack->title
|
||||
],
|
||||
'body' => [
|
||||
'html' => $superpack->html
|
||||
]
|
||||
],
|
||||
'smartphone' => $this->request->smartphone,
|
||||
'tablet' => $this->request->tablet
|
||||
]
|
||||
);
|
||||
} else {
|
||||
// Not initialized the superpack
|
||||
}
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
/**
|
||||
* Page: superpack
|
||||
*
|
||||
* @return null
|
||||
*/
|
||||
public function create(
|
||||
?string $identifier = null,
|
||||
?string $urn = null,
|
||||
?string $title = null,
|
||||
?string $html = null,
|
||||
?string $text = null,
|
||||
string|int|float|null $supercost = null
|
||||
): null {
|
||||
if ($this->request->method === method::get) {
|
||||
// GET
|
||||
|
||||
if (str_contains($this->request->headers['accept'] ?? '', content::html->value)) {
|
||||
// Request for HTML response
|
||||
|
||||
// Render page
|
||||
$page = $this->view->render(
|
||||
'pages/system/superpack/create.html',
|
||||
[
|
||||
'uri' => 'https://' . DOMAIN . "/system/superpack/create",
|
||||
'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;
|
||||
}
|
||||
} else if ($this->request->method === method::put) {
|
||||
// PUT
|
||||
|
||||
// Initializing the superpack
|
||||
$superpack = new model()->read(filter: fn(record $record) => $record->urn === $urn);
|
||||
|
||||
if ($superpack instanceof model) {
|
||||
// The superpack is already created
|
||||
|
||||
} else {
|
||||
// The superpack is not already created
|
||||
|
||||
// Sanitizing
|
||||
$urn = preg_replace('/[^\w\d\-.]+/', '', $urn);
|
||||
$title = preg_replace('/[^\w\d\s\-.,!]+/u', '', $title);
|
||||
$supercost = (float) preg_replace('/[^\d.]+/', '', $supercost);
|
||||
|
||||
// Creating the superpack
|
||||
$superpack = new model()->write(
|
||||
urn: $urn,
|
||||
title: $title,
|
||||
html: $html,
|
||||
text: $text,
|
||||
supercost: $supercost
|
||||
);
|
||||
|
||||
if ($superpack instanceof record) {
|
||||
// Created the superpack
|
||||
|
||||
// Sending response
|
||||
$this->response
|
||||
->start()
|
||||
->clean()
|
||||
->sse()
|
||||
->json([
|
||||
'redirect' => "/superpack/$urn"
|
||||
])
|
||||
->validate($this->request)
|
||||
?->body()
|
||||
->end();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Exit (fail)
|
||||
return null;
|
||||
}
|
||||
}
|
||||
2
kodorvan/site/system/journal/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
*
|
||||
!.gitignore
|
||||
215
kodorvan/site/system/models/superpack.php
Normal file
@@ -0,0 +1,215 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace kodorvan\site\models;
|
||||
|
||||
// Files of the project
|
||||
use kodorvan\site\models\core;
|
||||
|
||||
// Baza database
|
||||
use mirzaev\baza\database,
|
||||
mirzaev\baza\column,
|
||||
mirzaev\baza\record,
|
||||
mirzaev\baza\enumerations\encoding,
|
||||
mirzaev\baza\enumerations\type;
|
||||
|
||||
// Active Record pattern
|
||||
use mirzaev\record\interfaces\record as record_interface,
|
||||
mirzaev\record\traits\record as record_trait;
|
||||
|
||||
// Svoboda time
|
||||
use svoboda\time\statement as svoboda;
|
||||
|
||||
// Built-in libraries
|
||||
use Exception as exception,
|
||||
LogicException as exception_logic,
|
||||
RuntimeException as exception_runtime;
|
||||
|
||||
/**
|
||||
* Project
|
||||
*
|
||||
* @package kodorvan\site\models
|
||||
*
|
||||
* @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License
|
||||
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
|
||||
*/
|
||||
final class superpack extends core implements record_interface
|
||||
{
|
||||
use record_trait;
|
||||
|
||||
/**
|
||||
* File
|
||||
*
|
||||
* @var string $file Path to the database file
|
||||
*/
|
||||
protected string $file = DATABASES . DIRECTORY_SEPARATOR . 'superpacks.baza';
|
||||
|
||||
/**
|
||||
* Database
|
||||
*
|
||||
* @var database $database The database
|
||||
*/
|
||||
public protected(set) database $database;
|
||||
|
||||
/**
|
||||
* Serialized
|
||||
*
|
||||
* @var bool $serialized Is the implementator object serialized?
|
||||
*/
|
||||
private bool $serialized = true;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @method record|null $record The record
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(?record $record = null)
|
||||
{
|
||||
// Initializing the database
|
||||
$this->database = new database()
|
||||
->encoding(encoding::utf8)
|
||||
->columns(
|
||||
new column('identifier', type::long_long_unsigned),
|
||||
/* new column('account', type::long_long_unsigned), */
|
||||
new column('urn', type::string, ['length' => 64]),
|
||||
new column('title', type::string, ['length' => 128]),
|
||||
new column('html', type::string, ['length' => 8192]),
|
||||
new column('text', type::string, ['length' => 8192]),
|
||||
new column('supercost', type::float),
|
||||
new column('active', type::char),
|
||||
new column('updated', type::integer_unsigned),
|
||||
new column('created', type::integer_unsigned)
|
||||
)
|
||||
->connect($this->file);
|
||||
|
||||
// Initializing the record
|
||||
$record instanceof record and $this->record = $record;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write
|
||||
*
|
||||
* @throws exception_logic when failed to process project integration
|
||||
*
|
||||
* @param int $account The account identifier
|
||||
* @param string $urn URN
|
||||
* @param string $title Title
|
||||
* @param string|null $html Content (HTML)
|
||||
* @param string|null $html Content (text)
|
||||
* @param int|float|null $supercost Cost
|
||||
* @param int $active Is the record active?
|
||||
*
|
||||
* @return record|false The record, if created
|
||||
*/
|
||||
public function write(
|
||||
/* int $account, */
|
||||
string $urn,
|
||||
string $title,
|
||||
?string $html = null,
|
||||
?string $text = null,
|
||||
int|float|null $supercost = null,
|
||||
bool $active = true,
|
||||
): record|false {
|
||||
if (!empty($html) || !empty($text)) {
|
||||
// Initializing the record
|
||||
$record = $this->database->record(
|
||||
$this->database->count() + 1,
|
||||
/* $account, */
|
||||
$urn,
|
||||
$title,
|
||||
(string) $html,
|
||||
(string) $text,
|
||||
(float) $supercost,
|
||||
(int) $active,
|
||||
svoboda::timestamp(),
|
||||
svoboda::timestamp()
|
||||
);
|
||||
|
||||
// Writing the record into the database
|
||||
$created = $this->database->write($record);
|
||||
|
||||
// Exit (success)
|
||||
return $created ? $record : false;
|
||||
}
|
||||
|
||||
// Exit (fail)
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Serialize
|
||||
*
|
||||
* @return self The instance from which the method was called (fluent interface)
|
||||
*/
|
||||
public function serialize(): self
|
||||
{
|
||||
if ($this->serialized) {
|
||||
// The record implementor is serialized
|
||||
|
||||
// Exit (fail)
|
||||
throw new exception_runtime('The record implementor is already serialized');
|
||||
}
|
||||
|
||||
// Serializing the record parameters
|
||||
$this->record->active = (int) $this->record->active;
|
||||
|
||||
// Writing the status of serializing
|
||||
$this->serialized = true;
|
||||
|
||||
// Exit (success)
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Deserialize
|
||||
*
|
||||
* @return self The instance from which the method was called (fluent interface)
|
||||
*/
|
||||
public function deserialize(): self
|
||||
{
|
||||
if (!$this->serialized) {
|
||||
// The record implementor is deserialized
|
||||
|
||||
// Exit (fail)
|
||||
throw new exception_runtime('The record implementor is already deserialized');
|
||||
}
|
||||
|
||||
// Deserializing the record parameters
|
||||
$this->record->active = (bool) $this->record->active;
|
||||
|
||||
// Writing the status of serializing
|
||||
$this->serialized = false;
|
||||
|
||||
// Exit (success)
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Account
|
||||
*
|
||||
* Search for the account
|
||||
*
|
||||
* @return account|null The account
|
||||
*/
|
||||
/* public function account(): ?account
|
||||
{
|
||||
// Search for the account
|
||||
$account = new account()->read(filter: fn(record $record) => $record->identifier === $this->account && $record->active === 1);
|
||||
|
||||
if ($account instanceof account) {
|
||||
// Found the account account
|
||||
|
||||
// Deserializing the record
|
||||
$account->deserialize();
|
||||
|
||||
// Exit (success)
|
||||
return $account;
|
||||
}
|
||||
|
||||
// Exit (fail)
|
||||
return null;
|
||||
} */
|
||||
}
|
||||
31
kodorvan/site/system/public/css/fonts/als_schlange.css
Executable file
@@ -0,0 +1,31 @@
|
||||
@charset "UTF-8";
|
||||
|
||||
@font-face {
|
||||
font-family: 'ALS Schlange';
|
||||
src: url("/fonts/als_schlange/alsschlangesans-thin.otf");
|
||||
font-weight: 100;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'ALS Schlange';
|
||||
src: url("/fonts/als_schlange/alsschlangesans-light.otf");
|
||||
font-weight: 200;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'ALS Schlange';
|
||||
src: url("/fonts/als_schlange/alsschlangesans.otf");
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'ALS Schlange';
|
||||
src: url("/fonts/als_schlange/alsschlangesans-bold.otf");
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'ALS Schlange';
|
||||
src: url("/fonts/als_schlange/alsschlangesans-black.otf");
|
||||
font-weight: 800;
|
||||
}
|
||||
37
kodorvan/site/system/public/css/fonts/golos.css
Executable file
@@ -0,0 +1,37 @@
|
||||
@charset "UTF-8";
|
||||
|
||||
@font-face {
|
||||
font-family: 'Golos';
|
||||
src: url("/fonts/golos/Golos-Text_VF.ttf");
|
||||
font-weight: 400 900;
|
||||
}
|
||||
|
||||
/* @font-face {
|
||||
font-family: 'Golos';
|
||||
src: url("/fonts/golos/Golos-Text_Regular.ttf");
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Golos';
|
||||
src: url("/fonts/golos/Golos-Text_Medium.ttf");
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Golos';
|
||||
src: url("/fonts/golos/Golos-Text_DemiBold");
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Golos';
|
||||
src: url("/fonts/golos/Golos-Text_Bold");
|
||||
font-weight: 700;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Golos';
|
||||
src: url("/fonts/golos/Golos-Text_Black.ttf");
|
||||
font-weight: 800;
|
||||
} */
|
||||
6
kodorvan/site/system/public/css/fonts/strogo.css
Executable file
@@ -0,0 +1,6 @@
|
||||
@charset "UTF-8";
|
||||
|
||||
@font-face {
|
||||
font-family: 'Strogo';
|
||||
src: url("/fonts/strogo/Strogo-Regular.ttf");
|
||||
}
|
||||
BIN
kodorvan/site/system/public/fonts/golos/Golos-Text_Black.ttf
Executable file
BIN
kodorvan/site/system/public/fonts/golos/Golos-Text_Bold.ttf
Executable file
BIN
kodorvan/site/system/public/fonts/golos/Golos-Text_DemiBold.ttf
Executable file
BIN
kodorvan/site/system/public/fonts/golos/Golos-Text_Medium.ttf
Executable file
BIN
kodorvan/site/system/public/fonts/golos/Golos-Text_Regular.ttf
Executable file
BIN
kodorvan/site/system/public/fonts/golos/Golos-Text_VF.ttf
Executable file
BIN
kodorvan/site/system/public/fonts/strogo/Strogo-Regular.ttf
Normal file
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 13 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 4.0 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 893 B After Width: | Height: | Size: 542 B |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 37 KiB After Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 934 B |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 17 KiB |
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 27 KiB |
|
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 7.2 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 2.4 KiB |
|
Before Width: | Height: | Size: 364 KiB After Width: | Height: | Size: 1.1 KiB |
@@ -1,71 +1 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="129.54482mm"
|
||||
height="125.09652mm"
|
||||
viewBox="0 0 129.54482 125.09652"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs1">
|
||||
<linearGradient
|
||||
id="linearGradient3">
|
||||
<stop
|
||||
style="stop-color:#0060c6;stop-opacity:1;"
|
||||
offset="0.20645721"
|
||||
id="stop3" />
|
||||
<stop
|
||||
style="stop-color:#000356;stop-opacity:1;"
|
||||
offset="0.9989059"
|
||||
id="stop4" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
id="linearGradient1">
|
||||
<stop
|
||||
style="stop-color:#6fc4ff;stop-opacity:1;"
|
||||
offset="0.17076893"
|
||||
id="stop1" />
|
||||
<stop
|
||||
style="stop-color:#0adf70;stop-opacity:0.63586265;"
|
||||
offset="1"
|
||||
id="stop2" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
xlink:href="#linearGradient3"
|
||||
id="radialGradient4"
|
||||
cx="69.684677"
|
||||
cy="90.595695"
|
||||
fx="69.684677"
|
||||
fy="90.595695"
|
||||
r="49.385239"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.4657787,-0.63256258,0.71685408,1.6610996,-96.020968,-9.4714476)" />
|
||||
<radialGradient
|
||||
xlink:href="#linearGradient1"
|
||||
id="radialGradient8"
|
||||
cx="133.0006"
|
||||
cy="106.39822"
|
||||
fx="133.0006"
|
||||
fy="106.39822"
|
||||
r="64.772408"
|
||||
gradientTransform="matrix(-2.5562072,0.53679846,-0.45438206,-2.1637443,446.93777,196.26702)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
</defs>
|
||||
<path
|
||||
style="display:inline;fill:url(#radialGradient4);fill-opacity:0.983988;fill-rule:nonzero;stroke-width:2.22122;paint-order:stroke fill markers"
|
||||
id="path2"
|
||||
d="M 114.14959,66.009985 A 49.385239,49.385239 0 0 1 65.162476,115.39362 49.385239,49.385239 0 0 1 15.38553,66.806211 49.385239,49.385239 0 0 1 63.570075,16.639189 49.385239,49.385239 0 0 1 114.12391,64.41774" />
|
||||
<path
|
||||
id="path1"
|
||||
style="display:inline;fill:url(#radialGradient8);stroke-width:2.64583;paint-order:stroke fill markers"
|
||||
d="m 129.54482,60.324142 c 0,35.56901 -28.68229,64.483468 -64.250152,64.770218 C 29.72681,125.38111 0.58206084,96.932842 0.00858984,61.368452 -0.27814616,43.586256 6.6315828,27.351873 18.057823,15.455519 L 32.789578,50.834474 64.751888,64.645522 63.781478,106.2899 99.850468,58.627162 73.743498,34.999493 88.406328,0 c 7.79332,3.057143 14.862732,7.58429 20.856772,13.249271 5.99404,5.664982 10.91271,12.467797 14.40455,20.076274 3.49183,7.608477 5.55683,16.022617 5.84353,24.910247" />
|
||||
<path
|
||||
id="path5"
|
||||
style="display:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-dasharray:none;stroke-opacity:1;paint-order:markers fill stroke"
|
||||
d="m 156.03189,48.675988 c 0,0 -0.48124,1.149734 -0.48124,1.149734 7.47158,3.127366 13.76035,8.757556 18.60133,15.033917 3.47372,4.503708 5.77328,8.679785 8.08747,12.343411 1.02716,1.626109 1.99256,3.317001 2.88786,5.073729 5.57385,10.936769 8.27496,24.254811 6.33597,38.307871 -1.81681,13.16752 -7.63944,25.96117 -17.4307,35.65948 -5.03375,4.98596 -10.97996,9.0142 -17.69827,11.85196 -7.22782,3.05296 -15.1235,4.63388 -23.42167,4.73245 -0.85262,0.0108 -1.69223,0.004 -2.51863,-0.0189 -14.1633,-0.39672 -25.57791,-5.05285 -34.17105,-11.0133 C 85.038155,154.03818 77.884734,143.64417 73.765338,134.02513 68.088136,120.76851 67.595266,108.31489 69.031333,98.509565 70.913466,85.658549 76.262275,76.52398 79.737684,71.524371 c 3.696594,-5.317797 5.945701,-7.392864 5.945701,-7.392864 0,0 -2.33932,1.972559 -6.214586,7.199789 -3.636021,4.904518 -9.303495,13.993979 -11.461258,27.018426 -1.64637,9.937638 -1.344521,22.656968 4.328486,36.278968 4.114552,9.87985 11.373099,20.61326 22.855995,28.64738 8.830228,6.17816 20.582878,10.99648 35.149578,11.4045 0.84878,0.0238 1.71085,0.0347 2.58621,0.0316 8.48799,-0.0368 16.67375,-1.34049 24.38977,-4.07858 7.17719,-2.54687 13.78867,-6.28188 19.64994,-11.14174 11.39583,-9.44885 19.35723,-22.68375 22.78331,-37.34635 3.64637,-15.60541 1.86385,-31.494338 -4.58101,-44.839852 -1.02738,-2.127422 -2.16303,-4.170709 -3.39713,-6.124429 -2.75251,-4.35753 -6.99513,-8.511352 -12.19307,-12.129511 -7.56806,-5.267932 -15.28231,-8.267232 -23.06649,-11.525444 0,0 -0.48124,1.149734 -0.48124,1.149734 z"
|
||||
transform="translate(-67.625562,-48.675988)" />
|
||||
</svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="489.618" height="472.806" viewBox="0 0 129.545 125.097"><defs><radialGradient xlink:href="#a" id="c" cx="69.685" cy="90.596" r="49.385" fx="69.685" fy="90.596" gradientTransform="matrix(1.46578 -.63256 .71685 1.6611 -96.021 -9.471)" gradientUnits="userSpaceOnUse"/><radialGradient xlink:href="#b" id="d" cx="133.001" cy="106.398" r="64.772" fx="133.001" fy="106.398" gradientTransform="matrix(-2.5562 .5368 -.45438 -2.16374 446.938 196.267)" gradientUnits="userSpaceOnUse"/><linearGradient id="a"><stop offset=".206" style="stop-color:#0060c6;stop-opacity:1"/><stop offset=".999" style="stop-color:#000356;stop-opacity:1"/></linearGradient><linearGradient id="b"><stop offset=".171" style="stop-color:#6fc4ff;stop-opacity:1"/><stop offset="1" style="stop-color:#0adf70;stop-opacity:.63586265"/></linearGradient></defs><path d="M114.15 66.01a49.385 49.385 0 0 1-48.988 49.384 49.385 49.385 0 0 1-49.776-48.588A49.385 49.385 0 0 1 63.57 16.64a49.385 49.385 0 0 1 50.554 47.779" style="display:inline;fill:url(#c);fill-opacity:.983988;fill-rule:nonzero;stroke-width:2.22122;paint-order:stroke fill markers"/><path d="M129.545 60.324c0 35.57-28.682 64.484-64.25 64.77S.582 96.933.009 61.368c-.287-17.782 6.623-34.016 18.049-45.912L32.79 50.834l31.962 13.812-.97 41.644L99.85 58.627 73.743 35 88.406 0a64.9 64.9 0 0 1 20.857 13.25 64.9 64.9 0 0 1 14.405 20.076 64.6 64.6 0 0 1 5.843 24.91" style="display:inline;fill:url(#d);stroke-width:2.64583;paint-order:stroke fill markers"/></svg>
|
||||
|
Before Width: | Height: | Size: 4.4 KiB After Width: | Height: | Size: 1.5 KiB |
@@ -16,27 +16,18 @@ ini_set('display_startup_errors', 1); */
|
||||
// Initializing path to the public directory
|
||||
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);
|
||||
|
||||
// Initializing path to the directory of views
|
||||
define('VIEWS', INDEX . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'views');
|
||||
|
||||
// Initializing path to the directory of settings
|
||||
define('JOURNAL', INDEX . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'journal');
|
||||
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
|
||||
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
|
||||
require ROOT . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
|
||||
|
||||
@@ -47,7 +38,16 @@ $core = new core(namespace: __NAMESPACE__);
|
||||
$core->router
|
||||
->write('/', new route('index', 'index'), 'GET')
|
||||
->write('/offer', new route('offer', 'index'), 'GET')
|
||||
->write('/policy', new route('policy', 'index'), 'GET')
|
||||
->write('/recomendations', new route('recomendations', 'index'), 'GET')
|
||||
|
||||
->write('/superpack/$urn', new route('superpack', 'index'), 'GET')
|
||||
|
||||
->write('/project/constructor', new route('project', 'constructor'), 'GET')
|
||||
->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
|
||||
|
||||
@@ -10,15 +10,26 @@
|
||||
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
|
||||
*/
|
||||
class core {
|
||||
/**
|
||||
* @name Global modules
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
static global = {};
|
||||
|
||||
/**
|
||||
* @name System modules
|
||||
*
|
||||
* @type {object}
|
||||
*/
|
||||
static system = {};
|
||||
|
||||
// Domain
|
||||
static domain = window.location.hostname;
|
||||
|
||||
// Language
|
||||
static language = "ru";
|
||||
|
||||
// Theme
|
||||
static theme = window.getComputedStyle(document.getElementById('theme'));
|
||||
|
||||
// Window
|
||||
static window;
|
||||
|
||||
@@ -128,7 +139,7 @@ class core {
|
||||
*
|
||||
* @return {void}
|
||||
*/
|
||||
/* static choose = core.damper(
|
||||
/* static choose = core.global.damper(
|
||||
(
|
||||
title = "Выбор действия",
|
||||
text = "",
|
||||
@@ -302,32 +313,50 @@ Object.assign(
|
||||
/**
|
||||
* @name Connect modules
|
||||
*
|
||||
* @param {(Array|string)} modules Names of modules without extension (`.mjs` only)
|
||||
* @param {(Array|string)} global Names of global modules without extension (`.mjs` only)
|
||||
* @param {(Array|string)} system Names of system modules without extenstion (`.mjs` only)
|
||||
*
|
||||
* @return {Promise}
|
||||
*/
|
||||
async connect(modules) {
|
||||
async connect(global, system) {
|
||||
// Normalisation required arguments
|
||||
if (typeof modules === "string") modules = [modules];
|
||||
if (typeof global === "string") global = [global];
|
||||
if (typeof system === "string") system = [system];
|
||||
|
||||
if (modules instanceof Array) {
|
||||
// Received and validated required arguments
|
||||
// Initializing the registry of connected modules
|
||||
const connected = {
|
||||
system: [],
|
||||
global: []
|
||||
};
|
||||
|
||||
// Initializing the registry of connected modules
|
||||
const connected = [];
|
||||
if (global?.length > 0) {
|
||||
// Global
|
||||
|
||||
for (const module of modules) {
|
||||
// Iterating over modules
|
||||
for (const module of global) {
|
||||
// Iterating over global modules
|
||||
|
||||
// Downloading, importing and writing the module into a core property and into registry of connected modules
|
||||
core[module] =
|
||||
connected[module] =
|
||||
// Downloading, importing and writing the global module into a core property and into registry of connected modules
|
||||
core.global[module] =
|
||||
connected.global[module] =
|
||||
await (await import(`./modules/${module}.mjs`)).default;
|
||||
}
|
||||
|
||||
// Exit (success)
|
||||
return connected;
|
||||
}
|
||||
|
||||
if (system?.length > 0) {
|
||||
// System
|
||||
|
||||
for (const module of system) {
|
||||
// Iterating over system modules
|
||||
|
||||
// Downloading, importing and writing the system module into a core property and into registry of connected modules
|
||||
core.system[module] =
|
||||
connected.system[module] =
|
||||
await (await import(`./modules/system/${module}.mjs`)).default;
|
||||
}
|
||||
}
|
||||
|
||||
// Exit (success)
|
||||
return connected;
|
||||
},
|
||||
},
|
||||
);
|
||||
@@ -350,7 +379,7 @@ core.modules.connect("damper").then(() => {
|
||||
*
|
||||
* @return {Promise}
|
||||
*/
|
||||
damper: core.damper(
|
||||
damper: core.global.damper(
|
||||
(...variables) => core.buffer.write.system(...variables),
|
||||
300,
|
||||
2,
|
||||
|
||||
@@ -72,6 +72,37 @@ export default class paginator {
|
||||
*/
|
||||
#page = 1;
|
||||
|
||||
/**
|
||||
* @name Page (get)
|
||||
*
|
||||
* @return {number}
|
||||
*
|
||||
* @public
|
||||
*/
|
||||
get page() {
|
||||
return this.#page;
|
||||
}
|
||||
|
||||
/**
|
||||
* @name The initial page
|
||||
*
|
||||
* @type {number}
|
||||
*
|
||||
* @protected
|
||||
*/
|
||||
#initial = 1;
|
||||
|
||||
/**
|
||||
* @name The initial page (get)
|
||||
*
|
||||
* @return {number}
|
||||
*
|
||||
* @public
|
||||
*/
|
||||
get initial() {
|
||||
return this.#initial;
|
||||
}
|
||||
|
||||
/**
|
||||
* @name Constructor
|
||||
*
|
||||
@@ -79,16 +110,14 @@ export default class paginator {
|
||||
* Initialize a hotline instance
|
||||
*
|
||||
* @param {HTMLElement} shell The shell element
|
||||
* @param {NodeList} pages
|
||||
* @param {Set} hide_on_the_first_page HTML-elements that will be hidden on the first page
|
||||
* @param {Set} hide_on_the_last_page HTML-elements that will be hidden on the last page
|
||||
* @param {NodeList} pages The pages HTML-elements list
|
||||
* @param {number} initial The initial page identifier
|
||||
* @param {boolean} [inject=false] Write the hotline instance into the shell element?
|
||||
**/
|
||||
constructor(
|
||||
shell,
|
||||
pages,
|
||||
hide_on_the_first_page,
|
||||
hide_on_the_last_page,
|
||||
initial,
|
||||
inject = false
|
||||
) {
|
||||
if (shell instanceof HTMLElement) {
|
||||
@@ -102,11 +131,18 @@ export default class paginator {
|
||||
}
|
||||
|
||||
if (pages instanceof NodeList) {
|
||||
// Initialized pages
|
||||
// Initialized the pages HTML-elements list
|
||||
|
||||
// Writing the pages
|
||||
// Writing the pages HTML-elements list
|
||||
this.#pages = pages;
|
||||
}
|
||||
|
||||
if (typeof initial === 'number') {
|
||||
// Initialized the initial page identifier
|
||||
|
||||
// Writing the initial page identifier
|
||||
this.#page = this.#initial = initial;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -8,6 +8,11 @@
|
||||
* @description
|
||||
* Module for creating projects
|
||||
*
|
||||
* @todo
|
||||
* 1. Удалить полностью `this.#elements` и перенести всё управление HTML-элементами
|
||||
* в систему слушателей событий `EventListener`, для управления извне и разделения логики
|
||||
* 2. После первого пункта можно будет наконец очистить ебучий конструктор с его аргументами
|
||||
*
|
||||
* @class
|
||||
* @public
|
||||
*
|
||||
@@ -340,18 +345,46 @@ export default class project {
|
||||
symbol: Symbol("moy_sklad"),
|
||||
coefficient: 3
|
||||
},
|
||||
telegram: {
|
||||
symbol: Symbol("telegram"),
|
||||
coefficient: 2
|
||||
},
|
||||
mail: {
|
||||
symbol: Symbol("mail"),
|
||||
coefficient: 1.4
|
||||
},
|
||||
excel: {
|
||||
symbol: Symbol("excel"),
|
||||
coefficient: 1.6
|
||||
}
|
||||
coefficient: 1.8
|
||||
},
|
||||
ozon: {
|
||||
symbol: Symbol("ozon"),
|
||||
coefficient: 2.8
|
||||
},
|
||||
wildberries: {
|
||||
symbol: Symbol("wildberries"),
|
||||
coefficient: 2.9
|
||||
},
|
||||
yandex_market: {
|
||||
symbol: Symbol("yandex_market"),
|
||||
coefficient: 2.6
|
||||
},
|
||||
avito: {
|
||||
symbol: Symbol("avito"),
|
||||
coefficient: 2.4
|
||||
},
|
||||
vk: {
|
||||
symbol: Symbol("vk"),
|
||||
coefficient: 2
|
||||
},
|
||||
max: {
|
||||
symbol: Symbol("max"),
|
||||
coefficient: 2
|
||||
},
|
||||
telegram: {
|
||||
symbol: Symbol("telegram"),
|
||||
coefficient: 2
|
||||
},
|
||||
neural_networks: {
|
||||
symbol: Symbol("neural_networks"),
|
||||
coefficient: 2.6
|
||||
},
|
||||
});
|
||||
|
||||
/**
|
||||
@@ -399,33 +432,49 @@ export default class project {
|
||||
* @protected
|
||||
*/
|
||||
#purposes = Object.freeze({
|
||||
project: {
|
||||
symbol: Symbol("project"),
|
||||
funnel: {
|
||||
symbol: Symbol("funnel"),
|
||||
integrations: new Set([
|
||||
this.services.telegram,
|
||||
this.services.max,
|
||||
this.services.vk,
|
||||
this.services.mail,
|
||||
this.services.bitrix24
|
||||
this.services.bitrix24,
|
||||
this.services.neural_networks,
|
||||
]),
|
||||
coefficient: 2.1
|
||||
coefficient: 1.2
|
||||
},
|
||||
contact: {
|
||||
symbol: Symbol("contact"),
|
||||
contacts: {
|
||||
symbol: Symbol("contacts"),
|
||||
integrations: new Set([
|
||||
this.services.telegram,
|
||||
this.services.max,
|
||||
this.services.vk,
|
||||
this.services.mail,
|
||||
this.services.bitrix24
|
||||
this.services.bitrix24,
|
||||
this.services.neural_networks,
|
||||
]),
|
||||
coefficient: 1.1
|
||||
},
|
||||
neural_network: {
|
||||
symbol: Symbol("neural_network"),
|
||||
ai: {
|
||||
symbol: Symbol("ai"),
|
||||
integrations: new Set([
|
||||
this.services.telegram
|
||||
this.services.telegram,
|
||||
this.services.max,
|
||||
this.services.vk,
|
||||
this.services.one_c,
|
||||
this.services.bitrix24,
|
||||
this.services.excel,
|
||||
this.services.mail,
|
||||
this.services.ozon,
|
||||
this.services.wildberries,
|
||||
this.services.avito,
|
||||
this.services.yandex_market,
|
||||
]),
|
||||
coefficient: 4
|
||||
coefficient: 3
|
||||
},
|
||||
gallery: {
|
||||
symbol: Symbol("gallery"),
|
||||
archive: {
|
||||
symbol: Symbol("archive"),
|
||||
integrations: new Set([
|
||||
]),
|
||||
coefficient: 1
|
||||
@@ -433,9 +482,16 @@ export default class project {
|
||||
crm: {
|
||||
symbol: Symbol("crm"),
|
||||
integrations: new Set([
|
||||
this.services.telegram,
|
||||
this.services.max,
|
||||
this.services.vk,
|
||||
this.services.one_c,
|
||||
this.services.moy_sklad,
|
||||
this.services.excel
|
||||
this.services.excel,
|
||||
this.services.ozon,
|
||||
this.services.wildberries,
|
||||
this.services.avito,
|
||||
this.services.yandex_market,
|
||||
]),
|
||||
coefficient: 6
|
||||
},
|
||||
@@ -443,8 +499,10 @@ export default class project {
|
||||
symbol: Symbol("landing"),
|
||||
integrations: new Set([
|
||||
this.services.telegram,
|
||||
this.services.max,
|
||||
this.services.vk,
|
||||
this.services.mail,
|
||||
this.services.bitrix24
|
||||
this.services.bitrix24,
|
||||
]),
|
||||
coefficient: 1.5
|
||||
},
|
||||
@@ -453,13 +511,40 @@ export default class project {
|
||||
integrations: new Set([
|
||||
this.services.one_c,
|
||||
this.services.moy_sklad,
|
||||
this.services.excel
|
||||
this.services.excel,
|
||||
this.services.ozon,
|
||||
this.services.wildberries,
|
||||
this.services.avito,
|
||||
this.services.yandex_market,
|
||||
]),
|
||||
coefficient: 8
|
||||
},
|
||||
saas: {
|
||||
symbol: Symbol("saas"),
|
||||
integrations: new Set([
|
||||
this.services.telegram,
|
||||
this.services.max,
|
||||
this.services.vk,
|
||||
this.services.one_c,
|
||||
this.services.moy_sklad,
|
||||
this.services.excel,
|
||||
this.services.ozon,
|
||||
this.services.wildberries,
|
||||
this.services.avito,
|
||||
this.services.yandex_market,
|
||||
]),
|
||||
coefficient: 8
|
||||
},
|
||||
search: {
|
||||
symbol: Symbol("search"),
|
||||
integrations: new Set([
|
||||
this.services.telegram,
|
||||
this.services.max,
|
||||
this.services.vk,
|
||||
this.services.ozon,
|
||||
this.services.wildberries,
|
||||
this.services.avito,
|
||||
this.services.yandex_market,
|
||||
]),
|
||||
coefficient: 1
|
||||
},
|
||||
@@ -468,19 +553,25 @@ export default class project {
|
||||
integrations: new Set([
|
||||
this.services.one_c,
|
||||
this.services.moy_sklad,
|
||||
this.services.excel
|
||||
this.services.excel,
|
||||
this.services.ozon,
|
||||
this.services.wildberries,
|
||||
this.services.avito,
|
||||
this.services.yandex_market,
|
||||
]),
|
||||
coefficient: 2
|
||||
},
|
||||
logic: {
|
||||
symbol: Symbol("logic"),
|
||||
game: {
|
||||
symbol: Symbol("game"),
|
||||
integrations: new Set([
|
||||
]),
|
||||
coefficient: 1
|
||||
coefficient: 4
|
||||
},
|
||||
special: {
|
||||
symbol: Symbol("special"),
|
||||
integrations: this.services,
|
||||
individual: {
|
||||
symbol: Symbol("individual"),
|
||||
// integrations: this.services,
|
||||
integrations: new Set([
|
||||
]),
|
||||
coefficient: 3
|
||||
}
|
||||
});
|
||||
@@ -510,19 +601,22 @@ export default class project {
|
||||
site: {
|
||||
symbol: Symbol("site"),
|
||||
purposes: new Set([
|
||||
this.purposes.project,
|
||||
this.purposes.contact,
|
||||
this.purposes.neural_network,
|
||||
this.purposes.gallery,
|
||||
this.purposes.funnel,
|
||||
this.purposes.landing,
|
||||
this.purposes.contacts,
|
||||
this.purposes.archive,
|
||||
this.purposes.ai,
|
||||
this.purposes.crm,
|
||||
this.purposes.calculate,
|
||||
this.purposes.landing,
|
||||
this.purposes.marketplace
|
||||
this.purposes.saas,
|
||||
this.purposes.marketplace,
|
||||
this.purposes.search,
|
||||
this.purposes.individual,
|
||||
]),
|
||||
coefficient: 3,
|
||||
cost: {
|
||||
usd: 80,
|
||||
rub: 8000
|
||||
usd: 120,
|
||||
rub: 12000
|
||||
},
|
||||
team: new Map([
|
||||
[this.#workers.programmer, 1],
|
||||
@@ -533,15 +627,16 @@ export default class project {
|
||||
chat_robot: {
|
||||
symbol: Symbol("chat_robot"),
|
||||
purposes: new Set([
|
||||
this.purposes.project,
|
||||
this.purposes.contact,
|
||||
this.purposes.neural_network,
|
||||
this.purposes.game,
|
||||
this.purposes.gallery,
|
||||
this.purposes.funnel,
|
||||
this.purposes.landing,
|
||||
this.purposes.contacts,
|
||||
this.purposes.archive,
|
||||
this.purposes.ai,
|
||||
this.purposes.crm,
|
||||
this.purposes.calculate,
|
||||
this.purposes.landing,
|
||||
this.purposes.marketplace
|
||||
this.purposes.saas,
|
||||
this.purposes.marketplace,
|
||||
this.purposes.individual,
|
||||
]),
|
||||
coefficient: 3,
|
||||
cost: {
|
||||
@@ -551,21 +646,23 @@ export default class project {
|
||||
team: new Map([
|
||||
[this.#workers.programmer, 1],
|
||||
[this.#workers.designer, 0],
|
||||
[this.#workers.booster, 1]
|
||||
[this.#workers.booster, 0]
|
||||
])
|
||||
},
|
||||
program: {
|
||||
symbol: Symbol("program"),
|
||||
purposes: new Set([
|
||||
this.purposes.neural_network,
|
||||
this.purposes.ai,
|
||||
this.purposes.crm,
|
||||
this.purposes.calculate,
|
||||
this.purposes.marketplace
|
||||
this.purposes.marketplace,
|
||||
this.purposes.individual,
|
||||
]),
|
||||
coefficient: 4,
|
||||
cost: {
|
||||
usd: 100,
|
||||
rub: 10000
|
||||
usd: 180,
|
||||
rub: 18000
|
||||
},
|
||||
team: new Map([
|
||||
[this.#workers.programmer, 1],
|
||||
@@ -573,38 +670,7 @@ export default class project {
|
||||
[this.#workers.booster, 0]
|
||||
])
|
||||
},
|
||||
parser: {
|
||||
symbol: Symbol("parser"),
|
||||
purposes: new Set([
|
||||
this.purposes.search
|
||||
]),
|
||||
coefficient: 2,
|
||||
cost: {
|
||||
usd: 35,
|
||||
rub: 3500
|
||||
},
|
||||
team: new Map([
|
||||
[this.#workers.programmer, 1],
|
||||
[this.#workers.designer, 0],
|
||||
[this.#workers.booster, 0]
|
||||
])
|
||||
},
|
||||
script: {
|
||||
symbol: Symbol("script"),
|
||||
purposes: new Set([
|
||||
this.purposes.logic
|
||||
]),
|
||||
coefficient: 1,
|
||||
cost: {
|
||||
usd: 20,
|
||||
rub: 2000
|
||||
},
|
||||
team: new Map([
|
||||
[this.#workers.programmer, 1],
|
||||
[this.#workers.designer, 0],
|
||||
[this.#workers.booster, 0]
|
||||
])
|
||||
},
|
||||
|
||||
game: {
|
||||
symbol: Symbol("game"),
|
||||
purposes: new Set([
|
||||
@@ -619,6 +685,39 @@ export default class project {
|
||||
[this.#workers.programmer, 1],
|
||||
[this.#workers.designer, 1],
|
||||
[this.#workers.booster, 1]
|
||||
])
|
||||
},
|
||||
script: {
|
||||
symbol: Symbol("script"),
|
||||
purposes: new Set([
|
||||
this.purposes.search,
|
||||
this.purposes.individual,
|
||||
]),
|
||||
coefficient: 1,
|
||||
cost: {
|
||||
usd: 20,
|
||||
rub: 2000
|
||||
},
|
||||
team: new Map([
|
||||
[this.#workers.programmer, 1],
|
||||
[this.#workers.designer, 0],
|
||||
[this.#workers.booster, 0]
|
||||
])
|
||||
},
|
||||
module: {
|
||||
symbol: Symbol("module"),
|
||||
purposes: new Set([
|
||||
this.purposes.individual,
|
||||
]),
|
||||
coefficient: 1,
|
||||
cost: {
|
||||
usd: 60,
|
||||
rub: 6000
|
||||
},
|
||||
team: new Map([
|
||||
[this.#workers.programmer, 1],
|
||||
[this.#workers.designer, 0],
|
||||
[this.#workers.booster, 0]
|
||||
])
|
||||
}
|
||||
});
|
||||
@@ -971,6 +1070,64 @@ export default class project {
|
||||
return this.#purpose;
|
||||
}
|
||||
|
||||
/**
|
||||
* @name Superpack
|
||||
*
|
||||
* @description
|
||||
* The project superpack
|
||||
*
|
||||
* @type {string}
|
||||
*
|
||||
* @protected
|
||||
*/
|
||||
#superpack;
|
||||
|
||||
/**
|
||||
* @name Superpack (set)
|
||||
*
|
||||
* @public
|
||||
*/
|
||||
set superpack(value) {
|
||||
if (typeof value === 'string' && value.length > 0) {
|
||||
// String
|
||||
|
||||
// Writing the property
|
||||
this.#superpack = value;
|
||||
|
||||
// Deleting from the stages registry
|
||||
this.stages.delete('superpack');
|
||||
} else {
|
||||
// Undefined
|
||||
|
||||
// Deleting the property
|
||||
this.#superpack = undefined;
|
||||
|
||||
// Writing into the stages registry
|
||||
this.stages.add('superpack');
|
||||
}
|
||||
|
||||
// Dispatching event: "project.write"
|
||||
this.shell.dispatchEvent(
|
||||
new CustomEvent("project.write", {
|
||||
detail: { name: 'superpack', value: this.#superpack }
|
||||
})
|
||||
);
|
||||
|
||||
// Reinitializing guide HTML-elements
|
||||
this.guide();
|
||||
};
|
||||
|
||||
/**
|
||||
* @name Superpack (get)
|
||||
*
|
||||
* @return {string}
|
||||
*
|
||||
* @public
|
||||
*/
|
||||
get superpack() {
|
||||
return this.#superpack;
|
||||
}
|
||||
|
||||
/**
|
||||
* @name Project
|
||||
*
|
||||
@@ -1635,6 +1792,7 @@ export default class project {
|
||||
payment_output,
|
||||
prepayment,
|
||||
prepayment_output,
|
||||
superpack,
|
||||
project_name,
|
||||
project_description,
|
||||
project_files,
|
||||
@@ -1681,6 +1839,8 @@ export default class project {
|
||||
if (prepayment instanceof HTMLElement) this.#elements.set('prepayment', prepayment);
|
||||
if (prepayment_output instanceof HTMLElement) this.#elements.set('prepayment_output', prepayment_output);
|
||||
|
||||
if (superpack instanceof HTMLElement) this.#elements.set('superpack', superpack);
|
||||
|
||||
if (project_name instanceof HTMLElement) this.#elements.set('project_name', project_name);
|
||||
if (project_description instanceof HTMLElement) this.#elements.set('project_description', project_description);
|
||||
if (project_files instanceof HTMLElement) this.#elements.set('project_files', project_files);
|
||||
@@ -1725,7 +1885,7 @@ export default class project {
|
||||
// Iterating over files
|
||||
|
||||
// Writing the parameter into the body buffer
|
||||
body.append('file_' + index++, file);
|
||||
body.append('file_' + index++, file, file.name);
|
||||
}
|
||||
|
||||
return await core.request(
|
||||
@@ -1734,8 +1894,7 @@ export default class project {
|
||||
"PUT",
|
||||
{
|
||||
"Accept": "application/json",
|
||||
},
|
||||
null,
|
||||
}
|
||||
).then(
|
||||
async (json) => {
|
||||
if (json) {
|
||||
@@ -1759,6 +1918,15 @@ export default class project {
|
||||
// Reloading the page @todo make something smarter
|
||||
alert("Запрос доставлен, ожидайте обратной связи");
|
||||
|
||||
// Initializing the rofls HTML-element
|
||||
const rofls = document.getElementById('rofls');
|
||||
|
||||
// Showing rofls
|
||||
rofls.style.removeProperty('display');
|
||||
|
||||
// Starting the rofls hotline.mjs instance
|
||||
rofls.hotline.start();
|
||||
|
||||
// Exit (success)
|
||||
resolve();
|
||||
}
|
||||
@@ -1793,7 +1961,7 @@ export default class project {
|
||||
*
|
||||
* @return {void}
|
||||
*/
|
||||
damper: core.damper(
|
||||
damper: core.global.damper(
|
||||
(...variables) => this.send.system(...variables),
|
||||
300,
|
||||
2,
|
||||
@@ -2050,20 +2218,32 @@ export default class project {
|
||||
// Initializing the result HTML-element
|
||||
const result = this.#elements.get('result');
|
||||
|
||||
// Showing the result HTML-element
|
||||
result.style.removeProperty('display');
|
||||
if (result instanceof HTMLElement) {
|
||||
// Initialized the result HTML-element
|
||||
|
||||
// Showing the result HTML-element
|
||||
result.style.removeProperty('display');
|
||||
}
|
||||
|
||||
// Initializing the hours HTML-element
|
||||
const output = this.#elements.get('hours_output');
|
||||
|
||||
// Writing into the hours output HTML-element
|
||||
output.innerText = hours;
|
||||
if (output instanceof HTMLElement) {
|
||||
// Initialized the hours HTML-element
|
||||
|
||||
// Writing into the hours output HTML-element
|
||||
output.innerText = hours;
|
||||
}
|
||||
|
||||
// Initializing the hours wrap HTML-element
|
||||
const wrap = this.#elements.get('hours');
|
||||
|
||||
// Showing the hours wrap HTML-element
|
||||
wrap.style.removeProperty('display');
|
||||
if (wrap instanceof HTMLElement) {
|
||||
// Initialized the hours wrap HTML-element
|
||||
|
||||
// Showing the hours wrap HTML-element
|
||||
wrap.style.removeProperty('display');
|
||||
}
|
||||
}
|
||||
|
||||
// Exit (success)
|
||||
@@ -2094,8 +2274,12 @@ export default class project {
|
||||
// Initializing the days HTML-element
|
||||
const output = this.#elements.get('days_output');
|
||||
|
||||
// Writing into the days output HTML-element
|
||||
output.innerText = days;
|
||||
if (output instanceof HTMLElement) {
|
||||
// Initialized the days HTML-element
|
||||
|
||||
// Writing into the days output HTML-element
|
||||
output.innerText = days;
|
||||
}
|
||||
}
|
||||
|
||||
// Exit (success)
|
||||
@@ -2153,24 +2337,52 @@ export default class project {
|
||||
// Initializing the result HTML-element
|
||||
const result = this.#elements.get('result');
|
||||
|
||||
// Showing the result HTML-element
|
||||
result.style.removeProperty('display');
|
||||
if (result instanceof HTMLElement) {
|
||||
// Initialized the result HTML-element
|
||||
|
||||
// Initializing the output HTML-elements
|
||||
// Showing the result HTML-element
|
||||
result.style.removeProperty('display');
|
||||
}
|
||||
|
||||
// Initializing the payment output HTML-element
|
||||
const payment_output = this.#elements.get('payment_output');
|
||||
|
||||
if (payment_output instanceof HTMLElement) {
|
||||
// Initialized the payment output HTML-element
|
||||
|
||||
// Writing into the payment output HTML-element
|
||||
payment_output.innerText = new Intl.NumberFormat("ru-RU", { maximumSignificantDigits: 3 }).format(costs.full);
|
||||
}
|
||||
|
||||
// Initializing the prepayment output HTML-element
|
||||
const prepayment_output = this.#elements.get('prepayment_output');
|
||||
|
||||
// Writing into the output HTML-elements
|
||||
payment_output.innerText = new Intl.NumberFormat("ru-RU", { maximumSignificantDigits: 3 }).format(costs.full);
|
||||
prepayment_output.innerText = new Intl.NumberFormat("ru-RU", { maximumSignificantDigits: 3 }).format(costs.prepayment);
|
||||
if (prepayment_output instanceof HTMLElement) {
|
||||
// Initialized the prepayment output HTML-element
|
||||
|
||||
// Initializing the wrap HTML-elements
|
||||
// Writing into the prepayment output HTML-element
|
||||
prepayment_output.innerText = new Intl.NumberFormat("ru-RU", { maximumSignificantDigits: 3 }).format(costs.prepayment);
|
||||
}
|
||||
|
||||
// Initializing the payment wrap HTML-element
|
||||
const payment_wrap = this.#elements.get('payment');
|
||||
|
||||
if (payment_wrap instanceof HTMLElement) {
|
||||
// Initialized the payment wrap HTML-element
|
||||
|
||||
// Showing the payment wrap HTML-element
|
||||
payment_wrap.style.removeProperty('display');
|
||||
}
|
||||
|
||||
// Initializing the prepayment wrap HTML-element
|
||||
const prepayment_wrap = this.#elements.get('prepayment');
|
||||
|
||||
// Showing the wrap HTML-elements
|
||||
payment_wrap.style.removeProperty('display');
|
||||
prepayment_wrap.style.removeProperty('display');
|
||||
if (prepayment_wrap instanceof HTMLElement) {
|
||||
// Initialized the prepayment wrap HTML-element
|
||||
|
||||
// Showing the prepayment wrap HTML-element
|
||||
prepayment_wrap.style.removeProperty('display');
|
||||
}
|
||||
}
|
||||
|
||||
// Exit (success)
|
||||
@@ -2221,6 +2433,7 @@ export default class project {
|
||||
// Exit (success)
|
||||
return JSON.stringify({
|
||||
identifier: new Date().valueOf(),
|
||||
superpack: this.#superpack,
|
||||
calculator: {
|
||||
architecture: this.#architecture?.symbol.description,
|
||||
purpose: this.#purpose?.symbol.description,
|
||||
|
||||
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());
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
559
kodorvan/site/system/public/js/modules/system/superpack.mjs
Normal file
@@ -0,0 +1,559 @@
|
||||
/** @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 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());
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -9,29 +9,34 @@ core.modules.connect(["damper", "project"]).then((connected) => {
|
||||
// Initializing the files input wrap HTML-element
|
||||
const files = document.getElementById("project_files");
|
||||
|
||||
// Initializing the superpack HTML-elements
|
||||
const superpack = document.getElementById("superpack");
|
||||
const superpack_value = superpack.querySelector('span.value');
|
||||
|
||||
// Initializing the instance of the project.mjs
|
||||
core.project = new connected.project(
|
||||
document.querySelector('section[data-paginator-page="1"]'),
|
||||
document.getElementById("architecture"),
|
||||
document.getElementById("purpose"),
|
||||
document.getElementById("integrations"),
|
||||
document.getElementById("team"),
|
||||
document.getElementById("programmers"),
|
||||
document.getElementById("designers"),
|
||||
document.getElementById("boosters"),
|
||||
document.getElementById("reward"),
|
||||
document.getElementById("hour"),
|
||||
document.getElementById("hour_input_number"),
|
||||
document.getElementById("hour_input_range"),
|
||||
document.getElementById("result"),
|
||||
document.getElementById("calculated"),
|
||||
document.getElementById("hours"),
|
||||
document.getElementById("hours_output"),
|
||||
document.getElementById("days_output"),
|
||||
document.getElementById("payment"),
|
||||
document.getElementById("payment_output"),
|
||||
document.getElementById("prepayment"),
|
||||
document.getElementById("prepayment_output"),
|
||||
core.global.project = new connected.global.project(
|
||||
document.querySelector('section[data-paginator-page="2"]'),
|
||||
undefined,
|
||||
undefined,
|
||||
undefined,
|
||||
undefined,
|
||||
undefined,
|
||||
undefined,
|
||||
undefined,
|
||||
undefined,
|
||||
undefined,
|
||||
undefined,
|
||||
undefined,
|
||||
undefined,
|
||||
undefined,
|
||||
undefined,
|
||||
undefined,
|
||||
undefined,
|
||||
undefined,
|
||||
undefined,
|
||||
undefined,
|
||||
undefined,
|
||||
superpack,
|
||||
document.getElementById("project_name"),
|
||||
document.getElementById("project_description"),
|
||||
files,
|
||||
@@ -43,23 +48,6 @@ core.modules.connect(["damper", "project"]).then((connected) => {
|
||||
true
|
||||
);
|
||||
|
||||
// Initializing the hour input number HTML-element
|
||||
const hour_number = document.getElementById('hour_input_number');
|
||||
|
||||
// Initializing the hour input range HTML-element
|
||||
const hour_range = document.getElementById('hour_input_range');
|
||||
|
||||
hour_range.addEventListener("input", () => {
|
||||
hour_inputs_syncronize(hour_range, hour_number);
|
||||
});
|
||||
|
||||
function hour_inputs_syncronize(range, number) {
|
||||
const min = range.min ? range.min : 300;
|
||||
const max = range.max ? range.max : 5000;
|
||||
|
||||
number.value = range.value;
|
||||
}
|
||||
|
||||
// Initializing the "back" button
|
||||
const back = document.getElementById('back');
|
||||
|
||||
@@ -70,17 +58,18 @@ core.modules.connect(["damper", "project"]).then((connected) => {
|
||||
const pages = document.querySelectorAll('section[data-paginator-page]');
|
||||
|
||||
// Initializing the instance of the paginator.mjs
|
||||
core.paginator = new connected.paginator(
|
||||
core.global.paginator = new connected.global.paginator(
|
||||
document.getElementById('buttons'),
|
||||
pages
|
||||
pages,
|
||||
2
|
||||
);
|
||||
|
||||
// Initializing the buttons
|
||||
const buttons = core.paginator.shell.querySelectorAll('button[data-paginator-page-button]');
|
||||
const buttons = core.global.paginator.shell.querySelectorAll('button[data-paginator-page-button]');
|
||||
|
||||
function menu(identifier) {
|
||||
// Initializing the target page button HTML-element
|
||||
const active = core.paginator.shell.querySelector('button[data-paginator-page-button="' + identifier + '"]');
|
||||
const active = core.global.paginator.shell.querySelector('button[data-paginator-page-button="' + identifier + '"]');
|
||||
|
||||
if (active instanceof HTMLElement) {
|
||||
// Initialized the target page button HTML-element
|
||||
@@ -95,7 +84,7 @@ core.modules.connect(["damper", "project"]).then((connected) => {
|
||||
// Showing the target page button HTML-element
|
||||
active.style.removeProperty('display');
|
||||
|
||||
if (identifier > 1) {
|
||||
if (identifier > core.global.paginator.initial) {
|
||||
// Second or more page
|
||||
|
||||
// Showing the "back" button
|
||||
@@ -109,60 +98,87 @@ core.modules.connect(["damper", "project"]).then((connected) => {
|
||||
}
|
||||
}
|
||||
|
||||
// Connecting event listener for project calculation
|
||||
core.project.shell.addEventListener("project.write", function() {
|
||||
// Initializing the "calculator" page button HTML-element
|
||||
const calculator = core.paginator.shell.querySelector('button[data-paginator-page-button="1"]');
|
||||
// Initializing the page buttons menu
|
||||
core.global.paginator.shell.addEventListener("paginator.page.opened", function (event) {
|
||||
// Scrolling to the introdution HTML-element
|
||||
// introdution?.scrollIntoView({ behavior: 'smooth' });
|
||||
// Сделать для мобилок 300 а для пк 0
|
||||
window.scrollTo({ top: window.innerHeight > 1500 ? 0 : 300, behavior: 'smooth' });
|
||||
|
||||
if (calculator instanceof HTMLElement) {
|
||||
// Initialized the "calculator" page button HTML-element
|
||||
// Initializing the page buttons menu
|
||||
menu(event.detail.identifier);
|
||||
});
|
||||
|
||||
// Showing or hiding the "calculator" page button HTML-element
|
||||
calculator.disabled = !(core.project.architecture != null);
|
||||
// Connecting event listener for project parameters writings
|
||||
core.global.project.shell.addEventListener("project.write", function(event) {
|
||||
if (event.detail.name === 'superpack') {
|
||||
// Superpack
|
||||
|
||||
if (superpack_value instanceof HTMLElement) {
|
||||
// Initialized the superpack value HTML-element
|
||||
|
||||
// Writing the superpack value
|
||||
superpack_value.innerText = event.detail.value ?? '';
|
||||
|
||||
if (superpack_value.innerText.length > 1) {
|
||||
// Has a value
|
||||
|
||||
// Showing the superpack HTML-element
|
||||
superpack.style.removeProperty('display');
|
||||
} else {
|
||||
// Has no value
|
||||
|
||||
// Hiding the sueprpack HTML-element
|
||||
superpack.style.setProperty('display', 'none');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Initializing the "project" page button HTML-element
|
||||
const project = core.paginator.shell.querySelector('button[data-paginator-page-button="2"]');
|
||||
const project = core.global.paginator.shell.querySelector('button[data-paginator-page-button="2"]');
|
||||
|
||||
if (project instanceof HTMLElement) {
|
||||
// Initialized the "project" page button HTML-element
|
||||
|
||||
// Showing or hiding the "project" page button HTML-element
|
||||
project.disabled =
|
||||
!(core.project.project.name
|
||||
!(core.global.project.project.name
|
||||
&& (
|
||||
core.project.project.description != null
|
||||
|| core.project.project.files.length > 0
|
||||
core.global.project.project.description != null
|
||||
|| core.global.project.project.files.length > 0
|
||||
));
|
||||
}
|
||||
|
||||
// Initializing the "requester" page button HTML-element
|
||||
const requester = core.paginator.shell.querySelector('button[data-paginator-page-button="3"]');
|
||||
const requester = core.global.paginator.shell.querySelector('button[data-paginator-page-button="3"]');
|
||||
|
||||
if (requester instanceof HTMLElement) {
|
||||
// Initialized the "requester" page button HTML-element
|
||||
|
||||
// Showing or hiding the "requester" page button HTML-element
|
||||
requester.disabled =
|
||||
!(core.project.requester.personal
|
||||
!(core.global.project.requester.personal
|
||||
&& (
|
||||
core.project.requester.sim != null
|
||||
|| core.project.requester.mail != null
|
||||
|| core.project.requester.other != null
|
||||
core.global.project.requester.sim != null
|
||||
|| core.global.project.requester.mail != null
|
||||
|| core.global.project.requester.other != null
|
||||
));
|
||||
}
|
||||
});
|
||||
|
||||
// Connecting event listener for project calculation
|
||||
core.project.shell.addEventListener("project.calculated", function() {
|
||||
core.global.project.shell.addEventListener("project.calculated", function() {
|
||||
// Showing the buttons HTML-element
|
||||
core.paginator.shell?.style.removeProperty('display');
|
||||
core.global.paginator.shell?.style.removeProperty('display');
|
||||
});
|
||||
|
||||
// Initializing the page buttons menu
|
||||
core.paginator.shell.addEventListener("paginator.page.opened", function (event) {
|
||||
core.global.paginator.shell.addEventListener("paginator.page.opened", function (event) {
|
||||
// Scrolling to the introdution HTML-element
|
||||
introdution?.scrollIntoView({ behavior: 'smooth' });
|
||||
// introdution?.scrollIntoView({ behavior: 'smooth' });
|
||||
// window.scrollTo({ top: 300, behavior: 'smooth' });
|
||||
// Сделать для мобилок 300 а для пк 0
|
||||
window.scrollTo({ top: window.innerHeight > 1500 ? 0 : 300, behavior: 'smooth' });
|
||||
|
||||
// Initializing the page buttons menu
|
||||
menu(event.detail.identifier);
|
||||
@@ -215,7 +231,7 @@ core.modules.connect(["damper", "project"]).then((connected) => {
|
||||
const index = Array.from(list.children).indexOf(element);
|
||||
|
||||
// Initializing the actual list of files
|
||||
let files = core.project.project.files;
|
||||
let files = core.global.project.project.files;
|
||||
|
||||
// Deleting the file
|
||||
files.splice(index, 1);
|
||||
@@ -224,7 +240,7 @@ core.modules.connect(["damper", "project"]).then((connected) => {
|
||||
element.remove();
|
||||
|
||||
// Writing into the project property
|
||||
core.project.project.files = files;
|
||||
core.global.project.project.files = files;
|
||||
})
|
||||
|
||||
// Initializing the file label delete button image
|
||||
@@ -247,5 +263,5 @@ core.modules.connect(["damper", "project"]).then((connected) => {
|
||||
}
|
||||
})
|
||||
|
||||
core.project.shell.parentElement.classList.remove('loading');
|
||||
core.global.project.shell.parentElement.classList.remove('loading');
|
||||
});
|
||||
|
||||
251
kodorvan/site/system/public/js/pages/project/create.js
Executable file
@@ -0,0 +1,251 @@
|
||||
"use strict";
|
||||
|
||||
core.modules.connect(["damper", "project"]).then((connected) => {
|
||||
// Imported modules
|
||||
|
||||
// Initializing the introdution HTML-element
|
||||
const introdution = document.getElementById('introdution');
|
||||
|
||||
// Initializing the files input wrap HTML-element
|
||||
const files = document.getElementById("project_files");
|
||||
|
||||
// Initializing the instance of the project.mjs
|
||||
core.global.project = new connected.global.project(
|
||||
document.querySelector('section[data-paginator-page="1"]'),
|
||||
document.getElementById("architecture"),
|
||||
document.getElementById("purpose"),
|
||||
document.getElementById("integrations"),
|
||||
document.getElementById("team"),
|
||||
document.getElementById("programmers"),
|
||||
document.getElementById("designers"),
|
||||
document.getElementById("boosters"),
|
||||
document.getElementById("reward"),
|
||||
document.getElementById("hour"),
|
||||
document.getElementById("hour_input_number"),
|
||||
document.getElementById("hour_input_range"),
|
||||
document.getElementById("result"),
|
||||
document.getElementById("calculated"),
|
||||
document.getElementById("hours"),
|
||||
document.getElementById("hours_output"),
|
||||
document.getElementById("days_output"),
|
||||
document.getElementById("payment"),
|
||||
document.getElementById("payment_output"),
|
||||
document.getElementById("prepayment"),
|
||||
document.getElementById("prepayment_output"),
|
||||
document.getElementById("project_name"),
|
||||
document.getElementById("project_description"),
|
||||
files,
|
||||
document.getElementById("requester_name"),
|
||||
document.getElementById("requester_sim"),
|
||||
document.getElementById("requester_mail"),
|
||||
document.getElementById("requester_other"),
|
||||
document.getElementById("requester_personal"),
|
||||
true
|
||||
);
|
||||
|
||||
// Initializing the hour input number HTML-element
|
||||
const hour_number = document.getElementById('hour_input_number');
|
||||
|
||||
// Initializing the hour input range HTML-element
|
||||
const hour_range = document.getElementById('hour_input_range');
|
||||
|
||||
hour_range.addEventListener("input", () => {
|
||||
hour_inputs_syncronize(hour_range, hour_number);
|
||||
});
|
||||
|
||||
function hour_inputs_syncronize(range, number) {
|
||||
const min = range.min ? range.min : 300;
|
||||
const max = range.max ? range.max : 5000;
|
||||
|
||||
number.value = range.value;
|
||||
}
|
||||
|
||||
// Initializing the "back" button
|
||||
const back = document.getElementById('back');
|
||||
|
||||
core.modules.connect(["paginator"]).then((connected) => {
|
||||
// Imported the paginator.mjs module
|
||||
|
||||
// Initializing pages
|
||||
const pages = document.querySelectorAll('section[data-paginator-page]');
|
||||
|
||||
// Initializing the instance of the paginator.mjs
|
||||
core.global.paginator = new connected.global.paginator(
|
||||
document.getElementById('buttons'),
|
||||
pages
|
||||
);
|
||||
|
||||
// Initializing the buttons
|
||||
const buttons = core.global.paginator.shell.querySelectorAll('button[data-paginator-page-button]');
|
||||
|
||||
function menu(identifier) {
|
||||
// Initializing the target page button HTML-element
|
||||
const active = core.global.paginator.shell.querySelector('button[data-paginator-page-button="' + identifier + '"]');
|
||||
|
||||
if (active instanceof HTMLElement) {
|
||||
// Initialized the target page button HTML-element
|
||||
|
||||
for (const inactive of buttons) {
|
||||
// Iteration over pages
|
||||
|
||||
// Hiding the page button HTML-element
|
||||
inactive.style.setProperty('display', 'none');
|
||||
}
|
||||
|
||||
// Showing the target page button HTML-element
|
||||
active.style.removeProperty('display');
|
||||
|
||||
if (identifier > 1) {
|
||||
// Second or more page
|
||||
|
||||
// Showing the "back" button
|
||||
back.style.removeProperty('display');
|
||||
} else {
|
||||
// The first page
|
||||
|
||||
// Hiding the "back" button
|
||||
back.style.setProperty('display', 'none');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Connecting event listener for project calculation
|
||||
core.global.project.shell.addEventListener("project.write", function() {
|
||||
// Initializing the "calculator" page button HTML-element
|
||||
const calculator = core.global.paginator.shell.querySelector('button[data-paginator-page-button="1"]');
|
||||
|
||||
if (calculator instanceof HTMLElement) {
|
||||
// Initialized the "calculator" page button HTML-element
|
||||
|
||||
// Showing or hiding the "calculator" page button HTML-element
|
||||
calculator.disabled = !(core.global.project.architecture != null);
|
||||
}
|
||||
|
||||
// Initializing the "project" page button HTML-element
|
||||
const project = core.global.paginator.shell.querySelector('button[data-paginator-page-button="2"]');
|
||||
|
||||
if (project instanceof HTMLElement) {
|
||||
// Initialized the "project" page button HTML-element
|
||||
|
||||
// Showing or hiding the "project" page button HTML-element
|
||||
project.disabled =
|
||||
!(core.global.project.project.name
|
||||
&& (
|
||||
core.global.project.project.description != null
|
||||
|| core.global.project.project.files.length > 0
|
||||
));
|
||||
}
|
||||
|
||||
// Initializing the "requester" page button HTML-element
|
||||
const requester = core.global.paginator.shell.querySelector('button[data-paginator-page-button="3"]');
|
||||
|
||||
if (requester instanceof HTMLElement) {
|
||||
// Initialized the "requester" page button HTML-element
|
||||
|
||||
// Showing or hiding the "requester" page button HTML-element
|
||||
requester.disabled =
|
||||
!(core.global.project.requester.personal
|
||||
&& (
|
||||
core.global.project.requester.sim != null
|
||||
|| core.global.project.requester.mail != null
|
||||
|| core.global.project.requester.other != null
|
||||
));
|
||||
}
|
||||
});
|
||||
|
||||
// Connecting event listener for project calculation
|
||||
core.global.project.shell.addEventListener("project.calculated", function() {
|
||||
// Showing the buttons HTML-element
|
||||
core.global.paginator.shell?.style.removeProperty('display');
|
||||
});
|
||||
|
||||
// Initializing the page buttons menu
|
||||
core.global.paginator.shell.addEventListener("paginator.page.opened", function (event) {
|
||||
// Scrolling to the introdution HTML-element
|
||||
introdution?.scrollIntoView({ behavior: 'smooth' });
|
||||
|
||||
// Initializing the page buttons menu
|
||||
menu(event.detail.identifier);
|
||||
});
|
||||
});
|
||||
|
||||
// Initializing the files list HTML-element
|
||||
const list = files.querySelector('ol.files');
|
||||
|
||||
// Initializing the files input HTML-element
|
||||
const files_input = files.querySelector('.input');
|
||||
|
||||
files_input.addEventListener('input', (event) => {
|
||||
// Deleting every file label from the list
|
||||
list.innerHTML = '';
|
||||
|
||||
if (files_input.files.length > 0) {
|
||||
// Has files
|
||||
|
||||
// Showing the list HTML-element
|
||||
list.style.removeProperty('display');
|
||||
|
||||
// Initializing the file index iterator
|
||||
let index = 0;
|
||||
|
||||
for (const file of files_input.files) {
|
||||
// Iterating over files
|
||||
|
||||
// Initializing the maximum length for the file label name
|
||||
const maximum = 16;
|
||||
|
||||
// Initializing the end tail for the file label name
|
||||
const tail = 8;
|
||||
|
||||
// Initializing the file label name
|
||||
const name = file.name.length > maximum ? file.name.slice(0, maximum - tail).trim() + '...' + file.name.slice(-tail).trim() : file.name;
|
||||
|
||||
// Initializing the file label HTML-element
|
||||
const element = document.createElement('li');
|
||||
element.id = "project_files_input_" + index;
|
||||
element.setAttribute('title', file.name);
|
||||
element.innerText = name;
|
||||
|
||||
// Initializing the file label delete button
|
||||
const button = document.createElement('button');
|
||||
button.classList.add('delete');
|
||||
|
||||
button.addEventListener('click', (event) => {
|
||||
// Initializing the file index
|
||||
const index = Array.from(list.children).indexOf(element);
|
||||
|
||||
// Initializing the actual list of files
|
||||
let files = core.global.project.project.files;
|
||||
|
||||
// Deleting the file
|
||||
files.splice(index, 1);
|
||||
|
||||
// Deleting the file label HTML-element
|
||||
element.remove();
|
||||
|
||||
// Writing into the project property
|
||||
core.global.project.project.files = files;
|
||||
})
|
||||
|
||||
// Initializing the file label delete button image
|
||||
const image = document.createElement('img');
|
||||
image.setAttribute('src', '/themes/default/images/icons/close.svg');
|
||||
|
||||
// Writing the file label into the list HTML-element
|
||||
button.appendChild(image);
|
||||
element.appendChild(button);
|
||||
list.appendChild(element);
|
||||
|
||||
// Recalculating the index (postfix-incrementation)
|
||||
index++;
|
||||
}
|
||||
} else {
|
||||
// Has no files
|
||||
|
||||
// Hiding the list HTML-element
|
||||
list.style.setProperty('display', 'none');
|
||||
}
|
||||
})
|
||||
|
||||
core.global.project.shell.parentElement.classList.remove('loading');
|
||||
});
|
||||
15
kodorvan/site/system/public/js/pages/system/superpack.js
Normal file
@@ -0,0 +1,15 @@
|
||||
"use strict";
|
||||
|
||||
core.modules.connect(["damper"], ["superpack"]).then((connected) => {
|
||||
// Imported modules
|
||||
|
||||
// Initializing the instance of the project.mjs
|
||||
core.system.superpack = new connected.system.superpack(
|
||||
document.getElementById('superpack'),
|
||||
document.getElementById('superpack_urn'),
|
||||
document.getElementById('superpack_title'),
|
||||
document.getElementById('superpack_html'),
|
||||
document.getElementById('superpack_text'),
|
||||
document.getElementById('superpack_supercost'),
|
||||
);
|
||||
});
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../three.js/build/three.core.js
|
||||
@@ -1 +0,0 @@
|
||||
../../../../../three.js/build/three.module.js
|
||||
@@ -4,8 +4,13 @@
|
||||
:root {
|
||||
--text-color: #fff;
|
||||
--text-color-inverted: #000;
|
||||
--button-background-color-inverted: #fff;
|
||||
--button-background-color: #000;
|
||||
--link-color: #6a6cff;
|
||||
--link-hover-color: #7aa0fb;
|
||||
--link-active-color: #5c53c9;
|
||||
--button-background-color: #fff;
|
||||
--button-background-color-inverted: #000;
|
||||
--button-hover-background-color: #abc7c6;
|
||||
--button-active-background-color: #8fa3a2;
|
||||
--section-background-color-inverted: #fff;
|
||||
--section-background-color: #000;
|
||||
--background-color: #fbfaf6;
|
||||
@@ -21,9 +26,6 @@
|
||||
--blue: #0ea5e9;
|
||||
|
||||
--paper: var(--white);
|
||||
|
||||
--button-plain-hover-background-color: #bdd2c8;
|
||||
--button-plain-active-background-color: #7d9f8f;
|
||||
}
|
||||
/* } */
|
||||
|
||||
@@ -56,8 +58,13 @@
|
||||
:root {
|
||||
--text-color: #fff;
|
||||
--text-color-inverted: #000;
|
||||
--button-background-color-inverted: #fff;
|
||||
--button-background-color: #000;
|
||||
--link-color: #6a6cff;
|
||||
--link-hover-color: #7aa0fb;
|
||||
--link-active-color: #5c53c9;
|
||||
--button-background-color: #fff;
|
||||
--button-background-color-inverted: #000;
|
||||
--button-hover-background-color: #abc7c6;
|
||||
--button-active-background-color: #8fa3a2;
|
||||
--section-background-color-inverted: #fff;
|
||||
--section-background-color: #000;
|
||||
--background-color: #fbfaf6;
|
||||
@@ -72,8 +79,5 @@
|
||||
--white: #fff;
|
||||
|
||||
--paper: var(--white);
|
||||
|
||||
--button-plain-hover-background-color: #bdd2c8;
|
||||
--button-plain-active-background-color: #7d9f8f;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,66 +1,68 @@
|
||||
@charset "UTF-8";
|
||||
|
||||
section#companies {
|
||||
article#companies {
|
||||
z-index: 50;
|
||||
margin-bottom: 5.5rem;
|
||||
width: 100vw;
|
||||
height: 70px;
|
||||
padding-bottom: 4rem;
|
||||
display: inline-flex;
|
||||
flex-direction: row;
|
||||
gap: 2rem;
|
||||
gap: 2em;
|
||||
font-size: 1rem;
|
||||
pointer-events: none;
|
||||
|
||||
>img {
|
||||
box-sizing: border-box;
|
||||
padding: 0.8rem 1.2rem;
|
||||
border-radius: 1.25rem;
|
||||
padding: 0.8em 1.2em;
|
||||
border-radius: 1.25em;
|
||||
/* border-top: 1px solid #e6efff45;
|
||||
border-left: 1px solid #e5edff38;
|
||||
background: #d7f9ff2b;
|
||||
backdrop-filter: blur(1.6px); */
|
||||
color: #fff;
|
||||
|
||||
&:is(.bitrix24) {
|
||||
&.bitrix24 {
|
||||
padding-top: 1.3rem;
|
||||
padding-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
&:is(.moy_sklad) {
|
||||
&.moy_sklad {
|
||||
padding-top: 0.1rem;
|
||||
padding-bottom: 0.4rem;
|
||||
}
|
||||
|
||||
&:is(.wildberries) {
|
||||
&.wildberries {
|
||||
padding-top: 0.7rem;
|
||||
padding-bottom: 1.1rem;
|
||||
}
|
||||
|
||||
&:is(.ozon) {
|
||||
&.ozon {
|
||||
padding-top: 0.8rem;
|
||||
padding-bottom: 1.1rem;
|
||||
}
|
||||
|
||||
&:is(.yandex_market) {
|
||||
&.yandex_market {
|
||||
padding-bottom: 0.8rem;
|
||||
}
|
||||
|
||||
&:is(.vk) {
|
||||
&.vk {
|
||||
padding-bottom: 0.4rem;
|
||||
}
|
||||
|
||||
&:is(.max) {
|
||||
&.max {
|
||||
padding-bottom: 0.5rem;
|
||||
}
|
||||
|
||||
&:is(.avito) {
|
||||
&.avito {
|
||||
padding-bottom: 1rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media (width < 800px) {
|
||||
section#companies {
|
||||
height: 50px;
|
||||
padding-bottom: 2.5rem;
|
||||
article#companies {
|
||||
margin-bottom: 4.5rem;
|
||||
height: max(50px, min(9vw, 70px));
|
||||
font-size: min(2vw, 1rem);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,11 +30,12 @@ section#cookies {
|
||||
}
|
||||
|
||||
>div {
|
||||
padding: 0.8rem 1.2rem 0.7rem;
|
||||
padding: 0.9rem 1.2rem 0.8rem;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
gap: 0.3rem;
|
||||
|
||||
>p {
|
||||
margin: unset;
|
||||
@@ -43,6 +44,8 @@ section#cookies {
|
||||
}
|
||||
|
||||
>small {
|
||||
line-height: 1rem;
|
||||
text-align: center;
|
||||
font-family: Nunito;
|
||||
font-size: 0.9rem;
|
||||
font-weight: 400;
|
||||
|
||||
0
kodorvan/site/system/public/themes/default/css/elements/disabled/range.css
Normal file → Executable file
46
kodorvan/site/system/public/themes/default/css/elements/ender.css
Executable file
@@ -0,0 +1,46 @@
|
||||
@charset "UTF-8";
|
||||
|
||||
div#ender {
|
||||
z-index: 500;
|
||||
margin-bottom: var(--main-gap, 2em);
|
||||
padding: 1.2em;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: max(1.5rem, 0.3em);
|
||||
font-size: 4.5rem;
|
||||
text-align: center;
|
||||
color: #fff;
|
||||
rotate: 2deg;
|
||||
|
||||
>button {
|
||||
--diameter: 7em;
|
||||
margin: auto;
|
||||
width: var(--diameter);
|
||||
height: var(--diameter);
|
||||
padding: 0.8em;
|
||||
border-radius: 100%;
|
||||
border: calc(var(--diameter) * 0.06) solid #fff;
|
||||
rotate: -2deg;
|
||||
background: unset;
|
||||
backdrop-filter: blur(2px);
|
||||
|
||||
&:is(:hover, :focus) {
|
||||
background: unset;
|
||||
filter: brightness(0.7);
|
||||
}
|
||||
|
||||
&:active {
|
||||
filter: brightness(0.5);
|
||||
}
|
||||
|
||||
>img.icon {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* @media (width < 800px) {
|
||||
div#ender {
|
||||
}
|
||||
} */
|
||||
479
kodorvan/site/system/public/themes/default/css/elements/facer.css
Executable file
@@ -0,0 +1,479 @@
|
||||
@charset "UTF-8";
|
||||
|
||||
section#facer {
|
||||
--aside-width: 18em;
|
||||
--button-height: 3.3em;
|
||||
--button-padding: 1em;
|
||||
position: relative;
|
||||
display: grid;
|
||||
grid-template-columns: var(--aside-width, 10vw) max(24vw, 22em) var(--aside-width, 10vw);
|
||||
grid-template-rows: repeat(6, auto);
|
||||
justify-content: center;
|
||||
column-gap: 3em;
|
||||
row-gap: 1em;
|
||||
|
||||
>header {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
|
||||
>h1 {
|
||||
margin: unset;
|
||||
padding: unset;
|
||||
text-align: center;
|
||||
font-family: "MT Sans";
|
||||
font-weight: 400;
|
||||
color: #fff;
|
||||
text-shadow: 0px 0px 5px #000B, 0px 2px 2px #000B;
|
||||
|
||||
&:not(+small) {
|
||||
margin-bottom: 0.5em;
|
||||
}
|
||||
|
||||
&+span {
|
||||
margin-top: 0.2em;
|
||||
margin-bottom: 1em;
|
||||
text-align: center;
|
||||
color: #e9e8e2;
|
||||
text-shadow: 0px 1px 3px #000C, 0px 1px 1px #000B;
|
||||
}
|
||||
|
||||
&+small {
|
||||
margin-bottom: 1em;
|
||||
text-align: center;
|
||||
color: #fff;
|
||||
text-shadow: 0px 1px 3px #000C, 0px 1px 1px #000B;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
>p.promotion {
|
||||
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 {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
* {
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
|
||||
ul.window {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
list-style: none;
|
||||
background: #557d8d42;
|
||||
|
||||
>li {
|
||||
padding: 0.8em 0;
|
||||
border-bottom: 2px solid #61ffe117;
|
||||
|
||||
&:first-of-type {
|
||||
padding-top: unset;
|
||||
}
|
||||
|
||||
&:last-of-type {
|
||||
padding-bottom: unset;
|
||||
border-bottom: unset;
|
||||
}
|
||||
|
||||
>:is(strong, b) {
|
||||
color: #cfeee5;
|
||||
font-weight: 600;
|
||||
|
||||
/* &.important {
|
||||
color: #87d089;
|
||||
} */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
small.window {
|
||||
background: #557d8d42;
|
||||
}
|
||||
|
||||
:is(ul, small).window {
|
||||
/* padding: 0.6em 1em; */
|
||||
padding: 1em 1.2em;
|
||||
text-align: left;
|
||||
font-family: "Golos";
|
||||
font-size: 0.9em;
|
||||
font-weight: 500;
|
||||
color: #98adb1;
|
||||
border-radius: 1.25rem;
|
||||
border-top: 1px solid #84d1d52e;
|
||||
backdrop-filter: blur(2px) contrast(1.14);
|
||||
/* text-shadow: 0px 1px 3px #000C, 0px 1px 1px #000B; */
|
||||
text-shadow: unset;
|
||||
|
||||
>img.icon {
|
||||
margin-right: 0.5em;
|
||||
height: 1.6ch;
|
||||
vertical-align: baseline;
|
||||
margin-bottom: -2px;
|
||||
|
||||
&.thunder {
|
||||
margin-top: -0.2em;
|
||||
margin-right: 0.3em;
|
||||
height: 2ch;
|
||||
vertical-align: top;
|
||||
}
|
||||
}
|
||||
|
||||
>:is(strong, b) {
|
||||
/* display: block; */
|
||||
font-weight: 600;
|
||||
color: #ebdada;
|
||||
|
||||
&.red {
|
||||
color: #f44;
|
||||
}
|
||||
|
||||
&.green {
|
||||
color: #44ff50;
|
||||
}
|
||||
|
||||
&.blue {
|
||||
color: #457cff;
|
||||
}
|
||||
|
||||
&.yellow {
|
||||
color: #faff50;
|
||||
}
|
||||
|
||||
&.cyan {
|
||||
color: #01e8ff;
|
||||
}
|
||||
}
|
||||
|
||||
/* >li {
|
||||
color: #99bc99;
|
||||
filter: brightness(0.9);
|
||||
|
||||
>:is(strong, b) {
|
||||
color: #dbf0db;
|
||||
|
||||
&.important {
|
||||
color: #87d089;
|
||||
}
|
||||
}
|
||||
|
||||
&:nth-of-type(2n) {
|
||||
color: #9fc8d4;
|
||||
|
||||
>:is(strong, b) {
|
||||
color: #f0d4ff;
|
||||
|
||||
&.important {
|
||||
color: #6bb9fd;
|
||||
}
|
||||
}
|
||||
}
|
||||
} */
|
||||
}
|
||||
|
||||
>div.partners {
|
||||
margin-top: 1rem;
|
||||
padding: 0 1em;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
>div.icon {
|
||||
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-size: 1.2em;
|
||||
color: #d6d327;
|
||||
text-shadow: 0px 0px 5px #FFB54147, 0px 0px 2px #FFAF313D;
|
||||
}
|
||||
}
|
||||
|
||||
>small.offer {
|
||||
margin-top: 1.2rem;
|
||||
padding: 0 1.5em;
|
||||
text-align: center;
|
||||
font-size: 0.8em;
|
||||
color: #fff;
|
||||
text-shadow: 0px 1px 3px #000C, 0px 1px 1px #000B;
|
||||
|
||||
>b {
|
||||
display: block;
|
||||
}
|
||||
}
|
||||
|
||||
>div#contacts_shortcut {
|
||||
margin-top: 1rem;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 0.1em;
|
||||
color: #fff;
|
||||
|
||||
>span {
|
||||
font-family: Bahnschrift;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
>div.sim {
|
||||
a.number {
|
||||
margin: unset;
|
||||
color: #fff;
|
||||
text-shadow: 0px 1px 3px #000C, 0px 1px 1px #000B;
|
||||
|
||||
>span {
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
+small {
|
||||
font-family: "Bahnschrift";
|
||||
font-weight: 100;
|
||||
text-shadow: 0px 1px 3px #000C, 0px 1px 1px #000B;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
>div.mega {
|
||||
--border-radius: 1.25rem;
|
||||
--border-width: 4px;
|
||||
height: var(--button-height, 60px);
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
|
||||
&:is(:first-child) {
|
||||
margin-bottom: 1rem;
|
||||
}
|
||||
|
||||
&:has(>button.delete:is(:hover, :focus)) {
|
||||
>div.content {
|
||||
border-color: var(--button-hover-background-color);
|
||||
}
|
||||
}
|
||||
|
||||
&:has(>button.delete:active) {
|
||||
>div.content {
|
||||
border-color: var(--button-active-background-color);
|
||||
}
|
||||
}
|
||||
|
||||
>div.content {
|
||||
z-index: 100;
|
||||
flex-grow: 1;
|
||||
padding: 0.52em 0.6em;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 0.6em;
|
||||
border-radius: var(--border-radius, 1.25rem);
|
||||
border: var(--border-width, 4px) solid #fff;
|
||||
background: #000;
|
||||
|
||||
>img.icon {
|
||||
width: auto;
|
||||
max-height: 3rem;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
>span.value {
|
||||
font-family: "Golos";
|
||||
font-size: 1em;
|
||||
font-weight: 500;
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
|
||||
>button.delete {
|
||||
--offset-left: calc(var(--border-radius, 1.25rem) + var(--border-width, 4px));
|
||||
z-index: 50;
|
||||
margin-left: calc(var(--offset-left) * -1);
|
||||
width: calc(var(--button-height, 70px) * 1.3 + var(--button-padding, 1em) + var(--offset-left, 0px));
|
||||
height: max(var(--button-height, 70px), 100%);
|
||||
padding: var(--button-padding, 1em);
|
||||
padding-left: calc(var(--offset-left) + var(--border-width));
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
border-radius: 0 var(--border-radius, 1.25rem) var(--border-radius, 1.25rem) 0;
|
||||
border: unset;
|
||||
background: #fff;
|
||||
|
||||
&:is(:hover, :focus) {
|
||||
background: var(--button-hover-background-color);
|
||||
}
|
||||
|
||||
&:active {
|
||||
background: var(--button-active-background-color);
|
||||
}
|
||||
|
||||
>img.icon {
|
||||
scale: 1.2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
>div.adaptive {
|
||||
/* display: contents; */
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
gap: 1rem;
|
||||
|
||||
>* {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
>button#back {
|
||||
--diameter: 7ch;
|
||||
--radius: calc(var(--diameter, 4ch) / 2);
|
||||
width: var(--button-height, 30%);
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
border: unset;
|
||||
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) {
|
||||
background-color: var(--button-hover-background-color, #abc7c6);
|
||||
}
|
||||
|
||||
&:active {
|
||||
background-color: var(--button-active-background-color, #8fa3a2);
|
||||
}
|
||||
|
||||
>img {
|
||||
padding-bottom: 0.15em;
|
||||
scale: 1.4;
|
||||
}
|
||||
}
|
||||
|
||||
>div#buttons {
|
||||
/* margin-bottom: var(--margin-bottom, 0.8rem); */
|
||||
margin-bottom: unset;
|
||||
flex-direction: row;
|
||||
justify-content: center;
|
||||
|
||||
>button {
|
||||
min-width: 100%;
|
||||
height: var(--button-height, 30%);
|
||||
/* padding: 1.05em 1.3em 1em;
|
||||
border-radius: 0.75rem; */
|
||||
box-sizing: border-box;
|
||||
padding: 0 var(--button-padding);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
font-family: "Golos";
|
||||
font-size: 1em;
|
||||
font-weight: 500;
|
||||
border-radius: 1.25rem;
|
||||
border: unset;
|
||||
background-color: var(--button-background-color, #fff);
|
||||
|
||||
&:is(:hover, :focus) {
|
||||
background-color: var(--button-hover-background-color, #abc7c6);
|
||||
}
|
||||
|
||||
&:active {
|
||||
background-color: var(--button-active-background-color, #8fa3a2);
|
||||
}
|
||||
|
||||
&#send {
|
||||
--shadow: 0 4px 5px -4px rgba(0, 0, 0, 0.5);
|
||||
/* padding: 2.3ch 4.5ch 2.5ch; */
|
||||
font-weight: 500;
|
||||
color: #fff;
|
||||
text-shadow: 0 0px 0.4em #0004, 0 0 1.7em #000;
|
||||
border: unset;
|
||||
background: hsl(var(--button-send-background-color, 120deg) 40% 50%);
|
||||
box-shadow: var(--shadow);
|
||||
-webkit-box-shadow: var(--shadow);
|
||||
-moz-box-shadow: var(--shadow);
|
||||
transition: background 1.2s ease-out;
|
||||
|
||||
&:not(:disabled) {
|
||||
filter: contrast(1.1);
|
||||
|
||||
&:is(:hover, :focus) {
|
||||
>div.color {
|
||||
filter: brightness(0.6);
|
||||
}
|
||||
}
|
||||
|
||||
&:active {
|
||||
>div.color {
|
||||
filter: brightness(0.45);
|
||||
}
|
||||
}
|
||||
|
||||
/* >div.color {
|
||||
filter: brightness(0.85);
|
||||
} */
|
||||
}
|
||||
|
||||
&:disabled {
|
||||
>div.color {
|
||||
filter: grayscale(1) brightness(0.8);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
&:disabled {
|
||||
>div.color {
|
||||
filter: grayscale(1) brightness(0.8);
|
||||
}
|
||||
|
||||
>small.disabled {
|
||||
display: initial;
|
||||
}
|
||||
}
|
||||
|
||||
>small.disabled {
|
||||
display: none;
|
||||
font-size: 0.7em;
|
||||
}
|
||||
}
|
||||
|
||||
&:is(#paginator) {
|
||||
flex-direction: row;
|
||||
justify-content: center;
|
||||
|
||||
>button {
|
||||
flex-grow: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media (width < 500px) {
|
||||
section#facer {
|
||||
--button-height: 4.5em;
|
||||
}
|
||||
}
|
||||
0
kodorvan/site/system/public/themes/default/css/elements/gradient.css
Normal file → Executable file
66
kodorvan/site/system/public/themes/default/css/elements/rofls.css
Executable file
@@ -0,0 +1,66 @@
|
||||
@charset "UTF-8";
|
||||
|
||||
body {
|
||||
&:has(> article#rofls > img.eye:is(:hover, :focus, :active)) {
|
||||
>article#rofls {
|
||||
>img.eye {
|
||||
cursor: none;
|
||||
}
|
||||
|
||||
>img:not(.eye) {
|
||||
opacity: 0;
|
||||
transition: opacity 0.1s ease-in;
|
||||
}
|
||||
}
|
||||
|
||||
>*:not(section#buttons) {
|
||||
opacity: 0;
|
||||
transition: opacity 0.1s ease-in;
|
||||
}
|
||||
}
|
||||
|
||||
>article#rofls {
|
||||
z-index: 4000;
|
||||
position: relative;
|
||||
width: 100vw;
|
||||
height: 32px;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
overflow: hidden;
|
||||
|
||||
&:has(> img.colors:is(:hover, :focus, :active)) {
|
||||
z-index: 9999;
|
||||
mix-blend-mode: color-dodge;
|
||||
filter: contrast(50);
|
||||
}
|
||||
|
||||
>img {
|
||||
margin: unset;
|
||||
height: 100%;
|
||||
cursor: grab;
|
||||
|
||||
&:is(:active) {
|
||||
cursor: grabbing;
|
||||
}
|
||||
|
||||
&:is(.noclick) {
|
||||
cursor: not-allowed;
|
||||
}
|
||||
|
||||
&:is(.antibuttons) {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
&:is(.construction, .cogs) {
|
||||
cursor: wait;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media (width < 800px) {
|
||||
section#rofls {
|
||||
height: 50px;
|
||||
padding-bottom: 2.5rem;
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,14 @@
|
||||
/* @import url('/css/fonts/fira.css'); */
|
||||
/* @import url('/css/fonts/hack.css'); */
|
||||
/* @import url('/css/fonts/dejavu.css'); */
|
||||
@import url('/css/fonts/nunito.css');
|
||||
/* @import url('/css/fonts/nunito.css'); */
|
||||
/* @import url('/css/fonts/als_schlange.css'); */
|
||||
@import url('/css/fonts/golos.css');
|
||||
@import url('/css/fonts/cascadia_code.css');
|
||||
@import url('/css/fonts/geologica.css');
|
||||
@import url('/css/fonts/commissioner.css');
|
||||
/* @import url('/css/fonts/commissioner.css'); */
|
||||
@import url('/css/fonts/mt_sans.css');
|
||||
/* @import url('/css/fonts/strogo.css'); */
|
||||
/* @import url('/css/fonts/vredina.css'); */
|
||||
@import url('/css/fonts/gost.css');
|
||||
@import url('/css/fonts/bahnschrift.css');
|
||||
@@ -14,5 +17,5 @@
|
||||
/* @import url('/css/fonts/urban_slavic.css'); */
|
||||
/* @import url('/css/fonts/slifted.css'); */
|
||||
/* @import url('/css/fonts/compacta.css'); */
|
||||
@import url('/css/fonts/industry.css');
|
||||
/* @import url('/css/fonts/industry.css'); */
|
||||
/* @import url('/css/fonts/palui.css'); */
|
||||
|
||||
@@ -3,42 +3,33 @@
|
||||
footer {
|
||||
z-index: 4000;
|
||||
position: relative;
|
||||
height: var(--footer-height, 200px);
|
||||
min-height: 230px;
|
||||
height: var(--footer-height, 230px);
|
||||
box-sizing: border-box;
|
||||
padding: 2rem 10vw;
|
||||
display: flex;
|
||||
align-items: self-end;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
gap: 3rem;
|
||||
/* overflow: hidden; */
|
||||
gap: 2rem;
|
||||
color: #fff;
|
||||
background-color: #000;
|
||||
|
||||
>div.sector {
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: end;
|
||||
gap: 1rem;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
gap: 2rem;
|
||||
|
||||
&.company {
|
||||
justify-content: space-between;
|
||||
align-items: end;
|
||||
|
||||
>article#contacts {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: end;
|
||||
}
|
||||
}
|
||||
|
||||
>article#office {
|
||||
width: 250px;
|
||||
height: 100%;
|
||||
>article.company {
|
||||
flex-grow: 1;
|
||||
display: flex;
|
||||
gap: 2rem;
|
||||
|
||||
>div.map {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
max-width: 350px;
|
||||
width: 250px;
|
||||
flex-grow: 3;
|
||||
overflow: hidden;
|
||||
border-radius: 0.75rem;
|
||||
border: 2px solid #474023;
|
||||
@@ -70,128 +61,136 @@ footer {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
nav#links {
|
||||
flex-grow: 1;
|
||||
display: inline-flex;
|
||||
justify-content: center;
|
||||
gap: 1rem;
|
||||
|
||||
>a {
|
||||
text-decoration: none;
|
||||
font-family: "Geologica";
|
||||
font-weight: 400;
|
||||
font-size: 0.85rem;
|
||||
color: #807f7f;
|
||||
transition: color 0.1s ease-out;
|
||||
|
||||
&:is(:hover, :focus) {
|
||||
color: #d5d5d5;
|
||||
transition: color 0s;
|
||||
}
|
||||
|
||||
&:active {
|
||||
color: #4b4b4b;
|
||||
transition: color 0s;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
>article#contacts {
|
||||
>h1.sim {
|
||||
margin: unset;
|
||||
>div.information {
|
||||
min-width: 230px;
|
||||
max-width: 250px;
|
||||
justify-self: end;
|
||||
flex-grow: 1;
|
||||
display: flex;
|
||||
gap: 0.4em;
|
||||
font-size: 1.4em;
|
||||
flex-direction: column;
|
||||
gap: 0.5rem;
|
||||
font-family: "Cascadia Code";
|
||||
|
||||
>span.country:before {
|
||||
content: '+';
|
||||
>h1.name {
|
||||
margin: unset;
|
||||
display: block;
|
||||
font-weight: 600;
|
||||
font-size: 1rem;
|
||||
}
|
||||
|
||||
>span.operator:before {
|
||||
content: '(';
|
||||
}
|
||||
|
||||
>span.operator:after {
|
||||
content: ')';
|
||||
}
|
||||
}
|
||||
|
||||
>p.worktime {
|
||||
margin: unset;
|
||||
margin-top: 0.6em;
|
||||
display: flex;
|
||||
gap: 0.5em;
|
||||
|
||||
>span.time.from {
|
||||
display: flex;
|
||||
>p.column {
|
||||
margin: unset;
|
||||
display: inline-flex;
|
||||
flex-direction: column;
|
||||
gap: 0.2em;
|
||||
font-size: 0.8rem;
|
||||
color: #a3a396;
|
||||
|
||||
&:before {
|
||||
content: var(--contacts-worktime-from, 'from');
|
||||
>span.row {
|
||||
display: inline-flex;
|
||||
justify-content: end;
|
||||
font-weight: 400;
|
||||
gap: 0.6em;
|
||||
|
||||
&:before {
|
||||
margin-right: auto;
|
||||
font-weight: 600;
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
|
||||
>span.tax {
|
||||
&:before {
|
||||
content: var(--company-tax) ":";
|
||||
}
|
||||
}
|
||||
|
||||
>span.identifier {
|
||||
&:before {
|
||||
content: var(--company-identifier) ":";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
>span.time.to {
|
||||
>p.worktime {
|
||||
margin: unset;
|
||||
margin-top: auto;
|
||||
display: flex;
|
||||
gap: 0.2em;
|
||||
gap: 0.5em;
|
||||
font-family: "Bahnschrift";
|
||||
|
||||
&:before {
|
||||
content: var(--contacts-worktime-to, 'to');
|
||||
>span.time.from {
|
||||
margin-left: auto;
|
||||
display: flex;
|
||||
gap: 0.2em;
|
||||
|
||||
&:before {
|
||||
content: var(--contacts-worktime-from, 'from');
|
||||
}
|
||||
}
|
||||
|
||||
>span.time.to {
|
||||
display: flex;
|
||||
gap: 0.2em;
|
||||
|
||||
&:before {
|
||||
content: var(--contacts-worktime-to, 'to');
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
>article#company {
|
||||
justify-self: end;
|
||||
width: 160px;
|
||||
>article.contacts {
|
||||
min-height: 100px;
|
||||
padding-left: 2rem;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.5rem;
|
||||
font-family: "Bahnschrift";
|
||||
align-items: end;
|
||||
text-align: right;
|
||||
|
||||
>h1.name {
|
||||
>div.media {
|
||||
margin: unset;
|
||||
display: block;
|
||||
text-align: right;
|
||||
font-weight: 600;
|
||||
font-size: 1rem;
|
||||
margin-top: auto;
|
||||
justify-content: end;
|
||||
}
|
||||
|
||||
>p.column {
|
||||
margin: unset;
|
||||
display: inline-flex;
|
||||
flex-direction: column;
|
||||
text-align: right;
|
||||
gap: 0.2em;
|
||||
font-size: 0.8rem;
|
||||
color: grey;
|
||||
|
||||
>span.row {
|
||||
display: inline-flex;
|
||||
justify-content: end;
|
||||
font-weight: 400;
|
||||
|
||||
&:before {
|
||||
margin-right: auto;
|
||||
font-weight: 600;
|
||||
color: #fff;
|
||||
}
|
||||
>div.sim {
|
||||
a.number {
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
|
||||
>span.tax {
|
||||
&:before {
|
||||
content: var(--company-tax) ":";
|
||||
}
|
||||
}
|
||||
>a.mail {
|
||||
margin-top: 0.2em;
|
||||
margin-bottom: 1rem;
|
||||
font-family: "Cascadia Code";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
>span.identifier {
|
||||
&:before {
|
||||
content: var(--company-identifier) ":";
|
||||
}
|
||||
}
|
||||
>nav#links {
|
||||
display: inline-flex;
|
||||
justify-content: start;
|
||||
gap: 1rem;
|
||||
|
||||
>a {
|
||||
text-decoration: none;
|
||||
font-family: "Geologica";
|
||||
font-weight: 400;
|
||||
font-size: 0.85rem;
|
||||
color: #807f7f;
|
||||
transition: color 0.1s ease-out;
|
||||
|
||||
&:is(:hover, :focus) {
|
||||
color: #d5d5d5;
|
||||
transition: color 0s;
|
||||
}
|
||||
|
||||
&:active {
|
||||
color: #4b4b4b;
|
||||
transition: color 0s;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -218,32 +217,49 @@ footer {
|
||||
@media (width < 1200px) {
|
||||
footer {
|
||||
height: unset;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
|
||||
>div.sector {
|
||||
width: 100%;
|
||||
flex-direction: column;
|
||||
|
||||
>article#office {
|
||||
width: 100%;
|
||||
height: 100px;
|
||||
}
|
||||
|
||||
nav#links {
|
||||
display: inline-flex;
|
||||
justify-content: space-between;
|
||||
gap: 1rem;
|
||||
flex-flow: wrap row;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
&:is(.company) {
|
||||
flex-direction: row;
|
||||
|
||||
>article#contacts {
|
||||
align-items: start;
|
||||
>article.company {
|
||||
>div.map {
|
||||
max-width: unset;
|
||||
width: 100%;
|
||||
height: 150px;
|
||||
}
|
||||
}
|
||||
|
||||
>article.contacts {
|
||||
padding: unset;
|
||||
align-items: center;
|
||||
}
|
||||
}
|
||||
|
||||
>nav#links {
|
||||
display: inline-flex;
|
||||
/* justify-content: space-between; */
|
||||
flex-flow: wrap row;
|
||||
justify-content: center;
|
||||
gap: 1rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media (width < 800px) {
|
||||
footer {
|
||||
>div.sector {
|
||||
>article.company {
|
||||
flex-direction: column;
|
||||
|
||||
>div.information {
|
||||
max-width: unset;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
>nav#links {
|
||||
justify-content: space-between;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
@charset "UTF-8";
|
||||
|
||||
header {
|
||||
body>header {
|
||||
z-index: 1000;
|
||||
top: 0;
|
||||
left: 0;
|
||||
@@ -9,7 +9,7 @@ header {
|
||||
height: calc(var(--menu-height) + var(--introdution-height));
|
||||
pointer-events: none;
|
||||
|
||||
> div {
|
||||
>div {
|
||||
top: 0;
|
||||
position: sticky;
|
||||
width: 100%;
|
||||
@@ -26,7 +26,7 @@ header {
|
||||
display: none;
|
||||
}
|
||||
|
||||
> a#logotype {
|
||||
>a#logotype {
|
||||
margin-top: -0.4rem;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
@@ -34,13 +34,13 @@ header {
|
||||
text-decoration: none;
|
||||
color: #000;
|
||||
|
||||
> h4:only-of-type:first-child {
|
||||
>h4:only-of-type:first-child {
|
||||
margin: unset;
|
||||
font-family: "Cascadia Code";
|
||||
font-size: 2.5em;
|
||||
}
|
||||
|
||||
> small:only-of-type:last-child {
|
||||
>small:only-of-type:last-child {
|
||||
justify-self: end;
|
||||
align-self: end;
|
||||
margin-top: -0.8em;
|
||||
@@ -51,14 +51,14 @@ header {
|
||||
}
|
||||
}
|
||||
|
||||
> nav#menu {
|
||||
>nav#menu {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
gap: 1rem;
|
||||
font-family: "Geologica";
|
||||
|
||||
> a {
|
||||
>a {
|
||||
text-decoration: none;
|
||||
font-weight: 500;
|
||||
font-size: 1rem;
|
||||
|
||||
36
kodorvan/site/system/public/themes/default/css/interface/logotype.css
Executable file
@@ -0,0 +1,36 @@
|
||||
h1#logotype {
|
||||
z-index: 200;
|
||||
margin: unset;
|
||||
margin-top: 100px;
|
||||
margin-bottom: unset;
|
||||
width: max-content;
|
||||
height: 200px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
text-align: center;
|
||||
gap: 0.6rem;
|
||||
font-family: "";
|
||||
font-size: min(8vw, 4rem);
|
||||
font-weight: 400;
|
||||
/* scale: 0.8; */
|
||||
color: #fff;
|
||||
|
||||
>span.slogan {
|
||||
line-height: 0.8em;
|
||||
font-family: "GOST";
|
||||
font-weight: 400;
|
||||
font-size: 1.24em;
|
||||
color: #3688a2;
|
||||
}
|
||||
|
||||
>a.kodorvan {
|
||||
line-height: 0.8em;
|
||||
font-family: "MT Sans";
|
||||
font-size: 2em;
|
||||
text-decoration: unset;
|
||||
color: #c2ff98;
|
||||
/* text-shadow:
|
||||
0px 0px 4px #ffff00b5,
|
||||
0px 0px 11px #ffff008a */
|
||||
}
|
||||
}
|
||||
17
kodorvan/site/system/public/themes/default/css/interface/media.css
Executable file
@@ -0,0 +1,17 @@
|
||||
@charset "UTF-8";
|
||||
|
||||
div.social.media {
|
||||
margin: 0.6em 0;
|
||||
height: 3.5ch;
|
||||
display: flex;
|
||||
gap: 1ch;
|
||||
|
||||
>a {
|
||||
display: block;
|
||||
|
||||
>img {
|
||||
width: auto;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
37
kodorvan/site/system/public/themes/default/css/interface/sim.css
Executable file
@@ -0,0 +1,37 @@
|
||||
@charset "UTF-8";
|
||||
|
||||
div.sim {
|
||||
display: flex;
|
||||
gap: 0.4em;
|
||||
|
||||
>a.number {
|
||||
display: flex;
|
||||
gap: 0.4em;
|
||||
font-family: Bahnschrift;
|
||||
font-size: 1.5em;
|
||||
|
||||
>span.country:before {
|
||||
content: '+';
|
||||
}
|
||||
|
||||
>span.operator:before {
|
||||
content: '(';
|
||||
}
|
||||
|
||||
>span.operator:after {
|
||||
content: ')';
|
||||
}
|
||||
}
|
||||
|
||||
>button.copy {
|
||||
margin: unset;
|
||||
padding: 0 0.2em;
|
||||
cursor: pointer;
|
||||
border: unset;
|
||||
|
||||
>img.icon {
|
||||
/* scale: 0.8; */
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,7 +4,9 @@ main {
|
||||
--scroll-px-ten: calc(var(--scroll-px) / 10);
|
||||
--scroll-px-hundred: calc(var(--scroll-px-ten) / 10);
|
||||
--scroll-px-thousand: calc(var(--scroll-px-hundred) / 10);
|
||||
--main-gap: 60px;
|
||||
margin-top: var(--menu-height);
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
flex-grow: 1;
|
||||
|
||||
0
kodorvan/site/system/public/themes/default/css/messages/request.css
Normal file → Executable file
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,40 +1,65 @@
|
||||
@charset "UTF-8";
|
||||
|
||||
body {
|
||||
main {
|
||||
>h1#title {
|
||||
z-index: 200;
|
||||
margin: unset;
|
||||
margin-top: 4rem;
|
||||
margin-bottom: 2rem;
|
||||
width: max-content;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
text-align: center;
|
||||
gap: 0.6rem;
|
||||
font-family: "";
|
||||
font-size: min(8vw, 4rem);
|
||||
font-weight: 400;
|
||||
/* scale: 0.8; */
|
||||
color: #fff;
|
||||
>main {
|
||||
>section#facer {
|
||||
padding: 3rem 0 8rem;
|
||||
font-size: 1.3rem;
|
||||
|
||||
>span.slogan {
|
||||
line-height: 0.8em;
|
||||
font-family: "GOST";
|
||||
font-weight: 400;
|
||||
font-size: 1.24em;
|
||||
color: #3688a2;
|
||||
>header {
|
||||
grid-column: 2;
|
||||
grid-row: 1;
|
||||
}
|
||||
|
||||
>a.kodorvan {
|
||||
line-height: 0.8em;
|
||||
font-family: "MT Sans";
|
||||
font-size: 2em;
|
||||
text-decoration: unset;
|
||||
color: #c2ff98;
|
||||
/* text-shadow:
|
||||
0px 0px 4px #ffff00b5,
|
||||
0px 0px 11px #ffff008a */
|
||||
>ul.description {
|
||||
grid-column: 1;
|
||||
grid-row: 2;
|
||||
margin: unset;
|
||||
height: fit-content;
|
||||
}
|
||||
|
||||
>article#project {
|
||||
grid-column: 2;
|
||||
grid-row: 2;
|
||||
}
|
||||
|
||||
>div.other {
|
||||
grid-column: 3;
|
||||
grid-row: 2;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 1em;
|
||||
|
||||
>small.guarantee {
|
||||
/* background: #2ea05b3d; */
|
||||
}
|
||||
}
|
||||
|
||||
>div.mega#superpack {
|
||||
grid-column: 2;
|
||||
grid-row: 3;
|
||||
}
|
||||
|
||||
>div.adaptive {
|
||||
grid-column: 2;
|
||||
/* grid-row: 4; */
|
||||
}
|
||||
|
||||
>a.full {
|
||||
grid-column: 2;
|
||||
/* grid-row: 5; */
|
||||
text-align: center;
|
||||
font-size: 0.8em;
|
||||
}
|
||||
|
||||
>div.partners {
|
||||
grid-column: 2;
|
||||
/* grid-row: 6; */
|
||||
}
|
||||
|
||||
>div#contacts_shortcut {
|
||||
grid-column: 2;
|
||||
/* grid-row: 7; */
|
||||
}
|
||||
}
|
||||
|
||||
@@ -59,35 +84,54 @@ body {
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
>div.vignette {
|
||||
z-index: 100;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
justify-self: center;
|
||||
align-self: center;
|
||||
pointer-events: none;
|
||||
background: linear-gradient(90deg, #000B -20%, #0000 50%, #000B 120%);
|
||||
}
|
||||
@media (width < 90rem) {
|
||||
body {
|
||||
>main {
|
||||
section#facer {
|
||||
grid-template-columns: max(24vw, 22em);
|
||||
|
||||
>div.dots {
|
||||
--dot-bg: #18333f;
|
||||
--dot-color: #041825;
|
||||
--dot-size: 23px;
|
||||
--dot-space: 24px;
|
||||
z-index: -50;
|
||||
position: fixed;top: -200%;
|
||||
left: -200vw;
|
||||
top: -200%;
|
||||
justify-self: center;
|
||||
align-self: center;
|
||||
width: 400vw;
|
||||
min-height: 1000px;
|
||||
height: 800%;
|
||||
rotate: -16deg;
|
||||
pointer-events: none;
|
||||
background: linear-gradient(90deg, var(--dot-bg) calc(var(--dot-space) - var(--dot-size)), transparent 1%) center / var(--dot-space) var(--dot-space), linear-gradient(var(--dot-bg) calc(var(--dot-space) - var(--dot-size)), transparent 1%) center / var(--dot-space) var(--dot-space), var(--dot-color);
|
||||
>header,
|
||||
>article#project,
|
||||
>div.mega#superpack,
|
||||
>div.adaptive,
|
||||
>a.full,
|
||||
>div.partners,
|
||||
>div#contacts_shortcut {
|
||||
grid-column: 1;
|
||||
}
|
||||
|
||||
>ul.description {
|
||||
display: none;
|
||||
}
|
||||
|
||||
>div.other {
|
||||
grid-column: 1;
|
||||
grid-row: unset;
|
||||
margin-top: 1em;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media (width < 800px) {
|
||||
body {
|
||||
>main {
|
||||
section#facer {
|
||||
grid-template-columns: 70vw;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media (width < 600px) {
|
||||
body {
|
||||
>main {
|
||||
section#facer {
|
||||
grid-template-columns: 80vw;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,83 +1,36 @@
|
||||
@charset "UTF-8";
|
||||
|
||||
body {
|
||||
main {
|
||||
>h1#title {
|
||||
z-index: 200;
|
||||
margin: unset;
|
||||
margin-top: 4rem;
|
||||
margin-bottom: 2rem;
|
||||
width: max-content;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
text-align: center;
|
||||
gap: 0.6rem;
|
||||
font-family: "";
|
||||
font-size: min(8vw, 4rem);
|
||||
font-weight: 400;
|
||||
/* scale: 0.8; */
|
||||
color: #fff;
|
||||
|
||||
>span.slogan {
|
||||
line-height: 0.8em;
|
||||
font-family: "GOST";
|
||||
font-weight: 400;
|
||||
font-size: 1.24em;
|
||||
color: #3688a2;
|
||||
}
|
||||
|
||||
>a.kodorvan {
|
||||
line-height: 0.8em;
|
||||
font-family: "MT Sans";
|
||||
font-size: 2em;
|
||||
text-decoration: unset;
|
||||
color: #c2ff98;
|
||||
/* text-shadow:
|
||||
0px 0px 4px #ffff00b5,
|
||||
0px 0px 11px #ffff008a */
|
||||
}
|
||||
}
|
||||
|
||||
>main {
|
||||
>article#offer {
|
||||
background: #fff;
|
||||
z-index: 500;
|
||||
border-radius: 1.25rem;
|
||||
margin: 3rem 10vw 8rem;
|
||||
padding: 1rem 4rem;
|
||||
margin: 3rem 0 8rem;
|
||||
width: 880px;
|
||||
box-sizing: border-box;
|
||||
padding: 3rem 4rem;
|
||||
background: #fff;
|
||||
|
||||
>h1 {}
|
||||
>h1 {
|
||||
margin-top: unset;
|
||||
margin-bottom: 2.5rem;
|
||||
text-align: center;
|
||||
font-family: "MT Sans";
|
||||
font-size: 3rem;
|
||||
font-weight: 400;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
>div.vignette {
|
||||
z-index: 100;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
justify-self: center;
|
||||
align-self: center;
|
||||
pointer-events: none;
|
||||
background: linear-gradient(90deg, #000B -20%, #0000 50%, #000B 120%);
|
||||
}
|
||||
|
||||
>div.dots {
|
||||
--dot-bg: #18333f;
|
||||
--dot-color: #041825;
|
||||
--dot-size: 23px;
|
||||
--dot-space: 24px;
|
||||
z-index: -50;
|
||||
position: fixed;
|
||||
top: -200%;
|
||||
left: -200vw;
|
||||
top: -200%;
|
||||
justify-self: center;
|
||||
align-self: center;
|
||||
width: 400vw;
|
||||
min-height: 1000px;
|
||||
height: 800%;
|
||||
rotate: -16deg;
|
||||
pointer-events: none;
|
||||
background: linear-gradient(90deg, var(--dot-bg) calc(var(--dot-space) - var(--dot-size)), transparent 1%) center / var(--dot-space) var(--dot-space), linear-gradient(var(--dot-bg) calc(var(--dot-space) - var(--dot-size)), transparent 1%) center / var(--dot-space) var(--dot-space), var(--dot-color);
|
||||
@media (width < 1000px) {
|
||||
body {
|
||||
>main {
|
||||
>article#offer {
|
||||
margin-bottom: unset;
|
||||
width: 100%;
|
||||
border-radius: unset;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
306
kodorvan/site/system/public/themes/default/css/pages/system/superpack/create.css
Executable file
@@ -0,0 +1,306 @@
|
||||
@charset "UTF-8";
|
||||
|
||||
body {
|
||||
>main {
|
||||
>article#superpack {
|
||||
z-index: 500;
|
||||
border-radius: 1.25rem;
|
||||
margin: 3rem 0 8rem;
|
||||
width: 540px;
|
||||
box-sizing: border-box;
|
||||
padding: 2rem;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 1.4rem;
|
||||
background: #fff;
|
||||
|
||||
>h1 {
|
||||
margin-top: unset;
|
||||
margin-bottom: 0.2rem;
|
||||
text-align: center;
|
||||
font-family: "MT Sans";
|
||||
font-size: 2.6rem;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
|
||||
&:is(.loading) {
|
||||
>div.loading {
|
||||
opacity: 1;
|
||||
height: 100%;
|
||||
transition: opacity 0.1s ease-in, height 0s linear 0s;
|
||||
}
|
||||
}
|
||||
|
||||
>div.loading {
|
||||
z-index: 1000;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 0%;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
opacity: 0;
|
||||
pointer-events: all;
|
||||
background: #2c2c33d4;
|
||||
backdrop-filter: blur(1.4px);
|
||||
transition: opacity 0.2s ease-out, height 0s linear 0.2s;
|
||||
|
||||
&:before {
|
||||
margin-top: 50px;
|
||||
position: absolute;
|
||||
content: var(--project-loading, "Loading");
|
||||
width: max-content;
|
||||
text-align: center;
|
||||
font-family: "Geologica";
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
font-size: 0.6rem;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
>i.icon.loading.spinner {
|
||||
color: #fff;
|
||||
}
|
||||
}
|
||||
|
||||
small.guide {
|
||||
padding: 0 0.2em;
|
||||
display: none;
|
||||
font-family: Bahnschrift;
|
||||
font-size: 0.75em;
|
||||
font-weight: 200;
|
||||
color: #29262b;
|
||||
|
||||
&:is(.active) {
|
||||
display: inline;
|
||||
}
|
||||
}
|
||||
|
||||
>section {
|
||||
--shadow: 0px 10px 8px -4px rgba(0, 0, 0, 0.15);
|
||||
position: relative;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 0.8em;
|
||||
|
||||
span {
|
||||
font-family: Bahnschrift;
|
||||
font-weight: 300;
|
||||
}
|
||||
|
||||
|
||||
>span {
|
||||
font-size: 0.85em;
|
||||
}
|
||||
|
||||
textarea {
|
||||
margin-top: 0.2em;
|
||||
min-width: 100%;
|
||||
max-width: 100%;
|
||||
width: 100%;
|
||||
min-height: 8ch;
|
||||
max-height: 60vh;
|
||||
resize: vertical;
|
||||
}
|
||||
|
||||
>:is(label, div).input.icon {
|
||||
--title-height: 0.9em;
|
||||
display: grid;
|
||||
grid-template-columns: 1.3em auto;
|
||||
grid-template-rows: var(--title-height, 1em) repeat(2, auto);
|
||||
align-items: center;
|
||||
grid-column-gap: 0.5em;
|
||||
grid-row-gap: 0.2em;
|
||||
|
||||
>img.icon {
|
||||
grid-column: 1;
|
||||
grid-row: 2/3;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
>span.title {
|
||||
grid-column: 2;
|
||||
grid-row: 1;
|
||||
/* margin-bottom: 0.2em; */
|
||||
font-size: var(--title-height, 1em);
|
||||
padding: 0 0.5em;
|
||||
font-weight: 400;
|
||||
font-family: 'Cascadia Code';
|
||||
}
|
||||
|
||||
>:is(input, select, textarea) {
|
||||
grid-column: 2;
|
||||
grid-row: 2;
|
||||
width: 100%;
|
||||
border-radius: 0;
|
||||
}
|
||||
|
||||
>small.guide {
|
||||
grid-column: 2;
|
||||
grid-row: 3;
|
||||
margin-top: 0.2em;
|
||||
}
|
||||
}
|
||||
|
||||
>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 {
|
||||
padding: 1.2rem 1rem;
|
||||
font-size: 1.1rem;
|
||||
/* border: unset; */
|
||||
|
||||
&:first-of-type {
|
||||
margin-top: 2rem;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@media (width < 1000px) {
|
||||
body {
|
||||
>main {
|
||||
>article#superpack {
|
||||
margin-bottom: unset;
|
||||
width: 100%;
|
||||
border-radius: unset;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -20,26 +20,123 @@
|
||||
--cookies-width: 24rem;
|
||||
--cookies-height: 4rem;
|
||||
|
||||
font-family: "Commissioner";
|
||||
font-family: "Share Tech Mono";
|
||||
font-family: "Montserrat";
|
||||
font-family: "Alumni Sans Pinstripe";
|
||||
font-family: "DejaVu";
|
||||
font-family: "Fira";
|
||||
font-family: "Hack";
|
||||
font-family: "Nunito", "DejaVu", sans-serif;
|
||||
font-family: "Golos", sans-serif;
|
||||
text-decoration: none;
|
||||
outline: none;
|
||||
border: none;
|
||||
transition: 0.1s ease-out;
|
||||
overscroll-behavior: none;
|
||||
}
|
||||
|
||||
::selection {
|
||||
color: #000;
|
||||
background: #FF2;
|
||||
text-shadow: none;
|
||||
}
|
||||
|
||||
::-moz-selection {
|
||||
color: #000;
|
||||
background: #FF2;
|
||||
text-shadow: none;
|
||||
}
|
||||
|
||||
.important {
|
||||
&::selection {
|
||||
color: #000;
|
||||
background: #F22;
|
||||
text-shadow: none;
|
||||
}
|
||||
|
||||
&::-moz-selection {
|
||||
color: #000;
|
||||
background: #F22;
|
||||
text-shadow: none;
|
||||
}
|
||||
}
|
||||
|
||||
body {
|
||||
margin: unset;
|
||||
width: 100vw;
|
||||
height: 100%;
|
||||
-webkit-overflow-scrolling: touch;
|
||||
overflow-x: hidden;
|
||||
background: var(--background-color, #fff);
|
||||
background: var(--background-gradient);
|
||||
overflow-y: scroll;
|
||||
overscroll-behavior: none;
|
||||
|
||||
/* background: var(--background-color, #fff);
|
||||
background: var(--background-gradient); */
|
||||
background-color: #020c13;
|
||||
|
||||
>div.vignette {
|
||||
z-index: -100;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
width: 100vw;
|
||||
min-height: 5000px;
|
||||
height: 100vh;
|
||||
justify-self: center;
|
||||
align-self: center;
|
||||
pointer-events: none;
|
||||
background: linear-gradient(90deg, #000B -20%, #0000 50%, #000B 120%);
|
||||
transform-origin: top center;
|
||||
}
|
||||
|
||||
>div.dots {
|
||||
--dot-bg: #18333f;
|
||||
--dot-color: #041825;
|
||||
--dot-size: 23px;
|
||||
--dot-space: 24px;
|
||||
z-index: -500;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: min(-30vw, -300px);
|
||||
justify-self: center;
|
||||
align-self: center;
|
||||
width: max(250vw, 600px);
|
||||
min-height: 5000px;
|
||||
height: 200vh;
|
||||
rotate: -16deg;
|
||||
pointer-events: none;
|
||||
background: linear-gradient(90deg, var(--dot-bg) calc(var(--dot-space) - var(--dot-size)), transparent 1%) center / var(--dot-space) var(--dot-space), linear-gradient(var(--dot-bg) calc(var(--dot-space) - var(--dot-size)), transparent 1%) center / var(--dot-space) var(--dot-space), var(--dot-color);
|
||||
transform-origin: top left;
|
||||
}
|
||||
}
|
||||
|
||||
a {
|
||||
text-decoration: unset;
|
||||
color: var(--link-color);
|
||||
|
||||
&:is(:hover, :focus) {
|
||||
color: var(--link-hover-color);
|
||||
}
|
||||
|
||||
&:active {
|
||||
color: var(--link-active-color);
|
||||
}
|
||||
|
||||
&::selection {
|
||||
color: #00F;
|
||||
background: #FF2;
|
||||
text-shadow: none;
|
||||
}
|
||||
|
||||
&::-moz-selection {
|
||||
color: #00f;
|
||||
background: #FF2;
|
||||
text-shadow: none;
|
||||
}
|
||||
|
||||
/* &:is(.darked)::selection {
|
||||
background: #000;
|
||||
}
|
||||
|
||||
&:is(.darked)::-moz-selection {
|
||||
background: #000;
|
||||
} */
|
||||
|
||||
&:is(.tech) {
|
||||
font-family: "Cascadia Code";
|
||||
}
|
||||
}
|
||||
|
||||
.unselectable {
|
||||
@@ -51,6 +148,10 @@ body {
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.underline {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
input[type="range"] {
|
||||
cursor: grab;
|
||||
|
||||
@@ -61,12 +162,14 @@ input[type="range"] {
|
||||
|
||||
input:not([type="range"]) {
|
||||
margin: unset;
|
||||
margin-right: 0.8em;
|
||||
padding: 0.2em 0.4em 0.3em;
|
||||
box-sizing: border-box;
|
||||
font-size: 1em;
|
||||
outline: unset;
|
||||
border: unset;
|
||||
border-bottom: 1px solid;
|
||||
border-radius: unset;
|
||||
background: unset;
|
||||
}
|
||||
|
||||
@@ -98,38 +201,45 @@ select {
|
||||
|
||||
textarea {
|
||||
margin: unset;
|
||||
padding: 0.5em 0.7em;
|
||||
padding: 0.8em 1.2em;
|
||||
box-sizing: border-box;
|
||||
font-size: 1em;
|
||||
font-size: 0.8em;
|
||||
outline: unset;
|
||||
border: 1px solid;
|
||||
border-bottom: 1px solid;
|
||||
background: unset;
|
||||
}
|
||||
|
||||
button {
|
||||
padding: 0.77em 1.3em 0.6em;
|
||||
cursor: pointer;
|
||||
button,
|
||||
a.button {
|
||||
font-family: Bahnschrift;
|
||||
font-weight: 400;
|
||||
cursor: pointer;
|
||||
outline: unset;
|
||||
border-radius: 0.75rem;
|
||||
border: 1px solid #000;
|
||||
background: unset;
|
||||
|
||||
&:not(:disabled) {
|
||||
&:is(:hover, :focus) {
|
||||
background-color: #e7e6e0;
|
||||
}
|
||||
|
||||
&:active {
|
||||
background-color: #c0bfb4;
|
||||
}
|
||||
}
|
||||
|
||||
&:disabled {
|
||||
cursor: not-allowed;
|
||||
background-color: #08111d17;
|
||||
filter: grayscale(1) brightness(0.8);
|
||||
}
|
||||
|
||||
&:not(.inline) {
|
||||
padding: 0.77em 1.3em 0.6em;
|
||||
border-radius: 0.75rem;
|
||||
border: 1px solid #000;
|
||||
|
||||
&:not(:disabled) {
|
||||
&:is(:hover, :focus) {
|
||||
background-color: #e7e6e0;
|
||||
}
|
||||
|
||||
&:active {
|
||||
background-color: #c0bfb4;
|
||||
}
|
||||
}
|
||||
|
||||
&:disabled {
|
||||
background-color: #08111d17;
|
||||
filter: grayscale(1) brightness(0.55);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
0
kodorvan/site/system/public/themes/default/images/cookie.png
Normal file → Executable file
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 5.7 KiB |
0
kodorvan/site/system/public/themes/default/images/excel.png
Normal file → Executable file
|
Before Width: | Height: | Size: 83 KiB After Width: | Height: | Size: 83 KiB |
0
kodorvan/site/system/public/themes/default/images/excel_compressed.png
Normal file → Executable file
|
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 65 KiB |
0
kodorvan/site/system/public/themes/default/images/excel_small_compressed.jpg
Normal file → Executable file
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
@@ -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="M18.2426 7.17154L16.8284 5.75732L7.75739 14.8283L7.75739 10.2427H5.75739L5.75739 18.2427H13.7574V16.2427L9.17144 16.2427L18.2426 7.17154Z"
|
||||
fill="currentColor"
|
||||
/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 296 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="M5.75739 7.17154L7.1716 5.75732L16.2426 14.8283L16.2426 10.2427H18.2426L18.2426 18.2427H10.2426V16.2427L14.8285 16.2427L5.75739 7.17154Z"
|
||||
fill="currentColor"
|
||||
/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 295 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="M11.0001 3.67157L13.0001 3.67157L13.0001 16.4999L16.2426 13.2574L17.6568 14.6716L12 20.3284L6.34314 14.6716L7.75735 13.2574L11.0001 16.5001L11.0001 3.67157Z"
|
||||
fill="currentColor"
|
||||
/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 315 B |
|
Before Width: | Height: | Size: 307 B After Width: | Height: | Size: 307 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="M13.0125 19.162L14.8246 17.3398L16.2427 18.7501L12.012 23.0046L7.75726 18.7739L9.16751 17.3557L11.0126 19.1905L10.998 0.997021L12.998 0.995422L13.0125 19.162Z"
|
||||
fill="currentColor"
|
||||
/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 317 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="M1.02698 11.9929L5.26242 16.2426L6.67902 14.8308L4.85766 13.0033L22.9731 13.0012L22.9728 11.0012L4.85309 11.0033L6.6886 9.17398L5.27677 7.75739L1.02698 11.9929Z"
|
||||
fill="currentColor"
|
||||
/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 319 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="M23.0677 11.9929L18.818 7.75739L17.4061 9.17398L19.2415 11.0032L0.932469 11.0012L0.932251 13.0012L19.2369 13.0032L17.4155 14.8308L18.8321 16.2426L23.0677 11.9929Z"
|
||||
fill="currentColor"
|
||||
/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 321 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="M12.0321 1.01712L7.75751 5.22761L9.161 6.65246L11.0197 4.82165L10.9644 22.9768L12.9644 22.9829L13.0195 4.86974L14.8177 6.69525L16.2425 5.29175L12.0321 1.01712Z"
|
||||
fill="currentColor"
|
||||
/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 318 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="M15.0378 6.34317L13.6269 7.76069L16.8972 11.0157L3.29211 11.0293L3.29413 13.0293L16.8619 13.0157L13.6467 16.2459L15.0643 17.6568L20.7079 11.9868L15.0378 6.34317Z"
|
||||
fill="currentColor"
|
||||
/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 320 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="M13.4747 5.49475L13.4793 7.49475L8.92175 7.50541L18.5253 17.0896L17.1125 18.5052L7.48259 8.89473L7.49339 13.5088L5.49339 13.5134L5.47467 5.51345L13.4747 5.49475Z"
|
||||
fill="currentColor"
|
||||
/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 320 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="M10.5253 5.49475L10.5206 7.49475L15.0782 7.50541L5.47473 17.0896L6.88752 18.5052L16.5173 8.89479L16.5065 13.5088L18.5065 13.5134L18.5253 5.51345L10.5253 5.49475Z"
|
||||
fill="currentColor"
|
||||
/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 320 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="M17.6568 8.96219L16.2393 10.3731L12.9843 7.10285L12.9706 20.7079L10.9706 20.7059L10.9843 7.13806L7.75404 10.3532L6.34314 8.93572L12.0132 3.29211L17.6568 8.96219Z"
|
||||
fill="currentColor"
|
||||
/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 320 B |
0
kodorvan/site/system/public/themes/default/images/icons/assign.svg
Normal file → Executable file
|
Before Width: | Height: | Size: 522 B After Width: | Height: | Size: 522 B |
@@ -0,0 +1,30 @@
|
||||
<svg
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
>
|
||||
<path
|
||||
d="M11.9389 9.76478C11.7055 10.2653 11.1105 10.4819 10.61 10.2485C10.1094 10.0151 9.89288 9.42008 10.1263 8.91954C10.3597 8.419 10.9547 8.20244 11.4552 8.43585C11.9558 8.66925 12.1723 9.26423 11.9389 9.76478Z"
|
||||
fill="currentColor"
|
||||
/>
|
||||
<path
|
||||
d="M8.9195 13.8737C9.42004 14.1071 10.015 13.8905 10.2484 13.39C10.4818 12.8895 10.2653 12.2945 9.76474 12.0611C9.2642 11.8277 8.66922 12.0442 8.43581 12.5448C8.20241 13.0453 8.41896 13.6403 8.9195 13.8737Z"
|
||||
fill="currentColor"
|
||||
/>
|
||||
<path
|
||||
d="M13.8737 15.0805C13.6403 15.581 13.0453 15.7976 12.5447 15.5642C12.0442 15.3308 11.8276 14.7358 12.061 14.2352C12.2944 13.7347 12.8894 13.5181 13.39 13.7516C13.8905 13.985 14.1071 14.5799 13.8737 15.0805Z"
|
||||
fill="currentColor"
|
||||
/>
|
||||
<path
|
||||
d="M14.2352 11.9389C14.7357 12.1723 15.3307 11.9558 15.5641 11.4552C15.7975 10.9547 15.581 10.3597 15.0804 10.1263C14.5799 9.89292 13.9849 10.1095 13.7515 10.61C13.5181 11.1106 13.7347 11.7055 14.2352 11.9389Z"
|
||||
fill="currentColor"
|
||||
/>
|
||||
<path
|
||||
fill-rule="evenodd"
|
||||
clip-rule="evenodd"
|
||||
d="M17.0714 1.12432C14.0682 -0.276119 10.4983 1.02321 9.09783 4.02645L4.02641 14.9021C2.62598 17.9054 3.92531 21.4753 6.92855 22.8757C9.93179 24.2761 13.5017 22.9768 14.9021 19.9736L19.9735 9.09787C21.374 6.09463 20.0746 2.52475 17.0714 1.12432ZM13.9347 17.3157L17.3157 10.0653L10.0652 6.6843L6.68427 13.9348L13.9347 17.3157ZM13.0895 19.1283L5.83903 15.7474C4.90541 17.7495 5.77163 20.1295 7.77379 21.0631C9.77595 21.9967 12.1559 21.1305 13.0895 19.1283ZM16.2262 2.93693C18.2283 3.87055 19.0945 6.25047 18.1609 8.25264L10.9104 4.87169C11.8441 2.86953 14.224 2.00331 16.2262 2.93693Z"
|
||||
fill="currentColor"
|
||||
/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
0
kodorvan/site/system/public/themes/default/images/icons/bell.svg
Normal file → Executable file
|
Before Width: | Height: | Size: 502 B After Width: | Height: | Size: 502 B |
21
kodorvan/site/system/public/themes/default/images/icons/bold/close.svg
Executable file
@@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
fill="none"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<defs
|
||||
id="defs1" />
|
||||
<path
|
||||
style="fill:#ffffff;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-miterlimit:5;stroke-dasharray:none;paint-order:stroke fill markers"
|
||||
d="m 5.5,5.5 13,13"
|
||||
id="path2" />
|
||||
<path
|
||||
style="fill:#ffffff;stroke:#000000;stroke-width:4;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:5;stroke-dasharray:none;paint-order:stroke fill markers"
|
||||
d="m 18.5,5.5 -13,13"
|
||||
id="path3" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 702 B |
9
kodorvan/site/system/public/themes/default/images/icons/bolt.svg
Executable file
@@ -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 |