# Модель узлов

> Что общего у всех узлов, чем они различаются и где описан каждый из них.

Source: https://docxcelerate.com/ru/docs/nodes/overview/

Документ — это дерево узлов. Каждый узел есть три вещи: **id**, **вид** и
правило, по которому получается содержимое.

```tsx
<Paragraph          // the kind
  id="greeting"     // the address
>
  Dear {state.name},  {/* the rule */}
</Paragraph>
```

Разрешённый на ваших данных, он превращается в обычный JSON:

```json
{ "id": "greeting", "kind": "paragraph", "mode": "static", "text": "Dear Adaeze Nkemelu," }
```

Ни стилей, ни вёрстки. Это дело рендерера.

## Каталог

У каждого типа есть своя страница со всеми принимаемыми опциями и
предпросмотром каждого способа записи.

### Структура

- **[Section](https://docxcelerate.com/ru/docs/nodes/section/)** (`section`) — Groups nodes under a titled heading.
- **[Table of contents](https://docxcelerate.com/ru/docs/nodes/table-of-contents/)** (`tableOfContents`) — A marker for a contents list, ahead of the renderers that build one.

### Текст

- **[Paragraph](https://docxcelerate.com/ru/docs/nodes/paragraph/)** (`paragraph`) — A block of prose, written from your data or generated from prompts.

### Медиа

- **[Image](https://docxcelerate.com/ru/docs/nodes/image/)** (`image`) — A picture resolved from your data or described by a prompt.
- **[Shape](https://docxcelerate.com/ru/docs/nodes/shape/)** (`shape`) — A drawn rectangle with the document's own words on top of it.
- **Clip art** (`clipArt`) _(В планах)_ — Named visual blocks — rules, marks, callouts — drawn by the renderer.

### Данные

- **[Graph](https://docxcelerate.com/ru/docs/nodes/graph/)** (`graph`) — A real Word chart, declared as data.
- **[Table](https://docxcelerate.com/ru/docs/nodes/table/)** (`table`) — A grid of cells, with the columns declared once.

## Идентификаторы — это адреса

Идентификатор узла — то, чем эндпоинт генерации адресует именно этот абзац, и то,
по чему два артефакта сборки выстраиваются друг против друга в диффе.
Переименование ломает всё, что ссылается на узел извне, — ровно как
переименование маршрута API.

Держите их уникальными в пределах документа. Это ничего не стоит и делает логи
читаемыми.

## Откуда берётся содержимое

У каждого узла есть либо его содержимое, либо промпты, чтобы его получить, и
решает это компонент, а не какое-то объявление. Дайте абзацу текст — или `Image`
его `src`, или `Graph` его `data` — и он разрешится на вашей машине. Дайте вместо
этого промпты и заполнитель — и он будет заполнен во время запроса.

Оба разрешаются в один и тот же `kind` и различаются в собранном документе
значением `mode`. `mode` — это выход, а не вход: сборка выводит его из того, что
задал компонент, а пакет сообщает движку, какие узлы тому предстоит разрешить.
Указать и то и другое на одном элементе — ошибка, а не подбрасывание монетки.

О слотах промптов и о том, что предпросмотр показывает на их месте, — [как писать
узлы](/ru/docs/writing-nodes/).

## Вложенность

[`section`](/ru/docs/nodes/section/) — сегодня единственный узел, содержащий
дочерние, и он принимает любой вид, включая другие разделы. Следующим будет узел
таблицы с узлами в ячейках, по тому же принципу: контейнеры содержат те
компоненты, которые вы и так пишете, а не вторую модель содержимого рядом с
ними.

## Об этих предпросмотрах

Каждый предпросмотр здесь — настоящая сборка. В `src/nodes/` репозитория этого
сайта лежит по файлу на вариант, написанному против опубликованного пакета; шаг
сборки разрешает каждый из них через `buildDocument` и отрисовывает тем же
рендерером, который отдаёт `dxcl dev`. Показанный исходник — это тот файл,
который выполнялся, а JSON — то, что вернулось. Поэтому такие страницы ломаются
громко, а не устаревают тихо.
