Спасибо, @Lhc_fl, за быстрое и качественное решение.
Наш кейс основан на описании запроса для маркетплейса:
Идея была вдохновлена Our solution for blurring NSFW content, мы просто начали с инверсии логики и нуждались в переключателе для нашего сообщества, чтобы размывать и размывать медиа-контент.
Просто добавьте Пользовательское поле в виде флажка и следуйте нашему подходу ниже.
Мы используем Sidebar User Field Toggle с дополнительным пользовательским компонентом следующим образом:
- Создайте новый компонент темы прямо в вашей панели администратора
/admin/customize/ → Components → Install → Create new (component) - Добавьте CSS:
CSS
/* отображение размытия NSFW и текста оверлея на любом медиа в темах #nswf */
.nsfw-hide {
.topic-body .cooked img:not(.emoji):not(.avatar),
.topic-body .cooked iframe,
.topic-body .cooked .lazyYT-container,
.topic-body .cooked .video-container,
.topic-thumbnail img:not(.emoji) {
filter: blur(10px);
-webkit-transition: .3s ease-in-out;
transition: .2s ease-in-out;
}
.topic-body:hover .cooked img:not(.emoji),
.topic-body:hover .cooked iframe,
.topic-body:hover .cooked .lazyYT-container,
.topic-body:hover .cooked .video-container,
.topic-thumbnail:hover img:not(.emoji) {
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: '👀 Наведите, чтобы показать';
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,
.topic-body .cooked .video-container:hover:before {
display:none;
}
}
- Добавьте JS (Head):
JS Code
<script type="text/discourse-plugin" version="0.8.7">
const { userPath } = require("discourse/lib/url");
const { ajax } = require("discourse/lib/ajax");
const you = api.getCurrentUser();
if (you) {
ajax(userPath(`${you.username_lower}.json`)).then((res) => {
api
._lookupContainer("model:site")
.appEvents.trigger("sidebar_user_fields_toggled", {
user_fields: res.user.user_fields,
});
});
}
// https://meta.discourse.org/t/css-classes-for-group-membership-for-simplified-ui-mode/60838/2
api.onAppEvent("sidebar_user_fields_toggled", (status) => {
if (window.jQuery) {
window.jQuery(function ($) {
if (status.user_fields[2] === "true") { // Или другое значение
$('body').addClass('nsfw-hide' );
} else {
$('body').removeClass('nsfw-hide' );
}
});
}
});
</script>
- Просто настройте кнопки компонента переключателя так, как вам нужно. Мы используем ID пользовательского поля в качестве ссылки.
P.S. Возможно, мы могли бы ввести тот же код в сам компонент переключателя, но я просто не стал проверять это, и зачем трогать идеально работающий код?
Компонент @Lhc_fl также отлично работает с типом навигации Dropdown.