Checkbox

Component

Interactive examples and API documentation

Basic
Basic usage of checkbox.
Code
<%= render HakumiComponents::Checkbox::Component.new(id: "basic-checkbox-example", label: "Checkbox") %>
Disabled
Disabled checkbox.
Code
<%= render HakumiComponents::Space::Component.new(direction: :vertical, size: :middle) do |space| %>
  <% space.with_item do %>
    <%= render HakumiComponents::Checkbox::Component.new(label: "Checkbox (Disabled)", disabled: true) %>
  <% end %>

  <% space.with_item do %>
    <%= render HakumiComponents::Checkbox::Component.new(label: "Checkbox (Checked & Disabled)", checked: true, disabled: true) %>
  <% end %>
<% end %>
Controlled Checkbox
Communicated with other components.
Code
<%= render HakumiComponents::Space::Component.new(direction: :vertical, size: :middle, id: "checkbox-controlled-demo") do |space| %>
  <% space.with_item do %>
    <%= render HakumiComponents::Space::Component.new(align: :center, size: :small) do |controls| %>
      <% controls.with_item do %>
        <%= render HakumiComponents::Typography::Text::Component.new(content: "Toggle the checkbox:") %>
      <% end %>
      <% controls.with_item do %>
        <%= render HakumiComponents::Button::Component.new(type: :primary, size: :small, id: "controlled-demo-btn") do %>
          Toggle
        <% end %>
      <% end %>
    <% end %>
  <% end %>

  <% space.with_item do %>
    <%= render HakumiComponents::Checkbox::Component.new(
          checked: true,
          label: "Controlled Checkbox",
          id: "controlled-demo-checkbox"
        ) %>
  <% end %>
<% end %>

<script>
  (() => {
    const root = document.getElementById("checkbox-controlled-demo")
    const button = root?.querySelector("#controlled-demo-btn")
    const input = root?.querySelector("#controlled-demo-checkbox")
    if (!root || !button || !input) return

    const wire = () => {
      if (root.dataset.checkboxControlledInitialized === "true") return true

      const wrapper = input.closest(".hakumi-checkbox-wrapper")
      const api = wrapper?.hakumiComponent?.api
      if (!wrapper || !api) return false

      root.dataset.checkboxControlledInitialized = "true"
      button.addEventListener("click", () => {
        api.setChecked(!api.isChecked())
      })
      return true
    }

    if (wire()) return

    const onRegister = () => {
      if (wire()) window.removeEventListener("hakumi-component:registered", onRegister)
    }

    window.addEventListener("hakumi-component:registered", onRegister)
  })()
</script>
Checkbox Group
Generate a group of checkboxes from an array.
Code
<%= render HakumiComponents::Space::Component.new(direction: :vertical, size: :middle, id: "checkbox-group-demo") do |space| %>
  <% space.with_item do %>
    <%= render HakumiComponents::Typography::Text::Component.new(content: "Groups keep each checkbox in sync with plain helpers.") %>
  <% end %>

  <% space.with_item do %>
    <%= render HakumiComponents::Checkbox::Group::Component.new(
          name: "group1",
          options: ["Apple", "Pear", "Orange"],
          value: ["Apple"]
        ) %>
  <% end %>

  <% space.with_item do %>
    <%= render HakumiComponents::Checkbox::Group::Component.new(
          name: "group2",
          options: [
            { label: "Apple", value: "Apple" },
            { label: "Pear", value: "Pear" },
            { label: "Orange", value: "Orange", disabled: true }
          ],
          value: ["Pear"]
        ) %>
  <% end %>
<% end %>
Check all
The indeterminate property can help you achieve a check all checkbox.
Code
<%= render HakumiComponents::Space::Component.new(direction: :vertical, size: :middle, id: "checkbox-check-all-demo") do |space| %>
  <% space.with_item do %>
    <%= render HakumiComponents::Typography::Text::Component.new(content: "Select fruits with a single toggle:") %>
  <% end %>

  <% space.with_item do %>
    <%= render HakumiComponents::Checkbox::Component.new(
          label: "Check all",
          indeterminate: true,
          id: "checkbox-check-all-toggle"
        ) %>
  <% end %>

  <% space.with_item do %>
    <%= render HakumiComponents::Checkbox::Group::Component.new(
          id: "checkbox-check-all-group",
          options: ["Apple", "Pear", "Orange"],
          value: ["Apple", "Orange"]
        ) %>
  <% end %>
