Конструктор недельных чек-листов
Небольшая статическая страница для недельных чек-листов привычек: собираешь блоки и пункты, выбираешь дни недели, печатаешь лист А4 или А5 и отмечаешь дни галочками. Без сборки, без бэкенда, без внешних зависимостей: работает офлайн.
Возможности
- Блоки с названием, пояснением в скобках и цветом (пастельная палитра или свой цвет).
- Дни недели у блока и у каждого пункта. Пункт наследует дни блока или переопределяет их. Если пункт идёт не каждый день, на листе рядом с ним мелко подписаны дни: «Пн, Ср, Пт», «Пн–Пт».
- Трекер строится из пунктов с отметкой «В трекер». Дни, в которые привычка не запланирована, на листе заштрихованы и помечены прочерком. В шапке трекера стоят даты, если задано начало недели.
- Перестановка (↑↓), дублирование, удаление и временное скрытие блоков и пунктов. Блоки «Правила» и «Заметка» тоже можно скрыть.
- Кнопка «Следующая неделя»: номер +1, даты +7, остальное копируется.
- Печать ровно на один лист А4 с цветными фонами. Если содержимое не помещается, появляется предупреждение и пунктирная линия конца листа.
- Компактный режим А5 (148 × 210 мм): те же блоки и трекер, но меньше поля и шрифт. Формат выбирается в поле «Формат листа» и сохраняется вместе с шаблоном.
- Данные хранятся в
localStorage браузера. Можно сохранить шаблон в JSON-файл и загрузить обратно.
- Тёмная тема интерфейса (по настройкам системы), сам лист всегда белый.
Как пользоваться
- Открой страницу и нажми «Загрузить пример» или собери шаблон с нуля.
- Укажи номер недели и дату начала (понедельник).
- В блоках добавь пункты. Жирный текст выделяется так:
**жирный**.
- У пункта выбери дни кнопками Пн…Вс или быстрыми вариантами «Все», «Будни», «Выходные». «Как у блока» возвращает наследование.
- Для строки в трекере отметь «В трекер» и, если нужно, задай короткое название. Если оно пустое, берётся текст пункта без форматирования.
- «Печать / PDF» открывает диалог печати. В настройках печати отключи колонтитулы браузера, если они мешают.
- Для А5 выбери «Формат листа: A5». Страница сама просит у браузера размер A5. Если в диалоге печати стоит другая бумага, выбери A5 вручную.
Данные остаются только в твоём браузере. Чтобы перенести их на другое устройство, используй «Сохранить в файл» и «Загрузить из файла».
Запуск локально
Достаточно открыть index.html в браузере двойным кликом. Если нужен локальный сервер:
python -m http.server 8000
После этого открой http://localhost:8000.
Структура
index.html, style.css, app.js: страница, стили и управляющий код.
js/model.js: модель данных, нормализация и миграция старого формата.
js/sheet.js: отрисовка листа и трекера.
js/editor.js: редактор блоков и пунктов.
js/example.js: пример шаблона.
tests/model.test.js: проверки модели, запуск node tests/model.test.js.
Скрипты подключены обычными тегами <script>, а не ES-модулями: браузеры не загружают модули с file://, а страница должна открываться из папки.
Формат данных
В файле и в localStorage (ключ checklist-builder-v2) лежит один JSON с полем version: 2.
{
"version": 2,
"week": 3,
"startDate": "2026-10-19",
"subtitle": "",
"paper": "a4",
"blocks": [
{
"id": "b_morning",
"title": "Утро",
"hint": "+20 минут к подъёму",
"color": "yellow",
"days": null,
"hidden": false,
"items": [
{
"id": "i_cold",
"text": "Душ, в конце **30 секунд холодной воды**",
"days": [1, 3, 5],
"tracker": true,
"trackerLabel": "Холод",
"hidden": false,
"progression": null
}
]
}
],
"rules": { "hidden": false, "title": "Правила на плохие дни", "items": [] },
"note": { "hidden": false, "text": "" },
"history": {}
}
- Дни это числа 1–7 (Пн=1).
null у пункта значит «как у блока», null у блока значит «все дни».
color это ключ палитры или #rrggbb.
paper это формат листа: "a4" или "a5". Если поля нет, используется А4.
- Дата конца недели не хранится: это
startDate + 6.
history и progression пока зарезервированы под отметки на странице и план прогрессии.
Файлы старого формата (sections[].items строками и отдельный список habits) открываются автоматически: привычки привязываются к похожим пунктам, а непривязанные попадают в скрытый блок «Из старого трекера».