<?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 custom properties - Web-Zoneware</title>
	<atom:link href="https://webzoneware.com/tag/custom-properties/feed/" rel="self" type="application/rss+xml" />
	<link>https://webzoneware.com/tag/custom-properties/</link>
	<description>Mais do que apenas uma academia web.</description>
	<lastBuildDate>Thu, 22 Oct 2026 03:47:07 +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 custom properties - Web-Zoneware</title>
	<link>https://webzoneware.com/tag/custom-properties/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<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-33488" 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-33488', 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-33488', 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-40705" 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-40705', 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-40705', 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-49118" 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-49118', 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-49118', 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-34736" 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-34736', 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-34736', 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-54291" 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-54291', 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-54291', 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-54501" 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-54501', 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-54501', 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-53297" 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-53297', 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-53297', 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>
	</channel>
</rss>
