top of page

Hacker News Identifica o Seletor de Prefixo de Classe do CSS, mas o Verdadeiro Teste Vem Depois

O Hacker News destacou uma proposta de CSS que passou mais de dois anos evoluindo de uma queixa de desenvolvedores para uma direção aceita pelos padrões. O seletor de prefixo de classe permitiria que autores correspondessem a tokens de classe separados que compartilham um prefixo, possivelmente com uma sintaxe concisa como .icon-*.

Isso parece uma pequena conveniência. O conflito mais profundo envolve saber se os navegadores devem entender padrões de nomenclatura que frameworks utilitários, bibliotecas de ícones e equipes de aplicações já usam amplamente.

Hoje, os autores precisam enumerar todas as classes relacionadas, adicionar uma classe-base compartilhada ou recorrer a uma solução alternativa frágil com seletor de atributo. O CSS Working Group aceitou o caso de uso subjacente, mas aceitação não equivale a suporte nos navegadores. Testes, texto da especificação, trabalho de implementação e interoperabilidade ainda separam a proposta dos sites em produção.

O Que o Hacker News Realmente Encontrou na Proposta de CSS

A notícia não é que os navegadores de repente lançaram um seletor de classe curinga. A mudança relevante é que o CSS Working Group aceitou o problema.

Lea Verou abriu a proposta subjacente do CSSWG em 26 de fevereiro de 2024. Ela descreveu uma necessidade recorrente de corresponder a nomes individuais de classe que compartilham um prefixo.

A issue permaneceu aberta enquanto participantes discutiam casos de uso, sintaxe e questões mais amplas sobre seletores de atributo. Ela agora está fechada, com o rótulo “Accepted by CSSWG Resolution”, e foi atribuída ao Selectors Level 5.

Esse status importa. Ele significa que o grupo de trabalho concordou que o CSS deve abordar esse caso de uso. Não significa que a notação provisória .prefix-* tenha se tornado um padrão web estável.

A issue também traz o rótulo “Needs Testcase (WPT)”. WPT refere-se a Web Platform Tests, a suíte de testes compartilhada que os navegadores usam para verificar comportamentos interoperáveis.

A seção de desenvolvimento não lista nenhuma pull request associada. O rascunho público do Selectors Level 5 também ainda não apresenta o recurso como um seletor concluído e pronto para implantação.

Esses detalhes definem o evento real. Uma proposta de longa duração ultrapassou um importante limiar de padronização, enquanto o pipeline de implementação permanece incompleto.

A proposta se concentra em tokens de classe, não em texto arbitrário dentro do atributo class completo. Essa distinção explica tanto sua utilidade quanto a inadequação das soluções alternativas atuais.

Considere esta marcação:

Um desenvolvedor pode querer uma regra que corresponda a todo token de classe iniciado por icon-. A família desejada poderia incluir icon-alert, icon-search e centenas de ícones adicionais.

O seletor de prefixo de classe proposto expressa essa família diretamente:

Esse exemplo descreve o modelo pretendido, não uma sintaxe pronta para produção. Os autores não devem implantá-lo até que especificações, testes e navegadores concordem sobre seu comportamento.

O seletor de atributo existente parece enganosamente semelhante:

No entanto, ^= verifica se o valor completo do atributo começa com o texto fornecido. Ele não inspeciona cada token de classe de forma independente.

A regra corresponde a este elemento:

Ela não corresponde a este:

Desenvolvedores frequentemente compensam isso com dois seletores:

O primeiro lida com um token correspondente no início. O segundo procura um token correspondente após um espaço.

Esse padrão funciona em casos comuns de HTML, mas exige que os desenvolvedores raciocinem sobre texto serializado. Um seletor de classe deveria raciocinar sobre classes.

Portanto, a proposta mira uma lacuna real entre o modelo do documento e a linguagem de seletores. O HTML trata class como um conjunto de tokens separados por espaços, enquanto os seletores de substring operam sobre o valor serializado do atributo.

