Slider

An input where the user selects a value from within a given range.

Quick Start

<%= kui(:slider, value: 75, max: 100, step: 1) %>

Locals

Local Type Default
min: Integer 0
max: Integer 100
step: Integer 1
value: Integer nil (uses min)
name: String nil
id: String nil
disabled: Boolean false
size: :sm | :md | :lg :md
css_classes: String ""
**component_options Hash {}

Anatomy

Slider (root)
├── input[type=range]    (hidden, form submission)
├── Slider Track         (background track)
│   └── Slider Range     (filled portion)
└── Slider Thumb         (draggable handle)

Usage

Size

Use the size: local to change the track height and thumb size.

<%= kui(:slider, size: :sm, value: 50) %>
<%= kui(:slider, size: :md, value: 50) %>
<%= kui(:slider, size: :lg, value: 50) %>
Size Track height Thumb size
:sm h-1 size-3
:md (default) h-1.5 size-4
:lg h-2 size-5

Step Values

Use min:, max:, and step: to control the range and precision.

<%= kui(:slider, min: 0, max: 1, step: 0.1, value: 0.5) %>

Disabled

Use disabled: true to prevent interaction. The slider appears at 50% opacity.

<%= kui(:slider, value: 50, disabled: true) %>

With Field

Compose with a Field and Label for form usage.

<%= kui(:field) do %>
  <%= kui(:field, :label, for: :volume) { "Volume" } %>
  <%= kui(:slider, id: :volume, name: :volume, value: 33) %>
<% end %>

Form Submission

Include name: to submit the value with a form. The hidden <input type="range"> carries the value.

<%= form_with url: "/settings" do |f| %>
  <%= kui(:slider, name: "settings[brightness]", value: 80, min: 0, max: 100) %>
<% end %>

Theme

Kiso::Themes::Slider = ClassVariants.build(
  base: "relative flex w-full touch-none items-center select-none"
)

SliderTrack = ClassVariants.build(
  base: "relative grow cursor-pointer overflow-hidden rounded-full bg-muted w-full",
  variants: { size: { sm: "h-1", md: "h-1.5", lg: "h-2" } },
  defaults: { size: :md }
)

SliderRange = ClassVariants.build(
  base: "absolute h-full bg-primary"
)

SliderThumb = ClassVariants.build(
  base: "block shrink-0 rounded-full border border-primary bg-white shadow-sm ...",
  variants: { size: { sm: "size-3", md: "size-4", lg: "size-5" } },
  defaults: { size: :md }
)

Accessibility

Attribute Value
role slider (on thumb)
aria-valuemin Minimum value
aria-valuemax Maximum value
aria-valuenow Current value
data-slot "slider"

Keyboard

Key Action
ArrowRight / ArrowUp Increase by step
ArrowLeft / ArrowDown Decrease by step
PageUp Increase by 10x step
PageDown Decrease by 10x step
Home Jump to minimum
End Jump to maximum

The slider dispatches a kiso--slider:change custom event with { value } detail on every value change. Use Stimulus actions to react to changes.