Commit dde689cc authored by Matt Vanderpol's avatar Matt Vanderpol

Merge branch 'master' into 3063-roi-calc-with-choose-tools

# Conflicts:
#	source/javascripts/category-roi-calculator.js
parents 951a093d 48c1313f
......@@ -206,7 +206,7 @@ gitlab_com:
Head over to <a href="https://customers.gitlab.com">https://customers.gitlab.com</a>, choose the plan that is right for you.
- question: What about your availability and security?
answer:
GitLab.com is monitored 24/7. Our servers are hosted on Amazon Web Services (AWS), Digital Ocean, and Azure, we use configuration management, and we patch our servers at least once a week. Our <a href="https://gitlab.com/gitlab-com/runbooks">runbooks are public</a> as is <a href="https://gitlab.com/gitlab-com/infrastructure/issues">our operational issue tracker</a>. GitLab offers Two-Factor Authentication (2FA) via a mobile application or a U2F device, rate limiting, audit logs, and passwords are one-way encrypted. Answers to other common security questions are available on our security page.
GitLab.com is monitored 24/7. Our servers are hosted on <a href="/handbook/engineering/infrastructure/production-architecture/">Google Cloud Platform (GCP), Amazon Web Services (AWS), Digital Ocean, and Azure</a>, we use configuration management, and we patch our servers at least once a week. Our <a href="https://gitlab.com/gitlab-com/runbooks">runbooks are public</a> as is <a href="https://gitlab.com/gitlab-com/infrastructure/issues">our operational issue tracker</a>. GitLab offers Two-Factor Authentication (2FA) via a mobile application or a U2F device, rate limiting, audit logs, and passwords are one-way encrypted. Answers to other common security questions are available on our security page.
- question: Can I export my data?
answer:
You can <a href="https://docs.gitlab.com/ee/user/project/settings/import_export.html">export most of your data</a> at any time. Your data belongs to you. You are never stuck on GitLab.com, you can always export and import your project to a self hosted version of GitLab.
......
......@@ -137,7 +137,7 @@ What better way to convey a sense of who we are and how we work together, than b
<div class="row">
<div class="col-sm-8 col-xm-12">
<figure class="video_container">
<iframe src="https://youtube.com/embed/4BIsON95fl8?t=1143" frameborder="0" allowfullscreen="true"> </iframe>
<iframe src="https://youtube.com/embed/4BIsON95fl8?start=1143" frameborder="0" allowfullscreen="true"> </iframe>
</figure>
</div>
<div class="col-sm-4 col-xm-12">
......
......@@ -95,18 +95,26 @@ Once you receive your card, [register the card in the American Express portal.](
### Submitting company credit card expenses
Expensify will auto-populate your expense report, leaving 3 main steps to prepare your report for submission:
On the 30th of each month, Expensify will auto-generate your expense report and send an email notification when the report is ready, leaving 4 main steps to prepare your report for submission:
##### 1. Coding expenses
#### 1. Coding expenses
- In some cases, Expensify reports will show payment processor names (i.e. Stripe, PayPal) rather than the actual payee merchant, making it difficult to identify charges. This can be resolved by downloading your Amex statement from the portal, which contains greater detail.
- If applicable, add expense tags. Common tag examples include company summits, marketing campaigns, and professional service engagements.
##### 2. Attaching Receipts
#### 2. Required supplementary information
Certain purchases require additional data in order for the Finance team to accurately process transactions.
Expense reports are considered incomplete if missing any of the following data:
- **Expense Tags:** If applicable, add expense tags. Common tag examples include company summits, marketing campaigns, and professional service engagements.
- **Laptops/Equipment:** Purchases of laptops and other assets in excess of $1,000 USD (per item) must include the name of the GitLabber for whom the asset was purchased.
- **Airfare/Travel:** Purchases of flights, transportation, and lodging on behalf of other GitLabbers must also include the name of the corresponding individual.
#### 3. Attaching receipts
- Any expense over $25 USD requires a legible receipt. No exceptions.
##### 3. Submit the report
#### 4. Submit the report
- Reports are due on the 4th business day of each month. Failure to meet these policy guidelines on an ongoing basis will result in permanent cancellation of your card.
**Note that company credit card expenses should never be commingled with reimbursable expense reports. Reimbursable expenses should always be submitted separately.**
**Note that company credit card expenses should never be commingled with reimbursable expense reports. Reimbursable expenses should always be submitted separately. Please contact the Accounting Manager if you have any questions.**
......@@ -11,7 +11,7 @@ title: "Paid time off at GitLab"
## Paid Time Off
Time away from work can be extremely helpful for maintaining a good work/life balance. GitLab encourages managers and leadership to set the example by taking time off when needed, and ensuring their reports do the same.
Time away from work can be extremely helpful for maintaining a good work/life balance. GitLab encourages managers and leadership to set the example by taking time off when needed, and ensuring their reports do the same. This page is written with a focus on vacation. If taking time off for medical needs, whether physical or mental, you should follow the appropiate process in your location. If missing more than 25 days of work due to medical requirements, you should move onto Short Term Disability, or the equilavent in your location. However, the below recommendations on communicating your time off apply to time off for all reasons where possible and avoid concerns of health, safety, or job abandonment.
A support engineer remarked that “In the 3 months I've been at GitLab, I've taken more time off than the last 2 years at my previous job.”
......
/* global wNumb */
// Same as .on() but moves the binding to the front of the queue.
$.fn.priorityOn = function(type, selector, data, fn) {
this.each(function() {
var $this = $(this);
var types = type.split(' ');
for (var i = 0; i < types.length; i++) {
$this.on(types[i], selector, data, fn);
var realFn = fn || data;
var currentBindings = $._data(this, 'events')[types[i]];
if ($.isArray(currentBindings)) {
for (var j = 0; j < currentBindings.length; j++) {
if (currentBindings[j].handler.guid === realFn.guid) {
currentBindings.unshift(currentBindings.splice(j, 1)[0]);
break;
}
}
}
}
});
return this;
};
var CategoryRoiStore = {
key: 'category_roi_choices',
setChoices: function(choices) {
......@@ -7,19 +33,55 @@ var CategoryRoiStore = {
var CategoryRoiCalculator = {
selector: '.js-roi-calculator',
$container: [],
tool_input_has_focus: false,
dollar_format: wNumb({
prefix: '$',
decimals: 0,
thousand: ','
}),
init: function() {
if ($(this.selector).length > 0) {
this.$container = $(this.selector);
if (this.$container.length > 0) {
this.setup();
}
},
setup: function() {
this.$inputs = $(this.selector).find('.js-roi-calculator-input');
this.$total = $(this.selector).find('#js-roi-calculator-total');
this.$annual_total = $(this.selector).find('#js-roi-calculator-annual-total');
this.$inputs = this.$container.find('.js-roi-calculator-input');
this.$total = this.$container.find('#js-roi-calculator-total');
this.$annual_total = this.$container.find('#js-roi-calculator-annual-total');
this.$inputs.on('change', this.handleChange.bind(this));
$(document).on('click', '.js-competitor-dropdown li', this.handleDropdownClick.bind(this));
this.updateTotal();
this.setDefaultCompetitors();
this.addOtherToolchainOptions();
},
addOtherToolchainOptions: function() {
var selector = '.js-other-tool-input';
this.$container.find('.js-competitor-dropdown .dropdown-menu').each(function() {
$(this).append('<li data-type="other">Other</li>');
});
$(document)
.on('focusin', selector, function() {
this.tool_input_has_focus = true;
}.bind(this))
.on('focusout', selector, function() {
this.tool_input_has_focus = false;
}.bind(this))
.on('keypress', selector, function(event) {
if (event.which === 13) {
$(event.currentTarget).blur();
}
})
.on('click', selector, function(event) {
event.stopPropagation();
})
.priorityOn('click', '[data-toggle="dropdown"]', function(event) {
if (this.tool_input_has_focus) {
event.stopImmediatePropagation();
}
}.bind(this))
;
},
setDefaultCompetitors: function() {
var self = this;
......@@ -35,15 +97,25 @@ var CategoryRoiCalculator = {
},
updateDropdownTitle: function($selected) {
var $title = $selected.parents('.dropdown').find('.dropdown-title');
$title.html( $selected.html() );
if ( $selected.data('type') === 'other' ) {
var $input = $title.find('.js-other-tool-input');
if ( $input.length === 0 ) {
$input = $('<input type="text" class="js-other-tool-input other-tool-input">');
$title.html('');
$title.append($input);
}
$input.focus();
} else {
$title.html( $selected.html() );
}
},
handleChange: function() {
this.updateTotal();
},
updateTotal: function() {
var total = this.calculateTotal();
this.$total.text('$' + total);
this.$annual_total.text('$' + (total * 12));
this.$total.text(this.dollar_format.to(total));
this.$annual_total.text(this.dollar_format.to(total * 12));
},
calculateTotal: function() {
var total = 0;
......
(function (factory) {
if ( typeof define === 'function' && define.amd ) {
// AMD. Register as an anonymous module.
define([], factory);
} else if ( typeof exports === 'object' ) {
// Node/CommonJS
module.exports = factory();
} else {
// Browser globals
window.wNumb = factory();
}
}(function(){
'use strict';
var FormatOptions = [
'decimals',
'thousand',
'mark',
'prefix',
'suffix',
'encoder',
'decoder',
'negativeBefore',
'negative',
'edit',
'undo'
];
// General
// Reverse a string
function strReverse ( a ) {
return a.split('').reverse().join('');
}
// Check if a string starts with a specified prefix.
function strStartsWith ( input, match ) {
return input.substring(0, match.length) === match;
}
// Check is a string ends in a specified suffix.
function strEndsWith ( input, match ) {
return input.slice(-1 * match.length) === match;
}
// Throw an error if formatting options are incompatible.
function throwEqualError( F, a, b ) {
if ( (F[a] || F[b]) && (F[a] === F[b]) ) {
throw new Error(a);
}
}
// Check if a number is finite and not NaN
function isValidNumber ( input ) {
return typeof input === 'number' && isFinite( input );
}
// Provide rounding-accurate toFixed method.
// Borrowed: http://stackoverflow.com/a/21323330/775265
function toFixed ( value, exp ) {
value = value.toString().split('e');
value = Math.round(+(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp)));
value = value.toString().split('e');
return (+(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp))).toFixed(exp);
}
// Formatting
// Accept a number as input, output formatted string.
function formatTo ( decimals, thousand, mark, prefix, suffix, encoder, decoder, negativeBefore, negative, edit, undo, input ) {
var originalInput = input, inputIsNegative, inputPieces, inputBase, inputDecimals = '', output = '';
// Apply user encoder to the input.
// Expected outcome: number.
if ( encoder ) {
input = encoder(input);
}
// Stop if no valid number was provided, the number is infinite or NaN.
if ( !isValidNumber(input) ) {
return false;
}
// Rounding away decimals might cause a value of -0
// when using very small ranges. Remove those cases.
if ( decimals !== false && parseFloat(input.toFixed(decimals)) === 0 ) {
input = 0;
}
// Formatting is done on absolute numbers,
// decorated by an optional negative symbol.
if ( input < 0 ) {
inputIsNegative = true;
input = Math.abs(input);
}
// Reduce the number of decimals to the specified option.
if ( decimals !== false ) {
input = toFixed( input, decimals );
}
// Transform the number into a string, so it can be split.
input = input.toString();
// Break the number on the decimal separator.
if ( input.indexOf('.') !== -1 ) {
inputPieces = input.split('.');
inputBase = inputPieces[0];
if ( mark ) {
inputDecimals = mark + inputPieces[1];
}
} else {
// If it isn't split, the entire number will do.
inputBase = input;
}
// Group numbers in sets of three.
if ( thousand ) {
inputBase = strReverse(inputBase).match(/.{1,3}/g);
inputBase = strReverse(inputBase.join( strReverse( thousand ) ));
}
// If the number is negative, prefix with negation symbol.
if ( inputIsNegative && negativeBefore ) {
output += negativeBefore;
}
// Prefix the number
if ( prefix ) {
output += prefix;
}
// Normal negative option comes after the prefix. Defaults to '-'.
if ( inputIsNegative && negative ) {
output += negative;
}
// Append the actual number.
output += inputBase;
output += inputDecimals;
// Apply the suffix.
if ( suffix ) {
output += suffix;
}
// Run the output through a user-specified post-formatter.
if ( edit ) {
output = edit ( output, originalInput );
}
// All done.
return output;
}
// Accept a sting as input, output decoded number.
function formatFrom ( decimals, thousand, mark, prefix, suffix, encoder, decoder, negativeBefore, negative, edit, undo, input ) {
var originalInput = input, inputIsNegative, output = '';
// User defined pre-decoder. Result must be a non empty string.
if ( undo ) {
input = undo(input);
}
// Test the input. Can't be empty.
if ( !input || typeof input !== 'string' ) {
return false;
}
// If the string starts with the negativeBefore value: remove it.
// Remember is was there, the number is negative.
if ( negativeBefore && strStartsWith(input, negativeBefore) ) {
input = input.replace(negativeBefore, '');
inputIsNegative = true;
}
// Repeat the same procedure for the prefix.
if ( prefix && strStartsWith(input, prefix) ) {
input = input.replace(prefix, '');
}
// And again for negative.
if ( negative && strStartsWith(input, negative) ) {
input = input.replace(negative, '');
inputIsNegative = true;
}
// Remove the suffix.
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/slice
if ( suffix && strEndsWith(input, suffix) ) {
input = input.slice(0, -1 * suffix.length);
}
// Remove the thousand grouping.
if ( thousand ) {
input = input.split(thousand).join('');
}
// Set the decimal separator back to period.
if ( mark ) {
input = input.replace(mark, '.');
}
// Prepend the negative symbol.
if ( inputIsNegative ) {
output += '-';
}
// Add the number
output += input;
// Trim all non-numeric characters (allow '.' and '-');
output = output.replace(/[^0-9\.\-.]/g, '');
// The value contains no parse-able number.
if ( output === '' ) {
return false;
}
// Covert to number.
output = Number(output);
// Run the user-specified post-decoder.
if ( decoder ) {
output = decoder(output);
}
// Check is the output is valid, otherwise: return false.
if ( !isValidNumber(output) ) {
return false;
}
return output;
}
// Framework
// Validate formatting options
function validate ( inputOptions ) {
var i, optionName, optionValue,
filteredOptions = {};
if ( inputOptions['suffix'] === undefined ) {
inputOptions['suffix'] = inputOptions['postfix'];
}
for ( i = 0; i < FormatOptions.length; i+=1 ) {
optionName = FormatOptions[i];
optionValue = inputOptions[optionName];
if ( optionValue === undefined ) {
// Only default if negativeBefore isn't set.
if ( optionName === 'negative' && !filteredOptions.negativeBefore ) {
filteredOptions[optionName] = '-';
// Don't set a default for mark when 'thousand' is set.
} else if ( optionName === 'mark' && filteredOptions.thousand !== '.' ) {
filteredOptions[optionName] = '.';
} else {
filteredOptions[optionName] = false;
}
// Floating points in JS are stable up to 7 decimals.
} else if ( optionName === 'decimals' ) {
if ( optionValue >= 0 && optionValue < 8 ) {
filteredOptions[optionName] = optionValue;
} else {
throw new Error(optionName);
}
// These options, when provided, must be functions.
} else if ( optionName === 'encoder' || optionName === 'decoder' || optionName === 'edit' || optionName === 'undo' ) {
if ( typeof optionValue === 'function' ) {
filteredOptions[optionName] = optionValue;
} else {
throw new Error(optionName);
}
// Other options are strings.
} else {
if ( typeof optionValue === 'string' ) {
filteredOptions[optionName] = optionValue;
} else {
throw new Error(optionName);
}
}
}
// Some values can't be extracted from a
// string if certain combinations are present.
throwEqualError(filteredOptions, 'mark', 'thousand');
throwEqualError(filteredOptions, 'prefix', 'negative');
throwEqualError(filteredOptions, 'prefix', 'negativeBefore');
return filteredOptions;
}
// Pass all options as function arguments
function passAll ( options, method, input ) {
var i, args = [];
// Add all options in order of FormatOptions
for ( i = 0; i < FormatOptions.length; i+=1 ) {
args.push(options[FormatOptions[i]]);
}
// Append the input, then call the method, presenting all
// options as arguments.
args.push(input);
return method.apply('', args);
}
function wNumb ( options ) {
if ( !(this instanceof wNumb) ) {
return new wNumb ( options );
}
if ( typeof options !== "object" ) {
return;
}
options = validate(options);
// Call 'formatTo' with proper arguments.
this.to = function ( input ) {
return passAll(options, formatTo, input);
};
// Call 'formatFrom' with proper arguments.
this.from = function ( input ) {
return passAll(options, formatFrom, input);
};
}
return wNumb;
}));
(function(factory){if(typeof define==="function"&&define.amd){define([],factory)}else if(typeof exports==="object"){module.exports=factory()}else{window.wNumb=factory()}})(function(){"use strict";var FormatOptions=["decimals","thousand","mark","prefix","suffix","encoder","decoder","negativeBefore","negative","edit","undo"];function strReverse(a){return a.split("").reverse().join("")}function strStartsWith(input,match){return input.substring(0,match.length)===match}function strEndsWith(input,match){return input.slice(-1*match.length)===match}function throwEqualError(F,a,b){if((F[a]||F[b])&&F[a]===F[b]){throw new Error(a)}}function isValidNumber(input){return typeof input==="number"&&isFinite(input)}function toFixed(value,exp){value=value.toString().split("e");value=Math.round(+(value[0]+"e"+(value[1]?+value[1]+exp:exp)));value=value.toString().split("e");return(+(value[0]+"e"+(value[1]?+value[1]-exp:-exp))).toFixed(exp)}function formatTo(decimals,thousand,mark,prefix,suffix,encoder,decoder,negativeBefore,negative,edit,undo,input){var originalInput=input,inputIsNegative,inputPieces,inputBase,inputDecimals="",output="";if(encoder){input=encoder(input)}if(!isValidNumber(input)){return false}if(decimals!==false&&parseFloat(input.toFixed(decimals))===0){input=0}if(input<0){inputIsNegative=true;input=Math.abs(input)}if(decimals!==false){input=toFixed(input,decimals)}input=input.toString();if(input.indexOf(".")!==-1){inputPieces=input.split(".");inputBase=inputPieces[0];if(mark){inputDecimals=mark+inputPieces[1]}}else{inputBase=input}if(thousand){inputBase=strReverse(inputBase).match(/.{1,3}/g);inputBase=strReverse(inputBase.join(strReverse(thousand)))}if(inputIsNegative&&negativeBefore){output+=negativeBefore}if(prefix){output+=prefix}if(inputIsNegative&&negative){output+=negative}output+=inputBase;output+=inputDecimals;if(suffix){output+=suffix}if(edit){output=edit(output,originalInput)}return output}function formatFrom(decimals,thousand,mark,prefix,suffix,encoder,decoder,negativeBefore,negative,edit,undo,input){var originalInput=input,inputIsNegative,output="";if(undo){input=undo(input)}if(!input||typeof input!=="string"){return false}if(negativeBefore&&strStartsWith(input,negativeBefore)){input=input.replace(negativeBefore,"");inputIsNegative=true}if(prefix&&strStartsWith(input,prefix)){input=input.replace(prefix,"")}if(negative&&strStartsWith(input,negative)){input=input.replace(negative,"");inputIsNegative=true}if(suffix&&strEndsWith(input,suffix)){input=input.slice(0,-1*suffix.length)}if(thousand){input=input.split(thousand).join("")}if(mark){input=input.replace(mark,".")}if(inputIsNegative){output+="-"}output+=input;output=output.replace(/[^0-9\.\-.]/g,"");if(output===""){return false}output=Number(output);if(decoder){output=decoder(output)}if(!isValidNumber(output)){return false}return output}function validate(inputOptions){var i,optionName,optionValue,filteredOptions={};if(inputOptions["suffix"]===undefined){inputOptions["suffix"]=inputOptions["postfix"]}for(i=0;i<FormatOptions.length;i+=1){optionName=FormatOptions[i];optionValue=inputOptions[optionName];if(optionValue===undefined){if(optionName==="negative"&&!filteredOptions.negativeBefore){filteredOptions[optionName]="-"}else if(optionName==="mark"&&filteredOptions.thousand!=="."){filteredOptions[optionName]="."}else{filteredOptions[optionName]=false}}else if(optionName==="decimals"){if(optionValue>=0&&optionValue<8){filteredOptions[optionName]=optionValue}else{throw new Error(optionName)}}else if(optionName==="encoder"||optionName==="decoder"||optionName==="edit"||optionName==="undo"){if(typeof optionValue==="function"){filteredOptions[optionName]=optionValue}else{throw new Error(optionName)}}else{if(typeof optionValue==="string"){filteredOptions[optionName]=optionValue}else{throw new Error(optionName)}}}throwEqualError(filteredOptions,"mark","thousand");throwEqualError(filteredOptions,"prefix","negative");throwEqualError(filteredOptions,"prefix","negativeBefore");return filteredOptions}function passAll(options,method,input){var i,args=[];for(i=0;i<FormatOptions.length;i+=1){args.push(options[FormatOptions[i]])}args.push(input);return method.apply("",args)}function wNumb(options){if(!(this instanceof wNumb)){return new wNumb(options)}if(typeof options!=="object"){return}options=validate(options);this.to=function(input){return passAll(options,formatTo,input)};this.from=function(input){return passAll(options,formatFrom,input)}}return wNumb});
......@@ -4,11 +4,12 @@ suppress_header: true
extra_css:
- category-roi-calculator.css
extra_js:
- libs/wNumb.min.js
- category-roi-calculator.js
---
.wrapper
.container-fluid.landing-container
.container.landing-container
.row
.col-md-10.col-md-offset-1
.row.page-head-container
......@@ -21,25 +22,25 @@ extra_js:
.js-roi-calculator
.roi-calculator-container.u-margin-top-lg
.row.header-row
.col-xs-3.header-col
.col-xs-4.header-col
.brand-title.text-center
Category
.col-xs-4.header-col
.brand-title.text-center
= partial "includes/logos/wm_web.svg"
.col-xs-5.header-col
.col-xs-4.header-col
.brand-title.text-center
Your toolchain
.row.total-row
.col-xs-3.total-col
.col-xs-4.total-col
.col-xs-4.total-col
.total-group
%span.total-label
Monthly Cost for 100 users
%span.total-value
$9,900
.col-xs-5.total-col
.col-xs-4.total-col
.total-group
%span.total-label
Monthly Cost for 100 users
......@@ -48,13 +49,13 @@ extra_js:
- data.categories.each do |category_key, category|
- next unless category.roi
.row.data-row
.col-xs-3.data-col
.col-xs-4.data-col
= category.name
.col-xs-4.data-col
.included-group
= partial "includes/icons/checkmark.svg"
Included
.col-xs-5.data-col
.col-xs-4.data-col
.toolchain-group
.dropdown.level.js-competitor-dropdown
%button.dropdown-menu-toggle.btn{type: 'button', 'data-toggle' => 'dropdown'}
......@@ -73,10 +74,10 @@ extra_js:
\/mo
.row.annual-cost-header-row.u-margin-top-md
.col-xs-12
.col-xs-8.col-xs-offset-4
%h2.text-center Annual cost for 100 users
.row.annual-cost-row.u-margin-bottom-lg
.col-xs-4.col-xs-offset-3.gitlab-cost
.col-xs-4.col-xs-offset-4.gitlab-cost
%h1 $118,800
.col-xs-5.toolchain-cost
.col-xs-4.toolchain-cost
%h1#js-roi-calculator-annual-total
......@@ -10,7 +10,7 @@ extra_js:
.hero-container.flex-container.justify-center.align-center
.text-center
%h1.hero-title
A single application for the entire of the DevOps lifecycle.
A single application for the entire DevOps lifecycle.
= partial "includes/home/customer-logos"
......
......@@ -4,7 +4,8 @@
@import "dropdowns";
$lt-large-header: 46px;
$lt-border-style: 1px solid $color-gray-extra-light;
$lt-border-color: $color-gray-extra-light;
$lt-border-style: 1px solid $lt-border-color;
.roi-calculator-container {
margin-right: -15px;
......@@ -81,15 +82,34 @@ $lt-border-style: 1px solid $color-gray-extra-light;
img {
max-width: 25px;
max-height: 25px;
margin-right: 5px;
margin-right: 8px;
}
}
.dropdown {
max-width: calc(100% - 100px);
min-width: 118px;
margin-bottom: 0;
.btn.dropdown-menu-toggle {
width: 220px;
.dropdown-menu-toggle.btn {
max-width: 100%;
}
.dropdown-title,
.dropdown-menu li {
display: flex;
align-items: center;
line-height: 1.2;
white-space: normal;
}
}
.other-tool-input {
width: 100%;
border: 1px solid transparent;
&:hover {
border-color: $lt-border-color;
}
}
......@@ -105,6 +125,7 @@ $lt-border-style: 1px solid $color-gray-extra-light;
border: 1px solid $dropdown-border-color;
line-height: 25px;
text-align: right;
-moz-appearance: textfield;
&::-webkit-inner-spin-button,
&::-webkit-outer-spin-button {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment