<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Web-Zoneware</title>
	<atom:link href="https://webzoneware.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://webzoneware.com/</link>
	<description>Mais do que apenas uma academia web.</description>
	<lastBuildDate>Thu, 22 Oct 2026 04:49:51 +0000</lastBuildDate>
	<language>pt-BR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://webzoneware.com/wp-content/uploads/icon-webzoneware-150x150.png</url>
	<title>Web-Zoneware</title>
	<link>https://webzoneware.com/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Projeto Final: Design System e Dashboard — Web Academy</title>
		<link>https://webzoneware.com/web-academy/curso-css/projeto-pratico-design-system-dashboard-css3/</link>
					<comments>https://webzoneware.com/web-academy/curso-css/projeto-pratico-design-system-dashboard-css3/#respond</comments>
		
		<dc:creator><![CDATA[Web-Zoneware]]></dc:creator>
		<pubDate>Thu, 22 Oct 2026 04:49:51 +0000</pubDate>
				<category><![CDATA[Curso de CSS e CSS3]]></category>
		<category><![CDATA[css grid dashboard]]></category>
		<category><![CDATA[dashboard css3]]></category>
		<category><![CDATA[design system css]]></category>
		<category><![CDATA[glassmorphism css]]></category>
		<category><![CDATA[projeto final css3]]></category>
		<category><![CDATA[web academy]]></category>
		<guid isPermaLink="false">https://webzoneware.com/?p=29481</guid>

					<description><![CDATA[<p>Parabéns por chegar ao grande marco da Web Academy! Ao longo de 50 lições estruturadas, você dominou desde a anatomia dos seletores básicos, a mecânica do Box Model e o alinhamento bidimensional com Flexbox e Grid, até recursos de ponta como variáveis semânticas, Glassmorphism, animações a 60 FPS, seletores relacionais :has() e Container Queries. Agora, [&#8230;]</p>
<p>O post <a href="https://webzoneware.com/web-academy/curso-css/projeto-pratico-design-system-dashboard-css3/">Projeto Final: Design System e Dashboard — Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wzw-lesson-lead">
    Parabéns por chegar ao grande marco da <strong>Web Academy</strong>! Ao longo de 50 lições estruturadas, você dominou desde a anatomia dos seletores básicos, a mecânica do Box Model e o alinhamento bidimensional com Flexbox e Grid, até recursos de ponta como variáveis semânticas, Glassmorphism, animações a 60 FPS, seletores relacionais <code>:has()</code> e Container Queries. Agora, é o momento de consolidar todas essas competências em um projeto prático de nível sênior: a construção de um <strong>Design System com Tokens Semânticos</strong> e um <strong>Dashboard Analítico de Alta Fidelidade</strong> em CSS3 puro.
</p>
<div class="wzw-callout wzw-callout-info">
<div class="wzw-callout-icon">🎓</div>
<div>
        <strong>A Síntese do Engenheiro de CSS:</strong> Um desenvolvedor front-end de elite não copia e cola estilos de frameworks prontos às cegas. Ele compreende a cascata, projeta tokens escaláveis, constrói layouts responsivos resilientes e sabe exatamente como extrair a máxima performance da GPU. Este projeto final é o portfólio definitivo da sua maestria em CSS3.
    </div>
</div>
<h2>1. A Arquitetura do Nosso Design System em Camadas</h2>
<p>
    Para garantir que o Dashboard seja modular e extensível para qualquer tipo de aplicação corporativa, organizamos as folhas de estilo seguindo três princípios arquiteturais:
</p>
<ol>
<li><strong>Camada 1 — Design Tokens Globais:</strong> Cores primitivas, escalas tipográficas fluidas, espaçamentos padronizados e sombras definidos em CSS Variables no seletor <code>:root</code>.</li>
<li><strong>Camada 2 — Metodologia BEM Estruturada:</strong> Componentes desacoplados (<code>.dashboard</code>, <code>.stat-card</code>, <code>.data-table</code>, <code>.badge</code>) com especificidade plana imune a conflitos de cascata.</li>
<li><strong>Camada 3 — Layout Híbrido Grid + Flexbox:</strong> O esqueleto mestre estruturado com <code>grid-template-areas</code> e os elementos internos alinhados milimetricamente com Flexbox.</li>
</ol>
<h2>2. Anatomia dos Componentes do Dashboard</h2>
<div class="wzw-table-responsive">
<table class="wzw-table">
<thead>
<tr>
<th>Componente</th>
<th>Técnica CSS3 Aplicada</th>
<th>Papel no Layout</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Sidebar de Navegação</strong></td>
<td>Flexbox Vertical + Glassmorphism (<code>backdrop-filter</code>)</td>
<td>Menu lateral compacto com links iluminados em hover e estado ativo.</td>
</tr>
<tr>
<td><strong>Painel Superior (Header)</strong></td>
<td>Flexbox Horizontal + <code>align-items: center</code></td>
<td>Busca em tempo real, status do sistema e perfil do usuário.</td>
</tr>
<tr>
<td><strong>Bento Grid de Estatísticas</strong></td>
<td><code>grid-template-columns: repeat(auto-fit, minmax(220px, 1fr))</code></td>
<td>Cards analíticos com indicadores de métricas, gradientes e sombras dinâmicas.</td>
</tr>
<tr>
<td><strong>Tabela Analítica Inteligente</strong></td>
<td>Seletor Relacional <code>:has()</code> + Transições Suaves</td>
<td>Linhas com realce sob hover e esmaecimento de itens secundários.</td>
</tr>
</tbody>
</table>
</div>
<h2>3. Código Completo do Projeto Final (Design System &#038; Dashboard)</h2>
<p>
    Copie a estrutura HTML e a folha de estilos CSS3 abaixo para testar o painel funcionando integralmente no Playground IDE:
</p>
<h3>Estrutura HTML do Dashboard</h3>
    <div class="wzw-ide-card" id="wzw-code-65319" data-lang="html">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">HTML5</span>
                                <span class="wzw-ide-lines-count">83 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-65319', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-65319', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;app-layout&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">&lt;!-- Barra Lateral (Sidebar) --&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;aside</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;sidebar&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;sidebar__brand&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;span</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;brand-icon&quot;</span><span class="wzw-tk-tag">&gt;</span>⚡<span class="wzw-tk-tag">&lt;/span&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;span</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;brand-text&quot;</span><span class="wzw-tk-tag">&gt;</span>ZoneStudio<span class="wzw-tk-tag">&lt;/span&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;nav</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;sidebar__nav&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;a</span> <span class="wzw-tk-attr">href</span>=<span class="wzw-tk-str">&quot;#&quot;</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;nav-item nav-item--active&quot;</span><span class="wzw-tk-tag">&gt;</span><span class="wzw-tk-tag">&lt;span</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;nav-item__icon&quot;</span><span class="wzw-tk-tag">&gt;</span>📊<span class="wzw-tk-tag">&lt;/span&gt;</span> Visão Geral<span class="wzw-tk-tag">&lt;/a&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;a</span> <span class="wzw-tk-attr">href</span>=<span class="wzw-tk-str">&quot;#&quot;</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;nav-item&quot;</span><span class="wzw-tk-tag">&gt;</span><span class="wzw-tk-tag">&lt;span</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;nav-item__icon&quot;</span><span class="wzw-tk-tag">&gt;</span>⚡<span class="wzw-tk-tag">&lt;/span&gt;</span> Ferramentas<span class="wzw-tk-tag">&lt;/a&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;a</span> <span class="wzw-tk-attr">href</span>=<span class="wzw-tk-str">&quot;#&quot;</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;nav-item&quot;</span><span class="wzw-tk-tag">&gt;</span><span class="wzw-tk-tag">&lt;span</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;nav-item__icon&quot;</span><span class="wzw-tk-tag">&gt;</span>👥<span class="wzw-tk-tag">&lt;/span&gt;</span> Usuários<span class="wzw-tk-tag">&lt;/a&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;a</span> <span class="wzw-tk-attr">href</span>=<span class="wzw-tk-str">&quot;#&quot;</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;nav-item&quot;</span><span class="wzw-tk-tag">&gt;</span><span class="wzw-tk-tag">&lt;span</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;nav-item__icon&quot;</span><span class="wzw-tk-tag">&gt;</span>⚙️<span class="wzw-tk-tag">&lt;/span&gt;</span> Ajustes<span class="wzw-tk-tag">&lt;/a&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;/nav&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;/aside&gt;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">&lt;!-- Área Principal de Conteúdo --&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;main</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;main-content&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;header</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;topbar&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;h2</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;topbar__title&quot;</span><span class="wzw-tk-tag">&gt;</span>Painel de Operações CSS3<span class="wzw-tk-tag">&lt;/h2&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;topbar__user&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;span</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;badge badge--online&quot;</span><span class="wzw-tk-tag">&gt;</span>Online<span class="wzw-tk-tag">&lt;/span&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;user-avatar&quot;</span><span class="wzw-tk-tag">&gt;</span>DEV<span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;/header&gt;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">&lt;!-- Grid de Métricas Analíticas --&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;section</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;metrics-grid&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;metric-card metric-card--glow-cyan&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;span</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;metric-card__subtitle&quot;</span><span class="wzw-tk-tag">&gt;</span>Requisições Otimizadas<span class="wzw-tk-tag">&lt;/span&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;metric-card__value&quot;</span><span class="wzw-tk-tag">&gt;</span>1.42M<span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;span</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;metric-card__delta metric-card__delta--positive&quot;</span><span class="wzw-tk-tag">&gt;</span>↑ +24.8% este mês<span class="wzw-tk-tag">&lt;/span&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;metric-card metric-card--glow-green&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;span</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;metric-card__subtitle&quot;</span><span class="wzw-tk-tag">&gt;</span>Performance Web Vitals<span class="wzw-tk-tag">&lt;/span&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;metric-card__value&quot;</span><span class="wzw-tk-tag">&gt;</span>99/100<span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;span</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;metric-card__delta metric-card__delta--positive&quot;</span><span class="wzw-tk-tag">&gt;</span>↑ LCP 0.6s estável<span class="wzw-tk-tag">&lt;/span&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;metric-card metric-card--glow-amber&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;span</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;metric-card__subtitle&quot;</span><span class="wzw-tk-tag">&gt;</span>Payload CSS Minificado<span class="wzw-tk-tag">&lt;/span&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;metric-card__value&quot;</span><span class="wzw-tk-tag">&gt;</span>12.4 KB<span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;span</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;metric-card__delta metric-card__delta--positive&quot;</span><span class="wzw-tk-tag">&gt;</span>↓ -68% de compressão<span class="wzw-tk-tag">&lt;/span&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;/section&gt;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">&lt;!-- Tabela de Sessões com :has() e Glassmorphism --&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;section</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;table-container&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;h3</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;section-heading&quot;</span><span class="wzw-tk-tag">&gt;</span>Monitoramento de Componentes em Tempo Real<span class="wzw-tk-tag">&lt;/h3&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;table</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;data-table&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;thead&gt;</span></span>
<span class="wzw-code-line">          <span class="wzw-tk-tag">&lt;tr&gt;</span></span>
<span class="wzw-code-line">            <span class="wzw-tk-tag">&lt;th&gt;</span>Módulo<span class="wzw-tk-tag">&lt;/th&gt;</span></span>
<span class="wzw-code-line">            <span class="wzw-tk-tag">&lt;th&gt;</span>Tecnologia<span class="wzw-tk-tag">&lt;/th&gt;</span></span>
<span class="wzw-code-line">            <span class="wzw-tk-tag">&lt;th&gt;</span>Render Layer<span class="wzw-tk-tag">&lt;/th&gt;</span></span>
<span class="wzw-code-line">            <span class="wzw-tk-tag">&lt;th&gt;</span>Status<span class="wzw-tk-tag">&lt;/th&gt;</span></span>
<span class="wzw-code-line">          <span class="wzw-tk-tag">&lt;/tr&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;/thead&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;tbody&gt;</span></span>
<span class="wzw-code-line">          <span class="wzw-tk-tag">&lt;tr&gt;</span></span>
<span class="wzw-code-line">            <span class="wzw-tk-tag">&lt;td&gt;</span><span class="wzw-tk-tag">&lt;strong&gt;</span>Container Queries<span class="wzw-tk-tag">&lt;/strong&gt;</span><span class="wzw-tk-tag">&lt;/td&gt;</span></span>
<span class="wzw-code-line">            <span class="wzw-tk-tag">&lt;td&gt;</span>CSS Containment L3<span class="wzw-tk-tag">&lt;/td&gt;</span></span>
<span class="wzw-code-line">            <span class="wzw-tk-tag">&lt;td&gt;</span>Layout Inline<span class="wzw-tk-tag">&lt;/td&gt;</span></span>
<span class="wzw-code-line">            <span class="wzw-tk-tag">&lt;td&gt;</span><span class="wzw-tk-tag">&lt;span</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;status-pill status-pill--success&quot;</span><span class="wzw-tk-tag">&gt;</span>Ativo<span class="wzw-tk-tag">&lt;/span&gt;</span><span class="wzw-tk-tag">&lt;/td&gt;</span></span>
<span class="wzw-code-line">          <span class="wzw-tk-tag">&lt;/tr&gt;</span></span>
<span class="wzw-code-line">          <span class="wzw-tk-tag">&lt;tr&gt;</span></span>
<span class="wzw-code-line">            <span class="wzw-tk-tag">&lt;td&gt;</span><span class="wzw-tk-tag">&lt;strong&gt;</span>Seletor Relacional<span class="wzw-tk-tag">&lt;/strong&gt;</span><span class="wzw-tk-tag">&lt;/td&gt;</span></span>
<span class="wzw-code-line">            <span class="wzw-tk-tag">&lt;td&gt;</span>CSS Selectors L4 (:has)<span class="wzw-tk-tag">&lt;/td&gt;</span></span>
<span class="wzw-code-line">            <span class="wzw-tk-tag">&lt;td&gt;</span>CSSOM Matching<span class="wzw-tk-tag">&lt;/td&gt;</span></span>
<span class="wzw-code-line">            <span class="wzw-tk-tag">&lt;td&gt;</span><span class="wzw-tk-tag">&lt;span</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;status-pill status-pill--success&quot;</span><span class="wzw-tk-tag">&gt;</span>Ativo<span class="wzw-tk-tag">&lt;/span&gt;</span><span class="wzw-tk-tag">&lt;/td&gt;</span></span>
<span class="wzw-code-line">          <span class="wzw-tk-tag">&lt;/tr&gt;</span></span>
<span class="wzw-code-line">          <span class="wzw-tk-tag">&lt;tr&gt;</span></span>
<span class="wzw-code-line">            <span class="wzw-tk-tag">&lt;td&gt;</span><span class="wzw-tk-tag">&lt;strong&gt;</span>Glassmorphism Core<span class="wzw-tk-tag">&lt;/strong&gt;</span><span class="wzw-tk-tag">&lt;/td&gt;</span></span>
<span class="wzw-code-line">            <span class="wzw-tk-tag">&lt;td&gt;</span>Backdrop Filter &amp; Blur<span class="wzw-tk-tag">&lt;/td&gt;</span></span>
<span class="wzw-code-line">            <span class="wzw-tk-tag">&lt;td&gt;</span>GPU Accelerated<span class="wzw-tk-tag">&lt;/td&gt;</span></span>
<span class="wzw-code-line">            <span class="wzw-tk-tag">&lt;td&gt;</span><span class="wzw-tk-tag">&lt;span</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;status-pill status-pill--warning&quot;</span><span class="wzw-tk-tag">&gt;</span>Calibrado<span class="wzw-tk-tag">&lt;/span&gt;</span><span class="wzw-tk-tag">&lt;/td&gt;</span></span>
<span class="wzw-code-line">          <span class="wzw-tk-tag">&lt;/tr&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;/tbody&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;/table&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;/section&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;/main&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;/div&gt;</span></span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>&lt;div class=&quot;app-layout&quot;&gt;
  &lt;!-- Barra Lateral (Sidebar) --&gt;
  &lt;aside class=&quot;sidebar&quot;&gt;
    &lt;div class=&quot;sidebar__brand&quot;&gt;
      &lt;span class=&quot;brand-icon&quot;&gt;⚡&lt;/span&gt;
      &lt;span class=&quot;brand-text&quot;&gt;ZoneStudio&lt;/span&gt;
    &lt;/div&gt;

    &lt;nav class=&quot;sidebar__nav&quot;&gt;
      &lt;a href=&quot;#&quot; class=&quot;nav-item nav-item--active&quot;&gt;&lt;span class=&quot;nav-item__icon&quot;&gt;📊&lt;/span&gt; Visão Geral&lt;/a&gt;
      &lt;a href=&quot;#&quot; class=&quot;nav-item&quot;&gt;&lt;span class=&quot;nav-item__icon&quot;&gt;⚡&lt;/span&gt; Ferramentas&lt;/a&gt;
      &lt;a href=&quot;#&quot; class=&quot;nav-item&quot;&gt;&lt;span class=&quot;nav-item__icon&quot;&gt;👥&lt;/span&gt; Usuários&lt;/a&gt;
      &lt;a href=&quot;#&quot; class=&quot;nav-item&quot;&gt;&lt;span class=&quot;nav-item__icon&quot;&gt;⚙️&lt;/span&gt; Ajustes&lt;/a&gt;
    &lt;/nav&gt;
  &lt;/aside&gt;

  &lt;!-- Área Principal de Conteúdo --&gt;
  &lt;main class=&quot;main-content&quot;&gt;
    &lt;header class=&quot;topbar&quot;&gt;
      &lt;h2 class=&quot;topbar__title&quot;&gt;Painel de Operações CSS3&lt;/h2&gt;
      &lt;div class=&quot;topbar__user&quot;&gt;
        &lt;span class=&quot;badge badge--online&quot;&gt;Online&lt;/span&gt;
        &lt;div class=&quot;user-avatar&quot;&gt;DEV&lt;/div&gt;
      &lt;/div&gt;
    &lt;/header&gt;

    &lt;!-- Grid de Métricas Analíticas --&gt;
    &lt;section class=&quot;metrics-grid&quot;&gt;
      &lt;div class=&quot;metric-card metric-card--glow-cyan&quot;&gt;
        &lt;span class=&quot;metric-card__subtitle&quot;&gt;Requisições Otimizadas&lt;/span&gt;
        &lt;div class=&quot;metric-card__value&quot;&gt;1.42M&lt;/div&gt;
        &lt;span class=&quot;metric-card__delta metric-card__delta--positive&quot;&gt;↑ +24.8% este mês&lt;/span&gt;
      &lt;/div&gt;

      &lt;div class=&quot;metric-card metric-card--glow-green&quot;&gt;
        &lt;span class=&quot;metric-card__subtitle&quot;&gt;Performance Web Vitals&lt;/span&gt;
        &lt;div class=&quot;metric-card__value&quot;&gt;99/100&lt;/div&gt;
        &lt;span class=&quot;metric-card__delta metric-card__delta--positive&quot;&gt;↑ LCP 0.6s estável&lt;/span&gt;
      &lt;/div&gt;

      &lt;div class=&quot;metric-card metric-card--glow-amber&quot;&gt;
        &lt;span class=&quot;metric-card__subtitle&quot;&gt;Payload CSS Minificado&lt;/span&gt;
        &lt;div class=&quot;metric-card__value&quot;&gt;12.4 KB&lt;/div&gt;
        &lt;span class=&quot;metric-card__delta metric-card__delta--positive&quot;&gt;↓ -68% de compressão&lt;/span&gt;
      &lt;/div&gt;
    &lt;/section&gt;

    &lt;!-- Tabela de Sessões com :has() e Glassmorphism --&gt;
    &lt;section class=&quot;table-container&quot;&gt;
      &lt;h3 class=&quot;section-heading&quot;&gt;Monitoramento de Componentes em Tempo Real&lt;/h3&gt;
      &lt;table class=&quot;data-table&quot;&gt;
        &lt;thead&gt;
          &lt;tr&gt;
            &lt;th&gt;Módulo&lt;/th&gt;
            &lt;th&gt;Tecnologia&lt;/th&gt;
            &lt;th&gt;Render Layer&lt;/th&gt;
            &lt;th&gt;Status&lt;/th&gt;
          &lt;/tr&gt;
        &lt;/thead&gt;
        &lt;tbody&gt;
          &lt;tr&gt;
            &lt;td&gt;&lt;strong&gt;Container Queries&lt;/strong&gt;&lt;/td&gt;
            &lt;td&gt;CSS Containment L3&lt;/td&gt;
            &lt;td&gt;Layout Inline&lt;/td&gt;
            &lt;td&gt;&lt;span class=&quot;status-pill status-pill--success&quot;&gt;Ativo&lt;/span&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;&lt;strong&gt;Seletor Relacional&lt;/strong&gt;&lt;/td&gt;
            &lt;td&gt;CSS Selectors L4 (:has)&lt;/td&gt;
            &lt;td&gt;CSSOM Matching&lt;/td&gt;
            &lt;td&gt;&lt;span class=&quot;status-pill status-pill--success&quot;&gt;Ativo&lt;/span&gt;&lt;/td&gt;
          &lt;/tr&gt;
          &lt;tr&gt;
            &lt;td&gt;&lt;strong&gt;Glassmorphism Core&lt;/strong&gt;&lt;/td&gt;
            &lt;td&gt;Backdrop Filter &amp; Blur&lt;/td&gt;
            &lt;td&gt;GPU Accelerated&lt;/td&gt;
            &lt;td&gt;&lt;span class=&quot;status-pill status-pill--warning&quot;&gt;Calibrado&lt;/span&gt;&lt;/td&gt;
          &lt;/tr&gt;
        &lt;/tbody&gt;
      &lt;/table&gt;
    &lt;/section&gt;
  &lt;/main&gt;
&lt;/div&gt;</textarea>
        </div>
    </div>
    
<h3>Folha de Estilos CSS3 (Design Tokens + Layout)</h3>
    <div class="wzw-ide-card" id="wzw-code-51321" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">307 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-51321', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-51321', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line">/* ==========================================================</span>
<span class="wzw-code-line">   1. DESIGN TOKENS GLOBAIS (<span class="wzw-tk-kw">:root</span>)</span>
<span class="wzw-code-line">   ========================================================== */</span>
<span class="wzw-code-line"><span class="wzw-tk-kw">:root</span> {</span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--bg-deep: #090d16;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--bg-surface: #111827;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--bg-glass: rgba(17, 24, 39, 0.75);</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--border-subtle: rgba(255, 255, 255, 0.08);</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--border-glow: rgba(0, 240, 255, 0.35);</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--color-cyan: #00f0ff;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--color-green: #10b981;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--color-amber: #f59e0b;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--color-text-main: #f8fafc;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--color-text-muted: #94a3b8;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--font-sans: &#039;Inter&#039;, system-ui, sans-serif;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--radius-lg: 16px;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--radius-md: 10px;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--radius-sm: 6px;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--transition-smooth: all 0.25s cubic-bezier(0.16, 1, 0.3, 1);</span></span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">/* ==========================================================</span>
<span class="wzw-code-line">   2. RESET DE ESPECIFICIDADE ZERO COM :where()</span>
<span class="wzw-code-line">   ========================================================== */</span>
<span class="wzw-code-line">:where(*, *::before, *::after) {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">box-sizing</span>: border-box;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">margin</span>: 0;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">padding</span>: 0;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">/* ==========================================================</span>
<span class="wzw-code-line">   3. ESTRUTURA DO LAYOUT MESTRE (Grid Responsivo)</span>
<span class="wzw-code-line">   ========================================================== */</span>
<span class="wzw-code-line">.app-layout {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">display</span>: grid;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">grid-template-columns</span>: <span class="wzw-tk-num">240px</span> <span class="wzw-tk-num">1fr</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">min-height</span>: <span class="wzw-tk-num">100vh</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background-color</span>: var(--bg-deep);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-family</span>: var(--font-sans);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: var(--color-text-main);</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">/* ==========================================================</span>
<span class="wzw-code-line">   4. SIDEBAR COM GLASSMORPHISM</span>
<span class="wzw-code-line">   ========================================================== */</span>
<span class="wzw-code-line">.sidebar {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: var(--bg-glass);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">backdrop-filter</span>: blur(<span class="wzw-tk-num">12px</span>);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">-webkit-backdrop-filter</span>: blur(<span class="wzw-tk-num">12px</span>);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-right</span>: <span class="wzw-tk-num">1px</span> solid var(--border-subtle);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">1.5rem</span> <span class="wzw-tk-num">1rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">display</span>: flex;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">flex-direction</span>: column;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">gap</span>: <span class="wzw-tk-num">2rem</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.sidebar__brand {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">display</span>: flex;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">align-items</span>: center;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">gap</span>: <span class="wzw-tk-num">0.75rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">padding-left</span>: <span class="wzw-tk-num">0.5rem</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.brand-icon {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-size</span>: <span class="wzw-tk-num">1.5rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">filter</span>: drop-shadow(0 0 <span class="wzw-tk-num">8px</span> var(--color-cyan));</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.brand-text {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-size</span>: <span class="wzw-tk-num">1.25rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-weight</span>: 800;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">letter-spacing</span>: -<span class="wzw-tk-num">0.5px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: var(--color-text-main);</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.sidebar__nav {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">display</span>: flex;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">flex-direction</span>: column;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">gap</span>: <span class="wzw-tk-num">0.5rem</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.nav-item {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">display</span>: flex;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">align-items</span>: center;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">gap</span>: <span class="wzw-tk-num">0.75rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">0.75rem</span> <span class="wzw-tk-num">1rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-radius</span>: var(--radius-sm);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: var(--color-text-muted);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">text-decoration</span>: none;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-weight</span>: 600;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-size</span>: <span class="wzw-tk-num">0.92rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transition</span>: var(--transition-smooth);</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.nav-item<span class="wzw-tk-kw">:hover</span> {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: rgba(255, 255, 255, 0.05);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: var(--color-text-main);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transform</span>: translateX(<span class="wzw-tk-num">4px</span>);</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.nav-item--active {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: rgba(0, 240, 255, 0.1);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: var(--color-cyan);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-left</span>: <span class="wzw-tk-num">3px</span> solid var(--color-cyan);</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">/* ==========================================================</span>
<span class="wzw-code-line">   5. CONTEÚDO PRINCIPAL &amp; TOPBAR</span>
<span class="wzw-code-line">   ========================================================== */</span>
<span class="wzw-code-line">.main-content {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">2rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">display</span>: flex;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">flex-direction</span>: column;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">gap</span>: <span class="wzw-tk-num">2rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">overflow-y</span>: auto;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.topbar {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">display</span>: flex;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">justify-content</span>: space-between;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">align-items</span>: center;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">padding-bottom</span>: <span class="wzw-tk-num">1.25rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-bottom</span>: <span class="wzw-tk-num">1px</span> solid var(--border-subtle);</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.topbar__title {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-size</span>: <span class="wzw-tk-num">1.5rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-weight</span>: 800;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">letter-spacing</span>: -<span class="wzw-tk-num">0.5px</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.topbar__user {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">display</span>: flex;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">align-items</span>: center;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">gap</span>: <span class="wzw-tk-num">1rem</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.user-avatar {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">width</span>: <span class="wzw-tk-num">40px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">height</span>: <span class="wzw-tk-num">40px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: linear-gradient(<span class="wzw-tk-num">135deg</span>, var(--color-cyan), <span class="wzw-tk-num">#3b82f6</span>);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#090d16</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-weight</span>: 800;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-size</span>: <span class="wzw-tk-num">0.85rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-radius</span>: 50%;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">display</span>: flex;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">align-items</span>: center;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">justify-content</span>: center;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">box-shadow</span>: 0 0 <span class="wzw-tk-num">12px</span> rgba(0, 240, 255, 0.3);</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">/* ==========================================================</span>
<span class="wzw-code-line">   6. BENTO GRID DE MÉTRICAS ANALÍTICAS</span>
<span class="wzw-code-line">   ========================================================== */</span>
<span class="wzw-code-line">.metrics-grid {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">display</span>: grid;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">grid-template-columns</span>: repeat(auto-fit, minmax(<span class="wzw-tk-num">240px</span>, <span class="wzw-tk-num">1fr</span>));</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">gap</span>: <span class="wzw-tk-num">1.5rem</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.metric-card {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: var(--bg-surface);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border</span>: <span class="wzw-tk-num">1px</span> solid var(--border-subtle);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-radius</span>: var(--radius-lg);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">1.5rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">display</span>: flex;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">flex-direction</span>: column;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">gap</span>: <span class="wzw-tk-num">0.5rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transition</span>: var(--transition-smooth);</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.metric-card<span class="wzw-tk-kw">:hover</span> {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transform</span>: translateY(-<span class="wzw-tk-num">4px</span>);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-color</span>: var(--border-glow);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">box-shadow</span>: 0 <span class="wzw-tk-num">12px</span> <span class="wzw-tk-num">30px</span> rgba(0, 0, 0, 0.4);</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.metric-card--glow-cyan<span class="wzw-tk-kw">:hover</span> { box-shadow: 0 <span class="wzw-tk-num">10px</span> <span class="wzw-tk-num">25px</span> rgba(0, 240, 255, 0.15); }</span>
<span class="wzw-code-line">.metric-card--glow-green<span class="wzw-tk-kw">:hover</span> { box-shadow: 0 <span class="wzw-tk-num">10px</span> <span class="wzw-tk-num">25px</span> rgba(16, 185, 129, 0.15); }</span>
<span class="wzw-code-line">.metric-card--glow-amber<span class="wzw-tk-kw">:hover</span> { box-shadow: 0 <span class="wzw-tk-num">10px</span> <span class="wzw-tk-num">25px</span> rgba(245, 158, 11, 0.15); }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.metric-card__subtitle {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: var(--color-text-muted);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-size</span>: <span class="wzw-tk-num">0.85rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-weight</span>: 600;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">text-transform</span>: uppercase;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">letter-spacing</span>: <span class="wzw-tk-num">0.5px</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.metric-card__value {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-size</span>: <span class="wzw-tk-num">2.2rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-weight</span>: 800;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">letter-spacing</span>: -<span class="wzw-tk-num">1px</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.metric-card__delta {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-size</span>: <span class="wzw-tk-num">0.85rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-weight</span>: 700;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.metric-card__delta--positive { color: var(--color-green); }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">/* ==========================================================</span>
<span class="wzw-code-line">   7. TABELA COM GLASSMORPHISM &amp; :has() INTELIGENTE</span>
<span class="wzw-code-line">   ========================================================== */</span>
<span class="wzw-code-line">.table-container {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: var(--bg-surface);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border</span>: <span class="wzw-tk-num">1px</span> solid var(--border-subtle);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-radius</span>: var(--radius-lg);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">1.5rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">display</span>: flex;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">flex-direction</span>: column;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">gap</span>: <span class="wzw-tk-num">1rem</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.section-heading {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-size</span>: <span class="wzw-tk-num">1.15rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-weight</span>: 700;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: var(--color-text-main);</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.data-table {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">width</span>: 100%;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-collapse</span>: collapse;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">text-align</span>: left;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.data-table th {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">0.75rem</span> <span class="wzw-tk-num">1rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: var(--color-text-muted);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-size</span>: <span class="wzw-tk-num">0.82rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">text-transform</span>: uppercase;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">letter-spacing</span>: <span class="wzw-tk-num">0.5px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-bottom</span>: <span class="wzw-tk-num">1px</span> solid var(--border-subtle);</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.data-table td {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">1rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-bottom</span>: <span class="wzw-tk-num">1px</span> solid var(--border-subtle);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-size</span>: <span class="wzw-tk-num">0.95rem</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">/* Transição de Hover nas Linhas */</span></span>
<span class="wzw-code-line">.data-table tbody tr {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transition</span>: background-color <span class="wzw-tk-num">0.2s</span> ease, opacity <span class="wzw-tk-num">0.2s</span> ease;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.data-table tbody tr<span class="wzw-tk-kw">:hover</span> {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background-color</span>: rgba(255, 255, 255, 0.03);</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">/* Mágica do :has() para Dimming de Irmãos na Tabela */</span></span>
<span class="wzw-code-line">.data-table tbody:has(tr<span class="wzw-tk-kw">:hover</span>) tr:not(<span class="wzw-tk-kw">:hover</span>) {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">opacity</span>: 0.45;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">/* ==========================================================</span>
<span class="wzw-code-line">   8. COMPONENTES ATÔMICOS (Badges &amp; Pills)</span>
<span class="wzw-code-line">   ========================================================== */</span>
<span class="wzw-code-line">.status-pill {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">display</span>: inline-flex;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">align-items</span>: center;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">4px</span> <span class="wzw-tk-num">10px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-radius</span>: <span class="wzw-tk-num">20px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-size</span>: <span class="wzw-tk-num">0.75rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-weight</span>: 700;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.status-pill--success {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: rgba(16, 185, 129, 0.15);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: var(--color-green);</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.status-pill--warning {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: rgba(245, 158, 11, 0.15);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: var(--color-amber);</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.badge--online {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: rgba(16, 185, 129, 0.2);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: var(--color-green);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">4px</span> <span class="wzw-tk-num">8px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-radius</span>: <span class="wzw-tk-num">6px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-size</span>: <span class="wzw-tk-num">0.75rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-weight</span>: 800;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">/* ==========================================================</span>
<span class="wzw-code-line">   9. RESPONSIVIDADE MOBILE-FIRST</span>
<span class="wzw-code-line">   ========================================================== */</span>
<span class="wzw-code-line"><span class="wzw-tk-kw">@media</span> (max-width: <span class="wzw-tk-num">768px</span>) {</span>
<span class="wzw-code-line">  .app-layout {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">grid-template-columns</span>: <span class="wzw-tk-num">1fr</span>;</span>
<span class="wzw-code-line">  }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">  .sidebar {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">border-right</span>: none;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">border-bottom</span>: <span class="wzw-tk-num">1px</span> solid var(--border-subtle);</span>
<span class="wzw-code-line">  }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">  .main-content {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">1rem</span>;</span>
<span class="wzw-code-line">  }</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* ==========================================================
   1. DESIGN TOKENS GLOBAIS (:root)
   ========================================================== */
:root {
  --bg-deep: #090d16;
  --bg-surface: #111827;
  --bg-glass: rgba(17, 24, 39, 0.75);
  --border-subtle: rgba(255, 255, 255, 0.08);
  --border-glow: rgba(0, 240, 255, 0.35);

  --color-cyan: #00f0ff;
  --color-green: #10b981;
  --color-amber: #f59e0b;
  --color-text-main: #f8fafc;
  --color-text-muted: #94a3b8;

  --font-sans: &#039;Inter&#039;, system-ui, sans-serif;
  --radius-lg: 16px;
  --radius-md: 10px;
  --radius-sm: 6px;

  --transition-smooth: all 0.25s cubic-bezier(0.16, 1, 0.3, 1);
}

/* ==========================================================
   2. RESET DE ESPECIFICIDADE ZERO COM :where()
   ========================================================== */
:where(*, *::before, *::after) {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}

/* ==========================================================
   3. ESTRUTURA DO LAYOUT MESTRE (Grid Responsivo)
   ========================================================== */
.app-layout {
  display: grid;
  grid-template-columns: 240px 1fr;
  min-height: 100vh;
  background-color: var(--bg-deep);
  font-family: var(--font-sans);
  color: var(--color-text-main);
}

/* ==========================================================
   4. SIDEBAR COM GLASSMORPHISM
   ========================================================== */
.sidebar {
  background: var(--bg-glass);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  border-right: 1px solid var(--border-subtle);
  padding: 1.5rem 1rem;
  display: flex;
  flex-direction: column;
  gap: 2rem;
}

.sidebar__brand {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding-left: 0.5rem;
}

.brand-icon {
  font-size: 1.5rem;
  filter: drop-shadow(0 0 8px var(--color-cyan));
}

.brand-text {
  font-size: 1.25rem;
  font-weight: 800;
  letter-spacing: -0.5px;
  color: var(--color-text-main);
}

.sidebar__nav {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
}

.nav-item {
  display: flex;
  align-items: center;
  gap: 0.75rem;
  padding: 0.75rem 1rem;
  border-radius: var(--radius-sm);
  color: var(--color-text-muted);
  text-decoration: none;
  font-weight: 600;
  font-size: 0.92rem;
  transition: var(--transition-smooth);
}

.nav-item:hover {
  background: rgba(255, 255, 255, 0.05);
  color: var(--color-text-main);
  transform: translateX(4px);
}

.nav-item--active {
  background: rgba(0, 240, 255, 0.1);
  color: var(--color-cyan);
  border-left: 3px solid var(--color-cyan);
}

/* ==========================================================
   5. CONTEÚDO PRINCIPAL &amp; TOPBAR
   ========================================================== */
.main-content {
  padding: 2rem;
  display: flex;
  flex-direction: column;
  gap: 2rem;
  overflow-y: auto;
}

.topbar {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding-bottom: 1.25rem;
  border-bottom: 1px solid var(--border-subtle);
}

.topbar__title {
  font-size: 1.5rem;
  font-weight: 800;
  letter-spacing: -0.5px;
}

.topbar__user {
  display: flex;
  align-items: center;
  gap: 1rem;
}

.user-avatar {
  width: 40px;
  height: 40px;
  background: linear-gradient(135deg, var(--color-cyan), #3b82f6);
  color: #090d16;
  font-weight: 800;
  font-size: 0.85rem;
  border-radius: 50%;
  display: flex;
  align-items: center;
  justify-content: center;
  box-shadow: 0 0 12px rgba(0, 240, 255, 0.3);
}

/* ==========================================================
   6. BENTO GRID DE MÉTRICAS ANALÍTICAS
   ========================================================== */
.metrics-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: 1.5rem;
}

.metric-card {
  background: var(--bg-surface);
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-lg);
  padding: 1.5rem;
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  transition: var(--transition-smooth);
}

.metric-card:hover {
  transform: translateY(-4px);
  border-color: var(--border-glow);
  box-shadow: 0 12px 30px rgba(0, 0, 0, 0.4);
}

.metric-card--glow-cyan:hover { box-shadow: 0 10px 25px rgba(0, 240, 255, 0.15); }
.metric-card--glow-green:hover { box-shadow: 0 10px 25px rgba(16, 185, 129, 0.15); }
.metric-card--glow-amber:hover { box-shadow: 0 10px 25px rgba(245, 158, 11, 0.15); }

.metric-card__subtitle {
  color: var(--color-text-muted);
  font-size: 0.85rem;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.5px;
}

.metric-card__value {
  font-size: 2.2rem;
  font-weight: 800;
  letter-spacing: -1px;
}

.metric-card__delta {
  font-size: 0.85rem;
  font-weight: 700;
}

.metric-card__delta--positive { color: var(--color-green); }

/* ==========================================================
   7. TABELA COM GLASSMORPHISM &amp; :has() INTELIGENTE
   ========================================================== */
.table-container {
  background: var(--bg-surface);
  border: 1px solid var(--border-subtle);
  border-radius: var(--radius-lg);
  padding: 1.5rem;
  display: flex;
  flex-direction: column;
  gap: 1rem;
}

.section-heading {
  font-size: 1.15rem;
  font-weight: 700;
  color: var(--color-text-main);
}

.data-table {
  width: 100%;
  border-collapse: collapse;
  text-align: left;
}

.data-table th {
  padding: 0.75rem 1rem;
  color: var(--color-text-muted);
  font-size: 0.82rem;
  text-transform: uppercase;
  letter-spacing: 0.5px;
  border-bottom: 1px solid var(--border-subtle);
}

.data-table td {
  padding: 1rem;
  border-bottom: 1px solid var(--border-subtle);
  font-size: 0.95rem;
}

/* Transição de Hover nas Linhas */
.data-table tbody tr {
  transition: background-color 0.2s ease, opacity 0.2s ease;
}

.data-table tbody tr:hover {
  background-color: rgba(255, 255, 255, 0.03);
}

/* Mágica do :has() para Dimming de Irmãos na Tabela */
.data-table tbody:has(tr:hover) tr:not(:hover) {
  opacity: 0.45;
}

/* ==========================================================
   8. COMPONENTES ATÔMICOS (Badges &amp; Pills)
   ========================================================== */
.status-pill {
  display: inline-flex;
  align-items: center;
  padding: 4px 10px;
  border-radius: 20px;
  font-size: 0.75rem;
  font-weight: 700;
}

.status-pill--success {
  background: rgba(16, 185, 129, 0.15);
  color: var(--color-green);
}

.status-pill--warning {
  background: rgba(245, 158, 11, 0.15);
  color: var(--color-amber);
}

.badge--online {
  background: rgba(16, 185, 129, 0.2);
  color: var(--color-green);
  padding: 4px 8px;
  border-radius: 6px;
  font-size: 0.75rem;
  font-weight: 800;
}

/* ==========================================================
   9. RESPONSIVIDADE MOBILE-FIRST
   ========================================================== */
@media (max-width: 768px) {
  .app-layout {
    grid-template-columns: 1fr;
  }

  .sidebar {
    border-right: none;
    border-bottom: 1px solid var(--border-subtle);
  }

  .main-content {
    padding: 1rem;
  }
}</textarea>
        </div>
    </div>
    
<div class="wzw-playground-action-bar">
    <span class="wzw-playground-desc">🧪 <strong>Quer ver este código funcionando agora?</strong></span><br />
    <a href="https://webzoneware.com/web-academy/playground-web/" class="wzw-btn-playground" target="_blank" rel="noopener"> Abrir no Playground IDE &rarr;<br />
    </a>
</div>
<h2>4. Ferramentas Web-ZoneWare para o seu Projeto Final</h2>
<p>
    Ao finalizar a construção do seu Dashboard, passe o código pelas ferramentas do portal Web-ZoneWare para validar a conformidade e compactar a entrega:
</p>
<ul>
<li><a href="https://webzoneware.com/web-ferramentas/css-beautify-minify/" target="_blank">Limpador e Formatador CSS</a>: Garanta que todas as variáveis e regras BEM estejam perfeitamente indentadas com 2 espaços de padrão sênior.</li>
<li><a href="https://webzoneware.com/web-ferramentas/cssvalidate/" target="_blank">Validador de CSS Online</a>: Assegure conformidade 100% com os padrões do W3C antes do deploy.</li>
<li><a href="https://webzoneware.com/web-academy/playground-web/" target="_blank">Playground Web IDE</a>: Seu laboratório permanente para testar novas telas e componentes em qualquer dispositivo.</li>
</ul>
<h2>5. Links Oficiais de Autoridade</h2>
<ul>
<li><a href="https://www.w3.org/Style/CSS/" target="_blank" rel="noopener noreferrer">W3C — Folhas de Estilo em Cascata (Portal Oficial do Padrão)</a></li>
<li><a href="https://developer.mozilla.org/pt-BR/docs/Web/CSS" target="_blank" rel="noopener noreferrer">MDN Web Docs — Referência Global de CSS</a></li>
<li><a href="https://open-props.style/" target="_blank" rel="noopener noreferrer">Open Props — Design Tokens Modernos em CSS Puro</a></li>
<li><a href="https://design-tokens.github.io/community-group/format/" target="_blank" rel="noopener noreferrer">Design Tokens Community Group (DTCG W3C Community)</a></li>
</ul>
<h2>6. Exercício Prático de Conclusão da Trilha</h2>
<ol>
<li>Carregue o código do Dashboard no <strong>Playground Web IDE</strong>.</li>
<li>Adicione um botão de alternância de tema (Modo Claro vs. Modo Escuro) redefinindo os valores das variáveis em <code>:root[data-theme="light"]</code>.</li>
<li>Insira um novo widget analítico na seção de estatísticas representando o tempo de resposta do servidor em milissegundos com um badge <code>Fast</code>.</li>
<li>Teste o comportamento responsivo reduzindo a largura da janela até 360px no celular e verifique se o menu e os cards se adaptam sem overflow horizontal.</li>
<li>Passe a folha final pelo <a href="https://webzoneware.com/web-ferramentas/css-beautify-minify/" target="_blank">Minificador CSS</a> e confira a redução de peso atingida.</li>
</ol>
<h2>7. Quiz Final de Conclusão da Trilha CSS3</h2>
<details class="wzw-quiz-card">
<summary><strong>1. Qual a principal vantagem de centralizar cores e espaçamentos em CSS Variables (:root) em vez de valores fixos?</strong></summary>
<div class="wzw-quiz-answer">
<p><strong>Resposta Correta:</strong> Permite criar um sistema coeso de Design Tokens que pode ser atualizado em um único local central, viabilizando temas dinâmicos (como Dark Mode) em tempo de execução sem duplicar código na cascata.</p>
</p></div>
</details>
<details class="wzw-quiz-card">
<summary><strong>2. Por que a combinação de CSS Grid no layout macro e Flexbox nos componentes internos é o padrão da indústria?</strong></summary>
<div class="wzw-quiz-answer">
<p><strong>Resposta Correta:</strong> Porque o CSS Grid é especialista em alinhamento bidimensional (linhas e colunas simultâneas para o esqueleto geral), enquanto o Flexbox é imbatível para alinhamento unidimensional (distribuição linear e centralização de botões, ícones e cabeçalhos).</p>
</p></div>
</details>
<details class="wzw-quiz-card">
<summary><strong>3. Como o efeito de Glassmorphism com backdrop-filter difere da propriedade filter tradicional?</strong></summary>
<div class="wzw-quiz-answer">
<p><strong>Resposta Correta:</strong> A propriedade <code>filter</code> borra o próprio elemento e todo o seu texto interno. Já o <code>backdrop-filter</code> aplica o desfoque gaussiano exclusivamente à área gráfica localizada atrás da caixa translúcida, mantendo o texto perfeitamente nítido e legível.</p>
</p></div>
</details>
<p><!-- Marcação Estruturada Schema.org (JSON-LD) --><br />
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "TechArticle",
  "headline": "Projeto Final: Design System & Dashboard Completo em CSS3",
  "description": "Construa um Design System e Dashboard completo em CSS3 aplicando tokens, Grid, Flexbox, BEM, animações e Glassmorphism.",
  "url": "https://webzoneware.com/web-academy/css/projeto-pratico-design-system-dashboard-css3/",
  "inLanguage": "pt-BR",
  "isPartOf": {
    "@type": "Course",
    "name": "Curso de CSS & CSS3 Completo",
    "url": "https://webzoneware.com/web-academy/css/",
    "provider": {
      "@type": "Organization",
      "name": "Web-ZoneWare",
      "url": "https://webzoneware.com"
    }
  },
  "proficiencyLevel": "Advanced",
  "author": {
    "@type": "Organization",
    "name": "Web-ZoneWare Academy"
  }
}
</script></p>
<p>O post <a href="https://webzoneware.com/web-academy/curso-css/projeto-pratico-design-system-dashboard-css3/">Projeto Final: Design System e Dashboard — Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://webzoneware.com/web-academy/curso-css/projeto-pratico-design-system-dashboard-css3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Performance e Otimização de CSS na Web &#124; Web Academy</title>
		<link>https://webzoneware.com/web-academy/curso-css/performance-otimizacao-css-cleaner/</link>
					<comments>https://webzoneware.com/web-academy/curso-css/performance-otimizacao-css-cleaner/#respond</comments>
		
		<dc:creator><![CDATA[Web-Zoneware]]></dc:creator>
		<pubDate>Thu, 22 Oct 2026 04:43:29 +0000</pubDate>
				<category><![CDATA[Curso de CSS e CSS3]]></category>
		<category><![CDATA[core web vitals]]></category>
		<category><![CDATA[critical css]]></category>
		<category><![CDATA[minificacao css]]></category>
		<category><![CDATA[otimizacao css]]></category>
		<category><![CDATA[performance css]]></category>
		<category><![CDATA[render blocking css]]></category>
		<category><![CDATA[web academy]]></category>
		<guid isPermaLink="false">https://webzoneware.com/?p=29478</guid>

					<description><![CDATA[<p>No desenvolvimento front-end profissional, escrever um CSS visualmente impecável é apenas metade do trabalho: se as folhas de estilo forem pesadas, redundantes ou mal estruturadas, o navegador sofrerá atrasos severos para exibir o primeiro pixel na tela. O CSS é, por natureza, um recurso Render-Blocking (bloqueador de renderização). Dominar técnicas de minificação, extração de Critical [&#8230;]</p>
<p>O post <a href="https://webzoneware.com/web-academy/curso-css/performance-otimizacao-css-cleaner/">Performance e Otimização de CSS na Web | Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wzw-lesson-lead">
    No desenvolvimento front-end profissional, escrever um CSS visualmente impecável é apenas metade do trabalho: se as folhas de estilo forem pesadas, redundantes ou mal estruturadas, o navegador sofrerá atrasos severos para exibir o primeiro pixel na tela. O CSS é, por natureza, um recurso <strong>Render-Blocking</strong> (bloqueador de renderização). Dominar técnicas de minificação, extração de <em>Critical CSS</em>, otimização de renderização na GPU e auditoria de <em>Core Web Vitals</em> é o divisor de águas entre um site amador lento e uma aplicação web de alto desempenho.
</p>
<div class="wzw-callout wzw-callout-info">
<div class="wzw-callout-icon">⚡</div>
<div>
        <strong>O que é Render-Blocking?</strong> Enquanto o navegador baixa uma folha de estilos externa e constrói a árvore <strong>CSSOM</strong> (<em>CSS Object Model</em>), ele interrompe completamente a pintura visual da página. Quanto maior o arquivo CSS e mais complexos forem os seletores, mais tempo o usuário passa diante de uma tela em branco no celular.
    </div>
</div>
<h2>1. O Caminho Crítico de Renderização (Critical Rendering Path)</h2>
<p>
    Para renderizar uma página, o motor do navegador executa uma sequência rigorosa de etapas:
</p>
<ol>
<li><strong>Construção do DOM &#038; CSSOM:</strong> O HTML é convertido no DOM e as regras CSS são estruturadas no CSSOM.</li>
<li><strong>Árvore de Renderização (Render Tree):</strong> O navegador combina apenas os nós visíveis do DOM com as regras calculadas do CSSOM.</li>
<li><strong>Layout (Reflow):</strong> O navegador calcula a geometria exata, largura, altura e posição de cada elemento na tela.</li>
<li><strong>Pintura (Paint / Repaint):</strong> Os pixels de cores, fundos, bordas e sombras são desenhados na memória.</li>
<li><strong>Composição (Composite):</strong> As diferentes camadas gráficas são combinadas e enviadas para a tela através da GPU.</li>
</ol>
<div class="wzw-callout wzw-callout-pro">
<div class="wzw-callout-icon">🚀</div>
<div>
        <strong>A Regra de Ouro das Animações a 60 FPS:</strong><br />
        <br />Evite animar propriedades que forçam <strong>Layout/Reflow</strong> (como <code>width</code>, <code>height</code>, <code>top</code>, <code>left</code>, <code>margin</code>).<br />
        <br />Prefira sempre animar propriedades gerenciadas diretamente na camada de <strong>Composição (GPU)</strong>: <code>transform</code> (translate, scale, rotate) e <code>opacity</code>.
    </div>
</div>
<h2>2. Critical CSS: Eliminando o Bloqueio de Renderização</h2>
<p>
    O conceito de <strong>Critical CSS</strong> consiste em isolar apenas os estilos estritamente necessários para desenhar a primeira dobra visível da tela (a área <em>above-the-fold</em> visível sem rolar a página):
</p>
<ul>
<li><strong>Passo 1 (Inline no &lt;head&gt;):</strong> As regras críticas (cabeçalho, tipografia inicial e estrutura da dobra) são inseridas diretamente em uma tag <code>&lt;style&gt;</code> no <code>&lt;head&gt;</code> do documento HTML.</li>
<li><strong>Passo 2 (Carregamento Assíncrono):</strong> A folha de estilos completa com os estilos do rodapé, modais e áreas secundárias é carregada de forma assíncrona, sem travar o carregamento inicial:</li>
</ul>
    <div class="wzw-ide-card" id="wzw-code-19223" data-lang="html">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">HTML5</span>
                                <span class="wzw-ide-lines-count">3 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-19223', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-19223', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">&lt;!-- Carregamento assíncrono e não-bloqueante do CSS não crítico --&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;link</span> <span class="wzw-tk-attr">rel</span>=<span class="wzw-tk-str">&quot;preload&quot;</span> <span class="wzw-tk-attr">href</span>=<span class="wzw-tk-str">&quot;estilos-completos.css&quot;</span> <span class="wzw-tk-attr">as</span>=<span class="wzw-tk-str">&quot;style&quot;</span> <span class="wzw-tk-attr">onload</span>=<span class="wzw-tk-str">&quot;this.onload=null;this.rel=&#039;stylesheet&#039;&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;noscript&gt;</span><span class="wzw-tk-tag">&lt;link</span> <span class="wzw-tk-attr">rel</span>=<span class="wzw-tk-str">&quot;stylesheet&quot;</span> <span class="wzw-tk-attr">href</span>=<span class="wzw-tk-str">&quot;estilos-completos.css&quot;</span><span class="wzw-tk-tag">&gt;</span><span class="wzw-tk-tag">&lt;/noscript&gt;</span></span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>&lt;!-- Carregamento assíncrono e não-bloqueante do CSS não crítico --&gt;
&lt;link rel=&quot;preload&quot; href=&quot;estilos-completos.css&quot; as=&quot;style&quot; onload=&quot;this.onload=null;this.rel=&#039;stylesheet&#039;&quot;&gt;
&lt;noscript&gt;&lt;link rel=&quot;stylesheet&quot; href=&quot;estilos-completos.css&quot;&gt;&lt;/noscript&gt;</textarea>
        </div>
    </div>
    
<h2>3. Minificação, Compressão e Limpeza de Código Morto</h2>
<p>
    Espaços em branco, comentários longos e regras duplicadas aumentam o consumo de banda sem trazer nenhum valor para a máquina do usuário:
</p>
<div class="wzw-table-responsive">
<table class="wzw-table">
<thead>
<tr>
<th>Técnica de Otimização</th>
<th>Como Funciona</th>
<th>Ganho Médio de Desempenho</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Minificação CSS</strong></td>
<td>Remove quebras de linha, tabulações e comentários, abreviando cores e unidades.</td>
<td>20% a 40% de redução no tamanho do arquivo bruto.</td>
</tr>
<tr>
<td><strong>Compressão Gzip / Brotli</strong></td>
<td>Algoritmo de compressão executado pelo servidor web (Nginx/Apache) durante o envio.</td>
<td>60% a 80% de redução no tráfego de rede (transfer size).</td>
</tr>
<tr>
<td><strong>Remoção de Dead Code (Purge)</strong></td>
<td>Varre o HTML/JS e descarta classes e seletores CSS que nunca são utilizados em nenhuma página.</td>
<td>Elimina até 90% do peso em frameworks e bibliotecas prontas.</td>
</tr>
</tbody>
</table>
</div>
<h2>4. Otimização de Fontes com font-display: swap</h2>
<p>
    Quando uma página utiliza fontes personalizadas da web (Google Fonts ou arquivos <code>.woff2</code> locais), o navegador pode esconder todo o texto da tela até a fonte terminar de baixar — um problema conhecido como <strong>FOIT</strong> (<em>Flash of Invisible Text</em>).
</p>
<p>
    Para evitar que o usuário encare uma página sem texto legível, declare sempre <code>font-display: swap;</code> na regra <code>@font-face</code>:
</p>
    <div class="wzw-ide-card" id="wzw-code-81785" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">6 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-81785', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-81785', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-kw">@font-face</span> {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-family</span>: <span class="wzw-tk-str">&#039;Outfit&#039;</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">src</span>: url(<span class="wzw-tk-str">&#039;/fonts/outfit-variable.woff2&#039;</span>) format(<span class="wzw-tk-str">&#039;woff2&#039;</span>);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-weight</span>: 100 900;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-display</span>: swap; /* Exibe fonte do sistema imediatamente e troca quando carregar */</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>@font-face {
  font-family: &#039;Outfit&#039;;
  src: url(&#039;/fonts/outfit-variable.woff2&#039;) format(&#039;woff2&#039;);
  font-weight: 100 900;
  font-display: swap; /* Exibe fonte do sistema imediatamente e troca quando carregar */
}</textarea>
        </div>
    </div>
    
<h2>5. content-visibility: auto (Aceleração Nativa de Páginas Longas)</h2>
<p>
    Uma das propriedades mais poderosas do CSS contemporâneo é o <code>content-visibility: auto;</code>. Ele instrui o motor de renderização do navegador a ignorar totalmente o cálculo de layout e a pintura de elementos que estão fora da tela (<em>off-screen</em>) até que o usuário role a página até próximo deles:
</p>
    <div class="wzw-ide-card" id="wzw-code-52577" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">6 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-52577', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-52577', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">/* Seções longas abaixo da dobra economizam tempo maciço de renderização */</span></span>
<span class="wzw-code-line">.long-content-section,</span>
<span class="wzw-code-line">.footer-complex {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">content-visibility</span>: auto;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">contain-intrinsic-size</span>: 0 <span class="wzw-tk-num">500px</span>; /* Altura estimada para evitar pulos de rolagem */</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* Seções longas abaixo da dobra economizam tempo maciço de renderização */
.long-content-section,
.footer-complex {
  content-visibility: auto;
  contain-intrinsic-size: 0 500px; /* Altura estimada para evitar pulos de rolagem */
}</textarea>
        </div>
    </div>
    
<h2>6. Laboratório Prático: Comparativo de Performance (CPU Reflow vs. GPU Composite)</h2>
<p>
    Analise o experimento abaixo. Ele coloca lado a lado duas estratégias de movimentação de elementos: o método lento tradicional (alterando <code>left</code>, que força o ciclo completo de Layout e Paint a cada frame) contra o método performático moderno (utilizando <code>transform: translateX</code> na camada de Composição da GPU):
</p>
    <div class="wzw-ide-card" id="wzw-code-96412" data-lang="html">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">HTML5</span>
                                <span class="wzw-ide-lines-count">11 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-96412', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-96412', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;benchmark-container&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;benchmark-track&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;span</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;track-label&quot;</span><span class="wzw-tk-tag">&gt;</span>Método Lento (Reflow / Layout CPU via left):<span class="wzw-tk-tag">&lt;/span&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;box box--slow&quot;</span><span class="wzw-tk-tag">&gt;</span>CPU<span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;benchmark-track&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;span</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;track-label&quot;</span><span class="wzw-tk-tag">&gt;</span>Método Otimizado (Composite GPU via transform):<span class="wzw-tk-tag">&lt;/span&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;box box--fast&quot;</span><span class="wzw-tk-tag">&gt;</span>GPU<span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;/div&gt;</span></span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>&lt;div class=&quot;benchmark-container&quot;&gt;
  &lt;div class=&quot;benchmark-track&quot;&gt;
    &lt;span class=&quot;track-label&quot;&gt;Método Lento (Reflow / Layout CPU via left):&lt;/span&gt;
    &lt;div class=&quot;box box--slow&quot;&gt;CPU&lt;/div&gt;
  &lt;/div&gt;

  &lt;div class=&quot;benchmark-track&quot;&gt;
    &lt;span class=&quot;track-label&quot;&gt;Método Otimizado (Composite GPU via transform):&lt;/span&gt;
    &lt;div class=&quot;box box--fast&quot;&gt;GPU&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;</textarea>
        </div>
    </div>
    
    <div class="wzw-ide-card" id="wzw-code-65703" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">70 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-65703', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-65703', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line">.benchmark-container {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">display</span>: flex;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">flex-direction</span>: column;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">gap</span>: <span class="wzw-tk-num">1.5rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: <span class="wzw-tk-num">#0f172a</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">1.5rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-radius</span>: <span class="wzw-tk-num">12px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border</span>: <span class="wzw-tk-num">1px</span> solid <span class="wzw-tk-num">#334155</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.benchmark-track {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">display</span>: flex;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">flex-direction</span>: column;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">gap</span>: <span class="wzw-tk-num">0.5rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">position</span>: relative;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">height</span>: <span class="wzw-tk-num">90px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: <span class="wzw-tk-num">#1e293b</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-radius</span>: <span class="wzw-tk-num">8px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">0.75rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">overflow</span>: hidden;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.track-label {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-size</span>: <span class="wzw-tk-num">0.85rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#94a3b8</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-family</span>: <span class="wzw-tk-str">&#039;Inter&#039;</span>, sans-serif;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.box {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">width</span>: <span class="wzw-tk-num">44px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">height</span>: <span class="wzw-tk-num">44px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-radius</span>: <span class="wzw-tk-num">8px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">display</span>: flex;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">align-items</span>: center;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">justify-content</span>: center;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-weight</span>: 800;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-family</span>: <span class="wzw-tk-str">&#039;Inter&#039;</span>, sans-serif;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-size</span>: <span class="wzw-tk-num">0.85rem</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">/* 1. Animação Lenta: Força recálculo de Layout e Repaint a cada frame */</span></span>
<span class="wzw-code-line">.box--slow {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: <span class="wzw-tk-num">#ef4444</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#ffffff</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">position</span>: absolute;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">bottom</span>: <span class="wzw-tk-num">10px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">left</span>: <span class="wzw-tk-num">10px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">animation</span>: move-cpu <span class="wzw-tk-num">3s</span> ease-in-out infinite alternate;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-kw">@keyframes</span> move-cpu {</span>
<span class="wzw-code-line">  0% { left: <span class="wzw-tk-num">10px</span>; }</span>
<span class="wzw-code-line">  100% { left: calc(100% - <span class="wzw-tk-num">54px</span>); }</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">/* 2. Animação Fluida: Processada inteiramente na GPU sem disparar Reflow */</span></span>
<span class="wzw-code-line">.box--fast {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: <span class="wzw-tk-num">#00f0ff</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#090d16</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">position</span>: absolute;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">bottom</span>: <span class="wzw-tk-num">10px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">left</span>: <span class="wzw-tk-num">10px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">will-change</span>: transform;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">animation</span>: move-gpu <span class="wzw-tk-num">3s</span> ease-in-out infinite alternate;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-kw">@keyframes</span> move-gpu {</span>
<span class="wzw-code-line">  0% { transform: translateX(0); }</span>
<span class="wzw-code-line">  100% { transform: translateX(calc(100% - <span class="wzw-tk-num">54px</span>)); }</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>.benchmark-container {
  display: flex;
  flex-direction: column;
  gap: 1.5rem;
  background: #0f172a;
  padding: 1.5rem;
  border-radius: 12px;
  border: 1px solid #334155;
}

.benchmark-track {
  display: flex;
  flex-direction: column;
  gap: 0.5rem;
  position: relative;
  height: 90px;
  background: #1e293b;
  border-radius: 8px;
  padding: 0.75rem;
  overflow: hidden;
}

.track-label {
  font-size: 0.85rem;
  color: #94a3b8;
  font-family: &#039;Inter&#039;, sans-serif;
}

.box {
  width: 44px;
  height: 44px;
  border-radius: 8px;
  display: flex;
  align-items: center;
  justify-content: center;
  font-weight: 800;
  font-family: &#039;Inter&#039;, sans-serif;
  font-size: 0.85rem;
}

/* 1. Animação Lenta: Força recálculo de Layout e Repaint a cada frame */
.box--slow {
  background: #ef4444;
  color: #ffffff;
  position: absolute;
  bottom: 10px;
  left: 10px;
  animation: move-cpu 3s ease-in-out infinite alternate;
}

@keyframes move-cpu {
  0% { left: 10px; }
  100% { left: calc(100% - 54px); }
}

/* 2. Animação Fluida: Processada inteiramente na GPU sem disparar Reflow */
.box--fast {
  background: #00f0ff;
  color: #090d16;
  position: absolute;
  bottom: 10px;
  left: 10px;
  will-change: transform;
  animation: move-gpu 3s ease-in-out infinite alternate;
}

@keyframes move-gpu {
  0% { transform: translateX(0); }
  100% { transform: translateX(calc(100% - 54px)); }
}</textarea>
        </div>
    </div>
    
<div class="wzw-playground-action-bar">
    <span class="wzw-playground-desc">🧪 <strong>Quer ver este código funcionando agora?</strong></span><br />
    <a href="https://webzoneware.com/web-academy/playground-web/" class="wzw-btn-playground" target="_blank" rel="noopener"> Abrir no Playground IDE &rarr;<br />
    </a>
</div>
<h2>7. Ferramentas Web-ZoneWare para o seu Setup de Performance</h2>
<p>
    Ao preparar folhas de estilo para produção, utilize as ferramentas dedicadas do portal Web-ZoneWare:
</p>
<ul>
<li><a href="https://webzoneware.com/web-ferramentas/css-beautify-minify/" target="_blank">Limpador e Minificador CSS</a>: Comprima folhas de estilo eliminando espaços, comentários e redundâncias com um único clique antes do deploy.</li>
<li><a href="https://webzoneware.com/web-ferramentas/cssvalidate/" target="_blank">Validador de CSS Online</a>: Detecte erros de sintaxe e propriedades obsoletas que sobrecarregam o analisador do navegador.</li>
<li><a href="https://webzoneware.com/web-academy/playground-web/" target="_blank">Playground Web IDE</a>: Ambiente em nuvem para inspecionar animações fluidas e verificar o comportamento de renderização em tempo real.</li>
</ul>
<h2>8. Links Oficiais de Autoridade</h2>
<ul>
<li><a href="https://web.dev/explore/fast" target="_blank" rel="noopener noreferrer">Google web.dev — Guia de Performance &#038; Métricas Web Vitals</a></li>
<li><a href="https://developer.mozilla.org/pt-BR/docs/Web/Performance/Critical_rendering_path" target="_blank" rel="noopener noreferrer">MDN Web Docs — Otimização do Caminho Crítico de Renderização</a></li>
<li><a href="https://web.dev/articles/content-visibility" target="_blank" rel="noopener noreferrer">Google web.dev — content-visibility: Acelerando o Tempo de Renderização</a></li>
<li><a href="https://www.w3.org/TR/css-contain-2/" target="_blank" rel="noopener noreferrer">W3C — CSS Containment Module Level 2</a></li>
</ul>
<h2>9. Exercício Prático da Lição 49</h2>
<ol>
<li>Abra o <strong>Playground Web IDE</strong> clicando no botão de ação da lição.</li>
<li>Crie um card com efeito de hover. Teste a diferença entre animar a propriedade <code>top: -10px</code> e a propriedade <code>transform: translateY(-10px)</code>.</li>
<li>Abra as ferramentas de desenvolvedor do navegador (tecla <code>F12</code>), acesse a aba <em>Rendering</em> e ative a opção <strong>Paint Flashing</strong> (Retângulos Verdes de Pintura).</li>
<li>Observe como o método com <code>top</code> acende retângulos verdes a cada milissegundo de animação (Repaint custoso), enquanto o método com <code>transform</code> se move de forma limpa na GPU sem causar repintura da tela.</li>
<li>Pegue o código CSS resultante e passe pela ferramenta <a href="https://webzoneware.com/web-ferramentas/css-beautify-minify/" target="_blank">Minificador CSS</a> para checar a taxa de compressão obtida.</li>
</ol>
<h2>10. Quiz de Fixação Interativo</h2>
<details class="wzw-quiz-card">
<summary><strong>1. Por que o CSS é considerado um recurso &#8220;Render-Blocking&#8221;?</strong></summary>
<div class="wzw-quiz-answer">
<p><strong>Resposta Correta:</strong> Porque o navegador bloqueia a pintura de qualquer elemento visual na tela até que todas as folhas de estilo externas vinculadas no <code>&lt;head&gt;</code> sejam baixadas e a árvore CSSOM seja totalmente construída.</p>
</p></div>
</details>
<details class="wzw-quiz-card">
<summary><strong>2. Qual é a principal vantagem de animar propriedades como transform e opacity em vez de top e width?</strong></summary>
<div class="wzw-quiz-answer">
<p><strong>Resposta Correta:</strong> <code>transform</code> e <code>opacity</code> não exigem recálculo de geometria (Layout/Reflow) nem repintura de pixels (Paint); suas alterações são processadas diretamente na GPU durante a etapa de Composição (Composite), garantindo animações lisas a 60 FPS.</p>
</p></div>
</details>
<details class="wzw-quiz-card">
<summary><strong>3. Para que serve a propriedade font-display: swap declarada dentro de @font-face?</strong></summary>
<div class="wzw-quiz-answer">
<p><strong>Resposta Correta:</strong> Evita o &#8220;Flash of Invisible Text&#8221; (FOIT), instruindo o navegador a exibir imediatamente o texto com uma fonte nativa do sistema operacional enquanto a web font personalizada está sendo baixada, trocando-a suavemente assim que a transferência for concluída.</p>
</p></div>
</details>
<p><!-- Marcação Estruturada Schema.org (JSON-LD) --><br />
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "TechArticle",
  "headline": "Performance e Otimização de CSS para Web Vitals",
  "description": "Otimize seu CSS para acelerar o carregamento, eliminar render-blocking e conquistar pontuação máxima no Core Web Vitals.",
  "url": "https://webzoneware.com/web-academy/css/performance-otimizacao-css-cleaner/",
  "inLanguage": "pt-BR",
  "isPartOf": {
    "@type": "Course",
    "name": "Curso de CSS & CSS3 Completo",
    "url": "https://webzoneware.com/web-academy/css/",
    "provider": {
      "@type": "Organization",
      "name": "Web-ZoneWare",
      "url": "https://webzoneware.com"
    }
  },
  "proficiencyLevel": "Advanced",
  "author": {
    "@type": "Organization",
    "name": "Web-ZoneWare Academy"
  }
}
</script></p>
<p>O post <a href="https://webzoneware.com/web-academy/curso-css/performance-otimizacao-css-cleaner/">Performance e Otimização de CSS na Web | Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://webzoneware.com/web-academy/curso-css/performance-otimizacao-css-cleaner/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Metodologia BEM e Arquitetura de CSS &#124; Web Academy</title>
		<link>https://webzoneware.com/web-academy/curso-css/metodologia-bem-arquitetura-css/</link>
					<comments>https://webzoneware.com/web-academy/curso-css/metodologia-bem-arquitetura-css/#respond</comments>
		
		<dc:creator><![CDATA[Web-Zoneware]]></dc:creator>
		<pubDate>Thu, 22 Oct 2026 04:38:53 +0000</pubDate>
				<category><![CDATA[Curso de CSS e CSS3]]></category>
		<category><![CDATA[arquitetura css]]></category>
		<category><![CDATA[boas praticas css]]></category>
		<category><![CDATA[design system]]></category>
		<category><![CDATA[especificidade css]]></category>
		<category><![CDATA[metodologia bem]]></category>
		<category><![CDATA[organizacao css]]></category>
		<category><![CDATA[web academy]]></category>
		<guid isPermaLink="false">https://webzoneware.com/?p=29475</guid>

					<description><![CDATA[<p>Conforme um projeto cresce de dezenas para milhares de linhas de código, o maior pesadelo de uma equipe é a manutenção do CSS: alterações feitas em um botão da página de contato quebram acidentalmente o cabeçalho do blog, seletores aninhados exigem dezenas de declarações !important e ninguém tem coragem de deletar regras antigas por medo [&#8230;]</p>
<p>O post <a href="https://webzoneware.com/web-academy/curso-css/metodologia-bem-arquitetura-css/">Metodologia BEM e Arquitetura de CSS | Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wzw-lesson-lead">
    Conforme um projeto cresce de dezenas para milhares de linhas de código, o maior pesadelo de uma equipe é a manutenção do CSS: alterações feitas em um botão da página de contato quebram acidentalmente o cabeçalho do blog, seletores aninhados exigem dezenas de declarações <code>!important</code> e ninguém tem coragem de deletar regras antigas por medo de efeitos colaterais. Para solucionar esse caos, foi concebida a <strong>Metodologia BEM</strong> (<em>Block, Element, Modifier</em>), uma convenção de nomenclatura e arquitetura que traz previsibilidade, modularidade e controle absoluto sobre a especificidade.
</p>
<div class="wzw-callout wzw-callout-info">
<div class="wzw-callout-icon">🏛️</div>
<div>
        <strong>Origem e Filosofia:</strong> Desenvolvida originalmente pelos engenheiros da Yandex para gerenciar portais com centenas de desenvolvedores trabalhando simultaneamente, o BEM parte de uma premissa elegante: <strong>cada pedaço da interface deve ser um componente independente, auto-documentado e imune a conflitos de cascata</strong>.
    </div>
</div>
<h2>1. A Anatomia do BEM: Bloco, Elemento e Modificador</h2>
<p>
    A sigla <strong>BEM</strong> divide a interface do usuário em três camadas conceituais estritas, refletidas diretamente no nome das classes CSS:
</p>
<div class="wzw-table-responsive">
<table class="wzw-table">
<thead>
<tr>
<th>Conceito</th>
<th>Sintaxe de Classe</th>
<th>Definição &#038; Papel na Interface</th>
<th>Exemplos Reais</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Bloco (Block)</strong></td>
<td><code>.bloco</code></td>
<td>Entidade visual autônoma que faz sentido por si só. Pode ser movida para qualquer lugar da página sem quebrar.</td>
<td><code>.card</code>, <code>.btn</code>, <code>.navbar</code>, <code>.modal</code></td>
</tr>
<tr>
<td><strong>Elemento (Element)</strong></td>
<td><code>.bloco__elemento</code></td>
<td>Parte constituinte do bloco. Não faz sentido de forma isolada fora do contexto do seu bloco pai. Ligado por <strong>dois sublinhados (<code>__</code>)</strong>.</td>
<td><code>.card__title</code>, <code>.card__image</code>, <code>.navbar__link</code></td>
</tr>
<tr>
<td><strong>Modificador (Modifier)</strong></td>
<td><code>.bloco--modificador</code> ou <code>.bloco__elem--mod</code></td>
<td>Uma bandeira de variação visual ou estado. Altera aparência, tema ou comportamento. Ligado por <strong>dois hifens (<code>--</code>)</strong>.</td>
<td><code>.btn--primary</code>, <code>.btn--large</code>, <code>.card--featured</code></td>
</tr>
</tbody>
</table>
</div>
<h2>2. Por que o BEM é Tão Eficiente na Prática?</h2>
<h3>A. Especificidade Plana (Single-Class Specificity)</h3>
<p>
    No CSS desorganizado tradicional, seletores aninhados profundos criam uma barreira de especificidade intransponível:
</p>
    <div class="wzw-ide-card" id="wzw-code-12797" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">9 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-12797', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-12797', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">/* CSS Tradicional (Pesadelo de Especificidade: 0-3-1) */</span></span>
<span class="wzw-code-line"><span class="wzw-tk-comment">#sidebar div.container ul.menu li a {</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#38bdf8</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">/* Com a Metodologia BEM (Especificidade Plana: 0-1-0) */</span></span>
<span class="wzw-code-line">.menu__link {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#38bdf8</span>;</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* CSS Tradicional (Pesadelo de Especificidade: 0-3-1) */
#sidebar div.container ul.menu li a {
  color: #38bdf8;
}

/* Com a Metodologia BEM (Especificidade Plana: 0-1-0) */
.menu__link {
  color: #38bdf8;
}</textarea>
        </div>
    </div>
    
<p>
    Ao manter todos os seletores com peso de classe única <code>(0, 1, 0)</code>, qualquer modificador subsequente (como <code>.menu__link--active</code>) consegue sobrescrever propriedades sem esforço e sem necessidade de recorrer a <code>!important</code>.
</p>
<h3>B. Auto-documentação no HTML</h3>
<p>
    Ao bater o olho em um trecho de HTML estruturado com BEM, você compreende imediatamente a hierarquia e o propósito de cada tag sem precisar abrir a folha de estilos:
</p>
    <div class="wzw-ide-card" id="wzw-code-63451" data-lang="html">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">HTML5</span>
                                <span class="wzw-ide-lines-count">9 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-63451', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-63451', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">&lt;!-- Estrutura Clara e Auto-explicativa com BEM --&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;article</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;card card--featured&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;img</span> <span class="wzw-tk-attr">src</span>=<span class="wzw-tk-str">&quot;capa.webp&quot;</span> <span class="wzw-tk-attr">alt</span>=<span class="wzw-tk-str">&quot;Curso&quot;</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;card__thumbnail&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;card__content&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;h3</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;card__title&quot;</span><span class="wzw-tk-tag">&gt;</span>CSS3 Profissional<span class="wzw-tk-tag">&lt;/h3&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;p</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;card__excerpt&quot;</span><span class="wzw-tk-tag">&gt;</span>Domine a estilização moderna de interfaces.<span class="wzw-tk-tag">&lt;/p&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;a</span> <span class="wzw-tk-attr">href</span>=<span class="wzw-tk-str">&quot;#&quot;</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;btn btn--primary btn--large&quot;</span><span class="wzw-tk-tag">&gt;</span>Acessar Aula<span class="wzw-tk-tag">&lt;/a&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;/article&gt;</span></span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>&lt;!-- Estrutura Clara e Auto-explicativa com BEM --&gt;
&lt;article class=&quot;card card--featured&quot;&gt;
  &lt;img src=&quot;capa.webp&quot; alt=&quot;Curso&quot; class=&quot;card__thumbnail&quot;&gt;
  &lt;div class=&quot;card__content&quot;&gt;
    &lt;h3 class=&quot;card__title&quot;&gt;CSS3 Profissional&lt;/h3&gt;
    &lt;p class=&quot;card__excerpt&quot;&gt;Domine a estilização moderna de interfaces.&lt;/p&gt;
    &lt;a href=&quot;#&quot; class=&quot;btn btn--primary btn--large&quot;&gt;Acessar Aula&lt;/a&gt;
  &lt;/div&gt;
&lt;/article&gt;</textarea>
        </div>
    </div>
    
<h2>3. Os 3 Erros Mais Comuns com BEM (e Como Evitá-los)</h2>
<div class="wzw-callout wzw-callout-pro">
<div class="wzw-callout-icon">⚠️</div>
<div>
        <strong>Erro 1: O &#8220;Grandchildren Trap&#8221; (Aninhamento Infinito de Elementos)</strong><br />
        <br /><strong>Errado:</strong> <code>.card__header__title__link</code> ❌<br />
        <br /><strong>Correto:</strong> <code>.card__title-link</code> ou apenas <code>.card__link</code> ✔️<br />
        <br /><em>Regra de ouro:</em> Elementos BEM pertencem sempre ao <strong>Bloco raiz</strong>, independentemente de quão profundos estejam no DOM. Jamais use <code>__</code> duplo em série!
    </div>
</div>
<p><strong>Erro 2: Vincular Nomes a Tags HTML em vez de Funções:</strong></p>
<p>Evite classes como <code>.card__h3</code> ou <code>.menu__li</code>. Se a hierarquia de títulos mudar para um <code>&lt;h4&gt;</code> por motivos de SEO, o nome da classe ficará incoerente. Prefira sempre nomes funcionais: <code>.card__heading</code>, <code>.menu__item</code>.</p>
<p><strong>Erro 3: Misturar Margens de Layout Externo no Próprio Bloco:</strong></p>
<p>Um bloco deve ser reutilizável. Se você declarar <code>margin: 40px auto;</code> diretamente em <code>.btn</code> ou <code>.card</code>, esse componente não poderá ser reaproveitado em uma barra lateral apertada. Deixe que o contêiner pai gerencie o posicionamento ou utilize utilitários de espaçamento.</p>
<h2>4. Laboratório Prático: Componente de Produto Modular com BEM</h2>
<p>
    Observe abaixo um componente de produto construído integralmente com a metodologia BEM, incluindo o bloco principal, elementos internos e modificadores de destaque:
</p>
    <div class="wzw-ide-card" id="wzw-code-26209" data-lang="html">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">HTML5</span>
                                <span class="wzw-ide-lines-count">17 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-26209', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-26209', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;catalog-grid&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">&lt;!-- Card Normal --&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;product-card&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;product-card__badge&quot;</span><span class="wzw-tk-tag">&gt;</span>Novo<span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;h3</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;product-card__title&quot;</span><span class="wzw-tk-tag">&gt;</span>Teclado Mecânico RGB<span class="wzw-tk-tag">&lt;/h3&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;p</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;product-card__price&quot;</span><span class="wzw-tk-tag">&gt;</span>R$ 299,00<span class="wzw-tk-tag">&lt;/p&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;button</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;btn btn--secondary&quot;</span><span class="wzw-tk-tag">&gt;</span>Ver Detalhes<span class="wzw-tk-tag">&lt;/button&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">&lt;!-- Card com Modificador de Destaque --&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;product-card product-card--featured&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;product-card__badge product-card__badge--glow&quot;</span><span class="wzw-tk-tag">&gt;</span>Mais Vendido<span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;h3</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;product-card__title&quot;</span><span class="wzw-tk-tag">&gt;</span>Monitor Gamer 144Hz<span class="wzw-tk-tag">&lt;/h3&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;p</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;product-card__price&quot;</span><span class="wzw-tk-tag">&gt;</span>R$ 1.199,00<span class="wzw-tk-tag">&lt;/p&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;button</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;btn btn--primary btn--pulse&quot;</span><span class="wzw-tk-tag">&gt;</span>Comprar Agora<span class="wzw-tk-tag">&lt;/button&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;/div&gt;</span></span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>&lt;div class=&quot;catalog-grid&quot;&gt;
  &lt;!-- Card Normal --&gt;
  &lt;div class=&quot;product-card&quot;&gt;
    &lt;div class=&quot;product-card__badge&quot;&gt;Novo&lt;/div&gt;
    &lt;h3 class=&quot;product-card__title&quot;&gt;Teclado Mecânico RGB&lt;/h3&gt;
    &lt;p class=&quot;product-card__price&quot;&gt;R$ 299,00&lt;/p&gt;
    &lt;button class=&quot;btn btn--secondary&quot;&gt;Ver Detalhes&lt;/button&gt;
  &lt;/div&gt;

  &lt;!-- Card com Modificador de Destaque --&gt;
  &lt;div class=&quot;product-card product-card--featured&quot;&gt;
    &lt;div class=&quot;product-card__badge product-card__badge--glow&quot;&gt;Mais Vendido&lt;/div&gt;
    &lt;h3 class=&quot;product-card__title&quot;&gt;Monitor Gamer 144Hz&lt;/h3&gt;
    &lt;p class=&quot;product-card__price&quot;&gt;R$ 1.199,00&lt;/p&gt;
    &lt;button class=&quot;btn btn--primary btn--pulse&quot;&gt;Comprar Agora&lt;/button&gt;
  &lt;/div&gt;
&lt;/div&gt;</textarea>
        </div>
    </div>
    
    <div class="wzw-ide-card" id="wzw-code-20027" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">109 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-20027', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-20027', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line">/* ==========================================================</span>
<span class="wzw-code-line">   BLOCO 1: .product-card</span>
<span class="wzw-code-line">   ========================================================== */</span>
<span class="wzw-code-line">.product-card {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">display</span>: flex;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">flex-direction</span>: column;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: <span class="wzw-tk-num">#1e293b</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border</span>: <span class="wzw-tk-num">1px</span> solid <span class="wzw-tk-num">#334155</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-radius</span>: <span class="wzw-tk-num">12px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">1.5rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transition</span>: transform <span class="wzw-tk-num">0.2s</span> ease, border-color <span class="wzw-tk-num">0.2s</span> ease;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.product-card<span class="wzw-tk-kw">:hover</span> {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transform</span>: translateY(-<span class="wzw-tk-num">4px</span>);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-color</span>: <span class="wzw-tk-num">#475569</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">/* Elementos do Bloco product-card */</span></span>
<span class="wzw-code-line">.product-card__badge {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">align-self</span>: flex-start;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: <span class="wzw-tk-num">#334155</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#f8fafc</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-size</span>: <span class="wzw-tk-num">0.75rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-weight</span>: 700;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">3px</span> <span class="wzw-tk-num">10px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-radius</span>: <span class="wzw-tk-num">20px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">margin-bottom</span>: <span class="wzw-tk-num">0.75rem</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.product-card__title {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#f8fafc</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-size</span>: <span class="wzw-tk-num">1.25rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-weight</span>: 700;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">margin</span>: 0 0 <span class="wzw-tk-num">0.5rem</span> 0;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.product-card__price {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#38bdf8</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-size</span>: <span class="wzw-tk-num">1.5rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-weight</span>: 800;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">margin</span>: 0 0 <span class="wzw-tk-num">1.25rem</span> 0;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">/* Modificadores do Bloco product-card */</span></span>
<span class="wzw-code-line">.product-card--featured {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-color</span>: <span class="wzw-tk-num">#00f0ff</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: linear-gradient(<span class="wzw-tk-num">145deg</span>, rgba(0, 240, 255, 0.08), <span class="wzw-tk-num">#1e293b</span>);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">box-shadow</span>: 0 <span class="wzw-tk-num">10px</span> <span class="wzw-tk-num">25px</span> rgba(0, 240, 255, 0.15);</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.product-card__badge--glow {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: <span class="wzw-tk-num">#00f0ff</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#090d16</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">/* ==========================================================</span>
<span class="wzw-code-line">   BLOCO 2: .btn (Bloco Autônomo e Reutilizável)</span>
<span class="wzw-code-line">   ========================================================== */</span>
<span class="wzw-code-line">.btn {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">display</span>: inline-flex;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">align-items</span>: center;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">justify-content</span>: center;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">0.75rem</span> <span class="wzw-tk-num">1.25rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-family</span>: inherit;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-size</span>: <span class="wzw-tk-num">0.95rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-weight</span>: 700;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-radius</span>: <span class="wzw-tk-num">8px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border</span>: none;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">cursor</span>: pointer;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transition</span>: all <span class="wzw-tk-num">0.2s</span> ease;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">text-decoration</span>: none;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">/* Modificadores do Bloco btn */</span></span>
<span class="wzw-code-line">.btn--primary {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: <span class="wzw-tk-num">#00f0ff</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#090d16</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.btn--primary<span class="wzw-tk-kw">:hover</span> {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">filter</span>: brightness(1.15);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">box-shadow</span>: 0 0 <span class="wzw-tk-num">15px</span> rgba(0, 240, 255, 0.4);</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.btn--secondary {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: <span class="wzw-tk-num">#334155</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#f8fafc</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.btn--secondary<span class="wzw-tk-kw">:hover</span> {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: <span class="wzw-tk-num">#475569</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.btn--pulse {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">animation</span>: pulse-action <span class="wzw-tk-num">2s</span> infinite;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-kw">@keyframes</span> pulse-action {</span>
<span class="wzw-code-line">  0%, 100% { transform: scale(1); }</span>
<span class="wzw-code-line">  50% { transform: scale(1.02); }</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">/* Grid Organizador de Demonstração */</span></span>
<span class="wzw-code-line">.catalog-grid {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">display</span>: grid;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">grid-template-columns</span>: repeat(auto-fit, minmax(<span class="wzw-tk-num">240px</span>, <span class="wzw-tk-num">1fr</span>));</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">gap</span>: <span class="wzw-tk-num">1.5rem</span>;</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* ==========================================================
   BLOCO 1: .product-card
   ========================================================== */
.product-card {
  display: flex;
  flex-direction: column;
  background: #1e293b;
  border: 1px solid #334155;
  border-radius: 12px;
  padding: 1.5rem;
  transition: transform 0.2s ease, border-color 0.2s ease;
}

.product-card:hover {
  transform: translateY(-4px);
  border-color: #475569;
}

/* Elementos do Bloco product-card */
.product-card__badge {
  align-self: flex-start;
  background: #334155;
  color: #f8fafc;
  font-size: 0.75rem;
  font-weight: 700;
  padding: 3px 10px;
  border-radius: 20px;
  margin-bottom: 0.75rem;
}

.product-card__title {
  color: #f8fafc;
  font-size: 1.25rem;
  font-weight: 700;
  margin: 0 0 0.5rem 0;
}

.product-card__price {
  color: #38bdf8;
  font-size: 1.5rem;
  font-weight: 800;
  margin: 0 0 1.25rem 0;
}

/* Modificadores do Bloco product-card */
.product-card--featured {
  border-color: #00f0ff;
  background: linear-gradient(145deg, rgba(0, 240, 255, 0.08), #1e293b);
  box-shadow: 0 10px 25px rgba(0, 240, 255, 0.15);
}

.product-card__badge--glow {
  background: #00f0ff;
  color: #090d16;
}

/* ==========================================================
   BLOCO 2: .btn (Bloco Autônomo e Reutilizável)
   ========================================================== */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 0.75rem 1.25rem;
  font-family: inherit;
  font-size: 0.95rem;
  font-weight: 700;
  border-radius: 8px;
  border: none;
  cursor: pointer;
  transition: all 0.2s ease;
  text-decoration: none;
}

/* Modificadores do Bloco btn */
.btn--primary {
  background: #00f0ff;
  color: #090d16;
}

.btn--primary:hover {
  filter: brightness(1.15);
  box-shadow: 0 0 15px rgba(0, 240, 255, 0.4);
}

.btn--secondary {
  background: #334155;
  color: #f8fafc;
}

.btn--secondary:hover {
  background: #475569;
}

.btn--pulse {
  animation: pulse-action 2s infinite;
}

@keyframes pulse-action {
  0%, 100% { transform: scale(1); }
  50% { transform: scale(1.02); }
}

/* Grid Organizador de Demonstração */
.catalog-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
  gap: 1.5rem;
}</textarea>
        </div>
    </div>
    
<div class="wzw-playground-action-bar">
    <span class="wzw-playground-desc">🧪 <strong>Quer ver este código funcionando agora?</strong></span><br />
    <a href="https://webzoneware.com/web-academy/playground-web/" class="wzw-btn-playground" target="_blank" rel="noopener"><br />
        Abrir no Playground IDE &rarr;<br />
    </a>
</div>
<h2>5. Ferramentas Web-ZoneWare para o seu Fluxo de Trabalho</h2>
<p>
    Ao adotar BEM em seus projetos, mantenha a legibilidade e a qualidade do código com as ferramentas oficiais da suíte Web-ZoneWare:
</p>
<ul>
<li><a href="https://webzoneware.com/web-ferramentas/css-beautify-minify/" target="_blank">Limpador e Formatador CSS</a>: Padronize a indentação das classes BEM e agrupe elementos com organização visual sênior.</li>
<li><a href="https://webzoneware.com/web-ferramentas/cssvalidate/" target="_blank">Validador de CSS Online</a>: Assegure que seletores e valores de propriedades estejam 100% de acordo com as normas da W3C.</li>
<li><a href="https://webzoneware.com/web-academy/playground-web/" target="_blank">Playground Web IDE</a>: Ambiente online para testar a combinação de blocos e modificadores BEM em tempo real.</li>
</ul>
<h2>6. Links Oficiais de Autoridade</h2>
<ul>
<li><a href="https://getbem.com/" target="_blank" rel="noopener noreferrer">Get BEM — Guia Oficial da Metodologia BEM</a></li>
<li><a href="https://developer.mozilla.org/pt-BR/docs/Learn/CSS/Building_blocks/Organizing" target="_blank" rel="noopener noreferrer">MDN Web Docs — Organizando o seu CSS</a></li>
<li><a href="https://css-tricks.com/bem-101/" target="_blank" rel="noopener noreferrer">CSS-Tricks — BEM 101: Arquitetura e Exemplos Práticos</a></li>
<li><a href="https://web.dev/learn/css/organizing" target="_blank" rel="noopener noreferrer">Google web.dev — Organização e Arquitetura de CSS</a></li>
</ul>
<h2>7. Exercício Prático da Lição 48</h2>
<ol>
<li>Abra o <strong>Playground Web IDE</strong> clicando no botão de ação da lição.</li>
<li>Crie um componente de Alerta de Notificação seguindo o padrão BEM: Bloco <code>.alert</code>, Elemento <code>.alert__text</code> e Elemento <code>.alert__close-btn</code>.</li>
<li>Crie três modificadores de status: <code>.alert--success</code> (fundo verde), <code>.alert--warning</code> (fundo amarelo) e <code>.alert--danger</code> (fundo vermelho).</li>
<li>Certifique-se de que nenhum seletor CSS utilize aninhamento profundo ou IDs, mantendo a especificidade plana de classe única.</li>
<li>Passe sua folha de estilos pelo <a href="https://webzoneware.com/web-ferramentas/css-beautify-minify/" target="_blank">Limpador e Formatador CSS</a> para garantir indentação impecável.</li>
</ol>
<h2>8. Quiz de Fixação Interativo</h2>
<details class="wzw-quiz-card">
<summary><strong>1. O que representam os sublinhados duplos (__) e os hifens duplos (&#8211;) na convenção BEM?</strong></summary>
<div class="wzw-quiz-answer">
<p><strong>Resposta Correta:</strong> Os sublinhados duplos (<code>__</code>) indicam um <strong>Elemento</strong> que pertence ao Bloco (ex: <code>.card__title</code>). Os hifens duplos (<code>--</code>) indicam um <strong>Modificador</strong> de estado ou aparência (ex: <code>.card--featured</code>).</p>
</p></div>
</details>
<details class="wzw-quiz-card">
<summary><strong>2. Por que o seletor .card__header__title__link é considerado uma má prática no BEM?</strong></summary>
<div class="wzw-quiz-answer">
<p><strong>Resposta Correta:</strong> Porque cria um acoplamento desnecessário à estrutura do DOM (conhecido como &#8220;Grandchildren Trap&#8221;). No BEM, os elementos devem pertencer sempre ao Bloco raiz (<code>.card__link</code> ou <code>.card__title-link</code>), sem encadear múltiplos <code>__</code> em série.</p>
</p></div>
</details>
<details class="wzw-quiz-card">
<summary><strong>3. Qual é o principal benefício da especificidade plana alcançada pelo BEM?</strong></summary>
<div class="wzw-quiz-answer">
<p><strong>Resposta Correta:</strong> Como quase todas as regras utilizam seletores de classe única <code>(0, 1, 0)</code>, não há &#8220;guerras de especificidade&#8221; na cascata. Qualquer modificador ou variação pode ser aplicado sem quebrar o layout e sem recorrer ao <code>!important</code>.</p>
</p></div>
</details>
<p><!-- Marcação Estruturada Schema.org (JSON-LD) --><br />
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "TechArticle",
  "headline": "Metodologia BEM & Arquitetura de CSS Escalável",
  "description": "Aprenda a metodologia BEM (Bloco, Elemento, Modificador) para organizar seu CSS sem conflitos de cascata e especificidade.",
  "url": "https://webzoneware.com/web-academy/css/metodologia-bem-arquitetura-css/",
  "inLanguage": "pt-BR",
  "isPartOf": {
    "@type": "Course",
    "name": "Curso de CSS & CSS3 Completo",
    "url": "https://webzoneware.com/web-academy/css/",
    "provider": {
      "@type": "Organization",
      "name": "Web-ZoneWare",
      "url": "https://webzoneware.com"
    }
  },
  "proficiencyLevel": "Intermediate",
  "author": {
    "@type": "Organization",
    "name": "Web-ZoneWare Academy"
  }
}
</script></p>
<p>O post <a href="https://webzoneware.com/web-academy/curso-css/metodologia-bem-arquitetura-css/">Metodologia BEM e Arquitetura de CSS | Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://webzoneware.com/web-academy/curso-css/metodologia-bem-arquitetura-css/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Seletores :has, :is, :where e @container — Web Academy</title>
		<link>https://webzoneware.com/web-academy/curso-css/seletores-modernos-is-where-has-container-queries/</link>
					<comments>https://webzoneware.com/web-academy/curso-css/seletores-modernos-is-where-has-container-queries/#respond</comments>
		
		<dc:creator><![CDATA[Web-Zoneware]]></dc:creator>
		<pubDate>Thu, 22 Oct 2026 04:11:43 +0000</pubDate>
				<category><![CDATA[Curso de CSS e CSS3]]></category>
		<category><![CDATA[container queries]]></category>
		<category><![CDATA[css has]]></category>
		<category><![CDATA[css is]]></category>
		<category><![CDATA[css where]]></category>
		<category><![CDATA[design modular]]></category>
		<category><![CDATA[especificidade css]]></category>
		<category><![CDATA[seletores modernos]]></category>
		<guid isPermaLink="false">https://webzoneware.com/?p=29473</guid>

					<description><![CDATA[<p>Durante mais de duas décadas, os desenvolvedores web enfrentaram limitações estruturais severas: era impossível estilizar um elemento pai com base no que existia dentro dele, criar regras agrupadas inflacionava a especificidade desnecessariamente e as Media Queries enxergavam apenas a tela inteira, ignorando o espaço real de cada componente. As especificações modernas do CSS transformaram esse [&#8230;]</p>
<p>O post <a href="https://webzoneware.com/web-academy/curso-css/seletores-modernos-is-where-has-container-queries/">Seletores :has, :is, :where e @container — Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wzw-lesson-lead">
    Durante mais de duas décadas, os desenvolvedores web enfrentaram limitações estruturais severas: era impossível estilizar um elemento pai com base no que existia dentro dele, criar regras agrupadas inflacionava a especificidade desnecessariamente e as Media Queries enxergavam apenas a tela inteira, ignorando o espaço real de cada componente. As especificações modernas do CSS transformaram esse cenário com quatro ferramentas definitivas: as pseudo-classes funcionais <code>:is()</code>, <code>:where()</code>, o aguardado &#8220;seletor de pai&#8221; <code>:has()</code> e as <strong>Container Queries</strong> (<code>@container</code>).
</p>
<div class="wzw-callout wzw-callout-info">
<div class="wzw-callout-icon">💡</div>
<div>
        <strong>A Virada de Paradigma:</strong> O CSS moderno deixou de ser apenas uma camada de pintura estática ligada ao monitor para se transformar em um motor de <strong>arquitetura de componentes modulares</strong>, capaz de reagir à estrutura interna do HTML e às dimensões do seu próprio contêiner sem nenhuma linha de JavaScript.
    </div>
</div>
<h2>1. :is() — Agrupamento Limpo com Tolerância a Falhas</h2>
<p>
    A pseudo-classe funcional <code>:is()</code> recebe uma lista de seletores separados por vírgula e casa com qualquer elemento que satisfaça um dos itens listados, eliminando repetições exaustivas de código.
</p>
<h3>O Fim da Redundância de Seletores</h3>
<p>No CSS tradicional, aplicar um mesmo estilo a links em diferentes seções exigia uma cadeia longa e repetitiva:</p>
    <div class="wzw-ide-card" id="wzw-code-76501" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">14 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-76501', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-76501', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">/* Forma legada repetitiva */</span></span>
<span class="wzw-code-line">header a<span class="wzw-tk-kw">:hover</span>,</span>
<span class="wzw-code-line">nav a<span class="wzw-tk-kw">:hover</span>,</span>
<span class="wzw-code-line">aside a<span class="wzw-tk-kw">:hover</span>,</span>
<span class="wzw-code-line">footer a<span class="wzw-tk-kw">:hover</span> {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#00f0ff</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">text-decoration</span>: underline;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">/* Forma moderna e concisa com :is() */</span></span>
<span class="wzw-code-line">:is(header, nav, aside, footer) a<span class="wzw-tk-kw">:hover</span> {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#00f0ff</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">text-decoration</span>: underline;</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* Forma legada repetitiva */
header a:hover,
nav a:hover,
aside a:hover,
footer a:hover {
  color: #00f0ff;
  text-decoration: underline;
}

/* Forma moderna e concisa com :is() */
:is(header, nav, aside, footer) a:hover {
  color: #00f0ff;
  text-decoration: underline;
}</textarea>
        </div>
    </div>
    
<h3>Processamento Tolerante a Erros (Forgiving Selector Parsing)</h3>
<p>
    Em uma lista tradicional como <code>header a, :seletor-desconhecido a, footer a</code>, se o navegador não reconhecer um dos seletores, ele <strong>invalida a regra inteira</strong>. Já com <code>:is()</code>, o motor do navegador apenas descarta o seletor desconhecido e continua aplicando o estilo a todos os outros seletores válidos da lista.
</p>
<div class="wzw-callout wzw-callout-pro">
<div class="wzw-callout-icon">⚡</div>
<div>
        <strong>Atenção à Especificidade do :is():</strong> O <code>:is()</code> adota a especificidade do <strong>seletor mais específico presente na lista</strong>. Se a lista contiver um ID (ex: <code>:is(section, article, #destaque) p</code>), toda a regra terá peso de ID <code>(1, 0, 1)</code>, mesmo quando aplicada a uma simples <code>section</code>!
    </div>
</div>
<h2>2. :where() — O Seletor de Especificidade Zero (0-0-0)</h2>
<p>
    O <code>:where()</code> possui a mesma sintaxe e o mesmo comportamento tolerante a falhas do <code>:is()</code>, mas com uma característica arquitetural única: <strong>sua especificidade é SEMPRE ZERO (0-0-0)</strong>.
</p>
    <div class="wzw-ide-card" id="wzw-code-71654" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">5 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-71654', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-71654', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">/* Especificidade total calculada: 0-0-0 */</span></span>
<span class="wzw-code-line">:where(header, nav, aside, footer) a {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#94a3b8</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">text-decoration</span>: none;</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* Especificidade total calculada: 0-0-0 */
:where(header, nav, aside, footer) a {
  color: #94a3b8;
  text-decoration: none;
}</textarea>
        </div>
    </div>
    
<p>
    Por ter peso zero, qualquer regra declarada posteriormente por um desenvolvedor — até mesmo uma tag simples como <code>a { color: #38bdf8; }</code> — sobrescreverá esse estilo com facilidade, tornando o <code>:where()</code> a ferramenta definitiva para folhas de estilo base, Resets e bibliotecas de Design System.
</p>
<div class="wzw-table-responsive">
<table class="wzw-table">
<thead>
<tr>
<th>Característica</th>
<th>Pseudo-classe :is()</th>
<th>Pseudo-classe :where()</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Sintaxe de Lista</strong></td>
<td><code>:is(sel1, sel2, ...)</code></td>
<td><code>:where(sel1, sel2, ...)</code></td>
</tr>
<tr>
<td><strong>Parsing Tolerante (Forgiving)</strong></td>
<td>Sim (ignora seletores inválidos)</td>
<td>Sim (ignora seletores inválidos)</td>
</tr>
<tr>
<td><strong>Cálculo de Especificidade</strong></td>
<td>Herda a do argumento mais específico da lista</td>
<td><strong>Sempre Zero absoluto (0, 0, 0)</strong></td>
</tr>
<tr>
<td><strong>Principal Aplicação</strong></td>
<td>Encurtar regras de produção no dia a dia</td>
<td>CSS Resets, normalize e componentes de base</td>
</tr>
</tbody>
</table>
</div>
<h2>3. :has() — A Pseudo-classe Relacional (O Seletor de Pai)</h2>
<p>
    Historicamente conhecido como o &#8220;Santo Graal&#8221; do desenvolvimento web, o <code>:has()</code> é uma pseudo-classe relacional que avalia condições baseadas em elementos descendentes ou irmãos subsequentes, permitindo finalmente estilizar um elemento ancestral direto ou indireto.
</p>
    <div class="wzw-ide-card" id="wzw-code-34100" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">4 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-34100', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-34100', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">/* Sintaxe Geral: estiliza o ALVO se a CONDIÇÃO for verdadeira */</span></span>
<span class="wzw-code-line"><span class="wzw-tk-attr">alvo</span>:has(condicao) {</span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">/* propriedades aplicadas ao alvo */</span></span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* Sintaxe Geral: estiliza o ALVO se a CONDIÇÃO for verdadeira */
alvo:has(condicao) {
  /* propriedades aplicadas ao alvo */
}</textarea>
        </div>
    </div>
    
<h3>Casos de Uso Reais do :has()</h3>
<h4>A. Card que Reage à Presença de Mídia</h4>
<p>Se o card contiver uma tag <code>&lt;img&gt;</code>, ele assume automaticamente um layout em grid de duas colunas; se não tiver imagem, mantém coluna única:</p>
    <div class="wzw-ide-card" id="wzw-code-14183" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">12 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-14183', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-14183', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">/* Layout padrão em 1 coluna */</span></span>
<span class="wzw-code-line">.article-card {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">display</span>: flex;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">flex-direction</span>: column;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">/* Se possuir uma imagem interna, muda para 2 colunas */</span></span>
<span class="wzw-code-line">.article-card:has(img) {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">display</span>: grid;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">grid-template-columns</span>: <span class="wzw-tk-num">140px</span> <span class="wzw-tk-num">1fr</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">gap</span>: <span class="wzw-tk-num">1rem</span>;</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* Layout padrão em 1 coluna */
.article-card {
  display: flex;
  flex-direction: column;
}

/* Se possuir uma imagem interna, muda para 2 colunas */
.article-card:has(img) {
  display: grid;
  grid-template-columns: 140px 1fr;
  gap: 1rem;
}</textarea>
        </div>
    </div>
    
<h4>B. Validação Visual de Formulário sem JavaScript</h4>
<p>O contêiner do formulário pode alterar sua borda e sombra se qualquer campo obrigatório estiver inválido:</p>
    <div class="wzw-ide-card" id="wzw-code-19242" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">5 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-19242', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-19242', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">/* Borda de aviso no formulário inteiro quando houver campos inválidos preenchidos */</span></span>
<span class="wzw-code-line">.form-box:has(input:invalid:not(:placeholder-shown)) {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-color</span>: <span class="wzw-tk-num">#ef4444</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">box-shadow</span>: 0 0 <span class="wzw-tk-num">15px</span> rgba(239, 68, 68, 0.2);</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* Borda de aviso no formulário inteiro quando houver campos inválidos preenchidos */
.form-box:has(input:invalid:not(:placeholder-shown)) {
  border-color: #ef4444;
  box-shadow: 0 0 15px rgba(239, 68, 68, 0.2);
}</textarea>
        </div>
    </div>
    
<h4>C. Cartões de Seleção Ativos (Radio/Checkbox)</h4>
<p>Ao selecionar um botão de opção, o cartão pai inteiro se ilumina:</p>
    <div class="wzw-ide-card" id="wzw-code-61526" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">6 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-61526', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-61526', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">/* Destaca o card pai cujo input interno estiver checado */</span></span>
<span class="wzw-code-line">.pricing-card:has(input[type=<span class="wzw-tk-str">&quot;radio&quot;</span>]:checked) {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-color</span>: <span class="wzw-tk-num">#00f0ff</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: rgba(0, 240, 255, 0.05);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">box-shadow</span>: 0 <span class="wzw-tk-num">10px</span> <span class="wzw-tk-num">25px</span> rgba(0, 240, 255, 0.2);</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* Destaca o card pai cujo input interno estiver checado */
.pricing-card:has(input[type=&quot;radio&quot;]:checked) {
  border-color: #00f0ff;
  background: rgba(0, 240, 255, 0.05);
  box-shadow: 0 10px 25px rgba(0, 240, 255, 0.2);
}</textarea>
        </div>
    </div>
    
<h4>D. Efeito de Foco Contextual na Lista (Dimming de Irmãos)</h4>
<p>Reduz a opacidade de todos os itens da lista, exceto o item que está sob o ponteiro do mouse:</p>
    <div class="wzw-ide-card" id="wzw-code-12162" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">5 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-12162', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-12162', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">/* Quando a lista tem algum li sob hover, esmaece os demais */</span></span>
<span class="wzw-code-line">.feature-list:has(li<span class="wzw-tk-kw">:hover</span>) li:not(<span class="wzw-tk-kw">:hover</span>) {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">opacity</span>: 0.35;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transform</span>: scale(0.98);</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* Quando a lista tem algum li sob hover, esmaece os demais */
.feature-list:has(li:hover) li:not(:hover) {
  opacity: 0.35;
  transform: scale(0.98);
}</textarea>
        </div>
    </div>
    
<h2>4. @container (Container Queries): Além da Janela do Navegador</h2>
<p>
    Enquanto as Media Queries clássicas (<code>@media</code>) observam unicamente o tamanho da janela global (Viewport), as <strong>Container Queries</strong> (<code>@container</code>) permitem que um componente consulte a largura do elemento pai direto onde foi inserido.
</p>
<p>
    Isso significa que o mesmo card pode ser posicionado dentro de uma sidebar estreita de 280px ou no meio da página de 900px e se adaptar perfeitamente em ambos os cenários sem precisar de classes auxiliares no HTML.
</p>
<h3>Como Implementar Container Queries em 2 Etapas</h3>
<p><strong>1. Definir o Contêiner de Contexto no Elemento Pai:</strong></p>
    <div class="wzw-ide-card" id="wzw-code-10880" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">5 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-10880', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-10880', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line">.card-slot {</span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">/* Define que este elemento responderá a consultas dimensionais */</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">container-type</span>: inline-size;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">container-name</span>: cardzone; /* Nome opcional para escopo direcionado */</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>.card-slot {
  /* Define que este elemento responderá a consultas dimensionais */
  container-type: inline-size;
  container-name: cardzone; /* Nome opcional para escopo direcionado */
}</textarea>
        </div>
    </div>
    
<p><strong>2. Escrever a Consulta @container no Componente Filho:</strong></p>
    <div class="wzw-ide-card" id="wzw-code-51349" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">15 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-51349', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-51349', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">/* Estilo base: Vertical para contêineres estreitos */</span></span>
<span class="wzw-code-line">.product-card {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">display</span>: flex;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">flex-direction</span>: column;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">1rem</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">/* Quando o contêiner cardzone tiver 450px ou mais */</span></span>
<span class="wzw-code-line"><span class="wzw-tk-kw">@container</span> cardzone (min-width: <span class="wzw-tk-num">450px</span>) {</span>
<span class="wzw-code-line">  .product-card {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">flex-direction</span>: row;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">align-items</span>: center;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">1.5rem</span>;</span>
<span class="wzw-code-line">  }</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* Estilo base: Vertical para contêineres estreitos */
.product-card {
  display: flex;
  flex-direction: column;
  padding: 1rem;
}

/* Quando o contêiner cardzone tiver 450px ou mais */
@container cardzone (min-width: 450px) {
  .product-card {
    flex-direction: row;
    align-items: center;
    padding: 1.5rem;
  }
}</textarea>
        </div>
    </div>
    
<div class="wzw-callout wzw-callout-info">
<div class="wzw-callout-icon">📐</div>
<div>
        <strong>Novas Unidades de Medida Relativas ao Contêiner:</strong><br />
        <br /><code>1cqi</code>: 1% da largura do contêiner no eixo de leitura (inline size).<br />
        <br /><code>1cqw</code>: 1% da largura absoluta do contêiner.<br />
        <br /><code>1cqh</code>: 1% da altura do contêiner.
    </div>
</div>
<h2>5. Laboratório Prático: Card Inteligente com :has(), :where() e @container</h2>
<p>
    Analise o exemplo completo abaixo. Ele utiliza <code>:where()</code> para estilos de base, <code>:has()</code> para iluminar o cartão ao marcar a opção e <code>@container</code> para mudar de layout vertical para horizontal conforme a largura do contêiner:
</p>
    <div class="wzw-ide-card" id="wzw-code-69453" data-lang="html">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">HTML5</span>
                                <span class="wzw-ide-lines-count">24 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-69453', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-69453', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;demo-wrapper&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;p</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;resize-hint&quot;</span><span class="wzw-tk-tag">&gt;</span>↔ Redimensione a caixa arrastando a borda direita:<span class="wzw-tk-tag">&lt;/p&gt;</span></span>
<span class="wzw-code-line">  </span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;subscription-slot&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;plan-card&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;plan-header&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;label</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;plan-label&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">          <span class="wzw-tk-tag">&lt;input</span> <span class="wzw-tk-attr">type</span>=<span class="wzw-tk-str">&quot;radio&quot;</span> <span class="wzw-tk-attr">name</span>=<span class="wzw-tk-str">&quot;plano&quot;</span> <span class="wzw-tk-attr">value</span>=<span class="wzw-tk-str">&quot;pro&quot;</span> <span class="wzw-tk-attr">checked</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">          <span class="wzw-tk-tag">&lt;span</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;plan-name&quot;</span><span class="wzw-tk-tag">&gt;</span>Plano Full-Stack<span class="wzw-tk-tag">&lt;/span&gt;</span></span>
<span class="wzw-code-line">          <span class="wzw-tk-tag">&lt;span</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;plan-badge&quot;</span><span class="wzw-tk-tag">&gt;</span>Recomendado<span class="wzw-tk-tag">&lt;/span&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;/label&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;plan-price&quot;</span><span class="wzw-tk-tag">&gt;</span>R$ 49<span class="wzw-tk-tag">&lt;small&gt;</span>/mês<span class="wzw-tk-tag">&lt;/small&gt;</span><span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;plan-body&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;p&gt;</span>Acesso total aos cursos da Web Academy, suíte de ferramentas e Playground IDE ilimitado.<span class="wzw-tk-tag">&lt;/p&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;plan-action&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;button</span> <span class="wzw-tk-attr">type</span>=<span class="wzw-tk-str">&quot;button&quot;</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;btn-enroll&quot;</span><span class="wzw-tk-tag">&gt;</span>Matricular Agora<span class="wzw-tk-tag">&lt;/button&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;/div&gt;</span></span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>&lt;div class=&quot;demo-wrapper&quot;&gt;
  &lt;p class=&quot;resize-hint&quot;&gt;↔ Redimensione a caixa arrastando a borda direita:&lt;/p&gt;
  
  &lt;div class=&quot;subscription-slot&quot;&gt;
    &lt;div class=&quot;plan-card&quot;&gt;
      &lt;div class=&quot;plan-header&quot;&gt;
        &lt;label class=&quot;plan-label&quot;&gt;
          &lt;input type=&quot;radio&quot; name=&quot;plano&quot; value=&quot;pro&quot; checked&gt;
          &lt;span class=&quot;plan-name&quot;&gt;Plano Full-Stack&lt;/span&gt;
          &lt;span class=&quot;plan-badge&quot;&gt;Recomendado&lt;/span&gt;
        &lt;/label&gt;
        &lt;div class=&quot;plan-price&quot;&gt;R$ 49&lt;small&gt;/mês&lt;/small&gt;&lt;/div&gt;
      &lt;/div&gt;

      &lt;div class=&quot;plan-body&quot;&gt;
        &lt;p&gt;Acesso total aos cursos da Web Academy, suíte de ferramentas e Playground IDE ilimitado.&lt;/p&gt;
      &lt;/div&gt;

      &lt;div class=&quot;plan-action&quot;&gt;
        &lt;button type=&quot;button&quot; class=&quot;btn-enroll&quot;&gt;Matricular Agora&lt;/button&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;</textarea>
        </div>
    </div>
    
    <div class="wzw-ide-card" id="wzw-code-85724" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">98 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-85724', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-85724', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">/* 1. Estilos com :where() - Especificidade ZERO para fácil sobrescrita */</span></span>
<span class="wzw-code-line">:where(.plan-card, .btn-enroll, .plan-price) {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-family</span>: <span class="wzw-tk-str">&#039;Inter&#039;</span>, system-ui, sans-serif;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">box-sizing</span>: border-box;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">/* 2. Contêiner Responsivo de Contexto */</span></span>
<span class="wzw-code-line">.subscription-slot {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">container-type</span>: inline-size;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">container-name</span>: planslot;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">width</span>: 100%;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">max-width</span>: <span class="wzw-tk-num">600px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">min-width</span>: <span class="wzw-tk-num">280px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">resize</span>: horizontal;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">overflow</span>: auto;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">1.25rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: <span class="wzw-tk-num">#0f172a</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border</span>: <span class="wzw-tk-num">1px</span> dashed <span class="wzw-tk-num">#334155</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-radius</span>: <span class="wzw-tk-num">12px</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">/* 3. Card Base (Vertical) */</span></span>
<span class="wzw-code-line">.plan-card {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">display</span>: flex;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">flex-direction</span>: column;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">gap</span>: <span class="wzw-tk-num">1rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: <span class="wzw-tk-num">#1e293b</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border</span>: <span class="wzw-tk-num">2px</span> solid <span class="wzw-tk-num">#334155</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-radius</span>: <span class="wzw-tk-num">10px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">1.25rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transition</span>: all <span class="wzw-tk-num">0.3s</span> ease;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">/* 4. Iluminação com :has() ao checar o radio */</span></span>
<span class="wzw-code-line">.plan-card:has(input[type=<span class="wzw-tk-str">&quot;radio&quot;</span>]:checked) {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-color</span>: <span class="wzw-tk-num">#00f0ff</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: linear-gradient(<span class="wzw-tk-num">135deg</span>, rgba(0, 240, 255, 0.06), <span class="wzw-tk-num">#1e293b</span>);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">box-shadow</span>: 0 <span class="wzw-tk-num">10px</span> <span class="wzw-tk-num">25px</span> rgba(0, 240, 255, 0.15);</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.plan-label {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">display</span>: flex;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">align-items</span>: center;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">gap</span>: <span class="wzw-tk-num">0.5rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">cursor</span>: pointer;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#f8fafc</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-weight</span>: 700;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.plan-badge {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: <span class="wzw-tk-num">#00f0ff</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#090d16</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-size</span>: <span class="wzw-tk-num">0.72rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-weight</span>: 800;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">2px</span> <span class="wzw-tk-num">6px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-radius</span>: <span class="wzw-tk-num">12px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">text-transform</span>: uppercase;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.plan-price {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#38bdf8</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-size</span>: <span class="wzw-tk-num">1.6rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-weight</span>: 800;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.btn-enroll {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">width</span>: 100%;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">0.75rem</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: <span class="wzw-tk-num">#00f0ff</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#090d16</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border</span>: none;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-radius</span>: <span class="wzw-tk-num">6px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-weight</span>: 700;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">cursor</span>: pointer;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transition</span>: filter <span class="wzw-tk-num">0.2s</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.btn-enroll<span class="wzw-tk-kw">:hover</span> {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">filter</span>: brightness(1.15);</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">/* 5. Container Query: reorganiza quando o contêiner atingir 460px */</span></span>
<span class="wzw-code-line"><span class="wzw-tk-kw">@container</span> planslot (min-width: <span class="wzw-tk-num">460px</span>) {</span>
<span class="wzw-code-line">  .plan-card {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">display</span>: grid;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">grid-template-columns</span>: <span class="wzw-tk-num">1fr</span> auto;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">grid-template-areas</span>:</span>
<span class="wzw-code-line">      <span class="wzw-tk-str">&quot;header price&quot;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-str">&quot;body   body&quot;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-str">&quot;action action&quot;</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">1.5rem</span>;</span>
<span class="wzw-code-line">  }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">  .plan-header { grid-area: header; }</span>
<span class="wzw-code-line">  .plan-price { grid-area: price; text-align: right; }</span>
<span class="wzw-code-line">  .plan-body { grid-area: body; }</span>
<span class="wzw-code-line">  .plan-action { grid-area: action; }</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* 1. Estilos com :where() - Especificidade ZERO para fácil sobrescrita */
:where(.plan-card, .btn-enroll, .plan-price) {
  font-family: &#039;Inter&#039;, system-ui, sans-serif;
  box-sizing: border-box;
}

/* 2. Contêiner Responsivo de Contexto */
.subscription-slot {
  container-type: inline-size;
  container-name: planslot;
  width: 100%;
  max-width: 600px;
  min-width: 280px;
  resize: horizontal;
  overflow: auto;
  padding: 1.25rem;
  background: #0f172a;
  border: 1px dashed #334155;
  border-radius: 12px;
}

/* 3. Card Base (Vertical) */
.plan-card {
  display: flex;
  flex-direction: column;
  gap: 1rem;
  background: #1e293b;
  border: 2px solid #334155;
  border-radius: 10px;
  padding: 1.25rem;
  transition: all 0.3s ease;
}

/* 4. Iluminação com :has() ao checar o radio */
.plan-card:has(input[type=&quot;radio&quot;]:checked) {
  border-color: #00f0ff;
  background: linear-gradient(135deg, rgba(0, 240, 255, 0.06), #1e293b);
  box-shadow: 0 10px 25px rgba(0, 240, 255, 0.15);
}

.plan-label {
  display: flex;
  align-items: center;
  gap: 0.5rem;
  cursor: pointer;
  color: #f8fafc;
  font-weight: 700;
}

.plan-badge {
  background: #00f0ff;
  color: #090d16;
  font-size: 0.72rem;
  font-weight: 800;
  padding: 2px 6px;
  border-radius: 12px;
  text-transform: uppercase;
}

.plan-price {
  color: #38bdf8;
  font-size: 1.6rem;
  font-weight: 800;
}

.btn-enroll {
  width: 100%;
  padding: 0.75rem;
  background: #00f0ff;
  color: #090d16;
  border: none;
  border-radius: 6px;
  font-weight: 700;
  cursor: pointer;
  transition: filter 0.2s;
}

.btn-enroll:hover {
  filter: brightness(1.15);
}

/* 5. Container Query: reorganiza quando o contêiner atingir 460px */
@container planslot (min-width: 460px) {
  .plan-card {
    display: grid;
    grid-template-columns: 1fr auto;
    grid-template-areas:
      &quot;header price&quot;
      &quot;body   body&quot;
      &quot;action action&quot;;
    padding: 1.5rem;
  }

  .plan-header { grid-area: header; }
  .plan-price { grid-area: price; text-align: right; }
  .plan-body { grid-area: body; }
  .plan-action { grid-area: action; }
}</textarea>
        </div>
    </div>
    
<div class="wzw-playground-action-bar">
    <span class="wzw-playground-desc">🧪 <strong>Quer ver este código funcionando agora?</strong></span><br />
    <a href="https://webzoneware.com/web-academy/playground-web/" class="wzw-btn-playground" target="_blank" rel="noopener"><br />
        Abrir no Playground IDE &rarr;<br />
    </a>
</div>
<h2>6. Ferramentas Web-ZoneWare para o seu Fluxo de Trabalho</h2>
<p>
    Ao arquitetar regras avançadas de seletores e contêineres, utilize as ferramentas da suíte Web-ZoneWare para validar a sintaxe e garantir arquivos compactos:
</p>
<ul>
<li><a href="https://webzoneware.com/web-ferramentas/css-beautify-minify/" target="_blank">Limpador e Formatador CSS</a>: Indente regras aninhadas e seletores modernos com 2 espaços de padrão sênior.</li>
<li><a href="https://webzoneware.com/web-ferramentas/cssvalidate/" target="_blank">Validador de CSS Online</a>: Verifique a integridade sintática e identifique declarações obsoletas.</li>
<li><a href="https://webzoneware.com/web-academy/playground-web/" target="_blank">Playground Web IDE</a>: Laboratório online em tempo real para testar Container Queries e o seletor <code>:has()</code> instantaneamente.</li>
</ul>
<h2>7. Links Oficiais de Autoridade</h2>
<ul>
<li><a href="https://www.w3.org/TR/selectors-4/" target="_blank" rel="noopener noreferrer">W3C — CSS Selectors Level 4 (Especificação Oficial)</a></li>
<li><a href="https://www.w3.org/TR/css-contain-3/" target="_blank" rel="noopener noreferrer">W3C — CSS Containment Module Level 3 (Container Queries)</a></li>
<li><a href="https://developer.mozilla.org/pt-BR/docs/Web/CSS/:has" target="_blank" rel="noopener noreferrer">MDN Web Docs — Pseudo-classe :has()</a></li>
<li><a href="https://developer.mozilla.org/pt-BR/docs/Web/CSS/CSS_containment/Container_queries" target="_blank" rel="noopener noreferrer">MDN Web Docs — Guia Completo de Container Queries</a></li>
</ul>
<h2>8. Exercício Prático da Lição 47</h2>
<ol>
<li>Abra o <strong>Playground Web IDE</strong> clicando no botão de ação da lição.</li>
<li>Crie uma lista desordenada (<code>&lt;ul class="menu"&gt;</code>) com 4 itens de link.</li>
<li>Utilize <code>.menu:has(li:hover) li:not(:hover)</code> para aplicar opacidade de <code>0.4</code> aos irmãos inativos quando o mouse estiver sobre qualquer item.</li>
<li>Defina um contêiner com <code>container-type: inline-size</code> e aplique uma regra <code>@container (min-width: 400px)</code> que altere a disposição da lista de vertical para horizontal.</li>
<li>Verifique se o código CSS está formatado usando a ferramenta <a href="https://webzoneware.com/web-ferramentas/css-beautify-minify/" target="_blank">CSS Beautifier</a>.</li>
</ol>
<h2>9. Quiz de Fixação Interativo</h2>
<details class="wzw-quiz-card">
<summary><strong>1. Qual a diferença fundamental de especificidade entre :is() e :where()?</strong></summary>
<div class="wzw-quiz-answer">
<p><strong>Resposta Correta:</strong> O <code>:is()</code> assume o peso do seletor mais específico presente em seus argumentos, enquanto o <code>:where()</code> tem SEMPRE especificidade zero absoluta <code>(0-0-0)</code>, facilitando sobrescritas sem conflito.</p>
</p></div>
</details>
<details class="wzw-quiz-card">
<summary><strong>2. O que acontece em :is(h1, :pseudo-invalido, h2) se o navegador não reconhecer o segundo seletor?</strong></summary>
<div class="wzw-quiz-answer">
<p><strong>Resposta Correta:</strong> Devido ao <em>Forgiving Selector Parsing</em>, o navegador apenas ignora o seletor desconhecido e continua aplicando os estilos normalmente aos seletores válidos (<code>h1</code> e <code>h2</code>), ao contrário de seletores tradicionais que descartariam toda a regra.</p>
</p></div>
</details>
<details class="wzw-quiz-card">
<summary><strong>3. Por que Container Queries (@container) são superiores a Media Queries (@media) em componentes reutilizáveis?</strong></summary>
<div class="wzw-quiz-answer">
<p><strong>Resposta Correta:</strong> Porque as Container Queries medem a largura do elemento pai contêiner imediato do componente, permitindo que ele se adapte de forma autônoma quer esteja numa sidebar estreita ou no corpo principal da página, sem depender da largura global do monitor (Viewport).</p>
</p></div>
</details>
<p><!-- Marcação Estruturada Schema.org (JSON-LD) --><br />
<script type="application/ld+json">
{
  "@context": "https://schema.org",
  "@type": "TechArticle",
  "headline": "Seletores Modernos no CSS: :is(), :where(), :has() & @container",
  "description": "Domine :has(), :is(), :where() e Container Queries no CSS moderno para criar componentes auto-responsivos e modulares.",
  "url": "https://webzoneware.com/web-academy/css/seletores-modernos-is-where-has-container-queries/",
  "inLanguage": "pt-BR",
  "isPartOf": {
    "@type": "Course",
    "name": "Curso de CSS & CSS3 Completo",
    "url": "https://webzoneware.com/web-academy/css/",
    "provider": {
      "@type": "Organization",
      "name": "Web-ZoneWare",
      "url": "https://webzoneware.com"
    }
  },
  "proficiencyLevel": "Advanced",
  "author": {
    "@type": "Organization",
    "name": "Web-ZoneWare Academy"
  }
}
</script></p>
<p>O post <a href="https://webzoneware.com/web-academy/curso-css/seletores-modernos-is-where-has-container-queries/">Seletores :has, :is, :where e @container — Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://webzoneware.com/web-academy/curso-css/seletores-modernos-is-where-has-container-queries/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Filtros e Glassmorphism Modernos no CSS &#124; Web Academy</title>
		<link>https://webzoneware.com/web-academy/curso-css/filtros-css-backdrop-filter-glassmorphism/</link>
					<comments>https://webzoneware.com/web-academy/curso-css/filtros-css-backdrop-filter-glassmorphism/#respond</comments>
		
		<dc:creator><![CDATA[Web-Zoneware]]></dc:creator>
		<pubDate>Thu, 22 Oct 2026 03:55:12 +0000</pubDate>
				<category><![CDATA[Curso de CSS e CSS3]]></category>
		<category><![CDATA[backdrop-filter]]></category>
		<category><![CDATA[curso css3 completo]]></category>
		<category><![CDATA[design system moderno]]></category>
		<category><![CDATA[filter css]]></category>
		<category><![CDATA[filtros css]]></category>
		<category><![CDATA[glassmorphism]]></category>
		<category><![CDATA[vidro fosco]]></category>
		<guid isPermaLink="false">https://webzoneware.com/?p=29471</guid>

					<description><![CDATA[<p>A estética visual dos sistemas operacionais contemporâneos — como o macOS da Apple e o Windows 11 — é fortemente inspirada no mundo físico: materiais translúcidos, placas de acrílico e vidros foscos que revelam suavemente o que está por trás da interface. No passado, para criar um desfoque realista ou transformar uma imagem em preto [&#8230;]</p>
<p>O post <a href="https://webzoneware.com/web-academy/curso-css/filtros-css-backdrop-filter-glassmorphism/">Filtros e Glassmorphism Modernos no CSS | Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wzw-lesson-lead">
  A estética visual dos sistemas operacionais contemporâneos — como o macOS da Apple e o Windows 11 — é fortemente inspirada no mundo físico: materiais translúcidos, placas de acrílico e vidros foscos que revelam suavemente o que está por trás da interface. No passado, para criar um desfoque realista ou transformar uma imagem em preto e branco, os designers precisavam recorrer a softwares como Photoshop ou Figma e exportar arquivos pesados. Hoje, o CSS possui um motor gráfico de pós-processamento completo com as propriedades <strong><code>filter</code></strong> e <strong><code>backdrop-filter</code></strong>, permitindo criar o famoso efeito <strong>Glassmorphism</strong> nativamente no navegador.
</p>
<h2>1. O Motor de Filtros Gráficos: A Propriedade <code>filter</code></h2>
<p>
  A propriedade <code>filter</code> processa a renderização de pixels do <strong>próprio elemento e de todos os seus filhos</strong>. Ela aceita uma série de funções visuais prontas:
</p>
<div class="wzw-table-responsive">
<table class="wzw-table">
<thead>
<tr>
<th>Função</th>
<th>Valores de Exemplo</th>
<th>Efeito Visual na Interface</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong><code>blur()</code></strong></td>
<td><code>blur(8px)</code></td>
<td>Aplica um desfoque gaussiano suave sobre o elemento.</td>
</tr>
<tr>
<td><strong><code>brightness()</code></strong></td>
<td><code>brightness(1.3)</code> (30% mais claro)</td>
<td>Ajusta o ganho de luz (excelente para acender cards no <code>:hover</code>).</td>
</tr>
<tr>
<td><strong><code>contrast()</code></strong></td>
<td><code>contrast(150%)</code></td>
<td>Aumenta ou reduz a separação entre tons claros e escuros.</td>
</tr>
<tr>
<td><strong><code>grayscale()</code></strong></td>
<td><code>grayscale(100%)</code></td>
<td>Converte a imagem inteiramente para tons de cinza (preto e branco).</td>
</tr>
<tr>
<td><strong><code>drop-shadow()</code></strong></td>
<td><code>drop-shadow(0 4px 12px rgba(0,0,0,0.5))</code></td>
<td><strong>A Sombra com Canal Alfa:</strong> Projeta sombra ao longo do contorno real de PNGs e SVGs!</td>
</tr>
</tbody>
</table>
</div>
<h3>A Diferença Crucial: <code>box-shadow</code> vs. <code>filter: drop-shadow()</code></h3>
<div class="wzw-callout wzw-callout-info">
<p><strong>Dica Sênior de SVG e PNG:</strong> A propriedade <code>box-shadow</code> projeta uma sombra quadrada em torno da caixa física do elemento, mesmo que a imagem seja um círculo ou logotipo transparente. Já o <strong><code>filter: drop-shadow()</code></strong> analisa o canal de transparência (Alpha Channel) da imagem e contorna os traços reais do ícone ou foto recortada!</p>
</div>
<h2>2. <code>filter</code> vs. <code>backdrop-filter</code>: A Fronteira do Vidro</h2>
<p>
  A diferença entre essas duas propriedades é o ponto onde muitos desenvolvedores se perdem:
</p>
<ul>
<li><strong><code>filter</code>:</strong> Borra o próprio elemento e seu texto. Se você aplicar <code>filter: blur(10px)</code> em um card, todo o texto e botões dentro dele ficarão embaçados e impossíveis de ler!</li>
<li><strong><code>backdrop-filter</code>:</strong> Borra <strong>exclusivamente a área gráfica localizada ATRÁS do elemento</strong>! O texto, os botões e a borda da caixa permanecem com 100% de nitidez cristalina.</li>
</ul>
<h2>3. A Receita dos 4 Ingredientes do Glassmorphism Perfeito</h2>
<p>
  Para criar aquele visual futurista de placa de vidro translúcida sobreposta a elementos da página, você precisa combinar exatamente estes 4 passos:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-47748" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">17 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-47748', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-47748', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line">.card-glassmorphism {</span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">/* 1. Fundo Semitransparente (Nunca use cor 100% sólida!) */</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: rgba(255, 255, 255, 0.08);</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">/* 2. O Desfoque Gaussiano de Fundo (A magia do vidro fosco) */</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">backdrop-filter</span>: blur(<span class="wzw-tk-num">16px</span>);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">-webkit-backdrop-filter</span>: blur(<span class="wzw-tk-num">16px</span>); /* Fallback para Safari antigo */</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">/* 3. Borda Translúcida (Simula o corte e bisel da quina do vidro) */</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border</span>: <span class="wzw-tk-num">1px</span> solid rgba(255, 255, 255, 0.18);</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">/* 4. Sombra de Difusão Atmosférica Profunda */</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">box-shadow</span>: 0 <span class="wzw-tk-num">8px</span> <span class="wzw-tk-num">32px</span> 0 rgba(0, 0, 0, 0.37);</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-radius</span>: <span class="wzw-tk-num">16px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">24px</span>;</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>.card-glassmorphism {
  /* 1. Fundo Semitransparente (Nunca use cor 100% sólida!) */
  background: rgba(255, 255, 255, 0.08);

  /* 2. O Desfoque Gaussiano de Fundo (A magia do vidro fosco) */
  backdrop-filter: blur(16px);
  -webkit-backdrop-filter: blur(16px); /* Fallback para Safari antigo */

  /* 3. Borda Translúcida (Simula o corte e bisel da quina do vidro) */
  border: 1px solid rgba(255, 255, 255, 0.18);

  /* 4. Sombra de Difusão Atmosférica Profunda */
  box-shadow: 0 8px 32px 0 rgba(0, 0, 0, 0.37);

  border-radius: 16px;
  padding: 24px;
}</textarea>
        </div>
    </div>
    
</div>
<h2>4. Acessibilidade e Contraste Legível (WCAG 2.2)</h2>
<div class="wzw-callout wzw-callout-warning">
<p><strong>O Perigo do Vidro Ilegível:</strong> O maior pecado do Glassmorphism é colocar um fundo translúcido quase invisível sobre um fundo cheio de detalhes coloridos, tornando o texto branco impossível de ser lido por pessoas com baixa acuidade visual. Para estar em conformidade com o Critério 1.4.3 da WCAG (Contraste Mínimo de 4.5:1):</p>
<ul>
<li>Mantenha a opacidade da cor de fundo (RGBA) entre <strong>15% e 25%</strong>.</li>
<li>Use sombras sutis no texto: <code>text-shadow: 0 2px 4px rgba(0,0,0,0.5);</code> para garantir contraste mesmo se o fundo de trás mudar de cor.</li>
</ul>
</div>
<h2>5. Suporte Defensivo com <code>@supports</code></h2>
<p>
  Dispositivos antigos ou navegadores operando em modo de economia de energia podem desativar o <code>backdrop-filter</code>. Garantimos a legibilidade com a regra-arroba <code>@supports</code>:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-65801" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">13 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-65801', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-65801', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">/* Fallback padrão para navegadores sem suporte a blur */</span></span>
<span class="wzw-code-line">.card-glass {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: <span class="wzw-tk-num">#1e293b</span>; /* Fundo sólido seguro */</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">/* Se o navegador suportar backdrop-filter, ativa o vidro fosco */</span></span>
<span class="wzw-code-line"><span class="wzw-tk-kw">@supports</span> (backdrop-filter: blur(<span class="wzw-tk-num">10px</span>)) or (-webkit-backdrop-filter: blur(<span class="wzw-tk-num">10px</span>)) {</span>
<span class="wzw-code-line">  .card-glass {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">background</span>: rgba(30, 41, 59, 0.7);</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">backdrop-filter</span>: blur(<span class="wzw-tk-num">14px</span>);</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">-webkit-backdrop-filter</span>: blur(<span class="wzw-tk-num">14px</span>);</span>
<span class="wzw-code-line">  }</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* Fallback padrão para navegadores sem suporte a blur */
.card-glass {
  background: #1e293b; /* Fundo sólido seguro */
}

/* Se o navegador suportar backdrop-filter, ativa o vidro fosco */
@supports (backdrop-filter: blur(10px)) or (-webkit-backdrop-filter: blur(10px)) {
  .card-glass {
    background: rgba(30, 41, 59, 0.7);
    backdrop-filter: blur(14px);
    -webkit-backdrop-filter: blur(14px);
  }
}</textarea>
        </div>
    </div>
    
</div>
<h2>6. Laboratório Prático: Cartão Glassmorphic sobre Esferas Animadas</h2>
<p>
  No código interativo abaixo, criamos um cartão translúcido com <code>backdrop-filter: blur(16px)</code> flutuando sobre esferas coloridas de gradiente, acompanhado de logotipos tratados com <code>filter: grayscale</code>:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-47794" data-lang="html">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">HTML5</span>
                                <span class="wzw-ide-lines-count">117 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-47794', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-47794', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-tag">&lt;!DOCTYPE</span><span class="wzw-tk-kw"> html</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;html</span> <span class="wzw-tk-attr">lang</span>=<span class="wzw-tk-str">&quot;pt-BR&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;head&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;meta</span> <span class="wzw-tk-attr">charset</span>=<span class="wzw-tk-str">&quot;UTF-8&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;title&gt;</span>Laboratório de Glassmorphism e Filtros CSS<span class="wzw-tk-tag">&lt;/title&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;style&gt;</span></span>
<span class="wzw-code-line">    body {</span>
<span class="wzw-code-line">      font-family: &#039;Inter&#039;, system-ui, sans-serif;</span>
<span class="wzw-code-line">      background: #030712;</span>
<span class="wzw-code-line">      color: #f8fafc;</span>
<span class="wzw-code-line">      min-height: 100vh;</span>
<span class="wzw-code-line">      display: flex;</span>
<span class="wzw-code-line">      flex-direction: column;</span>
<span class="wzw-code-line">      align-items: center;</span>
<span class="wzw-code-line">      justify-content: center;</span>
<span class="wzw-code-line">      margin: 0;</span>
<span class="wzw-code-line">      position: relative;</span>
<span class="wzw-code-line">      overflow: hidden;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">/* ESFERAS COLORIDAS NO FUNDO PARA TESTAR O DESFOQUE */</span></span>
<span class="wzw-code-line">    .esfera-fundo-1 {</span>
<span class="wzw-code-line">      position: absolute;</span>
<span class="wzw-code-line">      top: 15%;</span>
<span class="wzw-code-line">      left: 20%;</span>
<span class="wzw-code-line">      width: 260px;</span>
<span class="wzw-code-line">      height: 260px;</span>
<span class="wzw-code-line">      border-radius: 50%;</span>
<span class="wzw-code-line">      background: linear-gradient(135deg, #3b82f6, #8b5cf6);</span>
<span class="wzw-code-line">      filter: blur(40px);</span>
<span class="wzw-code-line">      z-index: 1;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .esfera-fundo-2 {</span>
<span class="wzw-code-line">      position: absolute;</span>
<span class="wzw-code-line">      bottom: 20%;</span>
<span class="wzw-code-line">      right: 25%;</span>
<span class="wzw-code-line">      width: 220px;</span>
<span class="wzw-code-line">      height: 220px;</span>
<span class="wzw-code-line">      border-radius: 50%;</span>
<span class="wzw-code-line">      background: linear-gradient(135deg, #10b981, #06b6d4);</span>
<span class="wzw-code-line">      filter: blur(35px);</span>
<span class="wzw-code-line">      z-index: 1;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">/* O CARTÃO GLASSMORPHISM AUTÊNTICO */</span></span>
<span class="wzw-code-line">    .card-vidro {</span>
<span class="wzw-code-line">      position: relative;</span>
<span class="wzw-code-line">      z-index: 2; /* Fica acima das esferas */</span>
<span class="wzw-code-line">      max-width: 440px;</span>
<span class="wzw-code-line">      background: rgba(255, 255, 255, 0.05); /* 1. Fundo semitransparente */</span>
<span class="wzw-code-line">      backdrop-filter: blur(16px);            /* 2. Desfoque atrás do vidro */</span>
<span class="wzw-code-line">      -webkit-backdrop-filter: blur(16px);</span>
<span class="wzw-code-line">      border: 1px solid rgba(255, 255, 255, 0.15); /* 3. Borda translúcida */</span>
<span class="wzw-code-line">      box-shadow: 0 16px 40px rgba(0, 0, 0, 0.5);   /* 4. Sombra profunda */</span>
<span class="wzw-code-line">      border-radius: 20px;</span>
<span class="wzw-code-line">      padding: 32px;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .card-vidro h3 {</span>
<span class="wzw-code-line">      margin: 0 0 12px 0;</span>
<span class="wzw-code-line">      color: #fff;</span>
<span class="wzw-code-line">      font-size: 1.4rem;</span>
<span class="wzw-code-line">      text-shadow: 0 2px 8px rgba(0,0,0,0.5);</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .card-vidro p {</span>
<span class="wzw-code-line">      color: #cbd5e1;</span>
<span class="wzw-code-line">      font-size: 0.95rem;</span>
<span class="wzw-code-line">      line-height: 1.6;</span>
<span class="wzw-code-line">      margin: 0 0 24px 0;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">/* BARRA DE PARCEIROS COM FILTER: GRAYSCALE */</span></span>
<span class="wzw-code-line">    .parceiros-box {</span>
<span class="wzw-code-line">      display: flex;</span>
<span class="wzw-code-line">      gap: 16px;</span>
<span class="wzw-code-line">      align-items: center;</span>
<span class="wzw-code-line">      border-top: 1px solid rgba(255,255,255,0.1);</span>
<span class="wzw-code-line">      padding-top: 16px;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .logo-parceiro {</span>
<span class="wzw-code-line">      font-size: 0.85rem;</span>
<span class="wzw-code-line">      font-weight: 700;</span>
<span class="wzw-code-line">      color: #38bdf8;</span>
<span class="wzw-code-line">      filter: grayscale(100%) opacity(0.6);</span>
<span class="wzw-code-line">      transition: filter 0.3s ease;</span>
<span class="wzw-code-line">      cursor: pointer;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .logo-parceiro:hover {</span>
<span class="wzw-code-line">      filter: grayscale(0%) opacity(1); /* Ganha cor total no hover! */</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;/style&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;/head&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;body&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">&lt;!-- Elementos gráficos luminosos que serão desfocados pelo vidro --&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;esfera-fundo-1&quot;</span><span class="wzw-tk-tag">&gt;</span><span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;esfera-fundo-2&quot;</span><span class="wzw-tk-tag">&gt;</span><span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">&lt;!-- O Cartão com Backdrop Filter --&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;card-vidro&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;h3&gt;</span>⚡ Economaster Glass UI<span class="wzw-tk-tag">&lt;/h3&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;p&gt;</span></span>
<span class="wzw-code-line">      Observe a textura translúcida de vidro fosco: as esferas coloridas de fundo são desfocadas pelo <span class="wzw-tk-tag">&lt;code&gt;</span>backdrop-filter: blur(16px)<span class="wzw-tk-tag">&lt;/code&gt;</span>, enquanto esta tipografia permanece perfeitamente legível e nítida.</span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;/p&gt;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;parceiros-box&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;span</span> <span class="wzw-tk-attr">style</span>=<span class="wzw-tk-str">&quot;font-size:0.75rem; color:#64748b;&quot;</span><span class="wzw-tk-tag">&gt;</span>Parceiros (Passe o mouse):<span class="wzw-tk-tag">&lt;/span&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;span</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;logo-parceiro&quot;</span><span class="wzw-tk-tag">&gt;</span>Chrome<span class="wzw-tk-tag">&lt;/span&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;span</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;logo-parceiro&quot;</span><span class="wzw-tk-tag">&gt;</span>Firefox<span class="wzw-tk-tag">&lt;/span&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;span</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;logo-parceiro&quot;</span><span class="wzw-tk-tag">&gt;</span>WebKit<span class="wzw-tk-tag">&lt;/span&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;/body&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;/html&gt;</span></span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;pt-BR&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;title&gt;Laboratório de Glassmorphism e Filtros CSS&lt;/title&gt;
  &lt;style&gt;
    body {
      font-family: &#039;Inter&#039;, system-ui, sans-serif;
      background: #030712;
      color: #f8fafc;
      min-height: 100vh;
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      margin: 0;
      position: relative;
      overflow: hidden;
    }

    /* ESFERAS COLORIDAS NO FUNDO PARA TESTAR O DESFOQUE */
    .esfera-fundo-1 {
      position: absolute;
      top: 15%;
      left: 20%;
      width: 260px;
      height: 260px;
      border-radius: 50%;
      background: linear-gradient(135deg, #3b82f6, #8b5cf6);
      filter: blur(40px);
      z-index: 1;
    }

    .esfera-fundo-2 {
      position: absolute;
      bottom: 20%;
      right: 25%;
      width: 220px;
      height: 220px;
      border-radius: 50%;
      background: linear-gradient(135deg, #10b981, #06b6d4);
      filter: blur(35px);
      z-index: 1;
    }

    /* O CARTÃO GLASSMORPHISM AUTÊNTICO */
    .card-vidro {
      position: relative;
      z-index: 2; /* Fica acima das esferas */
      max-width: 440px;
      background: rgba(255, 255, 255, 0.05); /* 1. Fundo semitransparente */
      backdrop-filter: blur(16px);            /* 2. Desfoque atrás do vidro */
      -webkit-backdrop-filter: blur(16px);
      border: 1px solid rgba(255, 255, 255, 0.15); /* 3. Borda translúcida */
      box-shadow: 0 16px 40px rgba(0, 0, 0, 0.5);   /* 4. Sombra profunda */
      border-radius: 20px;
      padding: 32px;
    }

    .card-vidro h3 {
      margin: 0 0 12px 0;
      color: #fff;
      font-size: 1.4rem;
      text-shadow: 0 2px 8px rgba(0,0,0,0.5);
    }

    .card-vidro p {
      color: #cbd5e1;
      font-size: 0.95rem;
      line-height: 1.6;
      margin: 0 0 24px 0;
    }

    /* BARRA DE PARCEIROS COM FILTER: GRAYSCALE */
    .parceiros-box {
      display: flex;
      gap: 16px;
      align-items: center;
      border-top: 1px solid rgba(255,255,255,0.1);
      padding-top: 16px;
    }

    .logo-parceiro {
      font-size: 0.85rem;
      font-weight: 700;
      color: #38bdf8;
      filter: grayscale(100%) opacity(0.6);
      transition: filter 0.3s ease;
      cursor: pointer;
    }

    .logo-parceiro:hover {
      filter: grayscale(0%) opacity(1); /* Ganha cor total no hover! */
    }
  &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;!-- Elementos gráficos luminosos que serão desfocados pelo vidro --&gt;
  &lt;div class=&quot;esfera-fundo-1&quot;&gt;&lt;/div&gt;
  &lt;div class=&quot;esfera-fundo-2&quot;&gt;&lt;/div&gt;

  &lt;!-- O Cartão com Backdrop Filter --&gt;
  &lt;div class=&quot;card-vidro&quot;&gt;
    &lt;h3&gt;⚡ Economaster Glass UI&lt;/h3&gt;
    &lt;p&gt;
      Observe a textura translúcida de vidro fosco: as esferas coloridas de fundo são desfocadas pelo &lt;code&gt;backdrop-filter: blur(16px)&lt;/code&gt;, enquanto esta tipografia permanece perfeitamente legível e nítida.
    &lt;/p&gt;

    &lt;div class=&quot;parceiros-box&quot;&gt;
      &lt;span style=&quot;font-size:0.75rem; color:#64748b;&quot;&gt;Parceiros (Passe o mouse):&lt;/span&gt;
      &lt;span class=&quot;logo-parceiro&quot;&gt;Chrome&lt;/span&gt;
      &lt;span class=&quot;logo-parceiro&quot;&gt;Firefox&lt;/span&gt;
      &lt;span class=&quot;logo-parceiro&quot;&gt;WebKit&lt;/span&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</textarea>
        </div>
    </div>
    
</div>
<p>
  Abra este laboratório no Playground IDE e teste passar o mouse sobre os parceiros para ver o <code>filter: grayscale</code> se transformar, e altere o valor do desfoque no <code>backdrop-filter</code> para conferir a difusão da luz em tempo real:
</p>
<p style="text-align: center; margin: 35px 0;">
  <a href="https://webzoneware.com/web-academy/playground-web/" class="wzw-btn-playground" target="_blank" rel="noopener">⚡ Abrir no Playground IDE &rarr;</a>
</p>
<h2>7. Resumo e Próximos Passos</h2>
<ul>
<li><code>filter</code> aplica pós-processamento de imagem no elemento e em todos os seus filhos.</li>
<li><code>filter: drop-shadow()</code> projeta sombras respeitando a transparência real de ícones SVG e fotos PNG.</li>
<li><code>backdrop-filter</code> aplica desfoque exclusivamente à área que está <strong>atrás</strong> da caixa, preservando a nitidez do texto.</li>
<li>O Glassmorphism autêntico exige 4 ingredientes: fundo RGBA semitransparente, <code>backdrop-filter: blur()</code>, borda translúcida fina e sombras multicamadas.</li>
<li>Sempre certifique-se de que o contraste das cores atenda ao piso de 4.5:1 da WCAG para evitar textos ilegíveis em vidros transparentes.</li>
</ul>
<div class="wzw-callout wzw-callout-success">
<p><strong>Próximo Passo:</strong> O CSS moderno evoluiu para além do que muitos imaginavam ser possível. E se você pudesse selecionar um elemento pai com base nos filhos que ele possui (o Santo Graal do seletor de pai <code>:has()</code>) ou criar componentes responsivos com base no tamanho do seu próprio contêiner em vez da janela com <code>@container</code>? Na <strong>Lição 47</strong>, desvendaremos os <strong>Seletores Modernos (:is, :where, :has &#038; @container queries)</strong>!</p>
</div>
<p>O post <a href="https://webzoneware.com/web-academy/curso-css/filtros-css-backdrop-filter-glassmorphism/">Filtros e Glassmorphism Modernos no CSS | Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://webzoneware.com/web-academy/curso-css/filtros-css-backdrop-filter-glassmorphism/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>CSS Variables e Dark Mode Dinâmico no CSS &#124; Web Academy</title>
		<link>https://webzoneware.com/web-academy/curso-css/css-variables-custom-properties-dark-mode/</link>
					<comments>https://webzoneware.com/web-academy/curso-css/css-variables-custom-properties-dark-mode/#respond</comments>
		
		<dc:creator><![CDATA[Web-Zoneware]]></dc:creator>
		<pubDate>Thu, 22 Oct 2026 03:47:07 +0000</pubDate>
				<category><![CDATA[Curso de CSS e CSS3]]></category>
		<category><![CDATA[css variables]]></category>
		<category><![CDATA[curso css3 completo]]></category>
		<category><![CDATA[custom properties]]></category>
		<category><![CDATA[dark mode css]]></category>
		<category><![CDATA[root css]]></category>
		<category><![CDATA[theming dinamico]]></category>
		<category><![CDATA[tokens de design]]></category>
		<guid isPermaLink="false">https://webzoneware.com/?p=29469</guid>

					<description><![CDATA[<p>Durante muitos anos, o gerenciamento de cores e medidas no CSS foi caótico. Se a sua empresa decidisse alterar o azul corporativo da marca, você era forçado a fazer um &#8220;localizar e substituir&#8221; em milhares de linhas de código, com o risco constante de esquecer elementos. As CSS Custom Properties, universalmente chamadas de CSS Variables, [&#8230;]</p>
<p>O post <a href="https://webzoneware.com/web-academy/curso-css/css-variables-custom-properties-dark-mode/">CSS Variables e Dark Mode Dinâmico no CSS | Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wzw-lesson-lead">
  Durante muitos anos, o gerenciamento de cores e medidas no CSS foi caótico. Se a sua empresa decidisse alterar o azul corporativo da marca, você era forçado a fazer um &#8220;localizar e substituir&#8221; em milhares de linhas de código, com o risco constante de esquecer elementos. As <strong>CSS Custom Properties</strong>, universalmente chamadas de <strong>CSS Variables</strong>, representaram o maior salto de engenharia de software da história do CSS. Ao contrário das variáveis antigas de pré-processadores como o Sass, as variáveis CSS vivem no DOM em tempo de execução, herdam pela cascata, reagem a media queries e podem ser manipuladas instantaneamente pelo JavaScript para alternar entre <strong>Modo Claro e Modo Escuro</strong> com zero recarregamento de página.
</p>
<h2>1. A Sintaxe: Declarando e Consumindo Variáveis</h2>
<p>
  A declaração de uma variável CSS sempre inicia com dois traços (<code>--</code>), e o seu consumo é feito através da função <code>var()</code>:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-18217" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">13 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-18217', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-18217', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">/* 1. DECLARAÇÃO GLOBAL NO :root */</span></span>
<span class="wzw-code-line"><span class="wzw-tk-kw">:root</span> {</span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--cor-primaria: #38bdf8;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--espacamento-padrao: 16px;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--raio-borda: 10px;</span></span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">/* 2. CONSUMO EM QUALQUER SELETOR */</span></span>
<span class="wzw-code-line">.cartao {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border</span>: <span class="wzw-tk-num">1px</span> solid var(--cor-primaria);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">padding</span>: var(--espacamento-padrao);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-radius</span>: var(--raio-borda);</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* 1. DECLARAÇÃO GLOBAL NO :root */
:root {
  --cor-primaria: #38bdf8;
  --espacamento-padrao: 16px;
  --raio-borda: 10px;
}

/* 2. CONSUMO EM QUALQUER SELETOR */
.cartao {
  border: 1px solid var(--cor-primaria);
  padding: var(--espacamento-padrao);
  border-radius: var(--raio-borda);
}</textarea>
        </div>
    </div>
    
</div>
<h3>Valores de Reserva (Fallbacks)</h3>
<p>
  A função <code>var()</code> aceita um segundo parâmetro opcional como valor de segurança (fallback). Se a variável não estiver definida no escopo, o navegador adota o fallback automaticamente:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-67139" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">9 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-67139', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-67139', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">/* Se --cor-destaque não existir, usa #2563eb */</span></span>
<span class="wzw-code-line">.btn {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background-color</span>: var(--cor-destaque, <span class="wzw-tk-num">#2563eb</span>);</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">/* Fallback encadeado em cascata */</span></span>
<span class="wzw-code-line">.titulo {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: var(--cor-customizada, var(--cor-primaria, <span class="wzw-tk-num">#0f172a</span>));</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* Se --cor-destaque não existir, usa #2563eb */
.btn {
  background-color: var(--cor-destaque, #2563eb);
}

/* Fallback encadeado em cascata */
.titulo {
  color: var(--cor-customizada, var(--cor-primaria, #0f172a));
}</textarea>
        </div>
    </div>
    
</div>
<h2>2. Escopo Global vs. Escopo Local (A Cascata Viva)</h2>
<p>
  O maior diferencial das CSS Variables sobre o Sass é que elas <strong>respeitam o escopo da árvore do DOM</strong>:
</p>
<h3>1. Escopo Global (<code>:root</code>)</h3>
<p>
  O pseudo-elemento <code>:root</code> representa a raiz do documento (o elemento <code>&lt;html&gt;</code>), mas possui uma especificidade maior. Qualquer variável declarada no <code>:root</code> é herdada por absolutamente todos os elementos da página.
</p>
<h3>2. Escopo Local (Component-Level Overriding)</h3>
<p>
  Você pode redefinir o valor de uma variável dentro de um contêiner específico. Apenas aquele contêiner e seus filhos passarão a enxergar o novo valor:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-83739" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">16 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-83739', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-83739', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-kw">:root</span> {</span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--btn-bg: #2563eb; /* Azul padrão global */</span></span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">/* Um banner de perigo reescreve a variável localmente */</span></span>
<span class="wzw-code-line">.banner-alerta {</span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--btn-bg: #ef4444; /* Vermelho apenas dentro do banner! */</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: <span class="wzw-tk-num">#450a0a</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">padding</span>: <span class="wzw-tk-num">20px</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">/* O botão consome --btn-bg: se estiver no site é azul, se estiver no banner é vermelho! */</span></span>
<span class="wzw-code-line">.btn-acao {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background-color</span>: var(--btn-bg);</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#fff</span>;</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>:root {
  --btn-bg: #2563eb; /* Azul padrão global */
}

/* Um banner de perigo reescreve a variável localmente */
.banner-alerta {
  --btn-bg: #ef4444; /* Vermelho apenas dentro do banner! */
  background: #450a0a;
  padding: 20px;
}

/* O botão consome --btn-bg: se estiver no site é azul, se estiver no banner é vermelho! */
.btn-acao {
  background-color: var(--btn-bg);
  color: #fff;
}</textarea>
        </div>
    </div>
    
</div>
<h2>3. A Regra de Ouro dos Tokens Semânticos</h2>
<div class="wzw-callout wzw-callout-warning">
<p><strong>Anti-padrão Fatal:</strong> Nunca nomeie suas variáveis com nomes de cores físicas (como <code>--azul</code>, <code>--verde</code> ou <code>--cinza-escuro</code>). Quando você criar o Modo Escuro, o seu &#8220;azul&#8221; ou &#8220;branco&#8221; precisará virar cinza escuro ou preto, tornando seu código confuso e ilegível!</p>
</div>
<p>
  Use sempre <strong>Design Tokens Semânticos</strong> baseados na <strong>função visual</strong> do elemento:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-56523" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">10 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-56523', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-56523', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">/* SISTEMA PROFISSIONAL DE DESIGN TOKENS */</span></span>
<span class="wzw-code-line"><span class="wzw-tk-kw">:root</span> {</span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--bg-pagina:          #ffffff;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--bg-superficie:      #f8fafc;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--bg-card:            #ffffff;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--texto-primario:     #0f172a;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--texto-secundario:   #64748b;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--borda-suave:        #e2e8f0;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--cor-marca:          #2563eb;</span></span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* SISTEMA PROFISSIONAL DE DESIGN TOKENS */
:root {
  --bg-pagina:          #ffffff;
  --bg-superficie:      #f8fafc;
  --bg-card:            #ffffff;
  --texto-primario:     #0f172a;
  --texto-secundario:   #64748b;
  --borda-suave:        #e2e8f0;
  --cor-marca:          #2563eb;
}</textarea>
        </div>
    </div>
    
</div>
<h2>4. Arquitetura Definitiva de Dark Mode</h2>
<p>
  Para criar um sistema de tema escuro de classe mundial, combinamos a detecção automática do sistema operacional com a capacidade de o usuário forçar o tema manualmente através de um atributo <code>data-theme</code>:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-65509" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">37 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-65509', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-65509', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">/* 1. TEMA CLARO PADRÃO */</span></span>
<span class="wzw-code-line"><span class="wzw-tk-kw">:root</span> {</span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--bg-pagina:        #f8fafc;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--bg-card:          #ffffff;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--texto-corpo:      #0f172a;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--borda:            #cbd5e1;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--destaque:         #2563eb;</span></span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">/* 2. MODO ESCURO AUTOMÁTICO (PREFERÊNCIA DO SISTEMA OPERACIONAL) */</span></span>
<span class="wzw-code-line"><span class="wzw-tk-kw">@media</span> (prefers-color-scheme: dark) {</span>
<span class="wzw-code-line">  <span class="wzw-tk-kw">:root</span> {</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">--bg-pagina:      #0b0f19;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">--bg-card:        #1e293b;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">--texto-corpo:    #f8fafc;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">--borda:          #334155;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">--destaque:       #38bdf8;</span></span>
<span class="wzw-code-line">  }</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">/* 3. MODO ESCURO FORÇADO VIA JAVASCRIPT (DATA-THEME=&quot;DARK&quot;) */</span></span>
<span class="wzw-code-line">[data-theme=<span class="wzw-tk-str">&quot;dark&quot;</span>] {</span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--bg-pagina:        #0b0f19;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--bg-card:          #1e293b;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--texto-corpo:      #f8fafc;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--borda:          #334155;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--destaque:         #38bdf8;</span></span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">/* 4. MODO CLARO FORÇADO VIA JAVASCRIPT (DATA-THEME=&quot;LIGHT&quot;) */</span></span>
<span class="wzw-code-line">[data-theme=<span class="wzw-tk-str">&quot;light&quot;</span>] {</span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--bg-pagina:        #f8fafc;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--bg-card:          #ffffff;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--texto-corpo:      #0f172a;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--borda:            #cbd5e1;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">--destaque:         #2563eb;</span></span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* 1. TEMA CLARO PADRÃO */
:root {
  --bg-pagina:        #f8fafc;
  --bg-card:          #ffffff;
  --texto-corpo:      #0f172a;
  --borda:            #cbd5e1;
  --destaque:         #2563eb;
}

/* 2. MODO ESCURO AUTOMÁTICO (PREFERÊNCIA DO SISTEMA OPERACIONAL) */
@media (prefers-color-scheme: dark) {
  :root {
    --bg-pagina:      #0b0f19;
    --bg-card:        #1e293b;
    --texto-corpo:    #f8fafc;
    --borda:          #334155;
    --destaque:       #38bdf8;
  }
}

/* 3. MODO ESCURO FORÇADO VIA JAVASCRIPT (DATA-THEME=&quot;DARK&quot;) */
[data-theme=&quot;dark&quot;] {
  --bg-pagina:        #0b0f19;
  --bg-card:          #1e293b;
  --texto-corpo:      #f8fafc;
  --borda:          #334155;
  --destaque:         #38bdf8;
}

/* 4. MODO CLARO FORÇADO VIA JAVASCRIPT (DATA-THEME=&quot;LIGHT&quot;) */
[data-theme=&quot;light&quot;] {
  --bg-pagina:        #f8fafc;
  --bg-card:          #ffffff;
  --texto-corpo:      #0f172a;
  --borda:            #cbd5e1;
  --destaque:         #2563eb;
}</textarea>
        </div>
    </div>
    
</div>
<h2>5. Reatividade em Tempo Real com JavaScript</h2>
<p>
  Como as CSS Variables vivem no DOM computado, você pode manipulá-las diretamente pelo JavaScript sem precisar recalcular regras de classe:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-39010" data-lang="javascript">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">JavaScript</span>
                                <span class="wzw-ide-lines-count">5 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-39010', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-39010', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">// Altera uma variável global instantaneamente:</span></span>
<span class="wzw-code-line">document.documentElement.style.<span class="wzw-tk-fn">setProperty</span>(<span class="wzw-tk-str">&#039;--destaque&#039;</span>, <span class="wzw-tk-str">&#039;#10b981&#039;</span>);</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">// Lê o valor computado de uma variável:</span></span>
<span class="wzw-code-line"><span class="wzw-tk-kw">const</span> corAtual = <span class="wzw-tk-fn">getComputedStyle</span>(document.documentElement).<span class="wzw-tk-fn">getPropertyValue</span>(<span class="wzw-tk-str">&#039;--destaque&#039;</span>);</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>// Altera uma variável global instantaneamente:
document.documentElement.style.setProperty(&#039;--destaque&#039;, &#039;#10b981&#039;);

// Lê o valor computado de uma variável:
const corAtual = getComputedStyle(document.documentElement).getPropertyValue(&#039;--destaque&#039;);</textarea>
        </div>
    </div>
    
</div>
<h2>6. Laboratório Prático: Switcher de Dark Mode Completo</h2>
<p>
  No código interativo abaixo, construímos um componente de dashboard que consome tokens semânticos e alterna dinamicamente entre Tema Claro e Tema Escuro ao clique de um botão:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-30892" data-lang="html">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">HTML5</span>
                                <span class="wzw-ide-lines-count">106 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-30892', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-30892', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-tag">&lt;!DOCTYPE</span><span class="wzw-tk-kw"> html</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;html</span> <span class="wzw-tk-attr">lang</span>=<span class="wzw-tk-str">&quot;pt-BR&quot;</span> <span class="wzw-tk-attr">data-theme</span>=<span class="wzw-tk-str">&quot;dark&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;head&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;meta</span> <span class="wzw-tk-attr">charset</span>=<span class="wzw-tk-str">&quot;UTF-8&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;title&gt;</span>Laboratório de CSS Variables e Dark Mode<span class="wzw-tk-tag">&lt;/title&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;style&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">/* TOKENS SEMÂNTICOS NO ESCOPO RAIZ */</span></span>
<span class="wzw-code-line">    :root, [data-theme=&quot;dark&quot;] {</span>
<span class="wzw-code-line">      <span class="wzw-tk-comment">--bg: #0b0f19;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-comment">--card-bg: #1e293b;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-comment">--texto: #f8fafc;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-comment">--texto-mutado: #94a3b8;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-comment">--borda: #334155;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-comment">--primaria: #38bdf8;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-comment">--btn-texto: #0b0f19;</span></span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    [data-theme=&quot;light&quot;] {</span>
<span class="wzw-code-line">      <span class="wzw-tk-comment">--bg: #f1f5f9;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-comment">--card-bg: #ffffff;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-comment">--texto: #0f172a;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-comment">--texto-mutado: #64748b;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-comment">--borda: #cbd5e1;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-comment">--primaria: #2563eb;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-comment">--btn-texto: #ffffff;</span></span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    body {</span>
<span class="wzw-code-line">      background-color: var(--bg);</span>
<span class="wzw-code-line">      color: var(--texto);</span>
<span class="wzw-code-line">      font-family: &#039;Inter&#039;, system-ui, sans-serif;</span>
<span class="wzw-code-line">      padding: 40px;</span>
<span class="wzw-code-line">      margin: 0;</span>
<span class="wzw-code-line">      transition: background-color 0.3s ease, color 0.3s ease;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .painel-container {</span>
<span class="wzw-code-line">      max-width: 480px;</span>
<span class="wzw-code-line">      background-color: var(--card-bg);</span>
<span class="wzw-code-line">      border: 1px solid var(--borda);</span>
<span class="wzw-code-line">      border-radius: 14px;</span>
<span class="wzw-code-line">      padding: 24px;</span>
<span class="wzw-code-line">      box-shadow: 0 8px 24px rgba(0,0,0,0.15);</span>
<span class="wzw-code-line">      transition: background-color 0.3s ease, border-color 0.3s ease;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .cabecalho-card {</span>
<span class="wzw-code-line">      display: flex;</span>
<span class="wzw-code-line">      justify-content: space-between;</span>
<span class="wzw-code-line">      align-items: center;</span>
<span class="wzw-code-line">      margin-bottom: 16px;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    h3 { margin: 0; color: var(--primaria); font-size: 1.2rem; }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    p {</span>
<span class="wzw-code-line">      color: var(--texto-mutado);</span>
<span class="wzw-code-line">      font-size: 0.9rem;</span>
<span class="wzw-code-line">      line-height: 1.6;</span>
<span class="wzw-code-line">      margin: 0 0 20px 0;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">/* Botão que troca o tema via JavaScript */</span></span>
<span class="wzw-code-line">    .btn-toggle-tema {</span>
<span class="wzw-code-line">      background-color: var(--primaria);</span>
<span class="wzw-code-line">      color: var(--btn-texto);</span>
<span class="wzw-code-line">      border: none;</span>
<span class="wzw-code-line">      padding: 10px 16px;</span>
<span class="wzw-code-line">      border-radius: 8px;</span>
<span class="wzw-code-line">      font-weight: 700;</span>
<span class="wzw-code-line">      cursor: pointer;</span>
<span class="wzw-code-line">      display: inline-flex;</span>
<span class="wzw-code-line">      align-items: center;</span>
<span class="wzw-code-line">      gap: 8px;</span>
<span class="wzw-code-line">      transition: transform 0.2s ease;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .btn-toggle-tema:active {</span>
<span class="wzw-code-line">      transform: scale(0.96);</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;/style&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;/head&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;body&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;painel-container&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;cabecalho-card&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;h3&gt;</span>⚡ Web-ZoneWare Theme<span class="wzw-tk-tag">&lt;/h3&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;button</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;btn-toggle-tema&quot;</span> <span class="wzw-tk-attr">onclick</span>=<span class="wzw-tk-str">&quot;alternarTema()&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">        🌓 Alternar Tema</span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;/button&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;p&gt;</span></span>
<span class="wzw-code-line">      Este cartão consome exclusivamente variáveis CSS semânticas (<span class="wzw-tk-tag">&lt;code&gt;</span>--bg<span class="wzw-tk-tag">&lt;/code&gt;</span>, <span class="wzw-tk-tag">&lt;code&gt;</span>--card-bg<span class="wzw-tk-tag">&lt;/code&gt;</span>, <span class="wzw-tk-tag">&lt;code&gt;</span>--primaria<span class="wzw-tk-tag">&lt;/code&gt;</span>). Clique no botão acima para alternar entre Dark e Light Mode em tempo real!</span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;/p&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;script&gt;</span></span>
<span class="wzw-code-line">    function alternarTema() {</span>
<span class="wzw-code-line">      const html = document.documentElement;</span>
<span class="wzw-code-line">      const temaAtual = html.getAttribute(&#039;data-theme&#039;);</span>
<span class="wzw-code-line">      const novoTema = (temaAtual === &#039;dark&#039;) ? &#039;light&#039; : &#039;dark&#039;;</span>
<span class="wzw-code-line">      html.setAttribute(&#039;data-theme&#039;, novoTema);</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;/script&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;/body&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;/html&gt;</span></span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;pt-BR&quot; data-theme=&quot;dark&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;title&gt;Laboratório de CSS Variables e Dark Mode&lt;/title&gt;
  &lt;style&gt;
    /* TOKENS SEMÂNTICOS NO ESCOPO RAIZ */
    :root, [data-theme=&quot;dark&quot;] {
      --bg: #0b0f19;
      --card-bg: #1e293b;
      --texto: #f8fafc;
      --texto-mutado: #94a3b8;
      --borda: #334155;
      --primaria: #38bdf8;
      --btn-texto: #0b0f19;
    }

    [data-theme=&quot;light&quot;] {
      --bg: #f1f5f9;
      --card-bg: #ffffff;
      --texto: #0f172a;
      --texto-mutado: #64748b;
      --borda: #cbd5e1;
      --primaria: #2563eb;
      --btn-texto: #ffffff;
    }

    body {
      background-color: var(--bg);
      color: var(--texto);
      font-family: &#039;Inter&#039;, system-ui, sans-serif;
      padding: 40px;
      margin: 0;
      transition: background-color 0.3s ease, color 0.3s ease;
    }

    .painel-container {
      max-width: 480px;
      background-color: var(--card-bg);
      border: 1px solid var(--borda);
      border-radius: 14px;
      padding: 24px;
      box-shadow: 0 8px 24px rgba(0,0,0,0.15);
      transition: background-color 0.3s ease, border-color 0.3s ease;
    }

    .cabecalho-card {
      display: flex;
      justify-content: space-between;
      align-items: center;
      margin-bottom: 16px;
    }

    h3 { margin: 0; color: var(--primaria); font-size: 1.2rem; }

    p {
      color: var(--texto-mutado);
      font-size: 0.9rem;
      line-height: 1.6;
      margin: 0 0 20px 0;
    }

    /* Botão que troca o tema via JavaScript */
    .btn-toggle-tema {
      background-color: var(--primaria);
      color: var(--btn-texto);
      border: none;
      padding: 10px 16px;
      border-radius: 8px;
      font-weight: 700;
      cursor: pointer;
      display: inline-flex;
      align-items: center;
      gap: 8px;
      transition: transform 0.2s ease;
    }

    .btn-toggle-tema:active {
      transform: scale(0.96);
    }
  &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;div class=&quot;painel-container&quot;&gt;
    &lt;div class=&quot;cabecalho-card&quot;&gt;
      &lt;h3&gt;⚡ Web-ZoneWare Theme&lt;/h3&gt;
      &lt;button class=&quot;btn-toggle-tema&quot; onclick=&quot;alternarTema()&quot;&gt;
        🌓 Alternar Tema
      &lt;/button&gt;
    &lt;/div&gt;

    &lt;p&gt;
      Este cartão consome exclusivamente variáveis CSS semânticas (&lt;code&gt;--bg&lt;/code&gt;, &lt;code&gt;--card-bg&lt;/code&gt;, &lt;code&gt;--primaria&lt;/code&gt;). Clique no botão acima para alternar entre Dark e Light Mode em tempo real!
    &lt;/p&gt;
  &lt;/div&gt;

  &lt;script&gt;
    function alternarTema() {
      const html = document.documentElement;
      const temaAtual = html.getAttribute(&#039;data-theme&#039;);
      const novoTema = (temaAtual === &#039;dark&#039;) ? &#039;light&#039; : &#039;dark&#039;;
      html.setAttribute(&#039;data-theme&#039;, novoTema);
    }
  &lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</textarea>
        </div>
    </div>
    
</div>
<p>
  Abra este laboratório no Playground IDE e teste clicar no botão de alternância para ver todas as cores do cartão e do fundo se transformarem suavemente sem recarregar a página:
</p>
<p style="text-align: center; margin: 35px 0;">
  <a href="https://webzoneware.com/web-academy/playground-web/" class="wzw-btn-playground" target="_blank" rel="noopener">⚡ Abrir no Playground IDE &rarr;</a>
</p>
<h2>7. Resumo e Próximos Passos</h2>
<ul>
<li>CSS Variables (Custom Properties) são declaradas com <code>--nome</code> e consumidas com <code>var(--nome, fallback)</code>.</li>
<li>Vivem na árvore do DOM em tempo de execução, respeitam o escopo da cascata e herdam valores de pais para filhos.</li>
<li>Declare tokens globais no <code>:root</code> e use tokens semânticos funcionais (como <code>--bg-card</code>) em vez de nomes físicos de cores.</li>
<li>A fusão de <code>@media (prefers-color-scheme)</code> com <code>[data-theme]</code> cria sistemas de Dark Mode elegantes e controláveis pelo usuário.</li>
<li>O JavaScript pode ler e atualizar variáveis CSS dinamicamente através de <code>setProperty()</code>.</li>
</ul>
<div class="wzw-callout wzw-callout-success">
<p><strong>Próximo Passo:</strong> Agora que você domina as variáveis e o Dark Mode, como criar aquela estética translúcida futurista de vidro fosco (Glassmorphism) com desfoque de fundo e filtros visuais? Na <strong>Lição 46</strong>, mergulharemos em <strong>Filtros &#038; Glassmorphism no CSS (filter e backdrop-filter)</strong>!</p>
</div>
<p>O post <a href="https://webzoneware.com/web-academy/curso-css/css-variables-custom-properties-dark-mode/">CSS Variables e Dark Mode Dinâmico no CSS | Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://webzoneware.com/web-academy/curso-css/css-variables-custom-properties-dark-mode/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Animações Profissionais com @keyframes no CSS &#124; Web Academy</title>
		<link>https://webzoneware.com/web-academy/curso-css/animacoes-keyframes-css/</link>
					<comments>https://webzoneware.com/web-academy/curso-css/animacoes-keyframes-css/#respond</comments>
		
		<dc:creator><![CDATA[Web-Zoneware]]></dc:creator>
		<pubDate>Thu, 22 Oct 2026 03:42:26 +0000</pubDate>
				<category><![CDATA[Curso de CSS e CSS3]]></category>
		<category><![CDATA[animacoes css]]></category>
		<category><![CDATA[animation shorthand]]></category>
		<category><![CDATA[animation-fill-mode]]></category>
		<category><![CDATA[curso css3 completo]]></category>
		<category><![CDATA[keyframes css]]></category>
		<category><![CDATA[steps css]]></category>
		<guid isPermaLink="false">https://webzoneware.com/?p=29467</guid>

					<description><![CDATA[<p>Na lição anterior, você aprendeu que as transições são perfeitas para suavizar a passagem entre dois estados quando o usuário interage com a página. No entanto, muitas interfaces exigem experiências cinematográficas contínuas: indicadores de carregamento que giram sem parar, notificações que entram suavemente na tela assim que o documento abre, ou ilustrações que flutuam em [&#8230;]</p>
<p>O post <a href="https://webzoneware.com/web-academy/curso-css/animacoes-keyframes-css/">Animações Profissionais com @keyframes no CSS | Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wzw-lesson-lead">
  Na lição anterior, você aprendeu que as transições são perfeitas para suavizar a passagem entre dois estados quando o usuário interage com a página. No entanto, muitas interfaces exigem experiências cinematográficas contínuas: indicadores de carregamento que giram sem parar, notificações que entram suavemente na tela assim que o documento abre, ou ilustrações que flutuam em ciclos infinitos de respiração. Para coreografar múltiplos estágios temporais sem depender de ações do mouse, o CSS nos entrega o poderoso motor de <strong><code>@keyframes</code> e a propriedade <code>animation</code></strong>.
</p>
<h2>1. A Linha do Tempo: Criando Regras com <code>@keyframes</code></h2>
<p>
  Uma animação em CSS é dividida em duas partes: a <strong>linha do tempo (Timeline)</strong>, declarada com a regra-arroba <code>@keyframes</code>, e a <strong>aplicação da animação</strong>, configurada no seletor do elemento.
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-88596" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">20 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-88596', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-88596', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">/* 1. DEFINIÇÃO DA LINHA DO TEMPO */</span></span>
<span class="wzw-code-line"><span class="wzw-tk-kw">@keyframes</span> pulsarBrilho {</span>
<span class="wzw-code-line">  0% {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">transform</span>: scale(1);</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">opacity</span>: 0.6;</span>
<span class="wzw-code-line">  }</span>
<span class="wzw-code-line">  50% {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">transform</span>: scale(1.12);</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">opacity</span>: 1;</span>
<span class="wzw-code-line">  }</span>
<span class="wzw-code-line">  100% {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">transform</span>: scale(1);</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">opacity</span>: 0.6;</span>
<span class="wzw-code-line">  }</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-comment">/* 2. APLICAÇÃO NO ELEMENTO */</span></span>
<span class="wzw-code-line">.badge-alerta {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">animation</span>: pulsarBrilho <span class="wzw-tk-num">2s</span> ease-in-out infinite;</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* 1. DEFINIÇÃO DA LINHA DO TEMPO */
@keyframes pulsarBrilho {
  0% {
    transform: scale(1);
    opacity: 0.6;
  }
  50% {
    transform: scale(1.12);
    opacity: 1;
  }
  100% {
    transform: scale(1);
    opacity: 0.6;
  }
}

/* 2. APLICAÇÃO NO ELEMENTO */
.badge-alerta {
  animation: pulsarBrilho 2s ease-in-out infinite;
}</textarea>
        </div>
    </div>
    
</div>
<p>
  Você pode usar as palavras-chave <code>from</code> (equivalente a <code>0%</code>) e <code>to</code> (equivalente a <code>100%</code>) para animações simples, ou declarar quantos marcos percentuais intermediários desejar (<code>0%</code>, <code>25%</code>, <code>60%</code>, <code>100%</code>) para coreografias ricas.
</p>
<h2>2. As 8 Subpropriedades do <code>animation</code></h2>
<p>
  A propriedade abreviada <code>animation</code> encapsula 8 controles cirúrgicos:
</p>
<div class="wzw-table-responsive">
<table class="wzw-table">
<thead>
<tr>
<th>Propriedade</th>
<th>Valores Principais</th>
<th>Função na Animação</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>animation-name</code></td>
<td>Nome da regra <code>@keyframes</code></td>
<td>Conecta o elemento à sua linha do tempo.</td>
</tr>
<tr>
<td><code>animation-duration</code></td>
<td>Tempo (ex.: <code>1.5s</code>, <code>400ms</code>)</td>
<td>Duração de exatamente 1 ciclo da animação.</td>
</tr>
<tr>
<td><code>animation-timing-function</code></td>
<td><code>ease</code>, <code>linear</code>, <code>cubic-bezier</code>, <code>steps()</code></td>
<td>Curva de aceleração do movimento.</td>
</tr>
<tr>
<td><code>animation-delay</code></td>
<td>Tempo positivo ou negativo (ex.: <code>-0.5s</code>)</td>
<td>Tempo de espera antes do início do primeiro ciclo.</td>
</tr>
<tr>
<td><code>animation-iteration-count</code></td>
<td>Número inteiro ou <strong><code>infinite</code></strong></td>
<td>Quantas vezes a animação repetirá o ciclo.</td>
</tr>
<tr>
<td><code>animation-direction</code></td>
<td><code>normal</code>, <code>reverse</code>, <code>alternate</code></td>
<td><code>alternate</code> cria o efeito de ping-pong (vai e volta suavemente).</td>
</tr>
<tr>
<td><strong><code>animation-fill-mode</code></strong></td>
<td><code>none</code>, <code>forwards</code>, <code>backwards</code>, <code>both</code></td>
<td>Controla como os estilos persistem antes e após a execução.</td>
</tr>
<tr>
<td><code>animation-play-state</code></td>
<td><code>running</code>, <code>paused</code></td>
<td>Permite pausar ou retomar a animação (ex.: no <code>:hover</code>).</td>
</tr>
</tbody>
</table>
</div>
<h2>3. <code>animation-fill-mode</code>: O Fim dos Saltos Bruscos</h2>
<p>
  O maior pesadelo dos iniciantes é animar um card surgindo de baixo para cima com fade-in: a animação roda lindamente e, no instante em que chega a 100%, <strong>o card desaparece ou salta bruscamente de volta para o estado inicial</strong>!
</p>
<p>
  Isso acontece porque, por padrão (<code>animation-fill-mode: none</code>), o navegador descarta todos os estilos do <code>@keyframes</code> assim que a animação termina.
</p>
<div class="wzw-callout wzw-callout-info">
<p><strong>A Solução Definitiva com <code>forwards</code> e <code>both</code>:</strong></p>
<ul>
<li><strong><code>forwards</code>:</strong> Ordena ao navegador que <strong>mantenha permanentemente os estilos do último frame (100%)</strong> na tela após o término. O elemento nunca mais salta de volta!</li>
<li><strong><code>backwards</code>:</strong> Aplica os estilos do primeiro frame (0%) durante o período do <code>animation-delay</code> (evita que o elemento apareça antes da hora).</li>
<li><strong><code>both</code>:</strong> O padrão ouro! Aplica tanto <code>forwards</code> quanto <code>backwards</code>, garantindo entradas de tela impecáveis.</li>
</ul>
</div>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-47657" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">15 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-47657', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-47657', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">/* Animação de Entrada Perfeita e Sem Saltos */</span></span>
<span class="wzw-code-line">.card-entrada {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">animation</span>: deslizarParaCima <span class="wzw-tk-num">0.6s</span> cubic-bezier(0.16, 1, 0.3, 1) both;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-kw">@keyframes</span> deslizarParaCima {</span>
<span class="wzw-code-line">  from {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">opacity</span>: 0;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">transform</span>: translateY(<span class="wzw-tk-num">30px</span>);</span>
<span class="wzw-code-line">  }</span>
<span class="wzw-code-line">  to {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">opacity</span>: 1;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">transform</span>: translateY(0);</span>
<span class="wzw-code-line">  }</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* Animação de Entrada Perfeita e Sem Saltos */
.card-entrada {
  animation: deslizarParaCima 0.6s cubic-bezier(0.16, 1, 0.3, 1) both;
}

@keyframes deslizarParaCima {
  from {
    opacity: 0;
    transform: translateY(30px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}</textarea>
        </div>
    </div>
    
</div>
<h2>4. Pausando Loops no Hover: <code>animation-play-state</code></h2>
<p>
  Se você tem uma fita de marcas correndo na tela (<em>marquee</em> infinito) ou um disco girando, o usuário pode querer pausar a animação para ler com calma ao passar o mouse:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-83489" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">7 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-83489', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-83489', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line">.disco-giratorio {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">animation</span>: girar <span class="wzw-tk-num">8s</span> linear infinite;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.disco-giratorio<span class="wzw-tk-kw">:hover</span> {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">animation-play-state</span>: paused; /* Congela o giro exatamente no frame atual! */</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>.disco-giratorio {
  animation: girar 8s linear infinite;
}

.disco-giratorio:hover {
  animation-play-state: paused; /* Congela o giro exatamente no frame atual! */
}</textarea>
        </div>
    </div>
    
</div>
<h2>5. Animações em Degraus com <code>steps()</code>: O Efeito Máquina de Escrever</h2>
<p>
  Em vez de uma transição fluida e suave, a função <strong><code>steps(n)</code></strong> quebra a interpolação em um número fixo de &#8220;degraus&#8221; discretos. É a base para animar spritesheets de jogos retrô e criar o efeito de digitação mecânica (Typewriter):
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-42766" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">11 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-42766', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-42766', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line">.texto-maquina {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">overflow</span>: hidden;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">white-space</span>: nowrap;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">width</span>: 22ch; /* Largura exata de 22 caracteres */</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">animation</span>: digitar <span class="wzw-tk-num">3s</span> steps(22) infinite alternate;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line"><span class="wzw-tk-kw">@keyframes</span> digitar {</span>
<span class="wzw-code-line">  from { width: 0; }</span>
<span class="wzw-code-line">  to { width: 22ch; }</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>.texto-maquina {
  overflow: hidden;
  white-space: nowrap;
  width: 22ch; /* Largura exata de 22 caracteres */
  animation: digitar 3s steps(22) infinite alternate;
}

@keyframes digitar {
  from { width: 0; }
  to { width: 22ch; }
}</textarea>
        </div>
    </div>
    
</div>
<h2>6. Acessibilidade e Performance Gráfica (WCAG 2.2)</h2>
<div class="wzw-callout wzw-callout-warning">
<p><strong>Blindagem de Performance e Saúde:</strong></p>
<ul>
<li><strong>Performance:</strong> Anime preferencialmente <strong><code>transform</code></strong> e <strong><code>opacity</code></strong>. Evite animar <code>width</code>, <code>height</code>, <code>top</code> ou <code>margin</code> em loops infinitos, sob pena de travar a CPU e descarregar baterias de celulares.</li>
<li><strong>Acessibilidade:</strong> Elementos piscantes ou que se movem continuamente podem desencadear convulsões ou tonturas severas. É obrigatório incluir:
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-22078" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">6 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-22078', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-22078', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-kw">@media</span> (prefers-reduced-motion: reduce) {</span>
<span class="wzw-code-line">  * {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">animation-duration</span>: <span class="wzw-tk-num">0.01ms</span> <span class="wzw-tk-kw">!important</span>;</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">animation-iteration-count</span>: 1 <span class="wzw-tk-kw">!important</span>;</span>
<span class="wzw-code-line">  }</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>@media (prefers-reduced-motion: reduce) {
  * {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
  }
}</textarea>
        </div>
    </div>
    </div>
</li>
</ul>
</div>
<h2>7. Laboratório Prático: 3 Animações de Produção em Ação</h2>
<p>
  No código interativo abaixo, construímos três animações do mundo real: um <strong>Spinner de Carregamento Infinito</strong>, um <strong>Efeito Máquina de Escrever com Cursor Piscante</strong> e um <strong>Card com Entrada Suave (Fade &#038; Slide)</strong> usando <code>animation-fill-mode: both</code>:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-31923" data-lang="html">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">HTML5</span>
                                <span class="wzw-ide-lines-count">113 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-31923', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-31923', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-tag">&lt;!DOCTYPE</span><span class="wzw-tk-kw"> html</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;html</span> <span class="wzw-tk-attr">lang</span>=<span class="wzw-tk-str">&quot;pt-BR&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;head&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;meta</span> <span class="wzw-tk-attr">charset</span>=<span class="wzw-tk-str">&quot;UTF-8&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;title&gt;</span>Laboratório de Animações @keyframes CSS<span class="wzw-tk-tag">&lt;/title&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;style&gt;</span></span>
<span class="wzw-code-line">    body {</span>
<span class="wzw-code-line">      font-family: &#039;Inter&#039;, system-ui, sans-serif;</span>
<span class="wzw-code-line">      background: #0b0f19;</span>
<span class="wzw-code-line">      color: #f8fafc;</span>
<span class="wzw-code-line">      padding: 40px;</span>
<span class="wzw-code-line">      margin: 0;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .painel-grid {</span>
<span class="wzw-code-line">      display: grid;</span>
<span class="wzw-code-line">      grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));</span>
<span class="wzw-code-line">      gap: 24px;</span>
<span class="wzw-code-line">      margin-top: 24px;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .card-animacao {</span>
<span class="wzw-code-line">      background: #1e293b;</span>
<span class="wzw-code-line">      border: 1px solid #334155;</span>
<span class="wzw-code-line">      border-radius: 14px;</span>
<span class="wzw-code-line">      padding: 24px;</span>
<span class="wzw-code-line">      display: flex;</span>
<span class="wzw-code-line">      flex-direction: column;</span>
<span class="wzw-code-line">      align-items: center;</span>
<span class="wzw-code-line">      justify-content: center;</span>
<span class="wzw-code-line">      min-height: 200px;</span>
<span class="wzw-code-line">      text-align: center;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">/* 1. SPINNER DE CARREGAMENTO (LOOP INFINITO) */</span></span>
<span class="wzw-code-line">    .spinner-radar {</span>
<span class="wzw-code-line">      width: 48px;</span>
<span class="wzw-code-line">      height: 48px;</span>
<span class="wzw-code-line">      border: 4px solid #334155;</span>
<span class="wzw-code-line">      border-top-color: #38bdf8;</span>
<span class="wzw-code-line">      border-radius: 50%;</span>
<span class="wzw-code-line">      animation: girar 1s linear infinite;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    @keyframes girar {</span>
<span class="wzw-code-line">      to { transform: rotate(360deg); }</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">/* 2. EFEITO TYPEWRITER COM STEPS() */</span></span>
<span class="wzw-code-line">    .typewriter-box {</span>
<span class="wzw-code-line">      display: inline-block;</span>
<span class="wzw-code-line">      font-family: monospace;</span>
<span class="wzw-code-line">      font-size: 1.1rem;</span>
<span class="wzw-code-line">      color: #10b981;</span>
<span class="wzw-code-line">      white-space: nowrap;</span>
<span class="wzw-code-line">      overflow: hidden;</span>
<span class="wzw-code-line">      border-right: 3px solid #10b981;</span>
<span class="wzw-code-line">      width: 17ch; /* 17 caracteres */</span>
<span class="wzw-code-line">      animation: </span>
<span class="wzw-code-line">        escrever 3.5s steps(17) infinite alternate,</span>
<span class="wzw-code-line">        piscarCursor 0.7s step-end infinite;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    @keyframes escrever {</span>
<span class="wzw-code-line">      from { width: 0; }</span>
<span class="wzw-code-line">      to { width: 17ch; }</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    @keyframes piscarCursor {</span>
<span class="wzw-code-line">      50% { border-color: transparent; }</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">/* 3. CARD COM ENTRADA CINEMATOGRÁFICA (FILL-MODE: BOTH) */</span></span>
<span class="wzw-code-line">    .card-entrada-suave {</span>
<span class="wzw-code-line">      animation: surgirComFade 1s cubic-bezier(0.16, 1, 0.3, 1) both;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    @keyframes surgirComFade {</span>
<span class="wzw-code-line">      0% {</span>
<span class="wzw-code-line">        opacity: 0;</span>
<span class="wzw-code-line">        transform: translateY(24px) scale(0.95);</span>
<span class="wzw-code-line">      }</span>
<span class="wzw-code-line">      100% {</span>
<span class="wzw-code-line">        opacity: 1;</span>
<span class="wzw-code-line">        transform: translateY(0) scale(1);</span>
<span class="wzw-code-line">      }</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;/style&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;/head&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;body&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;h2</span> <span class="wzw-tk-attr">style</span>=<span class="wzw-tk-str">&quot;color:#f1f5f9; margin-top:0;&quot;</span><span class="wzw-tk-tag">&gt;</span>Animações Avançadas com @keyframes<span class="wzw-tk-tag">&lt;/h2&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;p</span> <span class="wzw-tk-attr">style</span>=<span class="wzw-tk-str">&quot;color:#94a3b8; font-size:0.9rem;&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">    Observe três cenários de produção controlados exclusivamente pelo motor gráfico do CSS:</span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;/p&gt;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;painel-grid&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;card-animacao&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;spinner-radar&quot;</span><span class="wzw-tk-tag">&gt;</span><span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;p</span> <span class="wzw-tk-attr">style</span>=<span class="wzw-tk-str">&quot;margin:16px 0 0 0; color:#94a3b8; font-size:0.85rem;&quot;</span><span class="wzw-tk-tag">&gt;</span>Spinner Infinito (linear infinite)<span class="wzw-tk-tag">&lt;/p&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;card-animacao&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;typewriter-box&quot;</span><span class="wzw-tk-tag">&gt;</span>Web-ZoneWare 2026<span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;p</span> <span class="wzw-tk-attr">style</span>=<span class="wzw-tk-str">&quot;margin:16px 0 0 0; color:#94a3b8; font-size:0.85rem;&quot;</span><span class="wzw-tk-tag">&gt;</span>Typewriter com <span class="wzw-tk-tag">&lt;code&gt;</span>steps()<span class="wzw-tk-tag">&lt;/code&gt;</span><span class="wzw-tk-tag">&lt;/p&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;card-animacao card-entrada-suave&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;h4</span> <span class="wzw-tk-attr">style</span>=<span class="wzw-tk-str">&quot;margin:0 0 8px 0; color:#38bdf8;&quot;</span><span class="wzw-tk-tag">&gt;</span>Entrada Blindada<span class="wzw-tk-tag">&lt;/h4&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;p</span> <span class="wzw-tk-attr">style</span>=<span class="wzw-tk-str">&quot;margin:0; font-size:0.85rem; color:#94a3b8;&quot;</span><span class="wzw-tk-tag">&gt;</span>Retém o estado com <span class="wzw-tk-tag">&lt;code&gt;</span>animation-fill-mode: both<span class="wzw-tk-tag">&lt;/code&gt;</span><span class="wzw-tk-tag">&lt;/p&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;/body&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;/html&gt;</span></span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;pt-BR&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;title&gt;Laboratório de Animações @keyframes CSS&lt;/title&gt;
  &lt;style&gt;
    body {
      font-family: &#039;Inter&#039;, system-ui, sans-serif;
      background: #0b0f19;
      color: #f8fafc;
      padding: 40px;
      margin: 0;
    }

    .painel-grid {
      display: grid;
      grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
      gap: 24px;
      margin-top: 24px;
    }

    .card-animacao {
      background: #1e293b;
      border: 1px solid #334155;
      border-radius: 14px;
      padding: 24px;
      display: flex;
      flex-direction: column;
      align-items: center;
      justify-content: center;
      min-height: 200px;
      text-align: center;
    }

    /* 1. SPINNER DE CARREGAMENTO (LOOP INFINITO) */
    .spinner-radar {
      width: 48px;
      height: 48px;
      border: 4px solid #334155;
      border-top-color: #38bdf8;
      border-radius: 50%;
      animation: girar 1s linear infinite;
    }

    @keyframes girar {
      to { transform: rotate(360deg); }
    }

    /* 2. EFEITO TYPEWRITER COM STEPS() */
    .typewriter-box {
      display: inline-block;
      font-family: monospace;
      font-size: 1.1rem;
      color: #10b981;
      white-space: nowrap;
      overflow: hidden;
      border-right: 3px solid #10b981;
      width: 17ch; /* 17 caracteres */
      animation: 
        escrever 3.5s steps(17) infinite alternate,
        piscarCursor 0.7s step-end infinite;
    }

    @keyframes escrever {
      from { width: 0; }
      to { width: 17ch; }
    }

    @keyframes piscarCursor {
      50% { border-color: transparent; }
    }

    /* 3. CARD COM ENTRADA CINEMATOGRÁFICA (FILL-MODE: BOTH) */
    .card-entrada-suave {
      animation: surgirComFade 1s cubic-bezier(0.16, 1, 0.3, 1) both;
    }

    @keyframes surgirComFade {
      0% {
        opacity: 0;
        transform: translateY(24px) scale(0.95);
      }
      100% {
        opacity: 1;
        transform: translateY(0) scale(1);
      }
    }
  &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;h2 style=&quot;color:#f1f5f9; margin-top:0;&quot;&gt;Animações Avançadas com @keyframes&lt;/h2&gt;
  &lt;p style=&quot;color:#94a3b8; font-size:0.9rem;&quot;&gt;
    Observe três cenários de produção controlados exclusivamente pelo motor gráfico do CSS:
  &lt;/p&gt;

  &lt;div class=&quot;painel-grid&quot;&gt;
    &lt;div class=&quot;card-animacao&quot;&gt;
      &lt;div class=&quot;spinner-radar&quot;&gt;&lt;/div&gt;
      &lt;p style=&quot;margin:16px 0 0 0; color:#94a3b8; font-size:0.85rem;&quot;&gt;Spinner Infinito (linear infinite)&lt;/p&gt;
    &lt;/div&gt;

    &lt;div class=&quot;card-animacao&quot;&gt;
      &lt;div class=&quot;typewriter-box&quot;&gt;Web-ZoneWare 2026&lt;/div&gt;
      &lt;p style=&quot;margin:16px 0 0 0; color:#94a3b8; font-size:0.85rem;&quot;&gt;Typewriter com &lt;code&gt;steps()&lt;/code&gt;&lt;/p&gt;
    &lt;/div&gt;

    &lt;div class=&quot;card-animacao card-entrada-suave&quot;&gt;
      &lt;h4 style=&quot;margin:0 0 8px 0; color:#38bdf8;&quot;&gt;Entrada Blindada&lt;/h4&gt;
      &lt;p style=&quot;margin:0; font-size:0.85rem; color:#94a3b8;&quot;&gt;Retém o estado com &lt;code&gt;animation-fill-mode: both&lt;/code&gt;&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</textarea>
        </div>
    </div>
    
</div>
<p>
  Abra este laboratório no Playground IDE e teste alterar a curva de aceleração ou a direção da animação para <code>alternate</code> para comprovar a versatilidade do <code>@keyframes</code>:
</p>
<p style="text-align: center; margin: 35px 0;">
  <a href="https://webzoneware.com/web-academy/playground-web/" class="wzw-btn-playground" target="_blank" rel="noopener">⚡ Abrir no Playground IDE &rarr;</a>
</p>
<h2>8. Resumo e Próximos Passos</h2>
<ul>
<li><code>@keyframes</code> define uma linha do tempo autônoma através de porcentagens (<code>0%</code> a <code>100%</code>).</li>
<li>A propriedade <code>animation</code> conecta o elemento à timeline e dita duração, repetições e velocidade.</li>
<li><code>animation-fill-mode: forwards</code> ou <code>both</code> impede que a animação sofra saltos bruscos ao terminar.</li>
<li><code>animation-direction: alternate</code> cria loops suaves de ida e volta (ping-pong).</li>
<li>A função <code>steps()</code> divide a interpolação em degraus rígidos, ideal para sprites e efeitos de digitação.</li>
<li>Priorize animar <code>transform</code> e <code>opacity</code> para manter 60fps acelerados pela placa de vídeo.</li>
</ul>
<div class="wzw-callout wzw-callout-success">
<p><strong>Próximo Passo:</strong> Como organizar paletas de cores globais, alternar entre Modo Claro e Escuro dinamicamente e evitar valores mágicos repetidos no CSS? Na <strong>Lição 45</strong>, desvendaremos as <strong>CSS Variables (Custom Properties) &#038; Dark Mode Dinâmico</strong>!</p>
</div>
<p>O post <a href="https://webzoneware.com/web-academy/curso-css/animacoes-keyframes-css/">Animações Profissionais com @keyframes no CSS | Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://webzoneware.com/web-academy/curso-css/animacoes-keyframes-css/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Transições Suaves no CSS com transition &#124; Web Academy</title>
		<link>https://webzoneware.com/web-academy/curso-css/transicoes-css-suaves-animadas/</link>
					<comments>https://webzoneware.com/web-academy/curso-css/transicoes-css-suaves-animadas/#respond</comments>
		
		<dc:creator><![CDATA[Web-Zoneware]]></dc:creator>
		<pubDate>Thu, 22 Oct 2026 03:38:47 +0000</pubDate>
				<category><![CDATA[Curso de CSS e CSS3]]></category>
		<category><![CDATA[aceleracao gpu]]></category>
		<category><![CDATA[cubic-bezier]]></category>
		<category><![CDATA[curso css3 completo]]></category>
		<category><![CDATA[micro-interacoes]]></category>
		<category><![CDATA[timing function]]></category>
		<category><![CDATA[transicoes suaves]]></category>
		<category><![CDATA[transition css]]></category>
		<guid isPermaLink="false">https://webzoneware.com/?p=29465</guid>

					<description><![CDATA[<p>A diferença entre um website amador e uma aplicação digital de alto padrão estético reside nas micro-interações. Sem transições, quando o usuário passa o mouse sobre um botão, as cores e elevações mudam em zero milissegundos — um corte seco, robótico e visualmente agressivo. A propriedade transition ensina o motor do navegador a interpolar matematicamente [&#8230;]</p>
<p>O post <a href="https://webzoneware.com/web-academy/curso-css/transicoes-css-suaves-animadas/">Transições Suaves no CSS com transition | Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wzw-lesson-lead">
  A diferença entre um website amador e uma aplicação digital de alto padrão estético reside nas micro-interações. Sem transições, quando o usuário passa o mouse sobre um botão, as cores e elevações mudam em zero milissegundos — um corte seco, robótico e visualmente agressivo. A propriedade <strong><code>transition</code></strong> ensina o motor do navegador a interpolar matematicamente a passagem suave entre o estado inicial e o estado final de um elemento. Nesta lição, você dominará as 4 subpropriedades de transição, aprenderá por que deve fugir do <code>transition: all</code> e descobrirá como usar curvas <strong><code>cubic-bezier</code></strong> para criar efeitos de mola elástica cinematográficos.
</p>
<h2>1. A Anatomia da Propriedade <code>transition</code></h2>
<p>
  Uma transição suave completa é composta por quatro parâmetros fundamentais:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-77231" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">4 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-77231', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-77231', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">/* Sintaxe Geral: transition: [propriedade] [duração] [curva-de-velocidade] [atraso]; */</span></span>
<span class="wzw-code-line">.botao {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transition</span>: transform <span class="wzw-tk-num">0.3s</span> ease <span class="wzw-tk-num">0s</span>;</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* Sintaxe Geral: transition: [propriedade] [duração] [curva-de-velocidade] [atraso]; */
.botao {
  transition: transform 0.3s ease 0s;
}</textarea>
        </div>
    </div>
    
</div>
<h3>1. <code>transition-property</code> — O que Animar?</h3>
<p>
  Define exatamente quais propriedades de estilo serão interpoladas suavemente.
</p>
<div class="wzw-callout wzw-callout-warning">
<p><strong>O Perigo Mortal do <code>transition: all</code>:</strong> Declarar <code>transition: all 0.3s</code> é um dos maiores anti-padrões de CSS. Ao instruir o navegador a animar &#8220;tudo&#8221;, qualquer mudança acidental de <code>padding</code>, <code>font-size</code> ou <code>margin</code> forçará a CPU a recalcular o layout da página inteira (Reflow). <strong>Sempre liste as propriedades específicas</strong> (ex.: <code>transition: transform 0.2s, background-color 0.2s;</code>).</p>
</div>
<h3>2. <code>transition-duration</code> — O Tempo de Resposta</h3>
<p>
  O tempo total da transição, expresso em segundos (<code>0.3s</code>) ou milissegundos (<code>300ms</code>).
</p>
<ul>
<li><strong>Zona Ideal de Micro-interações (150ms a 350ms):</strong> É rápida o suficiente para parecer instantânea e suave o bastante para ser percebida pelo cérebro humano.</li>
<li><strong>Acima de 500ms:</strong> O site começa a parecer pesado, lerdo e cansativo para o usuário.</li>
</ul>
<h3>3. <code>transition-timing-function</code> — A Física da Velocidade</h3>
<p>
  Dita a curva de aceleração do movimento, simulando as leis de inércia da física real.
</p>
<h3>4. <code>transition-delay</code> — O Tempo de Espera</h3>
<p>
  Define quanto tempo o navegador deve aguardar antes de iniciar a transição. Excelente para criar cascatas de itens em listas (staggered animations).
</p>
<h2>2. A Física das Curvas de Velocidade (Timing Functions)</h2>
<p>
  A forma como um objeto acelera e desacelera comunica peso e personalidade à interface:
</p>
<div class="wzw-table-responsive">
<table class="wzw-table">
<thead>
<tr>
<th>Função</th>
<th>Comportamento Físico</th>
<th>Sensação Visual</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong><code>linear</code></strong></td>
<td>Velocidade estritamente constante do início ao fim.</td>
<td>Robótica, mecânica, artificial.</td>
</tr>
<tr>
<td><strong><code>ease</code></strong> (Padrão)</td>
<td>Começa lento, acelera no meio e desacelera no final.</td>
<td>Suave e natural para a maioria dos casos.</td>
</tr>
<tr>
<td><strong><code>ease-out</code></strong></td>
<td>Começa rápido e desacelera suavemente no final.</td>
<td><strong>A melhor opção para interações:</strong> reage instantaneamente ao usuário!</td>
</tr>
<tr>
<td><strong><code>ease-in</code></strong></td>
<td>Começa muito lento e acelera no final.</td>
<td>Excelente para elementos saindo da tela.</td>
</tr>
<tr>
<td><strong><code>ease-in-out</code></strong></td>
<td>Aceleração e desaceleração simétricas.</td>
<td>Ótimo para modais e rotações completas.</td>
</tr>
</tbody>
</table>
</div>
<h2>3. O Superpoder do <code>cubic-bezier</code>: O Efeito Mola (Spring)</h2>
<p>
  Todas as funções acima são apenas atalhos pré-configurados de uma <strong>Curva de Bézier Cúbica</strong> composta por 4 coordenadas matemáticas: <code>cubic-bezier(P1x, P1y, P2x, P2y)</code>.
</p>
<p>
  A mágica acontece quando usamos um valor no eixo Y <strong>maior do que 1</strong>: o elemento ultrapassa seu destino final e &#8220;rebota&#8221; elasticamente de volta, simulando uma mola mecânica sem precisar de bibliotecas pesadas de animação em JavaScript:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-33472" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">8 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-33472', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-33472', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">/* Curva de Rebote Elástico Snappy / Bouncy */</span></span>
<span class="wzw-code-line">.card-elastico {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transition</span>: transform <span class="wzw-tk-num">0.4s</span> cubic-bezier(0.34, 1.56, 0.64, 1);</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.card-elastico<span class="wzw-tk-kw">:hover</span> {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transform</span>: translateY(-<span class="wzw-tk-num">10px</span>) scale(1.03); /* Dá um leve <span class="wzw-tk-str">&quot;pulo&quot;</span> elástico! */</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* Curva de Rebote Elástico Snappy / Bouncy */
.card-elastico {
  transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
}

.card-elastico:hover {
  transform: translateY(-10px) scale(1.03); /* Dá um leve &quot;pulo&quot; elástico! */
}</textarea>
        </div>
    </div>
    
</div>
<h2>4. Onde Declarar a Transição? A Regra da Ida e da Volta</h2>
<div class="wzw-callout wzw-callout-info">
<p><strong>A Pegadinha Mais Comum do CSS:</strong> Se você declarar o <code>transition</code> dentro do bloco <code>:hover</code>, a animação funcionará suavemente quando o mouse ENTRAR no elemento, mas ao tirar o cursor, a transição é cancelada e o elemento volta em um corte seco instantâneo! <strong>Declare sempre o <code>transition</code> na classe base do elemento</strong> para garantir que a ida e a volta sejam 100% fluidas.</p>
</div>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-21814" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">12 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-21814', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-21814', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">/* FORMA CORRETA: No estado base */</span></span>
<span class="wzw-code-line">.botao-perfeito {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background-color</span>: <span class="wzw-tk-num">#2563eb</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transform</span>: translateY(0);</span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">/* A transição mora aqui, garantindo suavidade na ida E na volta: */</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transition</span>: transform <span class="wzw-tk-num">0.25s</span> ease-out, background-color <span class="wzw-tk-num">0.2s</span> ease;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.botao-perfeito<span class="wzw-tk-kw">:hover</span> {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background-color</span>: <span class="wzw-tk-num">#1d4ed8</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transform</span>: translateY(-<span class="wzw-tk-num">4px</span>);</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* FORMA CORRETA: No estado base */
.botao-perfeito {
  background-color: #2563eb;
  transform: translateY(0);
  /* A transição mora aqui, garantindo suavidade na ida E na volta: */
  transition: transform 0.25s ease-out, background-color 0.2s ease;
}

.botao-perfeito:hover {
  background-color: #1d4ed8;
  transform: translateY(-4px);
}</textarea>
        </div>
    </div>
    
</div>
<h2>5. Múltiplas Transições Independentes</h2>
<p>
  Você pode atribuir tempos e acelerações diferentes para cada propriedade, separando-as por vírgula em uma única regra:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-60511" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">7 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-60511', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-60511', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line">.cartao-vip {</span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">/* O movimento dura 300ms com mola; a sombra muda mais rápido em 150ms */</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transition</span>: </span>
<span class="wzw-code-line">    transform <span class="wzw-tk-num">0.3s</span> cubic-bezier(0.34, 1.56, 0.64, 1),</span>
<span class="wzw-code-line">    box-shadow <span class="wzw-tk-num">0.15s</span> ease-out,</span>
<span class="wzw-code-line">    border-color <span class="wzw-tk-num">0.2s</span> linear;</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>.cartao-vip {
  /* O movimento dura 300ms com mola; a sombra muda mais rápido em 150ms */
  transition: 
    transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1),
    box-shadow 0.15s ease-out,
    border-color 0.2s linear;
}</textarea>
        </div>
    </div>
    
</div>
<h2>6. Acessibilidade Vestibular (WCAG 2.2)</h2>
<p>
  Transições com movimento de escala ou translação devem respeitar as preferências de acessibilidade de pessoas com labirintite:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-21811" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">5 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-21811', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-21811', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-kw">@media</span> (prefers-reduced-motion: reduce) {</span>
<span class="wzw-code-line">  * {</span>
<span class="wzw-code-line">    <span class="wzw-tk-attr">transition</span>: none <span class="wzw-tk-kw">!important</span>;</span>
<span class="wzw-code-line">  }</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>@media (prefers-reduced-motion: reduce) {
  * {
    transition: none !important;
  }
}</textarea>
        </div>
    </div>
    
</div>
<h2>7. Laboratório Prático: Comparando Curvas e o Efeito Mola</h2>
<p>
  No código interativo abaixo, experimente passar o cursor do mouse sobre cada um dos 3 botões para sentir visualmente a diferença entre a falta de transição, a transição <code>ease</code> tradicional e o efeito mola com <code>cubic-bezier</code>:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-85050" data-lang="html">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">HTML5</span>
                                <span class="wzw-ide-lines-count">72 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-85050', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-85050', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-tag">&lt;!DOCTYPE</span><span class="wzw-tk-kw"> html</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;html</span> <span class="wzw-tk-attr">lang</span>=<span class="wzw-tk-str">&quot;pt-BR&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;head&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;meta</span> <span class="wzw-tk-attr">charset</span>=<span class="wzw-tk-str">&quot;UTF-8&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;title&gt;</span>Laboratório de Transições CSS<span class="wzw-tk-tag">&lt;/title&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;style&gt;</span></span>
<span class="wzw-code-line">    body {</span>
<span class="wzw-code-line">      font-family: &#039;Inter&#039;, system-ui, sans-serif;</span>
<span class="wzw-code-line">      background: #0b0f19;</span>
<span class="wzw-code-line">      color: #f8fafc;</span>
<span class="wzw-code-line">      padding: 40px;</span>
<span class="wzw-code-line">      margin: 0;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .painel-botoes {</span>
<span class="wzw-code-line">      display: flex;</span>
<span class="wzw-code-line">      flex-wrap: wrap;</span>
<span class="wzw-code-line">      gap: 20px;</span>
<span class="wzw-code-line">      margin-top: 24px;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .btn-teste {</span>
<span class="wzw-code-line">      background: #1e293b;</span>
<span class="wzw-code-line">      color: #fff;</span>
<span class="wzw-code-line">      border: 1px solid #334155;</span>
<span class="wzw-code-line">      padding: 16px 28px;</span>
<span class="wzw-code-line">      border-radius: 10px;</span>
<span class="wzw-code-line">      font-weight: 700;</span>
<span class="wzw-code-line">      font-size: 0.95rem;</span>
<span class="wzw-code-line">      cursor: pointer;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">/* 1. SEM TRANSIÇÃO (CORTE SECO) */</span></span>
<span class="wzw-code-line">    .btn-sem-transicao:hover {</span>
<span class="wzw-code-line">      background: #ef4444;</span>
<span class="wzw-code-line">      transform: translateY(-8px);</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">/* 2. TRANSIÇÃO PADRÃO (EASE) */</span></span>
<span class="wzw-code-line">    .btn-ease {</span>
<span class="wzw-code-line">      transition: transform 0.25s ease, background 0.25s ease;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .btn-ease:hover {</span>
<span class="wzw-code-line">      background: #3b82f6;</span>
<span class="wzw-code-line">      transform: translateY(-8px);</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">/* 3. EFEITO MOLA ELÁSTICA (CUBIC-BEZIER) */</span></span>
<span class="wzw-code-line">    .btn-mola {</span>
<span class="wzw-code-line">      transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1), background 0.2s ease;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .btn-mola:hover {</span>
<span class="wzw-code-line">      background: #10b981;</span>
<span class="wzw-code-line">      transform: translateY(-8px) scale(1.05);</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;/style&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;/head&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;body&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;h2</span> <span class="wzw-tk-attr">style</span>=<span class="wzw-tk-str">&quot;color:#f1f5f9; margin-top:0;&quot;</span><span class="wzw-tk-tag">&gt;</span>A Física das Transições Suaves no CSS<span class="wzw-tk-tag">&lt;/h2&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;p</span> <span class="wzw-tk-attr">style</span>=<span class="wzw-tk-str">&quot;color:#94a3b8; font-size:0.9rem;&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">    Passe o mouse sobre os 3 botões e observe a diferença física de percepção e acabamento de cada um:</span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;/p&gt;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;painel-botoes&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;button</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;btn-teste btn-sem-transicao&quot;</span><span class="wzw-tk-tag">&gt;</span>1. Sem Transição (Seco)<span class="wzw-tk-tag">&lt;/button&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;button</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;btn-teste btn-ease&quot;</span><span class="wzw-tk-tag">&gt;</span>2. Transição ease (Padrão)<span class="wzw-tk-tag">&lt;/button&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;button</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;btn-teste btn-mola&quot;</span><span class="wzw-tk-tag">&gt;</span>3. Mola cubic-bezier (Snappy)<span class="wzw-tk-tag">&lt;/button&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;/body&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;/html&gt;</span></span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;pt-BR&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;title&gt;Laboratório de Transições CSS&lt;/title&gt;
  &lt;style&gt;
    body {
      font-family: &#039;Inter&#039;, system-ui, sans-serif;
      background: #0b0f19;
      color: #f8fafc;
      padding: 40px;
      margin: 0;
    }

    .painel-botoes {
      display: flex;
      flex-wrap: wrap;
      gap: 20px;
      margin-top: 24px;
    }

    .btn-teste {
      background: #1e293b;
      color: #fff;
      border: 1px solid #334155;
      padding: 16px 28px;
      border-radius: 10px;
      font-weight: 700;
      font-size: 0.95rem;
      cursor: pointer;
    }

    /* 1. SEM TRANSIÇÃO (CORTE SECO) */
    .btn-sem-transicao:hover {
      background: #ef4444;
      transform: translateY(-8px);
    }

    /* 2. TRANSIÇÃO PADRÃO (EASE) */
    .btn-ease {
      transition: transform 0.25s ease, background 0.25s ease;
    }

    .btn-ease:hover {
      background: #3b82f6;
      transform: translateY(-8px);
    }

    /* 3. EFEITO MOLA ELÁSTICA (CUBIC-BEZIER) */
    .btn-mola {
      transition: transform 0.4s cubic-bezier(0.34, 1.56, 0.64, 1), background 0.2s ease;
    }

    .btn-mola:hover {
      background: #10b981;
      transform: translateY(-8px) scale(1.05);
    }
  &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;h2 style=&quot;color:#f1f5f9; margin-top:0;&quot;&gt;A Física das Transições Suaves no CSS&lt;/h2&gt;
  &lt;p style=&quot;color:#94a3b8; font-size:0.9rem;&quot;&gt;
    Passe o mouse sobre os 3 botões e observe a diferença física de percepção e acabamento de cada um:
  &lt;/p&gt;

  &lt;div class=&quot;painel-botoes&quot;&gt;
    &lt;button class=&quot;btn-teste btn-sem-transicao&quot;&gt;1. Sem Transição (Seco)&lt;/button&gt;
    &lt;button class=&quot;btn-teste btn-ease&quot;&gt;2. Transição ease (Padrão)&lt;/button&gt;
    &lt;button class=&quot;btn-teste btn-mola&quot;&gt;3. Mola cubic-bezier (Snappy)&lt;/button&gt;
  &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</textarea>
        </div>
    </div>
    
</div>
<p>
  Abra este laboratório no Playground IDE e teste alterar as coordenadas da curva <code>cubic-bezier</code> para criar seus próprios efeitos de aceleração física:
</p>
<p style="text-align: center; margin: 35px 0;">
  <a href="https://webzoneware.com/web-academy/playground-web/" class="wzw-btn-playground" target="_blank" rel="noopener">⚡ Abrir no Playground IDE &rarr;</a>
</p>
<h2>8. Resumo e Próximos Passos</h2>
<ul>
<li><code>transition</code> interpola suavemente a transição numérica entre dois estados disparados por interações.</li>
<li>Evite <code>transition: all</code> para blindar sua página contra quedas de quadros de layout (Reflows); especifique sempre propriedades como <code>transform</code> e <code>opacity</code>.</li>
<li>Durações entre 150ms e 350ms são o padrão ouro da ergonomia de interfaces modernas.</li>
<li>Declare o <code>transition</code> no estado base do elemento para garantir suavidade na entrada e na saída do hover.</li>
<li>Curvas <code>cubic-bezier</code> com valores de Y maiores que 1 simulam o efeito de rebote elástico (spring) com extrema elegância e performance nativa.</li>
</ul>
<div class="wzw-callout wzw-callout-success">
<p><strong>Próximo Passo:</strong> As transições conectam dois estados com base na ação do usuário. Mas e quando queremos uma animação cinematográfica contínua, com dezenas de etapas intermediárias, repetição infinita e sem depender de cliques ou hovers? Na <strong>Lição 44</strong>, dominaremos as <strong>Animações com @keyframes no CSS</strong>!</p>
</div>
<p>O post <a href="https://webzoneware.com/web-academy/curso-css/transicoes-css-suaves-animadas/">Transições Suaves no CSS com transition | Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://webzoneware.com/web-academy/curso-css/transicoes-css-suaves-animadas/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Transformações 2D e 3D Modernas no CSS &#124; Web Academy</title>
		<link>https://webzoneware.com/web-academy/curso-css/transformacoes-css-translate-rotate-scale/</link>
					<comments>https://webzoneware.com/web-academy/curso-css/transformacoes-css-translate-rotate-scale/#respond</comments>
		
		<dc:creator><![CDATA[Web-Zoneware]]></dc:creator>
		<pubDate>Thu, 22 Oct 2026 03:34:39 +0000</pubDate>
				<category><![CDATA[Curso de CSS e CSS3]]></category>
		<category><![CDATA[aceleracao gpu]]></category>
		<category><![CDATA[curso css3 completo]]></category>
		<category><![CDATA[perspective css]]></category>
		<category><![CDATA[rotate css]]></category>
		<category><![CDATA[scale css]]></category>
		<category><![CDATA[transform css]]></category>
		<category><![CDATA[transformacoes 2d 3d]]></category>
		<category><![CDATA[translate css]]></category>
		<guid isPermaLink="false">https://webzoneware.com/?p=29463</guid>

					<description><![CDATA[<p>Até este ponto da sua jornada, os elementos da tela viveram confinados em caixas estáticas retangulares. Mas o CSS moderno possui um verdadeiro motor de computação gráfica: o módulo de Transformações (CSS Transforms). Com ele, você pode transladar, rotacionar, redimensionar, inclinar e até projetar elementos na terceira dimensão (Eixo Z). E o aspecto mais impressionante: [&#8230;]</p>
<p>O post <a href="https://webzoneware.com/web-academy/curso-css/transformacoes-css-translate-rotate-scale/">Transformações 2D e 3D Modernas no CSS | Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wzw-lesson-lead">
  Até este ponto da sua jornada, os elementos da tela viveram confinados em caixas estáticas retangulares. Mas o CSS moderno possui um verdadeiro motor de computação gráfica: o módulo de <strong>Transformações (CSS Transforms)</strong>. Com ele, você pode transladar, rotacionar, redimensionar, inclinar e até projetar elementos na terceira dimensão (Eixo Z). E o aspecto mais impressionante: diferente das velhas alterações de coordenadas, as transformações são processadas diretamente na placa de vídeo (GPU), garantindo experiências visuais fluidas a 60 ou 120 quadros por segundo sem engasgos.
</p>
<h2>1. A Pipeline Gráfica: Por que a GPU Transforma Tudo?</h2>
<p>
  Para compreender a supremacia das transformações, precisamos analisar o que o navegador faz internamente quando um elemento se move na tela:
</p>
<ul>
<li><strong>Movimentação Antiga (com <code>top</code>, <code>left</code> ou <code>margin</code>):</strong> Força a CPU a recalcular a geometria física de todos os elementos da página (etapa de <strong>Layout/Reflow</strong>) e redesenhar cada pixel na tela (<strong>Repaint</strong>). Em celulares ou páginas complexas, isso causa engasgos visuais graves (<em>jank</em>).</li>
<li><strong>Movimentação Moderna (com <code>transform</code>):</strong> O elemento é isolado em sua própria camada de vídeo (<strong>Composite Layer</strong>) e manipulado diretamente pela <strong>GPU (Placa Gráfica)</strong>. O navegador não recalcula o layout nem repinta os vizinhos: ele apenas move a imagem da camada com aceleração por hardware!</li>
</ul>
<div class="wzw-callout wzw-callout-info">
<p><strong>Regra de Alta Performance:</strong> Toda vez que você for mover um elemento (em um hover, modal ou animação), <strong>NUNCA anime <code>top</code> ou <code>left</code></strong>. Use sempre <strong><code>transform: translate()</code></strong>!</p>
</div>
<h2>2. As 4 Transformações 2D Fundamentais</h2>
<p>
  A propriedade <code>transform</code> aceita uma ou mais funções geométricas aplicadas no plano bidimensional (X e Y):
</p>
<h3>1. <code>translate(x, y)</code> — Deslocamento sem Perturbar Vizinhos</h3>
<p>
  Move o elemento nos eixos horizontal e vertical. O espaço original da caixa permanece 100% preservado no fluxo normal:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-64886" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">3 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-64886', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-64886', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line">.card<span class="wzw-tk-kw">:hover</span> {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transform</span>: translateY(-<span class="wzw-tk-num">8px</span>); /* Eleva o card <span class="wzw-tk-num">8px</span> para cima com aceleração GPU */</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>.card:hover {
  transform: translateY(-8px); /* Eleva o card 8px para cima com aceleração GPU */
}</textarea>
        </div>
    </div>
    
</div>
<p>
  <strong>O Truque Histórico da Centralização:</strong> Valores percentuais em <code>translate()</code> calculam em relação ao <em>tamanho do próprio elemento</em> (e não do pai!). Por isso, a combinação clássica centraliza qualquer elemento com perfeição milimétrica:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-47260" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">6 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-47260', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-47260', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line">.modal-centralizado {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">position</span>: absolute;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">top</span>: 50%;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">left</span>: 50%;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transform</span>: translate(-50%, -50%); /* Recua exatamente metade da sua própria largura e altura */</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>.modal-centralizado {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%); /* Recua exatamente metade da sua própria largura e altura */
}</textarea>
        </div>
    </div>
    
</div>
<h3>2. <code>scale(x, y)</code> — Escala e Zoom Suave</h3>
<p>
  Aumenta ou diminui o elemento visualmente. O valor <code>1</code> representa 100% (tamanho natural):
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-64977" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">3 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-64977', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-64977', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line">.btn-cta<span class="wzw-tk-kw">:hover</span> {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transform</span>: scale(1.05); /* Amplia o botão em 5% sem alterar o layout da página */</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>.btn-cta:hover {
  transform: scale(1.05); /* Amplia o botão em 5% sem alterar o layout da página */
}</textarea>
        </div>
    </div>
    
</div>
<h3>3. <code>rotate(ângulo)</code> — Rotação Angular</h3>
<p>
  Gira o elemento em torno de seu eixo. Aceita graus (<code>deg</code>) ou voltas (<code>turn</code>):
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-35750" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">4 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-35750', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-35750', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line">.icone-engrenagem {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transform</span>: rotate(<span class="wzw-tk-num">45deg</span>);   /* Gira 45 graus no sentido horário */</span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">/* transform: rotate(0.5turn); Gira meia volta (180 graus) */</span></span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>.icone-engrenagem {
  transform: rotate(45deg);   /* Gira 45 graus no sentido horário */
  /* transform: rotate(0.5turn); Gira meia volta (180 graus) */
}</textarea>
        </div>
    </div>
    
</div>
<h3>4. <code>skew(x, y)</code> — Inclinação Paralela</h3>
<p>
  Distorce as faces do elemento em ângulos diagonais, criando o efeito de paralelogramo:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-71685" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">3 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-71685', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-71685', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line">.faixa-diagonal {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transform</span>: skewX(-<span class="wzw-tk-num">12deg</span>); /* Cria bordas esportivas inclinadas */</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>.faixa-diagonal {
  transform: skewX(-12deg); /* Cria bordas esportivas inclinadas */
}</textarea>
        </div>
    </div>
    
</div>
<h2>3. O Ponto de Ancoragem: <code>transform-origin</code></h2>
<p>
  Por padrão, toda transformação acontece a partir do centro geométrico do elemento (<code>50% 50%</code>). A propriedade <strong><code>transform-origin</code></strong> permite alterar esse pivô de ancoragem:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-67974" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">5 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-67974', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-67974', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line">.ponteiro-relogio {</span>
<span class="wzw-code-line">  <span class="wzw-tk-comment">/* Gira a partir da base inferior central, como o ponteiro de um relógio real */</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transform-origin</span>: center bottom;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transform</span>: rotate(<span class="wzw-tk-num">90deg</span>);</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>.ponteiro-relogio {
  /* Gira a partir da base inferior central, como o ponteiro de um relógio real */
  transform-origin: center bottom;
  transform: rotate(90deg);
}</textarea>
        </div>
    </div>
    
</div>
<h2>4. Entrando na Terceira Dimensão (3D Transforms)</h2>
<p>
  Telas de computador e celulares são superfícies bidimensionais estritamente planas. Para que o cérebro humano perceba profundidade em 3D, precisamos aplicar a propriedade <strong><code>perspective</code></strong> no contêiner pai:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-28393" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">3 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-28393', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-28393', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line">.cena-3d {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">perspective</span>: <span class="wzw-tk-num">1000px</span>; /* Define a distância do olho do usuário até a tela */</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>.cena-3d {
  perspective: 1000px; /* Define a distância do olho do usuário até a tela */
}</textarea>
        </div>
    </div>
    
</div>
<h3>A Tríade Sagrada do Efeito Card Flip 3D</h3>
<p>
  Para criar o famoso efeito de virar um cartão em 180 graus revelando o verso, usamos três propriedades essenciais:
</p>
<ol>
<li><strong><code>perspective</code> no pai:</strong> Cria o campo de visão tridimensional realista.</li>
<li><strong><code>transform-style: preserve-3d</code> no cartão:</strong> Garante que as faces frontal e traseira coexistam no espaço 3D real, em vez de serem achatadas pelo navegador.</li>
<li><strong><code>backface-visibility: hidden</code> nas faces:</strong> Informa ao motor gráfico para ocultar o verso de uma face quando ela estiver de costas para os olhos do usuário!</li>
</ol>
<h2>5. Novidade Moderna: Propriedades Individuais de Transformação</h2>
<p>
  A especificação <em>CSS Transforms Level 2</em> introduziu propriedades independentes para que você não precise mais reescrever a longa cadeia de <code>transform</code>:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-91661" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">6 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-91661', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-91661', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">/* Sintaxe Moderna Independente (Navegadores Modernos) */</span></span>
<span class="wzw-code-line">.card-moderno<span class="wzw-tk-kw">:hover</span> {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">translate</span>: 0 -<span class="wzw-tk-num">8px</span>;  /* Equivalente a transform: translateY(-<span class="wzw-tk-num">8px</span>) */</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">scale</span>: 1.03;        /* Equivalente a transform: scale(1.03) */</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">rotate</span>: <span class="wzw-tk-num">2deg</span>;       /* Equivalente a transform: rotate(<span class="wzw-tk-num">2deg</span>) */</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* Sintaxe Moderna Independente (Navegadores Modernos) */
.card-moderno:hover {
  translate: 0 -8px;  /* Equivalente a transform: translateY(-8px) */
  scale: 1.03;        /* Equivalente a transform: scale(1.03) */
  rotate: 2deg;       /* Equivalente a transform: rotate(2deg) */
}</textarea>
        </div>
    </div>
    
</div>
<h2>6. Laboratório Prático: O Espetacular Card Flip 3D</h2>
<p>
  No código interativo abaixo, construímos um cartão de curso tridimensional. Ao passar o mouse sobre ele, o cartão gira 180 graus no Eixo Y, ocultando a frente e revelando a ementa de estudos no verso com aceleração por hardware perfeita:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-36637" data-lang="html">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">HTML5</span>
                                <span class="wzw-ide-lines-count">111 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-36637', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-36637', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-tag">&lt;!DOCTYPE</span><span class="wzw-tk-kw"> html</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;html</span> <span class="wzw-tk-attr">lang</span>=<span class="wzw-tk-str">&quot;pt-BR&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;head&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;meta</span> <span class="wzw-tk-attr">charset</span>=<span class="wzw-tk-str">&quot;UTF-8&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;title&gt;</span>Laboratório de Transformações 3D CSS<span class="wzw-tk-tag">&lt;/title&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;style&gt;</span></span>
<span class="wzw-code-line">    body {</span>
<span class="wzw-code-line">      font-family: &#039;Inter&#039;, system-ui, sans-serif;</span>
<span class="wzw-code-line">      background: #0b0f19;</span>
<span class="wzw-code-line">      color: #f8fafc;</span>
<span class="wzw-code-line">      padding: 40px;</span>
<span class="wzw-code-line">      display: flex;</span>
<span class="wzw-code-line">      flex-direction: column;</span>
<span class="wzw-code-line">      align-items: center;</span>
<span class="wzw-code-line">      margin: 0;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">/* 1. O CONTÊINER COM PERSPECTIVA 3D */</span></span>
<span class="wzw-code-line">    .cena-card {</span>
<span class="wzw-code-line">      width: 320px;</span>
<span class="wzw-code-line">      height: 400px;</span>
<span class="wzw-code-line">      perspective: 1000px; /* Profundidade de câmera */</span>
<span class="wzw-code-line">      margin-top: 20px;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">/* 2. O CARTÃO QUE GIRA */</span></span>
<span class="wzw-code-line">    .card-3d {</span>
<span class="wzw-code-line">      width: 100%;</span>
<span class="wzw-code-line">      height: 100%;</span>
<span class="wzw-code-line">      position: relative;</span>
<span class="wzw-code-line">      transform-style: preserve-3d; /* Preserva o espaço tridimensional dos filhos */</span>
<span class="wzw-code-line">      transition: transform 0.6s cubic-bezier(0.4, 0, 0.2, 1);</span>
<span class="wzw-code-line">      cursor: pointer;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .cena-card:hover .card-3d {</span>
<span class="wzw-code-line">      transform: rotateY(180deg); /* Gira 180 graus na horizontal */</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">/* 3. AS FACES (FRENTE E VERSO) */</span></span>
<span class="wzw-code-line">    .card-face {</span>
<span class="wzw-code-line">      position: absolute;</span>
<span class="wzw-code-line">      inset: 0;</span>
<span class="wzw-code-line">      border-radius: 16px;</span>
<span class="wzw-code-line">      padding: 28px;</span>
<span class="wzw-code-line">      box-sizing: border-box;</span>
<span class="wzw-code-line">      display: flex;</span>
<span class="wzw-code-line">      flex-direction: column;</span>
<span class="wzw-code-line">      justify-content: center;</span>
<span class="wzw-code-line">      backface-visibility: hidden; /* OCULTA O VERSO QUANDO DE COSTAS! */</span>
<span class="wzw-code-line">      box-shadow: 0 10px 30px rgba(0,0,0,0.4);</span>
<span class="wzw-code-line">      border: 1px solid #334155;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">/* FACE FRONTAL */</span></span>
<span class="wzw-code-line">    .face-frente {</span>
<span class="wzw-code-line">      background: linear-gradient(135deg, #1e293b, #0f172a);</span>
<span class="wzw-code-line">      border-color: #38bdf8;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .face-frente h3 { margin: 0 0 10px 0; color: #38bdf8; font-size: 1.4rem; }</span>
<span class="wzw-code-line">    .face-frente p { color: #94a3b8; font-size: 0.9rem; line-height: 1.5; }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">/* FACE TRASEIRA */</span></span>
<span class="wzw-code-line">    .face-verso {</span>
<span class="wzw-code-line">      background: linear-gradient(135deg, #2563eb, #1d4ed8);</span>
<span class="wzw-code-line">      transform: rotateY(180deg); /* Já nasce virada de costas */</span>
<span class="wzw-code-line">      text-align: center;</span>
<span class="wzw-code-line">      align-items: center;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .face-verso h3 { margin: 0 0 12px 0; color: #fff; }</span>
<span class="wzw-code-line">    .face-verso p { color: #bfdbfe; font-size: 0.85rem; margin-bottom: 20px; }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .btn-matricular {</span>
<span class="wzw-code-line">      background: #fff;</span>
<span class="wzw-code-line">      color: #1d4ed8;</span>
<span class="wzw-code-line">      border: none;</span>
<span class="wzw-code-line">      padding: 12px 24px;</span>
<span class="wzw-code-line">      border-radius: 8px;</span>
<span class="wzw-code-line">      font-weight: 700;</span>
<span class="wzw-code-line">      cursor: pointer;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;/style&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;/head&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;body&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;h2</span> <span class="wzw-tk-attr">style</span>=<span class="wzw-tk-str">&quot;color:#f1f5f9; margin-top:0;&quot;</span><span class="wzw-tk-tag">&gt;</span>Card Flip 3D com Aceleração por GPU<span class="wzw-tk-tag">&lt;/h2&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;p</span> <span class="wzw-tk-attr">style</span>=<span class="wzw-tk-str">&quot;color:#94a3b8; font-size:0.9rem;&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">    Passe o cursor sobre o cartão para testemunhar o giro tridimensional em 180 graus com <span class="wzw-tk-tag">&lt;code&gt;</span>rotateY<span class="wzw-tk-tag">&lt;/code&gt;</span>:</span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;/p&gt;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;cena-card&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;card-3d&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-comment">&lt;!-- Frente do Cartão --&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;card-face face-frente&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;span</span> <span class="wzw-tk-attr">style</span>=<span class="wzw-tk-str">&quot;font-size:0.75rem; font-weight:700; color:#38bdf8; text-transform:uppercase;&quot;</span><span class="wzw-tk-tag">&gt;</span>Módulo 05<span class="wzw-tk-tag">&lt;/span&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;h3&gt;</span>CSS3 Avançado<span class="wzw-tk-tag">&lt;/h3&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;p&gt;</span>Transformações espaciais 2D e 3D aceleradas pela placa gráfica. Passe o mouse para ver o verso!<span class="wzw-tk-tag">&lt;/p&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;span</span> <span class="wzw-tk-attr">style</span>=<span class="wzw-tk-str">&quot;margin-top:auto; font-size:0.8rem; color:#64748b;&quot;</span><span class="wzw-tk-tag">&gt;</span>🔄 Passe o mouse para girar<span class="wzw-tk-tag">&lt;/span&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">      <span class="wzw-tk-comment">&lt;!-- Verso do Cartão --&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;card-face face-verso&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;h3&gt;</span>Ementa Completa<span class="wzw-tk-tag">&lt;/h3&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;p&gt;</span>✓ Animações com keyframes<span class="wzw-tk-tag">&lt;br&gt;</span>✓ Transições suaves<span class="wzw-tk-tag">&lt;br&gt;</span>✓ CSS Variables e Dark Mode<span class="wzw-tk-tag">&lt;/p&gt;</span></span>
<span class="wzw-code-line">        <span class="wzw-tk-tag">&lt;button</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;btn-matricular&quot;</span><span class="wzw-tk-tag">&gt;</span>Iniciar Lição 43 →<span class="wzw-tk-tag">&lt;/button&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;/body&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;/html&gt;</span></span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;pt-BR&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;title&gt;Laboratório de Transformações 3D CSS&lt;/title&gt;
  &lt;style&gt;
    body {
      font-family: &#039;Inter&#039;, system-ui, sans-serif;
      background: #0b0f19;
      color: #f8fafc;
      padding: 40px;
      display: flex;
      flex-direction: column;
      align-items: center;
      margin: 0;
    }

    /* 1. O CONTÊINER COM PERSPECTIVA 3D */
    .cena-card {
      width: 320px;
      height: 400px;
      perspective: 1000px; /* Profundidade de câmera */
      margin-top: 20px;
    }

    /* 2. O CARTÃO QUE GIRA */
    .card-3d {
      width: 100%;
      height: 100%;
      position: relative;
      transform-style: preserve-3d; /* Preserva o espaço tridimensional dos filhos */
      transition: transform 0.6s cubic-bezier(0.4, 0, 0.2, 1);
      cursor: pointer;
    }

    .cena-card:hover .card-3d {
      transform: rotateY(180deg); /* Gira 180 graus na horizontal */
    }

    /* 3. AS FACES (FRENTE E VERSO) */
    .card-face {
      position: absolute;
      inset: 0;
      border-radius: 16px;
      padding: 28px;
      box-sizing: border-box;
      display: flex;
      flex-direction: column;
      justify-content: center;
      backface-visibility: hidden; /* OCULTA O VERSO QUANDO DE COSTAS! */
      box-shadow: 0 10px 30px rgba(0,0,0,0.4);
      border: 1px solid #334155;
    }

    /* FACE FRONTAL */
    .face-frente {
      background: linear-gradient(135deg, #1e293b, #0f172a);
      border-color: #38bdf8;
    }

    .face-frente h3 { margin: 0 0 10px 0; color: #38bdf8; font-size: 1.4rem; }
    .face-frente p { color: #94a3b8; font-size: 0.9rem; line-height: 1.5; }

    /* FACE TRASEIRA */
    .face-verso {
      background: linear-gradient(135deg, #2563eb, #1d4ed8);
      transform: rotateY(180deg); /* Já nasce virada de costas */
      text-align: center;
      align-items: center;
    }

    .face-verso h3 { margin: 0 0 12px 0; color: #fff; }
    .face-verso p { color: #bfdbfe; font-size: 0.85rem; margin-bottom: 20px; }

    .btn-matricular {
      background: #fff;
      color: #1d4ed8;
      border: none;
      padding: 12px 24px;
      border-radius: 8px;
      font-weight: 700;
      cursor: pointer;
    }
  &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;h2 style=&quot;color:#f1f5f9; margin-top:0;&quot;&gt;Card Flip 3D com Aceleração por GPU&lt;/h2&gt;
  &lt;p style=&quot;color:#94a3b8; font-size:0.9rem;&quot;&gt;
    Passe o cursor sobre o cartão para testemunhar o giro tridimensional em 180 graus com &lt;code&gt;rotateY&lt;/code&gt;:
  &lt;/p&gt;

  &lt;div class=&quot;cena-card&quot;&gt;
    &lt;div class=&quot;card-3d&quot;&gt;
      &lt;!-- Frente do Cartão --&gt;
      &lt;div class=&quot;card-face face-frente&quot;&gt;
        &lt;span style=&quot;font-size:0.75rem; font-weight:700; color:#38bdf8; text-transform:uppercase;&quot;&gt;Módulo 05&lt;/span&gt;
        &lt;h3&gt;CSS3 Avançado&lt;/h3&gt;
        &lt;p&gt;Transformações espaciais 2D e 3D aceleradas pela placa gráfica. Passe o mouse para ver o verso!&lt;/p&gt;
        &lt;span style=&quot;margin-top:auto; font-size:0.8rem; color:#64748b;&quot;&gt;🔄 Passe o mouse para girar&lt;/span&gt;
      &lt;/div&gt;

      &lt;!-- Verso do Cartão --&gt;
      &lt;div class=&quot;card-face face-verso&quot;&gt;
        &lt;h3&gt;Ementa Completa&lt;/h3&gt;
        &lt;p&gt;✓ Animações com keyframes&lt;br&gt;✓ Transições suaves&lt;br&gt;✓ CSS Variables e Dark Mode&lt;/p&gt;
        &lt;button class=&quot;btn-matricular&quot;&gt;Iniciar Lição 43 →&lt;/button&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</textarea>
        </div>
    </div>
    
</div>
<p>
  Abra este laboratório no Playground IDE e experimente alterar o valor de <code>perspective: 1000px</code> para <code>200px</code> ou <code>3000px</code> para perceber como a profundidade visual da cena 3D se transforma:
</p>
<p style="text-align: center; margin: 35px 0;">
  <a href="https://webzoneware.com/web-academy/playground-web/" class="wzw-btn-playground" target="_blank" rel="noopener">⚡ Abrir no Playground IDE &rarr;</a>
</p>
<h2>7. Resumo e Próximos Passos</h2>
<ul>
<li><code>transform</code> opera na camada <strong>Composite</strong> da GPU, mantendo 60fps sem provocar recálculos de Layout (Reflow).</li>
<li><code>translate(x, y)</code> move elementos sem perturbar a geometria dos vizinhos.</li>
<li><code>scale()</code> e <code>rotate()</code> redimensionam e giram a caixa com aceleração gráfica.</li>
<li><code>transform-origin</code> define o ponto pivô de ancoragem da transformação.</li>
<li>As propriedades individuais modernas (<code>translate</code>, <code>rotate</code>, <code>scale</code>) eliminam a necessidade de encadeamentos longos.</li>
<li>Efeitos 3D realistas dependem de <strong><code>perspective</code></strong> no contêiner pai, <strong><code>transform-style: preserve-3d</code></strong> no elemento rotativo e <strong><code>backface-visibility: hidden</code></strong> nas faces.</li>
</ul>
<div class="wzw-callout wzw-callout-success">
<p><strong>Próximo Passo:</strong> Agora que você sabe mover e transformar elementos no espaço, como fazer essas mudanças acontecerem de forma suave, natural e cinematográfica, sem saltos bruscos? Na <strong>Lição 43</strong>, dominaremos as <strong>Transições Suaves no CSS (transition, timing-functions e cubic-bezier)</strong>!</p>
</div>
<p>O post <a href="https://webzoneware.com/web-academy/curso-css/transformacoes-css-translate-rotate-scale/">Transformações 2D e 3D Modernas no CSS | Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://webzoneware.com/web-academy/curso-css/transformacoes-css-translate-rotate-scale/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Pseudo-elementos no CSS: ::before e ::after &#124; Web Academy</title>
		<link>https://webzoneware.com/web-academy/curso-css/pseudo-elementos-before-after/</link>
					<comments>https://webzoneware.com/web-academy/curso-css/pseudo-elementos-before-after/#respond</comments>
		
		<dc:creator><![CDATA[Web-Zoneware]]></dc:creator>
		<pubDate>Thu, 22 Oct 2026 03:30:34 +0000</pubDate>
				<category><![CDATA[Curso de CSS e CSS3]]></category>
		<category><![CDATA[after css]]></category>
		<category><![CDATA[before css]]></category>
		<category><![CDATA[curso css3 completo]]></category>
		<category><![CDATA[marker css]]></category>
		<category><![CDATA[propriedade content]]></category>
		<category><![CDATA[pseudo-elementos]]></category>
		<category><![CDATA[selection css]]></category>
		<guid isPermaLink="false">https://webzoneware.com/?p=29461</guid>

					<description><![CDATA[<p>Uma das marcas distintivas de um desenvolvedor front-end de alto nível é a capacidade de manter o código HTML 100% semântico e enxuto. No passado, para criar uma fita de destaque em um cartão, um sublinhado elegante que se expande ao passar o mouse ou uma bolinha verde pulsante de status, desenvolvedores enchiam o documento [&#8230;]</p>
<p>O post <a href="https://webzoneware.com/web-academy/curso-css/pseudo-elementos-before-after/">Pseudo-elementos no CSS: ::before e ::after | Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wzw-lesson-lead">
  Uma das marcas distintivas de um desenvolvedor front-end de alto nível é a capacidade de manter o código HTML 100% semântico e enxuto. No passado, para criar uma fita de destaque em um cartão, um sublinhado elegante que se expande ao passar o mouse ou uma bolinha verde pulsante de status, desenvolvedores enchiam o documento de tags vazias como <code>&lt;span class="circulo"&gt;&lt;/span&gt;</code>. Os <strong>Pseudo-elementos</strong> (identificados pelo duplo dois-pontos <code>::</code>) revolucionaram esse cenário: eles criam elementos visuais virtuais diretamente na árvore de renderização do CSS, sem poluir uma única linha do seu HTML!
</p>
<h2>1. A Sintaxe Padronizada: Por que Dois Dois-Pontos (<code>::</code>)?</h2>
<p>
  Nas especificações antigas de CSS1 e CSS2, tanto pseudo-classes quanto pseudo-elementos usavam um único caractere <code>:</code>.
</p>
<p>
  A partir do CSS3, a W3C estabeleceu uma fronteira conceitual definitiva:
</p>
<ul>
<li><strong>Pseudo-classe (<code>:</code> com um dois-pontos):</strong> Mira um <em>estado dinâmico</em> do elemento real (ex.: <code>:hover</code>, <code>:focus</code>, <code>:checked</code>).</li>
<li><strong>Pseudo-elemento (<code>::</code> com dois dois-pontos):</strong> Cria um <em>elemento visual virtual</em> ou estiliza uma subparte interna (ex.: <code>::before</code>, <code>::after</code>, <code>::marker</code>, <code>::selection</code>).</li>
</ul>
<div class="wzw-callout wzw-callout-info">
<p><strong>Dica de Boas Práticas:</strong> Os navegadores modernos ainda aceitam a sintaxe antiga de um ponto (<code>:before</code>) por razões de retrocompatibilidade com a década de 1990. No entanto, em código moderno profissional e acessível, use SEMPRE o padrão moderno de dois dois-pontos (<strong><code>::before</code></strong> e <strong><code>::after</code></strong>).</p>
</div>
<h2>2. Onde Nascem <code>::before</code> e <code>::after</code>?</h2>
<p>
  Um dos equívocos mais comuns entre iniciantes é acreditar que <code>::before</code> fica localizado <em>do lado de fora, antes da tag</em>, e que <code>::after</code> fica <em>do lado de fora, depois da tag</em>. Isso é falso!
</p>
<p>
  No modelo de renderização do navegador, os pseudo-elementos são inseridos <strong>INTERNAMENTE</strong> dentro do elemento selecionado:
</p>
<ul>
<li><strong><code>::before</code>:</strong> É renderizado como o <strong>primeiríssimo filho interno</strong> da caixa, logo antes do texto ou de qualquer outro elemento filho.</li>
<li><strong><code>::after</code>:</strong> É renderizado como o <strong>último filho interno</strong> da caixa, logo após todo o conteúdo do elemento.</li>
</ul>
<div class="wzw-callout wzw-callout-warning">
<p><strong>Atenção aos Elementos Vazios (Void Elements):</strong> Como <code>::before</code> e <code>::after</code> são filhos internos, eles <strong>NÃO FUNCIONAM</strong> em tags HTML auto-fechadas que não aceitam conteúdo filho no DOM, como <code>&lt;img&gt;</code>, <code>&lt;input&gt;</code>, <code>&lt;br&gt;</code> e <code>&lt;hr&gt;</code>!</p>
</div>
<h2>3. A Regra de Ouro: A Propriedade <code>content</code></h2>
<p>
  Existe uma lei inegociável para <code>::before</code> e <code>::after</code>: <strong>sem a propriedade <code>content</code>, o pseudo-elemento simplesmente NÃO EXISTE</strong> e o navegador não desenha absolutamente nada na tela!
</p>
<p>
  Mesmo que você queira criar um quadrado geométrico ou uma linha colorida sem nenhum texto dentro, você <strong>deve</strong> declarar <code>content: "";</code> (aspas vazias):
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-23903" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">10 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-23903', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-23903', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">/* Cria um indicador visual de status verde antes do texto */</span></span>
<span class="wzw-code-line">.status-online::before {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">content</span>: <span class="wzw-tk-str">&quot;&quot;</span>;            /* OBRIGATÓRIO: Sem isso, o elemento não nasce! */</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">display</span>: inline-block;  /* Por padrão, pseudo-elementos são inline */</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">width</span>: <span class="wzw-tk-num">10px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">height</span>: <span class="wzw-tk-num">10px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background-color</span>: <span class="wzw-tk-num">#10b981</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">border-radius</span>: 50%;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">margin-right</span>: <span class="wzw-tk-num">8px</span>;</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* Cria um indicador visual de status verde antes do texto */
.status-online::before {
  content: &quot;&quot;;            /* OBRIGATÓRIO: Sem isso, o elemento não nasce! */
  display: inline-block;  /* Por padrão, pseudo-elementos são inline */
  width: 10px;
  height: 10px;
  background-color: #10b981;
  border-radius: 50%;
  margin-right: 8px;
}</textarea>
        </div>
    </div>
    
</div>
<h3>O que a Propriedade <code>content</code> Pode Conter?</h3>
<ul>
<li><strong>Aspas Vazias (<code>content: "";</code>):</strong> O padrão para formas geométricas decorativas, máscaras e overlays.</li>
<li><strong>Texto Fixo ou Emojis:</strong> <code>content: "★ ";</code> ou <code>content: " • ";</code>.</li>
<li><strong>Leitura Dinâmica de Atributos:</strong> <code>content: attr(data-tooltip);</code> permite ler valores de atributos HTML para criar tooltips 100% nativos sem JavaScript!</li>
</ul>
<h2>4. Casos de Uso Clássicos na Indústria</h2>
<h3>1. Sublinhado Animado no Hover (Underline Expandível)</h3>
<p>
  Em vez de usar o velho e rígido <code>text-decoration: underline</code>, criamos uma linha fina com <code>::after</code> que se expande do centro para as pontas suavemente:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-15909" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">23 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-15909', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-15909', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line">.link-magico {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">position</span>: relative;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">text-decoration</span>: none;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#38bdf8</span>;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.link-magico::after {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">content</span>: <span class="wzw-tk-str">&quot;&quot;</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">position</span>: absolute;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">left</span>: 0;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">bottom</span>: -<span class="wzw-tk-num">4px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">width</span>: 100%;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">height</span>: <span class="wzw-tk-num">2px</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: <span class="wzw-tk-num">#38bdf8</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transform</span>: scaleX(0); /* Inicialmente invisível (comprimido a zero) */</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transition</span>: transform <span class="wzw-tk-num">0.3s</span> ease;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transform-origin</span>: right;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.link-magico<span class="wzw-tk-kw">:hover</span>::after {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transform</span>: scaleX(1); /* Expande para 100% da largura no hover */</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">transform-origin</span>: left;</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>.link-magico {
  position: relative;
  text-decoration: none;
  color: #38bdf8;
}

.link-magico::after {
  content: &quot;&quot;;
  position: absolute;
  left: 0;
  bottom: -4px;
  width: 100%;
  height: 2px;
  background: #38bdf8;
  transform: scaleX(0); /* Inicialmente invisível (comprimido a zero) */
  transition: transform 0.3s ease;
  transform-origin: right;
}

.link-magico:hover::after {
  transform: scaleX(1); /* Expande para 100% da largura no hover */
  transform-origin: left;
}</textarea>
        </div>
    </div>
    
</div>
<h3>2. Máscara Escura sobre Imagens (Overlay)</h3>
<p>
  Para escurecer um cartão com imagem de fundo e garantir que o texto branco seja sempre legível (contraste WCAG):
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-75994" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">17 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-75994', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-75994', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line">.card-com-overlay {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">position</span>: relative;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">overflow</span>: hidden;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.card-com-overlay::before {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">content</span>: <span class="wzw-tk-str">&quot;&quot;</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">position</span>: absolute;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">inset</span>: 0; /* Preenche 100% da área do card */</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background</span>: rgba(0, 0, 0, 0.55); /* Máscara semitransparente */</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">z-index</span>: 1;</span>
<span class="wzw-code-line">}</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">.card-conteudo {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">position</span>: relative;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">z-index</span>: 2; /* Fica acima da máscara */</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>.card-com-overlay {
  position: relative;
  overflow: hidden;
}

.card-com-overlay::before {
  content: &quot;&quot;;
  position: absolute;
  inset: 0; /* Preenche 100% da área do card */
  background: rgba(0, 0, 0, 0.55); /* Máscara semitransparente */
  z-index: 1;
}

.card-conteudo {
  position: relative;
  z-index: 2; /* Fica acima da máscara */
}</textarea>
        </div>
    </div>
    
</div>
<h2>5. Outros Pseudo-elementos Modernos Essenciais</h2>
<h3><code>::selection</code> — A Identidade Visual do Texto Selecionado</h3>
<p>
  Quando o usuário arrasta o mouse para copiar um trecho do seu site, você pode trocar o azul genérico do sistema pela cor da marca da sua empresa:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-65682" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">5 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-65682', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-65682', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-comment">/* Personaliza o grifo de texto do site inteiro */</span></span>
<span class="wzw-code-line">::selection {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">background-color</span>: <span class="wzw-tk-num">#38bdf8</span>;</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#0b0f19</span>;</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>/* Personaliza o grifo de texto do site inteiro */
::selection {
  background-color: #38bdf8;
  color: #0b0f19;
}</textarea>
        </div>
    </div>
    
</div>
<h3><code>::marker</code> — Marcadores de Lista sem Gambiarras</h3>
<p>
  No passado, mudar a cor da bolinha de uma lista <code>&lt;li&gt;</code> exigia remover o estilo nativo e reconstruí-lo do zero. Hoje usamos <strong><code>::marker</code></strong>:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-71895" data-lang="css">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">CSS3</span>
                                <span class="wzw-ide-lines-count">4 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-71895', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-71895', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-attr">li</span>::marker {</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">color</span>: <span class="wzw-tk-num">#10b981</span>; /* A bolinha ou número fica verde sem afetar o texto! */</span>
<span class="wzw-code-line">  <span class="wzw-tk-attr">font-size</span>: <span class="wzw-tk-num">1.1rem</span>;</span>
<span class="wzw-code-line">}</span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>li::marker {
  color: #10b981; /* A bolinha ou número fica verde sem afetar o texto! */
  font-size: 1.1rem;
}</textarea>
        </div>
    </div>
    
</div>
<h2>6. Acessibilidade e Leitores de Tela (WCAG 2.2)</h2>
<div class="wzw-callout wzw-callout-warning">
<p><strong>Atenção com Textos em Pseudo-elementos:</strong> Leitores de tela modernos (como VoiceOver e NVDA) <strong>leem em voz alta</strong> o texto colocado dentro de <code>content: "..."</code>! Portanto, nunca insira textos críticos apenas no CSS. Se o pseudo-elemento for puramente decorativo, use <code>content: ""</code> para evitar poluir a leitura de usuários cegos.</p>
</div>
<h2>7. Laboratório Prático: Tooltip Nativo e Efeitos de Pseudo-elementos</h2>
<p>
  No código interativo abaixo, construímos um componente que combina <strong>tooltip nativo via <code>attr()</code></strong>, bolinha de status pulsante, marcador de lista customizado e grifo de texto personalizado:
</p>
<div class="wzw-code-wrapper">
    <div class="wzw-ide-card" id="wzw-code-22188" data-lang="html">
        <div class="wzw-ide-header">
            <div class="wzw-ide-dots" aria-hidden="true">
                <span class="wzw-dot wzw-dot-red"></span>
                <span class="wzw-dot wzw-dot-amber"></span>
                <span class="wzw-dot wzw-dot-green"></span>
            </div>
            <div class="wzw-ide-meta">
                <span class="wzw-ide-lang-badge">HTML5</span>
                                <span class="wzw-ide-lines-count">111 linhas</span>
            </div>
            <div class="wzw-ide-actions">
                <button type="button" class="wzw-ide-btn wzw-ide-wrap-btn" onclick="wzwToggleCodeWrap('wzw-code-22188', this)" title="Alternar quebra automática de linhas">
                    ⇄ Wrap
                </button>
                <button type="button" class="wzw-ide-btn wzw-ide-copy-btn" onclick="wzwCopyCodeBlock('wzw-code-22188', this)" aria-label="Copiar código para a área de transferência">
                    📋 <span class="wzw-copy-text">Copiar Código</span>
                </button>
            </div>
        </div>
        <div class="wzw-ide-body">
            <pre class="wzw-ide-pre" tabindex="0"><code class="wzw-ide-code"><span class="wzw-code-line"><span class="wzw-tk-tag">&lt;!DOCTYPE</span><span class="wzw-tk-kw"> html</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;html</span> <span class="wzw-tk-attr">lang</span>=<span class="wzw-tk-str">&quot;pt-BR&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;head&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;meta</span> <span class="wzw-tk-attr">charset</span>=<span class="wzw-tk-str">&quot;UTF-8&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;title&gt;</span>Laboratório de Pseudo-elementos CSS<span class="wzw-tk-tag">&lt;/title&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;style&gt;</span></span>
<span class="wzw-code-line">    body {</span>
<span class="wzw-code-line">      font-family: &#039;Inter&#039;, system-ui, sans-serif;</span>
<span class="wzw-code-line">      background: #0b0f19;</span>
<span class="wzw-code-line">      color: #f8fafc;</span>
<span class="wzw-code-line">      padding: 40px;</span>
<span class="wzw-code-line">      margin: 0;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">/* 1. SELEÇÃO DE TEXTO PERSONALIZADA (::selection) */</span></span>
<span class="wzw-code-line">    ::selection {</span>
<span class="wzw-code-line">      background: #f59e0b;</span>
<span class="wzw-code-line">      color: #000;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">/* 2. CARD COM STATUS ONLINE (::before) */</span></span>
<span class="wzw-code-line">    .card-usuario {</span>
<span class="wzw-code-line">      max-width: 440px;</span>
<span class="wzw-code-line">      background: #1e293b;</span>
<span class="wzw-code-line">      border: 1px solid #334155;</span>
<span class="wzw-code-line">      border-radius: 14px;</span>
<span class="wzw-code-line">      padding: 24px;</span>
<span class="wzw-code-line">      margin-bottom: 30px;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .status-badge {</span>
<span class="wzw-code-line">      display: inline-flex;</span>
<span class="wzw-code-line">      align-items: center;</span>
<span class="wzw-code-line">      font-size: 0.85rem;</span>
<span class="wzw-code-line">      font-weight: 600;</span>
<span class="wzw-code-line">      color: #10b981;</span>
<span class="wzw-code-line">      margin-bottom: 12px;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">/* Bolinha verde desenhada puramente no CSS */</span></span>
<span class="wzw-code-line">    .status-badge::before {</span>
<span class="wzw-code-line">      content: &quot;&quot;;</span>
<span class="wzw-code-line">      width: 8px;</span>
<span class="wzw-code-line">      height: 8px;</span>
<span class="wzw-code-line">      background: #10b981;</span>
<span class="wzw-code-line">      border-radius: 50%;</span>
<span class="wzw-code-line">      margin-right: 8px;</span>
<span class="wzw-code-line">      box-shadow: 0 0 8px #10b981;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">/* 3. TOOLTIP NATIVO SEM JS (::after com attr) */</span></span>
<span class="wzw-code-line">    .tooltip-link {</span>
<span class="wzw-code-line">      position: relative;</span>
<span class="wzw-code-line">      color: #38bdf8;</span>
<span class="wzw-code-line">      text-decoration: underline;</span>
<span class="wzw-code-line">      cursor: pointer;</span>
<span class="wzw-code-line">      display: inline-block;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .tooltip-link::after {</span>
<span class="wzw-code-line">      content: attr(data-tooltip); /* Lê o texto do atributo HTML! */</span>
<span class="wzw-code-line">      position: absolute;</span>
<span class="wzw-code-line">      bottom: 125%;</span>
<span class="wzw-code-line">      left: 50%;</span>
<span class="wzw-code-line">      transform: translateX(-50%) scale(0.9);</span>
<span class="wzw-code-line">      background: #020617;</span>
<span class="wzw-code-line">      color: #fff;</span>
<span class="wzw-code-line">      font-size: 0.75rem;</span>
<span class="wzw-code-line">      padding: 6px 12px;</span>
<span class="wzw-code-line">      border-radius: 6px;</span>
<span class="wzw-code-line">      white-space: nowrap;</span>
<span class="wzw-code-line">      pointer-events: none;</span>
<span class="wzw-code-line">      opacity: 0;</span>
<span class="wzw-code-line">      transition: opacity 0.2s ease, transform 0.2s ease;</span>
<span class="wzw-code-line">      box-shadow: 0 4px 12px rgba(0,0,0,0.5);</span>
<span class="wzw-code-line">      border: 1px solid #334155;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    .tooltip-link:hover::after {</span>
<span class="wzw-code-line">      opacity: 1;</span>
<span class="wzw-code-line">      transform: translateX(-50%) scale(1);</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-comment">/* 4. MARCADOR DE LISTA CUSTOMIZADO (::marker) */</span></span>
<span class="wzw-code-line">    ul.lista-recursos li::marker {</span>
<span class="wzw-code-line">      color: #38bdf8;</span>
<span class="wzw-code-line">      font-size: 1.2rem;</span>
<span class="wzw-code-line">    }</span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;/style&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;/head&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;body&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;h2</span> <span class="wzw-tk-attr">style</span>=<span class="wzw-tk-str">&quot;color:#f1f5f9; margin-top:0;&quot;</span><span class="wzw-tk-tag">&gt;</span>Demonstração de Pseudo-elementos<span class="wzw-tk-tag">&lt;/h2&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;p</span> <span class="wzw-tk-attr">style</span>=<span class="wzw-tk-str">&quot;color:#94a3b8; font-size:0.9rem;&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">    Selecione qualquer trecho deste texto com o mouse para ver o <span class="wzw-tk-tag">&lt;code&gt;</span>::selection<span class="wzw-tk-tag">&lt;/code&gt;</span> amarelo em ação!</span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;/p&gt;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;card-usuario&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;div</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;status-badge&quot;</span><span class="wzw-tk-tag">&gt;</span>Servidor Ativo<span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;h3</span> <span class="wzw-tk-attr">style</span>=<span class="wzw-tk-str">&quot;margin:0 0 10px 0;&quot;</span><span class="wzw-tk-tag">&gt;</span>Plataforma WebZoneWare<span class="wzw-tk-tag">&lt;/h3&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;p</span> <span class="wzw-tk-attr">style</span>=<span class="wzw-tk-str">&quot;color:#94a3b8; font-size:0.9rem; line-height:1.6;&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">      Passe o mouse sobre esta <span class="wzw-tk-tag">&lt;span</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;tooltip-link&quot;</span> <span class="wzw-tk-attr">data-tooltip</span>=<span class="wzw-tk-str">&quot;⚡ Dica de Engenharia: 100% puro CSS!&quot;</span><span class="wzw-tk-tag">&gt;</span>palavra com tooltip<span class="wzw-tk-tag">&lt;/span&gt;</span> para ver o texto flutuante gerado via <span class="wzw-tk-tag">&lt;code&gt;</span>content: attr()<span class="wzw-tk-tag">&lt;/code&gt;</span>.</span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;/p&gt;</span></span>
<span class="wzw-code-line">&nbsp;</span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;ul</span> <span class="wzw-tk-attr">class</span>=<span class="wzw-tk-str">&quot;lista-recursos&quot;</span> <span class="wzw-tk-attr">style</span>=<span class="wzw-tk-str">&quot;color:#cbd5e1; font-size:0.9rem;&quot;</span><span class="wzw-tk-tag">&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;li&gt;</span>CSS Grid 2D Completo<span class="wzw-tk-tag">&lt;/li&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;li&gt;</span>Flexbox Unidimensional<span class="wzw-tk-tag">&lt;/li&gt;</span></span>
<span class="wzw-code-line">      <span class="wzw-tk-tag">&lt;li&gt;</span>Acessibilidade WCAG 2.2<span class="wzw-tk-tag">&lt;/li&gt;</span></span>
<span class="wzw-code-line">    <span class="wzw-tk-tag">&lt;/ul&gt;</span></span>
<span class="wzw-code-line">  <span class="wzw-tk-tag">&lt;/div&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;/body&gt;</span></span>
<span class="wzw-code-line"><span class="wzw-tk-tag">&lt;/html&gt;</span></span>
</code></pre>
            <textarea class="wzw-ide-raw" aria-hidden="true" tabindex="-1" readonly>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;pt-BR&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot;&gt;
  &lt;title&gt;Laboratório de Pseudo-elementos CSS&lt;/title&gt;
  &lt;style&gt;
    body {
      font-family: &#039;Inter&#039;, system-ui, sans-serif;
      background: #0b0f19;
      color: #f8fafc;
      padding: 40px;
      margin: 0;
    }

    /* 1. SELEÇÃO DE TEXTO PERSONALIZADA (::selection) */
    ::selection {
      background: #f59e0b;
      color: #000;
    }

    /* 2. CARD COM STATUS ONLINE (::before) */
    .card-usuario {
      max-width: 440px;
      background: #1e293b;
      border: 1px solid #334155;
      border-radius: 14px;
      padding: 24px;
      margin-bottom: 30px;
    }

    .status-badge {
      display: inline-flex;
      align-items: center;
      font-size: 0.85rem;
      font-weight: 600;
      color: #10b981;
      margin-bottom: 12px;
    }

    /* Bolinha verde desenhada puramente no CSS */
    .status-badge::before {
      content: &quot;&quot;;
      width: 8px;
      height: 8px;
      background: #10b981;
      border-radius: 50%;
      margin-right: 8px;
      box-shadow: 0 0 8px #10b981;
    }

    /* 3. TOOLTIP NATIVO SEM JS (::after com attr) */
    .tooltip-link {
      position: relative;
      color: #38bdf8;
      text-decoration: underline;
      cursor: pointer;
      display: inline-block;
    }

    .tooltip-link::after {
      content: attr(data-tooltip); /* Lê o texto do atributo HTML! */
      position: absolute;
      bottom: 125%;
      left: 50%;
      transform: translateX(-50%) scale(0.9);
      background: #020617;
      color: #fff;
      font-size: 0.75rem;
      padding: 6px 12px;
      border-radius: 6px;
      white-space: nowrap;
      pointer-events: none;
      opacity: 0;
      transition: opacity 0.2s ease, transform 0.2s ease;
      box-shadow: 0 4px 12px rgba(0,0,0,0.5);
      border: 1px solid #334155;
    }

    .tooltip-link:hover::after {
      opacity: 1;
      transform: translateX(-50%) scale(1);
    }

    /* 4. MARCADOR DE LISTA CUSTOMIZADO (::marker) */
    ul.lista-recursos li::marker {
      color: #38bdf8;
      font-size: 1.2rem;
    }
  &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
  &lt;h2 style=&quot;color:#f1f5f9; margin-top:0;&quot;&gt;Demonstração de Pseudo-elementos&lt;/h2&gt;
  &lt;p style=&quot;color:#94a3b8; font-size:0.9rem;&quot;&gt;
    Selecione qualquer trecho deste texto com o mouse para ver o &lt;code&gt;::selection&lt;/code&gt; amarelo em ação!
  &lt;/p&gt;

  &lt;div class=&quot;card-usuario&quot;&gt;
    &lt;div class=&quot;status-badge&quot;&gt;Servidor Ativo&lt;/div&gt;
    &lt;h3 style=&quot;margin:0 0 10px 0;&quot;&gt;Plataforma WebZoneWare&lt;/h3&gt;
    &lt;p style=&quot;color:#94a3b8; font-size:0.9rem; line-height:1.6;&quot;&gt;
      Passe o mouse sobre esta &lt;span class=&quot;tooltip-link&quot; data-tooltip=&quot;⚡ Dica de Engenharia: 100% puro CSS!&quot;&gt;palavra com tooltip&lt;/span&gt; para ver o texto flutuante gerado via &lt;code&gt;content: attr()&lt;/code&gt;.
    &lt;/p&gt;

    &lt;ul class=&quot;lista-recursos&quot; style=&quot;color:#cbd5e1; font-size:0.9rem;&quot;&gt;
      &lt;li&gt;CSS Grid 2D Completo&lt;/li&gt;
      &lt;li&gt;Flexbox Unidimensional&lt;/li&gt;
      &lt;li&gt;Acessibilidade WCAG 2.2&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/div&gt;
&lt;/body&gt;
&lt;/html&gt;</textarea>
        </div>
    </div>
    
</div>
<p>
  Abra este laboratório no Playground IDE e teste passar o cursor sobre a palavra com tooltip e selecionar o texto para comprovar a elegância dos pseudo-elementos:
</p>
<p style="text-align: center; margin: 35px 0;">
  <a href="https://webzoneware.com/web-academy/playground-web/" class="wzw-btn-playground" target="_blank" rel="noopener">⚡ Abrir no Playground IDE &rarr;</a>
</p>
<h2>8. Resumo e Próximos Passos</h2>
<ul>
<li>Pseudo-elementos (usando <code>::</code>) criam nós virtuais ou estilizam subpartes sem alterar o código HTML.</li>
<li><code>::before</code> e <code>::after</code> são inseridos como o primeiro e o último filho <strong>interno</strong> da caixa selecionada.</li>
<li>A propriedade <code>content: ""</code> é estritamente obrigatória; sem ela, o pseudo-elemento não é renderizado.</li>
<li><code>content: attr(nome)</code> permite ler dados de atributos HTML dinamicamente (como data-tooltips).</li>
<li><code>::marker</code> estiliza as bolinhas e numerações de listas de forma nativa e limpa.</li>
<li><code>::selection</code> customiza as cores do texto grifado pelo cursor do usuário.</li>
</ul>
<div class="wzw-callout wzw-callout-success">
<p><strong>Próximo Passo:</strong> Agora que você pode criar elementos visuais no CSS, como movê-los, girá-los, esticá-los e criar sensações de profundidade em 3D? Na <strong>Lição 42</strong>, desvendaremos as <strong>Transformações 2D e 3D no CSS (translate, rotate, scale, skew e perspective)</strong>!</p>
</div>
<p>O post <a href="https://webzoneware.com/web-academy/curso-css/pseudo-elementos-before-after/">Pseudo-elementos no CSS: ::before e ::after | Web Academy</a> apareceu primeiro em <a href="https://webzoneware.com">Web-Zoneware</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://webzoneware.com/web-academy/curso-css/pseudo-elementos-before-after/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
