i am bored

This commit is contained in:
root 2023-08-06 06:20:59 +00:00
commit b6a4e3d561
220 changed files with 8269 additions and 0 deletions

3
.gitignore vendored Executable file
View File

@ -0,0 +1,3 @@
!.gitignore
composer.phar
vendor

11
LICENSE Executable file
View File

@ -0,0 +1,11 @@
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Version 2, December 2004
Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it is allowed as long as the name is changed.
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. You just DO WHAT THE FUCK YOU WANT TO.

1
README.md Executable file
View File

@ -0,0 +1 @@
# site-repression

49
composer.json Executable file
View File

@ -0,0 +1,49 @@
{
"name": "mirzaev/site-repression",
"description": "",
"readme": "README.md",
"keywords": [
"repression",
"site"
],
"type": "site",
"homepage": "https://git.mirzaev.sexy/mirzaev/site-repression",
"license": "WTFPL",
"authors": [
{
"name": "Arsen Mirzaev Tatyano-Muradovich",
"email": "arsen@mirzaev.sexy",
"homepage": "https://mirzaev.sexy",
"role": "Programmer"
}
],
"support": {
"docs": "https://git.mirzaev.sexy/mirzaev/site-repression/manual",
"issues": "https://git.mirzaev.sexy/mirzaev/site-repression/issues"
},
"require": {
"php": "~8.2",
"ext-sodium": "~8.2",
"mirzaev/minimal": "^2.0.x-dev",
"mirzaev/accounts": "~1.2.x-dev",
"mirzaev/arangodb": "^1.0.0",
"mirzaev/vk": "^4.0",
"triagens/arangodb": "~3.9.x-dev",
"twig/twig": "^3.4",
"guzzlehttp/guzzle": "^7.5",
"ipinfo/ipinfo": "^3.0"
},
"require-dev": {
"phpunit/phpunit": "~9.5"
},
"autoload": {
"psr-4": {
"mirzaev\\site\\repression\\": "mirzaev/site/repression/system"
}
},
"autoload-dev": {
"psr-4": {
"mirzaev\\site\\repression\\tests\\": "mirzaev/site/repression/tests"
}
}
}

3302
composer.lock generated Executable file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,60 @@
<?php
declare(strict_types=1);
namespace mirzaev\site\repression\controllers;
// Файлы проекта
use mirzaev\site\repression\views\manager;
use mirzaev\site\repression\models\core as models;
use mirzaev\site\repression\models\account_model as account;
use mirzaev\site\repression\models\session_model as session;
// Библиотека для ArangoDB
use ArangoDBClient\Document as _document;
// Фреймворк PHP
use mirzaev\minimal\controller;
// Фреймворк ВКонтакте
use mirzaev\vk\core as vk;
use mirzaev\vk\robots\user as robot;
/**
* Ядро контроллеров
*
* @package mirzaev\site\repression\controllers
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/
class core extends controller
{
/**
* Переменные окружения
*/
protected robot $vk;
/**
* Переменные окружения
*/
protected array $variables = [];
/**
* Конструктор
*
* @return void
*/
public function __construct() {
parent::__construct();
// Инициализация ядра моделей (соединение с базой данных...)
new models();
// Инициализация журнала ошибок
$this->variables['errors'] = [
'vk' => []
];
// Инициализация препроцессора представления
$this->view = new manager;
}
}

View File

@ -0,0 +1,44 @@
<?php
declare(strict_types=1);
namespace mirzaev\site\repression\controllers;
// Файлы проекта
use mirzaev\site\repression\controllers\core;
/**
* Контроллер ошибок
*
* @package mirzaev\site\repression\controllers
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/
final class error_controller extends core
{
/**
* Страница с ошибкой
*
* @param array $parameters
*/
public function index(array $parameters = []): ?string
{
// Запись текста ошибки в переменную окружения
$this->variables['text'] = $parameters['text'] ?? null;
if (isset($parameters['code'])) {
// Получен код ошибки
// Запись кода ошибки в переменную окружения
$this->variables['code'] = $parameters['code'];
// Запись кода ответа
http_response_code($parameters['code']);
// Генерация представления
return $this->view->render(DIRECTORY_SEPARATOR . 'errors' . DIRECTORY_SEPARATOR . 'index.html', $this->variables);
}
// Генерация представления
return $this->view->render(DIRECTORY_SEPARATOR . 'errors' . DIRECTORY_SEPARATOR . ($parameters['code'] ?? 'index') . '.html', $this->variables);
}
}

View File

