Segment Group
Organizes and navigates between sections in a view.
Organizes and navigates between sections in a view.
To set up the segmented control correctly, you’ll need to understand its anatomy and how we name its parts.
Each part includes a
data-part
attribute to help identify them in the DOM.
Learn how to use the SegmentGroup
component in your project. Let’s take a look
at the most basic example:
import { SegmentGroup } from '@ark-ui/react'
const Basic = () => {
const frameworks = ['React', 'Solid', 'Svelte', 'Vue']
return (
<SegmentGroup.Root>
<SegmentGroup.Indicator />
{frameworks.map((framework) => (
<SegmentGroup.Item key={framework} value={framework}>
<SegmentGroup.ItemText>{framework}</SegmentGroup.ItemText>
<SegmentGroup.ItemControl />
</SegmentGroup.Item>
))}
</SegmentGroup.Root>
)
}
import { SegmentGroup } from '@ark-ui/solid'
import { Index } from 'solid-js'
const Basic = () => {
const frameworks = ['React', 'Solid', 'Svelte', 'Vue']
return (
<SegmentGroup.Root>
<SegmentGroup.Indicator />
<Index each={frameworks}>
{(framework) => (
<SegmentGroup.Item value={framework()}>
<SegmentGroup.ItemText>{framework()}</SegmentGroup.ItemText>
<SegmentGroup.ItemControl />
</SegmentGroup.Item>
)}
</Index>
</SegmentGroup.Root>
)
}
<script setup lang="ts">
import { ref } from 'vue'
import { SegmentGroup } from '@ark-ui/vue'
const frameworks = ref(['React', 'Solid', 'Svelte', 'Vue'])
const value = ref('React')
</script>
<template>
<SegmentGroup.Root>
<SegmentGroup.Indicator />
<SegmentGroup.Item v-for="framework in frameworks" :key="framework" :value="framework">
<SegmentGroup.ItemText>{{ framework }}</SegmentGroup.ItemText>
<SegmentGroup.ItemControl />
</SegmentGroup.Item>
</SegmentGroup.Root>
</template>
To set a default segment on initial render, use the defaultValue
prop:
import { SegmentGroup } from '@ark-ui/react'
const InitialValue = () => {
const frameworks = ['React', 'Solid', 'Svelte', 'Vue']
return (
<SegmentGroup.Root defaultValue="React">
<SegmentGroup.Indicator />
{frameworks.map((framework) => (
<SegmentGroup.Item key={framework} value={framework}>
<SegmentGroup.ItemText>{framework}</SegmentGroup.ItemText>
<SegmentGroup.ItemControl />
</SegmentGroup.Item>
))}
</SegmentGroup.Root>
)
}
import { SegmentGroup } from '@ark-ui/solid'
import { Index } from 'solid-js'
const InitialValue = () => {
const frameworks = ['React', 'Solid', 'Svelte', 'Vue']
return (
<SegmentGroup.Root value="React">
<SegmentGroup.Indicator />
<Index each={frameworks}>
{(framework) => (
<SegmentGroup.Item value={framework()}>
<SegmentGroup.ItemText>{framework()}</SegmentGroup.ItemText>
<SegmentGroup.ItemControl />
</SegmentGroup.Item>
)}
</Index>
</SegmentGroup.Root>
)
}
<script setup lang="ts">
import { ref } from 'vue'
import { SegmentGroup } from '@ark-ui/vue'
const frameworks = ref(['React', 'Solid', 'Svelte', 'Vue'])
const value = ref('React')
</script>
<template>
<SegmentGroup.Root model-value="React">
<SegmentGroup.Indicator />
<SegmentGroup.Item v-for="framework in frameworks" :key="framework" :value="framework">
<SegmentGroup.ItemText>{{ framework }}</SegmentGroup.ItemText>
<SegmentGroup.ItemControl />
</SegmentGroup.Item>
</SegmentGroup.Root>
</template>
To create a controlled SegmentGroup component, manage the current selected
segment using the value
prop and update it when the onValueChange
event
handler is called:
import { SegmentGroup } from '@ark-ui/react'
import { useState } from 'react'
const Controlled = () => {
const frameworks = ['React', 'Solid', 'Svelte', 'Vue']
const [value, setValue] = useState('React')
return (
<SegmentGroup.Root value={value} onValueChange={(e) => setValue(e.value)}>
<SegmentGroup.Indicator />
{frameworks.map((framework) => (
<SegmentGroup.Item key={framework} value={framework}>
<SegmentGroup.ItemText>{framework}</SegmentGroup.ItemText>
<SegmentGroup.ItemControl />
</SegmentGroup.Item>
))}
</SegmentGroup.Root>
)
}
import { SegmentGroup } from '@ark-ui/solid'
import { Index, createSignal } from 'solid-js'
const Controlled = () => {
const frameworks = ['React', 'Solid', 'Svelte', 'Vue']
const [value, setValue] = createSignal('React')
return (
<SegmentGroup.Root value={value()} onValueChange={(e) => setValue(e.value)}>
<SegmentGroup.Indicator />
<Index each={frameworks}>
{(framework) => (
<SegmentGroup.Item value={framework()}>
<SegmentGroup.ItemText>{framework()}</SegmentGroup.ItemText>
<SegmentGroup.ItemControl />
</SegmentGroup.Item>
)}
</Index>
</SegmentGroup.Root>
)
}
<script setup lang="ts">
import { ref } from 'vue'
import { SegmentGroup } from '@ark-ui/vue'
const frameworks = ref(['React', 'Solid', 'Svelte', 'Vue'])
const value = ref('React')
</script>
<template>
<SegmentGroup.Root v-model="value">
<SegmentGroup.Indicator />
<SegmentGroup.Item v-for="framework in frameworks" :key="framework" :value="framework">
<SegmentGroup.ItemText>{{ framework }}</SegmentGroup.ItemText>
<SegmentGroup.ItemControl />
</SegmentGroup.Item>
</SegmentGroup.Root>
</template>
To disable a segment, simply pass the disabled
prop to the SegmentGroup.Item
component:
import { SegmentGroup } from '@ark-ui/react'
const Disabled = () => {
const frameworks = ['React', 'Solid', 'Svelte', 'Vue']
return (
<SegmentGroup.Root defaultValue="React">
<SegmentGroup.Indicator />
{frameworks.map((framework) => (
<SegmentGroup.Item key={framework} value={framework} disabled={framework === 'Svelte'}>
<SegmentGroup.ItemText>{framework}</SegmentGroup.ItemText>
<SegmentGroup.ItemControl />
</SegmentGroup.Item>
))}
</SegmentGroup.Root>
)
}
import { SegmentGroup } from '@ark-ui/solid'
import { Index } from 'solid-js'
const Disabled = () => {
const frameworks = ['React', 'Solid', 'Svelte', 'Vue']
return (
<SegmentGroup.Root value={'React'}>
<SegmentGroup.Indicator />
<Index each={frameworks}>
{(framework) => (
<SegmentGroup.Item value={framework()} disabled={framework() === 'Svelte'}>
<SegmentGroup.ItemText>{framework()}</SegmentGroup.ItemText>
<SegmentGroup.ItemControl />
</SegmentGroup.Item>
)}
</Index>
</SegmentGroup.Root>
)
}
<script setup lang="ts">
import { ref } from 'vue'
import { SegmentGroup } from '@ark-ui/vue'
const frameworks = ref(['React', 'Solid', 'Svelte', 'Vue'])
const value = ref('React')
</script>
<template>
<SegmentGroup.Root model-value="React">
<SegmentGroup.Indicator />
<SegmentGroup.Item
v-for="framework in frameworks"
:key="framework"
:value="framework"
:disabled="framework === 'Svelte'"
>
<SegmentGroup.ItemText>{{ framework }}</SegmentGroup.ItemText>
<SegmentGroup.ItemControl />
</SegmentGroup.Item>
</SegmentGroup.Root>
</template>
value | string | |
asChild Render as a different element type. | boolean | |
disabled | boolean | |
invalid | boolean |
asChild Render as a different element type. | boolean | |
defaultValue The initial value of the segment group. | string | |
dir The document's text/writing direction. | 'ltr' | 'rtl' | "ltr" |
disabled If `true`, the radio group will be disabled | boolean | |
form The associate form of the underlying input. | string | |
getRootNode A root node to correctly resolve document in custom environments. E.x.: Iframes, Electron. | () => Node | ShadowRoot | Document | |
id The unique identifier of the machine. | string | |
ids The ids of the elements in the radio. Useful for composition. | Partial<{
root: string
label: string
indicator: string
item(value: string): string
itemLabel(value: string): string
itemControl(value: string): string
itemHiddenInput(value: string): string
}> | |
name The name of the input fields in the radio (Useful for form submission). | string | |
onValueChange Function called once a radio is checked | (details: ValueChangeDetails) => void | |
orientation Orientation of the radio group | 'horizontal' | 'vertical' | |
value The value of the checked radio | string |
asChild Render as a different element type. | boolean |
asChild Render as a different element type. | boolean |
asChild Render as a different element type. | boolean |
asChild Render as a different element type. | boolean |
Previous
Rating GroupNext
Select