Setup CI tests (#100)

* use @xarc/xrun to streamline tasks in an imperative manner

* add lint-staged/husky for git hook tasks

* run prettier across all files

* fixing tests

* add ci test workflow

* add a ci workflow

* remove precommit in favor of husky

* add .prettierrc.js

* reformat with prettier
This commit is contained in:
Vu Nguyen
2021-01-13 23:05:05 -06:00
committed by GitHub
parent 649c64cf1d
commit 9ef655ac3b
117 changed files with 9484 additions and 4342 deletions

2
.eslintignore Normal file
View File

@@ -0,0 +1,2 @@
assets
public

26
.github/workflows/nodejs.yml vendored Normal file
View File

@@ -0,0 +1,26 @@
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
name: test
on:
push:
branches: [master]
pull_request:
branches: [master]
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# This workflow contains a single job called "build"
build:
# The type of runner that the job will run on
runs-on: ubuntu-latest
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
# Checks-out your repository under $GITHUB_WORKSPACE, so your ob can access it
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: 11.15.0
- run: npm ci
- run: npm test

View File

@@ -6,5 +6,5 @@
"undef": true, "undef": true,
"unused": true, "unused": true,
"trailing": true, "trailing": true,
"predef": [ "chrome" ] "predef": ["chrome"]
} }

3
.prettierignore Normal file
View File

@@ -0,0 +1,3 @@
coverage
public
vendor

5
.prettierrc.js Normal file
View File

@@ -0,0 +1,5 @@
module.exports = {
printWidth: 100,
singleQuote: true,
trailingComma: 'all',
};

6
DEVELOPMENT.md Normal file
View File