@ -0,0 +1,82 @@
<?php
declare(strict_types=1);
namespace mirzaev\site\repression\controllers;
// Файлы проекта
use mirzaev\site\repression\controllers\core;
/**
* Контроллер бегущей строки
*
* @package mirzaev\site\repression\controllers
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/
final class hotline_controller extends core
{
/**
* Страница с бегущей строкой
*
* Можно использовать совместно с элементом <iframe> для изоляции
* содержимого бегущей строки от поисковых роботов
*
* @param array $parameters
*/
public function index(array $parameters = []): ?string
{
// Инициализация элементов для генерации в головном элементе
$this->variables['head'] = [
'title' => 'Бегущая строка',
'metas' => [
[
'attributes' => [
'name' => 'robots',
'content' => 'nofollow'
]
]
]
];
// Инициализация бегущей строки
$this->variables['hotline'] = [
'id' => $this->variables['request']['id'] ?? 'hotline'
];
// Инициализация параметров бегущей строки
$this->variables['hotline']['parameters'] = [
// 'step' => 2
];
// Инициализация аттрибутов бегущей строки
$this->variables['hotline']['attributes'] = [
];
// Инициализация элементов бегущей строки
$this->variables['hotline']['elements'] = [
['content' => '1'],
[
'tag' => 'article',
'content' => '2'
],
['content' => '3'],
['content' => '4'],
['content' => '5'],
['content' => '6'],
['content' => '7'],
['content' => '8'],
['content' => '9'],
['content' => '10'],
['content' => '11'],
['content' => '12'],
['content' => '13'],
['content' => '14'],
['content' => '15']
];
// Генерация представления
return $this->view->render(DIRECTORY_SEPARATOR . 'hotline' . DIRECTORY_SEPARATOR . 'index.html', $this->variables);
}
}

View File

@ -0,0 +1,50 @@
<?php
declare(strict_types=1);
namespace mirzaev\site\repression\controllers;
// Файлы проекта
use mirzaev\site\repression\controllers\core,
mirzaev\site\repression\models\views;
/**
* Контроллер основной страницы
*
* @package mirzaev\site\repression\controllers
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/
final class index_controller extends core
{
/**
* Главная страница
*
* @param array $parameters Параметры запроса
*/
public function index(array $parameters = []): ?string
{
// Инициализация шутника
$this->variables['troller'] = [
'instasamka' => rand(1, 11),
'southern' => rand(1, 3),
'vk' => (bool) rand(0, 1),
'whatsapp' => (bool) rand(0, 1),
'iphone' => (bool) rand(0, 1),
];
// Запись просмотра
views::increase();
// Инициализация счётчика просмотров
$this->variables['views'] = [
'day' => views::day(),
'week' => views::week(),
'month' => views::month(),
'all' => views::all(),
'last' => views::last(10)
];
// Генерация представления
return $this->view->render(DIRECTORY_SEPARATOR . 'index.html', $this->variables);
}
}

View File

@ -0,0 +1,154 @@
<?php
declare(strict_types=1);
namespace mirzaev\site\repression\models;
// Фреймворк PHP
use mirzaev\minimal\model;
// Фреймворк ArangoDB
use mirzaev\arangodb\connection as arangodb;
use exception;
/**
* Ядро моделей
*
* @package mirzaev\site\repression\models
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/
class core extends model
{
/**
* Соединение с базой данных ArangoDB
*/
protected static arangodb $arangodb;
/**
* Путь до файла с настройками подключения к базе данных ArangoDB
*/
final public const ARANGODB = '../settings/arangodb.php';
/**
* Конструктор
*
* @param bool $initialize Инициализировать контроллер?
* @param ?arangodb $arangodb Инстанция соединения с базой данных ArangoDB
*/
public function __construct(bool $initialize = true, ?arangodb $arangodb = null)
{
if ($initialize) {
// Запрошена инициализация
if (isset($arangodb)) {
// Получена инстанция соединения с базой данных
// Запись и инициализация соединения с базой данных
$this->__set('arangodb', $arangodb);
} else {
// Не получена инстанция соединения с базой данных
// Инициализация соединения с базой данных по умолчанию
$this->__get('arangodb');
}
}
}
/**
* Записать свойство
*
* @param string $name Название
* @param mixed $value Значение
*/
public function __set(string $name, mixed $value = null): void
{
match ($name) {
'arangodb' => (function () use ($value) {
if ($this->__isset('arangodb')) {
// Свойство уже было инициализировано
// Выброс исключения (неудача)
throw new exception('Запрещено реинициализировать соединение с базой данных ($this->arangodb)', 500);
} else {
// Свойство ещё не было инициализировано
if ($value instanceof arangodb) {
// Передано подходящее значение
// Запись свойства (успех)
self::$arangodb = $value;
} else {
// Передано неподходящее значение
// Выброс исключения (неудача)
throw new exception('Соединение с базой данных ($this->arangodb) должен быть инстанцией mirzaev\arangodb\connection', 500);
}
}
})(),
default => parent::__set($name, $value)
};
}
/**
* Прочитать свойство
*
* @param string $name Название
*
* @return mixed Содержимое
*/
public function __get(string $name): mixed
{
return match ($name) {
'arangodb' => (function () {
if (!$this->__isset('db')) {
// Свойство не инициализировано
// Инициализация значения по умолчанию исходя из настроек
$this->__set('arangodb', new arangodb(require static::ARANGODB));
}
return self::$arangodb;
})(),
default => parent::__get($name)
};
}
/**
* Проверить свойство на инициализированность
*
* @param string $name Название
*/
public function __isset(string $name): bool
{
return match ($name) {
default => parent::__isset($name)
};
}
/**
* Удалить свойство
*
* @param string $name Название
*/
public function __unset(string $name): void
{
match ($name) {
default => parent::__isset($name)
};
}
/**
* Статический вызов
*
* @param string $name Название
* @param array $arguments Параметры
*/
public static function __callStatic(string $name, array $arguments): mixed
{
match ($name) {
default => throw new exception("Не найдено свойство или функция: $name", 500)
};
}
}

