UNPKG

@yandex/ui

Version:

Yandex UI components

161 lines (106 loc) 13.7 kB
# Slider <a href='https://github.yandex-team.ru/search-interfaces/frontend/tree/master/packages/lego-components/src/Slider' target='_blank'><img src='https://badger.yandex-team.ru/custom/[Исходники]/[Github ][green]/badge.svg' /></a> <a href='https://search.yandex-team.ru/stsearch?text=Slider.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, { useState } from 'react' import { compose } from '@bem-react/core' import { Slider as SliderBase, withViewDefault, useSliderState, } from '@yandex-lego/components/Slider/desktop' const Slider = compose(withViewDefault)(SliderBase) const App = () => { const state = useSliderState({ value: [10] }) return <Slider view="default" {...state} /> } ``` Использование с полным набором модификаторов: ```ts // src/App.ts import React, { useState } from 'react' import { Slider, useSliderState, } from '@yandex-lego/components/Slider/desktop/bundle' const App = () => { const state = useSliderState({ value: [10] }) return <Slider view="default" {...state} /> } ``` ## Примеры ### Базовый В самом простом случае достаточно указать `view` и `value`. Для того, чтобы задать диапазон, необходимо в свойство `value` передать два числа. {{%story::desktop:controls-slider-desktop--basic%}} ### Заполненный Чтобы показать индикатор выбранного диапазона, установите свойство `filled`. {{%story::desktop:controls-slider-desktop--filled%}} ### Развернутый Чтобы отобразить слайдер в обратном направлении, установите свойство `reverse`. {{%story::desktop:controls-slider-desktop--reversed%}} ### Дискретный Чтобы задать шаг смещения, установите свойство `step` с необходимым значением. > ⚠️ При больших значениях min/max рекомендуется так же устанавливать большое значение для шага. {{%story::desktop:controls-slider-desktop--stepped%}} ### Маркированный Чтобы разметить слайдер или показать значения в определенном шаге, установите следующие свойства: - `showTicks` — Показывает метки на треке - `showTickValues` — отображает значения на метках трека (по умолчанию показывает только минимальное и максимальное значения) > ⚠️ Не рекомендуется использовать данные свойства при очень больших значениях (min/max) и маленьком шаге (step), т.к. они создают лишние DOM-узлы. {{%story::desktop:controls-slider-desktop--marked%}} ### Пользовательский Thumb При необходимости можно заменить элемент `Thumb` на свою реализацию, для этого установите свойство `renderThumb` со своим компонентом. {{%story::desktop:controls-slider-desktop--custom-thumb%}} ### Пользовательский LabelTick При необходимости можно заменить элемент `LabelTick` на свою реализацию, для этого установите свойство `renderTickLabel` со своим компонентом. {{%story::desktop:controls-slider-desktop--custom-label-tick%}} ## Свойства <!-- props:start --> | Свойство | Тип | По умолчанию | Описание | | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ | ---------------------------------------------------------------------------------------------------------------- | | value | `number[]` || Выбранные значения на слайдере | | className? | `string` || Дополнительный класс у корневого DOM-элемента | | disabled? | `false \| true` | `false` | Неактивное состояние слайдера | | min? | `number` | `0` | Минимальное число, которое можно выбрать на слайдере<br>Может быть как положительным, так и отрицательным числом | | max? | `number` | `100` | Максимальное число, которое можно выбрать на слайдере<br>Должен быть только положительным числом | | step? | `number` | `1` | Шаг, который делает бегунок за одно обновление<br>Должен быть больше 0 и делиться на (max - min) | | filled? | `false \| true` | `false` | Отображает индикатор выбранного диапазона | | reverse? | `false \| true` | `false` | Отображает слайдер в противоположном направлении | | vertical? | `false \| true` | `false` | Устанавливает слайдер в вертикальную ориентацию | | onInput | `(event: any, value: number[]) => void` | — | Обработчик, который вызывается при каждом обновлении бегунка | | onChange? | `(event: any, value: number[]) => void` | — | Обработчик, который вызывается при окончательном выборе значения | | renderThumb? | `(props: SliderThumbProps, component: any) => ReactElement<any, string \| ((props: any) => ReactElement<any, string \| ... \| (new (props: any) => Component<any, any, any>)>) \| (new (props: any) => Component<...>)>` | — | Переопределяет компонент `SliderThumb` | | renderTickLabel? | `(props: SliderTickLabelProps, component: any) => ReactElement<any, string \| ((props: any) => ReactElement<any, string \| ... \| (new (props: any) => Component<any, any, any>)>) \| (new (props: any) => Component<...>)>` | `$renderTickLabel` | Переопределяет компонент `SliderTickLabel` | | showTicks? | `false \| true` | `false` | Показывает метки на треке | | showTickValues? | `false \| true` | `false` | Отображает значения на метках трека<br>По умолчанию показывает только минимальное и максимальное значения | | testId? | `string` | — | Идентификатор, используемый в тестах | <!-- props:end --> ## Доступность Слайдер устанавливает следующие свойства для элемента `Thumb`: - `role="slider"` - `aria-valuemin` - `aria-valuemax` - `aria-valuenow` - `aria-disabled` Элементы `Thumb` могут принимать фокус и управляться через клавиатуру: - Клавиши `tab` и `shift+tab` перемещают фокус между бегунками - Клавиши `arrow up` или `arrow right` увеличивают значение бегунка на один шаг - Клавиши `arrow down` или `arrow left` уменьшают значение бегунка на один шаг ## Улучшения Что можно улучшить: 1. Форкнуть пакет `react-range` и удалить весь лишний код, который мы не используем (расчет позиции марок, валидация, перетаскивание элемента range). 1. После форка пакета можно реализовать хук `useSlider`, который будет реализовывать всю логику и возвращать свойства для конкретных элементов. 1. Доработать клавиатурное управление (`fn+arrow left/right` на данный момент не работает).