Кнопка с меню
Кнопка с меню соединяет основное действие и стрелку, которая открывает меню альтернатив. Основное действие срабатывает в одно нажатие, остальные ждут за стрелкой.
<tk-split-button variant="primary" trigger-label="More merge options">
<tk-button slot="action">Merge pull request</tk-button>
<tk-menu slot="menu" label="Merge options">
<tk-menu-item>Squash and merge</tk-menu-item>
<tk-menu-item>Rebase and merge</tk-menu-item>
</tk-menu>
</tk-split-button>Анатомия
| Часть | Что это |
|---|---|
tk-split-button |
сам элемент; объединяет два сегмента |
слот action |
основное действие: tk-button слева; своя остановка Tab |
part divider |
линия 1px между сегментами |
| стрелка | кнопка-иконка со стрелкой, её добавляет сам компонент; своя остановка Tab |
слот menu |
tk-menu только с пунктами; его открывает стрелка |
Композиция
Положите tk-button в слот action, а tk-menu только с пунктами — в слот menu.
Триггер не пишите: компонент сам добавит стрелку и свяжет её с меню. variant, size,
disabled и loading он передаёт обоим сегментам, поэтому задавайте их на
tk-split-button, а не на частях.
Слушайте click на кнопке действия и на каждом tk-menu-item.
Варианты
<tk-split-button variant="primary" trigger-label="More publish options"> <tk-button slot="action">Publish</tk-button> <tk-menu slot="menu" label="Publish options"><tk-menu-item>Schedule</tk-menu-item></tk-menu> </tk-split-button> <tk-split-button trigger-label="More export options"> <tk-button slot="action">Export</tk-button> <tk-menu slot="menu" label="Export options"><tk-menu-item>Export as PDF</tk-menu-item></tk-menu> </tk-split-button>
primary: главное действие экрана. Одна на экран.secondary(по умолчанию): все остальные кнопки с меню.
Варианта ghost и опасной кнопки с меню нет.
Форма
shape="round" полностью скругляет края блока. Стык между сегментами остаётся прямым.
<tk-split-button shape="round" trigger-label="More save options"> <tk-button slot="action">Save</tk-button> <tk-menu slot="menu" label="Save options"><tk-menu-item>Save as copy</tk-menu-item></tk-menu> </tk-split-button>
Размеры
<tk-split-button size="small" trigger-label="More options"> <tk-button slot="action">Small</tk-button> <tk-menu slot="menu" label="Options"><tk-menu-item>Duplicate</tk-menu-item></tk-menu> </tk-split-button> <tk-split-button size="large" trigger-label="More options"> <tk-button slot="action">Large</tk-button> <tk-menu slot="menu" label="Options"><tk-menu-item>Duplicate</tk-menu-item></tk-menu> </tk-split-button>
small, medium (по умолчанию) и large высотой 24, 32 и 36px, как у
Состояния
<tk-split-button disabled trigger-label="More publish options"> <tk-button slot="action">Publish</tk-button> <tk-menu slot="menu" label="Publish options"><tk-menu-item>Schedule</tk-menu-item></tk-menu> </tk-split-button> <tk-split-button variant="primary" loading trigger-label="More publish options"> <tk-button slot="action">Publish</tk-button> <tk-menu slot="menu" label="Publish options"><tk-menu-item>Schedule</tk-menu-item></tk-menu> </tk-split-button>
disabled: отключает оба сегмента.loading: в кнопке действия крутится индикатор, повторные нажатия не срабатывают; стрелка отключена, пока идёт загрузка.
Когда использовать
- Когда одно действие явно главное, есть несколько альтернатив, а места мало.
- Если главного действия нет, берите
Menu с подписанным триггером: тогда меню открывает весь контрол. - Если все действия помещаются на экране, берите
Button group или обычныеButton . - Чтобы выбрать значение, которое сохраняется и отправляется с формой, берите
Select . Кнопка с меню выполняет команды. - Не делайте опасное действие основным. Возьмите опасную
Button с подтверждением или поставьте действие последним в меню.
Текст
- Подпись действия: самое частое действие, по правилам подписей
Button : глагол и объект, заглавная буква только в начале. - В меню только альтернативы. Не повторяйте в нём основное действие и не меняйте подпись на последний выбранный пункт.
- Хватит одной альтернативы. Если альтернатив нет, возьмите обычную Button.
trigger-labelназывает, что прячется за стрелкой: «Другие варианты слияния». По умолчанию «More actions».- Пункты меню — по правилам
Menu : опасный пункт последний, после разделителя, и просит подтверждения.
Можно / нельзя
| ✅ Можно | ❌ Нельзя |
|---|---|
| Кнопка с меню, когда одно действие главное | Кнопка с меню для равных действий: для них есть меню |
| Главное действие в видимом сегменте | Прятать его в меню или повторять там |
| Опасное действие в меню, с подтверждением | Делать его основным, в одно нажатие |
tk-split-button для одного соединённого блока |
Две отдельные кнопки вплотную друг к другу |
Связанные
Button : сегмент действия.Menu : меню за стрелкой, а ещё выбор, когда главного действия нет.Button group : несколько видимых действий в одном блоке.Select : выбирает значение, а не выполняет команду.
API
Атрибуты
| Атрибут | Тип | По умолчанию | Что делает |
|---|---|---|---|
variant |
primary | secondary |
secondary |
насколько кнопка заметна; передаётся обоим сегментам |
size |
small | medium | large |
medium |
высота 24 / 32 / 36px; передаётся обоим сегментам |
shape |
rect | round |
rect |
скруглённые или полностью скруглённые внешние углы; стык прямой |
disabled |
boolean | false |
отключает оба сегмента |
loading |
boolean | false |
индикатор в кнопке действия, стрелка отключена |
label |
string | не задан | доступное имя группы |
trigger-label |
string | More actions |
доступное имя стрелки |
Слоты
| Слот | Содержимое |
|---|---|
action |
одна tk-button, основное действие |
menu |
одно tk-menu только с пунктами, без триггера |
События
Своих событий нет. Слушайте click на кнопке действия и на пунктах меню.
CSS
::part(divider): линия между сегментами.
Токены
| Часть | Токен |
|---|---|
| сегменты | токены |
разделитель, secondary |
border/strong |
разделитель, primary |
text/accent/on-fill с непрозрачностью 25% |
| внешние углы | radius-8; radius-full при shape="round" |
Доступность
Встроено:
- Две настоящие кнопки и две остановки Tab: сначала действие, потом стрелка.
- У стрелки есть
aria-haspopup="menu"иaria-expanded. - Сегменты лежат в
role="group";labelдаёт группе имя. - Меню переводит фокус по пунктам и по Escape возвращает его на стрелку.
На вашей стороне:
- Задайте
trigger-label, который говорит, что за стрелкой. - Задайте
label, если группе нужно своё имя.
| Клавиша | Действие |
|---|---|
Tab |
переводит фокус на действие, потом на стрелку |
Space / Enter |
нажимает сегмент в фокусе |
Down / Up |
на стрелке открывает меню |
Esc |
закрывает меню и возвращает фокус на стрелку |