s||a=b.length;return k.i=b.length-1,furthestChar:b[k.i]}},k}},{"./chunker":36}],38:[function(a,b,c){var d=a("../less-error"),e=a("../tree"),f=a("../visitors"),g=a("./parser-input"),h=a("../utils"),i=function j(a,b,c){function i(a,e){throw new d({index:o.i,filename:c.filename,type:e||"Syntax",message:a},b)}function k(a,b,c){var d=a instanceof Function?a.call(n):o.$re(a);return d?d:void i(b||("string"==typeof a?"expected '"+a+"' got '"+o.currentChar()+"'":"unexpected token"))}function l(a,b){return o.$char(a)?a:void i(b||"expected '"+a+"' got '"+o.currentChar()+"'")}function m(a){var b=c.filename;return{lineNumber:h.getLocation(a,o.getInput()).line+1,fileName:b}}var n,o=g();return{parse:function(g,h,i){var k,l,m,n,p=null,q="";if(l=i&&i.globalVars?j.serializeVars(i.globalVars)+"\n":"",m=i&&i.modifyVars?"\n"+j.serializeVars(i.modifyVars):"",a.pluginManager)for(var r=a.pluginManager.getPreProcessors(),s=0;s1&&(b=new e.Value(g)),d.push(b),g=[])}return o.forget(),a?d:f},literal:function(){return this.dimension()||this.color()||this.quoted()||this.unicodeDescriptor()},assignment:function(){var a,b;return o.save(),(a=o.$re(/^\w+(?=\s?=)/i))&&o.$char("=")&&(b=n.entity())?(o.forget(),new e.Assignment(a,b)):void o.restore()},url:function(){var a,b=o.i;return o.autoCommentAbsorb=!1,o.$str("url(")?(a=this.quoted()||this.variable()||o.$re(/^(?:(?:\\[\(\)'"])|[^\(\)'"])+/)||"",o.autoCommentAbsorb=!0,l(")"),new e.URL(null!=a.value||a instanceof e.Variable?a:new e.Anonymous(a),b,c)):void(o.autoCommentAbsorb=!0)},variable:function(){var a,b=o.i;if("@"===o.currentChar()&&(a=o.$re(/^@@?[\w-]+/)))return new e.Variable(a,b,c)},variableCurly:function(){var a,b=o.i;if("@"===o.currentChar()&&(a=o.$re(/^@\{([\w-]+)\}/)))return new e.Variable("@"+a[1],b,c)},color:function(){var a;if("#"===o.currentChar()&&(a=o.$re(/^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})/))){var b=a.input.match(/^#([\w]+).*/);return b=b[1],b.match(/^[A-Fa-f0-9]+$/)||i("Invalid HEX color code"),new e.Color(a[1],(void 0),"#"+b)}},colorKeyword:function(){o.save();var a=o.autoCommentAbsorb;o.autoCommentAbsorb=!1;var b=o.$re(/^[_A-Za-z-][_A-Za-z0-9-]+/);if(o.autoCommentAbsorb=a,!b)return void o.forget();o.restore();var c=e.Color.fromKeyword(b);return c?(o.$str(b),c):void 0},dimension:function(){if(!o.peekNotNumeric()){var a=o.$re(/^([+-]?\d*\.?\d+)(%|[a-z_]+)?/i);return a?new e.Dimension(a[1],a[2]):void 0}},unicodeDescriptor:function(){var a;if(a=o.$re(/^U\+[0-9a-fA-F?]+(\-[0-9a-fA-F?]+)?/))return new e.UnicodeDescriptor(a[0])},javascript:function(){var a,b=o.i;o.save();var d=o.$char("~"),f=o.$char("`");return f?(a=o.$re(/^[^`]*`/))?(o.forget(),new e.JavaScript(a.substr(0,a.length-1),Boolean(d),b,c)):void o.restore("invalid javascript definition"):void o.restore()}},variable:function(){var a;if("@"===o.currentChar()&&(a=o.$re(/^(@[\w-]+)\s*:/)))return a[1]},rulesetCall:function(){var a;if("@"===o.currentChar()&&(a=o.$re(/^(@[\w-]+)\(\s*\)\s*;/)))return new e.RulesetCall(a[1])},extend:function(a){var b,d,f,g,h,j=o.i;if(o.$str(a?"&:extend(":":extend(")){do{for(f=null,b=null;!(f=o.$re(/^(all)(?=\s*(\)|,))/))&&(d=this.element());)b?b.push(d):b=[d];f=f&&f[1],b||i("Missing target selector for :extend()."),h=new e.Extend(new e.Selector(b),f,j,c),g?g.push(h):g=[h]}while(o.$char(","));return k(/^\)/),a&&k(/^;/),g}},extendRule:function(){return this.extend(!0)},mixin:{call:function(){var a,b,d,f,g,h,i=o.currentChar(),j=!1,k=o.i;if("."===i||"#"===i){for(o.save();;){if(a=o.i,f=o.$re(/^[#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/),!f)break;d=new e.Element(g,f,a,c),b?b.push(d):b=[d],g=o.$char(">")}return b&&(o.$char("(")&&(h=this.args(!0).args,l(")")),n.important()&&(j=!0),n.end())?(o.forget(),new e.mixin.Call(b,h,k,c,j)):void o.restore()}},args:function(a){var b,c,d,f,g,h,j,k=n.entities,l={args:null,variadic:!1},m=[],p=[],q=[];for(o.save();;){if(a)h=n.detachedRuleset()||n.expression();else{if(o.commentStore.length=0,o.$str("...")){l.variadic=!0,o.$char(";")&&!b&&(b=!0),(b?p:q).push({variadic:!0});break}h=k.variable()||k.literal()||k.keyword()}if(!h)break;f=null,h.throwAwayComments&&h.throwAwayComments(),g=h;var r=null;if(a?h.value&&1==h.value.length&&(r=h.value[0]):r=h,r&&r instanceof e.Variable)if(o.$char(":")){if(m.length>0&&(b&&i("Cannot mix ; and , as delimiter types"),c=!0),g=n.detachedRuleset()||n.expression(),!g){if(!a)return o.restore(),l.args=[],l;i("could not understand value for named argument")}f=d=r.name}else if(o.$str("...")){if(!a){l.variadic=!0,o.$char(";")&&!b&&(b=!0),(b?p:q).push({name:h.name,variadic:!0});break}j=!0}else a||(d=f=r.name,g=null);g&&m.push(g),q.push({name:f,value:g,expand:j}),o.$char(",")||(o.$char(";")||b)&&(c&&i("Cannot mix ; and , as delimiter types"),b=!0,m.length>1&&(g=new e.Value(m)),p.push({name:d,value:g,expand:j}),d=null,m=[],c=!1)}return o.forget(),l.args=b?p:q,l},definition:function(){var a,b,c,d,f=[],g=!1;if(!("."!==o.currentChar()&&"#"!==o.currentChar()||o.peek(/^[^{]*\}/)))if(o.save(),b=o.$re(/^([#.](?:[\w-]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+)\s*\(/)){a=b[1];var h=this.args(!1);if(f=h.args,g=h.variadic,!o.$char(")"))return void o.restore("Missing closing ')'");if(o.commentStore.length=0,o.$str("when")&&(d=k(n.conditions,"expected condition")),c=n.block())return o.forget(),new e.mixin.Definition(a,f,c,d,g);o.restore()}else o.forget()}},entity:function(){var a=this.entities;return this.comment()||a.literal()||a.variable()||a.url()||a.call()||a.keyword()||a.javascript()},end:function(){return o.$char(";")||o.peek("}")},alpha:function(){var a;if(o.$re(/^opacity=/i))return a=o.$re(/^\d+/),a||(a=k(this.entities.variable,"Could not parse alpha")),l(")"),new e.Alpha(a)},element:function(){var a,b,d,f=o.i;if(b=this.combinator(),a=o.$re(/^(?:\d+\.\d+|\d+)%/)||o.$re(/^(?:[.#]?|:*)(?:[\w-]|[^\x00-\x9f]|\\(?:[A-Fa-f0-9]{1,6} ?|[^A-Fa-f0-9]))+/)||o.$char("*")||o.$char("&")||this.attribute()||o.$re(/^\([^&()@]+\)/)||o.$re(/^[\.#:](?=@)/)||this.entities.variableCurly(),a||(o.save(),o.$char("(")?(d=this.selector())&&o.$char(")")?(a=new e.Paren(d),o.forget()):o.restore("Missing closing ')'"):o.forget()),a)return new e.Element(b,a,f,c)},combinator:function(){var a=o.currentChar();if("/"===a){o.save();var b=o.$re(/^\/[a-z]+\//i);if(b)return o.forget(),new e.Combinator(b);o.restore()}if(">"===a||"+"===a||"~"===a||"|"===a||"^"===a){for(o.i++,"^"===a&&"^"===o.currentChar()&&(a="^^",o.i++);o.isWhitespace();)o.i++;return new e.Combinator(a)}return new e.Combinator(o.isWhitespace(-1)?" ":null)},lessSelector:function(){return this.selector(!0)},selector:function(a){for(var b,d,f,g,h,j,l,m=o.i;(a&&(d=this.extend())||a&&(j=o.$str("when"))||(g=this.element()))&&(j?l=k(this.conditions,"expected condition"):l?i("CSS guard can only be used at the end of selector"):d?h=h?h.concat(d):d:(h&&i("Extend can only be used at the end of selector"),f=o.currentChar(),b?b.push(g):b=[g],g=null),"{"!==f&&"}"!==f&&";"!==f&&","!==f&&")"!==f););return b?new e.Selector(b,h,l,m,c):void(h&&i("Extend must be used to extend a selector, it cannot be used on its own"))},attribute:function(){if(o.$char("[")){var a,b,c,d=this.entities;return(a=d.variableCurly())||(a=k(/^(?:[_A-Za-z0-9-\*]*\|)?(?:[_A-Za-z0-9-]|\\.)+/)),c=o.$re(/^[|~*$^]?=/),c&&(b=d.quoted()||o.$re(/^[0-9]+%/)||o.$re(/^[\w-]+/)||d.variableCurly()),l("]"),new e.Attribute(a,c,b)}},block:function(){var a;if(o.$char("{")&&(a=this.primary())&&o.$char("}"))return a},blockRuleset:function(){var a=this.block();return a&&(a=new e.Ruleset(null,a)),a},detachedRuleset:function(){var a=this.blockRuleset();if(a)return new e.DetachedRuleset(a)},ruleset:function(){var b,c,d,f;for(o.save(),a.dumpLineNumbers&&(f=m(o.i));;){if(c=this.lessSelector(),!c)break;if(b?b.push(c):b=[c],o.commentStore.length=0,c.condition&&b.length>1&&i("Guards are only currently allowed on a single selector."),!o.$char(","))break;c.condition&&i("Guards are only currently allowed on a single selector."),o.commentStore.length=0}if(b&&(d=this.block())){o.forget();var g=new e.Ruleset(b,d,a.strictImports);return a.dumpLineNumbers&&(g.debugInfo=f),g}o.restore()},rule:function(b){var d,f,g,h,i,j=o.i,k=o.currentChar();if("."!==k&&"#"!==k&&"&"!==k&&":"!==k)if(o.save(),d=this.variable()||this.ruleProperty()){if(i="string"==typeof d,i&&(f=this.detachedRuleset()),o.commentStore.length=0,!f){h=!i&&d.length>1&&d.pop().value;var l=!b&&(a.compress||i);if(l&&(f=this.value()),!f&&(f=this.anonymousValue()))return o.forget(),new e.Rule(d,f,(!1),h,j,c);l||f||(f=this.value()),g=this.important()}if(f&&this.end())return o.forget(),new e.Rule(d,f,g,h,j,c);if(o.restore(),f&&!b)return this.rule(!0)}else o.forget()},anonymousValue:function(){var a=o.$re(/^([^@+\/'"*`(;{}-]*);/);if(a)return new e.Anonymous(a[1])},"import":function(){var a,b,d=o.i,f=o.$re(/^@import?\s+/);if(f){var g=(f?this.importOptions():null)||{};if(a=this.entities.quoted()||this.entities.url())return b=this.mediaFeatures(),o.$char(";")||(o.i=d,i("missing semi-colon or unrecognised media features on import")),b=b&&new e.Value(b),new e.Import(a,b,g,d,c);o.i=d,i("malformed import statement")}},importOptions:function(){var a,b,c,d={};if(!o.$char("("))return null;do if(a=this.importOption()){switch(b=a,c=!0,b){case"css":b="less",c=!1;break;case"once":b="multiple",c=!1}if(d[b]=c,!o.$char(","))break}while(a);return l(")"),d},importOption:function(){var a=o.$re(/^(less|css|multiple|once|inline|reference|optional)/);if(a)return a[1]},mediaFeature:function(){var a,b,d=this.entities,f=[];o.save();do a=d.keyword()||d.variable(),a?f.push(a):o.$char("(")&&(b=this.property(),a=this.value(),o.$char(")")?b&&a?f.push(new e.Paren(new e.Rule(b,a,null,null,o.i,c,(!0)))):a?f.push(new e.Paren(a)):i("badly formed media feature definition"):i("Missing closing ')'","Parse"));while(a);if(o.forget(),f.length>0)return new e.Expression(f)},mediaFeatures:function(){var a,b=this.entities,c=[];do if(a=this.mediaFeature()){if(c.push(a),!o.$char(","))break}else if(a=b.variable(),a&&(c.push(a),!o.$char(",")))break;while(a);return c.length>0?c:null},media:function(){var b,d,f,g,h=o.i;return a.dumpLineNumbers&&(g=m(h)),o.save(),o.$str("@media")?(b=this.mediaFeatures(),d=this.block(),d||i("media definitions require block statements after any features"),o.forget(),f=new e.Media(d,b,h,c),a.dumpLineNumbers&&(f.debugInfo=g),f):void o.restore()},plugin:function(){var a,b=o.i,d=o.$re(/^@plugin?\s+/);if(d){var f={plugin:!0};if(a=this.entities.quoted()||this.entities.url())return o.$char(";")||(o.i=b,i("missing semi-colon on plugin")),new e.Import(a,null,f,b,c);o.i=b,i("malformed plugin statement")}},directive:function(){var b,d,f,g,h,j,k,l=o.i,n=!0,p=!0;if("@"===o.currentChar()){if(d=this["import"]()||this.plugin()||this.media())return d;if(o.save(),b=o.$re(/^@[a-z-]+/)){switch(g=b,"-"==b.charAt(1)&&b.indexOf("-",2)>0&&(g="@"+b.slice(b.indexOf("-",2)+1)),g){case"@charset":h=!0,n=!1;break;case"@namespace":j=!0,n=!1;break;case"@keyframes":case"@counter-style":h=!0;break;case"@document":case"@supports":k=!0,p=!1;break;default:k=!0}return o.commentStore.length=0,h?(d=this.entity(),d||i("expected "+b+" identifier")):j?(d=this.expression(),d||i("expected "+b+" expression")):k&&(d=(o.$re(/^[^{;]+/)||"").trim(),n="{"==o.currentChar(),d&&(d=new e.Anonymous(d))),n&&(f=this.blockRuleset()),f||!n&&d&&o.$char(";")?(o.forget(),new e.Directive(b,d,f,l,c,a.dumpLineNumbers?m(l):null,p)):void o.restore("directive options not recognised")}}},value:function(){var a,b=[];do if(a=this.expression(),a&&(b.push(a),!o.$char(",")))break;while(a);if(b.length>0)return new e.Value(b)},important:function(){if("!"===o.currentChar())return o.$re(/^! *important/)},sub:function(){var a,b;return o.save(),o.$char("(")?(a=this.addition(),a&&o.$char(")")?(o.forget(),b=new e.Expression([a]),b.parens=!0,b):void o.restore("Expected ')'")):void o.restore()},multiplication:function(){var a,b,c,d,f;if(a=this.operand()){for(f=o.isWhitespace(-1);;){if(o.peek(/^\/[*\/]/))break;if(o.save(),c=o.$char("/")||o.$char("*"),!c){o.forget();break}if(b=this.operand(),!b){o.restore();break}o.forget(),a.parensInOp=!0,b.parensInOp=!0,d=new e.Operation(c,[d||a,b],f),f=o.isWhitespace(-1)}return d||a}},addition:function(){var a,b,c,d,f;if(a=this.multiplication()){for(f=o.isWhitespace(-1);;){if(c=o.$re(/^[-+]\s+/)||!f&&(o.$char("+")||o.$char("-")),!c)break;if(b=this.multiplication(),!b)break;a.parensInOp=!0,b.parensInOp=!0,d=new e.Operation(c,[d||a,b],f),f=o.isWhitespace(-1)}return d||a}},conditions:function(){var a,b,c,d=o.i;if(a=this.condition()){for(;;){if(!o.peek(/^,\s*(not\s*)?\(/)||!o.$char(","))break;if(b=this.condition(),!b)break;c=new e.Condition("or",c||a,b,d)}return c||a}},condition:function(){function a(){return o.$str("or")}var b,c,d;if(b=this.conditionAnd(this)){if(c=a()){if(d=this.condition(),!d)return;b=new e.Condition(c,b,d)}return b}},conditionAnd:function(){function a(a){return a.negatedCondition()||a.parenthesisCondition()}function b(){return o.$str("and")}var c,d,f;if(c=a(this)){if(d=b()){if(f=this.conditionAnd(),!f)return;c=new e.Condition(d,c,f)}return c}},negatedCondition:function(){if(o.$str("not")){var a=this.parenthesisCondition();return a&&(a.negate=!a.negate),a}},parenthesisCondition:function(){function a(a){var b;return o.save(),(b=a.condition())&&o.$char(")")?(o.forget(),b):void o.restore()}var b;return o.save(),o.$str("(")?(b=a(this))?(o.forget(),b):(b=this.atomicCondition())?o.$char(")")?(o.forget(),b):void o.restore("expected ')' got '"+o.currentChar()+"'"):void o.restore():void o.restore()},atomicCondition:function(){var a,b,c,d,f=this.entities,g=o.i;if(a=this.addition()||f.keyword()||f.quoted())return o.$char(">")?d=o.$char("=")?">=":">":o.$char("<")?d=o.$char("=")?"<=":"<":o.$char("=")&&(d=o.$char(">")?"=>":o.$char("<")?"=<":"="),d?(b=this.addition()||f.keyword()||f.quoted(),b?c=new e.Condition(d,a,b,g,(!1)):i("expected expression")):c=new e.Condition("=",a,new e.Keyword("true"),g,(!1)),c},operand:function(){var a,b=this.entities;o.peek(/^-[@\(]/)&&(a=o.$char("-"));var c=this.sub()||b.dimension()||b.color()||b.variable()||b.call()||b.colorKeyword();return a&&(c.parensInOp=!0,c=new e.Negative(c)),c},expression:function(){var a,b,c=[];do a=this.comment(),a?c.push(a):(a=this.addition()||this.entity(),a&&(c.push(a),o.peek(/^\/[\/*]/)||(b=o.$char("/"),b&&c.push(new e.Anonymous(b)))));while(a);if(c.length>0)return new e.Expression(c)},property:function(){var a=o.$re(/^(\*?-?[_a-zA-Z0-9-]+)\s*:/);if(a)return a[1]},ruleProperty:function(){function a(a){var b=o.i,c=o.$re(a);if(c)return g.push(b),f.push(c[1])}var b,d,f=[],g=[];o.save();var h=o.$re(/^([_a-zA-Z0-9-]+)\s*:/);if(h)return f=[new e.Keyword(h[1])],o.forget(),f;for(a(/^(\*?)/);;)if(!a(/^((?:[\w-]+)|(?:@\{[\w-]+\}))/))break;if(f.length>1&&a(/^((?:\+_|\+)?)\s*:/)){for(o.forget(),""===f[0]&&(f.shift(),g.shift()),d=0;d=b);c++);this.preProcessors.splice(c,0,{preProcessor:a,priority:b})},d.prototype.addPostProcessor=function(a,b){var c;for(c=0;c=b);c++);this.postProcessors.splice(c,0,{postProcessor:a,priority:b})},d.prototype.addFileManager=function(a){this.fileManagers.push(a)},d.prototype.getPreProcessors=function(){for(var a=[],b=0;b0){var d,e=JSON.stringify(this._sourceMapGenerator.toJSON());this.sourceMapURL?d=this.sourceMapURL:this._sourceMapFilename&&(d=this._sourceMapFilename),this.sourceMapURL=d,this.sourceMap=e}return this._css.join("")},b}},{}],44:[function(a,b,c){var d=a("./contexts"),e=a("./visitors"),f=a("./tree");b.exports=function(a,b){b=b||{};var c,g=b.variables,h=new d.Eval(b);"object"!=typeof g||Array.isArray(g)||(g=Object.keys(g).map(function(a){var b=g[a];return b instanceof f.Value||(b instanceof f.Expression||(b=new f.Expression([b])),b=new f.Value([b])),new f.Rule("@"+a,b,(!1),null,0)}),h.frames=[new f.Ruleset(null,g)]);var i,j=[],k=[new e.JoinSelectorVisitor,new e.MarkVisibleSelectorsVisitor((!0)),new e.ExtendVisitor,new e.ToCSSVisitor({compress:Boolean(b.compress)})];if(b.pluginManager){var l=b.pluginManager.getVisitors();for(i=0;i.5?j/(2-g-h):j/(g+h),g){case c:a=(d-e)/j+(d="===a||"=<"===a||"<="===a;case 1:return">"===a||">="===a;default:return!1}}}(this.op,this.lvalue.eval(a),this.rvalue.eval(a));return this.negate?!b:b},b.exports=e},{"./node":70}],54:[function(a,b,c){var d=function(a,b,c){var e="";if(a.dumpLineNumbers&&!a.compress)switch(a.dumpLineNumbers){case"comments":e=d.asComment(b);break;case"mediaquery":e=d.asMediaQuery(b);break;case"all":e=d.asComment(b)+(c||"")+d.asMediaQuery(b)}return e};d.asComment=function(a){return"/* line "+a.debugInfo.lineNumber+", "+a.debugInfo.fileName+" */\n"},d.asMediaQuery=function(a){var b=a.debugInfo.fileName;return/^[a-z]+:\/\//i.test(b)||(b="file://"+b),"@media -sass-debug-info{filename{font-family:"+b.replace(/([.:\/\\])/g,function(a){return"\\"==a&&(a="/"),"\\"+a})+"}line{font-family:\\00003"+a.debugInfo.lineNumber+"}}\n"},b.exports=d},{}],55:[function(a,b,c){var d=a("./node"),e=a("../contexts"),f=function(a,b){this.ruleset=a,this.frames=b};f.prototype=new d,f.prototype.type="DetachedRuleset",f.prototype.evalFirst=!0,f.prototype.accept=function(a){this.ruleset=a.visit(this.ruleset)},f.prototype.eval=function(a){var b=this.frames||a.frames.slice(0);return new f(this.ruleset,b)},f.prototype.callEval=function(a){return this.ruleset.eval(this.frames?new e.Eval(a,this.frames.concat(a.frames)):a)},b.exports=f},{"../contexts":11,"./node":70}],56:[function(a,b,c){var d=a("./node"),e=a("../data/unit-conversions"),f=a("./unit"),g=a("./color"),h=function(a,b){this.value=parseFloat(a),this.unit=b&&b instanceof f?b:new f(b?[b]:void 0)};h.prototype=new d,h.prototype.type="Dimension",h.prototype.accept=function(a){this.unit=a.visit(this.unit)},h.prototype.eval=function(a){return this},h.prototype.toColor=function(){return new g([this.value,this.value,this.value])},h.prototype.genCSS=function(a,b){if(a&&a.strictUnits&&!this.unit.isSingular())throw new Error("Multiple units in dimension. Correct the units or use the unit function. Bad unit: "+this.unit.toString());var c=this.fround(a,this.value),d=String(c);if(0!==c&&c<1e-6&&c>-1e-6&&(d=c.toFixed(20).replace(/0+$/,"")),a&&a.compress){if(0===c&&this.unit.isLength())return void b.add(d);c>0&&c<1&&(d=d.substr(1))}b.add(d),this.unit.genCSS(a,b)},h.prototype.operate=function(a,b,c){var d=this._operate(a,b,this.value,c.value),e=this.unit.clone();if("+"===b||"-"===b)if(0===e.numerator.length&&0===e.denominator.length)e=c.unit.clone(),this.unit.backupUnit&&(e.backupUnit=this.unit.backupUnit);else if(0===c.unit.numerator.length&&0===e.denominator.length);else{if(c=c.convertTo(this.unit.usedUnits()),a.strictUnits&&c.unit.toString()!==e.toString())throw new Error("Incompatible units. Change the units or use the unit function. Bad units: '"+e.toString()+"' and '"+c.unit.toString()+"'.");d=this._operate(a,b,this.value,c.value)}else"*"===b?(e.numerator=e.numerator.concat(c.unit.numerator).sort(),e.denominator=e.denominator.concat(c.unit.denominator).sort(),e.cancel()):"/"===b&&(e.numerator=e.numerator.concat(c.unit.denominator).sort(),e.denominator=e.denominator.concat(c.unit.numerator).sort(),e.cancel());return new h(d,e)},h.prototype.compare=function(a){var b,c;if(a instanceof h){if(this.unit.isEmpty()||a.unit.isEmpty())b=this,c=a;else if(b=this.unify(),c=a.unify(),0!==b.unit.compare(c.unit))return;return d.numericCompare(b.value,c.value)}},h.prototype.unify=function(){return this.convertTo({length:"px",duration:"s",angle:"rad"})},h.prototype.convertTo=function(a){var b,c,d,f,g,i=this.value,j=this.unit.clone(),k={};if("string"==typeof a){for(b in e)e[b].hasOwnProperty(a)&&(k={},k[b]=a);a=k}g=function(a,b){return d.hasOwnProperty(a)?(b?i/=d[a]/d[f]:i*=d[a]/d[f],f):a};for(c in a)a.hasOwnProperty(c)&&(f=a[c],d=e[c],j.map(g));return j.cancel(),new h(i,j)},b.exports=h},{"../data/unit-conversions":14,"./color":50,"./node":70,"./unit":79}],57:[function(a,b,c){var d=a("./node"),e=a("./selector"),f=a("./ruleset"),g=function(a,b,c,d,f,g,h,i){var j;if(this.name=a,this.value=b,c)for(Array.isArray(c)?this.rules=c:(this.rules=[c],this.rules[0].selectors=new e([],null,null,this.index,f).createEmptySelectors()),j=0;j1?b=new g(this.value.map(function(b){return b.eval(a)})):1===this.value.length?(this.value[0].parens&&!this.value[0].parensInOp&&(d=!0),b=this.value[0].eval(a)):b=this,c&&a.outOfParenthesis(),this.parens&&this.parensInOp&&!a.isMathOn()&&!d&&(b=new e(b)),b},g.prototype.genCSS=function(a,b){for(var c=0;c0&&c.length&&""===c[0].combinator.value&&(c[0].combinator.value=" "),d=d.concat(a[b].elements);this.selfSelectors=[new e(d)],this.selfSelectors[0].copyVisibilityInfo(this.visibilityInfo())},b.exports=f},{"./node":70,"./selector":77}],61:[function(a,b,c){var d=a("./node"),e=a("./media"),f=a("./url"),g=a("./quoted"),h=a("./ruleset"),i=a("./anonymous"),j=function(a,b,c,d,e,f){if(this.options=c,this.index=d,this.path=a,this.features=b,this.currentFileInfo=e,this.allowRoot=!0,void 0!==this.options.less||this.options.inline)this.css=!this.options.less||this.options.inline;else{var g=this.getPath();g&&/[#\.\&\?\/]css([\?;].*)?$/.test(g)&&(this.css=!0)}this.copyVisibilityInfo(f)};j.prototype=new d,j.prototype.type="Import",j.prototype.accept=function(a){this.features&&(this.features=a.visit(this.features)),this.path=a.visit(this.path),this.options.plugin||this.options.inline||!this.root||(this.root=a.visit(this.root))},j.prototype.genCSS=function(a,b){this.css&&void 0===this.path.currentFileInfo.reference&&(b.add("@import ",this.currentFileInfo,this.index),this.path.genCSS(a,b),this.features&&(b.add(" "),this.features.genCSS(a,b)),b.add(";"))},j.prototype.getPath=function(){return this.path instanceof f?this.path.value.value:this.path.value},j.prototype.isVariableImport=function(){var a=this.path;return a instanceof f&&(a=a.value),!(a instanceof g)||a.containsVariables()},j.prototype.evalForImport=function(a){var b=this.path;return b instanceof f&&(b=b.value),new j(b.eval(a),this.features,this.options,this.index,this.currentFileInfo,this.visibilityInfo())},j.prototype.evalPath=function(a){var b=this.path.eval(a),c=this.currentFileInfo&&this.currentFileInfo.rootpath;if(!(b instanceof f)){if(c){var d=b.value;d&&a.isPathRelative(d)&&(b.value=c+d)}b.value=a.normalizePath(b.value)}return b},j.prototype.eval=function(a){var b=this.doEval(a);return(this.options.reference||this.blocksVisibility())&&(b.length||0===b.length?b.forEach(function(a){a.addVisibilityBlock()}):b.addVisibilityBlock()),b},j.prototype.doEval=function(a){var b,c,d=this.features&&this.features.eval(a);if(this.options.plugin)return c=a.frames[0]&&a.frames[0].functionRegistry,c&&this.root&&this.root.functions&&c.addMultiple(this.root.functions),[];if(this.skip&&("function"==typeof this.skip&&(this.skip=this.skip()),this.skip))return[];if(this.options.inline){var f=new i(this.root,0,{filename:this.importedFilename,reference:this.path.currentFileInfo&&this.path.currentFileInfo.reference},(!0),(!0));return this.features?new e([f],this.features.value):[f]}if(this.css){var g=new j(this.evalPath(a),d,this.options,this.index);if(!g.css&&this.error)throw this.error;return g}return b=new h(null,this.root.rules.slice(0)),b.evalImports(a),this.features?new e(b.rules,this.features.value):b.rules},b.exports=j},{"./anonymous":46,"./media":66,"./node":70,"./quoted":73,"./ruleset":76,"./url":80}],62:[function(a,b,c){var d={};d.Node=a("./node"),d.Alpha=a("./alpha"),d.Color=a("./color"),d.Directive=a("./directive"),d.DetachedRuleset=a("./detached-ruleset"),d.Operation=a("./operation"),d.Dimension=a("./dimension"),d.Unit=a("./unit"),d.Keyword=a("./keyword"),d.Variable=a("./variable"),d.Ruleset=a("./ruleset"),d.Element=a("./element"),d.Attribute=a("./attribute"),d.Combinator=a("./combinator"),d.Selector=a("./selector"),d.Quoted=a("./quoted"),d.Expression=a("./expression"),d.Rule=a("./rule"),d.Call=a("./call"),d.URL=a("./url"),d.Import=a("./import"),d.mixin={Call:a("./mixin-call"),Definition:a("./mixin-definition")},d.Comment=a("./comment"),d.Anonymous=a("./anonymous"),d.Value=a("./value"),d.JavaScript=a("./javascript"),d.Assignment=a("./assignment"),d.Condition=a("./condition"),d.Paren=a("./paren"),d.Media=a("./media"),d.UnicodeDescriptor=a("./unicode-descriptor"),d.Negative=a("./negative"),d.Extend=a("./extend"),d.RulesetCall=a("./ruleset-call"),b.exports=d},{"./alpha":45,"./anonymous":46,"./assignment":47,"./attribute":48,"./call":49,"./color":50,"./combinator":51,"./comment":52,"./condition":53,"./detached-ruleset":55,"./dimension":56,"./directive":57,"./element":58,"./expression":59,"./extend":60,"./import":61,"./javascript":63,"./keyword":65,"./media":66,"./mixin-call":67,"./mixin-definition":68,"./negative":69,"./node":70,"./operation":71,"./paren":72,"./quoted":73,"./rule":74,"./ruleset":76,"./ruleset-call":75,"./selector":77,"./unicode-descriptor":78,"./unit":79,"./url":80,"./value":81,"./variable":82}],63:[function(a,b,c){var d=a("./js-eval-node"),e=a("./dimension"),f=a("./quoted"),g=a("./anonymous"),h=function(a,b,c,d){this.escaped=b,this.expression=a,this.index=c,this.currentFileInfo=d};h.prototype=new d,h.prototype.type="JavaScript",h.prototype.eval=function(a){var b=this.evaluateJavaScript(this.expression,a);return"number"==typeof b?new e(b):"string"==typeof b?new f('"'+b+'"',b,this.escaped,this.index):new g(Array.isArray(b)?b.join(", "):b)},b.exports=h},{"./anonymous":46,"./dimension":56,"./js-eval-node":64,"./quoted":73}],64:[function(a,b,c){var d=a("./node"),e=a("./variable"),f=function(){};f.prototype=new d,f.prototype.evaluateJavaScript=function(a,b){var c,d=this,f={};if(void 0!==b.javascriptEnabled&&!b.javascriptEnabled)throw{message:"You are using JavaScript, which has been disabled.",filename:this.currentFileInfo.filename,index:this.index};a=a.replace(/@\{([\w-]+)\}/g,function(a,c){return d.jsify(new e("@"+c,d.index,d.currentFileInfo).eval(b))});try{a=new Function("return ("+a+")")}catch(g){throw{message:"JavaScript evaluation error: "+g.message+" from `"+a+"`",filename:this.currentFileInfo.filename,index:this.index}}var h=b.frames[0].variables();for(var i in h)h.hasOwnProperty(i)&&(f[i.slice(1)]={value:h[i].value,toJS:function(){return this.value.eval(b).toCSS()}});try{c=a.call(f)}catch(g){throw{message:"JavaScript evaluation error: '"+g.name+": "+g.message.replace(/["]/g,"'")+"'",filename:this.currentFileInfo.filename,index:this.index}}return c},f.prototype.jsify=function(a){return Array.isArray(a.value)&&a.value.length>1?"["+a.value.map(function(a){return a.toCSS()}).join(", ")+"]":a.toCSS()},b.exports=f},{"./node":70,"./variable":82}],65:[function(a,b,c){var d=a("./node"),e=function(a){this.value=a};e.prototype=new d,e.prototype.type="Keyword",e.prototype.genCSS=function(a,b){if("%"===this.value)throw{type:"Syntax",message:"Invalid % without number"};b.add(this.value)},e.True=new e("true"),e.False=new e("false"),b.exports=e},{"./node":70}],66:[function(a,b,c){var d=a("./ruleset"),e=a("./value"),f=a("./selector"),g=a("./anonymous"),h=a("./expression"),i=a("./directive"),j=function(a,b,c,g,h){this.index=c,this.currentFileInfo=g;var i=new f([],null,null,this.index,this.currentFileInfo).createEmptySelectors();this.features=new e(b),this.rules=[new d(i,a)],this.rules[0].allowImports=!0,this.copyVisibilityInfo(h),this.allowRoot=!0};j.prototype=new i,j.prototype.type="Media",j.prototype.isRulesetLike=!0,j.prototype.accept=function(a){this.features&&(this.features=a.visit(this.features)),this.rules&&(this.rules=a.visitArray(this.rules))},j.prototype.genCSS=function(a,b){b.add("@media ",this.currentFileInfo,this.index),this.features.genCSS(a,b),this.outputRuleset(a,b,this.rules)},j.prototype.eval=function(a){a.mediaBlocks||(a.mediaBlocks=[],a.mediaPath=[]);var b=new j(null,[],this.index,this.currentFileInfo,this.visibilityInfo());this.debugInfo&&(this.rules[0].debugInfo=this.debugInfo,b.debugInfo=this.debugInfo);var c=!1;a.strictMath||(c=!0,a.strictMath=!0);try{b.features=this.features.eval(a)}finally{c&&(a.strictMath=!1)}return a.mediaPath.push(b),a.mediaBlocks.push(b),this.rules[0].functionRegistry=a.frames[0].functionRegistry.inherit(),a.frames.unshift(this.rules[0]),b.rules=[this.rules[0].eval(a)],a.frames.shift(),a.mediaPath.pop(),0===a.mediaPath.length?b.evalTop(a):b.evalNested(a)},j.prototype.evalTop=function(a){var b=this;if(a.mediaBlocks.length>1){var c=new f([],null,null,this.index,this.currentFileInfo).createEmptySelectors();b=new d(c,a.mediaBlocks),b.multiMedia=!0,b.copyVisibilityInfo(this.visibilityInfo())}return delete a.mediaBlocks,delete a.mediaPath,b},j.prototype.evalNested=function(a){var b,c,f=a.mediaPath.concat([this]);for(b=0;b0;b--)a.splice(b,0,new g("and"));return new h(a)})),new d([],[])},j.prototype.permute=function(a){if(0===a.length)return[];if(1===a.length)return a[0];for(var b=[],c=this.permute(a.slice(1)),d=0;d0){for(n=!0,k=0;k0)p=B;else if(p=A,q[A]+q[B]>1)throw{type:"Runtime",message:"Ambiguous use of `default()` found when matching for `"+this.format(t)+"`",index:this.index,filename:this.currentFileInfo.filename};for(k=0;kthis.params.length)return!1}c=Math.min(f,this.arity);for(var g=0;gb?1:void 0},d.prototype.blocksVisibility=function(){return null==this.visibilityBlocks&&(this.visibilityBlocks=0),0!==this.visibilityBlocks},d.prototype.addVisibilityBlock=function(){null==this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks+1},d.prototype.removeVisibilityBlock=function(){null==this.visibilityBlocks&&(this.visibilityBlocks=0),this.visibilityBlocks=this.visibilityBlocks-1},d.prototype.ensureVisibility=function(){this.nodeVisible=!0},d.prototype.ensureInvisibility=function(){this.nodeVisible=!1},d.prototype.isVisible=function(){return this.nodeVisible},d.prototype.visibilityInfo=function(){return{visibilityBlocks:this.visibilityBlocks,nodeVisible:this.nodeVisible}},d.prototype.copyVisibilityInfo=function(a){a&&(this.visibilityBlocks=a.visibilityBlocks,this.nodeVisible=a.nodeVisible)},b.exports=d},{}],71:[function(a,b,c){var d=a("./node"),e=a("./color"),f=a("./dimension"),g=function(a,b,c){this.op=a.trim(),this.operands=b,this.isSpaced=c};g.prototype=new d,g.prototype.type="Operation",g.prototype.accept=function(a){this.operands=a.visit(this.operands)},g.prototype.eval=function(a){var b=this.operands[0].eval(a),c=this.operands[1].eval(a);if(a.isMathOn()){if(b instanceof f&&c instanceof e&&(b=b.toColor()),c instanceof f&&b instanceof e&&(c=c.toColor()),!b.operate)throw{type:"Operation",message:"Operation on an invalid type"};return b.operate(a,this.op,c)}return new g(this.op,[b,c],this.isSpaced)},g.prototype.genCSS=function(a,b){this.operands[0].genCSS(a,b),this.isSpaced&&b.add(" "),b.add(this.op),this.isSpaced&&b.add(" "),this.operands[1].genCSS(a,b)},b.exports=g},{"./color":50,"./dimension":56,"./node":70}],72:[function(a,b,c){var d=a("./node"),e=function(a){this.value=a};e.prototype=new d,e.prototype.type="Paren",e.prototype.genCSS=function(a,b){b.add("("),this.value.genCSS(a,b),b.add(")")},e.prototype.eval=function(a){return new e(this.value.eval(a))},b.exports=e},{"./node":70}],73:[function(a,b,c){var d=a("./node"),e=a("./js-eval-node"),f=a("./variable"),g=function(a,b,c,d,e){this.escaped=null==c||c,this.value=b||"",this.quote=a.charAt(0),this.index=d,this.currentFileInfo=e};g.prototype=new e,g.prototype.type="Quoted",g.prototype.genCSS=function(a,b){this.escaped||b.add(this.quote,this.currentFileInfo,this.index),b.add(this.value),this.escaped||b.add(this.quote)},g.prototype.containsVariables=function(){return this.value.match(/(`([^`]+)`)|@\{([\w-]+)\}/)},g.prototype.eval=function(a){function b(a,b,c){var d=a;do a=d,d=a.replace(b,c);while(a!==d);return d}var c=this,d=this.value,e=function(b,d){return String(c.evaluateJavaScript(d,a))},h=function(b,d){var e=new f("@"+d,c.index,c.currentFileInfo).eval(a,!0);return e instanceof g?e.value:e.toCSS()};return d=b(d,/`([^`]+)`/g,e),d=b(d,/@\{([\w-]+)\}/g,h),new g(this.quote+d+this.quote,d,this.escaped,this.index,this.currentFileInfo)},g.prototype.compare=function(a){return"Quoted"!==a.type||this.escaped||a.escaped?a.toCSS&&this.toCSS()===a.toCSS()?0:void 0:d.numericCompare(this.value,a.value)},b.exports=g},{"./js-eval-node":64,"./node":70,"./variable":82}],74:[function(a,b,c){function d(a,b){var c,d="",e=b.length,f={add:function(a){d+=a}};for(c=0;cd){if(!c||c(h)){e=h.find(new f(a.elements.slice(d)),b,c);for(var j=0;j0&&b.add(k),a.firstSelector=!0,h[0].genCSS(a,b),a.firstSelector=!1,e=1;e0?(e=a.slice(0),f=e.pop(),h=d.createDerived(f.elements.slice(0))):h=d.createDerived([]),b.length>0){var i=c.combinator,j=b[0].elements[0];i.emptyOrWhitespace&&!j.combinator.emptyOrWhitespace&&(i=j.combinator),h.elements.push(new g(i,j.value,c.index,c.currentFileInfo)),h.elements=h.elements.concat(b[0].elements.slice(1))}if(0!==h.elements.length&&e.push(h),b.length>1){var k=b.slice(1);k=k.map(function(a){return a.createDerived(a.elements,[])}),e=e.concat(k)}return e}function j(a,b,c,d,e){var f;for(f=0;f0?d[d.length-1]=d[d.length-1].createDerived(d[d.length-1].elements.concat(a)):d.push(new f(a))}}function l(a,b,c){function f(a){var b;return"Paren"!==a.value.type?null:(b=a.value.value,"Selector"!==b.type?null:b)}var h,m,n,o,p,q,r,s,t,u,v=!1;for(o=[],p=[[]],h=0;h0&&r[0].elements.push(new g(s.combinator,"",s.index,s.currentFileInfo)),q.push(r);else for(n=0;n0&&(a.push(p[h]),u=p[h][t-1],p[h][t-1]=u.createDerived(u.elements,c.extendList));return v}function m(a,b){var c=b.createDerived(b.elements,b.extendList,b.evaldCondition);return c.copyVisibilityInfo(a),c}var n,o,p;if(o=[],p=l(o,b,c),!p)if(b.length>0)for(o=[],n=0;n0)for(b=0;b=0&&"\n"!==b.charAt(c);)e++;return"number"==typeof a&&(d=(b.slice(0,a).match(/\n/g)||"").length),{line:d,column:e}}}},{}],84:[function(a,b,c){var d=a("../tree"),e=a("./visitor"),f=a("../logger"),g=function(){this._visitor=new e(this),this.contexts=[],this.allExtendsStack=[[]]};g.prototype={run:function(a){return a=this._visitor.visit(a),a.allExtends=this.allExtendsStack[0],a},visitRule:function(a,b){b.visitDeeper=!1},visitMixinDefinition:function(a,b){b.visitDeeper=!1},visitRuleset:function(a,b){if(!a.root){var c,e,f,g,h=[],i=a.rules,j=i?i.length:0;for(c=0;c=0||(i=[k.selfSelectors[0]],g=n.findMatch(j,i),g.length&&(j.hasFoundMatches=!0,j.selfSelectors.forEach(function(a){var b=k.visibilityInfo();h=n.extendSelector(g,i,a,j.isVisible()),l=new d.Extend(k.selector,k.option,0,k.currentFileInfo,b),l.selfSelectors=h,h[h.length-1].extendList=[l],m.push(l),l.ruleset=k.ruleset,l.parent_ids=l.parent_ids.concat(k.parent_ids,j.parent_ids),k.firstExtendOnThisSelectorPath&&(l.firstExtendOnThisSelectorPath=!0,k.ruleset.paths.push(h))})));if(m.length){if(this.extendChainCount++,c>100){var o="{unable to calculate}",p="{unable to calculate}";try{o=m[0].selfSelectors[0].toCSS(),p=m[0].selector.toCSS()}catch(q){}throw{message:"extend circular reference detected. One of the circular extends is currently:"+o+":extend("+p+")"}}return m.concat(n.doExtendChaining(m,b,c+1))}return m},visitRule:function(a,b){b.visitDeeper=!1},visitMixinDefinition:function(a,b){b.visitDeeper=!1},visitSelector:function(a,b){b.visitDeeper=!1},visitRuleset:function(a,b){if(!a.root){var c,d,e,f,g=this.allExtendsStack[this.allExtendsStack.length-1],h=[],i=this;for(e=0;e0&&k[i.matched].combinator.value!==g?i=null:i.matched++,i&&(i.finished=i.matched===k.length,i.finished&&!a.allowAfter&&(e+1k&&l>0&&(m[m.length-1].elements=m[m.length-1].elements.concat(b[k].elements.slice(l)),l=0,k++),j=g.elements.slice(l,i.index).concat([h]).concat(c.elements.slice(1)),k===i.pathIndex&&f>0?m[m.length-1].elements=m[m.length-1].elements.concat(j):(m=m.concat(b.slice(k,i.pathIndex)),m.push(new d.Selector(j))),k=i.endPathIndex,l=i.endPathElementIndex,l>=b[k].elements.length&&(l=0,k++);return k0&&(m[m.length-1].elements=m[m.length-1].elements.concat(b[k].elements.slice(l)),k++),m=m.concat(b.slice(k,b.length)),m=m.map(function(a){var b=a.createDerived(a.elements);return e?b.ensureVisibility():b.ensureInvisibility(),b})},visitMedia:function(a,b){var c=a.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);c=c.concat(this.doExtendChaining(c,a.allExtends)),this.allExtendsStack.push(c)},visitMediaOut:function(a){var b=this.allExtendsStack.length-1;this.allExtendsStack.length=b},visitDirective:function(a,b){var c=a.allExtends.concat(this.allExtendsStack[this.allExtendsStack.length-1]);c=c.concat(this.doExtendChaining(c,a.allExtends)),this.allExtendsStack.push(c)},visitDirectiveOut:function(a){var b=this.allExtendsStack.length-1;this.allExtendsStack.length=b}},b.exports=h},{"../logger":33,"../tree":62,"./visitor":91}],85:[function(a,b,c){function d(a){this.imports=[],this.variableImports=[],this._onSequencerEmpty=a,this._currentDepth=0}d.prototype.addImport=function(a){var b=this,c={callback:a,args:null,isReady:!1};return this.imports.push(c),function(){c.args=Array.prototype.slice.call(arguments,0),c.isReady=!0,b.tryRun()}},d.prototype.addVariableImport=function(a){this.variableImports.push(a)},d.prototype.tryRun=function(){this._currentDepth++;try{for(;;){for(;this.imports.length>0;){var a=this.imports[0];if(!a.isReady)return;
+this.imports=this.imports.slice(1),a.callback.apply(null,a.args)}if(0===this.variableImports.length)break;var b=this.variableImports[0];this.variableImports=this.variableImports.slice(1),b()}}finally{this._currentDepth--}0===this._currentDepth&&this._onSequencerEmpty&&this._onSequencerEmpty()},b.exports=d},{}],86:[function(a,b,c){var d=a("../contexts"),e=a("./visitor"),f=a("./import-sequencer"),g=function(a,b){this._visitor=new e(this),this._importer=a,this._finish=b,this.context=new d.Eval,this.importCount=0,this.onceFileDetectionMap={},this.recursionDetector={},this._sequencer=new f(this._onSequencerEmpty.bind(this))};g.prototype={isReplacing:!1,run:function(a){try{this._visitor.visit(a)}catch(b){this.error=b}this.isFinished=!0,this._sequencer.tryRun()},_onSequencerEmpty:function(){this.isFinished&&this._finish(this.error)},visitImport:function(a,b){var c=a.options.inline;if(!a.css||c){var e=new d.Eval(this.context,this.context.frames.slice(0)),f=e.frames[0];this.importCount++,a.isVariableImport()?this._sequencer.addVariableImport(this.processImportNode.bind(this,a,e,f)):this.processImportNode(a,e,f)}b.visitDeeper=!1},processImportNode:function(a,b,c){var d,e=a.options.inline;try{d=a.evalForImport(b)}catch(f){f.filename||(f.index=a.index,f.filename=a.currentFileInfo.filename),a.css=!0,a.error=f}if(!d||d.css&&!e)this.importCount--,this.isFinished&&this._sequencer.tryRun();else{d.options.multiple&&(b.importMultiple=!0);for(var g=void 0===d.css,h=0;h0},resolveVisibility:function(a,b){if(!a.blocksVisibility()){if(this.isEmpty(a)&&!this.containsSilentNonBlockedChild(b))return;return a}var c=a.rules[0];if(this.keepOnlyVisibleChilds(c),!this.isEmpty(c))return a.ensureVisibility(),a.removeVisibilityBlock(),a},isVisibleRuleset:function(a){return!!a.firstRoot||!this.isEmpty(a)&&!(!a.root&&!this.hasVisibleSelector(a))}};var g=function(a){this._visitor=new e(this),this._context=a,this.utils=new f(a)};g.prototype={isReplacing:!0,run:function(a){return this._visitor.visit(a)},visitRule:function(a,b){if(!a.blocksVisibility()&&!a.variable)return a},visitMixinDefinition:function(a,b){a.frames=[]},visitExtend:function(a,b){},visitComment:function(a,b){if(!a.blocksVisibility()&&!a.isSilent(this._context))return a},visitMedia:function(a,b){var c=a.rules[0].rules;return a.accept(this._visitor),b.visitDeeper=!1,this.utils.resolveVisibility(a,c)},visitImport:function(a,b){if(!a.blocksVisibility())return a},visitDirective:function(a,b){return a.rules&&a.rules.length?this.visitDirectiveWithBody(a,b):this.visitDirectiveWithoutBody(a,b)},visitDirectiveWithBody:function(a,b){function c(a){var b=a.rules;return 1===b.length&&(!b[0].paths||0===b[0].paths.length)}function d(a){var b=a.rules;return c(a)?b[0].rules:b}var e=d(a);return a.accept(this._visitor),b.visitDeeper=!1,this.utils.isEmpty(a)||this._mergeRules(a.rules[0].rules),this.utils.resolveVisibility(a,e)},visitDirectiveWithoutBody:function(a,b){if(!a.blocksVisibility()){if("@charset"===a.name){if(this.charset){if(a.debugInfo){var c=new d.Comment("/* "+a.toCSS(this._context).replace(/\n/g,"")+" */\n");return c.debugInfo=a.debugInfo,this._visitor.visit(c)}return}this.charset=!0}return a}},checkValidNodes:function(a,b){if(a)for(var c=0;c0?a.accept(this._visitor):a.rules=null,b.visitDeeper=!1}return a.rules&&(this._mergeRules(a.rules),this._removeDuplicateRules(a.rules)),this.utils.isVisibleRuleset(a)&&(a.ensureVisibility(),d.splice(0,0,a)),1===d.length?d[0]:d},_compileRulesetPaths:function(a){a.paths&&(a.paths=a.paths.filter(function(a){var b;for(" "===a[0].elements[0].combinator.value&&(a[0].elements[0].combinator=new d.Combinator("")),b=0;b=0;e--)if(c=a[e],c instanceof d.Rule)if(f[c.name]){b=f[c.name],b instanceof d.Rule&&(b=f[c.name]=[f[c.name].toCSS(this._context)]);var g=c.toCSS(this._context);b.indexOf(g)!==-1?a.splice(e,1):b.push(g)}else f[c.name]=c}},_mergeRules:function(a){if(a){for(var b,c,e,f={},g=0;g1){c=b[0];var h=[],i=[];b.map(function(a){"+"===a.merge&&(i.length>0&&h.push(e(i)),i=[]),i.push(a)}),h.push(e(i)),c.value=g(h)}})}},visitAnonymous:function(a,b){if(!a.blocksVisibility())return a.accept(this._visitor),a}},b.exports=g},{"../tree":62,"./visitor":91}],91:[function(a,b,c){function d(a){return a}function e(a,b){var c,d;for(c in a)if(a.hasOwnProperty(c))switch(d=a[c],typeof d){case"function":d.prototype&&d.prototype.type&&(d.prototype.typeIndex=b++);break;case"object":b=e(d,b)}return b}var f=a("../tree"),g={visitDeeper:!0},h=!1,i=function(a){this._implementation=a,this._visitFnCache=[],h||(e(f,1),h=!0)};i.prototype={visit:function(a){if(!a)return a;var b=a.typeIndex;if(!b)return a;var c,e=this._visitFnCache,f=this._implementation,h=b<<1,i=1|h,j=e[h],k=e[i],l=g;if(l.visitDeeper=!0,j||(c="visit"+a.type,j=f[c]||d,k=f[c+"Out"]||d,e[h]=j,e[i]=k),j!==d){var m=j.call(f,a,l);f.isReplacing&&(a=m)}return l.visitDeeper&&a&&a.accept&&a.accept(this),k!=d&&k.call(f,a),a},visitArray:function(a,b){if(!a)return a;var c,d=a.length;if(b||!this._implementation.isReplacing){for(c=0;ck){for(var b=0,c=h.length-j;b .content {
+ text-align: center;
+ width: 100%;
+ background: url(../images/watermark.jpg) center -20px no-repeat;
+ background-size: auto 40%;
+}
+
+#login-form {
+ margin: 0 auto;
+ top: 35vh;
+ width: 95%;
+ max-width: 280px;
+ position: relative;
+
+ // Fixes input width and position in IE11
+ .row {
+ max-width: 280px;
+ margin-right: 0;
+ margin-left: 0;
+ }
+}
+
+#login-footer {
+ flex: 1;
+ color: @color-black-shade-text;
+}
+
+#login-addon {
+ position: absolute;
+ bottom: 0;
+ max-height: 30%;
+ margin: 1rem !important;
+ width: auto !important;
+ overflow: auto;
+
+ @media screen and (min-width: (@screen-width-small + 1px)) {
+ max-width: @screen-width-small;
+ margin: auto !important;
+ bottom: 1rem;
+ left: 0;
+ right: 0;
+ }
+}
+
+
+/*** Addressbook UI ***/
+
+#contactpic {
+ min-width: @layout-contact-icon-width;
+ min-height: @layout-contact-icon-width;
+ border-radius: .5rem;
+ overflow: hidden;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ img {
+ max-width: @layout-contact-icon-width;
+ max-height: @layout-contact-icon-height;
+ }
+}
+
+#contacthead {
+ .names {
+ margin-bottom: .5rem;
+
+ span.namefield {
+ font-size: 1.5rem;
+ font-weight: bold;
+ line-height: 1.2;
+ }
+ }
+
+ &.readonly {
+ .source.row {
+ color: @color-form-hint;
+ font-size: 90%;
+ margin-bottom: .25rem;
+ }
+ }
+}
diff --git a/skins/elastic/styles/variables.less b/skins/elastic/styles/variables.less
new file mode 100644
index 000000000..7df86b9d0
--- /dev/null
+++ b/skins/elastic/styles/variables.less
@@ -0,0 +1,47 @@
+/**
+ * Roundcube webmail styles for the Elastic skin
+ *
+ * Copyright (c) 2017-2018, The Roundcube Dev Team
+ *
+ * The contents are subject to the Creative Commons Attribution-ShareAlike
+ * License. It is allowed to copy, distribute, transmit and to adapt the work
+ * by keeping credits to the original authors in the README.md file.
+ * See http://creativecommons.org/licenses/by-sa/3.0/ for details.
+ */
+
+@import (reference) "fontawesome";
+@import (reference) "colors";
+
+@screen-width-large: 1200px;
+@screen-width-medium: 1024px;
+@screen-width-small: 768px;
+@screen-width-xs: 480px;
+@screen-width-mini: 320px;
+@screen-width-touch: @screen-width-medium;
+@screen-width-bs-phone: 576px;
+
+@page-font-size: 14px;
+@page-min-width: 240px;
+
+@layout-menu-width: 5rem;
+@layout-header-height: 4.2rem;
+@layout-header-font-size: 1rem;
+@layout-pagenav-height: 2rem;
+
+@layout-touch-header-height: @layout-header-height;
+@layout-touch-header-font-size: 1.2rem;
+@layout-touch-menu-record-height: 3.4rem;
+@layout-touch-menu-record-font-size: 1.2rem;
+@layout-touch-icon-width: 2.2em;
+
+@layout-mobile-menu-width: (@screen-width-mini * .85);
+
+@layout-contact-icon-width: 112px;
+@layout-contact-icon-height: 135px;
+
+@listing-line-height: 2.5rem;
+@listing-touch-line-height: 3.4rem;
+@listing-treetoggle-width: 1.5em;
+
+// Additional icons
+@icon-resize-corner: data-uri("data:image/svg+xml;charset=utf-8", "../images/corner-handle.svg"); // size: 512x512
diff --git a/skins/elastic/styles/widgets/buttons.less b/skins/elastic/styles/widgets/buttons.less
new file mode 100644
index 000000000..9a3ff4843
--- /dev/null
+++ b/skins/elastic/styles/widgets/buttons.less
@@ -0,0 +1,276 @@
+/**
+ * Roundcube webmail styles for the Elastic skin
+ *
+ * Copyright (c) 2017-2018, The Roundcube Dev Team
+ *
+ * The contents are subject to the Creative Commons Attribution-ShareAlike
+ * License. It is allowed to copy, distribute, transmit and to adapt the work
+ * by keeping credits to the original authors in the README.md file.
+ * See http://creativecommons.org/licenses/by-sa/3.0/ for details.
+ */
+
+/*** Buttons ***/
+
+
+a.rcmaddcontact {
+ display: none;
+}
+
+.button.disabled {
+ opacity: .5;
+}
+
+a.button {
+ text-decoration: none;
+
+ &.active {
+ cursor: pointer;
+ }
+}
+
+
+/* font-icons */
+
+a.button.icon,
+button.btn {
+ &:before {
+ &:extend(.font-icon-class);
+ }
+ &.toolbar-menu-button:before {
+ content: @fa-var-ellipsis-v;
+ }
+ &.menu-button:before {
+ content: @fa-var-bars;
+ }
+ &.back-sidebar-button:before,
+ &.back-content-button:before,
+ &.back-list-button:before {
+ content: @fa-var-chevron-left;
+ }
+ &.generate:before,
+ &.yes:before,
+ &.submit:before,
+ &.continue:before,
+ &.save:before {
+ content: @fa-var-check;
+ }
+ &.create:before {
+ content: @fa-var-plus-square;
+ }
+ &.edit:before {
+ content: @fa-var-pencil-alt;
+ }
+ &.qrcode:before {
+ content: @fa-var-qrcode;
+ }
+ &.search:before {
+ content: @fa-var-search;
+ }
+ &.filter:before {
+ content: @fa-var-filter;
+ font-size: 1.2em; // this icon is too-big in FA5
+ }
+ &.import:before {
+ content: @fa-var-upload;
+ }
+ &.export:before {
+ content: @fa-var-download;
+ }
+ &.discard:before,
+ &.delete:before {
+ .font-icon-regular(@fa-var-trash-alt);
+ }
+ &.next:before {
+ content: @fa-var-arrow-right;
+ }
+ &.restore:before {
+ content: @fa-var-undo;
+ }
+ &.send:before,
+ &.bounce:before {
+ content: @fa-var-paper-plane;
+ }
+ &.attach:before {
+ content: @fa-var-paperclip;
+ }
+ &.no:before,
+ &.close:before,
+ &.cancel:before {
+ content: @fa-var-times;
+ }
+ &.mark:before {
+ .font-icon-regular(@fa-var-star);
+ }
+ &.back:before {
+ content: @fa-var-chevron-left;
+ }
+ &.remove:before {
+ content: @fa-var-times;
+ }
+ &.unlock:before {
+ content: @fa-var-unlock;
+ }
+ &.help:before {
+ .font-icon-regular(@fa-var-life-ring);
+ }
+ &.toggleselect:before {
+ .font-icon-regular(@fa-var-check-square);
+ }
+ &.folders:before {
+ content: @fa-var-folder-open;
+ }
+ &.tools:before,
+ &.settings:before {
+ content: @fa-var-wrench;
+ }
+}
+
+a.btn,
+button.btn {
+ // FIXME: Maybe button text (and icon) alignment requires some rework
+ padding-bottom: .5rem;
+
+ &:before {
+ display: inline !important;
+ float: none !important;
+ }
+}
+
+a.button.icon {
+ &.dropdown:before {
+ content: @fa-var-caret-down;
+ font-size: 1em;
+ }
+ & > span.inner {
+ display: none;
+ }
+}
+
+html.touch {
+ .btn:focus {
+ box-shadow: none;
+ }
+}
+
+@floating-action-button-size: 4rem;
+
+.floating-action-buttons {
+ position: absolute;
+ right: 0;
+ bottom: 0;
+
+ .footer:not(:empty) + & {
+ bottom: @layout-touch-header-height;
+ }
+
+ a.button {
+ display: block;
+ float: left;
+ width: @floating-action-button-size;
+ height: @floating-action-button-size;
+ border-radius: 50%;
+ background: @color-taskmenu-background;
+ color: white;
+ opacity: .95;
+ box-shadow: 0 0 5px 5px @color-popover-shadow;
+ margin: 0 1rem 1rem 0;
+
+ &:before {
+ &:extend(.font-icon-class);
+ content: @fa-var-plus;
+ width: @floating-action-button-size;
+ height: @floating-action-button-size;
+ line-height: @floating-action-button-size;
+ }
+
+ .inner {
+ display: none;
+ }
+ }
+}
+
+/*** Bootstrap button style overrides ***/
+
+.btn-secondary {
+ color: @color-btn-secondary;
+ background: @color-btn-secondary-background;
+ border-color: @color-btn-secondary-background;
+
+ &:focus {
+ box-shadow: 0 0 0 .2rem fade(@color-btn-secondary-background, 50%);
+ }
+
+ &:hover {
+ background: darken(@color-btn-secondary-background, 8%);
+ border-color: darken(@color-btn-secondary-background, 10%);
+ }
+
+ &.disabled,
+ &:disabled {
+ background: lighten(@color-btn-secondary-background, 20%);
+ border-color: lighten(@color-btn-secondary-background, 20%);
+ opacity: 1;
+ }
+
+ &:not([disabled]):not(.disabled):active {
+ background: darken(@color-btn-secondary-background, 11%);
+ border-color: darken(@color-btn-secondary-background, 13%);
+ box-shadow: 0 0 0 .2rem fade(@color-btn-secondary-background, 53%);
+ }
+}
+
+.btn-primary {
+ color: @color-btn-primary;
+ background: @color-btn-primary-background;
+ border-color: @color-btn-primary-background;
+
+ &:focus {
+ box-shadow: 0 0 0 .2rem fade(@color-btn-primary-background, 50%);
+ }
+
+ &:hover {
+ background: darken(@color-btn-primary-background, 8%);
+ border-color: darken(@color-btn-primary-background, 10%);
+ }
+
+ &.disabled,
+ &:disabled {
+ background: lighten(@color-btn-primary-background, 20%);
+ border-color: lighten(@color-btn-primary-background, 20%);
+ opacity: 1;
+ }
+
+ &:not([disabled]):not(.disabled):active {
+ background: darken(@color-btn-primary-background, 11%);
+ border-color: darken(@color-btn-primary-background, 13%);
+ box-shadow: 0 0 0 .2rem fade(@color-btn-primary-background, 53%);
+ }
+}
+
+.btn-danger {
+ color: @color-btn-danger;
+ background: @color-btn-danger-background;
+ border-color: @color-btn-danger-background;
+
+ &:focus {
+ box-shadow: 0 0 0 .2rem fade(@color-btn-danger-background, 50%);
+ }
+
+ &:hover {
+ background: darken(@color-btn-danger-background, 8%);
+ border-color: darken(@color-btn-danger-background, 10%);
+ }
+
+ &.disabled,
+ &:disabled {
+ background: lighten(@color-btn-danger-background, 20%);
+ border-color: lighten(@color-btn-danger-background, 20%);
+ opacity: 1;
+ }
+
+ &:not([disabled]):not(.disabled):active {
+ background: darken(@color-btn-danger-background, 11%);
+ border-color: darken(@color-btn-danger-background, 13%);
+ box-shadow: 0 0 0 .2rem fade(@color-btn-danger-background, 53%);
+ }
+}
diff --git a/skins/elastic/styles/widgets/common.less b/skins/elastic/styles/widgets/common.less
new file mode 100644
index 000000000..f2d431b32
--- /dev/null
+++ b/skins/elastic/styles/widgets/common.less
@@ -0,0 +1,517 @@
+/**
+ * Roundcube webmail styles for the Elastic skin
+ *
+ * Copyright (c) 2017-2018, The Roundcube Dev Team
+ *
+ * The contents are subject to the Creative Commons Attribution-ShareAlike
+ * License. It is allowed to copy, distribute, transmit and to adapt the work
+ * by keeping credits to the original authors in the README.md file.
+ * See http://creativecommons.org/licenses/by-sa/3.0/ for details.
+ */
+
+/*** Common UI elements ***/
+
+.hidden,
+.voice {
+ display: none !important;
+}
+
+font.bold {
+ font-weight: bold;
+}
+
+#rcmdraglayer {
+ min-width: 260px;
+ width: 260px;
+ background-color: @color-drag-layer-background;
+ color: @color-drag-layer;
+ box-shadow: 3px 3px 5px @color-drag-layer-shadow;
+ border-radius: .3rem;
+ z-index: 250;
+ opacity: .92;
+ padding: .5rem;
+ white-space: nowrap;
+
+ div {
+ line-height: 1.6em;
+ .overflow-ellipsis;
+ }
+}
+
+.frame-content {
+ padding: 1rem;
+
+ h2 {
+ font-weight: bold;
+ font-size: 1.5em;
+ }
+
+ h3 {
+ font-weight: bold;
+ font-size: 1.25em;
+ }
+}
+
+.listbox {
+ .scroller {
+ width: 100%;
+ overflow-x: hidden;
+ overflow-y: auto;
+ }
+
+ .navlist {
+ height: 0;
+ flex: initial !important;
+
+ .listing {
+ border-bottom: 1px solid @color-layout-border;
+
+ tr:last-child td,
+ li:last-child {
+ border-bottom: 0;
+ }
+ }
+ }
+}
+
+
+.contact-header {
+ display: flex;
+ margin-bottom: 1rem;
+
+ .contact-photo {
+ min-width: @layout-contact-icon-width;
+ }
+
+ .contact-head {
+ margin-left: 1rem;
+
+ legend {
+ display: none;
+ }
+ }
+}
+
+
+@image-attachment-size: 250px;
+
+// this is when image thumbnails are enabled
+p.image-attachment {
+ position: relative;
+ border: 1px solid @color-border;
+ border-radius: .3rem;
+ background-color: @color-message-background;
+ float: left;
+ margin: .5rem;
+ min-width: 47%;
+ min-height: @image-attachment-size;
+ overflow: hidden;
+ // use flexbox to center the image
+ display: flex;
+ justify-content: center;
+
+ @media screen and (max-width: @screen-width-xs) {
+ float: none;
+ margin: .5rem 0 .5rem 0;
+ }
+
+ .image-link {
+ align-self: center;
+ text-align: center;
+ margin: 1.6rem .5rem;
+ }
+
+ span {
+ color: @color-form-hint;
+ padding: 0 .5rem;
+ font-size: 90%;
+ white-space: nowrap;
+ position: absolute;
+ line-height: 1.5rem;
+ }
+
+ .image-filename {
+ .overflow-ellipsis;
+ left: 0;
+ top: 0;
+ right: 0;
+ padding-right: 4rem;
+ }
+
+ .image-filesize {
+ right: 0;
+ top: 0;
+ }
+
+ .attachment-links {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: 100%;
+ text-align: center;
+
+ a {
+ text-decoration: none;
+ display: inline-block;
+ padding: 0 .5rem;
+ line-height: 1.5rem;
+ }
+
+ a:before {
+ &:extend(.font-icon-class);
+ display: inline-block;
+ }
+
+ a.open:before {
+ content: @fa-var-external-link-square-alt;
+ }
+
+ a.download:before {
+ content: @fa-var-download;
+ }
+ }
+}
+
+// this is when image thumbnails are disabled
+fieldset.image-attachment {
+ margin-top: .5rem;
+
+ legend {
+ color: @color-form-hint;
+ font-size: .9rem;
+ border-top: 1px solid lighten(@color-mail-headers, 50%);
+ margin: 0;
+ }
+
+ img {
+ max-width: 100%;
+ }
+}
+
+#folder-selector {
+ overflow-y: auto;
+}
+
+#layout > .content .watermark {
+ background: url(../images/watermark.jpg) center no-repeat;
+ width: 100%;
+ height: 100%;
+}
+
+.noselect {
+ user-select: none;
+ -moz-user-select: none;
+ -khtml-user-select: none;
+ -ms-user-select: none;
+ -webkit-user-select: none;
+}
+
+.iframe-loader {
+ width: 100%;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ background-color: rgba(255, 255, 255, .95);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ .spinner {
+ position: relative;
+ display: inline-block;
+ width: 7rem;
+ height: 7rem;
+ overflow: hidden;
+ text-indent: -999em;
+ color: @color-spinner-circle;
+ border: 1rem solid;
+ border-color: currentColor @color-spinner-item currentColor currentColor;
+ border-radius: 50%;
+ -webkit-animation: fa-spin 1s infinite linear;
+ animation: fa-spin 1s infinite linear;
+ }
+}
+
+.footer.toolbar + .iframe-loader {
+ top: @layout-header-height;
+ bottom: @layout-header-height;
+}
+
+// iOS: Fix scrolling of iframe, display scrollbars on scrollable elements
+.ios-scroll {
+ padding: 0;
+ -webkit-overflow-scrolling: touch !important;
+ overflow: scroll !important;
+
+ &.iframe-wrapper {
+ margin-top: 1px; // FIXME: without this scrolling hides the wrapper neighbours' border
+ }
+}
+
+.webkit-scroller {
+ &::-webkit-scrollbar {
+ -webkit-appearance: none;
+ }
+
+ &::-webkit-scrollbar:vertical {
+ width: .6rem;
+ }
+
+ &::-webkit-scrollbar:horizontal {
+ height: .6rem;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background-color: rgba(0, 0, 0, .4);
+ border-radius: .3rem;
+ border: 2px solid #fff;
+ }
+}
+
+.quota-widget {
+ width: 5rem;
+ max-width: 8rem;
+ padding: .5rem;
+ text-align: center;
+ position: relative;
+
+ .count {
+ display: block;
+ color: @color-quota-text;
+ font-size: 1.1rem;
+ line-height: 2;
+ }
+
+ .bar {
+ display: block;
+ height: .5rem;
+ position: absolute;
+ bottom: .85rem;
+ left: .5rem;
+ right: .5rem;
+ background-color: @color-quota-background;
+ border-radius: .25rem;
+ }
+
+ .value {
+ display: block;
+ background-color: @color-quota-value;
+ border-radius: .25rem;
+ height: .5rem;
+ opacity: .75;
+
+ &.warning {
+ background-color: @color-quota-value-warning;
+ }
+ }
+}
+
+.quota-info {
+ width: 100%;
+ display: table !important;
+
+ td,th {
+ text-align: center;
+ white-space: nowrap;
+ }
+
+ th {
+ border-top: 0;
+ }
+
+ .root {
+ line-height: 1;
+ font-style: italic;
+ color: @color-popover-separator;
+ background-color: @color-popover-separator-background;
+ }
+
+ th:first-child,
+ .name {
+ text-align: left;
+ }
+}
+
+.table-widget {
+ display: flex;
+ flex-direction: column;
+ margin-bottom: .5rem;
+ border: 1px solid @color-table-border;
+
+ & > .content {
+ overflow-x: auto;
+ flex-grow: 1;
+ height: 18.5em;
+
+ table th {
+ border-top: 0;
+ }
+ }
+
+ & > .footer {
+ height: 3.5rem;
+ border-top: 1px solid @color-table-border;
+
+ a.button {
+ padding: 0;
+ }
+ }
+
+ table {
+ margin: 0;
+ max-height: 18.5em;
+ }
+
+ // Options table is a table with first column for identifier/description
+ // and other columns for a state flag. E.g. ACL table
+ table.options-table {
+ td,th {
+ text-align: center;
+ vertical-align: middle;
+
+ &:first-child {
+ .overflow-ellipsis;
+ text-align: left;
+ }
+ }
+
+ tr:last-child td {
+ border-bottom: 1px solid @color-table-border;
+ }
+
+ tr.selected td {
+ background-color: @color-table-selected-background;
+ color: @color-table-selected;
+ outline: 0;
+ }
+
+ td:not(:first-child) span {
+ display: inline-block;
+ line-height: 1.25;
+
+ &:before {
+ &:extend(.font-icon-class);
+ }
+ }
+
+ td.enabled span:before {
+ content: @fa-var-check;
+ }
+
+ td.partial span:before {
+ opacity: .3;
+ content: @fa-var-check;
+ }
+ }
+}
+
+table.compact-table {
+ margin: 0;
+
+ *:not(.invalid-feedback) {
+ font-size: inherit;
+ }
+
+ td {
+ padding: .25rem;
+ border: 0;
+ }
+
+ td:first-child {
+ padding-left: 0;
+ }
+
+ td:last-child {
+ padding-right: 0;
+ }
+}
+
+table.table {
+ .checkbox-cell {
+ width: 3rem;
+ white-space: nowrap;
+ overflow: hidden;
+ text-align: center;
+
+ input.icon-checkbox + label {
+ padding: 0;
+
+ &:before {
+ line-height: 1;
+ height: 1em;
+ }
+ }
+ }
+
+ th.checkbox-cell {
+ padding: .75rem 0;
+ max-width: 1rem;
+
+ &:before {
+ &:extend(.font-icon-class);
+ cursor: pointer;
+ margin: 0 1rem;
+ line-height: 1;
+ }
+
+ &.subscription:before {
+ content: @fa-var-rss-square;
+ }
+
+ &.alarm:before {
+ .font-icon-regular(@fa-var-bell);
+ }
+
+ &.read:before {
+ content: @fa-var-eye;
+ }
+
+ &.write:before {
+ content: @fa-var-pencil-alt;
+ }
+ }
+
+ .buttons-cell {
+ width: 1%;
+ white-space: nowrap;
+ text-align: center;
+
+ a.button:before {
+ line-height: 1;
+ float: none;
+ display: inline-block;
+ }
+
+ @media screen and (min-width: @screen-width-xs) {
+ a.button .inner {
+ display: inline;
+ }
+ }
+ }
+
+ label {
+ margin: 0;
+ display: inline;
+ }
+
+ fieldset.tab-pane & thead th {
+ border: 0;
+ }
+}
+
+html.touch {
+ table.table {
+ th.checkbox-cell:before {
+ font-size: 1.5rem;
+ }
+ }
+}
+
+
+/* Bootstrap's .table style overwrites */
+.table {
+ thead th {
+ border-width: 1px;
+ white-space: nowrap;
+ }
+}
diff --git a/skins/elastic/styles/widgets/dialogs.less b/skins/elastic/styles/widgets/dialogs.less
new file mode 100644
index 000000000..ae5c709de
--- /dev/null
+++ b/skins/elastic/styles/widgets/dialogs.less
@@ -0,0 +1,220 @@
+/**
+ * Roundcube webmail styles for the Elastic skin
+ *
+ * Copyright (c) 2017-2018, The Roundcube Dev Team
+ *
+ * The contents are subject to the Creative Commons Attribution-ShareAlike
+ * License. It is allowed to copy, distribute, transmit and to adapt the work
+ * by keeping credits to the original authors in the README.md file.
+ * See http://creativecommons.org/licenses/by-sa/3.0/ for details.
+ */
+
+/*** Dialogs and popovers ***/
+
+.popupmenu {
+ display: none;
+ padding: 0;
+ min-width: 180px;
+
+ li > a {
+ width: 100%;
+ }
+
+ &.propform {
+ overflow: hidden;
+ margin-top: 1rem;
+ padding: .25rem; // so overflow do not truncate focus outline on inputs
+ }
+
+ &.simplelist {
+ min-width: 80px;
+ }
+}
+
+.popup.justified {
+ display: flex;
+ justify-content: space-around;
+}
+
+.popover-body {
+ padding: 0;
+ overflow-x: hidden;
+
+ & > .popupmenu {
+ display: block !important;
+ }
+}
+
+.popover {
+ box-shadow: 3px 3px 5px @color-popover-shadow;
+ padding: 0;
+
+ .popover-header {
+ // On mobile don't display popup arrows and titles
+ display: none;
+ }
+}
+
+#rcmKSearchpane {
+ width: auto;
+ max-width: none;
+ overflow: hidden;
+
+ li {
+ padding-right: .5rem;
+ }
+}
+
+html.layout-small,
+html.layout-phone {
+ .popover {
+ margin: 0 !important;
+ padding: 0;
+ right: 0;
+ bottom: 0;
+ top: 0;
+ width: @layout-mobile-menu-width;
+ transform: none !important;
+ border-radius: 0;
+ border: 0;
+ display: flex;
+ flex-direction: column;
+
+ div.arrow {
+ display: none;
+ }
+
+ .listing li:last-child {
+ border-bottom: 1px solid @color-list-border;
+ }
+ }
+
+ .popover:not(#rcmKSearchpane) {
+ left: initial !important;
+ }
+
+ .popover-overlay {
+ z-index: 1000;
+ background-color: @color-dialog-overlay-background;
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ width: 100%;
+ }
+
+ #rcmKSearchpane {
+ bottom: auto;
+ border: 1px solid @color-input-border;
+ box-shadow: none;
+ }
+
+ .popover-header {
+ display: block;
+ border-radius: 0;
+ border: 0;
+ padding: 0 .5em;
+ height: @layout-touch-header-height;
+ line-height: @layout-touch-header-height;
+ font-size: @layout-touch-header-font-size;
+ color: @color-popover-mobile-header;
+ background-color: @color-popover-mobile-header-background;
+
+ a {
+ display: inline-block;
+ width: 100%;
+ }
+ }
+
+ .popover-body > * {
+ max-height: 100% !important;
+ }
+}
+
+html.touch .popover {
+ .listing {
+ li a {
+ line-height: @layout-touch-menu-record-height;
+ font-size: @layout-touch-menu-record-font-size;
+ padding: 0 .5em;
+
+ &:before {
+ float: left; // overwrite icon float to have unified element height
+ }
+ }
+ }
+}
+
+/** PGP Key search/import dialog **/
+
+.pgpkeyimport {
+ div.key {
+ position: relative;
+ padding: .5rem 0;
+
+ &.revoked,
+ &.disabled {
+ color: @color-list-secondary;
+ }
+
+ label {
+ display: inline-block;
+ margin-right: 0.5em;
+ margin-bottom: 0;
+
+ &:after {
+ content: ":";
+ }
+
+ &.keyid {
+ display: none;
+ }
+ }
+
+ label + a,
+ label + span {
+ line-height: 2.6rem;
+ margin-right: 1em;
+ white-space: nowrap;
+ text-decoration: none;
+ }
+
+ label.keyid + a {
+ font-weight: bold;
+
+ &:before {
+ &:extend(.font-icon-class);
+ content: @fa-var-key;
+ }
+ }
+ }
+
+ ul.uids {
+ margin: 0;
+ padding: 0;
+ }
+
+ li.uid {
+ border: 0;
+ padding: .25rem 0 0 1.5em;
+ line-height: 1.5rem !important;
+ list-style-type: none;
+
+ &:before {
+ &:extend(.font-icon-class);
+ content: @fa-var-user;
+ opacity: 0.25;
+ font-size: 1em;
+ line-height: 1.25;
+ }
+ }
+
+ button.importkey {
+ position: absolute;
+ top: .5rem;
+ right: 0;
+ }
+
+ button[disabled] {
+ display: none;
+ }
+}
diff --git a/skins/elastic/styles/widgets/forms.less b/skins/elastic/styles/widgets/forms.less
new file mode 100644
index 000000000..f4a3b564b
--- /dev/null
+++ b/skins/elastic/styles/widgets/forms.less
@@ -0,0 +1,1304 @@
+/**
+ * Roundcube webmail styles for the Elastic skin
+ *
+ * Copyright (c) 2017-2018, The Roundcube Dev Team
+ *
+ * The contents are subject to the Creative Commons Attribution-ShareAlike
+ * License. It is allowed to copy, distribute, transmit and to adapt the work
+ * by keeping credits to the original authors in the README.md file.
+ * See http://creativecommons.org/licenses/by-sa/3.0/ for details.
+ */
+
+/*** Common form elements ***/
+
+#uploadform {
+ display: none;
+}
+
+form.smart-upload,
+input.smart-upload {
+ visibility: hidden;
+ width: 1px;
+ height: 1px;
+ opacity: 0;
+}
+
+
+.propform {
+ // TODO: do we need this?
+ &:not(.popupmenu) {
+ width: 100%;
+ }
+
+ // This is the way we can have multiple checkboxes in a single form field
+ .form-check td:not(.title) > label {
+ display: block;
+ margin: 0;
+ line-height: 2rem;
+
+ label {
+ margin-right: .5rem;
+ }
+ }
+
+ td.datetime {
+ display: flex;
+
+ input:first-child {
+ margin-right: .5rem;
+ }
+ input:last-child {
+ width: 75%;
+ }
+ }
+
+ td.rowbuttons {
+ width: 1%;
+ white-space: nowrap;
+
+ span {
+ display: none;
+ }
+
+ a {
+ padding: 0;
+ line-height: 2.3rem;
+ height: 2.3rem;
+ font-size: 1rem;
+
+ &:before {
+ &:extend(.font-icon-class);
+ content: @fa-var-plus;
+
+ @media screen and (min-width: (@screen-width-bs-phone + 1px)) {
+ margin: 0;
+ }
+ }
+
+ &.delete:before {
+ content: @fa-var-trash-alt;
+ }
+
+ &.advanced:before {
+ content: @fa-var-cog;
+ }
+
+ &:not(:last-child) {
+ margin-right: .25rem;
+ }
+ }
+ }
+
+ td.rowactions {
+ width: 1%;
+
+ .form-control {
+ width: auto;
+ }
+ }
+
+ td.rowtargets {
+ .input-group {
+ margin-bottom: .25rem;
+
+ *:first-child.input-group-prepend {
+ text-align: left;
+ min-width: 7.5em;
+
+ & > * {
+ width: 100%;
+ }
+ }
+ }
+
+ & > .advanced {
+ margin-top: .25rem;
+ }
+ }
+
+ td > .flexbox {
+ display: flex;
+
+ & > .multi-input {
+ width: 100%;
+ margin-left: .25rem;
+ }
+ }
+
+ .rulerow {
+ margin-bottom: .5rem;
+ }
+
+ &.groupped {
+ &.readonly {
+ legend {
+ margin: 0;
+ }
+
+ .row.input-group {
+ margin-bottom: 0 !important;
+ }
+
+ label {
+ min-width: 7rem;
+ // Overwrite Bootstrap .input-group-* style to make the label transparent
+ background-color: transparent;
+ border: 0;
+ border-radius: 0;
+ }
+ }
+
+ .row.input-group {
+ margin-bottom: .5rem;
+ flex-wrap: nowrap;
+
+ & > *:first-child {
+ .overflow-ellipsis;
+ min-width: 8rem;
+ height: auto;
+
+ &:not(select) {
+ padding: 0;
+ }
+
+ @media screen and (max-width: @screen-width-xs) {
+ min-width: 6rem;
+ width: 6rem;
+ flex-grow: unset;
+ }
+
+ label {
+ width: 100%;
+ }
+ }
+
+ & > *:nth-child(2) {
+ flex-grow: 30;
+ }
+
+ &:last-child {
+ margin-bottom: 1rem;
+ }
+
+ select {
+ text-align: left;
+ height: auto;
+ }
+
+ .content {
+ padding: 0;
+ display: flex;
+ flex-wrap: wrap;
+ border-radius: 0;
+
+ input {
+ border-radius: 0;
+ border-color: transparent;
+ }
+
+ .ff_street {
+ width: 100%;
+ }
+
+ .ff_locality {
+ width: 75%;
+ }
+
+ .ff_zipcode {
+ width: 25%;
+ }
+
+ .ff_country, .ff_region {
+ width: 50%;
+ }
+ }
+ }
+
+ .form-control-plaintext {
+ flex-grow: 1;
+ border: 0;
+ }
+ }
+
+ .addfield {
+ margin: 0;
+
+ select {
+ width: 8rem;
+ margin-top: .5rem;
+ }
+ }
+
+ .form-text {
+ font-size: 90%;
+ color: @color-form-hint;
+ }
+
+ // Some dialogs may use simple one-row forms like this
+ &.row.form-group {
+ margin-left: 0;
+ margin-right: 0;
+
+ label, div {
+ padding-left: 0;
+ padding-right: 0;
+ }
+ }
+
+ // Some forms may use multiple elements that are not part of .input-group
+ // add proper spacing
+ select + select,
+ select + .input-group {
+ padding-top: .5rem;
+ }
+
+ &.text-only {
+ margin-bottom: .25rem;
+
+ tr {
+ margin: 0;
+ }
+
+ label {
+ padding-bottom: 0 !important;
+ }
+
+ @media screen and (max-width: @screen-width-bs-phone) {
+ tr {
+ display: table-row;
+ }
+
+ td {
+ width: auto;
+
+ &:first-child {
+ width: 33%;
+ }
+ }
+ }
+ }
+}
+
+@media screen and (max-width: @screen-width-bs-phone) {
+ .propform {
+ table.compact-table {
+ overflow-x: initial;
+
+ tbody {
+ display: block;
+ }
+
+ .rowactions > select,
+ .flexbox > select {
+ width: 100%;
+ }
+
+ tr {
+ display: flex;
+ flex-direction: column;
+
+ td {
+ width: 100%;
+ padding-right: 0;
+ padding-left: 0;
+
+ &.rowbuttons {
+ text-align: right;
+
+ a {
+ margin-right: .5rem;
+
+ & > span {
+ display: inline;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+.propform,
+.formcontent {
+ legend {
+ font-weight: bold;
+ font-size: 1.2em;
+ }
+
+ label {
+ -webkit-hyphens: auto;
+ -ms-hyphens: auto;
+ hyphens: auto;
+ overflow: hidden;
+ }
+}
+
+@media screen and (max-width: @screen-width-bs-phone) {
+ .formcontent .text-only {
+ .form-group:not(tr) {
+ margin-bottom: .25rem;
+
+ .col-form-label {
+ width: 33%;
+
+ & + span {
+ width: 67%;
+ }
+ }
+ }
+ }
+}
+
+// Forms fixes for IE and Edge
+html.ms .propform {
+ .row:not(.form-check) > td {
+ display: flex;
+ }
+ @media screen and (min-width: @screen-width-bs-phone) {
+ .row.form-check > td {
+ display: flex;
+ }
+ }
+ @media screen and (max-width: (@screen-width-bs-phone - 1px)) {
+ .row {
+ display: block;
+ }
+ }
+}
+
+
+.formcontainer {
+ display: flex;
+ flex-direction: column;
+ justify-content:flex-start;
+ overflow-y: hidden !important;
+
+ .formcontent {
+ overflow-x: hidden;
+ overflow-y: auto;
+ }
+
+ .formbuttons {
+ padding: 0.5rem 1rem;
+
+ button {
+ margin-right: .5rem;
+ }
+ }
+
+ // Prevent button truncation on tablets
+ html.iframe.ipad &,
+ html.iframe.webkit.tablet & {
+ .formbuttons {
+ min-height: 4rem;
+ }
+ }
+
+ // We don't need buttons element on small devices
+ html.layout-small &,
+ html.layout-phone & {
+ .formbuttons {
+ display: none;
+ }
+ }
+}
+
+
+.formcontent {
+ padding: 1rem;
+
+ .row {
+ margin-right: 0; // without these the form is too wide causing horizontal scrollbar appearence
+ margin-left: 0;
+
+ // Note: We never use odd numbers here
+ .col, .col-2, .col-4, .col-6, .col-8, .col-10, .col-12,
+ .col-sm, .col-sm-2, .col-sm-4, .col-sm-6, .col-sm-8, .col-sm-10, .col-sm-12 {
+ // overwrite Bootstrap's redundant padding
+ padding: 0;
+ }
+
+ .form-control-plaintext,
+ label.col-form-label {
+ padding: .375rem .375rem .375rem 0;
+ }
+
+ .form-control-plaintext {
+ padding-bottom: 0;
+ border: 0;
+ }
+
+ @media screen and (max-width: @screen-width-bs-phone) {
+ &.form-group {
+ & > td label {
+ padding-bottom: 0;
+ }
+ }
+ }
+ }
+
+ .row.form-check {
+ padding: 0; // without these e.g. inputs in compose screen are not aligned properly
+ display: flex; // https://github.com/twbs/bootstrap/issues/22348
+ flex-wrap: nowrap;
+
+ // fixed checkbox vertical alignment
+ td:not(.col-form-label) {
+ padding: 0;
+ }
+
+ // alignment fixes needed because we do not stick precissely to Bootstrap's form structure
+ @media screen and (max-width: @screen-width-bs-phone) {
+ .col-6 {
+ max-width: 100%;
+ flex: auto;
+ }
+
+ & > *:last-child {
+ width: 1%;
+ min-width: 2.2em; // for icon-checkbox
+ padding-right: 15px;
+ }
+
+ &.with-link > *:last-child {
+ min-width: 8rem;
+ }
+ }
+
+ .form-check-input {
+ margin: 0; // fixes checkbox alignment with other inputs in a form
+ margin-top: .5rem;
+ margin-bottom: .5rem;
+
+ & + label {
+ display: inline;
+ }
+ }
+
+ td > label {
+ padding-bottom: 0;
+ }
+ }
+
+ .nav-tabs {
+ margin-bottom: 1rem;
+
+ &:empty {
+ display: none;
+ }
+ }
+
+ .hint {
+ margin-bottom: 1em;
+ font-style: italic;
+ }
+
+ // RAW (CodeMirror) editor
+ &.raweditor {
+ height: 100%;
+
+ form {
+ height: 100%;
+ }
+
+ textarea {
+ font-family: monospace;
+ height: 100%;
+ }
+
+ .CodeMirror {
+ border: 1px solid @color-input-border;
+ border-radius: .3rem;
+ height: 100%;
+ color: @color-font;
+ }
+
+ .CodeMirror-focused {
+ border-color: @color-input-border-focus;
+ box-shadow: 0 0 0 .2rem @color-input-border-focus-shadow;
+ }
+
+ .CodeMirror-linebackground.line-error {
+ background-color: @color-error;
+ opacity: 0.4;
+ }
+
+ .errorGutter {
+ width: .8em;
+ }
+ }
+}
+
+@media screen and (max-width: @screen-width-mini) {
+ .formcontent {
+ .col-form-label {
+ flex: auto;
+ max-width: 100%;
+ }
+ .col-6, .col-8, .col-10 {
+ flex: auto;
+ max-width: 100%;
+ }
+ }
+}
+
+
+/* Some common icons for "iconized inputs" */
+.input-group .icon {
+ text-decoration: none;
+ padding: .375rem .5rem;
+
+ &:before {
+ &:extend(.font-icon-class);
+ margin: 0 !important;
+ line-height: 1;
+ font-size: 1.1em;
+ }
+ &.user:before {
+ content: @fa-var-user;
+ }
+ &.pass:before {
+ content: @fa-var-lock;
+ }
+ &.host:before {
+ content: @fa-var-home;
+ }
+ &.cancel:before {
+ content: @fa-var-times;
+ }
+ &.delete:before {
+ content: @fa-var-trash-alt;
+ }
+ &.edit:before {
+ content: @fa-var-pencil-alt;
+ }
+ &.add:before {
+ content: @fa-var-plus;
+ }
+ &.search:before {
+ content: @fa-var-search;
+ }
+ &.filter:before {
+ content: @fa-var-filter;
+ }
+ &.key:before {
+ content: @fa-var-key;
+ }
+
+ .inner {
+ display: none;
+ }
+}
+
+td.editfield { width: 99%; /* TODO */ }
+
+
+ul.proplist {
+ padding-left: 0;
+ margin-bottom: 0;
+
+ li {
+ list-style-type: none;
+ line-height: 2.4rem;
+ margin-bottom: .25rem;
+ display: flex;
+
+ input[type=radio] {
+ vertical-align: middle;
+ margin-right: .5em;
+
+ & + .input-group {
+ flex-grow: 1;
+ }
+ }
+
+ label {
+ margin: 0;
+ }
+
+ .icon-checkbox {
+ height: 2.4rem !important;
+ margin-left: -1.2em;
+
+ & + label {
+ height: 1.8rem;
+ margin-right: .5rem;
+ padding: 0;
+ }
+ }
+
+ select {
+ width: auto;
+ display: inline;
+ }
+ }
+}
+
+
+.checklist {
+ .form-check-input + label {
+ margin-right: .25rem;
+ line-height: 1;
+ }
+
+ & > label {
+ display: inline-block !important;
+ }
+}
+
+
+/*** Forms in popups ***/
+
+.popup form.propform {
+ padding: .5rem;
+ overflow-x: hidden;
+}
+
+.popupmenu.form {
+ &.nolist {
+ padding: 0 .5rem;
+ }
+
+ ul {
+ list-style-type: none;
+ padding: 0;
+ margin: 0;
+ }
+
+ li:not(.separator) {
+ padding: 0 1rem;
+
+ label {
+ margin: 0;
+ line-height: @listing-line-height;
+
+ input {
+ margin-right: .5rem;
+ }
+ }
+ }
+
+ input {
+ vertical-align: middle;
+ }
+
+ select {
+ margin: .5rem 0;
+ }
+
+ .buttons {
+ text-align: center;
+ padding: .5rem;
+ }
+}
+
+html.touch .popupmenu.form {
+ li {
+ input.icon-checkbox + label:before {
+ line-height: 1.4;
+ }
+ }
+}
+
+
+/*** Smart list (multiple input) field ***/
+
+.multi-input {
+ & > .content {
+ max-height: 11.65em;
+ overflow: hidden;
+ overflow-y: auto;
+ border-radius: .25rem;
+ border: 1px solid @color-input-border;
+
+ &.focused {
+ .style-input-focus;
+ }
+
+ // TODO: style button focus
+ }
+
+ a.icon {
+ &.reset:before {
+ &:extend(.font-icon-class);
+ content: @fa-var-trash-alt;
+ }
+ }
+
+ input.form-control {
+ padding-left: .75rem;
+ }
+
+ input,
+ input:focus,
+ .input-group-text {
+ border-radius: 0;
+ border: 0;
+ border-bottom: 1px solid @color-input-border;
+ box-shadow: none;
+ }
+
+ .input-group-text {
+ border-left: 1px solid @color-input-border;
+ }
+
+ .input-group-append {
+ margin-left: 0;
+ }
+
+ .input-group {
+ margin: 0 !important;
+ flex-wrap: nowrap; // Bootstrap makes them wrappable (imho)
+
+ &:last-child * {
+ border-bottom: 0;
+ }
+ }
+
+ & + .btn {
+ margin-top: .5rem;
+ }
+
+ &.is-invalid {
+ & > .content {
+ border: 1px solid @color-input-border-invalid;
+ &.focused {
+ border-color: @color-input-border-invalid;
+ box-shadow: 0 0 0 .2rem @color-input-border-invalid-shadow;
+ }
+ }
+
+ & > .invalid-feedback {
+ display: inline-block;
+ }
+ }
+}
+
+
+/*** Files upload widget with list of files, upload form and drop area ***/
+
+.file-upload {
+ padding: 1rem 1rem 12rem;
+ margin: 0 1rem .25rem 1rem;
+ border-radius: .5rem;
+ border: .2rem dashed @color-table-border;
+
+ // TODO background image
+
+ .upload-form {
+ text-align: center;
+ padding-bottom: 1em;
+ }
+
+ .hint {
+ margin-bottom: .5rem;
+ color: @color-form-hint;
+ }
+
+ .attachmentslist {
+ li {
+ position: relative;
+ display: flex;
+ padding-right: 1.5em;
+
+ a.filename {
+ flex: 1;
+ }
+
+ a.delete,
+ a.cancelupload {
+ position: absolute;
+ right: 0;
+
+ &:before {
+ margin: 0;
+ }
+ }
+
+ .inner {
+ display: none;
+ }
+ }
+ }
+
+ &.droptarget {
+ &.active {
+ border-color: darken(@color-toolbar-button-background-hover, 20%);
+ }
+
+ &.hover {
+ border-color: darken(@color-toolbar-button-background-hover, 20%);
+ background-color: @color-toolbar-button-background-hover;
+ }
+ }
+}
+
+
+/*** Smart recipient input field ***/
+
+@recipient-input-margin-fix: .25rem;
+
+.recipient-input {
+ display: flex;
+ flex-wrap: wrap;
+ padding: 0 .75rem @recipient-input-margin-fix .75rem;
+ list-style-type: none;
+ cursor: text;
+
+ &.focus {
+ .style-input-focus;
+ }
+
+ .recipient {
+ display: flex;
+ position: relative;
+ max-width: 50%;
+ border: 1px solid @color-recipient-input-border;
+ background-color: @color-recipient-input-background;
+ border-radius: .25em;
+ padding: 0 .25em;
+ margin-top: @recipient-input-margin-fix;
+ margin-right: .2em;
+ white-space: nowrap;
+ cursor: default;
+
+ @media screen and (max-width: 450px) {
+ width: 100%;
+ max-width: 100%;
+ }
+ }
+
+ .name {
+ .overflow-ellipsis;
+ flex-grow: 1;
+ display: inline-block;
+ line-height: 1.1;
+ padding: .25rem;
+ vertical-align: middle;
+ }
+
+ .email {
+ text-indent: -5000rem;
+ display: inline-block;
+ width: 0;
+ }
+
+ .quotes {
+ position: absolute;
+ width: 0;
+ opacity: 0;
+ }
+
+ a.button.icon {
+ font-size: .8em;
+ cursor: pointer;
+ padding: 0 0 0 .25em;
+
+ &:before {
+ float: none;
+ display: inline-block;
+ width: 1em;
+ margin: 0;
+ line-height: 1.5;
+ }
+ }
+
+ input {
+ width: 15px;
+ background: transparent !important;
+ border: 0 !important;
+ margin-top: @recipient-input-margin-fix;
+ outline: 0;
+ line-height: 1.5;
+ }
+}
+
+/*** Tagedit widget (from jqueryui plugin) ***/
+
+.tagedit-list {
+ display: flex;
+ flex-wrap: wrap;
+ padding: 0 .75rem @recipient-input-margin-fix .75rem;
+ margin: 0;
+ list-style-type: none;
+ min-height: 2.3rem;
+
+ & + .placeholder {
+ display: none;
+ }
+
+ &[tabindex="-1"] {
+ .style-input-focus;
+ }
+
+ li.tagedit-listelement-new {
+ margin-top: @recipient-input-margin-fix;
+
+ input {
+ width: 15px;
+ background: transparent !important;
+ border: 0;
+ outline: 0;
+ margin: 0;
+ padding: 0;
+ line-height: 1.5;
+
+ &.tagedit-input-disabled {
+ visibility: hidden;
+ }
+ }
+ }
+
+ li.tagedit-listelement-old {
+ max-width: 50%;
+ border: 1px solid @color-recipient-input-border;
+ background-color: @color-recipient-input-background;
+ border-radius: .25em;
+ margin-top: @recipient-input-margin-fix;
+ margin-right: .2em;
+ white-space: nowrap;
+
+ a /* TODO: .tagedit-close, .tagedit-break, .tagedit-delete, .tagedit-save */ {
+ font-size: .8em;
+ cursor: pointer;
+ display: inline-block;
+ width: 1.1em;
+ overflow: hidden;
+ vertical-align: middle;
+ margin-right: .2rem;
+
+ &:before {
+ &:extend(.font-icon-class);
+ content: @fa-var-times;
+ width: 1em;
+ line-height: 1.2;
+ }
+ }
+
+ span {
+ .overflow-ellipsis;
+ flex-grow: 1;
+ display: inline-block;
+ line-height: 1.4;
+ padding: 0 .25rem;
+ vertical-align: middle;
+ }
+ }
+
+ li.tagedit-listelement-focus {
+ // TODO
+ }
+}
+
+
+/*** Skin selection widget ***/
+
+.skinselection {
+ white-space: nowrap;
+ display: table-row;
+
+ & > span {
+ display: table-cell;
+ vertical-align: middle;
+ padding: .1em .5em;
+ white-space: normal;
+
+ &:last-child {
+ padding-right: 0;
+ }
+ }
+
+ .skinitem input {
+ width: auto;
+ }
+
+ .skinname {
+ font-weight: bold;
+ }
+
+ .skinlicense,
+ .skinlicense a {
+ font-style: italic;
+ text-decoration: none;
+ }
+
+ .skinlicense a:hover {
+ text-decoration: underline;
+ }
+
+ .skinlicense,
+ .skinauthor {
+ font-size: 90%;
+ }
+
+ .skinthumbnail {
+ width: 64px;
+ height: 64px;
+ border: 1px solid @color-input-border;
+ background: #fff;
+ border-radius: 4px;
+ }
+}
+
+/*** Image upload widget ***/
+
+.image-upload {
+ position: relative;
+ overflow: hidden;
+ cursor: pointer;
+ background-color: @color-image-upload-background;
+
+ a.button {
+ display: none;
+ position: absolute;
+ left: 0;
+ top: 0;
+ background-color: rgba(255, 255, 255, .85);
+ border-radius: 5px;
+ width: 2.5em;
+ padding: .5em;
+ margin: .5em;
+ line-height: 1;
+ }
+
+ &.changed a.button {
+ display: inline;
+ }
+}
+
+
+/*** Pretty icon checkbox ***/
+
+input.icon-checkbox {
+ opacity: 0;
+ margin-left: -1.5em;
+ cursor: pointer;
+
+ & + label {
+ margin: 0;
+ display: inline;
+ font-size: 1.2rem;
+ cursor: pointer;
+ width: 1.5em;
+
+ &:before {
+ &:extend(.font-icon-class);
+ content: @fa-var-toggle-off;
+ margin: 0;
+ color: @color-checkbox;
+ height: 2rem;
+ }
+
+ // A link after checkbox in a form, used in e.g. newmail_notifier plugin
+ & + a {
+ display: inline-block;
+ line-height: 2rem;
+ padding-left: .5rem;
+ white-space: nowrap;
+ }
+
+ .input-group & {
+ padding: 0 .25rem 0 0;
+
+ &:before {
+ line-height: 1;
+ height: auto;
+ }
+ }
+ }
+
+ &:disabled + label {
+ opacity: 0.4;
+ pointer-events: none;
+ }
+
+ &:checked + label:before {
+ content: @fa-var-toggle-on;
+ color: @color-checkbox-checked;
+ }
+
+ &:focus + label:before {
+ color: @color-checkbox-focus;
+ }
+
+ &:checked:focus + label:before {
+ color: @color-checkbox-checked-focus;
+ }
+
+ &.form-check-input + label {
+ font-size: 1.25rem;
+ padding-top: .25rem;
+ }
+}
+
+html.touch input.icon-checkbox + label {
+ font-size: 1.5rem;
+}
+
+
+/*** HTML editor widget (and TinyMCE editor) ***/
+
+.mce-tinymce {
+ &.mce-container.mce-panel {
+ border-radius: .25rem;
+ border-color: @color-input-border;
+ overflow: hidden;
+ }
+
+ .mce-btn,
+ .mce-panel {
+ background-color: @color-input-addon-background;
+ }
+}
+
+.html-editor {
+ position: relative;
+ display: flex;
+ margin-bottom: .25rem;
+
+ & > .nav {
+ border-color: transparent;
+ z-index: 1;
+ position: absolute;
+ top: 1px;
+ right: 1rem;
+
+ a.active {
+ border-color: @color-input-border !important;
+
+ &.mode-html {
+ background-color: @color-input-addon-background;
+ border-bottom-color: @color-input-addon-background !important;
+ }
+
+ &.mode-plain {
+ border-bottom-color: #fff !important;
+ }
+ }
+
+ a:hover {
+ border-bottom-color: transparent;
+ }
+ }
+
+ & > iframe, // e.g. mailvelope frame
+ & > .googie_edit_layer,
+ & > .mce-tinymce,
+ & > textarea {
+ margin-top: 2.55rem;
+ font-family: monospace;
+ width: 100% !important;
+ }
+
+ & > iframe { // e.g. mailvelope frame
+ border-radius: .3rem;
+ border: 1px solid @color-input-border;
+ min-height: 35em;
+ }
+}
+
+
+/*** GoogieSpell widget ***/
+
+.googie_window {
+ width: 16rem;
+}
+
+.googie_edit_layer {
+ font-family: monospace;
+
+ // from Bootstrap's textarea
+ padding: .5rem .75rem;
+ border: 1px solid @color-input-border;
+ border-radius: .3rem;
+ line-height: 1.25;
+}
+
+.googie_link {
+ color: @color-spellcheck-link;
+ text-decoration: underline;
+ cursor: pointer;
+}
+
+.googie_list {
+ td {
+ min-width: 8rem;
+ width: auto;
+
+ &.googie_list_onhover {
+ color: @color-toolbarmenu-hover;
+ background-color: @color-toolbarmenu-hover-background;
+ }
+
+ .googie_list_revert:before {
+ &:extend(.font-icon-class);
+ content: @fa-var-plus-square;
+ }
+
+ .googie_add_to_dict:before {
+ &:extend(.font-icon-class);
+ content: @fa-var-plus-square;
+ }
+ }
+
+ input {
+ display: inline-block;
+ margin: .5rem .5rem .5rem 0 !important;
+ padding: .5rem .75rem !important;
+ }
+}
+
+
+/*** General browser hacks ***/
+
+// Remove outline on selects in Firefox
+@-moz-document url-prefix() {
+ select:-moz-focusring {
+ color: transparent !important;
+ text-shadow: 0 0 0 @color-font !important;
+ }
+}
+
+
+/*** Bootstrap style overrides ***/
+
+// Fixes height of some text inputs
+// FIXME: Really? See managesieve's vacation form for all of these
+td.input-group .input-group-append,
+td.datetime input,
+td.input-group input {
+ height: ~"calc(2.25rem + 2px)";
+}
+
+.form-control {
+ color: @color-font;
+
+ &:focus {
+ color: @color-font;
+ border-color: @color-input-border-focus;
+ box-shadow: 0 0 0 .2rem @color-input-border-focus-shadow;
+ }
+
+ &.is-invalid {
+ border-color: @color-input-border-invalid;
+
+ &:focus {
+ border-color: @color-input-border-invalid;
+ box-shadow: 0 0 0 .2rem @color-input-border-invalid-shadow;
+ }
+ }
+}
+
+.invalid-feedback {
+ color: @color-error;
+}
+
+.form-group {
+ margin-bottom: .5rem;
+}
+
+.input-group-text {
+ color: @color-input;
+ background-color: @color-input-addon-background;
+}
diff --git a/skins/elastic/styles/widgets/jqueryui.less b/skins/elastic/styles/widgets/jqueryui.less
new file mode 100644
index 000000000..7dec0b3c2
--- /dev/null
+++ b/skins/elastic/styles/widgets/jqueryui.less
@@ -0,0 +1,351 @@
+/**
+ * Roundcube webmail styles for the Elastic skin
+ *
+ * Copyright (c) 2017-2018, The Roundcube Dev Team
+ *
+ * The contents are subject to the Creative Commons Attribution-ShareAlike
+ * License. It is allowed to copy, distribute, transmit and to adapt the work
+ * by keeping credits to the original authors in the README.md file.
+ * See http://creativecommons.org/licenses/by-sa/3.0/ for details.
+ */
+
+/*** jQuery-UI widgets' style overrides ***/
+
+.ui-widget-overlay {
+ background-color: @color-dialog-overlay-background;
+ opacity: 1 !important; // override jQuery-UI opacity, the color above is semi-transparent
+}
+
+.ui-widget {
+ border: 1px solid @color-datepicker-border;
+ box-shadow: 3px 3px 5px @color-popover-shadow;
+ border-radius: .3rem;
+}
+
+.ui-menu {
+ overflow-y: auto;
+ overflow-x: hidden;
+ max-height: 400px;
+ border-radius: .3rem;
+
+ .ui-state-active {
+ border: 0 !important;
+ background-color: @color-toolbarmenu-hover-background !important;
+ }
+
+ .ui-menu-item {
+ white-space: nowrap;
+ }
+
+ .ui-menu-item-wrapper {
+ margin: 0 !important;
+ }
+}
+
+.ui-dialog {
+ border-radius: 0;
+ box-shadow: none;
+
+ &.no-titlebar {
+ .ui-dialog-titlebar {
+ display: none;
+ }
+ }
+
+ .ui-dialog-titlebar {
+ height: @layout-header-height;
+ border-bottom: 1px solid @color-dialog-header-border;
+
+ button {
+ &:before {
+ margin: 0;
+ }
+ }
+ }
+
+ .ui-dialog-title {
+ line-height: @layout-header-height;
+ font-size: 1.25rem;
+ padding: 0 3rem 0 1rem;
+ color: @color-dialog-header;
+ }
+
+ .ui-dialog-titlebar-close {
+ border: 0;
+ color: @color-dialog-header;
+ background: transparent;
+ right: 0;
+ top: 0;
+ position: absolute;
+ height: (@layout-header-height - .7rem);
+ margin: .25rem;
+ cursor: pointer;
+
+ &:before {
+ &:extend(.font-icon-class);
+ content: @fa-var-times;
+ }
+ }
+
+ .ui-dialog-content {
+ // fixes resize issue e.g. in qr-code dialog
+ box-sizing: initial;
+
+ & > .popupmenu {
+ display: block !important;
+ }
+ }
+
+ .ui-dialog-buttonpane {
+ .ui-dialog-buttonset {
+ display: flex;
+ justify-content: flex-end;
+
+ button {
+ .overflow-ellipsis;
+ min-width: 5rem;
+ margin: .65rem .3rem;
+
+ &:last-child {
+ margin-right: 0;
+ }
+ }
+ }
+ }
+
+ iframe,
+ .ui-dialog-content.iframe {
+ padding: 0;
+ width: 100% !important;
+ height: 100%;
+ border: 0;
+ overflow: hidden;
+ }
+}
+
+// Overwriting this icon generally prevents from loading bigger images sprite from jQuery-UI
+.ui-widget-content .ui-icon.ui-resizable-se {
+ background: @icon-resize-corner;
+ background-size: cover;
+}
+
+/* FIXME: why do I need !important here? */
+
+@media screen and (max-width: @screen-width-xs) {
+ .ui-dialog {
+ width: 100% !important;
+ height: 100% !important;
+ display: flex;
+ flex-direction: column;
+
+ .ui-resizable-handle,
+ .ui-dialog-titlebar-close {
+ display: none !important;
+ }
+
+ .ui-dialog-titlebar {
+ height: @layout-touch-header-height;
+ text-align: center;
+ }
+
+ .ui-dialog-title {
+ line-height: @layout-touch-header-height;
+ font-size: @layout-header-font-size;
+ padding: 0 1rem;
+ }
+
+ .ui-dialog-content {
+ flex: 1;
+ &:not(.iframe) {
+ padding: 1rem;
+ }
+ }
+
+ .ui-dialog-buttonpane {
+ padding: 0 !important;
+ text-align: center !important;
+ border-top: 1px solid @color-dialog-header-border;
+ height: @layout-header-height !important;
+
+ .ui-dialog-buttonset {
+ justify-content: space-around;
+
+ button {
+ margin: 0 !important;
+ border: 0 !important;
+ height: @layout-header-height;
+ box-shadow: none;
+
+ &:before {
+ display: block !important;
+ width: auto;
+ height: 1.25em;
+ margin: 0;
+ }
+
+ &:active {
+ box-shadow: none;
+ }
+
+ &.btn-primary,
+ &.btn-secondary {
+ color: @color-toolbar-button;
+ background: transparent;
+ }
+
+ &.btn-danger {
+ color: @color-btn-danger-background;
+ background: transparent;
+ }
+
+ &.disabled,
+ &:disabled {
+ opacity: .5;
+ }
+ }
+ }
+ }
+ }
+}
+
+/* Datepicker widget */
+
+.ui-datepicker {
+ z-index: 3 !important; // above Bootstrap form controls that use z-index: 3
+ // Always display datepicker centered, overwriting widgets position
+ position: fixed !important;
+ top: 50% !important;
+ left: 50% !important;
+ transform: translate(-50%, -50%);
+ box-shadow: 10px 10px 10px 1000px @color-dialog-overlay-background;
+
+ .ui-datepicker-header,
+ .ui-datepicker-title {
+ line-height: 4rem;
+ height: 4rem;
+ padding: 0;
+ }
+
+ .ui-datepicker-header {
+ border-bottom: 1px solid @color-dialog-header-border;
+
+ a {
+ height: 4rem;
+ }
+
+ select {
+ display: inline-block;
+ }
+ }
+ .ui-icon {
+ background-image: none !important;
+ background-position: none !important;
+ }
+
+ .ui-datepicker-prev,
+ .ui-datepicker-next {
+ cursor: pointer;
+ width: auto;
+
+ &:before {
+ &:extend(.font-icon-class);
+ content: "\f053";
+ margin: 0 .25em;
+ height: auto;
+ width: 1em;
+ }
+ }
+
+ .ui-datepicker-prev:before {
+ content: "\f053";
+ }
+
+ .ui-datepicker-next:before {
+ content: "\f054";
+ }
+
+ td a {
+ padding: 0;
+ line-height: 1.8em;
+ border-radius: .3rem;
+ }
+
+ .ui-state-default,
+ &.ui-widget-content .ui-state-default {
+ border: 0;
+ background: transparent;
+ color: @color-datepicker-font;
+ }
+
+ .ui-state-highlight,
+ &.ui-widget-content .ui-state-highlight {
+ background: @color-datepicker-highlight-background;
+ color: @color-datepicker-highlight;
+ }
+
+ .ui-state-active,
+ &.ui-widget-content .ui-state-active {
+ background: @color-datepicker-active-background;
+ color: @color-datepicker-active;
+ font-weight: bold;
+ }
+}
+
+html.touch {
+ .ui-datepicker {
+ min-width: (@screen-width-mini - 20px);
+
+ td a {
+ font-size: 1.2em;
+ line-height: 2.2em;
+ }
+ }
+}
+
+.minicolors-panel {
+ border: 1px solid @color-datepicker-border;
+ box-shadow: 3px 3px 5px @color-popover-shadow;
+ border-radius: .3rem;
+ height: 152px;
+ padding: 1px;
+}
+
+.input-group {
+ .minicolors-input {
+ width: 100%;
+ // needed so minicolors panel is not out of screen
+ // when the input is on the right side, e.g. Calendar plugin settings
+ // This is obviously minicolors script issue
+ min-width: 130px;
+ border-left: 0;
+ border-right: 0;
+ }
+
+ .minicolors-swatch {
+ height: 25px !important;
+ }
+}
+
+@media screen and (max-width: @screen-width-mini) {
+ .ui-widget-content {
+ border-radius: 0;
+ left: 0 !important;
+ }
+
+ .ui-menu {
+ border-radius: .3rem;
+ left: 15px !important;
+ right: 15px;
+ width: auto;
+ }
+
+ .ui-dialog {
+ .ui-dialog-content:not(.iframe) {
+ padding: .65rem;
+ }
+ }
+
+ .ui-autocomplete {
+ // TODO: e.g. time input autocompletion on mobile
+ }
+}
diff --git a/skins/elastic/styles/widgets/lists.less b/skins/elastic/styles/widgets/lists.less
new file mode 100644
index 000000000..ead645c2e
--- /dev/null
+++ b/skins/elastic/styles/widgets/lists.less
@@ -0,0 +1,975 @@
+/**
+ * Roundcube webmail styles for the Elastic skin
+ *
+ * Copyright (c) 2017-2018, The Roundcube Dev Team
+ *
+ * The contents are subject to the Creative Commons Attribution-ShareAlike
+ * License. It is allowed to copy, distribute, transmit and to adapt the work
+ * by keeping credits to the original authors in the README.md file.
+ * See http://creativecommons.org/licenses/by-sa/3.0/ for details.
+ */
+
+/*** List and treelist widgets ***/
+
+.listing {
+ tbody td,
+ li {
+ border-bottom: 1px solid @color-list-border;
+ cursor: default;
+ font-weight: normal;
+ line-height: @listing-line-height;
+ }
+
+ tbody td,
+ li a {
+ padding: 0 .5rem;
+ white-space: nowrap;
+ vertical-align: middle;
+ color: @color-list;
+ }
+
+ tbody td {
+ .overflow-ellipsis;
+ outline: none;
+
+ a {
+ color: @color-list;
+ }
+ }
+
+ li a {
+ display: block;
+ text-decoration: none;
+ cursor: default;
+ width: 100%;
+ }
+
+ li.selected,
+ tr.selected td {
+ color: @color-list-selected;
+ background-color: @color-list-selected-background;
+ }
+
+ td.selection {
+ padding: 0 0 0 .5em;
+ width: 2em;
+ text-align: center;
+
+ & > input {
+ vertical-align: middle;
+ }
+ }
+
+ &:not(.withselection) td.selection {
+ display: none;
+ }
+
+ td.name {
+ .overflow-ellipsis;
+ }
+
+ td.action {
+ padding: 0 .5em;
+ width: 2em;
+ text-align: center;
+
+ &:empty {
+ width: 0;
+ }
+
+ a {
+ display: block;
+ overflow: hidden;
+ text-decoration: none;
+
+ &:before {
+ &:extend(.font-icon-class);
+ margin: 0;
+ font-size: 1rem;
+ }
+ }
+
+ a.pushgroup:before {
+ content: @fa-var-chevron-right;
+ }
+ }
+
+ li.droptarget > a,
+ tr.droptarget > td {
+ background-color: @color-list-droptarget-background;
+ }
+
+ li.disabled,
+ tr.disabled td {
+ color: @color-list-deleted;
+ }
+
+ li > a.virtual,
+ li.virtual > a {
+ opacity: .4;
+ }
+
+ span.secondary {
+ color: @color-list-secondary;
+ }
+
+ // Focus indicator
+ @media screen and (min-width: @screen-width-large) {
+ li > a,
+ tbody tr > td:first-child,
+ &:not(.withselection) tbody tr > td.selection + td {
+ border-left: 2px solid transparent;
+ }
+
+ li > a:focus,
+ &.focus tbody tr.focused > td:first-child,
+ &.focus:not(.withselection) tbody tr.focused > td.selection + td {
+ border-left: 2px solid @color-list-focus-indicator;
+ outline: 0;
+ }
+ }
+}
+
+table.listing {
+ width: 100%;
+ table-layout: fixed;
+ // border-spacing/border-collapse here fix problem with our focus indicator
+ // when the table cells use overflow: hidden. I.e. we use border-spacing:0
+ // instead of Bootstrap's border-collapse:collapse. Is this cross-browser?
+ border-spacing: 0;
+ border-collapse: unset;
+}
+
+ul.listing {
+ margin: 0;
+ padding: 0;
+
+ & > ul {
+ padding: 0;
+ }
+
+ li {
+ .overflow-ellipsis;
+ white-space: nowrap;
+ position: relative;
+ list-style: none;
+
+ ul {
+ border-top: 1px solid @color-list-border;
+ padding-left: 1.5em;
+
+ li:last-child {
+ border-bottom: none;
+ }
+ }
+
+ input.icon-checkbox + label,
+ input[type=checkbox] {
+ position: absolute;
+ padding: 0;
+ top: 0;
+ right: .5rem;
+ height: @listing-line-height;
+ vertical-align: middle;
+ }
+ }
+
+ &.simplelist {
+ li {
+ padding: 0 .5rem;
+ }
+ }
+}
+
+.listing-info {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+ width: 80%;
+ text-align: center;
+ font-weight: bold;
+ color: @color-list-secondary;
+}
+
+html.touch {
+ .listing:not(.toolbar) li,
+ .listing tbody td {
+ line-height: @listing-touch-line-height;
+ font-size: 1.2rem;
+ }
+
+ li input[type=checkbox] {
+ height: @listing-touch-line-height;
+ }
+
+ td.selection {
+ padding: 0;
+ width: 3em;
+ }
+}
+
+@media screen and (max-width: @screen-width-large) {
+ .listing.selection-large-only {
+ li.selected {
+ color: @color-list;
+ background-color: transparent;
+ }
+ }
+}
+
+
+/* icons */
+
+.listing.iconized li {
+ a:before {
+ &:extend(.font-icon-class);
+ height: 2em; // TODO: ?
+ margin-right: .5rem;
+ }
+ &.preferences > a:before {
+ content: @fa-var-sliders-h;
+ }
+ &.folders > a:before {
+ content: @fa-var-folder;
+ }
+ &.responses > a:before {
+ content: @fa-var-comment;
+ }
+ &.identities > a:before {
+ content: @fa-var-id-card;
+ }
+ &.password > a:before {
+ content: @fa-var-lock;
+ }
+ &.addressbook a:before {
+ .font-icon-regular(@fa-var-address-book);
+ }
+ &.contactgroup a:before {
+ .font-icon-solid(@fa-var-users);
+ }
+ &.contactsearch a:before {
+ content: @fa-var-search;
+ }
+ &.filter > a:before {
+ content: @fa-var-filter;
+ }
+ &.vacation > a:before {
+ .font-icon-regular(@fa-var-clock);
+ }
+ &.forward > a:before {
+ content: @fa-var-share-square;
+ }
+ &.enigma.keys > a:before {
+ content: @fa-var-key;
+ }
+ &.userinfo > a:before {
+ content: @fa-var-info-circle;
+ }
+ &.twofactorauth > a:before {
+ content: @fa-var-sign-in-alt;
+ }
+
+ a.help:before {
+ content: @fa-var-life-ring;
+ }
+ a.about:before {
+ .font-icon-regular(@fa-var-question-circle);
+ }
+ a.license:before {
+ content: @fa-var-shield-alt;
+ }
+
+ // autocomplete popup
+ & > i:before {
+ &:extend(.font-icon-class);
+ content: @fa-var-user;
+ margin-left: .5rem;
+ }
+ &.group > i:before {
+ content: @fa-var-users;
+ }
+}
+
+html.ie11 .listing.iconized li a:before {
+ font-size: 1.25rem;
+}
+
+.listing.iconized tr {
+ td:before {
+ &:extend(.font-icon-class);
+ margin-right: .5rem;
+ }
+ &.contact.person td.name:before {
+ content: @fa-var-user;
+ }
+ &.contact.group td.name:before {
+ content: @fa-var-users;
+ }
+ &.general > td.section:before {
+ content: @fa-var-desktop;
+ }
+ &.mailbox > td.section:before {
+ .font-icon-regular(@fa-var-envelope);
+ }
+ &.mailview > td.section:before {
+ content: @fa-var-inbox;
+ }
+ &.compose > td.section:before {
+ content: @fa-var-paper-plane;
+ }
+ &.addressbook > td.section:before {
+ content: @fa-var-user;
+ }
+ &.folders > td.section:before {
+ .font-icon-regular(@fa-var-folder);
+ }
+ &.server > td.section:before {
+ content: @fa-var-server;
+ }
+ &.enigma > td.section:before {
+ content: @fa-var-lock;
+ }
+ &.calendar > td.section:before {
+ content: @fa-var-calendar;
+ }
+}
+
+/* selecatable list: e.g. spellcheck language selection */
+.listing.iconized.selectable li {
+ a:before {
+ &:extend(.font-icon-class);
+ content: "";
+ }
+ a.selected:before {
+ content: @fa-var-check;
+ }
+}
+
+.popupmenu .listing {
+ li > a {
+ border-left: 0;
+ }
+
+ li.selected {
+ color: @color-toolbarmenu-hover;
+ background-color: @color-toolbarmenu-hover-background;
+ }
+
+ td {
+ .overflow-ellipsis;
+ }
+}
+
+ul.treelist {
+ li {
+ div.treetoggle {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: @listing-treetoggle-width;
+ cursor: pointer;
+
+ &:before {
+ &:extend(.font-icon-class);
+ content: @fa-var-angle-right;
+ margin-left: .25em;
+ }
+
+ &.expanded:before {
+ content: @fa-var-angle-down;
+ }
+ }
+
+ & > a {
+ .overflow-ellipsis;
+ padding-left: @listing-treetoggle-width;
+ }
+
+ &.selected {
+ // reset .listing selection style
+ color: inherit;
+ background-color: transparent;
+
+ & > div > a, // this is used e.g. by kolab_addressbook
+ & > a {
+ color: @color-list-selected;
+ background-color: @color-list-selected-background;
+ }
+ }
+
+ ul {
+ padding: 0;
+
+ li {
+ padding-left: 0;
+ a { padding-left: (2 * @listing-treetoggle-width); }
+ div.treetoggle { left: @listing-treetoggle-width; }
+
+ li {
+ a { padding-left: (3 * @listing-treetoggle-width); }
+ div.treetoggle { left: (2 * @listing-treetoggle-width); }
+
+ li {
+ a { padding-left: (4 * @listing-treetoggle-width); }
+ div.treetoggle { left: (3 * @listing-treetoggle-width); }
+
+ li {
+ a { padding-left: (5 * @listing-treetoggle-width); }
+ div.treetoggle { left: (4 * @listing-treetoggle-width); }
+
+ li {
+ a { padding-left: (6 * @listing-treetoggle-width); }
+ div.treetoggle { left: (5 * @listing-treetoggle-width); }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ &.notree {
+ div.treetoggle {
+ display: none;
+ }
+
+ li > a {
+ padding-left: .5em;
+ }
+ }
+}
+
+/*** Folders list widget ***/
+
+.folderlist {
+ li {
+ &.mailbox {
+ &.unread {
+ // TODO
+ & > a {
+ padding-right: 2.8em;
+ }
+ }
+
+ &.recent {
+ color: @color-list-recent;
+ }
+
+ .unreadcount {
+ position: absolute;
+ top: 0;
+ right: 0;
+ min-width: 2em;
+ line-height: 1.4rem;
+ margin: (@listing-line-height - 1.4rem)/2;
+ padding: 0 .3em;
+ border-radius: .4em;
+ background: @color-list-badge-background;
+ color: @color-list-badge;
+ text-align: center;
+ font-weight: bold;
+
+ html.touch & {
+ line-height: 2rem;
+ margin: (@listing-touch-line-height - 2rem)/2;
+ }
+ }
+
+ &.selected .unreadcount {
+ // todo
+ }
+
+ &.recent > .unreadcount {
+ background: @color-list-recent-badge-background;
+ color: @color-list-recent-badge;
+ }
+
+ &.root {
+ display: none !important;
+ // FIXME: This element is confusing, I propose to not use it
+ }
+ }
+
+ a:before {
+ &:extend(.font-icon-class);
+ .font-icon-regular(@fa-var-folder);
+ margin-right: .5rem;
+ }
+
+ &.inbox > a:before {
+ .font-icon-solid(@fa-var-inbox);
+ }
+ &.trash a:before {
+ .font-icon-solid(@fa-var-trash-alt);
+ }
+ &.trash.empty > a:before {
+ .font-icon-regular(@fa-var-trash-alt);
+ }
+ &.drafts a:before {
+ .font-icon-solid(@fa-var-pencil-alt);
+ }
+ &.sent a:before {
+ .font-icon-solid(@fa-var-paper-plane);
+ }
+ &.junk a:before {
+ .font-icon-solid(@fa-var-fire);
+ }
+ &.archive > a:before {
+ .font-icon-solid(@fa-var-archive);
+ }
+
+ &.type-event > a:before {
+ .font-icon-solid(@fa-var-calendar);
+ }
+ &.type-task > a:before {
+ .font-icon-solid(@fa-var-tasks);
+ }
+ &.type-journal > a:before {
+ .font-icon-regular(@fa-var-calendar);
+ }
+ &.type-contact > a:before {
+ .font-icon-regular(@fa-var-address-book);
+ }
+ &.type-note > a:before {
+ .font-icon-regular(@fa-var-sticky-note);
+ }
+ &.type-configuration > a:before {
+ .font-icon-solid(@fa-var-cog);
+ }
+ &.type-freebusy > a:before {
+ .font-icon-regular(@fa-var-calendar);
+ }
+ &.type-file > a:before {
+ .font-icon-solid(@fa-var-folder);
+ }
+ }
+
+ // folder-selector fix for left padding
+ &.toolbarmenu a:before {
+ margin-left: .5em;
+ }
+
+ &.toolbarmenu {
+ li {
+ a:before {
+ margin-right: .25em;
+ }
+ }
+ }
+}
+
+
+/*** Messages list widget ***/
+
+.messagelist > thead,
+.messagelist .branch,
+table.fixedcopy {
+ display: none;
+}
+
+.messagelist {
+ td {
+ border-left: 0;
+ width: 2em;
+ vertical-align: top;
+ font-size: 1rem !important;
+ }
+
+ td.subject {
+ width: 100%;
+ padding-right: 0;
+ display: flex;
+ flex-wrap: wrap;
+
+ a {
+ text-decoration: none;
+ cursor: default;
+ }
+
+ span {
+ line-height: 2em;
+
+ &.date {
+ font-size: 90%;
+ color: @color-list-secondary;
+ }
+
+ &.fromto {
+ .overflow-ellipsis;
+ flex: 1;
+ font-size: 90%;
+ color: @color-list-secondary;
+ padding-left: 1.5em;
+ padding-right: .5rem;
+ }
+
+ &.subject {
+ .overflow-ellipsis;
+ width: 100%;
+ }
+ }
+ }
+
+ td.threads {
+ padding: 0 0 0 .25rem;
+ width: 1.5em;
+ }
+
+ td.flags {
+ width: 2.5em;
+
+ & > span {
+ height: 1.7em;
+ line-height: 1.7em;
+ display: block;
+
+ &.flag {
+ cursor: pointer;
+ }
+ }
+ }
+
+ tr.flagged td,
+ tr.flagged td.subject span.subject a,
+ tr.flagged td.subject span.date,
+ tr.flagged td.subject span.fromto {
+ color: @color-list-flagged;
+ }
+
+ tr.deleted td,
+ tr.deleted td.subject span.subject a,
+ tr.deleted td.subject span.date,
+ tr.deleted td.subject span.fromto {
+ color: @color-list-deleted;
+ }
+
+ tr.unread td.subject span.subject {
+ font-weight: bold;
+ }
+
+ // thread parent message with unread children
+ tr.unroot td.subject a {
+ text-decoration: underline;
+ }
+
+ tr.thread td.threads div:before {
+ &:extend(.font-icon-class);
+ content: @fa-var-angle-right;
+ cursor: pointer;
+ width: 1em;
+ }
+ tr.thread.expanded td.threads div:before {
+ content: @fa-var-angle-down;
+ }
+ td.subject span.msgicon.status:before {
+ &:extend(.font-icon-class);
+ content: @fa-var-circle;
+ cursor: pointer;
+ font-size: .4em;
+ width: 3em;
+ height: 2rem;
+ }
+ td.subject span.msgicon.status.unread:before {
+ content: @fa-var-star;
+ font-size: 1.1em;
+ width: 1.1em;
+ line-height: 1.75;
+ color: @color-warning;
+ }
+ td.subject span.msgicon.status.unreadchildren:before {
+ .font-icon-regular(@fa-var-star);
+ font-size: 1.1em;
+ width: 1.1em;
+ line-height: 1.75;
+ }
+ td.subject span.msgicon.status.replied:before {
+ content: @fa-var-reply;
+ font-size: 1.1em;
+ line-height: 1.75;
+ width: 1.1em;
+ }
+ td.subject span.msgicon.status.forwarded:before {
+ .font-icon-solid(@fa-var-share);
+ font-size: 1.1em;
+ line-height: 1.75;
+ width: 1.1em;
+ }
+ td.subject span.msgicon.status.replied.forwarded:before {
+ content: @fa-var-reply; // TODO
+ font-size: 1.1em;
+ line-height: 1.75;
+ width: 1.1em;
+ }
+ tr.deleted td.subject span.msgicon.status:before {
+ content: @fa-var-ban;
+ font-size: 1.1em;
+ line-height: 1.75;
+ width: 1.1em;
+ }
+
+ span.attachment span {
+ &:extend(.font-icon-class);
+ color: @color-list-icon;
+
+ &:before {
+ margin: 0;
+ content: @fa-var-paperclip;
+ }
+ &.report:before {
+ .font-icon-regular(@fa-var-file-alt);
+ }
+ &.encrypted:before {
+ content: @fa-var-lock;
+ }
+ &.vcard:before {
+ .font-icon-regular(@fa-var-user); // vcard_attachments plugin
+ }
+ }
+
+ span.flagged:before {
+ &:extend(.font-icon-class);
+ content: @fa-var-flag;
+ }
+
+ tr:hover span.unflagged:before {
+ &:extend(.font-icon-class);
+ .font-icon-regular(@fa-var-flag);
+ }
+
+}
+
+html.layout-phone,
+html.touch {
+ .messagelist {
+ td.flags {
+ display: none;
+ }
+ td.subject {
+ padding-right: .5em;
+ }
+ }
+}
+
+
+/* Contacts list */
+
+.contactlist {
+ .contact.readonly td {
+ font-style: italic;
+ }
+
+ td.action {
+ // TODO
+ a {
+ // TODO
+ }
+ }
+
+ // for contacts list in mail compose
+ td.contact:before {
+ &:extend(.font-icon-class);
+ content: @fa-var-user;
+ }
+
+ // for contacts list in mail compose
+ td.contactgroup:before {
+ &:extend(.font-icon-class);
+ content: @fa-var-users;
+ }
+
+ span.email {
+ display: inline;
+ color: @color-list-secondary;
+ font-style: italic;
+ margin-left: .5em;
+ }
+
+ li {
+ a:before {
+ &:extend(.font-icon-class);
+ margin-right: .5rem;
+ }
+
+ a.addressbook::before {
+ .font-icon-regular(@fa-var-address-book);
+ }
+
+ a.contactgroup::before {
+ .font-icon-solid(@fa-var-users);
+ }
+ }
+}
+
+
+/* Attachments list */
+
+@attachmentslist-item-height: 2rem;
+
+.attachmentslist {
+ padding: 0;
+ margin: 0;
+
+ li {
+ list-style: none;
+ display: inline-flex;
+ white-space: nowrap;
+ line-height: @attachmentslist-item-height;
+ max-width: 100%;
+
+ &:before {
+ &:extend(.font-icon-class);
+ .font-icon-regular(@fa-var-file);
+ height: @attachmentslist-item-height;
+ }
+
+ &.txt:before,
+ &.text:before {
+ .font-icon-regular(@fa-var-file-alt);
+ }
+
+ &.pdf:before {
+ .font-icon-regular(@fa-var-file-pdf);
+ }
+
+ &.odt:before,
+ &.doc:before,
+ &.docx:before,
+ &.msword:before {
+ .font-icon-regular(@fa-var-file-word);
+ }
+
+ &.ods:before,
+ &.xls:before,
+ &.xlsx:before,
+ &.msexcel:before {
+ .font-icon-regular(@fa-var-file-excel);
+ }
+
+ &.rar:before,
+ &.zip:before,
+ &.gz:before {
+ .font-icon-regular(@fa-var-file-archive);
+ }
+
+ &.image:before,
+ &.jpg:before,
+ &.jpeg:before,
+ &.png:before {
+ .font-icon-regular(@fa-var-file-image);
+ }
+
+ &.mp3:before,
+ &.audio:before {
+ .font-icon-regular(@fa-var-file-audio);
+ }
+
+ &.m4p:before,
+ &.video:before {
+ .font-icon-regular(@fa-var-file-video);
+ }
+
+ &.ics:before,
+ &.calendar:before {
+ // TODO
+ }
+
+ &.vcard:before {
+ .font-icon-regular(@fa-var-address-card);
+ }
+
+ &.html:before {
+ .font-icon-regular(@fa-var-file-code);
+ }
+
+ &.eml:before,
+ &.rfc822:before {
+ // TODO
+ }
+
+ &.odp:before,
+ &.otp:before,
+ &.ppt:before,
+ &.pptx:before,
+ &.ppsx:before,
+ &.vnd.mspowerpoint:before {
+ .font-icon-regular(@fa-var-file-powerpoint);
+ }
+
+ &.sig:before,
+ &.pgp-signature:before,
+ &.pkcs7-signature:before {
+ // TODO
+ }
+
+ &.application.asc:before {
+ // TODO
+ }
+
+ &.application.pgp-keys:before {
+ // TODO
+ }
+
+ a {
+ text-decoration: none;
+ line-height: @attachmentslist-item-height;
+ height: @attachmentslist-item-height;
+ }
+
+ a.cancelupload:before,
+ a.delete:before {
+ &:extend(.font-icon-class);
+ content: @fa-var-trash-alt;
+ line-height: @attachmentslist-item-height;
+ height: @attachmentslist-item-height;
+ }
+
+ &.uploading:before {
+ .animated-icon-class;
+ .font-icon-solid(@fa-var-circle-notch);
+ }
+
+ a.filename {
+ display: flex;
+ overflow: hidden;
+ }
+
+ .attachment-name {
+ .overflow-ellipsis;
+ color: @color-font;
+ }
+
+ .attachment-size {
+ color: @color-list-secondary;
+ padding: 0 .25em;
+ }
+ }
+}
+
+#identities-table {
+ td.mail:before {
+ &:extend(.font-icon-class);
+ content: @fa-var-id-card;
+ }
+}
+
+#responses-table {
+ td.name:before {
+ &:extend(.font-icon-class);
+ content: @fa-var-comment;
+ }
+}
+
+#filterslist {
+ td.name:before {
+ &:extend(.font-icon-class);
+ content: @fa-var-filter;
+ }
+}
+
+#filtersetslist {
+ td.name:before {
+ &:extend(.font-icon-class);
+ content: @fa-var-file-alt;
+ }
+}
diff --git a/skins/elastic/styles/widgets/mail.less b/skins/elastic/styles/widgets/mail.less
new file mode 100644
index 000000000..38ef6d54b
--- /dev/null
+++ b/skins/elastic/styles/widgets/mail.less
@@ -0,0 +1,287 @@
+/**
+ * Roundcube webmail styles for the Elastic skin
+ *
+ * Copyright (c) 2017-2018, The Roundcube Dev Team
+ *
+ * The contents are subject to the Creative Commons Attribution-ShareAlike
+ * License. It is allowed to copy, distribute, transmit and to adapt the work
+ * by keeping credits to the original authors in the README.md file.
+ * See http://creativecommons.org/licenses/by-sa/3.0/ for details.
+ */
+
+/*** Mail message body elements ***/
+
+
+@mail-header-photo-height: 4rem;
+
+
+#message-header {
+ margin-bottom: 1rem;
+
+ .subject {
+ .overflow-ellipsis;
+ font-size: 1.5rem;
+ font-weight: bold;
+ white-space: nowrap;
+ }
+
+ .short-header {
+ display: flex;
+
+ img.contactphoto {
+ margin: 0 1rem 0 0;
+ border-radius: 50%;
+ width: @mail-header-photo-height;
+ height: @mail-header-photo-height;
+ }
+
+ div.header-content {
+ min-height: @mail-header-photo-height;
+ flex: 1;
+ }
+
+ div.header-subject {
+ line-height: @mail-header-photo-height/2;
+
+ & > span {
+ line-height: 1.5;
+ display: inline-block;
+ vertical-align: middle;
+ }
+ }
+
+ div.header-links {
+ a {
+ font-size: 90%;
+ margin-right: .5rem;
+ text-decoration: none;
+ white-space: nowrap;
+ line-height: 1.5;
+ display: inline-block;
+
+ &:before {
+ &:extend(.font-icon-class);
+ display: inline-block;
+ float: none;
+ }
+
+ &.extwin:before {
+ content: @fa-var-external-link-square-alt;
+ }
+
+ &.headers:before {
+ content: @fa-var-wrench;
+ }
+
+ &.envelope:before {
+ .font-icon-regular(@fa-var-envelope);
+ }
+
+ &.html:before {
+ content: @fa-var-image;
+ }
+
+ &.plain:before {
+ content: @fa-var-align-justify;
+ }
+
+ &.zipdownload:before {
+ content: @fa-var-download;
+ }
+ }
+ }
+
+ .message-partheaders {
+ margin: 0 !important;
+ padding: .25rem 0 !important;
+ }
+ }
+}
+
+#message-content {
+ .attachmentslist:not(:empty) {
+ margin-bottom: 1rem;
+ }
+}
+
+#message-objects + .ui.alert {
+ float: left;
+}
+
+#messagebody {
+ // TODO
+
+ &.mailvelope {
+ margin: 0;
+ }
+}
+
+.message-part,
+.message-htmlpart {
+ padding-top: .5rem;
+
+ &:not(:first-child) {
+ border-top: 1px solid lighten(@color-mail-headers, 50%);
+ margin-top: .5rem;
+ }
+
+ div.rcmBody {
+ // Remove margins that can be set by the mail message styles
+ margin: 0 !important;
+ }
+
+ blockquote {
+ .overflow-ellipsis;
+ color: @color-blockquote-0;
+ border-left: 2px solid @color-blockquote-0-border;
+ border-right: 2px solid @color-blockquote-0-border;
+ background-color: @color-blockquote-background;
+ margin: 2px 0;
+ padding: 0 .4em;
+
+ blockquote {
+ color: @color-blockquote-1;
+ border-left: 2px solid @color-blockquote-1-border;
+ border-right: 2px solid @color-blockquote-1-border;
+
+ blockquote {
+ color: @color-blockquote-2;
+ border-left: 2px solid @color-blockquote-2-border;
+ border-right: 2px solid @color-blockquote-2-border;
+ }
+ }
+
+ span.blockquote-link {
+ top: 0;
+ cursor: pointer;
+ right: .5rem;
+ min-width: 4rem;
+ padding: .2rem .25rem .2rem .5rem;
+ font-size: 90%;
+ text-align: center;
+ color: @color-black-shade-text;
+ background: @color-black-shade-bg;
+ border: 1px solid @color-black-shade-border;
+ border-radius: .3rem;
+ line-height: 1;
+ .font-family; // don't inherit monospace font
+
+ &:after {
+ &:extend(.font-icon-class);
+ content: @fa-var-angle-down;
+ display: inline-block;
+ float: none;
+ margin: 0;
+ font-size: 90%;
+ }
+
+ &.collapsed:after {
+ content: @fa-var-angle-up;
+ }
+ }
+
+ &.blockquote-header {
+ text-overflow: ellipsis !important;
+ padding-right: 5rem !important;
+ }
+ }
+}
+
+.message-part {
+ span.sig {
+ color: @color-mail-signature;
+ }
+
+ div.pre {
+ font-family: monospace;
+ }
+
+ &.mailvelope iframe {
+ min-height: 35em;
+ }
+}
+
+.message-partheaders {
+ padding: .5rem 0;
+ margin: .5rem 0 0 0;
+ font-size: 90%;
+ border-top: 1px solid lighten(@color-mail-headers, 50%);
+ border-bottom: 1px solid lighten(@color-mail-headers, 50%);
+ color: @color-mail-headers;
+
+ .header-title {
+ .overflow-ellipsis;
+ white-space: nowrap;
+ max-width: 7em;
+ font-weight: bold;
+ padding-right: 1rem;
+ vertical-align: top;
+ }
+
+ .subject {
+ font-weight: bold;
+ }
+
+ & + .message-part,
+ & + .message-htmlpart {
+ border-top: 0;
+ margin: 0;
+ }
+}
+
+.image-tools {
+ position: absolute;
+ top: 5rem;
+ left: 0;
+ height: @layout-header-height;
+ overflow: hidden;
+ transform: translateX(-87%);
+ transition: transform 0.3s ease-in-out;
+ background-color: @color-image-tools-background;
+ border-radius: 0 .3rem .3rem 0;
+
+ .toolbar {
+ float: left;
+ height: @layout-header-height;
+
+ a.button:before {
+ width: auto;
+ height: 1.75rem;
+ display: block;
+ float: none;
+ }
+ }
+
+ a.button.icon.tools {
+ padding: 0 .25rem;
+ display: inline-block;
+ height: @layout-header-height;
+
+ span.inner {
+ display: none;
+ }
+
+ &:before {
+ line-height: @layout-header-height;
+ margin: 0;
+ }
+ }
+
+ &.open {
+ transform: translateX(0);
+
+ a.button.icon.tools:before {
+ content: @fa-var-chevron-left;
+ }
+ }
+
+ a {
+ color: @color-image-tools;
+
+ &:focus,
+ &:hover {
+ background-color: @color-image-tools-hover !important;
+ outline: 0;
+ }
+ }
+}
diff --git a/skins/elastic/styles/widgets/messages.less b/skins/elastic/styles/widgets/messages.less
new file mode 100644
index 000000000..ed2c646ad
--- /dev/null
+++ b/skins/elastic/styles/widgets/messages.less
@@ -0,0 +1,246 @@
+/**
+ * Roundcube webmail styles for the Elastic skin
+ *
+ * Copyright (c) 2017-2018, The Roundcube Dev Team
+ *
+ * The contents are subject to the Creative Commons Attribution-ShareAlike
+ * License. It is allowed to copy, distribute, transmit and to adapt the work
+ * by keeping credits to the original authors in the README.md file.
+ * See http://creativecommons.org/licenses/by-sa/3.0/ for details.
+ */
+
+/*** UI Messages ***/
+
+// .boxwarning/.boxerror/.boxinformation classes are converted to .ui.alert in bootstrap_init()
+
+.ui.alert {
+ margin: 0;
+ opacity: .95;
+ float: left;
+ width: 100%;
+ padding: .75em;
+ color: @color-message;
+ border: 1px solid @color-message-border;
+ background-color: @color-message-background;
+ display: flex;
+ align-items: center;
+
+ @media screen and (max-width: @screen-width-xs) {
+ border: 0;
+ border-radius: 0;
+ min-height: 4.2rem;
+ }
+
+ @media screen and (min-width: (@screen-width-xs + 1px)) {
+ &:not(:last-child) {
+ margin-bottom: .2rem;
+ }
+ }
+
+ span {
+ margin: auto 0;
+ }
+
+ & > i.icon {
+ line-height: 1;
+ color: lighten(@color-black, 25%);
+ margin: auto 0;
+ }
+
+ & > i.icon:before {
+ &:extend(.font-icon-class);
+ content: @fa-var-info-circle;
+ margin-right: .6rem;
+ }
+
+ &.loading {
+ color: @color-message-loading;
+
+ & > i.icon:before {
+ content: @fa-var-circle-notch;
+ .animated-icon-class;
+ width: 1em;
+ }
+ }
+
+ &.alert-success > i.icon:before {
+ content: @fa-var-check-circle;
+ color: @color-message-success;
+ }
+
+ &.alert-warning > i.icon:before {
+ content: @fa-var-exclamation-triangle;
+ color: @color-message-warning;
+ }
+
+ &.alert-danger > i.icon:before {
+ content: @fa-var-exclamation-circle;
+ color: @color-message-error;
+ }
+
+ &.vcardattachment > i.icon:before {
+ content: @fa-var-address-card; // vcard_attachments plugin
+ }
+
+ &.enigmaattachment > i.icon:before {
+ content: @fa-var-key; // enigma plugin
+ }
+
+ &.signed > i.icon:before,
+ &.encrypted > i.icon:before {
+ content: @fa-var-lock; // enigma plugin
+ }
+
+ // This works with following structure: [button].
+ // here is a one-line text, and button can be anything but .
+ &.aligned-buttons {
+ display: flex;
+
+ span {
+ flex: 1;
+ }
+ }
+
+ a:not(.btn) {
+ color: @color-message-link;
+ font-weight: normal;
+ }
+
+ h3 {
+ font-weight: bold;
+ font-size: 1.2rem;
+ }
+
+ p {
+ margin: 1rem 0;
+ }
+
+ &.boxerror,
+ &.boxconfirmation,
+ &.boxinformation,
+ &.boxwarning {
+ float: none;
+ border-radius: 0;
+ border: none;
+ padding: .5em;
+ margin-top: 0; // this can be a element, reset default margin
+
+ i.icon {
+ font-size: 1.5em !important;
+ }
+
+ &:not(:last-child) {
+ margin-bottom: .2rem;
+ }
+ }
+
+ &.boxerror {
+ background-color: @color-message-error-background;
+ }
+
+ &.boxinformation {
+ background-color: @color-message-background;
+ }
+
+ &.boxconfirmation {
+ background-color: @color-message-success-background;
+ }
+
+ &.boxwarning {
+ background-color: @color-message-warning-background;
+ }
+
+ & + table {
+ margin-top: 1em;
+ }
+}
+
+#messagestack {
+ position: absolute;
+ bottom: .5em;
+ right: .7em;
+ z-index: 102; // needs to be above .ui-widget-overlay
+ width: 320px;
+ height: auto;
+ max-height: 85%;
+
+ @media screen and (max-width: @screen-width-xs) {
+ left: 0;
+ right: 0;
+ bottom: 0;
+ width: auto;
+ }
+
+ div {
+ border-color: transparent;
+
+ &.voice {
+ position: absolute;
+ top: -1000px;
+ }
+
+ i.icon {
+ font-size: 1.5em !important;
+ }
+ }
+
+ .loading {
+ background-color: @color-list-selected-background;
+ border-color: @color-main;
+ color: @color-main;
+
+ & > i.icon:before {
+ color: @color-main;
+ }
+ }
+
+ .alert-info.information {
+ color: #fff;
+ background-color: @color-message-information;
+
+ & > i.icon:before {
+ color: #fff;
+ }
+ }
+
+ .alert-info.notice {
+ color: #fff;
+ background-color: @color-taskmenu-background;
+
+ & > i.icon:before {
+ color: #fff;
+ }
+ }
+
+ .alert-success {
+ color: #fff;
+ background-color: @color-message-success;
+
+ & > i.icon:before {
+ color: #fff;
+ }
+ }
+
+ .alert-warning {
+ background-color: @color-message-warning;
+
+ & > i.icon:before {
+ color: #fff;
+ }
+ }
+
+ .alert-danger {
+ color: #fff;
+ background-color: @color-message-error;
+
+ & > i.icon:before {
+ color: #fff;
+ }
+ }
+
+ a {
+ color: inherit !important;
+ text-decoration: underline;
+ cursor: pointer;
+ }
+}
diff --git a/skins/elastic/styles/widgets/searchbar.less b/skins/elastic/styles/widgets/searchbar.less
new file mode 100644
index 000000000..3e167be7a
--- /dev/null
+++ b/skins/elastic/styles/widgets/searchbar.less
@@ -0,0 +1,105 @@
+/**
+ * Roundcube webmail styles for the Elastic skin
+ *
+ * Copyright (c) 2017-2018, The Roundcube Dev Team
+ *
+ * The contents are subject to the Creative Commons Attribution-ShareAlike
+ * License. It is allowed to copy, distribute, transmit and to adapt the work
+ * by keeping credits to the original authors in the README.md file.
+ * See http://creativecommons.org/licenses/by-sa/3.0/ for details.
+ */
+
+/*** Searchbar and searchfilterbar widgets ***/
+
+.searchbar {
+ position: absolute;
+ background-color: @color-layout-header-background;
+ right: .25rem;
+ height: @layout-header-height;
+ display: block !important;
+
+ a.button {
+ min-width: auto;
+ padding: 0;
+ display: block;
+
+ &:before {
+ line-height: @layout-header-height;
+ }
+ }
+
+ .input-group {
+ margin-top: calc(@layout-header-height/2 - 2.25rem/2);
+ display: none;
+ padding: 0 .5rem;
+
+ .icon:before {
+ font-size: 1em;
+ line-height: 1.1;
+ }
+
+ .icon.filter,
+ .icon.search {
+ color: #888;
+ }
+ }
+
+ form {
+ display: none;
+ }
+
+ a.icon {
+ &:before {
+ &:extend(.font-icon-class);
+ margin: 0;
+ }
+
+ &.reset:before {
+ content: @fa-var-trash-alt;
+ }
+ &.options:before {
+ content: @fa-var-angle-down;
+ }
+ }
+
+ &.active a.button.search {
+ color: @color-searchbar-icon-active;
+ }
+
+ &.open {
+ z-index: 10;
+ left: 0 !important;
+ right: 0 !important;
+
+ .input-group {
+ display: flex;
+ }
+
+ form {
+ display: flex;
+ }
+
+ a.button.filter,
+ a.button.search {
+ display: none;
+ }
+ }
+}
+
+.searchfilterbar {
+ right: @layout-touch-icon-width + .25rem;
+
+ &.active a.button.filter {
+ color: @color-searchbar-icon-active;
+ }
+}
+
+html.ie11 {
+ .searchbar {
+ a.button.filter:before,
+ a.button.search:before {
+ line-height: 3.2;
+ font-size: 1.25rem;
+ }
+ }
+}
diff --git a/skins/elastic/styles/widgets/taskmenu.less b/skins/elastic/styles/widgets/taskmenu.less
new file mode 100644
index 000000000..525276b15
--- /dev/null
+++ b/skins/elastic/styles/widgets/taskmenu.less
@@ -0,0 +1,173 @@
+/**
+ * Roundcube webmail styles for the Elastic skin
+ *
+ * Copyright (c) 2017-2018, The Roundcube Dev Team
+ *
+ * The contents are subject to the Creative Commons Attribution-ShareAlike
+ * License. It is allowed to copy, distribute, transmit and to adapt the work
+ * by keeping credits to the original authors in the README.md file.
+ * See http://creativecommons.org/licenses/by-sa/3.0/ for details.
+ */
+
+/*** Taskmenu ***/
+
+#taskmenu {
+ height: 100%;
+
+ a {
+ .overflow-ellipsis;
+ text-decoration: none;
+ display: block;
+
+ &:before {
+ &:extend(.font-icon-class);
+ }
+
+ &.mail:before {
+ content: @fa-var-envelope;
+ }
+ &.addressbook:before {
+ content: @fa-var-user;
+ }
+ &.settings:before {
+ content: @fa-var-sliders-h;
+ }
+ &.help:before {
+ content: @fa-var-life-ring;
+ }
+ &.logout:before {
+ content: @fa-var-power-off;
+ }
+ &.about:before {
+ content: @fa-var-question;
+ }
+ &.refresh:before {
+ content: @fa-var-sync;
+ }
+ &.compose:before {
+ content: @fa-var-edit;
+ }
+ &.calendar:before {
+ content: @fa-var-calendar-alt;
+ }
+ &.tasklist:before {
+ content: @fa-var-tasks;
+ }
+ &.files:before {
+ content: @fa-var-folder;
+ }
+ &.notes:before {
+ content: @fa-var-sticky-note;
+ }
+ }
+
+ a.logout {
+ color: @color-taskmenu-button-logout-hover !important;
+ }
+
+ @media screen and (max-width: @screen-width-xs) {
+ z-index: 30001; // because autocompletion popup uses z-index:30000
+ overflow-x: hidden;
+
+ a {
+ width: 100%;
+ padding: 0 .5em;
+ text-align: left;
+ line-height: @layout-touch-menu-record-height;
+ height: @layout-touch-menu-record-height;
+ border-bottom: 1px solid @color-list-border;
+ color: @color-list;
+ font-size: 1.2rem;
+
+ &:before {
+ margin-right: .5rem;
+ }
+ }
+ }
+
+ @media screen and (min-width: (@screen-width-xs + 1px)) {
+ a {
+ text-align: center;
+ color: @color-taskmenu-button;
+ padding: .45rem 0;
+ width: @layout-menu-width/2;
+ font-size: 1.2rem;
+
+ &:before {
+ display: block;
+ height: 2.1rem;
+ line-height: 1.5;
+ width: @layout-menu-width/2;
+ margin: 0;
+ }
+
+ &:hover {
+ color: @color-taskmenu-button;
+ background: @color-taskmenu-button-background-hover;
+ }
+
+ &.selected {
+ color: @color-taskmenu-button-selected;
+ background: @color-taskmenu-button-selected-background;
+ }
+ }
+
+ .special-buttons {
+ position: absolute;
+ bottom: 0;
+ left: 0;
+ width: @layout-menu-width;
+ }
+
+ .action-buttons {
+ a {
+ color: @color-taskmenu-button-action-background;
+ background: @color-taskmenu-background;
+
+ &:hover {
+ color: @color-taskmenu-button-action-hover;
+ background: @color-taskmenu-button-action-background-hover;
+ }
+ }
+ }
+
+ span.inner {
+ display: none;
+ }
+ }
+
+ @media screen and (min-width: (@screen-width-medium + 1px)) {
+ a {
+ width: @layout-menu-width;
+ height: (@layout-header-height - .05rem);
+ font-size: 1rem;
+
+ &:before {
+ width: @layout-menu-width;
+ height: 1.75rem;
+ line-height: 1.5;
+ }
+ }
+
+ .action-buttons {
+ a {
+ color: @color-taskmenu-button-action;
+ background: @color-taskmenu-button-action-background;
+ }
+ }
+
+ span.inner {
+ display: inline;
+ font-size: 85%;
+ padding: 0 .1em;
+ }
+ }
+}
+
+.menu {
+ .popover-header {
+ @media screen and (min-width: (@screen-width-xs + 1px)) {
+ display: none !important;
+ }
+ }
+}
diff --git a/skins/elastic/styles/widgets/toolbar.less b/skins/elastic/styles/widgets/toolbar.less
new file mode 100644
index 000000000..6d87ee89a
--- /dev/null
+++ b/skins/elastic/styles/widgets/toolbar.less
@@ -0,0 +1,736 @@
+/**
+ * Roundcube webmail styles for the Elastic skin
+ *
+ * Copyright (c) 2017-2018, The Roundcube Dev Team
+ *
+ * The contents are subject to the Creative Commons Attribution-ShareAlike
+ * License. It is allowed to copy, distribute, transmit and to adapt the work
+ * by keeping credits to the original authors in the README.md file.
+ * See http://creativecommons.org/licenses/by-sa/3.0/ for details.
+ */
+
+/*** Toolbar widget ***/
+
+.toolbar {
+ margin: 0;
+ font-size: 1rem;
+
+ &.listing a,
+ a {
+ text-decoration: none;
+ cursor: pointer !important; // TODO: re-consider .listing class use on toolbar
+ color: @color-toolbar-button;
+ }
+
+ a.button {
+ display: inline-block;
+ border: 0 !important;
+ height: @layout-header-height;
+ min-width: 3.5rem;
+ max-width: 6rem;
+ width: auto; // reset width defined for links in .listing
+ padding: .45rem;
+ text-align: center;
+ text-overflow: ellipsis;
+ overflow-x: hidden;
+ line-height: 1.5;
+
+ &:hover,
+ &:focus {
+ outline: 0;
+ }
+
+ &.selected {
+ color: @color-success;
+ }
+
+ &:before {
+ &:extend(.font-icon-class);
+ display: inline;
+ float: none;
+ margin: 0;
+ line-height: 1.75;
+ }
+
+ &.reply:before {
+ content: @fa-var-reply;
+ }
+ &.reply-all:before {
+ content: @fa-var-reply-all;
+ }
+ &.forward:before {
+ content: @fa-var-share;
+ }
+ &.delete:before {
+ content: @fa-var-trash-alt;
+ }
+ &.markmessage:before {
+ content: @fa-var-tag;
+ }
+ &.more:before {
+ content: @fa-var-ellipsis-h;
+ }
+ &.dropdown:before {
+ content: @fa-var-caret-down;
+ }
+ &.settings:before {
+ content: @fa-var-sliders-h;
+ }
+ &.create:before {
+ content: @fa-var-plus-square;
+ }
+ &.move:before {
+ content: @fa-var-arrows-alt;
+ }
+ &.purge:before {
+ content: @fa-var-eraser;
+ }
+ &.print:before {
+ content: @fa-var-print;
+ }
+ &.search:before {
+ content: @fa-var-search;
+ }
+ &.upload:before,
+ &.import:before {
+ content: @fa-var-upload;
+ }
+ &.download:before,
+ &.export:before {
+ content: @fa-var-download;
+ }
+ &.compose:before {
+ content: @fa-var-edit;
+ }
+ &.archive:before {
+ content: @fa-var-archive;
+ }
+ &.junk:before {
+ content: @fa-var-fire;
+ }
+ &.enigma:before,
+ &.encrypt:before {
+ content: @fa-var-lock;
+ }
+ &.firstpage:before {
+ content: @fa-var-fast-backward;
+ }
+ &.prev:before {
+ content: @fa-var-arrow-left;
+ }
+ &.next:before {
+ content: @fa-var-arrow-right;
+ }
+ &.prevpage:before {
+ content: @fa-var-backward;
+ }
+ &.nextpage:before {
+ content: @fa-var-forward;
+ }
+ &.lastpage:before {
+ content: @fa-var-fast-forward;
+ }
+ &.send:before {
+ content: @fa-var-paper-plane;
+ }
+ &.back:before {
+ content: @fa-var-arrow-left;
+ }
+ &.closewin:before {
+ content: @fa-var-window-close;
+ }
+ &.save:before {
+ .font-icon-regular(@fa-var-save);
+ }
+ &.vcard:before,
+ &.attach:before {
+ content: @fa-var-paperclip;
+ }
+ &.spellcheck:before {
+ content: @fa-var-magic; // TODO
+ }
+ &.signature:before {
+ content: @fa-var-id-card;
+ }
+ &.responses:before {
+ content: @fa-var-comment;
+ }
+ &.select:before {
+ .font-icon-regular(@fa-var-check-square);
+ }
+ &.threads:before {
+ content: @fa-var-comments;
+ }
+ &.actions:before {
+ content: @fa-var-cog;
+ }
+ &.refresh:before {
+ content: @fa-var-sync;
+ }
+ &.addto:before {
+ content: @fa-var-user-plus;
+ }
+ &.addcc:before {
+ content: @fa-var-user-plus;
+ }
+ &.addbcc:before {
+ content: @fa-var-user-plus;
+ }
+ &.addressbook:before {
+ content: @fa-var-user;
+ }
+ &.expand:before {
+ content: @fa-var-caret-down;
+ }
+ &.collapse:before {
+ content: @fa-var-caret-up;
+ }
+ &.submit:before {
+ content: @fa-var-check;
+ }
+ &.edit:before {
+ content: @fa-var-pencil-alt;
+ }
+ &.qrcode:before {
+ content: @fa-var-qrcode;
+ }
+ &.properties:before {
+ content: @fa-var-file;
+ }
+ &.zoomin:before {
+ content: @fa-var-search-plus;
+ }
+ &.zoomout:before {
+ content: @fa-var-search-minus;
+ }
+ &.rotate:before {
+ content: @fa-var-redo-alt;
+ }
+ }
+
+ &:not(.popupmenu) span.inner {
+ font-size: 90%;
+ font-weight: normal;
+ }
+
+ .dropbutton {
+ a.button.dropdown {
+ font-size: 75%;
+ overflow: hidden; // for IE11
+
+ span.inner {
+ display: none;
+ }
+ }
+
+ a.button:first-child {
+ padding-right: 0;
+ }
+ }
+
+ & > .spacer {
+ width: 1em;
+ }
+
+ &.pagenav {
+ text-align: center;
+ display: flex;
+ border-bottom: 1px solid @color-layout-border;
+ height: @layout-pagenav-height;
+ overflow: hidden;
+
+ a.button {
+ flex-grow: 1;
+ font-size: 80%;
+ min-width: 2rem !important;
+ height: @layout-pagenav-height !important;
+ color: @color-list-pagenav;
+ overflow: hidden;
+
+ &:before {
+ line-height: 1 !important;
+ }
+ }
+
+ .pagenav-text {
+ .overflow-ellipsis;
+ flex-grow: 4;
+ line-height: @layout-pagenav-height;
+ font-size: 80%;
+ color: @color-list-pagenav;
+ white-space: nowrap;
+ }
+
+ input {
+ width: 3rem;
+ font-size: 90%;
+ line-height: 1;
+ padding: .25rem;
+ margin: .15rem;
+ display: inline;
+ text-align: center;
+ }
+
+ span.inner {
+ display: none;
+ }
+
+ &.pagenav-list {
+ cursor: pointer;
+
+ a.button {
+ flex-grow: initial;
+ }
+ .pagenav-text {
+ text-align: left;
+ }
+ }
+ }
+
+ &.footer {
+ a.button:before {
+ height: 1.75rem;
+ float: none;
+ display: block;
+ width: auto;
+ }
+ }
+
+ &.content-frame-navigation.hide-nav-buttons {
+ a.next,
+ a.prev {
+ display: none;
+ }
+ }
+
+ .listselectors {
+ max-width: 100%;
+ display: flex;
+ justify-content: space-around;
+ }
+}
+
+
+.header {
+ a.button {
+ color: @color-font;
+ }
+
+ .buttons {
+ display: block;
+
+ button {
+ display: block;
+ float: left;
+ cursor: pointer;
+ color: @color-toolbar-button;
+ background-color: transparent;
+ border: 0;
+ padding: 0;
+ height: @layout-touch-header-height;
+ line-height: @layout-touch-header-height;
+ width: 2.5em;
+
+ &:before {
+ font-size: 1.75rem;
+ }
+ }
+
+ a.button {
+ display: inline-block;
+
+ &:before {
+ &:extend(.font-icon-class);
+ float: none;
+ }
+
+ &.reply:before {
+ content: @fa-var-reply;
+ }
+
+ &.send:before {
+ content: @fa-var-paper-plane;
+ }
+ }
+ }
+}
+
+.popupmenu.toolbar.listing {
+ a.button {
+ max-width: 100%;
+ width: 100%;
+ text-align: left;
+ line-height: @layout-touch-menu-record-height;
+ height: @layout-touch-menu-record-height;
+
+ &:before {
+ display: inline-block;
+ line-height: inherit;
+ margin-right: .5rem;
+ }
+ }
+
+ .dropbutton {
+ display: flex;
+
+ a.button:first-child {
+ .overflow-ellipsis;
+ flex: 1;
+ }
+
+ a.button.dropdown {
+ font-size: 100%;
+ cursor: pointer;
+ width: auto;
+
+ &:before {
+ content: @fa-var-angle-right;
+ margin-left: .5em;
+ margin-right: 0;
+ }
+
+ span.inner {
+ display: none;
+ }
+ }
+ }
+
+ li.spacer {
+ display: none;
+ }
+
+ li:last-child {
+ border: 0;
+ }
+}
+
+
+.toolbarmenu li {
+ &.separator {
+ // TODO: all separator properties
+ line-height: 1.5rem !important;
+ font-size: .75rem !important;
+ padding: 0 .5rem;
+ color: @color-popover-separator;
+ background-color: @color-popover-separator-background;
+
+ label {
+ margin: 0; // Unsets Bootstrap label margin, bug?
+ }
+ }
+
+ &.checkbox > label {
+ margin: 0;
+ width: 100%;
+
+ input.icon-checkbox {
+ right: auto;
+
+ & + label {
+ left: 0;
+ margin: 0 .2em 0 .35em;
+ font-size: 1.1rem;
+ }
+ }
+ }
+
+ a {
+ opacity: .5;
+
+ &.active {
+ opacity: 1;
+ }
+ }
+
+ &:last-child {
+ border-bottom: none;
+ }
+
+ a:before {
+ &:extend(.font-icon-class);
+ }
+
+ a.print:before {
+ content: @fa-var-print;
+ }
+ a.copy:before {
+ content: @fa-var-copy;
+ }
+ a.move:before {
+ content: @fa-var-arrows-alt;
+ }
+ a.purge:before {
+ content: @fa-var-eraser;
+ }
+ a.source:before {
+ content: @fa-var-file-code;
+ }
+ a.download:before {
+ content: @fa-var-download;
+ }
+ a.extwin:before {
+ content: @fa-var-external-link-square-alt;
+ }
+ a.create:before {
+ content: @fa-var-plus-square;
+ }
+ a.edit:before {
+ content: @fa-var-edit;
+ }
+ a.edit.asnew:before {
+ content: @fa-var-pencil-alt;
+ }
+ a.rename:before {
+ content: @fa-var-pencil-alt;
+ }
+ a.read:before {
+ .font-icon-regular(@fa-var-star);
+ }
+ a.unread:before {
+ content: @fa-var-star;
+ }
+ a.flag:before {
+ content: @fa-var-flag;
+ }
+ a.unflag:before {
+ .font-icon-regular(@fa-var-flag);
+ }
+ a.filterlink:before {
+ content: @fa-var-filter;
+ }
+ a.reply.list:before,
+ a.reply.all:before {
+ content: @fa-var-reply-all;
+ }
+ a.forward:before,
+ a.forward.bounce:before,
+ a.forward.attachment:before,
+ a.forward.inline:before {
+ content: @fa-var-share;
+ }
+ a.download.mbox:before,
+ a.download.eml:before,
+ a.download.maildir:before {
+ content: @fa-var-download;
+ }
+ a.export.selection:before,
+ a.export.all:before {
+ content: @fa-var-download;
+ }
+ a.select.all:before {
+ .font-icon-regular(@fa-var-check-square);
+ }
+ a.select.none:before {
+ content: @fa-var-times;
+ }
+ a.select.page:before {
+ content: @fa-var-bars;
+ }
+ a.select.flagged:before {
+ content: @fa-var-flag;
+ }
+ a.select.unread:before {
+ content: @fa-var-star;
+ }
+ a.select.invert:before {
+ .font-icon-regular(@fa-var-square);
+ }
+ a.expand.all:before,
+ a.expand.unread:before,
+ a.expand.none:before {
+ content: @fa-var-comments;
+ }
+ a.search:before {
+ content: @fa-var-search;
+ }
+ a.delete:before {
+ content: @fa-var-trash-alt;
+ }
+ a.expunge:before {
+ content: @fa-var-compress;
+ }
+ a.import:before {
+ content: @fa-var-upload;
+ }
+ a.settings:before {
+ content: @fa-var-sliders-h;
+ }
+ a.insertresponse:before {
+ content: @fa-var-comment;
+ }
+ a.compose:before {
+ content: @fa-var-edit;
+ }
+ a.addressbook:before {
+ content: @fa-var-user;
+ }
+ a.recipient:before {
+ .font-icon-regular(@fa-var-envelope);
+ }
+ a.status:before {
+ .font-icon-regular(@fa-var-lightbulb);
+ }
+ a.folders:before {
+ content: @fa-var-folder;
+ }
+ a.remove:before {
+ content: @fa-var-eraser;
+ }
+ a.showurl:before {
+ content: @fa-var-link;
+ }
+ a.qrcode:before {
+ content: @fa-var-qrcode;
+ }
+ a.assigngroup:before {
+ content: @fa-var-user-plus;
+ }
+ a.removegroup:before {
+ content: @fa-var-user-times;
+ }
+ a.vcard:before {
+ content: @fa-var-paperclip;
+ }
+ a.encrypt:before {
+ content: @fa-var-lock;
+ }
+ a.encrypt.sign:before {
+ content: @fa-var-lock; // TODO
+ }
+}
+
+.toolbarmenu.listing li {
+ &.checkbox > label {
+ padding: 0 .5rem 0 2.5em;
+ }
+
+ &:hover {
+ &.checkbox > label,
+ input.icon-checkbox + label:before,
+ a.active {
+ color: @color-toolbarmenu-hover;
+ background-color: @color-toolbarmenu-hover-background;
+ }
+ }
+}
+
+#layout > .sidebar > .header,
+#layout > .list > .header {
+ span.inner {
+ display: none;
+ }
+}
+
+#layout > .content > * > .toolbar {
+ text-align: center;
+}
+
+html.touch {
+ .toolbarmenu.listing td,
+ .toolbarmenu.listing li,
+ #layout > :not(.content) > .header a.button {
+ font-size: 1.2rem;
+ }
+
+ .toolbarmenu.listing li {
+ &.checkbox > label {
+ padding: 0 .5rem 0 2.75rem;
+ }
+ }
+
+ .toolbarmenu li {
+ input.icon-checkbox + label {
+ font-size: 1.3rem;
+ }
+ }
+}
+
+html.ie11 .toolbar .dropbutton a.dropdown:before {
+ font-size: 80%;
+}
+
+@media screen and (min-width: (@screen-width-small + 1px)) {
+ ul.toolbar {
+ flex: 1;
+ }
+
+ .toolbar {
+ a.button {
+ &:not(.disabled):focus,
+ &:not(.disabled):hover {
+ background-color: @color-toolbar-button-background-hover;
+ }
+ }
+
+ &.listing li {
+ display: inline-block;
+ border: 0;
+
+ a.button:before {
+ height: 1.75rem;
+ float: none;
+ display: block;
+ width: auto;
+ margin: 0;
+ }
+ }
+
+ .dropbutton {
+ height: @layout-header-height;
+ display: inline-block;
+
+ &:hover {
+ background-color: @color-toolbar-button-background-hover;
+ }
+
+ a.button.dropdown {
+ min-width: 1.1rem;
+ padding: 0 .3rem;
+
+ &:hover {
+ background-color: darken(@color-toolbar-button-background-hover, 5%);
+ }
+
+ &:before {
+ height: @layout-header-height;
+ line-height: 4.2;
+ }
+ }
+ }
+ }
+
+ .toolbar.content-frame-navigation {
+ display: none !important;
+ }
+
+ .header a.button.icon {
+ &:not(.disabled):focus,
+ &:not(.disabled):hover {
+ background-color: @color-toolbar-button-background-hover;
+ outline: 0;
+ }
+
+ &:before {
+ margin: 0;
+ }
+ }
+}
+
+@media screen and (max-width: @screen-width-small) {
+ body > #layout > div > .toolbar.footer {
+ justify-content: space-around;
+
+ & > * {
+ flex-grow: 1;
+ }
+
+ .buttons {
+ display: flex;
+ justify-content: space-around;
+ }
+
+ .listselectors > * {
+ flex-grow: 1;
+ }
+ }
+}
diff --git a/skins/elastic/templates/about.html b/skins/elastic/templates/about.html
new file mode 100644
index 000000000..40ab1ac26
--- /dev/null
+++ b/skins/elastic/templates/about.html
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
Roundcube Webmail
+
Copyright © 2005-2016, The Roundcube Dev Team
+
This program is free software;
+ you can redistribute it and/or modify it under the terms of the
+ GNU General Public License
+ as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+ Some exceptions for skins & plugins apply.
+
+
+
+
+
+
+
+
diff --git a/skins/elastic/templates/addressbook.html b/skins/elastic/templates/addressbook.html
new file mode 100644
index 000000000..67377afc5
--- /dev/null
+++ b/skins/elastic/templates/addressbook.html
@@ -0,0 +1,152 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/skins/elastic/templates/bounce.html b/skins/elastic/templates/bounce.html
new file mode 100644
index 000000000..80bb03dfc
--- /dev/null
+++ b/skins/elastic/templates/bounce.html
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/skins/elastic/templates/compose.html b/skins/elastic/templates/compose.html
new file mode 100644
index 000000000..5028a2232
--- /dev/null
+++ b/skins/elastic/templates/compose.html
@@ -0,0 +1,284 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/skins/elastic/templates/contact.html b/skins/elastic/templates/contact.html
new file mode 100644
index 000000000..d2755ffab
--- /dev/null
+++ b/skins/elastic/templates/contact.html
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/skins/elastic/templates/contactedit.html b/skins/elastic/templates/contactedit.html
new file mode 100644
index 000000000..32a678ff4
--- /dev/null
+++ b/skins/elastic/templates/contactedit.html
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/skins/elastic/templates/contactimport.html b/skins/elastic/templates/contactimport.html
new file mode 100644
index 000000000..1434feb6e
--- /dev/null
+++ b/skins/elastic/templates/contactimport.html
@@ -0,0 +1,9 @@
+
+
+ :
+
+
+
+
+
+
diff --git a/skins/elastic/templates/contactprint.html b/skins/elastic/templates/contactprint.html
new file mode 100644
index 000000000..246827e60
--- /dev/null
+++ b/skins/elastic/templates/contactprint.html
@@ -0,0 +1,17 @@
+
+
+
+
+
diff --git a/skins/elastic/templates/contactsearch.html b/skins/elastic/templates/contactsearch.html
new file mode 100644
index 000000000..86de93d7f
--- /dev/null
+++ b/skins/elastic/templates/contactsearch.html
@@ -0,0 +1,9 @@
+
+
+ :
+
+
+
+
+
+
diff --git a/skins/elastic/templates/dialog.html b/skins/elastic/templates/dialog.html
new file mode 100644
index 000000000..f885a547e
--- /dev/null
+++ b/skins/elastic/templates/dialog.html
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/skins/elastic/templates/error.html b/skins/elastic/templates/error.html
new file mode 100644
index 000000000..3f8663496
--- /dev/null
+++ b/skins/elastic/templates/error.html
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+$__page_content
+
+
+
+
+
diff --git a/skins/elastic/templates/folderedit.html b/skins/elastic/templates/folderedit.html
new file mode 100644
index 000000000..e2c55f01c
--- /dev/null
+++ b/skins/elastic/templates/folderedit.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/skins/elastic/templates/folders.html b/skins/elastic/templates/folders.html
new file mode 100644
index 000000000..9a8d47c6e
--- /dev/null
+++ b/skins/elastic/templates/folders.html
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/skins/elastic/templates/identities.html b/skins/elastic/templates/identities.html
new file mode 100644
index 000000000..22134bf5e
--- /dev/null
+++ b/skins/elastic/templates/identities.html
@@ -0,0 +1,45 @@
+
+
+
+
+
:
+
+
+
+
+
+
+
+
diff --git a/skins/elastic/templates/identityedit.html b/skins/elastic/templates/identityedit.html
new file mode 100644
index 000000000..7ffff1520
--- /dev/null
+++ b/skins/elastic/templates/identityedit.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/skins/elastic/templates/includes/footer.html b/skins/elastic/templates/includes/footer.html
new file mode 100644
index 000000000..165aeee94
--- /dev/null
+++ b/skins/elastic/templates/includes/footer.html
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+