@@ -0,0 +1,6 @@
## Pre-requisites
- node v11.15.0
- npm 6.7.0
It is suggested you use [nvm](https://github.com/nvm-sh/nvm) to manage your node version

View File

@@ -1,11 +1,9 @@
chrome-wakatime # chrome-wakatime
===============
Automatic time tracking for stats about your website debugging, research, documentation, etc. Automatic time tracking for stats about your website debugging, research, documentation, etc.
Note: Activity from this Chrome extension will not display on leaderboards, so installing this extension may lower your rank. Note: Activity from this Chrome extension will not display on leaderboards, so installing this extension may lower your rank.
## Installation ## Installation
1. Install the extension: 1. Install the extension:
@@ -20,7 +18,6 @@ Note: Activity from this Chrome extension will not display on leaderboards, so i
5. Use in conjunction with [other WakaTime plugins](https://wakatime.com/plugins). 5. Use in conjunction with [other WakaTime plugins](https://wakatime.com/plugins).
## Screenshots ## Screenshots
![SC open](./screenshots/sc_6-green.png) ![SC open](./screenshots/sc_6-green.png)
@@ -29,12 +26,12 @@ Note: Activity from this Chrome extension will not display on leaderboards, so i
![Options SC](./screenshots/sc_8-options.png) ![Options SC](./screenshots/sc_8-options.png)
## Development instructions ## Development instructions
> For development purposes only. > For development purposes only.
To get started, install NPM and Bower dependencies, and do an initial build with Gulp: To get started, install NPM and Bower dependencies, and do an initial build with Gulp:
``` ```
npm start npm start
``` ```
@@ -57,7 +54,7 @@ Run tests:
npm test npm test
``` ```
Lint code *(Both JS and JSX)*: Lint code _(Both JS and JSX)_:
``` ```
jsxhint --jsx-only . jsxhint --jsx-only .
@@ -67,16 +64,14 @@ jsxhint --jsx-only .
There is a precommit hook that lints the code before commiting the changes. There is a precommit hook that lints the code before commiting the changes.
### Load unpacked in Chrome ### Load unpacked in Chrome
1. Clone repository to disk 1. Clone repository to disk
2. Remove `browser_specific_settings` key from manifest.json (only necessary for firefox) 2. Remove `browser_specific_settings` key from manifest.json (only necessary for firefox)
2. Go to `Settings``Extensions` 3. Go to `Settings``Extensions`
3. Enable `Developer mode` 4. Enable `Developer mode`
4. Click `Load unpacked extension...` 5. Click `Load unpacked extension...`
5. Select repository directory 6. Select repository directory
### Troubleshooting ### Troubleshooting

View File

@@ -1,4 +1,3 @@
/* This is a fix for Bootstrap requiring jQuery */ /* This is a fix for Bootstrap requiring jQuery */
global.jQuery = require('jquery'); global.jQuery = require('jquery');
require('bootstrap'); require('bootstrap');
@@ -9,7 +8,4 @@ var ReactDOM = require('react-dom');
// React components // React components
var WakaTime = require('./components/WakaTime.jsx'); var WakaTime = require('./components/WakaTime.jsx');
ReactDOM.render( ReactDOM.render(<WakaTime />, document.getElementById('wakatime'));
<WakaTime />,
document.getElementById('wakatime')
);

View File

@@ -3,13 +3,9 @@ var reactCreateClass = require('create-react-class');
var classNames = require('classnames'); var classNames = require('classnames');
var Alert = reactCreateClass({ var Alert = reactCreateClass({
render: function () {
render: function() { return <div className={classNames('alert', 'alert-' + this.props.type)}>{this.props.text}</div>;
return( },
<div className={classNames('alert', 'alert-' + this.props.type)}>{this.props.text}</div>
);
}
}); });
module.exports = Alert; module.exports = Alert;

View File

@@ -2,106 +2,111 @@
var React = require('react'); var React = require('react');
var reactCreateClass = require('create-react-class'); var reactCreateClass = require('create-react-class');
var MainList = reactCreateClass({ var MainList = reactCreateClass({
_openOptionsPage: function () {
_openOptionsPage: function() { if (browser.runtime.openOptionsPage) {
if (browser.runtime.openOptionsPage) { // New way to open options pages, if supported (Chrome 42+).
// New way to open options pages, if supported (Chrome 42+). browser.runtime.openOptionsPage();
browser.runtime.openOptionsPage(); } else {
} else { // Reasonable fallback.
// Reasonable fallback. window.open(browser.runtime.getURL('options.html'));
window.open(browser.runtime.getURL('options.html'));
}
},
render: function() {
var that = this;
var loginLogoutButton = function() {
if (that.props.loggedIn === true) {
return (
<div>
<a href="#" className="list-group-item" onClick={that.props.logoutUser}>
<i className="fa fa-fw fa-sign-out"></i>
Logout
</a>
</div>
);
}
return (
<a target="_blank" href="https://wakatime.com/login" className="list-group-item">
<i className="fa fa-fw fa-sign-in"></i>
Login
</a>
);
};
// If logging is enabled, display that info to user
var loggingStatus = function() {
if(that.props.loggingEnabled === true && that.props.loggedIn === true)
{
return (
<div className="row">
<div className="col-xs-12">
<p>
<a href="#" onClick={that.props.disableLogging} className="btn btn-danger btn-block">Disable logging</a>
</p>
</div>
</div>
);
}
else if(that.props.loggingEnabled === false && that.props.loggedIn === true)
{
return (
<div className="row">
<div className="col-xs-12">
<p>
<a href="#" onClick={that.props.enableLogging} className="btn btn-success btn-block">Enable logging</a>
</p>
</div>
</div>
);
}
};
var totalTimeLoggedToday = function() {
if (that.props.loggedIn === true) {
return (
<div className="row">
<div className="col-xs-12">
<blockquote>
<p>{that.props.totalTimeLoggedToday}</p>
<small><cite>TOTAL TIME LOGGED TODAY</cite></small>
</blockquote>
</div>
</div>
);
}
};
return (
<div>
{totalTimeLoggedToday()}
{loggingStatus()}
<div className="list-group">
<a href="#" className="list-group-item" onClick={this._openOptionsPage}>
<i className="fa fa-fw fa-cogs"></i>
Options
</a>
{loginLogoutButton()}
</div>
</div>
);
} }
},
render: function () {
var that = this;
var loginLogoutButton = function () {
if (that.props.loggedIn === true) {
return (
<div>
<a href="#" className="list-group-item" onClick={that.props.logoutUser}>
<i className="fa fa-fw fa-sign-out"></i>
Logout
</a>
</div>
);
}
return (
<a target="_blank" href="https://wakatime.com/login" className="list-group-item">
<i className="fa fa-fw fa-sign-in"></i>
Login
</a>
);
};
// If logging is enabled, display that info to user
var loggingStatus = function () {
if (that.props.loggingEnabled === true && that.props.loggedIn === true) {
return (
<div className="row">
<div className="col-xs-12">
<p>
<a
href="#"
onClick={that.props.disableLogging}
className="btn btn-danger btn-block"
>
Disable logging
</a>
</p>
</div>
</div>
);
} else if (that.props.loggingEnabled === false && that.props.loggedIn === true) {
return (
<div className="row">
<div className="col-xs-12">
<p>
<a
href="#"
onClick={that.props.enableLogging}
className="btn btn-success btn-block"
>
Enable logging
</a>
</p>
</div>
</div>
);
}
};
var totalTimeLoggedToday = function () {
if (that.props.loggedIn === true) {
return (
<div className="row">
<div className="col-xs-12">
<blockquote>
<p>{that.props.totalTimeLoggedToday}</p>
<small>
<cite>TOTAL TIME LOGGED TODAY</cite>
</small>
</blockquote>
</div>
</div>
);
}
};
return (
<div>
{totalTimeLoggedToday()}
{loggingStatus()}
<div className="list-group">
<a href="#" className="list-group-item" onClick={this._openOptionsPage}>
<i className="fa fa-fw fa-cogs"></i>
Options
</a>
{loginLogoutButton()}
</div>
</div>
);
},
}); });
module.exports = MainList; module.exports = MainList;

View File

@@ -2,89 +2,101 @@ var React = require('react');
var reactCreateClass = require('create-react-class'); var reactCreateClass = require('create-react-class');
var NavBar = reactCreateClass({ var NavBar = reactCreateClass({
render: function () {
var that = this;
render: function() { var signedInAs = function () {
if (that.props.loggedIn === true) {
var that = this;
var signedInAs = function() {
if (that.props.loggedIn === true) {
return (
<p className="navbar-text">Signed in as <b>{that.props.user.full_name}</b></p>
);
}
};
var dashboard = function() {
if (that.props.loggedIn === true) {
return (
<li>
<a target="_blank" href="https://wakatime.com/dashboard">
<i className="fa fa-fw fa-tachometer"></i>
Dashboard
</a>
</li>
);
}
};
var customRules = function() {
if (that.props.loggedIn === true) {
return (
<li>
<a target="_blank" href="https://wakatime.com/settings/rules">
<i className="fa fa-fw fa-filter"></i>
Custom Rules
</a>
</li>
);
}
};
return ( return (
<nav className="navbar navbar-default" role="navigation"> <p className="navbar-text">
<div className="container-fluid"> Signed in as <b>{that.props.user.full_name}</b>
<div className="navbar-header"> </p>
<button type="button" className="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
<span className="sr-only">Toggle navigation</span>
<i className="fa fa-fw fa-cogs"></i>
</button>
<a target="_blank" className="navbar-brand" href="https://wakatime.com">
WakaTime
<img src="graphics/wakatime-logo-48.png" />
</a>
</div>
<div className="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
{signedInAs()}
<ul className="nav navbar-nav">
{customRules()}
{dashboard()}
<li className="dropdown">
<a href="#" className="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
<i className="fa fa-fw fa-info"></i>
About
<span className="caret"></span>
</a>
<ul className="dropdown-menu" role="menu">
<li>
<a target="_blank" href="https://github.com/wakatime/chrome-wakatime/issues">
<i className="fa fa-fw fa-bug"></i>
Report an Issue</a>
</li>
<li>
<a target="_blank" href="https://github.com/wakatime/chrome-wakatime">
<i className="fa fa-fw fa-github"></i>
View on GitHub</a>
</li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
); );
} }
};
var dashboard = function () {
if (that.props.loggedIn === true) {
return (
<li>
<a target="_blank" href="https://wakatime.com/dashboard">
<i className="fa fa-fw fa-tachometer"></i>
Dashboard
</a>
</li>
);
}
};
var customRules = function () {
if (that.props.loggedIn === true) {
return (
<li>
<a target="_blank" href="https://wakatime.com/settings/rules">
<i className="fa fa-fw fa-filter"></i>
Custom Rules
</a>
</li>
);
}
};
return (
<nav className="navbar navbar-default" role="navigation">
<div className="container-fluid">
<div className="navbar-header">
<button
type="button"
className="navbar-toggle collapsed"
data-toggle="collapse"
data-target="#bs-example-navbar-collapse-1"
>
<span className="sr-only">Toggle navigation</span>
<i className="fa fa-fw fa-cogs"></i>
</button>
<a target="_blank" className="navbar-brand" href="https://wakatime.com">
WakaTime
<img src="graphics/wakatime-logo-48.png" />
</a>
</div>
<div className="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
{signedInAs()}
<ul className="nav navbar-nav">
{customRules()}
{dashboard()}
<li className="dropdown">
<a
href="#"
className="dropdown-toggle"
data-toggle="dropdown"
role="button"
aria-expanded="false"
>
<i className="fa fa-fw fa-info"></i>
About
<span className="caret"></span>
</a>
<ul className="dropdown-menu" role="menu">
<li>
<a target="_blank" href="https://github.com/wakatime/chrome-wakatime/issues">
<i className="fa fa-fw fa-bug"></i>
Report an Issue
</a>
</li>
<li>
<a target="_blank" href="https://github.com/wakatime/chrome-wakatime">
<i className="fa fa-fw fa-github"></i>
View on GitHub
</a>
</li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
);
},
}); });
module.exports = NavBar; module.exports = NavBar;

View File

@@ -17,200 +17,215 @@ var SitesList = require('./SitesList.jsx');
* @type {*|Function} * @type {*|Function}
*/ */
var Options = reactCreateClass({ var Options = reactCreateClass({
getInitialState: function () {
return {
theme: config.theme,
blacklist: '',
whitelist: '',
loggingType: config.loggingType,
loggingStyle: config.loggingStyle,
displayAlert: false,
alertType: config.alert.success.type,
alertText: config.alert.success.text,
};
},
getInitialState: function () { componentDidMount: function () {
return { this.restoreSettings();
theme: config.theme, },
blacklist: '',
whitelist: '',
loggingType: config.loggingType,
loggingStyle: config.loggingStyle,
displayAlert: false,
alertType: config.alert.success.type,
alertText: config.alert.success.text
};
},
componentDidMount: function () { restoreSettings: function () {
this.restoreSettings(); var that = this;
},
restoreSettings: function () { browser.storage.sync
var that = this; .get({
theme: config.theme,
browser.storage.sync.get({ blacklist: '',
theme: config.theme, whitelist: '',
blacklist: '', loggingType: config.loggingType,
whitelist: '', loggingStyle: config.loggingStyle,
loggingType: config.loggingType, })
loggingStyle: config.loggingStyle .then(function (items) {
}).then(function (items) { that.setState({
that.setState({ theme: items.theme,
theme: items.theme, blacklist: items.blacklist,
blacklist: items.blacklist, whitelist: items.whitelist,
whitelist: items.whitelist, loggingType: items.loggingType,
loggingType: items.loggingType, loggingStyle: items.loggingStyle,
loggingStyle: items.loggingStyle
});
that.refs.theme.value = items.theme;
that.refs.loggingType.value = items.loggingType;
that.refs.loggingStyle.value = items.loggingStyle;
}); });
},
_handleSubmit: function (e) { that.refs.theme.value = items.theme;
e.preventDefault(); that.refs.loggingType.value = items.loggingType;
that.refs.loggingStyle.value = items.loggingStyle;
});
},
this.saveSettings(); _handleSubmit: function (e) {
}, e.preventDefault();
saveSettings: function () { this.saveSettings();
var that = this; },
var theme = this.refs.theme.value.trim(); saveSettings: function () {
var loggingType = this.refs.loggingType.value.trim(); var that = this;
var loggingStyle = this.refs.loggingStyle.value.trim();
// Trimming blacklist and whitelist removes blank lines and spaces.
var blacklist = that.state.blacklist.trim();
var whitelist = that.state.whitelist.trim();
// Sync options with google storage. var theme = this.refs.theme.value.trim();
browser.storage.sync.set({ var loggingType = this.refs.loggingType.value.trim();
theme: theme, var loggingStyle = this.refs.loggingStyle.value.trim();
blacklist: blacklist, // Trimming blacklist and whitelist removes blank lines and spaces.
whitelist: whitelist, var blacklist = that.state.blacklist.trim();
loggingType: loggingType, var whitelist = that.state.whitelist.trim();
loggingStyle: loggingStyle
}).then(function () { // Sync options with google storage.
// Set state to be newly entered values. browser.storage.sync
that.setState({ .set({
theme: theme, theme: theme,
blacklist: blacklist, blacklist: blacklist,
whitelist: whitelist, whitelist: whitelist,
loggingType: loggingType, loggingType: loggingType,
loggingStyle: loggingStyle, loggingStyle: loggingStyle,
displayAlert: true })
}); .then(function () {
// Set state to be newly entered values.
that.setState({
theme: theme,
blacklist: blacklist,
whitelist: whitelist,
loggingType: loggingType,
loggingStyle: loggingStyle,
displayAlert: true,
}); });
}, });
},
_displayBlackOrWhiteList: function () { _displayBlackOrWhiteList: function () {
var loggingStyle = this.refs.loggingStyle.value.trim(); var loggingStyle = this.refs.loggingStyle.value.trim();
this.setState({loggingStyle: loggingStyle}); this.setState({ loggingStyle: loggingStyle });
}, },
_updateBlacklistState: function(sites){ _updateBlacklistState: function (sites) {
this.setState({ this.setState({
blacklist: sites blacklist: sites,
}); });
}, },
_updateWhitelistState: function(sites){ _updateWhitelistState: function (sites) {
this.setState({ this.setState({
whitelist: sites whitelist: sites,
}); });
}, },
render: function () { render: function () {
var that = this;
var that = this; var alert = function () {
if (that.state.displayAlert === true) {
var alert = function() { setTimeout(function () {
if(that.state.displayAlert === true){ that.setState({ displayAlert: false });
}, 2000);
setTimeout(function () {
that.setState({displayAlert:false});
}, 2000);
return(
<Alert key={that.state.alertText} type={that.state.alertType} text={that.state.alertText} />
);
}
};
var loggingStyle = function () {
if (that.state.loggingStyle == 'blacklist') {
return (
<SitesList
handleChange={that._updateBlacklistState}
label="Blacklist"
sites={that.state.blacklist}
helpText="Sites that you don't want to show in your reports." />
);
}
return (
<SitesList
handleChange={that._updateWhitelistState}
label="Whitelist"
sites={that.state.whitelist}
placeholder="http://google.com&#10;http://myproject.com@@MyProject"
helpText="Sites that you want to show in your reports. You can assign URL to project by adding @@YourProject at the end of line." />
);
};
return ( return (
<div className="container"> <Alert
<div className="row"> key={that.state.alertText}
<div className="col-md-12"> type={that.state.alertType}
text={that.state.alertText}
<ReactCSSTransitionGroup transitionName="alert" transitionEnterTimeout={500} transitionLeaveTimeout={300}> />
{alert()}
</ReactCSSTransitionGroup>
<form className="form-horizontal" onSubmit={this._handleSubmit}>
<div className="form-group">
<label className="col-lg-2 control-label">Logging style</label>
<div className="col-lg-10">
<select className="form-control" ref="loggingStyle" defaultValue="blacklist" onChange={this._displayBlackOrWhiteList}>
<option value="blacklist">All except blacklisted sites</option>
<option value="whitelist">Only whitelisted sites</option>
</select>
</div>
</div>
{loggingStyle()}
<div className="form-group">
<label className="col-lg-2 control-label">Logging type</label>
<div className="col-lg-10">
<select className="form-control" ref="loggingType" defaultValue="domain">
<option value="domain">Only the domain</option>
<option value="url">Entire URL</option>
</select>
</div>
</div>
<div className="form-group">
<label htmlFor="theme" className="col-lg-2 control-label">Theme</label>
<div className="col-lg-10">
<select className="form-control" ref="theme" defaultValue="light">
<option value="light">Light</option>
<option value="dark">Dark</option>
</select>
</div>
</div>
<div className="form-group">
<div className="col-lg-10 col-lg-offset-2">
<button type="submit" className="btn btn-primary">Save</button>
</div>
</div>
</form>
</div>
</div>
</div>
); );
} }
};
var loggingStyle = function () {
if (that.state.loggingStyle == 'blacklist') {
return (
<SitesList
handleChange={that._updateBlacklistState}
label="Blacklist"
sites={that.state.blacklist}
helpText="Sites that you don't want to show in your reports."
/>
);
}
return (
<SitesList
handleChange={that._updateWhitelistState}
label="Whitelist"
sites={that.state.whitelist}
placeholder="http://google.com&#10;http://myproject.com@@MyProject"
helpText="Sites that you want to show in your reports. You can assign URL to project by adding @@YourProject at the end of line."
/>
);
};
return (
<div className="container">
<div className="row">
<div className="col-md-12">
<ReactCSSTransitionGroup
transitionName="alert"
transitionEnterTimeout={500}
transitionLeaveTimeout={300}
>
{alert()}
</ReactCSSTransitionGroup>
<form className="form-horizontal" onSubmit={this._handleSubmit}>
<div className="form-group">
<label className="col-lg-2 control-label">Logging style</label>
<div className="col-lg-10">
<select
className="form-control"
ref="loggingStyle"
defaultValue="blacklist"
onChange={this._displayBlackOrWhiteList}
>
<option value="blacklist">All except blacklisted sites</option>
<option value="whitelist">Only whitelisted sites</option>
</select>
</div>
</div>
{loggingStyle()}
<div className="form-group">
<label className="col-lg-2 control-label">Logging type</label>
<div className="col-lg-10">
<select className="form-control" ref="loggingType" defaultValue="domain">
<option value="domain">Only the domain</option>
<option value="url">Entire URL</option>
</select>
</div>
</div>
<div className="form-group">
<label htmlFor="theme" className="col-lg-2 control-label">
Theme
</label>
<div className="col-lg-10">
<select className="form-control" ref="theme" defaultValue="light">
<option value="light">Light</option>
<option value="dark">Dark</option>
</select>
</div>
</div>
<div className="form-group">
<div className="col-lg-10 col-lg-offset-2">
<button type="submit" className="btn btn-primary">
Save
</button>
</div>
</div>
</form>
</div>
</div>
</div>
);
},
}); });
module.exports = Options; module.exports = Options;

View File

@@ -2,35 +2,43 @@ var React = require('react');
var reactCreateClass = require('create-react-class'); var reactCreateClass = require('create-react-class');
var SitesList = reactCreateClass({ var SitesList = reactCreateClass({
getDefaultProps: function () {
return {
placeholder: 'http://google.com',
};
},
getDefaultProps: function () { _handleChange: function (event) {
return { var sites = event.target.value;
placeholder: 'http://google.com'
};
},
_handleChange: function (event) { this.props.handleChange(sites);
var sites = event.target.value; },
this.props.handleChange(sites); render: function () {
}, return (
<div className="form-group">
<label htmlFor="sites" className="col-lg-2 control-label">
{this.props.label}
</label>
render: function () { <div className="col-lg-10">
<textarea
return ( className="form-control"
<div className="form-group"> rows="3"
<label htmlFor="sites" className="col-lg-2 control-label">{this.props.label}</label> ref="sites"
onChange={this._handleChange}
<div className="col-lg-10"> placeholder={this.props.placeholder}
<textarea className="form-control" rows="3" ref="sites" onChange={this._handleChange} value={this.props.sites}
placeholder={this.props.placeholder} value={this.props.sites}></textarea> ></textarea>
<span className="help-block">{this.props.helpText} <span className="help-block">
<br/> {this.props.helpText}
One line per site.</span> <br />
</div> One line per site.
</div> </span>
); </div>
} </div>
);
},
}); });
module.exports = SitesList; module.exports = SitesList;

View File

@@ -1,6 +1,6 @@
/* global browser */ /* global browser */
var React = require("react"); var React = require('react');
var reactCreateClass = require('create-react-class'); var reactCreateClass = require('create-react-class');
var $ = require('jquery'); var $ = require('jquery');
@@ -17,160 +17,147 @@ var WakaTimeCore = require('../core/WakaTimeCore').default;
var changeExtensionState = require('../helpers/changeExtensionState'); var changeExtensionState = require('../helpers/changeExtensionState');
var Wakatime = reactCreateClass({ var Wakatime = reactCreateClass({
getInitialState: function () {
return {
user: {
full_name: null,
email: null,
photo: null,
},
loggedIn: false,
loggingEnabled: config.loggingEnabled,
totalTimeLoggedToday: '0 minutes',
};
},
getInitialState: function() { componentDidMount: function () {
return { var wakatime = new WakaTimeCore();
user: {
full_name: null, var that = this;
email: null,
photo: null wakatime.checkAuth().done(function (data) {
}, if (data !== false) {
loggedIn: false, browser.storage.sync
.get({
loggingEnabled: config.loggingEnabled, loggingEnabled: config.loggingEnabled,
totalTimeLoggedToday: '0 minutes' })
}; .then(function (items) {
}, that.setState({ loggingEnabled: items.loggingEnabled });
componentDidMount: function() { if (items.loggingEnabled === true) {
changeExtensionState('allGood');
var wakatime = new WakaTimeCore(); } else {
changeExtensionState('notLogging');
var that = this;
wakatime.checkAuth().done(function(data) {
if (data !== false) {
browser.storage.sync.get({
loggingEnabled: config.loggingEnabled
}).then(function(items) {
that.setState({loggingEnabled: items.loggingEnabled});
if (items.loggingEnabled === true) {
changeExtensionState('allGood');
}
else {
changeExtensionState('notLogging');
}
});
that.setState({
user: {
full_name: data.full_name,
email: data.email,
photo: data.photo
},
loggedIn: true
});
wakatime.getTotalTimeLoggedToday().done(function(grand_total) {
that.setState({
totalTimeLoggedToday: grand_total.text
});
});
wakatime.recordHeartbeat();
}
else {
changeExtensionState('notSignedIn');
} }
});
that.setState({
user: {
full_name: data.full_name,
email: data.email,
photo: data.photo,
},
loggedIn: true,
}); });
}, wakatime.getTotalTimeLoggedToday().done(function (grand_total) {
that.setState({
logoutUser: function() { totalTimeLoggedToday: grand_total.text,
var deferredObject = $.Deferred(); });
var that = this;
$.ajax({
url: config.logoutUserUrl,
method: 'GET',
success: function() {
deferredObject.resolve(that);
},
error: function(xhr, status, err) {
console.error(config.logoutUserUrl, status, err.toString());
deferredObject.resolve(that);
}
}); });
return deferredObject.promise(); wakatime.recordHeartbeat();
}, } else {
changeExtensionState('notSignedIn');
}
});
},
_logoutUser: function() { logoutUser: function () {
var deferredObject = $.Deferred();
var that = this; var that = this;
this.logoutUser().done(function(){ $.ajax({
url: config.logoutUserUrl,
method: 'GET',
success: function () {
deferredObject.resolve(that);
},
error: function (xhr, status, err) {
console.error(config.logoutUserUrl, status, err.toString());
that.setState({ deferredObject.resolve(that);
user: { },
full_name: null, });
email: null,
photo: null
},
loggedIn: false,
loggingEnabled: false
});
changeExtensionState('notSignedIn'); return deferredObject.promise();
},
}); _logoutUser: function () {
}, var that = this;
_disableLogging: function() { this.logoutUser().done(function () {
this.setState({ that.setState({
loggingEnabled: false user: {
}); full_name: null,
email: null,
photo: null,
},
loggedIn: false,
loggingEnabled: false,
});
changeExtensionState('notLogging'); changeExtensionState('notSignedIn');
});
},
browser.storage.sync.set({ _disableLogging: function () {
loggingEnabled: false this.setState({
}); loggingEnabled: false,
}, });
_enableLogging: function() { changeExtensionState('notLogging');
this.setState({
loggingEnabled: true
});
changeExtensionState('allGood'); browser.storage.sync.set({
loggingEnabled: false,
});
},
browser.storage.sync.set({ _enableLogging: function () {
loggingEnabled: true this.setState({
}); loggingEnabled: true,
}, });
render: function() { changeExtensionState('allGood');
return (
<div> browser.storage.sync.set({
<NavBar loggingEnabled: true,
user={this.state.user} });
loggedIn={this.state.loggedIn} /> },
<div className="container">
<div className="row"> render: function () {
<div className="col-md-12"> return (
<MainList <div>
disableLogging={this._disableLogging} <NavBar user={this.state.user} loggedIn={this.state.loggedIn} />
enableLogging={this._enableLogging} <div className="container">
loggingEnabled={this.state.loggingEnabled} <div className="row">
user={this.state.user} <div className="col-md-12">
totalTimeLoggedToday={this.state.totalTimeLoggedToday} <MainList
logoutUser={this._logoutUser} disableLogging={this._disableLogging}
loggedIn={this.state.loggedIn} /> enableLogging={this._enableLogging}
</div> loggingEnabled={this.state.loggingEnabled}
</div> user={this.state.user}
</div> totalTimeLoggedToday={this.state.totalTimeLoggedToday}
logoutUser={this._logoutUser}
loggedIn={this.state.loggedIn}
/>
</div> </div>
); </div>
} </div>
</div>
);
},
}); });
module.exports = Wakatime; module.exports = Wakatime;

View File

@@ -1,67 +1,60 @@
/* global browser */ /* global browser */
//jshint esnext:true //jshint esnext:true
var config = { var config = {
// Extension name // Extension name
name: 'WakaTime', name: 'WakaTime',
// Extension version // Extension version
version: browser.runtime.getManifest().version, version: process.env.NODE_ENV === 'test' ? 'test' : browser.runtime.getManifest().version,
// Time for idle state of the browser // Time for idle state of the browser
// The user is considered idle if there was // The user is considered idle if there was
// no activity in the browser for x seconds // no activity in the browser for x seconds
detectionIntervalInSeconds: 60, detectionIntervalInSeconds: 60,
// Default logging style // Default logging style
// Log all except blacklisted sites // Log all except blacklisted sites
// or log only the white listed sites. // or log only the white listed sites.
loggingStyle: 'blacklist', loggingStyle: 'blacklist',
// Default logging type // Default logging type
loggingType: 'domain', loggingType: 'domain',
// By default logging is enabled // By default logging is enabled
loggingEnabled: true, loggingEnabled: true,
// Url to which to send the heartbeat // Url to which to send the heartbeat
heartbeatApiUrl: 'https://wakatime.com/api/v1/users/current/heartbeats', heartbeatApiUrl: 'https://wakatime.com/api/v1/users/current/heartbeats',
// Url from which to detect if the user is logged in // Url from which to detect if the user is logged in
currentUserApiUrl: 'https://wakatime.com/api/v1/users/current', currentUserApiUrl: 'https://wakatime.com/api/v1/users/current',
// The url to logout the user from wakatime // The url to logout the user from wakatime
logoutUserUrl: 'https://wakatime.com/logout', logoutUserUrl: 'https://wakatime.com/logout',
// Gets stats from the WakaTime API // Gets stats from the WakaTime API
summariesApiUrl: 'https://wakatime.com/api/v1/users/current/summaries', summariesApiUrl: 'https://wakatime.com/api/v1/users/current/summaries',
// Different colors for different states of the extension // Different colors for different states of the extension
colors: { colors: {
allGood: '', allGood: '',
notLogging: 'gray', notLogging: 'gray',
notSignedIn: 'red', notSignedIn: 'red',
lightTheme: 'white' lightTheme: 'white',
},
// Tooltips for each of the extension states
tooltips: {
allGood: '',
notLogging: 'Not logging',
notSignedIn: 'Not signed In',
blacklisted: 'This URL is blacklisted',
whitelisted: 'This URL is not on your whitelist',
},
// Default theme
theme: 'light',
// Valid extension states
states: ['allGood', 'notLogging', 'notSignedIn', 'blacklisted', 'whitelisted'],
// Predefined alert type and text for success and failure.
alert: {
success: {
type: 'success',
text: 'Options have been saved!',
}, },
// Tooltips for each of the extension states failure: {
tooltips: { type: 'danger',
allGood: '', text: 'There was an error while saving the options!',
notLogging: 'Not logging',
notSignedIn: 'Not signed In',
blacklisted: 'This URL is blacklisted',
whitelisted: 'This URL is not on your whitelist'
}, },
// Default theme },
theme: 'light',
// Valid extension states
states: [
'allGood',
'notLogging',
'notSignedIn',
'blacklisted',
'whitelisted'
],
// Predefined alert type and text for success and failure.
alert: {
success: {
type: 'success',
text: 'Options have been saved!'
},
failure: {
type: 'danger',
text: 'There was an error while saving the options!'
}
}
}; };
module.exports = config; module.exports = config;

View File

@@ -32,7 +32,7 @@ class WakaTimeCore {
$.ajax({ $.ajax({
url: config.summariesApiUrl + '?start=' + today + '&end=' + today, url: config.summariesApiUrl + '?start=' + today + '&end=' + today,
dataType: 'json', dataType: 'json',
success: data => { success: (data) => {
deferredObject.resolve(data.data[0].grand_total); deferredObject.resolve(data.data[0].grand_total);
}, },
error: (xhr, status, err) => { error: (xhr, status, err) => {
@@ -56,7 +56,7 @@ class WakaTimeCore {
$.ajax({ $.ajax({
url: config.currentUserApiUrl, url: config.currentUserApiUrl,
dataType: 'json', dataType: 'json',
success: data => { success: (data) => {
deferredObject.resolve(data.data); deferredObject.resolve(data.data);
}, },
error: (xhr, status, err) => { error: (xhr, status, err) => {
@@ -80,14 +80,14 @@ class WakaTimeCore {
blacklist: '', blacklist: '',
whitelist: '', whitelist: '',
}) })
.then(items => { .then((items) => {
if (items.loggingEnabled === true) { if (items.loggingEnabled === true) {
changeExtensionState('allGood'); changeExtensionState('allGood');
browser.idle.queryState(config.detectionIntervalInSeconds).then(newState => { browser.idle.queryState(config.detectionIntervalInSeconds).then((newState) => {
if (newState === 'active') { if (newState === 'active') {
// Get current tab URL. // Get current tab URL.
browser.tabs.query({ currentWindow: true, active: true }).then(tabs => { browser.tabs.query({ currentWindow: true, active: true }).then((tabs) => {
if (tabs.length == 0) return; if (tabs.length == 0) return;
var currentActiveTab = tabs[0]; var currentActiveTab = tabs[0];
@@ -141,9 +141,9 @@ class WakaTimeCore {
* @returns {object} * @returns {object}
*/ */
getHeartbeat(url, list) { getHeartbeat(url, list) {
const projectIndicatorCharacters = '@@'; var projectIndicatorCharacters = '@@';
const lines = list.split('\n'); var lines = list.split('\n');
for (var i = 0; i < lines.length; i++) { for (var i = 0; i < lines.length; i++) {
// strip (http:// or https://) and trailing (`/` or `@@`) // strip (http:// or https://) and trailing (`/` or `@@`)
var cleanLine = lines[i] var cleanLine = lines[i]
@@ -241,7 +241,7 @@ class WakaTimeCore {
sendHeartbeat(heartbeat, debug) { sendHeartbeat(heartbeat, debug) {
var payload = null; var payload = null;
this._getLoggingType().done(loggingType => { this._getLoggingType().done((loggingType) => {
// Get only the domain from the entity. // Get only the domain from the entity.
// And send that in heartbeat // And send that in heartbeat
if (loggingType == 'domain') { if (loggingType == 'domain') {
@@ -283,7 +283,7 @@ class WakaTimeCore {
// nothing to do here // nothing to do here
}, },
}, },
success: response => { success: (response) => {
deferredObject.resolve(this); deferredObject.resolve(this);
}, },
error: (xhr, status, err) => { error: (xhr, status, err) => {

View File

@@ -2,11 +2,11 @@
// Create a connection to the background page // Create a connection to the background page
var backgroundPageConnection = browser.runtime.connect({ var backgroundPageConnection = browser.runtime.connect({
name: "devtools-page" name: 'devtools-page',
}); });
// Send a message to background page with the current active tabId // Send a message to background page with the current active tabId
backgroundPageConnection.postMessage({ backgroundPageConnection.postMessage({
name: 'init', name: 'init',
tabId: browser.devtools.inspectedWindow.tabId tabId: browser.devtools.inspectedWindow.tabId,
}); });

View File

@@ -1,7 +1,7 @@
/* global browser */ /* global browser */
// Core // Core
var WakaTimeCore = require("./core/WakaTimeCore").default; var WakaTimeCore = require('./core/WakaTimeCore').default;
// initialize class // initialize class
var wakatime = new WakaTimeCore(); var wakatime = new WakaTimeCore();
@@ -12,46 +12,40 @@ var connections = {};
// Add a listener to resolve alarms // Add a listener to resolve alarms
browser.alarms.onAlarm.addListener(function (alarm) { browser.alarms.onAlarm.addListener(function (alarm) {
// |alarm| can be undefined because onAlarm also gets called from // |alarm| can be undefined because onAlarm also gets called from
// window.setTimeout on old chrome versions. // window.setTimeout on old chrome versions.
if (alarm && alarm.name == 'heartbeatAlarm') { if (alarm && alarm.name == 'heartbeatAlarm') {
console.log('recording a heartbeat - alarm triggered');
console.log('recording a heartbeat - alarm triggered'); wakatime.recordHeartbeat();
}
wakatime.recordHeartbeat();
}
}); });
// Create a new alarm for heartbeats. // Create a new alarm for heartbeats.
browser.alarms.create('heartbeatAlarm', {periodInMinutes: 2}); browser.alarms.create('heartbeatAlarm', { periodInMinutes: 2 });
/** /**
* Whenever a active tab is changed it records a heartbeat with that tab url. * Whenever a active tab is changed it records a heartbeat with that tab url.
*/ */
browser.tabs.onActivated.addListener(function (activeInfo) { browser.tabs.onActivated.addListener(function (activeInfo) {
browser.tabs.get(activeInfo.tabId).then(function (tab) {
console.log('recording a heartbeat - active tab changed');
browser.tabs.get(activeInfo.tabId).then(function (tab) { wakatime.recordHeartbeat();
});
console.log('recording a heartbeat - active tab changed');
wakatime.recordHeartbeat();
});
}); });
/** /**
* Whenever a active window is changed it records a heartbeat with the active tab url. * Whenever a active window is changed it records a heartbeat with the active tab url.
*/ */
browser.windows.onFocusChanged.addListener(function (windowId) { browser.windows.onFocusChanged.addListener(function (windowId) {
if (windowId != browser.windows.WINDOW_ID_NONE) {
console.log('recording a heartbeat - active window changed');
if (windowId != browser.windows.WINDOW_ID_NONE) { wakatime.recordHeartbeat();
console.log('recording a heartbeat - active window changed'); } else {
console.log('lost focus');
wakatime.recordHeartbeat(); }
} else {
console.log('lost focus');
}
}); });
/** /**
@@ -59,57 +53,49 @@ browser.windows.onFocusChanged.addListener(function (windowId) {
* currently active and if it is, then it records a heartbeat. * currently active and if it is, then it records a heartbeat.
*/ */
browser.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) { browser.tabs.onUpdated.addListener(function (tabId, changeInfo, tab) {
if (changeInfo.status === 'complete') {
// Get current tab URL.
browser.tabs.query({ currentWindow: true, active: true }).then(function (tabs) {
// If tab updated is the same as active tab
if (tabId == tabs[0].id) {
console.log('recording a heartbeat - tab updated');
if (changeInfo.status === 'complete') { wakatime.recordHeartbeat();
// Get current tab URL. }
browser.tabs.query({currentWindow: true, active: true}).then(function(tabs) { });
// If tab updated is the same as active tab }
if (tabId == tabs[0].id) {
console.log('recording a heartbeat - tab updated');
wakatime.recordHeartbeat();
}
});
}
}); });
/** /**
* This is in charge of detecting if devtools are opened or closed * This is in charge of detecting if devtools are opened or closed
* and sending a heartbeat depending on that. * and sending a heartbeat depending on that.
*/ */
browser.runtime.onConnect.addListener(function (port) { browser.runtime.onConnect.addListener(function (port) {
if (port.name == 'devtools-page') {
// Listen to messages sent from the DevTools page
port.onMessage.addListener(function (message, sender, sendResponse) {
if (message.name == 'init') {
connections[message.tabId] = port;
if (port.name == "devtools-page") { wakatime.setTabsWithDevtoolsOpen(Object.keys(connections));
// Listen to messages sent from the DevTools page wakatime.recordHeartbeat();
port.onMessage.addListener(function (message, sender, sendResponse) { }
if (message.name == "init") { });
connections[message.tabId] = port; port.onDisconnect.addListener(function (port) {
var tabs = Object.keys(connections);
wakatime.setTabsWithDevtoolsOpen(Object.keys(connections)); for (var i = 0, len = tabs.length; i < len; i++) {
if (connections[tabs[i]] == port) {
delete connections[tabs[i]];
break;
}
}
wakatime.recordHeartbeat(); wakatime.setTabsWithDevtoolsOpen(Object.keys(connections));
}
});
port.onDisconnect.addListener(function (port) { wakatime.recordHeartbeat();
});
var tabs = Object.keys(connections); }
for (var i = 0, len = tabs.length; i < len; i ++) {
if (connections[tabs[i]] == port) {
delete connections[tabs[i]];
break;
}
}
wakatime.setTabsWithDevtoolsOpen(Object.keys(connections));
wakatime.recordHeartbeat();
});
}
}); });

View File

@@ -9,42 +9,41 @@ var config = require('../config');
* @param color * @param color
*/ */
function changeExtensionIcon(color) { function changeExtensionIcon(color) {
color = color ? color : '';
color = color ? color : ''; var path = null;
var path = null; if (color !== '') {
color = '-' + color;
if (color !== '') { path = './graphics/wakatime-logo-38' + color + '.png';
color = '-' + color;
path = './graphics/wakatime-logo-38' + color + '.png'; browser.browserAction.setIcon({
path: path,
});
}
browser.browserAction.setIcon({ if (color === '') {
path: path browser.storage.sync
}); .get({
} theme: config.theme,
})
.then(function (items) {
if (items.theme == config.theme) {
path = './graphics/wakatime-logo-38.png';
if (color === '') { browser.browserAction.setIcon({
browser.storage.sync.get({ path: path,
theme: config.theme });
}).then(function (items) { } else {
if (items.theme == config.theme) { path = './graphics/wakatime-logo-38-white.png';
path = './graphics/wakatime-logo-38.png';
browser.browserAction.setIcon({
path: path
});
}
else {
path = './graphics/wakatime-logo-38-white.png';
browser.browserAction.setIcon({
path: path
});
}
});
}
browser.browserAction.setIcon({
path: path,
});
}
});
}
} }
module.exports = changeExtensionIcon; module.exports = changeExtensionIcon;

View File

@@ -11,32 +11,32 @@ var in_array = require('./in_array');
* @param state * @param state
*/ */
function changeExtensionState(state) { function changeExtensionState(state) {
if (! in_array(state, config.states)) { if (!in_array(state, config.states)) {
throw new Error('Not a valid state!'); throw new Error('Not a valid state!');
} }
switch (state) { switch (state) {
case 'allGood': case 'allGood':
changeExtensionIcon(config.colors.allGood); changeExtensionIcon(config.colors.allGood);
changeExtensionTooltip(config.tooltips.allGood); changeExtensionTooltip(config.tooltips.allGood);
break; break;
case 'notLogging': case 'notLogging':
changeExtensionIcon(config.colors.notLogging); changeExtensionIcon(config.colors.notLogging);
changeExtensionTooltip(config.tooltips.notLogging); changeExtensionTooltip(config.tooltips.notLogging);
break; break;
case 'notSignedIn': case 'notSignedIn':
changeExtensionIcon(config.colors.notSignedIn); changeExtensionIcon(config.colors.notSignedIn);
changeExtensionTooltip(config.tooltips.notSignedIn); changeExtensionTooltip(config.tooltips.notSignedIn);
break; break;
case 'blacklisted': case 'blacklisted':
changeExtensionIcon(config.colors.notLogging); changeExtensionIcon(config.colors.notLogging);
changeExtensionTooltip(config.tooltips.blacklisted); changeExtensionTooltip(config.tooltips.blacklisted);
break; break;
case 'whitelisted': case 'whitelisted':
changeExtensionIcon(config.colors.notLogging); changeExtensionIcon(config.colors.notLogging);
changeExtensionTooltip(config.tooltips.whitelisted); changeExtensionTooltip(config.tooltips.whitelisted);
break; break;
} }
} }
module.exports = changeExtensionState; module.exports = changeExtensionState;

View File

@@ -8,15 +8,13 @@ var config = require('../config');
* @param text * @param text
*/ */
function changeExtensionTooltip(text) { function changeExtensionTooltip(text) {
if (text === '') {
text = config.name;
} else {
text = config.name + ' - ' + text;
}
if (text === '') { browser.browserAction.setTitle({ title: text });
text = config.name;
}
else {
text = config.name + ' - ' + text;
}
browser.browserAction.setTitle({title: text});
} }
module.exports = changeExtensionTooltip; module.exports = changeExtensionTooltip;

View File

@@ -7,25 +7,24 @@
* @returns {boolean} * @returns {boolean}
*/ */
function contains(url, list) { function contains(url, list) {
var lines = list.split('\n'); var lines = list.split('\n');
for (var i = 0; i < lines.length; i ++) { for (var i = 0; i < lines.length; i++) {
// Trim all lines from the list one by one
var cleanLine = lines[i].trim();
// Trim all lines from the list one by one // If by any chance one line in the list is empty, ignore it
var cleanLine = lines[i].trim(); if (cleanLine === '') continue;
// If by any chance one line in the list is empty, ignore it var lineRe = new RegExp(cleanLine.replace('.', '.').replace('*', '.*'));
if(cleanLine === '') continue;
var lineRe = new RegExp(cleanLine.replace('.', '\.').replace('*', '.*')); // If url matches the current line return true
if (lineRe.test(url)) {
// If url matches the current line return true return true;
if (lineRe.test(url)) {
return true;
}
} }
}
return false; return false;
} }
module.exports = contains; module.exports = contains;

View File

@@ -5,9 +5,9 @@
* @returns {string} * @returns {string}
*/ */
function getDomainFromUrl(url) { function getDomainFromUrl(url) {
var parts = url.split('/'); var parts = url.split('/');
return parts[0] + "//" + parts[2]; return parts[0] + '//' + parts[2];
} }
module.exports = getDomainFromUrl; module.exports = getDomainFromUrl;

View File

@@ -6,13 +6,13 @@
* @returns {boolean} * @returns {boolean}
*/ */
function in_array(needle, haystack) { function in_array(needle, haystack) {
for (var i = 0; i < haystack.length; i ++) { for (var i = 0; i < haystack.length; i++) {
if (needle == haystack[i]) { if (needle == haystack[i]) {
return true; return true;
}
} }
}
return false; return false;
} }
module.exports = in_array; module.exports = in_array;

View File

@@ -10,7 +10,4 @@ var ReactDOM = require('react-dom');
// React components // React components
var Options = require('./components/Options.jsx'); var Options = require('./components/Options.jsx');
ReactDOM.render( ReactDOM.render(<Options />, document.getElementById('wakatime-options'));
<Options />,
document.getElementById('wakatime-options')
);

View File

@@ -1,9 +1,9 @@
@import "bootstrap/bootstrap"; @import 'bootstrap/bootstrap';
@import "font-awesome/font-awesome"; @import 'font-awesome/font-awesome';
@import "bootswatch/paper/bootswatch"; @import 'bootswatch/paper/bootswatch';
@import "bootswatch/paper/variables"; @import 'bootswatch/paper/variables';
@import "variables"; @import 'variables';
@import "partials/_animations"; @import 'partials/_animations';
body { body {
min-width: 357px; min-width: 357px;
@@ -18,11 +18,11 @@ a.navbar-brand {
} }
div.container { div.container {
margin-top: 20px; margin-top: 20px;
} }
canvas#icon { canvas#icon {
display: none; display: none;
} }
div#status { div#status {

View File

@@ -2,7 +2,6 @@
// Alerts // Alerts
// -------------------------------------------------- // --------------------------------------------------
// Base styles // Base styles
// ------------------------- // -------------------------

View File

@@ -2,7 +2,6 @@
// Badges // Badges
// -------------------------------------------------- // --------------------------------------------------
// Base class // Base class
.badge { .badge {
display: inline-block; display: inline-block;

View File

@@ -1,56 +1,56 @@
/*! /*!
* Bootstrap v3.3.6 (http://getbootstrap.com) * Bootstrap v3.3.7 (http://getbootstrap.com)
* Copyright 2011-2015 Twitter, Inc. * Copyright 2011-2016 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/ */
// Core variables and mixins // Core variables and mixins
@import "variables.less"; @import 'variables.less';
@import "mixins.less"; @import 'mixins.less';
// Reset and dependencies // Reset and dependencies
@import "normalize.less"; @import 'normalize.less';
@import "print.less"; @import 'print.less';
@import "glyphicons.less"; @import 'glyphicons.less';
// Core CSS // Core CSS
@import "scaffolding.less"; @import 'scaffolding.less';
@import "type.less"; @import 'type.less';
@import "code.less"; @import 'code.less';
@import "grid.less"; @import 'grid.less';
@import "tables.less"; @import 'tables.less';
@import "forms.less"; @import 'forms.less';
@import "buttons.less"; @import 'buttons.less';
// Components // Components
@import "component-animations.less"; @import 'component-animations.less';
@import "dropdowns.less"; @import 'dropdowns.less';
@import "button-groups.less"; @import 'button-groups.less';
@import "input-groups.less"; @import 'input-groups.less';
@import "navs.less"; @import 'navs.less';
@import "navbar.less"; @import 'navbar.less';
@import "breadcrumbs.less"; @import 'breadcrumbs.less';
@import "pagination.less"; @import 'pagination.less';
@import "pager.less"; @import 'pager.less';
@import "labels.less"; @import 'labels.less';
@import "badges.less"; @import 'badges.less';
@import "jumbotron.less"; @import 'jumbotron.less';
@import "thumbnails.less"; @import 'thumbnails.less';
@import "alerts.less"; @import 'alerts.less';
@import "progress-bars.less"; @import 'progress-bars.less';
@import "media.less"; @import 'media.less';
@import "list-group.less"; @import 'list-group.less';
@import "panels.less"; @import 'panels.less';
@import "responsive-embed.less"; @import 'responsive-embed.less';
@import "wells.less"; @import 'wells.less';
@import "close.less"; @import 'close.less';
// Components w/ JavaScript // Components w/ JavaScript
@import "modals.less"; @import 'modals.less';
@import "tooltip.less"; @import 'tooltip.less';
@import "popovers.less"; @import 'popovers.less';
@import "carousel.less"; @import 'carousel.less';
// Utility classes // Utility classes
@import "utilities.less"; @import 'utilities.less';
@import "responsive-utilities.less"; @import 'responsive-utilities.less';

View File

@@ -2,7 +2,6 @@
// Breadcrumbs // Breadcrumbs
// -------------------------------------------------- // --------------------------------------------------
.breadcrumb { .breadcrumb {
padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal; padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;
margin-bottom: @line-height-computed; margin-bottom: @line-height-computed;
@@ -14,7 +13,7 @@
display: inline-block; display: inline-block;
+ li:before { + li:before {
content: "@{breadcrumb-separator}\00a0"; // Unicode space added since inline-block means non-collapsing white-space content: '@{breadcrumb-separator}\00a0'; // Unicode space added since inline-block means non-collapsing white-space
padding: 0 5px; padding: 0 5px;
color: @breadcrumb-color; color: @breadcrumb-color;
} }

View File

@@ -59,7 +59,7 @@
.border-right-radius(0); .border-right-radius(0);
} }
} }
// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it // Need .dropdown-toggle since :last-child doesn't apply, given that a .dropdown-menu is used immediately after it
.btn-group > .btn:last-child:not(:first-child), .btn-group > .btn:last-child:not(:first-child),
.btn-group > .dropdown-toggle:not(:first-child) { .btn-group > .dropdown-toggle:not(:first-child) {
.border-left-radius(0); .border-left-radius(0);
@@ -88,15 +88,19 @@
outline: 0; outline: 0;
} }
// Sizing // Sizing
// //
// Remix the default button sizing classes into new ones for easier manipulation. // Remix the default button sizing classes into new ones for easier manipulation.
.btn-group-xs > .btn { &:extend(.btn-xs); } .btn-group-xs > .btn {
.btn-group-sm > .btn { &:extend(.btn-sm); } &:extend(.btn-xs);
.btn-group-lg > .btn { &:extend(.btn-lg); } }
.btn-group-sm > .btn {
&:extend(.btn-sm);
}
.btn-group-lg > .btn {
&:extend(.btn-lg);
}
// Split button dropdowns // Split button dropdowns
// ---------------------- // ----------------------
@@ -114,7 +118,7 @@
// The clickable button for toggling the menu // The clickable button for toggling the menu
// Remove the gradient and set the same inset shadow as the :active state // Remove the gradient and set the same inset shadow as the :active state
.btn-group.open .dropdown-toggle { .btn-group.open .dropdown-toggle {
.box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); .box-shadow(inset 0 3px 5px rgba(0,0,0,0.125));
// Show no shadow for `.btn-link` since it has no other button styles. // Show no shadow for `.btn-link` since it has no other button styles.
&.btn-link { &.btn-link {
@@ -122,7 +126,6 @@
} }
} }
// Reposition the caret // Reposition the caret
.btn .caret { .btn .caret {
margin-left: 0; margin-left: 0;
@@ -137,7 +140,6 @@
border-width: 0 @caret-width-large @caret-width-large; border-width: 0 @caret-width-large @caret-width-large;
} }
// Vertical button groups // Vertical button groups
// ---------------------- // ----------------------
@@ -194,7 +196,6 @@
.border-top-radius(0); .border-top-radius(0);
} }
// Justified button groups // Justified button groups
// ---------------------- // ----------------------
@@ -218,7 +219,6 @@
} }
} }
// Checkbox and radio options // Checkbox and radio options
// //
// In order to support the browser's form validation feedback, powered by the // In order to support the browser's form validation feedback, powered by the
@@ -231,13 +231,13 @@
// See https://github.com/twbs/bootstrap/pull/12794 and // See https://github.com/twbs/bootstrap/pull/12794 and
// https://github.com/twbs/bootstrap/pull/14559 for more information. // https://github.com/twbs/bootstrap/pull/14559 for more information.
[data-toggle="buttons"] { [data-toggle='buttons'] {
> .btn, > .btn,
> .btn-group > .btn { > .btn-group > .btn {
input[type="radio"], input[type='radio'],
input[type="checkbox"] { input[type='checkbox'] {
position: absolute; position: absolute;
clip: rect(0,0,0,0); clip: rect(0, 0, 0, 0);
pointer-events: none; pointer-events: none;
} }
} }

View File

@@ -2,7 +2,6 @@
// Buttons // Buttons
// -------------------------------------------------- // --------------------------------------------------
// Base styles // Base styles
// -------------------------------------------------- // --------------------------------------------------
@@ -40,14 +39,14 @@
&.active { &.active {
outline: 0; outline: 0;
background-image: none; background-image: none;
.box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); .box-shadow(inset 0 3px 5px rgba(0,0,0,0.125));
} }
&.disabled, &.disabled,
&[disabled], &[disabled],
fieldset[disabled] & { fieldset[disabled] & {
cursor: @cursor-disabled; cursor: @cursor-disabled;
.opacity(.65); .opacity(0.65);
.box-shadow(none); .box-shadow(none);
} }
@@ -59,7 +58,6 @@
} }
} }
// Alternate buttons // Alternate buttons
// -------------------------------------------------- // --------------------------------------------------
@@ -86,7 +84,6 @@
.button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border); .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);
} }
// Link buttons // Link buttons
// ------------------------- // -------------------------
@@ -126,7 +123,6 @@
} }
} }
// Button Sizes // Button Sizes
// -------------------------------------------------- // --------------------------------------------------
@@ -142,7 +138,6 @@
.button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small); .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);
} }
// Block button // Block button
// -------------------------------------------------- // --------------------------------------------------
@@ -157,9 +152,9 @@
} }
// Specificity overrides // Specificity overrides
input[type="submit"], input[type='submit'],
input[type="reset"], input[type='reset'],
input[type="button"] { input[type='button'] {
&.btn-block { &.btn-block {
width: 100%; width: 100%;
} }

View File

@@ -2,7 +2,6 @@
// Carousel // Carousel
// -------------------------------------------------- // --------------------------------------------------
// Wrapper for the slide container and indicators // Wrapper for the slide container and indicators
.carousel { .carousel {
position: relative; position: relative;
@@ -16,7 +15,7 @@
> .item { > .item {
display: none; display: none;
position: relative; position: relative;
.transition(.6s ease-in-out left); .transition(0.6s ease-in-out left);
// Account for jankitude on images // Account for jankitude on images
> img, > img,
@@ -84,7 +83,6 @@
> .active.right { > .active.right {
left: 100%; left: 100%;
} }
} }
// Left/right controls for nav // Left/right controls for nav
@@ -107,12 +105,12 @@
// Set gradients for backgrounds // Set gradients for backgrounds
&.left { &.left {
#gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001)); #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));;
} }
&.right { &.right {
left: auto; left: auto;
right: 0; right: 0;
#gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5)); #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));;
} }
// Hover/focus state // Hover/focus state
@@ -121,7 +119,7 @@
outline: 0; outline: 0;
color: @carousel-control-color; color: @carousel-control-color;
text-decoration: none; text-decoration: none;
.opacity(.9); .opacity(0.9);
} }
// Toggles // Toggles
@@ -147,21 +145,20 @@
} }
.icon-prev, .icon-prev,
.icon-next { .icon-next {
width: 20px; width: 20px;
height: 20px; height: 20px;
line-height: 1; line-height: 1;
font-family: serif; font-family: serif;
} }
.icon-prev { .icon-prev {
&:before { &:before {
content: '\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039) content: '\2039'; // SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)
} }
} }
.icon-next { .icon-next {
&:before { &:before {
content: '\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A) content: '\203a'; // SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)
} }
} }
} }
@@ -184,7 +181,7 @@
li { li {
display: inline-block; display: inline-block;
width: 10px; width: 10px;
height: 10px; height: 10px;
margin: 1px; margin: 1px;
text-indent: -999px; text-indent: -999px;
@@ -202,11 +199,11 @@
// For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we
// set alpha transparency for the best results possible. // set alpha transparency for the best results possible.
background-color: #000 \9; // IE8 background-color: #000 \9; // IE8
background-color: rgba(0,0,0,0); // IE9 background-color: rgba(0, 0, 0, 0); // IE9
} }
.active { .active {
margin: 0; margin: 0;
width: 12px; width: 12px;
height: 12px; height: 12px;
background-color: @carousel-indicator-active-bg; background-color: @carousel-indicator-active-bg;
} }
@@ -231,10 +228,8 @@
} }
} }
// Scale up controls for tablets and up // Scale up controls for tablets and up
@media screen and (min-width: @screen-sm-min) { @media screen and (min-width: @screen-sm-min) {
// Scale up the controls a smidge // Scale up the controls a smidge
.carousel-control { .carousel-control {
.glyphicon-chevron-left, .glyphicon-chevron-left,

View File

@@ -2,7 +2,6 @@
// Close icons // Close icons
// -------------------------------------------------- // --------------------------------------------------
.close { .close {
float: right; float: right;
font-size: (@font-size-base * 1.5); font-size: (@font-size-base * 1.5);
@@ -10,14 +9,14 @@
line-height: 1; line-height: 1;
color: @close-color; color: @close-color;
text-shadow: @close-text-shadow; text-shadow: @close-text-shadow;
.opacity(.2); .opacity(0.2);
&:hover, &:hover,
&:focus { &:focus {
color: @close-color; color: @close-color;
text-decoration: none; text-decoration: none;
cursor: pointer; cursor: pointer;
.opacity(.5); .opacity(0.5);
} }
// Additional properties for button version // Additional properties for button version

View File

@@ -2,7 +2,6 @@
// Code (inline and block) // Code (inline and block)
// -------------------------------------------------- // --------------------------------------------------
// Inline and block code styles // Inline and block code styles
code, code,
kbd, kbd,
@@ -27,7 +26,7 @@ kbd {
color: @kbd-color; color: @kbd-color;
background-color: @kbd-bg; background-color: @kbd-bg;
border-radius: @border-radius-small; border-radius: @border-radius-small;
box-shadow: inset 0 -1px 0 rgba(0,0,0,.25); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);
kbd { kbd {
padding: 0; padding: 0;

View File

@@ -9,7 +9,7 @@
.fade { .fade {
opacity: 0; opacity: 0;
.transition(opacity .15s linear); .transition(opacity 0.15s linear);
&.in { &.in {
opacity: 1; opacity: 1;
} }
@@ -18,16 +18,22 @@
.collapse { .collapse {
display: none; display: none;
&.in { display: block; } &.in {
tr&.in { display: table-row; } display: block;
tbody&.in { display: table-row-group; } }
tr&.in {
display: table-row;
}
tbody&.in {
display: table-row-group;
}
} }
.collapsing { .collapsing {
position: relative; position: relative;
height: 0; height: 0;
overflow: hidden; overflow: hidden;
.transition-property(~"height, visibility"); .transition-property(~'height, visibility');
.transition-duration(.35s); .transition-duration(0.35s);
.transition-timing-function(ease); .transition-timing-function(ease);
} }

View File

@@ -2,7 +2,6 @@
// Dropdown menus // Dropdown menus
// -------------------------------------------------- // --------------------------------------------------
// Dropdown arrow/caret // Dropdown arrow/caret
.caret { .caret {
display: inline-block; display: inline-block;
@@ -10,10 +9,10 @@
height: 0; height: 0;
margin-left: 2px; margin-left: 2px;
vertical-align: middle; vertical-align: middle;
border-top: @caret-width-base dashed; border-top: @caret-width-base dashed;
border-top: @caret-width-base solid ~"\9"; // IE8 border-top: @caret-width-base solid ~'\9'; // IE8
border-right: @caret-width-base solid transparent; border-right: @caret-width-base solid transparent;
border-left: @caret-width-base solid transparent; border-left: @caret-width-base solid transparent;
} }
// The dropdown wrapper (div) // The dropdown wrapper (div)
@@ -45,7 +44,7 @@
border: 1px solid @dropdown-fallback-border; // IE8 fallback border: 1px solid @dropdown-fallback-border; // IE8 fallback
border: 1px solid @dropdown-border; border: 1px solid @dropdown-border;
border-radius: @border-radius-base; border-radius: @border-radius-base;
.box-shadow(0 6px 12px rgba(0,0,0,.175)); .box-shadow(0 6px 12px rgba(0,0,0,0.175));
background-clip: padding-box; background-clip: padding-box;
// Aligns the dropdown menu to right // Aligns the dropdown menu to right
@@ -186,8 +185,8 @@
.caret { .caret {
border-top: 0; border-top: 0;
border-bottom: @caret-width-base dashed; border-bottom: @caret-width-base dashed;
border-bottom: @caret-width-base solid ~"\9"; // IE8 border-bottom: @caret-width-base solid ~'\9'; // IE8
content: ""; content: '';
} }
// Different positioning for bottom up menu // Different positioning for bottom up menu
.dropdown-menu { .dropdown-menu {
@@ -197,7 +196,6 @@
} }
} }
// Component alignment // Component alignment
// //
// Reiterate per navbar.less and the modified component alignment there. // Reiterate per navbar.less and the modified component alignment there.

View File

@@ -2,7 +2,6 @@
// Forms // Forms
// -------------------------------------------------- // --------------------------------------------------
// Normalize non-controls // Normalize non-controls
// //
// Restyle and baseline non-control form elements. // Restyle and baseline non-control form elements.
@@ -36,7 +35,6 @@ label {
font-weight: bold; font-weight: bold;
} }
// Normalize form controls // Normalize form controls
// //
// While most of our form styles require extra classes, some basic normalization // While most of our form styles require extra classes, some basic normalization
@@ -44,24 +42,24 @@ label {
// address browser inconsistencies. // address browser inconsistencies.
// Override content-box in Normalize (* isn't specific enough) // Override content-box in Normalize (* isn't specific enough)
input[type="search"] { input[type='search'] {
.box-sizing(border-box); .box-sizing(border-box);
} }
// Position radios and checkboxes better // Position radios and checkboxes better
input[type="radio"], input[type='radio'],
input[type="checkbox"] { input[type='checkbox'] {
margin: 4px 0 0; margin: 4px 0 0;
margin-top: 1px \9; // IE8-9 margin-top: 1px \9; // IE8-9
line-height: normal; line-height: normal;
} }
input[type="file"] { input[type='file'] {
display: block; display: block;
} }
// Make range inputs behave like textual form controls // Make range inputs behave like textual form controls
input[type="range"] { input[type='range'] {
display: block; display: block;
width: 100%; width: 100%;
} }
@@ -73,9 +71,9 @@ select[size] {
} }
// Focus for file, radio, and checkbox // Focus for file, radio, and checkbox
input[type="file"]:focus, input[type='file']:focus,
input[type="radio"]:focus, input[type='radio']:focus,
input[type="checkbox"]:focus { input[type='checkbox']:focus {
.tab-focus(); .tab-focus();
} }
@@ -88,7 +86,6 @@ output {
color: @input-color; color: @input-color;
} }
// Common form controls // Common form controls
// //
// Shared size and type resets for form controls. Apply `.form-control` to any // Shared size and type resets for form controls. Apply `.form-control` to any
@@ -123,8 +120,8 @@ output {
background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214 background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214
border: 1px solid @input-border; border: 1px solid @input-border;
border-radius: @input-border-radius; // Note: This has no effect on <select>s in some browsers, due to the limited stylability of <select>s in CSS. border-radius: @input-border-radius; // Note: This has no effect on <select>s in some browsers, due to the limited stylability of <select>s in CSS.
.box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); .box-shadow(inset 0 1px 1px rgba(0,0,0,0.075));
.transition(~"border-color ease-in-out .15s, box-shadow ease-in-out .15s"); .transition(~'border-color ease-in-out .15s, box-shadow ease-in-out .15s');
// Customize the `:focus` state to imitate native WebKit styles. // Customize the `:focus` state to imitate native WebKit styles.
.form-control-focus(); .form-control-focus();
@@ -161,7 +158,6 @@ output {
} }
} }
// Search inputs in iOS // Search inputs in iOS
// //
// This overrides the extra rounded corners on search inputs in iOS so that our // This overrides the extra rounded corners on search inputs in iOS so that our
@@ -169,11 +165,10 @@ output {
// be added to `.form-control` as it's not specific enough. For details, see // be added to `.form-control` as it's not specific enough. For details, see
// https://github.com/twbs/bootstrap/issues/11586. // https://github.com/twbs/bootstrap/issues/11586.
input[type="search"] { input[type='search'] {
-webkit-appearance: none; -webkit-appearance: none;
} }
// Special styles for iOS temporal inputs // Special styles for iOS temporal inputs
// //
// In Mobile Safari, setting `display: block` on temporal inputs causes the // In Mobile Safari, setting `display: block` on temporal inputs causes the
@@ -181,13 +176,13 @@ input[type="search"] {
// set a pixel line-height that matches the given height of the input, but only // set a pixel line-height that matches the given height of the input, but only
// for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848 // for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848
// //
// Note that as of 8.3, iOS doesn't support `datetime` or `week`. // Note that as of 9.3, iOS doesn't support `week`.
@media screen and (-webkit-min-device-pixel-ratio: 0) { @media screen and (-webkit-min-device-pixel-ratio: 0) {
input[type="date"], input[type='date'],
input[type="time"], input[type='time'],
input[type="datetime-local"], input[type='datetime-local'],
input[type="month"] { input[type='month'] {
&.form-control { &.form-control {
line-height: @input-height-base; line-height: @input-height-base;
} }
@@ -204,7 +199,6 @@ input[type="search"] {
} }
} }
// Form groups // Form groups
// //
// Designed to help with the organization and spacing of vertical forms. For // Designed to help with the organization and spacing of vertical forms. For
@@ -214,7 +208,6 @@ input[type="search"] {
margin-bottom: @form-group-margin-bottom; margin-bottom: @form-group-margin-bottom;
} }
// Checkboxes and radios // Checkboxes and radios
// //
// Indent the labels to position radios/checkboxes as hanging controls. // Indent the labels to position radios/checkboxes as hanging controls.
@@ -234,10 +227,10 @@ input[type="search"] {
cursor: pointer; cursor: pointer;
} }
} }
.radio input[type="radio"], .radio input[type='radio'],
.radio-inline input[type="radio"], .radio-inline input[type='radio'],
.checkbox input[type="checkbox"], .checkbox input[type='checkbox'],
.checkbox-inline input[type="checkbox"] { .checkbox-inline input[type='checkbox'] {
position: absolute; position: absolute;
margin-left: -20px; margin-left: -20px;
margin-top: 4px \9; margin-top: 4px \9;
@@ -269,8 +262,8 @@ input[type="search"] {
// Some special care is needed because <label>s don't inherit their parent's `cursor`. // Some special care is needed because <label>s don't inherit their parent's `cursor`.
// //
// Note: Neither radios nor checkboxes can be readonly. // Note: Neither radios nor checkboxes can be readonly.
input[type="radio"], input[type='radio'],
input[type="checkbox"] { input[type='checkbox'] {
&[disabled], &[disabled],
&.disabled, &.disabled,
fieldset[disabled] & { fieldset[disabled] & {
@@ -296,7 +289,6 @@ input[type="checkbox"] {
} }
} }
// Static form control text // Static form control text
// //
// Apply class to a `p` element to make any string of text align with labels in // Apply class to a `p` element to make any string of text align with labels in
@@ -317,7 +309,6 @@ input[type="checkbox"] {
} }
} }
// Form control sizing // Form control sizing
// //
// Build on `.form-control` with modifier classes to decrease or increase the // Build on `.form-control` with modifier classes to decrease or increase the
@@ -382,7 +373,6 @@ input[type="checkbox"] {
} }
} }
// Form control feedback states // Form control feedback states
// //
// Apply contextual and semantic states to individual form controls. // Apply contextual and semantic states to individual form controls.
@@ -437,7 +427,6 @@ input[type="checkbox"] {
// Reposition feedback icon if input has visible label above // Reposition feedback icon if input has visible label above
.has-feedback label { .has-feedback label {
& ~ .form-control-feedback { & ~ .form-control-feedback {
top: (@line-height-computed + 5); // Height of the `label` and its margin top: (@line-height-computed + 5); // Height of the `label` and its margin
} }
@@ -446,7 +435,6 @@ input[type="checkbox"] {
} }
} }
// Help text // Help text
// //
// Apply to any element you wish to create light text for placement immediately // Apply to any element you wish to create light text for placement immediately
@@ -459,7 +447,6 @@ input[type="checkbox"] {
color: lighten(@text-color, 25%); // lighten the text some for contrast color: lighten(@text-color, 25%); // lighten the text some for contrast
} }
// Inline forms // Inline forms
// //
// Make forms appear inline(-block) by adding the `.form-inline` class. Inline // Make forms appear inline(-block) by adding the `.form-inline` class. Inline
@@ -472,7 +459,6 @@ input[type="checkbox"] {
// Heads up! This is mixin-ed into `.navbar-form` in navbars.less. // Heads up! This is mixin-ed into `.navbar-form` in navbars.less.
.form-inline { .form-inline {
// Kick in the inline // Kick in the inline
@media (min-width: @screen-sm-min) { @media (min-width: @screen-sm-min) {
// Inline-block all the things for "inline" // Inline-block all the things for "inline"
@@ -528,8 +514,8 @@ input[type="checkbox"] {
padding-left: 0; padding-left: 0;
} }
} }
.radio input[type="radio"], .radio input[type='radio'],
.checkbox input[type="checkbox"] { .checkbox input[type='checkbox'] {
position: relative; position: relative;
margin-left: 0; margin-left: 0;
} }
@@ -541,14 +527,12 @@ input[type="checkbox"] {
} }
} }
// Horizontal forms // Horizontal forms
// //
// Horizontal forms are built on grid classes and allow you to create forms with // Horizontal forms are built on grid classes and allow you to create forms with
// labels on the left and inputs on the right. // labels on the left and inputs on the right.
.form-horizontal { .form-horizontal {
// Consistent vertical alignment of radios and checkboxes // Consistent vertical alignment of radios and checkboxes
// //
// Labels also get some reset styles, but that is scoped to a media query below. // Labels also get some reset styles, but that is scoped to a media query below.

File diff suppressed because it is too large Load Diff

View File

@@ -2,7 +2,6 @@
// Grid system // Grid system
// -------------------------------------------------- // --------------------------------------------------
// Container widths // Container widths
// //
// Set the container width, and override it for fixed navbars in media queries. // Set the container width, and override it for fixed navbars in media queries.
@@ -21,7 +20,6 @@
} }
} }
// Fluid container // Fluid container
// //
// Utilizes the mixin meant for fixed width containers, but without any defined // Utilizes the mixin meant for fixed width containers, but without any defined
@@ -31,7 +29,6 @@
.container-fixed(); .container-fixed();
} }
// Row // Row
// //
// Rows contain and clear the floats of your columns. // Rows contain and clear the floats of your columns.
@@ -40,14 +37,12 @@
.make-row(); .make-row();
} }
// Columns // Columns
// //
// Common styles for small and large grid columns // Common styles for small and large grid columns
.make-grid-columns(); .make-grid-columns();
// Extra small grid // Extra small grid
// //
// Columns, offsets, pushes, and pulls for extra small devices like // Columns, offsets, pushes, and pulls for extra small devices like
@@ -55,7 +50,6 @@
.make-grid(xs); .make-grid(xs);
// Small grid // Small grid
// //
// Columns, offsets, pushes, and pulls for the small device range, from phones // Columns, offsets, pushes, and pulls for the small device range, from phones
@@ -65,7 +59,6 @@
.make-grid(sm); .make-grid(sm);
} }
// Medium grid // Medium grid
// //
// Columns, offsets, pushes, and pulls for the desktop device range. // Columns, offsets, pushes, and pulls for the desktop device range.
@@ -74,7 +67,6 @@
.make-grid(md); .make-grid(md);
} }
// Large grid // Large grid
// //
// Columns, offsets, pushes, and pulls for the large desktop device range. // Columns, offsets, pushes, and pulls for the large desktop device range.

