Selector

A tabs style selection component.

The Selector component can be used as a simple selection component, or as a tabs style component.

import { Selector } from '@rewind-ui/core';

function App() {
  return (
     <Selector value="apple">
      <Selector.Tab anchor="apple" label="Apple" />
      <Selector.Tab anchor="orange" label="Orange" />
      <Selector.Tab anchor="banana" label="Banana" />
    </Selector>
  );
}

Import


Import the Selector component using the following import statement.

import { Selector } from '@rewind-ui/core';

Tones & Colors


The Selector component comes with two tones: solid and light.

The available color values, which are applied to the Selector.Tab are: white, blue, red, green, yellow, purple, gray, dark and black.

Solid

<View>
  <Selector color="white" tone="solid" value="1">
    // ...
  </Selector>
  <Selector color="blue" tone="solid" value="1">
    // ...
  </Selector>
  <Selector color="red" tone="solid" value="1">
    // ...
  </Selector>
  <Selector color="green" tone="solid" value="1">
    // ...
  </Selector>
  <Selector color="yellow" tone="solid" value="1">
    // ...
  </Selector>
  <Selector color="purple" tone="solid" value="1">
    // ...
  </Selector>
  <Selector color="gray" tone="solid" value="1">
    // ...
  </Selector>
  <Selector color="dark" tone="solid" value="1">
    // ...
  </Selector>
  <Selector color="black" tone="solid" value="1">
    // ...
  </Selector>
</View>

Light

<View>
  <Selector color="white" tone="light" value="1">
    // ...
  </Selector>
  <Selector color="blue" tone="light" value="1">
    // ...
  </Selector>
  <Selector color="red" tone="light" value="1">
    // ...
  </Selector>
  <Selector color="green" tone="light" value="1">
    // ...
  </Selector>
  <Selector color="yellow" tone="light" value="1">
    // ...
  </Selector>
  <Selector color="purple" tone="light" value="1">
    // ...
  </Selector>
  <Selector color="gray" tone="light" value="1">
    // ...
  </Selector>
  <Selector color="dark" tone="light" value="1">
    // ...
  </Selector>
  <Selector color="black" tone="light" value="1">
    // ...
  </Selector>
</View>

Multiple colors

The color prop can be set directly to the Selector.Tab component, which will override the color set on the Selector component.

<View>
  <Selector value="1">
    <Selector.Tab label="White" color="white" anchor="1" />
    <Selector.Tab label="Default" anchor="2" />
    <Selector.Tab label="Red" color="red" anchor="3" />
    <Selector.Tab label="Green" color="green" anchor="4" />
  </Selector>
</View>

Sizes


Available size values are: xs, sm, md and lg.

<View>
  <Selector size="xs" value="1">
    // ...
  </Selector>
  <Selector size="sm" value="1">
    // ...
  </Selector>
  <Selector size="md" value="1">
    // ...
  </Selector>
  <Selector size="lg" value="1">
    // ...
  </Selector>
</View>

Radiuses


Available radius values are: none, sm, base, md, lg and full.

<View>
  <Selector radius="none" value="1">
    // ...
  </Selector>
  <Selector radius="sm" value="1">
    // ...
  </Selector>
  <Selector radius="base" value="1">
    // ...
  </Selector>
  <Selector radius="md" value="1">
    // ...
  </Selector>
  <Selector radius="lg" value="1">
    // ...
  </Selector>
  <Selector radius="full" value="1">
    // ...
  </Selector>
</View>

Shadows


Available shadow values are: none, xs, sm, md and lg.

<View>
  <Selector shadow="none" value="1">
    // ...
  </Selector>
  <Selector shadow="sm" value="1">
    // ...
  </Selector>
  <Selector shadow="base" value="1">
    // ...
  </Selector>
  <Selector shadow="md" value="1">
    // ...
  </Selector>
  <Selector shadow="lg" value="1">
    // ...
  </Selector>
  <Selector shadow="xl" value="1">
    // ...
  </Selector>
</View>

Orientation


The Selector component can be set to horizontal or vertical orientation.

<View>
  <Selector orientation="horizontal" value="1">
    <Selector.Tab label="Apple" anchor="1" />
    <Selector.Tab label="Banana" anchor="2" />
  </Selector>
  <Selector orientation="vertical" value="1">
    <Selector.Tab label="Apple" anchor="1" />
    <Selector.Tab label="Banana" anchor="2" />
  </Selector>
</View>

Full width


The Selector component can be set to full width by setting the fullWidth prop to true.

<View>
  <Selector orientation="horizontal" fullWidth={true} value="1">
    <Selector.Tab label="Apple" anchor="1" />
    <Selector.Tab label="Banana" anchor="2" />
  </Selector>
  <Selector orientation="horizontal" fullWidth={false} value="1">
    <Selector.Tab label="Apple" anchor="1" />
    <Selector.Tab label="Banana" anchor="2" />
  </Selector>
  <Selector orientation="vertical" fullWidth={true} value="1">
    <Selector.Tab label="Apple" anchor="1" />
    <Selector.Tab label="Banana" anchor="2" />
  </Selector>
  <Selector orientation="vertical" fullWidth={false} value="1">
    <Selector.Tab label="Apple" anchor="1" />
    <Selector.Tab label="Banana" anchor="2" />
  </Selector>
</View>

Animation


The animation effect can be disabled by setting the withAnimation prop to false.

<View>
  <Selector withAnimation={true} value="1">
    <Selector.Tab label="Apple" anchor="1" />
    <Selector.Tab label="Banana" anchor="2" />
  </Selector>
  <Selector withAnimation={false} value="1">
    <Selector.Tab label="Apple" anchor="1" />
    <Selector.Tab label="Banana" anchor="2" />
  </Selector>
