Инструктаж: действия водителей ТС без кондиционера в жаркий период (HTML + PDF)

This commit is contained in:
Dauren777 2026-06-22 11:29:04 +00:00
parent d2855dc8e4
commit 6e427512e2
5 changed files with 1080 additions and 0 deletions

173
AGENTS.md Normal file
View File

@ -0,0 +1,173 @@
<!-- vibe42-agents-version: v3-guided-2026-06-01 -->
# Vibe42 — учебная песочница для лендингов
Workspace юзера `renat_togussov`. Это **учебная среда**, где обычные люди (не разработчики) пробуют сделать свой первый сайт.
---
## 🎯 ТВОЯ РОЛЬ
Ты — **гид и помощник**, а не слепой исполнитель. Цель сессии — чтобы юзер вышел с:
1. **рабочим лендингом**, опубликованным по адресу `https://pages.git.vibe42.kz/renat_togussov/<repo>/`,
2. ощущением «это было легко» — без серверов, БД, токенов, конфигов.
Юзер не разработчик. Ему важен **результат, который видно в браузере**, а не код.
---
## 🗺 СЦЕНАРИЙ ПЕРВОГО ЗАХОДА (юзер только зашёл, ещё ничего нет)
1. Поздоровайся коротко: «Привет! Тут за 10 минут собираем лендинг и публикуем его в интернете. О чём хочешь сделать?»
2. Если он не знает — предложи **4 конкретных идеи** (выбирай близкие к нему, не абстрактные):
- Промо хобби (фотография / музыка / спорт)
- Резюме / personal page с контактами
- Афиша мероприятия (концерт, день рождения, мастер-класс)
- Меню заведения / прайс услуг
- Лендинг продукта или будущего проекта (waitlist)
3. Уточни **2 короткие детали**: стиль (тёмный/светлый/яркий) и главную цель (рассказать / собрать заявку / показать работы).
4. Сразу делай `./new-project <name>` и собирай страницу. Не спрашивай разрешения на каждый шаг.
---
## 💬 ЕСЛИ ЮЗЕР ОТВЕЧАЕТ РАСПЛЫВЧАТО
Юзер говорит «сделай что-нибудь» / «ну хз» / «сюрприз» → **не делай ничего абстрактного**.
Скажи: «Давай определимся, я задам 3 коротких вопроса:
1. Это для тебя лично, для проекта/бизнеса, или для события?
2. Главная цель — рассказать о чём-то / собрать заявку / показать портфолио?
3. Любимое настроение — строгое тёмное, лёгкое светлое, яркое цветное?»
После ответов **сразу** предложи 2 конкретных варианта названия+структуры. Дай выбрать и иди делать.
---
## 🚫 ЕСЛИ ЮЗЕР ХОЧЕТ СЛОЖНОЕ — ПЕРЕФОРМУЛИРУЙ В ЛЕНДИНГ
| Запрос | Что делаем вместо |
|--------|-------------------|
| «магазин с корзиной» | лендинг с товарами + кнопка «купить» = ссылка на WhatsApp / Telegram |
| «соцсеть» | лендинг будущего проекта + waitlist-форма (Formspree / Getform) |
| «блог с админкой» | personal-page + ссылки на статьи в Telegram/Medium |
| «приложение для записи» | лендинг услуги + ссылка на Calendly / WhatsApp |
| «сайт с входом юзеров» | публичный лендинг без логина (нам логин не нужен) |
| «бот в Telegram» | лендинг с описанием бота + кнопка `t.me/...` |
**Не говори «это невозможно».** Скажи: «У нас песочница только для статических сайтов. Давай сделаем лендинг, который покажет твою идею — а кнопки/формы свяжем с готовыми сервисами (WhatsApp, Telegram, Formspree)». Юзер счастлив, результат за 15 минут.
---
## 📐 ШАБЛОНЫ СТРАНИЦ (выбирай под идею юзера)
### A — Промо продукта/услуги
**Секции:** Hero (заголовок + подзаголовок + CTA-кнопка) → 3-4 преимущества (иконка emoji + текст) → социальное доказательство (отзыв или цифра) → CTA (кнопка/телефон/мессенджер).
### B — Personal / резюме
**Секции:** Hero (фото-аватарка + имя + одна фраза «кто я») → О себе (1-2 абзаца) → 3-5 карточек проектов/опыта → Контакты (email, telegram, github как ссылки-кнопки).
### C — Афиша мероприятия
**Секции:** Hero (название + дата + место крупно) → Программа (список с временем) → Локация (картинка-placeholder + адрес) → Регистрация (форма Formspree или контакт).
### D — Меню / прайс
**Секции:** Hero (название + слоган) → Меню/прайс (категории с ценами) → Контакты (телефон, адрес, часы работы, карта-картинка).
### E — Waitlist для будущего проекта
**Секции:** Hero (название проекта + одна фраза + email-форма) → 3 фичи «что будет» → FAQ (3 пункта) → CTA (та же email-форма).
Все шаблоны — **одна страница, прокрутка вниз**. Никаких роутов, ничего динамического.
---
## ⚡ РИТУАЛ ПОСЛЕ ПЕРВОГО ЗАПУСКА
Как только готов первый рабочий вариант (даже грубый):
1. **Сразу запушь:**
```bash
git add -A
git commit -m "v1"
git push origin HEAD:pages
```
2. **ОБЯЗАТЕЛЬНО** дай юзеру ссылку **жирно**:
> 🎉 Готово! Твой лендинг здесь: **https://pages.git.vibe42.kz/renat_togussov/<repo>/**
3. Скажи: «Открой в новой вкладке, посмотри. Что хочешь поменять?»
4. Дальше короткие итерации: правка → push → новый URL-показ. Каждые 2-3 правки — push.
---
## ⚠️ ЖЕЛЕЗНЫЕ ПРАВИЛА (НЕ нарушать никогда)
1. **Только статика — HTML + CSS + JS в браузере.**
2. **Никакого бэкенда.** Никаких Node/Express/FastAPI/Django/PHP/Go-серверов. Никаких БД. Никакого Redis.
3. **Никакой аутентификации / OAuth / JWT.**
4. **Никакого Docker, nginx, sudo, системных настроек.**
5. **Никаких тяжёлых сборщиков** (`npm install` дерево на 500МБ). Tailwind — только через CDN.
6. **НИКОГДА `git init` в workspace root (`/workspaces/renat_togussov`)** — это папка-контейнер юзера, не репозиторий.
---
## ✅ ВСЕГДА работай через `./new-project`
Если юзер сказал «сделай сайт NAME» / «создай проект NAME»:
```bash
cd /workspaces/renat_togussov
./new-project NAME # создаёт repo в Gitea + клонит локально в ./NAME/
cd NAME
# теперь создавай index.html / style.css / script.js внутри ./NAME
```
`./new-project` сам создаёт repo, клонит, и копирует туда `AGENTS.md` + `design.md`.
---
## 🌐 Git и публикация
**НЕТ GitHub.** Self-hosted git: **https://git.vibe42.kz**
- Профиль юзера: https://git.vibe42.kz/renat_togussov
- Pages (живые лендинги): https://pages.git.vibe42.kz/renat_togussov/<repo>/
- Креды уже в `/workspaces/renat_togussov/.git-credentials` — git push/clone работают без пароля
- **НЕ спрашивай юзера про GitHub URL / токен** — их не нужно
### Опубликовать лендинг
```bash
git add -A
git commit -m "site"
git push origin HEAD:pages
```
Ветка **`pages`** (Caddy её обслуживает; `gh-pages` тоже работает как fallback). Push → лендинг доступен мгновенно.
---
## 🔧 Когда что-то идёт не так
- **Pages 404** → запушь ветку `pages` снова: `git push origin HEAD:pages -f`
- **Не дёргай Gitea API типа `/repos/.../pages`, `/settings/pages`, `/deploy_keys`** — их нет
- **Не пытайся «настроить Pages через UI Gitea»** — Pages у нас работают только через push в ветку `pages`
- Запуталось — сделай новый чистый проект через `./new-project NAME-v2`, перенеси туда работающий index.html
---
## ❌ Чего НЕ делать НИКОГДА
- ❌ `git init` в workspace root
- ❌ `npm install` с прод-зависимостями (express/mongoose/pg/prisma/next/nuxt)
- ❌ Создавать `server.js` / `app.py` / `main.go` как backend
- ❌ Использовать `gh` CLI или GitHub API
- ❌ Вызывать Gitea Pages-API (его нет)
- ❌ Долгое отлаживание Pages — почти всегда решение «push HEAD:pages»
- ❌ Просить юзера ввести токен/URL/пароль — всё уже настроено
- ❌ Задавать юзеру 10 вопросов подряд (максимум 2-3 за раз)
- ❌ Показывать юзеру голый код больше 1 раза — ему важен результат, а не как написано
- ❌ Предлагать «давай сначала дизайн в Figma» — мы делаем сразу в HTML
- ❌ Говорить «это сложно» — переформулируй в простое
- ❌ Зависать в обсуждениях — сделай первый вариант грубо, потом итерируй
---
## 🎨 design.md
Рядом лежит `design.md` с готовой палитрой, типографикой и стартер-шаблоном `index.html`. **Начинай с него.** Не выдумывай новые цвета — модифицируй существующие.