View File

@@ -10,7 +10,7 @@
border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table
// Undo padding and float of grid classes // Undo padding and float of grid classes
&[class*="col-"] { &[class*='col-'] {
float: none; float: none;
padding-left: 0; padding-left: 0;
padding-right: 0; padding-right: 0;
@@ -29,7 +29,7 @@
width: 100%; width: 100%;
margin-bottom: 0; margin-bottom: 0;
&:focus { &:focus {
z-index: 3; z-index: 3;
} }
@@ -52,7 +52,6 @@
.input-sm(); .input-sm();
} }
// Display as table-cell // Display as table-cell
// ------------------------- // -------------------------
.input-group-addon, .input-group-addon,
@@ -98,8 +97,8 @@
} }
// Nuke default margins from checkboxes and radios to vertically center within. // Nuke default margins from checkboxes and radios to vertically center within.
input[type="radio"], input[type='radio'],
input[type="checkbox"] { input[type='checkbox'] {
margin-top: 0; margin-top: 0;
} }
} }

View File

@@ -2,9 +2,8 @@
// Jumbotron // Jumbotron
// -------------------------------------------------- // --------------------------------------------------
.jumbotron { .jumbotron {
padding-top: @jumbotron-padding; padding-top: @jumbotron-padding;
padding-bottom: @jumbotron-padding; padding-bottom: @jumbotron-padding;
margin-bottom: @jumbotron-padding; margin-bottom: @jumbotron-padding;
color: @jumbotron-color; color: @jumbotron-color;
@@ -28,7 +27,7 @@
.container &, .container &,
.container-fluid & { .container-fluid & {
border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container
padding-left: (@grid-gutter-width / 2); padding-left: (@grid-gutter-width / 2);
padding-right: (@grid-gutter-width / 2); padding-right: (@grid-gutter-width / 2);
} }
@@ -37,12 +36,12 @@
} }
@media screen and (min-width: @screen-sm-min) { @media screen and (min-width: @screen-sm-min) {
padding-top: (@jumbotron-padding * 1.6); padding-top: (@jumbotron-padding * 1.6);
padding-bottom: (@jumbotron-padding * 1.6); padding-bottom: (@jumbotron-padding * 1.6);
.container &, .container &,
.container-fluid & { .container-fluid & {
padding-left: (@jumbotron-padding * 2); padding-left: (@jumbotron-padding * 2);
padding-right: (@jumbotron-padding * 2); padding-right: (@jumbotron-padding * 2);
} }

View File

@@ -4,7 +4,7 @@
.label { .label {
display: inline; display: inline;
padding: .2em .6em .3em; padding: 0.2em 0.6em 0.3em;
font-size: 75%; font-size: 75%;
font-weight: bold; font-weight: bold;
line-height: 1; line-height: 1;
@@ -12,7 +12,7 @@
text-align: center; text-align: center;
white-space: nowrap; white-space: nowrap;
vertical-align: baseline; vertical-align: baseline;
border-radius: .25em; border-radius: 0.25em;
// Add hover effects, but only for links // Add hover effects, but only for links
a& { a& {

View File

@@ -2,7 +2,6 @@
// List groups // List groups
// -------------------------------------------------- // --------------------------------------------------
// Base class // Base class
// //
// Easily usable on <ul>, <ol>, or <div>. // Easily usable on <ul>, <ol>, or <div>.
@@ -13,7 +12,6 @@
padding-left: 0; // reset padding because ul and ol padding-left: 0; // reset padding because ul and ol
} }
// Individual list items // Individual list items
// //
// Use on `li`s or `div`s within the `.list-group` parent. // Use on `li`s or `div`s within the `.list-group` parent.
@@ -37,7 +35,6 @@
} }
} }
// Interactive list items // Interactive list items
// //
// Use anchor or button elements instead of `li`s or `div`s to create interactive items. // Use anchor or button elements instead of `li`s or `div`s to create interactive items.
@@ -104,7 +101,6 @@ button.list-group-item {
} }
} }
// Contextual variants // Contextual variants
// //
// Add modifier classes to change text and background color on individual items. // Add modifier classes to change text and background color on individual items.
@@ -115,7 +111,6 @@ button.list-group-item {
.list-group-item-variant(warning; @state-warning-bg; @state-warning-text); .list-group-item-variant(warning; @state-warning-bg; @state-warning-text);
.list-group-item-variant(danger; @state-danger-bg; @state-danger-text); .list-group-item-variant(danger; @state-danger-bg; @state-danger-text);
// Custom content options // Custom content options
// //
// Extra classes for creating well-formatted content within `.list-group-item`s. // Extra classes for creating well-formatted content within `.list-group-item`s.

View File

@@ -2,39 +2,39 @@
// -------------------------------------------------- // --------------------------------------------------
// Utilities // Utilities
@import "mixins/hide-text.less"; @import 'mixins/hide-text.less';
@import "mixins/opacity.less"; @import 'mixins/opacity.less';
@import "mixins/image.less"; @import 'mixins/image.less';
@import "mixins/labels.less"; @import 'mixins/labels.less';
@import "mixins/reset-filter.less"; @import 'mixins/reset-filter.less';
@import "mixins/resize.less"; @import 'mixins/resize.less';
@import "mixins/responsive-visibility.less"; @import 'mixins/responsive-visibility.less';
@import "mixins/size.less"; @import 'mixins/size.less';
@import "mixins/tab-focus.less"; @import 'mixins/tab-focus.less';
@import "mixins/reset-text.less"; @import 'mixins/reset-text.less';
@import "mixins/text-emphasis.less"; @import 'mixins/text-emphasis.less';
@import "mixins/text-overflow.less"; @import 'mixins/text-overflow.less';
@import "mixins/vendor-prefixes.less"; @import 'mixins/vendor-prefixes.less';
// Components // Components
@import "mixins/alerts.less"; @import 'mixins/alerts.less';
@import "mixins/buttons.less"; @import 'mixins/buttons.less';
@import "mixins/panels.less"; @import 'mixins/panels.less';
@import "mixins/pagination.less"; @import 'mixins/pagination.less';
@import "mixins/list-group.less"; @import 'mixins/list-group.less';
@import "mixins/nav-divider.less"; @import 'mixins/nav-divider.less';
@import "mixins/forms.less"; @import 'mixins/forms.less';
@import "mixins/progress-bar.less"; @import 'mixins/progress-bar.less';
@import "mixins/table-row.less"; @import 'mixins/table-row.less';
// Skins // Skins
@import "mixins/background-variant.less"; @import 'mixins/background-variant.less';
@import "mixins/border-radius.less"; @import 'mixins/border-radius.less';
@import "mixins/gradients.less"; @import 'mixins/gradients.less';
// Layout // Layout
@import "mixins/clearfix.less"; @import 'mixins/clearfix.less';
@import "mixins/center-block.less"; @import 'mixins/center-block.less';
@import "mixins/nav-vertical-align.less"; @import 'mixins/nav-vertical-align.less';
@import "mixins/grid-framework.less"; @import 'mixins/grid-framework.less';
@import "mixins/grid.less"; @import 'mixins/grid.less';

View File

@@ -2,17 +2,17 @@
.border-top-radius(@radius) { .border-top-radius(@radius) {
border-top-right-radius: @radius; border-top-right-radius: @radius;
border-top-left-radius: @radius; border-top-left-radius: @radius;
} }
.border-right-radius(@radius) { .border-right-radius(@radius) {
border-bottom-right-radius: @radius; border-bottom-right-radius: @radius;
border-top-right-radius: @radius; border-top-right-radius: @radius;
} }
.border-bottom-radius(@radius) { .border-bottom-radius(@radius) {
border-bottom-right-radius: @radius; border-bottom-right-radius: @radius;
border-bottom-left-radius: @radius; border-bottom-left-radius: @radius;
} }
.border-left-radius(@radius) { .border-left-radius(@radius) {
border-bottom-left-radius: @radius; border-bottom-left-radius: @radius;
border-top-left-radius: @radius; border-top-left-radius: @radius;
} }

View File

@@ -12,26 +12,26 @@
&.focus { &.focus {
color: @color; color: @color;
background-color: darken(@background, 10%); background-color: darken(@background, 10%);
border-color: darken(@border, 25%); border-color: darken(@border, 25%);
} }
&:hover { &:hover {
color: @color; color: @color;
background-color: darken(@background, 10%); background-color: darken(@background, 10%);
border-color: darken(@border, 12%); border-color: darken(@border, 12%);
} }
&:active, &:active,
&.active, &.active,
.open > .dropdown-toggle& { .open > .dropdown-toggle& {
color: @color; color: @color;
background-color: darken(@background, 10%); background-color: darken(@background, 10%);
border-color: darken(@border, 12%); border-color: darken(@border, 12%);
&:hover, &:hover,
&:focus, &:focus,
&.focus { &.focus {
color: @color; color: @color;
background-color: darken(@background, 17%); background-color: darken(@background, 17%);
border-color: darken(@border, 25%); border-color: darken(@border, 25%);
} }
} }
&:active, &:active,
@@ -46,7 +46,7 @@
&:focus, &:focus,
&.focus { &.focus {
background-color: @background; background-color: @background;
border-color: @border; border-color: @border;
} }
} }

