Eidetic

Cascader

Forms
Selection

Hierarchical cascading selection with multi-level navigation, search, and flexible interaction modes. Ideal for selecting from deeply nested category structures.

Preview

Click to navigate through hierarchical options

Selected: None

Variants

Different input styles

With Default Selection

Pre-selected hierarchical path

Hover Trigger

Expand menus on hover instead of click

Change on Select

Allow selection of intermediate levels, not just leaf nodes

Selected: None

Searchable Cascader

Search across all levels of the hierarchy

Custom Path Separator

Use custom separator for path display

Sizes

Different input sizes

Error State

Validation error display

Please select a location

Props

Cascader component API reference

PropTypeDefaultDescription
optionsCascaderOption[][]Hierarchical options
valuestring[][]Selected value path
onChange(value: string[], options: CascaderOption[]) => voidCallback when value changes
placeholderstring'Select...'Placeholder text
expandTrigger'click' | 'hover''click'How to expand menus
changeOnSelectbooleanfalseAllow selecting intermediate levels
showPathbooleantrueShow full path in input
separatorstring' / 'Path separator character
searchablebooleanfalseEnable search functionality
disabledbooleanfalseDisable the cascader
variant'default' | 'filled' | 'error''default'Input style variant
inputSize'sm' | 'md' | 'lg''md'Input size
labelstringLabel text
errorstringError message
helperTextstringHelper text below input

CascaderOption Type

PropTypeDefaultDescription
value*stringOption value
label*stringDisplay label
childrenCascaderOption[]Child options
disabledbooleanDisable this option

Usage

Import and implementation example

import { Cascader, CascaderOption } from '@/components/ui/cascader'
const options: CascaderOption[] = [
{
value: 'usa',
label: 'United States',
children: [
{
value: 'california',
label: 'California',
children: [
{ value: 'sf', label: 'San Francisco' },
{ value: 'la', label: 'Los Angeles' },
],
},
],
},
]
export default function Example() {
const [value, setValue] = useState<string[]>([])
return (
<Cascader
options={options}
value={value}
onChange={(val, opts) => {
setValue(val)
console.log('Selected options:', opts)
}}
placeholder="Select location"
label="Location"
expandTrigger="click"
changeOnSelect={false}
searchable={true}
/>
)
}
This block is self-contained (no UI component dependencies)

Features

Built-in functionality

  • Multi-level navigation: Navigate through deeply nested hierarchies
  • Click or hover trigger: Choose interaction mode for menu expansion
  • Intermediate selection: Option to select non-leaf nodes
  • Full-text search: Search across all levels of the hierarchy
  • Path display: Show full path or just the final selection
  • Custom separators: Customize path separator character
  • Clear button: One-click to clear selection
  • Keyboard navigation: Full keyboard support for accessibility
  • Dark mode: Full dark mode support

Accessibility

Accessibility considerations

ARIA Attributes

Trigger button has proper focus managementOptions are keyboard navigableSearch input has label association

Keyboard Navigation

KeyAction
TabFocus the trigger button
Enter / SpaceOpen dropdown or select option
EscapeClose the dropdown
Arrow keysNavigate between options

Notes

  • Selected path shown in input as readable text
  • Options highlight on hover/focus
  • Chevron indicates expandable options
  • Disabled options are visually distinct