/*!
* Grunt
* $ npm install grunt-contrib-uglify grunt-autoprefixer grunt-contrib-cssmin grunt-contrib-imagemin grunt-contrib-sass grunt-contrib-watch grunt-contrib-concat grunt-contrib-clean grunt-contrib-jshint grunt-notify --save-dev
*/
module.exports = function(grunt) {
grunt.initConfig({
// Sass
sass: {
dist: {
options: {
style: 'expanded'
},
files: {
'dist/styles/main.css': 'src/styles/main.scss'
}
}
},
// Autoprefix
autoprefixer: {
options: {
browsers: [
'last 2 version'
]
},
dist: {
src: 'dist/styles/main.css'
}
},
// CSS minify
cssmin: {
dist: {
files: {
'dist/styles/main.min.css': 'dist/styles/main.css'
}
}
},
// JShint
jshint: {
files: ['src/scripts/**/*.js'],
options: {
jshintrc: '.jshintrc'
}
},
// Concat
concat: {
js: {
src: ['src/scripts/**/*.js'],
dest: 'dist/scripts/main.js'
},
},
// Uglify
uglify: {
dist: {
src: 'dist/scripts/main.js',
dest: 'dist/scripts/main.min.js'
},
},
// Imagemin
imagemin: {
dist: {
options: {
optimizationLevel: 3,
progressive: true,
interlaced: true
},
files: [{
expand: true,
cwd: 'src/images',
src: ['**/*.{png,jpg,gif}'],
dest: 'dist/images'
}]
}
},
// Clean
clean: {
build: ['dist/styles', 'dist/scripts', 'dist/images']
},
// Notify
notify: {
styles: {
options: {
message: 'Styles task complete',
}
},
scripts: {
options: {
message: 'Scripts task complete',
}
},
images: {
options: {
message: 'Images task complete',
}
},
},
// Watch
watch: {
styles: {
files: 'src/styles/**/*.scss',
tasks: ['sass', 'autoprefixer', 'cssmin', 'notify:styles'],
},
scripts: {
files: 'src/scripts/**/*.js',
tasks: ['concat', 'uglify', 'notify:scripts'],
},
images: {
files: 'src/images/**/*',
tasks: ['imagemin', 'notify:images'],
},
livereload: {
options: { livereload: true },
files: [
'dist/styles/**/*.css',
'dist/scripts/**/*.js',
'dist/images/**/*'
]
}
}
});
// Default task
grunt.registerTask('default', [
'jshint',
'clean',
'concat',
'uglify',
'sass',
'autoprefixer',
'cssmin',
'imagemin'
]);
// Load plugins
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-autoprefixer');
grunt.loadNpmTasks('grunt-contrib-cssmin');
grunt.loadNpmTasks('grunt-contrib-sass');
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-imagemin');
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-notify');
};
$this->user->login(new Nette\Security\Identity($row["id"], array(), $row));
$this->redirectUrl($this->link('@homepage'));
public function downloadFile($source, $fileName){
$httpResponse = $this->context->getService('httpResponse');
$httpResponse->setHeader('Pragma', "public");
$httpResponse->setHeader('Expires', 0);
$httpResponse->setHeader('Cache-Control', "must-revalidate, post-check=0, pre-check=0");
$httpResponse->setHeader('Content-Transfer-Encoding', "binary");
$httpResponse->setHeader('Content-Description', "File Transfer");
$httpResponse->setHeader('Content-Length', filesize($source));
$this->sendResponse(new FileResponse($source, $fileName));
}
public function handleQrCodeDownload($hash, $id)
{
$user = $this->model->find($id);
if ($hash !== sha1($user->id . $user->slug))
{
$this->error();
}
// lepsi cesta k souboru? http://forum.nette.org/cs/21269-fileresponse-soubor-neexistuje#p145741
$userWebalize = Nette\Utils\Strings::webalize($user->firstname . '-' . $user->lastname);
$response = new Nette\Application\Responses\FileResponse(WWW_DIR.'/storage/images/200x200/'.$hash.'.png', 'qr-'.$userWebalize.'.png');
$this->sendResponse($response);
}
// https://forum.nette.org/cs/21269-fileresponse-soubor-neexistuje#p145741
I'm trying to make a horizontal rainbow stripe background gradient mixin, but I feel like this is way too verbose. How can it be better?
Goals:
// You could set individual variables for each color as well.
// You would still pass them all as a single argument,
// or join them into a single variable before passing, as you see fit.
$mycolors: red orange yellow green blue indigo violet;
// Returns a striped gradient for use anywhere gradients are accepted.
// - $position: the starting position or angle of the gradient.
// - $colors: a list of all the colors to be used.
@function rainbow($position, $colors) {
$colors: if(type-of($colors) != 'list', compact($colors), $colors);
$gradient: compact();
$width: 100% / length($colors);
@for $i from 1 through length($colors) {
$pop: nth($colors,$i);
$new: $pop ($width * ($i - 1)), $pop ($width * $i);
$gradient: join($gradient, $new, comma);
}
@return linear-gradient($position, $gradient);
}
.rainbow {
@include background-image(rainbow(left, $colors));
}
<select id="from" style="float: left; width: 200px;" multiple>
<option value="1">AA</option>
<option value="2">BB</option>
<option value="3">CC</option>
<option value="4">DD</option>
<option value="5">EE</option>
</select>
<button style="float: left; margin-left: 10px; margin-right: 10px;" id="a">></button>
<button style="float: left; margin-left: 10px; margin-right: 10px;" id="b"><</button>
<select id="to" style="float: left; width: 200px;" multiple></select>
<script>
var $from = $("#from");
var $to = $("#to");
$("#a").click(function(){
moveOptions($from, $to);
});
$("#b").click(function(){
moveOptions($to, $from);
});
function moveOptions(from, to)
{
$("option:selected", from).appendTo(to);
var x = $("#from option").sort(function(a, b){
a = a.value;
b = b.value;
return a-b;
});
var y = $("#to option").sort(function(a, b){
a = a.value;
b = b.value;
return a-b;
});
$("#from").html(x);
$("#to").html(y);
}
</script>
var log = {
target: $("#message"),
pridej: function(text){
this.target.append(text + "<br />");
},
clear: function()
{
this.target.empty()
}
};
var pozdrav = (function(){
var target = $("#message");
var pridej = function(text){
target.append(text + "<br />");
};
var clear = function()
{
target.empty();
};
return {
x: pridej,
clear: clear
};
})();
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>TEST</title>
<script src="jquery.js"></script>
<style>
</style>
</head>
<body>
<div id="result"></div>
<button id="button1" data-color="red">Červené</button>
<button id="button2" data-color="green">Zelené</button>
<script>
//------------------------------------------------------------
//1 zpusob - data atribut
$('button').on('click', function(){
$("#result").text($(this).text()).css("color", $(this).data('color'));
});
//------------------------------------------------------------
//2 zpusob - vlastni funkci
var handler = function(text, color) {
$("#result").text(text).css("color", color);
};
$('#button1').on('click', function(){
handler('Červené', 'red'); // misto Červené muzu pouzit $(this).text(), ale demonstruji ukazku parametru viz dale
});
$('#button2').on('click', function(){
handler('Zelené', 'green'); // misto Červené muzu pouzit $(this).text(), ale demonstruji ukazku parametru viz dale
});
//------------------------------------------------------------
//3 zpusob - vlastni funkci ale ne pomoci anonymni, ale trosku ugly
var handler = function(text, color) {
return function() {
$("#result").text(text).css("color", color);
}
};
$('#button1').on('click', handler('Červené', 'red'));
$('#button2').on('click', handler('Zelené', 'green'));
//------------------------------------------------------------
//4 zpusob pres user data / bindovani / trigger
$("button").on("setColor", function(e, color, txt){
$("#result").text(txt).css("color", color);
});
$("#button1").on("click", function(){
$(this).trigger("setColor", ['red', 'Červené']);
});
$("#button2").on("click", function(){
$(this).trigger("setColor", ['green', 'Zelené']);
});
//------------------------------------------------------------
//5 event data
var handler = function(e) {
$("#result").text(e.data.text).css("color", e.data.color);
};
$("#button1").on("click", {text:'Červené', color:'red'}, handler);
$("#button2").on("click", {text:'Zelené', color:'green'}, handler);
//------------------------------------------------------------
// 6 event, ale ne v data ale rovnou do e.nazev
$("#button1").on("click", function(e){
$("#result").text(e.text).css("color", e.color);
});
$("#button1").trigger({type:'click', text:'Červené', color:'red'});
//------------------------------------------------------------
// 7 $.event object, vlastni data soucasti eventu, @link: https://jsbin.com/memoriyate/edit?html,js
$('body').on('logged logged2', function(e) {
console.log(e);
});
// 1 moznost
var event = jQuery.Event( "logged" );
event.user1 = "a";
event.pass1 = "b";
$( "body" ).trigger( event );
// 2 moznost
$( "body" ).trigger({
type:"logged2",
user:"a2",
pass:"b2"
});
</script>
</body>
</html>
(function( $ ){
$.nette.init();
// simple function
$.extend( {
swapArticleMaskClasses: function(obj, classAttr)
{
if (obj.hasClass(classAttr))
{
obj.removeClass(classAttr).addClass(classAttr + '--');
}
},
swapArticleMaskClassesRevert: function(obj, classAttr)
{
if (obj.hasClass(classAttr + '--'))
{
obj.removeClass(classAttr + '--').addClass(classAttr);
}
},
exists: function(selector) {
return ($(selector).length > 0);
}
});
// jqury fn
$.fn.extend({
swapClass: function(class1, class2) {
return this.each(function() {
var $element = $(this);
if ($element.hasClass(class1)) {
$element.removeClass(class1).addClass(class2);
}
else if ($element.hasClass(class2)) {
$element.removeClass(class2).addClass(class1);
}
});
},
// simplier way if ( $('#myDiv')[0] ) ;)
exists: function() {
return ($(this).length > 0);
},
hasParent: function(a) {
return this.filter(function() {
return !!$(this).closest(a).length;
});
}
});
})( jQuery );