3 Commits
0.1.0 ... 0.4.0

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

1
hotline.mjs Submodule

Submodule hotline.mjs added at 5e627e14ae

1
icons Submodule

Submodule icons added at cae2ed1a6c

View File

@@ -13,3 +13,23 @@ if [ -e kodorvan/perm/system/settings/*.sample ]; then
cp "$i" "${i/.sample/}"; cp "$i" "${i/.sample/}";
done done
fi 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)) { if (str_contains($this->request->headers['accept'] ?? '', content::html->value)) {
// Request for HTML response // 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 // Render page
$page = $this->view->render('index.html'); $page = $this->view->render('main/index.html');
// Sending response // Sending response
$this->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.003;
// Starting the process
setInterval(function () {
womb.dump();
womb.generate((offset += speed), '#000');
}, 20);
// Initializing the resizing event processor
window.addEventListener(
"resize",
function (e) {
womb.init();
womb.dump();
womb.generate((offset += speed), '#000');
},
true
);
});

View File

@@ -0,0 +1,116 @@
.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,61 @@
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;
}
}
> div.lists {
margin-top: 1rem;
display: flex;
width: var(--width);
> ul {
margin: unset;
padding: unset;
display: flex;
flex-direction: column;
gap: 0.4em;
font-family: "Bahnschrift";
font-size: 0.7rem;
font-weight: 300;
list-style: none;
&:is(.bad) {
width: 45%;
}
&:is(.good) {
margin-left: auto;
width: 70%;
> li {
gap: 0.4em;
> i.icon.check {
min-width: var(--width);
}
}
}
> li {
display: inline-flex;
align-items: center;
}
}
}
}

View File

@@ -0,0 +1,135 @@
section#introdution {
position: relative;
width: 100%;
height: min(350px, 35vh);
overflow: hidden;
> 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;
}
> 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%;
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: blur(1px); */
}
> 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));
}
}
}

View File

@@ -0,0 +1,68 @@
section#projects {
padding-top: 2.5rem;
>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,60 @@
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,35 @@
section#statistics {
> div.row {
width: var(--width);
display: flex;
flex-direction: row;
gap: 1rem;
> div.column {
display: flex;
flex-direction: column;
flex-grow: 1;
&:is(.statistics) {
width: 300px;
> p {
margin: unset;
display: flex;
gap: 0.4rem;
font-family: "Cascadia Code";
font-weight: 600;
> span {
font-weight: 400;
}
+ small {
font-family: "Bahnschrift";
font-weight: 100;
}
}
}
}
}
}

View File

@@ -0,0 +1,49 @@
section#workload {
--shadow: 0px -10px 60px 30px rgba(0, 0, 0, 0.6);
height: 100px;
box-sizing: border-box;
padding-bottom: 1rem;
display: inline-flex;
justify-content: center;
align-items: center;
box-shadow: var(--shadow);
-webkit-box-shadow: var(--shadow);
-moz-box-shadow: var(--shadow);
> 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

