Ir para o conteúdo
Secções
Idioma, atualmente Português
Sistema de design Rastrillo

Primitivas de interface

As formas que um componente não pode ser, porque envolvem um corpo que só quem chama conhece: o cartão de secção, a grelha de dados, o menu de revelação e a moldura própria dos invólucros. O tokens.css traz as classes e a aplicação escreve a marcação. Tudo o que está abaixo é a marcação que ui.Styleguide devolve, com as palavras na sua língua, e os testes de ui confrontam essa marcação com tokens.css.

Cada exemplo funciona de verdade, mas as suas ligações não levam a lado nenhum.

box

O cartão de secção com espaçamento, e o título que fica fora dele.

Qual cartão é qual

O rst-list e o rst-card não têm espaçamento de propósito: seguram uma série de linhas, e cada linha espaça-se a si mesma. Meta lá dentro um formulário, um parágrafo, uma tira de ligações ou qualquer coisa que não seja uma linha e aparece encostado ao contorno; o texto a tocar na borda é o sinal. O cartão com espaçamento para conteúdo qualquer é o rst-box, com o seu título como rst-box-head irmão logo antes.

Pré-visualização
<div rst-box-head>
  <h2>Pagamento</h2>
  <a rst-btn href="/payout/edit">Editar</a>
</div>
<section rst-box>
  <p>Tudo o que está num ecrã fica dentro de caixas.</p>
  <div rst-box-foot>Atualizado há 2 horas</div>
</section>

button

Os botões têm quatro variantes e três tamanhos, e uma ligação pode parecer um. Para o indicador que um formulário mostra enquanto é enviado, veja form-foot.

Pré-visualização
<p>
  <button rst-btn type="button">Cancelar</button> <button rst-btn="primary" type="button">Guardar</button> <button rst-btn="ghost" type="button">Pré-visualização</button> <button rst-btn="danger" type="button">Eliminar</button>
</p>
<p>
  <button rst-btn="primary sm" type="button">Pequeno</button> <button rst-btn="primary" type="button">Predefinido</button> <button rst-btn="primary lg" type="button">Grande</button> <a rst-btn href="/orders">Ver encomendas</a>
</p>
<p>
  <button rst-btn="primary block" type="button">Continuar</button>
</p>
<p>
  <button rst-btn type="button" disabled>Arquivado</button>
</p>

dropdown

O menu details/summary por trás dos menus de excedente do cabeçalho e do filtro de uma barra de lista, mais um filtro aplicado como etiqueta removível.

Pré-visualização
<details rst-dropdown name="rst-menus">
  <summary>
    Filtrar
    <span rst-caret aria-hidden="true">
      <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"/></svg>
    </span>
    <span class="rst-sr-only">Filtrar encomendas: Pago</span>
  </summary>
  <div rst-dropdown-menu>
    <a aria-current="true" href="/orders?status=paid">Pago</a>
    <details rst-menu-group name="rst-menus-price" open>
      <summary>Preço</summary>
      <div>
        <a href="/orders?price=free">Gratuito</a>
      </div>
    </details>
  </div>
</details>
<span rst-ftok>
  <span rst-ftok-k>Pago</span>
  <a href="/orders" aria-label="Remover o filtro Pago">✕</a>
</span>

form-layout

Os atributos que dão a um formulário o seu ritmo e a sua barra de guardar. Nenhum parcial os emite; envolvem uma série de campos composta por quem os usa.

Pré-visualização
<form rst-form-flow method="post" action="/settings">
  <div rst-field>
    <label rst-field-label for="name">Nome</label>
    <input rst-input type="text" id="name" name="name">
  </div>
  <div rst-field>
    <label rst-field-label for="email">E-mail</label>
    <input rst-input type="email" id="email" name="email">
  </div>
  <div rst-field-row>
    <div class="rst-grow" rst-field>
      <label rst-field-label for="city">Cidade</label>
      <input rst-input type="text" id="city" name="city">
    </div>
    <div rst-field>
      <label rst-field-label for="zip">CP</label>
      <input rst-input="short" type="text" id="zip" name="zip">
    </div>
  </div>
  <div rst-form-bar>
    <span rst-form-bar-note>As alterações são guardadas de imediato.</span>
    <div rst-form-actions>
      <a rst-btn href="/settings">Cancelar</a>
      <button rst-btn="primary" type="submit">Guardar</button>
    </div>
  </div>
