Shadwire
Componentes

Sidebar

Uma barra lateral componível, colapsável e responsiva para layouts de aplicação.

Veja o sidebar em um layout completo

O bloco sidebar-01 demonstra colapso, atalho Cmd/Ctrl+B e drawer mobile.

Abrir o bloco

Instalação

O Shadwire segue o modelo open-code do shadcn/ui: o código-fonte do componente é copiado para a sua aplicação e passa a ser seu. Instale com a CLI:

shadwire add sidebar --yes

O item sidebar do registry instala estes arquivos:

  • app/components/ui_component.rb
  • app/components/ui/sidebar_component.rb
  • app/components/ui/sidebar/provider_component.rb
  • app/components/ui/sidebar/trigger_component.rb
  • app/components/ui/sidebar/rail_component.rb
  • app/components/ui/sidebar/inset_component.rb
  • app/components/ui/sidebar/input_component.rb
  • app/components/ui/sidebar/header_component.rb
  • app/components/ui/sidebar/footer_component.rb
  • app/components/ui/sidebar/separator_component.rb
  • app/components/ui/sidebar/content_component.rb
  • app/components/ui/sidebar/group_component.rb
  • app/components/ui/sidebar/group_label_component.rb
  • app/components/ui/sidebar/group_action_component.rb
  • app/components/ui/sidebar/group_content_component.rb
  • app/components/ui/sidebar/menu_component.rb
  • app/components/ui/sidebar/menu_item_component.rb
  • app/components/ui/sidebar/menu_button_component.rb
  • app/components/ui/sidebar/menu_action_component.rb
  • app/components/ui/sidebar/menu_badge_component.rb
  • app/components/ui/sidebar/menu_skeleton_component.rb
  • app/components/ui/sidebar/menu_sub_component.rb
  • app/components/ui/sidebar/menu_sub_item_component.rb
  • app/components/ui/sidebar/menu_sub_button_component.rb
  • app/helpers/ui/sidebar_helper.rb
  • app/javascript/controllers/ui_sidebar_controller.js
  • vendor/shadwire/shadwire.css

Este componente usa Stimulus: a aplicação precisa de importmap-rails e stimulus-rails com carregamento automático de controllers.

Ainda não instalou a CLI? gem install shadwire e depois shadwire init.

Uso

Envolva a página com ui_sidebar_provider; ele hospeda o controller e expõe as larguras como CSS vars.

<%= ui_sidebar_provider do %>
  <%= ui_sidebar do %>
    <%= ui_sidebar_content do %>
      <%= ui_sidebar_group do %>
        <%= ui_sidebar_group_label { "Aplicação" } %>
        <%= ui_sidebar_group_content do %>
          <%= ui_sidebar_menu do %>
            <%= ui_sidebar_menu_item do %>

Ou renderize os componentes diretamente:

<%= render Ui::Sidebar::ProviderComponent.new do %>
  <%= render Ui::SidebarComponent.new(collapsible: :icon) do %>
    <%= render Ui::Sidebar::ContentComponent.new do %>
      <%= render Ui::Sidebar::MenuComponent.new do %>
        <%= render Ui::Sidebar::MenuItemComponent.new do %>
          <%= render Ui::Sidebar::MenuButtonComponent.new(tooltip: "Início") { "Início" } %>
        <% end %>
      <% end %>

Composição

Sidebar::Provider (data-controller="ui-sidebar"; define as larguras via CSS vars)
|-- Sidebar (peer/group; data-state/collapsible/side/variant/mobile)
|   |-- Sidebar::Header  (ex.: switcher + Sidebar::Input)
|   |-- Sidebar::Content
|   |   `-- Sidebar::Group > Sidebar::GroupLabel + Sidebar::GroupContent
|   |       `-- Sidebar::Menu > Sidebar::MenuItem
|   |           > Sidebar::MenuButton (+ MenuAction / MenuBadge / MenuSub)
|   |-- Sidebar::Footer

Exemplos

Preview

Um sidebar contido (collapsible: :none) com header, grupos e menu. O bloco completo, com colapso e drawer mobile, está em /blocks/sidebar-01.

Conteúdo
<div class="flex h-80 w-full max-w-md overflow-hidden rounded-lg border bg-card text-left"
     style="--sidebar-width: 14rem; --sidebar-width-icon: 3rem; --sidebar-width-mobile: 14rem;">
  <%= ui_sidebar(collapsible: :none, class: "border-r") do %>
    <%= ui_sidebar_header do %>
      <div class="px-2 py-1.5 text-sm font-semibold">Acme Inc</div>
    <% end %>
    <%= ui_sidebar_content do %>
      <%= ui_sidebar_group do %>

Referência da API

APIElementoDescrição
ui_sidebar_providerdivHospeda o controller ui-sidebar; aceita default_open: e cookie_name:.
ui_sidebardivO painel. Aceita side: (:left/:right), variant: (:sidebar/:floating/:inset) e collapsible: (:offcanvas/:icon/:none).
ui_sidebar_triggerbuttonAlterna o sidebar (clique ou Cmd/Ctrl+B).
ui_sidebar_railbuttonFaixa na borda interna que alterna o colapso.
ui_sidebar_insetmainÁrea de conteúdo ao lado do sidebar.
ui_sidebar_header / ui_sidebar_footerdivRegiões superior e inferior.
ui_sidebar_contentdivRegião rolável com os grupos.
ui_sidebar_group / _group_label / _group_contentdivSeção rotulada de menu.
ui_sidebar_menu / _menu_itemul / liLista de itens do menu.
ui_sidebar_menu_buttonbutton/ais_active:, variant:, size: e tooltip: (visível só no modo ícone).
ui_sidebar_menu_action / _menu_badgebutton / divAção e badge fixados à direita do item.
ui_sidebar_menu_sub / _menu_sub_item / _menu_sub_buttonul / li / aSubmenu aninhado.
ui_sidebar_menu_skeletondivPlaceholder de carregamento; show_icon:.