CSS sistema de componentes · Novo recurso

Sistema de design Bootstrap.

Use Bootstrap 5.3.8 com sua escala de espaçamento real, cores semânticas, grade responsiva e APIs de componentes. Experimente um formulário de reserva funcional, um resumo de erros, um filtro de tabela, um modal e um alternador de modo de cor; depois, reutilize o código documentado.

Guia OpenDesign8 capítulos66 entradas de referênciaGuia de aplicação original
01

Prévia da interface do sistema de design Bootstrap

Filtre reservas, valide campos, revise em um modal nativo e alterne entre os modos claro e escuro.

Reservas de equipamentos · Bootstrap 5.3.8Abrir exemplo completo
Bootstrap 5.3.8 CSS e JavaScript nativos, servidos localmente. Os dados de reserva e o comportamento do aplicativo são exemplos originais. · Referência de implementação
02

Referência de design do sistema de design Bootstrap

Bootstrap 5.3.8 CSS compilados padrão e documentação da versão 5.3. Os valores são padrões, não regras de marca obrigatórias. As conversões de rem para pixels consideram uma raiz de 16px; os tamanhos de fonte responsivos podem variar abaixo do limite para telas grandes. A página OpenDesign ao redor mantém sua própria tipografia.

Cores semânticas e funções das superfícies

Fonte
Nome / RegraValor / ConfiguraçãoUso
--bs-primary#0d6efd Cor base da ação principal e dos links.
--bs-secondary#6c757d Família secundária de tema; não corresponde à função adaptativa de texto secundário do corpo.
--bs-success#198754 Cor base do status positivo; use também um rótulo.
--bs-danger#dc3545 Cor base do tema de erro/destrutivo.
--bs-warning#ffc107 Cor base do tema de alerta; verifique o contraste do texto.
--bs-info#0dcaf0 Cor base do tema informativo.
--bs-body-bg#fffSuperfície da página no modo claro.
--bs-body-color#212529 Cor do texto principal no modo claro.
--bs-secondary-bg#e9ecef Superfície secundária no modo claro.
--bs-tertiary-bg#f8f9fa Superfície de painel discreta no modo claro.
--bs-primary-bg-subtle#cfe2ff Superfície primária com tonalidade no modo claro.
--bs-primary-text-emphasis#052c65 Texto combinado com superfícies primárias sutis.
--bs-border-color#dee2e6 Função da borda no modo claro.

Tipografia do corpo e hierarquia legível

Fonte
Nome / RegraValor / ConfiguraçãoUso
--bs-body-font-size1remTamanho padrão do texto do corpo: 1rem, normalmente 16px.
--bs-body-line-height1.5Multiplicador sem unidade: normalmente, altura de linha de 24px.
--bs-body-font-weight400Peso normal do texto do corpo.
--bs-body-font-familyvar(--bs-font-sans-serif)Pilha de fontes da interface do sistema fornecida por Bootstrap.
--bs-font-monospaceSFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospaceO código e os valores técnicos usam a pilha monoespaçada.

Tamanhos de títulos e utilitários de exibição

Fonte
Nome / RegraValor / ConfiguraçãoUso
h1 / .h12.5remLimite para telas grandes; h1–h4 usam tamanhos de fonte responsivos por padrão.
h2 / .h22remLimite para telas grandes; h1–h4 usam tamanhos de fonte responsivos por padrão.
h3 / .h31.75remLimite para telas grandes; h1–h4 usam tamanhos de fonte responsivos por padrão.
h4 / .h41.5remLimite para telas grandes; h1–h4 usam tamanhos de fonte responsivos por padrão.
h5 / .h51.25remTamanho padrão fixo do título.
h6 / .h61remTamanho padrão fixo do título.
.lead1.25rem / weight 300Texto introdutório; não substitui um título.
.small0.875emTexto relativamente pequeno; use com moderação em metadados.

Escala de utilitários de espaçamento

Fonte
Nome / RegraValor / ConfiguraçãoUso
00Use com os utilitários m/p/gap/g; por exemplo, p-0.
10.25remUse com os utilitários m/p/gap/g; por exemplo, p-1.
20.5remUse com os utilitários m/p/gap/g; por exemplo, p-2.
31remUse com os utilitários m/p/gap/g; por exemplo, p-3.
41.5remUse com os utilitários m/p/gap/g; por exemplo, p-4.
53remUse com os utilitários m/p/gap/g; por exemplo, p-5.
ms / meinline start / endConvenção de lados lógicos; diferente de ml/mr nas versões antigas de Bootstrap.
p-3 p-md-41rem → 1.5rem at mdPreenchimento responsivo usado no exemplo.
gap-20.5remEspaçamento entre os elementos filhos de flex/grid.

