# Всё, что умеет этот движок

> Сайт, собранный целиком из данных: каждый блок и тут же объявление, которым он сделан.

Сайт, собранный данными

## Всё, что умеет этот движок

Каждая полоса ниже — данные, ни строки кода на этих страницах нет. Разверните складку под любой, чтобы увидеть, чем именно она объявлена.

[Посмотреть, как объявлено](#words)

### Слова

Заголовки, проза, выделения, ссылки и списки. Выделение — ПОЛЕ, а не тег, и именно это оставляет абзац данными.

#### Заголовок третьего уровня

Подводка — тот же абзац, только с другим тоном.

Обычные слова, **выделенные**_, наклонные_, `code()` и [ссылка](https://next.torqhub.net).

- Пункт простым текстом
- [object Object]

#### Занято не равно Используется

> **Note** — Врезка-заметка: то, что читатель может пропустить без потери.

**Чем объявлена эта полоса**

```json
[
  {
    "kind": "stack",
    "appearance": "measure",
    "children": [
      {
        "kind": "heading",
        "level": 3,
        "text": "Заголовок третьего уровня"
      },
      {
        "kind": "text",
        "tone": "lead",
        "text": "Подводка — тот же абзац, только с другим тоном."
      },
      {
        "kind": "rich",
        "spans": [
          {
            "text": "Обычные слова, "
          },
          {
            "text": "выделенные",
            "emphasis": "strong"
          },
          {
            "text": ", наклонные",
            "emphasis": "em"
          },
          {
            "text": ", "
          },
          {
            "text": "code()",
            "emphasis": "code"
          },
          {
            "text": " и "
          },
          {
            "text": "ссылка",
            "href": "https://next.torqhub.net"
          },
          {
            "text": "."
          }
        ]
      },
      {
        "kind": "list",
        "items": [
          "Пункт простым текстом",
          {
            "spans": [
              {
                "text": "Пункт с "
              },
              {
                "text": "выделением",
                "emphasis": "strong"
              }
            ]
          }
        ]
      },
      {
        "kind": "heading",
        "level": 3,
        "spans": [
          {
            "text": "Занято "
          },
          {
            "mark": "not-equal",
            "alt": "не равно"
          },
          {
            "text": " Используется"
          }
        ]
      },
      {
        "kind": "callout",
        "tone": "note",
        "text": "Врезка-заметка: то, что читатель может пропустить без потери."
      }
    ]
  }
]
```

### Готовые блоки

Их двенадцать. Блок — сохранённое дерево с именованными полями: использовать значит подставить значения, а не выполнить что-то.

#### Карточка свойства

Заголовок, текст и необязательная ссылка.

#### Со ссылкой

Ссылка появляется, только если её дали.

[Открыть](https://next.torqhub.net)

#### Тариф

$0

Карточка цены

[Выбрать](#m-contact)

#### 12

готовых блоков

#### 21

видов узлов

#### 18

дверей

> Блок — сохранённое дерево, а не вызов. Скопировать его значит скопировать файл.
> — Из описания движка

#### Карточка сравнения

Две величины рядом, каждая со своей подписью.

на любом масштабе

1×

было

4×

стало

#### Может ли агент завести свой блок?

Да. Он пишет такой же файл данных, как готовые, или копирует один из них под новым именем и правит.

### Полоса призыва

Своя окраска, чтобы её нельзя было не заметить.

[Написать нам](#m-contact)

**Чем объявлена эта полоса**

```json
[
  {
    "kind": "grid",
    "columns": 3,
    "children": [
      {
        "kind": "use",
        "module": "feature-card",
        "values": {
          "title": "Карточка свойства",
          "body": "Заголовок, текст и необязательная ссылка."
        }
      },
      {
        "kind": "use",
        "module": "feature-card",
        "values": {
          "title": "Со ссылкой",
          "body": "Ссылка появляется, только если её дали.",
          "link_label": "Открыть",
          "link_href": "https://next.torqhub.net"
        }
      },
      {
        "kind": "use",
        "module": "price-card",
        "values": {
          "plan": "Тариф",
          "price": "$0",
          "note": "Карточка цены",
          "cta_label": "Выбрать",
          "cta_href": "#m-contact"
        }
      }
    ]
  },
  {
    "kind": "use",
    "module": "stat-row",
    "values": {
      "a_value": "12",
      "a_caption": "готовых блоков",
      "b_value": "21",
      "b_caption": "видов узлов",
      "c_value": "18",
      "c_caption": "дверей"
    }
  },
  {
    "kind": "grid",
    "columns": 2,
    "children": [
      {
        "kind": "use",
        "module": "quote",
        "values": {
          "text": "Блок — сохранённое дерево, а не вызов. Скопировать его значит скопировать файл.",
          "author": "Из описания движка"
        }
      },
      {
        "kind": "use",
        "module": "compare-card",
        "values": {
          "title": "Карточка сравнения",
          "body": "Две величины рядом, каждая со своей подписью.",
          "scale": "на любом масштабе",
          "a_value": "1×",
          "a_caption": "было",
          "b_value": "4×",
          "b_caption": "стало"
        }
      }
    ]
  },
  {
    "kind": "use",
    "module": "faq-item",
    "values": {
      "question": "Может ли агент завести свой блок?",
      "answer": "Да. Он пишет такой же файл данных, как готовые, или копирует один из них под новым именем и правит."
    }
  },
  {
    "kind": "use",
    "module": "cta-band",
    "values": {
      "title": "Полоса призыва",
      "body": "Своя окраска, чтобы её нельзя было не заметить.",
      "button_label": "Написать нам",
      "button_href": "#m-contact"
    }
  }
]
```

### Раскладка

Стопки, сетки и коробки. Полоса — контейнер, а насколько широко внутри неё сидит содержимое, решает сам узел.

Коробка, обычная

Коробка-карточка

Коробка с акцентом

---

[Кнопка](#m-contact)

[Вторая](#words)

**Чем объявлена эта полоса**

```json
[
  {
    "kind": "grid",
    "columns": 3,
    "children": [
      {
        "kind": "box",
        "tone": "plain",
        "children": [
          {
            "kind": "text",
            "text": "Коробка, обычная"
          }
        ]
      },
      {
        "kind": "box",
        "tone": "card",
        "children": [
          {
            "kind": "text",
            "text": "Коробка-карточка"
          }
        ]
      },
      {
        "kind": "box",
        "tone": "accent",
        "children": [
          {
            "kind": "text",
            "text": "Коробка с акцентом"
          }
        ]
      }
    ]
  },
  {
    "kind": "divider"
  },
  {
    "kind": "stack",
    "direction": "row",
    "gap": "1rem",
    "children": [
      {
        "kind": "use",
        "module": "action-button",
        "values": {
          "label": "Кнопка",
          "href": "#m-contact"
        }
      },
      {
        "kind": "use",
        "module": "action-button",
        "values": {
          "label": "Вторая",
          "href": "#words"
        }
      }
    ]
  }
]
```

### Таблицы и код

Широкая таблица прокручивается внутри своей коробки: страница не должна ездить вбок.

| Вид узла | Что делает | Нужен ли сайту код |
| --- | --- | --- |
| text | абзац | нет |
| table | таблица | нет |
| island | свой компонент | ДА |
| form | форма | только адрес |

```yaml
- kind: text
  text: "Это и есть узел — имя вида и его поля."
```

**Чем объявлена эта полоса**

```json
[
  {
    "kind": "table",
    "headers": [
      "Вид узла",
      "Что делает",
      "Нужен ли сайту код"
    ],
    "rows": [
      [
        "text",
        "абзац",
        "нет"
      ],
      [
        "table",
        "таблица",
        "нет"
      ],
      [
        "island",
        "свой компонент",
        "ДА"
      ],
      [
        "form",
        "форма",
        "только адрес"
      ]
    ]
  },
  {
    "kind": "code",
    "language": "yaml",
    "text": "- kind: text\n  text: \"Это и есть узел — имя вида и его поля.\""
  }
]
```

### То, что отвечает

Переключатель, складка, свой компонент сайта и форма. Только двум последним сайт что-то предоставляет.

**Что показать**

_Первое_

Переключатель и его панели — чистые стили, ни строки скрипта.

_Второе_

Вторая панель. Переключение работает и без JavaScript.

_Счётчик — компонент, принадлежащий сайту_

### Напишите нам

Цель — ИМЯ, которое разрешает сам сайт: страница может на неё указать и не может её выдумать.

**Отправить** — Как вас зовут*, Почта*, О чём, Сообщение*, Согласен получить ответ*

Работает и с выключенными скриптами: форму отправляет браузер.

**Чем объявлена эта полоса**

```json
[
  {
    "kind": "switch",
    "label": "Что показать",
    "children": [
      {
        "kind": "pane",
        "name": "Первое",
        "children": [
          {
            "kind": "text",
            "text": "Переключатель и его панели — чистые стили, ни строки скрипта."
          }
        ]
      },
      {
        "kind": "pane",
        "name": "Второе",
        "children": [
          {
            "kind": "text",
            "text": "Вторая панель. Переключение работает и без JavaScript."
          }
        ]
      }
    ]
  },
  {
    "kind": "stack",
    "appearance": "measure",
    "children": [
      {
        "kind": "island",
        "name": "Counter",
        "props": {
          "start": 0,
          "step": 1
        },
        "label": "Счётчик — компонент, принадлежащий сайту"
      }
    ]
  },
  {
    "kind": "use",
    "module": "section-head",
    "values": {
      "title": "Напишите нам",
      "lead": "Цель — ИМЯ, которое разрешает сам сайт: страница может на неё указать и не может её выдумать."
    }
  },
  {
    "kind": "stack",
    "appearance": "measure",
    "children": [
      {
        "kind": "form",
        "to": "contact",
        "submit": "Отправить",
        "note": "Работает и с выключенными скриптами: форму отправляет браузер.",
        "fields": [
          {
            "name": "name",
            "label": "Как вас зовут",
            "required": true
          },
          {
            "name": "email",
            "label": "Почта",
            "type": "email",
            "required": true,
            "placeholder": "you@company.com"
          },
          {
            "name": "topic",
            "label": "О чём",
            "type": "select",
            "options": [
              "Сайт на этом движке",
              "Другое"
            ]
          },
          {
            "name": "message",
            "label": "Сообщение",
            "type": "textarea",
            "required": true
          },
          {
            "name": "consent",
            "label": "Согласен получить ответ",
            "type": "checkbox",
            "required": true
          }
        ]
      }
    ]
  }
]
```

### Движение

Страница НАЗЫВАЕТ прибытие; что значит имя — значения в файле, который может написать агент. Каскад передаёт прибытие детям контейнера, одному за другим.

#### drift-up

Проявиться и подняться.

#### unblur

Выйти из размытия и обесцвечивания.

#### tilt-in

Довернуться и подрасти, с отскоком.

> **Note** — Переключатель светлой и тёмной темы и ссылки языков живут в раме наверху каждой страницы. Ни то, ни другое странице объявлять не нужно.

**Чем объявлена эта полоса**

```json
[
  {
    "kind": "grid",
    "columns": 3,
    "motion": {
      "do": "tilt-in",
      "stagger": 150
    },
    "children": [
      {
        "kind": "use",
        "module": "feature-card",
        "values": {
          "title": "drift-up",
          "body": "Проявиться и подняться."
        }
      },
      {
        "kind": "use",
        "module": "feature-card",
        "values": {
          "title": "unblur",
          "body": "Выйти из размытия и обесцвечивания."
        }
      },
      {
        "kind": "use",
        "module": "feature-card",
        "values": {
          "title": "tilt-in",
          "body": "Довернуться и подрасти, с отскоком."
        }
      }
    ]
  },
  {
    "kind": "stack",
    "appearance": "measure",
    "children": [
      {
        "kind": "callout",
        "tone": "note",
        "text": "Переключатель светлой и тёмной темы и ссылки языков живут в раме наверху каждой страницы. Ни то, ни другое странице объявлять не нужно."
      }
    ]
  }
]
```

### Картинки и видео

Встраивание принимает поставщика и номер, а не адрес, — страница не может увести читателя куда захочет.

[Пример встроенного видео](https://www.youtube.com/watch?v=aqz-KE-bpKQ)

**Чем объявлена эта полоса**

```json
[
  {
    "kind": "stack",
    "appearance": "wide",
    "children": [
      {
        "kind": "embed",
        "provider": "youtube",
        "videoId": "aqz-KE-bpKQ",
        "title": "Пример встроенного видео"
      }
    ]
  }
]
```

### Чего здесь НЕТ

Честная опись стоит дороже лестной.

> **Warning** — Блока-графика пока нет: числа показывают ряд показателей и карточка сравнения, а настоящий график потребовал бы либо картинки, либо своего компонента сайта. Нет и навигации по многим страницам сверх ссылок в раме. А движение, привязанное к прокрутке — то, что едет вместе с полосой прокрутки, а не приходит один раз, — это собственный компонент сайта, а не словарь.

**Чем объявлена эта полоса**

```json
[
  {
    "kind": "stack",
    "appearance": "measure",
    "children": [
      {
        "kind": "callout",
        "tone": "warn",
        "text": "Блока-графика пока нет: числа показывают ряд показателей и карточка сравнения, а настоящий график потребовал бы либо картинки, либо своего компонента сайта. Нет и навигации по многим страницам сверх ссылок в раме. А движение, привязанное к прокрутке — то, что едет вместе с полосой прокрутки, а не приходит один раз, — это собственный компонент сайта, а не словарь."
      }
    ]
  }
]
```

_Объявленное движение_