View File

@ -0,0 +1,220 @@
<?php
declare(strict_types=1);
namespace mirzaev\site\repression\models;
// Фреймворк ArangoDB
use mirzaev\arangodb\collection,
mirzaev\arangodb\document;
// Фреймворк для сайта ipinfo.io
use ipinfo\ipinfo\IPinfo;
// Библиотека для ArangoDB
use ArangoDBClient\Document as _document;
// Встроенные библиотеки
use exception;
/**
* Счётчик просмотров
*
* @package mirzaev\site\repression\models
* @author Arsen Mirzaev Tatyano-Muradovich <arsen@mirzaev.sexy>
*/
class views extends core
{
/**
* Коллекция
*/
final public const COLLECTION = 'views';
public static function increase(array &$errors = []): ?bool
{
try {
if (collection::init(static::$arangodb->session, self::COLLECTION))
if ($_SERVER['HTTP_USER_AGENT'] === 'nginx-ssl early hints') return null;
else if (document::write(static::$arangodb->session, self::COLLECTION, [
'ip' => $_SERVER['REMOTE_ADDR'] ?? null,
'x-forwarded-for' => $_SERVER['HTTP_X_FORWARDED_FOR'] ?? null,
'referer' => $_SERVER['HTTP_REFERER'] ?? null,
'useragent' => $_SERVER['HTTP_USER_AGENT'] ?? null
] + (array) (new IPinfo(require '../settings/ipinfo.php'))->getDetails($_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR']))) return true;
else throw new exception('Не удалось создать аккаунт');
else throw new exception('Не удалось инициализировать коллекцию');
} catch (exception $e) {
// Запись в реестр ошибок
$errors[] = [
'text' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack' => $e->getTrace()
];
}
return false;
}
public static function day(array &$errors = []): ?int
{
try {
if (collection::init(static::$arangodb->session, self::COLLECTION))
return collection::search(static::$arangodb->session, sprintf(
<<<AQL
return COUNT_DISTINCT(
FOR d IN %s
FILTER d.created >= %d
RETURN d['x-forwarded-for']
)
AQL,
views::COLLECTION,
time() - 86400
));
else throw new exception('Не удалось инициализировать коллекцию');
} catch (exception $e) {
// Запись в реестр ошибок
$errors[] = [
'text' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack' => $e->getTrace()
];
}
return null;
}
public static function week(array &$errors = []): ?int
{
try {
if (collection::init(static::$arangodb->session, self::COLLECTION))
return collection::search(static::$arangodb->session, sprintf(
<<<AQL
return COUNT_DISTINCT(
FOR d IN %s
FILTER d.created >= %d
RETURN d['x-forwarded-for']
)
AQL,
views::COLLECTION,
time() - 604800
));
else throw new exception('Не удалось инициализировать коллекцию');
} catch (exception $e) {
// Запись в реестр ошибок
$errors[] = [
'text' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack' => $e->getTrace()
];
}
return null;
}
public static function month(array &$errors = []): ?int
{
try {
if (collection::init(static::$arangodb->session, self::COLLECTION))
return collection::search(static::$arangodb->session, sprintf(
<<<AQL
return COUNT_DISTINCT(
FOR d IN %s
FILTER d.created >= %d
RETURN d['x-forwarded-for']
)
AQL,
views::COLLECTION,
time() - 2592000
));
else throw new exception('Не удалось инициализировать коллекцию');
} catch (exception $e) {
// Запись в реестр ошибок
$errors[] = [
'text' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack' => $e->getTrace()
];
}
return null;
}
public static function all(array &$errors = []): ?int
{
try {
if (collection::init(static::$arangodb->session, self::COLLECTION))
return collection::search(static::$arangodb->session, sprintf(
<<<AQL
return COUNT_DISTINCT(
FOR d IN %s
RETURN d['x-forwarded-for']
)
AQL,
views::COLLECTION
));
else throw new exception('Не удалось инициализировать коллекцию');
} catch (exception $e) {
// Запись в реестр ошибок
$errors[] = [
'text' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack' => $e->getTrace()
];
}
return null;
}
public static function last(int $amount = 10, array &$errors = []): ?array
{
try {
if (collection::init(static::$arangodb->session, self::COLLECTION)) {
// Инициализирована коллекция
// Поиск последних просмотров
$response = @collection::search(static::$arangodb->session, sprintf(
<<<AQL
FOR ip in (
FOR d IN views
SORT d.created DESC
RETURN DISTINCT d['x-forwarded-for'] == null ? d.ip : d['x-forwarded-for']
)
LIMIT 10
RETURN (
FOR d IN views
SORT d.created DESC
FILTER d['x-forwarded-for'] == ip || d.ip == ip
LIMIT 1
RETURN d
)
AQL,
views::COLLECTION,
$amount
));
// Инициализация буфера обработанных последних просмотров
$buffer = [];
// Обработка последних просмотров
foreach ($response as $view) $buffer[] = $view->getAll()[0];
return $buffer;
} else throw new exception('Не удалось инициализировать коллекцию');
} catch (exception $e) {
// Запись в реестр ошибок
$errors[] = [
'text' => $e->getMessage(),
'file' => $e->getFile(),
'line' => $e->getLine(),
'stack' => $e->getTrace()
];
}
return null;
}
}

View File

@ -0,0 +1,36 @@
section#account {
z-index : 10000;
right : 40px;
bottom : 40px;
position: fixed;
display : flex;
}
section#account>button#login {
width : 80px;
height : 80px;
display : flex;
border-radius : 100%;
cursor : pointer;
overflow : hidden;
background-color: #221e1e;
box-shadow: 0px 3px 8px 0px rgba(0,0,0,0.65);
-webkit-box-shadow: 0px 3px 8px 0px rgba(0,0,0,0.65);
-moz-box-shadow: 0px 3px 8px 0px rgba(0,0,0,0.65);
}
section#account>button#login>i.icon.authentication {
width : 12px;
margin : auto;
color : #e6e6e6;
background-color: unset;
}
section#account>button#login:hover>i.icon.authentication {
background-color: var(--grey-dark);
}
section#account>button#login:active>i.icon.authentication {
background-color: unset;
}