@@ -1,6 +1,6 @@
@charset "UTF-8"; @charset "UTF-8";
@media (prefers-color-scheme: dark) { @media (prefers-color-scheme: default) {
:root { :root {
--text-color: #fff; --text-color: #fff;
--text-color-inverted: #000; --text-color-inverted: #000;
@@ -15,6 +15,28 @@
--interface-background-color: var(--background-color, #000); --interface-background-color: var(--background-color, #000);
--interface-bottom-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: #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);
--red: red; --red: red;
--white: #fff; --white: #fff;

View File

View File

@@ -1,7 +1,42 @@
@charset "UTF-8"; @charset "UTF-8";
footer { footer {
box-sizing: border-box;
padding: 0 20%;
display: flex;
flex-direction: column;
justify-content: center;
text-align: center;
gap: 0.5rem;
margin: 2rem 0 1rem 0;
&:not(:has(*)) { &:not(:has(*)) {
display: none; display: none;
} }
> p#description {
text-align: center;
font-size: 1rem;
font-family: "Geologica";
font-weight: 400;
margin: unset;
color: rgb(0, 0, 0, 0.6);
}
> div#link {
display: inline-flex;
justify-content: center;
gap: 1rem;
> a {
text-decoration: none;
font-size: 1rem;
font-family: "Geologica";
font-weight: 400;
color: rgb(160, 160, 160);
transition: ease 0.2s;
&:hover {
color: #000;
}
}
}
} }

View File

@@ -5,64 +5,65 @@ header {
left: 0; left: 0;
position: fixed; position: fixed;
width: 100vw; width: 100vw;
height: 70px; height: var(--menu-height);
box-sizing: border-box; box-sizing: border-box;
padding: 0 20%; padding: 0 20%;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
background-color: #931919;
align-items: center;
background-color: #f7fafc;
z-index: 1000;
&:not(:has(*)) { &:not(:has(*)) {
display: none; display: none;
} }
>span#logotype { > a#logotype {
margin-top: -0.4rem;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
font-size: 1.1rem; font-size: 1.1rem;
text-decoration: none;
color: #000;
>h4:only-of-type:first-child { > h4:only-of-type:first-child {
margin: unset; margin: unset;
font-family: "Cascadia Code"; font-family: "Cascadia Code";
font-size: 2.8em; font-size: 2.5em;
} }
>small:only-of-type:last-child { > small:only-of-type:last-child {
justify-self: end; justify-self: end;
align-self: end; align-self: end;
margin-top: -0.8em; margin-top: -0.8em;
font-family: 'Bahnschrift'; font-family: "Bahnschrift";
font-size: 0.7em; font-size: 0.62em;
font-weight: 800; font-weight: 800;
text-transform: uppercase; text-transform: uppercase;
} }
} }
>nav#menu { > nav#menu {
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
gap: 1rem; gap: 1rem;
font-family: 'Geologica'; font-family: "Geologica";
>a { > a {
text-decoration: none; text-decoration: none;
font-weight: 600; font-weight: 500;
font-size: 1rem; font-size: 1rem;
text-transform: uppercase; text-transform: uppercase;
color: #fff; color: rgb(0, 0, 0, 0.5);
transition: ease 0.2s;
&:hover {
color: #000;
}
} }
} }
>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;
}
} }

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

