Сделай личный трекер привычки для Kapsula. Ответ — один полный HTML-файл с CSS и JavaScript внутри, без Markdown-ограждений, сервера, CDN, внешних шрифтов, библиотек и сборки. Этот запрос — для нового похожего трекера. Это не исходный промпт автора существующего примера. МОЯ ЗАДАЧА Название: «Моя привычка» (оставь название и тексты в одном понятном месте в коде, чтобы я мог их заменить). Хочу сам выбрать дату начала, видеть число прошедших календарных дней и лучшую серию, записать своё «зачем» и собственные правила. Отдельная кнопка «Начать заново» с подтверждением: сохранить рекорд, увеличить число перезапусков и начать с сегодняшней даты. Тексты нейтральные, без медицинских обещаний и оценок человека. ИНТЕРФЕЙС На русском, удобный для телефона, тёмный фон, крупная цифра, заметные кнопки, отступы safe-area. Доступные подписи полей. Дату можно изменить; будущие и несуществующие даты отклонять с понятным сообщением. Счётчик показывает 0 в день начала и разницу календарных дат после этого; смена часового пояса и летнего времени не должна превращать сутки в дробное число дней. При возврате в приложение обновлять экран по текущей дате. СРЕДА И ХРАНЕНИЕ В Kapsula доступен window.kapsula. До работы с мостом дождись await kapsula.ready. API: - await kapsula.storage.get(key) -> JSON-значение или null. - await kapsula.storage.set(key, value) -> Promise. - await kapsula.haptics.vibrate(ms) -> Promise, необязательно. Храни состояние в одном документированном ключе, например personal-habit-v1; внутри укажи версию структуры. Проверяй данные после чтения. При несовместимых или повреждённых данных покажи ошибку, не перезаписывай их пустым состоянием. После успешного сохранения подтверждай действие; при ошибке покажи её, сохрани пользовательский ввод и дай повторить. На время асинхронного действия блокируй повторное нажатие. Не маскируй ошибку Kapsula.storage переключением на localStorage. В обычном браузере можно использовать localStorage для отдельного предпросмотра. Явно подпиши этот режим и поясни: данные браузера не переносятся в Kapsula автоматически. Если localStorage недоступен, тоже покажи ошибку. Пользовательский текст выводи через textContent, не через innerHTML. ГРАНИЦЫ ПЕРВОЙ ВЕРСИИ Не добавляй напоминания, регистрацию, сеть или аналитику. Хочу сначала проверить счётчик, перезапуск и восстановление данных после закрытия. Проверь, что рекорд сохраняется и не уменьшается при перезапуске, отмена ничего не меняет, а ошибка сохранения не выглядит как успех. ЕСЛИ Я ПОЗЖЕ ПОПРОШУ НАПОМИНАНИЕ Не добавляй его до отдельной просьбы. Доступные API Kapsula: - await kapsula.notify.schedule({at: epochMs, title, body}) -> {id}. - await kapsula.notify.cancel(id) -> {cancelled}; вызов без id отменяет все уведомления этого проекта. - await kapsula.notify.list() -> массив запланированных уведомлений. Это разовые уведомления. JavaScript в фоне не продолжает работу. Не выдумывай repeat/daily, Web Push, service worker или фоновый setInterval. При одной ближайшей постановке прямо напиши в интерфейсе, что следующее напоминание обновляется при открытии. Доставку определяют разрешения и настройки ОС. Обрабатывай ошибки разрешения и планирования; повторные открытия не должны создавать дубли. ДОРАБОТКА Если я пришлю предыдущий исходник для изменения, сохрани ключ хранения и совместимость старых записей. Не сбрасывай историю и не мигрируй данные молча.