<?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>Arquivos css has - Web-Zoneware</title>
	<atom:link href="https://webzoneware.com/tag/css-has/feed/" rel="self" type="application/rss+xml" />
	<link>https://webzoneware.com/tag/css-has/</link>
	<description>Mais do que apenas uma academia web.</description>
	<lastBuildDate>Thu, 22 Oct 2026 04:11:43 +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>Arquivos css has - Web-Zoneware</title>
	<link>https://webzoneware.com/tag/css-has/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<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-91039" 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-91039', 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-91039', 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-99519" 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-99519', 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-99519', 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-12338" 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-12338', 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-12338', 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-20762" 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-20762', 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-20762', 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-76992" 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-76992', 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-76992', 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-10198" 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-10198', 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-10198', 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-59991" 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-59991', 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-59991', 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-31687" 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-31687', 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-31687', 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-56442" 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-56442', 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-56442', 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-76179" 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-76179', 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-76179', 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-25663" 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-25663', 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-25663', 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>
	</channel>
</rss>