Limites da grade responsiva

Fonte
Nome / RegraValor / ConfiguraçãoUso
xs / .col-0Faixa base, sem infixo xs.
sm / .col-sm-576pxFaixa pequena; largura máxima de .container: 540px.
md / .col-md-768pxFaixa média; largura máxima de .container: 720px.
lg / .col-lg-992pxFaixa grande; largura máxima de .container: 960px.
xl / .col-xl-1200pxFaixa extragrande; largura máxima de .container: 1140px.
xxl / .col-xxl-1400pxMaior faixa padrão; largura máxima de .container: 1320px.
Grid columns12Uma composição col-lg-7 + col-lg-5 preenche uma linha.
Default horizontal gutter1.5remPreenchimento de coluna de 0.75rem em cada lado; a linha compensa com margens negativas.

Raio das bordas e elevação

Fonte
Nome / RegraValor / ConfiguraçãoUso
--bs-border-width1pxLargura padrão da borda.
--bs-border-radius0.375remCampos, cartões e cantos arredondados padrão.
--bs-border-radius-sm0.25remArredondamento compacto.
--bs-border-radius-lg0.5remArredondamento mais amplo.
--bs-border-radius-xl1remArredondamento amplo para superfícies.
--bs-border-radius-xxl2remArredondamento extragrande para superfícies.
--bs-border-radius-pill50remFormato de pílula; não representa o raio medido de um componente.
--bs-box-shadow-sm0 0.125rem 0.25rem rgba(0, 0, 0, 0.075)Elevação sutil.
--bs-box-shadow0 0.5rem 1rem rgba(0, 0, 0, 0.15)Elevação padrão.
--bs-box-shadow-lg0 1rem 3rem rgba(0, 0, 0, 0.175)Elevação intensa; não aplique a todas as superfícies.

Tamanho dos botões e variáveis de estado

Fonte
Nome / RegraValor / ConfiguraçãoUso
--bs-btn-padding-x0.75remPreenchimento horizontal padrão do botão.
--bs-btn-padding-y0.375remPreenchimento vertical padrão do botão.
--bs-btn-font-size1remTamanho padrão do texto do botão.
--bs-btn-line-height1.5Multiplicador padrão da altura de linha do rótulo.
--bs-btn-border-width1pxEspessura padrão da borda.
--bs-btn-border-radiusvar(--bs-border-radius)Raio padrão do botão.
--bs-btn-disabled-opacity0.65Estilo visual; use também o atributo disabled real.

Alterações de função nos modos claro e escuro

Fonte
Nome / RegraValor / ConfiguraçãoUso
--bs-body-bglight #fff / dark #212529O plano de fundo da página acompanha data-bs-theme.
--bs-body-colorlight #212529 / dark #dee2e6A cor do texto se adapta à superfície.
--bs-border-colorlight #dee2e6 / dark #495057Borda adaptada ao tema.
--bs-primary-bg-subtlelight #cfe2ff / dark #031633O plano de fundo colorido do status muda conforme o modo.
--bs-primary-text-emphasislight #052c65 / dark #6ea8feUse com a superfície sutil correspondente.
data-bs-themelight | darkDefina globalmente em html ou em uma subárvore local.
03

Guia completo do sistema de design Bootstrap

Um guia prático para escolher, aplicar e avaliar este sistema em uma interface real.

DESIGN-bootstrap.md

Orientações completas, um ponto de partida para a implementação e links para o código-fonte.

Baixar o guia

Escolha o CSS de sistema de design Bootstrap e as responsabilidades de JavaScript

Uma folha de estilos, comportamento opcional dos componentes

A folha de estilos compilada de Bootstrap fornece a grade, a tipografia, os utilitários e a aparência dos componentes. O pacote JavaScript adiciona plugins interativos, como Modal, Collapse e Dropdown. Um botão estilizado não exige JavaScript; um acionador de modal com data-bs-toggle, sim. A prévia funcional carrega localmente a folha de estilos e o pacote correspondentes à versão 5.3.8 para que os controles demonstrem esses contratos reais.

