Commit 21f901f190286bf54e6e9d8aa48d56dee4fc5f1f
Exists in
master
and in
1 other branch
Merge branch 'themes' into 'master'
Estrutura de temas para a aplicação angular no noosfero Resolve a issue #3 See merge request !3
Showing
20 changed files
with
94 additions
and
44 deletions
Show diff stats
README.md
| ... | ... | @@ -27,3 +27,13 @@ See some important folders bellow: |
| 27 | 27 | - Content viewer component: `src/app/article/content-viewer` |
| 28 | 28 | - Profile component: `src/app/profile` |
| 29 | 29 | - Profile Info component: `src/app/profile/info` |
| 30 | + | |
| 31 | + | |
| 32 | +## Change theme | |
| 33 | + | |
| 34 | +1. Create the theme folder inside themes | |
| 35 | +1. Configure application to use the new theme, e.g.: | |
| 36 | +`npm config set angular-theme:theme custom-theme` | |
| 37 | +1. Create an app folder inside custom-theme and add your custom scss files | |
| 38 | +1. Put the templates that you want to override in the same structure from the main application source, e.g.: | |
| 39 | +`src/app/profile/profile.html` will be overriden by `themes/custom-theme/app/profile/profile.html` | ... | ... |
gulp/build.js
| ... | ... | @@ -2,18 +2,22 @@ |
| 2 | 2 | |
| 3 | 3 | var path = require('path'); |
| 4 | 4 | var gulp = require('gulp'); |
| 5 | +var rename = require('gulp-rename'); | |
| 6 | +var merge = require('merge-stream'); | |
| 5 | 7 | var conf = require('./conf'); |
| 6 | -var noosferoThemePrefix = "/designs/themes/angular-theme/dist/"; | |
| 8 | + | |
| 9 | +var noosferoThemePrefix = path.join("/designs/themes/angular-theme", conf.paths.dist, '/'); | |
| 7 | 10 | |
| 8 | 11 | var $ = require('gulp-load-plugins')({ |
| 9 | 12 | pattern: ['gulp-*', 'main-bower-files', 'uglify-save-license', 'del'] |
| 10 | 13 | }); |
| 11 | 14 | |
| 12 | 15 | gulp.task('partials', function () { |
| 13 | - return gulp.src([ | |
| 14 | - path.join(conf.paths.src, '/app/**/*.html'), | |
| 15 | - path.join(conf.paths.tmp, '/serve/app/**/*.html') | |
| 16 | - ]) | |
| 16 | + var srcPaths = [path.join(conf.paths.tmp, '/serve/app/**/*.html')]; | |
| 17 | + conf.paths.allSources.forEach(function(src) { | |
| 18 | + srcPaths.push(path.join(src, '/app/**/*.html')); | |
| 19 | + }); | |
| 20 | + return gulp.src(srcPaths) | |
| 17 | 21 | .pipe($.minifyHtml({ |
| 18 | 22 | empty: true, |
| 19 | 23 | spare: true, |
| ... | ... | @@ -100,10 +104,11 @@ gulp.task('other', function () { |
| 100 | 104 | return file.stat.isFile(); |
| 101 | 105 | }); |
| 102 | 106 | |
| 103 | - return gulp.src([ | |
| 104 | - path.join(conf.paths.src, '/**/*'), | |
| 105 | - path.join('!' + conf.paths.src, '/**/*.{map,ts,html,css,js,scss}') | |
| 106 | - ]) | |
| 107 | + var srcPaths = [path.join('!' + conf.paths.src, '/**/*.{map,ts,html,css,js,scss}')]; | |
| 108 | + conf.paths.allSources.forEach(function(src) { | |
| 109 | + srcPaths.push(path.join(src, '/**/*')); | |
| 110 | + }); | |
| 111 | + return gulp.src(srcPaths) | |
| 107 | 112 | .pipe(fileFilter) |
| 108 | 113 | .pipe(gulp.dest(path.join(conf.paths.dist, '/'))); |
| 109 | 114 | }); |
| ... | ... | @@ -116,4 +121,15 @@ gulp.task('clean-docs', [], function() { |
| 116 | 121 | return $.del([path.join(conf.paths.docs, '/')]); |
| 117 | 122 | }); |
| 118 | 123 | |
| 119 | -gulp.task('build', ['html', 'fonts', 'other', 'locale']); | |
| 124 | +gulp.task('noosfero', ['html'], function () { | |
| 125 | + var layouts = gulp.src('layouts/**/*') | |
| 126 | + .pipe(gulp.dest(path.join(conf.paths.dist, "layouts"))); | |
| 127 | + var theme = gulp.src('theme.yml') | |
| 128 | + .pipe(gulp.dest(conf.paths.dist)); | |
| 129 | + var index = gulp.src(path.join(conf.paths.dist, 'index.html')) | |
| 130 | + .pipe(rename('index.html.erb')) | |
| 131 | + .pipe(gulp.dest(conf.paths.dist)); | |
| 132 | + return merge(layouts, theme, index); | |
| 133 | +}); | |
| 134 | + | |
| 135 | +gulp.task('build', ['html', 'fonts', 'other', 'locale', 'noosfero']); | ... | ... |
gulp/conf.js
| ... | ... | @@ -6,7 +6,9 @@ |
| 6 | 6 | * of the tasks |
| 7 | 7 | */ |
| 8 | 8 | |
| 9 | +var argv = require('minimist')(process.argv.slice(2)); | |
| 9 | 10 | var gutil = require('gulp-util'); |
| 11 | +var path = require('path'); | |
| 10 | 12 | |
| 11 | 13 | /** |
| 12 | 14 | * The main paths of your project handle these with care |
| ... | ... | @@ -16,8 +18,15 @@ exports.paths = { |
| 16 | 18 | dist: 'dist', |
| 17 | 19 | tmp: '.tmp', |
| 18 | 20 | e2e: 'e2e', |
| 19 | - docs: 'docs' | |
| 21 | + docs: 'docs', | |
| 22 | + themes: 'themes' | |
| 20 | 23 | }; |
| 24 | +exports.configTheme = function(theme) { | |
| 25 | + exports.paths.theme = path.join(exports.paths.themes, theme || "default"); | |
| 26 | + exports.paths.allSources = [exports.paths.src, exports.paths.theme]; | |
| 27 | + exports.paths.dist = path.join("dist", exports.paths.theme); | |
| 28 | +} | |
| 29 | +exports.configTheme(argv.theme); | |
| 21 | 30 | |
| 22 | 31 | /** |
| 23 | 32 | * Wiredep is the lib which inject bower dependencies in your project | ... | ... |
gulp/server.js
| ... | ... | @@ -46,7 +46,11 @@ browserSync.use(browserSyncSpa({ |
| 46 | 46 | })); |
| 47 | 47 | |
| 48 | 48 | gulp.task('serve', ['watch'], function () { |
| 49 | - browserSyncInit([path.join(conf.paths.tmp, '/serve'), conf.paths.src]); | |
| 49 | + var srcPaths = [path.join(conf.paths.tmp, '/serve')]; | |
| 50 | + conf.paths.allSources.reverse().forEach(function(src) { | |
| 51 | + srcPaths.push(src); | |
| 52 | + }); | |
| 53 | + browserSyncInit(srcPaths); | |
| 50 | 54 | }); |
| 51 | 55 | |
| 52 | 56 | gulp.task('serve:dist', ['build'], function () { | ... | ... |
gulp/styles.js
| ... | ... | @@ -25,11 +25,14 @@ var buildStyles = function() { |
| 25 | 25 | style: 'expanded' |
| 26 | 26 | }; |
| 27 | 27 | |
| 28 | - var injectFiles = gulp.src([ | |
| 29 | - path.join(conf.paths.src, '/app/**/*.scss'), | |
| 28 | + var srcPaths = [ | |
| 30 | 29 | path.join('!' + conf.paths.src, '/app/index.scss'), |
| 31 | 30 | path.join('!' + conf.paths.src, '/app/layout/scss/*.scss') |
| 32 | - ], { read: false }); | |
| 31 | + ]; | |
| 32 | + conf.paths.allSources.forEach(function(src) { | |
| 33 | + srcPaths.push(path.join(src, '/app/**/*.scss')); | |
| 34 | + }); | |
| 35 | + var injectFiles = gulp.src(srcPaths, { read: false }); | |
| 33 | 36 | |
| 34 | 37 | var injectOptions = { |
| 35 | 38 | transform: function(filePath) { | ... | ... |
gulp/watch.js
| ... | ... | @@ -33,7 +33,11 @@ gulp.task('watch', ['inject'], function () { |
| 33 | 33 | } |
| 34 | 34 | }); |
| 35 | 35 | |
| 36 | - gulp.watch(path.join(conf.paths.src, '/app/**/*.html'), function(event) { | |
| 36 | + var watchPaths = []; | |
| 37 | + conf.paths.allSources.forEach(function(src) { | |
| 38 | + watchPaths.push(path.join(src, '/app/**/*.html')); | |
| 39 | + }); | |
| 40 | + gulp.watch(watchPaths, function(event) { | |
| 37 | 41 | browserSync.reload(event.path); |
| 38 | 42 | }); |
| 39 | 43 | }); | ... | ... |
index.html.erb
package.json
| ... | ... | @@ -7,8 +7,12 @@ |
| 7 | 7 | "moment": "^2.11.2", |
| 8 | 8 | "ng-forward": "0.0.1-alpha.12" |
| 9 | 9 | }, |
| 10 | + "config": { | |
| 11 | + "theme": "default" | |
| 12 | + }, | |
| 10 | 13 | "scripts": { |
| 11 | - "build": "webpack; gulp clean && gulp build", | |
| 14 | + "build": "webpack; gulp clean && gulp --theme=$npm_package_config_theme build", | |
| 15 | + "build-all": "gulp clean && for d in ./themes/* ; do (gulp --theme=`basename $d` build); done", | |
| 12 | 16 | "webpack": "webpack", |
| 13 | 17 | "karma": "concurrently \"webpack -w\" \"karma start\"", |
| 14 | 18 | "docs": "gulp ngdocs; static-server docs", |
| ... | ... | @@ -19,7 +23,7 @@ |
| 19 | 23 | "test": "webpack -w --test", |
| 20 | 24 | "jenkins": "webpack && karma start --single-run", |
| 21 | 25 | "postinstall": "bower install; typings install; cd dev-scripts; typings install; cd ../; npm run fix-jqlite", |
| 22 | - "start": "concurrently \"webpack -w\" \"gulp serve\"", | |
| 26 | + "start": "concurrently \"webpack -w\" \"gulp --theme=$npm_package_config_theme serve\"", | |
| 23 | 27 | "generate-indexes": "ts-node --project ./dev-scripts ./dev-scripts/generate-index-modules.ts", |
| 24 | 28 | "fix-jqlite": "ts-node --project ./dev-scripts dev-scripts/fix-jqlite.ts" |
| 25 | 29 | }, |
| ... | ... | @@ -35,7 +39,7 @@ |
| 35 | 39 | "estraverse": "~4.1.0", |
| 36 | 40 | "expose-loader": "^0.7.1", |
| 37 | 41 | "glob": "^7.0.0", |
| 38 | - "gulp": "~3.9.0", | |
| 42 | + "gulp": "^3.9.1", | |
| 39 | 43 | "gulp-angular-filesort": "~1.1.1", |
| 40 | 44 | "gulp-angular-templatecache": "~1.8.0", |
| 41 | 45 | "gulp-autoprefixer": "~3.0.2", |
| ... | ... | @@ -75,6 +79,7 @@ |
| 75 | 79 | "karma-webpack": "^1.7.0", |
| 76 | 80 | "lodash": "~3.10.1", |
| 77 | 81 | "main-bower-files": "~2.9.0", |
| 82 | + "merge-stream": "^1.0.0", | |
| 78 | 83 | "on-build-webpack": "^0.1.0", |
| 79 | 84 | "phantomjs": "~1.9.18", |
| 80 | 85 | "phantomjs-polyfill": "0.0.2", | ... | ... |
src/app/layout/navbar/redebrasil.scss
| ... | ... | @@ -1,16 +0,0 @@ |
| 1 | -.navbar { | |
| 2 | - min-height: 123px; | |
| 3 | - background:url("../assets/images/redebrasil/bg-header.png") repeat-x; | |
| 4 | - | |
| 5 | - .container-fluid { | |
| 6 | - .navbar-brand { | |
| 7 | - .noosfero-logo { | |
| 8 | - background:url("../assets/images/redebrasil/header-home.png") no-repeat; | |
| 9 | - padding: 0px 257px 63px 15px; | |
| 10 | - } | |
| 11 | - .noosfero-name { | |
| 12 | - display: none; | |
| 13 | - } | |
| 14 | - } | |
| 15 | - } | |
| 16 | -} |
src/app/redebrasil.scss
src/assets/images/redebrasil/bg-header.png
536 Bytes
src/assets/images/redebrasil/fundo-portal.jpg
253 KB
src/assets/images/redebrasil/header-home.png
5.6 KB
| ... | ... | @@ -0,0 +1,16 @@ |
| 1 | +.navbar { | |
| 2 | + min-height: 123px; | |
| 3 | + background:url("../assets/images/redebrasil/bg-header.png") repeat-x; | |
| 4 | + | |
| 5 | + .container-fluid { | |
| 6 | + .navbar-brand { | |
| 7 | + .noosfero-logo { | |
| 8 | + background:url("../assets/images/redebrasil/header-home.png") no-repeat; | |
| 9 | + padding: 0px 257px 63px 15px; | |
| 10 | + } | |
| 11 | + .noosfero-name { | |
| 12 | + display: none; | |
| 13 | + } | |
| 14 | + } | |
| 15 | + } | |
| 16 | +} | ... | ... |
536 Bytes
253 KB
5.6 KB