Nossa solução para turbidação de conteúdo NSFW

No fórum da Blender Artists, temos uma política de conteúdo bastante liberal, onde permitimos nudez e violência (até certo ponto). Embora a maioria dos membros esteja confortável com esse tipo de conteúdo, existem, claro, públicos e situações onde isso não é adequado (principalmente escolas e crianças). E como fazemos uso intensivo de galerias em mosaico com o plugin Topic List Preview, precisávamos de uma maneira de tornar esse tipo de conteúdo opt-in e mantê-lo fora da vista por padrão.

A solução foi mais fácil de implementar do que o esperado, e decidi compartilhá-la aqui caso alguém mais possa utilizá-la. Aviso justo: vou vincular a alguns conteúdos NSFW aqui. Vamos lá!

Já exigíamos uma tag #nsfw para qualquer post relevante e temos aplicado isso rigorosamente nos últimos meses. Nosso plugin AdSense está configurado para não exibir anúncios nessas páginas, pois isso (e já aconteceu!) nos colocaria em problemas com o Google. (Muito obrigado ao @neil por adicionar esse recurso!)

Usando algum CSS, adicionamos um desfoque e um texto de sobreposição para todas as mídias dentro desses tópicos. O desfoque será removido ao passar o mouse:

/* exibe desfoque NSFW e texto de sobreposição em qualquer mídia em tópicos #nsfw */
.tag-nsfw { 
	.topic-body .cooked img, 
	.topic-body .cooked iframe, 
	.topic-body .cooked .lazyYT-container, 
	.topic-thumbnail img {
        filter: blur(10px);	
        -webkit-transition: .3s ease-in-out;
        transition: .2s ease-in-out;
	}

	.topic-body:hover .cooked img, 
	.topic-body:hover .cooked iframe,
	.topic-body:hover .cooked .lazyYT-container, 			
	.topic-thumbnail:hover img {
        filter: blur(0);	
        -webkit-transition: .3s ease-in-out;
        transition: .2s ease-in-out;
	}

	.topic-body .cooked a.lightbox:before, 
	.topic-body .cooked iframe:before,
	.topic-thumbnail a:before {
	    z-index:2;
        padding: 5px;
        font-size:1em;
        position:absolute;

        color:#fff;
        content: '⚠️ Conteúdo maduro - Passe o mouse para mostrar';
        background: #e86800;

	}
	
	.topic-body .cooked a.lightbox:before, 
	.topic-body .cooked iframe:before {
        top: 15px;
        left: 10px;
	}

	.topic-thumbnail a:before {
        top: 65px;
        left: 20px;
	}
	
	.topic-body .cooked a.lightbox:hover:before, 
	.topic-body .cooked iframe:hover:before,
	.topic-thumbnail a:hover:before {		
	    display:none;
	}
}

Imagens e vídeos em um tópicos agora aparecem assim:

E em qualquer galeria em mosaico do TLP, temos:

Em seguida, adicionamos uma preferência que permite aos usuários desativar o desfoque para suas contas. Isso acabou sendo mais fácil de implementar do que eu pensava, usando campos personalizados.

Começamos criando um campo personalizado de caixa de seleção:

Depois, reaproveitamos algum código para adicionar a tag ‘nsfw-always-show’ à classe do corpo para esses usuários:

<!-- adiciona as preferências NSFW do usuário atual à tag body -->
<script type="text/discourse-plugin" version="0.8">

// https://meta.discourse.org/t/css-classes-for-group-membership-for-simplified-ui-mode/60838/2
if (window.jQuery) {
    window.jQuery(function ($) {
        var u = Discourse.User.current();

        // sempre mostrar NSFW
        if (u.custom_fields.user_field_2) {
            console.log('mostrar nsfw para o usuário');
            $('body').addClass('nsfw-always-show' );
        }

    });
};

</script>

Um último trecho de CSS remove o desfoque para esses usuários:

/* esconde campos personalizados do formulário de cadastro */

.login-form .user-fields {display:none;}

/* desativa o desfoque NSFW para usuários que definiram isso em suas preferências */

.nsfw-always-show .tag-nsfw {
	.topic-body .cooked img, 
	.topic-body .cooked iframe, 
	.topic-body .cooked .lazyYT-container, 
	.topic-thumbnail img {
        filter: blur(0px);	
	}
	
	.topic-body .cooked a.lightbox:before, 
	.topic-body .cooked iframe:before,
	.topic-thumbnail a:before {
	    display:none;
	    content: none;
	}
}

Um problema conhecido com essa abordagem é que ela ainda não funciona bem em dispositivos móveis, pois :hover não é suportado.