View File

@@ -13,7 +13,7 @@
.clearfix() { .clearfix() {
&:before, &:before,
&:after { &:after {
content: " "; // 1 content: ' '; // 1
display: table; // 2 display: table; // 2
} }
&:after { &:after {

View File

@@ -14,16 +14,16 @@
&.radio label, &.radio label,
&.checkbox label, &.checkbox label,
&.radio-inline label, &.radio-inline label,
&.checkbox-inline label { &.checkbox-inline label {
color: @text-color; color: @text-color;
} }
// Set the border and box shadow on specific inputs to match // Set the border and box shadow on specific inputs to match
.form-control { .form-control {
border-color: @border-color; border-color: @border-color;
.box-shadow(inset 0 1px 1px rgba(0,0,0,.075)); // Redeclare so transitions work .box-shadow(inset 0 1px 1px rgba(0,0,0,0.075)); // Redeclare so transitions work
&:focus { &:focus {
border-color: darken(@border-color, 10%); border-color: darken(@border-color, 10%);
@shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%); @shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px lighten(@border-color, 20%);
.box-shadow(@shadow); .box-shadow(@shadow);
} }
} }
@@ -39,7 +39,6 @@
} }
} }
// Form control focus state // Form control focus state
// //
// Generate a customized focus state and for any input with the specified color, // Generate a customized focus state and for any input with the specified color,
@@ -53,11 +52,11 @@
// Example usage: change the default blue border and shadow to white for better // Example usage: change the default blue border and shadow to white for better
// contrast against a dark gray background. // contrast against a dark gray background.
.form-control-focus(@color: @input-border-focus) { .form-control-focus(@color: @input-border-focus) {
@color-rgba: rgba(red(@color), green(@color), blue(@color), .6); @color-rgba: rgba(red(@color), green(@color), blue(@color), 0.6);
&:focus { &:focus {
border-color: @color; border-color: @color;
outline: 0; outline: 0;
.box-shadow(~"inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}"); .box-shadow(~'inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @{color-rgba}');
} }
} }

View File

@@ -1,17 +1,34 @@
// Gradients // Gradients
#gradient { #gradient {
// Horizontal gradient, from left to right // Horizontal gradient, from left to right
// //
// Creates two color stops, start and end, by specifying a color and position for each color stop. // Creates two color stops, start and end, by specifying a color and position for each color stop.
// Color stops are not available in IE9 and below. // Color stops are not available in IE9 and below.
.horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) { .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {
background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+ background-image: -webkit-linear-gradient(
background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12 left,
background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+ @start-color @start-percent,
@end-color @end-percent
); // Safari 5.1-6, Chrome 10+
background-image: -o-linear-gradient(
left,
@start-color @start-percent,
@end-color @end-percent
); // Opera 12
background-image: linear-gradient(
to right,
@start-color @start-percent,
@end-color @end-percent
); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
background-repeat: repeat-x; background-repeat: repeat-x;
filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down filter: e(
%(
"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",
argb(@start-color),
argb(@end-color)
)
); // IE9 and down
} }
// Vertical gradient, from top to bottom // Vertical gradient, from top to bottom
@@ -19,41 +36,111 @@
// Creates two color stops, start and end, by specifying a color and position for each color stop. // Creates two color stops, start and end, by specifying a color and position for each color stop.
// Color stops are not available in IE9 and below. // Color stops are not available in IE9 and below.
.vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) { .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {
background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+ background-image: -webkit-linear-gradient(
background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12 top,
background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+ @start-color @start-percent,
@end-color @end-percent
); // Safari 5.1-6, Chrome 10+
background-image: -o-linear-gradient(
top,
@start-color @start-percent,
@end-color @end-percent
); // Opera 12
background-image: linear-gradient(
to bottom,
@start-color @start-percent,
@end-color @end-percent
); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
background-repeat: repeat-x; background-repeat: repeat-x;
filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down filter: e(
%(
"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",
argb(@start-color),
argb(@end-color)
)
); // IE9 and down
} }
.directional(@start-color: #555; @end-color: #333; @deg: 45deg) { .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {
background-repeat: repeat-x; background-repeat: repeat-x;
background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+ background-image: -webkit-linear-gradient(
@deg,
@start-color,
@end-color
); // Safari 5.1-6, Chrome 10+
background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12 background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12
background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+ background-image: linear-gradient(
@deg,
@start-color,
@end-color
); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+
} }
.horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) { .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {
background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color); background-image: -webkit-linear-gradient(
left,
@start-color,
@mid-color @color-stop,
@end-color
);
background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color); background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);
background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color); background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);
background-repeat: no-repeat; background-repeat: no-repeat;
filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback filter: e(
%(
"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)",
argb(@start-color),
argb(@end-color)
)
); // IE9 and down, gets no color-stop at all for proper fallback
} }
.vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) { .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {
background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color); background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);
background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color); background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);
background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color); background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);
background-repeat: no-repeat; background-repeat: no-repeat;
filter: e(%("progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback filter: e(
%(
"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)",
argb(@start-color),
argb(@end-color)
)
); // IE9 and down, gets no color-stop at all for proper fallback
} }
.radial(@inner-color: #555; @outer-color: #333) { .radial(@inner-color: #555; @outer-color: #333) {
background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color); background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);
background-image: radial-gradient(circle, @inner-color, @outer-color); background-image: radial-gradient(circle, @inner-color, @outer-color);
background-repeat: no-repeat; background-repeat: no-repeat;
} }
.striped(@color: rgba(255,255,255,.15); @angle: 45deg) { .striped(@color: rgba(255,255,255,0.15); @angle: 45deg) {
background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent); background-image: -webkit-linear-gradient(
background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent); @angle,
background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent); @color 25%,
transparent 25%,
transparent 50%,
@color 50%,
@color 75%,
transparent 75%,
transparent
);
background-image: -o-linear-gradient(
@angle,
@color 25%,
transparent 25%,
transparent 50%,
@color 50%,
@color 75%,
transparent 75%,
transparent
);
background-image: linear-gradient(
@angle,
@color 25%,
transparent 25%,
transparent 50%,
@color 50%,
@color 75%,
transparent 75%,
transparent
);
} }
} }

