5 Commits

70 changed files with 1879 additions and 266 deletions

12
.gitmodules vendored Normal file
View File

@@ -0,0 +1,12 @@
[submodule "hotline.mjs"]
path = hotline.mjs
url = https://git.svoboda.works/mirzaev/hotline.mjs
branch = stable
[submodule "womb3-simplex.mjs"]
path = womb3-simplex.mjs
url = https://git.svoboda.works/mirzaev/womb3-simplex.mjs
branch = stable
[submodule "icons"]
path = icons
url = https://git.svoboda.works/mirzaev/icons
branch = stable

188
composer.lock generated
View File

@@ -93,11 +93,11 @@
},
{
"name": "mirzaev/minimal",
"version": "3.8.5",
"version": "3.8.6",
"source": {
"type": "git",
"url": "https://git.svoboda.works/mirzaev/minimal",
"reference": "ed2a41a13973802e884513e1357807dc4d44a04a"
"reference": "584285b92ce84dd219891639f065a0c55bda7d41"
},
"require": {
"php": "~8.4"
@@ -138,7 +138,7 @@
"docs": "https://git.svoboda.works/mirzaev/minimal/wiki",
"issues": "https://git.svoboda.works/mirzaev/minimal/issues"
},
"time": "2025-11-03T19:42:27+00:00"
"time": "2025-11-04T09:27:54+00:00"
},
{
"name": "psr/cache",
@@ -344,16 +344,16 @@
},
{
"name": "symfony/cache",
"version": "v7.3.5",
"version": "v7.3.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/cache.git",
"reference": "4a55feb59664f49042a0824c0f955e2f4c1412ad"
"reference": "1277a1ec61c8d93ea61b2a59738f1deb9bfb6701"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/cache/zipball/4a55feb59664f49042a0824c0f955e2f4c1412ad",
"reference": "4a55feb59664f49042a0824c0f955e2f4c1412ad",
"url": "https://api.github.com/repos/symfony/cache/zipball/1277a1ec61c8d93ea61b2a59738f1deb9bfb6701",
"reference": "1277a1ec61c8d93ea61b2a59738f1deb9bfb6701",
"shasum": ""
},
"require": {
@@ -422,7 +422,7 @@
"psr6"
],
"support": {
"source": "https://github.com/symfony/cache/tree/v7.3.5"
"source": "https://github.com/symfony/cache/tree/v7.3.6"
},
"funding": [
{
@@ -442,7 +442,7 @@
"type": "tidelift"
}
],
"time": "2025-10-16T13:55:38+00:00"
"time": "2025-10-30T13:22:58+00:00"
},
{
"name": "symfony/cache-contracts",
@@ -522,16 +522,16 @@
},
{
"name": "symfony/config",
"version": "v7.3.4",
"version": "v7.3.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/config.git",
"reference": "8a09223170046d2cfda3d2e11af01df2c641e961"
"reference": "9d18eba95655a3152ae4c1d53c6cc34eb4d4a0b7"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/config/zipball/8a09223170046d2cfda3d2e11af01df2c641e961",
"reference": "8a09223170046d2cfda3d2e11af01df2c641e961",
"url": "https://api.github.com/repos/symfony/config/zipball/9d18eba95655a3152ae4c1d53c6cc34eb4d4a0b7",
"reference": "9d18eba95655a3152ae4c1d53c6cc34eb4d4a0b7",
"shasum": ""
},
"require": {
@@ -577,7 +577,7 @@
"description": "Helps you find, load, combine, autofill and validate configuration values of any kind",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/config/tree/v7.3.4"
"source": "https://github.com/symfony/config/tree/v7.3.6"
},
"funding": [
{
@@ -597,20 +597,20 @@
"type": "tidelift"
}
],
"time": "2025-09-22T12:46:16+00:00"
"time": "2025-11-02T08:04:43+00:00"
},
{
"name": "symfony/dependency-injection",
"version": "v7.3.4",
"version": "v7.3.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/dependency-injection.git",
"reference": "82119812ab0bf3425c1234d413efd1b19bb92ae4"
"reference": "98af8bb46c56aedd9dd5a7f0414fc72bf2dcfe69"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/dependency-injection/zipball/82119812ab0bf3425c1234d413efd1b19bb92ae4",
"reference": "82119812ab0bf3425c1234d413efd1b19bb92ae4",
"url": "https://api.github.com/repos/symfony/dependency-injection/zipball/98af8bb46c56aedd9dd5a7f0414fc72bf2dcfe69",
"reference": "98af8bb46c56aedd9dd5a7f0414fc72bf2dcfe69",
"shasum": ""
},
"require": {
@@ -661,7 +661,7 @@
"description": "Allows you to standardize and centralize the way objects are constructed in your application",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/dependency-injection/tree/v7.3.4"
"source": "https://github.com/symfony/dependency-injection/tree/v7.3.6"
},
"funding": [
{
@@ -681,7 +681,7 @@
"type": "tidelift"
}
],
"time": "2025-09-11T10:12:26+00:00"
"time": "2025-10-31T10:11:11+00:00"
},
{
"name": "symfony/deprecation-contracts",
@@ -752,16 +752,16 @@
},
{
"name": "symfony/error-handler",
"version": "v7.3.4",
"version": "v7.3.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/error-handler.git",
"reference": "99f81bc944ab8e5dae4f21b4ca9972698bbad0e4"
"reference": "bbe40bfab84323d99dab491b716ff142410a92a8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/error-handler/zipball/99f81bc944ab8e5dae4f21b4ca9972698bbad0e4",
"reference": "99f81bc944ab8e5dae4f21b4ca9972698bbad0e4",
"url": "https://api.github.com/repos/symfony/error-handler/zipball/bbe40bfab84323d99dab491b716ff142410a92a8",
"reference": "bbe40bfab84323d99dab491b716ff142410a92a8",
"shasum": ""
},
"require": {
@@ -809,7 +809,7 @@
"description": "Provides tools to manage errors and ease debugging PHP code",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/error-handler/tree/v7.3.4"
"source": "https://github.com/symfony/error-handler/tree/v7.3.6"
},
"funding": [
{
@@ -829,7 +829,7 @@
"type": "tidelift"
}
],
"time": "2025-09-11T10:12:26+00:00"
"time": "2025-10-31T19:12:50+00:00"
},
{
"name": "symfony/event-dispatcher",
@@ -993,16 +993,16 @@
},
{
"name": "symfony/filesystem",
"version": "v7.3.2",
"version": "v7.3.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/filesystem.git",
"reference": "edcbb768a186b5c3f25d0643159a787d3e63b7fd"
"reference": "e9bcfd7837928ab656276fe00464092cc9e1826a"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/edcbb768a186b5c3f25d0643159a787d3e63b7fd",
"reference": "edcbb768a186b5c3f25d0643159a787d3e63b7fd",
"url": "https://api.github.com/repos/symfony/filesystem/zipball/e9bcfd7837928ab656276fe00464092cc9e1826a",
"reference": "e9bcfd7837928ab656276fe00464092cc9e1826a",
"shasum": ""
},
"require": {
@@ -1039,7 +1039,7 @@
"description": "Provides basic utilities for the filesystem",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/filesystem/tree/v7.3.2"
"source": "https://github.com/symfony/filesystem/tree/v7.3.6"
},
"funding": [
{
@@ -1059,7 +1059,7 @@
"type": "tidelift"
}
],
"time": "2025-07-07T08:17:47+00:00"
"time": "2025-11-05T09:52:27+00:00"
},
{
"name": "symfony/finder",
@@ -1131,16 +1131,16 @@
},
{
"name": "symfony/framework-bundle",
"version": "v7.3.5",
"version": "v7.3.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/framework-bundle.git",
"reference": "ebd42b1fc2652b96d33520195ea0f6e55c36f09d"
"reference": "cabfdfa82bc4f75d693a329fe263d96937636b77"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/framework-bundle/zipball/ebd42b1fc2652b96d33520195ea0f6e55c36f09d",
"reference": "ebd42b1fc2652b96d33520195ea0f6e55c36f09d",
"url": "https://api.github.com/repos/symfony/framework-bundle/zipball/cabfdfa82bc4f75d693a329fe263d96937636b77",
"reference": "cabfdfa82bc4f75d693a329fe263d96937636b77",
"shasum": ""
},
"require": {
@@ -1265,7 +1265,7 @@
"description": "Provides a tight integration between Symfony components and the Symfony full-stack framework",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/framework-bundle/tree/v7.3.5"
"source": "https://github.com/symfony/framework-bundle/tree/v7.3.6"
},
"funding": [
{
@@ -1285,20 +1285,20 @@
"type": "tidelift"
}
],
"time": "2025-10-16T16:16:53+00:00"
"time": "2025-10-30T09:42:24+00:00"
},
{
"name": "symfony/http-foundation",
"version": "v7.3.5",
"version": "v7.3.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-foundation.git",
"reference": "ce31218c7cac92eab280762c4375fb70a6f4f897"
"reference": "db488a62f98f7a81d5746f05eea63a74e55bb7c4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/ce31218c7cac92eab280762c4375fb70a6f4f897",
"reference": "ce31218c7cac92eab280762c4375fb70a6f4f897",
"url": "https://api.github.com/repos/symfony/http-foundation/zipball/db488a62f98f7a81d5746f05eea63a74e55bb7c4",
"reference": "db488a62f98f7a81d5746f05eea63a74e55bb7c4",
"shasum": ""
},
"require": {
@@ -1348,7 +1348,7 @@
"description": "Defines an object-oriented layer for the HTTP specification",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/http-foundation/tree/v7.3.5"
"source": "https://github.com/symfony/http-foundation/tree/v7.3.7"
},
"funding": [
{
@@ -1368,20 +1368,20 @@
"type": "tidelift"
}
],
"time": "2025-10-24T21:42:11+00:00"
"time": "2025-11-08T16:41:12+00:00"
},
{
"name": "symfony/http-kernel",
"version": "v7.3.5",
"version": "v7.3.7",
"source": {
"type": "git",
"url": "https://github.com/symfony/http-kernel.git",
"reference": "24fd3f123532e26025f49f1abefcc01a69ef15ab"
"reference": "10b8e9b748ea95fa4539c208e2487c435d3c87ce"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/24fd3f123532e26025f49f1abefcc01a69ef15ab",
"reference": "24fd3f123532e26025f49f1abefcc01a69ef15ab",
"url": "https://api.github.com/repos/symfony/http-kernel/zipball/10b8e9b748ea95fa4539c208e2487c435d3c87ce",
"reference": "10b8e9b748ea95fa4539c208e2487c435d3c87ce",
"shasum": ""
},
"require": {
@@ -1466,7 +1466,7 @@
"description": "Provides a structured process for converting a Request into a Response",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/http-kernel/tree/v7.3.5"
"source": "https://github.com/symfony/http-kernel/tree/v7.3.7"
},
"funding": [
{
@@ -1486,7 +1486,7 @@
"type": "tidelift"
}
],
"time": "2025-10-28T10:19:01+00:00"
"time": "2025-11-12T11:38:40+00:00"
},
{
"name": "symfony/intl",
@@ -1828,16 +1828,16 @@
},
{
"name": "symfony/routing",
"version": "v7.3.4",
"version": "v7.3.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/routing.git",
"reference": "8dc648e159e9bac02b703b9fbd937f19ba13d07c"
"reference": "c97abe725f2a1a858deca629a6488c8fc20c3091"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/routing/zipball/8dc648e159e9bac02b703b9fbd937f19ba13d07c",
"reference": "8dc648e159e9bac02b703b9fbd937f19ba13d07c",
"url": "https://api.github.com/repos/symfony/routing/zipball/c97abe725f2a1a858deca629a6488c8fc20c3091",
"reference": "c97abe725f2a1a858deca629a6488c8fc20c3091",
"shasum": ""
},
"require": {
@@ -1889,7 +1889,7 @@
"url"
],
"support": {
"source": "https://github.com/symfony/routing/tree/v7.3.4"
"source": "https://github.com/symfony/routing/tree/v7.3.6"
},
"funding": [
{
@@ -1909,20 +1909,20 @@
"type": "tidelift"
}
],
"time": "2025-09-11T10:12:26+00:00"
"time": "2025-11-05T07:57:47+00:00"
},
{
"name": "symfony/service-contracts",
"version": "v3.6.0",
"version": "v3.6.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/service-contracts.git",
"reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4"
"reference": "45112560a3ba2d715666a509a0bc9521d10b6c43"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/service-contracts/zipball/f021b05a130d35510bd6b25fe9053c2a8a15d5d4",
"reference": "f021b05a130d35510bd6b25fe9053c2a8a15d5d4",
"url": "https://api.github.com/repos/symfony/service-contracts/zipball/45112560a3ba2d715666a509a0bc9521d10b6c43",
"reference": "45112560a3ba2d715666a509a0bc9521d10b6c43",
"shasum": ""
},
"require": {
@@ -1976,7 +1976,7 @@
"standards"
],
"support": {
"source": "https://github.com/symfony/service-contracts/tree/v3.6.0"
"source": "https://github.com/symfony/service-contracts/tree/v3.6.1"
},
"funding": [
{
@@ -1987,25 +1987,29 @@
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://github.com/nicolas-grekas",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2025-04-25T09:37:31+00:00"
"time": "2025-07-15T11:30:57+00:00"
},
{
"name": "symfony/translation-contracts",
"version": "v3.6.0",
"version": "v3.6.1",
"source": {
"type": "git",
"url": "https://github.com/symfony/translation-contracts.git",
"reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d"
"reference": "65a8bc82080447fae78373aa10f8d13b38338977"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/translation-contracts/zipball/df210c7a2573f1913b2d17cc95f90f53a73d8f7d",
"reference": "df210c7a2573f1913b2d17cc95f90f53a73d8f7d",
"url": "https://api.github.com/repos/symfony/translation-contracts/zipball/65a8bc82080447fae78373aa10f8d13b38338977",
"reference": "65a8bc82080447fae78373aa10f8d13b38338977",
"shasum": ""
},
"require": {
@@ -2054,7 +2058,7 @@
"standards"
],
"support": {
"source": "https://github.com/symfony/translation-contracts/tree/v3.6.0"
"source": "https://github.com/symfony/translation-contracts/tree/v3.6.1"
},
"funding": [
{
@@ -2065,25 +2069,29 @@
"url": "https://github.com/fabpot",
"type": "github"
},
{
"url": "https://github.com/nicolas-grekas",
"type": "github"
},
{
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
"type": "tidelift"
}
],
"time": "2024-09-27T08:32:26+00:00"
"time": "2025-07-15T13:41:35+00:00"
},
{
"name": "symfony/twig-bridge",
"version": "v7.3.3",
"version": "v7.3.6",
"source": {
"type": "git",
"url": "https://github.com/symfony/twig-bridge.git",
"reference": "33558f013b7f6ed72805527c8405cae0062e47c5"
"reference": "d1aaec8eee1f5591f56b9efe00194d73a8e38319"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/symfony/twig-bridge/zipball/33558f013b7f6ed72805527c8405cae0062e47c5",
"reference": "33558f013b7f6ed72805527c8405cae0062e47c5",
"url": "https://api.github.com/repos/symfony/twig-bridge/zipball/d1aaec8eee1f5591f56b9efe00194d73a8e38319",
"reference": "d1aaec8eee1f5591f56b9efe00194d73a8e38319",
"shasum": ""
},
"require": {
@@ -2165,7 +2173,7 @@
"description": "Provides integration for Twig with various Symfony components",
"homepage": "https://symfony.com",
"support": {
"source": "https://github.com/symfony/twig-bridge/tree/v7.3.3"
"source": "https://github.com/symfony/twig-bridge/tree/v7.3.6"
},
"funding": [
{
@@ -2185,7 +2193,7 @@
"type": "tidelift"
}
],
"time": "2025-08-18T13:10:53+00:00"
"time": "2025-11-04T15:37:51+00:00"
},
{
"name": "symfony/twig-bundle",
@@ -2445,22 +2453,22 @@
},
{
"name": "twig/extra-bundle",
"version": "v3.22.0",
"version": "v3.22.1",
"source": {
"type": "git",
"url": "https://github.com/twigphp/twig-extra-bundle.git",
"reference": "6d253f0fe28a83a045497c8fb3ea9bfe84e82cf4"
"reference": "b6534bc925bec930004facca92fccebd0c809247"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/6d253f0fe28a83a045497c8fb3ea9bfe84e82cf4",
"reference": "6d253f0fe28a83a045497c8fb3ea9bfe84e82cf4",
"url": "https://api.github.com/repos/twigphp/twig-extra-bundle/zipball/b6534bc925bec930004facca92fccebd0c809247",
"reference": "b6534bc925bec930004facca92fccebd0c809247",
"shasum": ""
},
"require": {
"php": ">=8.1.0",
"symfony/framework-bundle": "^5.4|^6.4|^7.0",
"symfony/twig-bundle": "^5.4|^6.4|^7.0",
"symfony/framework-bundle": "^5.4|^6.4|^7.0|^8.0",
"symfony/twig-bundle": "^5.4|^6.4|^7.0|^8.0",
"twig/twig": "^3.2|^4.0"
},
"require-dev": {
@@ -2503,7 +2511,7 @@
"twig"
],
"support": {
"source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.22.0"
"source": "https://github.com/twigphp/twig-extra-bundle/tree/v3.22.1"
},
"funding": [
{
@@ -2515,25 +2523,25 @@
"type": "tidelift"
}
],
"time": "2025-09-15T05:57:37+00:00"
"time": "2025-11-02T11:00:49+00:00"
},
{
"name": "twig/intl-extra",
"version": "v3.22.0",
"version": "v3.22.1",
"source": {
"type": "git",
"url": "https://github.com/twigphp/intl-extra.git",
"reference": "7393fc911c7315db18a805d3a541ac7bb9e4fdc0"
"reference": "93ac31e53cdd3f2e541f42690cd0c54ca8138ab1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/twigphp/intl-extra/zipball/7393fc911c7315db18a805d3a541ac7bb9e4fdc0",
"reference": "7393fc911c7315db18a805d3a541ac7bb9e4fdc0",
"url": "https://api.github.com/repos/twigphp/intl-extra/zipball/93ac31e53cdd3f2e541f42690cd0c54ca8138ab1",
"reference": "93ac31e53cdd3f2e541f42690cd0c54ca8138ab1",
"shasum": ""
},
"require": {
"php": ">=8.1.0",
"symfony/intl": "^5.4|^6.4|^7.0",
"symfony/intl": "^5.4|^6.4|^7.0|^8.0",
"twig/twig": "^3.13|^4.0"
},
"require-dev": {
@@ -2567,7 +2575,7 @@
"twig"
],
"support": {
"source": "https://github.com/twigphp/intl-extra/tree/v3.22.0"
"source": "https://github.com/twigphp/intl-extra/tree/v3.22.1"
},
"funding": [
{
@@ -2579,7 +2587,7 @@
"type": "tidelift"
}
],
"time": "2025-09-15T06:05:04+00:00"
"time": "2025-11-02T11:00:49+00:00"
},
{
"name": "twig/twig",

1
hotline.mjs Submodule

Submodule hotline.mjs added at 5e627e14ae

1
icons Submodule

Submodule icons added at d6a92fc4bf

View File

@@ -13,3 +13,23 @@ if [ -e kodorvan/perm/system/settings/*.sample ]; then
cp "$i" "${i/.sample/}";
done
fi
if ! [ -d kodorvan/perm/system/public/js/modules ]; then
mkdir kodorvan/perm/system/public/js/modules -p
fi
if ! [ -L kodorvan/perm/system/public/js/modules/hotline.mjs ]; then
ln -s ../../../../../../hotline.mjs/hotline.mjs kodorvan/perm/system/public/js/modules/hotline.mjs;
fi
if ! [ -L kodorvan/perm/system/public/js/modules/womb3-simplex.mjs ]; then
ln -s ../../../../../../womb3-simplex.mjs/womb3-simplex.mjs kodorvan/perm/system/public/js/modules/womb3-simplex.mjs;
fi
if ! [ -L kodorvan/perm/system/public/js/modules/simplex-noise.mjs ]; then
ln -s ../../../../../../womb3-simplex.mjs/simplex-noise.mjs kodorvan/perm/system/public/js/modules/simplex-noise.mjs;
fi
if ! [ -d kodorvan/perm/system/public/css/icons ]; then
ln -s ../../../../../icons/css kodorvan/perm/system/public/css/icons;
fi

View File

@@ -44,8 +44,14 @@ final class index extends core
if (str_contains($this->request->headers['accept'] ?? '', content::html->value)) {
// Request for HTML response
// Initializing the team workload
$this->view->workload = (string) ($_COOKIE['workload'] ?? rand(20, 80));
// Sending the cookie with the team workload (1800 = 30min)
setcookie('workload', $this->view->workload, time() + 1800, '/');
// Render page
$page = $this->view->render('index.html');
$page = $this->view->render('main/index.html');
// Sending response
$this->response

View File

@@ -0,0 +1 @@
../../../../../icons/css

View File

@@ -0,0 +1,15 @@
const items = document.querySelectorAll(".accordion button");
function toggleAccordion() {
const itemToggle = this.getAttribute('aria-expanded');
for (i = 0; i < items.length; i++) {
items[i].setAttribute('aria-expanded', 'false');
}
if (itemToggle == 'false') {
this.setAttribute('aria-expanded', 'true');
}
}
items.forEach(item => item.addEventListener('click', toggleAccordion));

View File

@@ -0,0 +1 @@
../../../../../../hotline.mjs/hotline.mjs

View File

@@ -0,0 +1,19 @@
document.addEventListener('DOMContentLoaded', function() {
const blocks = document.querySelectorAll('.block');
blocks.forEach(block => {
const question = block.querySelector('.question');
const answerCont = block.querySelector('.answercont');
question.addEventListener('click', function() {
// Просто переключаем текущий блок без влияния на другие
if (block.classList.contains('active')) {
answerCont.style.maxHeight = '0';
block.classList.remove('active');
} else {
answerCont.style.maxHeight = answerCont.scrollHeight + 'px';
block.classList.add('active');
}
});
});
});

View File

@@ -0,0 +1 @@
../../../../../../womb3-simplex.mjs/simplex-noise.mjs

View File

@@ -0,0 +1 @@
../../../../../../womb3-simplex.mjs/womb3-simplex.mjs

View File

@@ -0,0 +1,49 @@
"use strict";
import("../modules/hotline.mjs").then((module) => {
// Imported the hotline.mjs module
// Initializing an instance of the hotline.mjs
const instance = new module.hotline(document.getElementById("wrap"));
// Initializing settings of the hotline instance
instance.alive = true;
instance.wheel = false;
instance.delta = 3;
instance.step = -0.5;
// Starting the hotline instance
instance.start();
});
import("../modules/womb3-simplex.mjs").then((module) => {
// Initializing the instance
const womb = new module.womb(document.getElementById("introdution_animation"));
womb.block = {
width: 40,
height: 40,
};
womb.init();
womb.generate(undefined, '#000');
// Initializing the process registers
let offset = 0;
let speed = 0.01;
// Starting the process
setInterval(function () {
womb.dump();
womb.generate((offset += speed), '#000');
}, 60);
// Initializing the resizing event processor
window.addEventListener(
"resize",
function (e) {
womb.init();
womb.dump();
womb.generate((offset += speed), '#000');
},
true
);
});

View File

@@ -1,7 +1,7 @@
@charset "UTF-8";
aside {
&:not(:has(*)) {
display: none;
}
&:not(:has(*)) {
display: none;
}
}

View File

@@ -1,45 +1,67 @@
@charset "UTF-8";
@media (prefers-color-scheme: default) {
:root {
--text-color: #fff;
--text-color-inverted: #000;
--button-background-color-inverted: #fff;
--button-background-color: #000;
--section-background-color-inverted: #fff;
--section-background-color: #000;
--background-color: #000;
--background-color-inverted: #fff;
--interface-top-background-color: var(--background-color, #000);
--interface-background-color: var(--background-color, #000);
--interface-bottom-background-color: var(--background-color, #000);
--red: red;
--white: #fff;
--blue: #0ea5e9;
--paper: var(--white);
}
}
@media (prefers-color-scheme: dark) {
:root {
--text-color: #fff;
--text-color-inverted: #000;
--button-background-color-inverted: #fff;
--button-background-color: #000;
--section-background-color-inverted: #fff;
--section-background-color: #000;
--background-color: #000;
--background-color-inverted: #fff;
:root {
--text-color: #fff;
--text-color-inverted: #000;
--button-background-color-inverted: #fff;
--button-background-color: #000;
--section-background-color-inverted: #fff;
--section-background-color: #fff;
--background-color: #000;
--background-color-inverted: #fff;
--interface-top-background-color: var(--background-color, #000);
--interface-background-color: var(--background-color, #000);
--interface-bottom-background-color: var(--background-color, #000);
--interface-top-background-color: var(--background-color, #000);
--interface-background-color: var(--background-color, #000);
--interface-bottom-background-color: var(--background-color, #000);
--red: red;
--white: #fff;
--red: red;
--white: #fff;
--paper: var(--white);
}
--paper: var(--white);
}
}
@media (prefers-color-scheme: light) {
:root {
--text-color: #fff;
--text-color-inverted: #000;
--button-background-color-inverted: #fff;
--button-background-color: #000;
--section-background-color-inverted: #fff;
--section-background-color: #000;
--background-color: #000;
--background-color-inverted: #fff;
:root {
--text-color: #fff;
--text-color-inverted: #000;
--button-background-color-inverted: #fff;
--button-background-color: #000;
--section-background-color-inverted: #fff;
--section-background-color: #000;
--background-color: #000;
--background-color-inverted: #fff;
--interface-top-background-color: var(--background-color, #000);
--interface-background-color: var(--background-color, #000);
--interface-bottom-background-color: var(--background-color, #000);
--interface-top-background-color: var(--background-color, #000);
--interface-background-color: var(--background-color, #000);
--interface-bottom-background-color: var(--background-color, #000);
--red: red;
--white: #fff;
--red: red;
--white: #fff;
--paper: var(--white);
}
--paper: var(--white);
}
}

View File

@@ -0,0 +1,118 @@
@charset "UTF-8";
.advantages {
margin: 0 auto;
width: 48rem;
> h2.title {
text-align: center;
font-size: 2.4rem;
font-family: "Bahnschrift";
margin: 0.1em 0 0.2em 0;
}
.accordion {
.accordion-item {
border-bottom: 1px solid #4d5974;
button[aria-expanded="true"] {
border-bottom: 1px solid #0ea5e9;
}
&:last-child {
border: none;
}
}
button {
position: relative;
display: block;
text-align: left;
width: 100%;
padding: 1em 0;
color: #7288a2;
font-size: 1.2rem;
font-family: "Bahnschrift";
font-weight: 400;
border: none;
background: none;
outline: none;
&:hover,
&:focus {
cursor: pointer;
color: #0ea5e9;
&::after {
cursor: pointer;
color: #0ea5e9;
border: 1px solid #0ea5e9;
}
}
.title {
padding: 1em 1.5em 1em 0;
}
.icon {
display: inline-block;
position: absolute;
top: 18px;
right: 0;
width: 22px;
height: 22px;
border: 1px solid;
border-radius: 22px;
&::before {
display: block;
position: absolute;
content: "";
top: 11px;
left: 6px;
width: 10px;
height: 2px;
background: currentColor;
}
&::after {
display: block;
position: absolute;
content: "";
top: 7px;
left: 10px;
width: 2px;
height: 10px;
background: currentColor;
}
}
}
}
button[aria-expanded="true"] {
color: #0ea5e9;
.icon {
&::after {
width: 0;
}
}
+ .accordion-content {
opacity: 1;
max-height: 9em;
transition: all 200ms linear;
will-change: opacity, max-height;
}
}
.accordion-content {
opacity: 0;
max-height: 0;
overflow: hidden;
transition: opacity 200ms linear, max-height 200ms linear;
will-change: opacity, max-height;
p {
align-items: left;
font-size: 1.05rem;
font-weight: 300;
font-family: "Bahnschrift";
margin: 2em 0;
}
}
}

View File

@@ -0,0 +1,54 @@
@charset "UTF-8";
section#company {
justify-self: end;
width: 160px;
padding: 1rem;
padding-bottom: unset;
display: flex;
flex-direction: column;
gap: 0.5rem;
font-family: "Bahnschrift";
> h4.name {
margin: unset;
display: block;
text-align: right;
font-weight: 600;
font-size: 1rem;
}
> p.column {
margin: unset;
display: inline-flex;
flex-direction: column;
text-align: right;
gap: 0.2em;
font-size: 0.8rem;
color: grey;
> span.row {
display: inline-flex;
justify-content: end;
font-weight: 400;
&:before {
margin-right: auto;
font-weight: 600;
color: #fff;
}
}
> span.tax {
&:before {
content: var(--company-tax) ":";
}
}
> span.identifier {
&:before {
content: var(--company-identifier) ":";
}
}
}
}

View File

@@ -0,0 +1,54 @@
@charset "UTF-8";
section#cookies {
--shadow: 4px 4px 10px 0px rgb(0 0 0 / 45%);
z-index: 3100;
right: var(--fixed-right, 2rem);
bottom: var(--fixed-bottom, 2rem);
position: fixed;
font-family: "Bahnschrift";
/* border: 1px solid #a8a8a847; */
border: 1px solid #fff;
/* border-right: unset;
border-bottom: unset; */
border-radius: 0.75rem;
color: #fff;
background-color: #000000b8;
background-color: #000000;
/* backdrop-filter: blur(3px); */
box-shadow: var(--shadow);
-webkit-box-shadow: var(--shadow);
-moz-box-shadow: var(--shadow);
transition: opacity 0.1s ease-out;
> div {
padding: 0.8rem 1.2rem 0.7rem;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
> p {
margin: unset;
font-size: 1rem;
}
> small {
font-size: 0.8rem;
font-weight: 200;
color: #a6a69d;
}
}
> button {
top: -0.4rem;
right: -2rem;
position: absolute;
padding: unset;
padding-right: 0.1em;
cursor: pointer;
border: unset;
color: #f00;
background: unset;
}
}

View File

@@ -0,0 +1,70 @@
@charset "UTF-8";
section#cookies {
--shadow: 4px 4px 10px 0px rgb(0 0 0 / 45%);
z-index: var(--cookies-z-index, 6000);
right: var(--cookies-right, 2rem);
bottom: var(--cookies-bottom, 2rem);
position: fixed;
width: var(--cookies-width, 400px);
height: var(--cookies-height, 40px);
/* padding: 0.8rem 1.2rem 0.7rem; */
font-family: "Bahnschrift";
color: #fff;
transition: opacity 0.1s ease-out;
:is(> label[for="cookies"]:focus) {
opacity: 0;
}
+ div.cookies.background {
z-index: calc(var(--cookies-z-index, 6000) - 1);
right: var(--cookies-right, 2rem);
bottom: var(--cookies-bottom, 2rem);
position: fixed;
width: var(--cookies-width, 400px);
height: var(--cookies-height, 40px);
border: 1px solid #a8a8a847;
border-right: unset;
border-bottom: unset;
border-radius: 0.75rem;
background-color: #33323691;
backdrop-filter: blur(3px);
mix-blend-mode: screen;
box-shadow: var(--shadow);
-webkit-box-shadow: var(--shadow);
-moz-box-shadow: var(--shadow);
}
> div {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
> p {
margin: unset;
font-size: 1rem;
}
> small {
font-size: 0.8rem;
font-weight: 200;
color: #a6a69d;
}
}
> label {
right: -20px;
top: -20px;
position: absolute;
padding: unset;
padding-right: 0.1em;
cursor: pointer;
border: unset;
color: #f00;
background: unset;
}
}

View File

@@ -0,0 +1,94 @@
@charset "UTF-8";
section#description {
padding-top: 1.5rem;
gap: 1rem;
> p {
margin: unset;
width: var(--width);
font-family: "Cascadia Code";
font-weight: 300;
font-size: 0.8rem;
> span {
font-weight: 400;
}
+ small {
font-family: "Bahnschrift";
font-weight: 100;
}
}
> ul.table {
/* --border-color: #000; */
--border-color: unset;
margin: unset;
margin-top: 1rem;
width: var(--width);
padding: unset;
display: flex;
flex-direction: column;
font-family: "Bahnschrift";
font-size: 0.8rem;
font-weight: 400;
list-style: none;
overflow: hidden;
border-radius: 0.75rem;
border: 1px solid var(--border-color);
> li {
height: 3rem;
display: flex;
border-bottom: 1px dashed var(--border-color);
&:is(:last-of-type) {
border-bottom: unset;
}
> span {
padding: 0.25rem 0.45rem;
display: inline;
align-content: center;
&:is(.bad) {
width: 45%;
opacity: 0.6;
border-right: 1px solid var(--border-color);
/* background-color: #ffe1e1; */
> i.icon.close {
margin-top: -0.4em;
color: #c64d4d;
}
}
&:is(.good) {
width: 70%;
/* background-color: #e0ffd5; */
> i.icon.check {
min-width: var(--width);
color: #77b81b;
}
}
> i.icon {
float: left;
height: 100%;
}
}
}
}
> strong.partners {
font-family: "Geologica";
font-weight: 400;
font-size: 1.2rem;
> span {
color: #1e1df2;
}
}
}

View File

@@ -0,0 +1,162 @@
@charset "UTF-8";
section#introdution {
position: relative;
width: 100%;
height: var(--introdution-height, 350px);
overflow: hidden;
+ section.row {
--shadow: 0px -10px 60px 30px rgba(0, 0, 0, 0.6);
padding-top: 1rem;
box-shadow: var(--shadow);
-webkit-box-shadow: var(--shadow);
-moz-box-shadow: var(--shadow);
}
> div.information {
z-index: 200;
position: fixed;
width: 30vw;
display: flex;
flex-direction: column;
align-items: center;
cursor: default;
> span#label {
margin-top: -2em;
padding: 0.4em 0.8em 0.2em 1.2em;
display: flex;
justify-content: center;
align-items: center;
gap: 1em;
font-size: 1.2rem;
font-family: "Bahnschrift";
font-weight: 400;
border-radius: 1.125rem;
color: #aeb629;
border: 1px solid #bababa1c;
background-color: #6262623b;
backdrop-filter: blur(1.3px);
> i.icon.code {
margin-bottom: 3px;
}
}
> h2#title {
margin: unset;
width: max-content;
padding: 0.2em 0.5em 0em;
font-family: Bahnschrift;
font-size: 2.6rem;
font-weight: 400;
color: #fff;
text-shadow:
0px 0px 4px #ffffff,
0px 0px 9px #ffffff96;
}
> p#team {
margin: unset;
width: 100%;
/* height: 70px; */
box-sizing: border-box;
padding: 0.6em 1em;
text-align: center;
font-size: 1.2rem;
font-family: "Bahnschrift";
font-weight: 400;
border-radius: 0.75rem;
background-color: #fff;
> b {
color: #152bcb;
}
> strong {
color: #de1111;
}
}
> span {
position: absolute;
display: flex;
padding: 0.4em 0.8rem 0.3em;
font-size: 1.2rem;
font-family: "Bahnschrift";
font-weight: 400;
border-radius: 0.75rem;
background-color: #fff;
}
}
> div.background {
z-index: 100;
top: -5%;
left: -5%;
position: absolute;
width: 110%;
height: 110%;
animation-name: appearance;
animation-fill-mode: forwards;
animation-duration: 0.2s;
animation-timing-function: ease-in;
filter: blur(1.8px) contrast(50);
> div.dots {
--dot-bg: black;
--dot-color: #00ff00;
--dot-size: 4px;
--dot-space: 7px;
z-index: -50;
position: absolute;
width: 100%;
height: 100%;
background:
linear-gradient(
90deg,
var(--dot-bg) calc(var(--dot-space) - var(--dot-size)),
transparent 1%
)
center / var(--dot-space) var(--dot-space),
linear-gradient(
var(--dot-bg) calc(var(--dot-space) - var(--dot-size)),
transparent 1%
)
center / var(--dot-space) var(--dot-space),
var(--dot-color);
mix-blend-mode: color-burn;
filter: contrast(5);
}
> video:only-of-type {
z-index: -100;
position: absolute;
width: 100%;
height: 100%;
object-fit: cover;
object-position: center;
scale: 1.1;
filter: blur(5px);
}
> canvas#introdution_animation {
z-index: -100;
position: absolute;
width: 100%;
scale: 1.2;
filter: url(#blob) contrast(var(--contrast, 30));
}
}
}
@keyframes appearance {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}

