Compare commits

..

No commits in common. "stable" and "0.1.0" have entirely different histories.

169 changed files with 901 additions and 2165 deletions

View File

@ -1,13 +1,2 @@
# 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;`

View File

@ -23,7 +23,7 @@
"require": {
"php": "^8.4",
"triagens/arangodb": "^3.8",
"mirzaev/minimal": "^3.3.0",
"mirzaev/minimal": "^3.2.0",
"mirzaev/arangodb": "^1.3",
"twig/twig": "^3.10",
"twig/extra-bundle": "^3.7",

@ -1 +0,0 @@
Subproject commit 68589e968cbc043f35c2948a9c90293b6f5f9cb9

View File

@ -2,7 +2,7 @@ server {
listen 80;
listen [::]:80;
server_name svoboda.works;
server_name svoboda.dev.mirzaev.sexy;
# 301 302
return 301 https://$server_name$request_uri;
@ -14,7 +14,7 @@ server {
listen [::]:443 ssl;
listen [::]:443 quic;
server_name svoboda.works;
server_name svoboda.dev.mirzaev.sexy;
http2 on;
http3 on;
@ -31,7 +31,7 @@ server {
keepalive_timeout 60;
include snippets/ssl-params.conf;
include snippets/ssl-svoboda.conf;
include snippets/ssl-mirzaev.conf;
include snippets/php8_4.conf;
location / {
@ -44,7 +44,7 @@ server {
add_header Cache-Control "max-age=2629746, public";
}
location ~* \.(?:css|js|mjs|min)$ {
location ~* \.(?:css|js)$ {
expires 1y;
access_log off;
add_header Cache-Control "max-age=31556952, public";

@ -1 +0,0 @@
Subproject commit 0300f3376550b9d0a07d1c41db88452af67e366b

@ -1 +0,0 @@
Subproject commit 81aca4001629e8f3cab8a849c1e892dbac74c88a

View File

@ -1,37 +1,10 @@
#!/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

View File

@ -5,10 +5,9 @@ declare(strict_types=1);
namespace svoboda\works\controllers;
// Files of the project
use svoboda\works\views\templater,
use svoboda\works\views\manager,
svoboda\works\models\core as models,
svoboda\works\models\session,
svoboda\works\models\enumerations\language;
svoboda\works\models\session;
// Framework for PHP
use mirzaev\minimal\core as minimal,
@ -72,18 +71,18 @@ class core extends controller
/**
* Constructor
*
* @param minimal $core Instance of the MINIMAL
* @param minimal $minimal Instance of the MINIMAL
* @param bool $initialize Initialize a controller?
*
* @return void
*/
public function __construct(minimal $core, bool $initialize = true)
public function __construct(minimal $minimal, 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: $core);
parent::__construct(core: $minimal);
if ($initialize) {
// Requestet initializing
@ -91,7 +90,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
@ -117,11 +116,10 @@ class core extends controller
'samesite' => 'strict'
]
);
} */
}
// Initializing of preprocessor of views
/* $this->view = new templater($this->session); */
$this->view = new templater();
$this->view = new templater($this->session);
}
}
}

View File

@ -8,8 +8,7 @@ namespace svoboda\works\controllers;
use svoboda\works\controllers\core;
// Framework for PHP
use mirzaev\minimal\http\enumerations\content,
mirzaev\minimal\http\enumerations\status;
use mirzaev\minimal\http\enumerations\status;
/**
* Index
@ -44,80 +43,8 @@ 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('/pages/statistics/total.html');
$page = $this->view->render('index.html');
// Sending response
$this->response

View File

@ -8,6 +8,15 @@ 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;
@ -20,12 +29,27 @@ 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
*
@ -34,10 +58,173 @@ class core extends model
*
* @return void
*/
public function __construct(bool $initialize = true)
public function __construct(bool $initialize = true, ?arangodb $arangodb = null)
{
// 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)
};
}
}

View File

@ -0,0 +1,31 @@
<?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;
}

View File

