Compare commits

..

4 Commits
main ... pages

5 changed files with 1303 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

460
generate_pdf.py Normal file
View File

@ -0,0 +1,460 @@
#!/usr/bin/env python3
"""Генерация PDF версии инструктажа по безопасности ТС."""
from fpdf import FPDF
from fpdf.enums import XPos, YPos
class SafetyBriefingPDF(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_cyan = (0, 229, 255)
# We register DejaVu which supports Cyrillic.
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,
"cyan": color_cyan,
}
# ── helpers ──────────────────────────────────────────────
def add_header_page(self):
"""Первая страница — титульный заголовок."""
self.add_page()
m = 15 # боковые поля
w = self.w - 2 * m
# Тёмный заголовок
self.set_fill_color(*self.c["ink"])
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", 18)
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(154, 163, 178)
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 bold_text(self, text):
self.set_font("DejaVu", "B", 10)
self.set_text_color(*self.c["ink"])
self.multi_cell(0, 5.5, text, align="L")
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):
x0 = self.get_x()
self.set_font("DejaVu", "", 10)
self.set_text_color(*self.c["ink"])
bx = self.l_margin + 4
self.set_x(bx)
# bullet marker
self.set_font("DejaVu", "", 10)
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")
# text
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_draw_color(*border_color)
self.set_line_width(0.6)
self.line(m, y0, m, y0 + h)
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 checkbox_line(self, text="", x=None):
self.set_font("DejaVu", "", 10)
self.set_text_color(*self.c["ink"])
self.cell(6, 6, "\u2610")
self.cell(0, 6, text, new_x="LMARGIN", new_y="NEXT")
def centered_text(self, text, font_style="", size=10):
self.set_font("DejaVu", font_style, size)
self.set_text_color(*self.c["ink"])
self.cell(0, 7, text, align="C", new_x="LMARGIN", new_y="NEXT")
def _measure_lines(self, w, line_h, text):
"""Return number of lines multi_cell would produce."""
return len(self.multi_cell(w, line_h, text, dry_run=True, output="LINES"))
# ══════════════════════════════════════════════════════════
def build():
pdf = SafetyBriefingPDF()
m = 15 # боковое поле
# ── Титул ──
pdf.add_header_page()
# ══ 1. ОСНОВАНИЕ И ЦЕЛЬ ══
pdf.section_title("1. Основание и цель инструктажа")
pdf.body_text(
"Настоящий внеплановый инструктаж проводится в связи с необходимостью усиления мер "
"по обеспечению безопасности дорожного движения и сохранности имущества организации."
)
pdf.callout_box(
"Повод: выявленные случаи / риск оставления ключей в замке зажигания\n"
"транспортных средств (ТС), что создаёт свободный доступ посторонних лиц\n"
"к управлению ТС, угон, а также использование ТС не по назначению.",
pdf.c["red"], (255, 240, 240),
)
pdf.body_text(
"Цель: довести до всех категорий водителей и ответственных лиц категорические "
"требования по исключению практики оставления ключей в замке зажигания и обеспечению "
"контроля доступа к транспортным средствам."
)
# ══ 2. НОРМАТИВНАЯ БАЗА ══
pdf.section_title("2. Нормативная база")
for item in [
"Закон Республики Казахстан от 17 апреля 2014 г. № 194-V ЗРК «О дорожном движении»",
"Приказ Министра внутренних дел РК от 30 июня 2023 г. № 534 «Об утверждении Правил дорожного движения, Основных положений по допуску транспортных средств к эксплуатации»",
"Приказ и.о. Министра транспорта и коммуникаций РК от 4 марта 2005 г. № 114-I «Об утверждении Правил безопасности и охраны труда на автомобильном транспорте»",
"Кодекс РК об административных правонарушениях от 5 июля 2014 г. № 235-V ЗРК",
"Трудовой кодекс РК от 23 ноября 2015 г. № 414-V ЗРК",
"Правила внутреннего трудового распорядка и должностные инструкции организации",
"Локальные акты организации по охране труда и безопасности на транспорте",
]:
pdf.bullet(item, pdf.c["green"])
# ══ 3. КАТЕГОРИИ ЛИЦ ══
pdf.section_title("3. Категории инструктируемых лиц")
pdf.sub_title("Водители")
pdf.body_text("Штатные водители, закреплённые за конкретными ТС, выполняющие рейсы по маршрутам и заданиям организации.")
pdf.sub_title("Водители-совместители")
pdf.body_text("Сотрудники, совмещающие обязанности водителя с основной должностью, допущенные к управлению ТС организации.")
pdf.sub_title("Ответственные лица")
pdf.body_text("Лица, ответственные за выпуск ТС на линию, техническое состояние, хранение ТС и ведение документации.")
# ══ 4. ОПИСАНИЕ ПРОБЛЕМЫ И РИСКОВ ══
pdf.section_title("4. Описание проблемы и рисков")
pdf.body_text(
"Оставление ключей в замке зажигания транспортного средства вне зависимости от места нахождения ТС "
"(на территории организации, стоянке, в гараже, на линии) создаёт следующие угрозы:"
)
# таблица рисков
risk_data = [
("Угон ТС посторонними лицами",
"Материальный ущерб организации, уголовная ответственность, срыв производственных задач"),
("Использование ТС не по назначению",
"Расход ГСМ, износ ТС, нарушение трудовой дисциплины"),
("ДТП, совершённое лицом без допуска",
"Ущерб жизни и здоровью третьих лиц, гражданская и уголовная ответственность"),
("Хищение груза / имущества из ТС",
"Прямые финансовые потери, утрата доверия контрагентов"),
("Нарушение требований ОТ и ПДД",
"Штрафы, дисциплинарные взыскания, предписания контролирующих органов"),
]
col1_w = 75
col2_w = pdf.w - pdf.l_margin - pdf.r_margin - col1_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, new_x="LMARGIN", new_y="NEXT")
# rows
for i, (risk, consequence) in enumerate(risk_data):
pdf.set_font("DejaVu", "", 8.5)
pdf.set_text_color(*pdf.c["ink"])
if i % 2 == 0:
pdf.set_fill_color(*pdf.c["gray_bg"])
else:
pdf.set_fill_color(*pdf.c["white"])
y0 = pdf.get_y()
# measure multi_cell heights
pdf.set_font("DejaVu", "", 8.5)
# compute height
h1 = pdf._measure_lines(col1_w - 2, 4.5, risk) * 4.5
h2 = pdf._measure_lines(col2_w - 2, 4.5, consequence) * 4.5
h = max(h1, h2, 13)
if pdf.get_y() + h > pdf.h - pdf.b_margin:
pdf.add_page()
y0 = pdf.get_y()
# draw
pdf.set_fill_color(pdf.c["gray_bg"] if i % 2 == 0 else pdf.c["white"])
pdf.rect(pdf.l_margin, y0, col1_w, h, "DF")
pdf.rect(pdf.l_margin + col1_w, y0, col2_w, h, "DF")
pdf.set_xy(pdf.l_margin + 1, y0 + 1)
pdf.set_text_color(*pdf.c["ink"])
pdf.set_font("DejaVu", "B", 8.5)
pdf.multi_cell(col1_w - 2, 4.5, risk)
pdf.set_xy(pdf.l_margin + col1_w + 1, y0 + 1)
pdf.set_font("DejaVu", "", 8.5)
pdf.multi_cell(col2_w - 2, 4.5, consequence)
pdf.set_y(y0 + h)
pdf.ln(4)
# ══ 5. КАТЕГОРИЧЕСКИЕ ТРЕБОВАНИЯ ══
pdf.section_title("5. Категорические требования для всех категорий")
pdf.callout_box(
"ЗАПРЕЩЕНО: оставлять ключи в замке зажигания ТС при любых обстоятельствах:\n"
" \u2022 при кратковременной остановке (заправка, погрузка/разгрузка)\n"
" \u2022 при стоянке на охраняемой территории организации\n"
" \u2022 при постановке ТС в гараж / бокс\n"
" \u2022 при прогреве двигателя без присутствия водителя в кабине\n"
" \u2022 при передаче ТС другому лицу без оформления путевой документации",
pdf.c["red"], (255, 240, 240),
)
pdf.callout_box(
"ОБЯЗАНОСТЬ: при покидании транспортного средства водитель обязан:\n"
" \u2022 заглушить двигатель\n"
" \u2022 извлечь ключ из замка зажигания\n"
" \u2022 убрать ключ в надёжное место (карман одежды, сумку)\n"
" \u2022 убедиться, что ТС обездвижено (стояночный тормоз, передача)\n"
" \u2022 закрыть двери кабины/салона на замок",
pdf.c["amber"], (255, 248, 225),
)
# ══ 6. ТРЕБОВАНИЯ ПО КАТЕГОРИЯМ ══
pdf.section_title("6. Требования по категориям")
pdf.sub_title("6.1 Водители (штатные)")
for item in [
"Ключи от закреплённого ТС хранятся только у водителя, которому выданы под подпись.",
"При возвращении на базу — сдать ключи диспетчеру / ответственному лицу под роспись в журнале.",
"Запрещена передача ключей третьим лицам (включая коллег) без разрешения ответственного лица.",
"При обнаружении ключей, оставленных в замке зажигания другого ТС — немедленно сообщить диспетчеру и изъять ключи.",
]:
pdf.bullet(item)
pdf.sub_title("6.2 Водители-совместители")
for item in [
"Ключи от ТС получать у ответственного лица на конкретный рейс/задание под роспись.",
"По возвращении сдать ключи немедленно, не оставляя их в кабине.",
"Запрещено брать ТС без оформленного путевого листа и отметки механика о допуске.",
"Запрещено хранить дубликаты ключей от ТС в личных вещах без согласования с ответственным лицом.",
]:
pdf.bullet(item)
pdf.sub_title("6.3 Ответственные лица (диспетчеры, механики, начальники колонн)")
for item in [
"Вести журнал выдачи-возврата ключей от ТС с подписями водителей и отметками времени.",
"Ежедневно проверять наличие ключей в месте хранения (запираемый ящик / сейф).",
"Контролировать, что выпуск ТС осуществляется только при наличии путевого листа и отметки о медосмотре.",
"Незамедлительно докладывать руководству о фактах оставления ключей в замке зажигания.",
"Обеспечить хранение резервных (дублирующих) ключей в опечатанном виде с записью в журнале.",
"Проводить внезапные проверки стоянки ТС на предмет наличия ключей в замке зажигания.",
]:
pdf.bullet(item)
# ══ 7. ПОРЯДОК ХРАНЕНИЯ И УЧЁТА КЛЮЧЕЙ ══
pdf.section_title("7. Порядок хранения и учёта ключей от ТС")
table_data = [
("Операция", "Действие", "Документ", "Ответственный"),
("Выдача ключей перед рейсом", "Выдать водителю лично под роспись", "Журнал выдачи ключей", "Диспетчер"),
("Возврат ключей после рейса", "Принять, проверить, сделать запись", "Журнал выдачи ключей", "Диспетчер"),
("Хранение в нерабочее время", "Запираемый шкаф / сейф в диспетчерской", "", "Диспетчер / охрана"),
("Дубликаты ключей", "Опечатанный пенал с биркой (номер ТС)", "Опечатанный пенал", "Руководитель транспортного отдела"),
("Утеря / поломка ключа", "Акт + выдача дубликата + замена замка", "Акт об утере", "Комиссия (не менее 2 чел.)"),
]
cols = [45, 55, 42, 52]
col_total = sum(cols)
cw = []
avail = pdf.w - pdf.l_margin - pdf.r_margin
for c in cols:
cw.append(avail * c / col_total)
for ri, row in enumerate(table_data):
if pdf.get_y() > pdf.h - 20:
pdf.add_page()
for ci, cell in enumerate(row):
if ri == 0:
pdf.set_fill_color(*pdf.c["ink"])
pdf.set_text_color(*pdf.c["white"])
pdf.set_font("DejaVu", "B", 7.5)
else:
pdf.set_fill_color(pdf.c["gray_bg"] if ri % 2 == 0 else pdf.c["white"])
pdf.set_text_color(*pdf.c["ink"])
pdf.set_font("DejaVu", "", 7.5)
pdf.cell(cw[ci], 7, " " + cell, border=1, fill=True)
pdf.ln()
pdf.ln(4)
# ══ 8. ОТВЕТСТВЕННОСТЬ ══
pdf.section_title("8. Ответственность за нарушения")
resp_data = [
("Первичное оставление ключей (без последствий)",
"Дисциплинарное взыскание (замечание / выговор) + внеочередной инструктаж"),
("Повторное оставление ключей",
"Строгий выговор + лишение премии"),
("Систематические нарушения (3 и более)",
"Отстранение от управления ТС, расторжение трудового договора"),
("Оставление ключей, повлёкшее угон / ДТП",
"Материальная ответственность в полном объёме ущерба + передача материалов в правоохранительные органы"),
("Сокрытие факта оставления ключей",
"Увольнение + материальная ответственность"),
]
col1_w_r = 80
col2_w_r = pdf.w - pdf.l_margin - pdf.r_margin - col1_w_r
# 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_r, 7, " Нарушение", border=1, fill=True)
pdf.cell(col2_w_r, 7, " Мера ответственности", border=1, fill=True, new_x="LMARGIN", new_y="NEXT")
for i, (violation, measure) in enumerate(resp_data):
if pdf.get_y() > pdf.h - 20:
pdf.add_page()
# compute height
pdf.set_font("DejaVu", "", 8.5)
h1 = pdf._measure_lines(col1_w_r - 2, 4.5, violation) * 4.5
h2 = pdf._measure_lines(col2_w_r - 2, 4.5, measure) * 4.5
h = max(h1, h2, 13)
y0 = pdf.get_y()
if y0 + h > pdf.h - pdf.b_margin:
pdf.add_page()
y0 = pdf.get_y()
pdf.set_fill_color(pdf.c["gray_bg"] if i % 2 == 0 else pdf.c["white"])
pdf.rect(pdf.l_margin, y0, col1_w_r, h, "DF")
pdf.rect(pdf.l_margin + col1_w_r, y0, col2_w_r, h, "DF")
pdf.set_xy(pdf.l_margin + 1, y0 + 1)
pdf.set_font("DejaVu", "B", 8.5)
pdf.set_text_color(*pdf.c["ink"])
pdf.multi_cell(col1_w_r - 2, 4.5, violation)
pdf.set_xy(pdf.l_margin + col1_w_r + 1, y0 + 1)
pdf.set_font("DejaVu", "", 8.5)
pdf.multi_cell(col2_w_r - 2, 4.5, measure)
pdf.set_y(y0 + h)
pdf.ln(4)
# ══ 9. ЛИСТ ОЗНАКОМЛЕНИЯ ══
pdf.section_title("9. Лист ознакомления с инструктажом")
pdf.body_text(
"Своей подписью подтверждаю, что с содержанием внепланового инструктажа ознакомлен(а), "
"требования и меру ответственности осознаю, обязуюсь выполнять."
)
pdf.ln(4)
# Таблица подписей
sig_header = ["Фамилия И.О.", "Должность / Категория", "Подпись и дата"]
sig_w = [55, 75, (pdf.w - pdf.l_margin - pdf.r_margin - 130)] # dynamic
# header
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()