</form>

help

Um ponto de interrogação com contorno que liga a um artigo de ajuda. A sua dica de CSS é decoração; a ligação leva a sua própria etiqueta, em frase completa.

Pré-visualização
<a rst-help rst-tip href="/help/orders" target="_blank" rel="noopener" aria-label="Ajuda: encomendas" data-tip="Sobre encomendas">
  <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="10"/><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"/><path d="M12 17h.01"/></svg>
</a>

list-grid

O vocabulário a sério das tabelas de dados: o cartão define as suas colunas uma vez e as linhas só escolhem células.

Os ecrãs empilham-se na vertical

Um ecrã é uma coluna: page-header, depois section-header + cartão, depois o section-header + cartão seguinte, por ordem de leitura. A disposição horizontal fica reservada às expressões que a trazem: rst-box-head, rst-field-row, rst-lbar, células rst-lrow, rst-seg-tabs.

Pré-visualização
<div rst-card style="--rst-cols: 2fr 110px var(--rst-col-menu)">
  <div rst-lrow="head">
    <span>Encomenda</span>
    <span class="rst-m-hide">Estado</span>
    <span></span>
  </div>
  <div rst-lrow>
    <a class="rst-nm" href="/orders/AB3PX"><bdi>Grace Hopper</bdi>
      <small>AB3PX · <bdi>grace@example.com</bdi></small>
    </a>
    <span class="rst-m-hide rst-cell-mut">Pago</span>
    <details rst-row-menu name="rst-menus">
      <summary aria-label="Ações para Grace Hopper">
        <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><circle cx="12" cy="12" r="1"/><circle cx="12" cy="5" r="1"/><circle cx="12" cy="19" r="1"/></svg>
      </summary>
      <div rst-row-menu-panel>
        <a href="/orders/AB3PX">Ver</a>
        <hr>
        <a class="rst-danger" href="/orders/AB3PX/refund">Reembolsar encomenda…</a>
      </div>
    </details>
  </div>
  <p rst-no-match>Nenhuma encomenda corresponde. <a href="/orders">Limpar filtros</a></p>
</div>
<p rst-count-line>A mostrar <strong>1–20</strong> de <strong>412</strong></p>

modal

Um modal é um URL próprio, não um estado do cliente: a página por baixo marcada como inert, o painel por cima e uma ligação simples para fechar.

Pré-visualização
<div rst-backdrop inert>
  <div rst-page>
    <h1>Definições</h1>
  </div>
</div>
<div rst-modal-overlay>
  <dialog rst-modal-panel open aria-labelledby="modal-title">
    <nav>
      <a href="/settings/profile" aria-current="page">Perfil</a>
      <a href="/settings/billing">Faturação</a>
      <a href="/settings/notifications">Notificações</a>
    </nav>
    <section>
      <a rst-modal-close href="/settings" aria-label="Fechar as definições">✕</a>
      <h2 id="modal-title">Perfil</h2>
      <p>Atualize o nome e a fotografia que aparecem em toda a conta.</p>
    </section>
  </dialog>
</div>

Veja-o a funcionar no URL a que pertence (abre num separador novo).

selbox

A caixa de seleção que uma linha de lista usa em modo de seleção. A sua etiqueta repete a identidade da linha.

Pré-visualização
<label rst-selbox>
  <input type="checkbox" aria-label="Selecionar a encomenda AB3PX">
</label>

shell-sidebar

A moldura do invólucro sidebar numa página de conteúdo: num telemóvel, um controlo para voltar ao índice.

