Searchable typed choices with distinct display labels and submitted values.
app/components/nitro_kit/combobox.rbNitroKit::Combobox.new(id:, name:, label:, options:, value:)A named native select submits without JavaScript; enhancement adds filtering without a duplicate form value.
test/dummy/app/components/gallery/components/combobox_page.rbsample("Empty optional", slug: "empty") do
render_combobox("gallery-combobox-empty", placeholder: "Choose a country")
end
sample("Selected", slug: "selected") do
render_combobox("gallery-combobox-selected", value: "dk")
end
sample("Required", slug: "required") do
render_combobox("gallery-combobox-required", required: true, placeholder: "Country required")
end
sample("Disabled", slug: "disabled") do
render_combobox("gallery-combobox-disabled", value: "se", disabled: true)
end
sample("Numeric labels", slug: "numeric-labels") do
render NitroKit::Combobox.new(
id: "gallery-combobox-numeric",
name: "deployment[retry_count]",
label: "Retry count",
options: [ [ 1, "one" ], [ 2, "two" ], [ 3, "three" ] ],
value: "two"
)
endAll placements and long labels retain deterministic IDs and native listbox semantics.
test/dummy/app/components/gallery/components/combobox_page.rbNitroKit::Combobox::PLACEMENTS.each do |placement|
sample(placement.to_s.humanize, slug: placement.to_s) do
render NitroKit::Combobox.new(
id: "gallery-combobox-#{placement}",
name: "deployment[#{placement}]",
label: "Deployment environment",
options: ENVIRONMENTS,
value: "staging",
placement:
)
end
endThe combobox keeps one native select as its submission source alongside ordinary Nitro fields.
test/dummy/app/components/gallery/components/combobox_page.rbrender NitroKit::Card.new(id: "gallery-combobox-deployment-card") do |card|
card.title("Promote release", level: 3)
card.body do
form(id: "gallery-combobox-deployment-form", action: "/gallery/deployments", method: "post") do
render NitroKit::Field.new(
nil,
:release,
id: "gallery-combobox-release",
name: "deployment[release]",
label: "Release",
value: "2026.07.13",
readonly: true
)
render NitroKit::Combobox.new(
id: "gallery-combobox-environment",
name: "deployment[environment]",
label: "Target environment",
options: ENVIRONMENTS,
value: "production",
required: true
)
render NitroKit::Button.new(
"Promote release",
id: "gallery-combobox-submit",
type: :submit,
variant: :primary
)
end
end
end