# Roving Focus Group
> Utility component that implements the roving tabindex method to manage focus between items.

<Callout variant="tip">

RovingFocusGroup is used throughout Vera in components such as
[Tabs](/components/tabs) and [Menu](/components/menu).

</Callout>

<Card
  href="https://www.w3.org/WAI/ARIA/apg/practices/keyboard-interface/#x6-6-keyboard-navigation-inside-components"
  title="Learn more about roving tabindex in Keyboard Navigation Inside Composite Components"
  actionIcon="externalLink"
/>

## Import

```js
import {
  RovingFocusGroup,
  createRovingFocusGroupScope
} from '@gemini-suite/vera-react';

// you may also access RovingFocusGroup context via hook:
// import { useRovingFocusContext } from '@gemini-suite/vera-react';
```

## Examples

### Horizontal

```jsx
<RovingFocusGroup.Root orientation="horizontal">
  <RovingFocusGroup.Item as={Button} variant="ghost">
    {'Button 1'}
  </RovingFocusGroup.Item>
  <RovingFocusGroup.Item as={Button} variant="ghost">
    {'Button 2'}
  </RovingFocusGroup.Item>
  <RovingFocusGroup.Item as={Button} variant="ghost">
    {'Button 3'}
  </RovingFocusGroup.Item>
  <RovingFocusGroup.Item as={Button} variant="ghost">
    {'Button 4'}
  </RovingFocusGroup.Item>
  <RovingFocusGroup.Item as={Button} variant="ghost">
    {'Button 5'}
  </RovingFocusGroup.Item>
</RovingFocusGroup.Root>
```

### Vertical

<Callout variant="tip">

When tabbing into below group, item 3 is initially focused because of
`active` prop.

</Callout>

```jsx
<RovingFocusGroup.Root
  orientation="vertical"
  as="ul"
  className="listBlock listBlock--withDivider fg-link"
>
  <RovingFocusGroup.Item as="li" className="listBlock-item pAs">
    {'Item 1'}
  </RovingFocusGroup.Item>
  <RovingFocusGroup.Item as="li" className="listBlock-item pAs">
    {'Item 2'}
  </RovingFocusGroup.Item>
  <RovingFocusGroup.Item as="li" className="listBlock-item pAs" active>
    {'Item 3'}
  </RovingFocusGroup.Item>
  <RovingFocusGroup.Item as="li" className="listBlock-item pAs">
    {'Item 4'}
  </RovingFocusGroup.Item>
  <RovingFocusGroup.Item as="li" className="listBlock-item pAs">
    {'Item 5'}
  </RovingFocusGroup.Item>
</RovingFocusGroup.Root>
```

### Loop

Use `loop` property to enable roving from last item to the first item, and vice versa.

```jsx
<RovingFocusGroup.Root loop={true}>
  <RovingFocusGroup.Item as={Button} variant="ghost">
    {'Button 1'}
  </RovingFocusGroup.Item>
  <RovingFocusGroup.Item as={Button} variant="ghost">
    {'Button 2'}
  </RovingFocusGroup.Item>
  <RovingFocusGroup.Item as={Button} variant="ghost">
    {'Button 3'}
  </RovingFocusGroup.Item>
</RovingFocusGroup.Root>
```

### Unfocusable items

Use `focusable` property to control if `RovingFocusGroup.Item` can be focused.

```jsx
<RovingFocusGroup.Root loop={true}>
  <RovingFocusGroup.Item as={Button} variant="ghost">
    {'Button 1'}
  </RovingFocusGroup.Item>
  <RovingFocusGroup.Item as={Button} variant="ghost" focusable={false} disabled>
    {'Button 2'}
  </RovingFocusGroup.Item>
  <RovingFocusGroup.Item as={Button} variant="ghost">
    {'Button 3'}
  </RovingFocusGroup.Item>
</RovingFocusGroup.Root>
```

### Right-to-left direction

