Tour
Быстрый старт
Минимальный пример — два шага, управление через open, current и onChange:
renderStep
renderStep — обязательный prop, отвечающий за содержимое карточки тура. Получает пять аргументов:
| Аргумент | Тип | Описание |
|---|---|---|
current | number | Индекс текущего шага (с нуля) |
length | number | Общее количество шагов |
last | boolean | true, если шаг последний |
step | TourStep | Данные текущего шага (title, description, …) |
goToStep | (index: number) => void | Переход к произвольному шагу |
Шаги тура
Массив steps задаёт последовательность шагов. Каждый шаг описывается объектом TourStep:
| Свойство | Тип | Описание |
|---|---|---|
target | string | RefObject | HTMLElement | CSS-селектор, React ref или DOM-элемент для подсветки |
placement | Placement | Позиция карточки относительно цели (bottom по умолчанию) |
highlightOffset | number | Отступ подсветки — переопределяет общий highlightOffset |
highlightBorderRadius | CSSProperties['borderRadius'] | Скругление подсветки — переопределяет общий highlightBorderRadius |
title | string | Заголовок карточки |
description | string | Описание карточки |
target
Свойство target принимает три формата:
- CSS-селектор
- React ref
Строка CSS-селектора — элемент ищется через document.querySelector:
Объект React.RefObject — наиболее распространённый подход:
Оверлей
Свойство withOverlay включает затемнение фона вокруг подсвеченного элемента. Цвет регулируется через overlayColor:
- withOverlay
- overlayColor
С помощью overlayColor можно задать произвольный цвет оверлея:
Подсветка элемента
highlightOffset задаёт отступ вокруг целевого элемента. highlightBorderRadius задаёт форму подсветки. Оба свойства можно переопределить на уровне конкретного шага:
- highlightOffset
- highlightBorderRadius
По умолчанию скругление вычисляется автоматически на основе border-radius целевого элемента. Можно задать явно:
Стрелка
Свойство hasTail добавляет стрелку-указатель к карточке тура. Цвет стрелки задаётся через tailColor:
Позиционирование карточки
offset задаёт отступ карточки от целевого элемента в формате [mainAxis, crossAxis]. Направление определяется свойством placement в каждом шаге:
- offset
- placement
Значение placement в шаге задаёт сторону размещения карточки:
Контролируемый и неконтролируемый режим
Компонент поддерживает оба режима работы:
- Контролируемый
- Неконтролируемый
Управление состоянием вынесено наружу через open, current, onChange и onClose:
Начальные значения задаются через defaultOpen и defaultCurrent. Компонент управляет состоянием самостоятельно:
import React, { useRef } from 'react';
import { Tour, Button } from '@salutejs/sdds-cs';
export function App() {
const ref1 = useRef(null);
const ref2 = useRef(null);
const steps = [
{ target: ref1, title: 'Шаг 1 из 2', description: 'Тур открыт по умолчанию.' },
{ target: ref2, title: 'Шаг 2 из 2', description: 'Неконтролируемый режим.', placement: 'top' },
];
const renderStep = (cur, length, last, step, goToStep) => (
<div style={{ padding: '1rem', background: 'var(--surface-solid-card)', borderRadius: '0.75rem', boxShadow: '0 4px 16px rgba(0,0,0,0.12)', maxWidth: '16rem', display: 'flex', flexDirection: 'column', gap: '0.5rem' }}>
{step.title && <strong>{step.title}</strong>}
{step.description && <small style={{ opacity: 0.7 }}>{step.description}</small>}
<div style={{ display: 'flex', gap: '0.5rem', marginTop: '0.25rem' }}>
{cur > 0 && <Button size="s" view="secondary" onClick={() => goToStep(cur - 1)}>Назад</Button>}
{last ? <Button size="s" view="default">Закрыть</Button> : <Button size="s" view="default" onClick={() => goToStep(cur + 1)}>Далее</Button>}
</div>
</div>
);
return (
<div style={{ padding: '2rem', display: 'flex', flexDirection: 'column', gap: '4rem' }}>
<div style={{ display: 'flex', justifyContent: 'space-between' }}>
<Button ref={ref1} view="secondary">Элемент 1</Button>
<Button ref={ref2} view="secondary">Элемент 2</Button>
</div>
<Tour defaultOpen defaultCurrent={0} steps={steps} renderStep={renderStep} />
</div>
);
}
Кастомная подсветка
Свойство renderHighlight заменяет стандартную подсветку произвольным React-элементом. При использовании вместе с withOverlay={false} позволяет создать полностью кастомный эффект без тёмного оверлея.
Функция получает объект TourHighlightProps:
| Свойство | Тип | Описание |
|---|---|---|
left | number | Координата X подсветки (уже учитывает highlightOffset) |
top | number | Координата Y подсветки (уже учитывает highlightOffset) |
width | number | Ширина подсветки (уже учитывает highlightOffset) |
height | number | Высота подсветки (уже учитывает highlightOffset) |
borderRadius | number | Скругление блока высветления |
Пример с анимированным пульсирующим бордером: