@yandex/ui
Version:
Yandex UI components
180 lines (137 loc) • 14.2 kB
Markdown
# Tooltip
<a href='https://github.yandex-team.ru/search-interfaces/frontend/tree/master/packages/lego-components/src/Tooltip' target='_blank'><img src='https://badger.yandex-team.ru/custom/[Исходники]/[Github
][green]/badge.svg' /></a> <a href='https://search.yandex-team.ru/stsearch?text=Tooltip.ts&facet.queue=ISL&facet.type=bug&facet.status=128' target='_blank'><img src='https://badger.yandex-team.ru/custom/[Известные проблемы]/[Startrek][blue]/badge.svg' /></a>
<!-- description:start -->
Компонент, использующийся для создания всплывающих подсказок.
<!-- description:end -->
## Пример использования
Конфигурация темы на уровне проекта:
```ts
// src/lib/theme.ts
import { configureRootTheme } from '@yandex-lego/components/Theme'
import { theme } from '@yandex-lego/components/Theme/presets/default'
configureRootTheme({ theme })
```
Использование с нужным набором модификаторов:
```ts
// src/App.ts
import React from 'react'
import { compose } from '@bem-react/core'
import {
Tooltip as TooltipDesktop,
withSizeM,
withViewDefault,
} from '@yandex-lego/components/Tooltip/desktop'
const Tooltip = compose(
withSizeM,
withViewDefault,
)(TooltipDesktop)
const App = () => {
const [visible, setVisible] = React.useState(false)
const buttonRef = React.useRef(null)
return (
<>
<button
ref={buttonRef}
onMouseOver={() => setVisible(true)}
onMouseLeave={() => setVisible(false)}
>
Target
</button>
<Tooltip view="default" size="m" anchor={buttonRef} visible={visible}>
Description
</Tooltip>
</>
)
}
```
Использование с полным набором модификаторов:
При использовании компонента `stateless` необходимо связать `target` и `tooltip` через свойство `anchor`, а также задать свойство `visible`.
```ts
// src/App.ts
import React from 'react'
import { Tooltip } from '@yandex-lego/components/Tooltip/desktop/bundle'
const App = () => {
const [visible, setVisible] = React.useState(false)
const buttonRef = React.useRef(null)
return (
<>
<button
ref={buttonRef}
onMouseOver={() => setVisible(true)}
onMouseLeave={() => setVisible(false)}
>
Target
</button>
<Tooltip view="default" size="m" anchor={buttonRef} visible={visible}>
Description
</Tooltip>
</>
)
}
```
При использовании компонента `stateful` достаточно обернуть любой react-элемент в `TooltipStateful` и задать описание в `content`.
```ts
import React from 'react'
import { TooltipStateful } from '@yandex-lego/components/Tooltip/desktop/bundle'
const App = () => (
<TooltipStateful view="default" size="m" content="Description">
<button>
Target
</button>
</TooltipStateful>
)
```
## Примеры
### Размер подсказки
Чтобы изменить размер подсказки, установите свойство `size` в одно из следующих значений: `"s"`, `"m"`, `"l"`.
{{%story::desktop:surface-tooltip-desktop--size%}}
### Состояние подсказки
Чтобы изменить состояние подсказки, установите свойство `state` в одно из следующих значений: `"warning"`, `"alert"`, `"success"`.
{{%story::desktop:surface-tooltip-desktop--state%}}
### Направление раскрытия подсказки
Чтобы изменить направление раскрытия подсказки, установите свойство `direction` с одним или несколькими допустимыми значениями — `"top-left"`, `"top-center"`, `"top-right"`, `"right-top"`, `"right-center"`, `"right-bottom"`, `"bottom-right"`, `"bottom-center"`, `"bottom-left"`, `"left-bottom"`, `"left-center"`, `"left-top`".
Если свойство `direction` не было установлено, то будут использованы <a href="https://github.yandex-team.ru/search-interfaces/frontend/blob/master/packages/lego-components/src/Popup/_target/Popup_target_anchor.tsx#L19-L32" target="_blank">значения по умолчанию</a> в порядке приоритета раскрытия.
{{%story::desktop:surface-tooltip-desktop--direction%}}
## Свойства
### Stateless
Компонент частично реализует интерфейс `Popup` и `PopupTargetAnchor`.
<!-- props:start -->
| Свойство | Тип | По умолчанию | Описание |
| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
| keepMounted? | `false \| true` | `true` | Сохраняет контейнер в DOM после создания |
| className? | `string` | — | Дополнительный класс |
| hasTail? | `false \| true` | — | Включает/отключает хвостик у попапа |
| innerRef? | `(instance: HTMLDivElement) => void \| RefObject<HTMLDivElement>` | — | Ссылка на корневой DOM-элемент компонента |
| zIndex? | `number` | — | Задает слой `z-index` |
| visible? | `false \| true` | — | Делает попап видимым |
| scope? | `RefObject<HTMLElement>` | `document.body` | Ссылка на DOM-элемент, в котором размещается попап; важно, чтобы контейнер имел `position: relative` для корректного позиционирования |
| onClose? | `(event: KeyboardEvent \| MouseEvent, source: "esc" \| "click") => void` | — | Обработчик, вызывающийся после нажатия на клавишу Esc либо мышкой на область вне контейнера |
| onClick? | `(event: MouseEvent<HTMLDivElement, MouseEvent>) => void` | — | Обработчик, вызываемый при срабатывании события click |
| mainOffset? | `number` | `0` | Отступ попапа относительно основного направления |
| secondaryOffset? | `number` | `0` | Отступ попапа относительно второстепенного направления |
| tailOffset? | `number` | `0` | Отступ хвостика от края попапа |
| anchor? | `RefObject<HTMLElement>` | — | Элемент, относительно которого позиционируется попап |
| state? | `"warning" \| "alert" \| "success"` | — | Визуальное состояние подсказки |
| direction? | `"bottom-left" \| "bottom-center" \| "bottom-right" \| "top-left" \| "top-center" \| "top-right" \| "right-top" \| "right-center" \| "right-bottom" \| "left-top" \| "left-center" \| "left-bottom" \| Direction[]` | — | Направление для раскрытия подсказки |
| id? | `string` | — | Уникальный id подсказки |
<!-- props:end -->
### Stateful
Компонент частично реализует интерфейс `Tooltip`.
| Свойство | Тип | По умолчанию | Описание |
| --------------- | -------------------------------------------- | ------------ | -------------------------------------------------------------- |
| children | `ReactNode` | — | Компонент или элемент, для которого нужно показать подсказку |
| content | `ReactNode` | — | Содержимое, которое будет показано в подсказке |
| trigger? | `"click" \| "hover" \| "focus" \| Trigger[]` | `hover` | Режим для показа подсказки; может содержать несколько значений |
| defaultVisible? | `false \| true` | `false` | Показывает подсказку сразу видимой |
## Доступность
Чтобы обеспечить доступность с использованием компонента `stateless`, необходимо связать `anchor` с подсказкой, указав `aria-describedby` и `id`.
> ⚠️ При использовании компонента `stateful` эта логика реализована внутри.
```ts
<button aria-describedby="tooltip-1">
Target
</button>
<Tooltip id="tooltip-1">
Description
</Tooltip>
```