<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://www.lhsazevedo.dev/pt-BR/feed.xml" rel="self" type="application/atom+xml" /><link href="https://www.lhsazevedo.dev/pt-BR/" rel="alternate" type="text/html" /><updated>2025-03-26T21:32:36+00:00</updated><id>https://www.lhsazevedo.dev/feed.xml</id><title type="html">Lucas Azevedo</title><subtitle>A blog about my tech tweakings</subtitle><entry xml:lang="pt-BR"><title type="html">Renovando a barra de navegação e busca do PHP.net</title><link href="https://www.lhsazevedo.dev/pt-BR/refreshing-the-php-navbar-design/" rel="alternate" type="text/html" title="Renovando a barra de navegação e busca do PHP.net" /><published>2024-11-10T23:45:00+00:00</published><updated>2024-11-10T23:45:00+00:00</updated><id>https://www.lhsazevedo.dev/refreshing-the-php-navbar-design</id><content type="html" xml:base="https://www.lhsazevedo.dev/refreshing-the-php-navbar-design/"><![CDATA[<h2 id="a-necessidade-de-renovação">A necessidade de renovação</h2>
<p>Se faz um tempo que você não visita o <a href="https://www.php.net">PHP.net</a>, talvez
tenha perdido alguns ajustes estéticos recentes. A mudança mais notável foi a
nova <a href="https://www.php.net/releases/8.3">página de lançamentos</a> para o PHP 8,
lançada em novembro de 2020. Esse redesign não só modernizou a identidade visual
da marca, mas também fez um excelente trabalho em apresentar o que há de novo no
PHP. Em seguida, outras duas páginas também receberam um pouco de atenção: a
<a href="https://github.com/php/web-php/pull/459">nova seção principal da home</a> e a
<a href="https://github.com/php/web-php/pull/684">página de agradecimentos</a>.</p>

<p>Com essas melhorias, outras áreas do site que ainda não tinham sido renovadas
começaram a se destacar, e uma delas foi a barra de navegação e sua interface de
busca:</p>

<figure class="bigger-image">
    <a target="_blank" href="/pt-BR/assets/images/2024-11-07-refreshing-the-php-navbar-design/previous.png">
        <img alt="Captura de tela da navbar anterior do PHP.net" src="/assets/images/2024-11-07-refreshing-the-php-navbar-design/previous.png" />
    </a>
    <figcaption class="caption">Navbar anterior do PHP.net</figcaption>
</figure>

<p>A navbar anterior tinha três problemas principais:</p>
<ol>
  <li><strong>Contraste</strong>: O fundo azul claro tornava o texto branco difícil de ler, o
que talvez explique a escolha do logo preto do PHP.</li>
  <li><strong>UX de busca</strong>: Os resultados da busca eram exibidos em um dropdown dividido
em 5 categorias, cada uma com sua própria rolagem, criando uma experiência de
rolagem aninhada que dificultava a navegação e a localização do resultado
desejado, especialmente em dispositivos móveis.</li>
  <li><strong>Páginas ausentes</strong>: Muitas páginas do manual, especialmente da seção de
Referência de Linguagem, não estavam sendo indexadas corretamente. Por
exemplo, buscar por “types” não exibia a página de <a href="https://www.php.net/manual/en/language.types.php">Language Reference &gt;
Types</a>. Isso é crítico para
novos usuários que ainda estão aprendendo os básicos da linguágem ou não
estão familiarizados com a estrutura documentação.</li>
</ol>

<h2 id="uma-abordagem-incremental">Uma abordagem incremental</h2>
<p>Em 2022, começaram discussões na comunidade sobre um potencial redesign do
PHP.net. <a href="https://github.com/php/web-php/pull/602#issuecomment-1207166889">Um novo
design</a> foi
proposto, trazendo ideias e feedback interessantes da comunidade. Contudo,
devido ao escopo extenso e conflitos de agenda dos membros, a discussão não
avançou muito.</p>

<p>No processo de tomada de decisões em grupo, atingir um consenso fica cada vez
mais difícil conforme o escopo e o número de pessoas envolvidas aumentam. Uma
abordagem alternativa para esses casos é focar em mudanças incrementais menores
e seguir o método de consentimento ao invés de consenso para a tomada de
decisões<sup id="fnref:con1" role="doc-noteref"><a href="#fn:con1" class="footnote" rel="footnote">1</a></sup><sup id="fnref:con2" role="doc-noteref"><a href="#fn:con2" class="footnote" rel="footnote">2</a></sup>.</p>

