Войти с помощью github

К примеру, если пишу mix : [{block : 'buttons', elem : 'smallButton', mods : {red: true}}] то подмешиваются 2 класса buttons__smallButton и buttons__smallButton_red А нужно чтобы подмешивался только buttons__smallButton_red. Как это сделать?

Создал слайдер (блок slider) с поддержкой входных параметров (this.params) и слайд-шоу. При установке двух и более экземпляров на страницу, происходит (по-видимому) смешивание их параметров, или их переопределение. Перелистывание слайдов всегда производится с учетом ширины (width) и скорости перелистывания (duration) последнего экземпляра. То же касается величины задержки (delay) при слайд-шоу.

Помогите, пожалуйста, разобраться, в чем таится ошибка.

Ссылки:

Как прописать element.style {} к блоку?

Всем привет. Подскажите, пожалуйста, как переопределить стили блока select через модификатор или киньте пример, в документации ничего не нашел, кроме общего описания, что это возможно https://ru.bem.info/method/key-concepts/#Переопределение-блока .

мне нужно переопределить два свойства: Первое:

.menu-item_theme_islands.menu-item_checked {
/* background: url("data:image/svg+xml,%3Csvg xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%…h d%3D%22M13.5.5l-8 12L1.7 8l-1 1.6L5.6    15l9.1-13.4z%22%2F%3E%3C%2Fsvg%3E") 0 50% no-repeat; */
}

заменить на

 .menu-item_theme_islands.menu-item_checked {
   background-color: #fc0;
}

Второе:

.menu_size_m .menu__group-title~.menu-item_theme_islands, .menu_size_m[class*=menu_mode] .menu-item_theme_islands {
padding: 0 30px;
}

заменить на

.menu_size_m .menu__group-title~.menu-item_theme_islands, .menu_size_m[class*=menu_mode] .menu-item_theme_islands {
padding: 0;
}

В итоге, вместо http://i.imgur.com/HYTWPsN.jpg должно получиться так: http://i.imgur.com/hxGDcse.jpg

Что я сделал:

  1. Добавил модификатор к блоку select ( without : 'tick' )

    mods : { mode : 'radio-check', theme : 'islands', size : 'm', without : 'tick' },

  2. В папке common.blocks/select/_without создал файл select_without_tick.deps.js ({
          mustDeps : { block: 'menu-item', mods: { without: 'tick' } }
    
    })
  3. В папке common.blocks/menu-item/_without создал файл menu-item_without_tick.styl

    .menu-item_without_tick {
        padding: 0;
    

    &.menu-item_checked {

            background: none;
    background-color: #fc0;
    }
    }
    

Где у меня ошибка?

Вопрос по bem-mvc. Можно ли сделать подписку на событие внутри модели. Хочу при фиксации модели вызывать еще один метод. И вдогонку еще вопрос. Почему в bem-mvc нельзя переопределять базовые методы модели, например fix()?

Есть такой код:

{
    block: 'donut-pie',
    tag: 'svg',
    attrs: {
        width: '45px',
        height: '45px'
    }
}

Все классно отрисовывается, а в консоль кидает: Uncaught TypeError: domNode.className.match is not a function.

Если сделать так:

{
    block: 'donut-pie',
    content: {
        tag: 'svg',
        attrs: {
            width: '45px',
            height: '45px'
        }
    }
}

Так ошибки нет. Почему?

Всем привет! Какой файл нужно править, чтобы при выботе в блоке select какого-то значения, в кнопку попадало не значение text блока select, а icon? Второе, нужно избавиться от __tick, и просто выделять цветом.

Допустим есть функция someFunc которая принимает строку, и возврщает модифицированную строку, как мне ее внеднрить в свои шаблоны? Если можно отдельным блоком, то как лучше это сделать? Или же если дбавлять метод к контексту (this.someFunc) то где лучше его объявить?

Есть модуль который провайдит скрипт (по аналогии с jQuery), Скрипт режется на некоторых клиентах (adblock). В итоге модуль не провайдится. А так как он прописан в зависимостях модуля унаследованного от i-bem__dom то блоки с DOM представлением тоже не инициализируются. Можно ли как-то учесть, что модуль может не зарезолвится, не мешая работе других блоков?

Введение

На прошлых вебинарах с Димой Белицким мы сверстали простую страницу следуя БЭМ-методологии: написали HTML и CSS, немного декларативного JavaScript, а также настроили сборку с помощью gulp.

В этом вебинаре мы получим BEMJSON имеющихся страниц, напишем простые BEMHTML-шаблоны и посмотрим на некоторые интересные возможности BEMHTML.

