Compare commits

...

6 Commits
main ... pages

3 changed files with 768 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 юзера `samruk_1`. Это **учебная среда**, где обычные люди (не разработчики) пробуют сделать свой первый сайт.
---
## 🎯 ТВОЯ РОЛЬ
Ты — **гид и помощник**, а не слепой исполнитель. Цель сессии — чтобы юзер вышел с:
1. **рабочим лендингом**, опубликованным по адресу `https://pages.git.vibe42.kz/samruk_1/<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/samruk_1/<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 (`/srv/opencode/workspaces/users/samruk_1`)** — это папка-контейнер юзера, не репозиторий.
---
## ✅ ВСЕГДА работай через `./new-project`
Если юзер сказал «сделай сайт NAME» / «создай проект NAME»:
```bash
cd /srv/opencode/workspaces/users/samruk_1
./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/samruk_1
- Pages (живые лендинги): https://pages.git.vibe42.kz/samruk_1/<repo>/
- Креды уже в `/srv/opencode/workspaces/users/samruk_1/.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

485
index.html Normal file
View File

@ -0,0 +1,485 @@
<!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-light: #FFEBEE;
--orange: #F57C00;
--orange-light: #FFF3E0;
--green: #2E7D32;
--green-light: #E8F5E9;
--purple: #7B1FA2;
--purple-light: #F3E5F5;
--teal: #00897B;
--teal-light: #E0F2F1;
--lime: #558B2F;
--lime-light: #F1F8E9;
--pink: #C2185B;
--pink-light: #FCE4EC;
--indigo: #283593;
--indigo-light: #E8EAF6;
--amber: #FF8F00;
--amber-light: #FFF8E1;
--steel: #37474F;
--steel-light: #ECEFF1;
}
* { 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: 0 24px; }
.hero {
background: var(--ink);
color: var(--white);
padding: 90px 0 72px;
}
.hero h1 {
font-size: 44px; font-weight: 800; line-height: 1.15;
margin-bottom: 14px;
}
.hero p {
font-size: 19px; color: #9aa3b2;
max-width: 680px; margin-bottom: 36px;
}
.search-layout { max-width: 720px; }
.search-box {
display: flex; gap: 12px;
background: rgba(255,255,255,0.08);
border: 2px solid rgba(255,255,255,0.15);
border-radius: 12px; padding: 8px;
}
.search-box input {
flex: 1; background: none; border: none;
color: var(--white); font-size: 17px; padding: 12px 16px;
outline: none;
}
.search-box input::placeholder { color: rgba(255,255,255,0.4); }
.search-box button {
background: var(--cyan); color: var(--ink);
border: none; padding: 12px 28px; border-radius: 8px;
font-size: 16px; font-weight: 700; cursor: pointer;
white-space: nowrap;
}
.search-box button:hover { background: #1be5ff; }
.results-section { padding: 48px 0 80px; }
.stats-bar {
display: flex; align-items: center; justify-content: space-between;
margin-bottom: 28px; flex-wrap: wrap; gap: 14px;
}
.stats-bar .count { font-size: 15px; color: var(--gray-500); }
.filters { display: flex; gap: 8px; flex-wrap: wrap; }
.filter-btn {
padding: 6px 16px; border-radius: 20px; border: 1.5px solid var(--gray-100);
background: var(--white); font-size: 14px; cursor: pointer;
transition: all 0.15s; color: var(--gray-500);
}
.filter-btn:hover { border-color: var(--cyan); color: var(--ink); }
.filter-btn.active {
background: var(--ink); color: var(--white); border-color: var(--ink);
}
.filter-btn.code-koap.active { background: #1565C0; border-color: #1565C0; }
.filter-btn.code-uk.active { background: var(--red); border-color: var(--red); }
.filter-btn.code-tk.active { background: var(--orange); border-color: var(--orange); }
.filter-btn.code-nk.active { background: var(--green); border-color: var(--green); }
.filter-btn.code-gk.active { background: var(--purple); border-color: var(--purple); }
.filter-btn.code-zk.active { background: var(--teal); border-color: var(--teal); }
.filter-btn.code-ek.active { background: var(--lime); border-color: var(--lime); }
.filter-btn.code-sk.active { background: var(--pink); border-color: var(--pink); }
.filter-btn.code-zakon.active { background: var(--indigo); border-color: var(--indigo); }
.filter-btn.code-pravila.active { background: var(--amber); border-color: var(--amber); }
.filter-btn.code-prikaz.active { background: var(--steel); border-color: var(--steel); }
.results-grid { display: grid; gap: 16px; }
.violation-card {
border: 1px solid var(--gray-100); border-radius: 14px;
padding: 28px 32px;
transition: box-shadow 0.15s, transform 0.15s;
}
.violation-card:hover {
box-shadow: 0 6px 28px rgba(0,0,0,0.07);
transform: translateY(-1px);
}
.violation-card .card-top {
display: flex; gap: 20px; align-items: flex-start;
margin-bottom: 16px;
}
.violation-card .article-badge {
display: flex; flex-direction: column; align-items: center;
padding: 12px 20px; border-radius: 10px;
font-weight: 800; font-size: 18px; text-align: center; flex-shrink: 0;
min-width: 130px; line-height: 1.3;
}
.article-badge.koap { background: #E3F2FD; color: #1565C0; }
.article-badge.uk { background: var(--red-light); color: var(--red); }
.article-badge.tk { background: var(--orange-light); color: var(--orange); }
.article-badge.nk { background: var(--green-light); color: var(--green); }
.article-badge.gk { background: var(--purple-light); color: var(--purple); }
.article-badge.zk { background: var(--teal-light); color: var(--teal); }
.article-badge.ek { background: var(--lime-light); color: var(--lime); }
.article-badge.sk { background: var(--pink-light); color: var(--pink); }
.article-badge.zakon { background: var(--indigo-light); color: var(--indigo); }
.article-badge.pravila { background: var(--amber-light); color: var(--amber); }
.article-badge.prikaz { background: var(--steel-light); color: var(--steel); }
.article-badge .badge-label {
font-size: 11px; font-weight: 600; text-transform: uppercase;
}
.article-badge .badge-article { margin-top: 2px; }
.violation-card .card-info h3 {
font-size: 20px; font-weight: 700; margin-bottom: 6px;
}
.violation-card .card-info .verdict {
color: var(--red); font-size: 14px; font-weight: 700; text-transform: uppercase;
letter-spacing: 0.5px; margin-bottom: 6px;
}
.violation-card .card-info .desc {
font-size: 15px; color: var(--gray-500); line-height: 1.6;
}
.violation-card .card-footer {
display: flex; flex-wrap: wrap; gap: 14px; align-items: center;
padding-top: 14px; border-top: 1px solid var(--gray-100);
font-size: 14px;
}
.violation-card .penalty {
flex: 1; min-width: 200px; color: var(--gray-500);
}
.penalty strong { color: var(--ink); }
.doc-link {
display: inline-flex; align-items: center; gap: 5px;
padding: 8px 16px; border-radius: 8px;
background: var(--cyan-50); color: #00838F;
font-weight: 700; font-size: 13px; text-decoration: none;
white-space: nowrap;
}
.doc-link:hover { background: #cdf5fa; }
.empty-state {
text-align: center; padding: 80px 20px; color: var(--gray-500);
}
.empty-state .emoji { font-size: 48px; margin-bottom: 16px; }
.empty-state h3 { font-size: 20px; color: var(--ink); margin-bottom: 8px; }
footer {
text-align: center; padding: 40px 24px;
color: var(--gray-500); font-size: 14px;
border-top: 1px solid var(--gray-100);
}
footer a { color: var(--cyan); text-decoration: none; }
@media (max-width: 640px) {
.hero { padding: 60px 0 40px; }
.hero h1 { font-size: 28px; }
.hero p { font-size: 16px; }
.search-box { flex-direction: column; gap: 8px; }
.search-box button { width: 100%; }
.violation-card { padding: 20px; }
.violation-card .card-top { flex-direction: column; gap: 12px; }
.violation-card .article-badge { flex-direction: row; gap: 8px; min-width: auto; padding: 10px 16px; font-size: 15px; }
.violation-card .article-badge .badge-label { font-size: 11px; }
.violation-card .card-footer { flex-direction: column; align-items: stretch; }
.doc-link { justify-content: center; }
}
</style>
</head>
<body>
<section class="hero">
<div class="container">
<h1>&#x2696;&#xFE0F; Квалификация нарушений по законодательству РК</h1>
<p>Введите фабулу нарушения — опишите ситуацию своими словами. Приложение определит, <strong>какой пункт какого НПА</strong> нарушен.</p>
<div class="search-layout">
<div class="search-box">
<input type="text" id="search" placeholder="Например: ночью соседи громко слушают музыку и мешают спать..." autofocus>
<button onclick="search()">Определить</button>
</div>
</div>
</div>
</section>
<section class="results-section">
<div class="container">
<div class="stats-bar">
<span class="count" id="stats">Всего: 80 составов нарушений</span>
<div class="filters" id="filters">
<button class="filter-btn active" data-code="all" onclick="setFilter('all',this)">Все</button>
<button class="filter-btn code-koap" data-code="koap" onclick="setFilter('koap',this)">КоАП</button>
<button class="filter-btn code-uk" data-code="uk" onclick="setFilter('uk',this)">УК</button>
<button class="filter-btn code-tk" data-code="tk" onclick="setFilter('tk',this)">ТК</button>
<button class="filter-btn code-nk" data-code="nk" onclick="setFilter('nk',this)">НК</button>
<button class="filter-btn code-gk" data-code="gk" onclick="setFilter('gk',this)">ГК</button>
<button class="filter-btn code-zk" data-code="zk" onclick="setFilter('zk',this)">ЗК</button>
<button class="filter-btn code-ek" data-code="ek" onclick="setFilter('ek',this)">ЭкоК</button>
<button class="filter-btn code-sk" data-code="sk" onclick="setFilter('sk',this)">СК</button>
<button class="filter-btn code-zakon" data-code="zakon" onclick="setFilter('zakon',this)">Законы</button>
<button class="filter-btn code-pravila" data-code="pravila" onclick="setFilter('pravila',this)">Правила</button>
<button class="filter-btn code-prikaz" data-code="prikaz" onclick="setFilter('prikaz',this)">Приказы</button>
</div>
</div>
<div class="results-grid" id="results"></div>
<div class="empty-state" id="empty" style="display:none">
<div class="emoji">&#x1F50D;</div>
<h3>Ничего не найдено</h3>
<p>Попробуйте описать ситуацию другими словами.</p>
</div>
</div>
</section>
<footer>
<div class="container">
Справочник носит ознакомительный характер. Полные тексты НПА — <a href="https://adilet.zan.kz" target="_blank">adilet.zan.kz</a>
</div>
</footer>
<script>
const CODE_DOC = {
koap: "https://adilet.zan.kz/rus/docs/K1400000235",
uk: "https://adilet.zan.kz/rus/docs/K1400000226",
tk: "https://adilet.zan.kz/rus/docs/K1500000414",
nk: "https://adilet.zan.kz/rus/docs/K1700000120",
gk: "https://adilet.zan.kz/rus/docs/K9400010002",
zk: "https://adilet.zan.kz/rus/docs/K0300000442",
ek: "https://adilet.zan.kz/rus/docs/K2100000400",
sk: "https://adilet.zan.kz/rus/docs/K1100000518",
zakon_potreb: "https://adilet.zan.kz/rus/docs/Z100000274_",
zakon_migr: "https://adilet.zan.kz/rus/docs/Z1100000477",
zakon_pd: "https://adilet.zan.kz/rus/docs/Z1300000094",
zakon_reklama: "https://adilet.zan.kz/rus/docs/Z0300000508",
zakon_goszakup: "https://adilet.zan.kz/rus/docs/Z1500000434",
zakon_antikorr: "https://adilet.zan.kz/rus/docs/Z1500000410",
zakon_info: "https://adilet.zan.kz/rus/docs/Z1500000418",
zakon_yazyk: "https://adilet.zan.kz/rus/docs/Z9700000151",
zakon_prombez: "https://adilet.zan.kz/rus/docs/Z1400000188",
prik_mvd_regts: "https://adilet.zan.kz/rus/docs/V1400009748",
prik_mchs_poj: "https://adilet.zan.kz/rus/docs/V1500011604",
prik_mz_sanpin: "https://adilet.zan.kz/rus/docs/V1500011636",
prik_mt_ohrana: "https://adilet.zan.kz/rus/docs/V1500011373",
prik_msx_fito: "https://adilet.zan.kz/rus/docs/V1500010129",
};
const VIOLATIONS = [
{ id:1, fabula:["человек громко ругается матом в автобусе","на улице мужчина пристаёт к прохожим и матерится","пьяная компания орёт матом на детской площадке"], desc:"Мелкое хулиганство — нецензурная брань в общественных местах, оскорбительное приставание к гражданам", code:"koap", article:"ст. 434", penalty:"Штраф 20 МРП, либо административный арест до 15 суток", docKey:"koap" },
{ id:2, fabula:["соседи делают ремонт в 2 часа ночи","в соседней квартире всю ночь орёт музыка","ночью во дворе громко кричат и не дают спать"], desc:"Нарушение тишины и покоя граждан в ночное время (с 23:00 до 06:00), в выходные и праздничные дни", code:"koap", article:"ст. 437", penalty:"Штраф 10 МРП, при повторном — 20 МРП", docKey:"koap" },
{ id:3, fabula:["компания сидит на лавочке во дворе и пьёт пиво","человек идёт по улице пьяный и шатается","на остановке люди распивают водку"], desc:"Распитие алкоголя в общественных местах, появление в пьяном виде, оскорбляющем достоинство", code:"koap", article:"ст. 440", penalty:"Штраф 5 МРП, при повторном — 10 МРП, либо административный арест до 5 суток", docKey:"koap" },
{ id:4, fabula:["человек курит в подъезде жилого дома","на остановке стоит и курит сигарету","в кафе кто-то начал курить кальян"], desc:"Курение табака, кальяна, вейпов в неположенных местах (подъезды, остановки, детские площадки, транспорт, учреждения)", code:"koap", article:"ст. 441", penalty:"Штраф 3 МРП", docKey:"koap" },
{ id:5, fabula:["водитель ехал по городу 120 км/ч вместо 60","на трассе машина пронеслась на огромной скорости","камера зафиксировала превышение скорости на 40 км/ч"], desc:"Превышение установленной скорости движения транспортного средства", code:"koap", article:"ст. 592", penalty:"Штраф от 10 до 40 МРП, в зависимости от величины превышения", docKey:"koap" },
{ id:6, fabula:["водитель не остановился на красный свет светофора","машина проехала перекрёсток на запрещающий сигнал","проигнорировал красный и поехал дальше"], desc:"Проезд на запрещающий сигнал светофора или жест регулировщика", code:"koap", article:"ст. 599", penalty:"Штраф 10 МРП", docKey:"koap" },
{ id:7, fabula:["человек сел за руль никогда не получав прав","водителя лишили прав а он продолжает ездить","подросток 16 лет управляет машиной без прав"], desc:"Управление ТС лицом, не имеющим права управления, или лишённым такого права", code:"koap", article:"ст. 612", penalty:"Штраф 30 МРП, при повторном — 70 МРП, либо административный арест до 15 суток", docKey:"koap" },
{ id:8, fabula:["человек выпил бутылку водки и сел за руль","остановили пьяного водителя он еле стоял на ногах","вечеринка закончилась человек сел пьяный в машину и поехал"], desc:"Управление ТС в состоянии алкогольного или наркотического опьянения", code:"koap", article:"ст. 608", penalty:"Лишение прав на 3 года, административный арест до 15 суток. При повторном — уголовная ответственность по ст. 346 УК", docKey:"koap" },
{ id:9, fabula:["полицейский попросил документы а человек отказался и начал спорить","остановили на дороге водитель не выполнил требование инспектора","человек отказался пройти в участок по требованию полиции"], desc:"Неповиновение законному требованию сотрудника правоохранительного органа", code:"koap", article:"ст. 667", penalty:"Штраф 10 МРП, либо административный арест до 10 суток", docKey:"koap" },
{ id:10, fabula:["в магазине человек положил товар в карман и вышел не заплатив","посетитель супермаркета украл продукты на небольшую сумму","на кассе самообслуживания не пробил часть товаров"], desc:"Мелкое хищение чужого имущества на сумму до 10 МРП", code:"koap", article:"ст. 187", penalty:"Штраф до 25 МРП, либо административный арест до 15 суток. Свыше 10 МРП — уголовная ответственность по ст. 188 УК", docKey:"koap" },
{ id:11, fabula:["человек едет в автобусе без билета","зашёл в транспорт и не оплатил проезд","контролёр обнаружил безбилетного пассажира"], desc:"Безбилетный проезд в общественном транспорте", code:"koap", article:"ст. 622", penalty:"Штраф 0,5 МРП", docKey:"koap" },
{ id:12, fabula:["на улице человек выбросил фантик мимо урны","во дворе сбросили строительный мусор на газон","из машины выкинули пакет с мусором на обочину"], desc:"Нарушение правил благоустройства, загрязнение общественных мест", code:"koap", article:"ст. 505", penalty:"Штраф 10 МРП", docKey:"koap" },
{ id:13, fabula:["на даче развели огромный костёр в сухую погоду","в парке люди устроили пикник с открытым огнём","сжигание сухой травы на поле без присмотра"], desc:"Нарушение правил пожарной безопасности, разведение костров в неположенных местах", code:"koap", article:"ст. 410", penalty:"Штраф 5-10 МРП", docKey:"koap" },
{ id:14, fabula:["в кафе на кухне грязно тараканы и плесень","посетители отравились едой в ресторане","в столовой просроченные продукты и антисанитария"], desc:"Нарушение санитарно-эпидемиологических норм и правил гигиены", code:"koap", article:"ст. 425", penalty:"Штраф до 200 МРП для юрлиц, до 30 МРП для физлиц", docKey:"koap" },
{ id:15, fabula:["на улице продают вещи без документов и чеков","бабушка торгует овощами на тротуаре без патента","в переходе сидит человек и продаёт товары без регистрации ИП"], desc:"Незаконная предпринимательская деятельность без регистрации и разрешений", code:"koap", article:"ст. 463", penalty:"Штраф 15-50 МРП", docKey:"koap" },
{ id:16, fabula:["на рынке продавец обвесил покупателя на 200 грамм","в магазине на ценнике одна цена а на кассе пробили больше","в баре налили пива 0,4 вместо заказанных 0,5"], desc:"Обман потребителей — обвес, обсчёт, введение в заблуждение о потребительских свойствах товара", code:"koap", article:"ст. 190", penalty:"Штраф 10-50 МРП", docKey:"koap" },
{ id:17, fabula:["в общественном месте один человек нецензурно оскорбил другого","в соцсетях написали гадости унижающие достоинство человека","на работе начальник публично унизил подчинённого"], desc:"Оскорбление — унижение чести и достоинства другого лица в неприличной форме", code:"koap", article:"ст. 131", penalty:"Штраф 20 МРП", docKey:"koap" },
{ id:18, fabula:["коллега распустил ложные слухи что кто-то ворует деньги","человек в соцсетях написал неправду позорящую соседа","журналист опубликовал ложную статью порочащую репутацию бизнесмена"], desc:"Клевета — распространение заведомо ложных сведений, порочащих честь и достоинство", code:"uk", article:"ст. 130", penalty:"Штраф до 500 МРП, исправительные работы, либо ограничение свободы до 1 года", docKey:"uk" },
{ id:19, fabula:["два человека подрались на улице нанося друг другу удары","мужчина ударил соседа кулаком по лицу в ссоре","в баре завязалась потасовка с рукоприкладством"], desc:"Побои — нанесение побоев, не повлёкших причинения лёгкого вреда здоровью", code:"koap", article:"ст. 73-1", penalty:"Штраф 10 МРП, либо административный арест до 10 суток", docKey:"koap" },
{ id:20, fabula:["сосед сверху залил квартиру и отказывается возмещать ущерб","жилец снёс несущую стену в квартире без разрешения","человек проживает в квартире без регистрации по месту жительства"], desc:"Нарушение правил пользования жилыми помещениями, самовольная перепланировка", code:"koap", article:"ст. 506", penalty:"Штраф 10-50 МРП", docKey:"koap" },
{ id:21, fabula:["из квартиры тайно вынесли ценные вещи пока хозяев не было","в магазине из сумки покупателя вытащили кошелёк","ночью со склада украли товар на крупную сумму"], desc:"Кража — тайное хищение чужого имущества", code:"uk", article:"ст. 188", penalty:"Штраф до 2000 МРП, исправительные работы, ограничение свободы, либо лишение свободы до 12 лет", docKey:"uk" },
{ id:22, fabula:["на улице вырвали сумку из рук и убежали","сорвали золотую цепочку с шеи прохожего среди бела дня","человек открыто отобрал телефон у другого на глазах у свидетелей"], desc:"Грабёж — открытое хищение чужого имущества", code:"uk", article:"ст. 191", penalty:"Штраф до 3000 МРП, исправительные работы, ограничение свободы, либо лишение свободы до 12 лет", docKey:"uk" },
{ id:23, fabula:["в тёмном переулке напали с ножом и потребовали деньги","преступник угрожая пистолетом потребовал отдать телефон и кошелёк","группа людей ворвалась в квартиру с битами и забрали ценности"], desc:"Разбой — нападение с целью хищения с насилием либо угрозой насилия", code:"uk", article:"ст. 192", penalty:"Лишение свободы от 3 до 15 лет с конфискацией имущества", docKey:"uk" },
{ id:24, fabula:["человек взял деньги в долг и скрылся не собираясь возвращать","продали несуществующий товар через интернет взяли предоплату и пропали","финансовая пирамида собрала деньги с людей и рухнула"], desc:"Мошенничество — хищение путём обмана или злоупотребления доверием", code:"uk", article:"ст. 190", penalty:"Штраф до 4000 МРП, исправительные работы, ограничение свободы, либо лишение свободы до 10 лет", docKey:"uk" },
{ id:25, fabula:["группа подростков избила прохожего и разбила витрину магазина","пьяный дебошир в кафе крушил мебель угрожал посетителям","на стадионе фанаты устроили массовую драку с битами"], desc:"Хулиганство — особо дерзкое нарушение общественного порядка с насилием, угрозой, уничтожением имущества", code:"uk", article:"ст. 293", penalty:"Штраф до 2000 МРП, исправительные работы, ограничение свободы, либо лишение свободы до 7 лет", docKey:"uk" },
{ id:26, fabula:["в ходе бытовой ссоры мужчина нанёс смертельный удар ножом","произошло умышленное убийство из ревности","убийство совершено из корыстных побуждений"], desc:"Убийство — противоправное умышленное причинение смерти другому человеку", code:"uk", article:"ст. 99", penalty:"Лишение свободы от 6 до 20 лет, либо пожизненное лишение свободы", docKey:"uk" },
{ id:27, fabula:["в драке человеку сломали руку в двух местах и он попал в больницу","после избиения пострадавший потерял зрение на один глаз","нанесли несколько ножевых ранений потерпевший в реанимации"], desc:"Умышленное причинение тяжкого вреда здоровью — опасного для жизни", code:"uk", article:"ст. 106", penalty:"Ограничение свободы, либо лишение свободы от 3 до 12 лет", docKey:"uk" },
{ id:28, fabula:["совершено изнасилование девушки в безлюдном месте","надругательство над беспомощным человеком","сексуальное насилие с угрозами"], desc:"Изнасилование — половое сношение с применением насилия, угрозы или беспомощного состояния", code:"uk", article:"ст. 120", penalty:"Лишение свободы от 5 до 20 лет, либо пожизненно", docKey:"uk" },
{ id:29, fabula:["бизнесмену угрожают расправой если он не заплатит крупную сумму","у человека требуют деньги угрожая сжечь его машину","группировка требует ежемесячную плату за крышу"], desc:"Вымогательство — требование передачи имущества под угрозой насилия или уничтожения имущества", code:"uk", article:"ст. 194", penalty:"Ограничение свободы, либо лишение свободы до 15 лет с конфискацией", docKey:"uk" },
{ id:30, fabula:["бухгалтер фирмы перевела деньги компании на свой счёт","менеджер присвоил себе деньги выданные на закупку оборудования","кассир брала деньги из кассы и тратила на свои нужды"], desc:"Присвоение или растрата — хищение чужого имущества, вверенного виновному", code:"uk", article:"ст. 189", penalty:"Штраф до 3000 МРП, исправительные работы, ограничение свободы, либо лишение свободы до 12 лет", docKey:"uk" },
{ id:31, fabula:["предприниматель передал конверт с деньгами чиновнику за ускорение выдачи разрешения","студент дал взятку преподавателю за зачёт","компания перечислила откат менеджеру за подписание контракта"], desc:"Дача взятки — незаконная передача денег или услуг должностному лицу", code:"uk", article:"ст. 367", penalty:"Штраф до 60-кратной суммы взятки, исправительные работы, либо лишение свободы до 15 лет с конфискацией", docKey:"uk" },
{ id:32, fabula:["аким получил деньги за выделение земельного участка","инспектор требовал деньги чтобы не составлять протокол","чиновник систематически получал вознаграждения за принятие решений"], desc:"Получение взятки — незаконное получение должностным лицом денег или услуг", code:"uk", article:"ст. 366", penalty:"Штраф до 80-кратной суммы взятки, либо лишение свободы до 15 лет с конфискацией и пожизненным лишением права занимать должности", docKey:"uk" },
{ id:33, fabula:["начальник районного отдела выдал разрешение на строительство с нарушениями ради выгоды","чиновник принял решение в пользу родственника в обход закона","должностное лицо подписало незаконный акт используя служебное положение"], desc:"Злоупотребление должностными полномочиями — использование положения вопреки интересам службы", code:"uk", article:"ст. 361", penalty:"Штраф до 5000 МРП, исправительные работы, ограничение свободы, либо лишение свободы до 8 лет", docKey:"uk" },
{ id:34, fabula:["угнали припаркованную во дворе машину чтобы покататься и бросить","подросток взял без спроса чужую машину ключи от которой нашёл","автомобиль угнали с парковки супермаркета"], desc:"Неправомерное завладение автомобилем без цели хищения (угон)", code:"uk", article:"ст. 200", penalty:"Штраф до 500 МРП, исправительные работы, ограничение свободы, либо лишение свободы до 12 лет", docKey:"uk" },
{ id:35, fabula:["у человека нашли пакетик с марихуаной для личного употребления","в кармане обнаружили несколько грамм запрещённого вещества","дома хранились наркотики для собственного использования"], desc:"Незаконное хранение наркотиков без цели сбыта", code:"uk", article:"ст. 296", penalty:"Штраф до 5000 МРП, исправительные работы, ограничение свободы, либо лишение свободы до 15 лет", docKey:"uk" },
{ id:36, fabula:["человек продаёт наркотики через интернет и раскладывает закладки","задержали группу лиц занимающихся сбытом героина","организовали канал поставки синтетических наркотиков из-за границы"], desc:"Незаконный сбыт наркотических средств и психотропных веществ", code:"uk", article:"ст. 297", penalty:"Лишение свободы от 5 до 20 лет, либо пожизненно с конфискацией", docKey:"uk" },
{ id:37, fabula:["человек работает в кафе уже месяц а трудовой договор не оформили","работодатель не заключил договор с новым сотрудником","сотрудники работают без оформления и получают зарплату в конверте"], desc:"Допуск работника к работе без заключения трудового договора", code:"tk", article:"ст. 90 КоАП", penalty:"Штраф 30-100 МРП", docKey:"tk" },
{ id:38, fabula:["работодатель уже два месяца не выплачивает зарплату сотрудникам","задерживают заработную плату без объяснения причин","людям не платят зарплату ссылаясь на отсутствие денег"], desc:"Невыплата заработной платы в полном объёме и в установленные сроки", code:"tk", article:"ст. 113 ТК РК", penalty:"Штраф до 200 МРП для работодателя, пеня за каждый день просрочки", docKey:"tk" },
{ id:39, fabula:["сотрудника уволили без объяснения причин без приказа и уведомления","человека сократили без предупреждения за два месяца","беременную женщину уволили узнав о её положении"], desc:"Незаконное увольнение работника или нарушение процедуры расторжения трудового договора", code:"tk", article:"ст. 52, 56 ТК РК", penalty:"Восстановление на работе, компенсация за вынужденный прогул, возмещение морального вреда", docKey:"tk" },
{ id:40, fabula:["работник не был в отпуске уже два года подряд","начальник отказывается подписывать заявление на отпуск","компания не предоставляет ежегодный оплачиваемый отпуск"], desc:"Непредоставление ежегодного оплачиваемого трудового отпуска в течение двух лет подряд", code:"tk", article:"ст. 87, 92 ТК РК", penalty:"Штраф до 100 МРП для работодателя", docKey:"tk" },
{ id:41, fabula:["сотрудники работают по 12 часов каждый день без доплаты","начальник заставляет выходить в выходные без оплаты","люди перерабатывают по 3-4 часа ежедневно сверх нормы но не получают за это"], desc:"Привлечение к сверхурочной работе без согласия работника либо без соответствующей оплаты", code:"tk", article:"ст. 77, 78 ТК РК", penalty:"Штраф до 100 МРП, предписание устранить нарушение с доплатой", docKey:"tk" },
{ id:42, fabula:["компания скрывает реальные доходы и не платит налоги в полном объёме","предприниматель занижает обороты чтобы платить меньше налогов","организация уклоняется от уплаты налогов через фирмы-однодневки"], desc:"Уклонение от уплаты налогов и других обязательных платежей в бюджет", code:"nk", article:"ст. 275 КоАП", penalty:"Штраф от 20% до 50% от неуплаченной суммы налога", docKey:"nk" },
{ id:43, fabula:["человек не подал налоговую декларацию до установленного срока","предприниматель просрочил сдачу отчётности в налоговую","компания опоздала с подачей налоговой декларации на месяц"], desc:"Непредставление налоговой отчётности в установленный срок", code:"nk", article:"ст. 272 КоАП", penalty:"Штраф 30-70 МРП, при повторном — до 110 МРП", docKey:"nk" },
{ id:44, fabula:["в магазине покупателю не выдали кассовый чек","продавец на рынке принимает деньги без ККМ","таксист не применяет контрольно-кассовую машину"], desc:"Неприменение контрольно-кассовой машины (ККМ) при денежных расчётах", code:"nk", article:"ст. 284 КоАП", penalty:"Штраф 25-50 МРП, при повторном — до 100 МРП", docKey:"nk" },
{ id:45, fabula:["муж систематически избивает жену дома","в семье постоянно происходят скандалы с рукоприкладством","женщина страдает от домашнего насилия но боится заявить"], desc:"Противоправные действия в сфере семейно-бытовых отношений — насилие, жестокое обращение в семье", code:"koap", article:"ст. 73, 73-1, 73-2", penalty:"Штраф, административный арест до 30 суток, защитное предписание. При систематичности — уголовная ответственность", docKey:"koap" },
{ id:46, fabula:["родители не водят ребёнка в школу","ребёнок постоянно голодный и грязный","дети предоставлены сами себе родители не занимаются воспитанием"], desc:"Неисполнение родительских обязанностей по воспитанию и содержанию несовершеннолетних детей — наказуемо по КоАП", code:"koap", article:"ст. 127, 442", penalty:"Штраф до 200 МРП, лишение родительских прав", docKey:"koap" },
{ id:47, fabula:["остановили машину с наглухо затонированными стёклами","водитель закатал передние боковые стёкла тёмной плёнкой","автомобиль с тонировкой не соответствующей нормам"], desc:"Управление ТС со стёклами, не соответствующими нормам светопропускания (незаконная тонировка)", code:"koap", article:"ст. 590 ч.5", penalty:"Штраф 10 МРП, предписание устранить в течение суток", docKey:"koap" },
{ id:48, fabula:["водитель и пассажиры едут не пристёгнутыми","ребёнка перевозят без автокресла","пассажир на заднем сиденье не пристегнул ремень"], desc:"Управление ТС либо перевозка пассажиров без использования ремней безопасности", code:"koap", article:"ст. 593 ч.1", penalty:"Штраф 3 МРП", docKey:"koap" },
{ id:49, fabula:["водитель разговаривает по телефону держа его в руке во время движения","человек за рулём пишет смс не останавливая машину","водитель смотрит видео на телефоне во время езды"], desc:"Использование телефона во время управления ТС без устройства hands-free", code:"koap", article:"ст. 591", penalty:"Штраф 5 МРП", docKey:"koap" },
{ id:50, fabula:["браконьеры вырубили несколько сосен в заповеднике","охотник без лицензии застрелил сайгака","рыбаки ловят рыбу сетями в запрещённый период"], desc:"Незаконная порубка деревьев и кустарников, незаконная охота, рыболовство без разрешения", code:"koap", article:"ст. 381, 382, 383", penalty:"Штраф до 500 МРП с конфискацией орудий, возмещение ущерба", docKey:"koap" },
{ id:51, fabula:["подрядчик сорвал сроки строительства и не отвечает на претензии","компания подписала договор но не выполнила обязательства","заказчик заплатил а товар так и не привезли"], desc:"Неисполнение или ненадлежащее исполнение договорных обязательств", code:"gk", article:"ст. 293 ГК РК", penalty:"Возмещение убытков, уплата неустойки, расторжение договора в судебном порядке", docKey:"gk" },
{ id:52, fabula:["человек построил дом на участке не имея разрешительных документов","сосед пристроил второй этаж к дому без согласования","на даче возвели капитальный гараж без уведомления архитектуры"], desc:"Самовольная постройка — строительство без разрешительных документов", code:"gk", article:"ст. 244 ГК РК", penalty:"Снос за свой счёт, либо признание права собственности через суд", docKey:"gk" },
{ id:53, fabula:["компания скопировала дизайн сайта конкурента и использует без разрешения","опубликовали чужую книгу в интернете без согласия автора","используют музыку в рекламе не заплатив правообладателю"], desc:"Нарушение авторских и смежных прав — незаконное использование, копирование произведений", code:"gk", article:"ст. 964-970 ГК РК", penalty:"Возмещение убытков, выплата компенсации до 50 000 МРП, конфискация контрафакта", docKey:"gk" },
{ id:54, fabula:["подписали договор купли-продажи квартиры под угрозой","сделку признали фиктивной так как денег реально не передавали","человека обманом заставили подписать дарственную"], desc:"Признание сделки недействительной — мнимая, притворная, под влиянием обмана или угрозы", code:"gk", article:"ст. 157-160 ГК РК", penalty:"Двусторонняя реституция, возмещение убытков, взыскание полученного в доход государства", docKey:"gk" },
{ id:55, fabula:["родственники скрыли от одного из наследников факт смерти наследодателя","наследника не пускают в квартиру где остались вещи покойного","пропущен срок вступления в наследство по уважительной причине"], desc:"Нарушение наследственных прав — воспрепятствование вступлению в наследство", code:"gk", article:"ст. 1038-1083 ГК РК", penalty:"Восстановление срока для принятия наследства через суд, перераспределение долей", docKey:"gk" },
{ id:56, fabula:["сосед передвинул забор на метр захватив часть чужого участка","человек занял пустующий участок земли и начал там строиться","незаконно огородили кусок поля под парковку"], desc:"Самовольный захват земельного участка — занятие земли без правоустанавливающих документов", code:"zk", article:"ст. 43-1, 164 ЗК РК", penalty:"Возврат участка собственнику, снос построек за свой счёт, возмещение ущерба", docKey:"zk" },
{ id:57, fabula:["на участке под ИЖС открыли автомойку","землю выделенную под фермерство застроили коттеджами","на сельхозземле работает завод"], desc:"Нецелевое использование земельного участка — использование не по назначению", code:"zk", article:"ст. 65 ЗК РК", penalty:"Предупреждение, штраф, принудительное изъятие земельного участка", docKey:"zk" },
{ id:58, fabula:["участок купили 5 лет назад но ничего на нём не построили","земля простаивает несколько лет зарастает бурьяном","владелец забросил участок и не использует его по назначению"], desc:"Нарушение сроков освоения земельного участка — неиспользование участка по назначению", code:"zk", article:"ст. 68 ЗК РК", penalty:"Принудительное изъятие земельного участка в судебном порядке", docKey:"zk" },
{ id:59, fabula:["на поле разлили химикаты и уничтожили плодородный слой почвы","после аварии нефтепровода земля стала непригодной","строители сняли верхний слой чернозёма и продали"], desc:"Порча земель — уничтожение плодородного слоя почвы, загрязнение химическими веществами", code:"zk", article:"ст. 140 ЗК РК", penalty:"Возмещение ущерба, рекультивация за свой счёт, штраф до 500 МРП", docKey:"zk" },
{ id:60, fabula:["завод выбрасывает чёрный дым без очистки","превышены все допустимые нормы выбросов в атмосферу","предприятие работает без экологического разрешения и загрязняет воздух"], desc:"Загрязнение атмосферного воздуха — превышение нормативов выбросов загрязняющих веществ", code:"ek", article:"ст. 328 ЭкоК РК", penalty:"Штраф до 500 МРП, приостановление деятельности, возмещение экологического ущерба", docKey:"ek" },
{ id:61, fabula:["за городом организовали несанкционированную свалку","опасные отходы сливают в овраг рядом с посёлком","стройкомпания вывозит мусор в лесополосу"], desc:"Нарушение правил обращения с отходами — несанкционированное размещение, хранение, захоронение", code:"ek", article:"ст. 331 ЭкоК РК", penalty:"Штраф до 1000 МРП для юрлиц, ликвидация свалки за счёт нарушителя", docKey:"ek" },
{ id:62, fabula:["браконьеры убили снежного барса занесённого в Красную книгу","уничтожили популяцию редких тюльпанов в степи","незаконно добыли несколько особей сайгака"], desc:"Уничтожение редких видов растений и животных, занесённых в Красную книгу РК", code:"ek", article:"ст. 339 ЭкоК РК", penalty:"Штраф до 2500 МРП, возмещение ущерба", docKey:"ek" },
{ id:63, fabula:["фабрика сливает химические отходы в реку без очистки","предприятие превышает квоту на выбросы в разы","завод работает вообще без экологического разрешения на эмиссии"], desc:"Превышение нормативов эмиссий в окружающую среду без экологического разрешения", code:"ek", article:"ст. 327 ЭкоК РК", penalty:"Штраф до 200% от ставки платы за эмиссии, приостановление или запрет деятельности", docKey:"ek" },
{ id:64, fabula:["родители уехали на месяц оставив маленьких детей одних дома","мать постоянно пьёт и не заботится о ребёнке","родители не обеспечивают ребёнку питание одежду и образование"], desc:"Неисполнение родительских обязанностей — уклонение от воспитания и содержания детей — по Семейному кодексу", code:"sk", article:"ст. 67-70 СК РК", penalty:"Предупреждение, административный штраф, ограничение либо лишение родительских прав", docKey:"sk" },
{ id:65, fabula:["отец после развода перестал платить алименты на детей","должник по алиментам скрывает свои доходы и место работы","уже несколько лет не платит алименты и накопил большой долг"], desc:"Уклонение от уплаты алиментов на содержание несовершеннолетних детей", code:"sk", article:"ст. 139, 140 СК РК", penalty:"Административный арест до 10 суток, ограничение выезда за границу, лишение водительских прав, уголовная ответственность при злостном уклонении", docKey:"sk" },
{ id:66, fabula:["после развода бывшая жена не даёт отцу видеться с ребёнком","один из родителей скрывает местонахождение ребёнка от второго","бабушка препятствует общению отца с детьми после развода"], desc:"Нарушение права ребёнка на общение с отдельно проживающим родителем", code:"sk", article:"ст. 67 СК РК", penalty:"Определение порядка общения через суд, административная ответственность, передача ребёнка добросовестному родителю", docKey:"sk" },
{ id:67, fabula:["купили телефон а он сломался на третий день","в магазине отказываются принимать обратно бракованный товар","гарантийный ремонт длится уже четвёртый месяц"], desc:"Продажа некачественного товара, отказ в возврате или обмене, нарушение сроков гарантийного ремонта", code:"zakon", article:"Закон «О защите прав потребителей»", penalty:"Возврат денег, замена товара, неустойка 1% в день, возмещение морального вреда через суд", docKey:"zakon_potreb" },
{ id:68, fabula:["иностранец уже полгода живёт в Казахстане без регистрации","человек просрочил разрешение на проживание и не выехал","нелегально работают иностранцы без разрешения на трудовую деятельность"], desc:"Нарушение миграционного законодательства — проживание без регистрации, просрочка срока пребывания", code:"zakon", article:"Закон «О миграции населения»", penalty:"Штраф 25-50 МРП, выдворение за пределы РК, запрет на въезд до 5 лет", docKey:"zakon_migr" },
{ id:69, fabula:["компания продала базу данных клиентов третьим лицам без их согласия","произошла утечка персональных данных пользователей сайта","собирают и обрабатывают личные данные людей без разрешения"], desc:"Незаконный сбор, обработка, распространение персональных данных без согласия субъекта", code:"zakon", article:"Закон «О персональных данных и их защите»", penalty:"Штраф до 500 МРП, возмещение ущерба, уголовная ответственность при крупном ущербе", docKey:"zakon_pd" },
{ id:70, fabula:["в рекламе указали что средство лечит все болезни хотя это не так","баннер обещает золотые горы а на деле обман","по радио крутят скрытую рекламу без маркировки"], desc:"Ненадлежащая реклама — недостоверная, недобросовестная, скрытая реклама", code:"zakon", article:"Закон «О рекламе»", penalty:"Штраф до 300 МРП, приостановление рекламы, демонтаж рекламной конструкции, публичное опровержение", docKey:"zakon_reklama" },
{ id:71, fabula:["на тендере выбрали компанию аффилированную с чиновником","конкурсная комиссия незаконно отклонила всех кроме нужного участника","две фирмы сговорились о ценах на госзакупках"], desc:"Нарушение правил государственных закупок — аффилированность, сговор участников", code:"zakon", article:"Закон «О государственных закупках»", penalty:"Признание итогов закупок недействительными, штраф до 500 МРП, включение в реестр недобросовестных участников", docKey:"zakon_goszakup" },
{ id:72, fabula:["чиновник не уведомил о конфликте интересов при принятии решения","должностное лицо приняло подарок дороже разрешённого лимита","госслужащий совмещает должность с предпринимательской деятельностью"], desc:"Нарушение антикоррупционного законодательства — конфликт интересов, нарушение ограничений", code:"zakon", article:"Закон «О противодействии коррупции»", penalty:"Административное увольнение, штраф, уголовная ответственность при отягчающих обстоятельствах", docKey:"zakon_antikorr" },
{ id:73, fabula:["хакер взломал государственную базу данных","незаконно получили доступ к закрытой информации","кто-то проник в информационную систему без разрешения"], desc:"Неправомерный доступ к информации, охраняемой законом, в том числе к государственным информационным системам", code:"zakon", article:"Закон «Об информатизации»", penalty:"Штраф до 2000 МРП, лишение свободы до 5 лет (ст. 205 УК)", docKey:"zakon_info" },
{ id:74, fabula:["все вывески магазина только на русском языке без перевода","госорган не соблюдает требования по ведению делопроизводства на казахском","на сайте компании нет версии на государственном языке"], desc:"Нарушение языкового законодательства — несоблюдение требований о применении государственного языка", code:"zakon", article:"Закон «О языках в РК»", penalty:"Административный штраф до 50 МРП, предписание устранить нарушение", docKey:"zakon_yazyk" },
{ id:75, fabula:["пешеход перебежал дорогу в неположенном месте","человек перешёл перекрёсток на красный свет","ребёнок выбежал на проезжую часть вне перехода"], desc:"Нарушение ПДД пешеходом — переход дороги вне пешеходного перехода или на запрещающий сигнал", code:"pravila", article:"Правила ДД, п. 12-13", penalty:"Штраф 2 МРП", docKey:"pravila" },
{ id:76, fabula:["таксист работает без лицензии на перевозку пассажиров","в автобусе едет в два раза больше людей чем положено","маршрутка ездит по несогласованному маршруту"], desc:"Нарушение правил перевозки пассажиров и багажа — перевозка без лицензии, превышение количества пассажиров", code:"pravila", article:"Правила перевозок пассажиров", penalty:"Штраф до 100 МРП, изъятие транспортного средства", docKey:"pravila" },
{ id:77, fabula:["строительная компания грубо нарушила строительные нормы и дом дал трещину","в новостройке обрушилась стена из-за нарушений СНиП","подрядчик сэкономил на материалах что привело к аварийному состоянию здания"], desc:"Нарушение строительных норм и правил (СНиП) — отклонение от проектной документации", code:"pravila", article:"СНиП РК, Правила организации застройки", penalty:"Приостановление строительства, штраф, снос объекта, аннулирование лицензии подрядчика", docKey:"pravila" },
{ id:78, fabula:["туристы не потушили костёр в лесу и начался пожар","в пожароопасный сезон развели огонь в лесном массиве","бросили непотушенную сигарету в сухую траву у леса"], desc:"Нарушение правил пожарной безопасности в лесах — разведение костров в пожароопасный период", code:"pravila", article:"Правила пожарной безопасности в лесах РК", penalty:"Штраф до 500 МРП, возмещение ущерба лесному фонду, уголовная ответственность при крупном ущербе", docKey:"pravila" },
{ id:79, fabula:["сосед выгуливает бойцовскую собаку без поводка и намордника","собака укусила ребёнка во дворе","хозяин оставил агрессивного пса без присмотра на улице"], desc:"Нарушение правил содержания и выгула домашних животных — выгул без поводка и намордника", code:"pravila", article:"Правила содержания животных в РК", penalty:"Штраф 5-20 МРП, возмещение вреда пострадавшим, изъятие животного", docKey:"pravila" },
{ id:80, fabula:["в квартире снесли несущую стену без разрешения","сделали перепланировку офиса без согласования с архитектурой","объединили две квартиры самовольно без документов"], desc:"Незаконная перепланировка помещений без согласования с уполномоченными органами", code:"pravila", article:"Правила переустройства помещений", penalty:"Штраф до 100 МРП, предписание вернуть помещение в первоначальное состояние за свой счёт", docKey:"pravila" },
{ id:81, fabula:["на заводе эксплуатируют опасное оборудование без декларации безопасности","предприятие не зарегистрировало опасный производственный объект","работает химический цех без паспорта безопасности"], desc:"Эксплуатация опасного производственного объекта без декларации промышленной безопасности", code:"zakon", article:"Закон «О гражданской защите», ст. 71", penalty:"Штраф до 2000 МРП для юрлиц, приостановление деятельности, уголовная ответственность при тяжёлых последствиях", docKey:"zakon_prombez" },
{ id:82, fabula:["оператор крана не прошёл обучение и аттестацию по промбезопасности","работники допущены к взрывным работам без экзамена","новый начальник смены не имеет удостоверения по промбезопасности"], desc:"Допуск персонала к работе на опасном объекте без обучения и аттестации по промышленной безопасности", code:"zakon", article:"Закон «О гражданской защите», ст. 79", penalty:"Штраф до 500 МРП, отстранение персонала, административное приостановление работ", docKey:"zakon_prombez" },
{ id:83, fabula:["котёл на котельной не проходил экспертизу уже 5 лет","подъёмный механизм работает с просроченным техосвидетельствованием","на шахте используют оборудование без экспертизы промбезопасности"], desc:"Эксплуатация технических устройств на опасном объекте без проведения экспертизы промышленной безопасности", code:"zakon", article:"Закон «О гражданской защите», ст. 74", penalty:"Штраф до 1000 МРП, остановка оборудования, приостановление деятельности предприятия", docKey:"zakon_prombez" },
{ id:84, fabula:["на шахте отсутствует план ликвидации аварий","на нефтеперерабатывающем заводе нет плана действий при ЧС","химическое предприятие не разработало мероприятия по локализации аварий"], desc:"Отсутствие плана ликвидации аварий и мероприятий по их локализации на опасном производственном объекте", code:"zakon", article:"Закон «О гражданской защите», ст. 90", penalty:"Штраф до 1500 МРП, принудительная остановка работ до устранения", docKey:"zakon_prombez" },
{ id:85, fabula:["газовщик ремонтировал газопровод без наряда-допуска","электромонтёр работал на высоте без оформления наряда","сварщик выполнял огневые работы без разрешительной документации"], desc:"Выполнение работ повышенной опасности без оформления наряда-допуска и без инструктажа", code:"zakon", article:"Закон «О гражданской защите», ст. 80", penalty:"Штраф до 300 МРП, отстранение от работы, административная ответственность руководителя", docKey:"zakon_prombez" },
{ id:86, fabula:["на предприятии не расследовали несчастный случай на производстве","при аварии на шахте скрыли факт выброса газа","работодатель не сообщил в органы о производственной травме"], desc:"Сокрытие аварии, несчастного случая на производстве или несообщение о них уполномоченным органам", code:"zakon", article:"Закон «О гражданской защите», ст. 59", penalty:"Штраф до 1000 МРП, уголовная ответственность при тяжёлых последствиях", docKey:"zakon_prombez" },
{ id:87, fabula:["на заводе нет системы оповещения при аварии","предприятие не обеспечило средствами индивидуальной защиты рабочих","отсутствуют датчики загазованности в цеху где работают с химикатами"], desc:"Необеспечение работников опасного объекта средствами индивидуальной защиты и системами оповещения", code:"zakon", article:"Закон «О гражданской защите», ст. 82", penalty:"Штраф до 500 МРП, приостановление деятельности до устранения нарушений", docKey:"zakon_prombez" },
{ id:88, fabula:["в кафе продукты хранятся на полу без холодильника","повар работает без санитарной книжки","в столовой нет отдельного цеха для сырого мяса и готовой еды"], desc:"Нарушение санитарно-эпидемиологических требований к объектам общественного питания", code:"prikaz", article:"Приказ МЗ РК № 1021 от 08.12.2015", penalty:"Штраф до 200 МРП, приостановление деятельности до устранения", docKey:"prik_mz_sanpin" },
{ id:89, fabula:["в офисе нет пожарной сигнализации","эвакуационный выход завален коробками","огнетушители просрочены и не проверяются"], desc:"Нарушение правил пожарной безопасности в зданиях и сооружениях", code:"prikaz", article:"Приказ МЧС РК № 406 от 21.08.2015", penalty:"Штраф до 500 МРП, приостановление деятельности", docKey:"prik_mchs_poj" },
{ id:90, fabula:["рабочим не выдали каски и спецобувь на стройке","на заводе не проводят инструктаж по технике безопасности","работник получил травму потому что станок не имел защитного кожуха"], desc:"Нарушение правил по охране труда — отсутствие инструктажа, СИЗ, ограждений оборудования", code:"prikaz", article:"Приказ МТСЗН РК № 942 от 03.12.2015", penalty:"Штраф до 300 МРП, приостановление работ, уголовная ответственность при тяжких последствиях", docKey:"prik_mt_ohrana" },
{ id:91, fabula:["купили машину но не поставили на учёт в течение 10 дней","автомобиль ездит с транзитными номерами уже полгода","продали машину по договору но новый владелец не переоформил"], desc:"Нарушение правил государственной регистрации транспортных средств", code:"prikaz", article:"Приказ МВД РК № 602 от 02.08.2014", penalty:"Штраф 10-30 МРП, запрет эксплуатации ТС", docKey:"prik_mvd_regts" },
{ id:92, fabula:["охотник хранит ружьё в шкафу без сейфа","у человека просрочено разрешение на хранение оружия","владелец травматического пистолета не продлил лицензию"], desc:"Нарушение правил хранения, учёта и использования гражданского оружия", code:"prikaz", article:"Приказ МВД РК № 602 от 02.08.2014", penalty:"Штраф 20-50 МРП, изъятие оружия, аннулирование разрешения", docKey:"prik_mvd_regts" },
{ id:93, fabula:["фермер привёз саженцы из-за границы без карантинного сертификата","на складе обнаружили вредителей в импортном зерне","садовод использует запрещённые пестициды"], desc:"Нарушение фитосанитарных требований и правил карантина растений", code:"prikaz", article:"Приказ МСХ РК № 4-1/263 от 05.05.2015", penalty:"Штраф до 500 МРП, уничтожение заражённой продукции, приостановление деятельности", docKey:"prik_msx_fito" },
{ id:94, fabula:["грузовик с бензином ездит без знака опасный груз","перевозят баллоны с газом в обычной газели без креплений","водитель цистерны не имеет допуска к перевозке опасных грузов"], desc:"Нарушение правил перевозки опасных грузов автомобильным транспортом", code:"prikaz", article:"Приказ МИР РК № 515 от 19.06.2015", penalty:"Штраф до 200 МРП, задержание транспортного средства, лишение допуска", docKey:"prikaz" },
{ id:95, fabula:["в школьной столовой кормят детей просроченными продуктами","буфет продаёт чипсы и газировку вместо горячего питания","не соблюдаются нормы калорийности и сбалансированности меню"], desc:"Нарушение правил организации питания в организациях образования", code:"prikaz", article:"Приказ МП РК № 388 от 31.10.2014", penalty:"Штраф до 100 МРП, предписание устранить, административная ответственность директора", docKey:"prikaz" },
{ id:96, fabula:["призывник не встал на воинский учёт после переезда","компания не подаёт списки военнообязанных сотрудников в военкомат","человек сменил место жительства и не уведомил военкомат"], desc:"Нарушение правил воинского учёта военнообязанных и призывников", code:"prikaz", article:"Приказ МО РК № 188 от 24.04.2015", penalty:"Штраф 5-10 МРП, административная ответственность руководителя организации", docKey:"prikaz" },
{ id:97, fabula:["автошкола выдала свидетельство без реального обучения","человек купил водительские права без сдачи экзамена","медсправку на права выдали без прохождения врачей"], desc:"Нарушение правил выдачи водительских удостоверений и приёма экзаменов", code:"prikaz", article:"Приказ МВД РК № 602 от 02.08.2014", penalty:"Штраф до 100 МРП, аннулирование прав, уголовная ответственность за подделку", docKey:"prik_mvd_regts" }
];
let currentQuery = "";
let currentCode = "all";
function codeLabel(c) {
const map = { koap:"КоАП", uk:"УК", tk:"ТК", nk:"НК", gk:"ГК", zk:"ЗК", ek:"ЭкоК", sk:"СК", zakon:"Закон", pravila:"Правила", prikaz:"Приказ" };
return map[c] || c.toUpperCase();
}
function getDocLink(v) {
if (v.docKey && CODE_DOC[v.docKey]) return CODE_DOC[v.docKey];
return CODE_DOC[v.code] || "https://adilet.zan.kz";
}
function highlight(text, query) {
if (!query) return text;
const words = query.toLowerCase().split(/\s+/).filter(w => w.length > 1);
let result = text;
words.forEach(w => {
const re = new RegExp(`(${w.replace(/[.*+?^${}()|[\]\\]/g,'\\$&')})`, 'gi');
result = result.replace(re, '<mark>$1</mark>');
});
return result;
}
function matchScore(v, words) {
let score = 0;
for (const w of words) {
for (const f of (v.fabula || [])) {
if (f.toLowerCase().includes(w)) score += 3;
}
if (v.desc.toLowerCase().includes(w)) score += 2;
if (v.article.toLowerCase().includes(w)) score += 1;
if (v.penalty.toLowerCase().includes(w)) score += 1;
}
return score;
}
function filterAndSearch() {
let results = VIOLATIONS;
if (currentCode !== "all") {
results = results.filter(v => v.code === currentCode);
}
const q = currentQuery.trim().toLowerCase();
const words = q.split(/\s+/).filter(w => w.length > 0);
if (q) {
results = results
.filter(v => matchScore(v, words) > 0)
.sort((a, b) => matchScore(b, words) - matchScore(a, words));
}
render(results, currentQuery);
}
function render(results, query) {
const grid = document.getElementById("results");
const empty = document.getElementById("empty");
const stats = document.getElementById("stats");
stats.textContent = query.trim()
? `Найдено: ${results.length} из ${VIOLATIONS.length}`
: `Всего: ${VIOLATIONS.length} составов нарушений`;
if (results.length === 0) {
grid.innerHTML = "";
empty.style.display = "";
return;
}
empty.style.display = "none";
grid.innerHTML = results.map(v => `
<div class="violation-card">
<div class="card-top">
<div class="article-badge ${v.code}">
<span class="badge-label">${codeLabel(v.code)}</span>
<span class="badge-article">${v.article}</span>
</div>
<div class="card-info">
<div class="verdict">&#x26A0;&#xFE0F; Нарушен: ${codeLabel(v.code)} ${v.article}</div>
<h3>${highlight(v.desc.split(" —")[0], query)}</h3>
<div class="desc">${highlight(v.desc, query)}</div>
</div>
</div>
<div class="card-footer">
<div class="penalty"><strong>Наказание:</strong> ${v.penalty}</div>
<a class="doc-link" href="${getDocLink(v)}" target="_blank">&#x1F4C4; Текст НПА на adilet.zan.kz</a>
</div>
</div>
`).join("");
}
function search() {
currentQuery = document.getElementById("search").value;
filterAndSearch();
}
function setFilter(code, btn) {
currentCode = code;
document.querySelectorAll(".filter-btn").forEach(b => b.classList.remove("active"));
btn.classList.add("active");
filterAndSearch();
}
document.getElementById("search").addEventListener("input", search);
document.getElementById("search").addEventListener("keydown", function(e) {
if (e.key === "Enter") { currentQuery = this.value; filterAndSearch(); }
});
filterAndSearch();
</script>
</body>
</html>