Tabs
Accessible tabbed interface for organizing content into panels. Available in multiple visual styles with full keyboard navigation.
Underline
Clean underlined tabs with a bottom border indicator
_tabs.html.erb
███
████ █████████ █ █████████ █████ █████████
██████
███ ██████ ████████████████████████████ █████ █
█ ███ ███████ ██████ ████████ ████████ ████████ ███ █████ ████ ██
█ ███ ███████ ██████ █████████ ████████ ████████ ███ ██████ ████ █
█ ██
██
tabs_controller.js
██████ █ ██████████ █ ████ ████████████████████
██ ████████ ██ ██████████████████████
██████ ███████ █████ ███████ ██████████ █
██████ ███████ █ ███████ ████████
██████ ██████ █ █
██████ █ █████ ███████ ████████ █ █
█
█████████ █
tabs_underline_component.html.erb
████ ██████████ █████████████████ ███ ██████████████████████ ██████████████████████████ ███████████ ████
████ ███████████ █████ ████████ ████████████████ ███████████████ ██████████████████████ ██████████████ ██████████████████████████████
██ ████████████████████ ██ █████ ██████ ██
███████
█████████████
██████████
███████ ██████ ███████
██████████████████ ██████ █████████
██████████████████ █████ ██ ███████████ ███
█████████████ █████ ██ ███████████ █ █ █ ██ ███
tabs_underline_component.rb
█ ██████████████████████ ████
█████ ██████████████████████ █ ███████████████████
████████████ ██████ ██████████████
███ ███████████████████████ ██ ████████████████
████████████ █ ███████████
██████████████ █ █████████████████████ ██ ██
███
tabs_controller.js
██████ █ ██████████ █ ████ ████████████████████
██ ████████ ██ ██████████████████████
██████ ███████ █████ ███████ ██████████ █
██████ ███████ █ ███████ ████████
██████ ██████ █ █
██████ █ █████ ███████ ████████ █ █
█
█████████ █
Pills
Pill-shaped tab buttons with rounded backgrounds
_tabs.html.erb
███
████ █████████ █ █████ █████ █████████
██████
███ ██████ ████████████████████████ █████ █
█ ███ ███████ ██████ ████████ ████████ ████████ ███ █████ ████ ██
█ ███ ███████ ██████ █████████ ████████ ████████ ███ ██████ ████ █
█ ██
██
tabs_controller.js
██████ █ ██████████ █ ████ ████████████████████
██ ████████ ██ ██████████████████████
██████ ███████ █████ ███████ ██████████ █
██████ ███████ █ ███████ ████████
██████ ██████ █ █
██████ █ █████ ███████ ████████ █ █
█
█████████ █
tabs_pills_component.rb
█ ██████████████████████ ████
█████ ██████████████████ █ ███████████████████
████████████ ██████ ██████████████
███ ███████████████████████ ██ ████████████████
████████████ █ ███████████
██████████████ █ █████████████████████ ██ ██
███
tabs_pills_component.html.erb
████ ██████████ █████████████████ ███ ██████████████████████ ██████████████████████████ ███████████ ████
████ ███████████ █████ ███ ████████████ ██████████ ███████████████ ██████████████████ ██████████████ ██████████████████████████████
██ ████████████████████ ██ █████ ██████ ██
███████
█████████████
██████████
███████ ██████ ███████
██████████████████ ██████ █████████
██████████████████ █████ ██ ███████████ ███
█████████████ █████ ██ ███████████ █ █ █ ██ ███
tabs_controller.js
██████ █ ██████████ █ ████ ████████████████████
██ ████████ ██ ██████████████████████
██████ ███████ █████ ███████ ██████████ █
██████ ███████ █ ███████ ████████
██████ ██████ █ █
██████ █ █████ ███████ ████████ █ █
█
█████████ █
Boxed
Card-style tabs with bordered container
_tabs.html.erb
███
████ █████████ █ █████ █████ █████████
██████
███ ██████ ████████████████████████ █████ █
█ ███ ███████ ██████ ████████ ████████ ████████ ███ █████ ████ ██
█ ███ ███████ ██████ █████████ ████████ ████████ ███ ██████ ████ █
█ ██
██
tabs_controller.js
██████ █ ██████████ █ ████ ████████████████████
██ ████████ ██ ██████████████████████
██████ ███████ █████ ███████ ██████████ █
██████ ███████ █ ███████ ████████
██████ ██████ █ █
██████ █ █████ ███████ ████████ █ █
█
█████████ █
tabs_boxed_component.html.erb
████ ██████████ █████████████████ ███ ██████████████████████ ██████████████████████████ ███████████ ████
████ ███████████ ███████████ ████████ ████████████████ ███████████████ █████████████████ ██████████████████████ ██████████████ ██████████████████████████████
██ ████████████████████ ██ █████ ██████ ██
███████
█████████████
██████████
███████ ██████ ███████
██████████████████ ██████ █████████
██████████████████ █████ ██ ███████████ ███
█████████████ █████ ██ ███████████ █ █ █ ██ ███
tabs_boxed_component.rb
█ ██████████████████████ ████
█████ ██████████████████ █ ███████████████████
████████████ ██████ ██████████████
███ ███████████████████████ ██ ████████████████
████████████ █ ███████████
██████████████ █ █████████████████████ ██ ██
███
tabs_controller.js
██████ █ ██████████ █ ████ ████████████████████
██ ████████ ██ ██████████████████████
██████ ███████ █████ ███████ ██████████ █
██████ ███████ █ ███████ ████████
██████ ██████ █ █
██████ █ █████ ███████ ████████ █ █
█
█████████ █
Changelog
- v1.1.0: Added multiple style variants (underline, pills, boxed)
- v1.0.0: Initial release with horizontal tabs
- Full keyboard accessibility (arrow keys, home/end)
- Stimulus controller for state management
Get Full Access
Unlock the source code for this component and all others. One-time payment for lifetime access.
Get Access Now