Pré-visualização
<div rst-shell-sidebar="page">
  <a rst-skip href="#main">Ir para o conteúdo</a>
  <div rst-shell-back>
    <a href="/#nav-reports" rel="up" aria-label="Voltar a Secções">Secções</a>
  </div>
  <aside rst-shell-rail>
    <h1 rst-shell-title>
      <span><a rst-shell-brand href="/">Notes</a></span><span>Relatórios</span>
    </h1>
    <a rst-shell-brand href="/">Notes</a>
    <nav rst-shell-nav>
      <span rst-shell-group>Trabalho</span>
      <a id="nav-dashboard" href="/dashboard">Painel</a>
      <a id="nav-reports" href="/reports" aria-current="page">Relatórios</a>
    </nav>
    <div rst-shell-rail-foot>
      <details rst-dropdown rst-shell-profile name="rst-shell-menu">
        <summary>
          <span rst-shell-avatar>
            <span rst-person-av aria-hidden="true">A</span>
            <span rst-person-name>Ada Lovelace</span>
          </span>
        </summary>
        <div rst-dropdown-menu>
          <div rst-shell-who>
            <span rst-person-av aria-hidden="true">A</span>
            <span rst-person-name>Ada Lovelace</span>
            <span rst-person-email>ada@example.com</span>
          </div>
          <a href="/settings">Definições</a>
        </div>
      </details>
    </div>
  </aside>
  <main rst-shell-main id="main">
    <div rst-page>Conteúdo.</div>
  </main>
</div>

Abrir a demonstração do invólucro com barra lateral, uma pré-visualização autónoma. (abre num separador novo).

shell-topbar

A moldura do próprio invólucro com barra superior, em marcação. O Layout entrega-a como um modelo inteiro.

Pré-visualização
<div rst-shell-topbar>
  <a rst-skip href="#main">Ir para o conteúdo</a>
  <header rst-shell-bar>
    <a rst-shell-brand href="/">Notes</a>
    <details rst-shell-menu name="rst-shell-menu">
      <summary>
        <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 12h16"/><path d="M4 6h16"/><path d="M4 18h16"/></svg>Menu</summary>
    </details>
    <div rst-shell-tail>
      <nav rst-shell-nav>
        <a href="/" aria-current="page">Início</a>
        <a href="/archive">Arquivo</a>
      </nav>
      <details rst-dropdown rst-shell-account name="rst-menus">
        <summary>
          Conta
          <span rst-caret aria-hidden="true">
            <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 9 6 6 6-6"/></svg>
          </span>
        </summary>
        <div rst-dropdown-menu>
          <a href="/settings">Definições</a>
        </div>
      </details>
    </div>
  </header>
  <main rst-page id="main">Conteúdo.</main>
  <footer rst-shell-foot>Feito com rastrillo</footer>
</div>

Abrir a demonstração do invólucro com barra superior, uma pré-visualização dedicada. (abre num separador novo).

stat-band

Uma linha de números ao longo do topo de um painel.

Pré-visualização
<div rst-stats>
  <div rst-stat="lead">
    <span rst-stat-label>Receita deste mês</span>
    <span rst-stat-num>&euro;48,210</span>
    <span rst-stat-delta rst-tone="positive">+12%</span>
    <span rst-stat-note>face ao mês passado</span>
  </div>
  <div rst-stat>
    <span rst-stat-label>Encomendas de hoje</span>
    <span rst-stat-num>318</span>
  </div>
  <div rst-stat>
    <span rst-stat-label>Cesto médio</span>
    <span rst-stat-num>&euro;41.20</span>
    <span rst-stat-delta rst-tone="negative">&minus;3%</span>
  </div>
  <div rst-stat>
    <span rst-stat-label>Reembolsos</span>
    <span rst-stat-num>7</span>
  </div>
</div>

tblock

Um cartão com contorno cujo corpo só aparece enquanto o seu interruptor está ligado, através de :has(). O interruptor é que manda; mostrar é apenas uma conveniência.

Pré-visualização
<div rst-tblock>
  <label rst-tblock-head>
    <input type="checkbox" name="notify" checked>
    <span rst-switch-track aria-hidden="true"></span>
    <span>
      <span rst-tblock-title>Notificações por e-mail</span>
      <span rst-tblock-desc>Enviado por cada resposta numa conversa em que participa.</span>
    </span>
  </label>
  <div rst-tblock-body>
    <div rst-field>
      <label rst-field-label for="notify-freq">Frequência</label>
      <input rst-input type="text" id="notify-freq" name="notify_freq" value="Resumo diário">
    </div>
  </div>
</div>