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

Ребята, помогите решить задачку, хочется сделать по уму:

У меня есть две страницы в bundles: page1 и page2. Эти страницы очень похожи, разница в том, что page2 немного более расширена ( добавляются информационные блоки). В результате нужно иметь две страницы с чистым исходным кодом ( чтобы дополнительные блоки были только на странице page2).

Так как дизайн дорабатывается, да и для удобства поддержки, не хочется дублировать одинаковые на этих двух страницах вещи. Одинаковый блок, кроме текста, содержит ещё компоненты ( как стандартные из bem-components, так и самописные), да и вообще, представляет собой внушительную портянку.

Как сделать правильнее? Я пока вижу такие варианты:

  1. создать блок common_page и в bemhtml прописать там всю информацию для общей информации. После этого, подключать этот блок на странице page1 и page2. Отсюда возникают вопросы, правильно ли писать столько html в данном случае ( в bemjson около 1500 строк кода ) и будут ли работать стандартные и самописные компоненты? Ну и, конечно, переписывать 1500 строк кода совсем не хочется.
  2. придумать что-то типа @import(page1) для страницы page2. Возможно ли такая реализация?
  3. попытаться решить через модификатор ( расширенная страница - page2 или обычная - page1). Но при этом у меня должно в bundles так и остаться 2 физические страницы с чистым кодом. Как тогда организовать работу модификатора?

Проект жив? Стоит ли его использовать для новых проектов?

как добавить атрибут hidden в конкретный input блока radio-group?

При запуске второго шага: yo bem-stub

по видео мастер классу генерации проекта workshop получаю такой результат

node bfs-workshop.js verify Проверяем правильность задания. Пожалуйста, подождите. ✗ Вы должны установить generator-bem-stub с необходимыми параметрами.

FAIL

Ваше решение к Генерация заготовки проекта не верное. Пробуйте еще!