O item do Hacker News recebeu seis pontos e um comentário no recorte fornecido. Essa é uma discussão limitada, portanto não pode estabelecer um consenso amplo entre desenvolvedores.

Seu valor está em outro lugar. A publicação direcionou atenção para uma decisão de padronização que, de outra forma, poderia permanecer enterrada em uma issue do GitHub com vários anos.

Por Que Frameworks Utilitários e Bibliotecas de Ícones Sentem a Pressão

A proposta pressiona bibliotecas que atualmente duplicam estilos compartilhados ou exigem marcação extra para representar uma família conceitual de classes.

Frameworks utilitários codificam relações entre propriedade e valor em nomes como pt-6 ou space-y-4. Sistemas de ícones usam famílias como fa-* e bi-*.

Esses sistemas de nomenclatura criam dois tipos de estilização. Cada classe precisa de declarações específicas para seu valor, enquanto a família completa frequentemente compartilha declarações básicas.

Uma família de ícones, por exemplo, pode precisar de regras comuns de exibição, dimensionamento, alinhamento ou renderização. Classes individuais de ícones então fornecem glifos ou referências de imagem separados.

Sem correspondência por prefixo, autores de bibliotecas têm várias escolhas imperfeitas. Eles podem enumerar cada classe, exigir uma classe-base separada ou manipular a string completa do atributo.

A enumeração produz seletores como este:

Uma ferramenta de build pode gerar essa lista. A geração reduz a digitação, mas não elimina os bytes gerados nem a relação que os autores precisam manter.

A segunda abordagem separa o comportamento comum do valor individual:

Esse design é explícito e frequentemente faz sentido. Também exige que os consumidores se lembrem de duas classes para um componente visível.

Bootstrap Icons segue esse padrão geral com uma classe-base bi e uma classe de ícone específica. A proposta do CSSWG usa esses sistemas como evidência de que o seletor ausente cria atrito real para autores.

Um seletor de prefixo de classe permitiria esta marcação:

O seletor de família poderia fornecer comportamento compartilhado, enquanto .icon-alert fornece sua declaração exclusiva.

Isso não torna automaticamente a marcação com uma só classe superior. Classes-base podem comunicar intenção, simplificar a depuração e impedir uma regra de família excessivamente ampla.

Em vez disso, a proposta oferece aos autores outra representação. As bibliotecas poderiam decidir se classes-base explícitas ou famílias inferidas por prefixo se encaixam melhor em seus contratos.

O CSS utility-first cria uma pressão relacionada. Um prefixo como pt- codifica uma categoria de propriedade, enquanto o sufixo identifica um valor.

Um framework poderia usar um seletor de família para estabelecer uma propriedade personalizada compartilhada, uma regra de contenção ou outro comportamento básico. Classes específicas poderiam então fornecer valores individuais.

A economia imediata pode parecer modesta. O benefício estrutural é mais importante, pois a folha de estilo pode expressar o mesmo agrupamento já incorporado nos nomes das classes.

É por isso que a proposta não é apenas açúcar sintático. Mudanças de sintaxe tornam-se arquiteturais quando permitem que autores removam listas geradas ou marcação redundante.

Ainda assim, o recurso não substituiria Tailwind, Bootstrap, Sass, PostCSS ou extração em tempo de build. Essas ferramentas resolvem problemas muito mais amplos do que corresponder a um prefixo de token.

O Tailwind, por exemplo, gera declarações com base em utilitários configurados e no uso detectado. Um seletor nativo não gera a declaração específica de valor para cada utilitário.

O navegador pode corresponder a .pt-*, mas não consegue inferir o que cada sufixo significa. A folha de estilo ainda precisa de regras que mapeiem nomes suportados para valores de propriedade válidos.

Portanto, o seletor de prefixo de classe aborda agrupamento, não geração arbitrária de utilitários. Alegações de que ele elimina ferramentas de build de CSS exageram seu escopo.

O público afetado também vai além dos mantenedores de frameworks. Equipes de aplicações frequentemente usam nomes como status-*, theme-*, language-* ou priority-*.