View File

@ -0,0 +1,52 @@
main>section#books {
display: flex;
flex-flow: row wrap;
}
main>section#books>* {
margin-bottom: 20px;
}
main>section#books>form.upload {
width: calc(100% / 3 - 20px - 9px * 2);
height: calc(220px - 9px * 2);
margin: 5px;
margin-right: 20px;
}
main>section#books>form.upload>p {
font-size: 3rem;
height: 0.3rem;
line-height: 0;
}
main>section#books>article.book {
width: calc(100% / 3 - 20px);
margin-right: 20px;
display: flex;
flex-direction: column;
}
main>section#books>article.book:nth-child(3) {
width: calc(100% / 3);
margin-right: unset;
}
main>section#books>article.book>img {
height: 220px;
object-fit: cover;
object-position: right;
overflow: hidden;
clip-path: polygon(5px calc(100% - 5px), calc(100% - 5px) calc(100% - 5px), calc(100% - 5px) 5px, 5px 5px);
}
main>section#books>article.book>h4 {
margin-top: 5px;
margin-bottom: 10px;
height: 50px;
text-align: center;
}
main>section#books>article.book>p {
margin: unset;
}

View File

@ -0,0 +1,31 @@
section.hotline {
display: inline-flex;
height : 100%;
}
section.hotline * {
transition: unset;
}
section.hotline:last-child {
margin-bottom: unset;
}
section.hotline>article {
margin-right : 18px;
width : 140px;
height : 190px;
display : flex;
align-self : flex-end;
border-radius : 3px;
background-color: var(--background-light-1);
box-shadow : 0px -6px 6px rgba(0, 0, 0, 0.3);
}
section.hotline>article:last-child {
margin-right: unset;
}
section.hotline>article>* {
margin: auto;
}

View File

@ -0,0 +1,40 @@
.icon.authentication {
box-sizing : border-box;
position : relative;
display : block;
transform : scale(var(--ggs, 1));
width : 6px;
height : 16px;
border : 2px solid;
border-left : 0;
border-top-right-radius : 2px;
border-bottom-right-radius: 2px;
margin-right : -10px
}
.icon.authentication::after,
.icon.authentication::before {
content : "";
display : block;
box-sizing: border-box;
position : absolute
}
.icon.authentication::after {
border-top : 2px solid;
border-right: 2px solid;
transform : rotate(45deg);
width : 8px;
height : 8px;
left : -8px;
bottom : 2px
}
.icon.authentication::before {
border-radius: 3px;
width : 10px;
height : 2px;
left : -11px;
bottom : 5px;
background: currentColor;
}

View File

@ -0,0 +1,34 @@
.icon.eye {
position: relative;
display: block;
transform: scale(var(--ggs,1));
width: 24px;
height: 18px;
border-bottom-right-radius: 100px;
border-bottom-left-radius: 100px;
overflow: hidden;
box-sizing: border-box
}
.icon.eye::after,
.icon.eye::before {
content: "";
display: block;
border-radius: 100px;
position: absolute;
box-sizing: border-box
}
.icon.eye::after {
top: 2px;
box-shadow:
inset 0 -8px 0 2px,
inset 0 0 0 2px;
width: 24px;
height: 24px
}
.icon.eye::before {
width: 8px;
height: 8px;
border: 2px solid;
bottom: 4px;
left: 8px
}

View File

