Evitar que a barra de Última Visita bagunce as cores

Temos cores alternadas configuradas para todas as nossas postagens (e pequenas ações) via nth-child, o que se parece com isto:

No entanto, a coisa nova com a versão 2.8 “última visita” conta como uma pequena ação, e assim acaba sendo pega nessas cores alternadas de postagem:

O que mais gostaríamos é ter algo como o seguinte:

Onde a barra “última visita” não conte como um filho para fins de nth-child ao determinar a cor de fundo.

Minha primeira ideia foi usar JavaScript para simplesmente adicionar uma nova div após quaisquer barras de última visita, o que de fato funciona como desejado:

via

<script type="text/discourse-plugin" version="0.8">
    var addedElement;
    
    api.onPageChange(() =>{
        addedElement = false;
        //window.onload = lastPostFix();
    });

    async function lastPostFix()
    {
        var elements = document.getElementsByClassName('topic-post-visited');
        
        var newElement = document.createElement("div");
        newElement.classList.add('small-action');
        
        while(elements.length > 0 && !addedElement)
        {
            elements[0].parentNode.insertBefore(newElement, elements[0].nextSibling);
            addedElement = true;
        }
    }
</script>

No entanto, ao rolar para cima ou para baixo, há um monte de problemas que isso parece causar, desde postagens que simplesmente se recusam a carregar até espaços em branco enormes ou o que quer que esteja acontecendo na terceira imagem:



Alguém tem uma ideia melhor de como podemos conseguir isso?

Tente algo assim.

.small-action.topic-post-visited {
  height: 0;
}

Embora isso o torne mais fino, esse não é realmente o problema aqui - o exemplo que dei como nosso ideal foi feito com a edição do CSS, o que é basicamente trivial - o problema é que a coloração de fundo de nossas postagens é feita por meio de um seletor nth-child e o elemento .small-action.topic-post-visited conta como um filho e, portanto, alterna o nth-child quando não queremos que ele o faça.

Visualmente, isso daria isto:

Onde a cor clara é usada como fundo para o último elemento de visita, fazendo com que a postagem diretamente acima e abaixo sejam ambas de nossa cor mais escura.

Contraste com nosso ideal, onde a alternância de cores ignora este novo elemento:

Assim, também obtemos um comportamento divertido quando você rola o suficiente para que a barra seja descarregada - as postagens piscam em cores alternadamente enquanto o site decide novamente o que deve ser colorido como o quê quando a barra de “última visita” desaparece.

Isso é incrivelmente indesejável e, considerando que as cores alternadas valem mais para nós do que o indicador de última visita, gostaríamos muito de alguma forma de lidar com isso adequadamente ou simplesmente desativar o recurso completamente.

Ok, então, supondo pela falta de respostas que isso é impossível

Como desativamos o recurso completamente?

Não vale a pena ter todas as nossas postagens piscando em cores para uma barra temporária

Sim, isso não funcionará com :nth-child ou :nth-of-type. Eles apenas contam os elementos filhos, portanto, não são específicos de classe e não há como filtrar por classe.

O que você realmente precisará é de :nth-child(2n of .topic-post), mas isso ainda é suportado apenas pelo Safari.


Mas você pode tentar algo assim.

Cabeçalho
Isso adicionará esta classe .every-second a cada segundo post, excluindo pequenas ações, então apenas posts do tópico. Então você pode facilmente direcioná-lo com CSS.

<script type="0.8 discourse-plugin">
  api.addPostClassesCallback((attrs) => {
    const postNum = attrs.post_number;
    if (postNum % 2 === 0) {
      return ['every-second']
    }
  });
</script>

CSS

.topic-post {
  background: var(--primary-very-low);
  &.every-second {
    background: var(--primary-low);
  }
}

.small-action.topic-post-visited {
  height: 0;
}

Linha de postagem de tópico visitada


Rolagem

1 curtida

Não é possível usar um seletor mais específico aqui para permanecer em uma solução CSS pura?

Você pode compartilhar um trecho da sua regra CSS atual?

1 curtida

É possível conseguir o mesmo efeito usando apenas CSS, mas é meio gambiarra e só funcionará no fluxo de posts. Não funcionará na lista de tópicos. Será necessário Javascript, já que apenas o Safary seleciona a sintaxe :nth-child( de <seletor>) e, pelo que pude apurar, não há atributos que possam ser direcionados para aplicar o efeito.

@orangeandblack5, você tem que direcionar o elemento article dentro dos posts. Note que o atributo id segue o padrão id=post_N onde N é o número do post no fluxo.

Então você pode direcionar apenas os pares com algo como o CSS abaixo:

.topic-post {
    article[id$="0"], article[id$="2"], article[id$="4"], article[id$="6"], article[id$="8"] {
        background-color: peachpuff;
    }
}

Posso tentar, mas incluindo pequenas ações esta semana - esperava uma solução puramente em CSS, se possível, mas também não tivemos sorte com isso.

Fato interessante: nem todas as pequenas ações são criadas igualmente!

Decidi tentar a ideia de CSS puro e, infelizmente, embora algumas pequenas ações (como bloquear, desbloquear ou fixar um tópico) contem como uma postagem completa e recebam seu próprio ID exclusivo que poderíamos usar para colorir, nem todas o fazem.

Observe que isso também afeta a correção de JS dada por @Don - verei se consigo encontrar uma maneira de contornar isso, mas meu conhecimento de JS é muito mais rudimentar do que o de CSS.