<p>Seguindo esses princípios, concluí que começar com um componente menor seria uma
ideia melhor. Escolhi um de <a href="https://github.com/php/web-php/pull/602#issuecomment-1207166889">uma iteração
minha</a> na
proposta de redesign completo que pareceu ter sido bem recebido pela comunidade:
a barra de navegação.</p>

<figure class="bigger-image">
    <a target="_blank" href="/pt-BR/assets/images/2024-11-07-refreshing-the-php-navbar-design/pt-BR/new.png">
        <img alt="Novo design da navbar" src="/assets/images/2024-11-07-refreshing-the-php-navbar-design/pt-BR/new.png" />
    </a>
    <figcaption class="caption">
        Novo design da navbar (clique para ampliar)
    </figcaption>
</figure>

<p>Desde o início, ficou claro que redesenhar a navbar sem abordar a busca criaria
uma experiência mista que poderia ser percebida como pior que a versão anterior.
Para isso, me inspirei na interface do DocSearch da Algolia, amplamente usada em
sites de documentação atualmente. Aqui está o resultado:</p>

<figure class="bigger-image">
    <a target="_blank" href="/pt-BR/assets/images/2024-11-07-refreshing-the-php-navbar-design/pt-BR/new-search.png">
        <img alt="Novo diálogo de busca" src="/assets/images/2024-11-07-refreshing-the-php-navbar-design/pt-BR/new-search.png" />
    </a>
    <figcaption class="caption">
        Novo design do diálogo de busca
    </figcaption>
</figure>

<h2 id="quitando-a-dívida-técnica">Quitando a dívida técnica</h2>
<p>O código front-end do PHP.net acumulou uma certa dívida técnica ao longo dos
anos. As folhas de estilo CSS são baseadas no Bootstrap 2 e seu sistema de
responsivo baseado em floats (lembra da era <code class="language-plaintext highlighter-rouge">.clearfix</code>?), e fazem uso intenso
de regras aninhadas, o que complica a manutenção e a reutilização. No lado do
JavaScript, a interface de busca anterior era um plugin JQuery customizado que
usava o <a href="https://twitter.github.io/typeahead.js/">typeahead.js</a> do Twitter para
autocomplete e o <a href="https://twitter.github.io/hogan.js/">Hogan.js</a> para templates,
ambos descontinuados.</p>

<p>Isso se mostrou uma oportunidade ideal para remover essas dependências da
navbar, tornando-a mais fácil de manter e pronta para o futuro. O markup foi
reescrito do zero, usando o componente de navegação offcanvas do Bootstrap 5
como referência. Os estilos agora utilizam recursos modernos de CSS, como
flexbox e variáveis, e seguem a metodologia Block Element Modifier (BEM) adotada
em contribuições anteriores para evitar problemas com conflitos e
especificidade.</p>

<p>A busca existente foi implementada no lado do cliente usando um índice JSON das
páginas do manual. Embora essa talvez não seja a melhor abordagem para um site
grande como o PHP.net, substituir por uma implementação no servidor estaria além
do escopo desta proposta. Em vez disso, foquei em remover a dependência do
JQuery e corrigir os problemas mais críticos<sup id="fnref:3" role="doc-noteref"><a href="#fn:3" class="footnote" rel="footnote">3</a></sup><sup id="fnref:4" role="doc-noteref"><a href="#fn:4" class="footnote" rel="footnote">4</a></sup>, o que resultou em
melhorias significativas no curto prazo com esforço relativamente mínimo. A nova
interface foi implementada usando JavaScript puro, com acessibilidade e melhoria
progressiva em mente, como veremos nas próximas seções.</p>

<h2 id="melhoria-progressiva">Melhoria progressiva</h2>
<p>Este foi um requisito bem interessante que eu não havia previsto: tanto a
navegação mobile quanto a busca devem funcionar mesmo que o JavaScript esteja
desativado ou falhe ao carregar. Admito que isso não era algo em que eu tinha
pensado antes, e embora alguém possa pensar que isso é raro, na verdade, não é.
Diferente do HTML, o JavaScript não é tolerante a falhas, e erros ou problemas
de rede podem impactar funções críticas que dependem exclusivamente dele.</p>