Um sistema de documentação pode emitir as classes language-javascript e language-python em blocos de código. A própria especificação HTML recomenda uma convenção de nomenclatura language- para exemplos de código.

Destacadores de sintaxe então precisam identificar o token de linguagem mesmo quando outras classes aparecem antes dele. Verou citou isso como um problema prático para o Prism.

Equipes que mantêm grandes frontends deveriam se importar porque convenções se tornam infraestrutura. Quando milhares de templates dependem de um padrão de nomenclatura, cada solução alternativa se torna mais difícil de alterar.

Manter essas decisões também exige documentação interna confiável. Uma base de conhecimento de engenharia pesquisável pode preservar convenções de seletores junto com notas de componentes e migração.

A decisão de padronização coloca mantenedores de frameworks e bibliotecas sob pressão de longo prazo, não sob pressão imediata para migração. Eles precisam decidir se relações de prefixo são contratos públicos significativos.

O Mecanismo Corrige a Correspondência de Tokens, Não Apenas uma Sintaxe Mais Curta

O mecanismo central é a correspondência de prefixo consciente de tokens, que difere fundamentalmente de pesquisar o texto bruto de um atributo `class`.

O CSS já inclui vários seletores de atributo. A especificação de seletores define operadores para valores exatos, tokens separados por espaços, prefixos, sufixos e substrings.

Cada operador responde a uma pergunta diferente. [class~="button"] encontra um token button completo, enquanto [class^="button-"] verifica o início do valor completo do atributo.

O que falta ao CSS é uma operação combinada. Os autores precisam selecionar um token de uma lista separada por espaços e então testar se esse token começa com um prefixo.

A issue original considerou dois caminhos. Um estende o seletor de classe familiar com sintaxe curinga, como .foo-*.

O outro adiciona um operador de atributo que combina o comportamento de ~= e ^=. Formas propostas incluíam ~^=, ^~= e ^~.

A notação de classe é mais fácil de ler porque permanece dentro do vocabulário existente de seletores de classe do CSS. Uma regra que começa com um ponto comunica claramente que ela visa classes.

O operador de atributo combinado seria mais geral. Ele poderia ser aplicado a atributos além de class quando esses atributos contêm valores separados por espaços.

A generalidade cria seus próprios custos. Um novo operador precisa se encaixar nas regras de análise do CSS, permanecer compreensível e evitar confundir autores que já aprendem vários operadores de atributo.

A sintaxe de classe com curinga também levanta questões além da estética. A especificação precisa definir escape, limites de correspondência, sensibilidade a maiúsculas e minúsculas, entrada inválida e especificidade.

A especificidade determina qual declaração vence quando vários seletores correspondem. Um novo seletor precisa ter comportamento previsível ao lado de classes comuns, atributos, pseudoclasses e regras aninhadas.

O processo de padronização também precisa decidir como o seletor se comporta por meio das APIs do navegador. querySelector(), matches() e a análise de folhas de estilo consomem sintaxe de seletores.

O comportamento para seletores inválidos importa porque uma sintaxe sem suporte pode invalidar uma lista de seletores. Os autores precisam de uma forma confiável de usar o recurso sem descartar acidentalmente regras não relacionadas.

A detecção de recursos é outra questão prática. O CSS oferece suporte a @supports selector(...) para verificar se um navegador reconhece um seletor.

Um padrão futuro de aprimoramento progressivo poderia se parecer com isto:

Essa ilustração permanece hipotética até que a gramática final seja publicada. Ela demonstra por que detalhes de análise importam antes que desenvolvedores possam escrever fallbacks seguros.

Questões de desempenho merecem tratamento cuidadoso, mas não devem se tornar especulação. Os navegadores já mantêm mecanismos otimizados para correspondência de classes e atributos.

Uma operação de prefixo consciente de tokens não é automaticamente lenta. Seu custo depende das estratégias de indexação do mecanismo, dos padrões da folha de estilo e das escolhas da especificação final.