View File

@@ -5,21 +5,24 @@
.make-grid-columns() { .make-grid-columns() {
// Common styles for all sizes of grid columns, widths 1-12 // Common styles for all sizes of grid columns, widths 1-12
.col(@index) { // initial .col(@index) {
@item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}"; // initial
@item: ~'.col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}';
.col((@index + 1), @item); .col((@index + 1), @item);
} }
.col(@index, @list) when (@index =< @grid-columns) { // general; "=<" isn't a typo .col(@index, @list) when (@index =< @grid-columns) {
@item: ~".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}"; // general; "=<" isn't a typo
.col((@index + 1), ~"@{list}, @{item}"); @item: ~'.col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}';
.col((@index + 1), ~'@{list}, @{item}');
} }
.col(@index, @list) when (@index > @grid-columns) { // terminal .col(@index, @list) when (@index > @grid-columns) {
// terminal
@{list} { @{list} {
position: relative; position: relative;
// Prevent columns from collapsing when empty // Prevent columns from collapsing when empty
min-height: 1px; min-height: 1px;
// Inner gutter via padding // Inner gutter via padding
padding-left: ceil((@grid-gutter-width / 2)); padding-left: ceil((@grid-gutter-width / 2));
padding-right: floor((@grid-gutter-width / 2)); padding-right: floor((@grid-gutter-width / 2));
} }
} }
@@ -27,15 +30,18 @@
} }
.float-grid-columns(@class) { .float-grid-columns(@class) {
.col(@index) { // initial .col(@index) {
@item: ~".col-@{class}-@{index}"; // initial
@item: ~'.col-@{class}-@{index}';
.col((@index + 1), @item); .col((@index + 1), @item);
} }
.col(@index, @list) when (@index =< @grid-columns) { // general .col(@index, @list) when (@index =< @grid-columns) {
@item: ~".col-@{class}-@{index}"; // general
.col((@index + 1), ~"@{list}, @{item}"); @item: ~'.col-@{class}-@{index}';
.col((@index + 1), ~'@{list}, @{item}');
} }
.col(@index, @list) when (@index > @grid-columns) { // terminal .col(@index, @list) when (@index > @grid-columns) {
// terminal
@{list} { @{list} {
float: left; float: left;
} }

View File

@@ -6,14 +6,14 @@
.container-fixed(@gutter: @grid-gutter-width) { .container-fixed(@gutter: @grid-gutter-width) {
margin-right: auto; margin-right: auto;
margin-left: auto; margin-left: auto;
padding-left: floor((@gutter / 2)); padding-left: floor((@gutter / 2));
padding-right: ceil((@gutter / 2)); padding-right: ceil((@gutter / 2));
&:extend(.clearfix all); &:extend(.clearfix all);
} }
// Creates a wrapper for a series of columns // Creates a wrapper for a series of columns
.make-row(@gutter: @grid-gutter-width) { .make-row(@gutter: @grid-gutter-width) {
margin-left: ceil((@gutter / -2)); margin-left: ceil((@gutter / -2));
margin-right: floor((@gutter / -2)); margin-right: floor((@gutter / -2));
&:extend(.clearfix all); &:extend(.clearfix all);
} }
@@ -24,7 +24,7 @@
float: left; float: left;
width: percentage((@columns / @grid-columns)); width: percentage((@columns / @grid-columns));
min-height: 1px; min-height: 1px;
padding-left: (@gutter / 2); padding-left: (@gutter / 2);
padding-right: (@gutter / 2); padding-right: (@gutter / 2);
} }
.make-xs-column-offset(@columns) { .make-xs-column-offset(@columns) {
@@ -41,7 +41,7 @@
.make-sm-column(@columns; @gutter: @grid-gutter-width) { .make-sm-column(@columns; @gutter: @grid-gutter-width) {
position: relative; position: relative;
min-height: 1px; min-height: 1px;
padding-left: (@gutter / 2); padding-left: (@gutter / 2);
padding-right: (@gutter / 2); padding-right: (@gutter / 2);
@media (min-width: @screen-sm-min) { @media (min-width: @screen-sm-min) {
@@ -69,7 +69,7 @@
.make-md-column(@columns; @gutter: @grid-gutter-width) { .make-md-column(@columns; @gutter: @grid-gutter-width) {
position: relative; position: relative;
min-height: 1px; min-height: 1px;
padding-left: (@gutter / 2); padding-left: (@gutter / 2);
padding-right: (@gutter / 2); padding-right: (@gutter / 2);
@media (min-width: @screen-md-min) { @media (min-width: @screen-md-min) {
@@ -97,7 +97,7 @@
.make-lg-column(@columns; @gutter: @grid-gutter-width) { .make-lg-column(@columns; @gutter: @grid-gutter-width) {
position: relative; position: relative;
min-height: 1px; min-height: 1px;
padding-left: (@gutter / 2); padding-left: (@gutter / 2);
padding-right: (@gutter / 2); padding-right: (@gutter / 2);
@media (min-width: @screen-lg-min) { @media (min-width: @screen-lg-min) {

View File

@@ -8,7 +8,7 @@
// Deprecated as of v3.0.1 (has been removed in v4) // Deprecated as of v3.0.1 (has been removed in v4)
.hide-text() { .hide-text() {
font: ~"0/0" a; font: ~'0/0' a;
color: transparent; color: transparent;
text-shadow: none; text-shadow: none;
background-color: transparent; background-color: transparent;

View File

@@ -2,7 +2,6 @@
// - Responsive image // - Responsive image
// - Retina image // - Retina image
// Responsive image // Responsive image
// //
// Keep images from scaling beyond the width of their parents. // Keep images from scaling beyond the width of their parents.
@@ -12,22 +11,20 @@
height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching
} }
// Retina image // Retina image
// //
// Short retina mixin for setting background-image and -size. Note that the // Short retina mixin for setting background-image and -size. Note that the
// spelling of `min--moz-device-pixel-ratio` is intentional. // spelling of `min--moz-device-pixel-ratio` is intentional.
.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) { .img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {
background-image: url("@{file-1x}"); background-image: url('@{file-1x}');
@media @media only screen and (-webkit-min-device-pixel-ratio: 2),
only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2),
only screen and ( min--moz-device-pixel-ratio: 2), only screen and (-o-min-device-pixel-ratio: 2/1),
only screen and ( -o-min-device-pixel-ratio: 2/1), only screen and (min-device-pixel-ratio: 2),
only screen and ( min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi),
only screen and ( min-resolution: 192dpi), only screen and (min-resolution: 2dppx) {
only screen and ( min-resolution: 2dppx) { background-image: url('@{file-2x}');
background-image: url("@{file-2x}");
background-size: @width-1x @height-1x; background-size: @width-1x @height-1x;
} }
} }

View File

@@ -4,5 +4,5 @@
opacity: @opacity; opacity: @opacity;
// IE8 filter // IE8 filter
@opacity-ie: (@opacity * 100); @opacity-ie: (@opacity * 100);
filter: ~"alpha(opacity=@{opacity-ie})"; filter: ~'alpha(opacity=@{opacity-ie})';
} }

View File

@@ -4,5 +4,5 @@
// the IE filter for IE9 and below. // the IE filter for IE9 and below.
.reset-filter() { .reset-filter() {
filter: e(%("progid:DXImageTransform.Microsoft.gradient(enabled = false)")); filter: e(%('progid:DXImageTransform.Microsoft.gradient(enabled = false)'));
} }

View File

@@ -4,10 +4,16 @@
// More easily include all the states for responsive-utilities.less. // More easily include all the states for responsive-utilities.less.
.responsive-visibility() { .responsive-visibility() {
display: block !important; display: block !important;
table& { display: table !important; } table& {
tr& { display: table-row !important; } display: table !important;
}
tr& {
display: table-row !important;
}
th&, th&,
td& { display: table-cell !important; } td& {
display: table-cell !important;
}
} }
.responsive-invisibility() { .responsive-invisibility() {

View File

@@ -1,9 +1,9 @@
// WebKit-style focus // WebKit-style focus
.tab-focus() { .tab-focus() {
// Default // WebKit-specific. Other browsers will keep their default outline style.
outline: thin dotted; // (Initially tried to also force default via `outline: initial`,
// WebKit // but that seems to erroneously remove the outline in Firefox altogether.)
outline: 5px auto -webkit-focus-ring-color; outline: 5px auto -webkit-focus-ring-color;
outline-offset: -2px; outline-offset: -2px;
} }

View File

@@ -14,40 +14,39 @@
// - Transitions // - Transitions
// - User Select // - User Select
// Animations // Animations
.animation(@animation) { .animation(@animation) {
-webkit-animation: @animation; -webkit-animation: @animation;
-o-animation: @animation; -o-animation: @animation;
animation: @animation; animation: @animation;
} }
.animation-name(@name) { .animation-name(@name) {
-webkit-animation-name: @name; -webkit-animation-name: @name;
animation-name: @name; animation-name: @name;
} }
.animation-duration(@duration) { .animation-duration(@duration) {
-webkit-animation-duration: @duration; -webkit-animation-duration: @duration;
animation-duration: @duration; animation-duration: @duration;
} }
.animation-timing-function(@timing-function) { .animation-timing-function(@timing-function) {
-webkit-animation-timing-function: @timing-function; -webkit-animation-timing-function: @timing-function;
animation-timing-function: @timing-function; animation-timing-function: @timing-function;
} }
.animation-delay(@delay) { .animation-delay(@delay) {
-webkit-animation-delay: @delay; -webkit-animation-delay: @delay;
animation-delay: @delay; animation-delay: @delay;
} }
.animation-iteration-count(@iteration-count) { .animation-iteration-count(@iteration-count) {
-webkit-animation-iteration-count: @iteration-count; -webkit-animation-iteration-count: @iteration-count;
animation-iteration-count: @iteration-count; animation-iteration-count: @iteration-count;
} }
.animation-direction(@direction) { .animation-direction(@direction) {
-webkit-animation-direction: @direction; -webkit-animation-direction: @direction;
animation-direction: @direction; animation-direction: @direction;
} }
.animation-fill-mode(@fill-mode) { .animation-fill-mode(@fill-mode) {
-webkit-animation-fill-mode: @fill-mode; -webkit-animation-fill-mode: @fill-mode;
animation-fill-mode: @fill-mode; animation-fill-mode: @fill-mode;
} }
// Backface visibility // Backface visibility
@@ -56,8 +55,8 @@
.backface-visibility(@visibility) { .backface-visibility(@visibility) {
-webkit-backface-visibility: @visibility; -webkit-backface-visibility: @visibility;
-moz-backface-visibility: @visibility; -moz-backface-visibility: @visibility;
backface-visibility: @visibility; backface-visibility: @visibility;
} }
// Drop shadows // Drop shadows
@@ -67,34 +66,34 @@
.box-shadow(@shadow) { .box-shadow(@shadow) {
-webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1 -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1
box-shadow: @shadow; box-shadow: @shadow;
} }
// Box sizing // Box sizing
.box-sizing(@boxmodel) { .box-sizing(@boxmodel) {
-webkit-box-sizing: @boxmodel; -webkit-box-sizing: @boxmodel;
-moz-box-sizing: @boxmodel; -moz-box-sizing: @boxmodel;
box-sizing: @boxmodel; box-sizing: @boxmodel;
} }
// CSS3 Content Columns // CSS3 Content Columns
.content-columns(@column-count; @column-gap: @grid-gutter-width) { .content-columns(@column-count; @column-gap: @grid-gutter-width) {
-webkit-column-count: @column-count; -webkit-column-count: @column-count;
-moz-column-count: @column-count; -moz-column-count: @column-count;
column-count: @column-count; column-count: @column-count;
-webkit-column-gap: @column-gap; -webkit-column-gap: @column-gap;
-moz-column-gap: @column-gap; -moz-column-gap: @column-gap;
column-gap: @column-gap; column-gap: @column-gap;
} }
// Optional hyphenation // Optional hyphenation
.hyphens(@mode: auto) { .hyphens(@mode: auto) {
word-wrap: break-word; word-wrap: break-word;
-webkit-hyphens: @mode; -webkit-hyphens: @mode;
-moz-hyphens: @mode; -moz-hyphens: @mode;
-ms-hyphens: @mode; // IE10+ -ms-hyphens: @mode; // IE10+
-o-hyphens: @mode; -o-hyphens: @mode;
hyphens: @mode; hyphens: @mode;
} }
// Placeholder text // Placeholder text
@@ -104,124 +103,126 @@
color: @color; color: @color;
opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526 opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526
} }
&:-ms-input-placeholder { color: @color; } // Internet Explorer 10+ &:-ms-input-placeholder {
&::-webkit-input-placeholder { color: @color; } // Safari and Chrome color: @color;
} // Internet Explorer 10+
&::-webkit-input-placeholder {
color: @color;
} // Safari and Chrome
} }
// Transformations // Transformations
.scale(@ratio) { .scale(@ratio) {
-webkit-transform: scale(@ratio); -webkit-transform: scale(@ratio);
-ms-transform: scale(@ratio); // IE9 only -ms-transform: scale(@ratio); // IE9 only
-o-transform: scale(@ratio); -o-transform: scale(@ratio);
transform: scale(@ratio); transform: scale(@ratio);
} }
.scale(@ratioX; @ratioY) { .scale(@ratioX; @ratioY) {
-webkit-transform: scale(@ratioX, @ratioY); -webkit-transform: scale(@ratioX, @ratioY);
-ms-transform: scale(@ratioX, @ratioY); // IE9 only -ms-transform: scale(@ratioX, @ratioY); // IE9 only
-o-transform: scale(@ratioX, @ratioY); -o-transform: scale(@ratioX, @ratioY);
transform: scale(@ratioX, @ratioY); transform: scale(@ratioX, @ratioY);
} }
.scaleX(@ratio) { .scaleX(@ratio) {
-webkit-transform: scaleX(@ratio); -webkit-transform: scaleX(@ratio);
-ms-transform: scaleX(@ratio); // IE9 only -ms-transform: scaleX(@ratio); // IE9 only
-o-transform: scaleX(@ratio); -o-transform: scaleX(@ratio);
transform: scaleX(@ratio); transform: scaleX(@ratio);
} }
.scaleY(@ratio) { .scaleY(@ratio) {
-webkit-transform: scaleY(@ratio); -webkit-transform: scaleY(@ratio);
-ms-transform: scaleY(@ratio); // IE9 only -ms-transform: scaleY(@ratio); // IE9 only
-o-transform: scaleY(@ratio); -o-transform: scaleY(@ratio);
transform: scaleY(@ratio); transform: scaleY(@ratio);
} }
.skew(@x; @y) { .skew(@x; @y) {
-webkit-transform: skewX(@x) skewY(@y); -webkit-transform: skewX(@x) skewY(@y);
-ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+ -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+
-o-transform: skewX(@x) skewY(@y); -o-transform: skewX(@x) skewY(@y);
transform: skewX(@x) skewY(@y); transform: skewX(@x) skewY(@y);
} }
.translate(@x; @y) { .translate(@x; @y) {
-webkit-transform: translate(@x, @y); -webkit-transform: translate(@x, @y);
-ms-transform: translate(@x, @y); // IE9 only -ms-transform: translate(@x, @y); // IE9 only
-o-transform: translate(@x, @y); -o-transform: translate(@x, @y);
transform: translate(@x, @y); transform: translate(@x, @y);
} }
.translate3d(@x; @y; @z) { .translate3d(@x; @y; @z) {
-webkit-transform: translate3d(@x, @y, @z); -webkit-transform: translate3d(@x, @y, @z);
transform: translate3d(@x, @y, @z); transform: translate3d(@x, @y, @z);
} }
.rotate(@degrees) { .rotate(@degrees) {
-webkit-transform: rotate(@degrees); -webkit-transform: rotate(@degrees);
-ms-transform: rotate(@degrees); // IE9 only -ms-transform: rotate(@degrees); // IE9 only
-o-transform: rotate(@degrees); -o-transform: rotate(@degrees);
transform: rotate(@degrees); transform: rotate(@degrees);
} }
.rotateX(@degrees) { .rotateX(@degrees) {
-webkit-transform: rotateX(@degrees); -webkit-transform: rotateX(@degrees);
-ms-transform: rotateX(@degrees); // IE9 only -ms-transform: rotateX(@degrees); // IE9 only
-o-transform: rotateX(@degrees); -o-transform: rotateX(@degrees);
transform: rotateX(@degrees); transform: rotateX(@degrees);
} }
.rotateY(@degrees) { .rotateY(@degrees) {
-webkit-transform: rotateY(@degrees); -webkit-transform: rotateY(@degrees);
-ms-transform: rotateY(@degrees); // IE9 only -ms-transform: rotateY(@degrees); // IE9 only
-o-transform: rotateY(@degrees); -o-transform: rotateY(@degrees);
transform: rotateY(@degrees); transform: rotateY(@degrees);
} }
.perspective(@perspective) { .perspective(@perspective) {
-webkit-perspective: @perspective; -webkit-perspective: @perspective;
-moz-perspective: @perspective; -moz-perspective: @perspective;
perspective: @perspective; perspective: @perspective;
} }
.perspective-origin(@perspective) { .perspective-origin(@perspective) {
-webkit-perspective-origin: @perspective; -webkit-perspective-origin: @perspective;
-moz-perspective-origin: @perspective; -moz-perspective-origin: @perspective;
perspective-origin: @perspective; perspective-origin: @perspective;
} }
.transform-origin(@origin) { .transform-origin(@origin) {
-webkit-transform-origin: @origin; -webkit-transform-origin: @origin;
-moz-transform-origin: @origin; -moz-transform-origin: @origin;
-ms-transform-origin: @origin; // IE9 only -ms-transform-origin: @origin; // IE9 only
transform-origin: @origin; transform-origin: @origin;
} }
// Transitions // Transitions
.transition(@transition) { .transition(@transition) {
-webkit-transition: @transition; -webkit-transition: @transition;
-o-transition: @transition; -o-transition: @transition;
transition: @transition; transition: @transition;
} }
.transition-property(@transition-property) { .transition-property(@transition-property) {
-webkit-transition-property: @transition-property; -webkit-transition-property: @transition-property;
transition-property: @transition-property; transition-property: @transition-property;
} }
.transition-delay(@transition-delay) { .transition-delay(@transition-delay) {
-webkit-transition-delay: @transition-delay; -webkit-transition-delay: @transition-delay;
transition-delay: @transition-delay; transition-delay: @transition-delay;
} }
.transition-duration(@transition-duration) { .transition-duration(@transition-duration) {
-webkit-transition-duration: @transition-duration; -webkit-transition-duration: @transition-duration;
transition-duration: @transition-duration; transition-duration: @transition-duration;
} }
.transition-timing-function(@timing-function) { .transition-timing-function(@timing-function) {
-webkit-transition-timing-function: @timing-function; -webkit-transition-timing-function: @timing-function;
transition-timing-function: @timing-function; transition-timing-function: @timing-function;
} }
.transition-transform(@transition) { .transition-transform(@transition) {
-webkit-transition: -webkit-transform @transition; -webkit-transition: -webkit-transform @transition;
-moz-transition: -moz-transform @transition; -moz-transition: -moz-transform @transition;
-o-transition: -o-transform @transition; -o-transition: -o-transform @transition;
transition: transform @transition; transition: transform @transition;
} }
// User select // User select
// For selecting text on the page // For selecting text on the page
.user-select(@select) { .user-select(@select) {
-webkit-user-select: @select; -webkit-user-select: @select;
-moz-user-select: @select; -moz-user-select: @select;
-ms-user-select: @select; // IE10+ -ms-user-select: @select; // IE10+
user-select: @select; user-select: @select;
} }

View File

@@ -31,9 +31,11 @@
// When fading in the modal, animate it to slide down // When fading in the modal, animate it to slide down
&.fade .modal-dialog { &.fade .modal-dialog {
.translate(0, -25%); .translate(0, -25%);
.transition-transform(~"0.3s ease-out"); .transition-transform(~'0.3s ease-out');
}
&.in .modal-dialog {
.translate(0, 0);
} }
&.in .modal-dialog { .translate(0, 0) }
} }
.modal-open .modal { .modal-open .modal {
overflow-x: hidden; overflow-x: hidden;
@@ -54,7 +56,7 @@
border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc) border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)
border: 1px solid @modal-content-border-color; border: 1px solid @modal-content-border-color;
border-radius: @border-radius-large; border-radius: @border-radius-large;
.box-shadow(0 3px 9px rgba(0,0,0,.5)); .box-shadow(0 3px 9px rgba(0,0,0,0.5));
background-clip: padding-box; background-clip: padding-box;
// Remove focus outline from opened modal // Remove focus outline from opened modal
outline: 0; outline: 0;
@@ -70,8 +72,12 @@
z-index: @zindex-modal-background; z-index: @zindex-modal-background;
background-color: @modal-backdrop-bg; background-color: @modal-backdrop-bg;
// Fade for backdrop // Fade for backdrop
&.fade { .opacity(0); } &.fade {
&.in { .opacity(@modal-backdrop-opacity); } .opacity(0);
}
&.in {
.opacity(@modal-backdrop-opacity);
}
} }
// Modal header // Modal header
@@ -138,13 +144,17 @@
margin: 30px auto; margin: 30px auto;
} }
.modal-content { .modal-content {
.box-shadow(0 5px 15px rgba(0,0,0,.5)); .box-shadow(0 5px 15px rgba(0,0,0,0.5));
} }
// Modal sizes // Modal sizes
.modal-sm { width: @modal-sm; } .modal-sm {
width: @modal-sm;
}
} }
@media (min-width: @screen-md-min) { @media (min-width: @screen-md-min) {
.modal-lg { width: @modal-lg; } .modal-lg {
width: @modal-lg;
}
} }