</View>

Separator


The separator can be hidden by setting the withSeparator prop to false.

<View>
  <Selector withSeparator={true} value="1">
    <Selector.Tab label="Apple" anchor="1" />
    <Selector.Tab label="Banana" anchor="2" />
  </Selector>
  <Selector withSeparator={false} value="1">
    <Selector.Tab label="Apple" anchor="1" />
    <Selector.Tab label="Banana" anchor="2" />
  </Selector>
</View>

Custom separator

The separator can be customized by setting the separator prop to a custom element.

<View>
  <Selector
    separator={
      <span className="last-of-type:hidden self-center mx-1 w-1 h-1 bg-gray-200 rounded-full" />
    }
    orientation="horizontal"
    value="1"
  >
    <Selector.Tab label="Apple" anchor="1" />
    <Selector.Tab label="Banana" anchor="2" />
  </Selector>
  <Selector
    separator={
      <span className="last-of-type:hidden self-center mx-1 w-1 h-6 bg-gray-200 rounded-full" />
    }
    orientation="horizontal"
    value="1"
  >
    <Selector.Tab label="Apple" anchor="1" />
    <Selector.Tab label="Banana" anchor="2" />
  </Selector>
  <Selector
    separator={
      <span className="last-of-type:hidden self-center mx-1 w-8 h-1 bg-gray-200 rounded-full" />
    }
    orientation="vertical"
    value="1"
  >
    <Selector.Tab label="Apple" anchor="1" />
    <Selector.Tab label="Banana" anchor="2" />
  </Selector>
</View>

Ref


The Selector.Tab component supports the ref prop, which allows for obtaining a reference to the associated underlying HTML element.

const App = () => {
  const ref1 = useRef<HTMLButtonElement>(null);
  const ref2 = useRef<HTMLButtonElement>(null);

  return (
    <div className="flex flex-col gap-2">
      <div className="flex gap-2">
        <Button
          onClick={() => {
            ref1.current?.click();
            console.log(ref1);
          }}
        >
          Activate Tab 1
        </Button>
        <Button
          onClick={() => {
            ref2.current?.click();
          }}
        >
          Activate Tab 2
        </Button>
      </div>

      <Selector value="tab-1">
        <Selector.Tab ref={ref1} label="Tab 1" anchor="tab-1" />
        <Selector.Tab ref={ref2} label="Tab 2" anchor="tab-2" />
      </Selector>
    </div>
  );
};

Examples


Border & background

A border and a background color can be added to the main wrapper by passing the desired className prop.

<View>
  <Selector className="border border-gray-100 bg-white" shadow="none" value="1">
    <Selector.Tab label="Apple" anchor="1" />
    <Selector.Tab label="Banana" anchor="2" />
  </Selector>
</View>

Icons

<View>
  <Selector
    radius="full"
    className="bg-gray-50 border border-gray-100"
    shadow="none"
    separator={<span className="last-of-type:hidden self-center w-1 h-1 bg-transparent" />}
    value="1"
  >
    <Selector.Tab color="yellow" label={<SunDim size={16} weight="duotone" />} anchor="1" />
    <Selector.Tab color="dark" label={<MoonStars size={16} weight="duotone" />} anchor="2" />
  </Selector>
</View>

Extended composition

<View>
  <Selector color="white" value="1">
    <Selector.Tab label="Apple" anchor="1" />
    <Selector.Tab label="Banana" anchor="2" />
    <Selector.Tab
      label={
        <Tooltip
          label="This is a react node with a tooltip"
          accent="solid"
          color="dark"
          offset={15}
          shadow="base"
        >
          <span className="whitespace-nowrap underline underline-offset-2 decoration-2 decoration-pink-500">
            React Node
          </span>
        </Tooltip>
      }
      anchor="3"
    />
  </Selector>
</View>

API Reference


Properties

Selector

PropTypeDescriptionDefault
colorSelectorTabColorSets the tab colordark
fullWidthbooleanSets the wrapper width to 100%false
orientationSelectorOrientationSets the tab list orientationhorizontal
radiusSelectorRadiusSets the wrapper border radiusmd
separatorReactNodeOverrides the default separatorundefined
shadowSelectorShadowSets the shadow sizebase
sizeSelectorSizeSets the wrapper sizemd
toneButtonToneSets the wrapper tonesolid
valuestringSets the preselected valueundefined
withAnimationbooleanEnables or disables the animation effecttrue
withSeparatorbooleanEnables or disables the pre-defined separator elementtrue

Selector.Tab

PropTypeDescriptionDefault
anchorstringSets the tab anchor valueundefined
colorSelectorTabColorSets the tab colorblue
disabledbooleanDisables the tab buttonfalse
labelReactNodeSets the tab labelundefined

Events

Selector

EventTypeDescription
onChange(value: string) => voidFires when the selected tab anchor is changed

Types

Selector

type SelectorOrientation = 'horizontal' | 'vertical';
type SelectorRadius = 'none' | 'sm' | 'base' | 'md' | 'lg' | 'full';
type SelectorSize = 'xs' | 'sm' | 'md' | 'lg';
type SelectorShadow = 'none' | 'sm' | 'base' | 'md' | 'lg' | 'xl';
type SelectorTone = 'solid' | 'light';

SelectorTab

type SelectorTabColor =
  | 'white'
  | 'blue'
  | 'red'
  | 'green'
  | 'yellow'
  | 'purple'
  | 'gray'
  | 'dark'
  | 'black';

Accessibility


The Selector component adheres to the WAI-ARIA Radio Group Pattern.

Keyboard interactions

KeyDescription
Enter or SpaceSelects the focused tab
TabMoves focus to the next focusable element
Shift + TabMoves focus to the previous focusable element