Com base neste guia de OpenDesign

A filtragem da tabela de reservas, o resumo de erros e a inserção local de linhas são implementados pelo aplicativo. Deixar essa distinção clara permite substituir os registros fictícios por um serviço sem atribuir ao próprio Bootstrap a funcionalidade de reservas.

  • CSS: layout, tipografia, botões, campos, tabelas e estilos de estado.
  • Bootstrap JavaScript: abertura do modal, fundo sobreposto, tecla Escape e comportamento do foco.
  • Aplicação JavaScript: mensagens de validação, filtragem de registros e atualizações locais de dados.

Consulte a especificação de apoio

Escolha o CSS compilado ou uma compilação com Sass

Use o CSS compilado para começar rapidamente ou para um produto compatível com o conjunto padrão de utilitários. Use o código-fonte Sass para alterar mapas de tema, geração de utilitários ou a grade durante a compilação. As propriedades personalizadas de CSS em tempo de execução são úteis para personalizar componentes, mas alterar uma variável de cor raiz não recompila todas as variantes pré-compiladas.

scss
$primary: #3159a5;
$border-radius: .5rem;
@import "bootstrap/scss/bootstrap";

Referência de código

Consulte a especificação de apoio

Sistema de Design Bootstrap: aplique cores semânticas e modos de cor

Combine uma superfície de status com sua cor de primeiro plano

Os selos de reserva usam bg-primary-subtle com text-primary-emphasis. Essas funções semânticas são complementares, então a cor de primeiro plano e o fundo se adaptam quando data-bs-theme muda. Um fundo azul puro combinado com uma cor de texto cinza arbitrária perde essa relação. Além disso, Reservado, Em uso e Rascunho continuam sendo rótulos escritos; a cor não é seu único meio de transmitir significado.

html
<span class="badge text-primary-emphasis bg-primary-subtle">Reserved</span>
<section data-bs-theme="dark">
  <div class="bg-body text-body border rounded p-3">Theme-scoped content</div>
</section>

Referência de código

Consulte a especificação de apoio

Concentre a personalização no componente

Para uma ação personalizada, substitua as propriedades --bs-btn-* locais. Defina valores para os estados de foco e ativo, além do fundo padrão. O exemplo abaixo é uma variante da aplicação, não um padrão de Bootstrap. Mantenha esta classe no botão desejado para evitar que ela altere silenciosamente todas as ações primárias de outras partes da página.

css
.btn-reserve {
  --bs-btn-color: #fff;
  --bs-btn-bg: #3159a5;
  --bs-btn-border-color: #3159a5;
  --bs-btn-hover-color: #fff;
  --bs-btn-hover-bg: #274783;
  --bs-btn-hover-border-color: #274783;
  --bs-btn-active-color: #fff;
  --bs-btn-active-bg: #203a6b;
  --bs-btn-active-border-color: #203a6b;
}

Referência de código

Consulte a especificação de apoio

Sistema de Design Bootstrap: use a escala tipográfica real

Separe a semântica do documento do tamanho visual

O título principal da prévia é um h1 com a classe h3: ele continua sendo o título principal da página, mas usa a escala visual menor, mais adequada a uma ferramenta. Os títulos das seções são elementos h2 com estilo h5. Bootstrap oferece estilos padrão para os elementos e classes de título equivalentes, permitindo essa distinção sem pular níveis no documento.

O texto padrão do corpo usa 1rem com entrelinha de 1.5. Os tamanhos de h1 a h4 se ajustam de forma responsiva antes de atingir os valores da tabela de referência. Portanto, uma captura de tela em uma única largura não define toda a escala tipográfica. Use os estilos compilados ou o comportamento Sass documentado, em vez de copiar um tamanho em pixels medido em apenas uma largura de tela.

Consulte a especificação de apoio

Atribua ao texto secundário uma função adaptável ao tema

text-body-secondary acompanha o modo de cor do corpo. É adequado para informações complementares de registros, como o nome do responsável abaixo do título de um equipamento. A classe small reduz o tamanho em relação ao contexto; usá-la em todos os rótulos dos campos dificulta a leitura rápida do formulário. Mantenha os rótulos no tamanho padrão dos formulários e reserve o texto compacto para dicas e metadados.