View File

@@ -2,7 +2,6 @@
// Navbars // Navbars
// -------------------------------------------------- // --------------------------------------------------
// Wrapper and base class // Wrapper and base class
// //
// Provide a static navbar from which we expand to create full-width, fixed, and // Provide a static navbar from which we expand to create full-width, fixed, and
@@ -22,7 +21,6 @@
} }
} }
// Navbar heading // Navbar heading
// //
// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy // Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy
@@ -36,7 +34,6 @@
} }
} }
// Navbar collapse (body) // Navbar collapse (body)
// //
// Group your navbar content into this for easy collapsing and expanding across // Group your navbar content into this for easy collapsing and expanding across
@@ -50,9 +47,9 @@
.navbar-collapse { .navbar-collapse {
overflow-x: visible; overflow-x: visible;
padding-right: @navbar-padding-horizontal; padding-right: @navbar-padding-horizontal;
padding-left: @navbar-padding-horizontal; padding-left: @navbar-padding-horizontal;
border-top: 1px solid transparent; border-top: 1px solid transparent;
box-shadow: inset 0 1px 0 rgba(255,255,255,.1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);
&:extend(.clearfix all); &:extend(.clearfix all);
-webkit-overflow-scrolling: touch; -webkit-overflow-scrolling: touch;
@@ -98,7 +95,6 @@
} }
} }
// Both navbar header and collapse // Both navbar header and collapse
// //
// When a container is present, change the behavior of the header and collapse. // When a container is present, change the behavior of the header and collapse.
@@ -108,16 +104,15 @@
> .navbar-header, > .navbar-header,
> .navbar-collapse { > .navbar-collapse {
margin-right: -@navbar-padding-horizontal; margin-right: -@navbar-padding-horizontal;
margin-left: -@navbar-padding-horizontal; margin-left: -@navbar-padding-horizontal;
@media (min-width: @grid-float-breakpoint) { @media (min-width: @grid-float-breakpoint) {
margin-right: 0; margin-right: 0;
margin-left: 0; margin-left: 0;
} }
} }
} }
// //
// Navbar alignment options // Navbar alignment options
// //
@@ -157,7 +152,6 @@
border-width: 1px 0 0; border-width: 1px 0 0;
} }
// Brand/project name // Brand/project name
.navbar-brand { .navbar-brand {
@@ -184,7 +178,6 @@
} }
} }
// Navbar toggle // Navbar toggle
// //
// Custom button for toggling the `.navbar-collapse`, powered by the collapse // Custom button for toggling the `.navbar-collapse`, powered by the collapse
@@ -223,7 +216,6 @@
} }
} }
// Navbar nav links // Navbar nav links
// //
// Builds on top of the `.nav` components with its own modifier class to make // Builds on top of the `.nav` components with its own modifier class to make
@@ -233,7 +225,7 @@
margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal; margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;
> li > a { > li > a {
padding-top: 10px; padding-top: 10px;
padding-bottom: 10px; padding-bottom: 10px;
line-height: @line-height-computed; line-height: @line-height-computed;
} }
@@ -270,14 +262,13 @@
> li { > li {
float: left; float: left;
> a { > a {
padding-top: @navbar-padding-vertical; padding-top: @navbar-padding-vertical;
padding-bottom: @navbar-padding-vertical; padding-bottom: @navbar-padding-vertical;
} }
} }
} }
} }
// Navbar form // Navbar form
// //
// Extension of the `.form-inline` with some extra flavor for optimum display in // Extension of the `.form-inline` with some extra flavor for optimum display in
@@ -289,7 +280,7 @@
padding: 10px @navbar-padding-horizontal; padding: 10px @navbar-padding-horizontal;
border-top: 1px solid transparent; border-top: 1px solid transparent;
border-bottom: 1px solid transparent; border-bottom: 1px solid transparent;
@shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); @shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);
.box-shadow(@shadow); .box-shadow(@shadow);
// Mixin behavior for optimum display // Mixin behavior for optimum display
@@ -320,7 +311,6 @@
} }
} }
// Dropdown menus // Dropdown menus
// Menu position and menu carets // Menu position and menu carets
@@ -335,7 +325,6 @@
.border-bottom-radius(0); .border-bottom-radius(0);
} }
// Buttons in navbars // Buttons in navbars
// //
// Vertically center a button within a navbar (when *not* in a form). // Vertically center a button within a navbar (when *not* in a form).
@@ -351,7 +340,6 @@
} }
} }
// Text in navbars // Text in navbars
// //
// Add a class to make any element properly align itself vertically within the navbars. // Add a class to make any element properly align itself vertically within the navbars.
@@ -366,7 +354,6 @@
} }
} }
// Component alignment // Component alignment
// //
// Repurpose the pull utilities as their own navbar utilities to avoid specificity // Repurpose the pull utilities as their own navbar utilities to avoid specificity
@@ -376,7 +363,9 @@
// Declared after the navbar components to ensure more specificity on the margins. // Declared after the navbar components to ensure more specificity on the margins.
@media (min-width: @grid-float-breakpoint) { @media (min-width: @grid-float-breakpoint) {
.navbar-left { .pull-left(); } .navbar-left {
.pull-left();
}
.navbar-right { .navbar-right {
.pull-right(); .pull-right();
margin-right: -@navbar-padding-horizontal; margin-right: -@navbar-padding-horizontal;
@@ -387,7 +376,6 @@
} }
} }
// Alternate navbars // Alternate navbars
// -------------------------------------------------- // --------------------------------------------------
@@ -496,7 +484,6 @@
} }
} }
// Links in navbars // Links in navbars
// //
// Add a class to ensure links outside the navbar nav are colored correctly. // Add a class to ensure links outside the navbar nav are colored correctly.

View File

@@ -2,7 +2,6 @@
// Navs // Navs
// -------------------------------------------------- // --------------------------------------------------
// Base class // Base class
// -------------------------------------------------- // --------------------------------------------------
@@ -68,7 +67,6 @@
} }
} }
// Tabs // Tabs
// ------------------------- // -------------------------
@@ -87,7 +85,8 @@
border: 1px solid transparent; border: 1px solid transparent;
border-radius: @border-radius-base @border-radius-base 0 0; border-radius: @border-radius-base @border-radius-base 0 0;
&:hover { &:hover {
border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color; border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color
@nav-tabs-border-color;
} }
} }
@@ -111,7 +110,6 @@
} }
} }
// Pills // Pills
// ------------------------- // -------------------------
.nav-pills { .nav-pills {
@@ -138,7 +136,6 @@
} }
} }
// Stacked pills // Stacked pills
.nav-stacked { .nav-stacked {
> li { > li {
@@ -150,7 +147,6 @@
} }
} }
// Nav variations // Nav variations
// -------------------------------------------------- // --------------------------------------------------
@@ -215,7 +211,6 @@
} }
} }
// Tabbable tabs // Tabbable tabs
// ------------------------- // -------------------------
@@ -229,7 +224,6 @@
} }
} }
// Dropdowns // Dropdowns
// ------------------------- // -------------------------

View File

@@ -331,8 +331,8 @@ input {
// 2. Remove excess padding in IE 8/9/10. // 2. Remove excess padding in IE 8/9/10.
// //
input[type="checkbox"], input[type='checkbox'],
input[type="radio"] { input[type='radio'] {
box-sizing: border-box; // 1 box-sizing: border-box; // 1
padding: 0; // 2 padding: 0; // 2
} }
@@ -343,8 +343,8 @@ input[type="radio"] {
// decrement button to change from `default` to `text`. // decrement button to change from `default` to `text`.
// //
input[type="number"]::-webkit-inner-spin-button, input[type='number']::-webkit-inner-spin-button,
input[type="number"]::-webkit-outer-spin-button { input[type='number']::-webkit-outer-spin-button {
height: auto; height: auto;
} }
@@ -353,7 +353,7 @@ input[type="number"]::-webkit-outer-spin-button {
// 2. Address `box-sizing` set to `border-box` in Safari and Chrome. // 2. Address `box-sizing` set to `border-box` in Safari and Chrome.
// //
input[type="search"] { input[type='search'] {
-webkit-appearance: textfield; // 1 -webkit-appearance: textfield; // 1
box-sizing: content-box; //2 box-sizing: content-box; //2
} }
@@ -364,8 +364,8 @@ input[type="search"] {
// padding (and `textfield` appearance). // padding (and `textfield` appearance).
// //
input[type="search"]::-webkit-search-cancel-button, input[type='search']::-webkit-search-cancel-button,
input[type="search"]::-webkit-search-decoration { input[type='search']::-webkit-search-decoration {
-webkit-appearance: none; -webkit-appearance: none;
} }

View File

@@ -2,7 +2,6 @@
// Pager pagination // Pager pagination
// -------------------------------------------------- // --------------------------------------------------
.pager { .pager {
padding-left: 0; padding-left: 0;
margin: @line-height-computed 0; margin: @line-height-computed 0;

View File

@@ -2,14 +2,13 @@
// Panels // Panels
// -------------------------------------------------- // --------------------------------------------------
// Base class // Base class
.panel { .panel {
margin-bottom: @line-height-computed; margin-bottom: @line-height-computed;
background-color: @panel-bg; background-color: @panel-bg;
border: 1px solid transparent; border: 1px solid transparent;
border-radius: @panel-border-radius; border-radius: @panel-border-radius;
.box-shadow(0 1px 1px rgba(0,0,0,.05)); .box-shadow(0 1px 1px rgba(0,0,0,0.05));
} }
// Panel contents // Panel contents
@@ -53,7 +52,6 @@
.border-bottom-radius((@panel-border-radius - 1)); .border-bottom-radius((@panel-border-radius - 1));
} }
// List groups in panels // List groups in panels
// //
// By default, space out list group content from panel headings to account for // By default, space out list group content from panel headings to account for
@@ -213,8 +211,7 @@
} }
} }
// Collapsible panels (aka, accordion)
// Collapsable panels (aka, accordion)
// //
// Wrap a series of panels in `.panel-group` to turn them into an accordion with // Wrap a series of panels in `.panel-group` to turn them into an accordion with
// the help of our collapse JavaScript plugin. // the help of our collapse JavaScript plugin.
@@ -249,7 +246,6 @@
} }
} }
// Contextual variations // Contextual variations
.panel-default { .panel-default {
.panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border); .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);

View File

@@ -2,7 +2,6 @@
// Popovers // Popovers
// -------------------------------------------------- // --------------------------------------------------
.popover { .popover {
position: absolute; position: absolute;
top: 0; top: 0;
@@ -21,13 +20,21 @@
border: 1px solid @popover-fallback-border-color; border: 1px solid @popover-fallback-border-color;
border: 1px solid @popover-border-color; border: 1px solid @popover-border-color;
border-radius: @border-radius-large; border-radius: @border-radius-large;
.box-shadow(0 5px 10px rgba(0,0,0,.2)); .box-shadow(0 5px 10px rgba(0,0,0,0.2));
// Offset the popover to account for the popover arrow // Offset the popover to account for the popover arrow
&.top { margin-top: -@popover-arrow-width; } &.top {
&.right { margin-left: @popover-arrow-width; } margin-top: -@popover-arrow-width;
&.bottom { margin-top: @popover-arrow-width; } }
&.left { margin-left: -@popover-arrow-width; } &.right {
margin-left: @popover-arrow-width;
}
&.bottom {
margin-top: @popover-arrow-width;
}
&.left {
margin-left: -@popover-arrow-width;
}
} }
.popover-title { .popover-title {
@@ -63,7 +70,7 @@
} }
.popover > .arrow:after { .popover > .arrow:after {
border-width: @popover-arrow-width; border-width: @popover-arrow-width;
content: ""; content: '';
} }
.popover { .popover {
@@ -75,7 +82,7 @@
border-top-color: @popover-arrow-outer-color; border-top-color: @popover-arrow-outer-color;
bottom: -@popover-arrow-outer-width; bottom: -@popover-arrow-outer-width;
&:after { &:after {
content: " "; content: ' ';
bottom: 1px; bottom: 1px;
margin-left: -@popover-arrow-width; margin-left: -@popover-arrow-width;
border-bottom-width: 0; border-bottom-width: 0;
@@ -90,7 +97,7 @@
border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback
border-right-color: @popover-arrow-outer-color; border-right-color: @popover-arrow-outer-color;
&:after { &:after {
content: " "; content: ' ';
left: 1px; left: 1px;
bottom: -@popover-arrow-width; bottom: -@popover-arrow-width;
border-left-width: 0; border-left-width: 0;
@@ -105,7 +112,7 @@
border-bottom-color: @popover-arrow-outer-color; border-bottom-color: @popover-arrow-outer-color;
top: -@popover-arrow-outer-width; top: -@popover-arrow-outer-width;
&:after { &:after {
content: " "; content: ' ';
top: 1px; top: 1px;
margin-left: -@popover-arrow-width; margin-left: -@popover-arrow-width;
border-top-width: 0; border-top-width: 0;
@@ -121,7 +128,7 @@
border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback
border-left-color: @popover-arrow-outer-color; border-left-color: @popover-arrow-outer-color;
&:after { &:after {
content: " "; content: ' ';
right: 1px; right: 1px;
border-right-width: 0; border-right-width: 0;
border-left-color: @popover-arrow-color; border-left-color: @popover-arrow-color;

View File

@@ -6,96 +6,96 @@
// ========================================================================== // ==========================================================================
@media print { @media print {
*, *,
*:before, *:before,
*:after { *:after {
background: transparent !important; background: transparent !important;
color: #000 !important; // Black prints faster: h5bp.com/s color: #000 !important; // Black prints faster: h5bp.com/s
box-shadow: none !important; box-shadow: none !important;
text-shadow: none !important; text-shadow: none !important;
} }
a, a,
a:visited { a:visited {
text-decoration: underline; text-decoration: underline;
} }
a[href]:after { a[href]:after {
content: " (" attr(href) ")"; content: ' (' attr(href) ')';
} }
abbr[title]:after { abbr[title]:after {
content: " (" attr(title) ")"; content: ' (' attr(title) ')';
} }
// Don't show links that are fragment identifiers, // Don't show links that are fragment identifiers,
// or use the `javascript:` pseudo protocol // or use the `javascript:` pseudo protocol
a[href^="#"]:after, a[href^='#']:after,
a[href^="javascript:"]:after { a[href^='javascript:']:after {
content: ""; content: '';
} }
pre, pre,
blockquote { blockquote {
border: 1px solid #999; border: 1px solid #999;
page-break-inside: avoid; page-break-inside: avoid;
} }
thead { thead {
display: table-header-group; // h5bp.com/t display: table-header-group; // h5bp.com/t
} }
tr, tr,
img { img {
page-break-inside: avoid; page-break-inside: avoid;
} }
img { img {
max-width: 100% !important; max-width: 100% !important;
} }
p, p,
h2, h2,
h3 { h3 {
orphans: 3; orphans: 3;
widows: 3; widows: 3;
} }
h2, h2,
h3 { h3 {
page-break-after: avoid; page-break-after: avoid;
} }
// Bootstrap specific changes start // Bootstrap specific changes start
// Bootstrap components // Bootstrap components
.navbar { .navbar {
display: none; display: none;
} }
.btn, .btn,
.dropup > .btn { .dropup > .btn {
> .caret { > .caret {
border-top-color: #000 !important; border-top-color: #000 !important;
}
}
.label {
border: 1px solid #000;
} }
}
.label {
border: 1px solid #000;
}
.table { .table {
border-collapse: collapse !important; border-collapse: collapse !important;
td, td,
th { th {
background-color: #fff !important; background-color: #fff !important;
}
} }
.table-bordered { }
th, .table-bordered {
td { th,
border: 1px solid #ddd !important; td {
} border: 1px solid #ddd !important;
} }
}
// Bootstrap specific changes end // Bootstrap specific changes end
} }

View File

@@ -2,23 +2,29 @@
// Progress bars // Progress bars
// -------------------------------------------------- // --------------------------------------------------
// Bar animations // Bar animations
// ------------------------- // -------------------------
// WebKit // WebKit
@-webkit-keyframes progress-bar-stripes { @-webkit-keyframes progress-bar-stripes {
from { background-position: 40px 0; } from {
to { background-position: 0 0; } background-position: 40px 0;
}
to {
background-position: 0 0;
}
} }
// Spec and IE10+ // Spec and IE10+
@keyframes progress-bar-stripes { @keyframes progress-bar-stripes {
from { background-position: 40px 0; } from {
to { background-position: 0 0; } background-position: 40px 0;
}
to {
background-position: 0 0;
}
} }
// Bar itself // Bar itself
// ------------------------- // -------------------------
@@ -29,7 +35,7 @@
margin-bottom: @line-height-computed; margin-bottom: @line-height-computed;
background-color: @progress-bg; background-color: @progress-bg;
border-radius: @progress-border-radius; border-radius: @progress-border-radius;
.box-shadow(inset 0 1px 2px rgba(0,0,0,.1)); .box-shadow(inset 0 1px 2px rgba(0,0,0,0.1));
} }
// Bar of progress // Bar of progress
@@ -42,8 +48,8 @@
color: @progress-bar-color; color: @progress-bar-color;
text-align: center; text-align: center;
background-color: @progress-bar-bg; background-color: @progress-bar-bg;
.box-shadow(inset 0 -1px 0 rgba(0,0,0,.15)); .box-shadow(inset 0 -1px 0 rgba(0,0,0,0.15));
.transition(width .6s ease); .transition(width 0.6s ease);
} }
// Striped bars // Striped bars
@@ -66,7 +72,6 @@
.animation(progress-bar-stripes 2s linear infinite); .animation(progress-bar-stripes 2s linear infinite);
} }
// Variations // Variations
// ------------------------- // -------------------------

View File

@@ -2,7 +2,6 @@
// Responsive: Utility classes // Responsive: Utility classes
// -------------------------------------------------- // --------------------------------------------------
// IE10 in Windows (Phone) 8 // IE10 in Windows (Phone) 8
// //
// Support for responsive views via media queries is kind of borked in IE10, for // Support for responsive views via media queries is kind of borked in IE10, for
@@ -22,7 +21,6 @@
width: device-width; width: device-width;
} }
// Visibility utilities // Visibility utilities
// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0 // Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0
.visible-xs, .visible-xs,
@@ -152,7 +150,6 @@
} }
} }
// Print utilities // Print utilities
// //
// Media queries are placed on the inside to be mixin-friendly. // Media queries are placed on the inside to be mixin-friendly.

View File

@@ -2,7 +2,6 @@
// Scaffolding // Scaffolding
// -------------------------------------------------- // --------------------------------------------------
// Reset the box-sizing // Reset the box-sizing
// //
// Heads up! This reset may cause conflicts with some third-party widgets. // Heads up! This reset may cause conflicts with some third-party widgets.
@@ -16,12 +15,11 @@
.box-sizing(border-box); .box-sizing(border-box);
} }
// Body reset // Body reset
html { html {
font-size: 10px; font-size: 10px;
-webkit-tap-highlight-color: rgba(0,0,0,0); -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
} }
body { body {
@@ -42,7 +40,6 @@ textarea {
line-height: inherit; line-height: inherit;
} }
// Links // Links
a { a {
@@ -60,7 +57,6 @@ a {
} }
} }
// Figures // Figures
// //
// We reset this here because previously Normalize had no `figure` margins. This // We reset this here because previously Normalize had no `figure` margins. This
@@ -70,7 +66,6 @@ figure {
margin: 0; margin: 0;
} }
// Images // Images
img { img {
@@ -96,7 +91,7 @@ img {
background-color: @thumbnail-bg; background-color: @thumbnail-bg;
border: 1px solid @thumbnail-border; border: 1px solid @thumbnail-border;
border-radius: @thumbnail-border-radius; border-radius: @thumbnail-border-radius;
.transition(all .2s ease-in-out); .transition(all 0.2s ease-in-out);
// Keep them at most 100% wide // Keep them at most 100% wide
.img-responsive(inline-block); .img-responsive(inline-block);
@@ -107,20 +102,18 @@ img {
border-radius: 50%; // set radius in percents border-radius: 50%; // set radius in percents
} }
// Horizontal rules // Horizontal rules
hr { hr {
margin-top: @line-height-computed; margin-top: @line-height-computed;
margin-bottom: @line-height-computed; margin-bottom: @line-height-computed;
border: 0; border: 0;
border-top: 1px solid @hr-border; border-top: 1px solid @hr-border;
} }
// Only display content to screen readers // Only display content to screen readers
// //
// See: http://a11yproject.com/posts/how-to-hide-content/ // See: http://a11yproject.com/posts/how-to-hide-content
.sr-only { .sr-only {
position: absolute; position: absolute;
@@ -129,7 +122,7 @@ hr {
margin: -1px; margin: -1px;
padding: 0; padding: 0;
overflow: hidden; overflow: hidden;
clip: rect(0,0,0,0); clip: rect(0, 0, 0, 0);
border: 0; border: 0;
} }
@@ -149,13 +142,12 @@ hr {
} }
} }
// iOS "clickable elements" fix for role="button" // iOS "clickable elements" fix for role="button"
// //
// Fixes "clickability" issue (and more generally, the firing of events such as focus as well) // Fixes "clickability" issue (and more generally, the firing of events such as focus as well)
// for traditionally non-focusable elements with role="button" // for traditionally non-focusable elements with role="button"
// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile // see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
[role="button"] { [role='button'] {
cursor: pointer; cursor: pointer;
} }

View File

