default theme
This commit is contained in:
@ -42,7 +42,7 @@ class App
|
||||
public function load(): static
|
||||
{
|
||||
$this->moduleService = new ModuleService();
|
||||
$this->themeService = new ThemeService();
|
||||
// $this->themeService = new ThemeService();
|
||||
App::$collector = new CgRouteCollector();
|
||||
$this->setRouting();
|
||||
|
||||
@ -57,9 +57,15 @@ class App
|
||||
foreach ($modules_routs as $rout){
|
||||
include "$rout";
|
||||
}
|
||||
$activeTheme = getConst($this->themeService->getActiveTheme());
|
||||
// $activeTheme = getConst($this->themeService->getActiveTheme());
|
||||
// if (!empty($activeTheme)){
|
||||
// include $activeTheme . "/" . $this->themeService->getThemeRout($activeTheme);
|
||||
// }
|
||||
|
||||
$themeService = new ThemeService();
|
||||
$activeTheme = getConst($themeService->getActiveTheme());
|
||||
if (!empty($activeTheme)){
|
||||
include $activeTheme . "/" . $this->themeService->getThemeRout($activeTheme);
|
||||
include $activeTheme . "/" . $themeService->getThemeRout($activeTheme);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -63,6 +63,20 @@ class AdminConsoleController extends ConsoleController
|
||||
);
|
||||
$this->out->r("create option active_admin_theme", "green");
|
||||
|
||||
$this->optionService->createFromParams(
|
||||
key: "theme_paths",
|
||||
value: "{\"paths\": [\"{KERNEL}/themes\", \"{APP}/themes\"]}",
|
||||
label: "Пути к темам сайта"
|
||||
);
|
||||
$this->out->r("create option theme_paths", "green");
|
||||
|
||||
$this->optionService->createFromParams(
|
||||
key: "active_theme",
|
||||
value: "{KERNEL}/themes/default",
|
||||
label: "Активная тема сайта"
|
||||
);
|
||||
$this->out->r("create option active_theme", "green");
|
||||
|
||||
$this->optionService->createFromParams(
|
||||
key: "module_paths",
|
||||
value: "{\"paths\": [\"{KERNEL_MODULES}\", \"{APP}/modules\"]}",
|
||||
@ -72,7 +86,7 @@ class AdminConsoleController extends ConsoleController
|
||||
|
||||
$this->optionService->createFromParams(
|
||||
key: "active_modules",
|
||||
value: "{\"modules\":[\"admin_themes\", \"secure\", \"user\", \"menu\", \"post\", \"option\"]}",
|
||||
value: "{\"modules\":[\"admin_themes\",\"themes\",\"secure\", \"user\", \"menu\", \"post\", \"option\"]}",
|
||||
label: "Активные модули"
|
||||
);
|
||||
$this->out->r("create option active_modules", "green");
|
||||
@ -133,6 +147,14 @@ class AdminConsoleController extends ConsoleController
|
||||
]);
|
||||
$this->out->r("create item menu admin-themes", "green");
|
||||
|
||||
$this->menuService->createItem([
|
||||
"label" => "Темы сайта",
|
||||
"url" => "/admin/settings/themes",
|
||||
"slug" => "themes",
|
||||
"parent_slug" => "settings"
|
||||
]);
|
||||
$this->out->r("create item menu themes", "green");
|
||||
|
||||
$this->menuService->createItem([
|
||||
"label" => "Меню",
|
||||
"url" => "/admin/settings/menu",
|
||||
|
@ -2,11 +2,15 @@
|
||||
|
||||
namespace kernel\services;
|
||||
|
||||
use DirectoryIterator;
|
||||
use kernel\helpers\Manifest;
|
||||
use kernel\helpers\RESTClient;
|
||||
use kernel\models\Option;
|
||||
|
||||
class ThemeService
|
||||
{
|
||||
protected array $errors = [];
|
||||
|
||||
protected Option $option;
|
||||
protected string $active_theme = "";
|
||||
|
||||
@ -16,6 +20,23 @@ class ThemeService
|
||||
$this->findActiveTheme();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getErrors(): array
|
||||
{
|
||||
return $this->errors;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $msg
|
||||
* @return void
|
||||
*/
|
||||
public function addError($msg): void
|
||||
{
|
||||
$this->errors[] = $msg;
|
||||
}
|
||||
|
||||
public function findActiveTheme(): void
|
||||
{
|
||||
$model = $this->option::where("key", "active_theme")->first();
|
||||
@ -27,16 +48,16 @@ class ThemeService
|
||||
return $this->active_theme;
|
||||
}
|
||||
|
||||
public function getThemeRout(string $path)
|
||||
public function setActiveTheme(string $theme): void
|
||||
{
|
||||
if (file_exists($path . "/manifest.json")){
|
||||
$manifest = json_decode(file_get_contents($path . "/manifest.json"), true);
|
||||
if ($manifest['routs']) {
|
||||
return $manifest['routs'];
|
||||
}
|
||||
}
|
||||
$activeTheme = Option::where("key", "active_theme")->first();
|
||||
$activeTheme->value = getConst($theme);
|
||||
$activeTheme->save();
|
||||
}
|
||||
|
||||
return false;
|
||||
public function getActiveThemeInfo(): false|array|string
|
||||
{
|
||||
return $this->getThemeInfo($this->active_theme);
|
||||
}
|
||||
|
||||
public function getThemeInfo(string $theme): false|array|string
|
||||
@ -54,11 +75,44 @@ class ThemeService
|
||||
return $info;
|
||||
}
|
||||
|
||||
public function setActiveTheme(string $theme): void
|
||||
public function getThemeInfoBySlug(string $slug): false|array|string
|
||||
{
|
||||
$activeTheme = Option::where("key", "active_theme")->first();
|
||||
$activeTheme->value = getConst($theme);
|
||||
$activeTheme->save();
|
||||
$dirs = $this->getThemeDirs();
|
||||
foreach ($dirs as $dir) {
|
||||
foreach (new DirectoryIterator($dir) as $fileInfo) {
|
||||
if ($fileInfo->isDot()) continue;
|
||||
if ($this->getThemeInfo($fileInfo->getPathname())['slug'] === $slug) {
|
||||
return $this->getThemeInfo($fileInfo->getPathname());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public function getThemeDirs(): array
|
||||
{
|
||||
$ThemePaths = Option::where("key", "theme_paths")->first();
|
||||
$dirs = [];
|
||||
if ($ThemePaths) {
|
||||
$path = json_decode($ThemePaths->value);
|
||||
foreach ($path->paths as $p) {
|
||||
$dirs[] = getConst($p);
|
||||
}
|
||||
}
|
||||
return $dirs;
|
||||
}
|
||||
|
||||
public function getThemeRout(string $path)
|
||||
{
|
||||
if (file_exists($path . "/manifest.json")){
|
||||
$manifest = json_decode(file_get_contents($path . "/manifest.json"), true);
|
||||
if ($manifest['routs']) {
|
||||
return $manifest['routs'];
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
@ -8,11 +8,11 @@ class DefaultThemesAssets extends Assets
|
||||
{
|
||||
protected function createCSS(): void
|
||||
{
|
||||
$this->registerCSS(slug: "main", resource: "some");
|
||||
$this->registerCSS(slug: "main", resource: "/css/styles.css");
|
||||
}
|
||||
|
||||
protected function createJS(): void
|
||||
{
|
||||
$this->registerJS(slug: "webpack", resource: "some");
|
||||
$this->registerJS(slug: "webpack", resource: "/js/scripts.js");
|
||||
}
|
||||
}
|
@ -10,14 +10,19 @@ class MainController extends Controller
|
||||
protected function init(): void
|
||||
{
|
||||
parent::init();
|
||||
$this->cgView->viewPath = APP_DIR . "/themes/default/views/main/";
|
||||
$this->cgView->viewPath = KERNEL_DIR . "/themes/default/views/main/";
|
||||
$this->cgView->layout = "main.php";
|
||||
$this->cgView->layoutPath = APP_DIR . "/themes/default/views/layout/";
|
||||
$this->cgView->addVarToLayout("resources", "/resources/default");
|
||||
$this->cgView->layoutPath = KERNEL_DIR . "/themes/default/views/layout/";
|
||||
$this->cgView->addVarToLayout("resources", "/resources/themes/default");
|
||||
}
|
||||
|
||||
public function actionIndex(): void
|
||||
{
|
||||
$this->cgView->render("index.php");
|
||||
}
|
||||
|
||||
public function actionAbout(): void
|
||||
{
|
||||
$this->cgView->render("about.php");
|
||||
}
|
||||
}
|
@ -4,6 +4,7 @@ use kernel\App;
|
||||
|
||||
|
||||
App::$collector->get('/', [\kernel\themes\default\controllers\MainController::class, 'actionIndex']);
|
||||
App::$collector->get('/about', [\kernel\themes\default\controllers\MainController::class, 'actionAbout']);
|
||||
//App::$collector->get('/page/{page_number}', [\app\modules\tag\controllers\TagController::class, 'actionIndex']);
|
||||
//App::$collector->get('/create', [\app\modules\tag\controllers\TagController::class, 'actionCreate']);
|
||||
|
||||
|
File diff suppressed because one or more lines are too long
36
kernel/themes/default/views/main/about.php
Normal file
36
kernel/themes/default/views/main/about.php
Normal file
@ -0,0 +1,36 @@
|
||||
<?php
|
||||
/**
|
||||
* @var string $resources;
|
||||
* @var \kernel\CgView $view
|
||||
*/
|
||||
|
||||
$view->setTitle("Старт Bootstrap");
|
||||
$view->setMeta([
|
||||
'description' => 'Дефолтная bootstrap тема'
|
||||
]);
|
||||
?>
|
||||
<!-- Page Header-->
|
||||
<header class="masthead" style="background-image: url('<?= $resources ?>/assets/img/about-bg.jpg')">
|
||||
<div class="container position-relative px-4 px-lg-5">
|
||||
<div class="row gx-4 gx-lg-5 justify-content-center">
|
||||
<div class="col-md-10 col-lg-8 col-xl-7">
|
||||
<div class="page-heading">
|
||||
<h1>About Me</h1>
|
||||
<span class="subheading">This is what I do.</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
<!-- Main Content-->
|
||||
<main class="mb-4">
|
||||
<div class="container px-4 px-lg-5">
|
||||
<div class="row gx-4 gx-lg-5 justify-content-center">
|
||||
<div class="col-md-10 col-lg-8 col-xl-7">
|
||||
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Saepe nostrum ullam eveniet pariatur voluptates odit, fuga atque ea nobis sit soluta odio, adipisci quas excepturi maxime quae totam ducimus consectetur?</p>
|
||||
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Eius praesentium recusandae illo eaque architecto error, repellendus iusto reprehenderit, doloribus, minus sunt. Numquam at quae voluptatum in officia voluptas voluptatibus, minus!</p>
|
||||
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aut consequuntur magnam, excepturi aliquid ex itaque esse est vero natus quae optio aperiam soluta voluptatibus corporis atque iste neque sit tempora!</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
@ -4,221 +4,83 @@
|
||||
* @var \kernel\CgView $view
|
||||
*/
|
||||
|
||||
$view->setTitle("Донецкое гештальт сообщество");
|
||||
$view->setTitle("Старт Bootstrap");
|
||||
$view->setMeta([
|
||||
'description' => 'Донецкое гештальт сообщество'
|
||||
'description' => 'Дефолтная bootstrap тема'
|
||||
]);
|
||||
?>
|
||||
<div class="flex flex-col container m-auto text-center text-dark gap-[31px]"><h1 class="text-[40px] uppercase">
|
||||
Донецкое гештальт сообщество</h1>
|
||||
<p class="text-dark text-[19px] max-w-[832px] mx-auto">это добровольное самоорганизующееся сообщество
|
||||
специалистов г. Донецка и Донецкого края в области психологического консультирования и гештальт-терапии.</p>
|
||||
</div>
|
||||
<div class="flex justify-center mt-[100px] gap-[14px] container mx-auto">
|
||||
<div class="relative bg-blue border-[1px] border-white rounded-[25px] pr-[48px] max-w-[650px] min-h-[480px] w-full font-[400]">
|
||||
<img alt="intro" loading="lazy" width="1" height="1" decoding="async" data-nimg="1"
|
||||
class="w-auto h-auto absolute" style="color:transparent" src="<?= $resources ?>/images/intro.svg"/>
|
||||
<h3 class="text-white text-[38px] mt-[214px] text-end leading-[41px]"><span
|
||||
class="bg-darkBlue px-[12px] py-[3px] rounded-[18px]">Цель</span> нашего<br/>объединения:</h3>
|
||||
<p class="ml-auto mt-[50px] text-start text-white text-[19px] leading-[20px] max-w-[400px] font-[700]">
|
||||
взаимное обогащение профессиональными знаниями, идеями и опытом на конференциях и семинарах, в учебных
|
||||
программах и на интенсивах, на специализациях и в супервизорских группах.</p></div>
|
||||
<div class="flex flex-col gap-[12px] max-w-[368px]">
|
||||
<div class="flex items-center bg-blue rounded-[25px] min-h-[234px] px-[68px] py-[60px] relative"><p
|
||||
class="text-white font-[500] leading-[23px] text-[20px]">Через собственное развитие мы развиваем и
|
||||
популяризируем гештальт-подход</p><img alt="palm" loading="lazy" width="1" height="1" decoding="async"
|
||||
data-nimg="1" class="w-auto h-auto absolute right-3 bottom-0"
|
||||
style="color:transparent" src="<?= $resources ?>/images/palm.svg"/></div>
|
||||
<div class="flex flex-col items-center rounded-[25px] min-h-[234px] px-[68px] pt-[40px] border-[4px] border-white">
|
||||
<div class="flex relative left-[-20px] bottom-[-10px]"><img alt="avatar" loading="lazy" width="101"
|
||||
height="100" decoding="async" data-nimg="1"
|
||||
class="undefined relative"
|
||||
style="color:transparent"
|
||||
srcSet="<?= $resources ?>/_next/image?url=%2Fimages%2Favatar.png&w=128&q=75 1x, <?= $resources ?>/_next/image?url=%2Fimages%2Favatar.png&w=256&q=75 2x"
|
||||
src="<?= $resources ?>/_next/image?url=%2Fimages%2Favatar.png&w=256&q=75"/><img
|
||||
alt="avatar" loading="lazy" width="101" height="100" decoding="async" data-nimg="1"
|
||||
class="right-[55px] z-2 relative" style="color:transparent"
|
||||
srcSet="<?= $resources ?>/_next/image?url=%2Fimages%2Favatar.png&w=128&q=75 1x, <?= $resources ?>/_next/image?url=%2Fimages%2Favatar.png&w=256&q=75 2x"
|
||||
src="<?= $resources ?>/_next/image?url=%2Fimages%2Favatar.png&w=256&q=75"/><img alt="avatar"
|
||||
loading="lazy"
|
||||
width="101" height="100"
|
||||
decoding="async"
|
||||
data-nimg="1"
|
||||
class="right-[105px] z-3 relative"
|
||||
style="color:transparent"
|
||||
srcSet="<?= $resources ?>/_next/image?url=%2Fimages%2Favatar.png&w=128&q=75 1x, <?= $resources ?>/_next/image?url=%2Fimages%2Favatar.png&w=256&q=75 2x"
|
||||
src="<?= $resources ?>/_next/image?url=%2Fimages%2Favatar.png&w=256&q=75"/><img
|
||||
alt="avatar" loading="lazy" width="101" height="100" decoding="async" data-nimg="1"
|
||||
class="right-[155px] z-4 relative" style="color:transparent"
|
||||
srcSet="<?= $resources ?>/_next/image?url=%2Fimages%2Favatar.png&w=128&q=75 1x, <?= $resources ?>/_next/image?url=%2Fimages%2Favatar.png&w=256&q=75 2x"
|
||||
src="<?= $resources ?>/_next/image?url=%2Fimages%2Favatar.png&w=256&q=75"/></div>
|
||||
<p class="text-blue font-[900] text-[26px]">+ 145 учасников</p></div>
|
||||
<!-- Page Header-->
|
||||
<header class="masthead" style="background-image: url('<?= $resources ?>/assets/img/home-bg.jpg')">
|
||||
<div class="container position-relative px-4 px-lg-5">
|
||||
<div class="row gx-4 gx-lg-5 justify-content-center">
|
||||
<div class="col-md-10 col-lg-8 col-xl-7">
|
||||
<div class="site-heading">
|
||||
<h1>Clean Blog</h1>
|
||||
<span class="subheading">A Blog Theme by Start Bootstrap</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-[50px] flex gap-[64px] justify-center container mx-auto">
|
||||
<div class="flex-col flex gap-[35px] items-center"><img alt="oppgp" loading="lazy" width="140" height="37"
|
||||
decoding="async" data-nimg="1" style="color:transparent"
|
||||
src="<?= $resources ?>/images/oppgp.svg"/>
|
||||
<p class="text-grey max-w-[300px] text-[16px] leading-[17px] text-center font-[700]">Донецкое
|
||||
гештальт-сообщество является частью Всероссийского общества психологов практикующих гештальт-подход (ОПП
|
||||
ГП). </p></div>
|
||||
<div class="flex-col flex gap-[19px] items-center"><img alt="oppgp" loading="lazy" width="177" height="53"
|
||||
decoding="async" data-nimg="1" style="color:transparent"
|
||||
src="<?= $resources ?>/images/pmg.svg"/>
|
||||
<p class="text-grey max-w-[507px] text-[16px] leading-[17px] text-center font-[700]">В своей работе мы
|
||||
придерживаемся стандартов программы «Московский Гештальт Институт», а также стандартов Европейской
|
||||
Ассоциации Гештальт Терапии, Этического Кодекса Гештальт Терапевта и принципов гуманизма.</p></div>
|
||||
</div>
|
||||
<div class="flex flex-col mt-[100px]">
|
||||
<div class="flex items-center max-w-[1033px] mx-auto justify-between w-full mb-[50px]">
|
||||
<div class="undefined px-[25px] py-[10px] max-w-[225px] min-w-[180px] justify-center w-fit cursor-pointer border-blue border-[1px] flex gap-[10px] rounded-[10px]">
|
||||
<p class="text-blue font-[700] text-[16px]">Конференции</p><img alt="chevronDown" loading="lazy"
|
||||
width="11" height="8" decoding="async"
|
||||
data-nimg="1" style="color:transparent"
|
||||
src="<?= $resources ?>/images/chevronDown.svg"/></div>
|
||||
<h3 class="text-black text-[26px] uppercase">Мероприятия сообщества</h3>
|
||||
<button class="flex items-center justify-center whitespace-nowrap rounded-[6px] font-[400] bg-blue text-[16px] text-white max-h-[39px] px-[25px] py-[10px] undefined">
|
||||
Все мероприятия
|
||||
</button>
|
||||
</header>
|
||||
<!-- Main Content-->
|
||||
<div class="container px-4 px-lg-5">
|
||||
<div class="row gx-4 gx-lg-5 justify-content-center">
|
||||
<div class="col-md-10 col-lg-8 col-xl-7">
|
||||
<!-- Post preview-->
|
||||
<div class="post-preview">
|
||||
<a href="#!">
|
||||
<h2 class="post-title">Man must explore, and this is exploration at its greatest</h2>
|
||||
<h3 class="post-subtitle">Problems look mighty small from 150 miles up</h3>
|
||||
</a>
|
||||
<p class="post-meta">
|
||||
Posted by
|
||||
<a href="#!">Start Bootstrap</a>
|
||||
on September 24, 2023
|
||||
</p>
|
||||
</div>
|
||||
<!-- Divider-->
|
||||
<hr class="my-4" />
|
||||
<!-- Post preview-->
|
||||
<div class="post-preview">
|
||||
<a href="#!"><h2 class="post-title">I believe every human has a finite number of heartbeats. I don't intend to waste any of mine.</h2></a>
|
||||
<p class="post-meta">
|
||||
Posted by
|
||||
<a href="#!">Start Bootstrap</a>
|
||||
on September 18, 2023
|
||||
</p>
|
||||
</div>
|
||||
<!-- Divider-->
|
||||
<hr class="my-4" />
|
||||
<!-- Post preview-->
|
||||
<div class="post-preview">
|
||||
<a href="#!">
|
||||
<h2 class="post-title">Science has not yet mastered prophecy</h2>
|
||||
<h3 class="post-subtitle">We predict too much for the next year and yet far too little for the next ten.</h3>
|
||||
</a>
|
||||
<p class="post-meta">
|
||||
Posted by
|
||||
<a href="#!">Start Bootstrap</a>
|
||||
on August 24, 2023
|
||||
</p>
|
||||
</div>
|
||||
<!-- Divider-->
|
||||
<hr class="my-4" />
|
||||
<!-- Post preview-->
|
||||
<div class="post-preview">
|
||||
<a href="#!">
|
||||
<h2 class="post-title">Failure is not an option</h2>
|
||||
<h3 class="post-subtitle">Many say exploration is part of our destiny, but it’s actually our duty to future generations.</h3>
|
||||
</a>
|
||||
<p class="post-meta">
|
||||
Posted by
|
||||
<a href="#!">Start Bootstrap</a>
|
||||
on July 8, 2023
|
||||
</p>
|
||||
</div>
|
||||
<!-- Divider-->
|
||||
<hr class="my-4" />
|
||||
<!-- Pager-->
|
||||
<div class="d-flex justify-content-end mb-4"><a class="btn btn-primary text-uppercase" href="#!">Older Posts →</a></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex justify-around"><a
|
||||
class="border-[1px] border-white rounded-[6px] bg-darkGrey px-[13.5px] pt-[12px] pb-[35px] text-black"
|
||||
href="events/event-1"><span class="flex w-[288px] h-[177px] bg-white"></span><h5
|
||||
class="max-w-[267px] font-[500] text-[16px] leading-[18px] mt-[30px] mb-[8px] line-clamp-3 text-ellipsis">
|
||||
добровольное самоорганизующееся сообщество специалистов ... добровольное самоорганизующееся сообщество
|
||||
специалистов ...</h5>
|
||||
<p class="max-w-[267px] text-[15px] leading-[17px] line-clamp-3 text-ellipsis">добровольное
|
||||
самоорганизующееся сообщество специалистов г. Донецка и Донецкого края в области добровольное
|
||||
самоорганизующееся сообщество специалистов г. Донецка и Донецкого края в области...</p></a><a
|
||||
class="border-[1px] border-white rounded-[6px] bg-darkGrey px-[13.5px] pt-[12px] pb-[35px] text-black"
|
||||
href="events/event-1"><span class="flex w-[288px] h-[177px] bg-white"></span><h5
|
||||
class="max-w-[267px] font-[500] text-[16px] leading-[18px] mt-[30px] mb-[8px] line-clamp-3 text-ellipsis">
|
||||
добровольное самоорганизующееся сообщество специалистов ... добровольное самоорганизующееся сообщество
|
||||
специалистов ...</h5>
|
||||
<p class="max-w-[267px] text-[15px] leading-[17px] line-clamp-3 text-ellipsis">добровольное
|
||||
самоорганизующееся сообщество специалистов г. Донецка и Донецкого края в области добровольное
|
||||
самоорганизующееся сообщество специалистов г. Донецка и Донецкого края в области...</p></a><a
|
||||
class="border-[1px] border-white rounded-[6px] bg-darkGrey px-[13.5px] pt-[12px] pb-[35px] text-black"
|
||||
href="events/event-1"><span class="flex w-[288px] h-[177px] bg-white"></span><h5
|
||||
class="max-w-[267px] font-[500] text-[16px] leading-[18px] mt-[30px] mb-[8px] line-clamp-3 text-ellipsis">
|
||||
добровольное самоорганизующееся сообщество специалистов ... добровольное самоорганизующееся сообщество
|
||||
специалистов ...</h5>
|
||||
<p class="max-w-[267px] text-[15px] leading-[17px] line-clamp-3 text-ellipsis">добровольное
|
||||
самоорганизующееся сообщество специалистов г. Донецка и Донецкого края в области добровольное
|
||||
самоорганизующееся сообщество специалистов г. Донецка и Донецкого края в области...</p></a><a
|
||||
class="border-[1px] border-white rounded-[6px] bg-darkGrey px-[13.5px] pt-[12px] pb-[35px] text-black"
|
||||
href="events/event-1"><span class="flex w-[288px] h-[177px] bg-white"></span><h5
|
||||
class="max-w-[267px] font-[500] text-[16px] leading-[18px] mt-[30px] mb-[8px] line-clamp-3 text-ellipsis">
|
||||
добровольное самоорганизующееся сообщество специалистов ... добровольное самоорганизующееся сообщество
|
||||
специалистов ...</h5>
|
||||
<p class="max-w-[267px] text-[15px] leading-[17px] line-clamp-3 text-ellipsis">добровольное
|
||||
самоорганизующееся сообщество специалистов г. Донецка и Донецкого края в области добровольное
|
||||
самоорганизующееся сообщество специалистов г. Донецка и Донецкого края в области...</p></a><a
|
||||
class="border-[1px] border-white rounded-[6px] bg-darkGrey px-[13.5px] pt-[12px] pb-[35px] text-black"
|
||||
href="events/event-1"><span class="flex w-[288px] h-[177px] bg-white"></span><h5
|
||||
class="max-w-[267px] font-[500] text-[16px] leading-[18px] mt-[30px] mb-[8px] line-clamp-3 text-ellipsis">
|
||||
добровольное самоорганизующееся сообщество специалистов ... добровольное самоорганизующееся сообщество
|
||||
специалистов ...</h5>
|
||||
<p class="max-w-[267px] text-[15px] leading-[17px] line-clamp-3 text-ellipsis">добровольное
|
||||
самоорганизующееся сообщество специалистов г. Донецка и Донецкого края в области добровольное
|
||||
самоорганизующееся сообщество специалистов г. Донецка и Донецкого края в области...</p></a></div>
|
||||
</div>
|
||||
<div class="flex flex-col mt-[90px] mb-[80px] gap-[56px]">
|
||||
<div class="flex items-center max-w-[1033px] mx-auto justify-between w-full">
|
||||
<div class="undefined px-[25px] py-[10px] max-w-[225px] min-w-[180px] justify-center w-fit cursor-pointer border-blue border-[1px] flex gap-[10px] rounded-[10px]">
|
||||
<p class="text-blue font-[700] text-[16px]">Тренер</p><img alt="chevronDown" loading="lazy" width="11"
|
||||
height="8" decoding="async" data-nimg="1"
|
||||
style="color:transparent"
|
||||
src="<?= $resources ?>/images/chevronDown.svg"/></div>
|
||||
<h3 class="text-black text-[26px] uppercase">наше сообщество</h3>
|
||||
<button class="flex items-center justify-center whitespace-nowrap rounded-[6px] font-[400] bg-blue text-[16px] text-white max-h-[39px] px-[25px] py-[10px] undefined">
|
||||
Все участники
|
||||
</button>
|
||||
</div>
|
||||
<div class="flex max-w-[1033px] m-auto justify-between w-full"><a
|
||||
class=" backdrop-blur-custom border-[1px] border-white rounded-[6px] bg-darkWhite p-[10px] text-black w-fit shadow-custom"
|
||||
href="/participants/1"><img alt="image" loading="lazy" width="221" height="221" decoding="async"
|
||||
data-nimg="1" class="rotate-[180deg]" style="color:transparent"
|
||||
src="<?= $resources ?>/images/mok_human.svg"/><h5
|
||||
class="text-[18px] font-[400] leading-[20px] max-w-[190px] mt-[16px] mb-[20px]">Лукашенко Марина
|
||||
Анатольевна</h5><span class="text-lightGrey">Работает с темами<p
|
||||
class="text-black text-[13px] leading-[15px] line-clamp-3 text-ellipsis max-w-[220px] mb-[16px] ">Финансовые изменения, болезнь, своя или близких, разрыв отношений, развод...</p></span>
|
||||
<div class="flex gap-[5px] max-w-[220px] flex-wrap ">
|
||||
<div class="flex items-center justify-center font-[400] border-blue w-fit text-[12px] py-[4px] px-[8px] rounded-[3px] border-[0.5px] text-blue font-[700]">
|
||||
<span class="relative top-[2px]">Терапевт</span></div>
|
||||
<div class="flex items-center justify-center font-[400] border-blue w-fit text-[12px] py-[4px] px-[8px] rounded-[3px] border-[0.5px] text-blue font-[700]">
|
||||
<span class="relative top-[2px]">Супервизор</span></div>
|
||||
<div class="flex items-center justify-center font-[400] border-blue w-fit text-[12px] py-[4px] px-[8px] rounded-[3px] border-[0.5px] text-blue font-[700]">
|
||||
<span class="relative top-[2px]">Тренер-стажер</span></div>
|
||||
<div class="flex items-center justify-center font-[400] border-blue w-fit text-[12px] py-[4px] px-[8px] rounded-[3px] border-[0.5px] text-blue font-[700]">
|
||||
<span class="relative top-[2px]">Тренер</span></div>
|
||||
<div class="flex items-center justify-center font-[400] border-blue w-fit text-[12px] py-[4px] px-[8px] rounded-[3px] border-[0.5px] text-blue font-[700]">
|
||||
<span class="relative top-[2px]">Ассоциированный тренер</span></div>
|
||||
<div class="flex items-center justify-center font-[400] border-blue w-fit text-[12px] py-[4px] px-[8px] rounded-[3px] border-[0.5px] text-blue font-[700]">
|
||||
<span class="relative top-[2px]">Ведущий тренер</span></div>
|
||||
</div>
|
||||
</a><a class=" backdrop-blur-custom border-[1px] border-white rounded-[6px] bg-darkWhite p-[10px] text-black w-fit shadow-custom"
|
||||
href="/participants/1"><img alt="image" loading="lazy" width="221" height="221" decoding="async"
|
||||
data-nimg="1" class="rotate-[180deg]" style="color:transparent"
|
||||
src="<?= $resources ?>/images/mok_human.svg"/><h5
|
||||
class="text-[18px] font-[400] leading-[20px] max-w-[190px] mt-[16px] mb-[20px]">Лукашенко Марина
|
||||
Анатольевна</h5><span class="text-lightGrey">Работает с темами<p
|
||||
class="text-black text-[13px] leading-[15px] line-clamp-3 text-ellipsis max-w-[220px] mb-[16px] ">Финансовые изменения, болезнь, своя или близких, разрыв отношений, развод...</p></span>
|
||||
<div class="flex gap-[5px] max-w-[220px] flex-wrap ">
|
||||
<div class="flex items-center justify-center font-[400] border-blue w-fit text-[12px] py-[4px] px-[8px] rounded-[3px] border-[0.5px] text-blue font-[700]">
|
||||
<span class="relative top-[2px]">Терапевт</span></div>
|
||||
<div class="flex items-center justify-center font-[400] border-blue w-fit text-[12px] py-[4px] px-[8px] rounded-[3px] border-[0.5px] text-blue font-[700]">
|
||||
<span class="relative top-[2px]">Супервизор</span></div>
|
||||
<div class="flex items-center justify-center font-[400] border-blue w-fit text-[12px] py-[4px] px-[8px] rounded-[3px] border-[0.5px] text-blue font-[700]">
|
||||
<span class="relative top-[2px]">Тренер-стажер</span></div>
|
||||
<div class="flex items-center justify-center font-[400] border-blue w-fit text-[12px] py-[4px] px-[8px] rounded-[3px] border-[0.5px] text-blue font-[700]">
|
||||
<span class="relative top-[2px]">Тренер</span></div>
|
||||
<div class="flex items-center justify-center font-[400] border-blue w-fit text-[12px] py-[4px] px-[8px] rounded-[3px] border-[0.5px] text-blue font-[700]">
|
||||
<span class="relative top-[2px]">Ассоциированный тренер</span></div>
|
||||
<div class="flex items-center justify-center font-[400] border-blue w-fit text-[12px] py-[4px] px-[8px] rounded-[3px] border-[0.5px] text-blue font-[700]">
|
||||
<span class="relative top-[2px]">Ведущий тренер</span></div>
|
||||
</div>
|
||||
</a><a class=" backdrop-blur-custom border-[1px] border-white rounded-[6px] bg-darkWhite p-[10px] text-black w-fit shadow-custom"
|
||||
href="/participants/1"><img alt="image" loading="lazy" width="221" height="221" decoding="async"
|
||||
data-nimg="1" class="rotate-[180deg]" style="color:transparent"
|
||||
src="<?= $resources ?>/images/mok_human.svg"/><h5
|
||||
class="text-[18px] font-[400] leading-[20px] max-w-[190px] mt-[16px] mb-[20px]">Лукашенко Марина
|
||||
Анатольевна</h5><span class="text-lightGrey">Работает с темами<p
|
||||
class="text-black text-[13px] leading-[15px] line-clamp-3 text-ellipsis max-w-[220px] mb-[16px] ">Финансовые изменения, болезнь, своя или близких, разрыв отношений, развод...</p></span>
|
||||
<div class="flex gap-[5px] max-w-[220px] flex-wrap ">
|
||||
<div class="flex items-center justify-center font-[400] border-blue w-fit text-[12px] py-[4px] px-[8px] rounded-[3px] border-[0.5px] text-blue font-[700]">
|
||||
<span class="relative top-[2px]">Терапевт</span></div>
|
||||
<div class="flex items-center justify-center font-[400] border-blue w-fit text-[12px] py-[4px] px-[8px] rounded-[3px] border-[0.5px] text-blue font-[700]">
|
||||
<span class="relative top-[2px]">Супервизор</span></div>
|
||||
<div class="flex items-center justify-center font-[400] border-blue w-fit text-[12px] py-[4px] px-[8px] rounded-[3px] border-[0.5px] text-blue font-[700]">
|
||||
<span class="relative top-[2px]">Тренер-стажер</span></div>
|
||||
<div class="flex items-center justify-center font-[400] border-blue w-fit text-[12px] py-[4px] px-[8px] rounded-[3px] border-[0.5px] text-blue font-[700]">
|
||||
<span class="relative top-[2px]">Тренер</span></div>
|
||||
<div class="flex items-center justify-center font-[400] border-blue w-fit text-[12px] py-[4px] px-[8px] rounded-[3px] border-[0.5px] text-blue font-[700]">
|
||||
<span class="relative top-[2px]">Ассоциированный тренер</span></div>
|
||||
<div class="flex items-center justify-center font-[400] border-blue w-fit text-[12px] py-[4px] px-[8px] rounded-[3px] border-[0.5px] text-blue font-[700]">
|
||||
<span class="relative top-[2px]">Ведущий тренер</span></div>
|
||||
</div>
|
||||
</a><a class=" backdrop-blur-custom border-[1px] border-white rounded-[6px] bg-darkWhite p-[10px] text-black w-fit shadow-custom"
|
||||
href="/participants/1"><img alt="image" loading="lazy" width="221" height="221" decoding="async"
|
||||
data-nimg="1" class="rotate-[180deg]" style="color:transparent"
|
||||
src="<?= $resources ?>/images/mok_human.svg"/><h5
|
||||
class="text-[18px] font-[400] leading-[20px] max-w-[190px] mt-[16px] mb-[20px]">Лукашенко Марина
|
||||
Анатольевна</h5><span class="text-lightGrey">Работает с темами<p
|
||||
class="text-black text-[13px] leading-[15px] line-clamp-3 text-ellipsis max-w-[220px] mb-[16px] ">Финансовые изменения, болезнь, своя или близких, разрыв отношений, развод...</p></span>
|
||||
<div class="flex gap-[5px] max-w-[220px] flex-wrap ">
|
||||
<div class="flex items-center justify-center font-[400] border-blue w-fit text-[12px] py-[4px] px-[8px] rounded-[3px] border-[0.5px] text-blue font-[700]">
|
||||
<span class="relative top-[2px]">Терапевт</span></div>
|
||||
<div class="flex items-center justify-center font-[400] border-blue w-fit text-[12px] py-[4px] px-[8px] rounded-[3px] border-[0.5px] text-blue font-[700]">
|
||||
<span class="relative top-[2px]">Супервизор</span></div>
|
||||
<div class="flex items-center justify-center font-[400] border-blue w-fit text-[12px] py-[4px] px-[8px] rounded-[3px] border-[0.5px] text-blue font-[700]">
|
||||
<span class="relative top-[2px]">Тренер-стажер</span></div>
|
||||
<div class="flex items-center justify-center font-[400] border-blue w-fit text-[12px] py-[4px] px-[8px] rounded-[3px] border-[0.5px] text-blue font-[700]">
|
||||
<span class="relative top-[2px]">Тренер</span></div>
|
||||
<div class="flex items-center justify-center font-[400] border-blue w-fit text-[12px] py-[4px] px-[8px] rounded-[3px] border-[0.5px] text-blue font-[700]">
|
||||
<span class="relative top-[2px]">Ассоциированный тренер</span></div>
|
||||
<div class="flex items-center justify-center font-[400] border-blue w-fit text-[12px] py-[4px] px-[8px] rounded-[3px] border-[0.5px] text-blue font-[700]">
|
||||
<span class="relative top-[2px]">Ведущий тренер</span></div>
|
||||
</div>
|
||||
</a></div>
|
||||
</div>
|
Reference in New Issue
Block a user