<p>Surpreendentemente, muitos sites de grandes linguagens de programação exigem
JavaScript para funções essenciais como navegação mobile e busca. No momento,
sites como <a href="https://kotlinlang.org/docs/home.html">Kotlin</a>,
<a href="https://doc.rust-lang.org/book/">Rust</a>,
<a href="https://docs.swift.org/swift-book/documentation/the-swift-programming-language/">Swift</a>,
<a href="developer.mozilla.org">MDN</a> e <a href="https://dart.dev/">Dart</a> exigem JS para uma ou
ambas as funções. Essa dependência também é comum em muitos sites com DocSearch
da Algolia e sites usando o tema padrão do MkDocs.</p>

<p>Uma solução simples para esse problema é usar melhoria progressiva. Essa
estratégia recomenda o uso de tecnologias tolerantes a falhas como HTML e CSS
para fornecer uma implementação base, e só então usar JavaScript para aprimorar
a experiência. Essa abordagem garante acessibilidade em vários dispositivos e
condições de rede, enquanto ainda oferece uma experiência mais interativa e
dinâmica quando possível. O site <a href="https://gov.uk/">GOV.UK</a> é um excelente
exemplo dessa prática e serviu como referência para nossa implementação.</p>

<h2 id="acessibilidade">Acessibilidade</h2>
<p>A acessibilidade foi outra área em que eu queria me aprofundar, e essa
contribuição foi uma ótima oportunidade para isso. Implementar os atributos e
roles ARIA corretamente, garantir a indicação e o gerenciamento de foco, e
tornar os novos recursos acessíveis pelo teclado definitivamente foram tarefas
divertidas. Recentemente, tive a chance de experimentar o Playwright para
testes, e foi reconfortante descobrir que o código já tinha alguns testes de
regressão visual. Assim, novos testes de ponta a ponta foram adicionados, usando
a ênfase do Playwright em HTML semântico para garantir que a nova interface
permaneça acessível.</p>

<h2 id="conclusão">Conclusão</h2>
<p>Redesenhar e implementar a navbar e a interface de busca do PHP.net foi uma
experiência interessante e gratificante. Com a valiosa revisão e feedback dos
mantenedores ativos, consegui aprimorar o design, melhorar a experiência do
usuário, lidar com a dívida técnica e aprimorar a acessibilidade, mas ainda
mantendo-a familiar para os visitantes.</p>

<p>Fico feliz em compartilhar que o PR que eu propus e implementei foi aceito, e a
nova navbar está no ar em <a href="https://www.php.net">PHP.net</a>. Mas ainda há muito a
melhorado, especialmente na seção de documentação. Se você está procurando uma
forma de contribuir para o open source e/ou melhorar suas habilidades de design
e desenvolvimento, essa é uma ótima oportunidade. Apenas lembre-se de manter o
escopo pequeno e focado, discutir suas ideias com a comunidade antes de iniciar
o trabalho, e estar aberto a feedback e sugestões enquanto foca os esforços em
integrar as objeções.</p>

<h2 id="notas">Notas</h2>

<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:con1" role="doc-endnote">
      <p><a href="https://www.hoop.app/blog/choose-consent-over-consensus-for-better-decision-making">Choose Consent Over Consensus For Better Decision Making</a> <a href="#fnref:con1" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:con2" role="doc-endnote">
      <p><a href="https://www.sociocracyforall.org/pt-br/tomada-de-decisao-por-consentimento/">Tomada de decisão por consentimento</a> <a href="#fnref:con2" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:3" role="doc-endnote">
      <p><a href="https://github.com/php/phd/pull/154">PR: Melhora geração de índice de busca para PHP.net</a> <a href="#fnref:3" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
    <li id="fn:4" role="doc-endnote">
      <p><a href="https://github.com/php/phd/pull/160">PR: Corrige índice para páginas sem livro pai</a> <a href="#fnref:4" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>lhs_azevedo</name></author><category term="blog" /><category term="open source" /><category term="ui/ux" /><category term="acessibilidade" /><category term="melhoria progressiva" /><summary type="html"><![CDATA[O processo de design e implementação da nova barra de navegação e interface de busca do PHP.net.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://www.lhsazevedo.dev/assets/images/php-navbar.png" /><media:content medium="image" url="https://www.lhsazevedo.dev/assets/images/php-navbar.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>