Итак, немного про декларативные шаблоны.

Все привыкли к декларативной природе CSS, поэтому удобно провести аналогию.

Допустим, у нас есть список:

<ul class="menu">
  <li class="menu__item">
    Привет
  <li>
  <li class="menu__item">
    BEM!
  <li>
</ul>

Чтобы задать определенный внешний вид всем элементам списка можно написать CSS:

.menu__item {
    background: red;
}

А если же хочется изменить связку ul + li, например, на nav + a? Что если это можно было бы сделать по аналогии с CSS, написав соответствующий «селектор» и просто задать другое значение свойству tag?

Так это выглядит в BEMHTML:

block('menu')(
  tag()('nav')
)

block('menu').elem('item')(
  tag()('a')
)

Чтобы иметь возможность таким образом пребразовывать HTML необходима особая декларация страницы.

BEMJSON

BEMJSON — это описание структуры страницы в терминах БЭМ на JavaScript с зарезервированными полями. Указанный ранее список в BEMJSON описывается так:

({
  block: 'menu',
  tag: 'ul',
  content: [
    {
      elem: 'item',
      tag: 'li',
      content: 'Привет'
    },
    {
      elem: 'item',
      tag: 'li',
      content: 'BEM!'
    }
  ]
})

BEMJSON компилирутся в HTML.

Избавиться от копипасты tag: 'li' поможет BEMHTML-шаблон.

block('menu')(
  tag()('ul')
)

block('menu').elem('item')(
  tag()('li')
)

BEMHTML-шаблон накладывается на BEMJSON по аналогии с тем, как CSS накладывается на DOM-дерево. На выходе — получаем HTML.

BEMJSON для наших страниц

Код — 01858d

Если есть HTML, написанный по БЭМ, то BEMJSON можно получить автоматически с помощью пакета html2bemjson

npm install html2bemjson

Сборка

Код — eef725

Далее нужно дотюнить сборку:

  • gulp научился собирать зависимости по BEMJSON, а не HTML
  • добавился таск для компиляции HTML по BEMJSON с использованием BEMHTML-шаблонов

    Вычисления во время компиляции в BEMJSON

Код — 51ec21

BEMJSON представляет собой plain JavaScript, поэтому позволяет любые вычисления во время компиляции — то, чего не достает HTML.

Например,

({
  block: 'menu',
  // построим BEMJSON списка динамически из массива текстов элементов
  content: [
    'Привет',
    'BEM!'
  ].map(function(text) {
    return {
      elem: 'item',
      content: text
    };
  })
})
({
  block: 'menu',
  // определим массив текстов динамически,
  // который будет разным при каждой генерации итогового HTML
  content: (function() {
    return Math.random() > 0.5 ? ['Привет'] : ['Привет', 'BEM!'];
  }()).map(function(text) {
    return {
      elem: 'item',
      content: text
    };
  })
})

Напишем простые BEMHTML-шаблоны

Код — 17d9a6

Упростим полученный автоматической конвертацией BEMJSON:

  • вынесем всю HTML-обвязку страницы в блок page
  • упростим представление меню в BEMJSON, сгенерировав BEMJSON самого списка элементов в шаблоне
  • напишем простой шаблон для ссылки

    Специальные возможности BEMHTML

Код — bad312

Шаблонизатор BEMHTML имеет некоторые интересные возможности:

Переопределение в зависимости от входных данных

Например, блок link должен быть представлен в HTML span-ом, а не ссылкой, если в BEMJSON не было поля url.

Переопределение на уровне переопределения

Например, менюшка на странице с Поттером должна быть в HTML представлена тегом ol, а на всех других страницах — ul. Для этого достаточно определить блок меню на уровне potter.blocks. После сборки всех шаблонов в один файл получим:

// common.blocks
block('menu')(...)

// potter.blocks
block('menu')(...)

По аналогии с CSS, последнее «правило» перебивает предыдущее.

Допустим, я хочу чтобы шаблоны компилились по технологии require('enb-bemxjst/techs/bemhtml'), а bemjson в html по технологии require('enb-bh/techs/bemjson-to-html'). То есть шаблоны я прогоняю через BEMHTML, а bemjson через BH. Как это сделать, чтобы не было ошибок при сборке?

Как это прописать в bemjson?

<!--[if lte IE 8]>

<![endif]-->

Как связать элемент формы radio с подписью через идентификатор. Пробовал устанавливать id, for в подписи не появился.