@@ -2,7 +2,6 @@
// Tables // Tables
// -------------------------------------------------- // --------------------------------------------------
table { table {
background-color: @table-bg; background-color: @table-bg;
} }
@@ -16,7 +15,6 @@ th {
text-align: left; text-align: left;
} }
// Baseline styles // Baseline styles
.table { .table {
@@ -64,7 +62,6 @@ th {
} }
} }
// Condensed table w/ half padding // Condensed table w/ half padding
.table-condensed { .table-condensed {
@@ -80,7 +77,6 @@ th {
} }
} }
// Bordered version // Bordered version
// //
// Add borders all around the table and between all the columns. // Add borders all around the table and between all the columns.
@@ -105,7 +101,6 @@ th {
} }
} }
// Zebra-striping // Zebra-striping
// //
// Default zebra-stripe styles (alternating gray and transparent backgrounds) // Default zebra-stripe styles (alternating gray and transparent backgrounds)
@@ -116,7 +111,6 @@ th {
} }
} }
// Hover effect // Hover effect
// //
// Placed here since it has to come after the potential zebra striping // Placed here since it has to come after the potential zebra striping
@@ -127,12 +121,11 @@ th {
} }
} }
// Table cell sizing // Table cell sizing
// //
// Reset default table behavior // Reset default table behavior
table col[class*="col-"] { table col[class*='col-'] {
position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623) position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)
float: none; float: none;
display: table-column; display: table-column;
@@ -140,7 +133,7 @@ table col[class*="col-"] {
table { table {
td, td,
th { th {
&[class*="col-"] { &[class*='col-'] {
position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623) position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)
float: none; float: none;
display: table-cell; display: table-cell;
@@ -148,7 +141,6 @@ table {
} }
} }
// Table backgrounds // Table backgrounds
// //
// Exact selectors below required to override `.table-striped` and prevent // Exact selectors below required to override `.table-striped` and prevent
@@ -161,7 +153,6 @@ table {
.table-row-variant(warning; @state-warning-bg); .table-row-variant(warning; @state-warning-bg);
.table-row-variant(danger; @state-danger-bg); .table-row-variant(danger; @state-danger-bg);
// Responsive tables // Responsive tables
// //
// Wrap your tables in `.table-responsive` and we'll make them mobile friendly // Wrap your tables in `.table-responsive` and we'll make them mobile friendly
@@ -228,7 +219,6 @@ table {
} }
} }
} }
} }
} }
} }

View File

@@ -1,6 +1,6 @@
/*! /*!
* Bootstrap v3.3.6 (http://getbootstrap.com) * Bootstrap v3.3.7 (http://getbootstrap.com)
* Copyright 2011-2015 Twitter, Inc. * Copyright 2011-2016 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
*/ */
@@ -8,9 +8,8 @@
// Load core variables and mixins // Load core variables and mixins
// -------------------------------------------------- // --------------------------------------------------
@import "variables.less"; @import 'variables.less';
@import "mixins.less"; @import 'mixins.less';
// //
// Buttons // Buttons
@@ -23,14 +22,14 @@
.btn-info, .btn-info,
.btn-warning, .btn-warning,
.btn-danger { .btn-danger {
text-shadow: 0 -1px 0 rgba(0,0,0,.2); text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
@shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075); @shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);
.box-shadow(@shadow); .box-shadow(@shadow);
// Reset the shadow // Reset the shadow
&:active, &:active,
&.active { &.active {
.box-shadow(inset 0 3px 5px rgba(0,0,0,.125)); .box-shadow(inset 0 3px 5px rgba(0,0,0,0.125));
} }
&.disabled, &.disabled,
@@ -46,13 +45,13 @@
// Mixin for generating new styles // Mixin for generating new styles
.btn-styles(@btn-color: #555) { .btn-styles(@btn-color: #555) {
#gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%)); #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));;
.reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620 .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620
background-repeat: repeat-x; background-repeat: repeat-x;
border-color: darken(@btn-color, 14%); border-color: darken(@btn-color, 14%);
&:hover, &:hover,
&:focus { &:focus {
background-color: darken(@btn-color, 12%); background-color: darken(@btn-color, 12%);
background-position: 0 -15px; background-position: 0 -15px;
} }
@@ -88,13 +87,26 @@
} }
// Apply the mixin to the buttons // Apply the mixin to the buttons
.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; } .btn-default {
.btn-primary { .btn-styles(@btn-primary-bg); } .btn-styles(@btn-default-bg);
.btn-success { .btn-styles(@btn-success-bg); } text-shadow: 0 1px 0 #fff;
.btn-info { .btn-styles(@btn-info-bg); } border-color: #ccc;
.btn-warning { .btn-styles(@btn-warning-bg); } }
.btn-danger { .btn-styles(@btn-danger-bg); } .btn-primary {
.btn-styles(@btn-primary-bg);
}
.btn-success {
.btn-styles(@btn-success-bg);
}
.btn-info {
.btn-styles(@btn-info-bg);
}
.btn-warning {
.btn-styles(@btn-warning-bg);
}
.btn-danger {
.btn-styles(@btn-danger-bg);
}
// //
// Images // Images
@@ -102,64 +114,62 @@
.thumbnail, .thumbnail,
.img-thumbnail { .img-thumbnail {
.box-shadow(0 1px 2px rgba(0,0,0,.075)); .box-shadow(0 1px 2px rgba(0,0,0,0.075));
} }
// //
// Dropdowns // Dropdowns
// -------------------------------------------------- // --------------------------------------------------
.dropdown-menu > li > a:hover, .dropdown-menu > li > a:hover,
.dropdown-menu > li > a:focus { .dropdown-menu > li > a:focus {
#gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%)); #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));;
background-color: darken(@dropdown-link-hover-bg, 5%); background-color: darken(@dropdown-link-hover-bg, 5%);
} }
.dropdown-menu > .active > a, .dropdown-menu > .active > a,
.dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:hover,
.dropdown-menu > .active > a:focus { .dropdown-menu > .active > a:focus {
#gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%)); #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));;
background-color: darken(@dropdown-link-active-bg, 5%); background-color: darken(@dropdown-link-active-bg, 5%);
} }
// //
// Navbar // Navbar
// -------------------------------------------------- // --------------------------------------------------
// Default navbar // Default navbar
.navbar-default { .navbar-default {
#gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg); #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);;
.reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered
border-radius: @navbar-border-radius; border-radius: @navbar-border-radius;
@shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075); @shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);
.box-shadow(@shadow); .box-shadow(@shadow);
.navbar-nav > .open > a, .navbar-nav > .open > a,
.navbar-nav > .active > a { .navbar-nav > .active > a {
#gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%)); #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));;
.box-shadow(inset 0 3px 9px rgba(0,0,0,.075)); .box-shadow(inset 0 3px 9px rgba(0,0,0,0.075));
} }
} }
.navbar-brand, .navbar-brand,
.navbar-nav > li > a { .navbar-nav > li > a {
text-shadow: 0 1px 0 rgba(255,255,255,.25); text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);
} }
// Inverted navbar // Inverted navbar
.navbar-inverse { .navbar-inverse {
#gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg); #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);;
.reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257 .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257
border-radius: @navbar-border-radius; border-radius: @navbar-border-radius;
.navbar-nav > .open > a, .navbar-nav > .open > a,
.navbar-nav > .active > a { .navbar-nav > .active > a {
#gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%)); #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));;
.box-shadow(inset 0 3px 9px rgba(0,0,0,.25)); .box-shadow(inset 0 3px 9px rgba(0,0,0,0.25));
} }
.navbar-brand, .navbar-brand,
.navbar-nav > li > a { .navbar-nav > li > a {
text-shadow: 0 -1px 0 rgba(0,0,0,.25); text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
} }
} }
@@ -177,35 +187,41 @@
&:hover, &:hover,
&:focus { &:focus {
color: #fff; color: #fff;
#gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%)); #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));;
} }
} }
} }
// //
// Alerts // Alerts
// -------------------------------------------------- // --------------------------------------------------
// Common styles // Common styles
.alert { .alert {
text-shadow: 0 1px 0 rgba(255,255,255,.2); text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);
@shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05); @shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
.box-shadow(@shadow); .box-shadow(@shadow);
} }
// Mixin for generating new styles // Mixin for generating new styles
.alert-styles(@color) { .alert-styles(@color) {
#gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%)); #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));;
border-color: darken(@color, 15%); border-color: darken(@color, 15%);
} }
// Apply the mixin to the alerts // Apply the mixin to the alerts
.alert-success { .alert-styles(@alert-success-bg); } .alert-success {
.alert-info { .alert-styles(@alert-info-bg); } .alert-styles(@alert-success-bg);
.alert-warning { .alert-styles(@alert-warning-bg); } }
.alert-danger { .alert-styles(@alert-danger-bg); } .alert-info {
.alert-styles(@alert-info-bg);
}
.alert-warning {
.alert-styles(@alert-warning-bg);
}
.alert-danger {
.alert-styles(@alert-danger-bg);
}
// //
// Progress bars // Progress bars
@@ -213,20 +229,30 @@
// Give the progress background some depth // Give the progress background some depth
.progress { .progress {
#gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg) #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg);;
} }
// Mixin for generating new styles // Mixin for generating new styles
.progress-bar-styles(@color) { .progress-bar-styles(@color) {
#gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%)); #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));;
} }
// Apply the mixin to the progress bars // Apply the mixin to the progress bars
.progress-bar { .progress-bar-styles(@progress-bar-bg); } .progress-bar {
.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); } .progress-bar-styles(@progress-bar-bg);
.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); } }
.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); } .progress-bar-success {
.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); } .progress-bar-styles(@progress-bar-success-bg);
}
.progress-bar-info {
.progress-bar-styles(@progress-bar-info-bg);
}
.progress-bar-warning {
.progress-bar-styles(@progress-bar-warning-bg);
}
.progress-bar-danger {
.progress-bar-styles(@progress-bar-danger-bg);
}
// Reset the striped class because our mixins don't do multiple gradients and // Reset the striped class because our mixins don't do multiple gradients and
// the above custom styles override the new `.progress-bar-striped` in v3.2.0. // the above custom styles override the new `.progress-bar-striped` in v3.2.0.
@@ -234,20 +260,19 @@
#gradient > .striped(); #gradient > .striped();
} }
// //
// List groups // List groups
// -------------------------------------------------- // --------------------------------------------------
.list-group { .list-group {
border-radius: @border-radius-base; border-radius: @border-radius-base;
.box-shadow(0 1px 2px rgba(0,0,0,.075)); .box-shadow(0 1px 2px rgba(0,0,0,0.075));
} }
.list-group-item.active, .list-group-item.active,
.list-group-item.active:hover, .list-group-item.active:hover,
.list-group-item.active:focus { .list-group-item.active:focus {
text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%); text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);
#gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%)); #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));;
border-color: darken(@list-group-active-border, 7.5%); border-color: darken(@list-group-active-border, 7.5%);
.badge { .badge {
@@ -255,37 +280,47 @@
} }
} }
// //
// Panels // Panels
// -------------------------------------------------- // --------------------------------------------------
// Common styles // Common styles
.panel { .panel {
.box-shadow(0 1px 2px rgba(0,0,0,.05)); .box-shadow(0 1px 2px rgba(0,0,0,0.05));
} }
// Mixin for generating new styles // Mixin for generating new styles
.panel-heading-styles(@color) { .panel-heading-styles(@color) {
#gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%)); #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));;
} }
// Apply the mixin to the panel headings only // Apply the mixin to the panel headings only
.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); } .panel-default > .panel-heading {
.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); } .panel-heading-styles(@panel-default-heading-bg);
.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); } }
.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); } .panel-primary > .panel-heading {
.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); } .panel-heading-styles(@panel-primary-heading-bg);
.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); } }
.panel-success > .panel-heading {
.panel-heading-styles(@panel-success-heading-bg);
}
.panel-info > .panel-heading {
.panel-heading-styles(@panel-info-heading-bg);
}
.panel-warning > .panel-heading {
.panel-heading-styles(@panel-warning-heading-bg);
}
.panel-danger > .panel-heading {
.panel-heading-styles(@panel-danger-heading-bg);
}
// //
// Wells // Wells
// -------------------------------------------------- // --------------------------------------------------
.well { .well {
#gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg); #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);;
border-color: darken(@well-bg, 10%); border-color: darken(@well-bg, 10%);
@shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1); @shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);
.box-shadow(@shadow); .box-shadow(@shadow);
} }

View File

@@ -2,7 +2,6 @@
// Thumbnails // Thumbnails
// -------------------------------------------------- // --------------------------------------------------
// Mixin and adjust the regular image class // Mixin and adjust the regular image class
.thumbnail { .thumbnail {
display: block; display: block;
@@ -12,7 +11,7 @@
background-color: @thumbnail-bg; background-color: @thumbnail-bg;
border: 1px solid @thumbnail-border; border: 1px solid @thumbnail-border;
border-radius: @thumbnail-border-radius; border-radius: @thumbnail-border-radius;
.transition(border .2s ease-in-out); .transition(border 0.2s ease-in-out);
> img, > img,
a > img { a > img {

View File

@@ -2,7 +2,6 @@
// Tooltips // Tooltips
// -------------------------------------------------- // --------------------------------------------------
// Base class // Base class
.tooltip { .tooltip {
position: absolute; position: absolute;
@@ -15,11 +14,25 @@
.opacity(0); .opacity(0);
&.in { .opacity(@tooltip-opacity); } &.in {
&.top { margin-top: -3px; padding: @tooltip-arrow-width 0; } .opacity(@tooltip-opacity);
&.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; } }
&.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; } &.top {
&.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; } margin-top: -3px;
padding: @tooltip-arrow-width 0;
}
&.right {
margin-left: 3px;
padding: 0 @tooltip-arrow-width;
}
&.bottom {
margin-top: 3px;
padding: @tooltip-arrow-width 0;
}
&.left {
margin-left: -3px;
padding: 0 @tooltip-arrow-width;
}
} }
// Wrapper for the tooltip content // Wrapper for the tooltip content

View File

@@ -2,12 +2,21 @@
// Typography // Typography
// -------------------------------------------------- // --------------------------------------------------
// Headings // Headings
// ------------------------- // -------------------------
h1, h2, h3, h4, h5, h6, h1,
.h1, .h2, .h3, .h4, .h5, .h6 { h2,
h3,
h4,
h5,
h6,
.h1,
.h2,
.h3,
.h4,
.h5,
.h6 {
font-family: @headings-font-family; font-family: @headings-font-family;
font-weight: @headings-font-weight; font-weight: @headings-font-weight;
line-height: @headings-line-height; line-height: @headings-line-height;
@@ -21,9 +30,12 @@ h1, h2, h3, h4, h5, h6,
} }
} }
h1, .h1, h1,
h2, .h2, .h1,
h3, .h3 { h2,
.h2,
h3,
.h3 {
margin-top: @line-height-computed; margin-top: @line-height-computed;
margin-bottom: (@line-height-computed / 2); margin-bottom: (@line-height-computed / 2);
@@ -32,9 +44,12 @@ h3, .h3 {
font-size: 65%; font-size: 65%;
} }
} }
h4, .h4, h4,
h5, .h5, .h4,
h6, .h6 { h5,
.h5,
h6,
.h6 {
margin-top: (@line-height-computed / 2); margin-top: (@line-height-computed / 2);
margin-bottom: (@line-height-computed / 2); margin-bottom: (@line-height-computed / 2);
@@ -44,13 +59,30 @@ h6, .h6 {
} }
} }
h1, .h1 { font-size: @font-size-h1; } h1,
h2, .h2 { font-size: @font-size-h2; } .h1 {
h3, .h3 { font-size: @font-size-h3; } font-size: @font-size-h1;
h4, .h4 { font-size: @font-size-h4; } }
h5, .h5 { font-size: @font-size-h5; } h2,
h6, .h6 { font-size: @font-size-h6; } .h2 {
font-size: @font-size-h2;
}
h3,
.h3 {
font-size: @font-size-h3;
}
h4,
.h4 {
font-size: @font-size-h4;
}
h5,
.h5 {
font-size: @font-size-h5;
}
h6,
.h6 {
font-size: @font-size-h6;
}
// Body text // Body text
// ------------------------- // -------------------------
@@ -70,7 +102,6 @@ p {
} }
} }
// Emphasis & misc // Emphasis & misc
// ------------------------- // -------------------------
@@ -83,20 +114,36 @@ small,
mark, mark,
.mark { .mark {
background-color: @state-warning-bg; background-color: @state-warning-bg;
padding: .2em; padding: 0.2em;
} }
// Alignment // Alignment
.text-left { text-align: left; } .text-left {
.text-right { text-align: right; } text-align: left;
.text-center { text-align: center; } }
.text-justify { text-align: justify; } .text-right {
.text-nowrap { white-space: nowrap; } text-align: right;
}
.text-center {
text-align: center;
}
.text-justify {
text-align: justify;
}
.text-nowrap {
white-space: nowrap;
}
// Transformation // Transformation
.text-lowercase { text-transform: lowercase; } .text-lowercase {
.text-uppercase { text-transform: uppercase; } text-transform: lowercase;
.text-capitalize { text-transform: capitalize; } }
.text-uppercase {
text-transform: uppercase;
}
.text-capitalize {
text-transform: capitalize;
}
// Contextual colors // Contextual colors
.text-muted { .text-muted {
@@ -140,7 +187,6 @@ mark,
.bg-variant(@state-danger-bg); .bg-variant(@state-danger-bg);
} }
// Page header // Page header
// ------------------------- // -------------------------
@@ -150,7 +196,6 @@ mark,
border-bottom: 1px solid @page-header-border-color; border-bottom: 1px solid @page-header-border-color;
} }
// Lists // Lists
// ------------------------- // -------------------------
@@ -225,7 +270,6 @@ dd {
} }
} }
// Misc // Misc
// ------------------------- // -------------------------
@@ -287,7 +331,9 @@ blockquote.pull-right {
footer, footer,
small, small,
.small { .small {
&:before { content: ''; } &:before {
content: '';
}
&:after { &:after {
content: '\00A0 \2014'; // nbsp, em dash content: '\00A0 \2014'; // nbsp, em dash
} }

View File

@@ -2,7 +2,6 @@
// Utility classes // Utility classes
// -------------------------------------------------- // --------------------------------------------------
// Floats // Floats
// ------------------------- // -------------------------
@@ -19,7 +18,6 @@
float: left !important; float: left !important;
} }
// Toggling content // Toggling content
// ------------------------- // -------------------------
@@ -37,7 +35,6 @@
.text-hide(); .text-hide();
} }
// Hide from screenreaders and browsers // Hide from screenreaders and browsers
// //
// Credit: HTML5 Boilerplate // Credit: HTML5 Boilerplate
@@ -46,7 +43,6 @@
display: none !important; display: none !important;
} }
// For Affix plugin // For Affix plugin
// ------------------------- // -------------------------

File diff suppressed because it is too large Load Diff

View File

@@ -2,7 +2,6 @@
// Wells // Wells
// -------------------------------------------------- // --------------------------------------------------
// Base class // Base class
.well { .well {
min-height: 20px; min-height: 20px;
@@ -11,10 +10,10 @@
background-color: @well-bg; background-color: @well-bg;
border: 1px solid @well-border; border: 1px solid @well-border;
border-radius: @border-radius-base; border-radius: @border-radius-base;
.box-shadow(inset 0 1px 1px rgba(0,0,0,.05)); .box-shadow(inset 0 1px 1px rgba(0,0,0,0.05));
blockquote { blockquote {
border-color: #ddd; border-color: #ddd;
border-color: rgba(0,0,0,.15); border-color: rgba(0, 0, 0, 0.15);
} }
} }

View File

