Splitter

Component

Interactive examples and API documentation

Basic Horizontal
Basic horizontal splitter with two panels.

Left Panel

Drag the divider to resize

Right Panel

Code
<%= render(Hakumi::Splitter::Component.new(style: "height: 300px; border: 1px solid #f0f0f0;")) do %>
  <%= render(Hakumi::Splitter::Panel::Component.new(size: "50%")) do %>
    <div style="padding: 16px;">
      <p>Left Panel</p>
      <p>Drag the divider to resize</p>
    </div>
  <% end %>
  <%= render(Hakumi::Splitter::Panel::Component.new) do %>
    <div style="padding: 16px;">
      <p>Right Panel</p>
    </div>
  <% end %>
<% end %>
Vertical Splitter
Vertical layout with resizable panels.

Top Panel

Bottom Panel

Code
<%= render(Hakumi::Splitter::Component.new(layout: :vertical, style: "height: 400px; border: 1px solid #f0f0f0;")) do %>
  <%= render(Hakumi::Splitter::Panel::Component.new(size: "50%")) do %>
    <div style="padding: 16px;">
      <p>Top Panel</p>
    </div>
  <% end %>
  <%= render(Hakumi::Splitter::Panel::Component.new) do %>
    <div style="padding: 16px;">
      <p>Bottom Panel</p>
    </div>
  <% end %>
<% end %>
Multiple Panels
Splitter with three panels.

Left Panel

Min: 100px, Max: 300px

Middle Panel (flexible)

Right Panel (200px)

Code
<%= render(Hakumi::Splitter::Component.new(style: "height: 300px; border: 1px solid #f0f0f0;")) do %>
  <%= render(Hakumi::Splitter::Panel::Component.new(size: 200, min: 100, max: 300)) do %>
    <div style="padding: 16px;">
      <p>Left Panel</p>
      <p>Min: 100px, Max: 300px</p>
    </div>
  <% end %>

  <%= render(Hakumi::Splitter::Panel::Component.new) do %>
    <div style="padding: 16px;">
      <p>Middle Panel (flexible)</p>
    </div>
  <% end %>

  <%= render(Hakumi::Splitter::Panel::Component.new(size: 200)) do %>
    <div style="padding: 16px;">
      <p>Right Panel (200px)</p>
    </div>
  <% end %>
<% end %>
Complex Layout
Nested splitters for complex layouts.

Sidebar

Navigation panel

Main Content

Editor area

Console

Output panel

Code
<%= render(Hakumi::Splitter::Component.new(style: "height: 500px; border: 1px solid #f0f0f0;")) do %>
  <%= render(Hakumi::Splitter::Panel::Component.new(size: "30%")) do %>
    <div style="padding: 16px; height: 100%;">
      <h4 style="margin-top: 0;">Sidebar</h4>
      <p>Navigation panel</p>
    </div>
  <% end %>

  <%= render(Hakumi::Splitter::Panel::Component.new) do %>
    <%= render(Hakumi::Splitter::Component.new(layout: :vertical, style: "height: 100%;")) do %>
      <%= render(Hakumi::Splitter::Panel::Component.new(size: "60%")) do %>
        <div style="padding: 16px;">
          <h4 style="margin-top: 0;">Main Content</h4>
          <p>Editor area</p>
        </div>
      <% end %>

      <%= render(Hakumi::Splitter::Panel::Component.new) do %>
        <div style="padding: 16px;">
          <h4 style="margin-top: 0;">Console</h4>
          <p>Output panel</p>
        </div>
      <% end %>
    <% end %>
  <% end %>
<% end %>

Splitter API

Prop Type Default Description
layout :horizontal or :vertical :horizontal Direction of panels.
resizable Boolean true Allow panel resizing.
content slot Slot - Splitter panels (use Splitter::Panel).
**html_options Keyword args - Attributes merged into `.hakumi-splitter`. Pass as kwargs (e.g., `class:`, `style:`, `data:`).

Splitter::Panel API

Prop Type Default Description
size Integer or String - Fixed size (px or css value).
min Integer or String - Minimum size constraint.
max Integer or String - Maximum size constraint.
resizable Boolean true Allow resizing for this panel.
collapsible Boolean or Hash false Allow collapsing; hash to configure directions.
content slot Slot - Panel content.
**html_options Keyword args - Extra attributes merged into `.hakumi-splitter-panel`. Pass as kwargs (e.g., `class:`, `style:`, `data:`).