@ -0,0 +1,40 @@
header>div#logo {
position : relative;
height : 260px;
display : flex;
flex-direction : column;
justify-content : center;
gap : unset;
border-right : 1px solid;
border-right-color: #ccc;
border-right-color: rgba(255, 255, 255, 0.2);
background-color : rgba(255, 255, 255, 0.2);
overflow : hidden;
}
header>div#logo>h4 {
z-index: 10;
margin : 0 20px;
}
header>div#logo>h1 {
z-index : 50;
margin : 0 37px;
margin-bottom: -5px;
}
header>div#logo>#hotline_logo {
z-index : -50;
position : absolute;
-webkit-filter : blur(2px) brightness(1.3);
filter : blur(2px) brightness(1.3);
/* background-color: var(--background); */
}
header>div#logo>#hotline_logo>article {
margin-bottom: 30px;
}
aside>section#hotline {
clip-path: inset(0 0 0 250px);
}

View File

@ -0,0 +1,586 @@
@font-face {
font-family: comissioner;
src: url("/fonts/commissioner.ttf") format("ttf");
font-weight: normal;
font-style: normal;
}
:root {
--button-light-red-active: #eee4e4;
--button-light-red-hover: #ddcbcb;
--button-light-red: #eadada;
--background-light: #fff;
--background: #f00;
--background-dark: #000;
--text: #020202;
--text-light: #fafafa;
--text-hover: #fff;
--text-active: #d0d0d0;
--red-light-1: #dc4343;
--red-light: #bf3737;
--red: #a43333;
--red-dark: #8d2a2a;
--grey-light: #c0c0c0;
--grey : #858585;
--grey-dark : #565656;
}
* {
text-decoration: none;
outline: none;
border: none;
color: var(--text);
font-family: commissioner, Roboto, sans-serif;
transition: 0.1s ease-out;
}
.unselectable {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
}
a {
color: var(--red-light);
}
a:hover {
color: var(--red-light-1);
}
a:active {
color: var(--red-dark);
}
cite {
font-style: normal;
}
q {
quotes: '"' '"';
}
button {
cursor: pointer;
background-color: var(--button-light-red);
}
button:hover {
background-color: var(--button-light-red-hover);
}
button:active {
background-color: var(--button-light-red-active);
}
button[disabled]:is(:hover, :active) {
cursor: unset;
background-color: var(--button-light-red);
}
body {
margin: 0;
position: relative;
height: 100vh;
overflow-x: hidden;
background-color: black;
}
body > :is(article, section)[data-layer] {
position: fixed;
width: 100%;
display: flex;
flex-direction: column;
transition: 0.2s ease-out;
}
body > article[data-layer] {
position: absolute;
}
body > section[data-layer] > canvas.shell {
position: fixed;
width: 100%;
}
body > section[data-layer] > canvas.shell {
box-shadow: -1px 1px 47px 20px rgba(0, 0, 0, 1);
-webkit-box-shadow: -1px 1px 47px 20px rgba(0, 0, 0, 1);
-moz-box-shadow: -1px 1px 47px 20px rgba(0, 0, 0, 1);
/* outline: 10vw solid; */
filter: url("#blob");
}
body > aside {
z-index: 500;
}
body > article {
position: relative !important;
margin: 20vh auto 0 !important;
width: 800px !important;
border-radius: 10px;
background-color: var(--background-dark);
}
body > :last-child {
margin-bottom: 20vh !important;
}
body > article > div#cover {
z-index: 6000;
height: 300px;
display: flex;
overflow: hidden;
border-radius: 10px 10px 0 0;
}
body > article > div#cover > img {
width: 100%;
/* object-fit: cover;
object-position: top; */
}
body > article > header {
z-index: 5000;
top: 0;
position: sticky;
height: 80px;
overflow: hidden;
clip-path: border-box;
border-radius: 0px 0px 10px 10px;
background-color: var(--background-dark);
}
body > article > header > section {
position: relative;
height: 100%;
display: flex;
filter: blur(2.2px) contrast(30);
background: #750000;
}
body > article > header > section > h1 {
font-size: 2.5rem;
margin: auto;
color: red;
}
body > article > header > section > canvas#title {
z-index: -5000;
position: absolute;
width: 100%;
height: 100%;
}
body > article > main,
body > section.block {
z-index: 1000;
background-color: var(--background-light);
}
body > section.block {
border-radius: 10px;
margin: 20px auto 0;
width: 700px;
padding: 30px 50px;
}
body > article > main {
padding-top: 10px;
border-radius: 0 0 10px 10px;
/* box-shadow: 1px 6px 11px 3px rgba(0,0,0,0.6);
-webkit-box-shadow: 1px 6px 11px 3px rgba(0,0,0,0.6);
-moz-box-shadow: 1px 6px 11px 3px rgba(0,0,0,0.6); */
}
body > article > main > section {
position: relative;
margin: 30px 50px;
}
body > article > main > section > p.digression {
margin-left: 30px;
color: var(--grey-dark);
}
body > article > main > section > p.digression * {
color: var(--grey-dark);
}
body > article > main > section#assault > img#wet_bebra {
width: 200px;
float: right;
shape-outside: polygon(68px 202px, 200px 197px, 158px 173px, 159px 50px, 192px 25px, 165px 0px, 56px 3px, 41px 27px, 56px 42px, 112px 47px, 103px 68px, 97px 116px, 58px 120px, 40px 169px, 6px 186px);
clip-path: polygon(208px 199px, 162px 170px, 162px 54px, 194px 21px, 155px -4px, 48px 7px, 54px 43px, 103px 51px, 91px 114px, 56px 116px, 45px 165px, -1px 186px, 51px 201px, 153px 202px);
}
body > article > main > section#assault > img#scary {
margin-left: -20px;
padding-right: 10px;
width: 200px;
float: left;
shape-outside: polygon(195px 91px, 162px 77px, 191px 25px, 124px 0px, 4px 2px, 3px 198px, 122px 197px);
clip-path: polygon(208px 91px, 181px 75px, 203px 22px, 140px 1px, 58px 1px, -8px 112px, 55px 173px, 70px 201px, 136px 201px, 139px 176px, 175px 152px);
}
body > article > main > section#car > img#crying_bebra {
margin-left: -20px;
width: 200px;
float: left;
shape-outside: polygon(16px 190px, 100px 205px, 152px 197px, 159px 155px, 174px 134px, 178px 115px, 161px 101px, 147px 87px, 169px 58px, 133px 2px, 75px -7px, 20px 23px, -8px 103px);
clip-path: polygon(22px 169px, 44px 200px, 122px 207px, 165px 192px, 173px 151px, 187px 141px, 188px 108px, 169px 103px, 178px 52px, 150px 12px, 86px -7px, 41px 33px, 19px 67px);
}
body > article > main > section#car > img#chill_bebra {
margin-right: -20px;
width: 200px;
float: right;
shape-outside: polygon(-3px 194px, 42px 199px, 201px 176px, 202px 6px, 103px 3px, 81px 25px, 65px 35px, 64px 60px, 11px 61px, 1px 91px, 16px 113px, 15px 148px, -2px 158px);
clip-path: polygon(11px 126px, -6px 194px, 71px 199px, 179px 181px, 204px 90px, 175px 32px, 118px -5px, 60px 27px, 80px 102px, 52px 124px, 54px 60px, 16px 58px, -1px 83px);
}
body > article > main > section#car > img#just {
margin-left: -20px;
padding-right: 10px;
width: 200px;
float: left;
shape-outside: polygon(190px 136px, 173px 91px, 182px 55px, 166px 35px, 126px 4px, 16px 7px, 21px 184px, 151px 197px, 161px 167px);
clip-path: polygon(-6px 171px, 76px 170px, 106px 201px, 165px 198px, 193px 159px, 206px 81px, 180px 26px, 129px -5px, 63px 15px, 32px 51px, 29px 124px);
}
body > article > main > section#car > img#evil_bebra {
margin-top: 30px;
margin-right: -25px;
width: 200px;
float: right;
shape-outside: polygon(192px 220px, 159px 41px, 87px 35px, 29px 66px, 19px 113px, 24px 169px, 8px 212px);
clip-path: polygon(193px 197px, 161px 10px, 92px -8px, 19px 46px, 23px 138px, 7px 168px, 21px 196px);
}
body > article > main > section#deal > img#marta_with_broken_heart {
margin-top: 30px;
margin-right: -15px;
width: 200px;
float: right;
shape-outside: polygon(205px 226px, 210px 24px, 104px 27px, 62px 26px, 39px 63px, -7px 124px, 18px 157px, 37px 221px);
clip-path: polygon(199px 146px, 204px 26px, 125px -1px, 65px -7px, -7px 96px, 19px 169px, 62px 195px, 150px 199px);
}
body > article > main > section#deal > img#two_bebras {
margin-top: 50px;
margin-right: -10px;
width: 200px;
float: right;
shape-outside: polygon(188px 222px, 212px 145px, 133px 49px, 101px 75px, 36px 92px, 22px 167px, -8px 181px, 21px 252px);
clip-path: polygon(215px 104px, 132px -2px, 108px 22px, 33px 40px, 20px 114px, -6px 127px, 20px 201px, 177px 179px);
}
body > article > main > section#deal > img#fuck {
margin-left: -20px;
width: 200px;
float: left;
shape-outside: polygon(10px 197px, 106px 204px, 166px 184px, 159px 138px, 170px 87px, 165px 41px, 127px 2px, 75px -7px, 10px 22px, -16px 103px);
clip-path: polygon(25px 194px, 100px 207px, 180px 190px, 171px 142px, 188px 90px, 179px 46px, 152px 5px, 75px -7px, 6px 56px, 28px 144px);
}
body > article > main > section#friendship > img#no_comments {
margin-top: 50px;
margin-right: 0px;
width: 200px;
float: right;
shape-outside: polygon(199px 248px, 208px 48px, 92px 49px, 43px 94px, -12px 112px, 44px 121px, 50px 186px, 38px 248px);
clip-path: polygon(208px 115px, 200px 41px, 145px -7px, 69px 13px, 46px 44px, -10px 58px, 39px 78px, 48px 141px, 46px 187px, 121px 201px, 192px 191px);
}
body > article > main > section#friendship > img#nu_tipa {
margin-top: 100px;
margin-right: 0px;
width: 200px;
float: left;
shape-outside: polygon(183px 237px, 172px 225px, 197px 202px, 162px 188px, 158px 153px, 132px 100px, -5px 100px, -3px 291px, 184px 289px, 176px 257px);
clip-path: polygon(179px 142px, 176px 117px, 195px 100px, 163px 87px, 153px 26px, 91px -12px, 11px 39px, 1px 197px, 181px 203px, 172px 157px);
}
body > article > main > section > img {
width: 100%;
height: 200px;
object-fit: cover;
border-radius: 3px;
}
body > article > main > section#conclusion {
height: 425px;
}
body > article > main > section#conclusion > h2 {
margin-bottom: 20px;
}
body > article > main > section#conclusion > a > img {
margin-top: 30px;
margin-right: -4%;
height: 300px;
float: right;
shape-outside: polygon(136px 114px, 115px 46px, 97px 63px, 61px 72px, 37px 62px, 43px 103px, 60px 175px, 36px 178px, 33px 210px, 55px 222px, 87px 237px, 32px 300px, 55px 315px, 77px 324px, 154px 296px, 158px 260px, 179px 238px, 177px 210px, 194px 205px, 191px 186px, 145px 196px, 138px 168px, 157px 147px, 162px 123px);
clip-path: polygon(136px 80px, 122px 10px, 92px 30px, 66px 36px, 36px 32px, 36px 91px, 55px 141px, 34px 145px, 32px 181px, 41px 189px, 81px 208px, 28px 264px, 47px 287px, 81px 295px, 155px 266px, 162px 232px, 180px 212px, 179px 180px, 196px 174px, 191px 152px, 146px 157px, 145px 135px, 161px 110px, 165px 92px);
}
body > article > main > section > h2:before {
margin-right: 10px;
}
body > article > main > section#assault > h2:before {
content: '🤕';
}
body > article > main > section#reasons > h2:before {
content: '😼';
}
body > article > main > section#car > h2:before {
content: '😵';
}
body > article > main > section#deal > h2:before {
content: '🤝';
}
body > article > main > section#friendship > h2:before {
content: '🥳';
}
body > article > main > section#court > h2:before {
content: '😥';
}
body > article > main > section#return > h2:before {
content: '🥱';
}
body > article > main > section#conclusion > h2:before {
content: '🤟';
}
body > article > main > section > p + p,
body > article > main > section > p > small + small {
margin-top: 10px;
}
body > article > main > section > h2 {
font-size: 1.8rem;
}
body > article > main > section > h2 + h3 {
margin-top: 3px;
}
body > article > main > section > :is(h2, h3) {
margin-bottom: 0px;
line-height: 35px;
}
body > article > main > section > :is(h2, h3) + p {
margin-top: 15px;
}
body > article > main > section > p:last-of-type {
margin-bottom: 20px;
}
body > article > footer {
z-index: 3000;
}
body > section#contacts > section {
display: flex;
}
body > section#contacts > section#author {
margin-top: 20px;
margin-bottom: 35px;
}
body > section#contacts > section#author > section#avatar {
margin-left: 10px;
margin-right: 25px;
position: relative;
width: 100px;
height: 100px;
clip-path: circle(50px);
}
body > section#contacts > section#author > section#avatar > img {
left: 0;
top: 0;
position: absolute;
width: 100%;
height: 100%;
cursor: none;
}
body > section#contacts > section#author > section#avatar > img:first-of-type {
z-index: 1000;
transition: .2s ease-in;
}
body > section#contacts > section#author > section#avatar > img:first-of-type:hover {
opacity: 0;
transition: unset;
}
body > section#contacts > section#author > section#name {
display: flex;
flex-direction: column;
justify-content: center;
}
body > section#contacts > section#author > section#name > h3 > a {
color: var(--text);
}
body > section#contacts > section#author > section#name > h3,
body > section#contacts > section#author > section#name > p {
margin: unset;
}
body > section#contacts > section#author > section#name > p > span {
margin-left: 8px;
}
body > section#contacts > section#links {
flex-direction: column;
}
body > section#views {
display: flex;
gap: 25px;
}
body > section#views > section {
display: flex;
flex-direction: column;
overflow: hidden;
}
body > section#views > section:first-of-type {
width: calc(80% - 25px);
display: flex;
flex-direction: column;
flex-grow: 1;
}
body > section#views > section:last-of-type {
width: 20%
}
body > section#views > section:last-of-type > p:first-of-type {
margin-top: calc(1.3rem + 15px);
}
body > section#views > section > h3 {
margin: 0 0 15px;
height: 1.4rem;
display: flex;
}
body > section#views > section > h3 > i.icon {
margin-left: auto;
}
body > section#views > section > p {
margin: unset;
height: 1.2rem;
display: flex;
gap: 10px;
}
body > section#views > section > p:not(:last-of-type) {
margin: 0 0 5px 0;
}
body > section#views > section:first-of-type > p > span:nth-of-type(2) {
margin-right: auto;
max-width: 150px;
}
body > section#views > section > p > span,
body > section#views > section > p > samp > small {
text-overflow: ellipsis;
overflow: clip;
}
body > section#views > section > p > samp {
margin-right: 10px;
max-width: 80px;
display: flex;
}
body > section#views > section > p > samp > small {
margin: auto;
max-width: 100%;
display: ruby;
text-align: center;
direction: rtl;
}
body > section#views > section:first-of-type > p > span:nth-of-type(3) {
max-width: 150px;
direction: rtl;
}
body > section#views > section:last-of-type > p > span:last-of-type {
margin-left: auto;
direction: rtl;
max-width: 70px;
}
body > section#license {
position: relative;
}
body > section#license > p {
margin: 5px 0;
display: inline-flex;
flex-direction: column;
}
body > section#license > p > b {
margin-bottom: 5px;
text-align: center;
font-size: 1.3rem;
}
body > section#license > p > span:first-of-type {
text-align: center;
margin-bottom: 25px;
font-size: 1.1rem;
}
body > section#license > p > :is(span:nth-child(3), span:nth-child(4)) {
margin-bottom: 18px;
}
body > section#license > p > span:last-of-type {
margin-top: 15px;
margin-left: 30px;
}
body > section#license > img {
position: absolute;
right: -65px;
bottom: -50px;
width: 200px;
transition: 5s;
}
@media (max-width: 800px) {
body {
padding-bottom: unset;
}
}