Da mesma forma, o recurso não força inerentemente os navegadores a verificar cada classe de cada elemento em cada recálculo de estilo. Implementadores podem desenvolver índices e atalhos de correspondência.

Apenas protótipos de navegadores e Web Platform Tests podem validar essas premissas. A aceitação pelo padrão fornece direcionamento, não evidências de desempenho.

O argumento mais forte da proposta é o alinhamento semântico. Os desenvolvedores pensam em class="card icon-alert muted" como três tokens, não como uma única string contendo espaços.

O .icon-alert comum já usa esse modelo de tokens. Estendê-lo a uma família de classes mantém o modelo mental consistente.

Esse encaixe semântico também melhora a revisabilidade. .icon-* revela imediatamente um namespace ou família intencional, enquanto uma solução alternativa com atributos emparelhados exige uma inspeção mais atenta.

Ainda assim, uma sintaxe concisa pode ocultar um escopo de correspondência amplo. Uma única regra de família pode afetar todas as classes que começam com um prefixo curto em toda uma aplicação.

Isso não é um defeito do analisador. É um problema de governança de folhas de estilo, assim como seletores de tipo amplos ou propriedades personalizadas com nomes pouco específicos.

O mecanismo oferece ao CSS uma primitiva mais limpa. Ele não determina se uma equipe usa essa primitiva com cuidado.

O Risco Real É CSS Vazado, Não o Caractere Curinga

Um seletor de prefixo pode reduzir código frágil e, ao mesmo tempo, facilitar acoplamentos acidentais; por isso, a disciplina de nomenclatura se torna mais importante após sua adoção.

A reação cética é direta. Se um seletor corresponde a uma família aberta, uma classe futura pode herdar estilos que seu autor jamais esperou.

Suponha que um sistema de design defina esta regra:

Meses depois, outra equipe adiciona card-payment-error para análises ou estado da aplicação. Essa classe passaria a integrar a família de estilização, apesar de servir a uma finalidade diferente.

Uma classe base evita essa ambiguidade:

A marcação declara que o elemento é um cartão. A classe específica acrescenta um significado separado.

A correspondência por prefixo infere a associação a partir da grafia. Isso pode ser conciso, mas transforma convenções de nomenclatura em relações executáveis.

A distinção se assemelha à tipagem estrutural em programação. Um nome se qualifica porque tem a forma esperada, não porque o autor declarou explicitamente sua associação.

Isso pode funcionar bem dentro de namespaces controlados. Torna-se arriscado quando prefixos curtos abrangem produtos, módulos legados, widgets de terceiros ou equipes gerenciadas de forma independente.

A preocupação surgiu nas primeiras reações públicas ao post vinculado. Um comentarista do Reddit resumiu o receio como mais oportunidades para “leaky css.”

Essa reação não é evidência contra o padrão. Ela identifica a troca envolvida que as especificações não podem resolver pelas equipes de aplicação.

As bibliotecas precisariam documentar famílias de prefixos como APIs estáveis. Quando .icon-* passa a ter comportamento compartilhado, qualquer nova classe iniciada por icon- entra nesse contrato.

A refatoração também deixa de ser tão local. Renomear uma classe pode alterar tanto sua regra específica quanto qualquer regra de família com curinga que corresponda a ela.

As ferramentas de desenvolvimento precisarão expor essas relações com clareza. Um inspetor deve mostrar que .icon-alert correspondeu a um seletor de família, e não apenas ao seu seletor exato.

Ferramentas de busca, linters e inteligência de código podem precisar de atualizações semelhantes. A análise estática se torna mais difícil quando um seletor representa um conjunto em expansão, e não um nome fixo.

A proposta também poderia incentivar autores a codificar mais dados dentro dos nomes de classe. Esse padrão já é comum, mas o suporte nativo pode aumentar seu apelo.

Participantes do CSSWG questionaram se algumas relações de chave e valor pertencem, em vez disso, a atributos data-*. Por exemplo, data-pt="6" mantém a propriedade e o valor estruturalmente separados.