View File

@@ -0,0 +1,27 @@
@charset "UTF-8";
nav#links {
flex-grow: 1;
display: inline-flex;
justify-content: center;
gap: 1rem;
> a {
text-decoration: none;
font-family: "Geologica";
font-weight: 400;
font-size: 0.85rem;
color: #807f7f;
transition: color 0.1s ease-out;
&:is(:hover, :focus) {
color: #d5d5d5;
transition: color 0s;
}
&:active {
color: #4b4b4b;
transition: color 0s;
}
}
}

View File

@@ -0,0 +1,41 @@
@charset "UTF-8";
section#office {
display: flex;
height: 100%;
> div.map {
width: 250px;
height: 100%;
overflow: hidden;
border-radius: 0.75rem;
border: 1px solid #fff;
background-color: #0c110c;
> div.loading {
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
filter: brigtless(0.8) blur(1px);
&:before {
margin-top: 50px;
position: absolute;
content: var(--map-loading, "Loading");
width: max-content;
text-align: center;
font-family: "Geologica";
font-style: normal;
font-weight: 400;
font-size: 0.6rem;
color: #533a3a;
}
> i.icon.loading.spinner {
color: #fff;
}
}
}
}

View File

@@ -0,0 +1,72 @@
@charset "UTF-8";
section#projects {
padding-top: 2.5rem;
padding-bottom: 1rem;
/* transform: rotate3d(220, -777, -100, 385deg) scale(1.1); */
> h2.title {
font-size: 2.4rem;
font-family: "Bahnschrift";
margin: 0.1em 0 0.2em 0;
}
div.hotline {
width: 100vw;
height: 250px;
display: inline-flex;
gap: 15px;
> :is(article, div) {
position: relative;
min-width: 220px;
max-width: 220px;
width: 220px;
height: 100%;
overflow: hidden;
border-radius: 0.75rem;
h4 {
position: absolute;
z-index: 50;
justify-self: center;
bottom: 0.4rem;
margin: unset;
padding: 0.4rem 1rem 0.3rem;
font-family: "Bahnschrift";
font-size: 1.2rem;
font-weight: 900;
color: #fff;
text-shadow: 2px 2px 3px #000;
}
img.background {
position: absolute;
top: 0;
width: 100%;
height: 100%;
object-fit: cover;
}
&:is(.pechatalka) {
> img.background {
filter: blur(1.5px) brightness(0.8);
}
}
&:is(.understyle) {
> img.background {
object-position: bottom;
filter: blur(1px) brightness(0.8);
}
}
&:is(.surikov) {
> img.background {
object-position: bottom;
filter: blur(0.4px) brightness(0.8);
}
}
}
}
}

