Здравствуйте! Пытаюсь разобраться с БЭМ, в частности, сейчас пытаюсь понять, как правильно реализовать компоненты MDL в BEMJSON. Например, компонент tabs
(ссылка). Если ориентироваться на семантику, лучше всего, наверное, как-то так:
{
block : 'tabs',
content : [
{
elem : 'tab',
name: 'Tab 1',
content : 'Tab 1 content'
}
]
}
Но в готовой вёрстке элементов у блока больше: для названий вкладок дополнительно есть mdl-tabs__tab-bar
и mdl-tabs__tab
. Можно создать эти элементы из поля name
в шаблонизаторе, тогда получается, конечный пользователь ничего не должен знать о существовании этих элементов и их не надо добавлять в документацию. Так можно делать? Если нет, то как сделать лучше всего: неужели в BEMJSON должны быть все элементы, в т.ч. относящиеся к реализации?
У блока есть публичное API, и могут быть (не обязательно есть) приватные элементы. Это значит лишь то, что если блок используется где-то на стороне, и используется только публичное API, то в рамках мажора ничего не сломается. :-)
Но тут как повезет всегда.
Если проще сформулиовать ответ @zxqfox — да, BEMJSON должен содержать только семантически значимые сущности, а остальное должно достраиваться в шаблонах под капотом.
В качестве хорошо примера можно смотреть на реализацию bem-components.
@tadatuta Был бы полезен хороший пример доопределений. На уровне дизайна есть существенные доопределения в рамках публичного API? upd: Хотя, это все равно немного не то.
Вопрос-то про «приватные» элементы, не присутствующие в BEMJSON API. И такие есть в каждом контроле.
Ну так а я о чем? Только искусство не в том, чтобы наследовать компонент, а в том, чтобы на приватные элементы своих стилей не вешать при наследовании, и логики. ;-)