<span class="checkbox__text" role="presentation">TEXT</span>

Есть БЭМ-проект, который постоянно дополняется новыми страницами. Стилистика дизайна выдерживается более-менее, т. к. есть некоторое количество стандартизованных решений (например, по виду заголовков, ссылок, списков и т.п.). Доступ к собранным на одной странице стандартизованным блокам у дизайнера есть. Но при создании нового макета каждый раз выскакивают отличия от стандарта (например, различается типографика (line-height, font-size), несмотря на то, что есть .content__title_size_m, в кот. указаны line-height, font-size и т.п.).

Для примера возьмём .content__title. Я вижу только три способа для верстки новых страниц, получаемых от дизайнера:

  1. доопределение этого блока модификаторами под КОНКРЕТНУЮ страницу ( МИНУС: разрастание блока в принципе ненужным функционалом)
  2. создание блоков под КОНКРЕТНУЮ страницу (например, .start-business__title) и миксование их к .content__title ( МИНУС: разрастание количества дополнительных блоков в проекте)
  3. доопределение стандартных блоков модификаторами и жесткое указание дизайнеру использовать только эти варианты на ВСЕХ новых страницах, чтобы избежать предыдущих двух пунктов.

Очень не хочется разрастания проекта, которое происходит в 1-ом и 2-ом вариантах. С подобной проблемой, думаю, многие сталкивались. Хотелось бы услышать, как другие справляются или что делают в подобных ситуациях.

Как я понимаю за компиляцию bemjson в html отвечает эта команда https://github.com/bem/project-stub/blob/bem-core/.enb/make.js#L62 А в технологии bemjson-to-html такой опции нет и все компилится в одну строку

Пользуюсь сборщиком enb, в enb-make определил две сборки, production и development, вот так:

