Commit b91bf544 authored by Nikolay Gromov's avatar Nikolay Gromov

components

parent f38e4299
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
☐ Сделать: Кнопка с иконкой ☐ Сделать: Кнопка с иконкой
☐ Сделать: Кнопка-иконка ☐ Сделать: Кнопка-иконка
☐ Сделать: Множественный range
☐ Сделать: Флажок-свитчер, радиокнопку-свитчер ☐ Сделать: Флажок-свитчер, радиокнопку-свитчер
☐ Сделать: Текстовые поля: группа ☐ Сделать: Текстовые поля: группа
☐ Сделать: Текстовые поля: неинтерактивное дополнение справа, неинтерактивное дополнение слева ☐ Сделать: Текстовые поля: неинтерактивное дополнение справа, неинтерактивное дополнение слева
...@@ -17,6 +16,8 @@ ...@@ -17,6 +16,8 @@
☐ Сделать: Прогресс-бар ☐ Сделать: Прогресс-бар
☐ Сделать: Превьюхи картинок ☐ Сделать: Превьюхи картинок
☐ Сделать: Адаптивные вставки медиа-контента (http://foundation.zurb.com/sites/docs/flex-video.html) ☐ Сделать: Адаптивные вставки медиа-контента (http://foundation.zurb.com/sites/docs/flex-video.html)
☐ Сделать: Range c показанным выбранным значением
☐ Сделать: Множественный range
☐ Сделать: Дропдаун из любого элемента в любую сторону ☐ Сделать: Дропдаун из любого элемента в любую сторону
☐ Сделать: Табы (вкладки) с реакцией на хеш ☐ Сделать: Табы (вкладки) с реакцией на хеш
☐ Сделать: Off-canvas с тачем, правый и левый ☐ Сделать: Off-canvas с тачем, правый и левый
......
'use strict'; 'use strict';
// Зависимости проекта
const gulp = require('gulp'); const gulp = require('gulp');
const less = require('gulp-less'); const less = require('gulp-less');
const debug = require('gulp-debug'); const debug = require('gulp-debug');
...@@ -24,6 +25,7 @@ const uglify = require('gulp-uglify'); ...@@ -24,6 +25,7 @@ const uglify = require('gulp-uglify');
const concat = require('gulp-concat'); const concat = require('gulp-concat');
const browserSync = require('browser-sync').create(); const browserSync = require('browser-sync').create();
const replace = require('gulp-replace'); const replace = require('gulp-replace');
const fs = require('fs');
// Запуск `NODE_ENV=production gulp [задача]` приведет к сборке без sourcemaps // Запуск `NODE_ENV=production gulp [задача]` приведет к сборке без sourcemaps
const isDev = !process.env.NODE_ENV || process.env.NODE_ENV == 'dev'; const isDev = !process.env.NODE_ENV || process.env.NODE_ENV == 'dev';
...@@ -31,10 +33,19 @@ const isDev = !process.env.NODE_ENV || process.env.NODE_ENV == 'dev'; ...@@ -31,10 +33,19 @@ const isDev = !process.env.NODE_ENV || process.env.NODE_ENV == 'dev';
// Запуск `port=3004 gulp [задача]` приведет к запуску сервера обновлений на 3004 порту // Запуск `port=3004 gulp [задача]` приведет к запуску сервера обновлений на 3004 порту
const port = process.env.port ? process.env.port : 3000; const port = process.env.port ? process.env.port : 3000;
// Расположение папки с компонентами
const componentFolder = './src/components/';
getComponentsFiles();
// Компиляция LESS // Компиляция LESS
gulp.task('less', function () { gulp.task('less', function () {
console.log('---------- компиляция LESS'); console.log('---------- компиляция LESS');
return gulp.src('src/less/style.less') return gulp.src('./src/less/style.less')
.pipe(gulpIf(isDev, sourcemaps.init())) .pipe(gulpIf(isDev, sourcemaps.init()))
.pipe(debug({title: "LESS:"})) .pipe(debug({title: "LESS:"}))
.pipe(less()) .pipe(less())
...@@ -52,13 +63,13 @@ gulp.task('less', function () { ...@@ -52,13 +63,13 @@ gulp.task('less', function () {
.pipe(rename('style.min.css')) .pipe(rename('style.min.css'))
.pipe(debug({title: "RENAME:"})) .pipe(debug({title: "RENAME:"}))
.pipe(gulpIf(isDev, sourcemaps.write('.'))) .pipe(gulpIf(isDev, sourcemaps.write('.')))
.pipe(gulp.dest('build/css')); .pipe(gulp.dest('./build/css'));
}); });
// Копирование добавочных CSS, которые хочется иметь отдельными файлами // Копирование добавочных CSS, которые хочется иметь отдельными файлами
gulp.task('copy:css', function() { gulp.task('copy:css', function() {
console.log('---------- копирование CSS'); console.log('---------- копирование CSS');
return gulp.src('src/css/*.css', {since: gulp.lastRun('copy:css')}) return gulp.src('./src/css/*.css', {since: gulp.lastRun('copy:css')})
.pipe(postcss([ .pipe(postcss([
autoprefixer({browsers: ['last 2 version']}), autoprefixer({browsers: ['last 2 version']}),
mqpacker mqpacker
...@@ -68,37 +79,37 @@ gulp.task('copy:css', function() { ...@@ -68,37 +79,37 @@ gulp.task('copy:css', function() {
path.extname = '.min.css' path.extname = '.min.css'
})) }))
.pipe(debug({title: "RENAME:"})) .pipe(debug({title: "RENAME:"}))
.pipe(gulp.dest('build/css')); .pipe(gulp.dest('./build/css'));
}); });
// Копирование и оптимизация изображений // Копирование и оптимизация изображений
gulp.task('img', function () { gulp.task('img', function () {
console.log('---------- копирование и оптимизация картинок'); console.log('---------- копирование и оптимизация картинок');
return gulp.src('src/img/*.{jpg,jpeg,gif,png,svg}', {since: gulp.lastRun('img')}) // только для изменившихся с последнего запуска файлов return gulp.src('./src/img/*.{jpg,jpeg,gif,png,svg}', {since: gulp.lastRun('img')}) // только для изменившихся с последнего запуска файлов
.pipe(newer('build/img')) // оставить в потоке только изменившиеся файлы .pipe(newer('./build/img')) // оставить в потоке только изменившиеся файлы
.pipe(imagemin({ .pipe(imagemin({
progressive: true, progressive: true,
svgoPlugins: [{removeViewBox: false}], svgoPlugins: [{removeViewBox: false}],
use: [pngquant()] use: [pngquant()]
})) }))
.pipe(gulp.dest('build/img')); .pipe(gulp.dest('./build/img'));
}); });
// Оптимизация изображений для форм // Оптимизация изображений для форм
gulp.task('img:form', function () { gulp.task('img:form', function () {
console.log('---------- Оптимизация картинок для компонента форм'); console.log('---------- Оптимизация картинок для компонента форм');
return gulp.src('src/img/form_field_bg/*.svg') return gulp.src('./src/img/form_field_bg/*.svg')
.pipe(imagemin({ .pipe(imagemin({
progressive: true, progressive: true,
svgoPlugins: [{removeViewBox: false}], svgoPlugins: [{removeViewBox: false}],
})) }))
.pipe(gulp.dest('src/img/form_field_bg')); .pipe(gulp.dest('./src/img/form_field_bg'));
}); });
// Сборка SVG-спрайта // Сборка SVG-спрайта
gulp.task('svgstore', function () { gulp.task('svgstore', function () {
console.log('---------- сборка SVG спрайта'); console.log('---------- сборка SVG спрайта');
return gulp.src('src/img/svg_sprite/*.svg') return gulp.src('./src/img/svg_sprite/*.svg')
.pipe(svgmin(function (file) { .pipe(svgmin(function (file) {
return { return {
plugins: [{ plugins: [{
...@@ -112,19 +123,19 @@ gulp.task('svgstore', function () { ...@@ -112,19 +123,19 @@ gulp.task('svgstore', function () {
.pipe(cheerio(function ($) { .pipe(cheerio(function ($) {
$('svg').attr('style', 'display:none'); $('svg').attr('style', 'display:none');
})) }))
.pipe(gulp.dest('build/img')); .pipe(gulp.dest('./build/img'));
}); });
// Сборка HTML // Сборка HTML
gulp.task('html', function() { gulp.task('html', function() {
console.log('---------- сборка HTML'); console.log('---------- сборка HTML');
return gulp.src('src/*.html') return gulp.src('./src/*.html')
.pipe(fileinclude({ .pipe(fileinclude({
prefix: '@@', prefix: '@@',
basepath: '@file' basepath: '@file'
})) }))
.pipe(replace(/\n<!--DEVCOMMENT[\s\S]+?-->/gm, '')) .pipe(replace(/\n<!--DEVCOMMENT[\s\S]+?-->/gm, ''))
.pipe(gulp.dest('build/')); .pipe(gulp.dest('./build/'));
}); });
// Конкатенация и углификация Javascript // Конкатенация и углификация Javascript
...@@ -132,7 +143,7 @@ gulp.task('js', function () { ...@@ -132,7 +143,7 @@ gulp.task('js', function () {
console.log('---------- обработка Javascript'); console.log('---------- обработка Javascript');
return gulp.src([ return gulp.src([
// Последовательность конкатенации // Последовательность конкатенации
'src/js/script.js' './src/js/script.js'
]) ])
.pipe(debug({title: "JS:"})) .pipe(debug({title: "JS:"}))
.pipe(gulpIf(isDev, sourcemaps.init())) .pipe(gulpIf(isDev, sourcemaps.init()))
...@@ -146,14 +157,14 @@ gulp.task('js', function () { ...@@ -146,14 +157,14 @@ gulp.task('js', function () {
})) }))
.pipe(gulpIf(isDev, sourcemaps.write('.'))) .pipe(gulpIf(isDev, sourcemaps.write('.')))
.pipe(gulpIf(isDev, debug({title: "JS SOURCEMAPS:"}))) .pipe(gulpIf(isDev, debug({title: "JS SOURCEMAPS:"})))
.pipe(gulp.dest('build/js')); .pipe(gulp.dest('./build/js'));
}); });
// Очистка папки сборки // Очистка папки сборки
gulp.task('clean', function () { gulp.task('clean', function () {
return del([ return del([
'build/**/*', './build/**/*',
'!build/readme.md' '!./build/readme.md'
]); ]);
}); });
...@@ -167,30 +178,64 @@ gulp.task('build', gulp.series( ...@@ -167,30 +178,64 @@ gulp.task('build', gulp.series(
// Слежение // Слежение
gulp.task('watch', function () { gulp.task('watch', function () {
// Слежение за HTML // Слежение за HTML
gulp.watch(['src/*.html', 'src/_include/*.html'], gulp.series('html')); gulp.watch('./src/**/*.html', gulp.series('html'));
// Слежение за LESS // Слежение за LESS
gulp.watch('src/less/**/*.less', gulp.series('less')); gulp.watch('./src/**/*.less', gulp.series('less'));
// Слежение за добавочными CSS // Слежение за добавочными CSS
gulp.watch('src/css/*.css', gulp.series('copy:css')); gulp.watch('./src/css/*.css', gulp.series('copy:css'));
// Слежение за изображениями // Слежение за изображениями
gulp.watch('src/img/*.{jpg,jpeg,gif,png,svg}', gulp.series('img')); gulp.watch('./src/**/img/*.{jpg,jpeg,gif,png,svg}', gulp.series('img'));
// Слежение за Javascript // Слежение за Javascript
gulp.watch('src/js/*.js', gulp.series('js')); gulp.watch('./src/**/*.js', gulp.series('js'));
}); });
// Локальный сервер // Локальный сервер
gulp.task('serve', function () { gulp.task('serve', function () {
gulp.series('build'); gulp.series('build');
browserSync.init({ browserSync.init({
server: 'build', server: './build',
port: port, port: port,
notify: false, notify: false,
startPath: '_blocks_library.html' startPath: '_blocks_library.html'
}); });
browserSync.watch(['build/**/*.*', '!build/**/*.map.*']).on('change', browserSync.reload); browserSync.watch(['./build/**/*.*', '!./build/**/*.map.*']).on('change', browserSync.reload);
}); });
// Задача по умолчанию // Задача по умолчанию
gulp.task('default', gulp.task('default',
gulp.series('build', gulp.parallel('watch', 'serve')) gulp.series('build', gulp.parallel('watch', 'serve'))
); );
// Определение собираемых компонентов
function getComponentsFiles() {
console.log('---------- получение списка компонентов');
// Создадим переменную-объект, куда потом запишем результат
let сomponentsList = {};
// Читаем файл диспетчера подключений
let connectManager = fs.readFileSync('./src/less/style.less', 'utf8');
// Фильтруем массив, оставляя только строки с незакомментированными импортами
let fileSystem = connectManager.split('\n').filter(function(item) {
if(/^@import/.test(item)) return true;
else return false;
});
// Обойдём массив и запишем его части в объект результирующей переменной
fileSystem.forEach(function(item, i) {
// Попробуем вычленить компонент из строки импорта
let componentData = /\/components\/(.+?)(\/)/g.exec(item);
// console.log(componentData);
// Если это компонент
if (componentData !== null) {
// Дописываем в объект название компонента
if(!сomponentsList[componentData[1]]) {
сomponentsList[componentData[1]] = '';
}
}
});
console.log(сomponentsList);
// Если в строке были указаны дополнительные файлы (комментарием в конце строки, по форме // add[addFile1.js, megafile.js] )
// let componentAdditionalFiles = /add\[(.+)\]/g.exec(item);
// console.log(componentAdditionalFiles);
// Вернем объект со списком собираемых JS-файлов и копируемых изображений
// return ComponentsList;
}
{ {
"name": "start-project--gulp", "name": "NTH-start-project",
"version": "1.0.0", "version": "1.0.0",
"description": "", "description": "",
"scripts": { "scripts": {
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
}, },
"author": "Nikolay Gromov", "author": "Nikolay Gromov",
"license": "MIT", "license": "MIT",
"repository": "nicothin/start-project--gulp", "repository": "nicothin/NTH-start-project",
"devDependencies": { "devDependencies": {
"autoprefixer": "^6.3.3", "autoprefixer": "^6.3.3",
"browser-sync": "^2.11.1", "browser-sync": "^2.11.1",
......
.second-component {
display: block;
}
.test-component--modofoed {
color: #ff0;
}
<div class="test-component">Тестовый компонент</div>
alert('Тестовый компонент');
.test-component {
display: block;
}
@import "variables.less"; // @import "variables.less";
@import "mixins/mixins.less"; // @import "mixins/mixins.less";
@import "global_scaffolding.less"; // @import "global_scaffolding.less";
@import "global_print.less"; // @import "global_print.less";
@import "global_grid.less"; // @import "global_grid.less";
// @import "blocks/table-responsive.less";
// @import "blocks/btn.less";
// @import "blocks/form.less";
// @import "blocks/field-text.less";
// @import "blocks/field-checkbox.less";
// @import "blocks/field-checkbox--custom.less";
// @import "blocks/field-radio.less";
// @import "blocks/field-radio--custom.less";
// @import "blocks/field-select.less";
// @import "blocks/field-file.less";
// @import "blocks/field-range.less";
// @import "blocks/field-actions.less";
@import "blocks/table-responsive.less"; @import (less) "../components/test-component/test-component.less";
@import "blocks/btn.less"; @import "../components/test-component/test-component--modified.less"; // add[addFile1.js, megafile.js]
@import "blocks/form.less"; @import "../components/second-component/second-component.less";
@import "blocks/field-text.less"; @import "global_grid.less";
@import "blocks/field-checkbox.less";
@import "blocks/field-checkbox--custom.less";
@import "blocks/field-radio.less";
@import "blocks/field-radio--custom.less";
@import "blocks/field-select.less";
@import "blocks/field-file.less";
@import "blocks/field-range.less";
@import "blocks/field-actions.less";
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment