Привет!
Есть модульная система, где части фронт-энда (блоки и контейнеры) ничего не знают друг о друге, и "подружить" их очень желательно при помощи CSS (LESS) конкретной темы, не меняя HTML-разметку.
Есть "прозрачный" блок, в котором цвет текста должен меняться в зависимости от контекста, то есть от того, куда этот блок помещен. Если контейнер имеет темный фон - текст светлый, если фон контейнера светлый - текст темный.
Разметка контейнера не содержит явного указания на его фактор "темности", это тоже хочется регулировать из стилей. В идеале должно получиться так:
.block {
.color_main();
}
.block2 .title {
.color_main();
}
header, footer {
.is_dark();
}
На выходе должно дать:
block,
.block2 .title {
color:#000;
}
header .block,
footer .block,
header .block2 .title,
footer .block2 .title {
color:#FFF;
}
Можно ли решить эту задачу только на LESS? У меня получилось собрать все селекторы через &:extend - вот так:
codepen.io/dubrowsky/pen/zvKWPq (в окошке "LESS" нажать "View compiled). Теперь их надо как-то перемножить. Руки тянутся сделать на JS "на лету" (то есть пробежаться по document.styleSheets уже в браузере), но это не по феншую. Постпроцессинг городить тоже не хочется.
Есть шансы реализовать или хоть как-то приблизиться? Да, я понимаю, что есть нюансы - например, не все блоки "прозрачные", состояний "темности" больше чем два, может появиться несколько вложенных слоев с разным фоном и т.д. - но это все детали, хочется понять, есть ли в принципе решение, или надо копать в другую сторону.
Спасибо =)
UPD: Добавил метку "БЭМ", потому что мы его иногда используем. Интересно мнение БЭМ-адептов, как с таким быть? Потому что по канону вроде бы никакой "прозрачности" быть не может, блок не должен зависеть от контекста, а вместо этого надо явно указывать модификатор на всех блоках, то есть менять разметку. Или нет?