chore: rename folders

This commit is contained in:
Łukasz Holeczek
2018-03-04 12:33:16 +01:00
parent 4be9d2dce2
commit 0347970e65
271 changed files with 0 additions and 0 deletions
+14
View File
@@ -0,0 +1,14 @@
{
"presets": [
["env", { "modules": false }],
"stage-2"
],
"plugins": ["transform-runtime"],
"comments": false,
"env": {
"test": {
"presets": ["env", "stage-2"],
"plugins": [ "istanbul" ]
}
}
}
+9
View File
@@ -0,0 +1,9 @@
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
+2
View File
@@ -0,0 +1,2 @@
build/*.js
config/*.js
+27
View File
@@ -0,0 +1,27 @@
// http://eslint.org/docs/user-guide/configuring
module.exports = {
root: true,
parser: 'babel-eslint',
parserOptions: {
sourceType: 'module'
},
env: {
browser: true,
},
// https://github.com/feross/standard/blob/master/RULES.md#javascript-standard-style
extends: 'standard',
// required to lint *.vue files
plugins: [
'html'
],
// add your custom rules here
'rules': {
// allow paren-less arrow functions
'arrow-parens': 0,
// allow async-await
'generator-star-spacing': 0,
// allow debugger during development
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0
}
}
+9
View File
@@ -0,0 +1,9 @@
.DS_Store
node_modules/
dist/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
test/unit/coverage
test/e2e/reports
selenium-debug.log
+8
View File
@@ -0,0 +1,8 @@
// https://github.com/michael-ciniawsky/postcss-load-config
module.exports = {
"plugins": {
// to edit target browsers: use "browserlist" field in package.json
"autoprefixer": {}
}
}
+30
View File
@@ -0,0 +1,30 @@
# core-ui
> Open Source Admin Template
## Build Setup
``` bash
# install dependencies
npm install
# serve with hot reload at localhost:8080
npm run dev
# build for production with minification
npm run build
# build for production and view the bundle analyzer report
npm run build --report
# run unit tests
npm run unit
# run e2e tests
npm run e2e
# run all tests
npm test
```
For detailed explanation on how things work, checkout the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader).
+35
View File
@@ -0,0 +1,35 @@
require('./check-versions')()
process.env.NODE_ENV = 'production'
var ora = require('ora')
var rm = require('rimraf')
var path = require('path')
var chalk = require('chalk')
var webpack = require('webpack')
var config = require('../config')
var webpackConfig = require('./webpack.prod.conf')
var spinner = ora('building for production...')
spinner.start()
rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
if (err) throw err
webpack(webpackConfig, function (err, stats) {
spinner.stop()
if (err) throw err
process.stdout.write(stats.toString({
colors: true,
modules: false,
children: false,
chunks: false,
chunkModules: false
}) + '\n\n')
console.log(chalk.cyan(' Build complete.\n'))
console.log(chalk.yellow(
' Tip: built files are meant to be served over an HTTP server.\n' +
' Opening index.html over file:// won\'t work.\n'
))
})
})
+48
View File
@@ -0,0 +1,48 @@
var chalk = require('chalk')
var semver = require('semver')
var packageConfig = require('../package.json')
var shell = require('shelljs')
function exec (cmd) {
return require('child_process').execSync(cmd).toString().trim()
}
var versionRequirements = [
{
name: 'node',
currentVersion: semver.clean(process.version),
versionRequirement: packageConfig.engines.node
},
]
if (shell.which('npm')) {
versionRequirements.push({
name: 'npm',
currentVersion: exec('npm --version'),
versionRequirement: packageConfig.engines.npm
})
}
module.exports = function () {
var warnings = []
for (var i = 0; i < versionRequirements.length; i++) {
var mod = versionRequirements[i]
if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
warnings.push(mod.name + ': ' +
chalk.red(mod.currentVersion) + ' should be ' +
chalk.green(mod.versionRequirement)
)
}
}
if (warnings.length) {
console.log('')
console.log(chalk.yellow('To use this template, you must update following to modules:'))
console.log()
for (var i = 0; i < warnings.length; i++) {
var warning = warnings[i]
console.log(' ' + warning)
}
console.log()
process.exit(1)
}
}
+9
View File
@@ -0,0 +1,9 @@
/* eslint-disable */
require('eventsource-polyfill')
var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true')
hotClient.subscribe(function (event) {
if (event.action === 'reload') {
window.location.reload()
}
})
+91
View File
@@ -0,0 +1,91 @@
require('./check-versions')()
var config = require('../config')
if (!process.env.NODE_ENV) {
process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV)
}
var opn = require('opn')
var path = require('path')
var express = require('express')
var webpack = require('webpack')
var proxyMiddleware = require('http-proxy-middleware')
var webpackConfig = process.env.NODE_ENV === 'testing'
? require('./webpack.prod.conf')
: require('./webpack.dev.conf')
// default port where dev server listens for incoming traffic
var port = process.env.PORT || config.dev.port
// automatically open browser, if not set will be false
var autoOpenBrowser = !!config.dev.autoOpenBrowser
// Define HTTP proxies to your custom API backend
// https://github.com/chimurai/http-proxy-middleware
var proxyTable = config.dev.proxyTable
var app = express()
var compiler = webpack(webpackConfig)
var devMiddleware = require('webpack-dev-middleware')(compiler, {
publicPath: webpackConfig.output.publicPath,
quiet: true
})
var hotMiddleware = require('webpack-hot-middleware')(compiler, {
log: () => {}
})
// force page reload when html-webpack-plugin template changes
compiler.plugin('compilation', function (compilation) {
compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) {
hotMiddleware.publish({ action: 'reload' })
cb()
})
})
// proxy api requests
Object.keys(proxyTable).forEach(function (context) {
var options = proxyTable[context]
if (typeof options === 'string') {
options = { target: options }
}
app.use(proxyMiddleware(options.filter || context, options))
})
// handle fallback for HTML5 history API
app.use(require('connect-history-api-fallback')())
// serve webpack bundle output
app.use(devMiddleware)
// enable hot-reload and state-preserving
// compilation error display
app.use(hotMiddleware)
// serve pure static assets
var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory)
app.use(staticPath, express.static('./static'))
var uri = 'http://localhost:' + port
var _resolve
var readyPromise = new Promise(resolve => {
_resolve = resolve
})
console.log('> Starting dev server...')
devMiddleware.waitUntilValid(() => {
console.log('> Listening at ' + uri + '\n')
// when env is testing, don't need open it
if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') {
opn(uri)
}
_resolve()
})
var server = app.listen(port)
module.exports = {
ready: readyPromise,
close: () => {
server.close()
}
}
+72
View File
@@ -0,0 +1,72 @@
var path = require('path')
var config = require('../config')
var ExtractTextPlugin = require('extract-text-webpack-plugin')
exports.assetsPath = function (_path) {
var assetsSubDirectory = process.env.NODE_ENV === 'production'
? config.build.assetsSubDirectory
: config.dev.assetsSubDirectory
return path.posix.join(assetsSubDirectory, _path)
}
exports.cssLoaders = function (options) {
options = options || {}
var cssLoader = {
loader: 'css-loader',
options: {
minimize: process.env.NODE_ENV === 'production',
sourceMap: options.sourceMap,
alias: { '../img': '../static/img' }
}
}
// generate loader string to be used with extract text plugin
function generateLoaders (loader, loaderOptions) {
var loaders = [cssLoader]
if (loader) {
loaders.push({
loader: loader + '-loader',
options: Object.assign({}, loaderOptions, {
sourceMap: options.sourceMap
})
})
}
// Extract CSS when that option is specified
// (which is the case during production build)
if (options.extract) {
return ExtractTextPlugin.extract({
use: loaders,
fallback: 'vue-style-loader'
})
} else {
return ['vue-style-loader'].concat(loaders)
}
}
// https://vue-loader.vuejs.org/en/configurations/extract-css.html
return {
css: generateLoaders(),
postcss: generateLoaders(),
less: generateLoaders('less'),
sass: generateLoaders('sass', { indentedSyntax: true }),
scss: generateLoaders('sass'),
stylus: generateLoaders('stylus'),
styl: generateLoaders('stylus')
}
}
// Generate loaders for standalone style files (outside of .vue)
exports.styleLoaders = function (options) {
var output = []
var loaders = exports.cssLoaders(options)
for (var extension in loaders) {
var loader = loaders[extension]
output.push({
test: new RegExp('\\.' + extension + '$'),
use: loader
})
}
return output
}
+12
View File
@@ -0,0 +1,12 @@
var utils = require('./utils')
var config = require('../config')
var isProduction = process.env.NODE_ENV === 'production'
module.exports = {
loaders: utils.cssLoaders({
sourceMap: isProduction
? config.build.productionSourceMap
: config.dev.cssSourceMap,
extract: isProduction
})
}
+76
View File
@@ -0,0 +1,76 @@
var path = require('path')
var utils = require('./utils')
var config = require('../config')
var vueLoaderConfig = require('./vue-loader.conf')
function resolve (dir) {
return path.join(__dirname, '..', dir)
}
module.exports = {
entry: {
app: './src/main.js'
},
output: {
path: config.build.assetsRoot,
filename: '[name].js',
publicPath: process.env.NODE_ENV === 'production'
? config.build.assetsPublicPath
: config.dev.assetsPublicPath
},
resolve: {
extensions: ['.js', '.vue', '.json'],
alias: {
'vue$': 'vue/dist/vue.esm.js',
'@': resolve('src')
}
},
module: {
rules: [
{
test: /\.(js|vue)$/,
loader: 'eslint-loader',
enforce: 'pre',
include: [resolve('src'), resolve('test')],
options: {
formatter: require('eslint-friendly-formatter')
}
},
{
test: /\.vue$/,
loader: 'vue-loader',
options: vueLoaderConfig
},
{
test: /\.js$/,
loader: 'babel-loader',
include: [resolve('src'), resolve('test')]
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
exclude: [/fonts/],
use: {
loader: 'file-loader',
options: {
name: '[name].[hash:7].[ext]',
publicPath: '../../',
outputPath: utils.assetsPath('img/'),
emitFile: true
}
}
},
{
test: /\.(woff2?|ttf|eot|svg)(\?v=\d+\.\d+\.\d+)?$/,
exclude: [/flags/],
use: {
loader: 'file-loader',
options: {
name: '[name].[hash:7].[ext]',
publicPath: '../../',
outputPath: utils.assetsPath('fonts/')
}
}
}
]
}
}
+45
View File
@@ -0,0 +1,45 @@
var path = require('path')
var utils = require('./utils')
var webpack = require('webpack')
var config = require('../config')
var merge = require('webpack-merge')
var baseWebpackConfig = require('./webpack.base.conf')
var CopyWebpackPlugin = require('copy-webpack-plugin')
var HtmlWebpackPlugin = require('html-webpack-plugin')
var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
// add hot-reload related code to entry chunks
Object.keys(baseWebpackConfig.entry).forEach(function (name) {
baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name])
})
module.exports = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap })
},
// cheap-module-eval-source-map is faster for development
devtool: '#cheap-module-eval-source-map',
plugins: [
new webpack.DefinePlugin({
'process.env': config.dev.env
}),
// https://github.com/glenjamin/webpack-hot-middleware#installation--usage
new webpack.HotModuleReplacementPlugin(),
new webpack.NoEmitOnErrorsPlugin(),
// https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: 'index.html',
template: 'index.html',
inject: true
}),
new FriendlyErrorsPlugin(),
// copy custom static assets
new CopyWebpackPlugin([
{
from: path.resolve(__dirname, '../static'),
to: config.build.assetsSubDirectory,
ignore: ['.*']
}
])
]
})
+124
View File
@@ -0,0 +1,124 @@
var path = require('path')
var utils = require('./utils')
var webpack = require('webpack')
var config = require('../config')
var merge = require('webpack-merge')
var baseWebpackConfig = require('./webpack.base.conf')
var CopyWebpackPlugin = require('copy-webpack-plugin')
var HtmlWebpackPlugin = require('html-webpack-plugin')
var ExtractTextPlugin = require('extract-text-webpack-plugin')
var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
var env = process.env.NODE_ENV === 'testing'
? require('../config/test.env')
: config.build.env
var webpackConfig = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({
sourceMap: config.build.productionSourceMap,
extract: true
})
},
devtool: config.build.productionSourceMap ? '#source-map' : false,
output: {
path: config.build.assetsRoot,
filename: utils.assetsPath('js/[name].[chunkhash].js'),
chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
},
plugins: [
// http://vuejs.github.io/vue-loader/en/workflow/production.html
new webpack.DefinePlugin({
'process.env': env
}),
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
},
sourceMap: true
}),
// extract css into its own file
new ExtractTextPlugin({
filename: utils.assetsPath('css/[name].[contenthash].css')
}),
// Compress extracted CSS. We are using this plugin so that possible
// duplicated CSS from different components can be deduped.
new OptimizeCSSPlugin({
cssProcessorOptions: {
safe: true
}
}),
// generate dist index.html with correct asset hash for caching.
// you can customize output by editing /index.html
// see https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: process.env.NODE_ENV === 'testing'
? 'index.html'
: config.build.index,
template: 'index.html',
inject: true,
minify: {
removeComments: true,
collapseWhitespace: true,
removeAttributeQuotes: true
// more options:
// https://github.com/kangax/html-minifier#options-quick-reference
},
// necessary to consistently work with multiple chunks via CommonsChunkPlugin
chunksSortMode: 'dependency'
}),
// split vendor js into its own file
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
minChunks: function (module, count) {
// any required modules inside node_modules are extracted to vendor
return (
module.resource &&
/\.js$/.test(module.resource) &&
module.resource.indexOf(
path.join(__dirname, '../node_modules')
) === 0
)
}
}),
// extract webpack runtime and module manifest to its own file in order to
// prevent vendor hash from being updated whenever app bundle is updated
new webpack.optimize.CommonsChunkPlugin({
name: 'manifest',
chunks: ['vendor']
}),
// copy custom static assets
new CopyWebpackPlugin([
{
from: path.resolve(__dirname, '../static'),
to: config.build.assetsSubDirectory,
ignore: ['.*']
}
])
]
})
if (config.build.productionGzip) {
var CompressionWebpackPlugin = require('compression-webpack-plugin')
webpackConfig.plugins.push(
new CompressionWebpackPlugin({
asset: '[path].gz[query]',
algorithm: 'gzip',
test: new RegExp(
'\\.(' +
config.build.productionGzipExtensions.join('|') +
')$'
),
threshold: 10240,
minRatio: 0.8
})
)
}
if (config.build.bundleAnalyzerReport) {
var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
webpackConfig.plugins.push(new BundleAnalyzerPlugin())
}
module.exports = webpackConfig
+31
View File
@@ -0,0 +1,31 @@
// This is the webpack config used for unit tests.
var utils = require('./utils')
var webpack = require('webpack')
var merge = require('webpack-merge')
var baseConfig = require('./webpack.base.conf')
var webpackConfig = merge(baseConfig, {
// use inline sourcemap for karma-sourcemap-loader
module: {
rules: utils.styleLoaders()
},
devtool: '#inline-source-map',
resolveLoader: {
alias: {
// necessary to to make lang="scss" work in test when using vue-loader's ?inject option
// see discussion at https://github.com/vuejs/vue-loader/issues/724
'scss-loader': 'sass-loader'
}
},
plugins: [
new webpack.DefinePlugin({
'process.env': require('../config/test.env')
})
]
})
// no need for app entry during tests
delete webpackConfig.entry
module.exports = webpackConfig
+6
View File
@@ -0,0 +1,6 @@
var merge = require('webpack-merge')
var prodEnv = require('./prod.env')
module.exports = merge(prodEnv, {
NODE_ENV: '"development"'
})
+38
View File
@@ -0,0 +1,38 @@
// see http://vuejs-templates.github.io/webpack for documentation.
var path = require('path')
module.exports = {
build: {
env: require('./prod.env'),
index: path.resolve(__dirname, '../dist/index.html'),
assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static',
assetsPublicPath: './',
productionSourceMap: true,
// Gzip off by default as many popular static hosts such as
// Surge or Netlify already gzip all static assets for you.
// Before setting to `true`, make sure to:
// npm install --save-dev compression-webpack-plugin
productionGzip: false,
productionGzipExtensions: ['js', 'css'],
// Run the build command with an extra argument to
// View the bundle analyzer report after build finishes:
// `npm run build --report`
// Set to `true` or `false` to always turn it on or off
bundleAnalyzerReport: process.env.npm_config_report
},
dev: {
env: require('./dev.env'),
port: 8080,
autoOpenBrowser: true,
assetsSubDirectory: 'static',
assetsPublicPath: '',
proxyTable: {},
// CSS Sourcemaps off by default because relative paths are "buggy"
// with this option, according to the CSS-Loader README
// (https://github.com/webpack/css-loader#sourcemaps)
// In our experience, they generally work as expected,
// just be aware of this issue when enabling this option.
cssSourceMap: false
}
}
+3
View File
@@ -0,0 +1,3 @@
module.exports = {
NODE_ENV: '"production"'
}
+6
View File
@@ -0,0 +1,6 @@
var merge = require('webpack-merge')
var devEnv = require('./dev.env')
module.exports = merge(devEnv, {
NODE_ENV: '"testing"'
})
+42
View File
@@ -0,0 +1,42 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>CoreUI - Open Source Bootstrap Admin Template</title>
</head>
<!-- BODY options, add following classes to body to change options
// Header options
1. '.header-fixed' - Fixed Header
// Brand options
1. '.brand-minimized' - Minimized brand (Only symbol)
// Sidebar options
1. '.sidebar-fixed' - Fixed Sidebar
2. '.sidebar-hidden' - Hidden Sidebar
3. '.sidebar-off-canvas' - Off Canvas Sidebar
4. '.sidebar-minimized' - Minimized Sidebar (Only icons)
5. '.sidebar-compact' - Compact Sidebar
// Aside options
1. '.aside-menu-fixed' - Fixed Aside Menu
2. '.aside-menu-hidden' - Hidden Aside Menu
3. '.aside-menu-off-canvas' - Off Canvas Aside Menu
// Breadcrumb options
1. '.breadcrumb-fixed' - Fixed Breadcrumb
// Footer options
1. '.footer-fixed' - Fixed footer
-->
<body class="app header-fixed sidebar-fixed aside-menu-fixed aside-menu-hidden">
<div id="app"></div>
<!-- built files will be auto injected -->
</body>
</html>
+103
View File
@@ -0,0 +1,103 @@
{
"name": "@coreui/vue",
"version": "1.0.10",
"description": "Open Source Bootstrap Admin Template",
"author": "Łukasz Holeczek",
"homepage": "http://coreui.io",
"copyright": "Copyright 2018 creativeLabs Łukasz Holeczek",
"license": "MIT",
"private": true,
"scripts": {
"dev": "node build/dev-server.js",
"start": "node build/dev-server.js",
"build": "node build/build.js",
"unit": "cross-env BABEL_ENV=test karma start test/unit/karma.conf.js --single-run",
"e2e": "node test/e2e/runner.js",
"test": "npm run unit && npm run e2e",
"lint": "eslint --ext .js,.vue src test/unit/specs test/e2e/specs"
},
"dependencies": {
"bootstrap": "4.0.0",
"bootstrap-vue": "2.0.0-rc.1",
"chart.js": "2.7.1",
"flag-icon-css": "2.9.0",
"font-awesome": "^4.7.0",
"simple-line-icons": "^2.4.1",
"vue": "2.5.13",
"vue-chartjs": "3.1.0",
"vue-router": "3.0.1"
},
"devDependencies": {
"autoprefixer": "7.2.5",
"babel-core": "6.26.0",
"babel-eslint": "8.2.1",
"babel-loader": "7.1.2",
"babel-plugin-transform-runtime": "6.23.0",
"babel-preset-env": "1.6.1",
"babel-preset-stage-2": "6.24.1",
"babel-register": "6.26.0",
"chalk": "2.3.0",
"connect-history-api-fallback": "1.5.0",
"copy-webpack-plugin": "4.3.1",
"css-loader": "0.28.9",
"eslint": "4.16.0",
"eslint-friendly-formatter": "3.0.0",
"eslint-loader": "1.9.0",
"eslint-plugin-html": "4.0.2",
"eslint-plugin-import": "2.8.0",
"eslint-plugin-node": "5.2.1",
"eslint-config-standard": "11.0.0-beta.0",
"eslint-plugin-promise": "3.6.0",
"eslint-plugin-standard": "3.0.1",
"eventsource-polyfill": "0.9.6",
"express": "4.16.2",
"extract-text-webpack-plugin": "3.0.2",
"file-loader": "1.1.6",
"friendly-errors-webpack-plugin": "1.6.1",
"html-webpack-plugin": "2.30.1",
"http-proxy-middleware": "0.17.4",
"cross-env": "5.1.3",
"karma": "2.0.0",
"karma-coverage": "1.1.1",
"karma-mocha": "1.3.0",
"karma-phantomjs-launcher": "1.0.4",
"karma-phantomjs-shim": "1.5.0",
"karma-sinon-chai": "1.3.3",
"karma-sourcemap-loader": "0.3.7",
"karma-spec-reporter": "0.0.32",
"karma-webpack": "2.0.9",
"lolex": "2.3.2",
"mocha": "5.0.0",
"chai": "4.1.2",
"sinon": "4.2.2",
"sinon-chai": "2.14.0",
"inject-loader": "3.0.1",
"babel-plugin-istanbul": "4.1.5",
"phantomjs-prebuilt": "^2.1.16",
"chromedriver": "2.35.0",
"cross-spawn": "6.0.4",
"nightwatch": "0.9.19",
"node-sass": "4.7.2",
"sass-loader": "6.0.6",
"selenium-server": "3.8.1",
"semver": "5.5.0",
"shelljs": "0.8.1",
"opn": "5.2.0",
"optimize-css-assets-webpack-plugin": "3.2.0",
"ora": "1.4.0",
"rimraf": "2.6.2",
"url-loader": "0.6.2",
"vue-loader": "14.1.1",
"vue-style-loader": "3.1.2",
"vue-template-compiler": "2.5.13",
"webpack": "3.10.0",
"webpack-bundle-analyzer": "2.10.0",
"webpack-dev-middleware": "2.0.4",
"webpack-hot-middleware": "2.21.0",
"webpack-merge": "4.1.1"
},
"engines": {
"node": ">= 8.9.4",
"npm": ">= 5.6.0"
}
}
+130
View File
@@ -0,0 +1,130 @@
// Bootstrap overrides
//
// Color system
//
$white: #fff;
$gray-100: #f0f3f5;
$gray-200: #c2cfd6;
$gray-300: #a4b7c1;
$gray-400: #869fac;
$gray-500: #678898;
$gray-600: #536c79;
$gray-700: #3e515b;
$gray-800: #29363d;
$gray-900: #151b1e;
$black: #000 !default;
$blue: #20a8d8;
$indigo: #6610f2 !default;
$purple: #6f42c1 !default;
$pink: #e83e8c !default;
$red: #f86c6b;
$orange: #f8cb00;
$yellow: #ffc107 !default;
$green: #4dbd74;
$teal: #20c997 !default;
$cyan: #63c2de;
$colors: (
blue: $blue,
indigo: $indigo,
purple: $purple,
pink: $pink,
red: $red,
orange: $orange,
yellow: $yellow,
green: $green,
teal: $teal,
cyan: $cyan,
white: $white,
gray: $gray-600,
gray-dark: $gray-800
);
$theme-colors: (
primary: $blue,
secondary: $gray-300,
success: $green,
info: $cyan,
warning: $yellow,
danger: $red,
light: $gray-100,
dark: $gray-800,
blue: $blue,
indigo: $indigo,
purple: $purple,
pink: $pink,
red: $red,
orange: $orange,
yellow: $yellow,
green: $green,
teal: $teal,
cyan: $cyan,
gray-100: $gray-100,
gray-200: $gray-200,
gray-300: $gray-300,
gray-400: $gray-400,
gray-500: $gray-500,
gray-600: $gray-600,
gray-700: $gray-700,
gray-800: $gray-800,
gray-900: $gray-900
);
// Options
//
// Quickly modify global styling by enabling or disabling optional features.
$enable-transitions: true;
$enable-rounded: false;
// Body
//
// Settings for the `<body>` element.
$body-bg: #e4e5e6;
// Typography
//
// Font, line-height, and color for body text, headings, and more.
$font-size-base: 0.875rem;
// Breadcrumbs
$breadcrumb-bg: #fff;
$breadcrumb-margin-bottom: 1.5rem;
// Cards
$card-border-color: $gray-200;
$card-cap-bg: $gray-100;
// Dropdowns
$dropdown-padding-y: 0;
$dropdown-border-color: $gray-200;
$dropdown-divider-bg: $gray-100;
// Buttons
$btn-secondary-border: $gray-300;
// Progress bars
$progress-bg: $gray-100;
// Tables
$table-bg-accent: $gray-100;
$table-bg-hover: $gray-100;
// Forms
$input-group-addon-bg: $gray-100;
$input-border-color: $gray-200;
$input-group-addon-border-color: $gray-200;
+1
View File
@@ -0,0 +1 @@
// core overrides
+1
View File
@@ -0,0 +1 @@
// Here you can add other styles
+27
View File
@@ -0,0 +1,27 @@
// scss-lint:disable all
.animated {
animation-duration: 1s;
// animation-fill-mode: both;
}
.animated.infinite {
animation-iteration-count: infinite;
}
.animated.hinge {
animation-duration: 2s;
}
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.fadeIn {
animation-name: fadeIn;
}
+64
View File
@@ -0,0 +1,64 @@
.aside-menu {
z-index: $zindex-sticky - 1;
width: $aside-menu-width;
color: $aside-menu-color;
background: $aside-menu-bg;
@include borders($aside-menu-borders);
.nav-tabs {
border-color: $border-color;
.nav-link {
padding: $aside-menu-nav-padding-y $aside-menu-nav-padding-x;
color: $body-color;
border-top: 0;
&.active {
color: theme-color("primary");
border-right-color: $border-color;
border-left-color: $border-color;
}
}
.nav-item:first-child {
.nav-link {
border-left: 0;
}
}
}
.tab-content {
position: relative;
overflow-x: hidden;
overflow-y: auto;
border: 0;
border-top: 1px solid $border-color;
-ms-overflow-style: -ms-autohiding-scrollbar;
&::-webkit-scrollbar {
width: 10px;
margin-left: -10px;
-webkit-appearance: none;
}
// &::-webkit-scrollbar-button { }
&::-webkit-scrollbar-track {
background-color: lighten($aside-menu-bg, 5%);
border-right: 1px solid darken($aside-menu-bg, 5%);
border-left: 1px solid darken($aside-menu-bg, 5%);
}
// &::-webkit-scrollbar-track-piece { }
&::-webkit-scrollbar-thumb {
height: 50px;
background-color: darken($aside-menu-bg, 10%);
background-clip: content-box;
border-color: transparent;
border-style: solid;
border-width: 1px 2px;
}
.tab-pane {
padding: 0;
}
}
}
+51
View File
@@ -0,0 +1,51 @@
.img-avatar {
border-radius: 50em;
}
.avatar {
$width: 36px;
$status-width: 10px;
@include avatar($width,$status-width);
}
.avatar.avatar-xs {
$width: 20px;
$status-width: 8px;
@include avatar($width,$status-width);
}
.avatar.avatar-sm {
$width: 24px;
$status-width: 8px;
@include avatar($width,$status-width);
}
.avatar.avatar-lg {
$width: 72px;
$status-width: 12px;
@include avatar($width,$status-width);
}
.avatars-stack {
.avatar.avatar-xs {
margin-right: -10px;
}
// .avatar.avatar-sm {
//
// }
.avatar {
margin-right: -15px;
transition: margin-left $layout-transition-speed, margin-right $layout-transition-speed;
&:hover {
margin-right: 0 !important;
}
}
// .avatar.avatar-lg {
//
// }
}
+3
View File
@@ -0,0 +1,3 @@
.badge-pill {
border-radius: $badge-pill-border-radius;
}
@@ -0,0 +1,35 @@
.breadcrumb-menu {
margin-left: auto;
&::before {
display: none;
}
.btn-group {
vertical-align: top;
}
.btn {
padding: 0 $input-btn-padding-x;
color: $text-muted;
vertical-align: top;
border: 0;
&:hover, &.active {
color: $body-color;
background: transparent;
}
}
.open {
.btn {
color: $body-color;
background: transparent;
}
}
.dropdown-menu {
min-width: 180px;
line-height: $line-height-base;
}
}
+4
View File
@@ -0,0 +1,4 @@
.breadcrumb {
position: relative;
@include borders($breadcrumb-borders);
}
+566
View File
@@ -0,0 +1,566 @@
button {
cursor: pointer;
}
.btn-transparent {
color: #fff;
background-color: transparent;
border-color: transparent;
}
.btn {
[class^="icon-"], [class*=" icon-"] {
display: inline-block;
margin-top: -2px;
vertical-align: middle;
}
}
.btn-facebook,
.btn-twitter,
.btn-linkedin,
.btn-flickr,
.btn-tumblr,
.btn-xing,
.btn-github,
.btn-html5,
.btn-openid,
.btn-stack-overflow,
.btn-youtube,
.btn-css3,
.btn-dribbble,
.btn-google-plus,
.btn-instagram,
.btn-pinterest,
.btn-vk,
.btn-yahoo,
.btn-behance,
.btn-dropbox,
.btn-reddit,
.btn-spotify,
.btn-vine,
.btn-foursquare,
.btn-vimeo {
position: relative;
overflow: hidden;
color: #fff !important;
text-align: center;
&::before {
position: absolute;
top: 0;
left: 0;
display: block;
font-family: "FontAwesome";
font-style: normal;
font-weight: normal;
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
}
&:hover {
color: #fff;
}
&.icon {
span {
display: none;
}
}
&.text {
&::before {
display: none;
}
span {
margin-left: 0 !important;
}
}
@include button-social-size($input-btn-padding-y, $input-btn-padding-x, $font-size-base, $line-height-base, $btn-border-radius);
&.btn-lg {
@include button-social-size($input-btn-padding-y-lg, $input-btn-padding-x-lg, $font-size-lg, $line-height-lg, $btn-border-radius-lg);
}
&.btn-sm {
@include button-social-size($input-btn-padding-y-sm, $input-btn-padding-x-sm, $font-size-sm, $line-height-sm, $btn-border-radius-sm);
}
}
.btn-facebook {
$color: $facebook;
background: $color;
&::before {
content: "\f09a";
background: darken($color, 5%);
}
&:hover {
background: darken($color, 5%);
&::before {
background: darken($color, 10%);
}
}
}
.btn-twitter {
$color: $twitter;
background: $color;
&::before {
content: "\f099";
background: darken($color, 5%);
}
&:hover {
background: darken($color, 5%);
&::before {
background: darken($color, 10%);
}
}
}
.btn-linkedin {
$color: $linkedin;
background: $color;
&::before {
content: "\f0e1";
background: darken($color, 5%);
}
&:hover {
background: darken($color, 5%);
&::before {
background: darken($color, 10%);
}
}
}
.btn-flickr {
$color: $flickr;
background: $color;
&::before {
content: "\f16e";
background: darken($color, 5%);
}
&:hover {
background: darken($color, 5%);
&::before {
background: darken($color, 10%);
}
}
}
.btn-tumblr {
$color: $tumblr;
background: $color;
&::before {
content: "\f173";
background: darken($color, 5%);
}
&:hover {
background: darken($color, 5%);
&::before {
background: darken($color, 10%);
}
}
}
.btn-xing {
$color: $xing;
background: $color;
&::before {
content: "\f168";
background: darken($color, 5%);
}
&:hover {
background: darken($color, 5%);
&::before {
background: darken($color, 10%);
}
}
}
.btn-github {
$color: $github;
background: $color;
&::before {
content: "\f09b";
background: darken($color, 5%);
}
&:hover {
background: darken($color, 5%);
&::before {
background: darken($color, 10%);
}
}
}
.btn-html5 {
$color: $html5;
background: $color;
&::before {
content: "\f13b";
background: darken($color, 5%);
}
&:hover {
background: darken($color, 5%);
&::before {
background: darken($color, 10%);
}
}
}
.btn-openid {
$color: $openid;
background: $color;
&::before {
content: "\f19b";
background: darken($color, 5%);
}
&:hover {
background: darken($color, 5%);
&::before {
background: darken($color, 10%);
}
}
}
.btn-stack-overflow {
$color: $stack-overflow;
background: $color;
&::before {
content: "\f16c";
background: darken($color, 5%);
}
&:hover {
background: darken($color, 5%);
&::before {
background: darken($color, 10%);
}
}
}
.btn-css3 {
$color: $css3;
background: $color;
&::before {
content: "\f13c";
background: darken($color, 5%);
}
&:hover {
background: darken($color, 5%);
&::before {
background: darken($color, 10%);
}
}
}
.btn-youtube {
$color: $youtube;
background: $color;
&::before {
content: "\f167";
background: darken($color, 5%);
}
&:hover {
background: darken($color, 5%);
&::before {
background: darken($color, 10%);
}
}
}
.btn-dribbble {
$color: $dribbble;
background: $color;
&::before {
content: "\f17d";
background: darken($color, 5%);
}
&:hover {
background: darken($color, 5%);
&::before {
background: darken($color, 10%);
}
}
}
.btn-google-plus {
$color: $google-plus;
background: $color;
&::before {
content: "\f0d5";
background: darken($color, 5%);
}
&:hover {
background: darken($color, 5%);
&::before {
background: darken($color, 10%);
}
}
}
.btn-instagram {
$color: $instagram;
background: $color;
&::before {
content: "\f16d";
background: darken($color, 5%);
}
&:hover {
background: darken($color, 5%);
&::before {
background: darken($color, 10%);
}
}
}
.btn-pinterest {
$color: $pinterest;
background: $color;
&::before {
content: "\f0d2";
background: darken($color, 5%);
}
&:hover {
background: darken($color, 5%);
&::before {
background: darken($color, 10%);
}
}
}
.btn-vk {
$color: $vk;
background: $color;
&::before {
content: "\f189";
background: darken($color, 5%);
}
&:hover {
background: darken($color, 5%);
&::before {
background: darken($color, 10%);
}
}
}
.btn-yahoo {
$color: $yahoo;
background: $color;
&::before {
content: "\f19e";
background: darken($color, 5%);
}
&:hover {
background: darken($color, 5%);
&::before {
background: darken($color, 10%);
}
}
}
.btn-behance {
$color: $behance;
background: $color;
&::before {
content: "\f1b4";
background: darken($color, 5%);
}
&:hover {
background: darken($color, 5%);
&::before {
background: darken($color, 10%);
}
}
}
.btn-dropbox {
$color: $dropbox;
background: $color;
&::before {
content: "\f16b";
background: darken($color, 5%);
}
&:hover {
background: darken($color, 5%);
&::before {
background: darken($color, 10%);
}
}
}
.btn-reddit {
$color: $reddit;
background: $color;
&::before {
content: "\f1a1";
background: darken($color, 5%);
}
&:hover {
background: darken($color, 5%);
&::before {
background: darken($color, 10%);
}
}
}
.btn-spotify {
$color: $spotify;
background: $color;
&::before {
content: "\f1bc";
background: darken($color, 5%);
}
&:hover {
background: darken($color, 5%);
&::before {
background: darken($color, 10%);
}
}
}
.btn-vine {
$color: $vine;
background: $color;
&::before {
content: "\f1ca";
background: darken($color, 5%);
}
&:hover {
background: darken($color, 5%);
&::before {
background: darken($color, 10%);
}
}
}
.btn-foursquare {
$color: $foursquare;
background: $color;
&::before {
content: "\f180";
background: darken($color, 5%);
}
&:hover {
background: darken($color, 5%);
&::before {
background: darken($color, 10%);
}
}
}
.btn-vimeo {
$color: $vimeo;
background: $color;
&::before {
content: "\f194";
background: darken($color, 5%);
}
&:hover {
background: darken($color, 5%);
&::before {
background: darken($color, 10%);
}
}
}
+55
View File
@@ -0,0 +1,55 @@
.callout {
position: relative;
padding: 0 $spacer;
margin: $spacer 0;
border: 0 solid $border-color;
border-left-width: .25rem;
@if $enable-rounded {
border-radius: .25rem;
}
.chart-wrapper {
position: absolute;
top: 10px;
left: 50%;
float: right;
width: 50%;
}
}
.callout-bordered {
border: 1px solid $border-color;
border-left-width: .25rem;
}
.callout code {
border-radius: .25rem;
}
.callout h4 {
margin-top: 0;
margin-bottom: .25rem;
}
.callout p:last-child {
margin-bottom: 0;
}
.callout + .callout {
margin-top: - .25rem;
}
.callout-default {
border-left-color: $text-muted;
h4 {
color: $text-muted;
}
}
@each $color, $value in $theme-colors {
.callout-#{$color} {
border-left-color: $value;
h4 {
color: $value;
}
}
}
+193
View File
@@ -0,0 +1,193 @@
.card {
margin-bottom: 1.5 * $spacer;
// Cards with color accent
@each $color, $value in $theme-colors {
&.bg-#{$color} {
border-color: darken($value, 12.5%);
.card-header {
background-color: darken($value, 3%);
border-color: darken($value, 12.5%);
}
}
}
}
.text-white .text-muted {
color: rgba(255,255,255,.6) !important;
}
.card-header {
.icon-bg {
display: inline-block;
padding: $card-spacer-y $card-spacer-x !important;
margin-top: -$card-spacer-y;
margin-right: $card-spacer-x;
margin-bottom: -$card-spacer-y;
margin-left: -$card-spacer-x;
line-height: inherit;
color: $card-icon-color;
vertical-align: bottom;
background: $card-icon-bg;
border-right: $card-border-width solid $card-border-color;
}
.nav.nav-tabs {
margin-top: -$card-spacer-y;
margin-bottom: -$card-spacer-y;
border-bottom: 0;
.nav-item {
border-top: 0;
}
.nav-link {
padding: $card-spacer-y $card-spacer-x / 2;
color: $text-muted;
border-top: 0;
&.active {
color: $body-color;
background: #fff;
}
}
}
&.card-header-inverse {
color: #fff;
}
.btn {
margin-top: - $input-btn-padding-y;
}
.btn-sm {
margin-top: - $input-btn-padding-y-sm;
}
.btn-lg {
margin-top: - $input-btn-padding-y-lg;
}
}
//
.card-footer {
ul {
display: table;
width: 100%;
padding: 0;
margin: 0;
table-layout: fixed;
li {
display: table-cell;
padding: 0 $card-spacer-x;
text-align: center;
}
}
}
[class*="card-outline-"] {
.card-body {
background: #fff !important;
}
&.card-outline-top {
border-top-width: 2px;
border-right-color: $border-color;
border-bottom-color: $border-color;
border-left-color: $border-color;
}
}
// Cards with color accent
@each $color, $value in $theme-colors {
.card-accent-#{$color} {
@include card-accent-variant($value);
}
}
// Card Actions
.card-header {
> i {
margin-right: $spacer / 2;
}
.card-actions {
position: absolute;
top: 0;
right: 0;
//height: inherit;
a, button {
display: block;
float: left;
width: 50px;
padding: $card-spacer-y 0;
margin: 0 !important;
color: $body-color;
text-align: center;
background: transparent;
border: 0;
border-left: 1px solid $border-color;
box-shadow: 0;
&:hover {
text-decoration: none;
}
[class^="icon-"], [class*=" icon-"] {
display: inline-block;
vertical-align: middle;
}
i {
display: inline-block;
transition: .4s;
}
.r180 {
transform: rotate(180deg);
}
}
.input-group {
width: 230px;
margin: 6px;
.input-group-prepend, .input-group-append {
background: #fff;
}
input {
border-left: 0;
}
}
}
}
.card-full {
margin-top: - $spacer;
margin-right: - $grid-gutter-width / 2;
margin-left: - $grid-gutter-width / 2;
border: 0;
border-bottom: $card-border-width solid $border-color;
}
@include media-breakpoint-up(sm) {
.card-columns {
&.cols-2 {
column-count: 2;
}
}
}
.card {
&.drag, .drag {
cursor: move;
}
}
.card-placeholder {
background: rgba(0,0,0,.025);
border: 1px dashed $gray-300;
}
+9
View File
@@ -0,0 +1,9 @@
.chart-wrapper {
canvas {
width: 100% !important;
}
}
// scss-lint:disable QualifyingElement
base-chart.chart {
display: block !important;
}
@@ -0,0 +1,8 @@
// Temp fix for reactstrap
.app-header {
.navbar-nav {
.dropdown-menu-right {
right: auto;
}
}
}
+69
View File
@@ -0,0 +1,69 @@
// Links, buttons, and more within the dropdown menu
.dropdown-item {
position: relative;
padding: 10px 20px;
border-bottom: 1px solid $dropdown-border-color;
&:last-child {
border-bottom: 0;
}
i {
display: inline-block;
width: 20px;
margin-right: 10px;
margin-left: -10px;
color: $dropdown-border-color;
text-align: center;
}
.badge {
position: absolute;
right: 10px;
margin-top: 2px;
}
}
// Dropdown section headers
.dropdown-header {
padding: 8px 20px;
background: $dropdown-divider-bg;
border-bottom: 1px solid $dropdown-border-color;
.btn {
margin-top: -7px;
color: $dropdown-header-color;
&:hover {
color: $body-color;
}
&.pull-right {
margin-right: -20px;
}
}
}
.dropdown-menu-lg {
width: 250px;
}
.app-header {
.navbar-nav {
.dropdown-menu {
position: absolute;
}
// Menu positioning
//
// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown
// menu with the parent.
.dropdown-menu-right {
right: 0;
left: auto; // Reset the default from `.dropdown-menu`
}
.dropdown-menu-left {
right: auto;
left: 0;
}
}
}
+9
View File
@@ -0,0 +1,9 @@
.app-footer {
display: flex;
flex-wrap: wrap;
align-items: center;
padding: 0 $spacer;
color: $footer-color;
background: $footer-bg;
@include borders($footer-borders);
}
+15
View File
@@ -0,0 +1,15 @@
.row.row-equal {
padding-right: ($grid-gutter-width / 4);
padding-left: ($grid-gutter-width / 4);
margin-right: ($grid-gutter-width / -2);
margin-left: ($grid-gutter-width / -2);
[class*="col-"] {
padding-right: ($grid-gutter-width / 4);
padding-left: ($grid-gutter-width / 4);
}
}
.main .container-fluid {
padding: 0 30px;
}
+5
View File
@@ -0,0 +1,5 @@
.input-group-prepend,
.input-group-append {
white-space: nowrap;
vertical-align: middle; // Match the inputs
}
+387
View File
@@ -0,0 +1,387 @@
// IE10&11 Flexbox fix
@media all and (-ms-high-contrast:none) {
html {
display: flex;
flex-direction: column;
}
}
// app-dashboard and app-root are Angular2+ selectors. You can add here your own selectors if you need.
.app,
app-dashboard,
app-root {
display: flex;
flex-direction: column;
min-height: 100vh;
}
.app-header {
flex: 0 0 $navbar-height;
}
.app-footer {
flex: 0 0 $footer-height;
}
.app-body {
display: flex;
flex-direction: row;
flex-grow: 1;
overflow-x: hidden;
.main {
flex: 1;
min-width: 0;
}
.sidebar {
// $sidebar-width is the width of the columns
flex: 0 0 $sidebar-width;
// put the nav on the left
order: -1;
}
.aside-menu {
// $aside-menu-width is the width of the columns
flex: 0 0 $aside-menu-width;
}
}
//
// header
//
.header-fixed {
.app-header {
position: fixed;
z-index: $zindex-sticky;
width: 100%;
}
.app-body {
margin-top: $navbar-height;
}
}
//
// Sidebar
//
.sidebar-hidden {
.sidebar {
margin-left: - $sidebar-width;
}
}
.sidebar-fixed {
.sidebar {
position: fixed;
z-index: $zindex-sticky - 1;
width: $sidebar-width;
height: calc(100vh - #{$navbar-height});
// margin-top: - $navbar-height;
// .sidebar-nav {
// height: calc(100vh - #{$navbar-height});
// }
}
.main, .app-footer {
margin-left: $sidebar-width;
}
&.sidebar-hidden {
.main, .app-footer {
margin-left: 0;
}
}
}
.sidebar-off-canvas {
.sidebar {
position: fixed;
z-index: $zindex-sticky - 1;
height: calc(100vh - #{$navbar-height});
}
}
@include media-breakpoint-up(lg) {
.sidebar-compact {
.sidebar {
flex: 0 0 $sidebar-compact-width;
}
&.sidebar-hidden {
.sidebar {
margin-left: - $sidebar-compact-width;
}
}
&.sidebar-fixed {
.main, .app-footer {
margin-left: $sidebar-compact-width;
}
.sidebar {
width: $sidebar-compact-width;
}
&.sidebar-hidden {
.main, .app-footer {
margin-left: 0;
}
}
}
.sidebar-minimizer {
display: none;
}
}
.sidebar-minimized {
.sidebar {
flex: 0 0 $sidebar-minimized-width;
}
&.sidebar-hidden {
.sidebar {
margin-left: - $sidebar-minimized-width;
}
}
&.sidebar-fixed {
.main, .app-footer {
margin-left: $sidebar-minimized-width;
}
.sidebar {
width: $sidebar-minimized-width;
}
&.sidebar-hidden {
.main, .app-footer {
margin-left: 0;
}
}
}
}
}
//
// Aside Menu
//
.aside-menu-hidden {
.aside-menu {
margin-right: - $aside-menu-width;
}
}
.aside-menu-fixed {
.aside-menu {
position: fixed;
right: 0;
height: 100%;
.tab-content {
height: calc(100vh - #{$aside-menu-nav-padding-y * 2 + $font-size-base} - #{$navbar-height});
}
}
.main, .app-footer {
margin-right: $aside-menu-width;
}
&.aside-menu-hidden {
.main, .app-footer {
margin-right: 0;
}
}
}
.aside-menu-off-canvas {
.aside-menu {
position: fixed;
right: 0;
z-index: $zindex-sticky - 1;
height: 100%;
.tab-content {
height: calc(100vh - #{$aside-menu-nav-padding-y * 2 + $font-size-base} - #{$navbar-height});
}
}
}
//
// Breadcrumb
//
.breadcrumb-fixed {
.main {
$breadcrumb-height: 2 * $breadcrumb-padding-y + $font-size-base + 1.5 * $spacer;
padding-top: $breadcrumb-height;
}
.breadcrumb {
position: fixed;
top: $navbar-height;
right: 0;
left: 0;
z-index: $zindex-sticky - 2;
}
// if sidebar + main + aside
.main:nth-child(2) {
.breadcrumb {
right: $aside-menu-width;
left: $sidebar-width;
}
}
// if sidebar + main
.main:first-child {
.breadcrumb {
right: $aside-menu-width;
left: 0;
}
}
// if main + aside
.main:last-child {
.breadcrumb {
right: 0;
}
}
&.sidebar-minimized {
.main .breadcrumb {
left: $sidebar-minimized-width;
}
}
&.sidebar-hidden, &.sidebar-off-canvas {
.main .breadcrumb {
left: 0;
}
}
&.aside-menu-hidden, &.aside-menu-off-canvas {
.main .breadcrumb {
right: 0;
}
}
}
//
// Footer
//
.footer-fixed {
.app-footer {
position: fixed;
right: 0;
bottom: 0;
left: 0;
z-index: $zindex-sticky;
height: $footer-height;
}
.app-body {
margin-bottom: $footer-height;
}
}
//
// Animations
//
.app-header,
.app-footer,
.sidebar,
.main,
.aside-menu {
transition: margin-left $layout-transition-speed, margin-right $layout-transition-speed, width $layout-transition-speed, flex $layout-transition-speed;
}
.sidebar-nav {
transition: width $layout-transition-speed;
}
.breadcrumb {
transition: left $layout-transition-speed, right $layout-transition-speed, width $layout-transition-speed;
}
//
// Mobile layout
//
@include media-breakpoint-down(md) {
.app-header.navbar {
position: fixed !important;
z-index: $zindex-sticky;
width: 100%;
text-align: center;
background-color: $navbar-brand-bg;
@include borders($navbar-brand-border);
.navbar-toggler {
@if (lightness( $navbar-brand-bg ) > 40) {
color: $navbar-color;
} @else {
color: #fff;
}
}
.navbar-brand {
position: absolute;
left: 50%;
margin-left: - ($navbar-brand-width / 2);
}
}
.app-body {
margin-top: $navbar-height;
}
.breadcrumb-fixed {
.main:nth-child(2) .breadcrumb {
right: auto;
left: auto;
width: 100%;
}
}
.sidebar {
position: fixed;
z-index: $zindex-sticky - 1;
width: $mobile-sidebar-width;
height: calc(100vh - #{$navbar-height});
margin-left: - $mobile-sidebar-width;
.sidebar-nav,
.nav {
width: $mobile-sidebar-width;
min-height: calc(100vh - #{$navbar-height});
}
.sidebar-minimizer {
display: none;
}
}
.main, .app-footer {
margin-left: 0 !important;
}
// .aside-menu {
// margin-right: - $aside-menu-width;
// }
.sidebar-hidden {
.sidebar {
margin-left: - $mobile-sidebar-width;
}
}
.sidebar-mobile-show {
.sidebar {
width: $mobile-sidebar-width;
margin-left: 0;
}
.main {
margin-right: - $mobile-sidebar-width !important;
margin-left: $mobile-sidebar-width !important;
}
}
}
+128
View File
@@ -0,0 +1,128 @@
// Angular Version
// Make clicks pass-through
// scss-lint:disable all
#loading-bar,
#loading-bar-spinner {
-webkit-pointer-events: none;
pointer-events: none;
-moz-transition: 350ms linear all;
-o-transition: 350ms linear all;
-webkit-transition: 350ms linear all;
transition: 350ms linear all;
}
#loading-bar.ng-enter,
#loading-bar.ng-leave.ng-leave-active,
#loading-bar-spinner.ng-enter,
#loading-bar-spinner.ng-leave.ng-leave-active {
opacity: 0;
}
#loading-bar.ng-enter.ng-enter-active,
#loading-bar.ng-leave,
#loading-bar-spinner.ng-enter.ng-enter-active,
#loading-bar-spinner.ng-leave {
opacity: 1;
}
#loading-bar .bar {
position: fixed;
top: 0;
left: 0;
z-index: 20002;
width: 100%;
height: 2px;
background: theme-color("primary");
border-top-right-radius: 1px;
border-bottom-right-radius: 1px;
-moz-transition: width 350ms;
-o-transition: width 350ms;
-webkit-transition: width 350ms;
transition: width 350ms;
}
// Fancy blur effect
#loading-bar .peg {
position: absolute;
top: 0;
right: 0;
width: 70px;
height: 2px;
-moz-border-radius: 100%;
-webkit-border-radius: 100%;
border-radius: 100%;
-moz-box-shadow: #29d 1px 0 6px 1px;
-ms-box-shadow: #29d 1px 0 6px 1px;
-webkit-box-shadow: #29d 1px 0 6px 1px;
box-shadow: #29d 1px 0 6px 1px;
opacity: .45;
}
#loading-bar-spinner {
position: fixed;
top: 10px;
left: 10px;
z-index: 10002;
display: block;
}
#loading-bar-spinner .spinner-icon {
width: 14px;
height: 14px;
border: solid 2px transparent;
border-top-color: #29d;
border-left-color: #29d;
border-radius: 50%;
-moz-animation: loading-bar-spinner 400ms linear infinite;
-ms-animation: loading-bar-spinner 400ms linear infinite;
-o-animation: loading-bar-spinner 400ms linear infinite;
-webkit-animation: loading-bar-spinner 400ms linear infinite;
animation: loading-bar-spinner 400ms linear infinite;
}
@-webkit-keyframes loading-bar-spinner {
0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); }
100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); }
}
@-moz-keyframes loading-bar-spinner {
0% { -moz-transform: rotate(0deg); transform: rotate(0deg); }
100% { -moz-transform: rotate(360deg); transform: rotate(360deg); }
}
@-o-keyframes loading-bar-spinner {
0% { -o-transform: rotate(0deg); transform: rotate(0deg); }
100% { -o-transform: rotate(360deg); transform: rotate(360deg); }
}
@-ms-keyframes loading-bar-spinner {
0% { -ms-transform: rotate(0deg); transform: rotate(0deg); }
100% { -ms-transform: rotate(360deg); transform: rotate(360deg); }
}
@keyframes loading-bar-spinner {
0% { transform: rotate(0deg); transform: rotate(0deg); }
100% { transform: rotate(360deg); transform: rotate(360deg); }
}
//Ajax & Static Version
.pace {
-webkit-pointer-events: none;
pointer-events: none;
-moz-user-select: none;
-webkit-user-select: none;
user-select: none;
}
.pace-inactive {
display: none;
}
.pace .pace-progress {
position: fixed;
top: 0;
right: 100%;
z-index: 2000;
width: 100%;
height: 2px;
background: theme-color("primary");
}
+116
View File
@@ -0,0 +1,116 @@
@mixin button-social-size($padding-y, $padding-x, $font-size, $line-height, $border-radius) {
padding: $padding-y $padding-x;
font-size: $font-size;
line-height: $line-height;
border: 0;
@include border-radius($border-radius);
&::before {
width: ($padding-y * 2) + ($font-size * $line-height);
height: ($padding-y * 2) + ($font-size * $line-height);
padding: $padding-y 0;
font-size: $font-size;
line-height: $line-height;
@include border-radius($border-radius);
}
span {
margin-left: ($padding-y * 2) + ($font-size * $line-height);
}
&.icon {
width: ($padding-y * 2) + ($font-size * $line-height);
height: ($padding-y * 2) + ($font-size * $line-height);
}
}
@mixin avatar($width, $status-width) {
position: relative;
display: inline-block;
width: $width;
.img-avatar {
width: $width;
height: $width;
}
.avatar-status {
position: absolute;
right: 0;
bottom: 0;
display: block;
width: $status-width;
height: $status-width;
border: 1px solid #fff;
border-radius: 50em;
}
}
@mixin borders($borders) {
@each $border in $borders {
$direction: nth($border, 1);
@if $direction == "all" {
$size: map-get(map-get($borders, $direction), size);
$style: map-get(map-get($borders, $direction), style);
$color: map-get(map-get($borders, $direction), color);
border: $size $style $color;
} @else if $direction == "top" {
$size: map-get(map-get($borders, $direction), size);
$style: map-get(map-get($borders, $direction), style);
$color: map-get(map-get($borders, $direction), color);
border-top: $size $style $color;
} @else if $direction == "right" {
$size: map-get(map-get($borders, $direction), size);
$style: map-get(map-get($borders, $direction), style);
$color: map-get(map-get($borders, $direction), color);
border-right: $size $style $color;
} @else if $direction == "bottom" {
$size: map-get(map-get($borders, $direction), size);
$style: map-get(map-get($borders, $direction), style);
$color: map-get(map-get($borders, $direction), color);
border-bottom: $size $style $color;
} @else if $direction == "left" {
$size: map-get(map-get($borders, $direction), size);
$style: map-get(map-get($borders, $direction), style);
$color: map-get(map-get($borders, $direction), color);
border-left: $size $style $color;
}
}
}
@mixin sidebar-width($borders, $width) {
$sidebar-width: $width;
@each $border in $borders {
$direction: nth($border, 1);
@if $direction == "all" {
$size: map-get(map-get($borders, $direction), size);
$sidebar-width: ($sidebar-width - (2 * $size));
} @else if $direction == "right" {
$size: map-get(map-get($borders, $direction), size);
$sidebar-width: $sidebar-width - $size;
} @else if $direction == "left" {
$size: map-get(map-get($borders, $direction), size);
$sidebar-width: $sidebar-width - $size;
}
width: $sidebar-width;
}
}
@mixin bg-variant($parent, $color) {
#{$parent} {
@include border-radius($card-border-radius-inner $card-border-radius-inner $card-border-radius-inner $card-border-radius-inner);
color: #fff !important;
background-color: $color !important;
}
a#{$parent} {
@include hover-focus {
background-color: darken($color, 10%);
}
}
}
@mixin card-accent-variant($color) {
border-top-width: 2px;
border-top-color: $color;
}
View File
+13
View File
@@ -0,0 +1,13 @@
@each $color, $value in $theme-colors {
.modal-#{$color} {
.modal-content {
border-color: $value;
}
.modal-header {
color: #fff;
background-color: $value;
}
}
}
+35
View File
@@ -0,0 +1,35 @@
.nav-tabs {
.nav-link {
color: $gray-600;
&:hover {
cursor: pointer;
}
&.active {
color: $gray-800;
background: #fff;
border-color: $border-color;
border-bottom-color: #fff;
&:focus {
background: #fff;
border-color: $border-color;
border-bottom-color: #fff;
}
}
}
}
.tab-content {
margin-top: -1px;
background: #fff;
border: 1px solid $border-color;
.tab-pane {
padding: $spacer;
}
}
.card-block {
.tab-content {
margin-top: 0;
border: 0;
}
}
+127
View File
@@ -0,0 +1,127 @@
.app-header.navbar {
position: relative;
flex-direction: row;
height: $navbar-height;
padding: 0;
margin: 0;
background-color: $navbar-bg;
@include borders($navbar-border);
.navbar-brand {
display: inline-block;
width: $navbar-brand-width;
height: $navbar-height;
padding: $navbar-padding-y $navbar-padding-x;
margin-right: 0;
background-color: $navbar-brand-bg;
background-image: $navbar-brand-logo;
background-repeat: no-repeat;
background-position: center center;
background-size: $navbar-brand-logo-size;
@include borders($navbar-brand-border);
}
.navbar-toggler {
min-width: 50px;
padding: $navbar-toggler-padding-y 0;
&:hover .navbar-toggler-icon {
background-image: $navbar-toggler-icon-hover;
}
}
.navbar-toggler-icon {
height: 23px;
background-image: $navbar-toggler-icon;
}
.navbar-nav {
flex-direction: row;
align-items: center;
}
.nav-item {
position: relative;
min-width: 50px;
margin: 0 !important;
text-align: center;
button {
margin: 0 auto;
}
.nav-link {
padding-top: 0;
padding-bottom: 0;
background: 0;
border: 0;
.badge {
position: absolute;
top: 50%;
left: 50%;
margin-top: -16px;
margin-left: 0;
}
> .img-avatar {
height: $navbar-height - 20px;
margin: 0 10px;
}
}
}
.dropdown-menu {
padding-bottom: 0;
line-height: $line-height-base;
}
.dropdown-item {
min-width: 180px;
}
}
.navbar-brand {
color: $navbar-active-color;
@include hover-focus {
color: $navbar-active-color;
}
}
.navbar-nav {
.nav-link {
color: $navbar-color;
@include hover-focus {
color: $navbar-hover-color;
}
}
.open > .nav-link,
.active > .nav-link,
.nav-link.open,
.nav-link.active {
@include plain-hover-focus {
color: $navbar-active-color;
}
}
}
.navbar-divider {
background-color: rgba(0,0,0,.075);
}
@include media-breakpoint-up(lg) {
.brand-minimized {
.app-header.navbar {
.navbar-brand {
width: $navbar-brand-minimized-width;
background-color: $navbar-brand-minimized-bg;
background-image: $navbar-brand-minimized-logo;
background-size: $navbar-brand-minimized-logo-size;
@include borders($navbar-brand-minimized-border);
}
}
}
}
+4
View File
@@ -0,0 +1,4 @@
// scss-lint:disable QualifyingElement
hr.transparent {
border-top: 1px solid transparent;
}
+15
View File
@@ -0,0 +1,15 @@
.progress-xs {
height: 4px;
}
.progress-sm {
height: 8px;
}
// White progress bar
.progress-white {
background-color: rgba(255,255,255,.2) !important;
.progress-bar {
background-color: #fff;
}
}
+281
View File
@@ -0,0 +1,281 @@
//
// RTL Support
//
// scss-lint:disable NestingDepth, SelectorDepth
*[dir="rtl"] {
direction: rtl;
unicode-bidi: embed;
ul {
-webkit-padding-start: 0;
}
table tr th {
text-align: right;
}
// Breadcrumb
.breadcrumb-item {
float: right;
}
.breadcrumb-menu {
right: auto;
left: $breadcrumb-padding-x;
}
// Dropdown
.dropdown-item {
text-align: right;
i {
margin-right: -10px;
margin-left: 10px;
}
.badge {
right: auto;
left: 10px;
}
}
//
// Sidebar
//
.sidebar-hidden {
.sidebar {
margin-right: - $sidebar-width;
}
}
.sidebar-fixed {
.main, .app-footer {
margin-right: $sidebar-width;
}
&.sidebar-hidden {
.main, .app-footer {
margin-right: 0;
}
}
}
.sidebar-minimized {
.sidebar {
flex: 0 0 $sidebar-minimized-width;
}
&.sidebar-hidden {
.sidebar {
margin-right: - $sidebar-minimized-width;
margin-left: 0;
}
}
&.sidebar-fixed {
.main, .app-footer {
margin-right: $sidebar-minimized-width;
}
&.sidebar-hidden {
.main, .app-footer {
margin-left: 0;
}
}
}
}
//
// Aside Menu
//
.aside-menu-hidden {
.aside-menu {
margin-right: 0;
margin-left: - $aside-menu-width;
}
}
.aside-menu-fixed {
.aside-menu {
right: auto;
left: 0;
}
.main, .app-footer {
//margin-right: 0;
margin-left: $aside-menu-width;
}
&.aside-menu-hidden {
.main, .app-footer {
margin-left: 0;
}
}
}
.aside-menu-off-canvas {
.aside-menu {
position: fixed;
right: 0;
z-index: $zindex-sticky - 1;
height: 100%;
.tab-content {
height: calc(100vh - #{$aside-menu-nav-padding-y * 2 + $font-size-base} - #{$navbar-height});
}
}
}
// Sidebar Menu
.sidebar {
.sidebar-nav {
.nav {
.nav-item {
.nav-link {
direction: rtl;
i {
margin: 0 0 0 ($sidebar-nav-link-padding-x / 2);
}
.badge {
float: left;
margin-top: 2px;
// margin-left: 10px;
}
&.nav-dropdown-toggle {
&::before {
position: absolute;
right: auto !important;
left: $sidebar-nav-link-padding-x;
transform: rotate(180deg);
}
}
}
&.nav-dropdown {
&.open {
> .nav-link.nav-dropdown-toggle::before {
transform: rotate(270deg);
}
}
}
}
}
}
}
.sidebar-minimized .sidebar {
.nav-link {
padding-right: 0;
i {
float: right;
padding: 0;
margin: 0;
}
.badge {
right: auto;
left: 15px;
}
}
.nav > .nav-dropdown {
&:hover {
> .nav-dropdown-items {
right: $sidebar-minimized-width;
left: 0;
}
}
}
}
// Horizontal bars
.horizontal-bars {
li {
.bars {
padding-right: 100px;
padding-left: 0;
.progress:first-child {
margin-bottom: 2px;
}
}
}
&.type-2 {
li {
i {
margin-right: 5px;
margin-left: $spacer;
}
.value {
float: left;
font-weight: 600;
}
.bars {
padding: 0;
}
}
}
}
// Icon list
.icons-list {
li {
position: relative;
height: 40px;
vertical-align: middle;
i {
float: right;
}
.desc {
margin-right: 50px;
margin-left: 0;
}
.value {
right: auto;
left: 45px;
text-align: left;
strong {
display: block;
margin-top: -3px;
}
}
.actions {
right: auto;
left: 10px;
}
}
}
// Callouts
.callout {
border: 0 solid $border-color;
border-right-width: .25rem;
@each $color, $value in $theme-colors {
&.callout-#{$color} {
border-right-color: $value;
}
}
.chart-wrapper {
left: 0;
float: left;
}
}
.callout-default {
border-right-color: $text-muted;
}
}
+454
View File
@@ -0,0 +1,454 @@
// scss-lint:disable NestingDepth, SelectorDepth
.sidebar {
display: flex;
flex-direction: column;
padding: $sidebar-padding;
color: $sidebar-color;
background: $sidebar-bg;
@include borders($sidebar-borders);
.sidebar-close {
position: absolute;
right: 0;
display: none;
padding: 0 $spacer;
font-size: 24px;
font-weight: 800;
line-height: $navbar-height;
color: $sidebar-color;
background: 0;
border: 0;
opacity: .8;
&:hover {
opacity: 1;
}
}
// Will be added soon
// .sidebar-brand { }
.sidebar-header {
flex: 0 0 $sidebar-header-height;
padding: $sidebar-header-padding-y $sidebar-header-padding-x;
text-align: center;
background: $sidebar-header-bg;
}
.sidebar-form .form-control {
color: $sidebar-form-color;
background: $sidebar-form-bg;
border: $sidebar-form-border;
&::placeholder {
color: $sidebar-form-placeholder-color;
}
}
.sidebar-nav {
position: relative;
flex: 1;
overflow-x: hidden;
overflow-y: auto;
-ms-overflow-style: -ms-autohiding-scrollbar;
@include sidebar-width($sidebar-borders, $sidebar-width);
&::-webkit-scrollbar {
position: absolute;
width: 10px;
margin-left: -10px;
-webkit-appearance: none;
}
&::-webkit-scrollbar-track {
background-color: lighten($sidebar-bg, 5%);
border-right: 1px solid darken($sidebar-bg, 5%);
border-left: 1px solid darken($sidebar-bg, 5%);
}
&::-webkit-scrollbar-thumb {
height: 50px;
background-color: darken($sidebar-bg, 10%);
background-clip: content-box;
border-color: transparent;
border-style: solid;
border-width: 1px 2px;
}
}
.nav {
@include sidebar-width($sidebar-borders, $sidebar-width);
flex-direction: column;
min-height: 100%;
}
.nav-title {
padding: $sidebar-nav-title-padding-y $sidebar-nav-title-padding-x;
font-size: 11px;
font-weight: 600;
color: $sidebar-nav-title-color;
text-transform: uppercase;
}
.nav-divider, .divider {
height: 10px;
}
.nav-item {
position: relative;
margin: 0;
transition: background .3s ease-in-out;
}
.nav-dropdown-items {
max-height: 0;
padding: 0;
margin: 0;
overflow-y: hidden;
transition: max-height .3s ease-in-out;
.nav-item {
padding: 0;
list-style: none;
}
}
.nav-link {
display: block;
padding: $sidebar-nav-link-padding-y $sidebar-nav-link-padding-x;
color: $sidebar-nav-link-color;
text-decoration: none;
background: $sidebar-nav-link-bg;
@include borders($sidebar-nav-link-borders);
@if $enable-sidebar-nav-rounded {
border-radius: $border-radius;
}
i {
display: inline-block;
width: 20px;
margin: 0 ($sidebar-nav-link-padding-x / 2) 0 0;
font-size: 14px;
color: $sidebar-nav-link-icon-color;
text-align: center;
}
.badge {
float: right;
margin-top: 2px;
}
&.active {
color: $sidebar-nav-link-active-color;
background: $sidebar-nav-link-active-bg;
@include borders($sidebar-nav-link-active-borders);
i {
color: $sidebar-nav-link-active-icon-color;
}
}
&:hover {
color: $sidebar-nav-link-hover-color;
background: $sidebar-nav-link-hover-bg;
@include borders($sidebar-nav-link-hover-borders);
i {
color: $sidebar-nav-link-hover-icon-color;
}
&.nav-dropdown-toggle::before {
background-image: $sidebar-nav-dropdown-indicator-hover;
}
}
@each $color, $value in $theme-colors {
&.nav-link-#{$color} {
background: $value;
i {
color: rgba(255,255,255,.7);
}
&:hover {
background: darken($value,5%) !important;
i {
color: #fff;
}
}
}
}
}
// ex. <a class="nav-link nav-dropdown-toggle" href="#">Components</a>
.nav-dropdown-toggle {
position: relative;
&::before {
position: absolute;
top: 50%;
right: $sidebar-nav-link-padding-x;
display: block;
width: 8px;
height: 8px;
padding: 0;
margin-top: -4px;
content: "";
background-image: $sidebar-nav-dropdown-indicator;
background-repeat: no-repeat;
background-position: center;
transition: transform .3s;
}
}
// ex. <li class="nav-item nav-dropdown">
.nav-dropdown.open {
background: $sidebar-nav-dropdown-bg;
@include borders($sidebar-nav-dropdown-borders);
@if $enable-sidebar-nav-rounded {
border-radius: $border-radius;
}
> .nav-dropdown-items {
max-height: 1500px;
}
.nav-link {
color: $sidebar-nav-dropdown-color;
border-left: 0 !important;
}
> .nav-link.nav-dropdown-toggle::before {
transform: rotate(-90deg);
}
.nav-dropdown.open {
border-left: 0;
}
}
.nav-label {
display: block;
padding: ($sidebar-nav-link-padding-y / 8) $sidebar-nav-link-padding-x;
color: $sidebar-nav-title-color;
&:hover {
color: $sidebar-color;
text-decoration: none;
}
i {
width: 20px;
margin: -3px ($sidebar-nav-link-padding-x / 2) 0 0;
font-size: 10px;
color: $sidebar-nav-link-icon-color;
text-align: center;
vertical-align: middle;
}
}
@if (lightness( $sidebar-bg ) < 40) {
.progress {
background-color: lighten($sidebar-bg, 15%) !important;
}
}
.sidebar-footer {
flex: 0 0 $sidebar-footer-height;
padding: $sidebar-footer-padding-y $sidebar-footer-padding-x;
background: $sidebar-footer-bg;
@include borders($sidebar-footer-borders);
}
.sidebar-minimizer {
position: relative;
flex: 0 0 $sidebar-minimizer-height;
background-color: $sidebar-minimizer-bg;
border: 0;
@include borders($sidebar-minimizer-borders);
&::before {
position: absolute;
top: 0;
right: 0;
width: $sidebar-minimizer-height;
height: $sidebar-minimizer-height;
content: "";
background-image: $sidebar-minimizer-indicator;
background-repeat: no-repeat;
background-position: center;
background-size: $sidebar-minimizer-height / 4;
transition: .3s;
}
&:focus,
&.focus {
outline: 0;
}
&:hover {
background-color: $sidebar-minimizer-hover-bg;
&::before {
background-image: $sidebar-minimizer-hover-indicator;
}
}
}
}
@include media-breakpoint-up(lg) {
.sidebar-compact {
.sidebar {
.sidebar-nav {
@include sidebar-width($sidebar-borders, $sidebar-compact-width);
}
.nav {
@include sidebar-width($sidebar-borders, $sidebar-compact-width);
.nav-title {
text-align: center;
}
.nav-item {
width: $sidebar-compact-width;
border-left: 0 !important;
.nav-link {
text-align: center;
i {
display: block;
width: 100%;
margin: $spacer / 4 0;
font-size: 24px;
}
.badge {
position: absolute;
top: 18px;
right: 10px;
}
&.nav-dropdown-toggle {
&::before {
top: 30px;
}
}
}
}
}
}
}
// Minimized Sidebar
.sidebar-minimized {
.hidden-cn {
display: none;
}
.sidebar {
z-index: $zindex-sticky - 1;
.sidebar-nav {
overflow: visible;
@include sidebar-width($sidebar-borders, $sidebar-minimized-width);
}
.nav {
@include sidebar-width($sidebar-borders, $sidebar-minimized-width);
}
.nav-divider, .divider,
.nav-title,
.sidebar-footer,
.sidebar-form,
.sidebar-header {
display: none;
}
.sidebar-minimizer::before {
width: 100%;
transform: rotate(-180deg);
}
.nav-item {
width: $sidebar-minimized-width;
overflow: hidden;
border-left: 0 !important;
&:hover {
width: $sidebar-width + $sidebar-minimized-width;
overflow: visible;
> .nav-link {
background: $sidebar-nav-link-hover-bg;
i {
color: $sidebar-nav-link-hover-color;
}
}
}
}
.nav-link {
position: relative;
padding-left: 0;
margin: 0;
white-space: nowrap;
border-left: 0 !important;
i {
display: block;
float: left;
width: $sidebar-minimized-height;
// padding: 0;
// margin: 0 !important;
font-size: 18px;
}
.badge {
position: absolute;
right: 15px;
display: none;
}
&:hover {
width: $sidebar-width + $sidebar-minimized-width;
background: $sidebar-nav-link-hover-bg;
.badge {
display: inline;
}
}
&.nav-dropdown-toggle::before {
display: none;
}
}
.nav-dropdown-items {
.nav-item {
width: $sidebar-width;
.nav-link {
width: $sidebar-width;
}
}
}
.nav > .nav-dropdown {
> .nav-dropdown-items {
display: none;
max-height: 1000px;
background: $sidebar-bg;
}
&:hover {
background: $sidebar-nav-link-hover-bg;
> .nav-dropdown-items {
position: absolute;
left: $sidebar-minimized-width;
display: inline;
}
}
}
}
}
}
+301
View File
@@ -0,0 +1,301 @@
@mixin switch-size($width, $height, $font-size, $handle-margin) {
width: $width;
height: $height;
.switch-label {
font-size: $font-size;
}
.switch-handle {
width: $height - $handle-margin * 2;
height: $height - $handle-margin * 2;
}
.switch-input:checked ~ .switch-handle {
left: $width - $height + $handle-margin;
}
}
@mixin switch($type, $width, $height, $font-size, $handle-margin) {
position: relative;
display: inline-block;
vertical-align: top;
width: $width;
height: $height;
background-color: transparent;
cursor: pointer;
.switch-input {
position: absolute;
top: 0;
left: 0;
opacity: 0;
}
.switch-label {
position: relative;
display: block;
height: inherit;
@if $type == icon {
font-family: FontAwesome;
}
font-size: $font-size;
font-weight: 600;
text-transform: uppercase;
@if $type == ddd {
background-color: $gray-100;
} @else {
background-color: #fff;
}
border: 1px solid $border-color;
border-radius: 2px;
transition: opacity background .15s ease-out;
}
@if $type == text or $type == icon {
.switch-label::before,
.switch-label::after {
position: absolute;
top: 50%;
width: 50%;
margin-top: -.5em;
line-height: 1;
text-align: center;
transition: inherit;
}
.switch-label::before {
right: 1px;
color: $gray-200;
content: attr(data-off);
}
.switch-label::after {
left: 1px;
color: #fff;
content: attr(data-on);
opacity: 0;
}
}
.switch-input:checked ~ .switch-label {
//background: $gray-lightest;
}
.switch-input:checked ~ .switch-label::before {
opacity: 0;
}
.switch-input:checked ~ .switch-label::after {
opacity: 1;
}
.switch-handle {
position: absolute;
top: $handle-margin;
left: $handle-margin;
width: $height - $handle-margin * 2;
height: $height - $handle-margin * 2;
background: #fff;
border: 1px solid $border-color;
border-radius: 1px;
transition: left .15s ease-out;
@if $type == ddd {
border: 0;
box-shadow: 0 2px 5px rgba(0, 0, 0, .3);
}
}
.switch-input:checked ~ .switch-handle {
left: $width - $height + $handle-margin;
}
@if $type == ddd {
@extend .switch-pill;
}
//size variations
@if $type == default {
&.switch-lg {
@include switch-size($switch-lg-width, $switch-lg-height, $switch-lg-font-size, $handle-margin);
}
&.switch-sm {
@include switch-size($switch-sm-width, $switch-sm-height, $switch-sm-font-size, $handle-margin);
}
&.switch-xs {
@include switch-size($switch-xs-width, $switch-xs-height, $switch-xs-font-size, $handle-margin);
}
} @else if $type == text {
&.switch-lg {
@include switch-size($switch-text-lg-width, $switch-text-lg-height, $switch-text-lg-font-size, $handle-margin);
}
&.switch-sm {
@include switch-size($switch-text-sm-width, $switch-text-sm-height, $switch-text-sm-font-size, $handle-margin);
}
&.switch-xs {
@include switch-size($switch-text-xs-width, $switch-text-xs-height, $switch-text-xs-font-size, $handle-margin);
}
} @else if $type == icon {
&.switch-lg {
@include switch-size($switch-icon-lg-width, $switch-icon-lg-height, $switch-icon-lg-font-size, $handle-margin);
}
&.switch-sm {
@include switch-size($switch-icon-sm-width, $switch-icon-sm-height, $switch-icon-sm-font-size, $handle-margin);
}
&.switch-xs {
@include switch-size($switch-icon-xs-width, $switch-icon-xs-height, $switch-icon-xs-font-size, $handle-margin);
}
} @else if $type == ddd {
&.switch-lg {
@include switch-size($switch-lg-width, $switch-lg-height, $switch-lg-font-size, 0);
}
&.switch-sm {
@include switch-size($switch-sm-width, $switch-sm-height, $switch-sm-font-size, 0);
}
&.switch-xs {
@include switch-size($switch-xs-width, $switch-xs-height, $switch-xs-font-size, 0);
}
}
}
@mixin switch-variant($color) {
> .switch-input:checked ~ .switch-label {
background: $color !important;
border-color: darken($color,10%);
}
> .switch-input:checked ~ .switch-handle {
border-color: darken($color,10%);
}
}
@mixin switch-outline-variant($color) {
> .switch-input:checked ~ .switch-label {
background: #fff !important;
border-color: $color;
&::after {
color: $color;
}
}
> .switch-input:checked ~ .switch-handle {
border-color: $color;
}
}
@mixin switch-outline-alt-variant($color) {
> .switch-input:checked ~ .switch-label {
background: #fff !important;
border-color: $color;
&::after {
color: $color;
}
}
> .switch-input:checked ~ .switch-handle {
background: $color !important;
border-color: $color;
}
}
$switch-lg-width: 48px;
$switch-lg-height: 28px;
$switch-lg-font-size: 12px;
$switch-width: 40px;
$switch-height: 24px;
$switch-font-size: 10px;
$handle-margin: 2px;
$switch-sm-width: 32px;
$switch-sm-height: 20px;
$switch-sm-font-size: 8px;
$switch-xs-width: 24px;
$switch-xs-height: 16px;
$switch-xs-font-size: 7px;
$switch-text-lg-width: 56px;
$switch-text-lg-height: 28px;
$switch-text-lg-font-size: 12px;
$switch-text-width: 48px;
$switch-text-height: 24px;
$switch-text-font-size: 10px;
$switch-text-sm-width: 40px;
$switch-text-sm-height: 20px;
$switch-text-sm-font-size: 8px;
$switch-text-xs-width: 32px;
$switch-text-xs-height: 16px;
$switch-text-xs-font-size: 7px;
$switch-icon-lg-width: 56px;
$switch-icon-lg-height: 28px;
$switch-icon-lg-font-size: 12px;
$switch-icon-width: 48px;
$switch-icon-height: 24px;
$switch-icon-font-size: 10px;
$switch-icon-sm-width: 40px;
$switch-icon-sm-height: 20px;
$switch-icon-sm-font-size: 8px;
$switch-icon-xs-width: 32px;
$switch-icon-xs-height: 16px;
$switch-icon-xs-font-size: 7px;
.switch.switch-default {
@include switch('default', $switch-width, $switch-height, $switch-font-size, $handle-margin);
}
.switch.switch-text {
@include switch('text', $switch-text-width, $switch-text-height, $switch-text-font-size, $handle-margin);
}
.switch.switch-icon {
@include switch('icon', $switch-icon-width, $switch-icon-height, $switch-icon-font-size, $handle-margin);
}
.switch.switch-3d {
@include switch('ddd', $switch-width, $switch-height, $switch-font-size, 0);
}
//pills style
.switch-pill {
.switch-label,
.switch-handle {
border-radius: 50em !important;
}
.switch-label::before {
right: 2px !important;
}
.switch-label::after {
left: 2px !important;
}
}
@each $color, $value in $theme-colors {
//normal style
.switch-#{$color} {
@include switch-variant($value);
}
//outline style
.switch-#{$color}-outline {
@include switch-outline-variant($value);
}
//outline alternative style
.switch-#{$color}-outline-alt {
@include switch-outline-alt-variant($value);
}
}
+20
View File
@@ -0,0 +1,20 @@
.table-outline {
border: 1px solid $table-border-color;
td {
vertical-align: middle;
}
}
.table-align-middle {
td {
vertical-align: middle;
}
}
.table-clear {
td {
border: 0;
}
}
+37
View File
@@ -0,0 +1,37 @@
.pagination-datatables, .pagination {
li {
@extend .page-item;
a {
@extend .page-link;
}
}
}
.label-pill {
border-radius: 1rem !important;
}
// temp fix for Vue & React
// Open state for the dropdown
.open, .show {
// Remove the outline when :focus is triggered
> a {
outline: 0;
}
}
// navbar dropdown fix
.navbar .dropdown-toggle {
@extend .nav-link;
.img-avatar {
height: $navbar-height - 20px;
margin: 0 10px;
}
}
.card-block {
@extend .card-body;
}
+36
View File
@@ -0,0 +1,36 @@
body {
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
}
.font-xs {
font-size: .75rem !important;
}
.font-sm {
font-size: .85rem !important;
}
.font-lg {
font-size: 1rem !important;
}
.font-xl {
font-size: 1.25rem !important;
}
.font-2xl {
font-size: 1.5rem !important;
}
.font-3xl {
font-size: 1.75rem !important;
}
.font-4xl {
font-size: 2rem !important;
}
.font-5xl {
font-size: 2.5rem !important;
}
+3
View File
@@ -0,0 +1,3 @@
@import "utilities/background";
@import "utilities/borders";
@import "utilities/display";
+219
View File
@@ -0,0 +1,219 @@
// scss-lint:disable all
// Core Admin Variables
$enable-sidebar-nav-rounded: false !default;
$border-color: $gray-200 !default;
$layout-transition-speed: .25s !default;
// Social Colors
$facebook: #3b5998 !default;
$twitter: #00aced !default;
$linkedin: #4875b4 !default;
$google-plus: #d34836 !default;
$flickr: #ff0084 !default;
$tumblr: #32506d !default;
$xing: #026466 !default;
$github: #4183c4 !default;
$html5: #e34f26 !default;
$openid: #f78c40 !default;
$stack-overflow: #fe7a15 !default;
$youtube: #b00 !default;
$css3: #0170ba !default;
$dribbble: #ea4c89 !default;
$google-plus: #bb4b39 !default;
$instagram: #517fa4 !default;
$pinterest: #cb2027 !default;
$vk: #45668e !default;
$yahoo: #400191 !default;
$behance: #1769ff !default;
$dropbox: #007ee5 !default;
$reddit: #ff4500 !default;
$spotify: #7ab800 !default;
$vine: #00bf8f !default;
$foursquare: #1073af !default;
$vimeo: #aad450 !default;
// Navbar
$navbar-height: 55px !default;
$navbar-bg: #fff !default;
$navbar-border: (
bottom: (
size: 1px,
style: solid,
color: $border-color
)
) !default;
$navbar-brand-width: 155px !default;
$navbar-brand-bg: #fff !default;
$navbar-brand-logo: url('../img/logo.png') !default;
$navbar-brand-logo-size: 70px auto !default;
$navbar-brand-border: (
bottom: (
size: 1px,
style: solid,
color: $border-color
)
) !default;
$navbar-brand-minimized-width: 50px !default;
$navbar-brand-minimized-bg: $navbar-brand-bg !default;
$navbar-brand-minimized-logo: url('../img/logo-symbol.png') !default;
$navbar-brand-minimized-logo-size: 24px !default;
$navbar-brand-minimized-border: $navbar-brand-border !default;
$navbar-color: $gray-600 !default;
$navbar-hover-color: $gray-800 !default;
$navbar-active-color: $gray-800 !default;
$navbar-disabled-color: $gray-300 !default;
$navbar-toggler-icon: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-color}' stroke-width='2.25' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"), "#", "%23") !default;
$navbar-toggler-icon-hover: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='#{$navbar-hover-color}' stroke-width='2.25' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E"), "#", "%23") !default;
// Sidebar
$sidebar-width: 200px !default;
$sidebar-padding: 0 !default;
$sidebar-minimized-width: 50px !default;
$sidebar-minimized-height: $sidebar-minimized-width !default;
$sidebar-compact-width: 150px !default;
$sidebar-compact-height: $sidebar-compact-width !default;
$sidebar-color: #fff !default;
$sidebar-bg: $gray-800 !default;
$sidebar-borders: none !default;
$mobile-sidebar-width: 220px !default;
// Sidebar Header
$sidebar-header-height: auto !default;
$sidebar-header-bg: rgba(0,0,0,.2) !default;
$sidebar-header-padding-y: .75rem !default;
$sidebar-header-padding-x: 1rem !default;
// Sidebar Form
$sidebar-form-border: 0 !default;
$sidebar-form-bg: darken($sidebar-bg,10%) !default;
$sidebar-form-color: #fff !default;
$sidebar-form-placeholder-color: rgba(255,255,255,.7) !default;
// Sidebar Navigation
$sidebar-nav-color: #fff !default;
$sidebar-nav-title-padding-y: .75rem !default;
$sidebar-nav-title-padding-x: 1rem !default;
$sidebar-nav-title-color: $gray-200 !default;
$sidebar-nav-link-padding-y: .75rem !default;
$sidebar-nav-link-padding-x: 1rem !default;
$sidebar-nav-link-color: #fff !default;
$sidebar-nav-link-bg: transparent !default;
$sidebar-nav-link-icon-color: $gray-600 !default;
$sidebar-nav-link-borders: 0 !default;
$sidebar-nav-link-hover-color: #fff !default;
$sidebar-nav-link-hover-bg: theme-color("primary") !default;
$sidebar-nav-link-hover-icon-color: #fff !default;
$sidebar-nav-link-hover-borders: 0 !default;
$sidebar-nav-link-active-color: #fff !default;
$sidebar-nav-link-active-bg: lighten($sidebar-bg, 5%) !default;
$sidebar-nav-link-active-icon-color: theme-color("primary") !default;
$sidebar-nav-link-active-borders: 0 !default;
$sidebar-nav-dropdown-color: #fff !default;
$sidebar-nav-dropdown-bg: rgba(0,0,0,.2) !default;
$sidebar-nav-dropdown-borders: 0 !default;
$sidebar-nav-dropdown-indicator-color:$gray-600 !default;
$sidebar-nav-dropdown-indicator: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 11 14'%3E%3Cpath fill='#{$sidebar-nav-dropdown-indicator-color}' d='M9.148 2.352l-4.148 4.148 4.148 4.148q0.148 0.148 0.148 0.352t-0.148 0.352l-1.297 1.297q-0.148 0.148-0.352 0.148t-0.352-0.148l-5.797-5.797q-0.148-0.148-0.148-0.352t0.148-0.352l5.797-5.797q0.148-0.148 0.352-0.148t0.352 0.148l1.297 1.297q0.148 0.148 0.148 0.352t-0.148 0.352z'/%3E%3C/svg%3E"), "#", "%23") !default;
$sidebar-nav-dropdown-indicator-hover-color:$sidebar-nav-link-hover-color;
$sidebar-nav-dropdown-indicator-hover:str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 11 14'%3E%3Cpath fill='#{$sidebar-nav-dropdown-indicator-hover-color}' d='M9.148 2.352l-4.148 4.148 4.148 4.148q0.148 0.148 0.148 0.352t-0.148 0.352l-1.297 1.297q-0.148 0.148-0.352 0.148t-0.352-0.148l-5.797-5.797q-0.148-0.148-0.148-0.352t0.148-0.352l5.797-5.797q0.148-0.148 0.352-0.148t0.352 0.148l1.297 1.297q0.148 0.148 0.148 0.352t-0.148 0.352z'/%3E%3C/svg%3E"), "#", "%23") !default;
// Sidebar Footer
$sidebar-footer-height: auto !default;
$sidebar-footer-bg: rgba(0,0,0,.2) !default;
$sidebar-footer-padding-y: .75rem !default;
$sidebar-footer-padding-x: 1rem !default;
$sidebar-footer-borders: 0 !default;
// Sidebar Minimizer
$sidebar-minimizer-height: 50px !default;
$sidebar-minimizer-bg: rgba(0,0,0,.2) !default;
$sidebar-minimizer-borders: 0 !default;
$sidebar-minimizer-indicator-color: $gray-600 !default;
$sidebar-minimizer-indicator: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 11 14'%3E%3Cpath fill='#{$sidebar-minimizer-indicator-color}' d='M9.148 2.352l-4.148 4.148 4.148 4.148q0.148 0.148 0.148 0.352t-0.148 0.352l-1.297 1.297q-0.148 0.148-0.352 0.148t-0.352-0.148l-5.797-5.797q-0.148-0.148-0.148-0.352t0.148-0.352l5.797-5.797q0.148-0.148 0.352-0.148t0.352 0.148l1.297 1.297q0.148 0.148 0.148 0.352t-0.148 0.352z'/%3E%3C/svg%3E"), "#", "%23") !default;
$sidebar-minimizer-hover-bg: rgba(0,0,0,.3) !default;
$sidebar-minimizer-hover-indicator-color:$sidebar-nav-link-hover-color !default;
$sidebar-minimizer-hover-indicator: str-replace(url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 11 14'%3E%3Cpath fill='#{$sidebar-minimizer-hover-indicator-color}' d='M9.148 2.352l-4.148 4.148 4.148 4.148q0.148 0.148 0.148 0.352t-0.148 0.352l-1.297 1.297q-0.148 0.148-0.352 0.148t-0.352-0.148l-5.797-5.797q-0.148-0.148-0.148-0.352t0.148-0.352l5.797-5.797q0.148-0.148 0.352-0.148t0.352 0.148l1.297 1.297q0.148 0.148 0.148 0.352t-0.148 0.352z'/%3E%3C/svg%3E"), "#", "%23") !default;
// Top Navigation
$top-nav-bg: #fff !default;
$top-nav-color: $body-color !default;
$top-nav-borders: (
bottom: (
size: 1px,
style: solid,
color: $border-color
)
) !default;
$top-nav-ul-borders: (
all: (
size: 1px,
style: solid,
color: $border-color
)
) !default;
$top-nav-hover-color: #fff !default;
$top-nav-hover-bg: theme-color("primary") !default;
$top-nav-active-color: #fff !default;
$top-nav-active-bg: theme-color("primary") !default;
$top-nav-height: $navbar-height - 15px !default;
// Breadcrumb
$breadcrumb-borders: (
bottom: (
size: 1px,
style: solid,
color: $border-color
)
) !default;
// Aside
$aside-menu-width: 250px !default;
$aside-menu-color: $gray-800 !default;
$aside-menu-bg: #fff !default;
$aside-menu-borders: (
left: (
size: 1px,
style: solid,
color: $border-color
)
) !default;
$aside-menu-nav-padding-y: .75rem !default;
$aside-menu-nav-padding-x: 1rem !default;
// Footer
$footer-height: 50px !default;
$footer-bg: $gray-100 !default;
$footer-color: $body-color !default;
$footer-borders: (
top: (
size: 1px,
style: solid,
color: $border-color
)
) !default;
// Cards
$card-icon-bg: transparent !default;
$card-icon-color: $body-color !default;
+253
View File
@@ -0,0 +1,253 @@
// .social-box
.social-box {
min-height: 160px;
margin-bottom: 2 * $card-spacer-y;
text-align: center;
background: #fff;
border: $card-border-width solid $card-border-color;
@include border-radius($card-border-radius);
i {
display: block;
margin: -1px -1px 0;
font-size: 40px;
line-height: 90px;
background: $gray-200;
@include border-radius($card-border-radius $card-border-radius 0 0);
}
.chart-wrapper {
height: 90px;
margin: -90px 0 0;
canvas {
width: 100% !important;
height: 90px !important;
}
}
ul {
padding: 10px 0;
list-style: none;
li {
display: block;
float: left;
width: 50%;
&:first-child {
border-right: 1px solid $border-color;
}
strong {
display: block;
font-size: 20px;
}
span {
font-size: 10px;
font-weight: 500;
color: $border-color;
text-transform: uppercase;
}
}
}
&.facebook {
i {
color: #fff;
background: $facebook;
}
}
&.twitter {
i {
color: #fff;
background: $twitter;
}
}
&.linkedin {
i {
color: #fff;
background: $linkedin;
}
}
&.google-plus {
i {
color: #fff;
background: $google-plus;
}
}
}
.horizontal-bars {
padding: 0;
margin: 0;
list-style: none;
li {
position: relative;
height: 40px;
line-height: 40px;
vertical-align: middle;
.title {
width: 100px;
font-size: 12px;
font-weight: 600;
color: $text-muted;
vertical-align: middle;
}
.bars {
position: absolute;
top: 15px;
width: 100%;
padding-left: 100px;
.progress:first-child {
margin-bottom: 2px;
}
}
&.legend {
text-align: center;
.badge {
display: inline-block;
width: 8px;
height: 8px;
padding: 0;
}
}
&.divider {
height: 40px;
i {
margin: 0 !important;
}
}
}
&.type-2 {
li {
overflow: hidden;
i {
display: inline-block;
margin-right: $spacer;
margin-left: 5px;
font-size: 18px;
line-height: 40px;
}
.title {
display: inline-block;
width: auto;
margin-top: -9px;
font-size: $font-size-base;
font-weight: normal;
line-height: 40px;
color: $body-color;
}
.value {
float: right;
font-weight: 600;
}
.bars {
position: absolute;
top: auto;
bottom: 0;
padding: 0;
}
}
}
}
.icons-list {
padding: 0;
margin: 0;
list-style: none;
li {
position: relative;
height: 40px;
vertical-align: middle;
i {
display: block;
float: left;
width: 35px !important;
height: 35px !important;
margin: 2px;
line-height: 35px !important;
text-align: center;
}
.desc {
height: 40px;
margin-left: 50px;
border-bottom: 1px solid $border-color;
.title {
padding: 2px 0 0;
margin: 0;
}
small {
display: block;
margin-top: -4px;
color: $text-muted;
}
}
.value {
position: absolute;
top: 2px;
right: 45px;
text-align: right;
strong {
display: block;
margin-top: -3px;
}
}
.actions {
position: absolute;
top: -4px;
right: 10px;
width: 40px;
height: 40px;
line-height: 40px;
text-align: center;
i {
float: none;
width: auto;
height: auto;
padding: 0;
margin: 0;
line-height: normal;
}
}
&.divider {
height: 40px;
i {
width: auto;
height: auto;
margin: 2px 0 0;
font-size: 18px;
}
}
}
}
+47
View File
@@ -0,0 +1,47 @@
// Import core styles
@import "variables";
@import "mixins";
// Additional typography
@import "typography";
// Animations
@import "animate";
// Components
@import "aside";
@import "avatars";
@import "badge";
@import "breadcrumb-menu";
@import "breadcrumb";
@import "buttons";
@import "callout";
@import "card";
@import "charts";
@import "dropdown";
@import "footer";
@import "grid";
@import "input-group";
@import "loading";
@import "modal";
@import "nav";
@import "navbar";
@import "progress";
@import "sidebar";
@import "switches";
@import "tables";
@import "widgets";
// Layout Options
@import "layout";
@import "others";
// Utility classes
@import "utilities";
// Temporary fixes
@import "temp";
// Right-to-left
@import "rtl";
@@ -0,0 +1,8 @@
.bg-primary,
.bg-success,
.bg-info,
.bg-warning,
.bg-danger,
.bg-inverse {
color: #fff;
}
@@ -0,0 +1,18 @@
//border
@each $prop, $abbrev in (border: b) {
@each $size in (0,1,2) {
@if $size == 0 {
.#{$abbrev}-a-#{$size} { #{$prop}: 0 !important; } // a = All sides
.#{$abbrev}-t-#{$size} { #{$prop}-top: 0 !important; }
.#{$abbrev}-r-#{$size} { #{$prop}-right: 0 !important; }
.#{$abbrev}-b-#{$size} { #{$prop}-bottom: 0 !important; }
.#{$abbrev}-l-#{$size} { #{$prop}-left: 0 !important; }
} @else {
.#{$abbrev}-a-#{$size} { #{$prop}: $size * $border-width solid $border-color !important; } // a = All sides
.#{$abbrev}-t-#{$size} { #{$prop}-top: $size * $border-width solid $border-color !important; }
.#{$abbrev}-r-#{$size} { #{$prop}-right: $size * $border-width solid $border-color !important; }
.#{$abbrev}-b-#{$size} { #{$prop}-bottom: $size * $border-width solid $border-color !important; }
.#{$abbrev}-l-#{$size} { #{$prop}-left: $size * $border-width solid $border-color !important; }
}
}
}
@@ -0,0 +1,18 @@
//
// Utilities for common `display` values
//
@each $breakpoint in map-keys($grid-breakpoints) {
@include media-breakpoint-down($breakpoint) {
$infix: breakpoint-infix($breakpoint, $grid-breakpoints);
.d#{$infix}-down-none { display: none !important; }
// .d#{$infix}-inline { display: inline !important; }
// .d#{$infix}-inline-block { display: inline-block !important; }
// .d#{$infix}-block { display: block !important; }
// .d#{$infix}-table { display: table !important; }
// .d#{$infix}-table-cell { display: table-cell !important; }
// .d#{$infix}-flex { display: flex !important; }
// .d#{$infix}-inline-flex { display: inline-flex !important; }
}
}
+22
View File
@@ -0,0 +1,22 @@
/*!
* CoreUI - Open Source Bootstrap Admin Template
* @version v1.0.10
* @link http://coreui.io
* Copyright (c) 2018 creativeLabs Łukasz Holeczek
* @license MIT
*/
// Override Boostrap variables
@import "bootstrap-variables";
// Import Bootstrap source files
@import "node_modules/bootstrap/scss/bootstrap";
// Override core variables
@import "core-variables";
// Import core styles
@import "core/core";
// Custom styles
@import "custom";
+6
View File
@@ -0,0 +1,6 @@
@import "node_modules/bootstrap/scss/functions";
@import "../bootstrap-variables";
@import "node_modules/bootstrap/scss/variables";
@import "node_modules/bootstrap/scss/mixins";
@import "../core-variables";
@import "../core/variables";
+48
View File
@@ -0,0 +1,48 @@
// Import variables
@import '../variables';
.chart-legend,
.bar-legend,
.line-legend,
.pie-legend,
.radar-legend,
.polararea-legend,
.doughnut-legend {
list-style-type: none;
margin-top: 5px;
text-align: center;
-webkit-padding-start: 0;
-moz-padding-start: 0;
padding-left: 0;
}
.chart-legend li,
.bar-legend li,
.line-legend li,
.pie-legend li,
.radar-legend li,
.polararea-legend li,
.doughnut-legend li {
display: inline-block;
white-space: nowrap;
position: relative;
margin-bottom: 4px;
@include border-radius($border-radius);
padding: 2px 8px 2px 28px;
font-size: smaller;
cursor: default;
}
.chart-legend li span,
.bar-legend li span,
.line-legend li span,
.pie-legend li span,
.radar-legend li span,
.polararea-legend li span,
.doughnut-legend li span {
display: block;
position: absolute;
left: 0;
top: 0;
width: 20px;
height: 20px;
@include border-radius($border-radius);
}
+24
View File
@@ -0,0 +1,24 @@
<template>
<router-view></router-view>
</template>
<script>
export default {
name: 'app'
}
</script>
<style>
/* Import Font Awesome Icons Set */
$fa-font-path: '~font-awesome/fonts/';
@import '~font-awesome/css/font-awesome.min.css';
/* Import Simple Line Icons Set */
$simple-line-font-path: '~simple-line-icons/fonts/';
@import '~simple-line-icons/css/simple-line-icons.css';
/* Import Bootstrap Vue Styles */
@import '~bootstrap-vue/dist/bootstrap-vue.css';
</style>
<style lang="scss">
// Import Main styles for this application
@import './scss/style';
</style>
+9
View File
@@ -0,0 +1,9 @@
export default {
items: [
{
name: 'Dashboard',
url: '/dashboard',
icon: 'icon-speedometer'
}
]
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

+11
View File
@@ -0,0 +1,11 @@
<template>
<aside class="aside-menu">
</aside>
</template>
<script>
export default {
name: 'c-aside'
}
</script>
+34
View File
@@ -0,0 +1,34 @@
<template>
<ol class="breadcrumb">
<li class="breadcrumb-item" v-for="(item, index) in list">
<span class="active" v-if="isLast(index)">{{ showName(item) }}</span>
<router-link :to="item" v-else>{{ showName(item) }}</router-link>
</li>
</ol>
</template>
<script>
export default {
props: {
list: {
type: Array,
required: true,
default: () => []
}
},
methods: {
isLast (index) {
return index === this.list.length - 1
},
showName (item) {
if (item.meta && item.meta.label) {
item = item.meta && item.meta.label
}
if (item.name) {
item = item.name
}
return item
}
}
}
</script>
+26
View File
@@ -0,0 +1,26 @@
<template>
<div :class="classList">
<slot></slot>
</div>
</template>
<script>
export default {
props: {
variant: {
type: String
}
},
computed: {
classList () {
return [
'callout',
this.calloutVariant
]
},
calloutVariant () {
return this.variant ? `callout-${this.variant}` : ''
}
}
}
</script>
+11
View File
@@ -0,0 +1,11 @@
<template>
<footer class="app-footer">
<span><a href="http://coreui.io">CoreUI</a> &copy; 2018 creativeLabs.</span>
<span class="ml-auto">Powered by <a href="http://coreui.io">CoreUI</a></span>
</footer>
</template>
<script>
export default {
name: 'c-footer'
}
</script>
+37
View File
@@ -0,0 +1,37 @@
<template>
<header class="app-header navbar">
<button class="navbar-toggler mobile-sidebar-toggler d-lg-none" type="button" @click="mobileSidebarToggle">
<span class="navbar-toggler-icon"></span>
</button>
<b-link class="navbar-brand" to="#"></b-link>
<button class="navbar-toggler sidebar-toggler d-md-down-none mr-auto" type="button" @click="sidebarToggle">
<span class="navbar-toggler-icon"></span>
</button>
<button class="navbar-toggler aside-menu-toggler d-md-down-none" type="button" @click="asideToggle">
<span class="navbar-toggler-icon"></span>
</button>
</header>
</template>
<script>
export default {
name: 'c-header',
methods: {
sidebarToggle (e) {
e.preventDefault()
document.body.classList.toggle('sidebar-hidden')
},
sidebarMinimize (e) {
e.preventDefault()
document.body.classList.toggle('sidebar-minimized')
},
mobileSidebarToggle (e) {
e.preventDefault()
document.body.classList.toggle('sidebar-mobile-show')
},
asideToggle (e) {
e.preventDefault()
document.body.classList.toggle('aside-menu-hidden')
}
}
}
</script>
@@ -0,0 +1,98 @@
<template>
<div class="sidebar">
<SidebarHeader/>
<SidebarForm/>
<nav class="sidebar-nav">
<div slot="header"></div>
<ul class="nav">
<template v-for="(item, index) in navItems">
<template v-if="item.title">
<SidebarNavTitle :name="item.name" :classes="item.class" :wrapper="item.wrapper"/>
</template>
<template v-else-if="item.divider">
<SidebarNavDivider :classes="item.class"/>
</template>
<template v-else-if="item.label">
<SidebarNavLabel :name="item.name" :url="item.url" :icon="item.icon" :label="item.label" :classes="item.class"/>
</template>
<template v-else>
<template v-if="item.children">
<!-- First level dropdown -->
<SidebarNavDropdown :name="item.name" :url="item.url" :icon="item.icon">
<template v-for="(childL1, index) in item.children">
<template v-if="childL1.children">
<!-- Second level dropdown -->
<SidebarNavDropdown :name="childL1.name" :url="childL1.url" :icon="childL1.icon">
<li class="nav-item" v-for="(childL2, index) in childL1.children">
<SidebarNavLink :name="childL2.name" :url="childL2.url" :icon="childL2.icon" :badge="childL2.badge" :variant="item.variant"/>
</li>
</SidebarNavDropdown>
</template>
<template v-else>
<SidebarNavItem :classes="item.class">
<SidebarNavLink :name="childL1.name" :url="childL1.url" :icon="childL1.icon" :badge="childL1.badge" :variant="item.variant"/>
</SidebarNavItem>
</template>
</template>
</SidebarNavDropdown>
</template>
<template v-else>
<SidebarNavItem :classes="item.class">
<SidebarNavLink :name="item.name" :url="item.url" :icon="item.icon" :badge="item.badge" :variant="item.variant"/>
</SidebarNavItem>
</template>
</template>
</template>
</ul>
<slot></slot>
</nav>
<SidebarFooter/>
<SidebarMinimizer/>
</div>
</template>
<script>
import SidebarFooter from './SidebarFooter'
import SidebarForm from './SidebarForm'
import SidebarHeader from './SidebarHeader'
import SidebarMinimizer from './SidebarMinimizer'
import SidebarNavDivider from './SidebarNavDivider'
import SidebarNavDropdown from './SidebarNavDropdown'
import SidebarNavLink from './SidebarNavLink'
import SidebarNavTitle from './SidebarNavTitle'
import SidebarNavItem from './SidebarNavItem'
import SidebarNavLabel from './SidebarNavLabel'
export default {
name: 'sidebar',
props: {
navItems: {
type: Array,
required: true,
default: () => []
}
},
components: {
SidebarFooter,
SidebarForm,
SidebarHeader,
SidebarMinimizer,
SidebarNavDivider,
SidebarNavDropdown,
SidebarNavLink,
SidebarNavTitle,
SidebarNavItem,
SidebarNavLabel
},
methods: {
handleClick (e) {
e.preventDefault()
e.target.parentElement.classList.toggle('open')
}
}
}
</script>
<style lang="css">
.nav-link {
cursor:pointer;
}
</style>
@@ -0,0 +1,9 @@
<template>
<!-- <div class="sidebar-footer"></div> -->
</template>
<script>
export default {
name: 'sidebar-footer'
}
</script>
@@ -0,0 +1,9 @@
<template>
<!-- <div class="sidebar-form"></div> -->
</template>
<script>
export default {
name: 'sidebar-form'
}
</script>
@@ -0,0 +1,9 @@
<template>
<!-- <div class="sidebar-header"></div> -->
</template>
<script>
export default {
name: 'sidebar-header'
}
</script>
@@ -0,0 +1,17 @@
<template>
<button class="sidebar-minimizer" type="button" @click="sidebarMinimize();brandMinimize()"></button>
</template>
<script>
export default {
name: 'sidebar-minimizer',
methods: {
sidebarMinimize () {
document.body.classList.toggle('sidebar-minimized')
},
brandMinimize () {
document.body.classList.toggle('brand-minimized')
}
}
}
</script>
@@ -0,0 +1,26 @@
<template>
<li :class="classList"></li>
</template>
<script>
export default {
name: 'sidebar-nav-divider',
props: {
classes: {
type: String,
default: ''
}
},
computed: {
classList () {
return [
'divider',
...this.itemClasses
]
},
itemClasses () {
return this.classes ? this.classes.split(' ') : ''
}
}
}
</script>
@@ -0,0 +1,33 @@
<template>
<router-link tag="li" class="nav-item nav-dropdown" :to="url" disabled>
<div class="nav-link nav-dropdown-toggle" @click="handleClick"><i :class="icon"></i> {{name}}</div>
<ul class="nav-dropdown-items">
<slot></slot>
</ul>
</router-link>
</template>
<script>
export default {
props: {
name: {
type: String,
default: ''
},
url: {
type: String,
default: ''
},
icon: {
type: String,
default: ''
}
},
methods: {
handleClick (e) {
e.preventDefault()
e.target.parentElement.classList.toggle('open')
}
}
}
</script>
@@ -0,0 +1,35 @@
<template>
<li :class="classList" @click="hideMobile">
<slot></slot>
</li>
</template>
<script>
export default {
name: 'sidebar-nav-item',
props: {
classes: {
type: String,
default: ''
}
},
computed: {
classList () {
return [
'nav-item',
...this.itemClasses
]
},
itemClasses () {
return this.classes ? this.classes.split(' ') : ''
}
},
methods: {
hideMobile () {
if (document.body.classList.contains('sidebar-mobile-show')) {
document.body.classList.toggle('sidebar-mobile-show')
}
}
}
}
</script>
@@ -0,0 +1,59 @@
<template>
<SidebarNavItem :classes="classList.navItem">
<a :class="classList.navLink" :href="url"><i :class="classList.icon"></i> {{name}}</a>
</SidebarNavItem>
</template>
<script>
import SidebarNavItem from './SidebarNavItem'
import SidebarNavLink from './SidebarNavLink'
export default {
name: 'sidebar-nav-label',
components: {
SidebarNavItem,
SidebarNavLink
},
props: {
name: {
type: String,
default: ''
},
url: {
type: String,
default: '#'
},
icon: {
type: String,
default: 'fa fa-circle'
},
classes: {
type: String,
default: ''
},
label: {
type: Object,
required: true,
default: () => {}
}
},
computed: {
classList () {
const classes = {
navItem: ['hidden-cn', ...this.getClasses(this.classes)].join(' '),
navLink: 'nav-label',
icon: [
this.icon ? this.icon : 'fa fa-circle',
this.label.variant ? `text-${this.label.variant}` : '',
this.label.class ? this.label.class : ''
].join(' ')
}
return classes
}
},
methods: {
getClasses (classes) {
return classes ? classes.split(' ') : []
}
}
}
</script>
@@ -0,0 +1,68 @@
<template>
<div v-if="isExternalLink">
<a :href="url" :class="classList">
<i :class="icon"></i> {{name}}
<b-badge v-if="badge && badge.text" :variant="badge.variant">{{badge.text}}</b-badge>
</a>
</div>
<div v-else>
<router-link :to="url" :class="classList">
<i :class="icon"></i> {{name}}
<b-badge v-if="badge && badge.text" :variant="badge.variant">{{badge.text}}</b-badge>
</router-link>
</div>
</template>
<script>
export default {
name: 'sidebar-nav-link',
props: {
name: {
type: String,
default: ''
},
url: {
type: String,
default: ''
},
icon: {
type: String,
default: ''
},
badge: {
type: Object,
default: () => {}
},
variant: {
type: String,
default: ''
},
classes: {
type: String,
default: ''
}
},
computed: {
classList () {
return [
'nav-link',
this.linkVariant,
...this.itemClasses
]
},
linkVariant () {
return this.variant ? `nav-link-${this.variant}` : ''
},
itemClasses () {
return this.classes ? this.classes.split(' ') : []
},
isExternalLink () {
if (this.url.substring(0, 4) === 'http') {
return true
} else {
return false
}
}
}
}
</script>
@@ -0,0 +1,42 @@
<template>
<li :class="classList">
<template v-if="wrapper && wrapper.element">
<component v-bind:is="wrapper.element" v-bind="wrapper.attributes">
{{name}}
</component>
</template>
<template v-else>
{{name}}
</template>
</li>
</template>
<script>
export default {
props: {
name: {
type: String,
default: ''
},
classes: {
type: String,
default: ''
},
wrapper: {
type: Object,
default: () => {}
}
},
computed: {
classList () {
return [
'nav-title',
...this.itemClasses
]
},
itemClasses () {
return this.classes ? this.classes.split(' ') : ''
}
}
}
</script>
+94
View File
@@ -0,0 +1,94 @@
<template>
<label :class="classList">
<input type="checkbox"
class="switch-input"
:value="value"
:checked="isChecked"
@change="handleChange">
<template v-if="isOn">
<span class="switch-label" :data-on="on" :data-off="off"></span>
</template>
<template v-else>
<span class="switch-label"></span>
</template>
<span class="switch-handle"></span>
</label>
</template>
<script>
export default {
model: {
prop: 'checked',
event: 'change'
},
props: {
value: {
default: true
},
uncheckedValue: {
default: false
},
checked: {
default: false
},
type: {
type: String,
default: 'default'
},
variant: {
type: String,
default: ''
},
pill: {
type: Boolean,
default: false
},
on: {
type: String,
default: null
},
off: {
type: String,
default: null
},
size: {
type: String,
default: null
}
},
computed: {
classList () {
return [
'switch',
this.switchType,
this.switchVariant,
this.switchPill,
this.switchSize
]
},
switchType () {
return this.type ? `switch-${this.type}` : `switch-default`
},
switchVariant () {
return this.variant ? `switch-${this.variant}` : `switch-secondary`
},
switchPill () {
return !this.pill ? null : `switch-pill`
},
switchSize () {
return this.size ? `switch-${this.size}` : ''
},
isChecked () {
return this.checked === this.value
},
isOn () {
return !this.on ? null : true
}
},
methods: {
handleChange ({ target: { checked } }) {
this.$emit('change', checked ? this.value : this.uncheckedValue)
}
}
}
</script>
+17
View File
@@ -0,0 +1,17 @@
import Aside from './Aside.vue'
import Breadcrumb from './Breadcrumb.vue'
import Callout from './Callout.vue'
import Footer from './Footer.vue'
import Header from './Header.vue'
import Sidebar from './Sidebar/Sidebar.vue'
import Switch from './Switch.vue'
export {
Aside,
Breadcrumb,
Callout,
Footer,
Header,
Sidebar,
Switch
}
+45
View File
@@ -0,0 +1,45 @@
<template>
<div class="app">
<AppHeader/>
<div class="app-body">
<Sidebar :navItems="nav"/>
<main class="main">
<breadcrumb :list="list"/>
<div class="container-fluid">
<router-view></router-view>
</div>
</main>
<AppAside/>
</div>
<AppFooter/>
</div>
</template>
<script>
import nav from '../_nav'
import { Header as AppHeader, Sidebar, Aside as AppAside, Footer as AppFooter, Breadcrumb } from '../components/'
export default {
name: 'full',
components: {
AppHeader,
Sidebar,
AppAside,
AppFooter,
Breadcrumb
},
data () {
return {
nav: nav.items
}
},
computed: {
name () {
return this.$route.name
},
list () {
return this.$route.matched
}
}
}
</script>
+18
View File
@@ -0,0 +1,18 @@
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import BootstrapVue from 'bootstrap-vue'
import App from './App'
import router from './router'
Vue.use(BootstrapVue)
/* eslint-disable no-new */
new Vue({
el: '#app',
router,
template: '<App/>',
components: {
App
}
})
+32
View File
@@ -0,0 +1,32 @@
import Vue from 'vue'
import Router from 'vue-router'
// Containers
import Full from '@/containers/Full'
// Views
import Dashboard from '@/views/Dashboard'
Vue.use(Router)
export default new Router({
mode: 'hash',
linkActiveClass: 'open active',
scrollBehavior: () => ({ y: 0 }),
routes: [
{
path: '/',
redirect: '/dashboard',
name: 'Home',
component: Full,
children: [
{
path: 'dashboard',
name: 'Dashboard',
component: Dashboard
}
]
}
]
})
+11
View File
@@ -0,0 +1,11 @@
<template>
<div class="animated fadeIn">
<p class="text-info">Hello World</p>
</div>
</template>
<script>
export default {
name: 'dashboard'
}
</script>
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

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