html
<h1 class="h3">Equipment reservations</h1>
<p class="text-body-secondary">Review availability before booking.</p>
<small class="text-body-secondary">Local demonstration data</small>

Referência de código

Consulte a especificação de apoio

Sistema de Design Bootstrap: componha com utilitários de espaçamento e a grade

Use a escala em vez de espaçamentos arbitrários

p-3 corresponde a 1rem de preenchimento interno; p-4, a 1.5rem; e p-5 salta para 3rem. Os rótulos são chaves da escala, não valores literais em pixels. A prévia usa p-3 p-md-4 para aumentar o preenchimento externo em 768px, enquanto mb-3 separa os grupos de campos por 1rem. Esta é uma regra específica para este exemplo, não uma nova escala oficial de espaçamento.

html
<div class="p-3 p-md-4">
  <div class="d-flex flex-wrap gap-2 mb-3">
    <button class="btn btn-primary">Review</button>
    <button class="btn btn-outline-secondary">Reset</button>
  </div>
</div>

Referência de código

Consulte a especificação de apoio

Mantenha intacta a relação entre linhas e colunas

Consulte a especificação de apoio

Sistema de Design Bootstrap: crie campos com relações explícitas

Associe rótulos, dicas e mensagens de validação

form-label aplica estilo a um rótulo real; seu valor for deve corresponder ao id do campo. form-control estiliza campos de entrada de texto, enquanto form-select estiliza um menu de seleção. A prévia usa aria-describedby para associar os IDs das dicas e dos erros, além de required para indicar a restrição efetiva. Os nomes das classes não criam essas relações semânticas automaticamente.

html
<label for="equipment" class="form-label">Equipment</label>
<select id="equipment" class="form-select" required
  aria-describedby="equipment-error">
  <option value="">Choose equipment</option>
  <option>Camera kit A</option>
</select>
<div class="invalid-feedback" id="equipment-error">Choose equipment.</div>

Referência de código

Consulte a especificação de apoio

Use um estado inválido real e um resumo acessível

Ao enviar o formulário, o exemplo verifica cada campo, define is-invalid e aria-invalid, cria links de texto para os campos com erro e move o foco para o resumo. Quando um campo é corrigido, seu estado é atualizado sem apagar as outras respostas. Essa camada da aplicação é essencial: a documentação de validação de Bootstrap alerta que o feedback visual personalizado, por si só, não é totalmente apresentado às tecnologias assistivas.

  1. Verifique o resultado da restrição antes de marcar o campo como inválido.
  2. Associe a mensagem de erro ao campo e exponha o estado inválido.
  3. Após o envio, direcione o foco para um resumo útil ou para o primeiro campo inválido.

Consulte a especificação de apoio

Sistema de Design Bootstrap: apresente e filtre registros sem perder o significado

Use o componente de tabela para dados comparáveis

A tabela tem cabeçalhos de coluna, cabeçalhos de linha e uma legenda. table-hover aplica um estilo ao passar o cursor, mas não transforma as linhas em botões. A filtragem altera o estado de visibilidade das linhas correspondentes e atualiza a contagem de resultados com aria-live. O status exibido continua sendo texto dentro de um selo, então seu significado permanece mesmo quando o modo de cor muda.

html
<div class="table-responsive">
  <table class="table table-hover">
    <caption>Fictional equipment reservations</caption>
    <thead><tr><th scope="col">Equipment</th><th scope="col">Status</th></tr></thead>
    <tbody><tr><th scope="row">Camera kit A</th><td>Reserved</td></tr></tbody>
  </table>
</div>

Referência de código

Consulte a especificação de apoio

Restrinja a rolagem da tabela aos dados

table-responsive permite a rolagem horizontal quando uma tabela larga não cabe na tela. Antes de colocar nessa área um menu suspenso que precise sair dos limites do recorte, verifique como ele se comporta. No exemplo, o filtro fica acima da tabela. Em dispositivos móveis, somente a área de dados deve rolar horizontalmente; a página inteira deve permanecer dentro da tela.

Consulte a especificação de apoio

Sistema de Design Bootstrap: revise a seleção com o modal API

Abra o modal somente depois que o formulário for validado

O exemplo interativo cria ou reutiliza a instância de Modal de Bootstrap e chama show somente quando a validação é aprovada. Assim, a camada de revisão não encobre erros que exigem atenção. O texto é preenchido com os valores atuais; ao escolher Editar detalhes, o modal é fechado e o formulário é mantido.