560
index.html Normal file
View File

@ -0,0 +1,560 @@
<!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;
}
* { 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: var(--ink);
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(--red);
color: #fff;
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: #9aa3b2;
max-width: 700px;
}
header .meta {
margin-top: 20px;
font-size: 14px;
color: #7a8390;
}
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;
color: var(--ink);
}
.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);
}
/* ── 3-column 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); }
/* ── 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>
Настоящий внеплановый инструктаж проводится в связи с необходимостью усиления мер
по обеспечению безопасности дорожного движения и сохранности имущества организации.
</p>
<div class="callout danger">
<strong>Повод:</strong> выявленные случаи / риск оставления ключей в замке зажигания
транспортных средств (ТС), что создаёт свободный доступ посторонних лиц к управлению
ТС, угон, а также использование ТС не по назначению.
</div>
<p>
<strong>Цель:</strong> довести до всех категорий водителей и ответственных лиц
категорические требования по исключению практики оставления ключей в замке зажигания
и обеспечению контроля доступа к транспортным средствам.
</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>Кодекс РК об административных правонарушениях от 5&nbsp;июля 2014&nbsp;г. №&nbsp;235-V&nbsp;ЗРК</li>
<li>Трудовой кодекс РК от 23 ноября 2015&nbsp;г. №&nbsp;414-V&nbsp;ЗРК</li>
<li>Правила внутреннего трудового распорядка и должностные инструкции организации</li>
<li>Локальные акты организации по охране труда и безопасности на транспорте</li>
</ul>
</div>
</section>
<!-- ═══════════ 3. КАТЕГОРИИ ЛИЦ ═══════════ -->
<section class="section">
<div class="container">
<h2>3. Категории инструктируемых лиц</h2>
<div class="cards">
<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 class="card">
<div class="emoji">🛡</div>
<h3>Ответственные лица</h3>
<p>Лица, ответственные за выпуск ТС на линию, техническое состояние, хранение ТС и ведение документации.</p>
</div>
</div>
</div>
</section>
<!-- ═══════════ 4. ОПИСАНИЕ ПРОБЛЕМЫ И РИСКОВ ═══════════ -->
<section class="section">
<div class="container">
<h2>4. Описание проблемы и рисков</h2>
<p>
Оставление ключей в замке зажигания транспортного средства <strong>вне зависимости от места нахождения
ТС</strong> (на территории организации, стоянке, в гараже, на линии) создаёт следующие угрозы:
</p>
<div class="table-wrap">
<table>
<thead>
<tr>
<th>Риск</th>
<th>Последствия</th>
</tr>
</thead>
<tbody>
<tr>
<td>Угон ТС посторонними лицами</td>
<td>Материальный ущерб организации, уголовная ответственность, срыв производственных задач</td>
</tr>
<tr>
<td>Использование ТС не по назначению</td>
<td>Расход ГСМ, износ ТС, нарушение трудовой дисциплины</td>
</tr>
<tr>
<td>ДТП, совершённое лицом без допуска</td>
<td>Ущерб жизни и здоровью третьих лиц, гражданская и уголовная ответственность</td>
</tr>
<tr>
<td>Хищение груза / имущества из ТС</td>
<td>Прямые финансовые потери, утрата доверия контрагентов</td>
</tr>
<tr>
<td>Нарушение требований ОТ и ПДД</td>
<td>Штрафы, дисциплинарные взыскания, предписания контролирующих органов</td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
<!-- ═══════════ 5. КАТЕГОРИЧЕСКИЕ ТРЕБОВАНИЯ ═══════════ -->
<section class="section">
<div class="container">
<h2>5. Категорические требования для всех категорий</h2>
<div class="callout danger">
<strong>ЗАПРЕЩЕНО:</strong> оставлять ключи в замке зажигания ТС при любых обстоятельствах, в том числе:
<ul class="rules danger" style="margin-top:8px;">
<li>при кратковременной остановке (заправка, погрузка/разгрузка, оформление документов)</li>
<li>при стоянке на охраняемой территории организации</li>
<li>при постановке ТС в гараж / бокс</li>
<li>при прогреве двигателя без присутствия водителя в кабине</li>
<li>при передаче ТС другому лицу без оформления путевой документации</li>
</ul>
</div>
<div class="callout warn">
<strong>ОБЯЗАНОСТЬ:</strong> при покидании транспортного средства водитель обязан:
<ul class="rules warn" style="margin-top:8px;">
<li>заглушить двигатель</li>
<li>извлечь ключ из замка зажигания</li>
<li>убрать ключ в надёжное место (карман одежды, сумку — исключая оставление в кабине)</li>
<li>убедиться, что ТС обездвижено (стояночный тормоз, передача)</li>
<li>закрыть двери кабины/салона на замок</li>
</ul>
</div>
</div>
</section>
<!-- ═══════════ 6. РАЗДЕЛЫ ПО КАТЕГОРИЯМ ═══════════ -->
<section class="section">
<div class="container">
<h2>6. Требования по категориям</h2>
<h3>6.1 Водители (штатные)</h3>
<ul class="rules check">
<li>Ключи от закреплённого ТС хранятся <strong>только у водителя</strong>, которому выданы под подпись.</li>
<li>При возвращении на базу — сдать ключи диспетчеру / ответственному лицу под роспись в журнале.</li>
<li>Запрещена передача ключей третьим лицам (включая коллег) без разрешения ответственного лица.</li>
<li>При обнаружении ключей, оставленных в замке зажигания другого ТС — немедленно сообщить диспетчеру и изъять ключи.</li>
</ul>
<h3>6.2 Водители-совместители</h3>
<ul class="rules check">
<li>Ключи от ТС получать у ответственного лица <strong>на конкретный рейс/задание</strong> под роспись.</li>
<li>По возвращении сдать ключи немедленно, не оставляя их в кабине.</li>
<li>Запрещено брать ТС без оформленного путевого листа и отметки механика о допуске.</li>
<li>Запрещено хранить дубликаты ключей от ТС в личных вещах без согласования с ответственным лицом.</li>
</ul>
<h3>6.3 Ответственные лица (диспетчеры, механики, начальники колонн)</h3>
<ul class="rules check">
<li>Вести <strong>журнал выдачи-возврата ключей</strong> от ТС с подписями водителей и отметками времени.</li>
<li>Ежедневно проверять наличие ключей в месте хранения (запираемый ящик / сейф).</li>
<li>Контролировать, что выпуск ТС осуществляется только при наличии путевого листа и отметки о медосмотре.</li>
<li>Незамедлительно докладывать руководству о фактах оставления ключей в замке зажигания.</li>
<li>Обеспечить хранение резервных (дублирующих) ключей в опечатанном виде с записью в журнале.</li>
<li>Проводить внезапные проверки стоянки ТС на предмет наличия ключей в замке зажигания.</li>
</ul>
</div>
</section>
<!-- ═══════════ 7. ПОРЯДОК ХРАНЕНИЯ КЛЮЧЕЙ ═══════════ -->
<section class="section">
<div class="container">
<h2>7. Порядок хранения и учёта ключей от ТС</h2>
<div class="table-wrap">
<table>
<thead>
<tr>
<th>Операция</th>
<th>Действие</th>
<th>Документ</th>
<th>Ответственный</th>
</tr>
</thead>
<tbody>
<tr>
<td>Выдача ключей перед рейсом</td>
<td>Выдать водителю лично под роспись</td>
<td>Журнал выдачи ключей</td>
<td>Диспетчер</td>
</tr>
<tr>
<td>Возврат ключей после рейса</td>
<td>Принять, проверить соответствие, сделать запись</td>
<td>Журнал выдачи ключей</td>
<td>Диспетчер</td>
</tr>
<tr>
<td>Хранение в нерабочее время</td>
<td>Запираемый шкаф / сейф в диспетчерской</td>
<td></td>
<td>Диспетчер / охрана</td>
</tr>
<tr>
<td>Дубликаты ключей</td>
<td>Опечатанный пенал с биркой (номер ТС)</td>
<td>Опечатанный пенал</td>
<td>Руководитель транспортного отдела</td>
</tr>
<tr>
<td>Утеря / поломка ключа</td>
<td>Акт + выдача дубликата + замена замка (при необходимости)</td>
<td>Акт об утере</td>
<td>Комиссия (не менее 2 чел.)</td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
<!-- ═══════════ 8. ОТВЕТСТВЕННОСТЬ ═══════════ -->
<section class="section">
<div class="container">
<h2>8. Ответственность за нарушения</h2>
<div class="callout danger">
<strong>За оставление ключей в замке зажигания / свободный доступ к управлению ТС применяются:</strong>
</div>
<div class="table-wrap">
<table>
<thead>
<tr>
<th>Нарушение</th>
<th>Мера ответственности</th>
</tr>
</thead>
<tbody>
<tr>
<td>Первичное оставление ключей (без последствий)</td>
<td>Дисциплинарное взыскание (замечание / выговор) + внеочередной инструктаж</td>
</tr>
<tr>
<td>Повторное оставление ключей</td>
<td>Строгий выговор + лишение премии</td>
</tr>
<tr>
<td>Систематические нарушения (3 и более)</td>
<td>Отстранение от управления ТС, расторжение трудового договора</td>
</tr>
<tr>
<td>Оставление ключей, повлёкшее угон / ДТП</td>
<td>Материальная ответственность в полном объёме ущерба + передача материалов в правоохранительные органы</td>
</tr>
<tr>
<td>Сокрытие факта оставления ключей</td>
<td>Увольнение + материальная ответственность</td>
</tr>
</tbody>
</table>
</div>
</div>
</section>
<!-- ═══════════ 9. ЛИСТ ОЗНАКОМЛЕНИЯ ═══════════ -->
<section class="section">
<div class="container">
<h2>9. Лист ознакомления с инструктажом</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>
<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(--cyan);color:var(--ink);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>