Space

Component

Interactive examples and API documentation

Basic Usage
Crowded components horizontal spacing.
Code
<%= render(Hakumi::Space::Component.new) do %>
  <%= render(Hakumi::Button::Component.new(type: :primary)) { "Primary" } %>
  <%= render(Hakumi::Button::Component.new) { "Default" } %>
  <%= render(Hakumi::Button::Component.new(type: :dashed)) { "Dashed" } %>
  <%= render(Hakumi::Button::Component.new(type: :link)) { "Link" } %>
<% end %>
Vertical Space
Crowded components vertical spacing.
Code
<%= render(Hakumi::Space::Component.new(direction: :vertical)) do %>
  <%= render(Hakumi::Button::Component.new(type: :primary)) { "Primary" } %>
  <%= render(Hakumi::Button::Component.new) { "Default" } %>
  <%= render(Hakumi::Button::Component.new(type: :dashed)) { "Dashed" } %>
<% end %>
Space Size
Large, middle and small size, and custom size.
Code
<%= render(Hakumi::Space::Component.new(direction: :vertical)) do %>
  <%= render(Hakumi::Space::Component.new(size: :large)) do %>
    <%= render(Hakumi::Button::Component.new(type: :primary)) { "Large" } %>
    <%= render(Hakumi::Button::Component.new) { "Large" } %>
    <%= render(Hakumi::Button::Component.new(type: :dashed)) { "Large" } %>
  <% end %>

  <%= render(Hakumi::Space::Component.new(size: :middle)) do %>
    <%= render(Hakumi::Button::Component.new(type: :primary)) { "Middle" } %>
    <%= render(Hakumi::Button::Component.new) { "Middle" } %>
    <%= render(Hakumi::Button::Component.new(type: :dashed)) { "Middle" } %>
  <% end %>

  <%= render(Hakumi::Space::Component.new(size: :small)) do %>
    <%= render(Hakumi::Button::Component.new(type: :primary)) { "Small" } %>
    <%= render(Hakumi::Button::Component.new) { "Small" } %>
    <%= render(Hakumi::Button::Component.new(type: :dashed)) { "Small" } %>
  <% end %>
<% end %>
Align
Align configuration.
Center Block
Start Block
End Block
Baseline Block
Code
<div class="space-align-container">
  <div class="space-align-block">
    <%= render(Hakumi::Space::Component.new(align: :center)) do %>
      <span>Center</span>
      <%= render(Hakumi::Button::Component.new(type: :primary)) { "Primary" } %>
      <span class="mock-block">Block</span>
    <% end %>
  </div>
  <div class="space-align-block">
    <%= render(Hakumi::Space::Component.new(align: :start)) do %>
      <span>Start</span>
      <%= render(Hakumi::Button::Component.new(type: :primary)) { "Primary" } %>
      <span class="mock-block">Block</span>
    <% end %>
  </div>
  <div class="space-align-block">
    <%= render(Hakumi::Space::Component.new(align: :end)) do %>
      <span>End</span>
      <%= render(Hakumi::Button::Component.new(type: :primary)) { "Primary" } %>
      <span class="mock-block">Block</span>
    <% end %>
  </div>
  <div class="space-align-block">
    <%= render(Hakumi::Space::Component.new(align: :baseline)) do %>
      <span>Baseline</span>
      <%= render(Hakumi::Button::Component.new(type: :primary)) { "Primary" } %>
      <span class="mock-block">Block</span>
    <% end %>
  </div>
</div>

<style>
  .space-align-container {
    display: flex;
    flex-wrap: wrap;
    align-items: flex-start;
    gap: 16px;
  }
  .space-align-block {
    flex: none;
    margin: 8px 4px;
    padding: 4px;
    border: 1px solid #40a9ff;
  }
  .mock-block {
    display: inline-block;
    padding: 16px 8px;
    background: rgba(150, 150, 150, 0.2);
  }
</style>
Wrap
Auto wrap line.
Code
<%= render(Hakumi::Space::Component.new(size: [8, 16], wrap: true)) do %>
  <% 20.times do |i| %>
    <%= render(Hakumi::Button::Component.new) { "Button #{i}" } %>
  <% end %>
<% end %>
Compact Mode
Compact Mode for Button.
Code
<%= render(Hakumi::Space::Component.new(direction: :vertical)) do %>
  <%= render(Hakumi::Space::Compact::Component.new(block: true)) do %>
    <%= render(Hakumi::Button::Component.new) { "Button 1" } %>
    <%= render(Hakumi::Button::Component.new) { "Button 2" } %>
    <%= render(Hakumi::Button::Component.new) { "Button 3" } %>
    <%= render(Hakumi::Button::Component.new) { "Button 4" } %>
  <% end %>

  <%= render(Hakumi::Space::Compact::Component.new(block: true)) do %>
    <%= render(Hakumi::Button::Component.new(type: :primary)) { "Button 1" } %>
    <%= render(Hakumi::Button::Component.new(type: :primary)) { "Button 2" } %>
    <%= render(Hakumi::Button::Component.new(type: :primary)) { "Button 3" } %>
    <%= render(Hakumi::Button::Component.new(type: :primary)) { "Button 4" } %>
  <% end %>
<% end %>
Split
Set split to add separator between items. Requires using with_item slots.
Link 1
|
Link 2
|
Link 3
Code
<%= render Hakumi::Space::Component.new(split: "|") do |space| %>
  <% space.with_item do %>
    <%= render(Hakumi::Typography::Text::Component.new) { "Link 1" } %>
  <% end %>
  <% space.with_item do %>
    <%= render(Hakumi::Typography::Text::Component.new) { "Link 2" } %>
  <% end %>
  <% space.with_item do %>
    <%= render(Hakumi::Typography::Text::Component.new) { "Link 3" } %>
  <% end %>
<% end %>

Space API

Prop Type Default Description
direction :horizontal or :vertical :horizontal Layout orientation.
size :small | :middle | :large or Integer :small Gap between items.
align :start | :center | :end or :baseline - Cross-axis alignment.
wrap Boolean false Allow items to wrap.
block Boolean false Display as block element.
split String - Separator between items (only works with items slot).
with_item Slot (multiple) - Individual items wrapped in .hakumi-space-item.
content Block - Direct content (alternative to with_item slots).
**html_options Keyword args - Attributes merged into `.hakumi-space`. Pass as kwargs (e.g., `class:`, `style:`, `data:`).

Space::Compact API

Prop Type Default Description
direction :horizontal or :vertical :horizontal Stack direction.
block Boolean false Full-width layout.
content slot Slot - Adjacent components (e.g., buttons).
**html_options Keyword args - Extra attributes merged into `.hakumi-space-compact`. Pass as kwargs (e.g., `class:`, `style:`, `data:`).