110
design.md Normal file
View File

@ -0,0 +1,110 @@
<!-- vibe42-design-version: v1-2026-06-01 -->
# Design system — Vibe42 песочница
Базовые цвета и типографика для лендингов. Можно отклоняться, но начинай с этого.
## Палитра
| Token | Hex | Использование |
|-------|-----|---------------|
| `--ink` | `#0F1218` | Тёмный фон / основной текст |
| `--cyan` | `#00E5FF` | Основной акцент (кнопки, лого) |
| `--cyan-50` | `#E8FCFF` | Светлая подложка для акцентов |
| `--white` | `#FFFFFF` | Основной фон |
| `--gray-500` | `#5B6573` | Вторичный текст |
| `--gray-100` | `#F2F4F7` | Сепараторы / тонкие фоны |
## Типографика
```css
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Inter, system-ui, sans-serif;
```
| Уровень | Размер | Вес | line-height |
|---------|--------|-----|-------------|
| h1 (hero) | 56px | 800 | 1.05 |
| h2 (section) | 36px | 700 | 1.15 |
| h3 | 22px | 700 | 1.3 |
| body | 17px | 400 | 1.6 |
| small | 14px | 400 | 1.5 |
На мобиле — h1 уменьши до 36px, h2 до 28px.
## Лейаут
- max-width контента: **1140px** (контейнер с padding по бокам)
- секция: `padding: 80px 24px` (мобила: `48px 20px`)
- gap между блоками внутри секции: `24-32px`
- border-radius: `8px` (кнопки, карточки), `16px` (большие карточки)
## Кнопки
```css
.btn-primary {
background: var(--cyan); color: var(--ink);
padding: 14px 28px; border-radius: 8px;
font-weight: 700; text-decoration: none;
display: inline-block;
}
.btn-secondary {
background: transparent; color: var(--ink);
border: 2px solid var(--ink);
padding: 12px 26px; border-radius: 8px;
}
```
## Стартер `index.html`
```html
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Мой проект</title>
<style>
:root{--ink:#0F1218;--cyan:#00E5FF;--cyan-50:#E8FCFF;--white:#fff;--gray-500:#5B6573;--gray-100:#F2F4F7}
*{box-sizing:border-box;margin:0;padding:0}
body{font:17px/1.6 -apple-system,BlinkMacSystemFont,"Segoe UI",Inter,system-ui,sans-serif;color:var(--ink);background:var(--white)}
.container{max-width:1140px;margin:0 auto;padding:80px 24px}
.hero{background:var(--ink);color:var(--white)}
.hero h1{font-size:56px;font-weight:800;line-height:1.05;margin-bottom:24px}
.hero p{font-size:20px;color:#9aa3b2;max-width:600px;margin-bottom:32px}
.btn{display:inline-block;background:var(--cyan);color:var(--ink);padding:14px 28px;border-radius:8px;font-weight:700;text-decoration:none}
.btn:hover{background:#1be5ff}
.section h2{font-size:36px;font-weight:700;margin-bottom:24px}
.card{background:var(--gray-100);border-radius:16px;padding:32px;margin-bottom:16px}
@media (max-width:640px){.hero h1{font-size:36px}.section h2{font-size:28px}.container{padding:48px 20px}}
</style>
</head>
<body>
<section class="hero">
<div class="container">
<h1>Заголовок проекта</h1>
<p>Подзаголовок — пара предложений о чём это.</p>
<a class="btn" href="#section">Начать</a>
</div>
</section>
<section id="section" class="section">
<div class="container">
<h2>Секция</h2>
<div class="card">Контент карточки.</div>
<div class="card">Контент карточки.</div>
</div>
</section>
</body>
</html>
```
## Чем НЕ пользоваться
- Bootstrap, Material UI, Chakra, Ant Design — слишком тяжело и не нужно для лендинга
- Font Awesome — используй emoji (🚀 ⚡ ✨) или inline SVG
- jQuery — vanilla JS более чем достаточно
## Чем МОЖНО (если очень надо)
- **Tailwind через CDN**: `<script src="https://cdn.tailwindcss.com"></script>` — для прототипа OK
- **Lottie animations через CDN**
- **Placeholder картинки**: `https://picsum.photos/800/600`, `https://placehold.co/600x400`
- **Шрифты Google Fonts через `<link>`** в head