Use `dir` property to change direction.

```jsx
<RovingFocusGroup.Root as={Flex} flow="row-reverse" dir="rtl">
  <RovingFocusGroup.Item as={Button} variant="ghost">
    {'Button 1'}
  </RovingFocusGroup.Item>
  <RovingFocusGroup.Item as={Button} variant="ghost">
    {'Button 2'}
  </RovingFocusGroup.Item>
  <RovingFocusGroup.Item as={Button} variant="ghost">
    {'Button 3'}
  </RovingFocusGroup.Item>
</RovingFocusGroup.Root>
```

---

## Keyboard support

<ul>
  <li iconName="minus">
    <Kbd>←</Kbd> moves focus to the previous item (if{' '}
    <InlineCode>orientation</InlineCode> is horizontal).
  </li>
  <li iconName="minus">
    <Kbd>→</Kbd> moves focus to the next item (if{' '}
    <InlineCode>orientation</InlineCode> is horizontal).
  </li>
  <li iconName="minus">
    <Kbd>↑</Kbd> moves focus to the previous item (if{' '}
    <InlineCode>orientation</InlineCode> is vertical).
  </li>
  <li iconName="minus">
    <Kbd>↓</Kbd> moves focus to the previous item (if{' '}
    <InlineCode>orientation</InlineCode> is vertical).
  </li>
  <li iconName="minus">
    <Kbd>home</Kbd> moves focus to the first item.
  </li>
  <li iconName="minus">
    <Kbd>end</Kbd> moves focus to the last item.
  </li>
  <li iconName="minus">
    <Kbd>Space</Kbd> or <Kbd>Enter</Kbd> triggers click on the item.
  </li>
</ul>

---

## API Reference

### RovingFocusGroup.Root

| Name          | Type                                                      | Default | Description                                                                                                                                                                                                                                                                                  | Required |
| ------------- | --------------------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
| `as`          | `keyof JSX.IntrinsicElements \| React.ComponentType<any>` | `span`  | Change the component to a different HTML tag or custom component. This will merge the original component props with the props of the supplied element/component and change the underlying DOM node.   For more details, read our [Composition](/get-started/composition#polymorphism) guide. |          |
| `css`         | `StitchesCss`                                             |         | Apply styles directly to a component in a similar way how you would define inline styles. Vera uses [Stitches](https://stitches.dev/) under the hood with a fully-typed API and support for features like tokens, media queries, or variants.                                                |          |
| `orientation` | `"horizontal" \| "vertical"`                              |         | Defines orientation of the group.                                                                                                                                                                                                                                                            |          |
| `dir`         | `"ltr" \| "rtl"`                                          | `ltr`   | Defines reading direction of the group.                                                                                                                                                                                                                                                      |          |
| `loop`        | `boolean`                                                 | `false` | When `true` roving focus will loop from last item to the first item, and vice versa.                                                                                                                                                                                                         |          |

### RovingFocusGroup.Item

| Name        | Type                                                      | Default | Description                                                                                                                                                                                                                                                                                  | Required |
| ----------- | --------------------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------- |
| `as`        | `keyof JSX.IntrinsicElements \| React.ComponentType<any>` | `span`  | Change the component to a different HTML tag or custom component. This will merge the original component props with the props of the supplied element/component and change the underlying DOM node.   For more details, read our [Composition](/get-started/composition#polymorphism) guide. |          |
| `css`       | `StitchesCss`                                             |         | Apply styles directly to a component in a similar way how you would define inline styles. Vera uses [Stitches](https://stitches.dev/) under the hood with a fully-typed API and support for features like tokens, media queries, or variants.                                                |          |
| `focusable` | `boolean`                                                 | `true`  | When `true` the item can be focused.                                                                                                                                                                                                                                                         |          |
| `active`    | `boolean`                                                 | `false` | When `true`, initial focus among the group is set to this particular item.                                                                                                                                                                                                                   |          |
