Летопись
Два связанных инструмента: 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.