View File

@@ -0,0 +1,62 @@
@charset "UTF-8";
section#services {
margin: unset;
display: flex;
gap: 5px;
> div#service {
display: inline-flex;
gap: 20px;
> div#card {
width: 270px;
height: 300px;
padding: 1rem 0.8rem;
flex-direction: column;
border-radius: 1.125rem;
background-color: #fff;
box-shadow: 0px 0px 15px 0px rgba(14, 165, 233, 0.1);
> div.text {
height: 82%;
margin-bottom: 1em;
display: flex;
flex-direction: column;
> p.title {
margin: 0 auto;
font-size: 1.2rem;
font-family: "Geologica";
font-weight: 800;
color: #0ea5e9;
}
> span.discription {
margin: 1em 0;
font-size: 1rem;
font-family: "Geologica";
font-weight: 200;
}
}
> a {
max-width: 250px;
padding: 0.6em 0.8em;
text-decoration: none;
font-size: 1rem;
font-family: "Geologica";
font-weight: 300;
border: 0.15em solid #0ea5e9;
border-radius: 1.125rem;
color: #0ea5e9;
transition: ease 0.2s;
&:hover {
background-color: #0ea5e9;
color: #fff;
}
}
}
}
}

View File

@@ -0,0 +1,41 @@
@charset "UTF-8";
section#shortcut {
> div {
width: var(--width);
display: flex;
flex-direction: row;
gap: 1rem;
> div.column {
display: flex;
flex-direction: column;
&:is(.statistics) {
width: 300px;
> p {
margin: unset;
margin-top: 0.8rem;
display: flex;
gap: 0.4rem;
font-family: "Cascadia Code";
font-weight: 600;
&:is(:first-of-type) {
margin-top: unset;
}
> span {
font-weight: 400;
}
+ small {
font-family: "Bahnschrift";
font-weight: 100;
}
}
}
}
}
}