View File

@ -0,0 +1,56 @@
section.popup {
z-index: 999999;
left: 0;
top: 0;
position: fixed;
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
background-color: #000000DD;
}
section.popup>div.wrap {
width: 320px;
padding: 30px 25px;
display: flex;
flex-direction: column;
gap: 20px;
border-radius: 2px;
background-color: var(--background-light);
}
section.popup>div.wrap>h4 {
margin: auto;
padding-top: 8px;
font-size: 1.6rem;
}
section.popup>div.wrap>p {
margin: 0px 20px;
}
section.popup>div.wrap>div.row {
width: 100%;
display: flex;
gap: 12px;
}
section.popup>div.wrap>div.row>button {
padding: 6px 20px;
border-radius: 2px;
}
section.popup>div.wrap>div.row>button:first-child {
margin-left: auto;
}
section.popup>div.wrap>div.row>button:last-child{
margin-right: auto;
}
section.popup>div.wrap>div.row>button[disabled]:is(:hover, :active) {
cursor: none;
}

View File

@ -0,0 +1,43 @@
#troller_image_what {
z-index: 9999999;
left: 0;
top: -60vh;
position: fixed;
width: 125vw;
height: 250vh;
display: none;
transition: unset;
}
#troller_image_misha {
z-index: 1488;
position: absolute;
opacity: 0;
border-radius: 3px;
pointer-events: none;
transition: 3s ease-out;
box-shadow: rgba(0, 0, 0, 0.5) 0px 2px 6px 0px;
-webkit-box-shadow: rgba(0, 0, 0, 0.5) 0px 2px 6px 0px;
-moz-box-shadow: rgba(0, 0, 0, 0.5) 0px 2px 6px 0px;
}
#troller_image_furgal {
z-index: 999999;
position: fixed;
display: none;
transition: unset;
cursor: pointer;
border-radius: 3px;
box-shadow: 0px 6px 10px 4px rgba(0,0,0,0.6);
-webkit-box-shadow: 0px 6px 10px 4px rgba(0,0,0,0.6);
-moz-box-shadow: 0px 6px 10px 4px rgba(0,0,0,0.6);
}
:is(#troller_image_what, #troller_image_furgal).active {
display: block;
}
.hide {
position: absolute;
display: none;
}

