Use bower for managing client side dependencies

Fixes #117
This commit is contained in:
Dmitriy Simushev 2015-03-23 16:42:32 +00:00
parent 6fb71835bf
commit b18aef404a
16 changed files with 101 additions and 750 deletions

1
.gitignore vendored
View File

@ -29,6 +29,7 @@ src/composer.lock
# Do not index third-party libraries
src/mibew/vendor
src/mibew/js/vendor
# Do not index node.js modules that are used for building
src/node_modules

4
src/.bowerrc Normal file
View File

@ -0,0 +1,4 @@
{
"directory": "./mibew/js/vendor",
"analytics": false
}

17
src/bower.json Normal file
View File

@ -0,0 +1,17 @@
{
"name": "mibew",
"private": true,
"dependencies": {
"underscore": "1.8.2",
"json": "2012.10.08",
"jquery": "1.11.2",
"backbone": "1.1.2",
"marionette": "2.4.1",
"handlebars": "3.0.0",
"vex": "2.3.2",
"validator-js": "3.34.0"
},
"resolutions": {
"underscore": "1.8.2"
}
}

View File

@ -7,6 +7,7 @@ var fs = require('fs'),
lodash = require('lodash'),
PoFile = require('pofile'),
strftime = require('strftime'),
bower = require('bower'),
gulp = require('gulp'),
uglify = require('gulp-uglify'),
concat = require('gulp-concat'),
@ -21,13 +22,15 @@ var fs = require('fs'),
gzip = require('gulp-gzip'),
chmod = require('gulp-chmod'),
xgettext = require('gulp-xgettext'),
concatPo = require('gulp-concat-po');
concatPo = require('gulp-concat-po'),
rename = require('gulp-rename');
// Set global configs.
var config = {
mibewPath: 'mibew',
configsPath: 'mibew/configs',
phpVendorPath: 'mibew/vendor',
jsVendorPath: 'mibew/js/vendor',
pluginsPath: 'mibew/plugins',
avatarsPath: 'mibew/files/avatar',
cachePath: 'mibew/cache',
@ -98,6 +101,45 @@ gulp.task('composer-install-dev', ['get-composer'], function(callback) {
});
});
// Installs bower dependencies
gulp.task('bower-install', function(callback) {
bower.commands.install([], {}, {})
.on('error', function(error) {
callback(error);
})
.on('end', function() {
// We should manually minify JavaScript files that was not minified
// by bower packages' authors.
// TODO: This is a temproary workaround and should be removed once
// the packages will be fixed.
var stream = eventStream.merge(
gulp.src(config.jsVendorPath + '/backbone/backbone.js', {base: config.jsVendorPath})
.pipe(uglify({preserveComments: 'some'}))
// There are neither "@license" tag nor "!preserve" in the
// header. Add the header manually.
.pipe(header(
"// Backbone.js 1.1.2\n"
+ "// (c) 2010-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n"
+ "// Backbone may be freely distributed under the MIT license.\n"
+ "// For all details and documentation:\n"
+ "// http://backbonejs.org\n"
))
.pipe(rename('backbone/backbone-min.js')),
gulp.src(config.jsVendorPath + '/json/json2.js', {base: config.jsVendorPath})
.pipe(uglify({preserveComments: 'some'}))
// There are neither "@license" tag nor "!preserve" in the
// header. Add the header manually.
.pipe(header("// json2.js. Public Domain. See http://www.JSON.org/js.html\n"))
.pipe(rename('json/json2.min.js'))
);
stream.pipe(gulp.dest(config.jsVendorPath));
stream
.on('error', callback)
.on('end', callback);
});
});
// Compile all JavaScript files of the Mibew Core
gulp.task('js', function() {
return eventStream.merge(
@ -214,7 +256,7 @@ gulp.task('generate-pot', function() {
});
// Pack sources to .zip and .tar.gz archives.
gulp.task('pack-sources', ['composer-install'], function() {
gulp.task('pack-sources', ['composer-install', 'bower-install'], function() {
var sources = [
config.mibewPath + '/**/*',
// Exclude user's config
@ -232,7 +274,29 @@ gulp.task('pack-sources', ['composer-install'], function() {
// Exclude vendors binaries
'!' + config.phpVendorPath + '/bin/**/*',
// Exclude JavaScript sources
'!' + config.jsPath + '/source/**/*'
'!' + config.jsPath + '/source/**/*',
// Actually we does not need backbone.babysitter and backbone.wreqr
// dependencies because they embed into marionette.js. So we exclude
// "backbone.babysitter" and "backbone.wreqr" directories and all their
// contents.
'!' + config.jsVendorPath + '/backbone.babysitter{,/**}',
'!' + config.jsVendorPath + '/backbone.wreqr{,/**}',
// Exclude dot files within third-party JS libraries.
'!' + config.jsVendorPath + '/**/.*',
// Exclude config files of various package systems
'!' + config.jsVendorPath + '/**/{bower,component,package,composer}.json',
// Exclude config files of various build systems
'!' + config.jsVendorPath + '/**/Gruntfile.*',
'!' + config.jsVendorPath + '/**/gulpfile.*',
'!' + config.jsVendorPath + '/**/Makefile',
// Exclude HTML files from third-party JS libraries. Such files can be
// used for docs or for tests, we need none of them.
'!' + config.jsVendorPath + '/**/*.html',
// There are too many useless files in Vex.js library. Exclude them.
'!' + config.jsVendorPath + '/vex/sass{,/**}',
'!' + config.jsVendorPath + '/vex/docs{,/**}',
'!' + config.jsVendorPath + '/vex/docs{,/**}',
'!' + config.jsVendorPath + '/vex/coffee{,/**}'
];
var srcOptions = {
// Dot files (.htaccess, .keep, etc.) must be included in the package.

View File

@ -1,388 +0,0 @@
@keyframes vex-flyin {
0% {
opacity: 0;
transform: translateY(-40px);
-webkit-transform: translateY(-40px);
-moz-transform: translateY(-40px);
-ms-transform: translateY(-40px);
-o-transform: translateY(-40px); }
100% {
opacity: 1;
transform: translateY(0);
-webkit-transform: translateY(0);
-moz-transform: translateY(0);
-ms-transform: translateY(0);
-o-transform: translateY(0); } }
@-webkit-keyframes vex-flyin {
0% {
opacity: 0;
transform: translateY(-40px);
-webkit-transform: translateY(-40px);
-moz-transform: translateY(-40px);
-ms-transform: translateY(-40px);
-o-transform: translateY(-40px); }
100% {
opacity: 1;
transform: translateY(0);
-webkit-transform: translateY(0);
-moz-transform: translateY(0);
-ms-transform: translateY(0);
-o-transform: translateY(0); } }
@-moz-keyframes vex-flyin {
0% {
opacity: 0;
transform: translateY(-40px);
-webkit-transform: translateY(-40px);
-moz-transform: translateY(-40px);
-ms-transform: translateY(-40px);
-o-transform: translateY(-40px); }
100% {
opacity: 1;
transform: translateY(0);
-webkit-transform: translateY(0);
-moz-transform: translateY(0);
-ms-transform: translateY(0);
-o-transform: translateY(0); } }
@-ms-keyframes vex-flyin {
0% {
opacity: 0;
transform: translateY(-40px);
-webkit-transform: translateY(-40px);
-moz-transform: translateY(-40px);
-ms-transform: translateY(-40px);
-o-transform: translateY(-40px); }
100% {
opacity: 1;
transform: translateY(0);
-webkit-transform: translateY(0);
-moz-transform: translateY(0);
-ms-transform: translateY(0);
-o-transform: translateY(0); } }
@-o-keyframes vex-flyin {
0% {
opacity: 0;
transform: translateY(-40px);
-webkit-transform: translateY(-40px);
-moz-transform: translateY(-40px);
-ms-transform: translateY(-40px);
-o-transform: translateY(-40px); }
100% {
opacity: 1;
transform: translateY(0);
-webkit-transform: translateY(0);
-moz-transform: translateY(0);
-ms-transform: translateY(0);
-o-transform: translateY(0); } }
@keyframes vex-flyout {
0% {
opacity: 1;
transform: translateY(0);
-webkit-transform: translateY(0);
-moz-transform: translateY(0);
-ms-transform: translateY(0);
-o-transform: translateY(0); }
100% {
opacity: 0;
transform: translateY(-40px);
-webkit-transform: translateY(-40px);
-moz-transform: translateY(-40px);
-ms-transform: translateY(-40px);
-o-transform: translateY(-40px); } }
@-webkit-keyframes vex-flyout {
0% {
opacity: 1;
transform: translateY(0);
-webkit-transform: translateY(0);
-moz-transform: translateY(0);
-ms-transform: translateY(0);
-o-transform: translateY(0); }
100% {
opacity: 0;
transform: translateY(-40px);
-webkit-transform: translateY(-40px);
-moz-transform: translateY(-40px);
-ms-transform: translateY(-40px);
-o-transform: translateY(-40px); } }
@-moz-keyframes vex-flyout {
0% {
opacity: 1;
transform: translateY(0);
-webkit-transform: translateY(0);
-moz-transform: translateY(0);
-ms-transform: translateY(0);
-o-transform: translateY(0); }
100% {
opacity: 0;
transform: translateY(-40px);
-webkit-transform: translateY(-40px);
-moz-transform: translateY(-40px);
-ms-transform: translateY(-40px);
-o-transform: translateY(-40px); } }
@-ms-keyframes vex-flyout {
0% {
opacity: 1;
transform: translateY(0);
-webkit-transform: translateY(0);
-moz-transform: translateY(0);
-ms-transform: translateY(0);
-o-transform: translateY(0); }
100% {
opacity: 0;
transform: translateY(-40px);
-webkit-transform: translateY(-40px);
-moz-transform: translateY(-40px);
-ms-transform: translateY(-40px);
-o-transform: translateY(-40px); } }
@-o-keyframes vex-flyout {
0% {
opacity: 1;
transform: translateY(0);
-webkit-transform: translateY(0);
-moz-transform: translateY(0);
-ms-transform: translateY(0);
-o-transform: translateY(0); }
100% {
opacity: 0;
transform: translateY(-40px);
-webkit-transform: translateY(-40px);
-moz-transform: translateY(-40px);
-ms-transform: translateY(-40px);
-o-transform: translateY(-40px); } }
@keyframes vex-pulse {
0% {
-moz-box-shadow: inset 0 0 0 300px transparent;
-webkit-box-shadow: inset 0 0 0 300px transparent;
box-shadow: inset 0 0 0 300px transparent; }
70% {
-moz-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
-webkit-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25); }
100% {
-moz-box-shadow: inset 0 0 0 300px transparent;
-webkit-box-shadow: inset 0 0 0 300px transparent;
box-shadow: inset 0 0 0 300px transparent; } }
@-webkit-keyframes vex-pulse {
0% {
-moz-box-shadow: inset 0 0 0 300px transparent;
-webkit-box-shadow: inset 0 0 0 300px transparent;
box-shadow: inset 0 0 0 300px transparent; }
70% {
-moz-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
-webkit-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25); }
100% {
-moz-box-shadow: inset 0 0 0 300px transparent;
-webkit-box-shadow: inset 0 0 0 300px transparent;
box-shadow: inset 0 0 0 300px transparent; } }
@-moz-keyframes vex-pulse {
0% {
-moz-box-shadow: inset 0 0 0 300px transparent;
-webkit-box-shadow: inset 0 0 0 300px transparent;
box-shadow: inset 0 0 0 300px transparent; }
70% {
-moz-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
-webkit-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25); }
100% {
-moz-box-shadow: inset 0 0 0 300px transparent;
-webkit-box-shadow: inset 0 0 0 300px transparent;
box-shadow: inset 0 0 0 300px transparent; } }
@-ms-keyframes vex-pulse {
0% {
-moz-box-shadow: inset 0 0 0 300px transparent;
-webkit-box-shadow: inset 0 0 0 300px transparent;
box-shadow: inset 0 0 0 300px transparent; }
70% {
-moz-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
-webkit-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25); }
100% {
-moz-box-shadow: inset 0 0 0 300px transparent;
-webkit-box-shadow: inset 0 0 0 300px transparent;
box-shadow: inset 0 0 0 300px transparent; } }
@-o-keyframes vex-pulse {
0% {
-moz-box-shadow: inset 0 0 0 300px transparent;
-webkit-box-shadow: inset 0 0 0 300px transparent;
box-shadow: inset 0 0 0 300px transparent; }
70% {
-moz-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
-webkit-box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25);
box-shadow: inset 0 0 0 300px rgba(255, 255, 255, 0.25); }
100% {
-moz-box-shadow: inset 0 0 0 300px transparent;
-webkit-box-shadow: inset 0 0 0 300px transparent;
box-shadow: inset 0 0 0 300px transparent; } }
.vex.vex-theme-default {
padding-top: 160px;
padding-bottom: 160px; }
.vex.vex-theme-default.vex-closing .vex-content {
animation: vex-flyout 0.5s;
-webkit-animation: vex-flyout 0.5s;
-moz-animation: vex-flyout 0.5s;
-ms-animation: vex-flyout 0.5s;
-o-animation: vex-flyout 0.5s;
-webkit-backface-visibility: hidden; }
.vex.vex-theme-default .vex-content {
animation: vex-flyin 0.5s;
-webkit-animation: vex-flyin 0.5s;
-moz-animation: vex-flyin 0.5s;
-ms-animation: vex-flyin 0.5s;
-o-animation: vex-flyin 0.5s;
-webkit-backface-visibility: hidden; }
.vex.vex-theme-default .vex-content {
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
border-radius: 5px;
font-family: "Helvetica Neue", sans-serif;
background: #f0f0f0;
color: #444;
padding: 1em;
position: relative;
margin: 0 auto;
max-width: 100%;
width: 450px;
font-size: 1.1em;
line-height: 1.5em; }
.vex.vex-theme-default .vex-content h1, .vex.vex-theme-default .vex-content h2, .vex.vex-theme-default .vex-content h3, .vex.vex-theme-default .vex-content h4, .vex.vex-theme-default .vex-content h5, .vex.vex-theme-default .vex-content h6, .vex.vex-theme-default .vex-content p, .vex.vex-theme-default .vex-content ul, .vex.vex-theme-default .vex-content li {
color: inherit; }
.vex.vex-theme-default .vex-close {
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
border-radius: 5px;
position: absolute;
top: 0;
right: 0;
cursor: pointer; }
.vex.vex-theme-default .vex-close:before {
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
position: absolute;
content: "\00D7";
font-size: 26px;
font-weight: normal;
line-height: 31px;
height: 30px;
width: 30px;
text-align: center;
top: 3px;
right: 3px;
color: #bbb;
background: transparent; }
.vex.vex-theme-default .vex-close:hover:before, .vex.vex-theme-default .vex-close:active:before {
color: #777;
background: #e0e0e0; }
.vex.vex-theme-default .vex-dialog-form .vex-dialog-message {
margin-bottom: 0.5em; }
.vex.vex-theme-default .vex-dialog-form .vex-dialog-input {
margin-bottom: 1em; }
.vex.vex-theme-default .vex-dialog-form .vex-dialog-input textarea, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="date"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="datetime"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="datetime-local"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="email"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="month"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="number"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="password"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="search"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="tel"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="text"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="time"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="url"], .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="week"] {
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
background: #fff;
width: 100%;
padding: 0.25em 0.67em;
border: 0;
font-family: inherit;
font-weight: inherit;
font-size: inherit;
min-height: 2.5em;
margin: 0 0 0.25em; }
.vex.vex-theme-default .vex-dialog-form .vex-dialog-input textarea:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="date"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="datetime"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="datetime-local"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="email"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="month"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="number"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="password"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="search"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="tel"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="text"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="time"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="url"]:focus, .vex.vex-theme-default .vex-dialog-form .vex-dialog-input input[type="week"]:focus {
-moz-box-shadow: inset 0 0 0 2px #8dbdf1;
-webkit-box-shadow: inset 0 0 0 2px #8dbdf1;
box-shadow: inset 0 0 0 2px #8dbdf1;
outline: none; }
.vex.vex-theme-default .vex-dialog-form .vex-dialog-buttons {
*zoom: 1; }
.vex.vex-theme-default .vex-dialog-form .vex-dialog-buttons:after {
content: "";
display: table;
clear: both; }
.vex.vex-theme-default .vex-dialog-button {
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius: 3px;
border: 0;
float: right;
margin: 0 0 0 0.5em;
font-family: inherit;
text-transform: uppercase;
letter-spacing: 0.1em;
font-size: 0.8em;
line-height: 1em;
padding: 0.75em 2em; }
.vex.vex-theme-default .vex-dialog-button.vex-last {
margin-left: 0; }
.vex.vex-theme-default .vex-dialog-button:focus {
animation: vex-pulse 1.1s infinite;
-webkit-animation: vex-pulse 1.1s infinite;
-moz-animation: vex-pulse 1.1s infinite;
-ms-animation: vex-pulse 1.1s infinite;
-o-animation: vex-pulse 1.1s infinite;
-webkit-backface-visibility: hidden;
outline: none; }
@media (max-width: 568px) {
.vex.vex-theme-default .vex-dialog-button:focus {
animation: none;
-webkit-animation: none;
-moz-animation: none;
-ms-animation: none;
-o-animation: none;
-webkit-backface-visibility: hidden; } }
.vex.vex-theme-default .vex-dialog-button.vex-dialog-button-primary {
background: #3288e6;
color: #fff; }
.vex.vex-theme-default .vex-dialog-button.vex-dialog-button-secondary {
background: #e0e0e0;
color: #777; }
.vex-loading-spinner.vex-theme-default {
-moz-box-shadow: 0 0 0 0.5em #f0f0f0, 0 0 1px 0.5em rgba(0, 0, 0, 0.3);
-webkit-box-shadow: 0 0 0 0.5em #f0f0f0, 0 0 1px 0.5em rgba(0, 0, 0, 0.3);
box-shadow: 0 0 0 0.5em #f0f0f0, 0 0 1px 0.5em rgba(0, 0, 0, 0.3);
-moz-border-radius: 100%;
-webkit-border-radius: 100%;
border-radius: 100%;
background: #f0f0f0;
border: 0.2em solid transparent;
border-top-color: #bbb;
top: -1.1em;
bottom: auto; }

View File

@ -1,248 +0,0 @@
@keyframes vex-fadein {
0% {
opacity: 0; }
100% {
opacity: 1; } }
@-webkit-keyframes vex-fadein {
0% {
opacity: 0; }
100% {
opacity: 1; } }
@-moz-keyframes vex-fadein {
0% {
opacity: 0; }
100% {
opacity: 1; } }
@-ms-keyframes vex-fadein {
0% {
opacity: 0; }
100% {
opacity: 1; } }
@-o-keyframes vex-fadein {
0% {
opacity: 0; }
100% {
opacity: 1; } }
@keyframes vex-fadeout {
0% {
opacity: 1; }
100% {
opacity: 0; } }
@-webkit-keyframes vex-fadeout {
0% {
opacity: 1; }
100% {
opacity: 0; } }
@-moz-keyframes vex-fadeout {
0% {
opacity: 1; }
100% {
opacity: 0; } }
@-ms-keyframes vex-fadeout {
0% {
opacity: 1; }
100% {
opacity: 0; } }
@-o-keyframes vex-fadeout {
0% {
opacity: 1; }
100% {
opacity: 0; } }
@keyframes vex-rotation {
0% {
transform: rotate(0deg);
-webkit-transform: rotate(0deg);
-moz-transform: rotate(0deg);
-ms-transform: rotate(0deg);
-o-transform: rotate(0deg); }
100% {
transform: rotate(359deg);
-webkit-transform: rotate(359deg);
-moz-transform: rotate(359deg);
-ms-transform: rotate(359deg);
-o-transform: rotate(359deg); } }
@-webkit-keyframes vex-rotation {
0% {
transform: rotate(0deg);
-webkit-transform: rotate(0deg);
-moz-transform: rotate(0deg);
-ms-transform: rotate(0deg);
-o-transform: rotate(0deg); }
100% {
transform: rotate(359deg);
-webkit-transform: rotate(359deg);
-moz-transform: rotate(359deg);
-ms-transform: rotate(359deg);
-o-transform: rotate(359deg); } }
@-moz-keyframes vex-rotation {
0% {
transform: rotate(0deg);
-webkit-transform: rotate(0deg);
-moz-transform: rotate(0deg);
-ms-transform: rotate(0deg);
-o-transform: rotate(0deg); }
100% {
transform: rotate(359deg);
-webkit-transform: rotate(359deg);
-moz-transform: rotate(359deg);
-ms-transform: rotate(359deg);
-o-transform: rotate(359deg); } }
@-ms-keyframes vex-rotation {
0% {
transform: rotate(0deg);
-webkit-transform: rotate(0deg);
-moz-transform: rotate(0deg);
-ms-transform: rotate(0deg);
-o-transform: rotate(0deg); }
100% {
transform: rotate(359deg);
-webkit-transform: rotate(359deg);
-moz-transform: rotate(359deg);
-ms-transform: rotate(359deg);
-o-transform: rotate(359deg); } }
@-o-keyframes vex-rotation {
0% {
transform: rotate(0deg);
-webkit-transform: rotate(0deg);
-moz-transform: rotate(0deg);
-ms-transform: rotate(0deg);
-o-transform: rotate(0deg); }
100% {
transform: rotate(359deg);
-webkit-transform: rotate(359deg);
-moz-transform: rotate(359deg);
-ms-transform: rotate(359deg);
-o-transform: rotate(359deg); } }
.vex, .vex *, .vex *:before, .vex *:after {
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box; }
.vex {
position: fixed;
overflow: auto;
-webkit-overflow-scrolling: touch;
z-index: 1111;
top: 0;
right: 0;
bottom: 0;
left: 0; }
.vex-scrollbar-measure {
position: absolute;
top: -9999px;
width: 50px;
height: 50px;
overflow: scroll; }
.vex-overlay {
background: #000;
filter: alpha(opacity=40);
/* IE 57 */
-ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)";
/* IE 8 */ }
.vex-overlay {
animation: vex-fadein 0.5s;
-webkit-animation: vex-fadein 0.5s;
-moz-animation: vex-fadein 0.5s;
-ms-animation: vex-fadein 0.5s;
-o-animation: vex-fadein 0.5s;
-webkit-backface-visibility: hidden;
position: fixed;
background: rgba(0, 0, 0, 0.4);
top: 0;
right: 0;
bottom: 0;
left: 0; }
.vex.vex-closing .vex-overlay {
animation: vex-fadeout 0.5s;
-webkit-animation: vex-fadeout 0.5s;
-moz-animation: vex-fadeout 0.5s;
-ms-animation: vex-fadeout 0.5s;
-o-animation: vex-fadeout 0.5s;
-webkit-backface-visibility: hidden; }
.vex-content {
animation: vex-fadein 0.5s;
-webkit-animation: vex-fadein 0.5s;
-moz-animation: vex-fadein 0.5s;
-ms-animation: vex-fadein 0.5s;
-o-animation: vex-fadein 0.5s;
-webkit-backface-visibility: hidden;
background: #fff; }
.vex.vex-closing .vex-content {
animation: vex-fadeout 0.5s;
-webkit-animation: vex-fadeout 0.5s;
-moz-animation: vex-fadeout 0.5s;
-ms-animation: vex-fadeout 0.5s;
-o-animation: vex-fadeout 0.5s;
-webkit-backface-visibility: hidden; }
.vex-close:before {
font-family: Arial, sans-serif;
content: "\00D7"; }
.vex-dialog-form {
margin: 0; }
.vex-dialog-button {
text-rendering: optimizeLegibility;
-moz-appearance: none;
-webkit-appearance: none;
cursor: pointer;
-webkit-tap-highlight-color: transparent; }
.vex-loading-spinner {
animation: vex-rotation 0.7s linear infinite;
-webkit-animation: vex-rotation 0.7s linear infinite;
-moz-animation: vex-rotation 0.7s linear infinite;
-ms-animation: vex-rotation 0.7s linear infinite;
-o-animation: vex-rotation 0.7s linear infinite;
-webkit-backface-visibility: hidden;
-moz-box-shadow: 0 0 1em rgba(0, 0, 0, 0.1);
-webkit-box-shadow: 0 0 1em rgba(0, 0, 0, 0.1);
box-shadow: 0 0 1em rgba(0, 0, 0, 0.1);
position: fixed;
z-index: 1112;
margin: auto;
top: 0;
right: 0;
bottom: 0;
left: 0;
height: 2em;
width: 2em;
background: #fff; }
body.vex-open {
overflow: hidden; }

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,13 +0,0 @@
/*
json2.js
2011-10-19
Public Domain.
See http://www.JSON.org/js.html
*/
var JSON;JSON||(JSON={});
(function(){function k(a){return 10>a?"0"+a:a}function o(a){p.lastIndex=0;return p.test(a)?'"'+a.replace(p,function(a){var c=r[a];return"string"===typeof c?c:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function m(a,j){var c,d,h,n,g=e,f,b=j[a];b&&("object"===typeof b&&"function"===typeof b.toJSON)&&(b=b.toJSON(a));"function"===typeof i&&(b=i.call(j,a,b));switch(typeof b){case "string":return o(b);case "number":return isFinite(b)?String(b):"null";case "boolean":case "null":return String(b);case "object":if(!b)return"null";
e+=l;f=[];if("[object Array]"===Object.prototype.toString.apply(b)){n=b.length;for(c=0;c<n;c+=1)f[c]=m(c,b)||"null";h=0===f.length?"[]":e?"[\n"+e+f.join(",\n"+e)+"\n"+g+"]":"["+f.join(",")+"]";e=g;return h}if(i&&"object"===typeof i){n=i.length;for(c=0;c<n;c+=1)"string"===typeof i[c]&&(d=i[c],(h=m(d,b))&&f.push(o(d)+(e?": ":":")+h))}else for(d in b)Object.prototype.hasOwnProperty.call(b,d)&&(h=m(d,b))&&f.push(o(d)+(e?": ":":")+h);h=0===f.length?"{}":e?"{\n"+e+f.join(",\n"+e)+"\n"+g+"}":"{"+f.join(",")+
"}";e=g;return h}}"function"!==typeof Date.prototype.toJSON&&(Date.prototype.toJSON=function(){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+k(this.getUTCMonth()+1)+"-"+k(this.getUTCDate())+"T"+k(this.getUTCHours())+":"+k(this.getUTCMinutes())+":"+k(this.getUTCSeconds())+"Z":null},String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(){return this.valueOf()});var q=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
p=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,e,l,r={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},i;"function"!==typeof JSON.stringify&&(JSON.stringify=function(a,j,c){var d;l=e="";if(typeof c==="number")for(d=0;d<c;d=d+1)l=l+" ";else typeof c==="string"&&(l=c);if((i=j)&&typeof j!=="function"&&(typeof j!=="object"||typeof j.length!=="number"))throw Error("JSON.stringify");return m("",{"":a})});
"function"!==typeof JSON.parse&&(JSON.parse=function(a,e){function c(a,d){var g,f,b=a[d];if(b&&typeof b==="object")for(g in b)if(Object.prototype.hasOwnProperty.call(b,g)){f=c(b,g);f!==void 0?b[g]=f:delete b[g]}return e.call(a,d,b)}var d,a=String(a);q.lastIndex=0;q.test(a)&&(a=a.replace(q,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)}));if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
"]").replace(/(?:^|:|,)(?:\s*\[)+/g,""))){d=eval("("+a+")");return typeof e==="function"?c({"":d},""):d}throw new SyntaxError("JSON.parse");})})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -226,21 +226,21 @@ abstract class AbstractController implements
public function render($template, array $parameters = array())
{
// Attach all default css files
$this->getAssetManager()->attachCss('css/vex.css', AssetManagerInterface::RELATIVE_URL, -1000);
$this->getAssetManager()->attachCss('css/vex-theme-default.css', AssetManagerInterface::RELATIVE_URL, -1000);
$this->getAssetManager()->attachCss('js/vendor/vex/css/vex.css', AssetManagerInterface::RELATIVE_URL, -1000);
$this->getAssetManager()->attachCss('js/vendor/vex/css/vex-theme-default.css', AssetManagerInterface::RELATIVE_URL, -1000);
// Attach all needed JavaScript files. This is done here to decouple
// templates and JavaScript applications.
$assets = array(
// External libs
'js/libs/jquery.min.js',
'js/libs/json2.js',
'js/libs/underscore-min.js',
'js/libs/backbone-min.js',
'js/libs/backbone.marionette.min.js',
'js/libs/handlebars.min.js',
'js/libs/vex.combined.min.js',
'js/libs/validator.min.js',
'js/vendor/jquery/dist/jquery.min.js',
'js/vendor/json/json2.min.js',
'js/vendor/underscore/underscore-min.js',
'js/vendor/backbone/backbone-min.js',
'js/vendor/marionette/lib/backbone.marionette.min.js',
'js/vendor/handlebars/handlebars.min.js',
'js/vendor/vex/js/vex.combined.min.js',
'js/vendor/validator-js/validator.min.js',
// Client side templates
$this->getStyle()->getFilesPath() . '/templates_compiled/client_side/templates.js',
// Default client side application files

View File

@ -14,6 +14,8 @@
"gulp-chmod": "~1.2.0",
"gulp-xgettext": "~0.2.1",
"gulp-concat-po": "~0.1.0",
"gulp-rename": "~1.2.0",
"bower": "~1.3.12",
"handlebars": "~3.0.0",
"run-sequence": "~1.0.2",
"through2": "~0.6.3",