View File

@@ -0,0 +1,76 @@
@charset "UTF-8";
section#telegram {
--diameter: var(--telegram-diameter, 50px);
z-index: 3000;
bottom: var(--fixed-bottom);
left: var(--fixed-left);
position: fixed;
width: var(--diameter);
height: var(--diameter);
display: flex;
justify-content: center;
align-items: center;
> a {
z-index: 200;
width: 100%;
height: 100%;
border-radius: 100%;
box-shadow: 0px 0px 8px 0px rgb(0 0 0 / 30%);
transition: scale 0.1s ease-out;
&:is(:hover, :focus) {
scale: 1.05;
transition: scale 0.1s ease-in;
}
&:active {
scale: 1;
filter: brightness(0.8);
transition: scale 0s;
}
> img {
width: 100%;
height: 100%;
}
}
> div {
--half: calc(var(--telegram-diameter, 0) / 2);
--border-radius: 10rem;
--gap: 1rem;
--border: 1px;
z-index: 100;
left: var(--half);
position: absolute;
width: max-content;
height: 100%;
box-sizing: border-box;
padding-right: 2rem;
padding-left: calc(var(--half, 0) + var(--gap, 1rem));
display: flex;
flex-direction: column;
justify-content: center;
font-family: "Bahnschrift";
border-radius: 0 var(--border-radius) var(--border-radius) 0;
border: var(--border, 1px) solid #ded9fae6;
border-bottom: unset;
background-color: #c0bcd6cc;
backdrop-filter: blur(2px);
> span {
font-size: 1.2rem;
font-weight: 400;
color: #09394e;
}
> small {
margin-top: -0.2em;
font-size: 0.8rem;
font-weight: 400;
color: #415970;
}
}
}