✗ Вы должны установить generator-bem-stub с необходимыми параметрами. /home/roman/frontend/workshop/do-it-yourself-workshop/node_modules/workshopper-exercise/exercise.js:152 processors[i].call(self, mode, function (err, pass) { ^ TypeError: Cannot read property 'call' of undefined at next (/home/roman/frontend/workshop/do-it-yourself-workshop/node_modules/workshopper-exercise/exercise.js:152:18) at /home/roman/frontend/workshop/do-it-yourself-workshop/nodemodules/workshopper-exercise/exercise.js:159:7 at failExercise (/home/roman/frontend/workshop/do-it-yourself-workshop/exercises/генерациязаготовкипроекта/exercise.js:19:9) at /home/roman/frontend/workshop/do-it-yourself-workshop/exercises/генерациязаготовки_проекта/exercise.js:33:24 at FSReqWrap.oncomplete (fs.js:95:15)

Заметил, что при выборе у меня отсутствует bemhtml при выборе. Не по помогают движения Up и Down с помощью клавиатуры. Также при запуске команды yo bem-stub появляется сообщение Just found a .yo-rc.json in a parent directory. Setting the project root at: /home/roman

Выводит ошибки при обновление страницы.

06:51:29.335 - [failed] [desktop.bundles/index/index.html] html-from-bemjson RangeError: Maximum call stack size exceeded at $b114 (/home/rtx/pr/start-project/desktop.bundles/index/index.bemhtml.js:1104:17) at applyc (/home/rtx/pr/start-project/desktop.bundles/index/index.bemhtml.js:111:20) at $b114 (/home/rtx/pr/start-project/desktop.bundles/index/index.bemhtml.js:1121:5) at applyc (/home/rtx/pr/start-project/desktop.bundles/index/index.bemhtml.js:111:20) at $b114 (/home/rtx/pr/start-project/desktop.bundles/index/index.bemhtml.js:1121:5) at applyc (/home/rtx/pr/start-project/desktop.bundles/index/index.bemhtml.js:111:20) at $b114 (/home/rtx/pr/start-project/desktop.bundles/index/index.bemhtml.js:1121:5) at applyc (/home/rtx/pr/start-project/desktop.bundles/index/index.bemhtml.js:111:20) at __$b114 (/home/rtx/pr/start-project/desktop.bundles/index/index.bemhtml.js:1121:5) at applyc (/home/rtx/pr/start-project/desktop.bundles/index/index.bemhtml.js:111:20) 06:51:29.706 - [rebuild] [desktop.bundles/index/_index.js] borschik

lubuntu 15.04

Версии: iojs --version v1.8.1

npm --version 2.7.4

Еще не розобрался, хедер : слева лого-картинка справа кнопка входа меню : 4 кнопки ссылки по горизонтали основа : 1 блок контейнер с иконками 2 блок что-то похожее на календать 3 блок аналогичен 2му 4 - кнопака слева, картинка справа футер : бэкграунд 3 таблицы с текстом

При создании дерева в хедере - логотип пропадает остается только кнопка.

@tavriaforever Рядом с полями ввода поста и комментария нужно добавить заметную краткую инструкцию по оформлению кода со ссылкой для более подробного изучения

Здравствуйте. Подскажите, как можно добавить тег внутри текста? Например

block: 'text',
content: 'ТекстТекстТекст<a class='link' href="">Текст</a>ТекстТекстТекстТекстТекстТекст'

Можно такого добиться с помощью bemjson как нибудь?

https://ru.bem.info/libs/bem-core/v2.6.0/desktop/i-bem/#init-live

Если необходимо инициализировать экземпляры блока по наступлению DOM- или БЭМ-событий, в теле функции следует выполнить подписку на делегированные события. Возможна инициализация по:

  • DOM-событию на DOM-узле блока и вложенных элементах;
  • БЭМ-событию на вложенных блоках.

Хотелось бы увидеть в документации пример ленивой инициализации по BEM событию.

Собственно вопрос, как методах экземпляра блока поймать событие загрузки изображения?

elem.onload = function(){}

не помогает. Думал что как клик работать будет, но что то не работает(

Не могу разобраться с подключением своих блоков на разные страницы.

Например, создал я в папке desktop.blocks папку с неким блоком и файл стилей для него. Этот блок может встречаться в неизменном виде на некоторых страницах проекта. Как сделать так, чтобы можно было подключать этот блок в нужном месте, не описывая каждый раз структуру блока в page.bemjson.js для каждой страницы, где он встречается? В php я бы просто сделал include в нужном месте на нужный файл.

Спасибо за внимание.

Так уж получилось, что я разрабатываю сайты на Битриксе. В прошлом году сделали свой модуль, который позволяет нам подключать блоки из local/blocks в рантайм страницы. Ранее писал, что сборку проводим через gulp. Сейчас хотим пойти дальше: перенести сборку файлов технологий css, js на bem make и добавить собрку бандлов для страниц local/bundles.

С блоками я разобрался, с бандлами тоже, добавил технологию scss (по аналогии с sass). Что осталось?

  1. Изменить технологию scss, чтобы она заработала через gulp-compass – думаю, тут осилю я сам, нужно только время
  2. Настроить сборку файлов технологий (css, js) в папке блока
  3. Настроить сборку бандлов, сейчас получаю ошибку http://take.ms/3blFQ (мой .bem/make.js – http://pastebin.com/kQHFt736)
  4. Отключить при сборке бандла минификацию html

PS: про enb в курсе, если можете помочь в формулировании нужного формата сборки в терминах enb – буду только рад)

Безопасно ли собирать bem-core и bem-components технологиями deps и bemhtml вместо deps-old и bemhtml-old соответственно?

Такой вопрос когда я вещаю обработчик на элемент блока

this.bindTo(this.elem('btn'), 'click', function(e){
    this.delMod(this.elem('btn'), 'selected');
    this.itemOnclick(e);
});

Как получить объект элемента в рамках БЭМа? У меня пока только один вариант получения самой ноды через e.target, но это не то что нужно.

Привет! Используем LESS. Тулзы БЭМ не используем, только именование классов. Нужно по модификатору блока переопределить стиль для нескольких его элементов. Можно ли не размножать название модификатора или имя блока?

.coolblock {
    &__e1 { color:#000;  }
    &__e2 { color:#333;  }

    // так размножаем модификатор
    &_red &__e1 { color:#600; }
    &_red &__e2 { color:#A00; }

    // а так размножаем имя блок
    &_red {
       .coolblock__e1 { color:#600; }
       .coolblock__e2 { color:#A00; }
    }

    // а хочется чего-то примерно такого
    // но это будет компайлиться в .coolblock_red__e2
    &_red {
        &__e1 {color:#600;}
        &__e2 {color:#A00;}
    }
}

Есть ли какой-нибудь финт на этот случай? Спасибо!

Продолжаю погружение. Давно мучает вопрос, что именно делает enb-magic-platform. Какова его роль в bem-core/bem-components. Должен ли я его хотеть для своей библиотеки.

Всем привет!

Правильно ли я объявляю блок-микс в js? Он у меня почему-то выпадает в ошибку: Uncaught mix block "mix" for "block" is undefined.

BEMJSON:

{
        block: 'block',
        js: true,
        mix: [{block: 'mix'}],
        content: 'Block'
    }

js:

modules.define('block', ['i-bem__dom'], function(provide, BEMDOM) {

    provide(BEMDOM.decl({ block: this.name, baseMix: ['mix'] }, {
        onSetMod: {
            'js': {
                'inited': function() {
                    console.log('Block!')
                }
            }
        }
    }));

});

Философия "не mvc" ?

  1. Насколько я понял, методология придерживается идеи 1 страницы. Т.е. у нас нет $layout в котором лежит $content, где $content это какая-то view'ха. Как разрешить этот вопрос в рамках методологии БЭМ? Все что у нас есть это макеты в .bundlers и блоки в .blocks.
  2. Мы сверстали статику, и получили index.html, index.css, index.js, мы отдали это backend'у, на баке прогреры натыкают переменных которые пришли из контроллеров, и как только появляется необходимость поменять структуру странички, например добавить блок "заявки", то начинается боль. Нам снова надо пересобрать страничку через bem и отдать прогерам перезаписав работу бакендчиков? Как избежать этой боли?

Во времена React.js и подобных вещей хочется и в bem.js чего то подобного.

Из дискуссии https://ru.bem.info/forum/385/ ничего внятного не вышло. Предлагаю вариант своей идеи как это можно сделать.

Основная идея

По аналогии с React оперировать виртуальным деревом, но не в терминах DOM а в терминах БЭМ. При загрузке страницы вместе с базовым HTML телом страницы отдается bemjson и скомпилированный bemtree или bemhtml. Создается виртуальное БЭМ дерево, далее из него формируется html и рендерится на страницу.

Пример

На текущий момент bem.js оперирует DOM нодами посредством jQuery. Нужна реализация оперирующая БЭМ деревом (по факту развернутый bemjson) и обновляющая данные на странице при его изменении.

Скажем браузеру отдается страница вида

<!-- index.html -->
<!DOCTYPE html>
<html>
  <head>
    <title>Hello</title>
  </head>
  <body class="page" bem-json="....">
// тут может быть отрендереный на сервере bemjson
  </body>
</html>

Сам bemjson имеет вид

{
    block: 'comment-box',
    js: {
        url: 'comments.json',
        pollInterval: 2000
    },
    content: [
        {
            block: 'comment-list',
            content: [
                {
                    author: 'Pete Hunt',
                    content: 'This is one comment'
                },
                {
                    author: 'Jordan Walke',
                    content: 'This is *another* comment'
                }
            ]
        }
    ]
}

Ну и сами блоки

JSONBEMDOM.decl('comment-box', {
    onSetMod: {
        js: {
            inited: function() {
                // метод findBlockInside спускается по нашему виртуальному БЭМ дереву
                // и пытается найти bemjson блок comment-form 
                this.form = this.findBlockInside('comment-form');
                this.commentsList = this.findBlockInside('comment-list');

                this.form.on('submit', this._submitHandler);

                this._loadCommentsFromServer();
                setInterval(this._loadCommentsFromServer, this.params.pollInterval);
            }
        }
    },

    getDefaultParams: function() {
        return {
            data: [],
            url: '',
            pollInterval: null
        }
    },

    _loadCommentsFromServer: function() {
        $.getJson(this.params.url).done(function(comments) {
            /**
             * метод content() ожидает аргумент в синтаксисе bemjson
             * который он применяет к `content` параметру блока в виртуальном БЭМ дереве
             */
            this.commentsList.content(comments);
        }.bind(this));
    },

    _submitHandler: function(e) {
        e.preventDefault();
        /**
         * метод content() без аргументов отдает из дерева
         * параметр `content` элемента, если это инпут то его значение
         */
        var text = this.elem('text').content();
        var author = this.elem('author').content();

        $.post(this.params.url, {
            text: text,
            author: author
        }).done(function (comment) {
            var comments = this.commentsList.content();
            comments = comments.concat([comment]);

            this.commentsList.content(comments);
        }.bind(this));
    }
});

bem.js сам отслеживает изменения в виртуальном БЭМ дереве, делает слепок отличий, накладывает на него bemhtml/bemtree и инъектит его в текущий html.

В итоге мы имеем на клиенте

  • Всю мощь декларативной шаблонизации bemhtml/bemtree
  • Красивый и структурированный bemjson на клиенте
  • Производительность из-за виртуального БЭМ дерева.

Пишем:

import iBemDom from 'i-bem-dom';
class myBlock extends iBemDom {
  onSetMod : { ... },
  _onSubmit () {
  },
  static live () {
  }
}
export default myBlock;

получаем:

modules.define('my-block', ['i-bem-dom'], function (iBemDom) {
  var myBlock = iBemDom.decl('my-block', {
    onSetMod : { ... },
    _onSubmit : function () {
    }
  }, {
    live : function () {
    }
  })
  provide(myBlock);
});
  1. ES6 модули как абстракция для ym;
  2. ES6 классы как абстракция для inherit (а позже, возможно, для чего угодно).

Кому-то надо? Есть желание запилить?

На мой взгляд, надо:

  1. Сделать в enb возможность препроцессить файлы перед сборкой;
  2. Написать плагин для препроцессора с бабелем (есть https://github.com/s-panferov/enb-babel, но в этом случае весь код надо будет так);
  3. Подключить в .enb/make.js препроцессор;
  4. Получить профит и возможность писать так, где удобнее писать так, не меняя остального.

В качестве исключения можно про «хайлайтеры» для vim не вспоминать ;-)

/cc @blond @tadatuta

Есть довольно распространенный запрос тестировщиков к Gemini — возможность делать селекторы XPath. На мой скромный взгляд это очень просто реализовать, глядя например, на существующие query «методы» (sizzle && native), тем не менее хотелось бы услышать мнение, насколько это представляется возможным (в смысле реализации в виде плагина).

Добрый день, я тут немного запутался с технологиями и префиксами.

У меня нестандартный проект, объяснять его историю – очень долго и больно) Проект уже в продакшене, мы в него внедряем БЭМ. В общем, все блоки лежат в папке local/blocks.

Папки .bem изначально не было, я добавил папку и пустой levels.js в local/blocks/.bem/levels.js.

Теперь при попытке выполнить bem create -l local/blocks -b 'b-404' -t deps.js получаю: WARNING! Tech module "deps.js" at /usr/local/lib/node_modules/bem/lib/techs/deps.js.js is using API V1. Tech modules API V1 is not recommended to use, because it is slow. Please use tech modules API V2, it makes your build process faster! Instructions for migrating to API V2: http://git.io/gbLDOA

Уже неплохой результат.

Вопроса два:

  1. Как можно задать префиксы блоков, чтобы не писать все команды bem create -l local/blocks?
  2. Как нужно правильно добавить технологии чтобы они были v2? На проекте используются compass-scss (собирается через gulp), js, deps.js, js-i

Заранее спасибо!

Привет.

У меня довольно абстрактно/утилитарный вопрос. Есть проект, responsive web design. 5 breakpoins. На них есть кнопки, вызывающие дейтпикер. Задача — провести визуальное тестирование страниц на наборе ширин viewport'а. Чего я ищу, по сути — одного теста, но на наборе ширин, и с выполнением "before each" определенных взаимодествий.

Подскажите пожалуйста, возможно ли это с помощью gemini, и если да — как.

@tavriaforever что-то случилось с сортировкой тегов при создании нового поста:

@tadatuta, @blond, @eGavr, @tormozz48, @alexbaumgertner и прочие причастные https://github.com/search?q=%22latedef%22%3A+%22nofucn%22&type=Code&utf8=%E2%9C%93

/nofucn/nofunc/

Делаю по инструкции: git clone https://github.com/bem/project-stub.git --depth 1 --branch v1.0.0 my-bem-project cd my-bem-project npm install # Не используйте права суперпользователя (root) при установке npm- и bower-зависимостей.

При последней команде получаю ошибки:

roman@roman-S300CA ~/frontend/my-bem-project $ npm install npm ERR! git clone git://github.com/SevInf/node-byline.git Cloning into bare repository '/home/roman/.npm/_git-remotes/git-github-com-SevInf-node-byline-git-d6518a15'... npm ERR! git clone git://github.com/SevInf/node-byline.git fatal: unable to connect to github.com: npm ERR! git clone git://github.com/SevInf/node-byline.git github.com[0: 192.30.252.128]: errno=Время ожидания соединения истекло npm ERR! Error: EACCES, mkdir '/home/roman/.npm/update-notifier/0.1.10' npm ERR! { [Error: EACCES, mkdir '/home/roman/.npm/update-notifier/0.1.10'] npm ERR! errno: 3, npm ERR! code: 'EACCES', npm ERR! path: '/home/roman/.npm/update-notifier/0.1.10', npm ERR! parent: 'bower-npm-install' } npm ERR! npm ERR! Please try running this command again as root/Administrator.

npm ERR! System Linux 3.13.0-37-generic npm ERR! command "/usr/bin/node" "/usr/bin/npm" "install" npm ERR! cwd /home/roman/frontend/my-bem-project npm ERR! node -v v0.10.38 npm ERR! npm -v 1.4.28 npm ERR! path /home/roman/.npm/update-notifier/0.1.10 npm ERR! code EACCES npm ERR! errno 3 npm ERR! stack Error: EACCES, mkdir '/home/roman/.npm/update-notifier/0.1.10' npm ERR! not ok code 0

Привет ребят. Я не могу понять для чего нужен elem в bemjson. Ведь можно всё сделать через блоки, и при необходимости использовать mix для того, чтобы доопределить что нибудь? Или я скорей всего чего то не догоняю) Подскажите пожалуйста?

Всем привет!

Не подскажите, почему стили у блока могут не доопределяться? Использую свою библиотеку, стили из библиотеки подтягиваются, а из проекта нет. Уровни в make.js дописал. Использую enb. При этом с bem-tools отрабатывает нормально. Проект и библиотека на основе project-stub. На чистом project-stub такая же ситуация.

Подскажите, есть какие-либо особенности работы БЭМ событий, на блоках без DOM представления. В дебагере смотрю, блок событие генерирует, а реакции на событие нет...

У блоков в bem.js представлении есть методы экземпляра и статические методы, Я хочу из одного блока обращаться к другому к примеру по event mouseover я показываю popup. я вешаю обработчик на блок который ловит событие такого содержания:

_mouseover: function(e){
    columnPopup.openByModsAlign(this._align);
},

Сам же блок columnPopup он находится в зависимостях у этого блока, columnPopup есть статический метод openByModsAlign который не православным методом с помощью jquery добавляет модификатор,

openByModsAlign : function(mods) {
    $('.column-popup_align_' + mods).addClass('column-popup_visible');
    $('.column-popup_align_' + mods).removeClass('column-popup_closing');
}

Хочется использовать как в методах экземпляра конструкцию типа

openByModsAlign : function(mods) {
    this.setMod('visible');
    this.delMod('closing');
}

Как правильно заюзать метод в моем случае? То что я написал это временный костыль который на мой взгляд не верен, в рамках БЭМА