View File

@ -0,0 +1,33 @@
form.upload {
width: 100%;
height: 100px;
position: relative;
display: flex;
border: 4px dashed #e5ddd1;
}
form.upload:hover {
background-color: #ccc6bd;
border: 4px dashed #fff7ea;
}
form.upload>p {
margin: auto;
font-weight: bold;
color: #eee6d9;
}
form.upload:hover>p {
color: #fff7ea;
}
form.upload>input {
width: 100%;
height: 100%;
position: absolute;
opacity: 0;
}
form.upload:hover>input {
cursor: pointer;
}

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 229 KiB

View File

@ -0,0 +1 @@
<svg height="32" width="32" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><path fill="none" d="M0 0h32v32H0z"/><path d="M30 17.349V12h-2v-2h2V2H2v8h2v2H2v8h2v2H2v8h15.349A8.97 8.97 0 0 0 23 32a9.002 9.002 0 0 0 9-9 8.968 8.968 0 0 0-2-5.651zM14.059 22H6v-2h8.522a8.932 8.932 0 0 0-.463 2zM26 12H6v-2h20v2zM4 6h4v2H4V6zm0 10h4v2H4v-2zm4 12H4v-2h4v2zm15 1.883A6.898 6.898 0 0 1 16.115 23 6.898 6.898 0 0 1 23 16.115 6.898 6.898 0 0 1 29.883 23 6.898 6.898 0 0 1 23 29.883z"/><path d="m19 25 2 2 2-2 2 2 2-2-2-2 2-2-2-2-2 2-2-2-2 2 2 2z"/></svg>

After

Width:  |  Height:  |  Size: 552 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 995 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 968 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 944 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 972 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 836 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

Some files were not shown because too many files have changed in this diff Show More