View File

@@ -0,0 +1,47 @@
@charset "UTF-8";
section#workload {
height: 80px;
padding-top: unset !important;
padding-bottom: 1rem;
display: inline-flex;
justify-content: center;
align-items: center;
> p {
margin: unset;
display: inline-flex;
align-items: center;
gap: 1rem;
font-family: "Cascadia Code";
font-size: 1.2rem;
> span {
position: relative;
margin-left: 1rem;
font-weight: 700;
&:is(.small) {
color: #18c32a;
}
&:is(.medium) {
color: #184dc3;
}
&:is(.heavy) {
color: #ff0b0b;
}
> small {
right: 0;
bottom: -1rem;
position: absolute;
width: max-content;
font-size: 0.8rem;
font-weight: 300;
color: initial;
}
}
}
}

View File

View File

@@ -1,7 +1,28 @@
@charset "UTF-8";
footer {
&:not(:has(*)) {
display: none;
}
}
z-index: 4000;
position: relative;
height: var(--footer-height, 200px);
padding: 1rem 10vw;
display: flex;
align-items: self-end;
color: #fff;
background-color: #000;
--shadow: 0px 0px 80px 25px rgba(0, 0, 0, 0.4);
box-shadow: var(--shadow);
-webkit-box-shadow: var(--shadow);
-moz-box-shadow: var(--shadow);
> div.column {
height: 100%;
display: flex;
flex-direction: column;
justify-content: end;
gap: 1rem;
&:is(:last-of-type:last-child) {
margin-left: auto;
}
}
}

View File

@@ -1,68 +1,75 @@
@charset "UTF-8";
header {
z-index: 1000;
top: 0;
left: 0;
position: fixed;
position: absolute;
width: 100vw;
height: 70px;
box-sizing: border-box;
padding: 0 20%;
display: flex;
justify-content: space-between;
background-color: #931919;
height: calc(var(--menu-height) + var(--introdution-height));
pointer-events: none;
&:not(:has(*)) {
display: none;
}
>span#logotype {
> div {
top: 0;
position: sticky;
width: 100%;
height: var(--menu-height);
box-sizing: border-box;
padding: 0 20%;
display: flex;
flex-direction: column;
font-size: 1.1rem;
>h4:only-of-type:first-child {
margin: unset;
font-family: "Cascadia Code";
font-size: 2.8em;
}
>small:only-of-type:last-child {
justify-self: end;
align-self: end;
margin-top: -0.8em;
font-family: 'Bahnschrift';
font-size: 0.7em;
font-weight: 800;
text-transform: uppercase;
}
}
>nav#menu {
display: flex;
justify-content: center;
justify-content: space-between;
align-items: center;
gap: 1rem;
font-family: 'Geologica';
pointer-events: all;
background-color: #fff;
>a {
text-decoration: none;
font-weight: 600;
font-size: 1rem;
text-transform: uppercase;
color: #fff;
&:not(:has(*)) {
display: none;
}
}
>a#order {
align-self: center;
background-color: #660909;
padding: 0.5em 1.3em;
border-radius: 1.125em;
color: #fff;
font-family: 'Cascadia Code';
font-weight: 400;
text-decoration: none;
border: 2px solid;
> a#logotype {
margin-top: -0.4rem;
display: flex;
flex-direction: column;
font-size: 1.1rem;
text-decoration: none;
color: #000;
> h4:only-of-type:first-child {
margin: unset;
font-family: "Cascadia Code";
font-size: 2.5em;
}
> small:only-of-type:last-child {
justify-self: end;
align-self: end;
margin-top: -0.8em;
font-family: "Bahnschrift";
font-size: 0.62em;
font-weight: 800;
text-transform: uppercase;
}
}
> nav#menu {
display: flex;
justify-content: center;
align-items: center;
gap: 1rem;
font-family: "Geologica";
> a {
text-decoration: none;
font-weight: 500;
font-size: 1rem;
text-transform: uppercase;
color: rgb(0, 0, 0, 0.5);
transition: ease 0.2s;
&:hover {
color: #000;
}
}
}
}
}

