Nuestra solución para difuminar contenido NSFW

En el foro de Blender Artists tenemos una política de contenido bastante liberal que permite la desnudez y la violencia (hasta cierto punto). Aunque la mayoría de los miembros están bien con este tipo de contenido, por supuesto, existen audiencias y situaciones donde esto no es adecuado (principalmente para nosotros, escuelas y niños). Y dado que hacemos un uso intensivo de galerías en mosaico con el plugin de vista previa de lista de temas, necesitábamos una forma de hacer que este tipo de contenido fuera optativo y que no apareciera frente a tus ojos de forma predeterminada.

La solución fue más fácil de implementar de lo esperado y decidí compartirla aquí por si alguien más puede aprovecharla. Advertencia justa: enlazaré a contenido NSFW aquí. ¡Vamos!

Ya requeríamos una etiqueta #nsfw para cualquier publicación relevante y hemos estado aplicándola estrictamente durante los últimos meses. Nuestro plugin de AdSense está configurado para no mostrar anuncios en estas páginas, ya que eso (¡y lo ha hecho!) nos metería en problemas con Google. (¡Muchas gracias a @neil por agregar esta función!)

Usando algo de CSS, añadimos un desenfoque y un texto superpuesto para todos los medios dentro de dichos temas. El desenfoque se eliminará al pasar el cursor:

/* mostrar desenfoque NSFW y texto superpuesto en cualquier medio en temas #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: '⚠️ Contenido maduro - Pasa el cursor 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;
	}
}

Las imágenes y videos en un tema ahora se ven así:

Y en cualquier galería en mosaico de TLP, tenemos:

A continuación, añadimos una preferencia que permite a los usuarios desactivar el desenfoque para su cuenta. Resultó ser más fácil de implementar de lo que pensaba usando campos personalizados.

Comenzamos creando un campo personalizado de casilla de verificación:

Luego, reaprovechamos algo de código para añadir la etiqueta ‘nsfw-always-show’ a la clase del cuerpo para estos usuarios:

<!-- agregar las preferencias NSFW del usuario actual a la etiqueta 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();

        // mostrar siempre NSFW
        if (u.custom_fields.user_field_2) {
            console.log('mostrar nsfw para el usuario');
            $('body').addClass('nsfw-always-show' );
        }

    });
};

</script>

Un último fragmento de CSS elimina el desenfoque para estos usuarios:

/* ocultar campos personalizados del formulario de registro */

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

/* desactivar el desenfoque NSFW para usuarios que lo establecieron en sus preferencias */

.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;
	}
}

Un problema conocido con este enfoque es que aún no funciona muy bien en dispositivos móviles, ya que :hover no es compatible.

Si quieres ver esto en acción, puedes visitar nuestra página de etiqueta #nsfw, pero, bueno, podrías ver algo de contenido nsfw allí :slight_smile:

Espero que esto haya sido útil para alguien!

55 Me gusta

Also, on desktop, if an image take some space on the screen, you can easily hover it by mistake.
Instead of hovering to unblur, what about dynamically add a button “show the nsfw image” on top or under each nsfw image ?

4 Me gusta

En krita-artists.org lo hemos modificado ligeramente para que sea al hacer clic y no al pasar el cursor. Sin embargo, la configuración utilizada en el perfil no funciona. Incluso si el usuario ha configurado para mostrar contenido NSFW, el contenido aparece borroso. ¿Existe alguna solución para esto?

Ya no puedo editar mi OP, pero aquí está el código actualizado. ¿Te importaría compartir también tu solución de ‘al hacer clic’?

<!-- agregar las preferencias NSFW del usuario actual a la etiqueta 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 Me gusta

Nuestra solución de ‘onlick’ es un parche y creo que puede no ser ideal; simplemente eliminamos el desenfoque al pasar el cursor y lo agregamos de forma predeterminada. También cambiamos el mensaje para indicar que el usuario debe hacer clic para ir al tema. Ahora el usuario debe hacer clic para ir al tema y volver a hacer clic para revelar la imagen NSFW en el visor emergente. Esto es engorroso, pero evita la aparición involuntaria al pasar el cursor. Sería bueno usar JavaScript para eliminar el desenfoque al hacer clic.

/* mostrar desenfoque NSFW y texto superpuesto en cualquier medio en los temas #nswf */
.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: '⚠️ Contenido maduro - Haz clic para ver la imagen';
    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;
	}
	
}

/* ocultar campos personalizados del formulario de registro */
.login-form .user-fields {display:none;}

/* desactivar el desenfoque NSFW para usuarios que lo configuraron en sus preferencias */
.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

Si alguien quiere encargarse de esto, es posible utilizar Discourse Image Filter para crear un plugin de desenfoque automático de contenido NSFW.

4 Me gusta

Hola, ¿qué tendría que hacer para quitar el desenfoque y hacer que el texto sea un hipervínculo, ya que queremos que enlace a una donación externa?

1 me gusta

Me temo que no puedes hacer eso solo con CSS; tendrás que agregar tu propio código para lograrlo.

2 Me gusta

Simplemente elimina las líneas filter: blur(10px); del CSS.

5 Me gusta

@bartv He convertido el primer post en wiki, ¡siéntete libre de actualizarlo según sea necesario! :folded_hands:

10 Me gusta