chore: add docs, mockup, docker config, and source materials
- Презентация портала (md + docx) - HTML-мокап всех страниц - docker-compose.yml + setup-wp.sh - Исходные документы (брендбук, концепция, референсы)
@@ -0,0 +1,5 @@
|
|||||||
|
.DS_Store
|
||||||
|
.claude/
|
||||||
|
wordpress/
|
||||||
|
node_modules/
|
||||||
|
*.log
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
services:
|
||||||
|
db:
|
||||||
|
image: mysql:8.0
|
||||||
|
restart: unless-stopped
|
||||||
|
environment:
|
||||||
|
MYSQL_ROOT_PASSWORD: rootpass
|
||||||
|
MYSQL_DATABASE: bitwms
|
||||||
|
MYSQL_USER: bitwms
|
||||||
|
MYSQL_PASSWORD: bitwms
|
||||||
|
volumes:
|
||||||
|
- db_data:/var/lib/mysql
|
||||||
|
ports:
|
||||||
|
- "3306:3306"
|
||||||
|
|
||||||
|
wordpress:
|
||||||
|
image: wordpress:php8.2-apache
|
||||||
|
restart: unless-stopped
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
ports:
|
||||||
|
- "8080:80"
|
||||||
|
environment:
|
||||||
|
WORDPRESS_DB_HOST: db:3306
|
||||||
|
WORDPRESS_DB_NAME: bitwms
|
||||||
|
WORDPRESS_DB_USER: bitwms
|
||||||
|
WORDPRESS_DB_PASSWORD: bitwms
|
||||||
|
WORDPRESS_LOCALE: ru_RU
|
||||||
|
volumes:
|
||||||
|
- wp_data:/var/www/html
|
||||||
|
- ./wp-content/themes/bitwms-child:/var/www/html/wp-content/themes/bitwms-child
|
||||||
|
|
||||||
|
wpcli:
|
||||||
|
image: wordpress:cli
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
- wordpress
|
||||||
|
environment:
|
||||||
|
WORDPRESS_DB_HOST: db:3306
|
||||||
|
WORDPRESS_DB_NAME: bitwms
|
||||||
|
WORDPRESS_DB_USER: bitwms
|
||||||
|
WORDPRESS_DB_PASSWORD: bitwms
|
||||||
|
volumes:
|
||||||
|
- wp_data:/var/www/html
|
||||||
|
- ./wp-content/themes/bitwms-child:/var/www/html/wp-content/themes/bitwms-child
|
||||||
|
entrypoint: wp
|
||||||
|
command: "--info"
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
db_data:
|
||||||
|
wp_data:
|
||||||
@@ -0,0 +1,323 @@
|
|||||||
|
# Экспертный портал БИТ.WMS
|
||||||
|
|
||||||
|
## Презентация проекта
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. О проекте
|
||||||
|
|
||||||
|
**БИТ.WMS** — экспертный информационный портал по складской логистике и автоматизации склада от компании «Первый Бит».
|
||||||
|
|
||||||
|
Портал сочетает два направления:
|
||||||
|
- **Экспертный контент** — статьи, вебинары, курсы, кейсы и материалы по складской логистике
|
||||||
|
- **Продвижение решений** — продуктовая страница БИТ.WMS с демонстрацией возможностей и формами захвата лидов
|
||||||
|
|
||||||
|
**Позиционирование:** «Мы — эксперты в складской логистике. Знаем всё о складе и автоматизации». Подход pull-продаж: привлечение клиентов через ценный контент, а не прямую рекламу.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Цели и задачи
|
||||||
|
|
||||||
|
### Главная цель
|
||||||
|
Генерация лидов, звонков и подписок по направлению продажи и внедрения WMS-решений.
|
||||||
|
|
||||||
|
### Задачи портала
|
||||||
|
|
||||||
|
| Задача | Как решается |
|
||||||
|
|--------|-------------|
|
||||||
|
| Привлечение целевой аудитории | SEO-оптимизированный экспертный контент (статьи, вебинары, материалы) |
|
||||||
|
| Демонстрация экспертности | Кейсы внедрения, записи вебинаров, обучающие курсы |
|
||||||
|
| Захват контактов | Формы обратной связи, подписка на рассылку, gated-контент (скачивание за email) |
|
||||||
|
| Продажа продукта БИТ.WMS | Продуктовая страница с функциями, преимуществами и формой демо |
|
||||||
|
| Вовлечение и удержание | Онлайн-консультант (JivoSite), callback-виджет, попапы, email-рассылка |
|
||||||
|
| Аналитика эффективности | Яндекс.Метрика, Google Analytics, CallTouch — отслеживание всех точек контакта |
|
||||||
|
|
||||||
|
### KPI сайта
|
||||||
|
|
||||||
|
- Количество лидов через web-формы
|
||||||
|
- Количество подписок на рассылку
|
||||||
|
- Количество звонков с сайта (CallTouch)
|
||||||
|
- Обращения через callback-виджет
|
||||||
|
- Диалоги в онлайн-консультанте
|
||||||
|
- Конверсия трафика в лиды
|
||||||
|
- Стоимость лида
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Целевая аудитория
|
||||||
|
|
||||||
|
| Сегмент | Потребность |
|
||||||
|
|---------|-------------|
|
||||||
|
| Руководители складов | Оптимизация процессов, снижение ошибок, ускорение работы |
|
||||||
|
| IT-директора и сотрудники IT-отделов | Выбор и внедрение WMS-системы, интеграция с существующими решениями |
|
||||||
|
| Директора предприятий | ROI от автоматизации, стратегические решения |
|
||||||
|
| Предприниматели (МСБ) | Масштабирование бизнеса, автоматизация складского учёта |
|
||||||
|
| Финансовые менеджеры | Расчёт окупаемости, оптимизация затрат |
|
||||||
|
|
||||||
|
### Ценностное предложение
|
||||||
|
- **Экспертность** — глубокое знание отрасли, проверенные решения
|
||||||
|
- **Комплексность** — единое окно для всех задач складской логистики
|
||||||
|
- **Прозрачность** — открытый опыт, кейсы, ценовая политика
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Структура сайта
|
||||||
|
|
||||||
|
```
|
||||||
|
Главная страница
|
||||||
|
│
|
||||||
|
├── БИТ.WMS (продуктовая страница)
|
||||||
|
│ ├── Функции системы
|
||||||
|
│ ├── Заказать демо (форма)
|
||||||
|
│ └── Анкета для детального запроса
|
||||||
|
│
|
||||||
|
├── Кейсы
|
||||||
|
│ ├── Архив кейсов (карточки с фильтрацией)
|
||||||
|
│ └── Детальная страница кейса
|
||||||
|
│
|
||||||
|
├── Статьи
|
||||||
|
│ ├── Архив статей
|
||||||
|
│ └── Детальная страница статьи
|
||||||
|
│
|
||||||
|
├── Вебинары
|
||||||
|
│ ├── Архив вебинаров
|
||||||
|
│ └── Детальная страница (анонс / запись)
|
||||||
|
│
|
||||||
|
├── Курсы
|
||||||
|
│ ├── Архив курсов
|
||||||
|
│ └── Детальная страница курса
|
||||||
|
│
|
||||||
|
├── Мероприятия
|
||||||
|
│ ├── Архив мероприятий
|
||||||
|
│ └── Детальная страница мероприятия
|
||||||
|
│
|
||||||
|
├── Материалы (скачиваемые)
|
||||||
|
│ └── Архив материалов (PDF, видео, чек-листы)
|
||||||
|
│
|
||||||
|
├── Новости
|
||||||
|
│ ├── Архив новостей
|
||||||
|
│ └── Детальная страница новости
|
||||||
|
│
|
||||||
|
└── Контакты
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Состав блоков по страницам
|
||||||
|
|
||||||
|
### 5.1. Главная страница
|
||||||
|
|
||||||
|
| Блок | Назначение |
|
||||||
|
|------|-----------|
|
||||||
|
| **Герой** | Крупный заголовок с экспертным посылом, подзаголовок, две CTA-кнопки («Заказать демо» и «Смотреть кейсы»), KPI-цифры (200+ проектов, 15+ лет, 50+ экспертов) |
|
||||||
|
| **Фильтр по рубрикам** | Горизонтальная полоса тегов: Все, Статьи, Кейсы, Вебинары, Курсы, Мероприятия, Материалы. Фильтрация без перезагрузки страницы (AJAX) |
|
||||||
|
| **Лента контента** | Карточки контента в сетке 3 колонки. Каждая карточка: изображение, бейдж типа, заголовок, описание, дата. Кнопка «Показать ещё» |
|
||||||
|
| **Промо БИТ.WMS** | Краткий блок продукта на сером фоне: 4 преимущества (быстро, собственная разработка, проверено, прозрачно) + CTA-кнопки |
|
||||||
|
| **Подписка на рассылку** | Поле email + кнопка «Подписаться». Интеграция с Unisender |
|
||||||
|
| **Наши клиенты** | Логотипы компаний-клиентов в горизонтальной строке |
|
||||||
|
|
||||||
|
### 5.2. Страница продукта БИТ.WMS
|
||||||
|
|
||||||
|
| Блок | Назначение |
|
||||||
|
|------|-----------|
|
||||||
|
| **Герой продукта** | H1 «БИТ.WMS», подзаголовок, описание, CTA: «Заказать демо» + «Скачать презентацию» (за email) |
|
||||||
|
| **Функции** | Сетка из 6 карточек: Приёмка, Размещение, Хранение, Отбор, Отгрузка, Инвентаризация. Каждая: описание + результат внедрения |
|
||||||
|
| **Почему Первый Бит** | 4 блока: Быстро, Просто, Качественно, Открыто — с пояснениями |
|
||||||
|
| **Кейсы внедрения** | 3 последних кейса + ссылка «Все кейсы» |
|
||||||
|
| **Другие решения** | Карточки: 1C:WMS, Клеверенс, 1C:TMS — «Возможно, вам будет интересно» |
|
||||||
|
| **Форма «Заказать демо»** | Поля: имя, компания, телефон, email, комментарий. Согласие на обработку данных |
|
||||||
|
| **Ссылка на анкету** | Детальная анкета для расчёта: отрасль, размер склада, количество SKU, задачи |
|
||||||
|
|
||||||
|
### 5.3. Архивные страницы (Кейсы, Статьи, Вебинары, Курсы, Мероприятия, Материалы)
|
||||||
|
|
||||||
|
| Блок | Назначение |
|
||||||
|
|------|-----------|
|
||||||
|
| **Заголовок раздела** | H1 с названием раздела |
|
||||||
|
| **Фильтры** | По рубрикам/тегам, по дате |
|
||||||
|
| **Сетка карточек** | 3 колонки. Карточка: изображение, бейдж типа, заголовок, описание, дата |
|
||||||
|
| **Пагинация** | Переход между страницами |
|
||||||
|
|
||||||
|
### 5.4. Детальная страница кейса
|
||||||
|
|
||||||
|
| Блок | Назначение |
|
||||||
|
|------|-----------|
|
||||||
|
| **Заголовок + мета** | Название проекта, клиент, отрасль |
|
||||||
|
| **Задача** | Описание задачи клиента |
|
||||||
|
| **Решение** | Что было внедрено |
|
||||||
|
| **Результат** | Измеримые результаты |
|
||||||
|
| **Галерея** | Скриншоты, фото склада |
|
||||||
|
| **Цитата клиента** | Отзыв (если есть) |
|
||||||
|
| **CTA** | «Хотите такой же результат? Закажите консультацию» |
|
||||||
|
| **Похожие кейсы** | 3 карточки других кейсов |
|
||||||
|
|
||||||
|
### 5.5. Детальная страница вебинара
|
||||||
|
|
||||||
|
| Блок | Назначение |
|
||||||
|
|------|-----------|
|
||||||
|
| **Анонс** (предстоящий) | Дата, спикер, программа, кнопка «Зарегистрироваться» |
|
||||||
|
| **Запись** (прошедший) | Видеозапись (embed), презентация для скачивания (gated) |
|
||||||
|
| **Похожие вебинары** | 3 карточки |
|
||||||
|
|
||||||
|
### 5.6. Детальная страница курса
|
||||||
|
|
||||||
|
| Блок | Назначение |
|
||||||
|
|------|-----------|
|
||||||
|
| **Описание курса** | Программа, длительность, формат, стоимость |
|
||||||
|
| **CTA** | Кнопка «Записаться на курс» |
|
||||||
|
| **Похожие курсы** | 3 карточки |
|
||||||
|
|
||||||
|
### 5.7. Детальная страница статьи / новости
|
||||||
|
|
||||||
|
| Блок | Назначение |
|
||||||
|
|------|-----------|
|
||||||
|
| **Заголовок + мета** | Название, дата, автор |
|
||||||
|
| **Основной текст** | Контент статьи |
|
||||||
|
| **Боковая колонка** | Связанные материалы + форма подписки |
|
||||||
|
| **Шеринг** | VK, Telegram, копировать ссылку |
|
||||||
|
| **Читайте также** | 3 карточки похожих статей |
|
||||||
|
|
||||||
|
### 5.8. Страница контактов
|
||||||
|
|
||||||
|
| Блок | Назначение |
|
||||||
|
|------|-----------|
|
||||||
|
| **Контактная информация** | Екатеринбург ПЦ: адрес, телефон, email |
|
||||||
|
| **Форма обратной связи** | Имя, email, сообщение, согласие |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. Навигация
|
||||||
|
|
||||||
|
### Фиксированная боковая панель (левая)
|
||||||
|
|
||||||
|
Всегда видна на экране. В свёрнутом виде — иконки (70px), при наведении раскрывается с подписями (250px).
|
||||||
|
|
||||||
|
| Пункт | Иконка |
|
||||||
|
|-------|--------|
|
||||||
|
| БИТ.WMS | Склад |
|
||||||
|
| Кейсы | Папка |
|
||||||
|
| Статьи | Документ |
|
||||||
|
| Вебинары | Камера |
|
||||||
|
| Курсы | Шапочка |
|
||||||
|
| Мероприятия | Календарь |
|
||||||
|
| Материалы | Скачивание |
|
||||||
|
| Новости | Колокольчик |
|
||||||
|
| Контакты | Телефон |
|
||||||
|
|
||||||
|
Внизу панели: ссылки на Telegram и VK.
|
||||||
|
|
||||||
|
На мобильных устройствах панель скрывается и вызывается через гамбургер-меню.
|
||||||
|
|
||||||
|
### Верхний хедер
|
||||||
|
|
||||||
|
Тонкая полоса (60px) над контентом:
|
||||||
|
- Слева: логотип «первыйБит» + слоган «Экспертный портал по складской логистике»
|
||||||
|
- Справа: телефон + кнопка «Заказать демо» + поиск
|
||||||
|
|
||||||
|
### Футер
|
||||||
|
|
||||||
|
4 колонки:
|
||||||
|
- Логотип + контакты Екатеринбург ПЦ
|
||||||
|
- Ссылки на разделы сайта
|
||||||
|
- Ссылки на продукты
|
||||||
|
- Форма подписки на рассылку
|
||||||
|
- Юридические ссылки (политика конфиденциальности, согласие на обработку данных)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Лидогенерация
|
||||||
|
|
||||||
|
### Точки захвата лидов
|
||||||
|
|
||||||
|
| Инструмент | Описание | Расположение |
|
||||||
|
|-----------|----------|-------------|
|
||||||
|
| **Форма «Заказать демо»** | Имя, компания, телефон, email | Страница БИТ.WMS, модальное окно из хедера |
|
||||||
|
| **Форма «Консультация»** | Имя, телефон, email, вопрос | Контакты, детальные страницы кейсов |
|
||||||
|
| **Форма «Регистрация»** | Имя, email, телефон | Вебинары, курсы, мероприятия |
|
||||||
|
| **Gated-контент** | Имя, email → скачивание файла | Материалы (PDF, чек-листы, видео) |
|
||||||
|
| **Подписка на рассылку** | Email | Главная, боковая колонка статей, футер |
|
||||||
|
| **Онлайн-консультант** | JivoSite — чат | Все страницы (автоприглашение через 30 сек) |
|
||||||
|
| **Callback-виджет** | «Перезвоните мне» | Все страницы |
|
||||||
|
| **Попап exit-intent** | Подписка / скачивание чек-листа | Все страницы (при уходе) |
|
||||||
|
| **Попап по таймеру** | Предложение демо | Страница БИТ.WMS (через 60 сек) |
|
||||||
|
|
||||||
|
### Воронка
|
||||||
|
|
||||||
|
```
|
||||||
|
Посетитель
|
||||||
|
│
|
||||||
|
├── Читает статью / смотрит вебинар
|
||||||
|
│ │
|
||||||
|
│ ├── Подписывается на рассылку
|
||||||
|
│ ├── Скачивает материал (gated → email)
|
||||||
|
│ └── Переходит на страницу БИТ.WMS
|
||||||
|
│ │
|
||||||
|
│ ├── Заказывает демо (форма)
|
||||||
|
│ ├── Звонит (CallTouch)
|
||||||
|
│ ├── Пишет в чат (JivoSite)
|
||||||
|
│ └── Заказывает обратный звонок (callback)
|
||||||
|
│
|
||||||
|
└── ЛИД → Екатеринбург ПЦ → Распределение по ЦК WMS
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. Продукты на портале
|
||||||
|
|
||||||
|
| Продукт | Роль | Представление |
|
||||||
|
|---------|------|--------------|
|
||||||
|
| **БИТ.WMS** | Основной | Полноценная продуктовая страница с демо-формой |
|
||||||
|
| 1C:WMS Логистика | Вторичный | Краткая карточка в блоке «Возможно, вам будет интересно» |
|
||||||
|
| Клеверенс | Вторичный | Краткая карточка |
|
||||||
|
| 1C:TMS | Вторичный | Краткая карточка |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. Визуальный стиль
|
||||||
|
|
||||||
|
Строго по брендбуку «Первый Бит»:
|
||||||
|
|
||||||
|
| Элемент | Значение |
|
||||||
|
|---------|----------|
|
||||||
|
| Основной фон | Белый (#FFFFFF), много воздуха |
|
||||||
|
| Корпоративный цвет | Розовый/маджента (#E50071) — кнопки, акценты |
|
||||||
|
| Текст и заголовки | Чёрный (#000000) |
|
||||||
|
| Дополнительный фон | Светло-серый (#EBEBEB) |
|
||||||
|
| Шрифт заголовков | Suisse Int'l Bold |
|
||||||
|
| Шрифт текста | Suisse Int'l Book |
|
||||||
|
| Принципы | Минимализм. Без градиентов, теней, диагоналей, стоковых фото |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. Технологии
|
||||||
|
|
||||||
|
| Компонент | Решение |
|
||||||
|
|-----------|---------|
|
||||||
|
| CMS | WordPress 6.x |
|
||||||
|
| Тема | GeneratePress Premium + дочерняя тема |
|
||||||
|
| Блоки | GenerateBlocks Pro |
|
||||||
|
| Кастомные поля | ACF Pro |
|
||||||
|
| Формы | Contact Form 7 |
|
||||||
|
| SEO | Yoast SEO |
|
||||||
|
| Рассылка | Unisender |
|
||||||
|
| Чат | JivoSite |
|
||||||
|
| Попапы | Popup Maker |
|
||||||
|
| Аналитика | Яндекс.Метрика, Google Analytics 4, CallTouch |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 11. Каналы продвижения
|
||||||
|
|
||||||
|
- Медийная реклама
|
||||||
|
- Реклама в социальных сетях
|
||||||
|
- Email-рассылки (Unisender)
|
||||||
|
- SEO-продвижение
|
||||||
|
- Контентный маркетинг (статьи, вебинары, материалы)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 12. Контакты и распределение лидов
|
||||||
|
|
||||||
|
- **Основной контакт:** Екатеринбург Проектный центр
|
||||||
|
- **Распределение:** Екатеринбург ПЦ распределяет лиды по территориально ближайшим Центрам компетенций WMS
|
||||||
|
- **Email:** wms@1bit.ru
|
||||||
|
- **Телефон:** +7 (343) 200-00-00
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
# START YOAST BLOCK
|
||||||
|
# ---------------------------
|
||||||
|
User-agent: *
|
||||||
|
Disallow:
|
||||||
|
|
||||||
|
Sitemap: http://localhost:8080/sitemap_index.xml
|
||||||
|
# ---------------------------
|
||||||
|
# END YOAST BLOCK
|
||||||
@@ -0,0 +1,176 @@
|
|||||||
|
.wpcf7 .screen-reader-response {
|
||||||
|
position: absolute;
|
||||||
|
overflow: hidden;
|
||||||
|
clip: rect(1px, 1px, 1px, 1px);
|
||||||
|
clip-path: inset(50%);
|
||||||
|
height: 1px;
|
||||||
|
width: 1px;
|
||||||
|
margin: -1px;
|
||||||
|
padding: 0;
|
||||||
|
border: 0;
|
||||||
|
word-wrap: normal !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7 .hidden-fields-container {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7 form .wpcf7-response-output {
|
||||||
|
margin: 2em 0.5em 1em;
|
||||||
|
padding: 0.2em 1em;
|
||||||
|
border: 2px solid #00a0d2; /* Blue */
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7 form.init .wpcf7-response-output,
|
||||||
|
.wpcf7 form.resetting .wpcf7-response-output,
|
||||||
|
.wpcf7 form.submitting .wpcf7-response-output {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7 form.sent .wpcf7-response-output {
|
||||||
|
border-color: #46b450; /* Green */
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7 form.failed .wpcf7-response-output,
|
||||||
|
.wpcf7 form.aborted .wpcf7-response-output {
|
||||||
|
border-color: #dc3232; /* Red */
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7 form.spam .wpcf7-response-output {
|
||||||
|
border-color: #f56e28; /* Orange */
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7 form.invalid .wpcf7-response-output,
|
||||||
|
.wpcf7 form.unaccepted .wpcf7-response-output,
|
||||||
|
.wpcf7 form.payment-required .wpcf7-response-output {
|
||||||
|
border-color: #ffb900; /* Yellow */
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7-form-control-wrap {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7-not-valid-tip {
|
||||||
|
color: #dc3232; /* Red */
|
||||||
|
font-size: 1em;
|
||||||
|
font-weight: normal;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.use-floating-validation-tip .wpcf7-not-valid-tip {
|
||||||
|
position: relative;
|
||||||
|
top: -2ex;
|
||||||
|
left: 1em;
|
||||||
|
z-index: 100;
|
||||||
|
border: 1px solid #dc3232;
|
||||||
|
background: #fff;
|
||||||
|
padding: .2em .8em;
|
||||||
|
width: 24em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7-list-item {
|
||||||
|
display: inline-block;
|
||||||
|
margin: 0 0 0 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7-list-item-label::before,
|
||||||
|
.wpcf7-list-item-label::after {
|
||||||
|
content: " ";
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7-spinner {
|
||||||
|
visibility: hidden;
|
||||||
|
display: inline-block;
|
||||||
|
background-color: #23282d; /* Dark Gray 800 */
|
||||||
|
opacity: 0.75;
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
border: none;
|
||||||
|
border-radius: 100%;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0 24px;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
form.submitting .wpcf7-spinner {
|
||||||
|
visibility: visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7-spinner::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
background-color: #fbfbfc; /* Light Gray 100 */
|
||||||
|
top: 4px;
|
||||||
|
left: 4px;
|
||||||
|
width: 6px;
|
||||||
|
height: 6px;
|
||||||
|
border: none;
|
||||||
|
border-radius: 100%;
|
||||||
|
transform-origin: 8px 8px;
|
||||||
|
animation-name: spin;
|
||||||
|
animation-duration: 1000ms;
|
||||||
|
animation-timing-function: linear;
|
||||||
|
animation-iteration-count: infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-reduced-motion: reduce) {
|
||||||
|
.wpcf7-spinner::before {
|
||||||
|
animation-name: blink;
|
||||||
|
animation-duration: 2000ms;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes spin {
|
||||||
|
from {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
to {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes blink {
|
||||||
|
from {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
50% {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
to {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7 [inert] {
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7 input[type="file"] {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7 input[type="file"]:disabled {
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7 .wpcf7-submit:disabled {
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7 input[type="url"],
|
||||||
|
.wpcf7 input[type="email"],
|
||||||
|
.wpcf7 input[type="tel"] {
|
||||||
|
direction: ltr;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7-reflection > output {
|
||||||
|
display: list-item;
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wpcf7-reflection > output[hidden] {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"/>
|
||||||
|
<path d="M13.73 21a2 2 0 0 1-3.46 0"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 290 B |
@@ -0,0 +1,6 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<rect x="3" y="4" width="18" height="18" rx="2" ry="2"/>
|
||||||
|
<line x1="16" y1="2" x2="16" y2="6"/>
|
||||||
|
<line x1="8" y1="2" x2="8" y2="6"/>
|
||||||
|
<line x1="3" y1="10" x2="21" y2="10"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 369 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<polygon points="23 7 16 12 23 17 23 7"/>
|
||||||
|
<rect x="1" y="5" width="15" height="14" rx="2" ry="2"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 294 B |
@@ -0,0 +1,7 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"/>
|
||||||
|
<polyline points="14 2 14 8 20 8"/>
|
||||||
|
<line x1="16" y1="13" x2="8" y2="13"/>
|
||||||
|
<line x1="16" y1="17" x2="8" y2="17"/>
|
||||||
|
<polyline points="10 9 9 9 8 9"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 420 B |
@@ -0,0 +1,5 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"/>
|
||||||
|
<polyline points="7 10 12 15 17 10"/>
|
||||||
|
<line x1="12" y1="15" x2="12" y2="3"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 328 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M22 19a2 2 0 0 1-2 2H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h5l2 3h9a2 2 0 0 1 2 2z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 281 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M22 10v6M2 10l10-5 10 5-10 5z"/>
|
||||||
|
<path d="M6 12v5c0 2 4 3 6 3s6-1 6-3v-5"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 280 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07A19.5 19.5 0 0 1 4.69 12 19.79 19.79 0 0 1 1.58 3.43 2 2 0 0 1 3.55 1.25h3a2 2 0 0 1 2 1.72c.127.96.361 1.903.7 2.81a2 2 0 0 1-.45 2.11L7.91 8.78a16 16 0 0 0 6 6l.91-.91a2 2 0 0 1 2.11-.45c.907.339 1.85.573 2.81.7A2 2 0 0 1 21.73 16z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 495 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<line x1="22" y1="2" x2="11" y2="13"/>
|
||||||
|
<polygon points="22 2 15 22 11 13 2 9 22 2"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 280 B |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="currentColor" stroke="none">
|
||||||
|
<path d="M21.579 6.855c.14-.465 0-.806-.662-.806h-2.193c-.558 0-.813.295-.953.62 0 0-1.115 2.719-2.695 4.482-.512.512-.743.675-1.022.675-.14 0-.341-.163-.341-.628V6.855c0-.558-.162-.806-.626-.806H9.642c-.348 0-.557.258-.557.504 0 .528.79.65.871 2.138v3.228c0 .707-.128.836-.407.836-.743 0-2.551-2.729-3.624-5.853-.209-.607-.42-.852-.98-.852H2.752c-.627 0-.752.295-.752.62 0 .582.743 3.462 3.461 7.271 1.812 2.601 4.363 4.012 6.687 4.012 1.393 0 1.565-.313 1.565-.852v-1.966c0-.626.133-.751.574-.751.325 0 .883.163 2.183 1.417 1.487 1.487 1.731 2.152 2.567 2.152h2.192c.626 0 .939-.313.759-.931-.198-.616-.907-1.51-1.849-2.569-.512-.604-1.277-1.254-1.51-1.579-.325-.418-.232-.604 0-.976.001 0 2.672-3.761 2.95-5.042z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 846 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M3 9l9-7 9 7v11a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1z"/>
|
||||||
|
<polyline points="9 22 9 12 15 12 15 22"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 297 B |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 32 32">
|
||||||
|
<rect width="32" height="32" fill="#E50071"/>
|
||||||
|
<text x="50%" y="50%" dominant-baseline="central" text-anchor="middle" font-family="Arial, sans-serif" font-weight="700" font-size="20" fill="#FFFFFF">Б</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 302 B |
@@ -0,0 +1,8 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 160 30" height="30" role="img" aria-label="первыйБит">
|
||||||
|
<title>первыйБит</title>
|
||||||
|
<!-- Pink accent square -->
|
||||||
|
<rect x="0" y="5" width="20" height="20" fill="#E50071"/>
|
||||||
|
<!-- Wordmark text -->
|
||||||
|
<text x="28" y="22" font-family="Arial, sans-serif" font-size="16" font-weight="700" fill="#000000" letter-spacing="-0.3">первый</text>
|
||||||
|
<text x="100" y="22" font-family="Arial, sans-serif" font-size="16" font-weight="700" fill="#E50071" letter-spacing="-0.3">Бит</text>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 558 B |
@@ -0,0 +1,123 @@
|
|||||||
|
/**
|
||||||
|
* БИТ.WMS Child Theme — js/ajax-filter.js
|
||||||
|
*
|
||||||
|
* Handles filter button clicks and "Load more" for the content feed section.
|
||||||
|
* Communicates with the WordPress AJAX handler (bitwms_ajax_filter_handler).
|
||||||
|
*
|
||||||
|
* Global: bitwmsAjax { url: string, nonce: string }
|
||||||
|
*/
|
||||||
|
|
||||||
|
( function () {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
document.addEventListener( 'DOMContentLoaded', function () {
|
||||||
|
var filterBar = document.querySelector( '.filter-bar' );
|
||||||
|
var contentGrid = document.getElementById( 'content-grid' );
|
||||||
|
var loadMoreBtn = document.getElementById( 'load-more-btn' );
|
||||||
|
|
||||||
|
if ( ! filterBar || ! contentGrid ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var currentFilter = 'all';
|
||||||
|
var currentPage = 1;
|
||||||
|
var isLoading = false;
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
// Filter button click
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
filterBar.addEventListener( 'click', function ( e ) {
|
||||||
|
var btn = e.target.closest( '.filter-bar__btn' );
|
||||||
|
if ( ! btn ) return;
|
||||||
|
|
||||||
|
var filter = btn.getAttribute( 'data-filter' );
|
||||||
|
if ( filter === currentFilter ) return;
|
||||||
|
|
||||||
|
// Update active state.
|
||||||
|
filterBar.querySelectorAll( '.filter-bar__btn' ).forEach( function ( b ) {
|
||||||
|
b.classList.remove( 'filter-bar__btn--active' );
|
||||||
|
b.setAttribute( 'aria-selected', 'false' );
|
||||||
|
} );
|
||||||
|
btn.classList.add( 'filter-bar__btn--active' );
|
||||||
|
btn.setAttribute( 'aria-selected', 'true' );
|
||||||
|
|
||||||
|
currentFilter = filter;
|
||||||
|
currentPage = 1;
|
||||||
|
|
||||||
|
loadContent( false );
|
||||||
|
} );
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
// Load more button click
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
if ( loadMoreBtn ) {
|
||||||
|
loadMoreBtn.addEventListener( 'click', function () {
|
||||||
|
if ( isLoading ) return;
|
||||||
|
currentPage += 1;
|
||||||
|
loadContent( true );
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
// loadContent( append )
|
||||||
|
// append === false: replace grid content
|
||||||
|
// append === true: append to existing grid content
|
||||||
|
// ---------------------------------------------------------------
|
||||||
|
function loadContent( append ) {
|
||||||
|
if ( isLoading ) return;
|
||||||
|
isLoading = true;
|
||||||
|
|
||||||
|
if ( loadMoreBtn ) {
|
||||||
|
loadMoreBtn.disabled = true;
|
||||||
|
loadMoreBtn.textContent = loadMoreBtn.getAttribute( 'data-loading' ) || 'Загрузка…';
|
||||||
|
}
|
||||||
|
|
||||||
|
var formData = new FormData();
|
||||||
|
formData.append( 'action', 'bitwms_filter' );
|
||||||
|
formData.append( 'nonce', bitwmsAjax.nonce );
|
||||||
|
formData.append( 'post_type', currentFilter );
|
||||||
|
formData.append( 'page', currentPage );
|
||||||
|
|
||||||
|
fetch( bitwmsAjax.url, {
|
||||||
|
method: 'POST',
|
||||||
|
body: formData,
|
||||||
|
} )
|
||||||
|
.then( function ( response ) {
|
||||||
|
return response.json();
|
||||||
|
} )
|
||||||
|
.then( function ( data ) {
|
||||||
|
if ( ! data.success ) return;
|
||||||
|
|
||||||
|
var html = data.data.html;
|
||||||
|
var hasMore = data.data.has_more;
|
||||||
|
|
||||||
|
if ( append ) {
|
||||||
|
contentGrid.insertAdjacentHTML( 'beforeend', html );
|
||||||
|
} else {
|
||||||
|
contentGrid.innerHTML = html || '<p>Материалы не найдены.</p>';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show/hide load-more button.
|
||||||
|
if ( loadMoreBtn ) {
|
||||||
|
if ( hasMore ) {
|
||||||
|
loadMoreBtn.style.display = '';
|
||||||
|
loadMoreBtn.disabled = false;
|
||||||
|
loadMoreBtn.textContent = 'Загрузить ещё';
|
||||||
|
} else {
|
||||||
|
loadMoreBtn.style.display = 'none';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} )
|
||||||
|
.catch( function ( err ) {
|
||||||
|
console.error( 'bitwms filter error:', err );
|
||||||
|
if ( loadMoreBtn ) {
|
||||||
|
loadMoreBtn.disabled = false;
|
||||||
|
loadMoreBtn.textContent = 'Загрузить ещё';
|
||||||
|
}
|
||||||
|
} )
|
||||||
|
.finally( function () {
|
||||||
|
isLoading = false;
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
} )();
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
document.addEventListener('DOMContentLoaded', function () {
|
||||||
|
var modal = document.getElementById('gated-modal');
|
||||||
|
if (!modal) return;
|
||||||
|
|
||||||
|
var overlay = modal.querySelector('.gated-modal__overlay');
|
||||||
|
var closeBtn = modal.querySelector('.gated-modal__close');
|
||||||
|
|
||||||
|
// Open modal on [data-gated] click
|
||||||
|
document.addEventListener('click', function (e) {
|
||||||
|
var trigger = e.target.closest('[data-gated]');
|
||||||
|
if (!trigger) return;
|
||||||
|
e.preventDefault();
|
||||||
|
var materialId = trigger.dataset.gated;
|
||||||
|
var downloadUrl = trigger.dataset.downloadUrl;
|
||||||
|
// Set hidden field + store download URL
|
||||||
|
var hiddenField = modal.querySelector('input[name="material-id"]');
|
||||||
|
if (hiddenField) hiddenField.value = materialId;
|
||||||
|
modal.dataset.downloadUrl = downloadUrl || '';
|
||||||
|
modal.classList.add('gated-modal--open');
|
||||||
|
document.body.style.overflow = 'hidden';
|
||||||
|
});
|
||||||
|
|
||||||
|
function closeModal() {
|
||||||
|
modal.classList.remove('gated-modal--open');
|
||||||
|
document.body.style.overflow = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (closeBtn) closeBtn.addEventListener('click', closeModal);
|
||||||
|
if (overlay) overlay.addEventListener('click', closeModal);
|
||||||
|
|
||||||
|
// After CF7 successful submit — trigger download
|
||||||
|
document.addEventListener('wpcf7mailsent', function () {
|
||||||
|
if (modal.classList.contains('gated-modal--open') && modal.dataset.downloadUrl) {
|
||||||
|
window.open(modal.dataset.downloadUrl, '_blank');
|
||||||
|
closeModal();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
/**
|
||||||
|
* БИТ.WMS Child Theme — js/sidebar-nav.js
|
||||||
|
*
|
||||||
|
* Sidebar navigation toggle behaviour.
|
||||||
|
* Placeholder for Task 3 — full sidebar implementation will extend this file.
|
||||||
|
*
|
||||||
|
* Behaviour:
|
||||||
|
* - Clicking the hamburger button toggles `.sidebar-nav--open` on the sidebar.
|
||||||
|
* - Simultaneously toggles `.sidebar-overlay` on <body> to show the dim overlay.
|
||||||
|
* - Clicking the overlay closes the sidebar.
|
||||||
|
*/
|
||||||
|
|
||||||
|
document.addEventListener( 'DOMContentLoaded', function () {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// Guard: abort if there is no sidebar on this page.
|
||||||
|
var sidebar = document.querySelector( '.sidebar-nav' );
|
||||||
|
if ( ! sidebar ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var hamburger = document.querySelector( '.sidebar-nav__toggle' );
|
||||||
|
var body = document.body;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Open the sidebar and show the overlay.
|
||||||
|
*/
|
||||||
|
function openSidebar() {
|
||||||
|
sidebar.classList.add( 'sidebar-nav--open' );
|
||||||
|
body.classList.add( 'sidebar-overlay' );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close the sidebar and hide the overlay.
|
||||||
|
*/
|
||||||
|
function closeSidebar() {
|
||||||
|
sidebar.classList.remove( 'sidebar-nav--open' );
|
||||||
|
body.classList.remove( 'sidebar-overlay' );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Toggle sidebar state.
|
||||||
|
*/
|
||||||
|
function toggleSidebar() {
|
||||||
|
if ( sidebar.classList.contains( 'sidebar-nav--open' ) ) {
|
||||||
|
closeSidebar();
|
||||||
|
} else {
|
||||||
|
openSidebar();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Attach toggle to hamburger button (if present).
|
||||||
|
if ( hamburger ) {
|
||||||
|
hamburger.addEventListener( 'click', function ( e ) {
|
||||||
|
e.preventDefault();
|
||||||
|
toggleSidebar();
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Close sidebar when the overlay (body::after pseudo-element area) is clicked.
|
||||||
|
// We detect clicks on <body> that land outside the sidebar itself.
|
||||||
|
body.addEventListener( 'click', function ( e ) {
|
||||||
|
if (
|
||||||
|
body.classList.contains( 'sidebar-overlay' ) &&
|
||||||
|
! sidebar.contains( e.target ) &&
|
||||||
|
( ! hamburger || ! hamburger.contains( e.target ) )
|
||||||
|
) {
|
||||||
|
closeSidebar();
|
||||||
|
}
|
||||||
|
} );
|
||||||
|
} );
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
.comment-content a{word-wrap:break-word}.bypostauthor{display:block}.comment,.comment-list{list-style-type:none;padding:0;margin:0}.comment-author-info{display:inline-block;vertical-align:middle}.comment-meta .avatar{float:left;margin-right:10px;border-radius:50%}.comment-author cite{font-style:normal;font-weight:700}.entry-meta.comment-metadata{margin-top:0}.comment-content{margin-top:1.5em}.comment-respond{margin-top:0}.comment-form>.form-submit{margin-bottom:0}.comment-form input,.comment-form-comment{margin-bottom:10px}.comment-form-comment textarea{resize:vertical}.comment-form #author,.comment-form #email,.comment-form #url{display:block}.comment-metadata .edit-link:before{display:none}.comment-body{padding:30px 0}.comment-content{padding:30px;border:1px solid rgba(0,0,0,.05)}.depth-1.parent>.children{border-bottom:1px solid rgba(0,0,0,.05)}.comment .children{padding-left:30px;margin-top:-30px;border-left:1px solid rgba(0,0,0,.05)}.pingback .comment-body,.trackback .comment-body{border-bottom:1px solid rgba(0,0,0,.05)}.pingback .edit-link{font-size:13px}.comment-content p:last-child{margin-bottom:0}.comment-list>.comment:first-child{padding-top:0;margin-top:0;border-top:0}ol.comment-list{margin-bottom:1.5em}.comment-form-cookies-consent{display:flex;align-items:center}.comment-form-cookies-consent input{margin-right:.5em;margin-bottom:0}.one-container .comments-area{margin-top:1.5em}.comment-content .reply{font-size:85%}#cancel-comment-reply-link{padding-left:10px}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
Theme Name: GeneratePress
|
||||||
|
Theme URI: https://generatepress.com
|
||||||
|
Author: Tom Usborne
|
||||||
|
Author URI: https://generatepress.com/about
|
||||||
|
Description: GeneratePress is a lightweight WordPress theme built with a focus on speed and usability. Performance is important to us, which is why a fresh GeneratePress install adds less than 10kb (gzipped) to your page size. We take full advantage of the block editor (Gutenberg), which gives you more control over creating your content. If you use page builders, GeneratePress is the right theme for you. It is completely compatible with all major page builders, including Beaver Builder and Elementor. Thanks to our emphasis on WordPress coding standards, we can boast full compatibility with all well-coded plugins, including WooCommerce. GeneratePress is fully responsive, uses valid HTML/CSS, and is translated into over 25 languages by our amazing community of users. A few of our many features include 60+ color controls, powerful dynamic typography, 5 navigation locations, 5 sidebar layouts, dropdown menus (click or hover), and 9 widget areas. Learn more and check out our powerful premium version at https://generatepress.com
|
||||||
|
Version: 3.6.1
|
||||||
|
Requires at least: 6.5
|
||||||
|
Tested up to: 6.9
|
||||||
|
Requires PHP: 7.4
|
||||||
|
License: GNU General Public License v2 or later
|
||||||
|
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
||||||
|
Text Domain: generatepress
|
||||||
|
Tags: two-columns, three-columns, one-column, right-sidebar, left-sidebar, footer-widgets, blog, e-commerce, flexible-header, full-width-template, buddypress, custom-header, custom-background, custom-menu, custom-colors, sticky-post, threaded-comments, translation-ready, rtl-language-support, featured-images, theme-options
|
||||||
|
|
||||||
|
GeneratePress, Copyright 2014-2025 EDGE22 Studios LTD.
|
||||||
|
GeneratePress is distributed under the terms of the GNU GPL
|
||||||
|
|
||||||
|
GeneratePress is based on Underscores http://underscores.me/, (C) 2012-2025 Automattic, Inc.
|
||||||
|
|
||||||
|
Actual CSS can be found in /assets/css/ folder.
|
||||||
|
*/
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
.is-small-text{font-size:.875em}.is-regular-text{font-size:1em}.is-large-text{font-size:2.25em}.is-larger-text{font-size:3em}.has-drop-cap:not(:focus):first-letter{float:left;font-size:8.4em;font-style:normal;font-weight:100;line-height:.68;margin:.05em .1em 0 0;text-transform:uppercase}body.rtl .has-drop-cap:not(:focus):first-letter{float:none;margin-left:.1em}p.has-drop-cap.has-background{overflow:hidden}:root :where(p.has-background){padding:1.25em 2.375em}:where(p.has-text-color:not(.has-link-color)) a{color:inherit}p.has-text-align-left[style*="writing-mode:vertical-lr"],p.has-text-align-right[style*="writing-mode:vertical-rl"]{rotate:180deg}
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
/*! This file is auto-generated */
|
||||||
|
window.addComment=function(v){var I,C,h,E=v.document,b={commentReplyClass:"comment-reply-link",commentReplyTitleId:"reply-title",cancelReplyId:"cancel-comment-reply-link",commentFormId:"commentform",temporaryFormId:"wp-temp-form-div",parentIdFieldId:"comment_parent",postIdFieldId:"comment_post_ID"},e=v.MutationObserver||v.WebKitMutationObserver||v.MozMutationObserver,r="querySelector"in E&&"addEventListener"in v,n=!!E.documentElement.dataset;function t(){d(),e&&new e(o).observe(E.body,{childList:!0,subtree:!0})}function d(e){if(r&&(I=g(b.cancelReplyId),C=g(b.commentFormId),I)){I.addEventListener("touchstart",l),I.addEventListener("click",l);function t(e){if((e.metaKey||e.ctrlKey)&&13===e.keyCode&&"a"!==E.activeElement.tagName.toLowerCase())return C.removeEventListener("keydown",t),e.preventDefault(),C.submit.click(),!1}C&&C.addEventListener("keydown",t);for(var n,d=function(e){var t=b.commentReplyClass;e&&e.childNodes||(e=E);e=E.getElementsByClassName?e.getElementsByClassName(t):e.querySelectorAll("."+t);return e}(e),o=0,i=d.length;o<i;o++)(n=d[o]).addEventListener("touchstart",a),n.addEventListener("click",a)}}function l(e){var t,n,d=g(b.temporaryFormId);d&&h&&(g(b.parentIdFieldId).value="0",t=d.textContent,d.parentNode.replaceChild(h,d),this.style.display="none",n=(d=(d=g(b.commentReplyTitleId))&&d.firstChild)&&d.nextSibling,d&&d.nodeType===Node.TEXT_NODE&&t&&(n&&"A"===n.nodeName&&n.id!==b.cancelReplyId&&(n.style.display=""),d.textContent=t),e.preventDefault())}function a(e){var t=g(b.commentReplyTitleId),t=t&&t.firstChild.textContent,n=this,d=m(n,"belowelement"),o=m(n,"commentid"),i=m(n,"respondelement"),r=m(n,"postid"),n=m(n,"replyto")||t;d&&o&&i&&r&&!1===v.addComment.moveForm(d,o,i,r,n)&&e.preventDefault()}function o(e){for(var t=e.length;t--;)if(e[t].addedNodes.length)return void d()}function m(e,t){return n?e.dataset[t]:e.getAttribute("data-"+t)}function g(e){return E.getElementById(e)}return r&&"loading"!==E.readyState?t():r&&v.addEventListener("DOMContentLoaded",t,!1),{init:d,moveForm:function(e,t,n,d,o){var i,r,l,a,m,c,s,e=g(e),n=(h=g(n),g(b.parentIdFieldId)),y=g(b.postIdFieldId),p=g(b.commentReplyTitleId),u=(p=p&&p.firstChild)&&p.nextSibling;if(e&&h&&n){void 0===o&&(o=p&&p.textContent),a=h,m=b.temporaryFormId,c=g(m),s=(s=g(b.commentReplyTitleId))?s.firstChild.textContent:"",c||((c=E.createElement("div")).id=m,c.style.display="none",c.textContent=s,a.parentNode.insertBefore(c,a)),d&&y&&(y.value=d),n.value=t,I.style.display="",e.parentNode.insertBefore(h,e.nextSibling),p&&p.nodeType===Node.TEXT_NODE&&(u&&"A"===u.nodeName&&u.id!==b.cancelReplyId&&(u.style.display="none"),p.textContent=o),I.onclick=function(){return!1};try{for(var f=0;f<C.elements.length;f++)if(i=C.elements[f],r=!1,"getComputedStyle"in v?l=v.getComputedStyle(i):E.documentElement.currentStyle&&(l=i.currentStyle),(i.offsetWidth<=0&&i.offsetHeight<=0||"hidden"===l.visibility)&&(r=!0),"hidden"!==i.type&&!i.disabled&&!r){i.focus();break}}catch(e){}return!1}}}}(window);
|
||||||
@@ -0,0 +1,122 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Скрипт первичной настройки WordPress для БИТ.WMS портала
|
||||||
|
# Запускать после docker-compose up -d
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
PROJECT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||||
|
WP="docker compose -f $PROJECT_DIR/docker-compose.yml run --rm wpcli"
|
||||||
|
|
||||||
|
echo "=== Ожидание готовности базы данных (до 30 сек)... ==="
|
||||||
|
for i in $(seq 1 30); do
|
||||||
|
if docker compose -f "$PROJECT_DIR/docker-compose.yml" exec -T db mysqladmin ping -h localhost -u bitwms -pbitwms --silent 2>/dev/null; then
|
||||||
|
echo "БД готова!"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
echo " Попытка $i/30..."
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Установка WordPress ==="
|
||||||
|
$WP core install \
|
||||||
|
--url="http://localhost:8080" \
|
||||||
|
--title="БИТ.WMS — Экспертный портал" \
|
||||||
|
--admin_user=admin \
|
||||||
|
--admin_password=admin \
|
||||||
|
--admin_email=admin@bitwms.local \
|
||||||
|
--skip-email
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Базовые настройки ==="
|
||||||
|
$WP option update timezone_string "Asia/Yekaterinburg"
|
||||||
|
$WP option update date_format "d.m.Y"
|
||||||
|
$WP option update time_format "H:i"
|
||||||
|
$WP option update default_comment_status "closed"
|
||||||
|
$WP option update default_ping_status "closed"
|
||||||
|
$WP rewrite structure "/%postname%/" --hard
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Удаление дефолтного контента ==="
|
||||||
|
$WP post delete 1 --force 2>/dev/null || true
|
||||||
|
$WP post delete 2 --force 2>/dev/null || true
|
||||||
|
$WP post delete 3 --force 2>/dev/null || true
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Удаление ненужных плагинов ==="
|
||||||
|
$WP plugin delete akismet 2>/dev/null || true
|
||||||
|
$WP plugin delete hello 2>/dev/null || true
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Установка бесплатных плагинов ==="
|
||||||
|
$WP plugin install generatepress --activate
|
||||||
|
$WP plugin install contact-form-7 --activate
|
||||||
|
$WP plugin install popup-maker --activate
|
||||||
|
$WP plugin install wordpress-seo --activate
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Активация дочерней темы ==="
|
||||||
|
$WP theme activate bitwms-child
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Создание страниц ==="
|
||||||
|
FRONT_ID=$($WP post create --post_type=page --post_title="Главная" --post_status=publish --post_name="home" --page_template="page-templates/front-page.php" --porcelain)
|
||||||
|
BLOG_ID=$($WP post create --post_type=page --post_title="Блог" --post_status=publish --post_name="blog" --porcelain)
|
||||||
|
$WP post create --post_type=page --post_title="БИТ.WMS" --post_status=publish --post_name="bit-wms" --page_template="page-templates/page-bit-wms.php"
|
||||||
|
$WP post create --post_type=page --post_title="Контакты" --post_status=publish --post_name="contacts" --page_template="page-templates/page-contacts.php"
|
||||||
|
$WP post create --post_type=page --post_title="Политика конфиденциальности" --post_status=publish --post_name="privacy-policy"
|
||||||
|
$WP post create --post_type=page --post_title="Согласие на обработку данных" --post_status=publish --post_name="consent"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Настройка статической главной страницы ==="
|
||||||
|
$WP option update show_on_front "page"
|
||||||
|
$WP option update page_on_front "$FRONT_ID"
|
||||||
|
$WP option update page_for_posts "$BLOG_ID"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Создание рубрик для статей/новостей ==="
|
||||||
|
$WP term create category "Статьи" --slug=articles 2>/dev/null || true
|
||||||
|
$WP term create category "Новости" --slug=news 2>/dev/null || true
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Создание тестового контента ==="
|
||||||
|
|
||||||
|
# Тестовые кейсы
|
||||||
|
$WP post create --post_type=case --post_title="Автоматизация склада для ООО «Логистика Плюс»" --post_status=publish --post_excerpt="Внедрение БИТ.WMS на складе площадью 5000 м² с 10 000 SKU"
|
||||||
|
$WP post create --post_type=case --post_title="Оптимизация складских процессов для «ТехноПарк»" --post_status=publish --post_excerpt="Сокращение времени отбора заказов на 35% за 3 месяца"
|
||||||
|
$WP post create --post_type=case --post_title="Миграция с Excel на WMS для «Фуд Маркет»" --post_status=publish --post_excerpt="Переход от ручного учёта к автоматизированному управлению"
|
||||||
|
|
||||||
|
# Тестовые вебинары
|
||||||
|
$WP post create --post_type=webinar --post_title="Как выбрать WMS-систему для вашего склада" --post_status=publish --post_excerpt="Разбираем ключевые критерии выбора"
|
||||||
|
$WP post create --post_type=webinar --post_title="Оптимизация складских процессов с БИТ.WMS" --post_status=publish --post_excerpt="Живая демонстрация возможностей системы"
|
||||||
|
|
||||||
|
# Тестовые статьи
|
||||||
|
$WP post create --post_type=post --post_title="5 признаков того, что вашему складу нужна WMS" --post_status=publish --post_excerpt="Чек-лист для руководителя склада" --post_category=$($WP term list category --slug=articles --field=term_id 2>/dev/null || echo 1)
|
||||||
|
$WP post create --post_type=post --post_title="ROI от внедрения WMS: как считать и что ожидать" --post_status=publish --post_excerpt="Методика расчёта окупаемости" --post_category=$($WP term list category --slug=articles --field=term_id 2>/dev/null || echo 1)
|
||||||
|
|
||||||
|
# Тестовый курс
|
||||||
|
$WP post create --post_type=course --post_title="Курс: Управление складом с БИТ.WMS" --post_status=publish --post_excerpt="Полный курс для складских менеджеров"
|
||||||
|
|
||||||
|
# Тестовое мероприятие
|
||||||
|
$WP post create --post_type=event --post_title="Конференция «Склад будущего 2026»" --post_status=publish --post_excerpt="Ежегодная конференция по складской логистике"
|
||||||
|
|
||||||
|
# Тестовый материал
|
||||||
|
$WP post create --post_type=material --post_title="Чек-лист: Подготовка склада к внедрению WMS" --post_status=publish --post_excerpt="Скачайте PDF с пошаговым планом"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Обновление permalink ==="
|
||||||
|
$WP rewrite flush
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=========================================="
|
||||||
|
echo " WordPress настроен!"
|
||||||
|
echo " Сайт: http://localhost:8080"
|
||||||
|
echo " Админка: http://localhost:8080/wp-admin"
|
||||||
|
echo " Логин: admin / admin"
|
||||||
|
echo "=========================================="
|
||||||
|
echo ""
|
||||||
|
echo " ВАЖНО: Премиум-плагины установите вручную через админку:"
|
||||||
|
echo " - GeneratePress Premium"
|
||||||
|
echo " - GenerateBlocks Pro"
|
||||||
|
echo " - ACF Pro"
|
||||||
|
echo "=========================================="
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
https://place.lemma.ru/ - как шаблон структуры
|
||||||
|
https://blueyonder.com/ - как шаблон контент
|
||||||