14
kodorvan/perm/system/public/themes/default/css/main.css Executable file → Normal file
View File

@@ -6,16 +6,16 @@
@import url("https://fonts.googleapis.com/css2?family=Montserrat:wght@900&display=swap");
@import url("https://fonts.googleapis.com/css2?family=Geologica:wght@100..900&family=Pochaevsk&display=swap");
body {
margin: unset;
}
main {
flex-grow: 1;
margin-top: var(--menu-height);
display: flex;
flex-direction: column;
flex-grow: 1;
align-items: center;
gap: var(--gap);
transition: 0s;
overflow-x: hidden;
&:not(:has(*)) {
display: none;
}
}

View File

@@ -0,0 +1,130 @@
@charset "UTF-8";
main {
> section.row {
z-index: 500;
width: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
background-color: #fff;
> h2#title {
font-size: 2.4rem;
font-family: "Bahnschrift";
margin: 0.1em 0 0.2em 0;
> span {
color: #0ea5e9;
}
}
> p#description {
margin: unset;
text-align: center;
font-size: 1.2rem;
font-family: "Geologica";
font-weight: 400;
color: rgb(0, 0, 0, 0.6);
> span {
color: #0ea5e9;
font-weight: 800;
}
}
> p.description {
width: 40%;
}
> a#order {
padding: 0.5em 1.3em;
margin-top: 1rem;
display: flex;
align-items: center;
gap: 5px;
border-radius: 1.125em;
font-size: 1em;
font-family: "Geologica";
font-weight: 400;
text-decoration: none;
background-color: #0ea5e9;
color: #fff;
transition: 0.2s;
&:hover {
transform: scale(1.05);
}
}
> div#team {
margin-top: 1rem;
display: inline-flex;
justify-content: center;
align-items: center;
gap: 1rem;
> div#card {
padding: 0.6em 0.8em;
width: 180px;
height: 220px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
text-align: center;
border-radius: 1.125rem;
box-shadow: 0px 0px 15px 0px rgba(14, 165, 233, 0.1);
background-color: #fff;
transition: ease 0.2s;
> img {
object-fit: cover;
width: 140px;
height: 140px;
border-radius: 100%;
}
> p {
margin: 1em 0 0;
font-size: 1.2em;
font-family: "Geologica";
font-weight: 900;
color: #000000;
}
> span {
font-size: 1em;
font-family: "Geologica";
font-weight: 400;
color: #0ea5e9;
}
}
}
> a#telegram {
padding: 0.5em 1.3em;
margin-top: 1rem;
display: flex;
align-items: center;
gap: 5px;
border-radius: 1.125em;
font-size: 1em;
font-family: "Geologica";
font-weight: 400;
text-decoration: none;
background-color: #0ea5e9;
color: #fff;
transition: 0.2s;
&:hover {
transform: scale(1.05);
}
> img {
width: 20px;
height: 20px;
}
}
}
}

View File