@@ -2,13 +2,13 @@
// Bootswatch // Bootswatch
// ----------------------------------------------------- // -----------------------------------------------------
@import url("http://fonts.googleapis.com/css?family=Roboto:300,400,500,700"); @import url('http://fonts.googleapis.com/css?family=Roboto:300,400,500,700');
// Navbar ===================================================================== // Navbar =====================================================================
.navbar { .navbar {
border: none; border: none;
.box-shadow(0 1px 2px rgba(0,0,0,.3)); .box-shadow(0 1px 2px rgba(0,0,0,0.3));
&-brand { &-brand {
font-size: 24px; font-size: 24px;
@@ -19,7 +19,7 @@
color: #fff; color: #fff;
.placeholder(@navbar-inverse-link-color); .placeholder(@navbar-inverse-link-color);
&[type=text] { &[type='text'] {
.box-shadow(inset 0 -1px 0 @navbar-inverse-link-color); .box-shadow(inset 0 -1px 0 @navbar-inverse-link-color);
&:focus { &:focus {
@@ -49,9 +49,9 @@
&:active { &:active {
background-color: darken(@bg, 6%); background-color: darken(@bg, 6%);
#gradient > .radial(darken(@bg, 6%) 10%, @bg 11%); #gradient > .radial(darken(@bg, 6%) 10%, @bg 11%);;
background-size: 1000%; background-size: 1000%;
.box-shadow(2px 2px 2px rgba(0,0,0,.3)); .box-shadow(2px 2px 2px rgba(0,0,0,0.3));
} }
} }
} }
@@ -67,7 +67,7 @@
text-transform: uppercase; text-transform: uppercase;
border-right: none; border-right: none;
border-bottom: none; border-bottom: none;
.box-shadow(1px 1px 2px rgba(0,0,0,.3)); .box-shadow(1px 1px 2px rgba(0,0,0,0.3));
.transition(all 0.2s); .transition(all 0.2s);
&-link { &-link {
@@ -107,7 +107,7 @@
body { body {
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
letter-spacing: .1px; letter-spacing: 0.1px;
text-rendering: optimizeLegibility; text-rendering: optimizeLegibility;
} }
@@ -118,7 +118,7 @@ p {
input, input,
button { button {
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
letter-spacing: .1px; letter-spacing: 0.1px;
text-rendering: optimizeLegibility; text-rendering: optimizeLegibility;
} }
@@ -137,14 +137,14 @@ label {
textarea, textarea,
textarea.form-control, textarea.form-control,
input.form-control, input.form-control,
input[type=text], input[type='text'],
input[type=password], input[type='password'],
input[type=email], input[type='email'],
input[type=number], input[type='number'],
[type=text].form-control, [type='text'].form-control,
[type=password].form-control, [type='password'].form-control,
[type=email].form-control, [type='email'].form-control,
[type=tel].form-control, [type='tel'].form-control,
[contenteditable].form-control { [contenteditable].form-control {
padding: 0; padding: 0;
border: none; border: none;
@@ -223,15 +223,15 @@ select.form-control {
padding-left: 25px; padding-left: 25px;
} }
input[type="radio"], input[type='radio'],
input[type="checkbox"] { input[type='checkbox'] {
margin-left: -25px; margin-left: -25px;
} }
} }
input[type="radio"], input[type='radio'],
.radio input[type="radio"], .radio input[type='radio'],
.radio-inline input[type="radio"] { .radio-inline input[type='radio'] {
position: relative; position: relative;
margin-top: 5px; margin-top: 5px;
margin-right: 4px; margin-right: 4px;
@@ -248,7 +248,7 @@ input[type="radio"],
&:before, &:before,
&:after { &:after {
content: ""; content: '';
display: block; display: block;
width: 18px; width: 18px;
height: 18px; height: 18px;
@@ -287,9 +287,9 @@ input[type="radio"],
} }
} }
input[type="checkbox"], input[type='checkbox'],
.checkbox input[type="checkbox"], .checkbox input[type='checkbox'],
.checkbox-inline input[type="checkbox"] { .checkbox-inline input[type='checkbox'] {
position: relative; position: relative;
vertical-align: -4px; vertical-align: -4px;
border: none; border: none;
@@ -302,7 +302,7 @@ input[type="checkbox"],
} }
&:after { &:after {
content: ""; content: '';
display: block; display: block;
width: 18px; width: 18px;
height: 18px; height: 18px;
@@ -314,7 +314,7 @@ input[type="checkbox"],
} }
&:checked:before { &:checked:before {
content: ""; content: '';
position: absolute; position: absolute;
top: 0; top: 0;
left: 6px; left: 6px;
@@ -343,27 +343,27 @@ input[type="checkbox"],
} }
.has-warning { .has-warning {
input:not([type=checkbox]), input:not([type='checkbox']),
.form-control, .form-control,
input:not([type=checkbox]):focus, input:not([type='checkbox']):focus,
.form-control:focus { .form-control:focus {
.box-shadow(inset 0 -2px 0 @brand-warning); .box-shadow(inset 0 -2px 0 @brand-warning);
} }
} }
.has-error { .has-error {
input:not([type=checkbox]), input:not([type='checkbox']),
.form-control, .form-control,
input:not([type=checkbox]):focus, input:not([type='checkbox']):focus,
.form-control:focus { .form-control:focus {
.box-shadow(inset 0 -2px 0 @brand-danger); .box-shadow(inset 0 -2px 0 @brand-danger);
} }
} }
.has-success { .has-success {
input:not([type=checkbox]), input:not([type='checkbox']),
.form-control, .form-control,
input:not([type=checkbox]):focus, input:not([type='checkbox']):focus,
.form-control:focus { .form-control:focus {
.box-shadow(inset 0 -2px 0 @brand-success); .box-shadow(inset 0 -2px 0 @brand-success);
} }
@@ -405,7 +405,6 @@ input[type="checkbox"],
} }
&.nav-justified { &.nav-justified {
& > li > a, & > li > a,
& > li > a:hover, & > li > a:hover,
& > .active > a, & > .active > a,
@@ -421,7 +420,7 @@ input[type="checkbox"],
.dropdown-menu { .dropdown-menu {
border: none; border: none;
.box-shadow(0 1px 4px rgba(0,0,0,.3)); .box-shadow(0 1px 4px rgba(0,0,0,0.3));
} }
// Indicators ================================================================= // Indicators =================================================================
@@ -479,7 +478,7 @@ input[type="checkbox"],
&:last-child { &:last-child {
&:before { &:before {
display: block; display: block;
content: ""; content: '';
position: absolute; position: absolute;
width: 100%; width: 100%;
height: 100%; height: 100%;
@@ -523,7 +522,6 @@ input[type="checkbox"],
} }
.list-group { .list-group {
&-item { &-item {
padding: 15px; padding: 15px;
} }
@@ -541,7 +539,7 @@ input[type="checkbox"],
.panel { .panel {
border: none; border: none;
border-radius: 2px; border-radius: 2px;
.box-shadow(0 1px 4px rgba(0,0,0,.3)); .box-shadow(0 1px 4px rgba(0,0,0,0.3));
&-heading { &-heading {
border-bottom: none; border-bottom: none;
@@ -554,14 +552,18 @@ input[type="checkbox"],
.popover { .popover {
border: none; border: none;
.box-shadow(0 1px 4px rgba(0,0,0,.3)); .box-shadow(0 1px 4px rgba(0,0,0,0.3));
} }
.carousel { .carousel {
&-caption { &-caption {
h1, h2, h3, h4, h5, h6 { h1,
h2,
h3,
h4,
h5,
h6 {
color: inherit; color: inherit;
} }
} }
} }

File diff suppressed because it is too large Load Diff

View File

@@ -3,32 +3,32 @@
.@{fa-css-prefix}-spin { .@{fa-css-prefix}-spin {
-webkit-animation: fa-spin 2s infinite linear; -webkit-animation: fa-spin 2s infinite linear;
animation: fa-spin 2s infinite linear; animation: fa-spin 2s infinite linear;
} }
.@{fa-css-prefix}-pulse { .@{fa-css-prefix}-pulse {
-webkit-animation: fa-spin 1s infinite steps(8); -webkit-animation: fa-spin 1s infinite steps(8);
animation: fa-spin 1s infinite steps(8); animation: fa-spin 1s infinite steps(8);
} }
@-webkit-keyframes fa-spin { @-webkit-keyframes fa-spin {
0% { 0% {
-webkit-transform: rotate(0deg); -webkit-transform: rotate(0deg);
transform: rotate(0deg); transform: rotate(0deg);
} }
100% { 100% {
-webkit-transform: rotate(359deg); -webkit-transform: rotate(359deg);
transform: rotate(359deg); transform: rotate(359deg);
} }
} }
@keyframes fa-spin { @keyframes fa-spin {
0% { 0% {
-webkit-transform: rotate(0deg); -webkit-transform: rotate(0deg);
transform: rotate(0deg); transform: rotate(0deg);
} }
100% { 100% {
-webkit-transform: rotate(359deg); -webkit-transform: rotate(359deg);
transform: rotate(359deg); transform: rotate(359deg);
} }
} }

View File

@@ -2,24 +2,40 @@
// ------------------------- // -------------------------
.@{fa-css-prefix}-border { .@{fa-css-prefix}-border {
padding: .2em .25em .15em; padding: 0.2em 0.25em 0.15em;
border: solid .08em @fa-border-color; border: solid 0.08em @fa-border-color;
border-radius: .1em; border-radius: 0.1em;
} }
.@{fa-css-prefix}-pull-left { float: left; } .@{fa-css-prefix}-pull-left {
.@{fa-css-prefix}-pull-right { float: right; } float: left;
}
.@{fa-css-prefix}-pull-right {
float: right;
}
.@{fa-css-prefix} { .@{fa-css-prefix} {
&.@{fa-css-prefix}-pull-left { margin-right: .3em; } &.@{fa-css-prefix}-pull-left {
&.@{fa-css-prefix}-pull-right { margin-left: .3em; } margin-right: 0.3em;
}
&.@{fa-css-prefix}-pull-right {
margin-left: 0.3em;
}
} }
/* Deprecated as of 4.4.0 */ /* Deprecated as of 4.4.0 */
.pull-right { float: right; } .pull-right {
.pull-left { float: left; } float: right;
}
.pull-left {
float: left;
}
.@{fa-css-prefix} { .@{fa-css-prefix} {
&.pull-left { margin-right: .3em; } &.pull-left {
&.pull-right { margin-left: .3em; } margin-right: 0.3em;
}
&.pull-right {
margin-left: 0.3em;
}
} }

View File

@@ -3,10 +3,9 @@
.@{fa-css-prefix} { .@{fa-css-prefix} {
display: inline-block; display: inline-block;
font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration font: normal normal normal @fa-font-size-base / @fa-line-height-base FontAwesome; // shortening font declaration
font-size: inherit; // can't have font-size inherit on line above, so need to override font-size: inherit; // can't have font-size inherit on line above, so need to override
text-rendering: auto; // optimizelegibility throws things off #1094 text-rendering: auto; // optimizelegibility throws things off #1094
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
} }

View File

@@ -3,16 +3,16 @@
* License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
*/ */
@import "variables.less"; @import 'variables.less';
@import "mixins.less"; @import 'mixins.less';
@import "path.less"; @import 'path.less';
@import "core.less"; @import 'core.less';
@import "larger.less"; @import 'larger.less';
@import "fixed-width.less"; @import 'fixed-width.less';
@import "list.less"; @import 'list.less';
@import "bordered-pulled.less"; @import 'bordered-pulled.less';
@import "animated.less"; @import 'animated.less';
@import "rotated-flipped.less"; @import 'rotated-flipped.less';
@import "stacked.less"; @import 'stacked.less';
@import "icons.less"; @import 'icons.less';
@import "screen-reader.less"; @import 'screen-reader.less';

File diff suppressed because it is too large Load Diff

View File

@@ -7,7 +7,15 @@
line-height: (3em / 4); line-height: (3em / 4);
vertical-align: -15%; vertical-align: -15%;
} }
.@{fa-css-prefix}-2x { font-size: 2em; } .@{fa-css-prefix}-2x {
.@{fa-css-prefix}-3x { font-size: 3em; } font-size: 2em;
.@{fa-css-prefix}-4x { font-size: 4em; } }
.@{fa-css-prefix}-5x { font-size: 5em; } .@{fa-css-prefix}-3x {
font-size: 3em;
}
.@{fa-css-prefix}-4x {
font-size: 4em;
}
.@{fa-css-prefix}-5x {
font-size: 5em;
}

View File

@@ -5,7 +5,9 @@
padding-left: 0; padding-left: 0;
margin-left: @fa-li-width; margin-left: @fa-li-width;
list-style-type: none; list-style-type: none;
> li { position: relative; } > li {
position: relative;
}
} }
.@{fa-css-prefix}-li { .@{fa-css-prefix}-li {
position: absolute; position: absolute;

View File

@@ -3,29 +3,27 @@
.fa-icon() { .fa-icon() {
display: inline-block; display: inline-block;
font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration font: normal normal normal @fa-font-size-base / @fa-line-height-base FontAwesome; // shortening font declaration
font-size: inherit; // can't have font-size inherit on line above, so need to override font-size: inherit; // can't have font-size inherit on line above, so need to override
text-rendering: auto; // optimizelegibility throws things off #1094 text-rendering: auto; // optimizelegibility throws things off #1094
-webkit-font-smoothing: antialiased; -webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
} }
.fa-icon-rotate(@degrees, @rotation) { .fa-icon-rotate(@degrees, @rotation) {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; -ms-filter: 'progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})';
-webkit-transform: rotate(@degrees); -webkit-transform: rotate(@degrees);
-ms-transform: rotate(@degrees); -ms-transform: rotate(@degrees);
transform: rotate(@degrees); transform: rotate(@degrees);
} }
.fa-icon-flip(@horiz, @vert, @rotation) { .fa-icon-flip(@horiz, @vert, @rotation) {
-ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; -ms-filter: 'progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)';
-webkit-transform: scale(@horiz, @vert); -webkit-transform: scale(@horiz, @vert);
-ms-transform: scale(@horiz, @vert); -ms-transform: scale(@horiz, @vert);
transform: scale(@horiz, @vert); transform: scale(@horiz, @vert);
} }
// Only display content to screen readers. A la Bootstrap 4. // Only display content to screen readers. A la Bootstrap 4.
// //
// See: http://a11yproject.com/posts/how-to-hide-content/ // See: http://a11yproject.com/posts/how-to-hide-content/
@@ -37,7 +35,7 @@
padding: 0; padding: 0;
margin: -1px; margin: -1px;
overflow: hidden; overflow: hidden;
clip: rect(0,0,0,0); clip: rect(0, 0, 0, 0);
border: 0; border: 0;
} }

View File

@@ -4,7 +4,8 @@
@font-face { @font-face {
font-family: 'FontAwesome'; font-family: 'FontAwesome';
src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}');
src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}')
format('embedded-opentype'),
url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'),
url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'),
url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'),

View File

@@ -1,12 +1,22 @@
// Rotated & Flipped Icons // Rotated & Flipped Icons
// ------------------------- // -------------------------
.@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } .@{fa-css-prefix}-rotate-90 {
.@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } .fa-icon-rotate(90deg, 1);
.@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } }
.@{fa-css-prefix}-rotate-180 {
.fa-icon-rotate(180deg, 2);
}
.@{fa-css-prefix}-rotate-270 {
.fa-icon-rotate(270deg, 3);
}
.@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } .@{fa-css-prefix}-flip-horizontal {
.@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } .fa-icon-flip(-1, 1, 0);
}
.@{fa-css-prefix}-flip-vertical {
.fa-icon-flip(1, -1, 2);
}
// Hook for IE8-9 // Hook for IE8-9
// ------------------------- // -------------------------

View File

@@ -1,5 +1,9 @@
// Screen Readers // Screen Readers
// ------------------------- // -------------------------
.sr-only { .sr-only(); } .sr-only {
.sr-only-focusable { .sr-only-focusable(); } .sr-only();
}
.sr-only-focusable {
.sr-only-focusable();
}

View File

@@ -9,12 +9,19 @@
line-height: 2em; line-height: 2em;
vertical-align: middle; vertical-align: middle;
} }
.@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { .@{fa-css-prefix}-stack-1x,
.@{fa-css-prefix}-stack-2x {
position: absolute; position: absolute;
left: 0; left: 0;
width: 100%; width: 100%;
text-align: center; text-align: center;
} }
.@{fa-css-prefix}-stack-1x { line-height: inherit; } .@{fa-css-prefix}-stack-1x {
.@{fa-css-prefix}-stack-2x { font-size: 2em; } line-height: inherit;
.@{fa-css-prefix}-inverse { color: @fa-inverse; } }
.@{fa-css-prefix}-stack-2x {
font-size: 2em;
}
.@{fa-css-prefix}-inverse {
color: @fa-inverse;
}

File diff suppressed because it is too large Load Diff

View File

@@ -14,4 +14,4 @@
.alert-leave.alert-leave-active { .alert-leave.alert-leave-active {
opacity: 0.01; opacity: 0.01;
} }

View File

@@ -1,12 +1,6 @@
{ {
"name": "WakaTime", "name": "WakaTime",
"ignore": [ "ignore": ["**/.*", "node_modules", "bower_components", "test", "tests"],
"**/.*",
"node_modules",
"bower_components",
"test",
"tests"
],
"dependencies": { "dependencies": {
"font-awesome": "~4.6.3", "font-awesome": "~4.6.3",
"bootstrap": "~3.3.4" "bootstrap": "~3.3.4"

View File

@@ -14,18 +14,24 @@ var fs = require('fs');
*/ */
gulp.task('postinstall', function (cb) { gulp.task('postinstall', function (cb) {
// .pem files cause Chrome to show a bunch of warnings // .pem files cause Chrome to show a bunch of warnings
//so we remove them on postinstall //so we remove them on postinstall
del('node_modules/**/*.pem', cb); del('node_modules/**/*.pem', cb);
}); });
gulp.task('webextension',function(cb){ gulp.task('webextension', function (cb) {
if(!fs.existsSync('public/js')){ if (!fs.existsSync('public/js')) {
!fs.existsSync('public') && fs.mkdirSync('public'); !fs.existsSync('public') && fs.mkdirSync('public');
fs.mkdirSync('public/js'); fs.mkdirSync('public/js');
} }
fs.copyFileSync('node_modules/webextension-polyfill/dist/browser-polyfill.min.js', 'public/js/browser-polyfill.min.js'); fs.copyFileSync(
fs.copyFileSync('node_modules/webextension-polyfill/dist/browser-polyfill.min.js.map', 'public/js/browser-polyfill.min.js.map'); 'node_modules/webextension-polyfill/dist/browser-polyfill.min.js',
'public/js/browser-polyfill.min.js',
);
fs.copyFileSync(
'node_modules/webextension-polyfill/dist/browser-polyfill.min.js.map',
'public/js/browser-polyfill.min.js.map',
);
}); });
/* /*
@@ -41,19 +47,19 @@ gulp.task('webextension',function(cb){
elixir.config.assetsPath = 'assets/'; elixir.config.assetsPath = 'assets/';
elixir.extend('webextension', function(){ elixir.extend('webextension', function () {
return gulp.start('webextension'); return gulp.start('webextension');
}); });
elixir(function (mix) { elixir(function (mix) {
mix.webextension(); mix.webextension();
mix.copy('vendor/bower_components/bootstrap/less', 'assets/less/bootstrap'); mix.copy('vendor/bower_components/bootstrap/less', 'assets/less/bootstrap');
mix.copy('vendor/bower_components/bootstrap/fonts', 'public/fonts'); mix.copy('vendor/bower_components/bootstrap/fonts', 'public/fonts');
mix.copy('vendor/bower_components/font-awesome/less', 'assets/less/font-awesome'); mix.copy('vendor/bower_components/font-awesome/less', 'assets/less/font-awesome');
mix.copy('vendor/bower_components/font-awesome/fonts', 'public/fonts'); mix.copy('vendor/bower_components/font-awesome/fonts', 'public/fonts');
mix.less('app.less'); mix.less('app.less');
mix.browserify('app.jsx', 'public/js/app.js', 'assets/js'); mix.browserify('app.jsx', 'public/js/app.js', 'assets/js');
mix.browserify('events.js', 'public/js/events.js', 'assets/js'); mix.browserify('events.js', 'public/js/events.js', 'assets/js');
mix.browserify('options.jsx', 'public/js/options.js', 'assets/js'); mix.browserify('options.jsx', 'public/js/options.js', 'assets/js');
mix.browserify('devtools.js', 'public/js/devtools.js', 'assets/js'); mix.browserify('devtools.js', 'public/js/devtools.js', 'assets/js');
}); });

View File

@@ -1,18 +1,17 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1" />
<title>WakaTime options</title> <title>WakaTime options</title>
<link href="public/css/app.css" rel="stylesheet"> <link href="public/css/app.css" rel="stylesheet" />
</head> </head>
<body> <body>
<div id="wakatime-options"></div>
<div id="wakatime-options"></div> <script src="public/js/browser-polyfill.min.js"></script>
<script src="public/js/options.js"></script>
<script src="public/js/browser-polyfill.min.js"></script> </body>
<script src="public/js/options.js"></script>
</body>
</html> </html>

2896
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -1,19 +1,33 @@
{ {
"name": "chrome-wakatime",
"scripts": { "scripts": {
"test": "jest --verbose --coverage && mocha --compilers js:mocha-traceur tests/**/*.spec.js", "test": "clap test",
"test-react": "jest --verbose --coverage", "start": "clap build",
"test-js": "node_modules/.bin/phantomjs tests/run.js",
"start": "npm install && bower install && gulp",
"gulp": "gulp", "gulp": "gulp",
"watch": "gulp watch", "watch": "gulp watch",
"lint": "jsxhint --jsx-only .", "lint": "clap lint",
"postinstall": "gulp postinstall", "postinstall": "clap postinstall",
"validate": "npm ls" "validate": "npm ls"
}, },
"pre-commit": [ "husky": {
"lint" "hooks": {
], "pre-commit": "lint-staged",
"pre-push": "npm test"
}
},
"lint-staged": {
"*.{js|jsx|ts|tsx}": [
"eslint",
"prettier --write",
"git add"
],
"*.json": [
"prettier --write"
]
},
"jest": { "jest": {
"verbose": true,
"testURL": "http://localhost/",
"testFileExtensions": [ "testFileExtensions": [
"jest.js" "jest.js"
], ],
@@ -25,25 +39,35 @@
}, },
"private": true, "private": true,
"devDependencies": { "devDependencies": {
"@types/node": "^14.14.20",
"@xarc/run": "^1.0.4",
"babel-jest": "^22.1.0", "babel-jest": "^22.1.0",
"bower": "^1.7.9", "bower": "^1.7.9",
"chai": "^4.1.2", "chai": "^4.1.2",
"del": "^3.0.0", "del": "^3.0.0",
"eslint": "^7.17.0",
"gulp": "^3.9.1", "gulp": "^3.9.1",
"husky": "^4.3.7",
"jest-cli": "^22.1.4", "jest-cli": "^22.1.4",
"jsdom": "^16.4.0",
"jshint": "^2.9.2", "jshint": "^2.9.2",
"jsxhint": "^0.15.1", "jsxhint": "^0.15.1",
"laravel-elixir": "^6.0.0-17", "laravel-elixir": "^6.0.0-17",
"laravel-elixir-browserify-official": "^0.1.3", "laravel-elixir-browserify-official": "^0.1.3",
"lint-staged": "^10.5.3",
"mocha": "^5.0.0", "mocha": "^5.0.0",
"mocha-sinon": "^2.0.0", "mocha-sinon": "^2.0.0",
"mocha-traceur": "^2.1.0", "mocha-traceur": "^2.1.0",
"phantomjs": "^2.1.7",
"popper.js": "^1.14.6", "popper.js": "^1.14.6",
"precommit-hook": "^3.0.0", "prettier": "^2.2.1",
"rimraf": "^3.0.2",
"sinon": "^4.2.2", "sinon": "^4.2.2",
"sinon-chai": "^2.8.0", "sinon-chai": "^2.8.0",
"sinon-chrome": "^2.2.4", "sinon-chrome": "^2.2.4",
"traceur": "^0.0.111" "traceur": "^0.0.111",
"ts-node": "^9.1.1",
"typescript": "^4.1.3"
}, },
"dependencies": { "dependencies": {
"bootstrap": "^4.0.0", "bootstrap": "^4.0.0",

View File

@@ -1,18 +1,17 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en"> <html lang="en">
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1" />
<title>WakaTime</title> <title>WakaTime</title>
<link href="public/css/app.css" rel="stylesheet"> <link href="public/css/app.css" rel="stylesheet" />
</head> </head>
<body> <body>
<div id="wakatime"></div>
<div id="wakatime"></div> <script src="public/js/browser-polyfill.min.js"></script>
<script src="public/js/app.js"></script>
<script src="public/js/browser-polyfill.min.js"></script> </body>
<script src="public/js/app.js"></script>
</body>
</html> </html>

Some files were not shown because too many files have changed in this diff Show More