generated from mirzaev/pot
Compare commits
2 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
1c6bbe3474 | ||
|
97c8c58ce0 |
11
README.md
11
README.md
|
@ -1,2 +1,13 @@
|
|||
# works
|
||||
Main site of the Svoboda organisation
|
||||
|
||||
## Installation
|
||||
|
||||
### NGINX
|
||||
|
||||
1. Create a NGINX server
|
||||
You can copy an example of server file from here: `/examples/nginx/svoboda.conf`
|
||||
|
||||
2. Add support for javascript modules
|
||||
Edit the file `/etc/nginx/mime.types`<br>
|
||||
`application/javascript js;` -> `application/javascript js mjs;`
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
"require": {
|
||||
"php": "^8.4",
|
||||
"triagens/arangodb": "^3.8",
|
||||
"mirzaev/minimal": "^3.2.0",
|
||||
"mirzaev/minimal": "^3.3.0",
|
||||
"mirzaev/arangodb": "^1.3",
|
||||
"twig/twig": "^3.10",
|
||||
"twig/extra-bundle": "^3.7",
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 68589e968cbc043f35c2948a9c90293b6f5f9cb9
|
|
@ -2,7 +2,7 @@ server {
|
|||
listen 80;
|
||||
listen [::]:80;
|
||||
|
||||
server_name svoboda.dev.mirzaev.sexy;
|
||||
server_name svoboda.works;
|
||||
|
||||
# 301 302
|
||||
return 301 https://$server_name$request_uri;
|
||||
|
@ -14,7 +14,7 @@ server {
|
|||
listen [::]:443 ssl;
|
||||
listen [::]:443 quic;
|
||||
|
||||
server_name svoboda.dev.mirzaev.sexy;
|
||||
server_name svoboda.works;
|
||||
|
||||
http2 on;
|
||||
http3 on;
|
||||
|
@ -31,7 +31,7 @@ server {
|
|||
keepalive_timeout 60;
|
||||
|
||||
include snippets/ssl-params.conf;
|
||||
include snippets/ssl-mirzaev.conf;
|
||||
include snippets/ssl-svoboda.conf;
|
||||
include snippets/php8_4.conf;
|
||||
|
||||
location / {
|
||||
|
@ -44,7 +44,7 @@ server {
|
|||
add_header Cache-Control "max-age=2629746, public";
|
||||
}
|
||||
|
||||
location ~* \.(?:css|js)$ {
|
||||
location ~* \.(?:css|js|mjs|min)$ {
|
||||
expires 1y;
|
||||
access_log off;
|
||||
add_header Cache-Control "max-age=31556952, public";
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 0300f3376550b9d0a07d1c41db88452af67e366b
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 81aca4001629e8f3cab8a849c1e892dbac74c88a
|
27
install.sh
27
install.sh
|
@ -1,10 +1,37 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Renaming project folder
|
||||
if [ -d author/project ]; then
|
||||
mv author/project author/works
|
||||
fi
|
||||
|
||||
# Renaming project author folder
|
||||
if [ -d author ]; then
|
||||
mv author svoboda
|
||||
fi
|
||||
|
||||
# Initializing the javascript modules folder
|
||||
if [ ! -d svoboda/works/system/public/js/modules ]; then
|
||||
mkdir -p ./svoboda/works/system/public/js/modules
|
||||
fi
|
||||
|
||||
# Updating repositories
|
||||
cd damper.mjs && git pull
|
||||
cd ../hotline.mjs && git pull
|
||||
cd ../graph.mjs && git pull
|
||||
cd ../
|
||||
|
||||
# Installing "damper.min.mjs"
|
||||
if [ ! -h svoboda/works/system/public/js/modules/damper.min.mjs ]; then
|
||||
ln -s ../../../../../../damper.mjs/damper.min.mjs svoboda/works/system/public/js/modules/damper.min.mjs
|
||||
fi
|
||||
|
||||
# installing "hotline.min.mjs"
|
||||
if [ ! -h svoboda/works/system/public/js/modules/hotline.min.mjs ]; then
|
||||
ln -s ../../../../../../hotline.mjs/hotline.min.mjs svoboda/works/system/public/js/modules/hotline.min.mjs
|
||||
fi
|
||||
|
||||
# Installing "graph.min.mjs"
|
||||
if [ ! -h svoboda/works/system/public/js/modules/graph.min.mjs ]; then
|
||||
ln -s ../../../../../../graph.mjs/graph.min.mjs svoboda/works/system/public/js/modules/graph.min.mjs
|
||||
fi
|
||||
|
|
|
@ -5,9 +5,10 @@ declare(strict_types=1);
|
|||
namespace svoboda\works\controllers;
|
||||
|
||||
// Files of the project
|
||||
use svoboda\works\views\manager,
|
||||
use svoboda\works\views\templater,
|
||||
svoboda\works\models\core as models,
|
||||
svoboda\works\models\session;
|
||||
svoboda\works\models\session,
|
||||
svoboda\works\models\enumerations\language;
|
||||
|
||||
// Framework for PHP
|
||||
use mirzaev\minimal\core as minimal,
|
||||
|
@ -71,18 +72,18 @@ class core extends controller
|
|||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param minimal $minimal Instance of the MINIMAL
|
||||
* @param minimal $core Instance of the MINIMAL
|
||||
* @param bool $initialize Initialize a controller?
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(minimal $minimal, bool $initialize = true)
|
||||
public function __construct(minimal $core, bool $initialize = true)
|
||||
{
|
||||
// Blocking requests from CloudFlare (better to write this blocking into nginx config file)
|
||||
if (isset($_SERVER['HTTP_USER_AGENT']) && $_SERVER['HTTP_USER_AGENT'] === 'nginx-ssl early hints') return status::bruh->label;
|
||||
|
||||
// For the extends system
|
||||
parent::__construct(core: $minimal);
|
||||
parent::__construct(core: $core);
|
||||
|
||||
if ($initialize) {
|
||||
// Requestet initializing
|
||||
|
@ -90,7 +91,7 @@ class core extends controller
|
|||
// Initializing core of the models
|
||||
new models();
|
||||
|
||||
// Initializing of the date until which the session will be active
|
||||
/* // Initializing of the date until which the session will be active
|
||||
$expires = strtotime('+1 week');
|
||||
|
||||
// Initializing of default value of hash of the session
|
||||
|
@ -116,10 +117,11 @@ class core extends controller
|
|||
'samesite' => 'strict'
|
||||
]
|
||||
);
|
||||
}
|
||||
} */
|
||||
|
||||
// Initializing of preprocessor of views
|
||||
$this->view = new templater($this->session);
|
||||
/* $this->view = new templater($this->session); */
|
||||
$this->view = new templater();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,7 +8,8 @@ namespace svoboda\works\controllers;
|
|||
use svoboda\works\controllers\core;
|
||||
|
||||
// Framework for PHP
|
||||
use mirzaev\minimal\http\enumerations\status;
|
||||
use mirzaev\minimal\http\enumerations\content,
|
||||
mirzaev\minimal\http\enumerations\status;
|
||||
|
||||
/**
|
||||
* Index
|
||||
|
@ -43,8 +44,80 @@ final class index extends core
|
|||
if (str_contains($this->request->headers['accept'], content::any->value)) {
|
||||
// Request for any response
|
||||
|
||||
// Initializing distributions
|
||||
$this->view->distributions = [
|
||||
[
|
||||
'identifier' => 1,
|
||||
'name' => 'Dreamers',
|
||||
'members' => [
|
||||
[
|
||||
'identifier' => 1,
|
||||
'name' => [
|
||||
'first' => 'Arsen',
|
||||
'second' => 'Mirzaev',
|
||||
'other' => 'Tatyano-Muradovich'
|
||||
]
|
||||
],
|
||||
[
|
||||
'identifier' => 2,
|
||||
'name' => [
|
||||
'first' => 'Margarita',
|
||||
'second' => 'Esenina',
|
||||
'other' => ''
|
||||
]
|
||||
],
|
||||
[
|
||||
'identifier' => 5,
|
||||
'name' => [
|
||||
'first' => 'Maxim',
|
||||
'second' => '',
|
||||
'other' => ''
|
||||
]
|
||||
],
|
||||
[
|
||||
'identifier' => 6,
|
||||
'name' => [
|
||||
'first' => 'Hidden',
|
||||
'second' => '',
|
||||
'other' => ''
|
||||
]
|
||||
],
|
||||
[
|
||||
'identifier' => 7,
|
||||
'name' => [
|
||||
'first' => 'Hidden',
|
||||
'second' => '',
|
||||
'other' => ''
|
||||
]
|
||||
]
|
||||
]
|
||||
],
|
||||
[
|
||||
'identifier' => 2,
|
||||
'name' => 'Unnamed',
|
||||
'members' => [
|
||||
[
|
||||
'identifier' => 3,
|
||||
'name' => [
|
||||
'first' => 'Pavel',
|
||||
'second' => '',
|
||||
'other' => ''
|
||||
]
|
||||
],
|
||||
[
|
||||
'identifier' => 4,
|
||||
'name' => [
|
||||
'first' => 'Georgiy',
|
||||
'second' => '',
|
||||
'other' => ''
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
];
|
||||
|
||||
// Render page
|
||||
$page = $this->view->render('index.html');
|
||||
$page = $this->view->render('/pages/statistics/total.html');
|
||||
|
||||
// Sending response
|
||||
$this->response
|
||||
|
|
|
@ -8,15 +8,6 @@ namespace svoboda\works\models;
|
|||
use mirzaev\minimal\model,
|
||||
mirzaev\minimal\http\enumerations\status;
|
||||
|
||||
// Framework for ArangoDB
|
||||
use mirzaev\arangodb\connection as arangodb,
|
||||
mirzaev\arangodb\collection,
|
||||
mirzaev\arangodb\document;
|
||||
|
||||
// Library for ArangoDB
|
||||
use ArangoDBClient\Document as _document,
|
||||
ArangoDBClient\DocumentHandler as _document_handler;
|
||||
|
||||
// Built-in libraries
|
||||
use exception;
|
||||
|
||||
|
@ -29,27 +20,12 @@ use exception;
|
|||
* @param arangodb $arangodb Instance of the ArangoDB session
|
||||
*
|
||||
* @method void __construct(bool $initialize, ?arangodb $arangodb) Constructor
|
||||
* @method _document|static|array|null read(string $filter, string $sort, int $amount, int $page, string $return, array $parameters, array &$errors) Read document from ArangoDB
|
||||
*
|
||||
* @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License
|
||||
* @author svoboda <mail@domain.zone>
|
||||
*/
|
||||
class core extends model
|
||||
{
|
||||
/**
|
||||
* ArangoDB connection daa
|
||||
*
|
||||
* @var string ARANGODB Path to the file with ArangoDB session connection data
|
||||
*/
|
||||
final public const string ARANGODB = __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'settings' . DIRECTORY_SEPARATOR . 'arangodb.php';
|
||||
|
||||
/**
|
||||
* ArangoDB
|
||||
*
|
||||
* @var arangodb $arangodb Instance of the ArangoDB session
|
||||
*/
|
||||
protected static arangodb $arangodb;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
|
@ -58,173 +34,10 @@ class core extends model
|
|||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(bool $initialize = true, ?arangodb $arangodb = null)
|
||||
public function __construct(bool $initialize = true)
|
||||
{
|
||||
// For the extends system
|
||||
parent::__construct($initialize);
|
||||
|
||||
if ($initialize) {
|
||||
// Initializing is requested
|
||||
|
||||
// Writing an instance of a session of ArangoDB to the property
|
||||
self::$arangodb = $arangodb ?? new arangodb(require static::ARANGODB);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Read document from ArangoDB
|
||||
*
|
||||
* @param string $filter Expression for filtering (AQL)
|
||||
* @param string $sort Expression for sorting (AQL)
|
||||
* @param int $amount Amount of documents for collect
|
||||
* @param int $page Page
|
||||
* @param string $return Expression describing the parameters to return (AQL)
|
||||
* @param array $parameters Binded parameters for placeholders ['placeholder' => parameter]
|
||||
* @param array &$errors Registry of errors
|
||||
*
|
||||
* @return mixed An array of instances of documents from ArangoDB, if they are found
|
||||
*/
|
||||
public static function _read(
|
||||
string $filter = '',
|
||||
string $sort = 'd.created DESC, d._key DESC',
|
||||
int $amount = 1,
|
||||
int $page = 1,
|
||||
string $return = 'd',
|
||||
array $parameters = [],
|
||||
array &$errors = []
|
||||
): _document|static|array|null {
|
||||
try {
|
||||
if (collection::initialize(static::COLLECTION, static::TYPE)) {
|
||||
// Initialized the collection
|
||||
|
||||
// Read from ArangoDB
|
||||
$result = collection::execute(
|
||||
sprintf(
|
||||
<<<'AQL'
|
||||
FOR d IN @@collection
|
||||
%s
|
||||
%s
|
||||
LIMIT @offset, @amount
|
||||
RETURN %s
|
||||
AQL,
|
||||
empty($filter) ? '' : "FILTER $filter",
|
||||
empty($sort) ? '' : "SORT $sort",
|
||||
empty($return) ? 'd' : $return
|
||||
),
|
||||
[
|
||||
'@collection' => static::COLLECTION,
|
||||
'offset' => --$page <= 0 ? 0 : $page * $amount,
|
||||
'amount' => $amount
|
||||
] + $parameters,
|
||||
errors: $errors
|
||||
);
|
||||
|
||||
if ($amount === 1 && $result instanceof _document) {
|
||||
// Received only 1 document and @todo rebuild
|
||||
|
||||
// Initializing the object
|
||||
$object = new static;
|
||||
|
||||
if (method_exists($object, '__document')) {
|
||||
// Object can implement a document from ArangoDB
|
||||
|
||||
// Writing the instance of document from ArangoDB to the implement object
|
||||
$object->__document($result);
|
||||
|
||||
// Exit (success)
|
||||
return $object;
|
||||
}
|
||||
}
|
||||
|
||||
// Exit (success)
|
||||
return $result;
|
||||
} else throw new exception('Failed to initialize ' . static::TYPE . ' collection: ' . static::COLLECTION);
|
||||
} catch (exception $e) {
|
||||
// Writing to registry of errors
|
||||
$errors[] = [
|
||||
'text' => $e->getMessage(),
|
||||
'file' => $e->getFile(),
|
||||
'line' => $e->getLine(),
|
||||
'stack' => $e->getTrace()
|
||||
];
|
||||
}
|
||||
|
||||
// Exit (fail)
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write
|
||||
*
|
||||
* @param string $name Name of the property
|
||||
* @param mixed $value Value of the property
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __set(string $name, mixed $value = null): void
|
||||
{
|
||||
match ($name) {
|
||||
'arangodb' => (function () use ($value) {
|
||||
if (isset(static::$arangodb)) throw new exception('Forbidden to reinitialize the ArangoDB session($this::$arangodb)', status::internal_server_error->value);
|
||||
else if ($value instanceof arangodb) self::$arangodb = $value;
|
||||
else throw new exception('Session of connection to ArangoDB ($this::$arangodb) is need to be mirzaev\arangodb\connection', status::internal_server_error->value);
|
||||
})(),
|
||||
default => parent::__set($name, $value)
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Read
|
||||
*
|
||||
* @param string $name Name of the property
|
||||
*
|
||||
* @return mixed Content of the property, if they are found
|
||||
*/
|
||||
public function __get(string $name): mixed
|
||||
{
|
||||
return match ($name) {
|
||||
default => parent::__get($name)
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete
|
||||
*
|
||||
* @param string $name Name of the property
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __unset(string $name): void
|
||||
{
|
||||
// Deleting a property and exit (success)
|
||||
parent::__unset($name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check of initialization
|
||||
*
|
||||
* @param string $name Name of the property
|
||||
*
|
||||
* @return bool The property is initialized?
|
||||
*/
|
||||
public function __isset(string $name): bool
|
||||
{
|
||||
// Check of initialization of the property and exit (success)
|
||||
return parent::__isset($name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Call a static property or method
|
||||
*
|
||||
* @param string $name Name of the property or the method
|
||||
* @param array $arguments Arguments for the method
|
||||
*/
|
||||
public static function __callStatic(string $name, array $arguments): mixed
|
||||
{
|
||||
return match ($name) {
|
||||
'arangodb' => (new static)->__get('arangodb'),
|
||||
default => throw new exception("Not found: $name", 500)
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1,31 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace svoboda\works\models\interfaces;
|
||||
|
||||
// Framework for ArangoDB
|
||||
use mirzaev\arangodb\enumerations\collection\type;
|
||||
|
||||
/**
|
||||
* Collection
|
||||
*
|
||||
* Interface for implementing a collection from ArangoDB
|
||||
*
|
||||
* @package svoboda\works\models\interfaces
|
||||
*
|
||||
* @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License
|
||||
* @author svoboda <mail@domain.zone>
|
||||
*/
|
||||
interface collection
|
||||
{
|
||||
/**
|
||||
* Name of the collection in ArangoDB
|
||||
*/
|
||||
public const string COLLECTION = 'THIS_COLLECTION_SHOULD_NOT_EXIST';
|
||||
|
||||
/**
|
||||
* Type of the collection in ArangoDB
|
||||
*/
|
||||
public const type TYPE = type::document;
|
||||
}
|
|
@ -1,81 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace svoboda\works\models\interfaces;
|
||||
|
||||
// Library для ArangoDB
|
||||
use ArangoDBClient\Document as _document;
|
||||
|
||||
/**
|
||||
* Document
|
||||
*
|
||||
* Interface for implementing a document instance from ArangoDB
|
||||
*
|
||||
* @param _document $document An instance of the ArangoDB document from ArangoDB (protected readonly)
|
||||
*
|
||||
* @package svoboda\works\models\interfaces
|
||||
*
|
||||
* @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License
|
||||
* @author svoboda <mail@domain.zone>
|
||||
*/
|
||||
interface document
|
||||
{
|
||||
/**
|
||||
* Write
|
||||
*
|
||||
* Write a property into an instance of the ArangoDB document
|
||||
*
|
||||
* @param string $name Name of the property
|
||||
* @param mixed $value Content of the property
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __set(string $name, mixed $value = null): void;
|
||||
|
||||
/**
|
||||
* Read
|
||||
*
|
||||
* Read a property from an instance of the ArangoDB docuemnt
|
||||
*
|
||||
* @param string $name Name of the property
|
||||
*
|
||||
* @return mixed Content of the property
|
||||
*/
|
||||
public function __get(string $name): mixed;
|
||||
|
||||
|
||||
/**
|
||||
* Delete
|
||||
*
|
||||
* Deinitialize the property in an instance of the ArangoDB document
|
||||
*
|
||||
* @param string $name Name of the property
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __unset(string $name): void;
|
||||
|
||||
/**
|
||||
* Check of initialization
|
||||
*
|
||||
* Check of initialization of the property into an instance of the ArangoDB document
|
||||
*
|
||||
* @param string $name Name of the property
|
||||
*
|
||||
* @return bool The property is initialized?
|
||||
*/
|
||||
public function __isset(string $name): bool;
|
||||
|
||||
/**
|
||||
* Execute a method
|
||||
*
|
||||
* Execute a method from an instance of the ArangoDB document
|
||||
*
|
||||
* @param string $name Name of the method
|
||||
* @param array $arguments Arguments for the method
|
||||
*
|
||||
* @return mixed Result of execution of the method
|
||||
*/
|
||||
public function __call(string $name, array $arguments = []): mixed;
|
||||
}
|
|
@ -1,206 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace svoboda\works\models\traits;
|
||||
|
||||
// Files of the project
|
||||
use svoboda\works\models\interfaces\document as document_interface,
|
||||
svoboda\works\models\interfaces\collection as collection_interface,
|
||||
svoboda\works\models\connect;
|
||||
|
||||
// Library для ArangoDB
|
||||
use ArangoDBClient\Document as _document;
|
||||
|
||||
// Framework for ArangoDB
|
||||
use mirzaev\arangodb\connection as arangodb,
|
||||
mirzaev\arangodb\document as framework_document,
|
||||
mirzaev\arangodb\collection;
|
||||
|
||||
// Built-in libraries
|
||||
use exception;
|
||||
|
||||
/**
|
||||
* Trait for implementing a document instance from ArangoDB
|
||||
*
|
||||
* @uses document_interface
|
||||
*
|
||||
* @var protected readonly _document|null $document An instance of the ArangoDB document
|
||||
*
|
||||
* @package svoboda\works\models\traits
|
||||
*
|
||||
* @license http://www.wtfpl.net/ Do What The Fuck You Want To Public License
|
||||
* @author svoboda <mail@domain.zone>
|
||||
*/
|
||||
trait document
|
||||
{
|
||||
/**
|
||||
* Document
|
||||
*
|
||||
* @var _document $document An instance of the document from ArangoDB
|
||||
*/
|
||||
protected readonly _document $document;
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param bool $initialize Initialize a model?
|
||||
* @param ?arangodb $arangodb Instance of a session of ArangoDB
|
||||
* @param _document|null|false $document An instance of the ArangoDB document
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(
|
||||
bool $initialize = true,
|
||||
?arangodb $arangodb = null,
|
||||
_document|null|false $document = false
|
||||
) {
|
||||
// For the extends system
|
||||
parent::__construct($initialize, $arangodb);
|
||||
|
||||
// Writing to the property
|
||||
if ($document instanceof _document) $this->__document($document);
|
||||
else if ($document === null) throw new exception('Failed to initialize an instance of the document from ArangoDB');
|
||||
}
|
||||
|
||||
/**
|
||||
* Write or read document
|
||||
*
|
||||
* @param _document|null $document Instance of document from ArangoDB
|
||||
*
|
||||
* @return _document|null Instance of document from ArangoDB
|
||||
*/
|
||||
public function __document(?_document $document = null): ?_document
|
||||
{
|
||||
// Writing a property storing a document instance to ArangoDB
|
||||
if ($document) $this->document ??= $document;
|
||||
|
||||
// Read a property storing a document instance to ArangoDB and exit (success)
|
||||
return $this->document ?? null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Connect
|
||||
*
|
||||
* @param collecton_interface $document Document
|
||||
* @param array &$errors Registry of errors
|
||||
*
|
||||
* @return string|null The identifier of the created edge of the "connect" collection, if created
|
||||
*/
|
||||
public function connect(collection_interface $document, array &$errors = []): ?string
|
||||
{
|
||||
try {
|
||||
if (collection::initialize(static::COLLECTION, static::TYPE, errors: $errors)) {
|
||||
if (collection::initialize(connect::COLLECTION, connect::TYPE, errors: $errors)) {
|
||||
if (collection::initialize($document::COLLECTION, $document::TYPE, errors: $errors)) {
|
||||
// Initialized collections
|
||||
|
||||
if ($this->document instanceof _document) {
|
||||
// Initialized instance of the document from ArangoDB
|
||||
|
||||
// Writing document and exit (success)
|
||||
return framework_document::write(
|
||||
connect::COLLECTION,
|
||||
[
|
||||
'_from' => $document->getId(),
|
||||
'_to' => $this->document->getId()
|
||||
],
|
||||
errors: $errors
|
||||
);
|
||||
} else throw new exception('The instance of the document from ArangoDB is not initialized');
|
||||
} else throw new exception('Failed to initialize ' . $document::TYPE . ' collection: ' . $document::COLLECTION);
|
||||
} else throw new exception('Failed to initialize ' . connect::TYPE . ' collection: ' . connect::COLLECTION);
|
||||
} else throw new exception('Failed to initialize ' . static::TYPE . ' collection: ' . static::COLLECTION);
|
||||
} catch (exception $e) {
|
||||
// Writing to the registry of errors
|
||||
$errors[] = [
|
||||
'text' => $e->getMessage(),
|
||||
'file' => $e->getFile(),
|
||||
'line' => $e->getLine(),
|
||||
'stack' => $e->getTrace()
|
||||
];
|
||||
}
|
||||
|
||||
// Exit (fail)
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Write
|
||||
*
|
||||
* Write a property into an instance of the ArangoDB document
|
||||
*
|
||||
* @param string $name Name of the property
|
||||
* @param mixed $value Content of the property
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __set(string $name, mixed $value = null): void
|
||||
{
|
||||
// Writing to the property into an instance of the ArangoDB document and exit (success)
|
||||
$this->document->{$name} = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Read
|
||||
*
|
||||
* Read a property from an instance of the ArangoDB docuemnt
|
||||
*
|
||||
* @param string $name Name of the property
|
||||
*
|
||||
* @return mixed Content of the property
|
||||
*/
|
||||
public function __get(string $name): mixed
|
||||
{
|
||||
// Read a property from an instance of the ArangoDB document and exit (success)
|
||||
return match ($name) {
|
||||
default => $this->document->{$name}
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete
|
||||
*
|
||||
* Deinitialize the property in an instance of the ArangoDB document
|
||||
*
|
||||
* @param string $name Name of the property
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __unset(string $name): void
|
||||
{
|
||||
// Delete the property in an instance of the ArangoDB document and exit (success)
|
||||
unset($this->document->{$name});
|
||||
}
|
||||
|
||||
/**
|
||||
* Check of initialization
|
||||
*
|
||||
* Check of initialization of the property into an instance of the ArangoDB document
|
||||
*
|
||||
* @param string $name Name of the property
|
||||
*
|
||||
* @return bool The property is initialized?
|
||||
*/
|
||||
public function __isset(string $name): bool
|
||||
{
|
||||
// Check of initializatio nof the property and exit (success)
|
||||
return isset($this->document->{$name});
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute a method
|
||||
*
|
||||
* Execute a method from an instance of the ArangoDB document
|
||||
*
|
||||
* @param string $name Name of the method
|
||||
* @param array $arguments Arguments for the method
|
||||
*
|
||||
* @return mixed Result of execution of the method
|
||||
*/
|
||||
public function __call(string $name, array $arguments = []): mixed
|
||||
{
|
||||
// Execute the method and exit (success)
|
||||
return method_exists($this->document, $name) ? $this->document->{$name}($arguments) ?? null : null;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
@font-face {
|
||||
font-family: 'DejaVu';
|
||||
src: url("/fonts/dejavu/DejaVuLGCSans-ExtraLight.ttf");
|
||||
font-weight: 200;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'DejaVu';
|
||||
src: url("/fonts/dejavu/DejaVuLGCSans.ttf");
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'DejaVu';
|
||||
src: url("/fonts/dejavu/DejaVuLGCSans-Oblique.ttf");
|
||||
font-weight: 400;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'DejaVu';
|
||||
src: url("/fonts/dejavu/DejaVuLGCSans-Bold.ttf");
|
||||
font-weight: 500;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'DejaVu';
|
||||
src: url("/fonts/dejavu/DejaVuLGCSans-BoldOblique.ttf");
|
||||
font-weight: 500;
|
||||
font-style: italic;
|
||||
}
|
|
@ -0,0 +1,139 @@
|
|||
@font-face {
|
||||
font-family: 'Fira';
|
||||
src: url('/fonts/fira/FiraSans-Hair.woff2') format('woff2'), url('/fonts/fira/FiraSans-Hair.woff') format('woff');
|
||||
font-weight: 100;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Fira';
|
||||
src: url('/fonts/fira/FiraSans-HairItalic.woff2') format('woff2'), url('/fonts/fira/FiraSans-HairItalic.woff') format('woff');
|
||||
font-weight: 100;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Fira';
|
||||
src: url('/fonts/fira/FiraSans-UltraLight.woff2') format('woff2'), url('/fonts/fira/FiraSans-UltraLight.woff') format('woff');
|
||||
font-weight: 200;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Fira';
|
||||
src: url('/fonts/fira/FiraSans-UltraLightItalic.woff2') format('woff2'), url('/fonts/fira/FiraSans-UltraLightItalic.woff') format('woff');
|
||||
font-weight: 200;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Fira';
|
||||
src: url('/fonts/fira/FiraSans-Light.woff2') format('woff2'), url('/fonts/fira/FiraSans-Light.woff') format('woff');
|
||||
font-weight: 300;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Fira';
|
||||
src: url('/fonts/fira/FiraSans-LightItalic.woff2') format('woff2'), url('/fonts/fira/FiraSans-LightItalic.woff') format('woff');
|
||||
font-weight: 300;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Fira';
|
||||
src: url('/fonts/fira/FiraSans-Regular.woff2') format('woff2'), url('/fonts/fira/FiraSans-Regular.woff') format('woff');
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Fira';
|
||||
src: url('/fonts/fira/FiraSans-Italic.woff2') format('woff2'), url('/fonts/fira/FiraSans-Italic.woff') format('woff');
|
||||
font-weight: 400;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Fira';
|
||||
src: url('/fonts/fira/FiraMono-Medium.woff2') format('woff2'), url('/fonts/fira/FiraMono-Medium.woff') format('woff');
|
||||
font-weight: 500;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Fira';
|
||||
src: url('/fonts/fira/FiraSans-MediumItalic.woff2') format('woff2'), url('/fonts/fira/FiraSans-MediumItalic.woff') format('woff');
|
||||
font-weight: 500;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Fira';
|
||||
src: url('/fonts/fira/FiraSans-SemiBold.woff2') format('woff2'), url('/fonts/fira/FiraSans-SemiBold.woff') format('woff');
|
||||
font-weight: 600;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Fira';
|
||||
src: url('/fonts/fira/FiraSans-SemiBoldItalic.woff2') format('woff2'), url('/fonts/fira/FiraSans-SemiBoldItalic.woff') format('woff');
|
||||
font-weight: 600;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Fira';
|
||||
src: url('/fonts/fira/FiraSans-Bold.woff2') format('woff2'), url('/fonts/fira/FiraSans-Bold.woff') format('woff');
|
||||
font-weight: 700;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Fira';
|
||||
src: url('/fonts/fira/FiraSans-BoldItalic.woff2') format('woff2'), url('/fonts/fira/FiraSans-BoldItalic.woff') format('woff');
|
||||
font-weight: 700;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Fira';
|
||||
src: url('/fonts/fira/FiraSans-ExtraBold.woff2') format('woff2'), url('/fonts/fira/FiraSans-ExtraBold.woff') format('woff');
|
||||
font-weight: 800;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Fira';
|
||||
src: url('/fonts/fira/FiraSans-ExtraBoldItalic.woff2') format('woff2'), url('/fonts/fira/FiraSans-ExtraBoldItalic.woff') format('woff');
|
||||
font-weight: 800;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Fira';
|
||||
src: url('/fonts/fira/FiraSans-Heavy.woff2') format('woff2'), url('/fonts/fira/FiraSans-Heavy.woff') format('woff');
|
||||
font-weight: 900;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Fira';
|
||||
src: url('/fonts/fira/FiraSans-HeavyItalic.woff2') format('woff2'), url('/fonts/fira/FiraSans-HeavyItalic.woff') format('woff');
|
||||
font-weight: 900;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Fira' Mono;
|
||||
src: url('/fonts/fira/FiraMono-Regular.woff2') format('woff2'), url('/fonts/fira/FiraMono-Regular.woff') format('woff');
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Fira' Mono;
|
||||
src: url('/fonts/fira/FiraMono-Bold.woff2') format('woff2'), url('/fonts/fira/FiraMono-Bold.woff') format('woff');
|
||||
font-weight: 600;
|
||||
font-style: normal;
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
@font-face {
|
||||
font-family: 'Hack';
|
||||
src: url('/fonts/hack/hack-regular.woff2?sha=3114f1256') format('woff2'), url('/fonts/hack/hack-regular.woff?sha=3114f1256') format('woff');
|
||||
font-weight: 400;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Hack';
|
||||
src: url('/fonts/hack/hack-bold.woff2?sha=3114f1256') format('woff2'), url('/fonts/hack/hack-bold.woff?sha=3114f1256') format('woff');
|
||||
font-weight: 700;
|
||||
font-style: normal;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Hack';
|
||||
src: url('/fonts/hack/hack-italic.woff2?sha=3114f1256') format('woff2'), url('/fonts/hack/hack-italic.woff?sha=3114f1256') format('woff');
|
||||
font-weight: 400;
|
||||
font-style: italic;
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'Hack';
|
||||
src: url('/fonts/hack/hack-bolditalic.woff2?sha=3114f1256') format('woff2'), url('/fonts/hack/hack-bolditalic.woff?sha=3114f1256') format('woff');
|
||||
font-weight: 700;
|
||||
font-style: italic;
|
||||
font-display: swap;
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
@charset "UTF-8";
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
display: grid;
|
||||
grid-template-rows: max(150px, 15vh) auto;
|
||||
grid-template-columns: 60px auto 60px;
|
||||
gap: var(--gap);
|
||||
overflow: hidden;
|
||||
background-color: var(--background-color);
|
||||
}
|
|
@ -1,215 +0,0 @@
|
|||
@charset "UTF-8";
|
||||
|
||||
main {
|
||||
z-index: 200;
|
||||
margin-bottom: var(--gap);
|
||||
grid-row: 2 / 3;
|
||||
grid-column: 2 / 3;
|
||||
display: grid;
|
||||
grid-template-rows: 2rem 43px auto;
|
||||
gap: var(--gap);
|
||||
}
|
||||
|
||||
main > nav {
|
||||
z-index: 200;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
main > nav > * {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
main > nav#timeline {
|
||||
margin-bottom: -0.3rem;
|
||||
grid-row: 1 / 2;
|
||||
padding: 0 0.5rem;
|
||||
align-items: end;
|
||||
}
|
||||
|
||||
main > nav#timeline > * {
|
||||
padding: 0.5rem;
|
||||
font-weight: bold;
|
||||
color: var(--section-timeline-button-color);
|
||||
}
|
||||
|
||||
main > nav#timeline > *:is(:hover, :focus) {
|
||||
color: var(--section-timeline-button-color-hover);
|
||||
}
|
||||
|
||||
main > nav#timeline > *:active {
|
||||
color: var(--section-timeline-button-color-active);
|
||||
}
|
||||
|
||||
main > nav#timeline > *.selected {
|
||||
color: var(--section-timeline-button-selected-color);
|
||||
}
|
||||
|
||||
main > nav#timeline > *.selected:is(:hover, :focus) {
|
||||
color: var(--section-timeline-button-selected-color-hover);
|
||||
}
|
||||
|
||||
main > nav#timeline > *.selected:active {
|
||||
color: var(--section-timeline-button-selected-color-active);
|
||||
}
|
||||
|
||||
main > nav#menu {
|
||||
grid-row: 2 / 3;
|
||||
border-radius: 0.75rem;
|
||||
background-color: var(--section-menu-background-color);
|
||||
-webkit-box-shadow: 0px 0px 12px 2px rgba(0, 0, 0, 0.1);
|
||||
-moz-box-shadow: 0px 0px 12px 2px rgba(0, 0, 0, 0.1);
|
||||
box-shadow: 0px 0px 12px 2px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
main > nav#menu > * {
|
||||
height: 100%;
|
||||
padding: 0 1rem;
|
||||
color: var(--section-menu-button-color);
|
||||
}
|
||||
|
||||
main > nav#menu > *:first-child {
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
main > nav#menu > *.selected:is(:hover, :focus),
|
||||
main > nav#menu > *:is(:hover, :focus) {
|
||||
background-color: var(--section-menu-button-background-color-hover);
|
||||
}
|
||||
|
||||
main > nav#menu > *.selected {
|
||||
background-color: var(--section-menu-button-background-color-selected);
|
||||
}
|
||||
|
||||
main > nav#menu > *.selected:active,
|
||||
main > nav#menu > *:active {
|
||||
background-color: var(--section-menu-button-background-color-active);
|
||||
}
|
||||
|
||||
main > section {
|
||||
z-index: 200;
|
||||
grid-row: 3 / 4;
|
||||
padding: 1rem;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--gap);
|
||||
border-radius: 0.75rem;
|
||||
background-color: var(--section-background-color);
|
||||
-webkit-box-shadow: 0px 3px 12px 2px rgba(0, 0, 0, 0.1);
|
||||
-moz-box-shadow: 0px 3px 12px 2px rgba(0, 0, 0, 0.1);
|
||||
box-shadow: 0px 3px 12px 2px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
main > section > h1 {
|
||||
margin: 0.5rem 1rem 0.5rem 1rem;
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
|
||||
main > section > h1.row {
|
||||
align-items: center;
|
||||
gap: var(--gap);
|
||||
}
|
||||
|
||||
main > section > h1 > a {
|
||||
min-width: 1rem;
|
||||
height: 100%;
|
||||
padding: 0.2rem;
|
||||
display: inline-flex;
|
||||
justify-content: start;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
main > section > h1 > a:first-of-type {
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
main > section > div.row {
|
||||
padding: 0rem 1rem;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
main > section .block {
|
||||
background: var(--section-block-background-color);
|
||||
}
|
||||
|
||||
main > section .block.text {
|
||||
padding: 0.6rem 0.8rem;
|
||||
display: inline-flex;
|
||||
flex-flow: row wrap;
|
||||
}
|
||||
|
||||
main > section .block.text > a.continue {
|
||||
margin-left: auto;
|
||||
align-self: flex-end;
|
||||
}
|
||||
|
||||
main > section p.block {
|
||||
margin: unset;
|
||||
}
|
||||
|
||||
main > section ul.block {
|
||||
min-width: 200px;
|
||||
height: fit-content;
|
||||
}
|
||||
|
||||
main > section > div.footer > small.phrase {
|
||||
flex-grow: 1;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
main > section > div.footer > small#views {
|
||||
position: relative;
|
||||
margin-left: auto;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
main > section > div.footer > small#views > * {
|
||||
z-index: 500;
|
||||
}
|
||||
|
||||
main > section > div.footer > small#views > div.visibility {
|
||||
z-index: 300;
|
||||
position: absolute;
|
||||
right: calc(-100px + 10.5px + 0rem);
|
||||
top: calc(-100px + 0.5rem);
|
||||
width: 200px;
|
||||
height: 200px;
|
||||
/* pointer-events: none; */
|
||||
}
|
||||
|
||||
main > section#total > div#diagram.column {
|
||||
margin-top: auto;
|
||||
width: 100%;
|
||||
height: fit-content;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: var(--gap);
|
||||
}
|
||||
|
||||
main > section#total > div#diagram.column:has(svg.chart) {
|
||||
padding-left: 1rem;
|
||||
}
|
||||
|
||||
main > section#total > div#diagram.column > svg.pie {
|
||||
height: min(30%, 300px);
|
||||
}
|
||||
|
||||
main > section#total > div#diagram.column > small.formula {
|
||||
margin: 0 1.4rem;
|
||||
padding-right: 4rem;
|
||||
font-size: 0.8rem;
|
||||
color: var(--diagram-legend-text-color);
|
||||
}
|
||||
|
||||
main > section#total > div#diagram.column > svg.chart {
|
||||
margin: -2.5rem -1rem -3rem;
|
||||
width: calc(100% + 1rem);
|
||||
}
|
||||
|
||||
main > section#total > div#diagram.column > div.background {
|
||||
width: 100%;
|
||||
height: 170px;
|
||||
}
|
|
@ -1,117 +0,0 @@
|
|||
@charset "UTF-8";
|
||||
|
||||
:root {
|
||||
--gap: min(12px, 1rem);
|
||||
transition: 0.1s ease-out;
|
||||
}
|
||||
|
||||
* {
|
||||
/* font-family: , system-ui, sans-serif; */
|
||||
font-family: "dejavu";
|
||||
text-decoration: none;
|
||||
outline: none;
|
||||
border: none;
|
||||
}
|
||||
|
||||
/* Selection */
|
||||
|
||||
::selection {
|
||||
border-radius: 2px;
|
||||
color: var(--text-selected-color);
|
||||
background: var(--text-selected-background-color);
|
||||
}
|
||||
|
||||
::-moz-selection {
|
||||
border-radius: 2px;
|
||||
color: var(--text-selected-color);
|
||||
background: var(--text-selected-background-color);
|
||||
}
|
||||
|
||||
.unselectable {
|
||||
-webkit-touch-callout: none;
|
||||
-webkit-user-select: none;
|
||||
-khtml-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
/* Buttons and links */
|
||||
|
||||
a,
|
||||
*[type="button"] {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
a,
|
||||
a > * {
|
||||
color: var(--link-color);
|
||||
}
|
||||
|
||||
a:is(:hover, :focus),
|
||||
a:is(:hover, :focus) > * {
|
||||
color: var(--link-color-hover);
|
||||
}
|
||||
|
||||
a:active,
|
||||
a:active > * {
|
||||
color: var(--link-color-active);
|
||||
}
|
||||
|
||||
/* Wrappers */
|
||||
|
||||
:is(.row, .column) {
|
||||
gap: var(--gap);
|
||||
}
|
||||
|
||||
.row:not(.column) {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.column:not(.row) {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
/* Macroses */
|
||||
|
||||
.rounded {
|
||||
border-radius: 0.75rem;
|
||||
}
|
||||
|
||||
.grow {
|
||||
flex-grow: 1;
|
||||
}
|
||||
|
||||
/* Lists */
|
||||
|
||||
:is(ol, ul) {
|
||||
margin: unset;
|
||||
padding: 0.6rem 0.8rem;
|
||||
gap: 0.3rem;
|
||||
}
|
||||
|
||||
:is(ol, ul):is(.column, .row) {
|
||||
gap: 0.3rem;
|
||||
}
|
||||
|
||||
li {
|
||||
display: inline-flex;
|
||||
}
|
||||
|
||||
li > span.name:first-child:after {
|
||||
content: ":";
|
||||
}
|
||||
|
||||
li > span.value:last-child {
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
li > span.value:last-child:before {
|
||||
content: var(--old);
|
||||
margin-right: 0.4rem;
|
||||
font-size: 0.8rem;
|
||||
text-decoration: line-through;
|
||||
color: var(--text-notice-color);
|
||||
}
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue