популярные заказы

This commit is contained in:
2026-01-02 00:27:47 +05:00
parent 7fb037d155
commit d26b0ca9ea
93 changed files with 1570 additions and 492 deletions

0
.gitmodules vendored Normal file → Executable file
View File

View File

@@ -17,11 +17,6 @@
"email": "arsen@mirzaev.sexy", "email": "arsen@mirzaev.sexy",
"homepage": "https://mirzaev.sexy", "homepage": "https://mirzaev.sexy",
"role": "Programmer" "role": "Programmer"
},
{
"name": "Hollspae",
"email": "ksena.vilkova79@gmail.om",
"role": "Creator-Programmer"
} }
], ],
"support": { "support": {
@@ -29,7 +24,7 @@
"issues": "https://git.svoboda.works/kodorvan/perm/issues" "issues": "https://git.svoboda.works/kodorvan/perm/issues"
}, },
"require": { "require": {
"php": "^8.4", "php": "^8.5",
"mirzaev/minimal": "^3.8", "mirzaev/minimal": "^3.8",
"mirzaev/baza": "^3.4", "mirzaev/baza": "^3.4",
"mirzaev/languages": "^1", "mirzaev/languages": "^1",

732
composer.lock generated Normal file → Executable file

File diff suppressed because it is too large Load Diff

2
icons

Submodule icons updated: d6a92fc4bf...c4dedad538

View File

@@ -47,6 +47,143 @@ final class index extends core
// Initializing the team workload // Initializing the team workload
$this->view->workload = (string) ($_COOKIE['workload'] ?? rand(20, 80)); $this->view->workload = (string) ($_COOKIE['workload'] ?? rand(20, 80));
// Initializing services
$this->view->services = [
[
'class' => 'telegram voronka',
'title' => 'Телеграм воронка',
'icon_left' => '',
/* 'icon_center' => 'import', */
'icon_center' => 'crown',
'icon_right' => '',
'description' => <<<TXT
Поступательно запросит данные пользователя, скомпонует, запишет в базу данных и синхронизирует в CRM
<br><br>
Используя иммерсивные технологии и многофакторный сбор обеспечивает максимальное удержание пользователя
TXT,
'howto' => 'Направьте к нему клиентов и ждите новых заказов в вашей CRM, на сайте или в чате',
'buttons' => [
[
'icon' => 'comment',
'link' => ''
]
],
'theses' => [
[
'class' => 'yellow',
'characteristic' => '-80%',
'text' => 'НАГРУЗКА'
],
[
'class' => 'blue',
'colored' => true,
'characteristic' => '+5%',
'text' => 'КОНВЕРСИИ'
],
[
'class' => 'green',
'characteristic' => '0₽',
'text' => 'НИКАКОЙ АРЕНДЫ'
]
],
'background_image_src' => '/themes/default/images/telegram_voronka.png',
'background_image_alt' => 'Телеграм воронка КОДОРВАНЬ',
'cost' => '2000'
],
[
'class' => 'parser',
'title' => 'Парсер',
'icon_left' => '',
'icon_center' => 'search',
'icon_right' => '',
'description' => <<<TXT
Любая работа за компьютером может быть автоматизирована
<br><br>
Парсер берёт данные с сайтов через API, либо эмулируя пользователя, а так же из excel-документов, CRM и бухгалтерии, затем просчитывает, анализирует и записывает результат
TXT,
'howto' => 'Подключите источники и снизьте нагрузку на операторов, оптимизируйте процессы',
'extra' => [
'Wildberries',
'OZON',
'Yandex Market',
'Avito',
'CDEK',
'1C',
'Bitrix',
'Мой Склад'
],
'buttons' => [
[
'icon' => 'comment',
'link' => ''
]
],
'theses' => [
[
'class' => 'yellow',
'colored' => true,
'characteristic' => '-100%',
'text' => 'НАГРУЗКА'
],
[
'class' => 'cyan',
'icon' => 'infinity',
'text' => 'ВЕЧНАЯ ПОДДЕРЖКА'
],
[
'class' => 'green',
'icon' => 'play forwards',
'text' => 'РЕКОРД СКОРОСТИ'
]
],
'background_image_src' => '/themes/default/images/excel_small_compressed.jpg',
'background_image_alt' => 'Парсеры КОДОРВАНЬ',
'cost' => '3000'
],
[
'class' => 'calculator',
'title' => 'Калькулятор',
'icon_left' => '',
'icon_center' => 'calculator',
'icon_right' => '',
'description' => <<<TXT
Составление алгоритма обработки большого объёма данных с использованием нейросетей и грамотно выбранной сортировки
<br><br>
Оператор вводит данные, нажимает на кнопки, двигает ползунки и мгновенно получает точный результат вычислений
TXT,
'howto' => 'Настройте параметры в панели управления и в долгосрочной перспективе сэкономьте тысячи часов рабочего времени',
'extra' => [],
'buttons' => [
[
'icon' => 'comment',
'link' => ''
]
],
'theses' => [
[
'class' => 'yellow',
'characteristic' => '-95%',
'text' => 'НАГРУЗКА'
],
[
'class' => 'green',
'characteristic' => '-80%',
'text' => 'ОШИБОК ВЫЧИСЛЕНИЙ'
],
[
'class' => 'red',
'colored' => true,
'characteristic' => '+20%',
'text' => 'ОБУЧАЕМОСТЬ'
]
],
'background_image_src' => '/themes/default/images/tordv_compressed.jpg',
'background_image_alt' => 'Калькулятор КОДОРВАНЬ',
'cost' => '10 000'
]
];
// Sending the cookie with the team workload (1800 = 30min) // Sending the cookie with the team workload (1800 = 30min)
setcookie('workload', $this->view->workload, time() + 1800, '/'); setcookie('workload', $this->view->workload, time() + 1800, '/');

0
kodorvan/perm/system/databases/.gitignore vendored Normal file → Executable file
View File

0
kodorvan/perm/system/localizations/english.php Normal file → Executable file
View File

0
kodorvan/perm/system/localizations/russian.php Normal file → Executable file
View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

View File

0
kodorvan/perm/system/public/js/modules/advantages.js Normal file → Executable file
View File

0
kodorvan/perm/system/public/js/modules/service.js Normal file → Executable file
View File

0
kodorvan/perm/system/public/js/pages/main.js Normal file → Executable file
View File

View File

View File

View File

View File

View File

View File

@@ -1,7 +1,8 @@
@charset "UTF-8"; @charset "UTF-8";
section#description { section#description {
padding-top: 1.5rem; padding-top: 2rem;
padding-bottom: 1.5rem;
gap: 1rem; gap: 1rem;
> p { > p {

View File

@@ -5,6 +5,7 @@ section#introdution {
width: 100%; width: 100%;
height: var(--introdution-height, 350px); height: var(--introdution-height, 350px);
overflow: hidden; overflow: hidden;
background-color: #000;
+section.row { +section.row {
--shadow: 0px -10px 60px 30px rgba(0, 0, 0, 0.6); --shadow: 0px -10px 60px 30px rgba(0, 0, 0, 0.6);
@@ -17,13 +18,15 @@ section#introdution {
>div.information { >div.information {
z-index: 200; z-index: 200;
position: fixed; position: fixed;
width: 30vw; width: 33rem;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
cursor: default; cursor: default;
/* transform: perspective(35px) rotatex(1deg); */
>span#label { >span#label {
--shadow: 0px 9px 8px 0px rgb(0 0 0 / 40%);
margin-top: -2em; margin-top: -2em;
padding: 0.4em 0.8em 0.2em 1.2em; padding: 0.4em 0.8em 0.2em 1.2em;
display: flex; display: flex;
@@ -35,9 +38,14 @@ section#introdution {
font-weight: 400; font-weight: 400;
border-radius: 1.125rem; border-radius: 1.125rem;
color: #aeb629; color: #aeb629;
border: 1px solid #bababa1c; border: 1px solid #e06a6a6e;
background-color: #6262623b; border-bottom: unset;
background-color: #472929a8;
backdrop-filter: blur(1.3px); backdrop-filter: blur(1.3px);
box-shadow: var(--shadow);
-webkit-box-shadow: var(--shadow);
-moz-box-shadow: var(--shadow);
/* transform: perspective(25px) rotatex(-1deg); */
>i.icon.code { >i.icon.code {
margin-bottom: 3px; margin-bottom: 3px;
@@ -53,8 +61,15 @@ section#introdution {
font-weight: 400; font-weight: 400;
color: #fff; color: #fff;
text-shadow: text-shadow:
0px 0px 4px #ffffff, 0px 0px 4px #ffffff85,
0px 0px 9px #ffffff96; 0px 0px 9px #ffffff47;
>span.kodorvan {
color: #ffff00;
text-shadow:
0px 0px 4px #ffff00b5,
0px 0px 11px #ffff008a
}
} }
>p#team { >p#team {
@@ -101,6 +116,7 @@ section#introdution {
animation-name: appearance; animation-name: appearance;
animation-fill-mode: forwards; animation-fill-mode: forwards;
animation-duration: 0.2s; animation-duration: 0.2s;
animation-delay: 1s;
animation-timing-function: ease-in; animation-timing-function: ease-in;
filter: blur(1.8px) contrast(50); filter: blur(1.8px) contrast(50);
@@ -114,17 +130,11 @@ section#introdution {
width: 100%; width: 100%;
height: 100%; height: 100%;
background: background:
linear-gradient( linear-gradient(90deg,
90deg,
var(--dot-bg) calc(var(--dot-space) - var(--dot-size)), var(--dot-bg) calc(var(--dot-space) - var(--dot-size)),
transparent 1% transparent 1%) center / var(--dot-space) var(--dot-space),
) linear-gradient(var(--dot-bg) calc(var(--dot-space) - var(--dot-size)),
center / var(--dot-space) var(--dot-space), 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); var(--dot-color);
mix-blend-mode: color-burn; mix-blend-mode: color-burn;
filter: contrast(5); filter: contrast(5);

View File

View File

@@ -1,8 +1,8 @@
@charset "UTF-8"; @charset "UTF-8";
section#office { section#office {
display: flex;
height: 100%; height: 100%;
display: flex;
> div.map { > div.map {
width: 250px; width: 250px;

View File

@@ -0,0 +1,482 @@
@charset "UTF-8";
section#popular {
position: relative;
display: flex;
>div.title {
margin-top: 1rem;
margin-bottom: 1rem;
width: var(--width);
display: flex;
>div.column {
display: flex;
flex-direction: column;
&:is(.display) {
margin-top: auto;
height: min-content;
display: flex;
flex-direction: row;
border-radius: 1.125rem;
border: 2px solid #000;
background-color: #fff;
/* color: #fff;
background-color: #000; */
>span.amount {
margin-bottom: 0.1em;
display: flex;
justify-content: center;
align-items: center;
font-family: "Cascadia Code";
font-weight: 600;
}
>button {
--padding: 1rem;
box-sizing: border-box;
padding: var(--padding, 1rem);
cursor: pointer;
border: unset;
/* color: #fff; */
background: unset;
/* &:first-of-type:not(:only-of-type) {
padding-right: calc(var(--padding, 1rem) / 1.5);
}
&:last-of-type:not(:only-of-type) {
padding-left: calc(var(--padding, 1rem) / 1.5);
} */
}
}
&:last-of-type:not(:only-of-type) {
margin-left: auto;
}
>h3 {
margin: unset;
font-weight: 600;
font-size: 2rem;
}
}
}
>div.services {
--row-amount: 3;
--row-amount-protected: min(max(1, var(--row-amount, 1)), 4);
--gap: 1rem;
width: var(--width);
display: flex;
flex-flow: row wrap;
gap: var(--gap);
>article.service {
--service-width: max(250px, calc(var(--width) / var(--row-amount-protected, 2) - (var(--gap, 0px) * 0.5 * (var(--row-amount-protected, 2) - 1))));
--icon-background-color: #261d1b;
--background-color: #3f312e;
position: relative;
min-width: 250px;
width: var(--service-width);
min-height: 450px;
box-sizing: border-box;
padding: 1.2rem 0 0;
display: flex;
flex-direction: column;
align-items: center;
color: #fff;
transition: width 0.2s cubic-bezier(0.5, 0, 0, 1);
&:is(.telegram.voronka) {
--icon-background-color: #1a82b6;
--background-color: #27a6e6;
}
&:is(.parser) {
--icon-background-color: #996405;
/* --background-color: #fcfd1e; */
--background-color: #e58523;
}
&:is(.calculator) {
--icon-background-color: #a93737;
--background-color: #d24545;
}
>i.icon {
position: absolute;
margin-top: -1rem;
color: #000;
&:is(.left) {
justify-self: start;
}
&:is(.center) {
justify-self: center;
}
&:is(.right) {
justify-self: end;
}
&:is(.crown) {
top: 1.2em;
}
&:is(.search) {
top: 1em;
}
&:is(.file.document) {
top: 1em;
}
&:is(.calculator) {
top: 0.8em;
}
}
>div.head {
--border-height: 20px;
--border-gap: 0.4em;
z-index: 50;
position: relative;
width: 100%;
height: calc(2.6em + var(--border-height, 0px) - 0.75rem + var(--border-gap, 0px));
box-sizing: border-box;
display: flex;
justify-content: center;
align-items: start;
/* text-shadow: 0px -0.03em 0.24em #000000b3, 0px -0.03em 1em #00000087; */
&:after {
z-index: -100;
position: absolute;
bottom: -0.75rem;
left: 0;
content: '';
width: 100%;
height: var(--border-height);
border-radius: 0.75rem 0.75rem 0 0;
background-color: var(--background-color);
}
>h4 {
z-index: 200;
margin: unset;
display: flex;
font-family: "Bahnschrift";
font-size: 1.4rem;
font-weight: 400;
color: #000;
}
}
>div.body {
--service-body-padding: 1rem;
/* --shadow: 0px 0.8em 40px 1.7em rgba(0, 0, 0, 0.4); */
z-index: 100;
position: relative;
flex-grow: 1;
width: 100%;
height: 100%;
box-sizing: border-box;
padding: var(--service-body-padding, 1rem);
display: flex;
flex-direction: column;
gap: 1em;
overflow: hidden;
border-radius: 0.75rem;
background-color: #130d0d;
/* box-shadow: var(--shadow);
-webkit-box-shadow: var(--shadow);
-moz-box-shadow: var(--shadow); */
>div.icon {
--diameter: 60px;
z-index: 500;
position: absolute;
justify-content: center;
align-items: center;
left: calc(var(--diameter) / -2.5);
margin-top: calc(var(--diameter) / -2.5);
width: var(--diameter);
height: var(--diameter);
display: flex;
border-radius: 100%;
background-color: var(--background-color);
&:before {
--border-size: 6px;
content: '';
margin: auto;
width: calc(100% - var(--border-size) * 2);
height: calc(100% - var(--border-size) * 2);
display: block;
border-radius: 100%;
background-color: var(--icon-background-color, #fff);
}
>i.icon {
position: absolute;
color: #fff;
* {
color: #fff;
}
}
}
>p {
margin: unset;
font-family: "Bahnschrift";
font-size: 0.8rem;
font-weight: 200;
&:is(.description) {
margin: unset;
flex-grow: 1;
font-size: 1rem;
color: #fff;
}
&:is(.howto) {
font-style: italic;
color: #dacfcf;
}
}
>div.extra {
--service-extra-gap: 1em;
--service-extra-animation-duration: 60s;
position: relative;
margin: 0 calc(var(--service-body-padding, 1rem) * -1);
height: 1em;
display: inline-flex;
font-family: 'Cascadia Code';
font-size: 0.7rem;
color: #8b8b8bcf;
>p {
position: absolute;
margin: unset;
min-width: var(--service-width);
width: max-content;
padding-left: var(--service-extra-gap, 1em);
word-break: keep-all;
display: inline-flex;
gap: var(--service-extra-gap, 1em);
animation-name: hotline;
animation-duration: var(--service-extra-animation-duration, 10s);
animation-iteration-count: infinite;
animation-timing-function: linear;
&:first-of-type {}
&:last-of-type {
animation-delay: calc(var(--service-extra-animation-duration, 10s) / -2);
}
}
}
>div.footer {
--service-footer-height: 60px;
width: 100%;
min-height: var(--service-footer-height, 70px);
height: fit-content;
display: flex;
gap: 1rem;
>div.buttons {
--footer-buttons-gap: 0.4rem;
min-width: var(--service-footer-height, 70px);
width: var(--service-footer-height, 70px);
box-sizing: border-box;
display: flex;
justify-content: center;
flex-flow: row wrap;
gap: var(--footer-buttons-gap, 0.4rem);
>a[type="button"] {
flex-grow: 1;
width: calc(50% - var(--footer-buttons-gap, 0.4rem) / 2);
height: calc(50% - var(--footer-buttons-gap, 0.4rem) / 2);
box-sizing: border-box;
padding: 0.4rem 0.4rem;
display: flex;
justify-content: center;
align-items: center;
border-radius: 0.75rem;
border: 1px solid #a0a0a096;
border-right: unset;
border-bottom: unset;
color: #fff;
background-color: #8b8b8b66;
backdrop-filter: blur(1px);
transition: filter 0.05s ease-in;
&:is(:only-of-type) {
height: 100%;
}
&:hover {
filter: brightness(1.3);
transition: filter 0s;
}
&:active {
filter: brightness(1) contrast(1.2);
transition: filter 0s;
}
>i.icon.comment {
margin-top: -0.3em;
}
}
}
>div.theses {
position: relative;
width: 100%;
box-sizing: border-box;
padding: 0.2em 0;
display: flex;
flex-direction: column;
justify-content: center;
gap: 0.2em;
font-family: 'Bahnschrift';
font-size: 0.9rem;
font-weight: 100;
>p {
margin: unset;
min-height: 0.9rem;
display: inline-flex;
gap: 0.4rem;
color: #cbcbcb;
&:is(.blue) {
&:is(.colored) {
color: #979aff;
}
>span.characteristic {
color: #6c7fff;
}
}
&:is(.green) {
&:is(.colored) {
color: #99ff90;
}
>span.characteristic {
color: #4bff3d;
}
}
&:is(.yellow) {
&:is(.colored) {
color: #fffa7f;
}
>span.characteristic {
color: #e0ff35;
}
}
&:is(.cyan) {
&:is(.colored) {
color: #caf4ff;
}
>span.characteristic {
color: #04efff;
}
}
&:is(.red) {
&:is(.colored) {
color: #ff6767;
}
>span.characteristic {
color: #ff4747;
}
}
>span.characteristic {
--characteristic-width: 2.5em;
position: relative;
width: var(--characteristic-width);
min-width: var(--characteristic-width);
display: flex;
justify-content: end;
text-align: right;
font-weight: 200;
>i {
margin: 0 auto;
align-self: center;
&:is(.infinity) {
margin-top: -0.2em;
}
&:is(.play.forwards) {
margin-top: -0.2em;
margin-left: calc(60% + 0.2em);
}
}
}
}
}
}
>img.background {
z-index: -100;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
object-fit: cover;
scale: 1.1;
/* filter: blur(1.2px) brightness(0.25); */
filter: blur(1px) brightness(0.18) contrast(1.05);
&:is(.telegram.voronka) {
object-position: center;
}
}
}
>p.cost {
margin: unset;
margin-top: 0.2rem;
margin-right: 0.8rem;
width: 100%;
text-align: right;
font-family: 'Nunito';
font-size: 2rem;
font-weight: 600;
color: #000;
}
}
}
}
@keyframes hotline {
from {
/* transform: translateX(var(--service-width, 100%)); */
transform: translateX(100%);
}
to {
transform: translateX(-100%);
}
}

View File

@@ -1,6 +1,7 @@
@charset "UTF-8"; @charset "UTF-8";
section#projects { section#projects {
z-index: 1000;
padding-top: 2.5rem; padding-top: 2.5rem;
padding-bottom: 1rem; padding-bottom: 1rem;
/* transform: rotate3d(220, -777, -100, 385deg) scale(1.1); */ /* transform: rotate3d(220, -777, -100, 385deg) scale(1.1); */
@@ -16,6 +17,11 @@ section#projects {
height: 250px; height: 250px;
display: inline-flex; display: inline-flex;
gap: 15px; gap: 15px;
cursor: grab;
&:active {
cursor: grabbing;
}
> :is(article, div) { > :is(article, div) {
position: relative; position: relative;
@@ -25,6 +31,38 @@ section#projects {
height: 100%; height: 100%;
overflow: hidden; overflow: hidden;
border-radius: 0.75rem; border-radius: 0.75rem;
filter: contrast(1) brightness(1) saturate(1);
transition: filter 0.2s ease-out;
&:is(:hover, :focus) {
filter: contrast(1.2) brightness(0.8) saturate(0.6);
transition: filter 0s;
}
&:active {
filter: contrast(1.4) brightness(0.7) saturate(0.2);
transition: filter 0s;
}
&: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);
}
}
h4 { h4 {
position: absolute; position: absolute;
@@ -47,26 +85,6 @@ section#projects {
height: 100%; height: 100%;
object-fit: cover; 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,212 @@
@charset "UTF-8";
section#server {
--height: 440px;
--y-max: min(var(--y, 0px), var(--height, 0px));
--offset-left: -5vw;
position: relative;
height: 440px;
overflow: hidden;
/* background-color: #000; */
background: linear-gradient(127deg, #030308, #0e0202, #180101);
>div.server {
z-index: 100;
position: absolute;
width: 100%;
height: 100%;
pointer-events: none;
>img.pc {
z-index: 100;
position: absolute;
top: -225px;
/* left: calc(-120px + var(--offset-left) + (var(--y-max, 0px) / 4)); */
left: var(--offset-left);
height: 290%;
clip-path: polygon(0 0, 915px 0, 1065px 100%, 0 100%);
transform: perspective(130px) rotateZ(17deg) rotateX(1.3deg) skewX(8deg);
filter: contrast(1.1) brightness(1.1);
transition: left 0.4s ease-in-out;
}
}
>div.right {
position: absolute;
display: contents;
>div.title {
z-index: 50;
position: absolute;
left: calc(var(--offset-left, 0px) + 450px);
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
justify-content: start;
align-items: start;
font-family: "Geologica";
font-size: 3rem;
color: #fff;
transform: perspective(135px) rotateY(-4deg) skewY(5.4deg);
>h3 {
margin: unset;
margin-left: min(calc(-100% + (var(--y-max, 0px) * 4.35)), 0px);
width: 100%;
display: flex;
justify-content: start;
align-items: center;
gap: 0.4em;
font-size: 7.6vw;
font-weight: 800;
color: #ff9400;
transition: margin-left 0.4s cubic-bezier(0.55, 0.04, 0.12, 1);
>i.icon.server {
margin-left: 0.3em;
scale: 5;
color: #fff;
}
}
>span {
margin-top: -2rem;
/* margin-left: 0.1em; */
margin-left: min(calc(-100% + 0.1em + (var(--y-max, 0px) * 4.35)), 0px);
font-weight: 400;
font-size: 3.65vw;
color: #b81515;
color: #fff;
transition: margin-left 0.5s cubic-bezier(0.55, 0.04, 0.12, 1);
}
}
>div.bottom {
position: absolute;
bottom: 0;
width: 100%;
display: flex;
>div.column {
--margin-bottom: 1.4rem;
--height: 105px;
z-index: 100;
margin: auto 2rem var(--margin-bottom, 1.4rem) auto;
margin-bottom: min(calc(var(--height, 100%) * -4 + var(--y-max) / 1),
var(--margin-bottom));
height: var(--height, fit-content);
display: flex;
flex-direction: column;
font-family: "Geologica";
font-weight: 400;
font-size: 3rem;
color: #fff;
transition: margin-bottom 0.3s cubic-bezier(0.55, 0.04, 0.12, 1) 0.2s;
>span.location {
margin-bottom: -0.2em;
text-align: end;
font-size: 0.85em;
font-weight: 400;
color: #fff;
>strong {
margin-left: 0.1em;
font-weight: 500;
/* color: #f00; */
color: #0AF;
}
}
>strong.cost {
display: flex;
justify-content: start;
align-items: center;
gap: 0.2em;
font-weight: 400;
>span {
font-weight: 500;
color: #00ff08;
}
>i.icon.trend {
margin-bottom: 0em;
margin-right: 0.45em;
scale: 3;
rotate: -17deg;
color: #fff;
}
}
}
>ul.advantages {
--border-color: #fff;
z-index: 500;
position: relative;
margin: unset;
margin-top: auto;
margin-right: 10vw;
height: 150px;
box-sizing: border-box;
padding: 1em 1.2em;
display: flex;
justify-content: center;
gap: 0.3em;
flex-direction: column;
font-family: "Bahnschrift";
font-size: 1.2em;
font-weight: 600;
list-style: none;
border-radius: 0.75rem 0.75rem 0 0;
border: 2px solid var(--border-color);
border-bottom: unset;
color: #000;
background-color: #fff;
transform-origin: left;
&:before {
content: "";
position: absolute;
left: -2.4rem;
bottom: 0;
height: 2.25rem;
width: 2.25rem;
pointer-events: none;
border-bottom-right-radius: 0.75rem;
box-shadow: 0 20px 0 0 #fff;
}
&:after {
content: "";
position: absolute;
right: -2.4rem;
bottom: 0;
height: 2.25rem;
width: 2.25rem;
pointer-events: none;
border-bottom-left-radius: 0.75rem;
box-shadow: 0 20px 0 0 #fff;
}
>li {
position: relative;
display: inline-flex;
align-items: center;
padding-left: 1.8em;
>i.icon {
position: absolute !important;
left: 0;
&:is(.trophy) {
top: 0.15em;
left: 0.6em;
}
}
}
}
}
}
}

View File

View File

View File

View File

View File

View File

View File

View File

@@ -5,8 +5,12 @@
@import url("https://fonts.googleapis.com/css2?family=Share+Tech+Mono&display=swap"); @import url("https://fonts.googleapis.com/css2?family=Share+Tech+Mono&display=swap");
@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");
@import url('https://fonts.googleapis.com/css2?family=Alumni+Sans+Pinstripe:ital@0;1&family=Nunito:ital,wght@0,200..1000;1,200..1000&display=swap');
main { main {
--scroll-px-ten: calc(var(--scroll-px) / 10);
--scroll-px-hundred: calc(var(--scroll-px-ten) / 10);
--scroll-px-thousand: calc(var(--scroll-px-hundred) / 10);
margin-top: var(--menu-height); margin-top: var(--menu-height);
display: flex; display: flex;
flex-direction: column; flex-direction: column;

View File

@@ -57,6 +57,7 @@ main {
transform: scale(1.05); transform: scale(1.05);
} }
} }
>div#team { >div#team {
margin-top: 1rem; margin-top: 1rem;
display: inline-flex; display: inline-flex;
@@ -127,4 +128,38 @@ main {
} }
} }
} }
>section.wrap {
position: relative;
overflow: hidden;
background-color: #fff;
>section.row {
z-index: 500;
width: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
background: unset;
}
>div.net {
--dot-bg: #5a645a;
--dot-color: transparent;
--dot-color: transparent;
--dot-size: calc(110px + var(--scroll-px-hundred, 0px) * 2);
--dot-space: calc(var(--dot-size) + 1px);
z-index: -50;
position: absolute;
top: -30%;
width: 200%;
height: 200%;
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);
mask-image: linear-gradient(transparent, #fff, transparent);
transform: perspective(135px) rotateX(calc(6deg + var(--scroll-deg, 0deg) * -0.4)) skewY(6deg) rotateZ(-18deg);
transition: transform 0.08s linear, background 0.08s linear;
}
}
}
} }

View File

@@ -1,7 +1,7 @@
@charset "UTF-8"; @charset "UTF-8";
:root { :root {
--width: max(850px, 45vw); --width: max(1050px, 55vw);
--menu-height: 70px; --menu-height: 70px;
--introdution-height: min(350px, 35vh); --introdution-height: min(350px, 35vh);
--gap: min(12px, 1rem); --gap: min(12px, 1rem);
@@ -16,8 +16,14 @@
--cookies-width: 24rem; --cookies-width: 24rem;
--cookies-height: 4rem; --cookies-height: 4rem;
/* font-family: , system-ui, sans-serif; */ font-family: "Commissioner";
font-family: "dejavu"; font-family: "Share Tech Mono";
font-family: "Montserrat";
font-family: "Alumni Sans Pinstripe";
font-family: "DejaVu";
font-family: "Fira";
font-family: "Hack";
font-family: "Nunito", "DejaVu", sans-serif;
text-decoration: none; text-decoration: none;
outline: none; outline: none;
border: none; border: none;
@@ -26,6 +32,7 @@
body { body {
margin: unset; margin: unset;
width: 100vw;
overflow-x: hidden; overflow-x: hidden;
background-color: #f7fafc; background-color: #f7fafc;
} }

View File

Before

Width:  |  Height:  |  Size: 83 KiB

After

Width:  |  Height:  |  Size: 83 KiB

View File

Before

Width:  |  Height:  |  Size: 447 KiB

After

Width:  |  Height:  |  Size: 447 KiB

View File

Before

Width:  |  Height:  |  Size: 96 KiB

After

Width:  |  Height:  |  Size: 96 KiB

View File

Before

Width:  |  Height:  |  Size: 762 KiB

After

Width:  |  Height:  |  Size: 762 KiB

View File

Before

Width:  |  Height:  |  Size: 26 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View File

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

View File

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 90 KiB

View File

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

View File

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 650 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 249 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View File

0
kodorvan/perm/system/settings/system.php.sample Normal file → Executable file
View File

0
kodorvan/perm/system/views/themes/default/aside.html Normal file → Executable file
View File

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

View File

View File

View File

View File

View File

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

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

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

@@ -7,9 +7,7 @@
</a> </a>
<nav id="menu" class="unselectable"> <nav id="menu" class="unselectable">
<a href="https://git.svoboda.works/kodorvan">Проекты</a> <a href="#">лёха не забудь сюда кнопки добавить</a>
<a href="#contacts">Контакты</a>
<a href="#services">Услуги</a>
</nav> </nav>
</div> </div>
</header> </header>

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

@@ -14,7 +14,7 @@
{{ block('header') }} {{ block('header') }}
{{ block('aside') }} {{ block('aside') }}
<main> <main id="main">
{% block main %} {% block main %}
{{ main|raw }} {{ main|raw }}
{% endblock %} {% endblock %}
@@ -24,6 +24,15 @@
{% endblock %} {% endblock %}
{% block js %} {% block js %}
<script>
let main = document.getElementById('main');
setInterval(() => {
main.style.setProperty('--scroll-px', window.pageYOffset + 'px');
main.style.setProperty('--scroll-deg', window.pageYOffset / 100 + 'deg')
}, 60);
</script>
{{ block('header_js') }} {{ block('header_js') }}
{{ block('aside_js') }} {{ block('aside_js') }}
{{ block('footer_js') }} {{ block('footer_js') }}

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

View File

View File

View File

@@ -24,7 +24,7 @@
</li> </li>
</ul> </ul>
<strong class="partners">Мы мотивированы сотрудничать на <span>постоянной основе</span>, поэтому <span>работаем на результат</span></strong> <!-- <strong class="partners unselectable">Мы мотивированы сотрудничать на <span>постоянной основе</span>, поэтому <span>работаем на результат</span></strong> -->
</section> </section>
<!-- , либо реально выгодная аренда сервера у нас по самой низкой цене на рынке и максимально эффективной техподдержкой с бесплатными бекапами и оперативной установкой критических обновлений безопасности --> <!-- , либо реально выгодная аренда сервера у нас по самой низкой цене на рынке и максимально эффективной техподдержкой с бесплатными бекапами и оперативной установкой критических обновлений безопасности -->

View File

@@ -2,12 +2,12 @@
<div class="information"> <div class="information">
<span id="label"> <span id="label">
<i class="icon code slash"></i> <i class="icon code slash"></i>
<span class="unselectable">ПРОФЕССИОНАЛЫ С ОПЫТОМ</span> <span class="unselectable">ПРОФЕССИОНАЛЫ</span>
</span> </span>
<h2 id="title" class="unselectable">ПЕРМСКИЕ РАЗРАБОТЧИКИ</h2> <h2 id="title" class="unselectable">КОМАНДА <span class="kodorvan">КОДОРВАНЬ</span></h2>
<p id="team" class="unselectable"><b>Чистый код</b>, реальные сроки и собственные сервера в <strong>Перми</strong><br />по <b>честной цене</b> и с <b>вечной техподдержкой</b></p> <p id="team" class="unselectable"><b>Чистый код</b>, авангардный дизайн, глубокий SEO,</br> безопасность, реальные сроки и свои сервера в <strong>Перми</strong></br>по <b>честной цене</b> и с <b>вечной техподдержкой</b></p>
</div> </div>
<div class="background" style="opacity: 0"> <div class="background" style="opacity: 0">

View File

@@ -0,0 +1,167 @@
{% macro service(class, title, icon_left, icon_center, icon_right, description, howto, extra, buttons, theses, background_image_src, background_image_alt, cost) %}
<article class="service{% if class is not empty %} {{ class }}{% endif %}">
{% if icon_left is not empty %}<i class="icon left {{ icon_left }}"></i>{% endif %}
{% if icon_center is not empty %}
<link type="text/css" rel="stylesheet" href="/css/icons/{{ icon_center|replace({' ': '_'}) }}.css" />
<i class="icon center {{ icon_center }}"></i>
{% endif %}
{% if icon_right is not empty %}<i class="icon right {{ icon_right }}"></i>{% endif %}
{% if icon_center2222 is not empty %}
<link type="text/css" rel="stylesheet" href="/css/icons/{{ icon_center|replace({' ': '_'}) }}.css" />
<div class="icon">
<i class="icon center {{ icon_center }}"></i>
</div>
{% endif %}
<div class="head">
<h4>{{ title is empty ? 'Разработка' : title }}</h4>
</div>
<div class="body">
{% if description is not empty %}
<p class="description">{{ description|raw }}</p>
{% endif %}
{% if howto is not empty %}
<p class="howto">{{ howto|raw }}</p>
{% endif %}
{% if extra is not empty %}
<div class="extra">
<p>
{% for text in extra %}
<span>{{ text }}</span>
{% endfor %}
</p>
<p>
{% for text in extra %}
<span>{{ text }}</span>
{% endfor %}
</p>
</div>
{% endif %}
<div class="footer">
{% if theses is not empty %}
<div class="buttons">
{% for button in buttons %}
{% set icon = button.icon ?? 'close' %}
<link type="text/css" rel="stylesheet" href="/css/icons/{{ button.icon|replace({' ': '_'}) }}.css" />
<a type="button" href="{{ button.href }}"><i class="icon {{ button.icon }}"></i></a>
{% endfor %}
</div>
{% endif %}
{% if theses is not empty %}
<div class="theses">
{% for thesis in theses %}
<p{% if thesis.class is not empty %} class="{{ thesis.class }}{% if thesis.colored is true %} colored{% endif %}"{% endif %}>
{% if thesis.icon is not empty %}
<span class="characteristic">
<link type="text/css" rel="stylesheet" href="/css/icons/{{ thesis.icon|replace({' ': '_'}) }}.css" />
<i class="icon {{ thesis.icon }}"></i>
</span>
{% elseif thesis.characteristic is not empty %}
<span class="characteristic">{{ thesis.characteristic }}</span>
{% endif %}
{{ thesis.text }}
</p>
{% endfor %}
</div>
{% endif %}
</div>
{% if background_image_src is not empty and background_image_alt is not empty %}
<img class="background" src="{{ background_image_src }}" alt="{{ background_image_alt }}" ondragstart="return false;"/>
{% endif %}
</div>
{% if cost is not empty %}
<p class="cost">ОТ <span>{{ cost }}₽</span></p>
{% endif %}
</article>
{% endmacro service %}
<section id="popular" class="row unselectable">
<div class="title unselectable">
<div class="column">
<h3>Популярные заказы</h3>
<span>Готовые оптимизированные пакеты услуг со скидками</span>
</div>
<div class="column display">
<button class="plus">
<i class="icon plus"></i>
</button>
<span class="amount">3</span>
<button class="minus">
<i class="icon minus"></i>
</button>
</div>
</div>
<div class="services">
{% for service in services %}
{{
_self.service(
class: service.class,
title: service.title,
icon_left: service.icon_left,
icon_center: service.icon_center,
icon_right: service.icon_right,
description: service.description,
howto: service.howto,
extra: service.extra,
buttons: service.buttons,
theses: service.theses,
background_image_src: service.background_image_src,
background_image_alt: service.background_image_alt,
cost: service.cost
)
}}
{% endfor %}
</div>
<script>
let popular = document.getElementById("popular");
let services = popular?.querySelector('div[class="services"]');
let amount = popular.querySelector(
'div.title>div[class="column display"]>span[class="amount"]'
);
if (services instanceof HTMLElement) {
let plus = popular.querySelector(
'div.title>div[class="column display"]>button[class="plus"]'
);
plus.addEventListener("click", (event) => {
let old =
+getComputedStyle(services).getPropertyValue("--row-amount") || 1;
let value = old + 1;
if (value > 4) value = 4;
else if (value < 1) value = 1;
services.style.setProperty("--row-amount", value);
amount.innerText = value;
});
let minus = popular.querySelector(
'div.title>div[class="column display"]>button[class="minus"]'
);
minus.addEventListener("click", (event) => {
let old =
+getComputedStyle(services).getPropertyValue("--row-amount") || 1;
let value = old - 1;
if (value > 4) value = 4;
else if (value < 1) value = 1;
services.style.setProperty("--row-amount", value);
amount.innerText = value;
});
}
</script>
</section>

View File

@@ -0,0 +1,11 @@
<section id="products" class="row">
<div class="title">
<h3>Готовые проекты</h3>
<p>Готовые решения для переработки под свою идею</p>
</div>
<article class="product">
<div class="image">
</div>
</article>
</section>

View File

View File

@@ -1,2 +1,39 @@
<section id="server" class="row"> <section id="server" class="row unselectable">
<div class="server">
<img
src="/themes/default/images/server.png"
alt="Kodorvan сервер в Перми"
class="pc"
ondragstart="return false"
/>
</div>
<div class="right">
<div class="title">
<h3><i class="icon server"></i>НАШИ СЕРВЕРА</h3>
<span>ПОЛНЫЙ КОНТРОЛЬ НАД ПРОЕКТОМ</span>
</div>
<div class="bottom">
<div class="column">
<span class="location">ЛОКАЦИЯ: <strong>ПЕРМЬ</strong></span>
<strong class="cost">
<i class="icon trend"></i>
ОТ <span>200₽</span> В МЕСЯЦ
</strong>
</div>
<ul class="advantages">
<li><i class="icon list tree"></i>Бесплатно на этапе разработки</li>
<li><i class="icon gift"></i>Самые низкие цены</li>
<li><i class="icon phone"></i>Адекватная техподдержка</li>
<li><i class="icon terminal"></i>Оперативный доступ</li>
</ul>
</div>
</div>
</section> </section>
<script>
let server = document.getElementById('server');
setInterval(() => server.style.setProperty('--y', (window.pageYOffset + window.innerHeight - server.offsetTop) + 'px'), 350);
</script>

View File

View File

View File

View File

@@ -10,26 +10,40 @@
<link type="text/css" rel="stylesheet" href="/css/icons/eye.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/loading_spinner.css" />
<link type="text/css" rel="stylesheet" href="/css/icons/close.css" /> <link type="text/css" rel="stylesheet" href="/css/icons/close.css" />
<link type="text/css" rel="stylesheet" href="/css/icons/plus.css" />
<link type="text/css" rel="stylesheet" href="/css/icons/minus.css" />
<link type="text/css" rel="stylesheet" href="/css/icons/server.css" />
<link type="text/css" rel="stylesheet" href="/css/icons/trend.css" />
<link type="text/css" rel="stylesheet" href="/css/icons/terminal.css" />
<link type="text/css" rel="stylesheet" href="/css/icons/list_tree.css" />
<link type="text/css" rel="stylesheet" href="/css/icons/gift.css" />
<link type="text/css" rel="stylesheet" href="/css/icons/phone.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/pages/index.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/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/workload.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/popular.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/server.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/telegram.css" />
<link type="text/css" rel="stylesheet" href="/themes/default/css/elements/cookies.css" /> <link type="text/css" rel="stylesheet" href="/themes/default/css/elements/cookies.css" />
{% endblock %} {% endblock %}
{% block main %} {% block main %}
{% include '/themes/default/main/elements/introdution.html' %} {% include '/themes/default/main/elements/introdution.html' %}
<section class="wrap row">
<div class="net"></div>
{% include '/themes/default/main/elements/workload.html' %} {% include '/themes/default/main/elements/workload.html' %}
{% include '/themes/default/main/elements/shortcut.html' %} {% include '/themes/default/main/elements/shortcut.html' %}
{% include '/themes/default/main/elements/description.html' %} {% include '/themes/default/main/elements/popular.html' %}
{% include '/themes/default/main/elements/projects.html' %} {% include '/themes/default/main/elements/projects.html' %}
</section>
{% include '/themes/default/main/elements/server.html' %} {% include '/themes/default/main/elements/server.html' %}
{% include '/themes/default/main/elements/description.html' %}
{% include '/themes/default/elements/telegram.html' %} {% include '/themes/default/elements/telegram.html' %}
{% include '/themes/default/elements/cookies.html' %} {% include '/themes/default/elements/cookies.html' %}
@@ -37,6 +51,7 @@
{% block js %} {% block js %}
{{ parent() }} {{ parent() }}
<script src="/js/modules/hotline.mjs" type="module"></script> <script src="/js/modules/hotline.mjs" type="module"></script>
<script src="/js/modules/womb3-simplex.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/pages/main.js" defer></script>