javascript
const element = document.getElementById("review-modal");
const modal = bootstrap.Modal.getOrCreateInstance(element);
// Run after validation and after populating the review text.
modal.show();
element.addEventListener("hidden.bs.modal", () => {
  document.querySelector("#reservation button[type=submit]").focus();
});

Referência de código

Consulte a especificação de apoio

Trate o modal como um ciclo de vida de componente

Bootstrap controla o fundo sobreposto e a transição do modal. Use os métodos e eventos disponíveis em vez de alternar display manualmente, o que pode deixar o foco ou o fundo em um estado inconsistente. Nesta demonstração, a confirmação adiciona uma linha local à tabela e fecha o modal; ela não chama um serviço de reservas. A mensagem de sucesso descreve exatamente esse resultado local.

Consulte a especificação de apoio

Integre e amplie este exemplo de sistema de design Bootstrap

Carregue uma versão correspondente de CSS e JavaScript

O exemplo incorporado carrega localmente os arquivos de Bootstrap 5.3.8 CSS e do pacote armazenados. Os atributos de dados e o Modal API são dessa versão. Em uma aplicação Vite, importe o CSS compilado e o plugin necessário, conforme mostrado na seção de configuração. Evite carregar o pacote e inicializar uma segunda cópia do mesmo plugin por meio de outro wrapper.

Consulte a especificação de apoio

Amplie usando o contrato real do componente

  • Use o exemplo para inspecionar o foco, o fechamento do modal e as alterações de tema.
  • Mantenha as operações de dados da aplicação separadas do comportamento do plugin Bootstrap.
  • Confira novamente qualquer substituição de tema nos estados normal, hover, foco, inválido e desabilitado.

Consulte a especificação de apoio

Exemplos de componentes do sistema de design Bootstrap

index.html — estudo completo de reservas

Uma página Bootstrap 5.3.8 completa, com folha de estilos, runtime do modal, validação, filtros e confirmação local. Salve este arquivo como index.html e disponibilize a pasta usando o comando abaixo. As dependências fixadas por CDN exigem conexão com a internet.