<% end %>

<script>
  (() => {
    const group = document.getElementById("checkbox-check-all-group")
    const input = document.getElementById("checkbox-check-all-toggle")
    if (!group || !input) return

    const wrapper = input.closest(".hakumi-checkbox-wrapper")
    if (!wrapper) return

    const wire = () => {
      const groupApi = group.hakumiComponent?.api
      const wrapperApi = wrapper.hakumiComponent?.api
      if (!groupApi || !wrapperApi) return false

      const sync = () => {
        const selected = groupApi.getValue()
        const total = groupApi.getAllValues().length
        wrapperApi.setChecked(selected.length === total)
        wrapperApi.setIndeterminate(selected.length > 0 && selected.length < total)
      }

      input.addEventListener("change", () => {
        input.checked ? groupApi.selectAll() : groupApi.clearAll()
        sync()
      })

      groupApi.onChange(sync)
      sync()
      return true
    }

    if (wire()) return

    const onRegister = () => {
      if (wire()) window.removeEventListener("hakumi-component:registered", onRegister)
    }

    window.addEventListener("hakumi-component:registered", onRegister)
  })()
</script>
Use with Grid
Use Checkbox and Grid in Checkbox.Group to implement complex layouts.
Code
<%= render HakumiComponents::Checkbox::Group::Component.new(style: "width: 100%;") do %>
  <%= render HakumiComponents::Grid::Row::Component.new do %>
    <%= render HakumiComponents::Grid::Col::Component.new(span: 8) do %>
      <%= render HakumiComponents::Checkbox::Component.new(value: "A", label: "A") %>
    <% end %>
    <%= render HakumiComponents::Grid::Col::Component.new(span: 8) do %>
      <%= render HakumiComponents::Checkbox::Component.new(value: "B", label: "B") %>
    <% end %>
    <%= render HakumiComponents::Grid::Col::Component.new(span: 8) do %>
      <%= render HakumiComponents::Checkbox::Component.new(value: "C", label: "C") %>
    <% end %>
    <%= render HakumiComponents::Grid::Col::Component.new(span: 8) do %>
      <%= render HakumiComponents::Checkbox::Component.new(value: "D", label: "D") %>
    <% end %>
    <%= render HakumiComponents::Grid::Col::Component.new(span: 8) do %>
      <%= render HakumiComponents::Checkbox::Component.new(value: "E", label: "E") %>
    <% end %>
  <% end %>
<% end %>

Checkbox Props

Prop Type Default Description
checked Boolean false Initial checked state
disabled Boolean false Disable the checkbox
indeterminate Boolean false Indeterminate checked state (for select all scenarios)
value String "1" Value submitted with form when checked
name String nil Input name attribute
id String auto-generated Input id attribute (auto-generated if not provided)
auto_focus Boolean false Auto-focus on component mount
label String nil Form field label text
caption String nil Helper text displayed below checkbox
standalone Boolean true Render without Form::Item wrapper
required Boolean false Mark field as required
errors Array [] Validation error messages

Checkbox Group Props

Props for checkbox groups
Prop Type Default Description
name String nil Name attribute for all checkboxes in the group
value Array [] Currently selected values
default_value Array [] Initial selected values
options Array [] Checkbox options (strings or hashes with label, value, disabled keys)
disabled Boolean false Disable all checkboxes in the group

Slots

Prop Type Default Description
content Slot nil Checkbox label content (overrides label prop)

HTML Options

Prop Type Default Description
**html_options Keyword args {} Additional HTML attributes merged into the wrapper element

JavaScript API

Access via element.hakumiComponent.api
Prop Type Default Description
setChecked(checked) Method - Programmatically check or uncheck the checkbox
setIndeterminate(indeterminate) Method - Set the indeterminate visual state
isChecked() Method - Get the current checked state
isIndeterminate() Method - Get the current indeterminate state

Checkbox Group JavaScript API

Access via element.hakumiComponent.api on group element
Prop Type Default Description
getValue() Method - Get the currently selected values array
getAllValues() Method - Get all available checkbox values in the group
setValue(values) Method - Set the selected values
selectAll() Method - Select all checkboxes in the group
clearAll() Method - Deselect all checkboxes in the group