Essa representação é mais explícita, mas também mais verbosa. Ela pode não se integrar às convenções de frameworks existentes ou às ferramentas baseadas em classes.

Nenhum dos modelos vence universalmente. Classes continuam adequadas para agrupamento e pontos de ancoragem de estilização, enquanto atributos de dados podem representar estado ou dados da aplicação.

O seletor de prefixo de classe não deve se tornar uma desculpa para mover todo estado para um nome de classe comprimido. A correspondência nativa não elimina escolhas de design semântico.

Também há um risco de compatibilidade durante a transição. Autores não podem presumir que a aceitação pelo padrão significa que a sintaxe funciona em todos os navegadores.

Usar um seletor não reconhecido sem fallback pode remover silenciosamente a estilização pretendida. A adoção em produção deve aguardar suporte documentado e evidências de interoperabilidade.

Os desenvolvedores também devem resistir a copiar sintaxe ilustrativa antes que ela se estabilize. A issue propôs .foo-*, mas grupos de trabalho podem revisar a gramática ao editar uma especificação.

Mesmo depois que um mecanismo implementar o recurso, as equipes devem verificar se outros mecanismos tratam casos de borda de forma idêntica. A história do CSS contém recursos que levaram anos para alcançar interoperabilidade confiável.

O enquadramento do Hacker News pode comprimir essas etapas em uma única manchete. “CSS do futuro” é justo, enquanto “novo CSS que você pode usar agora” seria enganoso.

Uma equipe de aplicação conservadora deve continuar usando classes base explícitas quando essa estrutura comunica um significado importante. Listas de seletores geradas continuam viáveis quando a família de classes é finita.

A atual solução alternativa com atributos continua utilizável em marcação controlada. Os autores devem lembrar que ela depende de espaços em branco e da serialização de atributos, e não de semântica direta de tokens.

Nenhuma regra única de migração serve para todas as bases de código. O recurso melhora a linguagem disponível, mas a arquitetura ainda determina se ele melhora a aplicação.

O Que Precisa Acontecer Antes que o Seletor de Prefixo de Classe Seja Lançado

Três sinais determinarão se a ideia aceita se torna CSS confiável: texto de especificação, testes compartilhados e implementações interoperáveis nos navegadores.

O primeiro sinal é uma edição concreta no Selectors Level 5. O rascunho precisa de regras normativas de gramática e correspondência, não apenas de uma resolução vinculada no GitHub.

O texto normativo define o que implementações compatíveis devem fazer. Ele deve resolver a forma do seletor, limites de tokens, escapes, especificidade e comportamento em APIs de seletores.

Essa edição reforçaria a ideia de que .prefix-*, ou uma sintaxe sucessora, está avançando rumo à implementação. Uma gramática diferente enfraqueceria as premissas baseadas nos exemplos atuais.

O segundo sinal é o progresso nos Web Platform Tests. O rótulo de testes da issue mostra que o grupo de trabalho espera cobertura executável.

Os testes devem incluir classes em diferentes posições no atributo, múltiplos tokens correspondentes, caracteres escapados, comportamento de maiúsculas e minúsculas e sintaxe inválida.

Eles também devem cobrir APIs de seletores JavaScript. Um recurso CSS permanece incompleto se folhas de estilo e querySelector() divergem sobre a mesma gramática.

Uma suíte de testes abrangente reforçaria a confiança de que as equipes de navegadores compartilham uma única interpretação. Testes ausentes ou que mudam repetidamente indicariam detalhes de design não resolvidos.

O terceiro sinal é a implementação em diferentes mecanismos de navegadores. Uma compilação experimental pode revelar a viabilidade, mas não pode estabelecer compatibilidade na web.

Os desenvolvedores devem acompanhar os rastreadores de issues do Chromium, Gecko e WebKit em busca de trabalho de implementação. Notas de lançamento e dados de compatibilidade importarão mais do que atenção nas redes sociais.

A disponibilidade entre mecanismos reforçaria o valor arquitetural da proposta. O suporte de longo prazo em apenas um mecanismo a manteria no território do aprimoramento progressivo.