html
<!doctype html><html lang="en" data-bs-theme="light"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Bootstrap equipment reservations — OpenDesign example</title><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css"><style>body{margin:0}main{max-width:1120px;margin:auto}.demo-stat{font-variant-numeric:tabular-nums}.table td,.table th{vertical-align:middle}.table caption{font-size:.875rem}.demo-status:empty{display:none}@media(max-width:575px){.table th,.table td{font-size:.8125rem;padding:.65rem .4rem}.demo-mobile-hide{display:none}}@media(prefers-reduced-motion:reduce){*{scroll-behavior:auto!important}}</style></head><body>
<header class="border-bottom bg-body-tertiary px-3 px-md-4 py-3 d-flex align-items-center justify-content-between gap-3"><div><strong>Studio inventory</strong><span class="badge text-bg-primary ms-2">Bootstrap 5.3.8</span></div><button id="theme" type="button" class="btn btn-outline-secondary btn-sm" aria-pressed="false">Dark mode</button></header>
<main class="p-3 p-md-4"><div class="d-flex align-items-start justify-content-between gap-3 mb-4"><div><p class="text-body-secondary small mb-1">EQUIPMENT / RESERVATIONS</p><h1 class="h3 mb-2">Keep the next shoot ready.</h1><p class="text-body-secondary mb-0">Check equipment, create a local reservation and review its details.</p></div><span class="badge rounded-pill text-primary-emphasis bg-primary-subtle border border-primary-subtle demo-mobile-hide">Interactive example</span></div>
<div class="row g-3 mb-4"><div class="col-4"><div class="border rounded p-3"><div class="text-body-secondary small">Equipment</div><strong class="fs-3 demo-stat">12</strong></div></div><div class="col-4"><div class="border rounded p-3"><div class="text-body-secondary small">Reservations</div><strong id="count" class="fs-3 demo-stat">3</strong></div></div><div class="col-4"><div class="border rounded p-3"><div class="text-body-secondary small">Available</div><strong class="fs-3 demo-stat">8</strong></div></div></div>
<div class="row g-4"><section class="col-lg-7" aria-labelledby="list-title"><div class="d-flex align-items-center justify-content-between gap-3 mb-3"><h2 id="list-title" class="h5 m-0">Reservation list</h2><div><label for="filter" class="visually-hidden">Filter reservations by status</label><select class="form-select form-select-sm" id="filter"><option value="all">All statuses</option><option value="Reserved">Reserved</option><option value="In use">In use</option><option value="Draft">Draft</option></select></div></div><div class="table-responsive border rounded"><table class="table table-hover mb-0"><caption class="px-3">Fictional records. New entries stay in this browser tab.</caption><thead class="table-light"><tr><th scope="col">Equipment</th><th scope="col">Date</th><th scope="col">Status</th></tr></thead><tbody id="rows"><tr data-status="Reserved"><th scope="row" class="fw-medium">Camera kit A<div class="small fw-normal text-body-secondary">Mia Chen</div></th><td>10 Oct</td><td><span class="badge text-primary-emphasis bg-primary-subtle">Reserved</span></td></tr><tr data-status="In use"><th scope="row" class="fw-medium">Lighting studio<div class="small fw-normal text-body-secondary">Alex Kim</div></th><td>10 Oct</td><td><span class="badge text-success-emphasis bg-success-subtle">In use</span></td></tr><tr data-status="Draft"><th scope="row" class="fw-medium">Audio recorder<div class="small fw-normal text-body-secondary">Jules Davis</div></th><td>11 Oct</td><td><span class="badge text-secondary-emphasis bg-secondary-subtle">Draft</span></td></tr></tbody></table></div><p id="empty" class="alert alert-info mt-3" hidden>No reservations match this status.</p><p id="results" class="small text-body-secondary mt-2" aria-live="polite">3 reservations shown</p><div class="alert alert-primary mt-4 mb-0"><strong>Try the system</strong><p class="small mb-0 mt-1">Switch color mode, filter the table, submit an empty form, then review a complete reservation in a Bootstrap modal.</p></div></section>
<section class="col-lg-5" aria-labelledby="form-title"><div class="card"><div class="card-body p-3 p-md-4"><h2 id="form-title" class="h5 mb-3">New reservation</h2><form id="reservation" novalidate><div id="error-summary" class="alert alert-danger" tabindex="-1" role="alert" hidden><strong>Check the reservation details.</strong><ul class="mb-0 mt-2" id="error-links"></ul></div><div class="mb-3"><label class="form-label" for="equipment">Equipment</label><select class="form-select" id="equipment" aria-describedby="equipment-error" required><option value="">Choose equipment</option><option>Camera kit A</option><option>Lighting studio</option><option>Audio recorder</option></select><div id="equipment-error" class="invalid-feedback">Choose equipment for this reservation.</div></div><div class="mb-3"><label class="form-label" for="owner">Reserved by</label><input class="form-control" id="owner" autocomplete="name" aria-describedby="owner-hint owner-error" required><div class="form-text" id="owner-hint">Use a fictional name for this example.</div><div class="invalid-feedback" id="owner-error">Enter the name of the person reserving equipment.</div></div><div class="mb-3"><label class="form-label" for="date">Reservation date</label><input class="form-control" id="date" type="date" aria-describedby="date-error" required><div class="invalid-feedback" id="date-error">Choose a reservation date.</div></div><button type="submit" class="btn btn-primary w-100">Review reservation</button></form><p class="small text-body-secondary mt-3 mb-0">This example validates input locally. It does not reserve real equipment.</p></div></div></section></div><div id="notice" class="alert alert-success mt-4 demo-status" role="status" hidden></div></main>
<div class="modal fade" id="review-modal" tabindex="-1" aria-labelledby="review-title" aria-hidden="true"><div class="modal-dialog modal-dialog-centered"><div class="modal-content"><div class="modal-header"><h2 class="modal-title fs-5" id="review-title">Review reservation</h2><button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close review"></button></div><div class="modal-body"><dl class="row mb-0"><dt class="col-4">Equipment</dt><dd class="col-8" id="review-equipment"></dd><dt class="col-4">Reserved by</dt><dd class="col-8" id="review-owner"></dd><dt class="col-4">Date</dt><dd class="col-8" id="review-date"></dd></dl><p class="small text-body-secondary mt-3 mb-0">Confirming adds a row to this local example only.</p></div><div class="modal-footer"><button class="btn btn-outline-secondary" data-bs-dismiss="modal" type="button">Edit details</button><button class="btn btn-primary" id="confirm" type="button">Add to example</button></div></div></div></div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script><script>
const $=id=>document.getElementById(id);const fields=['equipment','owner','date'];const review=bootstrap.Modal.getOrCreateInstance($('review-modal'));
$('theme').onclick=()=>{const dark=document.documentElement.dataset.bsTheme!=='dark';document.documentElement.dataset.bsTheme=dark?'dark':'light';$('theme').setAttribute('aria-pressed',String(dark));$('theme').textContent=dark?'Light mode':'Dark mode'};
function filter(){let count=0;for(const row of $('rows').rows){row.hidden=$('filter').value!=='all'&&row.dataset.status!==$('filter').value;if(!row.hidden)count++}$('empty').hidden=count>0;$('results').textContent=count+' reservations shown'}$('filter').onchange=filter;
function validateField(id){const el=$(id),invalid=!el.checkValidity();el.classList.toggle('is-invalid',invalid);el.setAttribute('aria-invalid',String(invalid));return !invalid}
$('reservation').onsubmit=e=>{e.preventDefault();const invalid=fields.filter(id=>!validateField(id));$('error-links').replaceChildren();$('error-summary').hidden=invalid.length===0;if(invalid.length){for(const id of invalid){const li=document.createElement('li'),a=document.createElement('a');a.href='#'+id;a.className='alert-link';a.textContent=$(id+'-error').textContent;a.onclick=e=>{e.preventDefault();$(id).focus()};li.append(a);$('error-links').append(li)}$('error-summary').focus();return}for(const id of fields)$('review-'+id).textContent=$(id).value;review.show()};
for(const id of fields)$(id).addEventListener('input',()=>{if($(id).getAttribute('aria-invalid')==='true')validateField(id)});
$('review-modal').addEventListener('hidden.bs.modal',()=>$('reservation').querySelector('button').focus());
$('confirm').onclick=()=>{const row=document.createElement('tr');row.dataset.status='Reserved';const name=document.createElement('th');name.scope='row';name.className='fw-medium';name.textContent=$('equipment').value;const owner=document.createElement('div');owner.className='small fw-normal text-body-secondary';owner.textContent=$('owner').value;name.append(owner);const date=document.createElement('td');date.textContent=$('date').value;const state=document.createElement('td'),badge=document.createElement('span');badge.className='badge text-primary-emphasis bg-primary-subtle';badge.textContent='Reserved';state.append(badge);row.append(name,date,state);$('rows').prepend(row);$('count').textContent=$('rows').rows.length;$('filter').value='all';filter();review.hide();$('notice').hidden=false;$('notice').textContent='Reservation added to this local example. No data was sent.';$('reservation').reset();for(const id of fields){$(id).classList.remove('is-invalid');$(id).removeAttribute('aria-invalid')}};
</script></body></html>