@@ -1,7 +1,20 @@
@charset "UTF-8";
:root {
--width: max(850px, 45vw);
--menu-height: 70px;
--introdution-height: min(350px, 35vh);
--gap: min(12px, 1rem);
--fixed-right: 3rem;
--fixed-bottom: 2rem;
--fixed-left: 3rem;
--telegram-diameter: 50px;
--cookies-z-index: 6000;
--cookies-right: var(--fixed-right);
--cookies-bottom: var(--fixed-bottom);
--cookies-width: 24rem;
--cookies-height: 4rem;
/* font-family: , system-ui, sans-serif; */
font-family: "dejavu";
@@ -11,18 +24,12 @@
transition: 0.1s ease-out;
}
/* Selection */
::selection {
color: var(--text-selected-color);
background: var(--text-selected-background-color);
body {
margin: unset;
overflow-x: hidden;
background-color: #f7fafc;
}
::-moz-selection {
color: var(--text-selected-color);
background: var(--text-selected-background-color);
}
.unselectable {
-webkit-touch-callout: none;
-webkit-user-select: none;
@@ -31,4 +38,3 @@
-ms-user-select: none;
user-select: none;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 447 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 762 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="1000px" height="1000px" viewBox="0 0 1000 1000" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
<title>Artboard</title>
<desc>Created with Sketch.</desc>
<defs>
<linearGradient x1="50%" y1="0%" x2="50%" y2="99.2583404%" id="linearGradient-1">
<stop stop-color="#2AABEE" offset="0%"></stop>
<stop stop-color="#229ED9" offset="100%"></stop>
</linearGradient>
</defs>
<g id="Artboard" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<circle id="Oval" fill="url(#linearGradient-1)" cx="500" cy="500" r="500"></circle>
<path d="M226.328419,494.722069 C372.088573,431.216685 469.284839,389.350049 517.917216,369.122161 C656.772535,311.36743 685.625481,301.334815 704.431427,301.003532 C708.567621,300.93067 717.815839,301.955743 723.806446,306.816707 C728.864797,310.92121 730.256552,316.46581 730.922551,320.357329 C731.588551,324.248848 732.417879,333.113828 731.758626,340.040666 C724.234007,419.102486 691.675104,610.964674 675.110982,699.515267 C668.10208,736.984342 654.301336,749.547532 640.940618,750.777006 C611.904684,753.448938 589.856115,731.588035 561.733393,713.153237 C517.726886,684.306416 492.866009,666.349181 450.150074,638.200013 C400.78442,605.66878 432.786119,587.789048 460.919462,558.568563 C468.282091,550.921423 596.21508,434.556479 598.691227,424.000355 C599.00091,422.680135 599.288312,417.758981 596.36474,415.160431 C593.441168,412.561881 589.126229,413.450484 586.012448,414.157198 C581.598758,415.158943 511.297793,461.625274 375.109553,553.556189 C355.154858,567.258623 337.080515,573.934908 320.886524,573.585046 C303.033948,573.199351 268.692754,563.490928 243.163606,555.192408 C211.851067,545.013936 186.964484,539.632504 189.131547,522.346309 C190.260287,513.342589 202.659244,504.134509 226.328419,494.722069 Z" id="Path-3" fill="#FFFFFF"></path>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 90 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -62,7 +62,7 @@ final class templater extends controller implements array_access
$this->twig = new twig(new FilesystemLoader(VIEWS));
// Initializing global variables
$this->twig->addGlobal('theme', 'default');
$this->twig->addGlobal('theme', THEME);
$this->twig->addGlobal('server', $_SERVER);
$this->twig->addGlobal('cookies', $_COOKIE);
$this->twig->addGlobal('language', $language = $session?->buffer['language'] ?? language::en);

View File

@@ -2,9 +2,7 @@
{% endblock %}
{% block body %}
<aside>
</aside>
{% endblock %}
{% block js %}
{% endblock %}
{% endblock %}

1
kodorvan/perm/system/views/themes/default/core.html Executable file → Normal file
View File

@@ -28,4 +28,3 @@
</body>
</html>

View File

@@ -0,0 +1,11 @@
<style>
:root {
--company-identifier: "{{ language.name == 'ru' or true ? 'ОГРН' : 'ID' }}";
--company-tax: "{{ language.name == 'ru' or true ? 'ИНН' : 'TAX' }}";
}
</style>
<section id="company">
<h4 class="name">ИП Мирзаев</h4>
<p class="column"><span class="tax row">271103176488</span><span class="identifier row">322270000004691</span></p>
</section>

View File

@@ -0,0 +1,7 @@
<section id="cookies" class="unselectable">
<div>
<p>ИСПОЛЬЗУЕТСЯ ТЕХНОЛОГИЯ COOKIES</p>
<small>№152-ФЗ «О персональных данных»</small>
</div>
<button onclick="setTimeout(() => this.parentElement.remove(), 200); this.parentElement.style.opacity = 0"><i class="icon close small"></i></button>
</section>

View File

@@ -0,0 +1,7 @@
<nav id="links" class="unselectable">
<a href="/offer">ПУБЛИЧНАЯ ОФЕРТА</a>
<a href="https://ru.wikipedia.org/wiki/WTFPL">ЛИЦЕНЗИЯ</a>
<a href="https://t.me/kodorvan">КОДОРВАНЬ</a>
<a href="https://t.me/blog_mirzaev_sexy">МИРЗАЕВ</a>
<a href="https://git.svoboda.works/kodorvan">РЕПОЗИТОРИЙ</a>
</nav>

View File

@@ -0,0 +1,13 @@
<style>
:root {
--map-loading: "Загрузка карты";
}
</style>
<section id="office">
<div class="map">
<div class="loading">
<i class="icon loading spinner animated"></i>
</div>
</div>
</section>

View File

@@ -0,0 +1,10 @@
<section id="telegram" class="unselectable">
<a href="https://t.me/kodorvan?direct" rel="nofollow">
<img src="themes/default/images/icons/telegram.svg" alt="Telegram logotype icon" ondragstart="return false"/>
</a>
<div>
<span>Конструктор заказа</span>
<small>Получи стоимость за 2 минуты</small>
</div>
</section>

15
kodorvan/perm/system/views/themes/default/footer.html Executable file → Normal file
View File

@@ -1,9 +1,20 @@
{% block css %}
<link type="text/css" rel="stylesheet" href="/themes/default/css/elements/company.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/elements/links.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/elements/office.css" />
{% endblock %}
{% block body %}
<footer>
</footer>
<footer>
<div class="column">
{% include '/themes/default/elements/office.html' %}
{% include '/themes/default/elements/links.html' %}
</div>
<div class="column">
{% include '/themes/default/elements/company.html' %}
</div>
</footer>
{% endblock %}
{% block js %}

36
kodorvan/perm/system/views/themes/default/head.html Executable file → Normal file
View File

@@ -1,26 +1,26 @@
{% block title %}
<title>{% if head.title != empty %}{{ head.title }}{% else %}perm by kodorvan{% endif %}</title>
<title>{% if head.title != empty %}{{ head.title }}{% else %}perm by kodorvan{% endif %}</title>
{% endblock %}
{% block meta %}
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
{% for meta in head.metas %}
<meta {% for name, value in meta.attributes %}{{ name }}="{{ value }}" {% endfor %}>
{% endfor %}
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
{% for meta in head.metas %}
<meta {% for name, value in meta.attributes %}{{ name }}="{{ value }}" {% endfor %}>
{% endfor %}
{% endblock %}
{% block css %}
{% for element in css %}
<link type="text/css" rel="stylesheet"{% if element.href %} href="{{ element.href }}"{% endif %} />
{% endfor %}
<link type="text/css" rel="stylesheet" href="/themes/default/css/fonts.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/system.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/header.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/main.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/aside.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/footer.css" />
<style id="theme">
@import url('/themes/default/css/themes/default/colorscheme.css');
</style>
{% for element in css %}
<link type="text/css" rel="stylesheet" {% if element.href %} href="{{ element.href }}" {% endif %} />
{% endfor %}
<link type="text/css" rel="stylesheet" href="/themes/default/css/fonts.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/system.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/header.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/main.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/aside.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/footer.css" />
<style id="theme">
@import url('/themes/default/css/themes/default/colorscheme.css');
</style>
{% endblock %}

36
kodorvan/perm/system/views/themes/default/header.html Executable file → Normal file
View File

@@ -1,22 +1,16 @@
{% block css %}
{% endblock %}
{% block css %} {% endblock %} {% block body %}
<header>
<div>
<a href="https://perm.kodorvan.tech" id="logotype" class="unselectable">
<h4>КОДОРВАНЬ</h4>
<small>реальных программистов</small>
</a>
{% block body %}
<header>
<span id="logotype" class="unselectable">
<h4>КОДОРВАНЬ</h4>
<small>реальных программистов</small>
</span>
<nav id="menu" class="unselectable">
<a href="/project">Проекты</a>
<a href="/contacts">Контакты</a>
<a href="/comand">Команда</a>
</nav>
<a id="order" class="unselectable" href="https:/t.me/kodorvan?direct"><i class="icon letter"></i>Заказать</a>
</header>
{% endblock %}
{% block js %}
{% endblock %}
<nav id="menu" class="unselectable">
<a href="https://git.svoboda.works/kodorvan">Проекты</a>
<a href="#contacts">Контакты</a>
<a href="#services">Услуги</a>
</nav>
</div>
</header>
{% endblock %} {% block js %} {% endblock %}

29
kodorvan/perm/system/views/themes/default/index.html Executable file → Normal file
View File

@@ -5,27 +5,26 @@
{% use "/themes/default/footer.html" with css as footer_css, body as footer, js as footer_js %}
{% block css %}
{{ block('header_css') }}
{{ block('aside_css') }}
{{ block('footer_css') }}
{{ block('header_css') }}
{{ block('aside_css') }}
{{ block('footer_css') }}
{% endblock %}
{% block body %}
{{ block('header') }}
{{ block('header') }}
{{ block('aside') }}
{{ block('aside') }}
<main>
{% block main %}
{{ main|raw }}
{% endblock %}
</main>
<main>
{% block main %}
{{ main|raw }}
{% endblock %}
</main>
{{ block('footer') }}
{{ block('footer') }}
{% endblock %}
{% block js %}
{{ block('header_js') }}
{{ block('aside_js') }}
{{ block('footer_js') }}
{{ block('header_js') }}
{{ block('aside_js') }}
{{ block('footer_js') }}
{% endblock %}

10
kodorvan/perm/system/views/themes/default/js.html Executable file → Normal file
View File

@@ -1,5 +1,9 @@
{% block js %}
{% for element in js %}
<script {% if element.src %}src="{{ element.src }}"{% endif %} {% if element.type %}type="{{ element.type }}"{% endif %}>{{ element.innerText }}</script>
{% endfor %}
{% for element in js %}
<script
{% if element.src %}src="{{ element.src }}" {% endif %}
{% if element.type %}type="{{ element.type }}" {% endif %}>
{{ element.innerText }}
</script>
{% endfor %}
{% endblock %}

View File

@@ -0,0 +1,62 @@
<section class="advantages">
<h2 class="title unselectable">Преимущества</h2>
<div class="accordion">
<div class="accordion-item">
<button id="accordion-button-1" aria-expanded="false">
<span class="title ">Техническое задание</span>
<span class="icon" aria-hidden="true"></span>
</button>
<div class="accordion-content">
<p>Четкое описание всех требований и функционала проекта.</p>
</div>
</div>
<div class="accordion-item">
<button id="accordion-button-2" aria-expanded="false">
<span class="title">Хостинг на нашем сервере</span>
<span class="icon" aria-hidden="true"></span>
</button>
<div class="accordion-content">
<p>Проект может быть размещен на нашем сервере или перенесен на другой по желанию клиента.</p>
</div>
</div>
<div class="accordion-item">
<button id="accordion-button-3" aria-expanded="false">
<span class="title">Безопасность и приватность</span>
<span class="icon" aria-hidden="true"></span>
</button>
<div class="accordion-content">
<p>Код зашифрован, проект полностью приватный и защищен от несанкционированного доступа.</p>
</div>
</div>
<div class="accordion-item">
<button id="accordion-button-4" aria-expanded="false">
<span class="title">Бесплатная поддержка</span>
<span class="icon" aria-hidden="true"></span>
</button>
<div class="accordion-content">
<p>Помощь и консультация после запуска проекта.</p>
</div>
</div>
<div class="accordion-item">
<button id="accordion-button-5" aria-expanded="false">
<span class="title">Персонализированный подход</span>
<span class="icon" aria-hidden="true"></span>
</button>
<div class="accordion-content">
<p>Учет уникальных потребностей и пожеланий клиента.</p>
</div>
</div>
</div>
</section>

View File

@@ -0,0 +1,24 @@
<section id="comand" class="container">
<h2 id="title" class="unselectable">Разработчики</h2>
<p id="description" class="unselectable">
Более <span>12 лет</span> разработки в различных IT сферах
</p>
<div id="team">
<div id="card">
<img src="themes/test/images/avatar/123.jpg" alt="Арсен" />
<p class="unselectable">Арсен</p>
<span class="unselectable">Программист</span>
</div>
<div id="card">
<img src="themes/test/images/avatar/123.jpg" alt="Ксения" />
<p class="unselectable">Ксения</p>
<span class="unselectable">Coder</span>
</div>
<div id="card">
<img src="themes/test/images/avatar/123.jpg" alt="Альгиз" />
<p class="unselectable">Альгиз</p>
<span class="unselectable">Нроcетка и крипта</span>
</div>
</div>
</section>

View File

@@ -0,0 +1,17 @@
<section id="contacts" class="row unselectable">
<h2 id="title">Связатьcя с нами</h2>
<p id="description">Готовы обсудить ваш проект? Напишите нам!</p>
<a id="telegram" class="unselectable" href="https://t.me/kodorvan?direct">
<img src="themes/default/images/icons/telegram.svg" alt="">
<span>Telegram</span>
</a>
</section>
<!-- Готовы обсудить проект
заменить на
что-то связанное с конструктором заказа
написать о том что будет посчитана цена, составлено ТЗ, сроки
влепить что есть рассрочка, оплата по СБП, работа с юр лицами
поэтапная оплата и возможность индивидуального чего-нибудь -->

View File

@@ -0,0 +1,30 @@
<section id="description" class="row">
<p class="unselectable"><strong>Создание сайта</strong>, <strong>разработка чат-бота телеграм</strong>, <strong>написание парсера</strong>, <strong>подключение воронки</strong>, а так же разработка любой сложности калькулятора, интернет-магазина (маркетплейса) и полноценной CRM с нуля <strong>в Перми</strong></p>
<ul class="table unselectable">
<li>
<span class="bad"><i class="icon close small"></i>Не копируем проекты по шаблонам</span>
<span class="good"><i class="icon check small"></i><strong>Пишем код с нуля</strong> с использованием наших <strong>уникальных технологий</strong>, которые позволяют сокращать сроки разработки и преумножить качество проекта</span>
</li>
<li>
<span class="bad"><i class="icon close small"></i>Не перепродаём проекты другим заказчикам</span>
<span class="good"><i class="icon check small"></i><strong>Репозиторий и код проекта полностью передаются заказчику</strong> под нашу публичную репутацию, либо под патент или договор о неразглашении (NDA)</span>
</li>
<li>
<span class="bad"><i class="icon close small"></i>Не навязываем дополнительные услуги</span>
<span class="good"><i class="icon check small"></i><strong>Бесплатный сервер</strong> на время разработки, <strong>бесплатная установка на сервер заказчика</strong> и <strong>бесплатная техподдержка</strong></span>
</li>
<li>
<span class="bad"><i class="icon close small"></i>Не создаём зависимость от нашей команды</span>
<span class="good"><i class="icon check small"></i>Документируем код, пишем инструкции и разрабатываем систему вики-страниц на английском языке для <strong>длительной поддержки проекта</strong></span>
</li>
<li>
<span class="bad"><i class="icon close small"></i>Не вводим в заблуждение сложной терминологией</span>
<span class="good"><i class="icon check small"></i>Процесс работы можно наблюдать в реальном времени на нашем сайте, чтобы убедиться, что <strong>мы честно отрабатываем поставленную задачу</strong></span>
</li>
</ul>
<strong class="partners">Мы мотивированы сотрудничать на <span>постоянной основе</span>, поэтому <span>работаем на результат</span></strong>
</section>
<!-- , либо реально выгодная аренда сервера у нас по самой низкой цене на рынке и максимально эффективной техподдержкой с бесплатными бекапами и оперативной установкой критических обновлений безопасности -->

View File

@@ -0,0 +1,27 @@
<section id="introdution" class="row">
<div class="information">
<span id="label">
<i class="icon code slash"></i>
<span class="unselectable">ПРОФЕССИОНАЛЫ С ОПЫТОМ</span>
</span>
<h2 id="title" class="unselectable">ПЕРМСКИЕ РАЗРАБОТЧИКИ</h2>
<p id="team" class="unselectable"><b>Чистый код</b>, реальные сроки и собственные сервера в <strong>Перми</strong><br />по <b>честной цене</b> и с <b>вечной техподдержкой</b></p>
</div>
<div class="background" style="opacity: 0">
<div class="dots"></div>
<canvas id="introdution_animation"></canvas>
<svg style="position: absolute">
<defs>
<filter id="blob">
<feGaussianBlur in="SourceGraphic" stdDeviation="12" result="blur"></feGaussianBlur>
<feColorMatrix in="blur" mode="matrix" values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 19 -9" result="blob"></feColorMatrix>
</filter>
</defs>
</svg>
</div>
</section>

View File

@@ -0,0 +1,48 @@
<section id="projects" class="row unselectable">
<div id="wrap" class="hotline unselectable">
<article class="pechatalka">
<h4>ПЕЧАТАЛКА</h4>
<img class="background" src="/themes/default/images/projects/pechatalka.gif" alt="pechatalka" ondragstart="return false;"/>
</article>
<article class="understyle">
<h4>under.style</h4>
<img class="background" src="/themes/default/images/projects/understyle.png" alt="under.style" ondragstart="return false;"/>
</article>
<article class="surikov">
<h4>Музей-библиотека имени Сурикова</h4>
<img class="background" src="/themes/default/images/projects/surikov.png" alt="surikov" ondragstart="return false;"/>
</article>
<article class="pechatalka">
<h4>ПЕЧАТАЛКА</h4>
<img class="background" src="/themes/default/images/projects/pechatalka.gif" alt="pechatalka" ondragstart="return false;"/>
</article>
<article class="understyle">
<h4>under.style</h4>
<img class="background" src="/themes/default/images/projects/understyle.png" alt="under.style" ondragstart="return false;"/>
</article>
<article class="surikov">
<h4>Музей-библиотека имени Сурикова</h4>
<img class="background" src="/themes/default/images/projects/surikov.png" alt="surikov" ondragstart="return false;"/>
</article>
<article class="pechatalka">
<h4>ПЕЧАТАЛКА</h4>
<img class="background" src="/themes/default/images/projects/pechatalka.gif" alt="pechatalka" ondragstart="return false;"/>
</article>
<article class="understyle">
<h4>under.style</h4>
<img class="background" src="/themes/default/images/projects/understyle.png" alt="under.style" ondragstart="return false;"/>
</article>
<article class="surikov">
<h4>Музей-библиотека имени Сурикова</h4>
<img class="background" src="/themes/default/images/projects/surikov.png" alt="surikov" ondragstart="return false;"/>
</article>
</div>
</section>

View File

@@ -0,0 +1,2 @@
<section id="server" class="row">
</section>

View File

@@ -0,0 +1,35 @@
<section id="services" class="container ">
<h2 id="title">Предоставляемые услуги</h2>
<div id="service">
<div id="card">
<div class="text">
<p class="title">Телеграм-боты под ключ</p>
<span class="discription">Создаем Telegram-ботов для продаж, поддержки клиентов и автоматизации
бизнес-процессов. Рассматриваем разработку мини-приложений в Telegram: магазин, сервисы, игры и полноценные
платформы</span>
</div>
<a href="https://t.me/kodorvan?direct">Запустить бота за 7 дней</a>
</div>
<div id="card">
<div class="text">
<p class="title">Разработка сайта</p>
<span class="discription">Разработаем сайт любой сложности — от одностраничных лендингов до многофункциональных интернет-магазинов и представительных корпоративных сайтов. Каждый
проект будет современным и адаптивным</span>
</div>
<a href="https://t.me/kodorvan?direct">Заказать сайт</a>
</div>
<div id="card">
<div class="text">
<p class="title"> API-интеграции под ключ</p>
<span class="discription">Настраиваем надежное и безопасное взаимодействие вашего сайта или бота с любыми внешними сервисами. Интеграция с платежными системами, CRM, Telegram, базами данных и другими системами, чтобы автоматизировать бизнес-процессы.</span>
</div>
<a href="https://t.me/kodorvan?direct">Подключить</a>
</div>
</div>
</section>

View File

@@ -0,0 +1,11 @@
<section id="shortcut" class="row">
<div class="row">
<div class="statistics column">
<p>Репозитории:<span>{{ projects ?? 98 }}</span></p>
<small class="unselectable">Наши разработки + проекты заказчиков</small>
<p>Просмотры:<span>{{ month ?? '304 258' }}</span></p>
<small class="unselectable">За последние 30 дней</small>
</div>
</div>
</section>

View File

@@ -0,0 +1,3 @@
<section id="workload" class="row">
<p><i class="icon coffe"></i>Загруженность команды: <span class="{{ workload < 51 ? 'small' : (workload < 71 ? 'medium' : 'heavy')}}">{{ workload }}%<small class="unselectable">Обновлено 5 минут назад</small></span></p>
</section>

View File

@@ -0,0 +1,45 @@
{% extends "/themes/default/index.html" %}
{% block css %}
{{ parent() }}
<link type="text/css" rel="stylesheet" href="/css/icons/code_slash.css" />
<link type="text/css" rel="stylesheet" href="/css/icons/coffe.css" />
<link type="text/css" rel="stylesheet" href="/css/icons/telegram.css" />
<link type="text/css" rel="stylesheet" href="/css/icons/close.css" />
<link type="text/css" rel="stylesheet" href="/css/icons/check.css" />
<link type="text/css" rel="stylesheet" href="/css/icons/eye.css" />
<link type="text/css" rel="stylesheet" href="/css/icons/loading_spinner.css" />
<link type="text/css" rel="stylesheet" href="/css/icons/close.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/pages/index.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/elements/introdution.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/elements/shortcut.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/elements/description.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/elements/projects.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/elements/service.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/elements/advantages.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/elements/advantages.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/elements/telegram.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/elements/workload.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/elements/cookies.css" />
{% endblock %}
{% block main %}
{% include '/themes/default/main/elements/introdution.html' %}
{% include '/themes/default/main/elements/workload.html' %}
{% include '/themes/default/main/elements/shortcut.html' %}
{% include '/themes/default/main/elements/description.html' %}
{% include '/themes/default/main/elements/projects.html' %}
{% include '/themes/default/main/elements/server.html' %}
{% include '/themes/default/elements/telegram.html' %}
{% include '/themes/default/elements/cookies.html' %}
{% endblock %}
{% block js %}
{{ parent() }}
<script src="/js/modules/hotline.mjs" type="module"></script>
<script src="/js/modules/womb3-simplex.mjs" type="module"></script>
<script src="/js/pages/main.js" defer></script>
<script src="/js/modules/service.js" defer></script>
<script src="/js/modules/advantages.js" defer></script>
{% endblock %}

1
womb3-simplex.mjs Submodule

Submodule womb3-simplex.mjs added at d3f3fadbf2