Shadwire

Buscar na documentação

Busque nas páginas da documentação e dos componentes por título e por conteúdo.

Começar
Introdução
Instalação
shadwire.json
Theming
Dark mode
Ferramentas
CLI
Agent skill
Registry
llms.txt
Guias
Composição
Estilização
Formulários
Ícones
Acessibilidade
Localização
Blocks
Visão geral
Componentes
Visão geral
Accordion
Alert
Alert Dialog
Aspect Ratio
Avatar
Badge
Breadcrumb
Button
Button Group
Calendar
Card
Carousel
Chart
Checkbox
Collapsible
Combobox
Command
Context Menu
Data Table
Date Picker
Dialog
Drawer
Dropdown Menu
Empty
Field
Hover Card
Icon
Input
Input Group
Input OTP
Item
Kbd
Label
Menubar
Native Select
Navigation Menu
Pagination
Popover
Progress
Radio Group
Resizable
Scroll Area
Select
Separator
Sheet
Sidebar
Skeleton
Slider
Sonner
Spinner
Switch
Table
Tabs
Textarea
Toggle
Toggle Group
Tooltip

Sidebar

Uma barra lateral para layouts de aplicação, montada por partes, que recolhe e se adapta a telas pequenas.

Veja a sidebar num layout completo

O bloco sidebar-01 mostra a barra recolhendo, o atalho Cmd/Ctrl+B e a gaveta no celular.

Abrir o bloco

Instalação

O Shadwire segue o modelo open code do shadcn/ui: o código-fonte do componente é copiado para o seu app 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, então 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 carrega o controller e expõe as larguras como variáveis CSS.

<%= ui_sidebar_provider do %>
  <%= ui_sidebar do %>
    <%= ui_sidebar_content do %>
      <%= ui_sidebar_group do %>
        <%= ui_sidebar_group_label { "Application" } %>
        <%= 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: "Home") { "Home" } %>
        <% end %>
      <% end %>

Composição

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

Exemplos

Prévia

Uma sidebar fixa (collapsible: :none) com cabeçalho, grupos e menu. O bloco completo, que recolhe e vira gaveta no celular, está em /blocks/sidebar-01.

Acme Inc
Content
<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

API Elemento Descriçã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. O rótulo aceita tag:.
ui_sidebar_group_actionbuttonAção fixada no rótulo do grupo; tag:.
ui_sidebar_menu / _menu_itemul / liLista de itens do menu.
ui_sidebar_menu_buttonbutton/ais_active:, variant:, size:, tag: e tooltip: (visível só no modo ícone).
ui_sidebar_menu_action / _menu_badgebutton / divAção e badge fixados à direita do item. A ação aceita tag:, e show_on_hover: para mostrá-la só com a linha em hover ou foco.
ui_sidebar_menu_sub / _menu_sub_item / _menu_sub_buttonul / li / aSubmenu aninhado. O botão aceita is_active:, size: e tag:.
ui_sidebar_menu_skeletondivPlaceholder de carregamento; show_icon:.