@ -0,0 +1,81 @@
<?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;
}

View File

@ -0,0 +1,206 @@
<?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;
}
}

View File

@ -1,34 +0,0 @@
@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;
}

View File

@ -1,139 +0,0 @@
@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;
}

View File

@ -1,31 +0,0 @@
@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;
}

View File

@ -1,7 +1,7 @@
@charset "UTF-8";
aside {
z-index: 200;
z-index: 100;
margin-top: var(--gap);
grid-row: 1 / 2;
grid-column: 1 / 4;
@ -15,7 +15,7 @@ aside > * {
aside > section {
position: relative;
min-width: max(240px, calc(100% / (var(--amount) - 1)));
width: 200px;
height: 100%;
display: flex;
flex-direction: column;
@ -26,7 +26,6 @@ aside > section {
-webkit-box-shadow: 0px -3px 18px 2px rgba(0, -3, 0, 0.4);
-moz-box-shadow: 0px -3px 18px 2px rgba(0, -3, 0, 0.4);
box-shadow: 0px -3px 18px 2px rgba(0, -3, 0, 0.4);
transition: 0s !important;
}
aside > section > a.title {

View File

@ -0,0 +1,13 @@
@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);
}

View File

@ -16,19 +16,14 @@
--button-background-color: #9f9b39;
--section-border-color: #593535;
--section-block-background-color: #592727;
/* --section-background-color: #593535; */
--section-background-color: #4d2323;
--section-background-color: #593535;
--section-block-background-color: #522d2d;
--section-menu-background-color: #4b2828;
--section-menu-button-color: #fbffb6;
--section-menu-button-background-color-hover: #592c2c;
--section-menu-button-background-color-active: #412222;
/* --section-menu-button-background-color-selected: #412222; */
/* --section-menu-button-background-color-selected: #220c0c; */
--section-menu-button-background-color-selected: #5b3d2b;
/* --section-menu-background-color: #4b2828; */
/* --section-menu-background-color: #311515; */
--section-menu-background-color: #4f2b22;
--section-menu-button-background-color-selected: #412222;
--section-timeline-background-color: #143531;
--section-timeline-button-color: #859779;
@ -42,8 +37,9 @@
--section-aside-button-background-color: rgb(255 237 189 / 30%);
--section-aside-button-background-color-hover: rgb(77 9 9 / 70%);
--section-aside-button-background-color-active: rgb(77 9 9 / 70%);
--header-background-color: #1e0a0a;
--footer-background-color: #1e0a0a;
--header-background-color: #351d1d;
--footer-background-color: #351d1d;
--background-color: #654949;
--diagram-text-color: #c3a275;
--diagram-text-color-hover: #e5bb83;
@ -63,12 +59,6 @@
--diagram-legend-color-0: #461d1d;
color: var(--text-color);
/* --background-color: #654949; */
/* --background-color: #6f3d3d; */
--background-color: #402821;
--background-color-top: #402821;
--background-color-bottom: #2a1414;
}
}

View File

@ -39,7 +39,7 @@ div#diagram>svg.pie>circle:nth-of-type(5) {
}
div#diagram>svg.chart>polyline {
stroke-width: 4px;
stroke-width: 4;
fill: transparent;
}
@ -66,14 +66,14 @@ div#diagram>svg.chart>a.node:active>text {
}
div#diagram>svg.chart>a.node>circle {
r: 7px;
r: 7;
stroke-width: 4;
stroke: var(--diagram-color-5);
fill: var(--diagram-color-white);
}
div#diagram>svg.chart>a.node:is(:hover, :focus)>circle {
r: 8px;
r: 8;
stroke: var(--diagram-color-6);
fill: var(--diagram-color-white-hover);
}

View File

@ -0,0 +1,215 @@
@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;
}

View File

@ -0,0 +1,117 @@
@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);
}

View File

@ -1,6 +1,6 @@
@charset "UTF-8";
section#eclipse {
section#window {
position: fixed;
left: 0;
top: 0;

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