@@ -6,16 +6,159 @@
@import url("https://fonts.googleapis.com/css2?family=Montserrat:wght@900&display=swap"); @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"); @import url("https://fonts.googleapis.com/css2?family=Geologica:wght@100..900&family=Pochaevsk&display=swap");
body { body {
margin: unset; margin: unset;
/* overflow-x: hidden; */
background-color: #f7fafc;
}
.unselectable {
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
outline: none;
} }
main { main {
flex-grow: 1; margin-top: var(--menu-height);
display: flex; display: flex;
flex-direction: column; flex-direction: column;
flex-grow: 1;
align-items: center; align-items: center;
gap: var(--gap);
transition: 0s; transition: 0s;
overflow-x: hidden;
&:not(:has(*)) {
display: none;
}
> section {
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,6 +1,8 @@
@charset "UTF-8"; @charset "UTF-8";
:root { :root {
--width: max(800px, 40vw);
--menu-height: 70px;
--gap: min(12px, 1rem); --gap: min(12px, 1rem);
/* font-family: , system-ui, sans-serif; */ /* font-family: , system-ui, sans-serif; */

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 @@
<svg fill="#FFFFFF" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 50 50" width="50px" height="50px"><path d="M46.137,6.552c-0.75-0.636-1.928-0.727-3.146-0.238l-0.002,0C41.708,6.828,6.728,21.832,5.304,22.445 c-0.259,0.09-2.521,0.934-2.288,2.814c0.208,1.695,2.026,2.397,2.248,2.478l8.893,3.045c0.59,1.964,2.765,9.21,3.246,10.758 c0.3,0.965,0.789,2.233,1.646,2.494c0.752,0.29,1.5,0.025,1.984-0.355l5.437-5.043l8.777,6.845l0.209,0.125 c0.596,0.264,1.167,0.396,1.712,0.396c0.421,0,0.825-0.079,1.211-0.237c1.315-0.54,1.841-1.793,1.896-1.935l6.556-34.077 C47.231,7.933,46.675,7.007,46.137,6.552z M22,32l-3,8l-3-10l23-17L22,32z"/></svg>

After

Width:  |  Height:  |  Size: 631 B

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)); $this->twig = new twig(new FilesystemLoader(VIEWS));
// Initializing global variables // Initializing global variables
$this->twig->addGlobal('theme', 'default'); $this->twig->addGlobal('theme', THEME);
$this->twig->addGlobal('server', $_SERVER); $this->twig->addGlobal('server', $_SERVER);
$this->twig->addGlobal('cookies', $_COOKIE); $this->twig->addGlobal('cookies', $_COOKIE);
$this->twig->addGlobal('language', $language = $session?->buffer['language'] ?? language::en); $this->twig->addGlobal('language', $language = $session?->buffer['language'] ?? language::en);

View File

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

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

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

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

@@ -2,8 +2,14 @@
{% endblock %} {% endblock %}
{% block body %} {% block body %}
<footer> <footer class="unselectable">
</footer> <p id="description">Профессиональная разработка ваших проектов</p>
<div id="link" class="unselectable" >
<a href="https://t.me/kodorvan?direct" > КОДОРВАНЬ</a>
<a href="https://git.svoboda.works/kodorvan">РЕПОЗИТОРИИ</a>
<a href="https://ru.wikipedia.org/wiki/WTFPL">WTFPL</a>
</div>
</footer>
{% endblock %} {% endblock %}
{% block js %} {% block js %}

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

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

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

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

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

@@ -12,12 +12,11 @@
{% block body %} {% block body %}
{{ block('header') }} {{ block('header') }}
{{ block('aside') }} {{ block('aside') }}
<main> <main>
{% block main %} {% block main %}
{{ main|raw }} {{main|raw}}
{% endblock %} {% endblock %}
</main> </main>

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

@@ -1,5 +1,9 @@
{% block js %} {% block js %}
{% for element in js %} {% for element in js %}
<script {% if element.src %}src="{{ element.src }}"{% endif %} {% if element.type %}type="{{ element.type }}"{% endif %}>{{ element.innerText }}</script> <script
{% endfor %} {% if element.src %}src="{{ element.src }}" {% endif %}
{% if element.type %}type="{{ element.type }}" {% endif %}>
{{ element.innerText }}
</script>
{% endfor %}
{% endblock %} {% 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="container 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,20 @@
<section id="description">
<p class="unselectable"><strong>Создание сайта</strong>, <strong>разработка чат-бота телеграм</strong>, <strong>написание парсера</strong>, <strong>подключение воронки</strong>, а так же разработка любой сложности калькулятора, интернет-магазина (маркетплейса) и полноценной CRM с нуля <strong>в Перми</strong></p>
<div class="lists unselectable">
<ul class="bad">
<li><i class="icon close small"></i>Не копируем проекты по шаблонам</li>
<li><i class="icon close small"></i>Не перепродаём проекты другим заказчикам</li>
<li><i class="icon close small"></i>Не навязываем дополнительные услуги</li>
<li><i class="icon close small"></i>Не создаём зависимость от нашей команды</li>
<li><i class="icon close small"></i>Не вводим в заблуждение сложной терминологией</li>
</ul>
<ul class="good">
<li><i class="icon check small"></i>Пишем код с нуля и используем наши уникальные технологии, проверенные годами практики и имеющие реальные преимущества</li>
<li><i class="icon check small"></i>Репозиторий и код проекта полностью передаётся заказчику либо под нашу репутацию, либо под патент или договор о неразглашении (NDA)</li>
<li><i class="icon check small"></i>Бесплатный сервер на время разработки и бесплатная установка на сервер заказчика, либо аренда сервера у нас по самой низкой цене на рынке и более оперативной техподдержкой</li>
<li><i class="icon check small"></i>Глубоко документируем код, пишем инструкции и вики-страницы в репозитории на английском языке для длительной поддержки проекта, либо комфортной передачи другим разработчикам</li>
<li><i class="icon check small"></i>Процесс работы можно наблюдать ежечасно в реальном времени на нашем сайте, чтобы убедиться, что программисты и дизайнеры реально отрабатывают поставленную им задачу</li>
</ul>
</div>
</section>

View File

@@ -0,0 +1,27 @@
<section id="introdution" class="container">
<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">
<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="container 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,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,10 @@
<section id="statistics">
<div class="row">
<div class="statistics column">
<p>Репозитории:<span>{{ projects ?? 97 }}</span></p>
<small>Наши разработки + проекты заказчиков</small>
</div>
<div class="office column"></div>
</div>
</section>

View File

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

View File

@@ -0,0 +1,37 @@
{% extends "/themes/default/index.html" %}
{% block css %}
<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="/themes/default/css/blocks/introdution.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/blocks/workload.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/blocks/statistics.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/blocks/description.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/blocks/projects.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/blocks/service.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/blocks/advantages.css" />
{% endblock %}
{% block main %}
{% include '/themes/default/main/blocks/introdution.html' %}
{% include '/themes/default/main/blocks/workload.html' %}
{% include '/themes/default/main/blocks/statistics.html' %}
{% include '/themes/default/main/blocks/description.html' %}
{% include '/themes/default/main/blocks/projects.html' %}
{% include '/themes/default/main/blocks/service.html' %}
{% include '/themes/default/main/blocks/advantages.html' %}
{% include '/themes/default/main/blocks/comand.html' %}
{% include '/themes/default/main/blocks/contacts.html' %}
{% endblock %}
{% block js %}
<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