Search field
Search field принимает поисковый запрос. В нём есть иконка поиска, кнопка очистки и состояние загрузки. Сам он ничего не ищет: запрос выполняете и результаты показываете вы.
<form action="/search"> <tk-search-field name="q" label="Search invoices" placeholder="Invoice number or customer"></tk-search-field> </form>
Анатомия
| Часть | Что это |
|---|---|
tk-search-field |
сам элемент; отправляет одно значение под именем name |
part field |
рамка поля |
| иконка поиска | украшение; при loading её заменяет спиннер |
part input |
нативный <input type="search"> |
part clear |
кнопка очистки; появляется, когда есть текст, и получает фокус |
Подпись
<tk-search-field label="Search orders"></tk-search-field>
<tk-field label="Find a customer" helper="Name, email, or account ID"> <tk-search-field name="customer"></tk-search-field> </tk-field>
- Видимой подписи у search field нет. Он называет себя по
label, по умолчанию «Search». Напишите, что именно ищут:label="Search orders". - Для видимой подписи, подсказки или ошибки оберните поле в
Field . Тогда поле называет подпись Field, аlabelзадавать не нужно.
Размеры
<tk-search-field label="Search files"></tk-search-field> <tk-search-field label="Search files" size="large"></tk-search-field>
size |
Высота | Отступы по бокам | Текст значения |
|---|---|---|---|
medium (по умолчанию) |
32px | space-8 в начале, space-4 в конце |
Body Small (14/20) |
large |
36px | space-10 в начале, space-4 в конце |
Body Medium (16/24) |
Высоты совпадают с кнопками medium и large. Размера small нет: с size="small"
поле рисуется как medium и пишет предупреждение в консоль.
Состояния
<tk-search-field label="Search invoices" value="March" loading></tk-search-field> <tk-search-field label="Search invoices" disabled></tk-search-field>
При наведении рамка не меняется. Когда фокус в тексте, рамка окрашивается в цвет фокуса и утолщается внутрь; у кнопки очистки своё кольцо фокуса.
loading: спиннер заменяет иконку поиска, а поле сообщает скринридерам, что идёт загрузка. Кнопка очистки остаётся, чтобы запрос можно было отменить, очистив поле.disabled: на поле нельзя перейти и нельзя ввести текст, кнопка очистки скрыта, а в форму поле не попадает.- Ошибка и обязательность: задайте
errorиrequiredуField .
Очистка
- Кнопка очистки и Escape очищают поле. Фокус переходит в текст и не теряется.
- Escape срабатывает, только когда есть текст. В
Dialog илиPopover первый Escape очищает поле, а второй закрывает окно. - При очистке приходят
input,changeиtk-clear. Вtk-clearполеdetail.reasonговорит, как очистили:buttonилиescape. Отменить очистку нельзя.
Поиск
Поле только хранит запрос. Когда искать, сколько ждать и как сообщить о найденном, решаете вы:
<tk-search-field id="filter" label="Filter sections"></tk-search-field>
<p id="count" role="status"></p>
<script>
const field = document.getElementById('filter');
field.addEventListener('input', debounce(() => render(field.value), 200));
field.addEventListener('tk-clear', () => render(''));
</script>- Слушайте
input, пока человек печатает,change, когда он подтвердил ввод, илиsubmitформы по Enter. - Встроенной задержки нет; ждите столько, сколько нужно вашему поиску.
- Сообщайте число результатов в своей области
role="status", например «12 результатов».
Когда использовать
- Search field — для запроса, который фильтрует или загружает то, что показано в другом месте страницы: список, таблицу, страницу результатов.
- Для любого другого однострочного значения, например имени или адреса сайта, берите
Input . - Если запрос должен закончиться выбором одного варианта из списка, например с
подсказками или автодополнением, берите
Combobox . Не кладите Combobox внутрь search field. - Кнопку отправки ставьте рядом с полем, а не внутрь.
| Search field | Combobox | |
|---|---|---|
| Enter | отправляет запрос как есть | выбирает подсвеченный вариант |
| Значение | свободный текст | один из вариантов |
| Результаты | в другом месте страницы, ваши | в его собственном списке |
Текст
label: скажите, что ищут: «Поиск по счетам», а не просто «Поиск».- Плейсхолдер: по желанию; короткая подсказка, что можно ввести, например «Номер счёта или клиент». Никогда не единственное описание.
clear-label: по умолчанию «Clear search»; поменяйте, еслиlabelна другом языке.
Можно / нельзя
| ✅ Можно | ❌ Нельзя |
|---|---|
Класть поле в <form>, чтобы Enter отправлял запрос |
Писать свой обработчик Enter для отправки |
Писать в label, что ищут |
Оставлять на странице три поля с именем «Search» |
Сообщать результаты в своей области role="status" |
Ждать, что поле само объявит результаты |
| Брать Combobox, если запрос выбирает вариант | Вкладывать Combobox в search field |
| Выдерживать свою задержку перед запросом | Искать атрибут debounce |
Связанные
Input : любое другое однострочное значение.Combobox : запрос, который выбирает один вариант из списка.Field : видимая подпись, подсказка и ошибка вокруг поля.
API
Атрибуты
| Атрибут | Тип | По умолчанию | Что делает |
|---|---|---|---|
value |
string | '' |
запрос; обновляется, пока печатают; присвоение не вызывает событий |
name |
string | — | имя поля в форме |
label |
string | 'Search' |
доступное имя; не видно; внутри Field не используется |
placeholder |
string | — | подсказка внутри пустого поля |
clear-label |
string | 'Clear search' |
доступное имя кнопки очистки |
loading |
boolean | false |
спиннер вместо иконки поиска и aria-busy |
size |
medium | large |
medium |
высота 32 / 36px |
disabled |
boolean | false |
не в фокусе, не редактируется, не попадает в форму |
required |
boolean | false |
браузер не отправит форму с пустым полем |
События
| Событие | Detail | Когда |
|---|---|---|
input |
— | на каждое нажатие клавиши и каждую очистку |
change |
— | когда запрос подтверждён, при уходе из поля или по Enter, и при каждой очистке |
tk-clear |
{ reason: 'button' | 'escape' } |
после очистки кнопкой или Escape; не отменяется |
Методы
focus(): переводит фокус в текст.
CSS
::part(field): рамка поля.::part(input): нативный<input>.::part(clear): кнопка очистки.
Токены
Во всех состояниях рамка использует
| Роль | Токен |
|---|---|
| иконка поиска и спиннер | icon/secondary; icon/disabled в отключённом поле |
| иконка очистки | icon/default |
| кнопка очистки при наведении / нажатии | state/hover / state/press |
| кольцо фокуса кнопки очистки | border/accent/focus, внутри кнопки |
Кнопка очистки — круг 24×24 (radius-full) с иконкой 16px. Значения по темам:
Доступность
Встроено:
- Нативное поле поиска с ролью
searchbox. - Кнопка очистки — настоящая кнопка с именем: до неё доходит Tab, Space и Enter очищают поле.
- При очистке фокус не падает на страницу.
- Escape не застревает: в пустом поле он проходит дальше.
- Встроенная кнопка очистки браузера скрыта, так что кнопка одна.
- Иконка поиска и спиннер скрыты от скринридеров.
На вашей стороне:
- Назовите поле по тому, что в нём ищут: через
labelили Field. - Сообщайте результаты в своей live-области; поле о них не знает.
| Клавиша | Действие |
|---|---|
Tab |
переводит фокус в текст, а затем на кнопку очистки, если есть текст |
Enter |
отправляет форму |
Escape |
очищает поле; в пустом поле ничего не делает |
Space / Enter на кнопке очистки |
очищает поле и возвращает фокус в текст |
Пределы контраста
Пределы те же, что у Input: см.