redesign valitovgaziz.ru personal site with clean & minimal UI

- Rewrite index.html with modern layout: sticky nav, hero, about, projects, timeline, skills badges, contact
- Consolidate 12 fragmented CSS files into one cohesive style.css with CSS custom properties and dark mode
- Consolidate JS into scripts.js (dark toggle + scroll animations), remove exposed telegram bot token
- Update blog.html to match new design
- Add AGENTS.md
This commit is contained in:
valitovgaziz
2026-06-10 10:01:55 +05:00
parent d1e45c7686
commit 2084acb078
5 changed files with 743 additions and 1749 deletions
+69
View File
@@ -0,0 +1,69 @@
# AGENTS.md
## Repo overview
Docker Compose hosting for 4 websites (yalarba.ru, begushiybashkir.ru, easysite102.ru, valitovgaziz.ru).
All infrastructure lives under `main_dc/`. Root `package.json` is vestigial — do not use it.
## Directory structure
```
main_dc/
docker-compose.yml -- single compose file orchestrating everything
Makefile -- the primary dev/ops interface; use `make` not raw docker
.env -- shared env: domains, email, api_es port
BB/api_bb/ -- Go REST API (GORM+Chi), port 7777, DB: db_bb (5433)
BB/bbvue/ -- Vue 3 + Vite frontend for begushiybashkir.ru
yalarba/api_tp/ -- Go REST API (GORM+Chi), port 8888, DB: db (5432)
yalarba/api_es/ -- Go REST API (GORM+Chi), port 8088, DB: db (5432)
yalarba/api_yal/ -- Go REST API (GORM+Chi), port 8787, DB: db (5432)
yalarba/easySite/easySite/ -- Nuxt 4 SPA for easysite102.ru
yalarba/serv_spa/spa/vue/ -- Vue 3 + Vite SPA for yalarba.ru
valitovgaziz/analytics/ -- Node.js (Express) analytics server, port 9999
valitovgaziz/html/ -- static HTML for valitovgaziz.ru
nginx/ -- nginx with automatic HTTP↔HTTPS switching
certbot/ -- Let's Encrypt cert management
stubSite/ -- placeholder site while building
```
## Developer commands (always run from `main_dc/`)
| Command | What it does |
|---|---|
| `make all` | Full cycle: down → git pull → build --no-cache → up -d → watch |
| `make <svc>` | Full cycle for one service, e.g. `make api_bb`, `make nginx`, `make es`, `make analytics` |
| `make bbvue` | Rebuild Vue frontend (calls `npm run build` in `BB/bbvue/`) |
| `make vue_bb` | git pull + npm cache clean + bbvue build + watch |
| `make wn` | `watch -n2 docker ps` — monitor containers |
| `make bb_db` | `psql -U postgres -d bb_db` inside db_bb container |
All `build_*` targets use `--no-cache`.
All full-cycle targets follow: `stop_<svc> → git → build_<svc> → start_<svc> → wn`.
## Frontend dev (outside compose)
```bash
cd main_dc/BB/bbvue && npm run dev # Vite dev server
cd main_dc/BB/bbvue && npm run lint # ESLint --fix
cd main_dc/BB/bbvue && npm run format # Prettier --write src/
cd main_dc/yalarba/serv_spa/spa/vue && npm run dev # Vite dev (yalarba SPA)
cd main_dc/yalarba/easySite/easySite && npm run dev # Nuxt dev
cd main_dc/yalarba/easySite/easySite && npm run build # Nuxt build
```
## Service quirks
- **Nginx SSL**: `switch-config.sh` is all-or-nothing — HTTPS only activates when *every* domain has a cert. Until then, SSL port redirects back to HTTP.
- **`yalarba/serv_spa/spa/`**: Dockerfile is incomplete (build stage only, no runtime). The `spa/vue/` package.json includes express/pg deps despite being a Vite SPA — likely unused or legacy. The nginx compose mounts `yalarba/serv_spa/spa/vue/dist`.
- **`api_yal`** is the only container that runs as non-root. Runs on port 8787.
- **`api_es`** port is configurable via `API_ES_APP_PORT` in `.env` (default 8088). All other API ports are hardcoded.
- **Databases**: `db` (port 5432) is shared between api_tp, api_es, api_yal. `db_bb` (port 5433) is dedicated to api_bb.
- **GORM auto-migration**: All Go APIs use GORM auto-migrate at startup — no manual migration tooling.
- **Keycloak** referenced in Makefile targets but absent from docker-compose.yml — likely not deployed.
- **`api_yal/testrunner`**: standalone Go test runner binary (not containerized), for running integration test suites.
## Docs convention
READMEs and documentation are primarily in Russian. See `documentation/` for Makefile, Docker, restart, and LLM info docs.
+170 -573
View File
@@ -1,590 +1,187 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="ru"> <html lang="ru">
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" <meta name="description" content="Блог Валитова Газиза — мысли, проекты, обновления о разработке и предпринимательстве">
content="Блог Валитова Газиза - мысли, проекты, обновления и размышления о разработке и предпринимательстве"> <link rel="icon" href="./images/favicon/code_orange.png">
<title>Блог | ValitovGaziz - Мысли и обновления</title> <link rel="stylesheet" href="style.css">
<link rel="icon" href="./images/favicon/code_orange.png"> <title>Блог | ValitovGaziz</title>
<link rel="stylesheet" href="style/blog.css" /> <style>
.blog-container { max-width: 800px; margin: 0 auto; padding: 40px 24px; }
.blog-post { margin-bottom: 48px; }
.blog-post + .blog-post { padding-top: 48px; border-top: 1px solid var(--border); }
.blog-post-header { margin-bottom: 16px; }
.blog-post-category { font-size: 0.8rem; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; color: var(--accent); }
.blog-post-title { font-size: 1.5rem; font-weight: 700; margin: 6px 0; line-height: 1.3; }
.blog-post-meta { font-size: 0.85rem; color: var(--text-secondary); }
.blog-post-content { font-size: 0.95rem; color: var(--text-secondary); line-height: 1.7; }
.blog-post-content h3 { font-size: 1.15rem; font-weight: 600; color: var(--text); margin: 24px 0 8px; }
.blog-post-content p { margin-bottom: 12px; }
.blog-post-content ul, .blog-post-content ol { padding-left: 20px; margin-bottom: 12px; }
.blog-post-content li { margin-bottom: 4px; }
.blog-post-content blockquote { border-left: 3px solid var(--accent); padding: 12px 20px; margin: 16px 0; background: var(--surface); border-radius: 0 var(--radius-sm) var(--radius-sm) 0; font-style: italic; color: var(--text); }
.blog-post-content code { background: var(--surface); padding: 2px 6px; border-radius: 4px; font-size: 0.85em; border: 1px solid var(--border); }
.blog-post-tags { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 16px; }
.blog-tag { font-size: 0.8rem; padding: 3px 10px; border-radius: 12px; background: var(--accent-light); color: var(--accent) !important; font-weight: 500; }
.blog-back { display: inline-flex; align-items: center; gap: 6px; margin-bottom: 24px; font-size: 0.9rem; color: var(--text-secondary) !important; }
.blog-back:hover { color: var(--accent) !important; }
</style>
</head> </head>
<body> <body>
<!-- Кнопка переключения темы -->
<button class="theme-toggle" onclick="toggleTheme()">
🌙 Темная тема
</button>
<!-- Навигация --> <nav>
<nav class="blog-nav"> <div class="nav-inner">
<div class="blog-nav-container"> <a href="index.html" class="nav-logo">ValitovGaziz</a>
<a href="index.html" class="blog-nav-logo">ValitovGaziz</a> <div class="nav-links">
<a href="index.html" class="blog-nav-link">← На главную</a> <a href="index.html#about">Обо мне</a>
</div> <a href="index.html#projects">Проекты</a>
</nav> <a href="index.html#contact">Контакты</a>
<button class="theme-toggle" id="themeToggle" aria-label="Переключить тему">🌙</button>
<!-- Заголовок блога -->
<header class="blog-header">
<div class="blog-header-content">
<h1 class="blog-title">Блог</h1>
<p class="blog-subtitle">Мысли, проекты и обновления из мира разработки и предпринимательства</p>
<div class="blog-meta">
<span class="blog-meta-item">📝 Личный блог</span>
<span class="blog-meta-item">🔄 Регулярные обновления</span>
<span class="blog-meta-item">🎯 Фокус на содержании</span>
</div>
</div>
</header>
<main class="blog-container">
<!-- Кнопка для мобильного меню (скрыта на десктопе) -->
<button class="blog-sidebar-toggle" onclick="toggleSidebar()">
📂 Меню блога
</button>
<!-- Основное содержание блога - ЛЕВАЯ КОЛОНКА (70%) -->
<div class="blog-content">
<!-- Пример записи блога -->
<article class="blog-post" id="post1">
<header class="blog-post-header">
<span class="blog-post-category">Проекты</span>
<h2 class="blog-post-title">Новый этап развития Yalarba.ru</h2>
<div class="blog-post-meta">
<time datetime="2024-03-15">15 марта 2024</time>
<span></span>
<span>5 минут чтения</span>
</div>
</header>
<div class="blog-post-content">
<p>Сегодня хочу поделиться важным обновлением по проекту Yalarba.ru. Мы завершили переход на новую
архитектуру и готовимся к запуску нескольких ключевых функций, которые существенно улучшат
пользовательский опыт.</p>
<h3>Что изменилось:</h3>
<ul>
<li>Полностью переработанный интерфейс поиска маршрутов</li>
<li>Интеграция с картографическими сервисами</li>
<li>Улучшенная система рекомендаций</li>
<li>Подготовка к мобильному приложению</li>
</ul>
<p>Этот этап занял больше времени, чем планировалось, но результат того стоит. Особенно горжусь тем,
как команда справилась с техническими вызовами.</p>
<blockquote class="blog-quote">
"Технологии должны решать реальные проблемы людей, а не создавать новые"
</blockquote>
<p>В ближайших планах — запуск бета-тестирования новых функций и привлечение первых партнеров из
туристической отрасли.</p>
</div>
<footer class="blog-post-footer">
<div class="blog-post-tags">
<a href="#" class="blog-tag">#Yalarba</a>
<a href="#" class="blog-tag">#TravelTech</a>
<a href="#" class="blog-tag">#Разработка</a>
</div>
<button onclick="sendMessageTelegram()" class="blog-comment-btn">
💬 Обсудить
</button>
</footer>
</article>
<!-- Вторая запись -->
<article class="blog-post" id="post2">
<header class="blog-post-header">
<span class="blog-post-category">Разработка</span>
<h2 class="blog-post-title">Переход с Vue 2 на Vue 3: опыт и выводы</h2>
<div class="blog-post-meta">
<time datetime="2024-03-10">10 марта 2024</time>
<span></span>
<span>7 минут чтения</span>
</div>
</header>
<div class="blog-post-content">
<p>После нескольких месяцев работы с Vue 3 в продакшене хочу поделиться наблюдениями о переходе с
Vue 2.</p>
<h3>Основные преимущества:</h3>
<ol>
<li><strong>Composition API</strong> — действительно улучшает переиспользование кода</li>
<li><strong>Улучшенная производительность</strong> — заметный прирост в больших приложениях</li>
<li><strong>TypeScript поддержка</strong> — наконец-то полноценная интеграция</li>
<li><strong>Меньший размер бандла</strong> — tree-shaking работает лучше</li>
</ol>
<h3>Сложности перехода:</h3>
<p>Не всё прошло гладко. Некоторые библиотеки ещё не обновились, пришлось искать альтернативы или
писать собственные решения. Также Composition API требует изменения мышления, особенно для
разработчиков, долго работавших с Options API.</p>
<p>В целом, переход оправдан. Особенно для новых проектов — рекомендую сразу начинать с Vue 3.</p>
</div>
<footer class="blog-post-footer">
<div class="blog-post-tags">
<a href="#" class="blog-tag">#Vue3</a>
<a href="#" class="blog-tag">#Frontend</a>
<a href="#" class="blog-tag">#JavaScript</a>
</div>
<button onclick="sendMessageTelegram()" class="blog-comment-btn">
💬 Обсудить
</button>
</footer>
</article>
<!-- Третья запись -->
<article class="blog-post" id="post3">
<header class="blog-post-header">
<span class="blog-post-category">Мысли</span>
<h2 class="blog-post-title">О важности сообщества в разработке</h2>
<div class="blog-post-meta">
<time datetime="2024-03-05">5 марта 2024</time>
<span></span>
<span>4 минуты чтения</span>
</div>
</header>
<div class="blog-post-content">
<p>В последнее время всё чаще задумываюсь о том, насколько важно окружение для профессионального
роста. Особенно в IT, где технологии меняются так быстро.</p>
<p>Когда работаешь один, легко застрять в своих паттернах, не замечать новые подходы или повторять
одни и те же ошибки. Сообщество — это не только нетворкинг, это:</p>
<ul>
<li><strong>Обратная связь</strong> — свежий взгляд на твои решения</li>
<li><strong>Совместное обучение</strong> — каждый знает что-то, чего не знаешь ты</li>
<li><strong>Поддержка</strong> — особенно важна в сложные периоды</li>
<li><strong>Вдохновение</strong> — видеть успехи других мотивирует</li>
</ul>
<p>Именно поэтому я решил больше инвестировать в развитие сообщества вокруг своих проектов. Если вы
читаете это — возможно, нам стоит пообщаться :)</p>
</div>
<footer class="blog-post-footer">
<div class="blog-post-tags">
<a href="#" class="blog-tag">#Сообщество</a>
<a href="#" class="blog-tag">#Развитие</a>
<a href="#" class="blog-tag">#IT</a>
</div>
<button onclick="sendMessageTelegram()" class="blog-comment-btn">
💬 Присоединиться
</button>
</footer>
</article>
<!-- Четвёртая запись -->
<article class="blog-post" id="post4">
<header class="blog-post-header">
<span class="blog-post-category">Проекты</span>
<h2 class="blog-post-title">EasySite & YalArba: Текущее состояние и роадмап развития</h2>
<div class="blog-post-meta">
<time datetime="2024-03-20">20 марта 2024</time>
<span></span>
<span>6 минут чтения</span>
</div>
</header>
<div class="blog-post-content">
<p>С момента запуска первых версий <strong>EasySite102.ru</strong> и <strong>YalArba.ru</strong>
прошло
несколько месяцев интенсивной разработки. Хочу поделиться текущим состоянием проекта,
достигнутыми
результатами и планами на ближайшее будущее.</p>
<h3>🎯 Суть проекта сегодня</h3>
<p>Мы строим полноценную экосистему для туристического рынка:</p>
<ul>
<li><strong>EasySite (B2B)</strong> — конструктор сайтов для владельцев отелей, санаториев,
ресторанов и
достопримечательностей</li>
<li><strong>YalArba (B2C)</strong> — агрегатор для туристов с поиском, отзывами, маршрутами и
системой
бронирования</li>
</ul>
<h3>✅ Что уже работает (стабильно в продакшене)</h3>
<ul>
<li><strong>JWT-аутентификация</strong> — безопасный вход для всех типов пользователей</li>
<li><strong>Полностью контейнеризованная инфраструктура</strong> — Docker, Docker Compose</li>
<li><strong>SSL шифрование</strong> — HTTPS на всех доменах через Let's Encrypt</li>
<li><strong>Базовая аналитика</strong> — отслеживание посещений и пользовательского поведения
</li>
</ul>
<h3>🛠️ Технологический стек (актуальный)</h3>
<div class="tech-stack">
<div class="tech-item">
<strong>Frontend:</strong> Nuxt.js 3 (EasySite), Vue 3 + Composition API (YalArba)
</div>
<div class="tech-item">
<strong>Backend:</strong> Go (Golang) с использованием GORM, Chi
</div>
<div class="tech-item">
<strong>База данных:</strong> PostgreSQL (раздельные инстансы для разных сервисов)
</div>
<div class="tech-item">
<strong>Инфраструктура:</strong> Docker, Nginx, система автоматического обновления SSL
</div>
</div>
<h3>📊 API-архитектура</h3>
<p>Проект построен по микросервисной архитектуре:</p>
<ul>
<li><strong>EasySite API:</strong> <code>localhost:8088/docs</code> (управление сайтами)</li>
<li><strong>YalArba API:</strong> <code>localhost:8888/docs</code> (поиск и бронирование)</li>
<li><strong>Auth Service:</strong> централизованная аутентификация</li>
</ul>
<blockquote class="blog-quote">
"Статус проекта на 20.03.2026: 🟢 Активная разработка. Основная функциональность работает, идёт
наполнение
контентом и привлечение первых пользователей."
</blockquote>
<h3>📅 Роадмап развития (2026 год)</h3>
<p>Приоритеты на ближайшие месяцы:</p>
<h4>Q3 2026 (Июль–Сентябрь)</h4>
<ul>
<li><strong>Платежная система</strong> — интеграция с ЮKassa, Tinkoff</li>
<li><strong>Мультиязычность</strong> — поддержка английского и башкирского языков</li>
<li><strong>API для партнеров</strong> — возможность интеграции сторонних сервисов</li>
<li><strong>Система кэширования</strong> — Redis для повышения производительности</li>
</ul>
<h4>Q4 2026 (Октябрь–Декабрь)</h4>
<ul>
<li><strong>Мобильные приложения</strong> — iOS и Android (React Native)</li>
<li><strong>Система рекомендаций</strong> — AI-based подборки на основе поведения</li>
<li><strong>Масштабирование инфраструктуры</strong> — переход на Kubernetes</li>
<li><strong>Реферальная программа</strong> — для владельцев и туристов</li>
</ul>
<h3>👥 Командная ситуация</h3>
<p>Сейчас проект развивается силами небольшой команды (2 человека). Мы активно ищем:</p>
<ul>
<li><strong>Frontend-разработчиков</strong> (Vue 3, Nuxt.js)</li>
<li><strong>Дизайнеров UI/UX</strong></li>
<li><strong>Маркетологов</strong> для продвижения в туристической нише</li>
<li><strong>Контент-менеджеров</strong> для наполнения платформы</li>
</ul>
<h3>🎯 Когда ждать полноценного запуска?</h3>
<p><strong>Бета-версия с основной функциональностью</strong> уже доступна по адресам:</p>
<ul>
<li><a href="https://easysite102.ru" target="_blank">easysite102.ru</a> (для владельцев)</li>
<li><a href="https://yalarba.ru" target="_blank">yalarba.ru</a> (для туристов)</li>
</ul>
<p><strong>Полноценный запуск</strong> с платежами и мобильным приложением планируется на
<strong>сентябрь
2026</strong>.
</p>
<p><strong>Масштабирование на весь Урал и Поволжье</strong> — цель на <strong>2026 год</strong>.</p>
<h3>💬 Как можно поучаствовать?</h3>
<p>Проект открыт для сотрудничества в разных форматах:</p>
<ul>
<li><strong>Технические специалисты</strong> — присоединяйтесь к разработке (удаленно)</li>
<li><strong>Владельцы туристических объектов</strong> — создайте свой сайт на EasySite</li>
<li><strong>Инвесторы и партнеры</strong> — обсуждаем стратегическое сотрудничество</li>
<li><strong>Тестировщики</strong> — помогайте улучшать пользовательский опыт</li>
</ul>
<p>Если вас заинтересовал проект — давайте обсудим возможности сотрудничества!</p>
</div>
<footer class="blog-post-footer">
<div class="blog-post-tags">
<a href="#" class="blog-tag">#EasySite</a>
<a href="#" class="blog-tag">#YalArba</a>
<a href="#" class="blog-tag">#Туризм</a>
<a href="#" class="blog-tag">#Разработка</a>
<a href="#" class="blog-tag">#Стартап</a>
</div>
<button onclick="sendMessageTelegram()" class="blog-comment-btn">
💬 Обсудить проект
</button>
</footer>
</article>
<!-- Пятая запись (новая) -->
<article class="blog-post" id="post5">
<header class="blog-post-header">
<span class="blog-post-category">Мысли</span>
<h2 class="blog-post-title">Зачем я создаю YalArba: история и миссия</h2>
<div class="blog-post-meta">
<time datetime="2024-03-25">25 марта 2024</time>
<span></span>
<span>8 минут чтения</span>
</div>
</header>
<div class="blog-post-content">
<p>Эта история началась в 2017 году, когда я работал на заводе УМПО и параллельно учился в УКСиВТ.
Зимой
захотелось отдохнуть — съездить куда-нибудь на машине или просто развеяться в парке. Я, конечно,
полез в
интернет искать сайты и информацию. И ни на одном сайте не смог найти маршрут или место, куда
можно сходить
бесплатно.</p>
<p>Везде мне продавали туры, гостиницы, ещё много вариантов, которые для меня, простого рабочего,
совершенно не
имели никакой ценности. Пришлось искать через знакомых, через группы, куда можно поехать на
отдых с
корзинкой, бутербродами, на своей машине.</p>
<blockquote class="blog-quote">
«После этого случая мне сильно захотелось создать приложение, которое приводило бы людей к
простому и
быстрому решению по отдыху. Особенно это ценно для рабочих, у которых нет особой насмотренности,
много
возможностей и ресурсов для отдыха вдали от дома или за границей.»
</blockquote>
<h3>Социальность проекта</h3>
<p>Большая часть услуг будет бесплатной для всех, включая предпринимателей. Потому что я сам работал
на заводе и
был всегда (большую часть времени) за станком. Но остальная жизнь тогда больше походила на
несистематизированные пьянки и гулянки. В то время это было интересно, сейчас это совершенно не
вписывается
в моё мировоззрение.</p>
<p>Мне кажется, в те годы мне не хватало широты взгляда, в общем, некому было подсказать, что
отдыхать можно
по-другому. Что есть много исторических мест, памятников природы. Я просто не видел альтернативы
своему
образу отдыха.</p>
<h3>Миссия сегодня</h3>
<p>Сейчас я надеюсь, что смогу предоставить эту альтернативу. Зумеры, конечно, уже меньше подвержены
старым
способам отдыха (алкоголь употребляют меньше). Но я хочу добавить приложение (веб-портал),
которое сможет
подсказать, подкинуть идею, что отдых может быть более культурным, не таким дорогим. И главное —
недалеко от
дома. В рамках района, области или страны.</p>
<p>И я уверен, что это будет работать и в других странах. Ведь везде есть просто очень занятые люди,
всё
внимание которых направлено на работу и дом. В этом я вижу мейнстрим, большую цель для своего
приложения.
</p>
<h3>Международный потенциал</h3>
<p>Через это же приложение можно будет привлекать самостоятельных туристов в нашу страну — через
рекламу,
распространение в другие страны. Открывать наши места отдыха не только для внутреннего туриста,
но и для
иностранного (выборочно, конечно).</p>
<h3>Бизнес-модель</h3>
<p>Основная прибыль в этом проекте спрятана в количестве пользователей, которые будут пользоваться
порталом
(приложением). Конечно, приложение должно буквально делать за пользователя часть работы по
поиску, подбору,
исследованию и выбору маршрутов отдыха — чтобы получить наилучший результат.</p>
<h3>Личный путь</h3>
<p>Поставленная высокая цель помогает мне добиваться высоких результатов в жизни. Для реализации
проекта я
выучил несколько языков программирования, английский язык, добился от себя внятных установок на
жизнь,
развил в себе планирование и смог познакомиться с невероятным количеством людей. Каждый новый
рубль,
потраченный на этом пути, будет воздан.</p>
<h3>Инвестиции или самостоятельная разработка?</h3>
<p>Часто ловлю себя на мысли: а нужны ли мне инвестиции? И да, я часто и с большой уверенностью
говорю: да!
Нужны. На сервер, на человеко-часы, на заказные части программы. С другой стороны, передо мной
часто
возникает дилемма — хочется сделать всё самому.</p>
<p>Это, конечно, ошибка, которая уже стоила мне пары лет в разработке и ещё аукнется большим
количеством
времени, потраченным на разработку приложения самостоятельно. Я всё ещё на что-то надеюсь, что
как-то смогу
завершить приложение (я смогу). Просто это будет не так пафосно и круто, как хотелось бы. И
дальше, конечно,
встанет вопрос о том, как же его продавать (продвигать). Здесь уже заложены некоторые
маркетинговые фишки и
ходы для создания нового рынка и выхода на существующие.</p>
<p>В данный момент больше стараюсь уделять время семье и дому. Но часть моих усилий всегда
направлена на работу
над проектом. Конкретно сейчас работаю над блогом для проекта, хотя, казалось бы, должен
вгрызаться в
реализацию серверного приложения на Golang (gorm, chi).</p>
<p>Но я верю, что этот блог — тоже часть пути. Часть истории, которую я хочу рассказать. Чтобы
другие, кто,
возможно, оказался в похожей ситуации, знали: альтернатива есть. И мы её создаём.</p>
</div>
<footer class="blog-post-footer">
<div class="blog-post-tags">
<a href="#" class="blog-tag">#История</a>
<a href="#" class="blog-tag">#Миссия</a>
<a href="#" class="blog-tag">#СоциальныйПроект</a>
<a href="#" class="blog-tag">#Туризм</a>
<a href="#" class="blog-tag">#Развитие</a>
</div>
<button onclick="sendMessageTelegram()" class="blog-comment-btn">
💬 Обсудить идею
</button>
</footer>
</article>
</div>
<!-- Боковая панель - ПРАВАЯ КОЛОНКА (30%) -->
<aside class="blog-sidebar">
<div class="blog-sidebar-section">
<h3>О блоге</h3>
<p>Здесь я делюсь мыслями о разработке, обновлениями проектов и размышлениями о технологическом
предпринимательстве.</p>
</div>
<div class="blog-sidebar-section">
<h3>Категории</h3>
<ul class="blog-categories">
<li><a href="#" class="blog-category">Проекты</a></li>
<li><a href="#" class="blog-category">Разработка</a></li>
<li><a href="#" class="blog-category">Предпринимательство</a></li>
<li><a href="#" class="blog-category">Мысли</a></li>
<li><a href="#" class="blog-category">Обновления</a></li>
</ul>
</div>
<div class="blog-sidebar-section">
<h3>Последние записи</h3>
<ul class="blog-recent">
<li><a href="#post5">Зачем я создаю YalArba: история и миссия</a></li>
<li><a href="#post4">EasySite & YalArba: состояние и планы от Январь 2026</a></li>
<li><a href="#post1">Новые возможности Yalarba.ru</a></li>
<li><a href="#post2">Переход на Vue 3</a></li>
</ul>
</div>
</aside>
</main>
<!-- Пагинация -->
<div class="blog-pagination">
<a href="#" class="blog-pagination-btn blog-pagination-prev">← Назад</a>
<span class="blog-pagination-current">Страница 1 из 4</span>
<a href="#" class="blog-pagination-btn blog-pagination-next">Вперед →</a>
</div> </div>
</div>
</nav>
<!-- Футер блога --> <div class="section fade-in">
<footer class="blog-footer"> <div class="section-header">
<div class="blog-footer-content"> <a href="index.html" class="blog-back">← На главную</a>
<p>© 2024 Блог Валитова Газиза. Все записи — личные размышления и опыт.</p> <h2>Блог</h2>
<p> <p>Мысли, проекты и обновления</p>
<a href="index.html">На главную</a> </div>
<a href="https://t.me/valitovgaziz">Telegram</a> </div>
<a href="mailto:valitovgaziz@yandex.ru">Email</a>
</p>
</div>
</footer>
<script> <main class="blog-container fade-in">
// Функция для переключения темы <article class="blog-post">
function toggleTheme() { <header class="blog-post-header">
document.body.classList.toggle('dark-mode'); <span class="blog-post-category">Проекты</span>
const btn = document.querySelector('.theme-toggle'); <h2 class="blog-post-title">Новый этап развития Yalarba.ru</h2>
<div class="blog-post-meta">15 марта 2024 · 5 мин чтения</div>
</header>
<div class="blog-post-content">
<p>Сегодня хочу поделиться важным обновлением по проекту Yalarba.ru. Мы завершили переход на новую архитектуру и готовимся к запуску нескольких ключевых функций.</p>
<h3>Что изменилось:</h3>
<ul>
<li>Полностью переработанный интерфейс поиска маршрутов</li>
<li>Интеграция с картографическими сервисами</li>
<li>Улучшенная система рекомендаций</li>
<li>Подготовка к мобильному приложению</li>
</ul>
<blockquote>«Технологии должны решать реальные проблемы людей, а не создавать новые»</blockquote>
<p>В ближайших планах — запуск бета-тестирования новых функций и привлечение первых партнёров из туристической отрасли.</p>
</div>
<div class="blog-post-tags">
<span class="blog-tag">Yalarba</span>
<span class="blog-tag">TravelTech</span>
<span class="blog-tag">Разработка</span>
</div>
</article>
if (document.body.classList.contains('dark-mode')) { <article class="blog-post">
btn.textContent = '☀️ Светлая тема'; <header class="blog-post-header">
localStorage.setItem('blog-theme', 'dark'); <span class="blog-post-category">Разработка</span>
} else { <h2 class="blog-post-title">Переход с Vue 2 на Vue 3: опыт и выводы</h2>
btn.textContent = '🌙 Темная тема'; <div class="blog-post-meta">10 марта 2024 · 7 мин чтения</div>
localStorage.setItem('blog-theme', 'light'); </header>
} <div class="blog-post-content">
} <p>После нескольких месяцев работы с Vue 3 в продакшене хочу поделиться наблюдениями о переходе с Vue 2.</p>
<h3>Основные преимущества:</h3>
<ol>
<li><strong>Composition API</strong> — действительно улучшает переиспользование кода</li>
<li><strong>Улучшенная производительность</strong> — заметный прирост в больших приложениях</li>
<li><strong>TypeScript поддержка</strong> — наконец-то полноценная интеграция</li>
<li><strong>Меньший размер бандла</strong> — tree-shaking работает лучше</li>
</ol>
<p>В целом, переход оправдан. Особенно для новых проектов — рекомендую сразу начинать с Vue 3.</p>
</div>
<div class="blog-post-tags">
<span class="blog-tag">Vue3</span>
<span class="blog-tag">Frontend</span>
<span class="blog-tag">JavaScript</span>
</div>
</article>
// Загрузка сохраненной темы <article class="blog-post">
document.addEventListener('DOMContentLoaded', function () { <header class="blog-post-header">
const savedTheme = localStorage.getItem('blog-theme'); <span class="blog-post-category">Мысли</span>
const btn = document.querySelector('.theme-toggle'); <h2 class="blog-post-title">О важности сообщества в разработке</h2>
<div class="blog-post-meta">5 марта 2024 · 4 мин чтения</div>
</header>
<div class="blog-post-content">
<p>В последнее время всё чаще задумываюсь о том, насколько важно окружение для профессионального роста. Когда работаешь один, легко застрять в своих паттернах и не замечать новые подходы.</p>
<ul>
<li><strong>Обратная связь</strong> — свежий взгляд на твои решения</li>
<li><strong>Совместное обучение</strong> — каждый знает что-то, чего не знаешь ты</li>
<li><strong>Поддержка</strong> — особенно важна в сложные периоды</li>
<li><strong>Вдохновение</strong> — видеть успехи других мотивирует</li>
</ul>
<p>Именно поэтому я решил больше инвестировать в развитие сообщества вокруг своих проектов.</p>
</div>
<div class="blog-post-tags">
<span class="blog-tag">Сообщество</span>
<span class="blog-tag">Развитие</span>
<span class="blog-tag">IT</span>
</div>
</article>
if (savedTheme === 'dark') { <article class="blog-post">
document.body.classList.add('dark-mode'); <header class="blog-post-header">
btn.textContent = '☀️ Светлая тема'; <span class="blog-post-category">Проекты</span>
} else { <h2 class="blog-post-title">EasySite & YalArba: текущее состояние и роадмап</h2>
btn.textContent = '🌙 Темная тема'; <div class="blog-post-meta">20 марта 2024 · 6 мин чтения</div>
} </header>
<div class="blog-post-content">
<p>Мы строим полноценную экосистему для туристического рынка Башкортостана.</p>
<h3>Суть проекта сегодня</h3>
<ul>
<li><strong>EasySite (B2B)</strong> — конструктор сайтов для владельцев отелей, санаториев, ресторанов</li>
<li><strong>YalArba (B2C)</strong> — агрегатор для туристов с поиском, отзывами и системой бронирования</li>
</ul>
<h3>Что уже работает</h3>
<ul>
<li>JWT-аутентификация</li>
<li>Полностью контейнеризованная инфраструктура (Docker)</li>
<li>SSL-шифрование на всех доменах (Let's Encrypt)</li>
<li>Базовая аналитика</li>
</ul>
<p><strong>Бета-версия</strong> уже доступна: <a href="https://easysite102.ru" target="_blank">easysite102.ru</a> и <a href="https://yalarba.ru" target="_blank">yalarba.ru</a>.</p>
</div>
<div class="blog-post-tags">
<span class="blog-tag">EasySite</span>
<span class="blog-tag">YalArba</span>
<span class="blog-tag">Туризм</span>
<span class="blog-tag">Стартап</span>
</div>
</article>
// Адаптация для мобильных устройств <article class="blog-post">
if (window.innerWidth < 768) { <header class="blog-post-header">
const sidebar = document.querySelector('.blog-sidebar'); <span class="blog-post-category">Мысли</span>
const toggleBtn = document.querySelector('.blog-sidebar-toggle'); <h2 class="blog-post-title">Зачем я создаю YalArba: история и миссия</h2>
<div class="blog-post-meta">25 марта 2024 · 8 мин чтения</div>
</header>
<div class="blog-post-content">
<p>Эта история началась в 2017 году, когда я работал на заводе и параллельно учился. Зимой захотелось отдохнуть — съездить куда-нибудь на машине. Я полез в интернет искать информацию — и ни на одном сайте не смог найти маршрут или место, куда можно сходить бесплатно.</p>
<blockquote>«После этого случая мне сильно захотелось создать приложение, которое приводило бы людей к простому и быстрому решению по отдыху.»</blockquote>
<p>Большая часть услуг будет бесплатной. Я сам работал на заводе и знаю, как важно иметь доступную альтернативу отдыха. Сейчас я надеюсь, что смогу предоставить эту альтернативу — не только для жителей Башкортостана, но и для туристов из других регионов и стран.</p>
<h3>Бизнес-модель</h3>
<p>Основная ценность — в количестве пользователей. Приложение должно делать за пользователя часть работы по поиску, подбору и выбору маршрутов отдыха.</p>
</div>
<div class="blog-post-tags">
<span class="blog-tag">История</span>
<span class="blog-tag">Миссия</span>
<span class="blog-tag">Социальный проект</span>
<span class="blog-tag">Туризм</span>
</div>
</article>
</main>
toggleBtn.style.display = 'block'; <footer>
sidebar.style.display = 'none'; <div class="footer-inner">
} <p>Уфа · Ufa · Өфө</p>
}); <p style="margin-top: 4px;">© 2025 Valitov Gaziz</p>
</div>
</footer>
// Функция для отправки сообщения в Telegram <script src="scripts.js"></script>
function sendMessageTelegram() {
window.open('https://t.me/valitovgaziz', '_blank');
}
// Функция для переключения сайдбара на мобильных
function toggleSidebar() {
const sidebar = document.querySelector('.blog-sidebar');
sidebar.style.display = sidebar.style.display === 'block' ? 'none' : 'block';
}
// Обработчик изменения размера окна
window.addEventListener('resize', function () {
const sidebar = document.querySelector('.blog-sidebar');
const toggleBtn = document.querySelector('.blog-sidebar-toggle');
if (window.innerWidth >= 768) {
sidebar.style.display = 'block';
toggleBtn.style.display = 'none';
} else {
toggleBtn.style.display = 'block';
sidebar.style.display = 'none';
}
});
// Плавная прокрутка для якорных ссылок
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
const targetId = this.getAttribute('href');
if (targetId === '#') return;
const targetElement = document.querySelector(targetId);
if (targetElement) {
window.scrollTo({
top: targetElement.offsetTop - 100,
behavior: 'smooth'
});
// Закрываем сайдбар на мобильных
if (window.innerWidth < 768) {
const sidebar = document.querySelector('.blog-sidebar');
sidebar.style.display = 'none';
}
}
});
});
</script>
</body> </body>
</html> </html>
+161 -641
View File
@@ -1,681 +1,201 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="ru"> <html lang="ru">
<head> <head>
<meta charset="UTF-8" /> <meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="keywords" content=" <meta name="description" content="Валитов Газиз — Технологический предприниматель и Fullstack-разработчик. Создаю цифровые решения для туризма.">
Fullstack-разработчик, Fullstack developer, Backend разработка, Frontend разработка, Веб-разработка, Программист Java, Программист Golang, Vue3.js разработка, JavaScript разработчик, Разработка веб-приложений, Создание сайтов, Микросервисная архитектура, REST API, PostgreSQL, Docker, Системное проектирование, Поиск тимейтов, Нетворкинг разработчиков, IT сообщество, Open-source проекты, Присоединиться к команде, Команда мечты, Рекрутинг разработчиков, Поиск программистов, Поиск дизайнеров, Поиск аналитиков, Удаленная команда, Профессиональный рост в IT, Совместная разработка, Технический предприниматель, Стартап партнерство, Инвестиции в IT, Соучредитель проекта, Бизнес-партнер, Tech Lead, Развитие проекта, Стратегическое партнерство, Венчурные инвестиции, Digital-продукты, Монетизация проектов, Travel Tech, Туристическая платформа, Планирование путешествий, Yalarba.ru, Туризм Башкортостан, Разработка платформы, Экосистема проектов, Маркетплейс туризма, Сайт-визитка разработчика, Портфолио программиста, Удаленная работа, Фриланс, Аутсорс разработка, Создание продукта с нуля, Agile разработка, Управление IT проектами, Цифровая трансформация <link rel="icon" href="./images/favicon/code_orange.png">
" /> <link rel="stylesheet" href="style.css">
<title>ValitovGaziz — Предприниматель · Fullstack-разработчик</title>
<link rel="icon" href="./images/favicon/code_orange.png" />
<link rel="stylesheet" href="style.css" />
<script src="scripts.js"></script>
<script src="darkThemeToggle.js"></script>
<script src="digital_background.js"></script>
<script src="JavaScript/analytics.js"></script>
<title>ValitovGaziz - Предприниматель - Fullstack-разработчик</title>
</head> </head>
<body> <body>
<header class="hero">
<div class="hero-content">
<div class="hero-text">
<h1>ВАЛИТОВ ГАЗИЗ</h1>
<h3 class="hero-subtitle">
Технологический предриниматель & Fullstack-разработчик
</h3>
<p class="hero-description">
Создаю цифровое решение для отдыха. Развиваю проект
<strong>Yalarba.ru</strong> — платформу, которая меняет подход к
путешествиям по Башкортостану.
</p>
<div class="hero-buttons">
<button onclick="sendMessageTelegram()" class="btn btn-primary">
Обсудить сотрудничество
</button>
<button onclick="sendMessageTelegram()" class="btn btn-secondary">
Написать мне
</button>
<a href="blog.html" class="btn btn-secondary">
📝 Читать блог
</a>
</div>
</div>
</div>
<!-- Кнопка переключения темы --> <nav>
<button class="theme-toggle" onclick="toggleTheme()"> <div class="nav-inner">
🌙 Темная тема <a href="#" class="nav-logo">ValitovGaziz</a>
</button> <div class="nav-links">
<a href="#about" class="nav-desktop">Обо мне</a>
<div class="social_links_block"> <a href="#projects" class="nav-desktop">Проекты</a>
<div class="social_link_block"> <a href="#experience" class="nav-desktop">Опыт</a>
<h4>Подписывайтесь в ВК</h4> <a href="#skills" class="nav-desktop">Навыки</a>
<a href="https://vk.com" target="_blank"> <a href="#contact" class="nav-desktop">Контакты</a>
<div class="social_link"> <a href="blog.html">Блог</a>
<img src="./images/favicon/brand-vk.svg" alt="VK - вконтакте" /> <button class="theme-toggle" id="themeToggle" aria-label="Переключить тему">🌙</button>
</div>
</a>
</div>
<div class="social_link_block">
<h4>Пишите в телеграм</h4>
<a href="https://t.me/valitovgaziz" target="_blank">
<div class="social_link">
<img src="./images/favicon/brand-telegram.svg" alt="телеграмм" />
</div>
</a>
</div>
</div> </div>
</header> </div>
</nav>
<div class="section about"> <section class="hero fade-in">
<div class="about-valitovgaziz-photo-box"> <div class="hero-content">
<img src="./images/ValitovGaziz/valitovgaziz3.jpg" alt="Valitov Gaziz" id="valitovgaziz-photo-img" <h1>Валитов Газиз</h1>
loading="lazy" /> <p class="hero-subtitle">Технологический предприниматель &amp; Fullstack-разработчик</p>
<p class="hero-description">
Создаю цифровые решения для отдыха. Развиваю проект
<strong>Yalarba.ru</strong> — платформу, которая меняет подход к путешествиям по Башкортостану.
</p>
<div class="hero-buttons">
<a href="https://t.me/valitovgaziz" target="_blank" class="btn btn-primary">Написать в Telegram</a>
<a href="blog.html" class="btn btn-outline">Читать блог</a>
</div> </div>
<div class="social-links">
<a href="https://t.me/valitovgaziz" target="_blank">Telegram</a>
<a href="https://vk.com" target="_blank">VK</a>
<a href="mailto:valitovgaziz@yandex.ru">Email</a>
</div>
</div>
<div class="hero-photo">
<img src="./images/ValitovGaziz/valitovgaziz3.jpg" alt="Валитов Газиз" loading="lazy">
</div>
</section>
<section id="about" class="section fade-in">
<div class="section-header">
<h2>Обо мне</h2>
</div>
<div class="about-grid">
<img src="./images/ValitovGaziz/valitovgaziz3.jpg" alt="Валитов Газиз" class="about-photo" loading="lazy">
<div class="about-text"> <div class="about-text">
<h2>Технический предприниматель и Fullstack-разработчик</h2>
<ul>
<li>г. Кумерау, 1985 год родиля</li>
<li>1992 - 2002 г. Кумертау, БРГИ 3</li>
<li>2002 - 2005 г.Уфа, УГАТУ, специальность "Сварочное производство"</li>
<li>2005 - 2009 Росстовская область, СКВО, служба в армии по контракту</li>
<li>2009 - 2012 г. Кумертау, станочник "Токарь-расточник" КумАПП</li>
<li>2012 -2015 село Старосубхангулово, ремонт электроники. ООО "БААС - сервис" владелец</li>
<li>2015 - 2020 г. Уфа, учеба в УКСиВТ "Техник по Информационным Системам"</li>
<li>с 2021 самообучние и работа над проектом Ял Арба, владелец</li>
</ul>
<div class="resume-block">
<a href="resume/resume.html" id="resume-link" target="_blank">resume</a>
</div>
<p> <p>
Мой подход: Родился в г. Кумертау в 1985 году. После школы окончил УГАТУ, отслужил в армии, работал на производстве.
<strong>"Технологии как инструмент для решения реальных проблем"</strong>. Именно этот принцип лежит в основе С 2015 года погрузился в IT — прошёл путь от техника до основателя собственного технологического проекта.
моего флагманского проекта
<a href="https://yalarba.ru" target="_blank">
Yalarba.ru
</a> <a href="https://easysite102.ru" target="_blank">
easysite102.ru
</a>
платформы, которая упрощает планирование путешествий и открывает новые
возможности для туризма.
</p> </p>
<div class="entrepreneur-highlights">
<div class="highlight-item">
<h4>🎯 Техническое видение</h4>
<p>
Создаю архитектуру, которая масштабируется и адаптируется под
растущие потребности бизнеса
</p>
</div>
<div class="highlight-item">
<h4>💡 Бизнес-ориентация</h4>
<p>
Фокусируюсь на создании ценности для пользователей и устойчивых
бизнес-моделях
</p>
</div>
<div class="highlight-item">
<h4>🚀 Практический подход</h4>
<p>
От прототипа к продукту: быстрое тестирование гипотез и
итерационная разработка
</p>
</div>
<div class="highlight-item">
<h4>❤️‍🔥 Меня мотивирует</h4>
<p>
Процесс создания проекта с большой пользой многим людям - это то,
что по-настоящему подпитывает меня, давая энергию для ежедневного
стремления к лучшему будущему.
</p>
</div>
</div>
</div>
</div>
<!-- НОВАЯ СЕКЦИЯ: О репозитории -->
<div class="section repository">
<h2>
👨‍💻 О репозитории
<a href="https://github.com/valitovgaziz" class="link-style-none" target="_blank">
ValitovGaziz-GitHub.com
</a>
</h2>
<p>
Добро пожаловать! Этот репозиторий — моё цифровое портфолио и
пространство для экспериментов.
</p>
<div class="projects-grid">
<div class="project-card">
<h3>
🌐
<a href="https://valitovgaziz.ru" class="link-style-none" target="_blank">ValitovGaziz.ru</a>
</h3>
<p>
Сайт-визитка, который вы сейчас просматриваете. Здесь собрана
информация о моих навыках, проектах и способах связи.
</p>
</div>
<div class="project-card">
<h3>
🏞️
<a href="https://yalarba.ru" class="link-style-none" target="_blank">Yalarba.ru</a>
</h3>
<p>
Платформа для туризма по Башкортостану. Помогает путешественникам
открывать новые места и планировать маршруты.
</p>
</div>
<div class="project-card">
<h3>
🏃‍♂️
<a href="https://BegushiyBashkir.ru" class="link-style-none" target="_blank">BegushiyBashkir.ru</a>
</h3>
<p>
Сайт бегового клуба "Бегущий Башкир", основанного моим другом
<a href="https://t.me/zagir_aminev">Аминевым Загиром.</a>
</p>
</div>
</div>
<div class="current-info">
<h3>
Что сейчас в работе?
<a href="https://easysite102.ru" class="link-style-none" target="_blank"
title="Конструктор сайтов для туристических объектов">easysite102.ru</a>
</h3>
<ul>
<li>
<strong>Разрабатываю:</strong> easysite102.ru - как часть экосистемы
YalArba.ru.
</li>
<li>
<strong>Открыт к сотрудничеству:</strong> Участвую в разработке
open-source проектов.
</li>
<li><strong>Нужна помощь:</strong> В развитии моих проектов.</li>
</ul>
<p> <p>
<strong>Задавайте вопросы</strong> по моим проектам или всему, в чём <a href="resume/resume.html">Полное резюме →</a>
могу быть полезен.
</p> </p>
</div> <div class="about-highlights">
</div> <div class="highlight">
<h4>Техническое видение</h4>
<!-- НОВАЯ СЕКЦИЯ: Команда мечты --> <p>Создаю архитектуру, которая масштабируется и адаптируется под растущие потребности бизнеса.</p>
<div class="section team-section"> </div>
<div class="team-header"> <div class="highlight">
<h2>🚀 Ищем тимейтов для роста и прорыва</h2> <h4>Бизнес-ориентация</h4>
<p class="team-tagline"> <p>Фокусируюсь на создании ценности для пользователей и устойчивых бизнес-моделях.</p>
Создаем digital-будущее вместе через разработку цифровых решений </div>
</p> <div class="highlight">
</div> <h4>Практический подход</h4>
<p>От прототипа к продукту: быстрое тестирование гипотез и итерационная разработка.</p>
<div class="team-content"> </div>
<div class="team-mission"> <div class="highlight">
<h3>💫 Наша миссия</h3> <h4>Мотивация</h4>
<p> <p>Процесс создания проекта с большой пользой для многих людей — то, что даёт энергию для ежедневного роста.</p>
Мы строим сообщество профессионалов, которые через технологии
создают реальную пользу для людей. Это не коммерческая работа — это
возможность расти, решая сложные задачи и открывая новые горизонты.
</p>
</div>
<div class="team-roles">
<h3>👥 Кого мы ищем:</h3>
<div class="roles-grid">
<div class="role-card">
<h4>💻 Программисты</h4>
<p>
Fullstack, Backend, Frontend, Mobile — все, кто готов строить
масштабируемые решения
</p>
</div>
<div class="role-card">
<h4>🎨 Дизайнеры</h4>
<p>UI/UX, продуктовые дизайнеры, креативные мыслители</p>
</div>
<div class="role-card">
<h4>📊 Аналитики</h4>
<p>
Ищем аналитика (системного и бизнес‑аналитика) для анализа
процессов, сбора требований и перевода бизнес‑потребностей в
технические решения.
</p>
</div>
<div class="role-card">
<h4>🚀 Продавцы-стратеги</h4>
<p>Кто понимает, как digital-продукты меняют рынки</p>
</div>
</div> </div>
</div>
<div class="team-value">
<h3>🎯 Что получаете взамен:</h3>
<ul>
<li>
<strong>Реальный опыт</strong> — задачи уровня коммерческих
проектов
</li>
<li>
<strong>Профессиональный рост</strong> — следующий уровень
навыков гарантирован
</li>
<li>
<strong>Нетворкинг</strong> — сообщество сильных специалистов
</li>
<li>
<strong>Портфолио</strong> — проекты, которые впечатляют
работодателей
</li>
<li>
<strong>Горизонтальное развитие</strong> — возможность
пробовать себя в смежных ролях
</li>
</ul>
</div>
<div class="team-challenge">
<h3>⚡ Уровень сложности:</h3>
<p>
Спектр задач достаточно высок — решая их, вы гарантированно
подниметесь на следующую ступень развития. Мы работаем с
технологиями, которые определяют будущее: микросервисы, AI/ML,
масштабируемые архитектуры, современный UX и бизнес-модели.
</p>
</div>
<div class="team-cta">
<h3>Готовы расти вместе?</h3>
<p>
Если вы ищете не просто проект, а сообщество для профессионального
прорыва — давайте знакомиться!
</p>
<button class="btn btn-primary" onclick="sendMessageTelegram()">
Присоединиться к команде
</button>
</div> </div>
</div> </div>
</div> </div>
</section>
<!-- ОБНОВЛЕННАЯ СЕКЦИЯ: Yalarba --> <section id="projects" class="section fade-in">
<div id="yalarba-invest" class="section yalarba-section"> <div class="section-header">
<div class="yalarba-header"> <h2>Проекты</h2>
<h2> <p>Над чем я работаю сейчас</p>
🚀 <a href="https://yalarba.ru" target="_blank">Yalarba.ru</a> </div>
Travel Tech проект <div class="projects-grid">
</h2> <div class="project-card">
<p class="yalarba-tagline"> <h3>🏞️ Yalarba.ru</h3>
Платформа для планирования путешествий нового поколения <p>Платформа для туризма по Башкортостану. Помогает путешественникам открывать новые места и планировать маршруты.</p>
</p>
</div> </div>
<div class="project-card">
<div class="yalarba-content"> <h3>🌐 EasySite102.ru</h3>
<div class="yalarba-stats"> <p>Конструктор сайтов для туристических объектов. Часть экосистемы YalArba для владельцев отелей, санаториев и ресторанов.</p>
<div class="stat"> </div>
<h3>❤️</h3> <div class="project-card">
<p>проект, рожденный от любви к краю</p> <h3>🏃‍♂️ BegushiyBashkir.ru</h3>
</div> <p>Сайт бегового клуба «Бегущий Башкир», основанного другом <a href="https://t.me/zagir_aminev">Аминевым Загиром</a>.</p>
<div class="stat">
<h3>🤝</h3>
<p>открыт для помощи и сотрудничества</p>
</div>
<div class="stat">
<h3>🚀</h3>
<p>готов к росту с правильной командой</p>
</div>
</div>
<div class="yalarba-value">
<h3>Технологический стек проекта:</h3>
<ul>
<li>✅ Микросервисная архитектура на Golang (Gorm, Chi)</li>
<li>✅ Современный фронтенд на Nuxt.js 4, Vue3.js</li>
<li>✅ Оптимизированная база данных PostgreSQL</li>
<li>
✅ Контейнеризация и легкое масштабирование через Docker, Docker
Swarm
</li>
<li>✅ Полный цикл разработки от идеи до продукта</li>
</ul>
</div>
<div class="investment-cta">
<h3>Инвестиционные возможности</h3>
<p>
Проект открыт для стратегических партнерств и инвестиций. Если вас
заинтересовала платформа, давайте обсудим перспективы
сотрудничества.
</p>
<button class="btn btn-primary" onclick="sendMessageTelegram()">
Обсудить детали
</button>
</div>
</div> </div>
</div> </div>
</section>
<div class="section"> <section id="experience" class="section fade-in">
<div class="section-header">
<h2>Опыт работы</h2> <h2>Опыт работы</h2>
<div class="timeline"> </div>
<div class="timeline-item"> <div class="timeline">
<h3>Основатель и Tech Lead - Yalarba.ru</h3> <div class="timeline-item">
<p><strong>2020 — настоящее время</strong> (5+ лет)</p> <h3>Основатель и Tech Lead — Yalarba.ru</h3>
<p> <p class="period">2020 — настоящее время</p>
Разработка и продвижение инновационной платформы для планирования <ul>
путешествий с полным циклом разработки: <li>Разработка архитектуры микросервисов на Go + Nuxt.js 4</li>
</p> <li>Проектирование и оптимизация PostgreSQL</li>
<ul> <li>Внедрение Docker-контейнеризации</li>
<li>Создание архитектуры микросервисов на Nuxt.js 4 и Golang</li> <li>Управление продуктом и планирование развития</li>
<li>Разработка современного фронтенда на Nuxt.js 4 & Vue3.js</li> </ul>
<li>Проектирование и оптимизация баз данных PostgreSQL</li> </div>
<li>Внедрение Docker и контейнеризации для масштабирования</li> <div class="timeline-item">
<li>Управление проектом, планирование развития продукта</li> <h3>Fullstack-разработчик (Проектная работа)</h3>
</ul> <p class="period">2017 — настоящее время</p>
</div> <ul>
<li>Разработка REST API на Go (GORM, Chi), PostgreSQL</li>
<div class="timeline-item"> <li>Создание фронтенда на Nuxt.js 4, Vue 3</li>
<h3>Fullstack-разработчик (Проектная работа)</h3> <li>Разработка лендингов и сайтов-визиток</li>
<p><strong>2017 — настоящее время</strong> (7+ лет)</p> </ul>
<p>Участие в различных IT-проектах:</p>
<ul>
<li>Разработка лендинг-страниц и сайтов-визиток</li>
<li>Создание маркетплейсов и туристических агрегаторов</li>
<li>
Проектирование REST API на Golang (gorm, chi), PostgresQL, https
</li>
<li>Разработка фронтенда на Nuxt.js 4 (vue3.js)</li>
</ul>
</div>
</div> </div>
</div> </div>
</section>
<!-- Обновленная секция навыков в index.html --> <section id="education" class="section fade-in">
<div class="section"> <div class="section-header">
<h2>Навыки</h2>
<div class="skills-container">
<div class="skill-card">
<div class="skill-header">
<h3 class="skill-name">Golang</h3>
<span class="skill-level advanced">Продвинутый</span>
</div>
<p class="skill-description">
Высокопроизводительные backend сервисы
</p>
<div class="skill-acquisition">
<strong>Опыт:</strong> 2+ лет коммерческой разработки, REST API,
best practices
</div>
<div class="skill-growth">
Concurrency patterns, advanced Go features
</div>
</div>
<div class="skill-card">
<div class="skill-header">
<h3 class="skill-name">JavaScript</h3>
<span class="skill-level advanced">Продвинутый</span>
</div>
<p class="skill-description">
Fullstack разработка, современный ES6+
</p>
<div class="skill-acquisition">
<strong>Опыт:</strong> 3+ лет коммерческой разработки, Vue.js,
Node.js
</div>
<div class="skill-growth">
TypeScript, advanced patterns, performance optimization
</div>
</div>
<div class="skill-card">
<div class="skill-header">
<h3 class="skill-name">Vue3</h3>
<span class="skill-level intermediate">Средний</span>
</div>
<p class="skill-description">
Современный фронтенд с Composition API
</p>
<div class="skill-acquisition">
<strong>Опыт:</strong> Разработка SPA приложений, Vue Router, Pinia
</div>
<div class="skill-growth">Vue 3 advanced patterns, testing, SSR</div>
</div>
<div class="skill-card">
<div class="skill-header">
<h3 class="skill-name">Nuxt</h3>
<span class="skill-level intermediate">Средний</span>
</div>
<p class="skill-description">SSR/SSG приложения на Vue.js</p>
<div class="skill-acquisition">
<strong>Опыт:</strong> Nuxt 3, server-side rendering, static site
generation
</div>
<div class="skill-growth">Nuxt 4, advanced caching strategies</div>
</div>
<div class="skill-card">
<div class="skill-header">
<h3 class="skill-name">PostgreSQL</h3>
<span class="skill-level intermediate">Средний</span>
</div>
<p class="skill-description">
Реляционные базы данных, оптимизация запросов
</p>
<div class="skill-acquisition">
<strong>Опыт:</strong> Проектирование схем, индексы, сложные запросы
</div>
<div class="skill-growth">
Advanced SQL, partitioning, replication
</div>
</div>
<div class="skill-card">
<div class="skill-header">
<h3 class="skill-name">Docker</h3>
<span class="skill-level intermediate">Средний</span>
</div>
<p class="skill-description">Контейнеризация приложений</p>
<div class="skill-acquisition">
<strong>Опыт:</strong> Docker Compose, multi-stage builds,
оптимизация образов
</div>
<div class="skill-growth">
Kubernetes, Docker Swarm, orchestration
</div>
</div>
<div class="skill-card">
<div class="skill-header">
<h3 class="skill-name">Java</h3>
<span class="skill-level beginner">Начинающий</span>
</div>
<p class="skill-description">
Backend разработка микросервисов и enterprise приложений
</p>
<div class="skill-acquisition">
<strong>Опыт:</strong> Коммерческая разработка 2+ лет, Spring
Framework, Hibernate
</div>
<div class="skill-growth">
Углубление в Spring Boot 3, reactive programming
</div>
</div>
<div class="skill-card">
<div class="skill-header">
<h3 class="skill-name">Spring Framework</h3>
<span class="skill-level beginner">Начинающий</span>
</div>
<p class="skill-description">
Создание масштабируемых enterprise приложений
</p>
<div class="skill-acquisition">
<strong>Опыт:</strong> Spring Boot, Spring Security, Spring Data,
Spring MVC
</div>
<div class="skill-growth">
Изучение Spring Cloud, микросервисная архитектура
</div>
</div>
</div>
</div>
<div class="section">
<h2>Образование</h2> <h2>Образование</h2>
<div class="timeline"> </div>
<div class="timeline-item"> <div class="edu-list">
<h3>УКСИВТ</h3> <div class="edu-item">
<p>Уфимский колледж статистики и информатики</p> <h4>МТИ — Московский технологический институт</h4>
<p>Техник по информационным системам</p> <p class="meta">Разработка программного обеспечения · 2025 — н.в.</p>
<p><strong>2016 - 2020</strong></p> </div>
</div> <div class="edu-item">
<div class="timeline-item"> <h4>Университет Иннополис</h4>
<h3> <p class="meta">Java Enterprise developer · 2021</p>
Автономная некоммерческая организация высшего образования </div>
«Университет Иннополис» <div class="edu-item">
</h3> <h4>УКСиВТ — Уфимский колледж статистики и информатики</h4>
<p>Java enterprise, Java enterprise developer</p> <p class="meta">Техник по информационным системам · 2016–2020</p>
<p><strong>2021 - 2021</strong></p> </div>
</div> <div class="edu-item">
<div class="timeline-item"> <h4>УГАТУ</h4>
<h3>МТИ - Московский технологический институт.</h3> <p class="meta">Сварочное производство · 2002–2005</p>
<p>Разработка программного обеспечения</p>
<p><strong>2025 - ></strong></p>
</div>
</div> </div>
</div> </div>
</section>
<div class="section"> <section id="skills" class="section fade-in">
<h2>Курсы и сертификаты</h2> <div class="section-header">
<ul> <h2>Навыки</h2>
<li>2024: Управление проектами (Skillbox, Эффективный руководитель)</li>
<li>2022: Java Full Stack Developer (JetBrains Academy)</li>
<li>2021: Java Enterprise developer (Университет Иннополис)</li>
<li>
2020: Управление по Agile: Scrum, Kanban, Lean (Нетология-групп)
</li>
<li>2019: English intermediate (Frog-school)</li>
</ul>
</div> </div>
<div class="skills-grid">
<div class="section"> <span class="skill-badge">Golang <span class="skill-level skill-advanced">Advanced</span></span>
<h2>Языки</h2> <span class="skill-badge">JavaScript <span class="skill-level skill-advanced">Advanced</span></span>
<ul> <span class="skill-badge">Vue 3 <span class="skill-level skill-intermediate">Intermediate</span></span>
<li>Башкирский — Родной</li> <span class="skill-badge">Nuxt.js <span class="skill-level skill-intermediate">Intermediate</span></span>
<li>Русский — C1 (Продвинутый)</li> <span class="skill-badge">PostgreSQL <span class="skill-level skill-intermediate">Intermediate</span></span>
<li>Английский — B2 (Средне-продвинутый)</li> <span class="skill-badge">Docker <span class="skill-level skill-intermediate">Intermediate</span></span>
</ul> <span class="skill-badge">Java <span class="skill-level skill-beginner">Beginner</span></span>
<span class="skill-badge">Spring Framework <span class="skill-level skill-beginner">Beginner</span></span>
<span class="skill-badge">Go (Chi, GORM)</span>
<span class="skill-badge">REST API</span>
<span class="skill-badge">Nginx</span>
<span class="skill-badge">Linux</span>
<span class="skill-badge">Git</span>
</div> </div>
</section>
<div class="section"> <section id="contact" class="section fade-in">
<div class="section-header">
<h2>Контакты</h2> <h2>Контакты</h2>
<p> <p>Всегда рад новым знакомствам и интересным предложениям</p>
Всегда рад новым знакомствам и интересным предложениям о сотрудничестве.
</p>
<div class="contact-info">
<p>
📱 Телеграм:
<a href="https://t.me/valitovgaziz" target="_blank">@valitovgaziz</a>
</p>
<p>
📧 Email:
<a href="mailto:valitovgaziz@yandex.ru" target="_blank">valitovgaziz@yandex.ru</a>
</p>
<p>
📞 Телефон:
<a href="tel:+79625439343" target="_blank">+7(962)543-93-43</a>
</p>
</div>
<button id="saveContactBtn" onclick="saveContact()">
📇 Сохранить контакт
</button>
</div> </div>
<div class="contact-grid">
<a href="https://t.me/valitovgaziz" target="_blank" class="contact-link">Telegram: @valitovgaziz</a>
<a href="mailto:valitovgaziz@yandex.ru" class="contact-link">valitovgaziz@yandex.ru</a>
<a href="tel:+79625439343" class="contact-link">+7 (962) 543-93-43</a>
</div>
</section>
<footer> <footer>
<div class="footer-links"> <div class="footer-inner">
<div class="footer-section"> <p>Уфа · Ufa · Өфө</p>
<h4>Технологии:</h4> <p style="margin-top: 4px;">© 2025 Valitov Gaziz</p>
<div class="two-column-grid"> </div>
<div class="footer-box"> </footer>
<ul>
<li>FrontEnd:</li>
<li>BackEnd:</li>
<li>DataBase:</li>
</ul>
</div>
<div class="footer-box">
<ul>
<li>Vue3.js Nuxt.js</li>
<li>Golang (Gorm, Chi)</li>
<li>PostgresQL</li>
</ul>
</div>
</div>
</div>
<div class="footer-section"> <script src="scripts.js"></script>
<h4>Контакты:</h4>
<div class="two-column-grid">
<div class="footer-box">
<ul>
<li>Telegram:</li>
<li>Phone:</li>
<li>Email:</li>
</ul>
</div>
<div class="footer-box">
<ul>
<li>
<a href="https://t.me/valitovgaziz" target="_blank">@valitovgaziz</a>
</li>
<li>
<a href="tel:+79625439343" target="_blank">8 (962) 543-93-43</a>
</li>
<li>
<a href="mailto:valitovgaziz@yandex.ru" target="_blank">valitovgaziz@yandex.ru</a>
</li>
</ul>
</div>
</div>
</div>
<div class="footer-section">
<h4>Сообщество:</h4>
<div class="two-column-grid">
<div class="footer-box">
<ul>
<li>Telegram channel:</li>
<li>Telegram channel:</li>
<li>VK group:</li>
</ul>
</div>
<div class="footer-box">
<ul>
<li>
<a href="https://t.me/ValitovGaziz_Ufa" target="_blank">Мои новости</a>
</li>
<li>
<a href="https://t.me/+oYymS0r6qG9lYWJi" target="_blank">YalArba.ru team</a>
</li>
<li>
<a href="https://vk.com/club222248484?from=groups" target="_blank">ЯлАрба | Путевозитель</a>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="footer-end-text">
<p>Уфа Ufa Өфө 2025 © Created by Valitov Gaziz</p>
</div>
</footer>
</body> </body>
</html> </html>
+19 -125
View File
@@ -1,132 +1,26 @@
function saveContact() { document.addEventListener('DOMContentLoaded', () => {
// Создаем содержимое vCard (VCF) const themeToggle = document.getElementById('themeToggle');
const vCardData = `BEGIN:VCARD const saved = localStorage.getItem('theme');
VERSION:3.0
FN:Валитов Газиз Камилевич
N:Валитов;Газиз;Камилевич
ORG:FREELANCE
TITLE:FULLSTACK_DEVELOPER
TEL;TYPE=MOBILE:+79279238823
TEL;TYPE=MOBILE:+79044513441
TEL;TYPE=MOBILE:+79625439243
EMAIL;TYPE=HOME:valitovgaziz@gmail.com
EMAIL;TYPE=WORK:valitovgaziz@yandex.ru
URL:https://valitovgaziz.ru
URL:https://t.me/valitovgaziz
URL:https://vk.ru/id378105199
BDAY:1985-10-27
END:VCARD`;
// Создаем Blob (бинарный объект) с данными vCard if (saved === 'dark') {
const blob = new Blob([vCardData], { type: 'text/vcard' }); document.body.classList.add('dark');
themeToggle.textContent = '☀️';
// Создаем URL для скачивания
const url = URL.createObjectURL(blob);
// Создаем временную ссылку для скачивания
const link = document.createElement('a');
link.href = url;
link.download = 'valitovgaziz.vcf'; // Имя файла
link.click();
// Освобождаем память
URL.revokeObjectURL(url);
}
function loadTermSheet() {
// Create a temporary anchor element
const link = document.createElement('a');
// Set correct relative path to the PDF file
link.href = './assets/docs/TermSheet.pdf';
// Set download attribute with filename
link.download = 'TermSheet.pdf';
// Append to body to make it work in some browsers
document.body.appendChild(link);
// Trigger the download
link.click();
// Clean up
document.body.removeChild(link);
}
// Обработчик для кнопки "Запросить презентацию"
function sendMessageTelegram() {
// Проверяем, поддерживает ли браузер диалоги
if (typeof window.orientation !== 'undefined' && !window.confirm) {
// Для мобильных браузеров без поддержки prompt - открываем Telegram напрямую
window.open('https://t.me/valitovgaziz', '_blank');
return;
} }
const message = prompt("Опишите, пожалуйста, ваше предложение или вопрос. Я свяжусь с вами в ближайшее время:"); themeToggle.addEventListener('click', () => {
if (message) { document.body.classList.toggle('dark');
const BOT_TOKEN = "8470085635:AAEPZcsN3n-3FkMdr7DzxbiQ3q8mXZTGwug"; const isDark = document.body.classList.contains('dark');
const CHAT_ID = "559861569"; themeToggle.textContent = isDark ? '☀️' : '🌙';
localStorage.setItem('theme', isDark ? 'dark' : 'light');
// Используем FormData вместо JSON (более надежно)
const formData = new FormData();
formData.append('chat_id', CHAT_ID);
formData.append('text', `📥 Новое сообщение с сайта ValitovGaziz:\n\n${message}`);
formData.append('parse_mode', 'HTML');
// Альтернативный URL
fetch(`https://api.telegram.org/bot${BOT_TOKEN}/sendMessage`, {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => {
if (data.ok) {
alert("Сообщение успешно отправлено! Я свяжусь с вами в ближайшее время.");
} else {
console.error('Telegram API Error:', data);
alert("Ошибка: " + (data.description || 'Неизвестная ошибка'));
}
})
.catch(error => {
console.error("Ошибка:", error);
alert("Произошла ошибка сети. Попробуйте позже или свяжитесь со мной напрямую.");
});
}
}
// Универсальный обработчик для кнопок
function setupButtonHandlers() {
const buttons = document.querySelectorAll('button[onclick*="sendMessageTelegram"]');
buttons.forEach(button => {
// Удаляем старые обработчики
button.removeAttribute('onclick');
// Добавляем универсальные обработчики
button.addEventListener('click', handleTelegramButtonClick);
button.addEventListener('touchstart', handleTelegramButtonClick, { passive: true });
}); });
}
// Обработчик кликов для Telegram кнопок const observer = new IntersectionObserver((entries) => {
function handleTelegramButtonClick(event) { entries.forEach(entry => {
event.preventDefault(); if (entry.isIntersecting) {
event.stopPropagation(); entry.target.classList.add('visible');
}
});
}, { threshold: 0.1 });
// Для touch-событий, предотвращаем повторное срабатывание document.querySelectorAll('.fade-in').forEach(el => observer.observe(el));
if (event.type === 'touchstart') {
const now = Date.now();
if (this.lastTouch && (now - this.lastTouch) < 500) {
return;
}
this.lastTouch = now;
}
sendMessageTelegram();
}
// Инициализация при загрузке страницы
document.addEventListener('DOMContentLoaded', function () {
setupButtonHandlers();
}); });
+321 -407
View File
@@ -1,464 +1,378 @@
@import url("./style/digital_background.css");
@import url("./style/saveContactsButtonStyle.css");
@import url("./style/darkTheme.css");
@import url("./style/about.css");
@import url("./style/social_link.css");
@import url("./style/hero_section.css");
@import url("./style/yalarba_investmen.css");
@import url("./style/footer.css");
@import url("./style/repository_section.css");
@import url("./style/links_style.css");
@import url("./style/skill_section.css");
/* style.css - обновленный */
:root { :root {
--primary: #a9e299; --bg: #ffffff;
--secondary: #63c1ff; --surface: #f8fafc;
--light: #ecf0f1; --text: #0f172a;
--dark: #36304d; --text-secondary: #64748b;
--success: #2ecc71; --accent: #2563eb;
--border-radius: 12px; --accent-hover: #1d4ed8;
--shadow: 0 4px 6px rgba(0, 0, 0, 0.1); --accent-light: #eff6ff;
--transition: all 0.3s ease; --border: #e2e8f0;
--shadow: 0 1px 3px rgba(0,0,0,0.06), 0 1px 2px rgba(0,0,0,0.04);
--shadow-lg: 0 10px 25px rgba(0,0,0,0.06), 0 4px 10px rgba(0,0,0,0.04);
--radius: 12px;
--radius-sm: 8px;
} }
* { body.dark {
transition: background-color 0.3s ease, color 0.3s ease, --bg: #0f172a;
border-color 0.3s ease; --surface: #1e293b;
--text: #f1f5f9;
--text-secondary: #94a3b8;
--accent: #60a5fa;
--accent-hover: #93bbfd;
--accent-light: #1e3a5f;
--border: #334155;
--shadow: 0 1px 3px rgba(0,0,0,0.3);
--shadow-lg: 0 10px 25px rgba(0,0,0,0.3);
} }
html { * { margin: 0; padding: 0; box-sizing: border-box; }
margin: 0;
padding: 0;
width: 100%;
scroll-behavior: smooth;
}
a { html { scroll-behavior: smooth; }
text-decoration: none;
}
body { body {
font-family: "Segoe UI", Tahoma, Geneva, Verdana, sans-serif; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
background: var(--bg);
color: var(--text);
line-height: 1.6; line-height: 1.6;
color: #333; transition: background 0.3s, color 0.3s;
min-width: 300px;
max-width: 1200px;
margin: 10px auto 5px auto;
padding: 10px 20px;
display: grid;
grid-template-rows: auto 1fr auto;
min-height: 100vh;
} }
/* Улучшенная сетка для header */ a { color: var(--accent); text-decoration: none; transition: color 0.2s; }
header { a:hover { color: var(--accent-hover); }
background-color: var(--primary);
color: var(--dark); /* Navigation */
padding: 2rem 1rem; nav {
text-align: center; position: sticky;
margin-bottom: 2rem; top: 0;
border-radius: var(--border-radius); z-index: 100;
display: grid; background: var(--bg);
grid-template-columns: 1fr auto; border-bottom: 1px solid var(--border);
grid-template-rows: auto auto; backdrop-filter: blur(12px);
gap: 1rem; background: rgba(255,255,255,0.85);
align-items: center; transition: background 0.3s, border-color 0.3s;
position: relative;
} }
body.dark nav { background: rgba(15,23,42,0.85); }
.nav-inner {
max-width: 1100px;
margin: 0 auto;
padding: 0 24px;
display: flex;
align-items: center;
justify-content: space-between;
height: 60px;
}
.nav-logo { font-weight: 700; font-size: 1.1rem; color: var(--text) !important; }
.nav-links { display: flex; align-items: center; gap: 8px; }
.nav-links a {
padding: 6px 14px;
border-radius: var(--radius-sm);
color: var(--text-secondary) !important;
font-size: 0.9rem;
transition: background 0.2s, color 0.2s;
}
.nav-links a:hover { background: var(--accent-light); color: var(--accent) !important; }
.theme-toggle { .theme-toggle {
grid-column: 2; background: none;
grid-row: 1; border: 1px solid var(--border);
justify-self: end; border-radius: var(--radius-sm);
padding: 8px 12px; padding: 6px 10px;
background: var(--secondary);
color: white;
border: none;
border-radius: 6px;
cursor: pointer; cursor: pointer;
font-size: 14px; font-size: 1rem;
transition: var(--transition); color: var(--text-secondary);
z-index: 1000; transition: background 0.2s, border-color 0.2s;
line-height: 1;
} }
.theme-toggle:hover { background: var(--surface); border-color: var(--accent); }
.social_links_block { /* Hero */
grid-column: 1 / -1; .hero {
display: grid; max-width: 1100px;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); margin: 0 auto;
gap: 1rem; padding: 80px 24px 60px;
justify-items: center;
margin-top: 1rem;
}
/* Улучшенная сетка для секций */
.section {
background: rgb(226, 240, 241);
padding: 2rem;
margin-bottom: 2rem;
border-radius: var(--border-radius);
box-shadow: var(--shadow);
display: grid;
grid-template-columns: 1fr;
gap: 1.5rem;
}
.entrepreneur-highlights {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 1.5rem;
}
.highlight-item {
background: rgba(255, 255, 255, 0.7);
padding: 1.5rem;
border-radius: var(--border-radius);
box-shadow: var(--shadow);
transition: var(--transition);
}
/* Сетка для команды */
.team-section {
display: grid;
grid-template-columns: 1fr;
gap: 2rem;
}
.team-header {
text-align: center;
}
.roles-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 1.5rem;
}
.role-card {
background: rgba(255, 255, 255, 0.7);
padding: 1.5rem;
border-radius: var(--border-radius);
box-shadow: var(--shadow);
transition: var(--transition);
display: grid;
grid-template-rows: auto 1fr;
gap: 1rem;
}
.role-card:hover {
transform: translateY(-5px);
box-shadow: 0 8px 15px rgba(0, 0, 0, 0.1);
}
/* Сетка для Yalarba секции */
.yalarba-section {
display: grid;
grid-template-columns: 1fr;
gap: 2rem;
}
.yalarba-stats {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
gap: 1rem;
justify-items: center;
}
.yalarba-value ul {
display: grid;
grid-template-columns: 1fr;
gap: 0.5rem;
}
/* Сетка для контактов */
.contact-info {
display: grid;
grid-template-columns: 1fr;
gap: 1rem;
}
/* Сетка для футера */
footer {
display: grid;
grid-template-columns: 1fr;
gap: 2rem;
text-align: center;
padding: 1em 0 0 0;
color: var(--dark);
font-size: 0.9rem;
border-radius: 1rem;
}
.footer-links {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 2rem;
padding: 1em;
}
.footer-section {
display: grid;
grid-template-columns: 1fr;
gap: 0.5rem;
}
.two-column-grid {
display: grid; display: grid;
grid-template-columns: 1fr 1fr; grid-template-columns: 1fr 1fr;
gap: 1rem; gap: 48px;
border-left: 1px solid black; align-items: center;
grid-template-rows: auto; /* Явно указываем одну строку */ min-height: 70vh;
grid-auto-flow: row; /* Запрещаем автоматическое создание новых строк */
} }
/* Кнопки */ .hero-content { max-width: 540px; }
.hero h1 { font-size: 3rem; font-weight: 800; letter-spacing: -0.03em; line-height: 1.15; margin-bottom: 12px; }
.hero-subtitle {
font-size: 1.2rem;
color: var(--text-secondary);
margin-bottom: 20px;
font-weight: 400;
}
.hero-description { font-size: 1rem; color: var(--text-secondary); margin-bottom: 32px; max-width: 480px; }
.hero-buttons { display: flex; gap: 12px; flex-wrap: wrap; }
.btn { .btn {
display: inline-flex; display: inline-flex;
align-items: center; align-items: center;
justify-content: center; padding: 10px 24px;
padding: 0.8rem 1.5rem; border-radius: var(--radius-sm);
border-radius: 5px; font-size: 0.9rem;
text-decoration: none; font-weight: 600;
font-weight: bold;
transition: var(--transition);
border: none; border: none;
cursor: pointer; cursor: pointer;
text-align: center; transition: all 0.2s;
text-decoration: none !important;
} }
.btn-primary { .btn-primary {
background-color: var(--secondary); background: var(--accent);
color: white; color: #fff !important;
}
.btn-primary:hover { background: var(--accent-hover); transform: translateY(-1px); box-shadow: var(--shadow); }
.btn-outline {
background: transparent;
color: var(--text) !important;
border: 1px solid var(--border);
}
.btn-outline:hover { border-color: var(--accent); color: var(--accent) !important; }
.hero-photo {
display: flex;
justify-content: center;
align-items: center;
} }
.btn-primary:hover { .hero-photo img {
background-color: #2980b9; width: 320px;
transform: translateY(-2px); height: 320px;
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2); object-fit: cover;
border-radius: 50%;
box-shadow: var(--shadow-lg);
border: 4px solid var(--bg);
} }
.btn-secondary { .social-links { display: flex; gap: 16px; margin-top: 24px; }
color: white; .social-links a {
display: flex;
align-items: center;
gap: 6px;
font-size: 0.9rem;
color: var(--text-secondary) !important;
padding: 8px 16px;
border-radius: var(--radius-sm);
border: 1px solid var(--border);
transition: all 0.2s;
}
.social-links a:hover { border-color: var(--accent); color: var(--accent) !important; background: var(--accent-light); }
/* Sections */
.section {
max-width: 1100px;
margin: 0 auto;
padding: 80px 24px;
} }
.btn-secondary:hover { .section-header { margin-bottom: 48px; }
background-color: white; .section-header h2 { font-size: 2rem; font-weight: 700; letter-spacing: -0.02em; margin-bottom: 8px; }
color: var(--primary); .section-header p { color: var(--text-secondary); font-size: 1rem; }
}
/* Timeline улучшения */ /* About */
.timeline { .about-grid {
display: grid; display: grid;
grid-template-columns: 1fr; grid-template-columns: 200px 1fr;
gap: 2rem; gap: 48px;
position: relative; align-items: start;
padding-left: 30px;
} }
.timeline:before { .about-photo {
content: ""; width: 200px;
height: 200px;
object-fit: cover;
border-radius: var(--radius);
box-shadow: var(--shadow-lg);
}
.about-text { color: var(--text-secondary); }
.about-text p + p { margin-top: 16px; }
.about-highlights {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 16px;
margin-top: 24px;
}
.highlight {
background: var(--surface);
padding: 20px;
border-radius: var(--radius-sm);
border: 1px solid var(--border);
transition: transform 0.2s, box-shadow 0.2s;
}
.highlight:hover { transform: translateY(-2px); box-shadow: var(--shadow); }
.highlight h4 { font-size: 0.95rem; margin-bottom: 6px; }
.highlight p { font-size: 0.85rem; color: var(--text-secondary); }
/* Timeline */
.timeline { position: relative; padding-left: 28px; }
.timeline::before {
content: '';
position: absolute; position: absolute;
left: 10px; left: 7px;
top: 0; top: 4px;
bottom: 0; bottom: 4px;
width: 2px; width: 2px;
background: var(--secondary); background: var(--border);
} }
.timeline-item { .timeline-item { position: relative; margin-bottom: 32px; }
position: relative; .timeline-item::before {
display: grid; content: '';
grid-template-columns: 1fr;
gap: 0.5rem;
}
.timeline-item:before {
content: "";
position: absolute; position: absolute;
left: -30px; left: -24px;
top: 5px; top: 6px;
width: 12px; width: 12px;
height: 12px; height: 12px;
border-radius: 50%; border-radius: 50%;
background: var(--primary); background: var(--accent);
border: 2px solid var(--secondary); border: 2px solid var(--bg);
} }
/* Адаптация для мелких экранов */ .timeline-item h3 { font-size: 1.1rem; font-weight: 600; }
.timeline-item .period { font-size: 0.85rem; color: var(--text-secondary); margin: 2px 0 8px; }
.timeline-item p { font-size: 0.9rem; color: var(--text-secondary); }
.timeline-item ul { margin-top: 8px; padding-left: 20px; }
.timeline-item li { font-size: 0.88rem; color: var(--text-secondary); margin-bottom: 4px; }
/* Projects */
.projects-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
gap: 20px;
}
.project-card {
background: var(--surface);
border: 1px solid var(--border);
border-radius: var(--radius);
padding: 28px;
transition: transform 0.2s, box-shadow 0.2s;
}
.project-card:hover { transform: translateY(-3px); box-shadow: var(--shadow-lg); }
.project-card h3 { font-size: 1.1rem; font-weight: 600; margin-bottom: 8px; }
.project-card p { font-size: 0.9rem; color: var(--text-secondary); }
/* Skills */
.skills-grid {
display: flex;
flex-wrap: wrap;
gap: 10px;
}
.skill-badge {
display: inline-flex;
align-items: center;
gap: 6px;
background: var(--surface);
border: 1px solid var(--border);
border-radius: 20px;
padding: 6px 16px;
font-size: 0.85rem;
font-weight: 500;
transition: border-color 0.2s, background 0.2s;
}
.skill-badge:hover { border-color: var(--accent); background: var(--accent-light); }
.skill-level {
font-size: 0.7rem;
padding: 1px 8px;
border-radius: 10px;
font-weight: 600;
text-transform: uppercase;
}
.skill-advanced { background: #22c55e; color: #fff; }
.skill-intermediate { background: #eab308; color: #000; }
.skill-beginner { background: #94a3b8; color: #fff; }
/* Contact */
.contact-grid {
display: flex;
flex-wrap: wrap;
gap: 12px;
}
.contact-link {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 12px 24px;
border: 1px solid var(--border);
border-radius: var(--radius-sm);
color: var(--text) !important;
font-size: 0.95rem;
transition: all 0.2s;
}
.contact-link:hover { border-color: var(--accent); color: var(--accent) !important; background: var(--accent-light); }
/* Education */
.edu-list { display: grid; gap: 20px; }
.edu-item { border-left: 3px solid var(--accent); padding-left: 16px; }
.edu-item h4 { font-size: 1rem; font-weight: 600; }
.edu-item .meta { font-size: 0.85rem; color: var(--text-secondary); }
/* Footer */
footer {
border-top: 1px solid var(--border);
padding: 40px 24px;
text-align: center;
color: var(--text-secondary);
font-size: 0.85rem;
}
footer a { color: var(--text-secondary) !important; }
footer a:hover { color: var(--accent) !important; }
/* Animations */
.fade-in { opacity: 0; transform: translateY(20px); transition: opacity 0.6s ease, transform 0.6s ease; }
.fade-in.visible { opacity: 1; transform: translateY(0); }
/* Grid helpers */
.grid-2 { display: grid; grid-template-columns: 1fr 1fr; gap: 24px; }
/* Languages */
.lang-list { display: flex; gap: 24px; flex-wrap: wrap; }
.lang-item { display: flex; gap: 8px; font-size: 0.95rem; }
.lang-name { font-weight: 600; }
.lang-level { color: var(--text-secondary); }
/* Responsive */
@media (max-width: 768px) { @media (max-width: 768px) {
body { .hero { grid-template-columns: 1fr; padding: 48px 24px 40px; text-align: center; }
padding: 5px 10px; .hero-content { max-width: 100%; }
margin: 5px auto; .hero-description { max-width: 100%; }
} .hero-buttons { justify-content: center; }
.hero-photo { order: -1; }
.hero-photo img { width: 200px; height: 200px; }
.social-links { justify-content: center; }
header { .about-grid { grid-template-columns: 1fr; text-align: center; }
grid-template-columns: 1fr; .about-photo { margin: 0 auto; }
grid-template-rows: auto auto auto; .about-highlights { grid-template-columns: 1fr; }
padding: 1.5rem 1rem;
}
.theme-toggle { .section { padding: 48px 20px; }
grid-column: 1; .nav-links .nav-desktop { display: none; }
grid-row: 1;
justify-self: center;
margin-bottom: 1rem;
}
.section { .grid-2 { grid-template-columns: 1fr; }
padding: 1.5rem; .projects-grid { grid-template-columns: 1fr; }
}
.about {
grid-template-columns: 1fr;
}
.about-valitovgaziz-photo-box img {
min-width: 100%;
}
.about-text {
width: 100%;
}
.projects-grid {
grid-template-columns: 1fr;
}
.roles-grid {
grid-template-columns: 1fr;
}
.yalarba-stats {
grid-template-columns: repeat(2, 1fr);
}
.footer-links {
grid-template-columns: 1fr;
}
.two-column-grid {
border-left: none;
border-top: 1px solid black;
padding-top: 1rem;
}
.timeline {
padding-left: 20px;
}
.timeline:before {
left: 8px;
}
.timeline-item:before {
left: -20px;
}
} }
/* Адаптация для очень маленьких экранов */
@media (max-width: 480px) { @media (max-width: 480px) {
body { .hero h1 { font-size: 2rem; }
padding: 5px; .hero-subtitle { font-size: 1rem; }
} .section-header h2 { font-size: 1.5rem; }
.section {
padding: 1rem;
}
.hero {
padding: 1.5rem 1rem;
}
.hero-subtitle {
font-size: 1.2rem;
}
.hero-description {
font-size: 1rem;
}
.projects-grid,
.roles-grid,
.entrepreneur-highlights {
grid-template-columns: 1fr;
}
.yalarba-stats {
grid-template-columns: 1fr;
}
.skills-container {
grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
}
}
/* Улучшения для планшетов */
@media (min-width: 769px) and (max-width: 1024px) {
.about {
grid-template-columns: 1fr;
gap: 2rem;
}
.projects-grid {
grid-template-columns: repeat(2, 1fr);
}
.roles-grid {
grid-template-columns: repeat(2, 1fr);
}
.entrepreneur-highlights {
grid-template-columns: repeat(2, 1fr);
}
}
/* Анимации и улучшения UX */
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.section {
animation: fadeIn 0.5s ease-out;
}
.project-card,
.role-card,
.highlight-item {
animation: fadeIn 0.5s ease-out;
}
/* Улучшения доступности */
@media (prefers-reduced-motion: reduce) {
* {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
/* Улучшения фокуса для доступности */
button:focus,
a:focus {
outline: 2px solid var(--secondary);
outline-offset: 2px;
}
/* Улучшения для темной темы */
body.dark-mode .highlight-item,
body.dark-mode .role-card {
background: var(--dark-card);
}
body.dark-mode .project-card:hover,
body.dark-mode .role-card:hover,
body.dark-mode .highlight-item:hover {
transform: translateY(-5px);
box-shadow: 0 8px 15px rgba(0, 0, 0, 0.3);
} }