Tokens com propósito
Cor, espaçamento e tipografia alinhados à identidade VATSE e prontos para claro e escuro.
Uma biblioteca prática para transformar produtos, portais e operações em experiências consistentes, rápidas e acessíveis. Sem exemplos genéricos: cada bloco já nasce com estados, contraste e comportamento.
Cor, espaçamento e tipografia alinhados à identidade VATSE e prontos para claro e escuro.
Transições suaves, sem efeitos quebrados ou animações que roubam a atenção do conteúdo.
Estados de foco, teclado, toque e responsividade documentados para a operação real.
Framework component-first com temas e modo claro/escuro. Selecione um item no menu para ver preview + snippet.
<div class="sc-card">
<h3>Smart UI</h3>
<p class="doc-muted">Framework component-first...</p>
<div style="display:flex; gap:10px; flex-wrap:wrap;">
<button class="sc-btn sc-btn-primary">Começar</button>
<button class="sc-btn sc-btn-glass">Theming</button>
</div>
</div>
<div class="sc-banner">
<div class="sc-banner-inner">
<div class="sc-banner-grid">
<div>
<span class="sc-badge">Hero</span>
<h2 class="sc-banner-title">Crie interfaces bonitas...</h2>
<p class="sc-banner-subtitle">Tokens + componentes...</p>
<div class="sc-banner-actions">
<button class="sc-btn sc-btn-primary">Ver Grid</button>
<button class="sc-btn sc-btn-outline">Ver Banners</button>
</div>
</div>
<div class="sc-banner-media sc-banner-media--ratio"></div>
</div>
</div>
</div>
<div class="sc-banner sc-banner--center">
<div class="sc-banner-inner">
<h2 class="sc-banner-title">Documentação focada</h2>
<p class="sc-banner-subtitle">A sidebar mostra só o componente...</p>
<div class="sc-banner-actions">
<button class="sc-btn sc-btn-primary">Botões</button>
<button class="sc-btn sc-btn-glass">Forms</button>
</div>
</div>
</div>
<div class="sc-banner sc-banner--glass">
<div class="sc-banner-inner">
<div class="sc-banner-grid">
<div>
<span class="sc-badge sc-badge-info">Glass</span>
<h2 class="sc-banner-title">Perfeito para temas...</h2>
<p class="sc-banner-subtitle">Valide contraste e blur...</p>
<div class="sc-banner-actions">...</div>
</div>
<div class="sc-card sc-card-hover">...</div>
</div>
</div>
</div>
<div class="sc-banner sc-banner--announce">
<div class="sc-banner-inner">
<div class="sc-banner-grid">
<div>
<span class="sc-badge">NOVO</span>
<span class="doc-muted">13 temas + light/dark...</span>
</div>
<div class="sc-banner-actions">
<button class="sc-btn sc-btn-primary sc-btn-sm">Ver temas</button>
</div>
</div>
</div>
</div>
<div class="sc-banner sc-banner--compact">
<div class="sc-banner-inner">
<div class="sc-banner-grid">
<div>...</div>
<div class="sc-grid sc-cols-2 sc-gap-2">
<div class="sc-card sc-card-compact sc-card-hover">...</div>
<div class="sc-card sc-card-compact sc-card-hover">...</div>
<div class="sc-card sc-card-compact sc-card-hover">...</div>
<div class="sc-card sc-card-compact sc-card-hover">...</div>
</div>
</div>
</div>
</div>
Parágrafo de apoio para validar hierarquia, contraste e ritmo.
<div class="sc-card">
<div class="sc-display-2">Título (Display)</div>
<h2>Subtítulo H2</h2>
<h3>Seção H3</h3>
<p class="doc-muted">Parágrafo de apoio...</p>
</div>
<div class="sc-card">
<div class="sc-text-xs sc-font-medium sc-tracking-wide">...</div>
<div class="sc-text-sm sc-font-normal">...</div>
<div class="sc-text-lg sc-font-semibold sc-leading-tight">...</div>
<div class="sc-text-2xl sc-font-black">...</div>
</div>
Texto lead para abrir uma seção com bom ritmo.
Texto normal com highlight e leitura confortável.
Use doc-muted para metadados e texto de apoio.
<div class="sc-card">
<p class="sc-text-lead">Texto lead...</p>
<p>Texto normal com <span class="sc-text-highlight">highlight</span>...</p>
<p class="doc-muted">Use <code>doc-muted</code>...</p>
</div>
Gradiente de marca com contraste preservado em cada tema.
<div class="sc-card">
<div class="sc-display-2 sc-text-gradient">Smart UI Gradient</div>
<p class="doc-muted">atil em heros/brandings...</p>
</div>
Link padrão: ir para tipografia •
strong • em • inline code
Valide estados de hover/focus e contraste em light/dark.
<div class="sc-card">
<p>
Link padrão: <a href="#doc-typography">ir para tipografia</a> •
<strong>strong</strong> • <em>em</em> • <code>inline code</code>
</p>
<p class="doc-muted">Valide estados de hover/focus...</p>
</div>
<div class="sc-card">
<div class="sc-grid sc-cols-2 sc-gap-3">
<div>
<div class="doc-muted">Lista (UL)</div>
<ul><li>Item 1</li></ul>
</div>
<div>
<div class="doc-muted">Lista (OL)</div>
<ol><li>Passo 1</li></ol>
</div>
</div>
</div>
Um parágrafo com texto mais longo para validar leitura, espaçamento e contraste. Use tokens para manter consistência entre temas.
“Uma citação curta para validar estilo e hierarquia visual.”
<div class="sc-card">
<h3>Título de artigo</h3>
<p>Um parágrafo com texto mais longo... <a href="#doc-tokens">tokens</a>...</p>
<blockquote>“Uma citação curta...”</blockquote>
</div>
Use <pre><code> para trechos longos (ex.: docs).
<pre><code>const root = document.documentElement;</code></pre>
<button class="sc-btn sc-btn-primary">Primary</button>
<button class="sc-btn sc-btn-secondary">Secondary</button>
<button class="sc-btn sc-btn-success">Success</button>
<button class="sc-btn sc-btn-danger">Danger</button>
<button class="sc-btn sc-btn-outline">Outline</button>
<button class="sc-btn sc-btn-glass">Glass</button>
<!-- Efeitos (opt-in) -->
<button class="sc-btn sc-btn-primary sc-btn-shine" data-spotlight="true">...</button>
<button class="sc-btn sc-btn-outline sc-btn-pop">Pop</button>
<button class="sc-btn sc-btn-primary sc-btn-float">Float</button>
<button class="sc-btn sc-btn-glass sc-btn-pulse">Pulse</button>
<button class="sc-btn sc-btn-cutframe">
Apply for access <i class="sc-icon" data-smart-icon="arrow-right"></i>
</button>
<button class="sc-btn sc-btn-secondary sc-btn-swap">
<span class="sc-btn-swap-text">Comprar</span>
<span class="sc-btn-swap-icon"><i class="sc-icon" data-smart-icon="cart"></i></span>
</button>
<button class="sc-btn sc-btn-soft">Soft</button>
<button class="sc-btn sc-btn-ghost">Ghost</button>
<button class="sc-btn sc-btn-gradient">Gradient</button>
<button class="sc-btn sc-btn-primary sc-btn-sm">Small</button>
<button class="sc-btn sc-btn-primary">Default</button>
<button class="sc-btn sc-btn-primary sc-btn-lg">Large</button>
<button class="sc-btn sc-btn-primary sc-btn-pill">Assinar</button>
<button class="sc-btn sc-btn-outline sc-btn-pill">Ver preços</button>
<button class="sc-btn sc-btn-glass sc-btn-pill">Compartilhar</button>
<button class="sc-btn sc-btn-outline sc-btn-icon" aria-label="Favoritar">
<i class="sc-icon" data-smart-icon="star"></i>
</button>
<button class="sc-btn sc-btn-primary sc-btn-icon" aria-label="Adicionar">
<i class="sc-icon" data-smart-icon="plus"></i>
</button>
<button class="sc-btn sc-btn-glass sc-btn-icon" aria-label="Configurações">
<i class="sc-icon" data-smart-icon="settings"></i>
</button>
<div class="sc-btn-group" role="group" aria-label="Grupo">
<button class="sc-btn sc-btn-glass">Dia</button>
<button class="sc-btn sc-btn-glass">Semana</button>
<button class="sc-btn sc-btn-glass">Mês</button>
</div>
<button class="sc-btn sc-btn-primary" disabled>Disabled</button>
<button class="sc-btn sc-btn-primary is-loading" aria-disabled="true">Carregando</button>
<!-- FX (opt-in) -->
<button class="sc-btn sc-btn-ghost sc-btn-fx-fill">Fill</button>
<button class="sc-btn sc-btn-ghost sc-btn-fx-pulse">Pulse</button>
<button class="sc-btn sc-btn-ghost sc-btn-fx-slide">Slide</button>
<button class="sc-btn sc-btn-ghost sc-btn-fx-up">Up</button>
<button class="sc-btn sc-btn-ghost sc-btn-fx-raise">Raise</button>
<button class="sc-btn sc-btn-ghost sc-btn-fx-offset">Offset</button>
<button class="sc-btn sc-btn-ghost sc-btn-fx-close">Close</button>
Consumo recomendado: use <i data-smart-icon="nome"></i>.
A lib expõe smartIcons.createIcons() e smartIcons.renderIcon().
<!-- 1) Inclua o bundle -->
<script src="smart-icons-lib/dist/smarticons.js"></script>
<!-- 2) Use em qualquer lugar -->
<i class="sc-icon" data-smart-icon="home"></i>
<i class="sc-icon" data-smart-icon="calendar-check"></i>
<!-- 3) Se você injetar HTML dinamicamente, re-scan: -->
<script>smartIcons.createIcons(document);</script>
Base sólida para qualquer layout.
Feito para times e dashboards.
Perfeito para landing pages.
<div class="sc-grid sc-cols-3 sc-gap-3">
<div class="sc-card sc-card-outline sc-card-compact sc-card-hover">...</div>
<div class="sc-card sc-card-outline sc-card-compact sc-card-hover">...</div>
<div class="sc-card sc-card-outline sc-card-compact sc-card-hover">...</div>
</div>
Imagem + texto em card compacto.
Shine no hover (optin).
Use com grid responsivo.
<div class="sc-card sc-card-media sc-card-outline sc-card-shine">
<img src="..." alt="..." />
<div class="sc-card-body">...</div>
</div>
Popular do mês
Borda viva + glow.
Smart UI
Upgrade
Destaque para planos/CTAs.
Beta
Use como feature card.
Acesso<div class="sc-card sc-card-outline sc-card-gradient sc-card-glow">...</div>
No hover, o botão sobe e fica clicável.
timo para pricing/upsell.
<div class="sc-card sc-card-outline sc-card-reveal sc-card-hover sc-card-float" style="position:relative;">
...
<div class="sc-card-cta"><button class="sc-btn sc-btn-primary sc-btn-sm">Saiba mais</button></div>
</div>
Card de aviso com barra gradiente lateral.
Perfeito para alertas em dashboards.
<div class="sc-card sc-card-notify sc-card-outline">...</div>
Com smart-ui.js (tilt).
Bom para “feature cards”.
Glow sem JS + tilt via JS.
<div class="sc-card sc-card-3d sc-card-outline sc-card-glow">...</div>
Hover/focus levanta o card.
Passe o mouse ou foque.
Conteúdo alternativo.
Animação suave contínua.
<div class="sc-card sc-card-outline sc-card-float">...</div>
<div class="sc-card sc-card-outline sc-card-breathe">...</div>
<div class="sc-card-flip">
<div class="sc-card-flip-inner">
<div class="sc-card sc-card-outline sc-card-flip-front">...</div>
<div class="sc-card sc-card-outline sc-card-flip-back">...</div>
</div>
</div>
<div class="sc-card-app" data-card-fx="icon-glow">
<button class="sc-card-app-menu" type="button" aria-label="Mais opções">
<i class="sc-icon" data-smart-icon="more-horizontal"></i>
</button>
<div class="sc-card-app-visual" aria-hidden="true">
<img class="sc-card-app-icon" src="icon.png" alt="" />
</div>
<div class="sc-card-app-inner">
<img class="sc-card-app-icon" src="icon.png" alt="App" />
<h3 class="sc-card-app-title">Beeper</h3>
</div>
</div>
<!-- Requer smart-ui.js (initCardPointerFX) -->
Gestão de ponta a ponta
Comercial, projetos, contratos, financeiro e equipe em uma operação conectada.
Interface proprietária
Componentes reutilizáveis para produtos VATSE com estados, acessibilidade e identidade consistente.
Base para aplicações
Estrutura documentada para operações que precisam de dados, permissões e integrações confiáveis.
Tecnologia aplicada
Recursos de produto, automação e operação organizados em torno do trabalho real da VATSE.
<div class="sc-product-grid">
<article class="sc-product-card" style="--sc-product-accent:#ff8066;">
<div class="sc-product-head">
<h3 class="sc-product-title">Product</h3>
<div class="sc-product-price">¥2,000</div>
</div>
<div class="sc-product-thumb"><img src="..." alt="..." /></div>
<p class="sc-product-category">Category</p>
<p class="sc-product-desc">Descrição...</p>
<ul class="sc-product-tags"><li class="sc-product-tag">Tag</li></ul>
<button class="sc-btn sc-product-cta">Add to cart <i class="sc-icon" data-smart-icon="cart"></i></button>
</article>
</div>
Inputs são component-first: combine .sc-input com wrappers optin quando quiser efeitos.
<input class="sc-input" placeholder="Nome" />
<div class="sc-input-group">
<span class="sc-input-icon"><i class="sc-icon" data-smart-icon="search"></i></span>
<input class="sc-input" placeholder="Buscar..." />
</div>
<div class="sc-input-group" style="border-radius:999px;">
<span class="sc-input-icon">...</span>
<input class="sc-input" placeholder="Pesquisar..." />
<button class="sc-btn sc-btn-primary sc-btn-sm">Buscar</button>
</div>
<div class="sc-field sc-field-float">
<input class="sc-input" placeholder=" " />
<label class="sc-label">Email</label>
</div>
<div class="sc-input-shell sc-input-shell-glow">
<div class="sc-input-shell-inner">
<span class="sc-input-icon">...</span>
<input class="sc-input" placeholder="Explore..." />
</div>
</div>
type="number" para stepper nativo.<input class="sc-input" type="number" value="2" />
<input class="sc-input" type="date" />
<input class="sc-input" type="time" />
<input class="sc-input" type="datetime-local" />
<div class="sc-field">
<label class="sc-label">Mensagem</label>
<textarea class="sc-textarea" placeholder="Escreva uma mensagem⬦"></textarea>
<div class="sc-help">...</div>
</div>
::file-selector-button.<input class="sc-input" type="file" />
<div class="sc-input-group">
<span class="sc-input-addon">R$</span>
<input class="sc-input" type="number" />
<span class="sc-input-addon">BRL</span>
</div>
<div class="sc-input-group">
<span class="sc-input-icon">...</span>
<input class="sc-input" type="search" />
<button class="sc-btn sc-btn-ghost sc-input-action">...</button>
</div>
disabled sempre que possível (A11y)..is-valid..is-invalid.<input class="sc-input" disabled />
<input class="sc-input" readonly />
<input class="sc-input is-valid" />
<input class="sc-input is-invalid" />
<input class="sc-range" type="range" min="0" max="100" value="35" />
<input class="sc-range sc-range-steps" type="range" value="60" />
<!-- Requer smart-ui.js (initRangeSliders) -->
<input class="sc-range sc-range-kawaii" type="range" min="1" max="20" value="7" />
<input class="sc-range sc-range-kawaii" style="--sc-range-base:#8cc8e4;" type="range" value="4" />
<div class="sc-card sc-card-outline">
<div class="sc-field">
<label class="sc-label">Email</label>
<input class="sc-input" type="email" />
</div>
<div class="sc-field">
<label class="sc-label">Senha</label>
<input class="sc-input" type="password" />
</div>
<button class="sc-btn sc-btn-primary sc-btn-pill">Entrar</button>
</div>
<div class="sc-card sc-card-outline">
<div style="display:flex; gap:10px; flex-wrap:wrap; align-items:center;">
<input class="sc-input" placeholder="Buscar⬦" />
<div class="sc-select-menu" data-value="all">...</div>
<button class="sc-btn sc-btn-primary">Filtrar</button>
</div>
</div>
<div class="sc-card sc-card-outline sc-subscribe-card">
<div class="sc-subscribe-title">SUBSCRIBE</div>
<div class="sc-field">
<label class="sc-label">Seu e-mail</label>
<input class="sc-input" type="email" />
</div>
<button class="sc-btn sc-btn-primary sc-subscribe-submit sc-btn-pop">SUBMIT</button>
</div>
<textarea class="sc-textarea" placeholder="Escreva uma mensagem⬦"></textarea>
<!-- Checkbox (custom) -->
<label class="sc-checkbox">
<input type="checkbox" />
<span class="sc-checkbox-box"></span>
<span class="sc-checkbox-label">Padrão</span>
</label>
<label class="sc-checkbox sc-checkbox-draw">
<input type="checkbox" checked />
<span class="sc-checkbox-box">
<svg viewBox="0 0 64 64"><path d="..." /></svg>
</span>
<span class="sc-checkbox-label">Draw</span>
</label>
<label class="sc-checkbox sc-checkbox-swap">
<input type="checkbox" checked />
<span class="sc-checkbox-box">
<span class="sc-cbx-off"><i class="sc-icon" data-smart-icon="volume-x"></i></span>
<span class="sc-cbx-on"><i class="sc-icon" data-smart-icon="volume-2"></i></span>
</span>
<span class="sc-checkbox-label">Swap</span>
</label>
<!-- Radio (custom) -->
<label class="sc-radio">
<input type="radio" name="plan" checked />
<span class="sc-radio-dot"></span>
<span class="sc-radio-label">Plano básico</span>
</label>
<!-- Segmented (glider) -->
<div class="sc-radio-seg sc-radio-seg-glass">
<input type="radio" id="seg-a" name="seg" checked data-glider-bg="..." />
<label class="sc-radio-seg-btn" for="seg-a">Silver</label>
<input type="radio" id="seg-b" name="seg" data-glider-bg="..." />
<label class="sc-radio-seg-btn" for="seg-b">Gold</label>
<span class="sc-radio-seg-glider"></span>
</div>
<!-- Requer smart-ui.js (initRadioSegments) -->
<!-- Rating -->
<div class="sc-rating">
<input type="radio" id="rate-5" name="rate" value="5" />
<label for="rate-5"><i class="sc-icon" data-smart-icon="star"></i></label>
...
</div>
Enviamos um código para seu número.
<div class="sc-otp">
<input class="sc-input sc-otp-input" inputmode="numeric" />
<input class="sc-input sc-otp-input" inputmode="numeric" />
<input class="sc-input sc-otp-input" inputmode="numeric" />
<input class="sc-input sc-otp-input" inputmode="numeric" />
</div>
<!-- Requer smart-ui.js (initOtpInputs) -->
<div class="sc-file-drop" data-file-name=".sc-file-drop-out">
<label class="sc-file-drop-label" for="file">...</label>
<input id="file" type="file" />
<div class="sc-file-drop-file">
<span class="sc-file-drop-out">Nenhum arquivo selecionado</span>
</div>
</div>
<!-- Requer smart-ui.js (initFileDrops) -->
<label class="sc-toggle">
<input type="checkbox" />
<span class="sc-toggle-track">
<span class="sc-toggle-thumb"></span>
</span>
<span class="sc-toggle-label">Padrão</span>
</label>
<label class="sc-toggle sc-toggle-sunmoon">...</label>
<label class="sc-toggle sc-toggle-wobble">...</label>
<label class="sc-toggle sc-toggle-cyber">...</label>
<label class="sc-toggle sc-toggle-glass">...</label>
Use .sc-table-container para scroll horizontal e .sc-table para a tabela. Combine modificadores como .sc-table-striped, .sc-table-bordered, .sc-table-hover, .sc-table-compact, .sc-table-sticky.
<div class="sc-table-container">
<table class="sc-table sc-table-striped sc-table-hover">
<thead><tr><th>Nome</th><th>Status</th></tr></thead>
<tbody><tr><td>Ana</td><td>Ativo</td></tr></tbody>
</table>
</div>
| Nome | Status | Plano |
|---|---|---|
| Ana | Ativo | Pro |
| João | Pendente | Free |
<div class="sc-table-container">
<table class="sc-table">
<thead><tr><th>Nome</th><th>Status</th><th>Plano</th></tr></thead>
<tbody>...</tbody>
</table>
</div>
| Produto | Qtd | Total |
|---|---|---|
| Assinatura | 1 | R$ 49 |
| Créditos | 5 | R$ 25 |
| Suporte | 1 | R$ 19 |
<table class="sc-table sc-table-striped">...</table>
| Chave | Valor |
|---|---|
| Theme | Glass |
| Mode | Dark |
<table class="sc-table sc-table-bordered">...</table>
| ID | Evento | Hora |
|---|---|---|
| #12 | Login | 09:12 |
| #13 | Upload | 09:20 |
<table class="sc-table sc-table-compact">...</table>
| Arquivo | Tamanho | Data |
|---|---|---|
| relatorio.pdf | 2.1MB | Hoje |
| foto.png | 640KB | Ontem |
<table class="sc-table sc-table-hover">...</table>
| Col A | Col B | Col C | Col D | Col E |
|---|---|---|---|---|
| A | B | C | D | E |
<div class="sc-table-container">
<table class="sc-table sc-table-striped sc-table-compact">...muitas colunas...</table>
</div>
| Ticket | Assunto | Prioridade | Status |
|---|---|---|---|
| #1042 | Erro no checkout | Alta | Em análise |
| #1043 | Pedido duplicado | Média | Resolvido |
| #1044 | Atualização de plano | Baixa | Aberto |
<table class="sc-table sc-table-hover sc-table-striped">
<tbody>
<tr><td>#1042</td><td>...</td><td><span class="sc-badge sc-badge-danger">Alta</span></td></tr>
</tbody>
</table>
| Arquivo | Atualizado | Ações |
|---|---|---|
| briefing.pdf | Hoje |
|
| logo.png | Ontem |
|
<td style="text-align:right;">
<div class="sc-table-actions">
<button class="sc-btn sc-btn-outline sc-btn-sm">Ver</button>
<button class="sc-btn sc-btn-glass sc-btn-sm">Baixar</button>
</div>
</td>
| ID | Evento | Detalhe |
|---|---|---|
| #01 | Login | IP 10.0.0.1 |
| #02 | Upload | 2 arquivos |
| #03 | Export | CSV |
| #04 | Login | IP 10.0.0.2 |
| #05 | Update | Perfil |
| #06 | Login | IP 10.0.0.3 |
| #07 | Upload | imagem.png |
| #08 | Export |
<div class="sc-table-container sc-table-container--y">
<table class="sc-table sc-table-sticky">...</table>
</div>
| Nome | Status | |
|---|---|---|
| Ana | ana@email.com | Ativo |
| João | joao@email.com | Pendente |
| Maria | maria@email.com | Convidado |
<table class="sc-table sc-table-selectable">
<tr aria-selected="true">...</tr>
</table>
Você precisa de 3 coisas: um botão com data-modal-open, um container .sc-modal com id, e o
smart-ui.js carregado (ele faz initModals()).
<!-- 1) CSS/JS do Smart UI -->
<link rel="stylesheet" href="smart-ui/smart-ui.css" />
<script src="smart-ui/smart-ui.js" defer></script>
<!-- 2) Trigger -->
<button class="sc-btn sc-btn-primary" type="button" data-modal-open="meuModal">Abrir</button>
<!-- 3) Modal (id = data-modal-open) -->
<div class="sc-modal" id="meuModal">
<div class="sc-modal-backdrop"></div>
<div class="sc-modal-panel" role="document">
<div class="sc-modal-header">
<h3 class="sc-modal-title">Título</h3>
<button class="sc-modal-close" type="button" data-modal-close aria-label="Fechar"></button>
</div>
<div class="sc-modal-body">Conteúdo</div>
<div class="sc-modal-footer">
<button class="sc-btn sc-btn-glass" type="button" data-modal-close>Cancelar</button>
<button class="sc-btn sc-btn-primary" type="button">Confirmar</button>
</div>
</div>
</div>
Este modal fecha por backdrop, botão, ESC e faz trap de TAB dentro.
<button class="sc-btn sc-btn-primary" type="button" data-modal-open="demoModal">Abrir</button>
<div class="sc-modal" id="demoModal">
<div class="sc-modal-backdrop"></div>
<div class="sc-modal-panel" role="document">
<div class="sc-modal-header">
<h3 class="sc-modal-title">Modal Smart UI</h3>
<button class="sc-modal-close" type="button" data-modal-close aria-label="Fechar"></button>
</div>
<div class="sc-modal-body">...</div>
<div class="sc-modal-footer">
<button class="sc-btn sc-btn-glass" type="button" data-modal-close>Cancelar</button>
<button class="sc-btn sc-btn-primary" type="button" data-modal-close>OK</button>
</div>
</div>
</div>
Modelo rápido para confirmação.
<button class="sc-btn sc-btn-glass" type="button" data-modal-open="demoModal2">Abrir confirmação</button>
<div class="sc-modal" id="demoModal2">
<div class="sc-modal-backdrop"></div>
<div class="sc-modal-panel" role="document">
<div class="sc-modal-header">
<h3 class="sc-modal-title">Confirmação</h3>
<button class="sc-modal-close" type="button" data-modal-close></button>
</div>
<div class="sc-modal-body">Modelo rápido para confirmação.</div>
<div class="sc-modal-footer">
<button class="sc-btn sc-btn-outline" type="button" data-modal-close>Voltar</button>
<button class="sc-btn sc-btn-primary" type="button" data-modal-close>Confirmar</button>
</div>
</div>
</div>
Ideal para confirmações.
<button class="sc-btn sc-btn-outline" type="button" data-modal-open="demoModalSm">Abrir small</button>
<div class="sc-modal" id="demoModalSm">
<div class="sc-modal-backdrop"></div>
<div class="sc-modal-panel sc-modal-panel--sm" role="document">
...
</div>
</div>
<button class="sc-btn sc-btn-outline" type="button" data-modal-open="demoModalLg">Abrir large</button>
<div class="sc-modal" id="demoModalLg">
<div class="sc-modal-backdrop"></div>
<div class="sc-modal-panel sc-modal-panel--lg" role="document">
<div class="sc-modal-body">
<div class="sc-grid sc-cols-2 sc-gap-4">...</div>
</div>
</div>
</div>
atil para editores, fluxos complexos e telas cheias.
<button class="sc-btn sc-btn-outline" type="button" data-modal-open="demoModalFull">Abrir fullscreen</button>
<div class="sc-modal" id="demoModalFull">
<div class="sc-modal-backdrop"></div>
<div class="sc-modal-panel sc-modal-panel--fullscreen" role="document">...</div>
</div>
<button class="sc-btn sc-btn-outline" type="button" data-modal-open="demoModalSide">Abrir side sheet</button>
<div class="sc-modal" id="demoModalSide">
<div class="sc-modal-backdrop"></div>
<div class="sc-modal-panel sc-modal-panel--side" role="document">...</div>
</div>
<button class="sc-btn sc-btn-primary" type="button" data-modal-open="demoModalForm">Abrir form</button>
<div class="sc-modal" id="demoModalForm">
<div class="sc-modal-backdrop"></div>
<div class="sc-modal-panel" role="document">
<div class="sc-modal-header">...</div>
<div class="sc-modal-body">
<div class="sc-grid sc-cols-2 sc-gap-3">...</div>
<div class="sc-field">...</div>
</div>
<div class="sc-modal-footer">...</div>
</div>
</div>
Esse modelo testa scroll interno do modal (conteúdo maior que a tela).
1) Uso permitido conforme a política.
2) Dados são processados com segurança.
3) Cancelamento pode ser solicitado a qualquer momento.
4) Este texto é apenas um placeholder.
5) Repetição para simular conteúdo longo.
6) Repetição para simular conteúdo longo.
7) Repetição para simular conteúdo longo.
8) Repetição para simular conteúdo longo.
9) Repetição para simular conteúdo longo.
10) Repetição para simular conteúdo longo.
<button class="sc-btn sc-btn-glass" type="button" data-modal-open="demoModalScroll">Abrir conteúdo longo</button>
<div class="sc-modal" id="demoModalScroll">
<div class="sc-modal-backdrop"></div>
<div class="sc-modal-panel" role="document">
<div class="sc-modal-body">...conteúdo longo...</div>
</div>
</div>
Use .sc-menu + botão [data-menu-trigger]. O popover abre/fecha via smart-ui.js (initMenus).
<div class="sc-menu">
<button class="sc-btn sc-btn-glass" type="button" data-menu-trigger>Menu</button>
<div class="sc-menu-popover">
<button class="sc-menu-item" type="button">Item</button>
</div>
</div>
<!-- Requer smart-ui.js (initMenus) -->
<div class="sc-menu">
<button class="sc-btn sc-btn-glass" type="button" data-menu-trigger>Menu</button>
<div class="sc-menu-popover">
<button class="sc-menu-item" type="button">Perfil</button>
<button class="sc-menu-item" type="button">Configurações</button>
<div class="sc-menu-sep"></div>
<button class="sc-menu-item" type="button">Sair</button>
</div>
</div>
<div style="display:flex; gap:12px; flex-wrap:wrap;">
<div class="sc-menu">
<button class="sc-btn sc-btn-outline" type="button" data-menu-trigger>Ações</button>
<div class="sc-menu-popover">...</div>
</div>
<div class="sc-menu">
<button class="sc-btn sc-btn-primary" type="button" data-menu-trigger>Novo</button>
<div class="sc-menu-popover">...</div>
</div>
</div>
<div class="sc-menu">
<button class="sc-btn sc-btn-glass" type="button" data-menu-trigger>Mais</button>
<div class="sc-menu-popover">
<button class="sc-menu-item" type="button">
<span style="display:inline-flex; gap:10px; align-items:center;">
<i class="sc-icon" data-smart-icon="paperclip"></i> Anexar
</span>
<span class="doc-muted">Ctrl+U</span>
</button>
...
</div>
</div>
<div class="sc-menu">
<button class="sc-btn sc-btn-outline" type="button" data-menu-trigger>Filtro</button>
<div class="sc-menu-popover sc-menu-popover--left">...</div>
</div>
<div class="sc-menu">
<button class="sc-btn sc-btn-primary" type="button" data-menu-trigger>Criar</button>
<div class="sc-menu-popover sc-menu-popover--wide">
<button class="sc-menu-item" type="button">
<span style="display:inline-flex; gap:10px; align-items:center;">
<i class="sc-icon" data-smart-icon="file-text"></i> Documento
</span>
</button>
...
</div>
</div>
<div class="sc-menu">
<button class="sc-btn sc-btn-glass" type="button" data-menu-trigger>Config</button>
<div class="sc-menu-popover sc-menu-popover--wide">
<div class="doc-muted" style="padding: 8px 10px;">Preferências</div>
<button class="sc-menu-item" type="button">Tema</button>
<div class="sc-menu-sep"></div>
...
</div>
</div>
<div class="sc-menu">
<button class="sc-btn sc-btn-ghost sc-btn-icon" type="button" data-menu-trigger>
<i class="sc-icon" data-smart-icon="more-horizontal"></i>
</button>
<div class="sc-menu-popover">
<button class="sc-menu-item" type="button">...</button>
<button class="sc-menu-item is-danger" type="button">Excluir</button>
</div>
</div>
<div class="sc-menu">
<button class="sc-btn sc-btn-outline" type="button" data-menu-trigger>Status</button>
<div class="sc-menu-popover">
<button class="sc-menu-item" type="button"><span>Ativos</span><span class="sc-badge sc-badge-success">38</span></button>
</div>
</div>
<div class="sc-menu">
<button class="sc-btn sc-btn-glass" type="button" data-menu-trigger>Conta</button>
<div class="sc-menu-popover sc-menu-popover--wide">
<div class="doc-muted" style="padding: 8px 10px;">logado como <strong>usuário</strong></div>
<button class="sc-menu-item" type="button">Perfil</button>
<button class="sc-menu-item is-danger" type="button">Sair</button>
</div>
</div>
<button class="sc-btn sc-btn-outline" type="button" data-menu-trigger>Colunas</button>
<div class="sc-menu-popover">
<button class="sc-menu-item" role="menuitemcheckbox" aria-checked="true">
<span class="sc-menu-check"><i class="sc-icon" data-smart-icon="check"></i></span> Nome
</button>
</div>
Use .sc-tabs, uma .sc-tablist e painéis .sc-tabpanel. O JS cuida de ARIA, teclado e trocar painéis. Para o indicator animado, adicione .sc-tabs--indicator.
<div class="sc-tabs sc-tabs--indicator">
<div class="sc-tablist">
<button class="sc-tab" type="button" aria-selected="true">Tab 1</button>
<button class="sc-tab" type="button" aria-selected="false">Tab 2</button>
</div>
<div class="sc-tabpanel">Conteúdo 1</div>
<div class="sc-tabpanel" hidden>Conteúdo 2</div>
</div>
<!-- Requer smart-ui.js (initTabs) -->
<div class="sc-tabs sc-tabs--indicator">...</div>
<button class="sc-tab"><i class="sc-icon" data-smart-icon="home"></i> Home</button>
<div class="sc-tabs sc-tabs--pills sc-tabs--indicator">...</div>
<div class="sc-tabs sc-tabs--underline sc-tabs--indicator">...</div>
<div class="sc-tabs sc-tabs--segmented">...</div>
<div class="sc-tabs sc-tabs--vertical">...</div>
<div class="sc-tabs sc-tabs--scroll sc-tabs--indicator">...</div>
<div class="sc-card">
<div class="sc-tabs sc-tabs--underline sc-tabs--indicator">...</div>
</div>
<div class="sc-tabs sc-tabs--underline sc-tabs--indicator">
<div class="sc-tabs-head">
<div class="sc-tablist">...</div>
<div class="sc-tabs-actions">...</div>
</div>
<div class="sc-tabpanel">...</div>
</div>
<div class="sc-tabs-head">
<div class="sc-tablist">...</div>
<div class="sc-tabs-actions">
<div class="sc-menu">...</div>
</div>
</div>
Toast é disparado por data-toast (sem dependências). Ele aparece no canto superior direito por padrão. Para demonstrar no preview, usamos um container em fluxo (.sc-toast-container--demo).
// data-attributes (mais simples)
<button class="sc-btn sc-btn-outline" type="button"
data-toast="success"
data-toast-title="Sucesso"
data-toast-text="Salvo!"
data-toast-duration="3500"
data-toast-actions="Desfazer|Ver">
Mostrar toast
</button>
// via API
SmartUI.toast({ type: "success", title: "Sucesso", text: "Salvo!", actions: ["Desfazer"] });
Uma notificação simples.
<button class="sc-btn sc-btn-outline" type="button"
data-toast="info" data-toast-title="Info" data-toast-text="Uma notificação simples.">
Disparar
</button>
Operação concluída.
<button class="sc-btn sc-btn-success" type="button"
data-toast="success" data-toast-title="Sucesso" data-toast-text="Operação concluída."
data-toast-actions="Ver|Desfazer">Disparar</button>
Algo deu errado.
<button class="sc-btn sc-btn-danger" type="button"
data-toast="danger" data-toast-title="Erro" data-toast-text="Algo deu errado.">Disparar</button>
Revise os dados antes de continuar.
<button class="sc-btn sc-btn-outline" type="button"
data-toast="warning" data-toast-title="Atenção" data-toast-text="Revise os dados antes de continuar.">Disparar</button>
Este toast não fecha sozinho.
<button class="sc-btn sc-btn-glass" type="button"
data-toast="info" data-toast-title="Persistente" data-toast-text="Este toast não fecha sozinho."
data-toast-duration="0">Disparar</button>
Arquivo enviado.
<button class="sc-btn sc-btn-outline" type="button"
data-toast="success" data-toast-title="Enviado" data-toast-text="Arquivo enviado."
data-toast-actions="Ver" data-toast-duration="6000">Disparar</button>
Use .sc-tooltip + data-tooltip para a versão simples, ou .sc-tip para um popover/card (CSS-first).
<span class="sc-tooltip" data-tooltip="Topo (default)">
<button class="sc-btn sc-btn-outline" type="button">Passe o mouse</button>
</span>
<span class="sc-tooltip" data-tooltip="Left" data-tooltip-pos="left">...</span>
<span class="sc-tooltip" data-tooltip="Bottom" data-tooltip-pos="bottom">...</span>
<span class="sc-tooltip" data-tooltip="Right" data-tooltip-pos="right">...</span>
<span class="sc-tooltip" data-tooltip="GitHub" data-tooltip-pos="bottom">
<button class="sc-btn sc-btn-ghost sc-btn-icon sc-social-btn" type="button">
<i class="sc-icon" data-smart-icon="github"></i>
</button>
</span>
<span class="sc-tooltip"
data-tooltip="Texto mais longo para testar overflow e legibilidade..."
data-tooltip-pos="bottom">
<button class="sc-btn sc-btn-glass" type="button">Hover</button>
</span>
<div class="sc-tip">
<button class="sc-btn sc-btn-gradient sc-btn-pill" type="button">
Share <i class="sc-icon" data-smart-icon="share-2"></i>
</button>
<div class="sc-tip-panel" role="dialog">...</div>
</div>
<div class="sc-tip">
<button class="sc-btn sc-btn-glass sc-btn-icon" type="button" aria-label="Perfil">
<i class="sc-icon" data-smart-icon="user-circle"></i>
</button>
<div class="sc-tip-panel sc-tip-panel--top" role="dialog">...card...</div>
</div>
<span class="sc-tooltip" data-tooltip="Dica rápida" data-tooltip-pos="right">
<button class="sc-btn sc-btn-outline sc-btn-icon sc-btn-sm" type="button">
<i class="sc-icon" data-smart-icon="info"></i>
</button>
</span>
Painel à direita, sem cortar e acima do conteúdo.
Painel à esquerda.
<div class="sc-tip">
<button class="sc-btn sc-btn-outline" type="button">Popover right</button>
<div class="sc-tip-panel sc-tip-panel--right" role="dialog">...</div>
</div>
Use .sc-grid + .sc-cols-* + .sc-gap-*. Para layouts avançados, use .sc-col-span-* e .sc-grid-auto (auto-fit). Em telas menores, as colunas colapsam automaticamente.
<div class="sc-grid sc-cols-3 sc-gap-4">
<div class="sc-card sc-card-outline">Card</div>
<div class="sc-card sc-card-outline">Card</div>
<div class="sc-card sc-card-outline">Card</div>
</div>
<div class="sc-grid sc-cols-2 sc-gap-4">
<div class="sc-card sc-card-outline">A</div>
<div class="sc-card sc-card-outline">B</div>
</div>
<div class="sc-grid sc-cols-3 sc-gap-4">...</div>
<div class="sc-grid sc-grid-auto sc-gap-4">...</div>
<div class="sc-grid sc-cols-6 sc-gap-4">
<div class="sc-card sc-col-span-4">Main</div>
<div class="sc-card sc-col-span-2">Side</div>
<div class="sc-card sc-col-span-2">KPI</div>
</div>
<div class="sc-grid sc-cols-6 sc-gap-4">
<aside class="sc-card sc-card-outline sc-col-span-2">Sidebar</aside>
<main class="sc-card sc-card-outline sc-col-span-4">Conteúdo</main>
</div>
Grid pensado para cards (não vira banner).
Badge + título + texto.
<div class="sc-grid sc-cols-3 sc-gap-4">
<div class="sc-card sc-card-hover sc-card-outline">...</div>
<div class="sc-card sc-card-hover sc-card-outline">...</div>
<div class="sc-card sc-card-hover sc-card-outline">...</div>
</div>
Para testar e validar.
Melhor custo-benefício.
Para times.
<div class="sc-grid sc-cols-3 sc-gap-4">
<div class="sc-card sc-card-outline">...plano...</div>
<div class="sc-card sc-card-outline">...plano...</div>
<div class="sc-card sc-card-outline">...plano...</div>
</div>
+18% vs semana
Taxa 3.2%
2 críticos
| Evento | Hora | Status |
|---|---|---|
| Login | 09:12 | OK |
| Upload | 09:20 | Pendente |
<div class="sc-grid sc-cols-6 sc-gap-4">
<div class="sc-card sc-col-span-2">KPI</div>
<div class="sc-card sc-col-span-4">Tabela</div>
<div class="sc-card sc-col-span-2">Atalhos</div>
</div>
<div class="sc-grid sc-cols-2 sc-gap-4">
<div class="sc-field">...</div>
<div class="sc-field">...</div>
<div class="sc-field" style="grid-column: 1 / -1;">...</div>
</div>
Um layout de feed comum em apps: header + texto curto + ações.
Conteúdo compacto.
Conteúdo compacto.
<div class="sc-grid sc-cols-2 sc-gap-4">
<div class="sc-card sc-col-span-2">Post</div>
<div class="sc-card">Card A</div>
<div class="sc-card">Card B</div>
</div>
Banners são avisos compactos (não Hero). Use .sc-bannerbar + .sc-bannerbar-inner, e adicione variantes como --info, --warning, --danger, --glass. Para fechar, use [data-banner-close] (JS: initBanners).
<div class="sc-bannerbar sc-bannerbar--info">
<div class="sc-bannerbar-inner">
<div class="sc-bannerbar-left">...</div>
<div class="sc-bannerbar-actions">...</div>
</div>
</div>
<!-- Requer smart-ui.js (initBanners) para fechar -->
<div class="sc-bannerbar sc-bannerbar--info">...</div>
<div class="sc-bannerbar sc-bannerbar--glass">...</div>
<button class="sc-bannerbar-close" type="button" data-banner-close></button>
<div class="sc-bannerbar sc-bannerbar--danger">...</div>
<div class="sc-bannerbar sc-bannerbar--tight">...</div>
<div class="sc-bannerbar sc-bannerbar--success">...</div>
Use .sc-carousel com .sc-carousel-track (scroll-snap). Os botões [data-carousel-prev]/[data-carousel-next], dots e autoplay são habilitados via smart-ui.js (initCarousels).
<div class="sc-carousel" data-slides="1" data-autoplay="0">
<div class="sc-carousel-track">
<div class="sc-carousel-slide"><div class="sc-carousel-card">...</div></div>
<div class="sc-carousel-slide"><div class="sc-carousel-card">...</div></div>
</div>
<div class="sc-carousel-controls">
<div class="sc-carousel-buttons">
<button class="sc-btn sc-btn-glass sc-btn-icon" data-carousel-prev><i class="sc-icon" data-smart-icon="chevrons-left"></i></button>
<button class="sc-btn sc-btn-primary sc-btn-icon" data-carousel-next><i class="sc-icon" data-smart-icon="chevrons-right"></i></button>
</div>
</div>
</div>
<!-- precisa do smart-ui.js para dots/controles/autoplay -->
<div class="sc-carousel" data-slides="1">...</div>
<div class="sc-carousel" data-slides="2">...</div>
<div class="sc-carousel" data-slides="3">...</div>
<div class="sc-carousel sc-carousel--glass" data-autoplay="3000">...</div>
<div class="sc-carousel sc-carousel--peek" data-slides="1">...</div>
<div class="sc-carousel sc-carousel--center sc-carousel--spotlight">...</div>
<div class="sc-carousel sc-carousel--peek sc-carousel--spotlight">...</div>
<div class="sc-carousel-3d" data-autoplay="4500">
<div class="sc-carousel-3d-viewport" tabindex="0">
<div class="sc-carousel-3d-track">
<article class="sc-carousel-3d-slide">
<div class="sc-feature-card" style="--sc-feature-bg:url('img.jpg')">
<header class="sc-feature-head">...</header>
<p class="sc-feature-text">...</p>
<footer class="sc-feature-actions">...</footer>
</div>
</article>
</div>
</div>
<div class="sc-carousel-3d-controls">
<button data-3d-prev>...</button>
<button data-3d-next>...</button>
</div>
<div class="sc-carousel-3d-pagination"></div>
<div class="sc-carousel-3d-progress"><span class="sc-carousel-3d-progressBar"></span></div>
</div>
<!-- Requer smart-ui.js (initCarousel3D) -->
Qualquer modelo funciona com [data-music-player="true"]. O playlist é um JSON local (sem libs), e o coverflow sincroniza via evento sc:coverflowChange. O link do YouTube na capa abre a URL correspondente.
<div data-music-player="true">...</div>
<!-- Requer smart-ui.js (initCoverflows + initMusicPlayers) -->
Artista
<div data-music-player="true">
<div class="sc-coverflow">...</div>
<div class="sc-music-player">...</div>
</div>
<div data-music-player="true" class="sc-music-mini">
<img data-music-cover />
<p data-music-title>...</p>
<p data-music-artist>...</p>
<input class="sc-range" type="range" />
<audio></audio>
<script class="sc-audio-playlist" type="application/json">[...]</script>
</div>
Artista
<div data-music-player="true">...</div>
<div class="sc-music-list">
<div class="sc-music-track" data-music-pick="0">...</div>
</div>
Artista
<div class="sc-music-player sc-music--neon" data-music-player="true">...</div>
Artista
<div class="sc-music-card" data-music-player="true">
<img data-music-cover />
<div class="sc-music-player">...</div>
</div>
Artista
<div data-music-player="true">
<div class="sc-music-player">...</div>
<div class="sc-music-list">...</div>
</div>
Use .sc-gallery e marque data-lightbox="true" para habilitar o lightbox (Smart UI Engine). Os modelos abaixo incluem transições no hover e animação na abertura do modal.
<div class="sc-gallery" data-lightbox="true">
<div class="sc-gallery-item sc-card-hover">
<img src="img/1.jpg" alt="Descrição">
</div>
</div>
<!-- data-lightbox=\"true\" requer smart-ui.js (initLightboxGalleries) -->
<div class="sc-gallery sc-gallery--lift" data-lightbox="true">...</div>
<div class="sc-gallery sc-gallery--square sc-gallery--lift" data-lightbox="true">...</div>
<div class="sc-gallery" data-lightbox="true">...<div class="sc-gallery-caption">...</div></div>
<div class="sc-gallery sc-gallery--masonry" data-lightbox="true">...</div>
<div class="sc-grid sc-cols-6 sc-gap-4">
<div class="sc-gallery-item sc-col-span-4">...</div>
</div>
<div class="sc-gallery" data-lightbox="false">...</div>
<div class="sc-gallery sc-gallery--reveal" data-lightbox="true">
<div class="sc-gallery-item">
<img ...>
<div class="sc-gallery-caption">Legenda</div>
</div>
</div>
<div class="sc-gallery sc-gallery--bento" data-lightbox="true">...</div>
<div class="sc-gallery sc-gallery--filmstrip" data-lightbox="true">
<div class="sc-gallery-track">...</div>
</div>
<div class="sc-gallery sc-gallery--polaroid" data-lightbox="true">...</div>
O Photo Rail 3D usa data-photo-rail="true" (Smart UI Engine). Nos previews abaixo, o container já aplica doc-clip automaticamente para **não vazar** quando as fotos expandem.
<div class="sc-photo-rail" data-photo-rail="true" data-zones="9">
<a class="sc-photo-rail-item" href="/examples/" style="--sc-pr-img:url('img/1.jpg')">
<span class="sc-photo-rail-img"></span>
<span class="sc-photo-rail-label">Foto 1</span>
</a>
</div>
<!-- Requer smart-ui.js (initPhotoRails) -->
data-mode="dark" no <html> (com persistência).<div class="sc-accordion" data-accordion="single">
<div class="sc-accordion-item is-open">
<button class="sc-accordion-trigger" type="button">...<span class="sc-accordion-icon"></span></button>
<div class="sc-accordion-panel"><div><div class="sc-accordion-content">...</div></div></div>
</div>
</div>
<div class="sc-accordion" data-accordion="multi">...</div>
<div class="sc-accordion sc-accordion--compact" data-accordion="single">...</div>
<div class="sc-accordion sc-accordion--minimal" data-accordion="single">...</div>
<div class="sc-accordion sc-accordion--plus" data-accordion="single">...</div>
<div class="sc-accordion sc-accordion--cards" data-accordion="single">...</div>
<div class="sc-accordion sc-accordion--glass sc-accordion--plus">...</div>
<div class="sc-accordion sc-accordion--steps" data-accordion="single">
<div class="sc-accordion-item">
<button class="sc-accordion-trigger" data-step="1">...</button>
<div class="sc-accordion-panel">...</div>
</div>
</div>
Observação: o Accordion usa button + ARIA via Smart UI Engine. Para uma alternativa nativa e acessível via <details>, veja Disclosure.
Disclosure usa <details>/<summary> (nativo). Para “apenas um aberto” no grupo, use data-disclosure="single" (Smart UI Engine). Agora tem transição de altura + fade/slide do conteúdo.
<div class="sc-disclosure" data-disclosure="single">
<details class="sc-disclosure-item" open>
<summary class="sc-disclosure-summary">...</summary>
<div class="sc-disclosure-panel"><div class="sc-disclosure-content">...</div></div>
</details>
</div>
Onde intuição de design encontra execução em código para enxergar problemas de UI e construir soluções do zero.
Construir bem: dominar a plataforma para não depender de ferramentas específicas.
Trabalhando com a web (e não contra ela) você desbloqueia performance, acessibilidade e durabilidade.
<div class="sc-disclosure" data-disclosure="single" data-morph="true">...</div>
Formato pill + transição suave.
Um “mini painel” discreto por item.
<div class="sc-disclosure sc-disclosure--pills" data-disclosure="single">...</div>
A faixa lateral reforça qual item está aberto.
Várias abertas ao mesmo tempo.
<div class="sc-disclosure sc-disclosure--accent" data-disclosure="multi">...</div>
Ações rápidas no painel.
Visual de cards (não parece accordion).
<div class="sc-disclosure sc-disclosure--cards" data-disclosure="single">...</div>
Use badges para status e prioridade.
Modelos editoriais ficam melhores em Disclosure que em Accordion.
<div class="sc-disclosure sc-disclosure--accent" data-morph="true">...</div>
<div class="sc-disclosure sc-disclosure--pills" data-disclosure="single">...</div>
Nota: data-disclosure="single" requer smart-ui.js (initDisclosures). O restante é nativo do HTML.
Use .sc-select-menu (dropdown 100% estilizado). O popover agora tem z-index alto e isolation para não ficar por trás de outros elementos.
<div class="sc-select-menu" data-value="op2">
<button class="sc-select-trigger" type="button">
<span class="sc-select-value">Escolha...</span>
<span class="sc-select-caret" aria-hidden="true"></span>
</button>
<div class="sc-select-popover" role="listbox" tabindex="-1">
<div class="sc-select-option" role="option" tabindex="0" data-value="op1" data-label="Opção 1">Opção 1</div>
</div>
</div>
<!-- Requer smart-ui.js (initSelectMenus) -->
<div class="sc-select-menu" data-value="op1">...</div>
<div class="sc-select-menu sc-select-sm">...</div>
<div class="sc-select-menu" data-value="plan2">...</div>
<div class="sc-select-menu"><div class="sc-select-popover sc-select-popover--grid">...</div></div>
<div class="sc-select-menu sc-select-fancy" data-search="true" data-ripple="true">...</div>
<button class="sc-select-trigger is-valid">...</button>
<div class="sc-select-sep">Grupo</div>
<span class="sc-select-avatar">D</span>
<span class="sc-select-dot" style="--sc-dot: var(--sc-success);"></span>
<div class="sc-select-popover" role="listbox">...</div>
As classes abaixo usam .in-view. No docs, você pode clicar em Reproduzir para reiniciar a animação sem precisar rolar a página.
<div class="sc-card sc-fade-up">...</div>
<!-- Requer smart-ui.js (initScrollObserver) -->
<div class="sc-card sc-fade-up">...</div>
<div class="sc-card sc-fade-in">...</div>
<div class="sc-card sc-zoom-in">...</div>
<div class="sc-card sc-slide-left">...</div>
<div class="sc-card sc-slide-right">...</div>
<div class="sc-grid sc-grid-stagger">...</div>
<div class="sc-card sc-blur-in">...</div>
<div class="sc-card sc-pop-in">...</div>
<div class="sc-card sc-flip-in">...</div>
<div class="sc-card sc-bounce-in">...</div>
<div class="sc-card sc-skew-in">...</div>
Estes efeitos são opt-in e pensados para serem theme-aware (sem dependências). Evitamos snippets com licença nãocomercial.
Camadas de “mesh” animado (sem blend-mode).
<div class="sc-card sc-card-outline sc-fx-liquid">...</div>
<div class="sc-fx-conic">
<div class="sc-card sc-card-outline">...</div>
</div>
<div class="sc-card sc-card-outline sc-fx-sheen">...</div>
<div class="sc-card sc-card-outline sc-fx-scanlines">...</div>
<div class="sc-card sc-fx-vignette sc-fx-noise">...</div>
<section class="sc-slidewheel-wrap" data-snap="1">
<div class="sc-slidewheel">
<div class="sc-slidewheel-item" data-title="Título"><img src="img.jpg" alt="Imagem" /></div>
</div>
</section>
<!-- Requer smart-ui.js (initSlideWheels) -->
Use role="status" e um aria-label (“Carregando⬦”) para acessibilidade.
<span class="sc-loader sc-loader-spin" role="status" aria-label="Carregando"></span>
<span class="sc-loader sc-loader-spin sc-loader-sm"></span>
<span class="sc-loader sc-loader-spin sc-loader-lg"></span>
<span class="sc-loader sc-loader-dots" role="status" aria-label="Carregando">
<span></span><span></span><span></span>
</span>
<span class="sc-loader sc-loader-bars" role="status" aria-label="Carregando">
<span></span><span></span><span></span>
</span>
<span class="sc-loader sc-loader-orbit" role="status" aria-label="Carregando">
<span aria-hidden="true"></span>
</span>
<span class="sc-loader sc-loader-ring" role="status" aria-label="Carregando"></span>
<div class="sc-skeleton sc-skeleton-card"></div>
<div class="sc-skeleton sc-skeleton-lg" style="width:70%;"></div>
<div class="sc-skeleton" style="width:92%;"></div>
Para testar localmente no seu projeto, a forma mais simples é referenciar os arquivos da pasta smart-ui.
<!-- Smart UI CSS (bundle) -->
<link rel="stylesheet" href="smart-ui/smart-ui.css">
<!-- Smart UI Engine (opcional: ripple, tilt, range fill, animações) -->
<script src="smart-ui/smart-ui.js" defer></script>
<div class="sc-container">
<section class="sc-section">
<h1 class="sc-display-1">Olá Smart UI</h1>
<div class="sc-grid sc-cols-3">
<div class="sc-card">Card</div>
<button class="sc-btn sc-btn-primary">Botão</button>
<input class="sc-input" placeholder="Input">
</div>
</section>
</div>
Observação: hover de card é opt-in via .sc-card-hover.
O tema é aplicado via atributo data-theme no <html> (recomendado).
<html lang="pt-br" data-theme="glass">
...
</html>
O modo é aplicado via data-mode no <html>. Ele muda apenas tokens de base (background/text/border) e mantém as cores do tema.
<html lang="pt-br" data-mode="dark">
...
</html>
const root = document.documentElement;
root.setAttribute("data-theme", "noir"); // muda o tema
// remover tema (voltar ao default)
root.removeAttribute("data-theme");
const root = document.documentElement;
root.setAttribute("data-mode", "dark"); // dark
root.setAttribute("data-mode", "light"); // light
const key = "smartui-theme";
const root = document.documentElement;
function setTheme(theme) {
if (!theme) root.removeAttribute("data-theme");
else root.setAttribute("data-theme", theme);
localStorage.setItem(key, theme || "");
}
setTheme(localStorage.getItem(key) || "");
Use exatamente estes valores em data-theme:
clean, soft, corporate, metal,
glass, aurora, noir, retro,
liquid, clay, tech, neon, brutal
Cada tema redefine variáveis em :root/[data-theme="..."]. Os componentes consomem esses tokens.
| Token | Uso | Exemplo |
|---|---|---|
--sc-primary |
Cor principal (botões, badges, highlights) | primary |
--sc-bg-body |
Background geral | body |
--sc-bg-surface |
Superfícies (cards/containers) | surface |
--sc-text-main |
Texto principal | Texto |
--sc-border |
Bordas | 1px solid |
--sc-radius |
Raio padrão (inputs/cards/botões) | border-radius |
/* Helpers (docs/demo) */
.sc-dur-fast { transition-duration: 140ms; }
.sc-dur-slow { transition-duration: 420ms; }
.sc-ease-spring { transition-timing-function: cubic-bezier(0.2, 0.9, 0.2, 1.2); }
/* Exemplo: usar tokens em CSS custom */
.minha-caixa {
background: var(--sc-bg-surface);
border: 1px solid var(--sc-border);
color: var(--sc-text-main);
border-radius: var(--sc-radius);
}
Uma landing page para escolas: matrícula, cursos, depoimentos e chamada para ação.
Simula captura de leads
Deixe seu contato e retornamos.
Baseada em projetos e experiências.
Ambientes modernos e acolhedores.
Acompanhamento e evolução contínua.