349
generate_pdf.py Normal file
View File

@ -0,0 +1,349 @@
#!/usr/bin/env python3
"""Генерация PDF инструктажа по действиям в жаркий период."""
from fpdf import FPDF
from fpdf.enums import XPos, YPos
class HotWeatherBriefingPDF(FPDF):
def __init__(self):
super().__init__(orientation="P", unit="mm", format="A4")
self.set_auto_page_break(True, 20)
color_ink = (15, 18, 24)
color_red = (229, 57, 53)
color_gray = (91, 101, 115)
color_gray_100 = (242, 244, 247)
color_white = (255, 255, 255)
color_amber = (230, 81, 0)
color_green = (46, 125, 50)
color_orange = (255, 109, 0)
font_dir = "/usr/share/fonts/truetype/dejavu/"
self.add_font("DejaVu", "", font_dir + "DejaVuSans.ttf")
self.add_font("DejaVu", "B", font_dir + "DejaVuSans-Bold.ttf")
self.c = {
"ink": color_ink,
"red": color_red,
"gray": color_gray,
"gray_bg": color_gray_100,
"white": color_white,
"amber": color_amber,
"green": color_green,
"orange": color_orange,
}
def add_header_page(self):
self.add_page()
m = 15
w = self.w - 2 * m
# Оранжевый градиентный заголовок
self.set_fill_color(*self.c["orange"])
self.rect(0, 0, self.w, 72, "F")
# Красная полоса
self.set_fill_color(*self.c["red"])
self.rect(0, 72, self.w, 3, "F")
# Плашка
self.set_y(16)
self.set_font("DejaVu", "B", 9)
self.set_text_color(*self.c["white"])
self.set_fill_color(*self.c["red"])
badge_w = self.get_string_width(" ИНСТРУКТАЖ / ЖАРКИЙ ПЕРИОД ") + 6
self.set_x(m)
self.cell(badge_w, 6, " ИНСТРУКТАЖ / ЖАРКИЙ ПЕРИОД ", fill=True, new_x=XPos.LMARGIN, new_y=YPos.NEXT)
# Заголовок
self.set_y(28)
self.set_x(m)
self.set_font("DejaVu", "B", 16)
self.set_text_color(*self.c["white"])
self.multi_cell(w, 8, "Действия водителей ТС без кондиционера в жаркий период", align="L")
# Подзаголовок
self.set_y(52)
self.set_x(m)
self.set_font("DejaVu", "", 9)
self.set_text_color(255, 240, 220)
self.multi_cell(w, 5,
"Порядок действий водителей транспортных средств компании,\n"
"не оборудованных кондиционером, в условиях повышенной температуры воздуха")
# Мета
self.set_y(90)
self.set_x(m)
self.set_text_color(*self.c["ink"])
self.set_font("DejaVu", "", 9)
self.cell(90, 6, "Дата инструктажа: _______________")
self.cell(0, 6, "Провёл: _______________", new_x=XPos.LMARGIN, new_y=YPos.NEXT)
def section_title(self, title):
self.ln(4)
self.set_font("DejaVu", "B", 13)
self.set_text_color(*self.c["ink"])
self.cell(0, 8, title, new_x="LMARGIN", new_y="NEXT")
y = self.get_y()
self.set_draw_color(*self.c["gray_bg"])
self.set_line_width(0.4)
self.line(self.l_margin, y + 2, self.w - self.r_margin, y + 2)
self.ln(5)
def body_text(self, text):
self.set_font("DejaVu", "", 10)
self.set_text_color(*self.c["ink"])
self.multi_cell(0, 5.5, text, align="L")
self.ln(1)
def sub_title(self, title):
self.ln(2)
self.set_font("DejaVu", "B", 10.5)
self.set_text_color(*self.c["ink"])
self.cell(0, 6, title, new_x="LMARGIN", new_y="NEXT")
self.ln(2)
def bullet(self, text, color=None):
self.set_font("DejaVu", "", 10)
self.set_text_color(*self.c["ink"])
bx = self.l_margin + 4
marker_color = color or self.c["ink"]
self.set_text_color(*marker_color)
self.set_x(self.l_margin + 1)
self.cell(5, 5.5, "\u25a0")
self.set_text_color(*self.c["ink"])
self.set_x(bx + 6)
self.multi_cell(self.w - self.r_margin - bx - 6, 5.5, text)
self.ln(1)
def callout_box(self, text, border_color, bg_color):
self.set_fill_color(*bg_color)
self.set_draw_color(*border_color)
self.set_line_width(0.6)
m = self.l_margin
w = self.w - m - self.r_margin
y0 = self.get_y()
lines = text.split("\n")
n = len(lines)
h = 10 + n * 5.5 + 4
self.rect(m, y0, w, h, "DF")
self.set_xy(m + 5, y0 + 3)
self.set_font("DejaVu", "", 9.5)
self.set_text_color(*self.c["ink"])
for line in lines:
self.set_x(m + 5)
self.cell(w - 10, 5.5, line, new_x="LMARGIN", new_y="NEXT")
self.set_y(y0 + h + 3)
def _measure_lines(self, w, line_h, text):
return len(self.multi_cell(w, line_h, text, dry_run=True, output="LINES"))
def build():
pdf = HotWeatherBriefingPDF()
# ── Титул ──
pdf.add_header_page()
# ══ 1. ОСНОВАНИЕ И ЦЕЛЬ ══
pdf.section_title("1. Основание и цель инструктажа")
pdf.body_text(
"Настоящий инструктаж проводится в связи с наступлением жаркого периода года "
"(температура воздуха выше +30\u00b0C) и необходимостью обеспечения безопасности "
"водителей, управляющих транспортными средствами без системы кондиционирования."
)
pdf.callout_box(
"Цель: предотвращение тепловых ударов, обезвоживания и снижения\n"
"работоспособности водителей, исключение ДТП вследствие потери\n"
"управления ТС по причине перегрева организма.",
pdf.c["orange"], (255, 243, 224),
)
pdf.body_text(
"Инструктаж обязателен для всех водителей (штатных и совместителей), "
"эксплуатирующих ТС без кондиционера, а также для лиц, допускающих ТС на линию."
)
# ══ 2. НОРМАТИВНАЯ БАЗА ══
pdf.section_title("2. Нормативная база")
for item in [
"Закон Республики Казахстан от 17 апреля 2014 г. № 194-V ЗРК «О дорожном движении»",
"Приказ Министра внутренних дел РК от 30 июня 2023 г. № 534 «ПДД, Основные положения по допуску ТС к эксплуатации»",
"Приказ и.о. Министра транспорта и коммуникаций РК от 4 марта 2005 г. № 114-I «Правила безопасности и охраны труда на автомобильном транспорте»",
"Трудовой кодекс РК от 23 ноября 2015 г. № 414-V ЗРК (ст. 184186)",
"Санитарные правила и нормы (СанПиН) Республики Казахстан",
"Локальные акты организации по охране труда и безопасности на транспорте",
]:
pdf.bullet(item, pdf.c["green"])
# ══ 3. ЗОНА РИСКА ══
pdf.section_title("3. Зона риска и последствия перегрева")
pdf.body_text(
"Управление ТС без кондиционера в жаркий период представляет особую опасность, "
"поскольку водитель вынужден длительное время находиться в замкнутом, нагретом "
"солнцем пространстве кабины/салона."
)
pdf.callout_box(
"Опасная зона: температура воздуха на улице от +30\u00b0C и выше.\n"
"В закрытой кабине ТС температура может превышать уличную на 1525\u00b0C.",
pdf.c["red"], (255, 240, 240),
)
# Таблица рисков
risk_data = [
("+3034\u00b0C", "+4555\u00b0C", "Повышенная утомляемость, снижение внимания"),
("+3539\u00b0C", "+5565\u00b0C", "Тепловое недомогание, риск обезвоживания"),
("+40\u00b0C и выше", "+65\u00b0C и выше", "Тепловой удар, потеря сознания"),
]
col1_w = 35
col2_w = 35
col3_w = pdf.w - pdf.l_margin - pdf.r_margin - col1_w - col2_w
# header
pdf.set_fill_color(*pdf.c["ink"])
pdf.set_text_color(*pdf.c["white"])
pdf.set_font("DejaVu", "B", 9)
pdf.cell(col1_w, 7, " На улице", border=1, fill=True)
pdf.cell(col2_w, 7, " В кабине", border=1, fill=True)
pdf.cell(col3_w, 7, " Риск", border=1, fill=True, new_x="LMARGIN", new_y="NEXT")
for i, (outdoor, cabin, risk) in enumerate(risk_data):
pdf.set_font("DejaVu", "", 9)
pdf.set_text_color(*pdf.c["ink"])
pdf.set_fill_color(pdf.c["gray_bg"] if i % 2 == 0 else pdf.c["white"])
pdf.cell(col1_w, 7, " " + outdoor, border=1, fill=True)
pdf.cell(col2_w, 7, " " + cabin, border=1, fill=True)
pdf.cell(col3_w, 7, " " + risk, border=1, fill=True, new_x="LMARGIN", new_y="NEXT")
pdf.ln(4)
# ══ 4. ДО ВЫЕЗДА НА ЛИНИЮ ══
pdf.section_title("4. Действия до выезда на линию")
items = [
"Оценить состояние здоровья. При головной боли, слабости, температуре выше +37\u00b0C — отказаться от выезда, сообщить диспетчеру.",
"Взять запас воды: минимум 2 литра питьевой воды на смену (в термосумке). Запрещается заменять воду сладкими напитками и газировкой.",
"Взять головной убор (панама, кепка с козырьком) для защиты от солнца при выходе из ТС.",
"Взять влажные салфетки / полотенце для обтирания лица и шеи.",
"Проветрить кабину перед выездом (открыть двери на 35 минут).",
"Одежда — лёгкая, светлая, воздухопроницаемая (хлопок). Запрещается тёмная синтетика.",
"Проверить, что окна открываются, вентиляция работает.",
]
for item in items:
pdf.bullet(item)
# ══ 5. ВО ВРЕМЯ ДВИЖЕНИЯ ══
pdf.section_title("5. Действия во время движения")
critical = [
"Пить воду каждые 2030 минут, даже если нет жажды. Жажда — уже признак обезвоживания.",
"Останавливаться каждые 1,52 часа на 1015 минут в тенистом месте. Не реже одного привала каждые 100 км.",
"При остановке — немедленно выйти из ТС, уйти в тень. Не оставаться в закрытой нагретой кабине.",
"Обтирать лицо и шею влажным полотенцем при каждой остановке.",
"Не закрывать окна наглухо — обеспечить сквозное проветривание кабины.",
"Не оставлять ТС под прямым солнцем — ставать в тень деревьев, зданий, навесов.",
]
for item in critical:
pdf.bullet(item, pdf.c["red"])
pdf.sub_title("Признаки теплового недомогания — немедленная остановка:")
symptoms = [
"Головная боль, головокружение, «мушки» перед глазами",
"Тошнота, рвота",
"Резкая слабость, сонливость,Difficulty concentrating",
"Учащённое сердцебиение, одышка без физической нагрузки",
"Покраснение лица, обильное потоотделение или его прекращение",
"Любые отклонения от нормального самочувствия",
]
for item in symptoms:
pdf.bullet(item, pdf.c["amber"])
pdf.callout_box(
"ПРИ ЛЮБЫХ ПРИЗНАКАХ ТЕПЛОВОГО НЕДОМОГАНИЯ:\n"
"1. Немедленно остановить ТС, выключить двигатель\n"
"2. Выйти из ТС, уйти в тень\n"
"3. Выпить 200300 мл воды мелкими глотками\n"
"4. Обтереть лицо, шею, запястья влажным полотенцем\n"
"5. При ухудшении — вызвать скорую помощь\n"
"6. Сообщить диспетчеру о невозможности продолжения рейса",
pdf.c["red"], (255, 240, 240),
)
# ══ 6. ОСОБЫЕ ТРЕБОВАНИЯ ══
pdf.section_title("6. Особые требования")
pdf.sub_title("Режим работы в жару")
pdf.body_text(
"Выезд на линию — не ранее 6:00. Возвращение — не позднее 18:00. "
"В период с 12:00 до 15:00 — обязательный перерыв в тенистом месте (не менее 30 минут)."
)
pdf.sub_title("Запреты")
pdf.body_text(
"Запрещается: оставлять детей в ТС, оставлять ТС с работающим двигателем "
"без присмотра, перевозить легковоспламеняющиеся жидкости без охлаждения."
)
pdf.sub_title("Взаимный контроль")
pdf.body_text(
"Водители обязаны проверять состояние здоровья коллег при встрече. "
"При признаках недомогания у коллеги — оказать помощь и сообщить диспетчеру."
)
# ══ 7. ЧЕК-ЛИСТ ══
pdf.section_title("7. Чек-лист перед выездом")
checklist = [
"Состояние здоровья удовлетворительное",
"Взял запас воды (мин. 2 литра) в термосумке",
"Взял головной убор",
"Взял влажные салфетки / полотенце",
"Одежда лёгкая, светлая, из хлопка",
"Кабина ТС проветрена перед выездом",
"Окна открываются, вентиляция работает",
"Проверил уровень охлаждающей жидкости",
"Есть заряженный мобильный телефон",
"Знание маршрута и мест для привалов в тени",
]
for item in checklist:
pdf.set_font("DejaVu", "", 10)
pdf.set_text_color(*pdf.c["ink"])
pdf.set_x(pdf.l_margin + 1)
pdf.cell(6, 6, "\u2610")
pdf.set_x(pdf.l_margin + 8)
pdf.cell(0, 6, item, new_x="LMARGIN", new_y="NEXT")
pdf.ln(4)
# ══ 8. ЛИСТ ОЗНАКОМЛЕНИЯ ══
pdf.section_title("8. Лист ознакомления с инструктажем")
pdf.body_text(
"Своей подписью подтверждаю, что с содержанием инструктажа ознакомлен(а), "
"требования и меру ответственности осознаю, обязуюсь выполнять."
)
pdf.ln(4)
sig_header = ["Фамилия И.О.", "Должность / Категория", "Подпись и дата"]
sig_w = [55, 75, (pdf.w - pdf.l_margin - pdf.r_margin - 130)]
pdf.set_fill_color(*pdf.c["ink"])
pdf.set_text_color(*pdf.c["white"])
pdf.set_font("DejaVu", "B", 9)
pdf.cell(sig_w[0], 7, " " + sig_header[0], border=1, fill=True)
pdf.cell(sig_w[1], 7, " " + sig_header[1], border=1, fill=True)
pdf.cell(sig_w[2], 7, " " + sig_header[2], border=1, fill=True, new_x="LMARGIN", new_y="NEXT")
for i in range(12):
if pdf.get_y() > pdf.h - 20:
pdf.add_page()
pdf.set_fill_color(pdf.c["gray_bg"] if i % 2 == 0 else pdf.c["white"])
pdf.set_text_color(*pdf.c["ink"])
pdf.set_font("DejaVu", "", 9)
pdf.cell(sig_w[0], 9, "", border=1, fill=True)
pdf.cell(sig_w[1], 9, "", border=1, fill=True)
pdf.cell(sig_w[2], 9, "", border=1, fill=True, new_x="LMARGIN", new_y="NEXT")
pdf.ln(6)
pdf.body_text("Инструктаж провёл: _______________________________________ (должность, Ф.И.О., подпись, дата)")
# ── SAVE ──
out = "Инструктаж_Действия_жаркий_период_ТС_без_кондиционера.pdf"
pdf.output(out)
print(f"PDF сохранён: {out}")
if __name__ == "__main__":
build()