Referência de código

  • Nenhum serviço recebe os dados do formulário. As reservas confirmadas existem apenas nesta sessão da página.
  • A prévia local inclui as mesmas versões fixadas de CSS e JavaScript; esta cópia usa os URLs públicos de CDN desses recursos.

Rótulo do campo, dica e estado de erro explícito

Esta composição independente de campo usa estilos de Bootstrap e um resultado real de validação. O exemplo de página adiciona um resumo de erros com links focalizáveis para os três campos. Uma borda vermelha, por si só, não comunica como corrigir o problema.

html
<form id="reservation" novalidate>
  <label for="owner" class="form-label">Reserved by</label>
  <input id="owner" class="form-control" required
    aria-describedby="owner-hint owner-error">
  <div id="owner-hint" class="form-text">Use a fictional name.</div>
  <div id="owner-error" class="invalid-feedback">Enter a name.</div>
  <button class="btn btn-primary mt-3" type="submit">Review reservation</button>
</form>
<script>
const form = document.querySelector('#reservation');
const input = document.querySelector('#owner');
form.addEventListener('submit', event => {
  event.preventDefault();
  const invalid = !input.checkValidity();
  input.classList.toggle('is-invalid', invalid);
  input.setAttribute('aria-invalid', String(invalid));
  if (invalid) input.focus();
});
</script>

Referência de código

  • .is-invalid pode ser definido explicitamente sem .was-validated.
  • aria-describedby associa a dica e o texto de erro; aria-invalid expressa o estado atual.
  • A documentação alerta que a validação visual personalizada, por si só, não oferece informações suficientes às tecnologias assistivas.

