Arrow — это вспомогательный компонент в библиотеке Radix UI, который используется для создания стрелки, визуально связывающей всплывающие элементы с их триггером. Обычно применяется вместе с компонентами Tooltip, Popover, Dropdown Menu, Hover Card и другими, где нужно указать направление появления контента относительно элемента управления.
Arrow в Radix UI имеет минимальный набор свойств, но их правильная настройка позволяет добиться точной и красивой визуализации:
offset — задаёт смещение стрелки относительно края триггера. Позволяет контролировать расстояние стрелки от края всплывающего элемента.
<Arrow offset={10} />
Значение offset указывается в пикселях и по умолчанию
равно 0.
width и height — задают размеры стрелки. По умолчанию используется квадратная форма 10x10 пикселей.
<Arrow width={12} height={8} />asChild — позволяет использовать кастомный
элемент вместо стандартного <div> для стрелки. Это
особенно полезно при интеграции со сторонними компонентами или
SVG.
Arrow сам по себе не отображается отдельно. Его нужно помещать внутри Content компонента, например, у Tooltip или Popover:
import * as Tooltip from '@radix-ui/react-tooltip';
import { styled } from '@stitches/react';
const StyledArrow = styled(Tooltip.Arrow, {
fill: 'black',
});
<Tooltip.Provider>
<Tooltip.Root>
<Tooltip.Trigger>Наведи на меня</Tooltip.Trigger>
<Tooltip.Content side="top">
Текст подсказки
<StyledArrow />
</Tooltip.Content>
</Tooltip.Root>
</Tooltip.Provider>
В этом примере:
Tooltip.Content отвечает за контейнер всплывающего
окна.Tooltip.Arrow создаёт стрелку, указывающую на
Tooltip.Trigger.StyledArrow используется для стилизации стрелки,
задавая её цвет через fill.Arrow автоматически ориентируется в зависимости от свойства side у родительского компонента Content:
Также есть возможность задать align, чтобы контролировать горизонтальное или вертикальное позиционирование стрелки относительно родителя:
<Tooltip.Content side="top" align="start">
Подсказка с выравниванием
<Tooltip.Arrow offset={5} />
</Tooltip.Content>
Arrow в Radix UI — это SVG, и его стилизация отличается от обычного CSS-элемента:
fill.width и height.Пример с кастомной стилизацией:
import { keyframes, styled } from '@stitches/react';
import * as Popover from '@radix-ui/react-popover';
const pulse = keyframes({
'0%': { transform: 'scale(1)' },
'50%': { transform: 'scale(1.2)' },
'100%': { transform: 'scale(1)' },
});
const AnimatedArrow = styled(Popover.Arrow, {
fill: '#ff6347',
animation: `${pulse} 1s infinite`,
});
Arrow особенно полезен при использовании с компонентами DropdownMenu, Popover и HoverCard, где требуется точная визуальная связь между триггером и всплывающим контентом. Основные моменты:
side и align Content
автоматически передаются Arrow.offset можно избежать пересечения стрелки с
рамками и тенями всплывающего окна.asChild для SVG
или других элементов.Для Popover с кастомной стрелкой и динамическим смещением:
import * as Popover from '@radix-ui/react-popover';
<Popover.Root>
<Popover.Trigger>Открыть меню</Popover.Trigger>
<Popover.Content side="right" align="center">
Контент меню
<Popover.Arrow offset={12} />
</Popover.Content>
</Popover.Root>
Здесь стрелка автоматически размещается с правой стороны, смещена на 12 пикселей, выровнена по центру. При изменении позиции Content стрелка поворачивается и перемещается автоматически.
Arrow в Radix UI — это простой, но мощный инструмент для создания визуальных подсказок и указателей на триггерные элементы. Его гибкость в сочетании с Content позволяет:
Правильное использование Arrow повышает UX, делая интерфейс более наглядным и интуитивным.