Title API: заголовок страницы и значок
Чтение и изменение заголовка страницы и его значка. Они стоят над первым блоком или в вашем собственном элементе. Заголовок это одна строка простого текста. Оба хранятся в документе и сохраняются в OutputData как title и icon.
Включается опцией pageTitle. editor.title доступен сразу после new Blok(), а вызовы до isReady повторяются, когда редактор готов. Исключение составляет title.focus(): до isReady он ничего не делает.
Опция title: true переносит заголовок через преобразования. Без неё каждое преобразование работает как раньше.
blocksToHtmlзаписывает его первым как<h1>, перед которым стоит значок.blocksToMarkdown,blocksToMarkdownWithReportиblocks.exportMarkdownзаписывают его как заголовок#. Значок-картинка не записывается.blocksToPlainTextзаписывает его первой строкой.markdownToBlocksWithReportиhtmlToBlocksWithReportвынимают из блоков ведущий заголовок#или<h1>. Они возвращают его какtitleиicon. Заголовок, который начинается с эмодзи и пробела, возвращается как значок и заголовок.- Заголовок страницы это простой текст, поэтому форматирование в том заголовке теряется. Оба отчёта добавляют об этом предупреждение
heading. markdownToBlocksиhtmlToBlocksс этой опцией только убирают заголовок.
- Заголовок страницы это простой текст, поэтому форматирование в том заголовке теряется. Оба отчёта добавляют об этом предупреждение
blocks.importMarkdownберёт заголовок и значок редактора из этого заголовка. Заголовок без эмодзи очищает значок, а отсутствие заголовка очищает оба.extractTextsставит заголовок первым в списке, аinjectTextsзаписывает его обратно оттуда. Все остальные индексы сдвигаются на один. Пустой перевод убирает заголовок.
Известны такие ограничения.
- Восстановление версии, сохранённой до того, как сервер начал хранить заголовки страниц, очищает текущий заголовок.
- Совместный редактор, открытый без сети, показывает последние известные блоки, но без заголовка.
- Хост не может задать заголовок через эндпоинт сервера
/edit. - Когда двое печатают в заголовке одновременно, побеждает последняя запись.
Как получить экземпляр редактора
Методы ниже вызываются на редакторе, созданном через new Blok(). Они доступны после того, как разрешится editor.isReady.
// You already hold the instance returned by the constructor.
const editor = new Blok({ holder: 'editor' });
await editor.isReady;
// Call any API method on it.
editor.caret.setToLastBlock('end');Методы
title.get()
stringТекущий заголовок. Если его нет, это ''.
console.log(editor.title.get()); // 'Roadmap'title.set(text, options?)
voidЗаменяет заголовок. Делает один шаг отмены и вызывает onChange с источником api. Если заголовок уже такой, ничего не происходит.
Передайте { record: false } для записи без шага отмены, например для переименования из вашего бэкенда. Участники всё равно получают запись, а onChange получает { source: 'api', record: false }.
- Отмена не уходит дальше этого значения до следующего записанного изменения заголовка. После него отмена может вернуть заголовок, который был до этого значения.
- Чтобы значение стало нижней границей, вызовите
history.clear()сразу после записи. - Набор текста, который продолжается после этого, остаётся одним шагом отмены. Отмена возвращает записанное вами значение, а не то, что было до набора.
Параметры
| Параметр | Тип | Обязательный | По умолчанию | Описание |
|---|---|---|---|---|
text | string | Обязательный | — | Новый заголовок. |
options.record | boolean | — | true |
|
editor.title.set('Roadmap 2027');
// A rename from your backend: no undo step
editor.title.set(serverTitle, { record: false });title.focus(position?)
voidСтавит каретку в заголовок, по умолчанию в конец. Передайте 'start' для начала. Ничего не делает, когда заголовок выключен, и до isReady.
editor.title.focus('start');title.mount(holder)
voidПереносит заголовок и значок в holder, элемент или селектор. Фокус и каретка сохраняются. null возвращает заголовок над первым блоком.
После isReady селектор, который ничего не находит, бросает ошибку. До isReady вызов ждёт редактор. Плохой селектор тогда пишется в лог, а заголовок остаётся на месте.
Чтобы выровнять ваш собственный раздел между заголовком и редактором, повторите разметку заголовка. Его переменная --blok-content-column задана на собственном элементе заголовка, поэтому соседний раздел её не видит.
- Задайте разделу отступ в начале, равный полю редактора. По умолчанию это
56px.- Оно равно
0приhideToolbar: trueилиreadOnly: { hideControls: true }. toolbarPosition: 'right'переносит его в конец.
- Оно равно
- Внутри задайте содержимому
box-sizing: border-box,max-width: var(--blok-content-max-width, 720px)иpadding-inline: var(--blok-block-padding-inline, 2px). - В ширине
fullиспользуйтеnoneвместо720px. - Выравнивайте его так, как задаёт
style.contentAlign.- Значению по умолчанию
'left'отступ не нужен. 'center'требуетmargin-inline: auto.'right'требуетmargin-inline-start: auto.
- Значению по умолчанию
Раздел читает эти переменные только у своих предков. Blok применяет style.tokens только к своим элементам, поэтому раздел рядом с заголовком их не видит.
- Если вы задаёте
--blok-content-max-width, объявите её на элементе, который содержит и раздел, и редактор. - Иначе раздел возьмёт запасные
720pxи съедет относительно заголовка.
С полем всё иначе. Blok объявляет --blok-editor-gutter-start на собственном элементе редактора, поэтому значение на предке до редактора не доходит. style.tokens пропускает переменные поля с предупреждением.
- Меняйте поле CSS-правилом на редакторе, например
[data-blok-interface] { --blok-editor-gutter-start: 20px; }. - Раздел это правило не видит. Задайте ему то же значение сами: числом или той же переменной на одном из его собственных предков.
editor.title.mount('#page-title');
// A section of your own between the title and the editor
// .page-meta { box-sizing: border-box; padding-inline-start: 56px; }
// .page-meta > div {
// box-sizing: border-box;
// max-width: var(--blok-content-max-width, 720px);
// padding-inline: var(--blok-block-padding-inline, 2px);
// }
// Back above the first block
editor.title.mount(null);title.icon.get()
PageIcon | nullТекущий значок: { type: 'emoji', value } или { type: 'image', url }. Если значка нет, это null.
const icon = editor.title.icon.get(); // { type: 'emoji', value: '🗺️' }title.icon.set(icon, options?)
voidЗадаёт значок или убирает его при null. Делает один шаг отмены и вызывает onIconChange с источником api. { record: false } работает так же, как у title.set.
editor.title.icon.set({ type: 'emoji', value: '🚀' });
editor.title.icon.set(null);import { Blok } from '@bloklabs/core';
const editor = new Blok({
holder: 'editor',
pageTitle: {
placeholder: 'Untitled',
onChange: (title, change) => {
if (change.source !== 'remote') {
saveTitle(title);
}
},
},
data: { title: 'Roadmap', icon: { type: 'emoji', value: '🗺️' }, blocks: [] },
});
editor.title.get(); // 'Roadmap'
const saved = await editor.save();
// saved.title === 'Roadmap'Title API
| Свойство | Описание | |
|---|---|---|
holder | HTMLElement | string | Элемент или селектор, в котором рисуется заголовок. Без него заголовок стоит над первым блоком. |
placeholder | string | Показывается, пока заголовок пуст. По умолчанию это локализованное сообщение |
icon | boolean |
|
onChange | (title: string, change: TitleChange) => void | Вызывается при каждом изменении заголовка, из любого источника.
|
onIconChange | (icon: PageIcon | null, change: TitleChange) => void | Вызывается при каждом изменении значка, из любого источника. |