Редактирование на месте
Редактирование на месте показывает значение обычным текстом и по нажатию превращает его в поле. Подходит для значений, которые в основном читают и иногда меняют, например заголовка.
<tk-inline-edit label="title" value="Project Falcon" empty-label="Add a title"> <tk-input slot="edit" aria-label="Title"></tk-input> </tk-inline-edit>
Анатомия
| Часть | Что это |
|---|---|
tk-inline-edit |
сам элемент; хранит значение и режим |
| режим чтения | кнопка, которая выглядит как обычный текст; показывает значение или приглашение для пустого |
слот edit |
один tk-input или tk-textarea, виден при редактировании |
| «Сохранить» и «Отмена» | кнопки под tk-textarea; под tk-input их нет |
При смене режима значение остаётся на месте.
Сохранение и отмена
Как сохраняется правка, решает поле в слоте.
| В слоте | Сохранить | Отменить | Нажать или уйти Tab-ом в сторону |
|---|---|---|---|
tk-input |
Enter или уйти с поля |
Esc |
сохраняет |
tk-textarea |
кнопка «Сохранить» | кнопка «Отмена» или Esc |
правка остаётся открытой |
<tk-inline-edit label="description" empty-label="Add a description"> <tk-textarea slot="edit" aria-label="Description" rows="4"></tk-textarea> </tk-inline-edit>
Escвсегда отменяет и возвращает значение.confirm="buttons"добавляет «Сохранить» и «Отмена» кtk-input, для настроек и полей аккаунта.- Не ставьте
confirm="blur"наtk-textarea: нажатие мимо сохранит недописанный текст. В консоли появится предупреждение.
Поле для правки
<tk-inline-edit label="display name" value="Ada Lovelace" empty-label="Add your name"> <tk-input slot="edit" aria-label="Display name" autocomplete="name"></tk-input> </tk-inline-edit>
- Положите в
slot="edit"одинtk-inputилиtk-textarea. Другие элементы получают кнопки «Сохранить» и «Отмена» и предупреждение в консоли. - Дайте полю свой
aria-label, совпадающий сlabel. Не оборачивайте его вField : появится вторая видимая подпись. - Не задавайте полю
name. Редактирование на месте не поле формы: чтобы отправить значение с формой, копируйтеvalueв скрытое поле.
Состояния
<tk-inline-edit label="subtitle" empty-label="Add a subtitle"> <tk-input slot="edit" aria-label="Subtitle"></tk-input> </tk-inline-edit>
В покое значение выглядит как обычный текст. При наведении появляется лёгкая подложка, при фокусе с клавиатуры — рамка.
- Пусто: без
valueв режиме чтения виденempty-label, единственный знак, что значение можно изменить. Пишите его как действие. editing: поле открыто. Задайте его, чтобы открыть поле из кода или закрыть после сохранения.loading: идёт сохранение, правка остаётся открытой. На кнопке «Сохранить» крутится индикатор, а без кнопок поле становится только для чтения.
Проверка и сохранение на сервер
inlineEdit.addEventListener('tk-commit', async (e) => {
e.preventDefault();
inlineEdit.loading = true;
try {
await save(e.detail.value);
inlineEdit.value = e.detail.value;
inlineEdit.editing = false;
} catch {
toaster.toast("Couldn't save the title. Try again");
} finally {
inlineEdit.loading = false;
}
});tk-commitможно отменить. Если его не отменить, значение обновится и вернётся режим чтения. ВызовитеpreventDefault(), чтобы поле оставалось открытым, пока вы проверяете или сохраняете.- Покажите проблему сами, например в
Toast . У редактирования на месте и его поля нет своего сообщения об ошибке. - Для однострочного значения дайте отмену, например toast с действием Undo: нажатие мимо сохраняет.
Когда использовать
- Редактирование на месте — для одного значения прямо там, где оно показано: заголовка страницы, поля профиля, описания.
- Для обычных полей формы берите
Input илиTextarea . - Чтобы переименовать файл, доску или команду, нужен
Dialog . - Не используйте его для ячеек таблицы.
- Для ответов, которые проверяют перед отправкой, дайте ссылку на отдельную страницу для изменения.
- Для значения, которое нельзя изменить, берите
Text .
Текст
- В
label— существительное, которое редактируют, например «title». Скринридер произнесёт «Edit title, Project Falcon». empty-labelпишите как действие, с заглавной только в начале, без точки в конце: «Добавить описание».- Оставляйте «Сохранить» и «Отмена», если контекст не требует других слов; поменять их
можно через
save-labelиcancel-label.
Можно / нельзя
| ✅ Можно | ❌ Нельзя |
|---|---|
tk-input для одной строки, tk-textarea для длинного текста |
Сохранять длинный текст при нажатии мимо |
| Приглашение как действие: «Добавить описание» | Пустое значение без приглашения |
Свой aria-label у поля |
Оборачивать поле в Field |
Держать поле открытым через preventDefault(), пока идёт проверка |
Закрывать поле при неудачном сохранении |
| Toast с Undo для однострочных правок | Считать, что нажатие мимо было намеренным |
| Править одно значение на месте | Ячейки таблицы или переименование файлов |
Связанные
Input иTextarea : поля для слота.Toast : для ошибок и отмены после сохранения.Dialog : для переименования и всего, что удаляет.Text : для значений, которые нельзя изменить.
API
Атрибуты
| Атрибут | Тип | По умолчанию | Что делает |
|---|---|---|---|
value |
string | '' |
сохранённое значение; заполняет поле, когда начинается правка |
label |
string | '' |
что редактируют, например «title», обязателен; называет режим чтения |
empty-label |
string | '' |
приглашение, когда value пустой |
confirm |
auto | blur | buttons |
auto |
как сохраняется правка; auto зависит от поля в слоте |
editing |
boolean | false |
открыто ли поле |
loading |
boolean | false |
идёт сохранение |
save-label |
string | Save |
подпись кнопки сохранения |
cancel-label |
string | Cancel |
подпись кнопки отмены |
Слоты
| Слот | Содержимое |
|---|---|
edit |
один tk-input или tk-textarea со своим aria-label, обязателен |
События
| Событие | Detail | Когда |
|---|---|---|
tk-commit |
{ value } |
правку сохраняют; можно отменить, и тогда поле остаётся открытым |
tk-cancel |
правку отменили; поле возвращает значение | |
tk-edit |
начинается правка |
Методы
focus() переводит фокус на поле во время правки, иначе на режим чтения.
CSS
::part(read): кнопка режима чтения.::part(value): значение или приглашение.::part(edit): режим правки.::part(controls),::part(save),::part(cancel): ряд кнопок и каждая кнопка.
Токены
| Роль | Токен |
|---|---|
| приглашение для пустого | text/secondary |
| подложка при наведении | state/hover |
| рамка фокуса | border/accent/focus |
| углы подложки | radius-8 |
| отступы режима чтения, промежуток между кнопками | space-4, space-8 |
Значение берёт стиль и цвет окружающего текста. Поле и кнопки используют свои токены.
Значения по темам:
Доступность
Встроено:
- Режим чтения — настоящая кнопка, её имя называет действие и значение: «Edit title, Project Falcon».
- Когда начинается правка, фокус переходит в поле, а после
Enter,Esc, «Сохранить» или «Отмена» возвращается на режим чтения. Если ушли Tab-ом или нажали мимо, фокус остаётся там, куда его перевели. Escработает только во время правки, поэтому в остальное время не закрывает окружающий диалог.- Приглашение для пустого значения проходит контраст для текста в любой теме.
- Режим чтения не ниже 24px, рамка фокуса никогда не прячется.
На вашей стороне:
- Дайте полю в слоте
aria-label, совпадающий сlabel. - Пишите
empty-labelкак действие. - Ошибки сохранения показывайте сами, а для однострочных правок дайте отмену.
| Клавиша | Действие |
|---|---|
Tab |
переводит фокус на режим чтения |
Enter / Space |
в режиме чтения начинает правку |
Enter |
в tk-input сохраняет; в tk-textarea переносит строку |
Esc |
отменяет и возвращает значение |
Tab в сторону |
из tk-input сохраняет; из tk-textarea оставляет правку открытой |