Experimentos de frameworks oferecem uma pista adicional sobre adoção, embora venham depois desses três sinais técnicos. Mantenedores podem testar se um seletor de família reduz a saída ou simplifica a marcação pública.

Medições úteis incluem tamanho dos seletores gerados, complexidade de build, custo de migração e clareza na depuração. Esses resultados importam mais do que contar caracteres em um único seletor.

A adoção por frameworks não é necessária para que o recurso tenha sucesso. Sistemas de design menores, bibliotecas de ícones e destacadores de sintaxe podem se beneficiar de forma independente.

O exemplo de classe de linguagem HTML pode se tornar especialmente informativo. Ele testa se a correspondência consciente de tokens melhora uma convenção estabelecida fora da estilização utility-first.

Os desenvolvedores não devem esperar que a proposta produza correspondência arbitrária de padrões. A discussão trata de prefixos em tokens individuais de classe, não de expressões regulares dentro do CSS.

Também devem evitar presumir que curingas de sufixo e de substring chegarão simultaneamente. Projetos de curingas mais amplos exigem justificativa e trabalho de especificação separados.

Por enquanto, o código de produção deve tratar o seletor como uma direção aceita ainda em desenvolvimento. As equipes podem avaliar convenções de nomenclatura sem publicar sintaxe não suportada.

Essa preparação ainda pode ser útil. Audite se os prefixos representam famílias intencionais, semelhanças acidentais ou uma mistura das duas coisas.

Documente quais prefixos funcionam como contratos públicos de estilização. Identifique locais onde uma classe base comunica um significado que a inferência ocultaria.

Teste as soluções alternativas atuais com atributos diante de classes reordenadas e espaços em branco inesperados. Muitas bases de código descobrirão que sua suposta correspondência por prefixo depende da posição do token.

Quando o suporte nativo chegar, a migração deve começar com namespaces restritos e bem administrados. Famílias de ícones e identificadores de linguagem gerados oferecem limites mais claros do que prefixos genéricos.

Use detecção de recursos enquanto o suporte permanecer desigual. Mantenha fallbacks até que os dados de compatibilidade mostrem que os navegadores usados pelo seu público se comportam de maneira consistente.

O Hacker News provavelmente voltará a discutir o seletor quando surgir um protótipo de navegador. Essa discussão posterior deve se concentrar em testes, comportamento e interoperabilidade, e não apenas na novidade.

A importância da proposta vem de um padrão recorrente no CSS moderno. Os navegadores estão incorporando capacidades que autores antes aproximavam com pré-processadores, código gerado ou truques frágeis de seletores.

Essa mudança é mais restrita do que aninhamento, container queries ou :has(). Seu escopo reduzido pode ser uma vantagem porque o problema e o comportamento pretendido são excepcionalmente concretos.

O trabalho restante também é concreto. Editores devem redigir a regra, autores de testes devem capturar seus casos de borda e equipes de navegadores devem implementar o mesmo resultado.

Se essas etapas se alinharem, os desenvolvedores terão uma maneira direta de segmentar múltiplas classes CSS por prefixo. Se divergirem, classes base explícitas continuarão sendo o contrato mais seguro.

A ação correta hoje é observar, não substituir imediatamente. Analise a proposta, inspecione seus namespaces de classe e identifique onde a correspondência consciente de tokens eliminaria custos reais de manutenção.

Depois, acompanhe os três sinais em ordem: texto normativo da especificação, testes abrangentes e implementações em múltiplos navegadores. Qual família de prefixos em sua própria base de código ofereceria o teste de interoperabilidade mais claro?

 
 

Comece grátis

Um assistente de IA local-first com gestão de conhecimento pessoal

Para oferecer uma experiência de IA melhor,

atualmente, o remio é compatível apenas com Windows 10+ (x64) e M-Chip Macs.

Seu parceiro de IA no trabalho
Faça mais com o remio

Planeje. Crie. Entregue.
Tudo em um só lugar.

bottom of page