Um modal de revisão nativo com um rótulo claro

O modal usa o plugin real de Bootstrap, o backdrop, o tratamento da tecla Escape e o gerenciamento de foco. Coloque o título em modal-header, a revisão em modal-body e as ações para continuar em modal-footer.

html
<button class="btn btn-primary" data-bs-toggle="modal"
  data-bs-target="#review">Review reservation</button>
<div class="modal fade" id="review" tabindex="-1"
  aria-labelledby="review-title" aria-hidden="true">
  <div class="modal-dialog modal-dialog-centered">
    <div class="modal-content">
      <div class="modal-header">
        <h2 class="modal-title fs-5" id="review-title">Review reservation</h2>
        <button class="btn-close" data-bs-dismiss="modal"
          aria-label="Close review"></button>
      </div>
      <div class="modal-body">Camera kit A · 10 October</div>
      <div class="modal-footer">
        <button class="btn btn-outline-secondary" data-bs-dismiss="modal">Edit details</button>
      </div>
    </div>
  </div>
</div>

Referência de código

  • Carregue uma vez o bundle correspondente de Bootstrap JavaScript.
  • O data API abre um exemplo estático; o formulário funcional de reservas usa Modal.getOrCreateInstance após a entrada de dados válidos.
  • Use shown.bs.modal para comportamentos que precisam aguardar o fim da transição de abertura.

Uma composição responsiva de lista e formulário

No breakpoint lg, a lista de inventário ocupa sete colunas e o formulário, cinco. Abaixo de lg, as duas seções ficam empilhadas. g-4 define um espaçamento interno de 1.5rem na composição. As colunas descrevem a largura; as seções semânticas e os títulos descrevem o conteúdo.

html
<main class="container py-4">
  <div class="row g-4">
    <section class="col-lg-7" aria-labelledby="reservations-title">
      <h2 id="reservations-title" class="h5">Reservations</h2>
      <div class="table-responsive">
        <table class="table table-hover">
          <caption>Fictional equipment reservations</caption>
          <thead><tr><th scope="col">Equipment</th><th scope="col">Status</th></tr></thead>
          <tbody><tr><th scope="row">Camera kit A</th><td>Reserved</td></tr></tbody>
        </table>
      </div>
    </section>
    <section class="col-lg-5" aria-labelledby="new-title">
      <h2 id="new-title" class="h5">New reservation</h2>
    </section>
  </div>
</main>

Referência de código

  • A mesma grade pode usar col-md-* se o conteúdo realmente couber em uma largura menor.
  • Use a tabela de breakpoints acima em vez de media queries com variáveis CSS; var() não pode definir um limite de media query.
04

Configuração do agente para o sistema de design Bootstrap

Ponto de partida para implementação

Este exemplo completo de HTML não exige uma etapa de build. Ele importa Bootstrap 5.3.8 dos URLs fixados de CDN exibidos no arquivo. Os exemplos mais curtos abaixo isolam padrões individuais desta página funcional.

sh
# Save the complete index.html from Component Examples in a new folder.
# Serve that folder with Python 3:
python3 -m http.server 8000
# Open http://localhost:8000/ in a browser.

Um prompt para seu projeto

Prompt para agente de IA
Implemente uma interface de reserva de equipamentos usando Bootstrap 5.3.8 e este guia. Use uma linha g-4 com col-lg-7 e col-lg-5, espaçamento p-3 p-md-4, o corpo adaptado ao tema e papéis de cor sutil/de ênfase, uma tabela semântica e controles de formulário identificados por rótulos. Faça a validação com erros explícitos e um resumo de erros antes de abrir o Modal nativo de Bootstrap. Preserve os campos ao editar; adicione registros apenas ao estado local de demonstração, a menos que seja fornecido um API real. Ofereça suporte a data-bs-theme light/dark e ao fechamento pelo teclado. Não substitua a escala fornecida por valores arbitrários.
05

Escopo e fontes do sistema de design Bootstrap

Guia de aplicação Bootstrap 5.3.8 e exemplo executável de componentes nativos de OpenDesign. Os valores de referência vêm da documentação Bootstrap vinculada e do CSS compilado com versão fixada. Os registros de reservas, a composição do layout e o resumo de validação são código original da aplicação; nenhuma reserva real é enviada.