Merge branch 'master' into master

This commit is contained in:
xidedix
2018-03-30 11:57:19 +02:00
committed by GitHub
720 changed files with 39807 additions and 1722 deletions
+34 -1
View File
@@ -1,12 +1,45 @@
## [vue](./README.md) version `changelog`
##### `v1.0.11`
- refactor: project directory structure
- update: vuejs-templates/webpack to `1.3.1`
- update: vue to `2.5.13`
- chore: dependencies update
##### `v1.0.10`
- fix: `className` -> `class`
- refactor: `<b-input-group-prepend>`
- refactor: `<b-input-group-append>`
- refactor: `<b-input-group-text>`
- refactor: remove `<b-input-group-button>`
- test: initial `Dashboard` unit test added
- update: bootstrap-vue to `2.0.0-rc.1`
- chore: dependencies update
###### `v1.0.9`
- refactor: Sidebar structure
- test: initial e2e test added
- chore: dependencies update
###### `v1.0.8`
- update: vue to `2.5.13`
- update: Bootstrap to `4.0.0-beta.3`
- update: bootstrap-vue to `1.4.0`
- chore: dependencies update
- refactor: `<b-table>` use the prop `responsive="sm"` instead of `class="table-responsive-sm"`
- fix: `Vue warn:` Do not use built-in or reserved HTML elements as component id: (header, aside, footer, table)
- feature: some Bootstrap4 components added
- temp tweaks(b4 beta3): `InputGroupAddon` and `InputGroupButton`
- refactor(checkboxes, radios, labels): temp tweaks
- feat: mobile sidebar link click closes the sidebar [#18](https://github.com/mrholek/CoreUI-Vue/pull/18)
###### `v1.0.6`
- refactor: raw html to `b-row`, `b-col`, `b-card`, `b-button` components
- fix: Cards.vue: change `variant="accent-` to `class="card-accent-`
- refactor: Modal's ok-button variants
- refactor: forms with validation feedback
- update: bootstrap-vue to `1.1.0`
- update: to vue: `2.5.6`
- update: vue to `2.5.6`
###### `v1.0.5`
- update: bootstrap-vue to `1.0.x`
+1 -1
View File
@@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) 2017 creativeLabs Łukasz Holeczek.
Copyright (c) 2018 creativeLabs Łukasz Holeczek.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
+3 -2
View File
@@ -2,9 +2,9 @@
### Check out our Vue Admin Templates and support CoreUI Development
[![Bootstrap Admin Templates Bundle](https://genesisui.com/img/bundle2.png)](https://genesisui.com/bundle.html?support=1)
[![Bootstrap Admin Templates Bundle](https://genesisui.com/img/bundle2.png)](https://genesisui.com/admin-templates/vuejs/prime/?support=1)
[Check out Bootstrap Admin Templates Bundle](https://genesisui.com/bundle.html?support=1)
[Check out Bootstrap Admin Templates Bundle](https://genesisui.com/admin-templates/vuejs/prime/?support=1)
This is Vue.js version of our Bootstrap 4 admin template [CoreUI](https://github.com/mrholek/CoreUI-Free-Bootstrap-Admin-Template).
@@ -47,6 +47,7 @@ CoreUI includes 6 Version for Angular 4, AngularJS, React.js, Vue.js, Static HTM
* [HTML5 Static Version](https://github.com/mrholek/CoreUI-Free-Bootstrap-Admin-Template).
* [React.js Version](https://github.com/mrholek/CoreUI-React).
* [Vue.js Version](https://github.com/mrholek/CoreUI-Vue).
* [ASP.NET Core 2 MVC Version](https://github.com/mrholek/CoreUI-NET)
## Bugs and feature requests
+8 -4
View File
@@ -1,14 +1,18 @@
{
"presets": [
["env", { "modules": false }],
["env", {
"modules": false,
"targets": {
"browsers": ["> 1%", "last 2 versions", "not ie <= 9"]
}
}],
"stage-2"
],
"plugins": ["transform-runtime"],
"comments": false,
"plugins": ["transform-vue-jsx", "transform-runtime"],
"env": {
"test": {
"presets": ["env", "stage-2"],
"plugins": [ "istanbul" ]
"plugins": ["transform-vue-jsx", "istanbul"]
}
}
}
+6 -2
View File
@@ -1,2 +1,6 @@
build/*.js
config/*.js
/build/
/config/
/dist/
/*.js
/test/unit/coverage/
/test/e2e/specs
+13 -11
View File
@@ -1,27 +1,29 @@
// http://eslint.org/docs/user-guide/configuring
// https://eslint.org/docs/user-guide/configuring
module.exports = {
root: true,
parser: 'babel-eslint',
parserOptions: {
sourceType: 'module'
parser: 'babel-eslint'
},
env: {
browser: true,
},
// https://github.com/feross/standard/blob/master/RULES.md#javascript-standard-style
extends: 'standard',
extends: [
// https://github.com/vuejs/eslint-plugin-vue#priority-a-essential-error-prevention
// consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules.
'plugin:vue/essential',
// https://github.com/standard/standard/blob/master/docs/RULES-en.md
'standard'
],
// required to lint *.vue files
plugins: [
'html'
'vue'
],
// add your custom rules here
'rules': {
// allow paren-less arrow functions
'arrow-parens': 0,
rules: {
// allow async-await
'generator-star-spacing': 0,
'generator-star-spacing': 'off',
// allow debugger during development
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
}
}
+11 -3
View File
@@ -1,9 +1,17 @@
.DS_Store
node_modules/
dist/
/dist/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
test/unit/coverage
test/e2e/reports
/test/unit/coverage/
/test/e2e/reports/
selenium-debug.log
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
+3 -1
View File
@@ -2,7 +2,9 @@
module.exports = {
"plugins": {
// to edit target browsers: use "browserlist" field in package.json
"postcss-import": {},
"postcss-url": {},
// to edit target browsers: use "browserslist" field in package.json
"autoprefixer": {}
}
}
+34 -1
View File
@@ -1,12 +1,45 @@
## [vue](./README.md) version `changelog`
##### `v1.0.11`
- refactor: project directory structure
- update: vuejs-templates/webpack to `1.3.1`
- update: vue to `2.5.13`
- chore: dependencies update
##### `v1.0.10`
- fix: `className` -> `class`
- refactor: `<b-input-group-prepend>`
- refactor: `<b-input-group-append>`
- refactor: `<b-input-group-text>`
- refactor: remove `<b-input-group-button>`
- test: initial `Dashboard` unit test added
- update: bootstrap-vue to `2.0.0-rc.1`
- chore: dependencies update
###### `v1.0.9`
- refactor: Sidebar structure
- test: initial e2e test added
- chore: dependencies update
###### `v1.0.8`
- update: vue to `2.5.13`
- update: Bootstrap to `4.0.0-beta.3`
- update: bootstrap-vue to `1.4.0`
- chore: dependencies update
- refactor: `<b-table>` use the prop `responsive="sm"` instead of `class="table-responsive-sm"`
- fix: `Vue warn:` Do not use built-in or reserved HTML elements as component id: (header, aside, footer, table)
- feature: some Bootstrap4 components added
- temp tweaks(b4 beta3): `InputGroupAddon` and `InputGroupButton`
- refactor(checkboxes, radios, labels): temp tweaks
- feat: mobile sidebar link click closes the sidebar [#18](https://github.com/mrholek/CoreUI-Vue/pull/18)
###### `v1.0.6`
- refactor: raw html to `b-row`, `b-col`, `b-card`, `b-button` components
- fix: Cards.vue: change `variant="accent-` to `class="card-accent-`
- refactor: Modal's ok-button variants
- refactor: forms with validation feedback
- update: bootstrap-vue to `1.1.0`
- update: to vue: `2.5.6`
- update: vue to `2.5.6`
###### `v1.0.5`
- update: bootstrap-vue to `1.0.x`
+3 -3
View File
@@ -1,6 +1,6 @@
# core-ui
# CoreUI Vue
> Open Source Admin Template
> CoreUI Vue Open Source Bootsrtap 4 Admin Template
## Build Setup
@@ -27,4 +27,4 @@ npm run e2e
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).
For a detailed explanation on how things work, check out the [guide](http://vuejs-templates.github.io/webpack/) and [docs for vue-loader](http://vuejs.github.io/vue-loader).
+16 -10
View File
@@ -1,31 +1,37 @@
'use strict'
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')
const ora = require('ora')
const rm = require('rimraf')
const path = require('path')
const chalk = require('chalk')
const webpack = require('webpack')
const config = require('../config')
const webpackConfig = require('./webpack.prod.conf')
var spinner = ora('building for production...')
const 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) {
webpack(webpackConfig, (err, stats) => {
spinner.stop()
if (err) throw err
process.stdout.write(stats.toString({
colors: true,
modules: false,
children: false,
children: false, // If you are using ts-loader, setting this to true will make TypeScript errors show up during build.
chunks: false,
chunkModules: false
}) + '\n\n')
if (stats.hasErrors()) {
console.log(chalk.red(' Build failed with errors.\n'))
process.exit(1)
}
console.log(chalk.cyan(' Build complete.\n'))
console.log(chalk.yellow(
' Tip: built files are meant to be served over an HTTP server.\n' +
+17 -11
View File
@@ -1,17 +1,19 @@
var chalk = require('chalk')
var semver = require('semver')
var packageConfig = require('../package.json')
var shell = require('shelljs')
'use strict'
const chalk = require('chalk')
const semver = require('semver')
const packageConfig = require('../package.json')
const shell = require('shelljs')
function exec (cmd) {
return require('child_process').execSync(cmd).toString().trim()
}
var versionRequirements = [
const versionRequirements = [
{
name: 'node',
currentVersion: semver.clean(process.version),
versionRequirement: packageConfig.engines.node
},
}
]
if (shell.which('npm')) {
@@ -23,9 +25,11 @@ if (shell.which('npm')) {
}
module.exports = function () {
var warnings = []
for (var i = 0; i < versionRequirements.length; i++) {
var mod = versionRequirements[i]
const warnings = []
for (let i = 0; i < versionRequirements.length; i++) {
const mod = versionRequirements[i]
if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
warnings.push(mod.name + ': ' +
chalk.red(mod.currentVersion) + ' should be ' +
@@ -38,10 +42,12 @@ module.exports = function () {
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]
for (let i = 0; i < warnings.length; i++) {
const warning = warnings[i]
console.log(' ' + warning)
}
console.log()
process.exit(1)
}
-9
View File
@@ -1,9 +0,0 @@
/* 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
@@ -1,91 +0,0 @@
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()
}
}
+42 -13
View File
@@ -1,29 +1,38 @@
var path = require('path')
var config = require('../config')
var ExtractTextPlugin = require('extract-text-webpack-plugin')
'use strict'
const path = require('path')
const config = require('../config')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const packageConfig = require('../package.json')
exports.assetsPath = function (_path) {
var assetsSubDirectory = process.env.NODE_ENV === 'production'
const 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 = {
const cssLoader = {
loader: 'css-loader',
options: {
minimize: process.env.NODE_ENV === 'production',
sourceMap: options.sourceMap,
alias: { '../img': '../static/img' }
sourceMap: options.sourceMap
}
}
const postcssLoader = {
loader: 'postcss-loader',
options: {
sourceMap: options.sourceMap
}
}
// generate loader string to be used with extract text plugin
function generateLoaders (loader, loaderOptions) {
var loaders = [cssLoader]
const loaders = options.usePostCSS ? [cssLoader, postcssLoader] : [cssLoader]
if (loader) {
loaders.push({
loader: loader + '-loader',
@@ -59,14 +68,34 @@ exports.cssLoaders = function (options) {
// 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]
const output = []
const loaders = exports.cssLoaders(options)
for (const extension in loaders) {
const loader = loaders[extension]
output.push({
test: new RegExp('\\.' + extension + '$'),
use: loader
})
}
return output
}
exports.createNotifierCallback = () => {
const notifier = require('node-notifier')
return (severity, errors) => {
if (severity !== 'error') return
const error = errors[0]
const filename = error.file && error.file.split('!').pop()
notifier.notify({
title: packageConfig.name,
message: severity + ': ' + error.name,
subtitle: filename || '',
icon: path.join(__dirname, 'logo.png')
})
}
}
+17 -7
View File
@@ -1,12 +1,22 @@
var utils = require('./utils')
var config = require('../config')
var isProduction = process.env.NODE_ENV === 'production'
'use strict'
const utils = require('./utils')
const config = require('../config')
const isProduction = process.env.NODE_ENV === 'production'
const sourceMapEnabled = isProduction
? config.build.productionSourceMap
: config.dev.cssSourceMap
module.exports = {
loaders: utils.cssLoaders({
sourceMap: isProduction
? config.build.productionSourceMap
: config.dev.cssSourceMap,
sourceMap: sourceMapEnabled,
extract: isProduction
})
}),
cssSourceMap: sourceMapEnabled,
cacheBusting: config.dev.cacheBusting,
transformToRequire: {
video: ['src', 'poster'],
source: 'src',
img: 'src',
image: 'xlink:href'
}
}
+46 -27
View File
@@ -1,13 +1,26 @@
var path = require('path')
var utils = require('./utils')
var config = require('../config')
var vueLoaderConfig = require('./vue-loader.conf')
'use strict'
const path = require('path')
const utils = require('./utils')
const config = require('../config')
const vueLoaderConfig = require('./vue-loader.conf')
function resolve (dir) {
return path.join(__dirname, '..', dir)
}
const createLintingRule = () => ({
test: /\.(js|vue)$/,
loader: 'eslint-loader',
enforce: 'pre',
include: [resolve('src'), resolve('test')],
options: {
formatter: require('eslint-friendly-formatter'),
emitWarning: !config.dev.showEslintErrorsInOverlay
}
})
module.exports = {
context: path.resolve(__dirname, '../'),
entry: {
app: './src/main.js'
},
@@ -22,20 +35,12 @@ module.exports = {
extensions: ['.js', '.vue', '.json'],
alias: {
'vue$': 'vue/dist/vue.esm.js',
'@': resolve('src')
'@': resolve('src'),
}
},
module: {
rules: [
{
test: /\.(js|vue)$/,
loader: 'eslint-loader',
enforce: 'pre',
include: [resolve('src'), resolve('test')],
options: {
formatter: require('eslint-friendly-formatter')
}
},
...(config.dev.useEslint ? [createLintingRule()] : []),
{
test: /\.vue$/,
loader: 'vue-loader',
@@ -44,30 +49,44 @@ module.exports = {
{
test: /\.js$/,
loader: 'babel-loader',
include: [resolve('src'), resolve('test')]
include: [resolve('src'), resolve('test'), resolve('node_modules/webpack-dev-server/client')]
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
use: {
loader: 'file-loader',
loader: 'url-loader',
options: {
name: '[name].[hash:7].[ext]',
publicPath: '../../',
outputPath: utils.assetsPath('img/')
}
limit: 10000,
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
},
{
test: /\.(woff2?|ttf|eot|svg)(\?v=\d+\.\d+\.\d+)?$/,
use: {
loader: 'file-loader',
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
loader: 'url-loader',
options: {
name: '[name].[hash:7].[ext]',
publicPath: '../../',
outputPath: utils.assetsPath('fonts/')
limit: 10000,
name: utils.assetsPath('media/[name].[hash:7].[ext]')
}
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
}
}
]
},
node: {
// prevent webpack from injecting useless setImmediate polyfill because Vue
// source contains it (although only uses it if it's native).
setImmediate: false,
// prevent webpack from injecting mocks to Node native modules
// that does not make sense for the client
dgram: 'empty',
fs: 'empty',
net: 'empty',
tls: 'empty',
child_process: 'empty'
}
}
+70 -20
View File
@@ -1,30 +1,55 @@
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')
'use strict'
const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
const path = require('path')
const baseWebpackConfig = require('./webpack.base.conf')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
const portfinder = require('portfinder')
// 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])
})
const HOST = process.env.HOST
const PORT = process.env.PORT && Number(process.env.PORT)
module.exports = merge(baseWebpackConfig, {
const devWebpackConfig = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap })
rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap, usePostCSS: true })
},
// cheap-module-eval-source-map is faster for development
devtool: '#cheap-module-eval-source-map',
devtool: config.dev.devtool,
// these devServer options should be customized in /config/index.js
devServer: {
clientLogLevel: 'warning',
historyApiFallback: {
rewrites: [
{ from: /.*/, to: path.posix.join(config.dev.assetsPublicPath, 'index.html') },
],
},
hot: true,
contentBase: false, // since we use CopyWebpackPlugin.
compress: true,
host: HOST || config.dev.host,
port: PORT || config.dev.port,
open: config.dev.autoOpenBrowser,
overlay: config.dev.errorOverlay
? { warnings: false, errors: true }
: false,
publicPath: config.dev.assetsPublicPath,
proxy: config.dev.proxyTable,
quiet: true, // necessary for FriendlyErrorsPlugin
watchOptions: {
poll: config.dev.poll,
}
},
plugins: [
new webpack.DefinePlugin({
'process.env': config.dev.env
'process.env': require('../config/dev.env')
}),
// https://github.com/glenjamin/webpack-hot-middleware#installation--usage
new webpack.HotModuleReplacementPlugin(),
new webpack.NamedModulesPlugin(), // HMR shows correct file names in console on update.
new webpack.NoEmitOnErrorsPlugin(),
// https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
@@ -32,14 +57,39 @@ module.exports = merge(baseWebpackConfig, {
template: 'index.html',
inject: true
}),
new FriendlyErrorsPlugin(),
// copy custom static assets
new CopyWebpackPlugin([
{
from: path.resolve(__dirname, '../static'),
to: config.build.assetsSubDirectory,
to: config.dev.assetsSubDirectory,
ignore: ['.*']
}
])
]
})
module.exports = new Promise((resolve, reject) => {
portfinder.basePort = process.env.PORT || config.dev.port
portfinder.getPort((err, port) => {
if (err) {
reject(err)
} else {
// publish the new Port, necessary for e2e tests
process.env.PORT = port
// add port to devServer config
devWebpackConfig.devServer.port = port
// Add FriendlyErrorsPlugin
devWebpackConfig.plugins.push(new FriendlyErrorsPlugin({
compilationSuccessInfo: {
messages: [`Your application is running here: http://${devWebpackConfig.devServer.host}:${port}`],
},
onErrors: config.dev.notifyOnErrors
? utils.createNotifierCallback()
: undefined
}))
resolve(devWebpackConfig)
}
})
})
+50 -25
View File
@@ -1,26 +1,29 @@
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')
'use strict'
const path = require('path')
const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
const baseWebpackConfig = require('./webpack.base.conf')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const ExtractTextPlugin = require('extract-text-webpack-plugin')
const OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
var env = process.env.NODE_ENV === 'testing'
const env = process.env.NODE_ENV === 'testing'
? require('../config/test.env')
: config.build.env
: require('../config/prod.env')
var webpackConfig = merge(baseWebpackConfig, {
const webpackConfig = merge(baseWebpackConfig, {
module: {
rules: utils.styleLoaders({
sourceMap: config.build.productionSourceMap,
extract: true
extract: true,
usePostCSS: true
})
},
devtool: config.build.productionSourceMap ? '#source-map' : false,
devtool: config.build.productionSourceMap ? config.build.devtool : false,
output: {
path: config.build.assetsRoot,
filename: utils.assetsPath('js/[name].[chunkhash].js'),
@@ -31,22 +34,30 @@ var webpackConfig = merge(baseWebpackConfig, {
new webpack.DefinePlugin({
'process.env': env
}),
new webpack.optimize.UglifyJsPlugin({
new UglifyJsPlugin({
uglifyOptions: {
compress: {
warnings: false
}
},
sourceMap: true
sourceMap: config.build.productionSourceMap,
parallel: true
}),
// extract css into its own file
new ExtractTextPlugin({
filename: utils.assetsPath('css/[name].[contenthash].css')
filename: utils.assetsPath('css/[name].[contenthash].css'),
// Setting the following option to `false` will not extract CSS from codesplit chunks.
// Their CSS will instead be inserted dynamically with style-loader when the codesplit chunk has been loaded by webpack.
// It's currently set to `true` because we are seeing that sourcemaps are included in the codesplit bundle as well when it's `false`,
// increasing file size: https://github.com/vuejs-templates/webpack/issues/1110
allChunks: true,
}),
// Compress extracted CSS. We are using this plugin so that possible
// duplicated CSS from different components can be deduped.
new OptimizeCSSPlugin({
cssProcessorOptions: {
safe: true
}
cssProcessorOptions: config.build.productionSourceMap
? { safe: true, map: { inline: false } }
: { safe: true }
}),
// generate dist index.html with correct asset hash for caching.
// you can customize output by editing /index.html
@@ -67,10 +78,14 @@ var webpackConfig = merge(baseWebpackConfig, {
// necessary to consistently work with multiple chunks via CommonsChunkPlugin
chunksSortMode: 'dependency'
}),
// keep module.id stable when vendor modules does not change
new webpack.HashedModuleIdsPlugin(),
// enable scope hoisting
new webpack.optimize.ModuleConcatenationPlugin(),
// split vendor js into its own file
new webpack.optimize.CommonsChunkPlugin({
name: 'vendor',
minChunks: function (module, count) {
minChunks (module) {
// any required modules inside node_modules are extracted to vendor
return (
module.resource &&
@@ -85,8 +100,18 @@ var webpackConfig = merge(baseWebpackConfig, {
// prevent vendor hash from being updated whenever app bundle is updated
new webpack.optimize.CommonsChunkPlugin({
name: 'manifest',
chunks: ['vendor']
minChunks: Infinity
}),
// This instance extracts shared chunks from code splitted chunks and bundles them
// in a separate chunk, similar to the vendor chunk
// see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk
new webpack.optimize.CommonsChunkPlugin({
name: 'app',
async: 'vendor-async',
children: true,
minChunks: 3
}),
// copy custom static assets
new CopyWebpackPlugin([
{
@@ -99,7 +124,7 @@ var webpackConfig = merge(baseWebpackConfig, {
})
if (config.build.productionGzip) {
var CompressionWebpackPlugin = require('compression-webpack-plugin')
const CompressionWebpackPlugin = require('compression-webpack-plugin')
webpackConfig.plugins.push(
new CompressionWebpackPlugin({
@@ -117,7 +142,7 @@ if (config.build.productionGzip) {
}
if (config.build.bundleAnalyzerReport) {
var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
webpackConfig.plugins.push(new BundleAnalyzerPlugin())
}
+6 -5
View File
@@ -1,11 +1,12 @@
'use strict'
// 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')
const utils = require('./utils')
const webpack = require('webpack')
const merge = require('webpack-merge')
const baseWebpackConfig = require('./webpack.base.conf')
var webpackConfig = merge(baseConfig, {
const webpackConfig = merge(baseWebpackConfig, {
// use inline sourcemap for karma-sourcemap-loader
module: {
rules: utils.styleLoaders()
+3 -2
View File
@@ -1,5 +1,6 @@
var merge = require('webpack-merge')
var prodEnv = require('./prod.env')
'use strict'
const merge = require('webpack-merge')
const prodEnv = require('./prod.env')
module.exports = merge(prodEnv, {
NODE_ENV: '"development"'
+55 -17
View File
@@ -1,38 +1,76 @@
'use strict'
// Template version: 1.3.1
// see http://vuejs-templates.github.io/webpack for documentation.
var path = require('path')
const path = require('path')
module.exports = {
dev: {
// Paths
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: {},
// Various Dev Server settings
host: 'localhost', // can be overwritten by process.env.HOST
port: 8080, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
autoOpenBrowser: false,
errorOverlay: true,
notifyOnErrors: true,
poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
// Use Eslint Loader?
// If true, your code will be linted during bundling and
// linting errors and warnings will be shown in the console.
useEslint: true,
// If true, eslint errors and warnings will also be shown in the error overlay
// in the browser.
showEslintErrorsInOverlay: false,
/**
* Source Maps
*/
// https://webpack.js.org/configuration/devtool/#development
devtool: 'cheap-module-eval-source-map',
// If you have problems debugging vue-files in devtools,
// set this to false - it *may* help
// https://vue-loader.vuejs.org/en/options.html#cachebusting
cacheBusting: true,
cssSourceMap: true
},
build: {
env: require('./prod.env'),
// Template for index.html
index: path.resolve(__dirname, '../dist/index.html'),
// Paths
assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static',
assetsPublicPath: './',
assetsPublicPath: '/',
/**
* Source Maps
*/
productionSourceMap: true,
// https://webpack.js.org/configuration/devtool/#production
devtool: '#source-map',
// 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
}
}
+1
View File
@@ -1,3 +1,4 @@
'use strict'
module.exports = {
NODE_ENV: '"production"'
}
+3 -2
View File
@@ -1,5 +1,6 @@
var merge = require('webpack-merge')
var devEnv = require('./dev.env')
'use strict'
const merge = require('webpack-merge')
const devEnv = require('./dev.env')
module.exports = merge(devEnv, {
NODE_ENV: '"testing"'
+1
View File
@@ -5,6 +5,7 @@
<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>
<link rel="shortcut icon" href="/static/img/favicon.png">
</head>
<!-- BODY options, add following classes to body to change options
+16909
View File
File diff suppressed because it is too large Load Diff
+91 -80
View File
@@ -1,102 +1,113 @@
{
"name": "@coreui/vue",
"version": "1.0.6",
"description": "Open Source Bootstrap Admin Template",
"version": "1.0.11",
"description": "CoreUI Vue Open Source Bootstrap 4 Admin Template",
"author": "Łukasz Holeczek",
"homepage": "http://coreui.io",
"copyright": "Copyright 2017 creativeLabs Łukasz Holeczek",
"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",
"dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js",
"start": "npm run dev",
"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"
"lint": "eslint --ext .js,.vue src test/unit test/e2e/specs",
"build": "node build/build.js"
},
"dependencies": {
"bootstrap": "4.0.0-beta.2",
"bootstrap-vue": "1.1.0",
"chart.js": "2.7.1",
"bootstrap": "4.0.0",
"bootstrap-vue": "2.0.0-rc.1",
"chart.js": "^2.7.2",
"flag-icon-css": "^3.0.0",
"font-awesome": "^4.7.0",
"simple-line-icons": "^2.4.1",
"vue": "2.5.6",
"vue-chartjs": "3.0.2",
"vue-router": "3.0.1"
"vue": "2.5.13",
"vue-chartjs": "^3.3.1",
"vue-router": "^3.0.1"
},
"devDependencies": {
"autoprefixer": "7.1.6",
"autoprefixer": "7.2.5",
"babel-core": "6.26.0",
"babel-eslint": "8.0.2",
"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",
"babel-eslint": "8.2.2",
"babel-helper-vue-jsx-merge-props": "^2.0.3",
"babel-loader": "^7.1.4",
"babel-plugin-istanbul": "^4.1.5",
"babel-plugin-syntax-jsx": "^6.18.0",
"babel-plugin-transform-runtime": "^6.23.0",
"babel-plugin-transform-vue-jsx": "^3.5.0",
"babel-preset-env": "^1.6.1",
"babel-preset-stage-2": "^6.24.1",
"babel-register": "^6.26.0",
"chai": "^4.1.2",
"chalk": "^2.3.2",
"chromedriver": "^2.27.2",
"copy-webpack-plugin": "^4.5.1",
"cross-env": "^5.0.1",
"cross-spawn": "^5.0.1",
"connect-history-api-fallback": "1.5.0",
"copy-webpack-plugin": "4.2.1",
"css-loader": "0.28.7",
"eslint": "4.11.0",
"eslint-friendly-formatter": "3.0.0",
"eslint-loader": "1.9.0",
"eslint-plugin-html": "4.0.0",
"eslint-plugin-import": "2.8.0",
"eslint-plugin-node": "5.2.1",
"eslint-config-standard": "10.2.1",
"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.5",
"friendly-errors-webpack-plugin": "1.6.1",
"html-webpack-plugin": "2.30.1",
"http-proxy-middleware": "0.17.4",
"webpack-bundle-analyzer": "2.9.1",
"cross-env": "5.1.1",
"karma": "1.7.1",
"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.31",
"karma-webpack": "2.0.6",
"lolex": "2.3.0",
"mocha": "4.0.1",
"chai": "4.1.2",
"sinon": "4.1.2",
"sinon-chai": "2.14.0",
"inject-loader": "3.0.1",
"babel-plugin-istanbul": "4.1.5",
"css-loader": "^0.28.11",
"eslint": "^4.19.1",
"eslint-config-standard": "^11.0.0",
"eslint-friendly-formatter": "^4.0.0",
"eslint-loader": "^2.0.0",
"eslint-plugin-import": "^2.9.0",
"eslint-plugin-html": "^4.0.2",
"eslint-plugin-node": "^6.0.1",
"eslint-plugin-promise": "^3.7.0",
"eslint-plugin-standard": "^3.0.1",
"eslint-plugin-vue": "^4.4.0",
"extract-text-webpack-plugin": "^3.0.2",
"file-loader": "^1.1.11",
"friendly-errors-webpack-plugin": "^1.6.1",
"html-webpack-plugin": "^2.30.1",
"inject-loader": "^3.0.1",
"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.5",
"nightwatch": "^0.9.20",
"node-notifier": "^5.2.1",
"optimize-css-assets-webpack-plugin": "^3.2.0",
"ora": "^1.2.0",
"phantomjs-prebuilt": "^2.1.16",
"chromedriver": "2.33.2",
"cross-spawn": "5.1.0",
"nightwatch": "0.9.16",
"selenium-server": "3.7.1",
"semver": "5.4.1",
"shelljs": "0.7.8",
"opn": "5.1.0",
"optimize-css-assets-webpack-plugin": "3.2.0",
"ora": "1.3.0",
"rimraf": "2.6.2",
"url-loader": "0.6.2",
"vue-loader": "13.5.0",
"vue-style-loader": "3.0.3",
"vue-template-compiler": "2.5.6",
"webpack": "3.8.1",
"webpack-dev-middleware": "1.12.0",
"webpack-hot-middleware": "2.20.0",
"webpack-merge": "4.1.1",
"node-sass": "4.7.1",
"sass-loader": "6.0.6"
"portfinder": "^1.0.13",
"postcss-import": "^11.1.0",
"postcss-loader": "^2.1.3",
"postcss-url": "^7.3.1",
"rimraf": "^2.6.2",
"selenium-server": "^3.11.0",
"semver": "^5.5.0",
"shelljs": "^0.8.1",
"sinon": "^4.4.9",
"sinon-chai": "^3.0.0",
"uglifyjs-webpack-plugin": "^1.2.4",
"url-loader": "^1.0.1",
"vue-loader": "^14.2.2",
"vue-style-loader": "^4.1.0",
"vue-template-compiler": "2.5.13",
"webpack": "^3.11.0",
"webpack-bundle-analyzer": "^2.11.1",
"webpack-dev-server": "^2.11.2",
"webpack-merge": "^4.1.2",
"node-sass": "^4.8.3",
"sass-loader": "^6.0.7"
},
"engines": {
"node": ">= 6.4.0",
"npm": ">= 5.0.0"
}
"node": ">= 8.9.4",
"npm": ">= 5.6.0"
},
"browserslist": [
"> 1%",
"last 2 versions",
"not ie <= 9"
]
}
+14 -8
View File
@@ -9,14 +9,20 @@ export default {
</script>
<style lang="scss">
// Import Font Awesome Icons Set
/* Import Font Awesome Icons Set */
$fa-font-path: '~font-awesome/fonts/';
@import '~font-awesome/css/font-awesome.min.css';
// Import Simple Line Icons Set
@import '~font-awesome/scss/font-awesome.scss';
/* 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';
// Import Main styles for this application
@import './scss/style';
@import '~simple-line-icons/scss/simple-line-icons.scss';
</style>
<style>
/* Import Flag Icons Set */
@import 'flag-icon-css/css/flag-icon.min.css';
/* Import Bootstrap Vue Styles */
@import 'bootstrap-vue/dist/bootstrap-vue.css';
</style>
<style lang="scss">
// Import Main styles for this application
@import './assets/scss/style';
</style>
+132 -20
View File
@@ -11,7 +11,7 @@ export default {
},
{
title: true,
name: 'UI elements',
name: 'Theme',
class: '',
wrapper: {
element: '',
@@ -19,44 +19,125 @@ export default {
}
},
{
name: 'Colors',
url: '/theme/colors',
icon: 'icon-drop'
},
{
name: 'Typography',
url: '/theme/typography',
icon: 'icon-pencil'
},
{
title: true,
name: 'Components',
url: '/components',
class: '',
wrapper: {
element: '',
attributes: {}
}
},
{
name: 'Base',
url: '/base',
icon: 'icon-puzzle',
children: [
{
name: 'Buttons',
url: '/components/buttons',
icon: 'icon-puzzle'
},
{
name: 'Social Buttons',
url: '/components/social-buttons',
name: 'Breadcrumbs',
url: '/base/breadcrumbs',
icon: 'icon-puzzle'
},
{
name: 'Cards',
url: '/components/cards',
url: '/base/cards',
icon: 'icon-puzzle'
},
{
name: 'Carousels',
url: '/base/carousels',
icon: 'icon-puzzle'
},
{
name: 'Collapses',
url: '/base/collapses',
icon: 'icon-puzzle'
},
{
name: 'Forms',
url: '/components/forms',
url: '/base/forms',
icon: 'icon-puzzle'
},
{
name: 'Modals',
url: '/components/modals',
name: 'Jumbotrons',
url: '/base/jumbotrons',
icon: 'icon-puzzle'
},
{
name: 'List Groups',
url: '/base/list-groups',
icon: 'icon-puzzle'
},
{
name: 'Navs',
url: '/base/navs',
icon: 'icon-puzzle'
},
{
name: 'Paginations',
url: '/base/paginations',
icon: 'icon-puzzle'
},
{
name: 'Popovers',
url: '/base/popovers',
icon: 'icon-puzzle'
},
{
name: 'Progress Bars',
url: '/base/progress-bars',
icon: 'icon-puzzle'
},
{
name: 'Switches',
url: '/components/switches',
url: '/base/switches',
icon: 'icon-puzzle'
},
{
name: 'Tables',
url: '/components/tables',
url: '/base/tables',
icon: 'icon-puzzle'
},
{
name: 'Tooltips',
url: '/base/tooltips',
icon: 'icon-puzzle'
}
]
},
{
name: 'Buttons',
url: '/buttons',
icon: 'icon-cursor',
children: [
{
name: 'Standard Buttons',
url: '/buttons/standard-buttons',
icon: 'icon-cursor'
},
{
name: 'Button Groups',
url: '/buttons/button-groups',
icon: 'icon-cursor'
},
{
name: 'Dropdowns',
url: '/buttons/dropdowns',
icon: 'icon-cursor'
},
{
name: 'Social Buttons',
url: '/buttons/social-buttons',
icon: 'icon-cursor'
}
]
},
@@ -65,6 +146,15 @@ export default {
url: '/icons',
icon: 'icon-star',
children: [
{
name: 'Flags',
url: '/icons/flags',
icon: 'icon-star',
badge: {
variant: 'success',
text: 'NEW'
}
},
{
name: 'Font Awesome',
url: '/icons/font-awesome',
@@ -81,6 +171,33 @@ export default {
}
]
},
{
name: 'Charts',
url: '/charts',
icon: 'icon-pie-chart'
},
{
name: 'Notifications',
url: '/notifications',
icon: 'icon-bell',
children: [
{
name: 'Alerts',
url: '/notifications/alerts',
icon: 'icon-bell'
},
{
name: 'Badges',
url: '/notifications/badges',
icon: 'icon-bell'
},
{
name: 'Modals',
url: '/notifications/modals',
icon: 'icon-bell'
}
]
},
{
name: 'Widgets',
url: '/widgets',
@@ -90,11 +207,6 @@ export default {
text: 'NEW'
}
},
{
name: 'Charts',
url: '/charts',
icon: 'icon-pie-chart'
},
{
divider: true
},
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

@@ -51,7 +51,28 @@ $theme-colors: (
warning: $yellow,
danger: $red,
light: $gray-100,
dark: $gray-800
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
@@ -2,15 +2,6 @@ button {
cursor: pointer;
}
.btn {
.badge {
position: absolute;
top: 2px;
right: 6px;
font-size: 9px;
}
}
.btn-transparent {
color: #fff;
background-color: transparent;
@@ -20,7 +20,7 @@
.card-header {
.icon-bg {
display: inline-body;
display: inline-block;
padding: $card-spacer-y $card-spacer-x !important;
margin-top: -$card-spacer-y;
margin-right: $card-spacer-x;
@@ -135,12 +135,12 @@
}
[class^="icon-"], [class*=" icon-"] {
display: inline-body;
display: inline-block;
vertical-align: middle;
}
i {
display: inline-body;
display: inline-block;
transition: .4s;
}
@@ -153,7 +153,7 @@
width: 230px;
margin: 6px;
.input-group-addon {
.input-group-prepend, .input-group-append {
background: #fff;
}
@@ -1,6 +1,5 @@
.input-group-addon,
.input-group-btn {
min-width: 40px;
.input-group-prepend,
.input-group-append {
white-space: nowrap;
vertical-align: middle; // Match the inputs
}
@@ -129,6 +129,9 @@ app-root {
}
}
}
.sidebar-minimizer {
display: none;
}
}
.sidebar-minimized {
@@ -1,6 +1,9 @@
.nav-tabs {
.nav-link {
color: $gray-600;
&:hover {
cursor: pointer;
}
&.active {
color: $gray-800;
background: #fff;
@@ -207,7 +207,7 @@
border-radius: $border-radius;
}
> .nav-dropdown-items {
max-height: 1000px;
max-height: 1500px;
}
.nav-link {
@@ -48,7 +48,7 @@ $navbar-border: (
) !default;
$navbar-brand-width: 155px !default;
$navbar-brand-bg: #fff !default;
$navbar-brand-logo: url('../img/logo.png') !default;
$navbar-brand-logo: url('/static/img/logo.png') !default;
$navbar-brand-logo-size: 70px auto !default;
$navbar-brand-border: (
bottom: (
@@ -60,7 +60,7 @@ $navbar-brand-border: (
$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: url('/static/img/logo-symbol.png') !default;
$navbar-brand-minimized-logo-size: 24px !default;
$navbar-brand-minimized-border: $navbar-brand-border !default;
@@ -1,8 +1,8 @@
/*!
* CoreUI - Open Source Bootstrap Admin Template
* @version v1.0.6
* @version v1.0.11
* @link http://coreui.io
* Copyright (c) 2017 creativeLabs Łukasz Holeczek
* Copyright (c) 2018 creativeLabs Łukasz Holeczek
* @license MIT
*/
@@ -10,7 +10,7 @@
@import "bootstrap-variables";
// Import Bootstrap source files
@import "node_modules/bootstrap/scss/bootstrap";
@import "~bootstrap/scss/bootstrap";
// Override core variables
@import "core-variables";
+1 -1
View File
@@ -222,7 +222,7 @@
import Callout from './Callout'
import cSwitch from './Switch'
export default {
name: 'aside',
name: 'c-aside',
components: {
Callout,
cSwitch
@@ -1,6 +1,6 @@
<template>
<ol class="breadcrumb">
<li class="breadcrumb-item" v-for="(item, index) in list">
<li class="breadcrumb-item" :key="index" 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>
+2 -2
View File
@@ -1,11 +1,11 @@
<template>
<footer class="app-footer">
<span><a href="http://coreui.io">CoreUI</a> &copy; 2017 creativeLabs.</span>
<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: 'footer'
name: 'c-footer'
}
</script>
@@ -34,7 +34,7 @@
import HeaderDropdown from './HeaderDropdown.vue'
export default {
name: 'header',
name: 'c-header',
components: {
HeaderDropdown
},
@@ -11,7 +11,7 @@
<b-dropdown-header tag="div" class="text-center"><strong>Settings</strong></b-dropdown-header>
<b-dropdown-item><i class="fa fa-user"></i> Profile</b-dropdown-item>
<b-dropdown-item><i class="fa fa-wrench"></i> Settings</b-dropdown-item>
<b-dropdown-item><i class="fa fa-usd"></i> Payments<b-badge variant="default">{{itemsCount}}</b-badge></b-dropdown-item>
<b-dropdown-item><i class="fa fa-usd"></i> Payments<b-badge variant="secondary">{{itemsCount}}</b-badge></b-dropdown-item>
<b-dropdown-item><i class="fa fa-file"></i> Projects<b-badge variant="primary">{{itemsCount}}</b-badge></b-dropdown-item>
<b-dropdown-divider></b-dropdown-divider>
<b-dropdown-item><i class="fa fa-shield"></i> Lock Account</b-dropdown-item>
@@ -26,4 +26,3 @@
}
}
</script>
@@ -7,26 +7,29 @@
<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"/>
<SidebarNavTitle :key="index" :name="item.name" :classes="item.class" :wrapper="item.wrapper"/>
</template>
<template v-else-if="item.divider">
<SidebarNavDivider :classes="item.class"/>
<SidebarNavDivider :key="index" :classes="item.class"/>
</template>
<template v-else-if="item.label">
<SidebarNavLabel :key="index" :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">
<SidebarNavDropdown :key="index" :name="item.name" :url="item.url" :icon="item.icon">
<template v-for="(childL1, index1) 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">
<SidebarNavDropdown :key="index1" :name="childL1.name" :url="childL1.url" :icon="childL1.icon">
<li class="nav-item" :key="index2" v-for="(childL2, index2) 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">
<SidebarNavItem :key="index1" :classes="item.class">
<SidebarNavLink :name="childL1.name" :url="childL1.url" :icon="childL1.icon" :badge="childL1.badge" :variant="item.variant"/>
</SidebarNavItem>
</template>
@@ -34,7 +37,7 @@
</SidebarNavDropdown>
</template>
<template v-else>
<SidebarNavItem :classes="item.class">
<SidebarNavItem :key="index" :classes="item.class">
<SidebarNavLink :name="item.name" :url="item.url" :icon="item.icon" :badge="item.badge" :variant="item.variant"/>
</SidebarNavItem>
</template>
@@ -57,6 +60,7 @@ 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: {
@@ -75,7 +79,8 @@ export default {
SidebarNavDropdown,
SidebarNavLink,
SidebarNavTitle,
SidebarNavItem
SidebarNavItem,
SidebarNavLabel
},
methods: {
handleClick (e) {
@@ -1,4 +1,5 @@
<template>
<div></div>
<!-- <div class="sidebar-footer"></div> -->
</template>
<script>
@@ -1,4 +1,5 @@
<template>
<div></div>
<!-- <div class="sidebar-form"></div> -->
</template>
<script>
@@ -1,4 +1,5 @@
<template>
<div></div>
<!-- <div class="sidebar-header"></div> -->
</template>
<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,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>
@@ -1,26 +0,0 @@
<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>
@@ -1,28 +0,0 @@
<template>
<li :class="classList">
<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(' ') : ''
}
}
}
</script>
@@ -1,68 +0,0 @@
<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>
@@ -1,42 +0,0 @@
<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>
+2 -2
View File
@@ -2,8 +2,8 @@ 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.vue'
import Header from './Header/Header.vue'
import Sidebar from './Sidebar/Sidebar.vue'
import Switch from './Switch.vue'
export {
+169 -25
View File
@@ -6,22 +6,46 @@ import Full from '@/containers/Full'
// Views
import Dashboard from '@/views/Dashboard'
import Colors from '@/views/theme/Colors'
import Typography from '@/views/theme/Typography'
import Charts from '@/views/Charts'
import Widgets from '@/views/Widgets'
// Views - Components
import Buttons from '@/views/components/Buttons'
import SocialButtons from '@/views/components/SocialButtons'
import Cards from '@/views/components/Cards'
import Forms from '@/views/components/Forms'
import Modals from '@/views/components/Modals'
import Switches from '@/views/components/Switches'
import Tables from '@/views/components/Tables'
import Cards from '@/views/base/Cards'
import Forms from '@/views/base/Forms'
import Switches from '@/views/base/Switches'
import Tables from '@/views/base/Tables'
import Breadcrumbs from '@/views/base/Breadcrumbs'
import Carousels from '@/views/base/Carousels'
import Collapses from '@/views/base/Collapses'
import Jumbotrons from '@/views/base/Jumbotrons'
import ListGroups from '@/views/base/ListGroups'
import Navs from '@/views/base/Navs'
import Navbars from '@/views/base/Navbars'
import Paginations from '@/views/base/Paginations'
import Popovers from '@/views/base/Popovers'
import ProgressBars from '@/views/base/ProgressBars'
import Tooltips from '@/views/base/Tooltips'
// Views - Buttons
import StandardButtons from '@/views/buttons/StandardButtons'
import ButtonGroups from '@/views/buttons/ButtonGroups'
import Dropdowns from '@/views/buttons/Dropdowns'
import SocialButtons from '@/views/buttons/SocialButtons'
// Views - Icons
import Flags from '@/views/icons/Flags'
import FontAwesome from '@/views/icons/FontAwesome'
import SimpleLineIcons from '@/views/icons/SimpleLineIcons'
// Views - Notifications
import Alerts from '@/views/notifications/Alerts'
import Badges from '@/views/notifications/Badges'
import Modals from '@/views/notifications/Modals'
// Views - Pages
import Page404 from '@/views/pages/Page404'
import Page500 from '@/views/pages/Page500'
@@ -46,6 +70,26 @@ export default new Router({
name: 'Dashboard',
component: Dashboard
},
{
path: 'theme',
redirect: '/theme/colors',
name: 'Theme',
component: {
render (c) { return c('router-view') }
},
children: [
{
path: 'colors',
name: 'Colors',
component: Colors
},
{
path: 'typography',
name: 'Typography',
component: Typography
}
]
},
{
path: 'charts',
name: 'Charts',
@@ -57,23 +101,13 @@ export default new Router({
component: Widgets
},
{
path: 'components',
redirect: '/components/buttons',
name: 'Components',
path: 'base',
redirect: '/base/cards',
name: 'Base',
component: {
render (c) { return c('router-view') }
},
children: [
{
path: 'buttons',
name: 'Buttons',
component: Buttons
},
{
path: 'social-buttons',
name: 'Social Buttons',
component: SocialButtons
},
{
path: 'cards',
name: 'Cards',
@@ -84,11 +118,6 @@ export default new Router({
name: 'Forms',
component: Forms
},
{
path: 'modals',
name: 'Modals',
component: Modals
},
{
path: 'switches',
name: 'Switches',
@@ -98,6 +127,91 @@ export default new Router({
path: 'tables',
name: 'Tables',
component: Tables
},
{
path: 'breadcrumbs',
name: 'Breadcrumbs',
component: Breadcrumbs
},
{
path: 'carousels',
name: 'Carousels',
component: Carousels
},
{
path: 'collapses',
name: 'Collapses',
component: Collapses
},
{
path: 'jumbotrons',
name: 'Jumbotrons',
component: Jumbotrons
},
{
path: 'list-groups',
name: 'List Groups',
component: ListGroups
},
{
path: 'navs',
name: 'Navs',
component: Navs
},
{
path: 'navbars',
name: 'Navbars',
component: Navbars
},
{
path: 'paginations',
name: 'Paginations',
component: Paginations
},
{
path: 'popovers',
name: 'Popovers',
component: Popovers
},
{
path: 'progress-bars',
name: 'Progress Bars',
component: ProgressBars
},
{
path: 'tooltips',
name: 'Tooltips',
component: Tooltips
}
]
},
{
path: 'buttons',
redirect: '/buttons/buttons',
name: 'Buttons',
component: {
render (c) { return c('router-view') }
},
children: [
{
path: 'standard-buttons',
name: 'Standard Buttons',
component: StandardButtons
},
{
path: 'button-groups',
name: 'Button Groups',
component: ButtonGroups
},
{
path: 'dropdowns',
name: 'Dropdowns',
component: Dropdowns
},
{
path: 'social-buttons',
name: 'Social Buttons',
component: SocialButtons
}
]
},
@@ -109,6 +223,11 @@ export default new Router({
render (c) { return c('router-view') }
},
children: [
{
path: 'flags',
name: 'Flags',
component: Flags
},
{
path: 'font-awesome',
name: 'Font Awesome',
@@ -120,6 +239,31 @@ export default new Router({
component: SimpleLineIcons
}
]
},
{
path: 'notifications',
redirect: '/notifications/alerts',
name: 'Notifications',
component: {
render (c) { return c('router-view') }
},
children: [
{
path: 'alerts',
name: 'Alerts',
component: Alerts
},
{
path: 'badges',
name: 'Badges',
component: Badges
},
{
path: 'modals',
name: 'Modals',
component: Modals
}
]
}
]
},
+21 -20
View File
@@ -78,17 +78,17 @@
<b-card>
<b-row>
<b-col sm="5">
<h4 class="card-title mb-0">Traffic</h4>
<div class="small text-muted">November 2016</div>
<h4 id="traffic" class="card-title mb-0">Traffic</h4>
<div class="small text-muted">November 2017</div>
</b-col>
<b-col sm="7" class="d-none d-md-block">
<b-button type="button" variant="primary" class="float-right"><i class="icon-cloud-download"></i></b-button>
<b-button-toolbar class="float-right" aria-label="Toolbar with button groups">
<b-button-group class="mr-3" aria-label="First group">
<b-button variant="outline-secondary">Day</b-button>
<b-button variant="outline-secondary" :pressed="true">Month</b-button>
<b-button variant="outline-secondary">Year</b-button>
</b-button-group>
<b-button-toolbar class="float-right" aria-label="Toolbar with buttons group">
<b-form-radio-group class="mr-3" id="radiosBtn" buttons button-variant="outline-secondary" v-model="selected" name="radiosBtn">
<b-form-radio class="mx-0" value="Day">Day</b-form-radio>
<b-form-radio class="mx-0" value="Month">Month</b-form-radio>
<b-form-radio class="mx-0" value="Year">Year</b-form-radio>
</b-form-radio-group>
</b-button-toolbar>
</b-col>
</b-row>
@@ -497,11 +497,7 @@
</b-col>
</b-row>
<br/>
<b-table class="table-outline table-responsive-sm mb-0" hover
:items="tableItems"
:fields="tableFields"
head-variant="light"
>
<b-table class="mb-0 table-outline" responsive="sm" hover :items="tableItems" :fields="tableFields" head-variant="light">
<div slot="avatar" class="avatar" slot-scope="item">
<img :src="item.value.url" class="img-avatar" alt="">
<span class="avatar-status" v-bind:class="{ 'bg-success': item.value.status == 'success', 'bg-warning': item.value.status == 'warning', 'bg-danger': item.value.status == 'danger', 'bg-secondary': item.value.status == '' }"></span>
@@ -515,7 +511,8 @@
</span> | Registered: {{item.value.registered}}
</div>
</div>
<img slot="country" slot-scope="item" :src="item.value.flag" :alt="item.value.name" style="height:24px;">
<i slot="country" class="h4 mb-0" :class="flag(item.value.flag)" slot-scope="item" :title="item.value.flag" :id="item.value.flag"></i>
<i class="flag-icon flag-icon-pw h1" title="pw" id="pw"></i>
<div slot="usage" slot-scope="item">
<div class="clearfix">
<div class="float-left">
@@ -563,11 +560,12 @@ export default {
},
data: function () {
return {
selected: 'Month',
tableItems: [
{
avatar: { url: 'static/img/avatars/1.jpg', status: 'success' },
user: { name: 'Yiorgos Avraamu', new: true, registered: 'Jan 1, 2015' },
country: { name: 'USA', flag: 'static/img/flags/USA.png' },
country: { name: 'USA', flag: 'us' },
usage: { value: 50, period: 'Jun 11, 2015 - Jul 10, 2015' },
payment: { name: 'Mastercard', icon: 'fa fa-cc-mastercard' },
activity: '10 sec ago'
@@ -575,7 +573,7 @@ export default {
{
avatar: { url: 'static/img/avatars/2.jpg', status: 'danger' },
user: { name: 'Avram Tarasios', new: false, registered: 'Jan 1, 2015' },
country: { name: 'Brazil', flag: 'static/img/flags/Brazil.png' },
country: { name: 'Brazil', flag: 'br' },
usage: { value: 22, period: 'Jun 11, 2015 - Jul 10, 2015' },
payment: { name: 'Visa', icon: 'fa fa-cc-visa' },
activity: '5 minutes ago'
@@ -583,7 +581,7 @@ export default {
{
avatar: { url: 'static/img/avatars/3.jpg', status: 'warning' },
user: { name: 'Quintin Ed', new: true, registered: 'Jan 1, 2015' },
country: { name: 'India', flag: 'static/img/flags/India.png' },
country: { name: 'India', flag: 'in' },
usage: { value: 74, period: 'Jun 11, 2015 - Jul 10, 2015' },
payment: { name: 'Stripe', icon: 'fa fa-cc-stripe' },
activity: '1 hour ago'
@@ -591,7 +589,7 @@ export default {
{
avatar: { url: 'static/img/avatars/4.jpg', status: '' },
user: { name: 'Enéas Kwadwo', new: true, registered: 'Jan 1, 2015' },
country: { name: 'France', flag: 'static/img/flags/France.png' },
country: { name: 'France', flag: 'fr' },
usage: { value: 98, period: 'Jun 11, 2015 - Jul 10, 2015' },
payment: { name: 'PayPal', icon: 'fa fa-paypal' },
activity: 'Last month'
@@ -599,7 +597,7 @@ export default {
{
avatar: { url: 'static/img/avatars/5.jpg', status: 'success' },
user: { name: 'Agapetus Tadeáš', new: true, registered: 'Jan 1, 2015' },
country: { name: 'Spain', flag: 'static/img/flags/Spain.png' },
country: { name: 'Spain', flag: 'es' },
usage: { value: 22, period: 'Jun 11, 2015 - Jul 10, 2015' },
payment: { name: 'Google Wallet', icon: 'fa fa-google-wallet' },
activity: 'Last week'
@@ -607,7 +605,7 @@ export default {
{
avatar: { url: 'static/img/avatars/6.jpg', status: 'danger' },
user: { name: 'Friderik Dávid', new: true, registered: 'Jan 1, 2015' },
country: { name: 'Poland', flag: 'static/img/flags/Poland.png' },
country: { name: 'Poland', flag: 'pl' },
usage: { value: 43, period: 'Jun 11, 2015 - Jul 10, 2015' },
payment: { name: 'Amex', icon: 'fa fa-cc-amex' },
activity: 'Last week'
@@ -651,6 +649,9 @@ export default {
$variant = 'danger'
}
return $variant
},
flag (value) {
return 'flag-icon flag-icon-' + value
}
}
}
@@ -0,0 +1,41 @@
<template>
<div class="wrapper">
<div class="animated fadeIn">
<b-row>
<b-col cols="12">
<b-card
header-tag="header"
footer-tag="footer">
<div slot="header">
<i class="fa fa-align-justify"></i> <strong>Bootstrap Breadcrumb</strong>
<div class="card-actions">
<a href="https://bootstrap-vue.js.org/docs/components/breadcrumb" target="_blank"><small class="text-muted">docs</small></a>
</div>
</div>
<b-breadcrumb :items="items"/>
</b-card>
</b-col>
</b-row>
</div>
</div>
</template>
<script>
export default {
name: 'breadcrumbs',
data () {
return {
items: [{
text: 'Admin',
href: '#'
}, {
text: 'Manage',
href: '#'
}, {
text: 'Library',
active: true
}]
}
}
}
</script>
@@ -0,0 +1,93 @@
<template>
<div class="wrapper">
<div class="animated fadeIn">
<b-row>
<b-col cols="12">
<b-card
header-tag="header"
footer-tag="footer">
<div slot="header">
<i class="fa fa-align-justify"></i> <strong>Bootstrap Carousel</strong>
<div class="card-actions">
<a href="https://bootstrap-vue.js.org/docs/components/carousel" target="_blank"><small class="text-muted">docs</small></a>
</div>
</div>
<div>
<b-carousel id="carousel1"
style="text-shadow: 1px 1px 2px #333;"
controls
indicators
background="#ababab"
:interval="4000"
img-width="1024"
img-height="480"
v-model="slide"
@sliding-start="onSlideStart"
@sliding-end="onSlideEnd"
>
<!-- Text slides with image -->
<b-carousel-slide caption="First slide"
text="Nulla vitae elit libero, a pharetra augue mollis interdum."
img-src="https://lorempixel.com/1024/480/technics/2/"
></b-carousel-slide>
<!-- Slides with custom text -->
<b-carousel-slide img-src="https://lorempixel.com/1024/480/technics/4/">
<h1>Hello world!</h1>
</b-carousel-slide>
<!-- Slides with image only -->
<b-carousel-slide img-src="https://lorempixel.com/1024/480/technics/8/">
</b-carousel-slide>
<!-- Slides with img slot -->
<!-- Note the classes .d-block and .img-fluid to prevent browser default image alignment -->
<b-carousel-slide>
<img slot="img" class="d-block img-fluid w-100" width="1024" height="480"
src="https://lorempixel.com/1024/480/technics/5/" alt="image slot">
</b-carousel-slide>
<!-- Slide with blank fluid image to maintain slide aspect ratio -->
<b-carousel-slide caption="Blank Image" img-blank img-alt="Blank image">
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse
eros felis, tincidunt a tincidunt eget, convallis vel est. Ut pellentesque
ut lacus vel interdum.
</p>
</b-carousel-slide>
</b-carousel>
<p class="mt-4">
Slide #: {{ slide }}<br>
Sliding: {{ sliding }}
</p>
</div>
</b-card>
</b-col>
</b-row>
</div>
</div>
</template>
<script>
export default {
name: 'carousels',
data () {
return {
slide: 0,
sliding: null
}
},
methods: {
onSlideStart (slide) {
this.sliding = true
},
onSlideEnd (slide) {
this.sliding = false
}
}
}
</script>
@@ -0,0 +1,193 @@
<template>
<div class="wrapper">
<div class="animated fadeIn">
<b-row>
<b-col cols="12" md="6">
<b-card header-tag="header" footer-tag="footer">
<div slot="header">
<i class="fa fa-align-justify"></i> <strong>Bootstrap Collapse</strong>
<div class="card-actions">
<a href="https://bootstrap-vue.js.org/docs/components/collapse" target="_blank"><small class="text-muted">docs</small></a>
</div>
</div>
<div>
<b-btn v-b-toggle.collapse1 variant="primary">Toggle Collapse</b-btn>
<b-collapse id="collapse1" class="mt-2">
<b-card>
<p class="card-text">Collapse contents Here</p>
<b-btn v-b-toggle.collapse1_inner size="sm">Toggle Inner Collapse</b-btn>
<b-collapse id=collapse1_inner class="mt-2">
<b-card>Hello!</b-card>
</b-collapse>
</b-card>
</b-collapse>
</div>
</b-card>
</b-col>
<b-col cols="12" md="6">
<b-card
header-tag="header"
footer-tag="footer">
<div slot="header">
<i class="fa fa-align-justify"></i> <strong>Collapse</strong> <small>with <code>v-b-toggle</code> directive</small>
</div>
<div>
<!-- Using modifiers -->
<b-btn v-b-toggle.collapse2 class="m-1">Toggle Collapse</b-btn>
<!-- Using value -->
<b-btn v-b-toggle="'collapse2'" class="m-1">Toggle Collapse</b-btn>
<!-- element to collapse -->
<b-collapse id="collapse2">
<b-card>
I am collapsible content!
</b-card>
</b-collapse>
</div>
</b-card>
</b-col>
</b-row>
<b-row>
<b-col cols="12" md="6">
<b-card
header-tag="header"
footer-tag="footer">
<div slot="header">
<i class="fa fa-align-justify"></i> <strong>Collapse</strong> <small>with <code>visibility</code></small>
</div>
<div>
<b-btn v-b-toggle.collapse3 class="m-1">Toggle Collapse</b-btn>
<b-collapse visible id="collapse3">
<b-card>
I should start open!
</b-card>
</b-collapse>
</div>
</b-card>
</b-col>
<b-col cols="12" md="6">
<b-card
header-tag="header"
footer-tag="footer">
<div slot="header">
<i class="fa fa-align-justify"></i> <strong>Collapse</strong> <small>with <code>v-model</code></small>
</div>
<div>
<b-btn @click="showCollapse = !showCollapse"
:class="showCollapse ? 'collapsed' : null"
aria-controls="collapse4"
:aria-expanded="showCollapse ? 'true' : 'false'">
Toggle Collapse
</b-btn>
<b-collapse class="mt-2" v-model="showCollapse" id="collapse4">
<b-card>
I should start open!
</b-card>
</b-collapse>
</div>
</b-card>
</b-col>
</b-row>
<b-row>
<b-col cols="12" md="6">
<b-card
header-tag="header"
footer-tag="footer">
<div slot="header">
<i class="fa fa-align-justify"></i> <strong>Collapse</strong> <small>multiple elements</small>
</div>
<div>
<!-- Single button triggers two b-collapse components -->
<b-btn v-b-toggle.collapseA.collapseB>Toggle Both Collapse A and B</b-btn>
<!-- elements to collapse -->
<b-collapse id="collapseA" class="mt-2">
<b-card>
I am collapsable content A!
</b-card>
</b-collapse>
<b-collapse id="collapseB" class="mt-2">
<b-card>
I am collapsable content B!
</b-card>
</b-collapse>
</div>
</b-card>
</b-col>
<b-col cols="12" md="6">
<b-card
header-tag="header"
footer-tag="footer">
<div slot="header">
<i class="fa fa-align-justify"></i> <strong>Collapse</strong> <small><code>accordion</code> support</small>
</div>
<div role="tablist">
<b-card no-body class="mb-1">
<b-card-header header-tag="header" class="p-1" role="tab">
<b-btn block href="#" v-b-toggle.accordion1 variant="info">Accordion 1</b-btn>
</b-card-header>
<b-collapse id="accordion1" visible accordion="my-accordion" role="tabpanel">
<b-card-body>
<p class="card-text">
I start opened because <code>visible</code> is <code>true</code>
</p>
<p class="card-text">
{{ text }}
</p>
</b-card-body>
</b-collapse>
</b-card>
<b-card no-body class="mb-1">
<b-card-header header-tag="header" class="p-1" role="tab">
<b-btn block href="#" v-b-toggle.accordion2 variant="info">Accordion 2</b-btn>
</b-card-header>
<b-collapse id="accordion2" accordion="my-accordion" role="tabpanel">
<b-card-body>
<p class="card-text">
{{ text }}
</p>
</b-card-body>
</b-collapse>
</b-card>
<b-card no-body class="mb-1">
<b-card-header header-tag="header" class="p-1" role="tab">
<b-btn block href="#" v-b-toggle.accordion3 variant="info">Accordion 3</b-btn>
</b-card-header>
<b-collapse id="accordion3" accordion="my-accordion" role="tabpanel">
<b-card-body>
<p class="card-text">
{{ text }}
</p>
</b-card-body>
</b-collapse>
</b-card>
</div>
</b-card>
</b-col>
</b-row>
</div>
</div>
</template>
<script>
export default {
name: 'collapses',
data () {
return {
showCollapse: true,
text: `
Anim pariatur cliche reprehenderit, enim eiusmod high life accusamus terry
richardson ad squid. 3 wolf moon officia aute, non cupidatat skateboard dolor
brunch. Food truck quinoa nesciunt laborum eiusmod. Brunch 3 wolf moon
tempor, sunt aliqua put a bird on it squid single-origin coffee nulla
assumenda shoreditch et. Nihil anim keffiyeh helvetica, craft beer labore
wes anderson cred nesciunt sapiente ea proident. Ad vegan excepteur butcher
vice lomo. Leggings occaecat craft beer farm-to-table, raw denim aesthetic
synth nesciunt you probably haven't heard of them accusamus labore VHS.
`
}
}
}
</script>

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