448
index.html Normal file
View File

@ -0,0 +1,448 @@
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Инструктаж — Действия водителей ТС без кондиционера в жаркий период</title>
<style>
:root {
--ink: #0F1218;
--cyan: #00E5FF;
--cyan-50: #E8FCFF;
--white: #fff;
--gray-500: #5B6573;
--gray-100: #F2F4F7;
--red: #E53935;
--red-50: #FFF0F0;
--amber: #E65100;
--amber-50: #FFF8E1;
--green: #2E7D32;
--green-50: #E8F5E9;
--orange: #FF6D00;
--orange-50: #FFF3E0;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
font: 17px/1.6 -apple-system, BlinkMacSystemFont, "Segoe UI", Inter, system-ui, sans-serif;
color: var(--ink);
background: var(--white);
}
/* ── Header ── */
header {
background: linear-gradient(135deg, #BF360C 0%, #E65100 40%, #FF8F00 100%);
color: var(--white);
border-bottom: 4px solid var(--red);
}
header .container { max-width: 960px; margin: 0 auto; padding: 48px 24px 40px; }
.badge {
display: inline-block;
background: var(--white);
color: var(--orange);
font-size: 13px;
font-weight: 700;
text-transform: uppercase;
letter-spacing: 0.08em;
padding: 4px 14px;
border-radius: 4px;
margin-bottom: 16px;
}
header h1 { font-size: 38px; font-weight: 800; line-height: 1.2; margin-bottom: 12px; }
header .subtitle { font-size: 18px; color: rgba(255,255,255,0.85); max-width: 700px; }
header .meta { margin-top: 20px; font-size: 14px; color: rgba(255,255,255,0.7); }
header .meta span { margin-right: 28px; }
/* ── Sections ── */
.section { padding: 56px 24px; }
.section:nth-child(odd) { background: var(--white); }
.section:nth-child(even) { background: var(--gray-100); }
.section .container { max-width: 960px; margin: 0 auto; }
.section h2 { font-size: 26px; font-weight: 700; margin-bottom: 20px; padding-bottom: 10px; border-bottom: 2px solid var(--gray-100); }
.section h3 { font-size: 18px; font-weight: 700; margin: 28px 0 10px; }
.section p { margin-bottom: 14px; }
/* ── Lists ── */
.rules { list-style: none; }
.rules li { position: relative; padding-left: 28px; margin-bottom: 14px; line-height: 1.55; }
.rules li::before { content: ''; position: absolute; left: 0; top: 7px; width: 12px; height: 12px; border-radius: 3px; }
.rules.danger li::before { background: var(--red); }
.rules.warn li::before { background: var(--amber); }
.rules.check li::before { background: var(--green); }
/* ── Callouts ── */
.callout { border-left: 4px solid; padding: 20px 24px; margin: 20px 0; border-radius: 0 8px 8px 0; font-size: 16px; line-height: 1.55; }
.callout.danger { background: var(--red-50); border-color: var(--red); }
.callout.warn { background: var(--amber-50); border-color: var(--amber); }
.callout.info { background: var(--cyan-50); border-color: var(--cyan); }
.callout.orange { background: var(--orange-50); border-color: var(--orange); }
/* ── Cards ── */
.cards { display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px; margin-top: 20px; }
.card { background: var(--white); border-radius: 12px; padding: 28px 24px; border: 1px solid var(--gray-100); }
.card .emoji { font-size: 32px; margin-bottom: 10px; }
.card h3 { margin-top: 0; margin-bottom: 8px; font-size: 17px; }
.card p { font-size: 15px; color: var(--gray-500); margin: 0; }
/* ── Table ── */
.table-wrap { overflow-x: auto; margin: 20px 0; }
table { width: 100%; border-collapse: collapse; font-size: 15px; }
thead { background: var(--ink); color: var(--white); }
th, td { padding: 12px 16px; text-align: left; border: 1px solid var(--gray-100); }
tbody tr:nth-child(even) { background: var(--gray-100); }
/* ── Checklist ── */
.check-item { display: flex; align-items: flex-start; gap: 10px; padding: 8px 0; border-bottom: 1px dashed var(--gray-100); font-size: 15px; }
.check-box { flex-shrink: 0; width: 20px; height: 20px; border: 2px solid var(--gray-500); border-radius: 4px; margin-top: 2px; }
/* ── Acknowledgment block ── */
.ack-block { background: var(--white); border: 2px dashed var(--gray-500); border-radius: 12px; padding: 32px; margin-top: 32px; page-break-inside: avoid; }
.ack-block h3 { margin-top: 0; margin-bottom: 20px; font-size: 20px; }
.ack-row { display: grid; grid-template-columns: 1fr 1.4fr 1fr; gap: 16px; font-size: 14px; padding: 6px 0; }
.ack-row.header-row { font-weight: 700; color: var(--gray-500); border-bottom: 1px solid var(--gray-100); margin-bottom: 8px; padding-bottom: 10px; }
.ack-line { border-bottom: 1px dotted var(--gray-100); padding: 8px 0; min-height: 36px; }
/* ── Footer ── */
footer { background: var(--ink); color: #7a8390; text-align: center; padding: 28px 24px; font-size: 14px; }
footer a { color: var(--cyan); text-decoration: none; }
/* ── Print ── */
@media print {
.section { padding: 24px 0; page-break-inside: avoid; }
.section:nth-child(even) { background: #f9f9f9; -webkit-print-color-adjust: exact; print-color-adjust: exact; }
header { -webkit-print-color-adjust: exact; print-color-adjust: exact; }
body { font-size: 14px; }
footer { display: none; }
}
/* ── Mobile ── */
@media (max-width: 700px) {
header h1 { font-size: 26px; }
header .container { padding: 32px 20px 28px; }
.section { padding: 36px 20px; }
.section h2 { font-size: 22px; }
.cards { grid-template-columns: 1fr; }
.ack-row { grid-template-columns: 1fr; }
}
</style>
</head>
<body>
<!-- ═══════════ HEADER ═══════════ -->
<header>
<div class="container">
<div class="badge">Инструктаж / Жаркий период</div>
<h1>Действия водителей ТС без кондиционера в жаркий период</h1>
<p class="subtitle">
Порядок действий водителей транспортных средств компании,
не оборудованных кондиционером, в условиях повышенной температуры воздуха
</p>
<div class="meta">
<span>Дата инструктажа: _______________</span>
<span>Провёл: _______________</span>
</div>
</div>
</header>
<!-- ═══════════ 1. ОСНОВАНИЕ И ЦЕЛЬ ═══════════ -->
<section class="section">
<div class="container">
<h2>1. Основание и цель инструктажа</h2>
<p>
Настоящий инструктаж проводится в связи с наступлением жаркого периода года
(температура воздуха выше +30&thinsp;&deg;C) и необходимостью обеспечения безопасности
водителей, управляющих транспортными средствами без системы кондиционирования.
</p>
<div class="callout orange">
<strong>Цель:</strong> предотвращение тепловых ударов, обезвоживания и снижения
работоспособности водителей, исключение ДТП вследствие потери управления ТС
по причине перегрева организма.
</div>
<p>
Инструктаж обязателен для всех водителей (штатных и совместителей),
эксплуатирующих ТС без кондиционера, а также для лиц, допускающих ТС на линию.
</p>
</div>
</section>
<!-- ═══════════ 2. НОРМАТИВНАЯ БАЗА ═══════════ -->
<section class="section">
<div class="container">
<h2>2. Нормативная база</h2>
<ul class="rules check">
<li>Закон Республики Казахстан от 17 апреля 2014&nbsp;г. №&nbsp;194-V&nbsp;ЗРК «О дорожном движении»</li>
<li>Приказ Министра внутренних дел РК от 30 июня 2023&nbsp;г. №&nbsp;534 «Об утверждении Правил дорожного движения, Основных положений по допуску транспортных средств к эксплуатации»</li>
<li>Приказ и.о. Министра транспорта и коммуникаций РК от 4&nbsp;марта 2005&nbsp;г. №&nbsp;114-I «Об утверждении Правил безопасности и охраны труда на автомобильном транспорте»</li>
<li>Трудовой кодекс РК от 23 ноября 2015&nbsp;г. №&nbsp;414-V&nbsp;ЗРК (ст. 184186 — нормы условий труда)</li>
<li>Санитарные правила и нормы (СанПиН) Республики Казахстан в части обеспечения безопасных условий труда</li>
<li>Локальные акты организации по охране труда и безопасности на транспорте</li>
</ul>
</div>
</section>
<!-- ═══════════ 3. ЗОНА РИСКА ═══════════ -->
<section class="section">
<div class="container">
<h2>3. Зона риска и последствия перегрева</h2>
<p>
Управление ТС без кондиционера в жаркий период представляет особую опасность,
поскольку водитель вынужден длительное время находиться в замкнутом, нагретом
солнцем пространстве кабины/салона.
</p>
<div class="callout danger">
<strong>Опасная зона:</strong> температура воздуха на улице от +30&thinsp;&deg;C и выше.
В закрытой кабине ТС температура может превышать уличную на 1525&thinsp;&deg;C.
</div>
<div class="cards">
<div class="card">
<div class="emoji">🌡</div>
<h3>Тепловой удар</h3>
<p>Потеря сознания, спутанность сознания, судороги. Риск ДТП — 100%.</p>
</div>
<div class="card">
<div class="emoji">💧</div>
<h3>Обезвоживание</h3>
<p>Снижение концентрации внимания, замедление реакции, головокружение.</p>
</div>
<div class="card">
<div class="emoji">😴</div>
<h3>Гиперсомния</h3>
<p>Повышенная сонливость, «микрозасыпания» за рулём — основная причина лобовых столкновений.</p>
</div>
</div>
<div class="table-wrap" style="margin-top: 28px;">
<table>
<thead>
<tr>
<th>Температура на улице</th>
<th>Температура в кабине (≈)</th>
<th>Риск для водителя</th>
</tr>
</thead>
<tbody>
<tr>
<td>+3034&thinsp;&deg;C</td>
<td>+4555&thinsp;&deg;C</td>
<td>Повышенная утомляемость, снижение внимания</td>
</tr>
<tr>
<td>+3539&thinsp;&deg;C</td>
<td>+5565&thinsp;&deg;C</td>
<td>Тепловое недомогание, риск обезвоживания</td>
</tr>
<tr>
<td>+40&thinsp;&deg;C и выше</td>
<td>+65&thinsp;&deg;C и выше</td>
<td>Тепловой удар, потеря сознания, острое поражение здоровья</td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
<!-- ═══════════ 4. ДО ВЫЕЗДА НА ЛИНИЮ ═══════════ -->
<section class="section">
<div class="container">
<h2>4. Действия до выезда на линию</h2>
<div class="callout info">
<strong>Перед выездом водитель обязан:</strong>
</div>
<ul class="rules check">
<li>
<strong>Оценить состояние здоровья.</strong> При головной боли, слабости, температуре
тела выше +37&thinsp;&deg;C — <strong>отказать от выезда</strong>, сообщить диспетчеру.
</li>
<li>
<strong>Взять запас воды.</strong> Минимум 2 литра питьевой воды на смену
(в термосумке или с термоподставкой). Запрещается заменять воду сладкими напитками
и газировкой.
</li>
<li>
<strong>Взять головной убор</strong> (панама, кепка с козырьком) для защиты от солнца
при выходе из ТС.
</li>
<li>
<strong>Взять влажные салфетки / полотенце</strong> для обтирания лица и шеи.
</li>
<li>
<strong>Подготовить ТС:</strong> проветрить кабину перед выездом (открыть двери на 35 минут),
при наличии тонировки — убедиться, что стёкла не перегреваются.
</li>
<li>
<strong>Откинуть / снять верхнюю одежду</strong> — работать в лёгкой, светлой, воздухопроницаемой
одежде. Запрещается выезжать в тёмной синтетической одежде.
</li>
<li>
<strong>Проверить доступ к вентиляции:</strong> убедиться, что окна открываются,
вентиляция работает.
</li>
</ul>
</div>
</section>
<!-- ═══════════ 5. ВО ВРЕМЯ ДВИЖЕНИЯ ═══════════ -->
<section class="section">
<div class="container">
<h2>5. Действия во время движения</h2>
<div class="callout danger">
<strong>Критические правила:</strong>
</div>
<ul class="rules danger">
<li>
<strong>Пить воду каждые 2030 минут</strong>, даже если нет жажды. Жажда — уже признак
обезвоживания.
</li>
<li>
<strong>Останавливаться каждые 1,52 часа</strong> на 1015 минут в тенистом месте.
Не реже одного привала каждые 100 км.
</li>
<li>
<strong>При остановке — немедленно выйти из ТС</strong>, уйти в тень. Не оставаться
в закрытой нагретой кабине.
</li>
<li>
<strong>Обтирать лицо и шею влажным полотенцем</strong> при каждой остановке.
</li>
<li>
<strong>Не закрывать окна наглухо</strong> — обеспечить сквозное проветривание кабины
(открыть окна с двух сторон на 35 см).
</li>
<li>
<strong>Не оставлять ТС под прямым солнцем</strong> — при остановках ставать в тень
деревьев, зданий, навесов.
</li>
</ul>
<h3>Признаки теплового недомогания — немедленная остановка:</h3>
<ul class="rules warn">
<li>Головная боль, головокружение, «мушки» перед глазами</li>
<li>Тошнота, рвота</li>
<li>Резкая слабость, сонливость,difficulty concentrating</li>
<li>Учащённое сердцебиение, одышка без физической нагрузки</li>
<li>Покраснение лица, обильное потоотделение или его прекращение</li>
<li>Мурашки на коже, ощущение «ватных» конечностей</li>
<li>Любые отклонения от нормального самочувствия</li>
</ul>
<div class="callout danger">
<strong>ПРИ ЛЮБЫХ ПРИЗНАКАХ ТЕПЛОВОГО НЕДОМОГАНИЯ:</strong>
<ol style="margin: 8px 0 0 20px;">
<li>Немедленно остановить ТС, выключить двигатель</li>
<li>Выйти из ТС, уйти в тень</li>
<li>Выпить 200300 мл воды мелкими глотками</li>
<li>Обтереть лицо, шею, запястья влажным полотенцем</li>
<li>При ухудшении — вызвать скорую помощь</li>
<li>Сообщить диспетчеру о невозможности продолжения рейса</li>
</ol>
</div>
</div>
</section>
<!-- ═══════════ 6. ОСОБЫЕ ТРЕБОВАНИЯ ═══════════ -->
<section class="section">
<div class="container">
<h2>6. Особые требования</h2>
<div class="cards" style="grid-template-columns: repeat(2, 1fr);">
<div class="card">
<div class="emoji"></div>
<h3>Режим работы в жару</h3>
<p>Выезд на линию — не ранее 6:00. Возвращение — не позднее 18:00. В период с 12:00 до 15:00 — обязательный перерыв в тенистом месте (не менее 30 минут).</p>
</div>
<div class="card">
<div class="emoji">🚫</div>
<h3>Запреты</h3>
<p>Запрещается: оставлять детей в ТС, оставлять ТС с работающим двигателем без присмотра, перевозить легковоспламеняющиеся жидкости без охлаждения.</p>
</div>
<div class="card">
<div class="emoji">🧊</div>
<h3>Охлаждение</h3>
<p>Допускается использование_portable_вентиляторов от прикуривателя, охлаждающих бандажей, бутылок с замороженной водой.</p>
</div>
<div class="card">
<div class="emoji">👥</div>
<h3>Взаимный контроль</h3>
<p>Водители обязаны проверять состояние здоровья коллег при встрече. При признаках недомогания у коллеги — оказать помощь и сообщить диспетчеру.</p>
</div>
</div>
</div>
</section>
<!-- ═══════════ 7. ЧЕК-ЛИСТ ═══════════ -->
<section class="section">
<div class="container">
<h2>7. Чек-лист перед выездом</h2>
<p style="color:var(--gray-500);font-size:15px;">Отметьте каждый пункт перед выездом на линию:</p>
<div class="check-item"><div class="check-box"></div><span>Состояние здоровья удовлетворительное (нет температуры, головной боли, слабости)</span></div>
<div class="check-item"><div class="check-box"></div><span>Взял запас воды (мин. 2 литра) в термосумке</span></div>
<div class="check-item"><div class="check-box"></div><span>Взял головной убор (панама / кепка)</span></div>
<div class="check-item"><div class="check-box"></div><span>Взял влажные салфетки / полотенце</span></div>
<div class="check-item"><div class="check-box"></div><span>Одежда лёгкая, светлая, из хлопка</span></div>
<div class="check-item"><div class="check-box"></div><span>Кабина ТС проветрена перед выездом</span></div>
<div class="check-item"><div class="check-box"></div><span>Окна открываются, вентиляция работает</span></div>
<div class="check-item"><div class="check-box"></div><span>Проверил уровень охлаждающей жидкости</span></div>
<div class="check-item"><div class="check-box"></div><span>Есть заряженный мобильный телефон для вызова помощи</span></div>
<div class="check-item"><div class="check-box"></div><span>Знание маршрута и мест для привалов в тени</span></div>
</div>
</section>
<!-- ═══════════ 8. ЛИСТ ОЗНАКОМЛЕНИЯ ═══════════ -->
<section class="section">
<div class="container">
<h2>8. Лист ознакомления с инструктажем</h2>
<p style="color:var(--gray-500);font-size:15px;">
Своей подписью подтверждаю, что с содержанием инструктажа ознакомлен(а),
требования и меру ответственности осознаю, обязуюсь выполнять.
</p>
<div class="ack-block">
<h3>Подписи инструктируемых</h3>
<div class="ack-row header-row">
<div>Фамилия И.О.</div>
<div>Должность / Категория</div>
<div>Подпись и дата</div>
</div>
<div class="ack-line"></div>
<div class="ack-line"></div>
<div class="ack-line"></div>
<div class="ack-line"></div>
<div class="ack-line"></div>
<div class="ack-line"></div>
<div class="ack-line"></div>
<div class="ack-line"></div>
<div class="ack-line"></div>
<div class="ack-line"></div>
<div class="ack-line"></div>
<div class="ack-line"></div>
</div>
<p style="margin-top:20px;color:var(--gray-500);font-size:14px;">
Инструктаж провёл: _______________________________________&nbsp;&nbsp;&nbsp;&nbsp;
(должность, Ф.И.О., подпись, дата)
</p>
</div>
</section>
<div class="section" style="text-align:center; padding: 40px 24px;">
<div class="container">
<a href="Инструктаж_Действия_жаркий_период_ТС_без_кондиционера.pdf" download
style="display:inline-block;background:var(--orange);color:#fff;padding:16px 36px;border-radius:8px;font-weight:700;text-decoration:none;font-size:18px;">
Скачать PDF-версию
</a>
</div>
</div>
<footer>
Материал инструктажа по действиям в жаркий период &copy; 2026 &nbsp;|&nbsp;
<a href="Инструктаж_Действия_жаркий_период_ТС_без_кондиционера.pdf" download>Скачать PDF</a>
</footer>
</body>
</html>