Se você quiser ver isso em ação, pode visitar nossa página da tag #nsfw, mas, bem, você pode ver algum conteúdo NSFW lá :slight_smile:

Espero que isso tenha sido útil para alguém!

55 curtidas

Além disso, no desktop, se uma imagem ocupar algum espaço na tela, é fácil passar o mouse sobre ela por engano.
Em vez de passar o mouse para remover o desfoque, que tal adicionar dinamicamente um botão “mostrar a imagem NSFW” acima ou abaixo de cada imagem NSFW?

4 curtidas

No krita-artists.org, modificamos isso ligeiramente para ser ativado ao clicar e não ao passar o mouse. No entanto, a configuração usada no perfil não funciona. Mesmo que o usuário tenha definido para mostrar conteúdo NSFW, o conteúdo permanece embaçado. Existe alguma correção para isso?

Não consigo mais editar minha OP, mas aqui está o código atualizado. Poderia compartilhar também sua solução de ‘ao clicar’?

<!-- adicionar as preferências de NSFW do usuário atual à tag body -->
<script type="text/discourse-plugin" version="0.8.7">

// https://meta.discourse.org/t/css-classes-for-group-membership-for-simplified-ui-mode/60838/2
if (window.jQuery) {
    window.jQuery(function ($) {

        let currentUser = api.getCurrentUser();
        
        if (currentUser) {
            api.container.lookup('store:main').find('user', currentUser.username).then((user) => {

                if (user.user_fields[2]) {
                    $('body').addClass('nsfw-always-show' );
                }
            });
        }
    });
};
</script>
2 curtidas

Nossa solução de onlick é uma gambiarra e acho que pode não ser ideal; apenas removemos o desfoque ao passar o mouse e adicionamos desfoque por padrão. A mensagem também foi alterada para informar que o usuário precisa clicar para ir ao post. Agora, o usuário precisa clicar para ir ao post e clicar novamente para revelar a imagem NSFW no lightbox. Isso é trabalhoso, mas evita a revelação acidental ao passar o mouse. Seria bom usar JavaScript para remover o desfoque ao clicar.

/* exibe desfoque e texto de sobreposição para NSFW em qualquer mídia nos tópicos #nsfw */
.tag-nsfw { 
.topic-thumbnail {
    overflow:hidden;
}

	.topic-body .cooked .lightbox img, 
	.topic-body .cooked iframe, 
	.topic-body .cooked .lazyYT-container, 
	.topic-thumbnail img {
    filter: blur(30px);	
    -webkit-transition: .3s ease-in-out;
    transition: .2s ease-in-out;
	}

	.topic-body .cooked a.lightbox:before, 
	.topic-body .cooked iframe:before,
	.topic-thumbnail a:before {
	    z-index:2;
    padding: 5px;
    font-size:1em;
    position:absolute;

    color:#fff;
    content: '⚠️ Conteúdo maduro - Clique para ver a imagem';
    background: #000;

	}
	
	.topic-body .cooked a.lightbox:before, 
	.topic-body .cooked iframe:before {
    top: 50%;
    left: 10px;
    right: 10px;
    text-align:center;
	}

	.topic-thumbnail a:before {
    top: 65px;
    left: 20px;
	}
	
}

/* oculta campos personalizados do formulário de cadastro */
.login-form .user-fields {display:none;}

/* desativa o desfoque NSFW para usuários que configuraram isso em suas preferências */
.nsfw-always-show .tag-nsfw {
	.topic-body .cooked img, 
	.topic-body .cooked iframe, 
	.topic-body .cooked .lazyYT-container, 
	.topic-thumbnail img {
    filter: blur(0px);	
	}
	
	.topic-body .cooked a.lightbox:before, 
	.topic-body .cooked iframe:before,
	.topic-thumbnail a:before {
	    display:none;
	    content: none;
	}
}

@bartv @Terrapop

Se alguém quiser assumir isso, é possível usar Discourse Image Filter para criar um plugin de auto nsfw blurring (auto borrão de conteúdo adulto).

4 curtidas

Olá, o que eu precisaria fazer para remover o desfoque e, em vez disso, transformar o texto em um hiperlink, já que queremos que ele leve a uma doação em um site externo?

1 curtida

Infelizmente, você não pode fazer isso apenas com CSS; será necessário adicionar seu próprio código para realizar essa ação.

2 curtidas

Basta remover as linhas filter: blur(10px); do CSS.

5 curtidas

@bartv Fiz do primeiro post um wiki, fique à vontade para atualizá-lo conforme necessário! :folded_hands:

10 curtidas