Летопись

Два связанных инструмента: markdown-блок на карточке любой ноды (описание, заметки DM) и отдельный лог записей chronicles с привязкой к ноде и дате внутри петли. Автосохранение черновиков через localStorage.


Markdown-блок на ноде

Каждая нода имеет поле content text в таблице nodes (миграция 011_node_content.sql). Это фриформный markdown — DM пишет туда описание локации, историю NPC, заметки о сессии. Блок рендерится компонентом components/markdown-content.tsx и переключается в режим редактирования по клику или кнопке «Редактировать».

Поиск по content работает автоматически — триггер trg_nodes_search_vector включает его в search_vector после миграции 012_loops_sessions_as_nodes.sql.


Лог летописи (chronicles)

Таблица chronicles (миграция 008b_loops_and_chronicles.sql) — отдельный лог записей, не привязанных к единственному nodes.content. Каждая запись:

  • node_id — к какой ноде относится (nullable: записи кампании без ноды).
  • title — заголовок.
  • content — markdown.
  • loop_number (int, optional) — в какой петле создана.
  • game_date (text, optional) — свободная игровая дата, например «День 15».

Это лог в чистом виде: записи append-only, редактирование обновляет content и обновляет updated_at триггером trg_chronicles_updated_at. Записи отображаются компонентом components/chronicles.tsx, сгруппированные по петле или ноде.

API создания и получения записей — app/api/chronicles/ и app/api/nodes/[id]/content/.


Автосохранение черновиков

Форма редактирования контента использует hooks/use-form-draft.ts. Принцип:

  • Хук дебаунсирует запись в localStorage (600 мс по умолчанию) — черновик сохраняется, пока пользователь пишет.
  • При повторном открытии формы, если в storage есть непустой черновик, появляется баннер «Найден несохранённый черновик» с кнопками «Восстановить» и «Отклонить».
  • Хук не затирает старый черновик пустой формой — пока pending-черновик не обработан, запись в storage приостановлена.
  • clearDraft() вызывается после успешного сохранения на сервере.

Технические детали хука — в architecture/form-drafts.md.


Летопись — человекочитаемый слой поверх нод. Машиночитаемый слой (транзакции, участие в сессиях) — в accounting/README.md и loops-and-sessions/README.md.