config.mode("production", function () {...

в зависимости от режима определяю уровень переопределения env:

config.mode("production", function () {
    config.node("bundles/proj", function (nodeConfig) {
        nodeConfig.addTechs([
            [ require("enb-bem-techs/techs/levels"), {levels: getLevels([{"path": "blocks/env/production", "check": false}])} ],...

Функция getLevels:

function getLevels(levels) {
    levels = levels || [];
    return levels.concat[
        {"path": "libs/bem-core/common.blocks", "check": false},
        {"path": "lib.modules", "check": false},
        {"path": "blocks/translation.blocks", "check": false},
        {"path": "blocks/common.blocks", "check": true},
    ].map(function (l) { return config.resolvePath(l); });
}

Для development естественно путь указан к папке development

В проекте все так лежит: blocks/env/production/env.js и blocks/env/development/env.js, Содержимое файлов: modules.define('env', [], provide => { provide('development') }); (или production, в зависимости от файла).

В компоненте, для которого есть разница между development и production режимами подключаю env, и уже от него пляшу

При сборке YENV=production enb-make -n сборщик все-равно подключает /development/env.js, мало того, удаление всей папки env/development приводит к тому что в продакшн моде все-равно подключается development файл. С другой стороны, после того как файл env/development/env.js оказывается недоступным во время development сборки (enb make -n) сборщик ругается на отсутствие файла/папки. В чем проблема, и как еще можно из компонента получить доступ к переменной YENV?

А кто-нибудь знает, как отключить лишний js код во внешнем файле? Вроде таких технологий (browser.js) не использую.

{
    elem: 'link',
    mix: { block: 'link' }
}

Знаю только один способ, который в моем случае не подходит, это просто поменять местами

{
    block: 'link',
    mix: { block: this.block, elem: 'link'}
}

Есть блок block с модификатором type у которога два значения val1 val2 Как лучше написать шаблон элемента блока block__info, чтобы в зависимости от модификатора блока, он выводил разный контент

Как я понял такие конструкции работать не будут

block('block`)(
    elem('info')(
        mod('type', 'val1')( ... ),
        mod('type', 'val1')( ... )
    )
)
block('block`)(
    mod('type','val1').elem('info')( ... ),
    mod('type','val2').elem('info')( ... ),
)

есть файл .browser.js в папке с элементом

modules.define('buttons__button', ['i-bem__dom'], function(provide, BEMDOM) {
provide(BEMDOM.decl(this.name, {
    onSetMod: {
        js: {
            inited: function() {
                this.bindTo('click', function() { alert('hello'); });
            }
        }
    }
}));

})

js у элемента стоит в true, но событие не работает, что неправильно?

Здравствуйте, скажите а префиксы b-, i-, c- всё еще используются? Или это уже устарело? Просто в туториалах на bem.info про префиксы ничего не сказано вроде. Если они уже не используются, то как выделять классы предназначенные только для js?

Ребята, подскажите есть ли какие-то готовые инструменты для динамического создания CSS спрайтов (CSS sprites) внутри вашей технологии? Что лучше взять https://www.npmjs.com/package/node-sprite https://npmjs.org/package/spritesmith https://npmjs.org/package/stylus-sprite ?

Вот тут ожидается ошибка в случае если нет файла https://github.com/enb-make/enb/blob/master/techs/file-provider.js#L46

А что, если добавить проверку на параметр content и если оный имеется, то создать файл ну как-то так:

build: function () {
        var promise;
        var target;
        var targetPath;
        var _this = this;
        promise = Vow.promise();
        target = this.node.unmaskTargetName(this._target);
        targetPath = this.node.resolvePath(target);
        fs.exists(targetPath, function (exists) {
            if (exists) {
                _this.node.resolveTarget(target);
            } else {
                if (_this._content === undefined) {
                    _this.node.rejectTarget(target, new Error('File not found: ' + targetPath));
                } else {
                    fs.writeFile(targetPath, _this._content, _this._options || {}, function (error) {
                        if (error) {
                            _this.node.rejectTarget(target, error);
                            return;
                        }
                        _this.node.resolveTarget(target);
                    });
                }
            }
            return promise.fulfill();
        });
        return promise;
    },

Чего скажете? Полезно будет али нет?

Допутим у кнопки есть модификатор type со значениями primary clear Что написать в .deps.js, чтобы подключить блок со всеми значениями модификатора type, просто перечислить?

Всем привет! Вчера я объединил между собой две ветки, ветку i18n и ветку suggest, так как нужны обе. Все блоки отображаются корректно, все работает, кроме одного. У меня возникла проблема с блоком dropdown (switcher : 'button',) вложенного в блок control-group, а именно, почему-то не прилетает свойство last-child. Если заменяю dropdown на обычную кнопку, все ок. Вот скрины: http://i.imgur.com/DAMqGDb.png http://i.imgur.com/4r0bQ5g.png

При установке модулей Ноды выдает ошибку с питоном ( http://prntscr.com/9qfkyt ). понятно что дело уже пахнет жареным, но я все равно попробовал собрать проект node_modules/.bin/bem server при переходе на страницу http://localhost:8080/desktop.pages/index/index.html получаю http://prntscr.com/9qfm9g . может кто сталкивался с проблемами запуска данной библиотеки под Windows? (лог ноды - https://yadi.sk/i/RGhkB8whn3LDz) Project-stub нормально запускается и показывает демонстрационную страницу Версии софта $ node -v v0.12.2 $ npm -v 2.7.4

Всем привет! В своем проекте использую заготовку project-stub (ветка i18n)/ Подскажите, почему в ветке i18n bower.json такой https://github.com/bem/project-stub/blob/i18n/bower.json , а в версии project-stub 1.4.0 такой https://github.com/bem/project-stub/blob/bem-core/bower.json . Будет ли ошибкой? если я обновлю bem-components с 2.3.0 до 2.4.0 и оставлю bower.json как в project-stub?

Ребятки, бывает возникают вопросы, на которые ответ пару сек внимания от профессионала и сразу помогает, а бывает искать по сайту или задать вопрос на форуме, занимает продолжительное время. Я сделал скайп-чат по БЭМу, присоединяйтесь по ссылке: https://join.skype.com/dAeR8XdFMuMj или напишите мне в скайп, я добавлю: rus2def

Дополнительные плюсы для сообщества:

  • Быстрая помощь новичкам
  • Новички легче преодолевают сложности входа
  • Больше людей не сдастся в освоении БЭМ-стека
  • Я сделал историю чата доступной для всех, будет просто искать ответы на частые вопросы по истории.

Всем привет! Есть ли возможность переопределять эффект открытия блока popup. Хочу сделать так, чтобы он не выезжал снизу вверх, а раскрывался из центра как здесь http://codepen.io/pen? Какой файл править?

Задача такая: есть макеты на запросы (site/index, video/index, video/new, video/edit и тд) Как грамотно оргинизовать их шаблоны. Используется весь стэк (BEMHTML, BEMTREE)

Если на каждого заводить по бандлу, то как тогда орагнизовать root.bemtree? site/index video/index video/new

Или же лучше заводить по модификатору на page page_view_site-index page_view_video-index page_view_video-new В этом случае тогда будет один бандл и один большой css и js файл

Какой здесь best practice?