├── .babelrc
├── .circleci
└── config.yml
├── .editorconfig
├── .eslintignore
├── .eslintrc.js
├── .firebaserc
├── .gitignore
├── .postcssrc.js
├── .travis.yml
├── CHANGELOG.md
├── LICENSE
├── README.md
├── build
├── build.js
├── check-versions.js
├── dev-client.js
├── dev-server.js
├── utils.js
├── vue-loader.conf.js
├── webpack.base.conf.js
├── webpack.dev.conf.js
├── webpack.prod.conf.js
└── webpack.test.conf.js
├── config
├── dev.env.js
├── index.js
├── prod.env.js
└── test.env.js
├── firebase.json
├── index.html
├── package.json
├── src
├── App.vue
├── assets
│ ├── images
│ │ ├── apple-icon.png
│ │ ├── cover.jpeg
│ │ ├── faces
│ │ │ └── marc.jpg
│ │ ├── favicon.png
│ │ ├── mask.png
│ │ ├── new_logo.png
│ │ ├── sidebar-1.jpg
│ │ ├── sidebar-2.jpg
│ │ ├── sidebar-3.jpg
│ │ ├── sidebar-4.jpg
│ │ └── tim_80x80.png
│ ├── logo.png
│ └── sass
│ │ ├── material-dashboard.scss
│ │ └── md
│ │ ├── _alerts.scss
│ │ ├── _buttons.scss
│ │ ├── _cards.scss
│ │ ├── _chartist.scss
│ │ ├── _checkboxes.scss
│ │ ├── _colors.scss
│ │ ├── _dialogs.scss
│ │ ├── _dropdown.scss
│ │ ├── _footers.scss
│ │ ├── _forms.scss
│ │ ├── _inputs-size.scss
│ │ ├── _inputs.scss
│ │ ├── _misc.scss
│ │ ├── _mixins.scss
│ │ ├── _navbars.scss
│ │ ├── _pills.scss
│ │ ├── _popups.scss
│ │ ├── _radios.scss
│ │ ├── _responsive.scss
│ │ ├── _ripples.scss
│ │ ├── _shadows.scss
│ │ ├── _sidebar-and-main-panel.scss
│ │ ├── _tables.scss
│ │ ├── _tabs.scss
│ │ ├── _togglebutton.scss
│ │ ├── _typography.scss
│ │ ├── _variables.scss
│ │ ├── mixins
│ │ ├── _chartist.scss
│ │ ├── _transparency.scss
│ │ └── _vendor-prefixes.scss
│ │ └── plugins
│ │ ├── _animate.scss
│ │ └── _plugin-nouislider.scss
├── components
│ ├── Dashboard
│ │ └── index.vue
│ ├── Footer
│ │ └── index.vue
│ ├── GeneralViews
│ │ └── NotFound.vue
│ ├── Icons
│ │ └── index.vue
│ ├── Maps
│ │ └── index.vue
│ ├── Navigation
│ │ ├── index.vue
│ │ ├── navbar-right.vue
│ │ └── navbar-search.vue
│ ├── Notifications
│ │ └── index.vue
│ ├── Sidebar
│ │ ├── index.vue
│ │ └── item.vue
│ ├── TableList
│ │ └── index.vue
│ ├── Typography
│ │ └── index.vue
│ └── UserProfile
│ │ └── index.vue
├── core
│ └── components
│ │ ├── index.js
│ │ ├── mdBlockquote
│ │ └── index.vue
│ │ ├── mdButton
│ │ └── index.vue
│ │ ├── mdCard
│ │ └── index.vue
│ │ ├── mdChartWidget
│ │ └── index.vue
│ │ ├── mdFormGroupInput
│ │ └── index.vue
│ │ ├── mdNotification
│ │ └── index.vue
│ │ ├── mdNotifications
│ │ ├── index.vue
│ │ └── install.js
│ │ ├── mdStatsWidget
│ │ └── index.vue
│ │ ├── mdTab
│ │ ├── constants.js
│ │ ├── index.vue
│ │ ├── nav-tab.vue
│ │ ├── nav-tabs.vue
│ │ └── tab-content.vue
│ │ └── mdTable
│ │ └── index.vue
├── main.js
└── router
│ └── index.js
├── static
├── CNAME
├── js
│ ├── jquery-3.1.0.min.js
│ └── material.min.js
└── vue-material-dashboard-1.png
├── test
├── e2e
│ ├── custom-assertions
│ │ └── elementCount.js
│ ├── nightwatch.conf.js
│ ├── runner.js
│ └── specs
│ │ └── test.js
└── unit
│ ├── .eslintrc
│ ├── helpers
│ └── mount.js
│ ├── index.js
│ ├── karma.conf.js
│ └── specs
│ └── Dashboard.spec.js
└── yarn.lock
/.babelrc:
--------------------------------------------------------------------------------
1 | {
2 | "presets": [
3 | ["env", {
4 | "modules": false,
5 | "targets": {
6 | "browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
7 | }
8 | }],
9 | "stage-2"
10 | ],
11 | "plugins": ["transform-runtime"],
12 | "env": {
13 | "test": {
14 | "presets": ["env", "stage-2"],
15 | "plugins": ["istanbul"]
16 | }
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/.circleci/config.yml:
--------------------------------------------------------------------------------
1 | version: 2
2 | jobs:
3 | build:
4 | working_directory: ~/vue-material-dashboard
5 |
6 | docker:
7 | - image: circleci/node:7.10
8 |
9 | steps:
10 | - checkout
11 | # Download and cache dependencies
12 | - restore_cache:
13 | keys:
14 | - v1-dependencies-{{ checksum "package.json" }}
15 | # fallback to using the latest cache if no exact match is found
16 | - v1-dependencies-
17 |
18 | - run: yarn install
19 |
20 | - save_cache:
21 | paths:
22 | - ./node_modules
23 | key: v1-dependencies-{{ checksum "package.json" }}
24 |
25 | # run tests!
26 | - run: yarn test
27 |
--------------------------------------------------------------------------------
/.editorconfig:
--------------------------------------------------------------------------------
1 | root = true
2 |
3 | [*]
4 | charset = utf-8
5 | indent_style = space
6 | indent_size = 2
7 | end_of_line = lf
8 | insert_final_newline = true
9 | trim_trailing_whitespace = true
10 |
--------------------------------------------------------------------------------
/.eslintignore:
--------------------------------------------------------------------------------
1 | build/*.js
2 | config/*.js
3 |
--------------------------------------------------------------------------------
/.eslintrc.js:
--------------------------------------------------------------------------------
1 | // http://eslint.org/docs/user-guide/configuring
2 |
3 | module.exports = {
4 | root: true,
5 | parser: 'babel-eslint',
6 | parserOptions: {
7 | sourceType: 'module'
8 | },
9 | env: {
10 | browser: true,
11 | },
12 | // https://github.com/feross/standard/blob/master/RULES.md#javascript-standard-style
13 | extends: 'standard',
14 | // required to lint *.vue files
15 | plugins: [
16 | 'html'
17 | ],
18 | // add your custom rules here
19 | 'rules': {
20 | // allow paren-less arrow functions
21 | 'arrow-parens': 0,
22 | // allow async-await
23 | 'generator-star-spacing': 0,
24 | // allow debugger during development
25 | 'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
26 | 'space-before-function-paren': 0,
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/.firebaserc:
--------------------------------------------------------------------------------
1 | {
2 | "projects": {
3 | "default": "vue-material-dashboard"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 |
8 | # Runtime data
9 | pids
10 | *.pid
11 | *.seed
12 | *.pid.lock
13 |
14 | # Directory for instrumented libs generated by jscoverage/JSCover
15 | lib-cov
16 |
17 | # Coverage directory used by tools like istanbul
18 | coverage
19 |
20 | # nyc test coverage
21 | .nyc_output
22 |
23 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
24 | .grunt
25 |
26 | # Bower dependency directory (https://bower.io/)
27 | bower_components
28 |
29 | # node-waf configuration
30 | .lock-wscript
31 |
32 | # Compiled binary addons (http://nodejs.org/api/addons.html)
33 | build/Release
34 |
35 | # Dependency directories
36 | node_modules/
37 | jspm_packages/
38 |
39 | # Typescript v1 declaration files
40 | typings/
41 |
42 | # Optional npm cache directory
43 | .npm
44 |
45 | # Optional eslint cache
46 | .eslintcache
47 |
48 | # Optional REPL history
49 | .node_repl_history
50 |
51 | # Output of 'npm pack'
52 | *.tgz
53 |
54 | # Yarn Integrity file
55 | .yarn-integrity
56 |
57 | # dotenv environment variables file
58 | .env
59 |
60 | .DS_Store
61 | node_modules/
62 | dist/
63 | npm-debug.log*
64 | yarn-debug.log*
65 | yarn-error.log*
66 | test/unit/coverage
67 | test/e2e/reports
68 | selenium-debug.log
69 |
70 | # Editor directories and files
71 | .idea
72 | *.suo
73 | *.ntvs*
74 | *.njsproj
75 | *.sln
76 |
--------------------------------------------------------------------------------
/.postcssrc.js:
--------------------------------------------------------------------------------
1 | // https://github.com/michael-ciniawsky/postcss-load-config
2 |
3 | module.exports = {
4 | "plugins": {
5 | // to edit target browsers: use "browserlist" field in package.json
6 | "autoprefixer": {}
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | sudo: required
2 | dist: trusty
3 | addons:
4 | apt:
5 | sources:
6 | - google-chrome
7 | packages:
8 | - google-chrome-stable
9 | cache:
10 | directories:
11 | - node_modules
12 | language: node_js
13 | node_js:
14 | - "7"
15 | before_install:
16 | - "node --version"
17 | - export DISPLAY=:99.0
18 | - sh -e /etc/init.d/xvfb start
19 | services:
20 | - mongodb
21 | env:
22 | - ENV_OPTS=0
23 | - PHANTOMJS_BIN=./node_modules/.bin/phantomjs
24 | group: deprecated-2017Q2
25 | os: linux
26 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Change Logs
2 | ## v1.0.0 - Jul 13, 2017
3 | Stable Release
4 |
5 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2017 Duong Tuan Luc
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | # vue-material-dashboard
8 |
9 | > Vue Material Dashboard - Inspired by Material Dashboard of Creative Tim.
10 |
11 | This project is using `Vue 2` and based on HTML version of [Material Dashboard](https://www.creative-tim.com/product/material-dashboard) which designed by [Creative Tim](https://www.creative-tim.com/)
12 |
13 | Check the [LIVE DEMO HERE](http://vue-material-dashboard.ltv.vn/) or [HEROKU HERE](https://vue-material-dashboard.herokuapp.com/)
14 |
15 |
16 |
17 |
18 |
19 | ## Notes
20 |
21 | ## Build Setup
22 |
23 | ``` bash
24 | # install dependencies
25 | npm install
26 |
27 | # serve with hot reload at localhost:8080
28 | npm run dev
29 |
30 | # build for production with minification
31 | npm run build
32 |
33 | # build for production and view the bundle analyzer report
34 | npm run build --report
35 |
36 | # run unit tests
37 | npm run unit
38 |
39 | # run e2e tests
40 | npm run e2e
41 |
42 | # run all tests
43 | npm test
44 | ```
45 |
46 | Feel free to use `yarn` instead of `npm`.
47 |
48 | 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).
49 |
50 | ## Notes
51 | The master branch is using `pug` engine. If you are looking for `html` version, please fetch the [HTML](https://github.com/lucduong/vue-material-dashboard/tree/html) branch.
52 |
53 | Special thanks to @[Nguyen San](https://github.com/sandangel) for this contribution.
54 |
55 | ## Contributors
56 | @[Nguyen San](https://github.com/sandangel)
57 |
58 |
--------------------------------------------------------------------------------
/build/build.js:
--------------------------------------------------------------------------------
1 | require('./check-versions')()
2 |
3 | process.env.NODE_ENV = 'production'
4 |
5 | var ora = require('ora')
6 | var rm = require('rimraf')
7 | var path = require('path')
8 | var chalk = require('chalk')
9 | var webpack = require('webpack')
10 | var config = require('../config')
11 | var webpackConfig = require('./webpack.prod.conf')
12 |
13 | var spinner = ora('building for production...')
14 | spinner.start()
15 |
16 | rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
17 | if (err) throw err
18 | webpack(webpackConfig, function (err, stats) {
19 | spinner.stop()
20 | if (err) throw err
21 | process.stdout.write(stats.toString({
22 | colors: true,
23 | modules: false,
24 | children: false,
25 | chunks: false,
26 | chunkModules: false
27 | }) + '\n\n')
28 |
29 | console.log(chalk.cyan(' Build complete.\n'))
30 | console.log(chalk.yellow(
31 | ' Tip: built files are meant to be served over an HTTP server.\n' +
32 | ' Opening index.html over file:// won\'t work.\n'
33 | ))
34 | })
35 | })
36 |
--------------------------------------------------------------------------------
/build/check-versions.js:
--------------------------------------------------------------------------------
1 | var chalk = require('chalk')
2 | var semver = require('semver')
3 | var packageConfig = require('../package.json')
4 | var shell = require('shelljs')
5 | function exec (cmd) {
6 | return require('child_process').execSync(cmd).toString().trim()
7 | }
8 |
9 | var versionRequirements = [
10 | {
11 | name: 'node',
12 | currentVersion: semver.clean(process.version),
13 | versionRequirement: packageConfig.engines.node
14 | },
15 | ]
16 |
17 | if (shell.which('npm')) {
18 | versionRequirements.push({
19 | name: 'npm',
20 | currentVersion: exec('npm --version'),
21 | versionRequirement: packageConfig.engines.npm
22 | })
23 | }
24 |
25 | module.exports = function () {
26 | var warnings = []
27 | for (var i = 0; i < versionRequirements.length; i++) {
28 | var mod = versionRequirements[i]
29 | if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
30 | warnings.push(mod.name + ': ' +
31 | chalk.red(mod.currentVersion) + ' should be ' +
32 | chalk.green(mod.versionRequirement)
33 | )
34 | }
35 | }
36 |
37 | if (warnings.length) {
38 | console.log('')
39 | console.log(chalk.yellow('To use this template, you must update following to modules:'))
40 | console.log()
41 | for (var i = 0; i < warnings.length; i++) {
42 | var warning = warnings[i]
43 | console.log(' ' + warning)
44 | }
45 | console.log()
46 | process.exit(1)
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/build/dev-client.js:
--------------------------------------------------------------------------------
1 | /* eslint-disable */
2 | require('eventsource-polyfill')
3 | var hotClient = require('webpack-hot-middleware/client?noInfo=true&reload=true')
4 |
5 | hotClient.subscribe(function (event) {
6 | if (event.action === 'reload') {
7 | window.location.reload()
8 | }
9 | })
10 |
--------------------------------------------------------------------------------
/build/dev-server.js:
--------------------------------------------------------------------------------
1 | require('./check-versions')()
2 |
3 | var config = require('../config')
4 | if (!process.env.NODE_ENV) {
5 | process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV)
6 | }
7 |
8 | var opn = require('opn')
9 | var path = require('path')
10 | var express = require('express')
11 | var webpack = require('webpack')
12 | var proxyMiddleware = require('http-proxy-middleware')
13 | var webpackConfig = process.env.NODE_ENV === 'testing'
14 | ? require('./webpack.prod.conf')
15 | : require('./webpack.dev.conf')
16 |
17 | // default port where dev server listens for incoming traffic
18 | var port = process.env.PORT || config.dev.port
19 | // automatically open browser, if not set will be false
20 | var autoOpenBrowser = !!config.dev.autoOpenBrowser
21 | // Define HTTP proxies to your custom API backend
22 | // https://github.com/chimurai/http-proxy-middleware
23 | var proxyTable = config.dev.proxyTable
24 |
25 | var app = express()
26 | var compiler = webpack(webpackConfig)
27 |
28 | var devMiddleware = require('webpack-dev-middleware')(compiler, {
29 | publicPath: webpackConfig.output.publicPath,
30 | quiet: true
31 | })
32 |
33 | var hotMiddleware = require('webpack-hot-middleware')(compiler, {
34 | log: () => {}
35 | })
36 | // force page reload when html-webpack-plugin template changes
37 | compiler.plugin('compilation', function (compilation) {
38 | compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) {
39 | hotMiddleware.publish({ action: 'reload' })
40 | cb()
41 | })
42 | })
43 |
44 | // proxy api requests
45 | Object.keys(proxyTable).forEach(function (context) {
46 | var options = proxyTable[context]
47 | if (typeof options === 'string') {
48 | options = { target: options }
49 | }
50 | app.use(proxyMiddleware(options.filter || context, options))
51 | })
52 |
53 | // handle fallback for HTML5 history API
54 | app.use(require('connect-history-api-fallback')())
55 |
56 | // serve webpack bundle output
57 | app.use(devMiddleware)
58 |
59 | // enable hot-reload and state-preserving
60 | // compilation error display
61 | app.use(hotMiddleware)
62 |
63 | // serve pure static assets
64 | var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory)
65 | app.use(staticPath, express.static('./static'))
66 |
67 | var uri = 'http://localhost:' + port
68 |
69 | var _resolve
70 | var readyPromise = new Promise(resolve => {
71 | _resolve = resolve
72 | })
73 |
74 | console.log('> Starting dev server...')
75 | devMiddleware.waitUntilValid(() => {
76 | console.log('> Listening at ' + uri + '\n')
77 | // when env is testing, don't need open it
78 | if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') {
79 | opn(uri)
80 | }
81 | _resolve()
82 | })
83 |
84 | var server = app.listen(port)
85 |
86 | module.exports = {
87 | ready: readyPromise,
88 | close: () => {
89 | server.close()
90 | }
91 | }
92 |
--------------------------------------------------------------------------------
/build/utils.js:
--------------------------------------------------------------------------------
1 | var path = require('path')
2 | var config = require('../config')
3 | var ExtractTextPlugin = require('extract-text-webpack-plugin')
4 |
5 | exports.assetsPath = function (_path) {
6 | var assetsSubDirectory = process.env.NODE_ENV === 'production'
7 | ? config.build.assetsSubDirectory
8 | : config.dev.assetsSubDirectory
9 | return path.posix.join(assetsSubDirectory, _path)
10 | }
11 |
12 | exports.cssLoaders = function (options) {
13 | options = options || {}
14 |
15 | var cssLoader = {
16 | loader: 'css-loader',
17 | options: {
18 | minimize: process.env.NODE_ENV === 'production',
19 | sourceMap: options.sourceMap
20 | }
21 | }
22 |
23 | // generate loader string to be used with extract text plugin
24 | function generateLoaders (loader, loaderOptions) {
25 | var loaders = [cssLoader]
26 | if (loader) {
27 | loaders.push({
28 | loader: loader + '-loader',
29 | options: Object.assign({}, loaderOptions, {
30 | sourceMap: options.sourceMap
31 | })
32 | })
33 | }
34 |
35 | // Extract CSS when that option is specified
36 | // (which is the case during production build)
37 | if (options.extract) {
38 | return ExtractTextPlugin.extract({
39 | use: loaders,
40 | fallback: 'vue-style-loader'
41 | })
42 | } else {
43 | return ['vue-style-loader'].concat(loaders)
44 | }
45 | }
46 |
47 | // https://vue-loader.vuejs.org/en/configurations/extract-css.html
48 | return {
49 | css: generateLoaders(),
50 | postcss: generateLoaders(),
51 | less: generateLoaders('less'),
52 | sass: generateLoaders('sass', { indentedSyntax: true }),
53 | scss: generateLoaders('sass'),
54 | stylus: generateLoaders('stylus'),
55 | styl: generateLoaders('stylus')
56 | }
57 | }
58 |
59 | // Generate loaders for standalone style files (outside of .vue)
60 | exports.styleLoaders = function (options) {
61 | var output = []
62 | var loaders = exports.cssLoaders(options)
63 | for (var extension in loaders) {
64 | var loader = loaders[extension]
65 | output.push({
66 | test: new RegExp('\\.' + extension + '$'),
67 | use: loader
68 | })
69 | }
70 | return output
71 | }
72 |
--------------------------------------------------------------------------------
/build/vue-loader.conf.js:
--------------------------------------------------------------------------------
1 | var utils = require('./utils')
2 | var config = require('../config')
3 | var isProduction = process.env.NODE_ENV === 'production'
4 |
5 | module.exports = {
6 | loaders: {
7 | css: utils.cssLoaders({
8 | sourceMap: isProduction
9 | ? config.build.productionSourceMap
10 | : config.dev.cssSourceMap,
11 | extract: isProduction
12 | })
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/build/webpack.base.conf.js:
--------------------------------------------------------------------------------
1 | var path = require('path')
2 | var utils = require('./utils')
3 | var config = require('../config')
4 | var vueLoaderConfig = require('./vue-loader.conf')
5 |
6 | function resolve(dir) {
7 | return path.join(__dirname, '..', dir)
8 | }
9 |
10 | module.exports = {
11 | entry: {
12 | app: './src/main.js'
13 | },
14 | output: {
15 | path: config.build.assetsRoot,
16 | filename: '[name].js',
17 | publicPath: process.env.NODE_ENV === 'production'
18 | ? config.build.assetsPublicPath
19 | : config.dev.assetsPublicPaths
20 | },
21 | resolve: {
22 | extensions: ['.js', '.vue', '.json'],
23 | alias: {
24 | "images": path.resolve(__dirname, "..", "src", "assets", "images"),
25 | 'vue$': 'vue/dist/vue.esm.js',
26 | '@': resolve('src'),
27 | }
28 | },
29 | module: {
30 | rules: [
31 | {
32 | test: /\.(js|vue)$/,
33 | loader: 'eslint-loader',
34 | enforce: 'pre',
35 | include: [resolve('src'), resolve('test')],
36 | exclude: [resolve('src/assets/js'), resolve('node_modules')],
37 | options: {
38 | formatter: require('eslint-friendly-formatter')
39 | }
40 | },
41 | {
42 | test: /\.vue$/,
43 | loader: 'vue-loader',
44 | options: vueLoaderConfig
45 | },
46 | {
47 | test: /\.js$/,
48 | loader: 'babel-loader',
49 | include: [resolve('src'), resolve('test')]
50 | },
51 | {
52 | test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
53 | loader: 'url-loader',
54 | options: {
55 | limit: 10000,
56 | name: utils.assetsPath('images/[name].[hash:7].[ext]')
57 | }
58 | },
59 | {
60 | test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
61 | loader: 'url-loader',
62 | options: {
63 | limit: 10000,
64 | name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
65 | }
66 | }
67 | ]
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/build/webpack.dev.conf.js:
--------------------------------------------------------------------------------
1 | var utils = require('./utils')
2 | var webpack = require('webpack')
3 | var config = require('../config')
4 | var merge = require('webpack-merge')
5 | var baseWebpackConfig = require('./webpack.base.conf')
6 | var HtmlWebpackPlugin = require('html-webpack-plugin')
7 | var FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
8 |
9 | // add hot-reload related code to entry chunks
10 | Object.keys(baseWebpackConfig.entry).forEach(function (name) {
11 | baseWebpackConfig.entry[name] = ['./build/dev-client'].concat(baseWebpackConfig.entry[name])
12 | })
13 |
14 | module.exports = merge(baseWebpackConfig, {
15 | module: {
16 | rules: utils.styleLoaders({ sourceMap: config.dev.cssSourceMap })
17 | },
18 | // cheap-module-eval-source-map is faster for development
19 | devtool: '#cheap-module-eval-source-map',
20 | plugins: [
21 | new webpack.DefinePlugin({
22 | 'process.env': config.dev.env
23 | }),
24 | // https://github.com/glenjamin/webpack-hot-middleware#installation--usage
25 | new webpack.HotModuleReplacementPlugin(),
26 | new webpack.NoEmitOnErrorsPlugin(),
27 | // https://github.com/ampedandwired/html-webpack-plugin
28 | new HtmlWebpackPlugin({
29 | filename: 'index.html',
30 | template: 'index.html',
31 | inject: true
32 | }),
33 | new FriendlyErrorsPlugin()
34 | ]
35 | })
36 |
--------------------------------------------------------------------------------
/build/webpack.prod.conf.js:
--------------------------------------------------------------------------------
1 | var path = require('path')
2 | var utils = require('./utils')
3 | var webpack = require('webpack')
4 | var config = require('../config')
5 | var merge = require('webpack-merge')
6 | var baseWebpackConfig = require('./webpack.base.conf')
7 | var CopyWebpackPlugin = require('copy-webpack-plugin')
8 | var HtmlWebpackPlugin = require('html-webpack-plugin')
9 | var ExtractTextPlugin = require('extract-text-webpack-plugin')
10 | var OptimizeCSSPlugin = require('optimize-css-assets-webpack-plugin')
11 |
12 | var env = process.env.NODE_ENV === 'testing'
13 | ? require('../config/test.env')
14 | : config.build.env
15 |
16 | var webpackConfig = merge(baseWebpackConfig, {
17 | module: {
18 | rules: utils.styleLoaders({
19 | sourceMap: config.build.productionSourceMap,
20 | extract: true
21 | })
22 | },
23 | devtool: config.build.productionSourceMap ? '#source-map' : false,
24 | output: {
25 | path: config.build.assetsRoot,
26 | filename: utils.assetsPath('js/[name].[chunkhash].js'),
27 | chunkFilename: utils.assetsPath('js/[id].[chunkhash].js')
28 | },
29 | plugins: [
30 | // http://vuejs.github.io/vue-loader/en/workflow/production.html
31 | new webpack.DefinePlugin({
32 | 'process.env': env
33 | }),
34 | new webpack.optimize.UglifyJsPlugin({
35 | compress: {
36 | warnings: false
37 | },
38 | sourceMap: true
39 | }),
40 | // extract css into its own file
41 | new ExtractTextPlugin({
42 | filename: utils.assetsPath('css/[name].[contenthash].css')
43 | }),
44 | // Compress extracted CSS. We are using this plugin so that possible
45 | // duplicated CSS from different components can be deduped.
46 | new OptimizeCSSPlugin({
47 | cssProcessorOptions: {
48 | safe: true
49 | }
50 | }),
51 | // generate dist index.html with correct asset hash for caching.
52 | // you can customize output by editing /index.html
53 | // see https://github.com/ampedandwired/html-webpack-plugin
54 | new HtmlWebpackPlugin({
55 | filename: process.env.NODE_ENV === 'testing'
56 | ? 'index.html'
57 | : config.build.index,
58 | template: 'index.html',
59 | inject: true,
60 | minify: {
61 | removeComments: true,
62 | collapseWhitespace: true,
63 | removeAttributeQuotes: true
64 | // more options:
65 | // https://github.com/kangax/html-minifier#options-quick-reference
66 | },
67 | // necessary to consistently work with multiple chunks via CommonsChunkPlugin
68 | chunksSortMode: 'dependency'
69 | }),
70 | // split vendor js into its own file
71 | new webpack.optimize.CommonsChunkPlugin({
72 | name: 'vendor',
73 | minChunks: function (module, count) {
74 | // any required modules inside node_modules are extracted to vendor
75 | return (
76 | module.resource &&
77 | /\.js$/.test(module.resource) &&
78 | module.resource.indexOf(
79 | path.join(__dirname, '../node_modules')
80 | ) === 0
81 | )
82 | }
83 | }),
84 | // extract webpack runtime and module manifest to its own file in order to
85 | // prevent vendor hash from being updated whenever app bundle is updated
86 | new webpack.optimize.CommonsChunkPlugin({
87 | name: 'manifest',
88 | chunks: ['vendor']
89 | }),
90 | // copy custom static assets
91 | new CopyWebpackPlugin([
92 | {
93 | from: path.resolve(__dirname, '../static'),
94 | to: config.build.assetsSubDirectory,
95 | ignore: ['.*']
96 | }
97 | ])
98 | ]
99 | })
100 |
101 | if (config.build.productionGzip) {
102 | var CompressionWebpackPlugin = require('compression-webpack-plugin')
103 |
104 | webpackConfig.plugins.push(
105 | new CompressionWebpackPlugin({
106 | asset: '[path].gz[query]',
107 | algorithm: 'gzip',
108 | test: new RegExp(
109 | '\\.(' +
110 | config.build.productionGzipExtensions.join('|') +
111 | ')$'
112 | ),
113 | threshold: 10240,
114 | minRatio: 0.8
115 | })
116 | )
117 | }
118 |
119 | if (config.build.bundleAnalyzerReport) {
120 | var BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin
121 | webpackConfig.plugins.push(new BundleAnalyzerPlugin())
122 | }
123 |
124 | module.exports = webpackConfig
125 |
--------------------------------------------------------------------------------
/build/webpack.test.conf.js:
--------------------------------------------------------------------------------
1 | // This is the webpack config used for unit tests.
2 |
3 | var utils = require('./utils')
4 | var webpack = require('webpack')
5 | var merge = require('webpack-merge')
6 | var baseConfig = require('./webpack.base.conf')
7 |
8 | var webpackConfig = merge(baseConfig, {
9 | // use inline sourcemap for karma-sourcemap-loader
10 | module: {
11 | rules: utils.styleLoaders()
12 | },
13 | devtool: '#inline-source-map',
14 | resolveLoader: {
15 | alias: {
16 | // necessary to to make lang="scss" work in test when using vue-loader's ?inject option
17 | // see discussion at https://github.com/vuejs/vue-loader/issues/724
18 | 'scss-loader': 'sass-loader'
19 | }
20 | },
21 | plugins: [
22 | new webpack.DefinePlugin({
23 | 'process.env': require('../config/test.env')
24 | })
25 | ]
26 | })
27 |
28 | // no need for app entry during tests
29 | delete webpackConfig.entry
30 |
31 | module.exports = webpackConfig
32 |
--------------------------------------------------------------------------------
/config/dev.env.js:
--------------------------------------------------------------------------------
1 | var merge = require('webpack-merge')
2 | var prodEnv = require('./prod.env')
3 |
4 | module.exports = merge(prodEnv, {
5 | NODE_ENV: '"development"'
6 | })
7 |
--------------------------------------------------------------------------------
/config/index.js:
--------------------------------------------------------------------------------
1 | // see http://vuejs-templates.github.io/webpack for documentation.
2 | var path = require('path')
3 |
4 | module.exports = {
5 | build: {
6 | env: require('./prod.env'),
7 | index: path.resolve(__dirname, '../dist/index.html'),
8 | assetsRoot: path.resolve(__dirname, '../dist'),
9 | assetsSubDirectory: 'static',
10 | assetsPublicPath: '/',
11 | productionSourceMap: true,
12 | // Gzip off by default as many popular static hosts such as
13 | // Surge or Netlify already gzip all static assets for you.
14 | // Before setting to `true`, make sure to:
15 | // npm install --save-dev compression-webpack-plugin
16 | productionGzip: false,
17 | productionGzipExtensions: ['js', 'css'],
18 | // Run the build command with an extra argument to
19 | // View the bundle analyzer report after build finishes:
20 | // `npm run build --report`
21 | // Set to `true` or `false` to always turn it on or off
22 | bundleAnalyzerReport: process.env.npm_config_report
23 | },
24 | dev: {
25 | env: require('./dev.env'),
26 | port: 8080,
27 | autoOpenBrowser: true,
28 | assetsSubDirectory: 'static',
29 | assetsPublicPath: '/',
30 | proxyTable: {},
31 | // CSS Sourcemaps off by default because relative paths are "buggy"
32 | // with this option, according to the CSS-Loader README
33 | // (https://github.com/webpack/css-loader#sourcemaps)
34 | // In our experience, they generally work as expected,
35 | // just be aware of this issue when enabling this option.
36 | cssSourceMap: false
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/config/prod.env.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | NODE_ENV: '"production"'
3 | }
4 |
--------------------------------------------------------------------------------
/config/test.env.js:
--------------------------------------------------------------------------------
1 | var merge = require('webpack-merge')
2 | var devEnv = require('./dev.env')
3 |
4 | module.exports = merge(devEnv, {
5 | NODE_ENV: '"testing"'
6 | })
7 |
--------------------------------------------------------------------------------
/firebase.json:
--------------------------------------------------------------------------------
1 | {
2 | "hosting": {
3 | "public": "./dist",
4 | "rewrites": [
5 | {
6 | "source": "**",
7 | "destination": "/index.html"
8 | }
9 | ]
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 | vue-material-dashboard
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "vue-material-dashboard",
3 | "version": "1.0.0",
4 | "description": "Vue Material Dashboard - Inspired by Material Dashboard of Creative Tim.",
5 | "author": "Luc ",
6 | "private": true,
7 | "scripts": {
8 | "dev": "node build/dev-server.js",
9 | "start": "node build/dev-server.js",
10 | "build": "node build/build.js",
11 | "unit": "cross-env BABEL_ENV=test karma start test/unit/karma.conf.js --single-run",
12 | "e2e": "node test/e2e/runner.js",
13 | "test": "yarn run unit && yarn run e2e",
14 | "lint": "eslint --ext .js,.vue src test/unit/specs test/e2e/specs"
15 | },
16 | "dependencies": {
17 | "bootstrap": "^3.3.7",
18 | "chartist": "^0.11.0",
19 | "pug": "^2.0.0-rc.2",
20 | "v-click-outside": "^0.0.8",
21 | "vue": "^2.3.3",
22 | "vue-router": "^2.3.1"
23 | },
24 | "devDependencies": {
25 | "autoprefixer": "^6.7.2",
26 | "babel-core": "^6.22.1",
27 | "babel-eslint": "^7.1.1",
28 | "babel-loader": "^6.2.10",
29 | "babel-plugin-istanbul": "^4.1.1",
30 | "babel-plugin-transform-runtime": "^6.22.0",
31 | "babel-preset-env": "^1.3.2",
32 | "babel-preset-stage-2": "^6.22.0",
33 | "babel-register": "^6.22.0",
34 | "chai": "^3.5.0",
35 | "chalk": "^2.0.1",
36 | "chromedriver": "^2.27.2",
37 | "connect-history-api-fallback": "^1.3.0",
38 | "copy-webpack-plugin": "^4.0.1",
39 | "cross-env": "^4.0.0",
40 | "cross-spawn": "^5.0.1",
41 | "css-loader": "^0.28.0",
42 | "eslint": "^3.19.0",
43 | "eslint-config-standard": "^6.2.1",
44 | "eslint-friendly-formatter": "^2.0.7",
45 | "eslint-loader": "^1.7.1",
46 | "eslint-plugin-html": "^2.0.0",
47 | "eslint-plugin-promise": "^3.4.0",
48 | "eslint-plugin-standard": "^2.0.1",
49 | "eventsource-polyfill": "^0.9.6",
50 | "express": "^4.14.1",
51 | "extract-text-webpack-plugin": "^2.0.0",
52 | "file-loader": "^0.11.1",
53 | "friendly-errors-webpack-plugin": "^1.1.3",
54 | "function-bind": "^1.1.0",
55 | "html-webpack-plugin": "^2.28.0",
56 | "http-proxy-middleware": "^0.17.3",
57 | "inject-loader": "^3.0.0",
58 | "karma": "^1.4.1",
59 | "karma-coverage": "^1.1.1",
60 | "karma-mocha": "^1.3.0",
61 | "karma-phantomjs-launcher": "^1.0.2",
62 | "karma-phantomjs-shim": "^1.4.0",
63 | "karma-sinon-chai": "^1.3.1",
64 | "karma-sourcemap-loader": "^0.3.7",
65 | "karma-spec-reporter": "0.0.30",
66 | "karma-webpack": "^2.0.2",
67 | "lolex": "^1.5.2",
68 | "mocha": "^3.2.0",
69 | "nightwatch": "^0.9.12",
70 | "node-sass": "^4.5.3",
71 | "opn": "^4.0.2",
72 | "optimize-css-assets-webpack-plugin": "^1.3.0",
73 | "ora": "^1.2.0",
74 | "phantomjs-prebuilt": "^2.1.14",
75 | "rimraf": "^2.6.0",
76 | "sass-loader": "^6.0.6",
77 | "selenium-server": "^3.0.1",
78 | "semver": "^5.3.0",
79 | "shelljs": "^0.7.6",
80 | "sinon": "^2.1.0",
81 | "sinon-chai": "^2.8.0",
82 | "url-loader": "^0.5.8",
83 | "vue-loader": "^12.1.0",
84 | "vue-style-loader": "^3.0.1",
85 | "vue-template-compiler": "^2.3.3",
86 | "webpack": "^2.6.1",
87 | "webpack-bundle-analyzer": "^2.2.1",
88 | "webpack-dev-middleware": "^1.10.0",
89 | "webpack-hot-middleware": "^2.18.0",
90 | "webpack-merge": "^4.1.0"
91 | },
92 | "engines": {
93 | "node": ">= 6.9.0",
94 | "npm": ">= 3.0.0"
95 | },
96 | "browserslist": [
97 | "> 1%",
98 | "last 2 versions",
99 | "not ie <= 8"
100 | ]
101 | }
102 |
--------------------------------------------------------------------------------
/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 | #app
3 | .wrapper(:class="{ 'nav-open' : navOpened }")
4 | sidebar(:open='navOpened')
5 | md-notifications
6 | .main-panel
7 | navigation(@toggleSideBar='toggleSideBar')
8 | router-view
9 | md-footer
10 | .close-layer(v-if='navOpened', @click='onCloseLayerClick')
11 |
12 |
13 |
59 |
60 |
126 |
127 |
--------------------------------------------------------------------------------
/src/assets/images/apple-icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucwj/vue-material-dashboard/c655b1ec14734a5f708b2099ed3e94ef991dfb78/src/assets/images/apple-icon.png
--------------------------------------------------------------------------------
/src/assets/images/cover.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucwj/vue-material-dashboard/c655b1ec14734a5f708b2099ed3e94ef991dfb78/src/assets/images/cover.jpeg
--------------------------------------------------------------------------------
/src/assets/images/faces/marc.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucwj/vue-material-dashboard/c655b1ec14734a5f708b2099ed3e94ef991dfb78/src/assets/images/faces/marc.jpg
--------------------------------------------------------------------------------
/src/assets/images/favicon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucwj/vue-material-dashboard/c655b1ec14734a5f708b2099ed3e94ef991dfb78/src/assets/images/favicon.png
--------------------------------------------------------------------------------
/src/assets/images/mask.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucwj/vue-material-dashboard/c655b1ec14734a5f708b2099ed3e94ef991dfb78/src/assets/images/mask.png
--------------------------------------------------------------------------------
/src/assets/images/new_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucwj/vue-material-dashboard/c655b1ec14734a5f708b2099ed3e94ef991dfb78/src/assets/images/new_logo.png
--------------------------------------------------------------------------------
/src/assets/images/sidebar-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucwj/vue-material-dashboard/c655b1ec14734a5f708b2099ed3e94ef991dfb78/src/assets/images/sidebar-1.jpg
--------------------------------------------------------------------------------
/src/assets/images/sidebar-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucwj/vue-material-dashboard/c655b1ec14734a5f708b2099ed3e94ef991dfb78/src/assets/images/sidebar-2.jpg
--------------------------------------------------------------------------------
/src/assets/images/sidebar-3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucwj/vue-material-dashboard/c655b1ec14734a5f708b2099ed3e94ef991dfb78/src/assets/images/sidebar-3.jpg
--------------------------------------------------------------------------------
/src/assets/images/sidebar-4.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucwj/vue-material-dashboard/c655b1ec14734a5f708b2099ed3e94ef991dfb78/src/assets/images/sidebar-4.jpg
--------------------------------------------------------------------------------
/src/assets/images/tim_80x80.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucwj/vue-material-dashboard/c655b1ec14734a5f708b2099ed3e94ef991dfb78/src/assets/images/tim_80x80.png
--------------------------------------------------------------------------------
/src/assets/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucwj/vue-material-dashboard/c655b1ec14734a5f708b2099ed3e94ef991dfb78/src/assets/logo.png
--------------------------------------------------------------------------------
/src/assets/sass/material-dashboard.scss:
--------------------------------------------------------------------------------
1 | /*!
2 |
3 | =========================================================
4 | * Material Dashboard - v1.1.1.0
5 | =========================================================
6 |
7 | * Product Page: http://www.creative-tim.com/product/material-dashboard
8 | * Copyright 2017 Creative Tim (http://www.creative-tim.com)
9 | * Licensed under MIT (https://github.com/creativetimofficial/material-dashboard/blob/master/LICENSE.md)
10 |
11 | =========================================================
12 |
13 | * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
14 |
15 | */
16 |
17 |
18 | //variables and mixins
19 | @import "md/variables";
20 | @import "md/mixins";
21 | @import "md/shadows";
22 |
23 | //plugin css
24 | @import "md/plugins/_plugin-nouislider";
25 | @import "md/plugins/_animate";
26 |
27 | // Core CSS
28 | @import "md/typography";
29 | @import "md/sidebar-and-main-panel";
30 | @import "md/buttons";
31 | @import "md/misc";
32 | @import "md/inputs";
33 | @import "md/forms";
34 | @import "md/alerts";
35 | @import "md/tables";
36 | @import "md/checkboxes";
37 | @import "md/radios";
38 | @import "md/togglebutton";
39 | @import "md/ripples";
40 | @import "md/pills";
41 | @import "md/dialogs";
42 | @import "md/navbars";
43 | @import "md/popups";
44 | @import "md/footers";
45 |
46 | // Fancy Stuff
47 | @import "md/dropdown";
48 | @import "md/cards";
49 | @import "md/tabs";
50 | @import "md/chartist";
51 | @import "md/responsive";
52 |
--------------------------------------------------------------------------------
/src/assets/sass/md/_alerts.scss:
--------------------------------------------------------------------------------
1 | // This file has been autogenerated by grunt task lessToSass. Any changes will be overwritten.
2 |
3 | .alert {
4 | border: 0;
5 | border-radius: 0;
6 | position: relative;
7 | padding: 20px 15px;
8 | line-height: 20px;
9 |
10 | b{
11 | font-weight: $font-weight-bold;
12 | text-transform: uppercase;
13 | font-size: $font-size-small;
14 | }
15 | // SASS conversion note: please mirror any content change in _mixins-shared.scss alert-variations-content
16 | @include alert-variations(unquote(".alert"), unquote(""), $mdb-text-color-light);
17 |
18 | &-info, &-danger, &-warning, &-success {
19 | color: $mdb-text-color-light;
20 | }
21 |
22 | &-default {
23 | a, .alert-link {
24 | color: $mdb-text-color-primary;
25 | }
26 | }
27 |
28 | i[data-notify="icon"] {
29 | font-size: 30px;
30 | display: block;
31 | left: 15px;
32 | position: absolute;
33 | top: 50%;
34 | margin-top: -15px;
35 | }
36 |
37 | span{
38 | display: block;
39 | max-width: 89%;
40 | }
41 |
42 | .alert-icon{
43 | display: block;
44 | float: left;
45 | margin-right: $margin-base;
46 |
47 | i{
48 | margin-top: -7px;
49 | top: 5px;
50 | position: relative;
51 | }
52 | }
53 | }
54 |
55 | .alert.alert-with-icon {
56 | padding-left: 65px;
57 | }
58 |
--------------------------------------------------------------------------------
/src/assets/sass/md/_buttons.scss:
--------------------------------------------------------------------------------
1 | .btn,
2 | .navbar .navbar-nav > li > a.btn{
3 | border: none;
4 | border-radius: $border-radius-base;
5 | position: relative;
6 | padding: 12px 30px;
7 | margin: 10px 1px;
8 |
9 | font-size: $mdb-btn-font-size-base;
10 | font-weight: 400;
11 | text-transform: uppercase;
12 | letter-spacing: 0;
13 |
14 | will-change: box-shadow, transform;
15 | transition: box-shadow 0.2s $mdb-animation-curve-fast-out-linear-in,
16 | background-color 0.2s $mdb-animation-curve-default;
17 |
18 | &::-moz-focus-inner {
19 | border: 0;
20 | }
21 |
22 | &,
23 | &.btn-default{
24 | @include btn-styles($gray-light);
25 | }
26 |
27 | &.btn-primary{
28 | @include btn-styles($brand-primary);
29 | }
30 | &.btn-info{
31 | @include btn-styles($brand-info);
32 | }
33 | &.btn-success{
34 | @include btn-styles($brand-success);
35 | }
36 | &.btn-warning{
37 | @include btn-styles($brand-warning);
38 | }
39 | &.btn-danger{
40 | @include btn-styles($brand-danger);
41 | }
42 | &.btn-white{
43 | &,
44 | &:focus,
45 | &:hover{
46 | background-color: $white-color;
47 | color: $gray-light;
48 | }
49 | &.btn-simple{
50 | color: #FFFFFF;
51 | background: transparent;
52 | box-shadow: none;
53 | }
54 | }
55 |
56 | // social buttons
57 | &.btn-facebook {
58 | @include social-buttons-color($social-facebook);
59 | }
60 | &.btn-twitter {
61 | @include social-buttons-color($social-twitter);
62 | }
63 | &.btn-pinterest {
64 | @include social-buttons-color($social-pinterest);
65 | }
66 | &.btn-google {
67 | @include social-buttons-color($social-google);
68 | }
69 | &.btn-instagram {
70 | @include social-buttons-color($social-instagram);
71 | }
72 |
73 | &:focus,
74 | &:active,
75 | &:active:focus{
76 | outline: 0;
77 | }
78 |
79 | &.btn-round{
80 | border-radius: $border-radius-extreme;
81 | }
82 |
83 | &:not(.btn-just-icon):not(.btn-fab){
84 | .fa{
85 | font-size: 18px;
86 | margin-top: -2px;
87 | position: relative;
88 | top: 2px;
89 | }
90 | }
91 |
92 |
93 | &.btn-fab {
94 | // see above for color variations
95 | border-radius: 50%;
96 | font-size: $mdb-btn-fab-font-size;
97 | height: $mdb-btn-fab-size;
98 | margin: auto;
99 | min-width: $mdb-btn-fab-size;
100 | width: $mdb-btn-fab-size;
101 | padding: 0;
102 | overflow: hidden;
103 | position: relative;
104 | line-height: normal;
105 |
106 | .ripple-container {
107 | border-radius: 50%;
108 | }
109 |
110 | &.btn-fab-mini,
111 | .btn-group-sm & {
112 | height: $mdb-btn-fab-size-mini;
113 | min-width: $mdb-btn-fab-size-mini;
114 | width: $mdb-btn-fab-size-mini;
115 |
116 | &.material-icons {
117 | top: ($mdb-btn-icon-size-mini - $mdb-btn-fab-font-size) / 2;
118 | left: ($mdb-btn-icon-size-mini - $mdb-btn-fab-font-size) / 2;
119 | }
120 |
121 | .material-icons{
122 | font-size: $mdb-btn-icon-size-mini;
123 | }
124 | }
125 |
126 | i.material-icons {
127 | position: absolute;
128 | top: 50%;
129 | left: 50%;
130 | transform: translate(-($mdb-btn-fab-font-size / 2), -($mdb-btn-fab-font-size / 2));
131 | line-height: $mdb-btn-fab-font-size;
132 | width: $mdb-btn-fab-font-size;
133 | font-size: $mdb-btn-fab-font-size;
134 | }
135 | }
136 |
137 | // Size variations
138 | &.btn-lg,
139 | .btn-group-lg & {
140 | font-size: $mdb-btn-font-size-lg;
141 | padding: 18px 36px;
142 | }
143 | &.btn-sm,
144 | .btn-group-sm & {
145 | padding: 5px 20px;
146 | font-size: $mdb-btn-font-size-sm;
147 | }
148 | &.btn-xs,
149 | .btn-group-xs & {
150 | padding: 4px 15px;
151 | font-size: $mdb-btn-font-size-xs;
152 | }
153 |
154 | &.btn-just-icon{
155 | font-size: 20px;
156 | padding: 12px 12px;
157 | line-height: 1em;
158 |
159 | i{
160 | width: 20px;
161 | }
162 | &.btn-lg{
163 | font-size: 22px;
164 | padding: 13px 18px;
165 | }
166 | }
167 | }
168 |
169 | .btn{
170 | // Align icons inside buttons with text
171 | .material-icons{
172 | vertical-align: middle;
173 | font-size: $mdb-btn-icon-size-mini;
174 | top: -1px;
175 | position: relative;
176 | }
177 |
178 | }
179 |
180 | .navbar .navbar-nav > li > {
181 | a.btn{
182 | margin-top: 2px;
183 | margin-bottom: 2px;
184 |
185 | &.btn-fab{
186 | margin: 5px 2px;
187 | }
188 | }
189 | a:not(.btn){
190 | .material-icons{
191 | margin-top: -3px;
192 | top: 0px;
193 | position: relative;
194 | margin-right: 3px;
195 | }
196 | }
197 | .profile-photo{
198 | margin: 5px 2px;
199 | }
200 | }
201 |
202 | .navbar-default:not(.navbar-transparent) .navbar-nav > li > {
203 | a.btn{
204 | &.btn-white.btn-simple{
205 | color: $gray;
206 | }
207 | }
208 | }
209 |
210 | // btn-group variations
211 | .btn-group,
212 | .btn-group-vertical {
213 |
214 | position: relative;
215 | //border-radius: 2px;
216 | margin: 10px 1px;
217 |
218 | &.open {
219 | .dropdown-toggle {
220 | //box-shadow: none;
221 | }
222 |
223 | & > .dropdown-toggle.btn {
224 | @include variations(unquote(".btn"), unquote(""), background-color, $mdb-btn-background-color);
225 | }
226 | }
227 |
228 | .dropdown-menu {
229 | border-radius: 0 0 $border-radius-base $border-radius-base;
230 | }
231 |
232 | &.btn-group-raised {
233 | @include shadow-2dp();
234 | }
235 |
236 | & .btn + .btn,
237 | .btn,
238 | .btn:active,
239 | .btn-group {
240 | margin: 0;
241 | }
242 | }
243 |
244 | .close{
245 | font-size: inherit;
246 | color: $white-color;
247 | opacity: .9;
248 | text-shadow: none;
249 |
250 | &:hover,
251 | &:focus{
252 | opacity: 1;
253 | color: $white-color;
254 | }
255 |
256 | i{
257 | font-size: 20px;
258 | }
259 | }
260 |
--------------------------------------------------------------------------------
/src/assets/sass/md/_cards.scss:
--------------------------------------------------------------------------------
1 | .card{
2 | display: inline-block;
3 | position: relative;
4 | width: 100%;
5 | margin: 25px 0;
6 |
7 | box-shadow: 0 1px 4px 0 rgba(0,0,0,0.14);
8 | border-radius: $border-radius-base;
9 | color: $mdb-card-body-text;
10 | background: $mdb-card-body-background;
11 |
12 | .card-height-indicator {
13 | margin-top: 100%;
14 | }
15 |
16 | .title{
17 | margin-top: 0;
18 | margin-bottom: 5px;
19 | }
20 | .card-image {
21 | height: 60%;
22 | position: relative;
23 | overflow: hidden;
24 |
25 | margin-left: 15px;
26 | margin-right: 15px;
27 | margin-top: -30px;
28 | border-radius: $border-radius-large;
29 |
30 | img {
31 | width: 100%;
32 | height: 100%;
33 | border-radius: $border-radius-large;
34 | pointer-events: none;
35 | }
36 | .card-title {
37 | position: absolute;
38 | bottom: 15px;
39 | left: 15px;
40 | color: $mdb-card-image-headline;
41 | font-size: $font-size-h4;
42 | text-shadow: 0 2px 5px rgba(33, 33, 33, 0.5);
43 | }
44 | }
45 |
46 | .category:not([class*="text-"]){
47 | color: $gray-color;
48 | }
49 | .card-content{
50 | padding: 15px 20px;
51 |
52 | .category{
53 | margin-bottom: 0;
54 | }
55 | }
56 |
57 | .card-header{
58 | @include shadow-big();
59 | margin: -20px $margin-base 0;
60 | border-radius: $border-radius-base;
61 | padding: $padding-base;
62 | background-color: $gray-color;
63 |
64 | .title{
65 | color: $white-color;
66 | }
67 | .category{
68 | margin-bottom: 0;
69 | color: rgba($white-color, .62);
70 | }
71 |
72 | &.card-chart{
73 | padding: 0;
74 | min-height: 160px;
75 |
76 | + .content{
77 | h4{
78 | margin-top: 0;
79 | }
80 | }
81 | }
82 |
83 | .ct-label{
84 | color: rgba($white-color, .7);
85 | }
86 | .ct-grid{
87 | stroke: rgba(255, 255, 255, 0.2);
88 | }
89 | .ct-series-a .ct-point,
90 | .ct-series-a .ct-line,
91 | .ct-series-a .ct-bar,
92 | .ct-series-a .ct-slice-donut{
93 | stroke: rgba(255,255,255,.8);
94 | }
95 | .ct-series-a .ct-slice-pie,
96 | .ct-series-a .ct-area{
97 | fill: rgba(255,255,255,.4);
98 | }
99 |
100 | }
101 |
102 | .chart-title{
103 | position: absolute;;
104 | top: 25px;
105 | width: 100%;
106 | text-align: center;
107 |
108 | h3{
109 | margin: 0;
110 | color: $white-color;
111 | }
112 |
113 | h6{
114 | margin: 0;
115 | color: rgba(255,255,255, .4);
116 | }
117 |
118 | }
119 |
120 | .card-footer{
121 | margin: 0 20px 10px;
122 | padding-top: 10px;
123 | border-top: 1px solid #eeeeee;
124 |
125 | .content{
126 | display: block;
127 | }
128 |
129 | div{
130 | display: inline-block;
131 | }
132 | .author{
133 | color: $gray-color;
134 | }
135 | .stats{
136 | line-height: 22px;
137 | color: $gray-color;
138 | font-size: $font-size-small;
139 |
140 | .material-icons{
141 | position: relative;
142 | top: 4px;
143 | font-size: $font-paragraph;
144 | }
145 | }
146 |
147 | h6{
148 | color: $gray-color;
149 | }
150 |
151 | }
152 |
153 | img{
154 | width: 100%;
155 | height: auto;
156 | }
157 |
158 | .category{
159 | .material-icons{
160 | position: relative;
161 | top: 6px;
162 | line-height: 0;
163 | }
164 | }
165 |
166 | .category-social{
167 | .fa{
168 | font-size: 24px;
169 | position: relative;
170 | margin-top: -4px;
171 | top: 2px;
172 | margin-right: 5px;
173 | }
174 | }
175 |
176 | .author{
177 | .avatar{
178 | width: 30px;
179 | height: 30px;
180 | overflow: hidden;
181 | border-radius: 50%;
182 | margin-right: 5px;
183 | }
184 |
185 | a{
186 | color: $black-color;
187 | text-decoration: none;
188 |
189 | .ripple-container{
190 | display: none;
191 | }
192 | }
193 | }
194 |
195 | .table{
196 | margin-bottom: 0;
197 |
198 | tr:first-child td{
199 | border-top: none;
200 | }
201 | }
202 |
203 | [data-background-color="purple"]{
204 | background: linear-gradient(60deg, $purple-400, $purple-600);
205 | @include shadow-big-color($brand-primary);
206 | }
207 |
208 | [data-background-color="blue"]{
209 | background: linear-gradient(60deg, $cyan-400, $cyan-600);
210 | @include shadow-big-color($brand-info);
211 | }
212 |
213 | [data-background-color="green"]{
214 | background: linear-gradient(60deg, $green-400, $green-600);
215 | @include shadow-big-color($brand-success);
216 | }
217 |
218 | [data-background-color="orange"]{
219 | background: linear-gradient(60deg, $orange-400, $orange-600);
220 | @include shadow-big-color($brand-warning);
221 | }
222 |
223 | [data-background-color="red"]{
224 | background: linear-gradient(60deg, $red-400, $red-600);
225 | @include shadow-big-color($brand-danger);
226 | }
227 |
228 | [data-background-color]{
229 | color: $white-color;
230 |
231 | a{
232 | color: $white-color;
233 | }
234 | }
235 | }
236 |
237 | .card-stats{
238 | .title{
239 | margin: 0;
240 | }
241 | .card-header{
242 | float: left;
243 | text-align: center;
244 |
245 | i{
246 | font-size: 36px;
247 | line-height: 56px;
248 | width: 56px;
249 | height: 56px;
250 | }
251 | }
252 | .card-content{
253 | text-align: right;
254 | padding-top: 10px;
255 | }
256 |
257 | }
258 |
259 | .card-nav-tabs{
260 | .header-raised{
261 | margin-top: -$margin-base * 2;
262 | }
263 | .nav-tabs{
264 | background: transparent;
265 | padding: 0;
266 | }
267 | .nav-tabs-title{
268 | float: left;
269 | padding: 10px 10px 10px 0;
270 | line-height: 24px;
271 | }
272 | }
273 |
274 | .card-plain{
275 | background: transparent;
276 | box-shadow: none;
277 |
278 | .card-header{
279 | margin-left: 0;
280 | margin-right: 0;
281 | }
282 | .content{
283 | padding-left: 5px;
284 | padding-right: 5px;
285 | }
286 |
287 | .card-image{
288 | margin: 0;
289 | border-radius: $border-radius-base;
290 |
291 | img{
292 | border-radius: $border-radius-base;
293 | }
294 | }
295 | }
296 |
297 | .iframe-container{
298 | margin: 0 -20px 0;
299 |
300 | iframe{
301 | width: 100%;
302 | height: 500px;
303 | border: 0;
304 | @include shadow-big();
305 | }
306 | }
307 |
308 | .card-profile,
309 | .card-testimonial{
310 | margin-top: 30px;
311 | text-align: center;
312 |
313 | .btn-just-icon.btn-raised{
314 | margin-left: 6px;
315 | margin-right: 6px;
316 | }
317 |
318 | .card-avatar{
319 | max-width: 130px;
320 | max-height: 130px;
321 | margin: -50px auto 0;
322 | border-radius: 50%;
323 | overflow: hidden;
324 |
325 | @include shadow-big();
326 |
327 | & + .content{
328 | margin-top: 15px;
329 | }
330 | }
331 |
332 | &.card-plain{
333 | .card-avatar{
334 | margin-top: 0;
335 | }
336 | }
337 | }
338 |
--------------------------------------------------------------------------------
/src/assets/sass/md/_chartist.scss:
--------------------------------------------------------------------------------
1 | @mixin ct-responsive-svg-container($width: 100%, $ratio: $ct-container-ratio) {
2 | display: block;
3 | position: relative;
4 | width: $width;
5 |
6 | &:before {
7 | display: block;
8 | float: left;
9 | content: "";
10 | width: 0;
11 | height: 0;
12 | padding-bottom: $ratio * 100%;
13 | }
14 |
15 | &:after {
16 | content: "";
17 | display: table;
18 | clear: both;
19 | }
20 |
21 | > svg {
22 | display: block;
23 | position: absolute;
24 | top: 0;
25 | left: 0;
26 | }
27 | }
28 |
29 | @mixin ct-align-justify($ct-text-align: $ct-text-align, $ct-text-justify: $ct-text-justify) {
30 | -webkit-box-align: $ct-text-align;
31 | -webkit-align-items: $ct-text-align;
32 | -ms-flex-align: $ct-text-align;
33 | align-items: $ct-text-align;
34 | -webkit-box-pack: $ct-text-justify;
35 | -webkit-justify-content: $ct-text-justify;
36 | -ms-flex-pack: $ct-text-justify;
37 | justify-content: $ct-text-justify;
38 | // Fallback to text-align for non-flex browsers
39 | @if($ct-text-justify == 'flex-start') {
40 | text-align: left;
41 | } @else if ($ct-text-justify == 'flex-end') {
42 | text-align: right;
43 | } @else {
44 | text-align: center;
45 | }
46 | }
47 |
48 | @mixin ct-flex() {
49 | // Fallback to block
50 | display: block;
51 | display: -webkit-box;
52 | display: -moz-box;
53 | display: -ms-flexbox;
54 | display: -webkit-flex;
55 | display: flex;
56 | }
57 |
58 |
59 |
60 | @mixin ct-chart-label($ct-text-color: $ct-text-color, $ct-text-size: $ct-text-size, $ct-text-line-height: $ct-text-line-height) {
61 | fill: $ct-text-color;
62 | color: $ct-text-color;
63 | font-size: $ct-text-size;
64 | line-height: $ct-text-line-height;
65 | }
66 |
67 | @mixin ct-chart-grid($ct-grid-color: $ct-grid-color, $ct-grid-width: $ct-grid-width, $ct-grid-dasharray: $ct-grid-dasharray) {
68 | stroke: $ct-grid-color;
69 | stroke-width: $ct-grid-width;
70 |
71 | @if ($ct-grid-dasharray) {
72 | stroke-dasharray: $ct-grid-dasharray;
73 | }
74 | }
75 |
76 | @mixin ct-chart-point($ct-point-size: $ct-point-size, $ct-point-shape: $ct-point-shape) {
77 | stroke-width: $ct-point-size;
78 | stroke-linecap: $ct-point-shape;
79 | }
80 |
81 | @mixin ct-chart-line($ct-line-width: $ct-line-width, $ct-line-dasharray: $ct-line-dasharray) {
82 | fill: none;
83 | stroke-width: $ct-line-width;
84 |
85 | @if ($ct-line-dasharray) {
86 | stroke-dasharray: $ct-line-dasharray;
87 | }
88 | }
89 |
90 | @mixin ct-chart-area($ct-area-opacity: $ct-area-opacity) {
91 | stroke: none;
92 | fill-opacity: $ct-area-opacity;
93 | }
94 |
95 | @mixin ct-chart-bar($ct-bar-width: $ct-bar-width) {
96 | fill: none;
97 | stroke-width: $ct-bar-width;
98 | }
99 |
100 | @mixin ct-chart-donut($ct-donut-width: $ct-donut-width) {
101 | fill: none;
102 | stroke-width: $ct-donut-width;
103 | }
104 |
105 | @mixin ct-chart-series-color($color) {
106 | .#{$ct-class-point}, .#{$ct-class-line}, .#{$ct-class-bar}, .#{$ct-class-slice-donut} {
107 | stroke: $color;
108 | }
109 |
110 | .#{$ct-class-slice-pie}, .#{$ct-class-area} {
111 | fill: $color;
112 | }
113 | }
114 |
115 | @mixin ct-chart($ct-container-ratio: $ct-container-ratio, $ct-text-color: $ct-text-color, $ct-text-size: $ct-text-size, $ct-grid-color: $ct-grid-color, $ct-grid-width: $ct-grid-width, $ct-grid-dasharray: $ct-grid-dasharray, $ct-point-size: $ct-point-size, $ct-point-shape: $ct-point-shape, $ct-line-width: $ct-line-width, $ct-bar-width: $ct-bar-width, $ct-donut-width: $ct-donut-width, $ct-series-names: $ct-series-names, $ct-series-colors: $ct-series-colors) {
116 |
117 | .#{$ct-class-label} {
118 | @include ct-chart-label($ct-text-color, $ct-text-size);
119 | }
120 |
121 | .#{$ct-class-chart-line} .#{$ct-class-label},
122 | .#{$ct-class-chart-bar} .#{$ct-class-label} {
123 | @include ct-flex();
124 | }
125 |
126 | .#{$ct-class-label}.#{$ct-class-horizontal}.#{$ct-class-start} {
127 | @include ct-align-justify(flex-end, flex-start);
128 | // Fallback for browsers that don't support foreignObjects
129 | text-anchor: start;
130 | }
131 |
132 | .#{$ct-class-label}.#{$ct-class-horizontal}.#{$ct-class-end} {
133 | @include ct-align-justify(flex-start, flex-start);
134 | // Fallback for browsers that don't support foreignObjects
135 | text-anchor: start;
136 | }
137 |
138 | .#{$ct-class-label}.#{$ct-class-vertical}.#{$ct-class-start} {
139 | @include ct-align-justify(flex-end, flex-end);
140 | // Fallback for browsers that don't support foreignObjects
141 | text-anchor: end;
142 | }
143 |
144 | .#{$ct-class-label}.#{$ct-class-vertical}.#{$ct-class-end} {
145 | @include ct-align-justify(flex-end, flex-start);
146 | // Fallback for browsers that don't support foreignObjects
147 | text-anchor: start;
148 | }
149 |
150 | .#{$ct-class-chart-bar} .#{$ct-class-label}.#{$ct-class-horizontal}.#{$ct-class-start} {
151 | @include ct-align-justify(flex-end, center);
152 | // Fallback for browsers that don't support foreignObjects
153 | text-anchor: start;
154 | }
155 |
156 | .#{$ct-class-chart-bar} .#{$ct-class-label}.#{$ct-class-horizontal}.#{$ct-class-end} {
157 | @include ct-align-justify(flex-start, center);
158 | // Fallback for browsers that don't support foreignObjects
159 | text-anchor: start;
160 | }
161 |
162 | .#{$ct-class-chart-bar}.#{$ct-class-horizontal-bars} .#{$ct-class-label}.#{$ct-class-horizontal}.#{$ct-class-start} {
163 | @include ct-align-justify(flex-end, flex-start);
164 | // Fallback for browsers that don't support foreignObjects
165 | text-anchor: start;
166 | }
167 |
168 | .#{$ct-class-chart-bar}.#{$ct-class-horizontal-bars} .#{$ct-class-label}.#{$ct-class-horizontal}.#{$ct-class-end} {
169 | @include ct-align-justify(flex-start, flex-start);
170 | // Fallback for browsers that don't support foreignObjects
171 | text-anchor: start;
172 | }
173 |
174 | .#{$ct-class-chart-bar}.#{$ct-class-horizontal-bars} .#{$ct-class-label}.#{$ct-class-vertical}.#{$ct-class-start} {
175 | //@include ct-chart-label($ct-text-color, $ct-text-size, center, $ct-vertical-text-justify);
176 | @include ct-align-justify(center, flex-end);
177 | // Fallback for browsers that don't support foreignObjects
178 | text-anchor: end;
179 | }
180 |
181 | .#{$ct-class-chart-bar}.#{$ct-class-horizontal-bars} .#{$ct-class-label}.#{$ct-class-vertical}.#{$ct-class-end} {
182 | @include ct-align-justify(center, flex-start);
183 | // Fallback for browsers that don't support foreignObjects
184 | text-anchor: end;
185 | }
186 |
187 | .#{$ct-class-grid} {
188 | @include ct-chart-grid($ct-grid-color, $ct-grid-width, $ct-grid-dasharray);
189 | }
190 |
191 | .#{$ct-class-point} {
192 | @include ct-chart-point($ct-point-size, $ct-point-shape);
193 | }
194 |
195 | .#{$ct-class-line} {
196 | @include ct-chart-line($ct-line-width);
197 | }
198 |
199 | .#{$ct-class-area} {
200 | @include ct-chart-area();
201 | }
202 |
203 | .#{$ct-class-bar} {
204 | @include ct-chart-bar($ct-bar-width);
205 | }
206 |
207 | .#{$ct-class-slice-donut} {
208 | @include ct-chart-donut($ct-donut-width);
209 | }
210 |
211 | @if $ct-include-colored-series {
212 | @for $i from 0 to length($ct-series-names) {
213 | .#{$ct-class-series}-#{nth($ct-series-names, $i + 1)} {
214 | $color: nth($ct-series-colors, $i + 1);
215 |
216 | @include ct-chart-series-color($color);
217 | }
218 | }
219 | }
220 | }
221 |
222 | @if $ct-include-classes {
223 | @include ct-chart();
224 |
225 | @if $ct-include-alternative-responsive-containers {
226 | @for $i from 0 to length($ct-scales-names) {
227 | .#{nth($ct-scales-names, $i + 1)} {
228 | @include ct-responsive-svg-container($ratio: nth($ct-scales, $i + 1));
229 | }
230 | }
231 | }
232 | }
233 |
234 | .ct-blue{
235 | stroke: $brand-primary !important;
236 | }
237 | .ct-azure{
238 | stroke: $brand-info !important;
239 | }
240 | .ct-green{
241 | stroke: $brand-success !important;
242 | }
243 | .ct-orange{
244 | stroke: $brand-warning !important;
245 | }
246 | .ct-red{
247 | stroke: $brand-danger !important;
248 | }
249 | .ct-white{
250 | stroke: $white-color !important;
251 | }
252 | .ct-rose{
253 | stroke: $brand-rose !important;
254 | }
255 |
--------------------------------------------------------------------------------
/src/assets/sass/md/_checkboxes.scss:
--------------------------------------------------------------------------------
1 | .form-group {
2 | }
3 |
4 | .checkbox {
5 | label {
6 | cursor: pointer;
7 | padding-left: 0; // Reset for Bootstrap rule
8 | color: $mdb-checkbox-label-color;
9 | @include mdb-label-color-toggle-focus();
10 | }
11 |
12 | // Hide native checkbox
13 | input[type=checkbox] {
14 | opacity: 0;
15 | position: absolute;
16 | margin: 0;
17 | z-index: -1;
18 | width: 0;
19 | height: 0;
20 | overflow: hidden;
21 | left: 0;
22 | pointer-events: none;
23 | }
24 |
25 | .checkbox-material {
26 | vertical-align: middle;
27 | position: relative;
28 | top: 3px;
29 | padding-right: 5px;
30 |
31 | &:before {
32 | display: block;
33 | position: absolute;
34 | left: 0;
35 | content: "";
36 | background-color: rgba(0,0,0,.84);
37 | height: $mdb-checkbox-size;
38 | width: $mdb-checkbox-size;
39 | border-radius: 100%;
40 | z-index: 1;
41 | opacity: 0;
42 | margin: 0;
43 | transform: scale3d(2.3, 2.3, 1);
44 | }
45 |
46 | .check {
47 | position: relative;
48 | display: inline-block;
49 | width: $mdb-checkbox-size;
50 | height: $mdb-checkbox-size;
51 | border: 1px solid $mdb-checkbox-border-color;
52 | overflow: hidden;
53 | z-index: 1;
54 | border-radius: $border-radius-base;
55 | }
56 | .check:before {
57 | position: absolute;
58 | content: "";
59 | transform: rotate(45deg);
60 | display: block;
61 | margin-top: -3px;
62 | margin-left: 7px;
63 | width: 0;
64 | height: 0;
65 | background: red;
66 | box-shadow:
67 | 0 0 0 0,
68 | 0 0 0 0,
69 | 0 0 0 0,
70 | 0 0 0 0,
71 | 0 0 0 0,
72 | 0 0 0 0,
73 | 0 0 0 0 inset;
74 | animation: checkbox-off $mdb-checkbox-animation-check forwards;
75 | }
76 | }
77 |
78 | input[type=checkbox] {
79 |
80 | &:focus + .checkbox-material .check:after {
81 | opacity: 0.2;
82 | }
83 |
84 | &:checked {
85 |
86 | & + .checkbox-material .check {
87 | background: $mdb-checkbox-checked-color;
88 | }
89 |
90 | & + .checkbox-material .check:before {
91 | color: #FFFFFF;
92 | box-shadow: 0 0 0 10px,
93 | 10px -10px 0 10px,
94 | 32px 0 0 20px,
95 | 0px 32px 0 20px,
96 | -5px 5px 0 10px,
97 | 20px -12px 0 11px;
98 | animation: checkbox-on $mdb-checkbox-animation-check forwards;
99 | }
100 |
101 | & + .checkbox-material:before {
102 | animation: rippleOn $mdb-checkbox-animation-ripple;
103 | }
104 |
105 | & + .checkbox-material .check:after {
106 | //background-color: $brand-success; // FIXME: seems like tho wrong color, test and make sure it can be removed
107 | animation: rippleOn $mdb-checkbox-animation-ripple forwards; // Ripple effect on check
108 | }
109 | }
110 |
111 | &:not(:checked) {
112 | & + .checkbox-material:before {
113 | animation: rippleOff $mdb-checkbox-animation-ripple;
114 | }
115 |
116 | & + .checkbox-material .check:after {
117 | animation: rippleOff $mdb-checkbox-animation-ripple; // Ripple effect on uncheck
118 |
119 | }
120 | }
121 | }
122 |
123 | // Style for disabled inputs
124 | fieldset[disabled] &,
125 | fieldset[disabled] & input[type=checkbox],
126 | input[type=checkbox][disabled] ~ .checkbox-material .check,
127 | input[type=checkbox][disabled] + .circle {
128 | opacity: 0.5;
129 | }
130 |
131 | input[type=checkbox][disabled] ~ .checkbox-material .check{
132 | border-color: #000000;
133 | opacity: .26;
134 | }
135 |
136 | input[type=checkbox][disabled] + .checkbox-material .check:after {
137 | background-color: $mdb-text-color-primary;
138 | transform: rotate(-45deg);
139 | }
140 | }
141 |
142 | @keyframes checkbox-on {
143 | 0% {
144 | box-shadow:
145 | 0 0 0 10px,
146 | 10px -10px 0 10px,
147 | 32px 0 0 20px,
148 | 0px 32px 0 20px,
149 | -5px 5px 0 10px,
150 | 15px 2px 0 11px;
151 | }
152 | 50% {
153 | box-shadow:
154 | 0 0 0 10px,
155 | 10px -10px 0 10px,
156 | 32px 0 0 20px,
157 | 0px 32px 0 20px,
158 | -5px 5px 0 10px,
159 | 20px 2px 0 11px;
160 | }
161 | 100% {
162 | box-shadow:
163 | 0 0 0 10px,
164 | 10px -10px 0 10px,
165 | 32px 0 0 20px,
166 | 0px 32px 0 20px,
167 | -5px 5px 0 10px,
168 | 20px -12px 0 11px;
169 | }
170 | }
171 |
172 | @keyframes rippleOn {
173 | 0% {
174 | opacity: 0;
175 | }
176 | 50% {
177 | opacity: 0.2;
178 | }
179 | 100% {
180 | opacity: 0;
181 | }
182 | }
183 | @keyframes rippleOff {
184 | 0% {
185 | opacity: 0;
186 | }
187 | 50% {
188 | opacity: 0.2;
189 | }
190 | 100% {
191 | opacity: 0;
192 | }
193 | }
194 |
--------------------------------------------------------------------------------
/src/assets/sass/md/_colors.scss:
--------------------------------------------------------------------------------
1 | $red-50: #ffebee !default;
2 | $red-100: #ffcdd2 !default;
3 | $red-200: #ef9a9a !default;
4 | $red-300: #e57373 !default;
5 | $red-400: #ef5350 !default;
6 | $red-500: #f44336 !default;
7 | $red-600: #e53935 !default;
8 | $red-700: #d32f2f !default;
9 | $red-800: #c62828 !default;
10 | $red-900: #b71c1c !default;
11 | $red-A100: #ff8a80 !default;
12 | $red-A200: #ff5252 !default;
13 | $red-A400: #ff1744 !default;
14 | $red-A700: #d50000 !default;
15 | $red: $red-500 !default;
16 |
17 |
18 | $pink-50: #fce4ec !default;
19 | $pink-100: #f8bbd0 !default;
20 | $pink-200: #f48fb1 !default;
21 | $pink-300: #f06292 !default;
22 | $pink-400: #ec407a !default;
23 | $pink-500: #e91e63 !default;
24 | $pink-600: #d81b60 !default;
25 | $pink-700: #c2185b !default;
26 | $pink-800: #ad1457 !default;
27 | $pink-900: #880e4f !default;
28 | $pink-A100: #ff80ab !default;
29 | $pink-A200: #ff4081 !default;
30 | $pink-A400: #f50057 !default;
31 | $pink-A700: #c51162 !default;
32 | $pink: $pink-500 !default;
33 |
34 |
35 | $purple-50: #f3e5f5 !default;
36 | $purple-100: #e1bee7 !default;
37 | $purple-200: #ce93d8 !default;
38 | $purple-300: #ba68c8 !default;
39 | $purple-400: #ab47bc !default;
40 | $purple-500: #9c27b0 !default;
41 | $purple-600: #8e24aa !default;
42 | $purple-700: #7b1fa2 !default;
43 | $purple-800: #6a1b9a !default;
44 | $purple-900: #4a148c !default;
45 | $purple-A100: #ea80fc !default;
46 | $purple-A200: #e040fb !default;
47 | $purple-A400: #d500f9 !default;
48 | $purple-A700: #aa00ff !default;
49 | $purple: $purple-500 !default;
50 |
51 |
52 | $deep-purple-50: #ede7f6 !default;
53 | $deep-purple-100: #d1c4e9 !default;
54 | $deep-purple-200: #b39ddb !default;
55 | $deep-purple-300: #9575cd !default;
56 | $deep-purple-400: #7e57c2 !default;
57 | $deep-purple-500: #673ab7 !default;
58 | $deep-purple-600: #5e35b1 !default;
59 | $deep-purple-700: #512da8 !default;
60 | $deep-purple-800: #4527a0 !default;
61 | $deep-purple-900: #311b92 !default;
62 | $deep-purple-A100: #b388ff !default;
63 | $deep-purple-A200: #7c4dff !default;
64 | $deep-purple-A400: #651fff !default;
65 | $deep-purple-A700: #6200ea !default;
66 | $deep-purple: $deep-purple-500 !default;
67 |
68 |
69 | $indigo-50: #e8eaf6 !default;
70 | $indigo-100: #c5cae9 !default;
71 | $indigo-200: #9fa8da !default;
72 | $indigo-300: #7986cb !default;
73 | $indigo-400: #5c6bc0 !default;
74 | $indigo-500: #3f51b5 !default;
75 | $indigo-600: #3949ab !default;
76 | $indigo-700: #303f9f !default;
77 | $indigo-800: #283593 !default;
78 | $indigo-900: #1a237e !default;
79 | $indigo-A100: #8c9eff !default;
80 | $indigo-A200: #536dfe !default;
81 | $indigo-A400: #3d5afe !default;
82 | $indigo-A700: #304ffe !default;
83 | $indigo: $indigo-500 !default;
84 |
85 |
86 | $blue-50: #e3f2fd !default;
87 | $blue-100: #bbdefb !default;
88 | $blue-200: #90caf9 !default;
89 | $blue-300: #64b5f6 !default;
90 | $blue-400: #42a5f5 !default;
91 | $blue-500: #2196f3 !default;
92 | $blue-600: #1e88e5 !default;
93 | $blue-700: #1976d2 !default;
94 | $blue-800: #1565c0 !default;
95 | $blue-900: #0d47a1 !default;
96 | $blue-A100: #82b1ff !default;
97 | $blue-A200: #448aff !default;
98 | $blue-A400: #2979ff !default;
99 | $blue-A700: #2962ff !default;
100 | $blue: $blue-500 !default;
101 |
102 |
103 | $light-blue-50: #e1f5fe !default;
104 | $light-blue-100: #b3e5fc !default;
105 | $light-blue-200: #81d4fa !default;
106 | $light-blue-300: #4fc3f7 !default;
107 | $light-blue-400: #29b6f6 !default;
108 | $light-blue-500: #03a9f4 !default;
109 | $light-blue-600: #039be5 !default;
110 | $light-blue-700: #0288d1 !default;
111 | $light-blue-800: #0277bd !default;
112 | $light-blue-900: #01579b !default;
113 | $light-blue-A100: #80d8ff !default;
114 | $light-blue-A200: #40c4ff !default;
115 | $light-blue-A400: #00b0ff !default;
116 | $light-blue-A700: #0091ea !default;
117 | $light-blue: $light-blue-500 !default;
118 |
119 |
120 | $cyan-50: #e0f7fa !default;
121 | $cyan-100: #b2ebf2 !default;
122 | $cyan-200: #80deea !default;
123 | $cyan-300: #4dd0e1 !default;
124 | $cyan-400: #26c6da !default;
125 | $cyan-500: #00bcd4 !default;
126 | $cyan-600: #00acc1 !default;
127 | $cyan-700: #0097a7 !default;
128 | $cyan-800: #00838f !default;
129 | $cyan-900: #006064 !default;
130 | $cyan-A100: #84ffff !default;
131 | $cyan-A200: #18ffff !default;
132 | $cyan-A400: #00e5ff !default;
133 | $cyan-A700: #00b8d4 !default;
134 | $cyan: $cyan-500 !default;
135 |
136 |
137 | $teal-50: #e0f2f1 !default;
138 | $teal-100: #b2dfdb !default;
139 | $teal-200: #80cbc4 !default;
140 | $teal-300: #4db6ac !default;
141 | $teal-400: #26a69a !default;
142 | $teal-500: #009688 !default;
143 | $teal-600: #00897b !default;
144 | $teal-700: #00796b !default;
145 | $teal-800: #00695c !default;
146 | $teal-900: #004d40 !default;
147 | $teal-A100: #a7ffeb !default;
148 | $teal-A200: #64ffda !default;
149 | $teal-A400: #1de9b6 !default;
150 | $teal-A700: #00bfa5 !default;
151 | $teal: $teal-500 !default;
152 |
153 |
154 | $green-50: #e8f5e9 !default;
155 | $green-100: #c8e6c9 !default;
156 | $green-200: #a5d6a7 !default;
157 | $green-300: #81c784 !default;
158 | $green-400: #66bb6a !default;
159 | $green-500: #4caf50 !default;
160 | $green-600: #43a047 !default;
161 | $green-700: #388e3c !default;
162 | $green-800: #2e7d32 !default;
163 | $green-900: #1b5e20 !default;
164 | $green-A100: #b9f6ca !default;
165 | $green-A200: #69f0ae !default;
166 | $green-A400: #00e676 !default;
167 | $green-A700: #00c853 !default;
168 | $green: $green-500 !default;
169 |
170 |
171 | $light-green-50: #f1f8e9 !default;
172 | $light-green-100: #dcedc8 !default;
173 | $light-green-200: #c5e1a5 !default;
174 | $light-green-300: #aed581 !default;
175 | $light-green-400: #9ccc65 !default;
176 | $light-green-500: #8bc34a !default;
177 | $light-green-600: #7cb342 !default;
178 | $light-green-700: #689f38 !default;
179 | $light-green-800: #558b2f !default;
180 | $light-green-900: #33691e !default;
181 | $light-green-A100: #ccff90 !default;
182 | $light-green-A200: #b2ff59 !default;
183 | $light-green-A400: #76ff03 !default;
184 | $light-green-A700: #64dd17 !default;
185 | $light-green: $light-green-500 !default;
186 |
187 |
188 | $lime-50: #f9fbe7 !default;
189 | $lime-100: #f0f4c3 !default;
190 | $lime-200: #e6ee9c !default;
191 | $lime-300: #dce775 !default;
192 | $lime-400: #d4e157 !default;
193 | $lime-500: #cddc39 !default;
194 | $lime-600: #c0ca33 !default;
195 | $lime-700: #afb42b !default;
196 | $lime-800: #9e9d24 !default;
197 | $lime-900: #827717 !default;
198 | $lime-A100: #f4ff81 !default;
199 | $lime-A200: #eeff41 !default;
200 | $lime-A400: #c6ff00 !default;
201 | $lime-A700: #aeea00 !default;
202 | $lime: $lime-500 !default;
203 |
204 |
205 | $yellow-50: #fffde7 !default;
206 | $yellow-100: #fff9c4 !default;
207 | $yellow-200: #fff59d !default;
208 | $yellow-300: #fff176 !default;
209 | $yellow-400: #ffee58 !default;
210 | $yellow-500: #fec60a !default;
211 | $yellow-600: #fdd835 !default;
212 | $yellow-700: #fbc02d !default;
213 | $yellow-800: #f9a825 !default;
214 | $yellow-900: #f57f17 !default;
215 | $yellow-A100: #ffff8d !default;
216 | $yellow-A200: #ffff00 !default;
217 | $yellow-A400: #ffea00 !default;
218 | $yellow-A700: #ffd600 !default;
219 | $yellow: $yellow-700 !default;
220 |
221 |
222 | $amber-50: #fff8e1 !default;
223 | $amber-100: #ffecb3 !default;
224 | $amber-200: #ffe082 !default;
225 | $amber-300: #ffd54f !default;
226 | $amber-400: #ffca28 !default;
227 | $amber-500: #ffc107 !default;
228 | $amber-600: #ffb300 !default;
229 | $amber-700: #ffa000 !default;
230 | $amber-800: #ff8f00 !default;
231 | $amber-900: #ff6f00 !default;
232 | $amber-A100: #ffe57f !default;
233 | $amber-A200: #ffd740 !default;
234 | $amber-A400: #ffc400 !default;
235 | $amber-A700: #ffab00 !default;
236 | $amber: $amber-500 !default;
237 |
238 |
239 | $orange-50: #fff3e0 !default;
240 | $orange-100: #ffe0b2 !default;
241 | $orange-200: #ffcc80 !default;
242 | $orange-300: #ffb74d !default;
243 | $orange-400: #ffa726 !default;
244 | $orange-500: #ff9800 !default;
245 | $orange-600: #fb8c00 !default;
246 | $orange-700: #f57c00 !default;
247 | $orange-800: #ef6c00 !default;
248 | $orange-900: #e65100 !default;
249 | $orange-A100: #ffd180 !default;
250 | $orange-A200: #ffab40 !default;
251 | $orange-A400: #ff9100 !default;
252 | $orange-A700: #ff6d00 !default;
253 | $orange: $orange-500 !default;
254 |
255 |
256 | $deep-orange-50: #fbe9e7 !default;
257 | $deep-orange-100: #ffccbc !default;
258 | $deep-orange-200: #ffab91 !default;
259 | $deep-orange-300: #ff8a65 !default;
260 | $deep-orange-400: #ff7043 !default;
261 | $deep-orange-500: #ff5722 !default;
262 | $deep-orange-600: #f4511e !default;
263 | $deep-orange-700: #e64a19 !default;
264 | $deep-orange-800: #d84315 !default;
265 | $deep-orange-900: #bf360c !default;
266 | $deep-orange-A100: #ff9e80 !default;
267 | $deep-orange-A200: #ff6e40 !default;
268 | $deep-orange-A400: #ff3d00 !default;
269 | $deep-orange-A700: #dd2c00 !default;
270 | $deep-orange: $deep-orange-500 !default;
271 |
272 |
273 | $brown-50: #efebe9 !default;
274 | $brown-100: #d7ccc8 !default;
275 | $brown-200: #bcaaa4 !default;
276 | $brown-300: #a1887f !default;
277 | $brown-400: #8d6e63 !default;
278 | $brown-500: #795548 !default;
279 | $brown-600: #6d4c41 !default;
280 | $brown-700: #5d4037 !default;
281 | $brown-800: #4e342e !default;
282 | $brown-900: #3e2723 !default;
283 | $brown-A100: #d7ccc8 !default;
284 | $brown-A200: #bcaaa4 !default;
285 | $brown-A400: #8d6e63 !default;
286 | $brown-A700: #5d4037 !default;
287 | $brown: $brown-500 !default;
288 |
289 |
290 | $grey-50: #fafafa !default;
291 | $grey-100: #f5f5f5 !default;
292 | $grey-200: #eeeeee !default;
293 | $grey-300: #e0e0e0 !default;
294 | $grey-400: #bdbdbd !default;
295 | $grey-500: #9e9e9e; $rgb-grey-500: "158, 158, 158" !default;
296 | $grey-600: #757575 !default;
297 | $grey-700: #616161 !default;
298 | $grey-800: #424242 !default;
299 | $grey-900: #212121 !default;
300 | $grey-A100: #f5f5f5 !default;
301 | $grey-A200: #eeeeee !default;
302 | $grey-A400: #bdbdbd !default;
303 | $grey-A700: #616161 !default;
304 | $grey: $grey-500 !default;
305 |
306 |
307 | $blue-grey-50: #eceff1 !default;
308 | $blue-grey-100: #cfd8dc !default;
309 | $blue-grey-200: #b0bec5 !default;
310 | $blue-grey-300: #90a4ae !default;
311 | $blue-grey-400: #78909c !default;
312 | $blue-grey-500: #607d8b !default;
313 | $blue-grey-600: #546e7a !default;
314 | $blue-grey-700: #455a64 !default;
315 | $blue-grey-800: #37474f !default;
316 | $blue-grey-900: #263238 !default;
317 | $blue-grey-A100: #cfd8dc !default;
318 | $blue-grey-A200: #b0bec5 !default;
319 | $blue-grey-A400: #78909c !default;
320 | $blue-grey-A700: #455a64 !default;
321 | $blue-grey: $blue-grey-500 !default;
322 |
323 |
324 | $black: #000000; $rgb-black: "0,0,0" !default;
325 | $white: #ffffff; $rgb-white: "255,255,255" !default;
326 |
--------------------------------------------------------------------------------
/src/assets/sass/md/_dialogs.scss:
--------------------------------------------------------------------------------
1 | // This file has been autogenerated by grunt task lessToSass. Any changes will be overwritten.
2 |
3 | //
4 | // Modals
5 | // Material Design element Dialogs
6 | // --------------------------------------------------
7 | .modal-content {
8 | @include shadow-z-5();
9 | border-radius: $border-radius-large;
10 | border: none;
11 | // Modal header
12 | // Top section of the modal w/ title and dismiss
13 | .modal-header {
14 | border-bottom: none;
15 | padding-top: 24px;
16 | padding-right: 24px;
17 | padding-bottom: 0;
18 | padding-left: 24px;
19 | }
20 | // Modal body
21 | // Where all modal content resides (sibling of .modal-header and .modal-footer)
22 | .modal-body {
23 | padding-top: 24px;
24 | padding-right: 24px;
25 | padding-bottom: 16px;
26 | padding-left: 24px;
27 | }
28 | // Footer (for actions)
29 | .modal-footer {
30 | border-top: none;
31 | padding: 7px;
32 |
33 | &.text-center{
34 | text-align: center;
35 | }
36 |
37 | button {
38 | margin: 0;
39 | padding-left: 16px;
40 | padding-right: 16px;
41 | width: auto;
42 | &.pull-left {
43 | padding-left: 5px;
44 | padding-right: 5px;
45 | position: relative;
46 | left: -5px;
47 | }
48 | }
49 | button+button {
50 | margin-bottom: 16px;
51 | }
52 | }
53 | .modal-body + .modal-footer {
54 | padding-top: 0;
55 | }
56 | }
57 | .modal-backdrop {
58 | background: rgba(0,0,0,0.3);
59 | }
60 |
61 | .modal{
62 | .modal-dialog{
63 | margin-top: 100px;
64 | }
65 | .modal-header .close{
66 | color: $gray-light;
67 |
68 | &:hover,
69 | &:focus{
70 | opacity: 1;
71 | }
72 |
73 | i{
74 | font-size: 16px;
75 | }
76 | }
77 | }
78 |
79 | .modal-notice {
80 | .instruction{
81 | margin-bottom: 25px;
82 | }
83 | .picture{
84 | max-width: 150px;
85 | }
86 |
87 | .modal-content{
88 | .btn-raised{
89 | margin-bottom: 15px;
90 | }
91 | }
92 | }
93 |
94 | .modal-small{
95 | width: 300px;
96 | .modal-body{
97 | margin-top: 20px;
98 | }
99 | }
--------------------------------------------------------------------------------
/src/assets/sass/md/_dropdown.scss:
--------------------------------------------------------------------------------
1 | .dropdown-menu {
2 | border: 0;
3 | box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.26);
4 |
5 | .divider {
6 | background-color: rgba(0, 0, 0, .12);
7 | }
8 |
9 |
10 | li > a{
11 | font-size: $mdb-dropdown-font-size;
12 | padding: 10px 20px;
13 | margin: 0 5px;
14 | border-radius: $border-radius-small;
15 | @include transition($fast-transition-time, $transition-linear);
16 |
17 | &:hover,
18 | &:focus {
19 | @include shadow-8dp();
20 |
21 | }
22 | }
23 |
24 | &.dropdown-with-icons{
25 | li > a{
26 | padding: 12px 20px 12px 12px;
27 |
28 | .material-icons{
29 | vertical-align: middle;
30 | font-size: 24px;
31 | position: relative;
32 | margin-top: -4px;
33 | top: 1px;
34 | margin-right: 12px;
35 | opacity: .5;
36 | }
37 | }
38 | }
39 |
40 | li {
41 | position: relative;
42 | a:hover,
43 | a:focus,
44 | a:active {
45 | background-color: $brand-primary;
46 | color: #FFFFFF;
47 | }
48 | }
49 |
50 | .divider{
51 | margin: 5px 0;
52 | }
53 |
54 | .navbar &,
55 | .navbar.navbar-default &{
56 | li{
57 | a:hover,
58 | a:focus,
59 | a:active {
60 | background-color: $brand-primary;
61 | color: #FFFFFF;
62 | @include shadow-big-color($brand-primary);
63 | }
64 | }
65 | }
66 |
67 | }
68 |
--------------------------------------------------------------------------------
/src/assets/sass/md/_footers.scss:
--------------------------------------------------------------------------------
1 | footer{
2 | padding: $padding-base 0;
3 |
4 | ul{
5 | margin-bottom: 0;
6 | padding: 0;
7 | list-style: none;
8 |
9 | li{
10 | display: inline-block;
11 |
12 | a{
13 | color: inherit;
14 | padding: $padding-base;
15 | font-weight: $font-weight-bold;
16 | font-size: $mdb-btn-font-size-base;
17 | text-transform: uppercase;
18 | border-radius: $border-radius-base;
19 | text-decoration: none;
20 | position: relative;
21 | display: block;
22 |
23 | &:hover{
24 | text-decoration: none;
25 | }
26 | }
27 | }
28 | }
29 |
30 | .copyright{
31 | padding: 15px 0;
32 | margin: 0;
33 | .material-icons{
34 | font-size: 18px;
35 | position: relative;
36 | top: 3px;
37 | }
38 | }
39 |
40 | .btn{
41 | margin-top: 0;
42 | margin-bottom: 0;
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/src/assets/sass/md/_forms.scss:
--------------------------------------------------------------------------------
1 | // This file has been autogenerated by grunt task lessToSass. Any changes will be overwritten.
2 |
3 | @mixin mdb-label-color-toggle-focus(){
4 | // override bootstrap focus and keep all the standard color (could be multiple radios in the form group)
5 | .form-group.is-focused & {
6 | color: $mdb-label-color;
7 |
8 | // on focus just darken the specific labels, do not turn them to the brand-primary
9 | &:hover,
10 | &:focus {
11 | color: $mdb-label-color-toggle-focus;
12 | }
13 |
14 | // correct the above focus color for disabled items
15 | fieldset[disabled] & {
16 | color: $mdb-label-color;
17 | }
18 | }
19 | }
20 |
21 | .form-horizontal {
22 |
23 | // Consistent vertical alignment of radios and checkboxes
24 | .radio,
25 | .checkbox,
26 | .radio-inline,
27 | .checkbox-inline {
28 | padding-top: 0;
29 | }
30 |
31 | .radio {
32 | margin-bottom: 10px;
33 | }
34 |
35 | label {
36 | text-align: right;
37 | }
38 |
39 | label.control-label {
40 | margin: 0;
41 | }
42 | }
43 |
44 | .form-newsletter{
45 | .input-group,
46 | .form-group{
47 | float: left;
48 | width: 78%;
49 | margin-right: 2%;
50 | margin-top: 9px;
51 | }
52 |
53 | .btn{
54 | float: left;
55 | width: 20%;
56 | margin: 9px 0 0;
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/src/assets/sass/md/_inputs-size.scss:
--------------------------------------------------------------------------------
1 | // This file has been autogenerated by grunt task lessToSass. Any changes will be overwritten.
2 |
3 | //
4 | // Forms - sizing - material - mirrors bootstrap/forms.less with custom sizing
5 | //
6 | // LEAVE THIS IDENTICAL TO THE BOOTSTRAP FILE - DO NOT CUSTOMIZE HERE.
7 | //
8 | // NOTE: this is intentionally kept structurally _identical_ to the bootstrap/forms.less file to make it easier
9 | // to identify differences in sizing approaches to form inputs.
10 | // --------------------------------------------------
11 |
12 | legend {
13 | margin-bottom: $mdb-input-line-height-computed;
14 | font-size: ($mdb-input-font-size-base * 1.5);
15 | }
16 |
17 | // Adjust output element
18 | output {
19 | padding-top: ($mdb-input-padding-base-vertical + 1);
20 | font-size: $mdb-input-font-size-base;
21 | line-height: $mdb-input-line-height-base;
22 | }
23 |
24 | .form-control {
25 | height: $mdb-input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)
26 | padding: $mdb-input-padding-base-vertical $mdb-input-padding-base-horizontal;
27 | font-size: $mdb-input-font-size-base;
28 | line-height: $mdb-input-line-height-base;
29 | }
30 |
31 | // Special styles for iOS temporal inputs
32 | //
33 | // In Mobile Safari, setting `display: block` on temporal inputs causes the
34 | // text within the input to become vertically misaligned. As a workaround, we
35 | // set a pixel line-height that matches the given height of the input, but only
36 | // for Safari. See https://bugs.webkit.org/show_bug.cgi?id=139848
37 | //
38 | // Note that as of 8.3, iOS doesn't support `datetime` or `week`.
39 |
40 | @media screen and (-webkit-min-device-pixel-ratio: 0) {
41 | input[type="date"],
42 | input[type="time"],
43 | input[type="datetime-local"],
44 | input[type="month"] {
45 | &.form-control {
46 | line-height: $mdb-input-height-base;
47 | }
48 |
49 | &.input-sm,
50 | .input-group-sm & {
51 | line-height: $mdb-input-height-small;
52 | }
53 |
54 | &.input-lg,
55 | .input-group-lg & {
56 | line-height: $mdb-input-height-large;
57 | }
58 | }
59 | }
60 |
61 | .radio,
62 | .checkbox {
63 |
64 | label {
65 | min-height: $mdb-input-line-height-computed; // Ensure the input doesn't jump when there is no text
66 | }
67 | }
68 |
69 |
70 | // Static form control text
71 | //
72 | // Apply class to a `p` element to make any string of text align with labels in
73 | // a horizontal form layout.
74 |
75 | .form-control-static {
76 | // Size it appropriately next to real form controls
77 | padding-top: ($mdb-input-padding-base-vertical + 1);
78 | padding-bottom: ($mdb-input-padding-base-vertical + 1);
79 | min-height: ($mdb-input-line-height-computed + $mdb-input-font-size-base);
80 | }
81 |
82 |
83 | // Form control sizing
84 | //
85 | // Relative text size, padding, and border-radii changes for form controls. For
86 | // horizontal sizing, wrap controls in the predefined grid classes. ``
87 | // element gets special love because it's special, and that's a fact!
88 |
89 | // mixin pulled from bootstrap and altered for less/sass compatibility with sass parent hack.
90 | // bootstrap-sass has this one, but we would have to then convert it back to less. chicken meet egg.
91 | @mixin input-size($parent, $mdb-input-height, $padding-vertical, $padding-horizontal, $font-size, $line-height, $border-radius){
92 |
93 | #{$parent} {
94 | height: $mdb-input-height;
95 | padding: $padding-vertical $padding-horizontal;
96 | font-size: $font-size;
97 | line-height: $line-height;
98 | border-radius: $border-radius;
99 | }
100 |
101 | select#{$parent} {
102 | height: $mdb-input-height;
103 | line-height: $mdb-input-height;
104 | }
105 |
106 | textarea#{$parent},
107 | select[multiple]#{$parent} {
108 | height: auto;
109 | }
110 | }
111 |
112 |
113 |
114 | // Form control sizing
115 | //
116 | // Build on `.form-control` with modifier classes to decrease or increase the
117 | // height and font-size of form controls.
118 | //
119 | // The `.form-group-* form-control` variations are sadly duplicated to avoid the
120 | // issue documented in https://github.com/twbs/bootstrap/issues/15074.
121 | .input-sm {
122 | @include input-size(unquote(".input-sm"), $mdb-input-height-small, $mdb-input-padding-small-vertical, $mdb-input-padding-small-horizontal, $mdb-input-font-size-small, $mdb-input-line-height-small, $mdb-input-border-radius-small);
123 | }
124 | .form-group-sm {
125 | .form-control {
126 | height: $mdb-input-height-small;
127 | padding: $mdb-input-padding-small-vertical $mdb-input-padding-small-horizontal;
128 | font-size: $mdb-input-font-size-small;
129 | line-height: $mdb-input-line-height-small;
130 | }
131 | select.form-control {
132 | height: $mdb-input-height-small;
133 | line-height: $mdb-input-height-small;
134 | }
135 | textarea.form-control,
136 | select[multiple].form-control {
137 | height: auto;
138 | }
139 | .form-control-static {
140 | height: $mdb-input-height-small;
141 | min-height: ($mdb-input-line-height-computed + $mdb-input-font-size-small);
142 | padding: ($mdb-input-padding-small-vertical + 1) $mdb-input-padding-small-horizontal;
143 | font-size: $mdb-input-font-size-small;
144 | line-height: $mdb-input-line-height-small;
145 | }
146 | }
147 |
148 | .input-lg {
149 | @include input-size(unquote(".input-lg"), $mdb-input-height-large, $mdb-input-padding-large-vertical, $mdb-input-padding-large-horizontal, $mdb-input-font-size-large, $mdb-input-line-height-large, $mdb-input-border-radius-large);
150 | }
151 | .form-group-lg {
152 | .form-control {
153 | height: $mdb-input-height-large;
154 | padding: $mdb-input-padding-large-vertical $mdb-input-padding-large-horizontal;
155 | font-size: $mdb-input-font-size-large;
156 | line-height: $mdb-input-line-height-large;
157 | }
158 | select.form-control {
159 | height: $mdb-input-height-large;
160 | line-height: $mdb-input-height-large;
161 | }
162 | textarea.form-control,
163 | select[multiple].form-control {
164 | height: auto;
165 | }
166 | .form-control-static {
167 | height: $mdb-input-height-large;
168 | min-height: ($mdb-input-line-height-computed + $mdb-input-font-size-large);
169 | padding: ($mdb-input-padding-large-vertical + 1) $mdb-input-padding-large-horizontal;
170 | font-size: $mdb-input-font-size-large;
171 | line-height: $mdb-input-line-height-large;
172 | }
173 | }
174 |
175 |
176 | .form-horizontal {
177 |
178 | // Consistent vertical alignment of radios and checkboxes
179 | //
180 | // Labels also get some reset styles, but that is scoped to a media query below.
181 | .radio,
182 | .checkbox,
183 | .radio-inline,
184 | .checkbox-inline {
185 | padding-top: ($mdb-input-padding-base-vertical + 1); // Default padding plus a border
186 | }
187 | // Account for padding we're adding to ensure the alignment and of help text
188 | // and other content below items
189 | .radio,
190 | .checkbox {
191 | min-height: ($mdb-input-line-height-computed + ($mdb-input-padding-base-vertical + 1));
192 | }
193 |
194 | // Reset spacing and right align labels, but scope to media queries so that
195 | // labels on narrow viewports stack the same as a default form example.
196 | @media (min-width: $screen-sm-min) {
197 | .control-label {
198 | padding-top: ($mdb-input-padding-base-vertical + 1); // Default padding plus a border
199 | }
200 | }
201 |
202 |
203 | // Form group sizes
204 | //
205 | // Quick utility class for applying `.input-lg` and `.input-sm` styles to the
206 | // inputs and labels within a `.form-group`.
207 | .form-group-lg {
208 | @media (min-width: $screen-sm-min) {
209 | .control-label {
210 | padding-top: (($mdb-input-padding-large-vertical * $mdb-input-line-height-large) + 1);
211 | font-size: $mdb-input-font-size-large;
212 | }
213 | }
214 | }
215 | .form-group-sm {
216 | @media (min-width: $screen-sm-min) {
217 | .control-label {
218 | padding-top: ($mdb-input-padding-small-vertical + 1);
219 | font-size: $mdb-input-font-size-small;
220 | }
221 | }
222 | }
223 | }
224 |
--------------------------------------------------------------------------------
/src/assets/sass/md/_misc.scss:
--------------------------------------------------------------------------------
1 | body {
2 | background-color: #EEEEEE;
3 | // background: #fdfdfe;
4 | color: $black-color;
5 | &.inverse {
6 | background: #333333;
7 | &, .form-control {
8 | color: $mdb-text-color-light;
9 | }
10 | .modal,
11 | .panel-default,
12 | .card {
13 | &,
14 | .form-control {
15 | background-color: initial;
16 | color: initial;
17 | }
18 | }
19 |
20 | }
21 | }
22 |
23 | .wrapper{
24 |
25 | &.wrapper-full-page{
26 | height: auto;
27 | min-height: 100vh;
28 | }
29 | }
30 |
31 |
32 | blockquote{
33 | p{
34 | font-style: italic;
35 | }
36 | }
37 |
38 | .life-of-material-dashboard{
39 | background: #FFFFFF;
40 | }
41 |
42 | body, h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4 {
43 | font-family: $font-family-sans-serif;
44 | font-weight: 300;
45 | line-height: 1.5em;
46 | }
47 |
48 | .serif-font{
49 | font-family: $font-family-serif;
50 | }
51 |
52 | .page-header {
53 | height: 60vh;
54 | background-position: center center;
55 | background-size: cover;
56 | margin: 0;
57 | padding: 0;
58 | border: 0;
59 | border-bottom-left-radius: 6px;
60 | border-bottom-right-radius: 6px;
61 | }
62 |
63 | a{
64 | color: $link-color;
65 | &:hover,
66 | &:focus{
67 | color: darken($link-color, 5%);
68 | text-decoration: none;
69 | }
70 |
71 | &.text-info{
72 | &:hover, &:focus{
73 | color: darken($brand-info, 5%);
74 | }
75 | }
76 |
77 | & .material-icons {
78 | vertical-align: middle;
79 | }
80 | }
81 |
82 | /* Animations */
83 | .animation-transition-general{
84 | @include transition($general-transition-time, $transition-linear);
85 | }
86 |
87 | .animation-transition-slow{
88 | @include transition($slow-transition-time, $transition-linear);
89 | }
90 |
91 | .animation-transition-fast{
92 | @include transition($fast-transition-time, $transition-ease);
93 | }
94 | legend {
95 | border-bottom: 0;
96 | }
97 |
98 | // Prevent highlight on mobile
99 | * {
100 | -webkit-tap-highlight-color: rgba(255, 255, 255, 0);
101 | -webkit-tap-highlight-color: transparent;
102 | &:focus {
103 | outline: 0;
104 | }
105 | }
106 | a:focus, a:active,
107 | button:active, button:focus, button:hover,
108 | button::-moz-focus-inner,
109 | input[type="reset"]::-moz-focus-inner,
110 | input[type="button"]::-moz-focus-inner,
111 | input[type="submit"]::-moz-focus-inner,
112 | select::-moz-focus-inner,
113 | input[type="file"] > input[type="button"]::-moz-focus-inner {
114 | outline : 0 !important;
115 | }
116 |
--------------------------------------------------------------------------------
/src/assets/sass/md/_navbars.scss:
--------------------------------------------------------------------------------
1 | // This file has been autogenerated by grunt task lessToSass. Any changes will be overwritten.
2 |
3 | .navbar {
4 | // background-color: $brand-primary;
5 | border: 0;
6 | border-radius: $border-radius-base;
7 | // @include shadow-big-navbar();
8 |
9 | border-bottom: 1px solid #ededf3;
10 | @extend .animation-transition-fast;
11 |
12 | padding: 10px 0;
13 |
14 | .navbar-brand {
15 | position: relative;
16 | height: 50px;
17 | line-height: 30px;
18 | color: inherit;
19 | padding: 10px 15px;
20 |
21 | &:hover,
22 | &:focus {
23 | color: inherit;
24 | background-color: transparent;
25 | }
26 | }
27 |
28 | .notification{
29 | position: absolute;
30 | top: 5px;
31 | border: 1px solid #FFF;
32 | right: 10px;
33 | font-size: 9px;
34 | background: #f44336;
35 | color: #FFFFFF;
36 | min-width: 20px;
37 | padding: 0px 5px;
38 | height: 20px;
39 | border-radius: 10px;
40 | text-align: center;
41 | line-height: 19px;
42 | vertical-align: middle;
43 | display: block;
44 | }
45 |
46 |
47 |
48 | .navbar-text {
49 | color: inherit;
50 | margin-top: 15px;
51 | margin-bottom: 15px;
52 | }
53 |
54 | .navbar-nav {
55 | > li > a {
56 | color: inherit;
57 | padding-top: 15px;
58 | padding-bottom: 15px;
59 |
60 | font-weight: $font-weight-default;
61 | font-size: $mdb-btn-font-size-base;
62 | text-transform: uppercase;
63 |
64 | border-radius: $border-radius-base;
65 |
66 | &:hover,
67 | &:focus {
68 | color: inherit;
69 | background-color: transparent;
70 | }
71 |
72 |
73 | .material-icons,
74 | .fa{
75 | font-size: 20px;
76 | }
77 |
78 | &.btn:not(.btn-just-icon){
79 | .fa{
80 | position: relative;
81 | top: 2px;
82 | margin-top: -4px;
83 | margin-right: 4px;
84 | }
85 | }
86 | }
87 |
88 | > li > .dropdown-menu{
89 | margin-top: -20px;
90 | }
91 |
92 | > li.open > .dropdown-menu{
93 | margin-top: 0;
94 | }
95 |
96 | > .active > a {
97 | &,
98 | &:hover,
99 | &:focus {
100 | color: inherit;
101 | background-color: rgba(255, 255, 255, 0.1);
102 | }
103 | }
104 | > .disabled > a {
105 | &,
106 | &:hover,
107 | &:focus {
108 | color: inherit;
109 | background-color: transparent;
110 | opacity: 0.9;
111 | }
112 | }
113 | .profile-photo{
114 | padding: 0 5px 0;
115 | .profile-photo-small{
116 | height: 40px;
117 | width: 40px;
118 | }
119 | }
120 |
121 | }
122 |
123 | // Darken the responsive nav toggle
124 | .navbar-toggle {
125 | border: 0;
126 | &:hover,
127 | &:focus {
128 | background-color: transparent;
129 | }
130 | .icon-bar {
131 | background-color: inherit;
132 | border: 1px solid;
133 | }
134 | }
135 |
136 | .navbar-default .navbar-toggle,
137 | .navbar-inverse .navbar-toggle {
138 | border-color: transparent;
139 | }
140 |
141 | .navbar-collapse,
142 | .navbar-form {
143 | border-top: none;
144 | box-shadow: none;
145 | }
146 |
147 | // Dropdowns
148 | .navbar-nav {
149 | > .open > a {
150 | &,
151 | &:hover,
152 | &:focus {
153 | background-color: transparent;
154 | color: inherit;
155 | }
156 | }
157 |
158 | @media (max-width: $grid-float-breakpoint-max) {
159 | .navbar-text {
160 | color: inherit;
161 | margin-top: 15px;
162 | margin-bottom: 15px;
163 | }
164 |
165 | // Dropdowns get custom display
166 | .open .dropdown-menu {
167 | > .dropdown-header {
168 | border: 0;
169 | color: inherit;
170 | }
171 | .divider {
172 | border-bottom: 1px solid;
173 | opacity: 0.08;
174 | }
175 | > li > a {
176 | color: inherit;
177 | &:hover,
178 | &:focus {
179 | color: inherit;
180 | background-color: transparent;
181 | }
182 | }
183 | > .active > a {
184 | &,
185 | &:hover,
186 | &:focus {
187 | color: inherit;
188 | background-color: transparent;
189 | }
190 | }
191 | > .disabled > a {
192 | &,
193 | &:hover,
194 | &:focus {
195 | color: inherit;
196 | background-color: transparent;
197 | }
198 | }
199 | }
200 | }
201 | }
202 |
203 | &.navbar-default{
204 | .logo-container .brand{
205 | color: $gray;
206 | }
207 | }
208 |
209 | .navbar-link {
210 | color: inherit;
211 | &:hover {
212 | color: inherit;
213 | }
214 | }
215 |
216 | .btn{
217 | margin-top: 0;
218 | margin-bottom: 0;
219 | }
220 | .btn-link {
221 | color: inherit;
222 | &:hover,
223 | &:focus {
224 | color: inherit;
225 | }
226 | &[disabled],
227 | fieldset[disabled] & {
228 | &:hover,
229 | &:focus {
230 | color: inherit;
231 | }
232 | }
233 | }
234 |
235 | .navbar-form {
236 | margin: 4px 0 0;
237 | .form-group {
238 | margin: 0;
239 | padding: 0;
240 |
241 | .material-input:before,
242 | &.is-focused .material-input:after {
243 | background-color: inherit;
244 | }
245 | }
246 |
247 | .form-group .form-control,
248 | .form-control {
249 | border-color: inherit;
250 | color: inherit;
251 | padding: 0;
252 | margin: 0;
253 |
254 | // re-normalize inputs in a navbar the size of standard bootstrap since our normal inputs are larger by spec than bootstrap
255 | //---
256 | //height: $mdb-input-height-base;
257 | $bs-line-height-base: 1.428571429 !default;
258 | $bs-line-height-computed: floor(($font-size-base * $bs-line-height-base)) !default; // ~20px
259 | height: ($bs-line-height-computed + 8px);
260 | font-size: $font-size-base;
261 | line-height: $bs-line-height-base;
262 | //---
263 | }
264 | }
265 |
266 | // SASS conversion note: please mirror any content change in _mixins-shared.scss navbar-variations-content
267 | @include navbar-variations(unquote(".navbar"), unquote(""), $brand-primary);
268 |
269 |
270 | &-inverse {
271 | background-color: $indigo;
272 | }
273 |
274 | &.navbar-transparent{
275 | background-color: transparent;
276 | box-shadow: none;
277 | border-bottom: 0;
278 |
279 | .logo-container .brand{
280 | color: $white-color;
281 | }
282 | }
283 | &-fixed-top{
284 | border-radius: 0;
285 | }
286 | @media (max-width: $screen-md-max) {
287 |
288 | .navbar-brand {
289 | height: 50px;
290 | padding: 10px 15px;
291 | }
292 | /*
293 | .navbar-form {
294 | margin-top: 10px;
295 | }
296 | */
297 |
298 | .navbar-nav > li > a {
299 | padding-top: 15px;
300 | padding-bottom: 15px;
301 | }
302 | }
303 |
304 | .alert{
305 | border-radius: 0;
306 | left: 0;
307 | position: absolute;
308 | right: 0;
309 | top: 85px;
310 | width: 100%;
311 | z-index: 3;
312 | transition: all 0.3s;
313 | }
314 |
315 | }
316 |
317 | .nav-align-center{
318 | text-align: center;
319 |
320 | .nav-pills{
321 | display: inline-block;
322 | }
323 | }
324 | .navbar-absolute{
325 | position: absolute;
326 | width: 100%;
327 | padding-top: 10px;
328 | z-index: 1029;
329 | }
330 |
--------------------------------------------------------------------------------
/src/assets/sass/md/_pills.scss:
--------------------------------------------------------------------------------
1 | .nav-pills{
2 |
3 | .section-dark &,
4 | .section-image &{
5 | > li > a{
6 | color: $gray-color;
7 | }
8 | > li{
9 | > a:hover,
10 | > a:focus{
11 | background-color: #EEEEEE;
12 | }
13 | }
14 | }
15 |
16 | > li {
17 | > a{
18 | line-height: $mdb-btn-font-size-base * 2;
19 | text-transform: uppercase;
20 | font-size: $mdb-btn-font-size-base;
21 | font-weight: $font-weight-bold;
22 | min-width: 100px;
23 | text-align: center;
24 | color: $gray;
25 | transition: all .3s;
26 |
27 | &:hover{
28 | background-color: rgba(200, 200, 200, 0.2);
29 | }
30 | }
31 |
32 | i{
33 | display: block;
34 | font-size: 30px;
35 | padding: 15px 0;
36 | }
37 |
38 | &.active > a{
39 | &,
40 | &:focus,
41 | &:hover{
42 | background-color: $brand-primary;
43 | color: $white-color;
44 | @include shadow-big-color($brand-primary);
45 | }
46 | }
47 |
48 | }
49 |
50 | &:not(.nav-pills-icons){
51 | > li > a{
52 | border-radius: $border-radius-extreme;
53 | }
54 | }
55 |
56 | &.nav-stacked{
57 | > li + li{
58 | margin-top: 5px;
59 | }
60 | }
61 |
62 | &.nav-pills-info{
63 | > li {
64 | &.active > a{
65 | &,
66 | &:focus,
67 | &:hover{
68 | background-color: $brand-info;
69 | @include shadow-big-color($brand-info);
70 | }
71 | }
72 | }
73 | }
74 |
75 | &.nav-pills-success{
76 | > li {
77 | &.active > a{
78 | &,
79 | &:focus,
80 | &:hover{
81 | background-color: $brand-success;
82 | @include shadow-big-color($brand-success);
83 | }
84 | }
85 | }
86 | }
87 |
88 | &.nav-pills-warning{
89 | > li {
90 | &.active > a{
91 | &,
92 | &:focus,
93 | &:hover{
94 | background-color: $brand-warning;
95 | @include shadow-big-color($brand-warning);
96 | }
97 | }
98 | }
99 | }
100 |
101 | &.nav-pills-danger{
102 | > li {
103 | &.active > a{
104 | &,
105 | &:focus,
106 | &:hover{
107 | background-color: $brand-danger;
108 | @include shadow-big-color($brand-warning);
109 | }
110 | }
111 | }
112 | }
113 |
114 | }
115 | .tab-space{
116 | padding: 20px 0 50px 0px;
117 | }
118 |
--------------------------------------------------------------------------------
/src/assets/sass/md/_popups.scss:
--------------------------------------------------------------------------------
1 | // This file has been autogenerated by grunt task lessToSass. Any changes will be overwritten.
2 |
3 | .popover, .tooltip-inner {
4 | color: $gray;
5 | line-height: 1.5em;
6 | background: $white-color;
7 | border: none;
8 | border-radius: $border-radius-base;
9 | @include shadow-8dp();
10 | }
11 |
12 | .popover{
13 | padding: 0;
14 | @include shadow-16dp();
15 |
16 | &.left,
17 | &.right,
18 | &.top,
19 | &.bottom{
20 | > .arrow{
21 | border: none;
22 | }
23 | }
24 | }
25 |
26 | .popover-title{
27 | background-color: $white-color;
28 | border: none;
29 | padding: 15px 15px 5px;
30 | font-size: $font-size-h4;
31 | }
32 |
33 | .popover-content{
34 | padding: 10px 15px 15px;
35 | line-height: 1.4;
36 | }
37 |
38 | .tooltip, .tooltip.in {
39 | //opacity: 1;
40 | }
41 | .tooltip.in{
42 | opacity: 1;
43 | @include transform-translate-y(0px);
44 |
45 |
46 | }
47 | .tooltip{
48 | opacity: 0;
49 | transition: opacity, transform .2s ease;
50 | @include transform-translate-y(5px);
51 |
52 | &.left{
53 | .tooltip-arrow{
54 | border-left-color: $white-color;
55 | }
56 | }
57 | &.right{
58 | .tooltip-arrow{
59 | border-right-color: $white-color;
60 | }
61 | }
62 | &.top{
63 | .tooltip-arrow{
64 | border-top-color: $white-color;
65 | }
66 | }
67 | &.bottom{
68 | .tooltip-arrow{
69 | border-bottom-color: $white-color;
70 | }
71 | }
72 | }
73 |
74 | .tooltip-inner{
75 | padding: 10px 15px;
76 | min-width: 130px;
77 | }
78 |
--------------------------------------------------------------------------------
/src/assets/sass/md/_radios.scss:
--------------------------------------------------------------------------------
1 | // This file has been autogenerated by grunt task lessToSass. Any changes will be overwritten.
2 |
3 | @mixin radio-color($color, $opacity){
4 | & ~ .check,
5 | & ~ .circle {
6 | opacity: $opacity;
7 | }
8 |
9 | & ~ .check {
10 | background-color: $color;
11 | }
12 |
13 | & ~ .circle {
14 | border-color: $color;
15 | }
16 | }
17 |
18 | .radio {
19 | label {
20 | cursor: pointer;
21 | padding-left: 35px;
22 | position: relative;
23 | color: $mdb-radio-label-color;
24 | @include mdb-label-color-toggle-focus();
25 |
26 | span {
27 | display: block;
28 | position: absolute;
29 | left: 10px;
30 | top: 2px;
31 | transition-duration: 0.2s;
32 | }
33 | .circle {
34 | border: 1px solid $mdb-radio-color-off;
35 | height: 15px;
36 | width: 15px;
37 | border-radius: 100%;
38 | }
39 | .check {
40 | height: 15px;
41 | width: 15px;
42 | border-radius: 100%;
43 | background-color: $mdb-radio-color-on;
44 | transform: scale3d(0, 0, 0);
45 | }
46 | .check:after {
47 | display: block;
48 | position: absolute;
49 | content: "";
50 | background-color: $mdb-text-color-primary;
51 | left: -18px;
52 | top: -18px;
53 | height: 50px;
54 | width: 50px;
55 | border-radius: 100%;
56 | z-index: 1;
57 | opacity: 0;
58 | margin: 0;
59 | transform: scale3d(1.5, 1.5, 1);
60 | }
61 | input[type=radio]:not(:checked) ~ .check:after {
62 | animation: rippleOff 500ms;
63 | }
64 | input[type=radio]:checked ~ .check:after {
65 | animation: rippleOn 500ms;
66 | }
67 |
68 | }
69 |
70 | input[type=radio] {
71 | opacity: 0;
72 | height: 0;
73 | width: 0;
74 | overflow: hidden;
75 |
76 | &:checked {
77 | @include radio-color($mdb-radio-color-on, 1);
78 | }
79 | &:checked ~ .check {
80 | transform: scale3d(0.65, 0.65, 1);
81 | }
82 | }
83 |
84 | input[type=radio][disabled] {
85 |
86 | // light theme spec: Disabled: #000000, Opacity 26%
87 | @include radio-color($black, 0.26);
88 |
89 | }
90 | }
91 |
92 | @keyframes rippleOn {
93 | 0% {
94 | opacity: 0;
95 | }
96 | 50% {
97 | opacity: 0.2;
98 | }
99 | 100% {
100 | opacity: 0;
101 | }
102 | }
103 |
104 | @keyframes rippleOff {
105 | 0% {
106 | opacity: 0;
107 | }
108 | 50% {
109 | opacity: 0.2;
110 | }
111 | 100% {
112 | opacity: 0;
113 | }
114 | }
115 |
--------------------------------------------------------------------------------
/src/assets/sass/md/_ripples.scss:
--------------------------------------------------------------------------------
1 | .withripple {
2 | position: relative;
3 | }
4 | .ripple-container {
5 | position: absolute;
6 | top: 0;
7 | left: 0;
8 | z-index: 1;
9 | width: 100%;
10 | height: 100%;
11 | overflow: hidden;
12 | border-radius: inherit;
13 | pointer-events: none;
14 |
15 | .disabled &{
16 | display: none;
17 | }
18 | }
19 | .ripple {
20 | position: absolute;
21 | width: 20px;
22 | height: 20px;
23 | margin-left: -10px;
24 | margin-top: -10px;
25 | border-radius: 100%;
26 | background-color: #000; // fallback color
27 | background-color: rgba(0,0,0,0.05);
28 | transform: scale(1);
29 | transform-origin: 50%;
30 | opacity: 0;
31 | pointer-events: none;
32 | }
33 | .ripple.ripple-on {
34 | transition: opacity 0.15s ease-in 0s, transform 0.5s cubic-bezier(0.4, 0, 0.2, 1) 0.1s;
35 | opacity: 0.1;
36 | }
37 | .ripple.ripple-out {
38 | transition: opacity 0.1s linear 0s !important;
39 | opacity: 0;
40 | }
41 |
--------------------------------------------------------------------------------
/src/assets/sass/md/_shadows.scss:
--------------------------------------------------------------------------------
1 | // This file has been autogenerated by grunt task lessToSass. Any changes will be overwritten.
2 |
3 | @mixin shadow-z-1(){
4 | box-shadow:
5 | 0 1px 6px 0 rgba(0, 0, 0, 0.12),
6 | 0 1px 6px 0 rgba(0, 0, 0, 0.12);
7 | }
8 |
9 | @mixin shadow-z-1-hover(){
10 | box-shadow:
11 | 0 5px 11px 0 rgba(0, 0, 0, 0.18),
12 | 0 4px 15px 0 rgba(0, 0, 0, 0.15);
13 | }
14 |
15 | @mixin shadow-z-2(){
16 | box-shadow:
17 | 0 8px 17px 0 rgba(0, 0, 0, 0.2),
18 | 0 6px 20px 0 rgba(0, 0, 0, 0.19);
19 | }
20 |
21 | @mixin shadow-z-3(){
22 | box-shadow:
23 | 0 12px 15px 0 rgba(0, 0, 0, 0.24),
24 | 0 17px 50px 0 rgba(0, 0, 0, 0.19);
25 | }
26 |
27 | @mixin shadow-z-4(){
28 | box-shadow:
29 | 0 16px 28px 0 rgba(0, 0, 0, 0.22),
30 | 0 25px 55px 0 rgba(0, 0, 0, 0.21);
31 | }
32 |
33 | @mixin shadow-z-5(){
34 | box-shadow:
35 | 0 27px 24px 0 rgba(0, 0, 0, 0.2),
36 | 0 40px 77px 0 rgba(0, 0, 0, 0.22);
37 | }
38 |
39 |
40 | /* Shadows (from mdl http://www.getmdl.io/) */
41 |
42 | // Focus shadow mixin.
43 | @mixin big-shadow(){
44 | box-shadow: 0 0 8px rgba(0, 0, 0,.18),
45 | 0 8px 16px rgba(0, 0, 0,.36);
46 | }
47 |
48 | @mixin button-shadow-color($color){
49 | box-shadow: 0 14px 26px -12px rgba($color, $mdb-shadow-key-penumbra-opacity * 3),
50 | 0 4px 23px 0px rgba(0,0,0, $mdb-shadow-ambient-shadow-opacity),
51 | 0 8px 10px -5px rgba($color, $mdb-shadow-key-umbra-opacity);
52 | }
53 |
54 | @mixin shadow-2dp(){
55 | box-shadow: 0 2px 2px 0 rgba(0, 0, 0, $mdb-shadow-key-penumbra-opacity),
56 | 0 3px 1px -2px rgba(0, 0, 0, $mdb-shadow-key-umbra-opacity),
57 | 0 1px 5px 0 rgba(0, 0, 0, $mdb-shadow-ambient-shadow-opacity);
58 | }
59 | @mixin shadow-2dp-color($color){
60 | box-shadow: 0 2px 2px 0 rgba($color, $mdb-shadow-key-penumbra-opacity),
61 | 0 3px 1px -2px rgba($color, $mdb-shadow-key-umbra-opacity),
62 | 0 1px 5px 0 rgba($color, $mdb-shadow-ambient-shadow-opacity);
63 | }
64 |
65 | @mixin shadow-3dp(){
66 | box-shadow: 0 3px 4px 0 rgba(0, 0, 0, $mdb-shadow-key-penumbra-opacity),
67 | 0 3px 3px -2px rgba(0, 0, 0, $mdb-shadow-key-umbra-opacity),
68 | 0 1px 8px 0 rgba(0, 0, 0, $mdb-shadow-ambient-shadow-opacity);
69 | }
70 | @mixin shadow-4dp(){
71 | box-shadow: 0 4px 5px 0 rgba(0, 0, 0, $mdb-shadow-key-penumbra-opacity),
72 | 0 1px 10px 0 rgba(0, 0, 0, $mdb-shadow-ambient-shadow-opacity),
73 | 0 2px 4px -1px rgba(0, 0, 0, $mdb-shadow-key-umbra-opacity);
74 | }
75 | @mixin shadow-4dp-color($color){
76 | box-shadow: 0 4px 5px 0 rgba($color, $mdb-shadow-key-penumbra-opacity),
77 | 0 1px 10px 0 rgba($color, $mdb-shadow-ambient-shadow-opacity),
78 | 0 2px 4px -1px rgba($color, $mdb-shadow-key-umbra-opacity);
79 | }
80 | @mixin shadow-6dp(){
81 | box-shadow: 0 6px 10px 0 rgba(0, 0, 0, $mdb-shadow-key-penumbra-opacity),
82 | 0 1px 18px 0 rgba(0, 0, 0, $mdb-shadow-ambient-shadow-opacity),
83 | 0 3px 5px -1px rgba(0, 0, 0, $mdb-shadow-key-umbra-opacity);
84 | }
85 | @mixin shadow-8dp(){
86 | box-shadow: 0 8px 10px 1px rgba(0, 0, 0, $mdb-shadow-key-penumbra-opacity),
87 | 0 3px 14px 2px rgba(0, 0, 0, $mdb-shadow-ambient-shadow-opacity),
88 | 0 5px 5px -3px rgba(0, 0, 0, $mdb-shadow-key-umbra-opacity);
89 | }
90 | @mixin shadow-8dp-color($color){
91 | box-shadow: 0 8px 10px 1px rgba($color, $mdb-shadow-key-penumbra-opacity),
92 | 0 3px 14px 2px rgba(0, 0, 0, $mdb-shadow-ambient-shadow-opacity),
93 | 0 5px 5px -3px rgba($color, $mdb-shadow-key-umbra-opacity);
94 | }
95 |
96 | @mixin shadow-16dp(){
97 | box-shadow: 0 16px 24px 2px rgba(0, 0, 0, $mdb-shadow-key-penumbra-opacity),
98 | 0 6px 30px 5px rgba(0, 0, 0, $mdb-shadow-ambient-shadow-opacity),
99 | 0 8px 10px -5px rgba(0, 0, 0, $mdb-shadow-key-umbra-opacity);
100 | }
101 |
102 | @mixin shadow-16dp-color($color){
103 | box-shadow: 0 16px 24px 2px rgba($color, $mdb-shadow-key-penumbra-opacity),
104 | 0 6px 30px 5px rgba(0, 0, 0, $mdb-shadow-ambient-shadow-opacity),
105 | 0 8px 10px -5px rgba($color, $mdb-shadow-key-umbra-opacity);
106 | }
107 |
108 | @mixin shadow-24dp(){
109 | box-shadow: 0 9px 46px 8px rgba(0, 0, 0, $mdb-shadow-key-penumbra-opacity),
110 | 0 11px 15px -7px rgba(0, 0, 0, $mdb-shadow-ambient-shadow-opacity),
111 | 0 24px 38px 3px rgba(0, 0, 0, $mdb-shadow-key-umbra-opacity);
112 | }
113 |
114 | @mixin shadow-big(){
115 | box-shadow: 0 10px 30px -12px rgba(0, 0, 0, $mdb-shadow-key-penumbra-opacity * 3),
116 | 0 4px 25px 0px rgba(0, 0, 0, $mdb-shadow-ambient-shadow-opacity),
117 | 0 8px 10px -5px rgba(0, 0, 0, $mdb-shadow-key-umbra-opacity);
118 | }
119 |
120 | @mixin shadow-big-navbar(){
121 | box-shadow: 0 10px 20px -12px rgba(0, 0, 0, $mdb-shadow-key-penumbra-opacity * 3),
122 | 0 3px 20px 0px rgba(0, 0, 0, $mdb-shadow-ambient-shadow-opacity),
123 | 0 8px 10px -5px rgba(0, 0, 0, $mdb-shadow-key-umbra-opacity);
124 | }
125 |
126 | @mixin shadow-big-color($color){
127 | box-shadow: 0 12px 20px -10px rgba($color, $mdb-shadow-key-penumbra-opacity * 2),
128 | 0 4px 20px 0px rgba(0,0,0, $mdb-shadow-ambient-shadow-opacity),
129 | 0 7px 8px -5px rgba($color, $mdb-shadow-key-umbra-opacity);
130 |
131 | }
132 |
133 | // shadow backup for Sketch/Photoshop
134 | // @mixin shadow-big-color($color){
135 | // box-shadow: 0 16px 38px -12px rgba($color, $mdb-shadow-key-penumbra-opacity * 4),
136 | // 0 4px 25px 0px rgba($color, $mdb-shadow-ambient-shadow-opacity),
137 | // 0 8px 10px -5px rgba($color, $mdb-shadow-key-umbra-opacity);
138 | // }
139 |
--------------------------------------------------------------------------------
/src/assets/sass/md/_sidebar-and-main-panel.scss:
--------------------------------------------------------------------------------
1 | .wrapper{
2 | position: relative;
3 | top: 0;
4 | height: 100vh;
5 | }
6 |
7 | .sidebar,
8 | .off-canvas-sidebar{
9 | position: absolute;
10 | top: 0;
11 | bottom: 0;
12 | left: 0;
13 | z-index: 1;
14 | @include shadow-big();
15 |
16 |
17 | .sidebar-wrapper{
18 | position: relative;
19 | height: calc(100vh - 75px);
20 | overflow: auto;
21 | width: 260px;
22 | z-index: 4;
23 | //background-color: $white-color;
24 | }
25 |
26 | .logo-tim{
27 | border-radius: 50%;
28 | border: 1px solid #333;
29 | display: block;
30 | height: 61px;
31 | width: 61px;
32 | float: left;
33 | overflow: hidden;
34 |
35 | img{
36 | width: 60px;
37 | height: 60px;
38 | }
39 | }
40 |
41 |
42 |
43 | .nav{
44 | margin-top: 20px;
45 |
46 | li{
47 | > a{
48 | margin: 10px 15px;
49 | border-radius: $border-radius-base;
50 | color: $black-color;
51 | @extend .animation-transition-general;
52 | }
53 |
54 | &:hover > a{
55 | background: rgba(200, 200, 200, 0.2);
56 | color: $black-color;
57 | }
58 |
59 | &.active > a{
60 | color: #FFFFFF;
61 |
62 | i{
63 | color: #FFFFFF;
64 | }
65 | }
66 | }
67 |
68 | p{
69 | margin: 0;
70 | line-height: 30px;
71 | font-size: 14px;
72 | // font-weight: 600;
73 | // text-transform: uppercase;
74 | }
75 |
76 | i{
77 | font-size: 24px;
78 | float: left;
79 | margin-right: 15px;
80 | line-height: 30px;
81 | width: 30px;
82 | text-align: center;
83 | color: #a9afbb;
84 | }
85 | }
86 |
87 | .sidebar-background{
88 | position: absolute;
89 | z-index: 1;
90 | height: 100%;
91 | width: 100%;
92 | display: block;
93 | top: 0;
94 | left: 0;
95 | background-size: cover;
96 | background-position: center center;
97 |
98 | &:after{
99 | position: absolute;
100 | z-index: 3;
101 | width: 100%;
102 | height: 100%;
103 | content: "";
104 | display: block;
105 | background: #FFFFFF;
106 | opacity: .93;
107 | }
108 | }
109 |
110 | .logo{
111 | position: relative;
112 | padding: $padding-base $padding-base;
113 | z-index: 4;
114 |
115 | &:after{
116 | content: '';
117 | position: absolute;
118 | bottom: 0;
119 | right: 10%;
120 | height: 1px;
121 | width: 80%;
122 | background-color: rgba(180,180,180, .3);
123 |
124 | }
125 |
126 | p{
127 | float: left;
128 | font-size: 20px;
129 | margin: 10px 10px;
130 | color: $white-color;
131 | line-height: 20px;
132 | font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
133 | }
134 |
135 | .simple-text{
136 | text-transform: uppercase;
137 | padding: $padding-small-vertical $padding-zero;
138 | display: block;
139 | font-size: $font-size-large;
140 | color: $black-color;
141 | text-align: center;
142 | font-weight: $font-weight-default;
143 | line-height: 30px;
144 | }
145 | }
146 |
147 | .logo-tim{
148 | border-radius: 50%;
149 | border: 1px solid #333;
150 | display: block;
151 | height: 61px;
152 | width: 61px;
153 | float: left;
154 | overflow: hidden;
155 |
156 | img{
157 | width: 60px;
158 | height: 60px;
159 | }
160 | }
161 |
162 | &:after,
163 | &:before{
164 | display: block;
165 | content: "";
166 | position: absolute;
167 | width: 100%;
168 | height: 100%;
169 | top: 0;
170 | left: 0;
171 | z-index: 2;
172 | }
173 |
174 | &:before{
175 | opacity: .33;
176 | // background: #000000;
177 | }
178 |
179 | &:after{
180 | // @include set-background-color-button($font-background-light-grey, $background-lighter-grey);
181 | z-index: 3;
182 | opacity: 1;
183 | }
184 |
185 | &[data-image]:after,
186 | &.has-image:after{
187 | opacity: .77;
188 | }
189 |
190 | &[data-color="blue"]{
191 | @include set-background-color-button($brand-info);
192 | }
193 | &[data-color="green"]{
194 | @include set-background-color-button($brand-success);
195 | }
196 | &[data-color="orange"]{
197 | @include set-background-color-button($brand-warning);
198 | }
199 | &[data-color="red"]{
200 | @include set-background-color-button($brand-danger);
201 | }
202 | &[data-color="purple"]{
203 | @include set-background-color-button($brand-primary);
204 | }
205 | }
206 |
207 | .off-canvas-sidebar{
208 | .nav {
209 | > li > a,
210 | > li > a:hover{
211 | color: $white-color;
212 | }
213 |
214 | > li > a:focus{
215 | background: rgba(200, 200, 200, 0.2);
216 | }
217 | }
218 | }
219 |
220 |
221 | .main-panel{
222 | //background: rgba(203,203,210,.15);
223 | position: relative;
224 | z-index: 2;
225 | float: right;
226 | overflow: auto;
227 | width: $sidebar-width;
228 | min-height: 100%;
229 | @include transform-translate-x(0px);
230 | @include transition (0.33s, cubic-bezier(0.685, 0.0473, 0.346, 1));
231 |
232 | > .content{
233 | margin-top: 70px;
234 | padding: 30px 15px;
235 | min-height: calc(100% - 123px);
236 | }
237 |
238 | > .footer{
239 | border-top: 1px solid #e7e7e7;
240 | }
241 |
242 | > .navbar{
243 | margin-bottom: 0;
244 | }
245 | }
246 |
247 | .main-panel{
248 | max-height: 100%;
249 | height: 100%;
250 | }
251 | .sidebar,
252 | .main-panel{
253 | -webkit-transition-property: top,bottom;
254 | transition-property: top,bottom;
255 | -webkit-transition-duration: .2s,.2s;
256 | transition-duration: .2s,.2s;
257 | -webkit-transition-timing-function: linear,linear;
258 | transition-timing-function: linear,linear;
259 | -webkit-overflow-scrolling: touch;
260 | }
261 |
--------------------------------------------------------------------------------
/src/assets/sass/md/_tables.scss:
--------------------------------------------------------------------------------
1 | .table{
2 | > thead > tr > th{
3 | border-bottom-width: 1px;
4 | font-size: $font-size-h6;
5 | font-weight: $font-weight-light;
6 | }
7 |
8 | .radio,
9 | .checkbox{
10 | margin-top: 0;
11 | margin-bottom: 0;
12 | margin-left: 10px;
13 | padding: 0;
14 | width: 15px;
15 |
16 | .icons{
17 | position: relative;
18 | }
19 | }
20 | > thead > tr > th,
21 | > tbody > tr > th,
22 | > tfoot > tr > th,
23 | > thead > tr > td,
24 | > tbody > tr > td,
25 | > tfoot > tr > td{
26 | padding: 12px 8px;
27 | vertical-align: middle;
28 | }
29 |
30 | > thead > tr > th{
31 | padding-bottom: 4px;
32 | }
33 |
34 | .td-actions{
35 | display: flex;
36 |
37 | .btn{
38 | margin: 0px;
39 | padding: 5px;
40 | }
41 | }
42 | > tbody > tr{
43 | position: relative;
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/src/assets/sass/md/_tabs.scss:
--------------------------------------------------------------------------------
1 | // This file has been autogenerated by grunt task lessToSass. Any changes will be overwritten.
2 |
3 | .nav-tabs {
4 | background: $brand-primary;
5 | border: 0;
6 | border-radius: $border-radius-base;
7 | padding: 0 $padding-base;
8 |
9 | > li {
10 | > a {
11 | color: #FFFFFF;
12 | border: 0;
13 | margin: 0;
14 |
15 | border-radius: $border-radius-base;
16 |
17 | line-height: $mdb-btn-font-size-base * 2;
18 | text-transform: uppercase;
19 | font-size: $mdb-btn-font-size-base;
20 |
21 | &:hover {
22 | background-color: transparent;
23 | border: 0;
24 | }
25 | }
26 | & > a,
27 | & > a:hover,
28 | & > a:focus {
29 | background-color: transparent;
30 | border: 0 !important;
31 | color: #FFFFFF !important;
32 | font-weight: $font-weight-bold;
33 | }
34 | &.disabled > a,
35 | &.disabled > a:hover {
36 | color: rgba(255,255,255,0.5);
37 | }
38 |
39 | .material-icons{
40 | margin: -1px 5px 0 0;
41 | }
42 | }
43 |
44 | >li.active{
45 | & > a,
46 | & > a:hover,
47 | & > a:focus {
48 | background-color: rgba(255,255,255, .2);
49 | transition: background-color .1s .2s;
50 | }
51 | }
52 |
53 | }
54 |
--------------------------------------------------------------------------------
/src/assets/sass/md/_togglebutton.scss:
--------------------------------------------------------------------------------
1 | // This file has been autogenerated by grunt task lessToSass. Any changes will be overwritten.
2 |
3 | .togglebutton {
4 | vertical-align: middle;
5 | &, label, input, .toggle {
6 | user-select: none;
7 | }
8 | label {
9 | cursor: pointer;
10 | color: $mdb-toggle-label-color;
11 | @include mdb-label-color-toggle-focus();
12 |
13 | // Hide original checkbox
14 | input[type=checkbox] {
15 | opacity: 0;
16 | width: 0;
17 | height: 0;
18 | }
19 |
20 | .toggle {
21 | text-align: left; // Issue #737 horizontal form
22 | margin-left: 5px;
23 | }
24 | // Switch bg off and disabled
25 | .toggle,
26 | input[type=checkbox][disabled] + .toggle {
27 | content: "";
28 | display: inline-block;
29 | width: 30px;
30 | height: 15px;
31 | background-color: rgba(80, 80, 80, 0.7);
32 | border-radius: 15px;
33 | margin-right: 15px;
34 | transition: background 0.3s ease;
35 | vertical-align: middle;
36 | }
37 | // Handle off
38 | .toggle:after {
39 | content: "";
40 | display: inline-block;
41 | width: 20px;
42 | height: 20px;
43 | background-color: #FFFFFF;
44 | border-radius: 20px;
45 | position: relative;
46 | box-shadow: 0 1px 3px 1px rgba(0, 0, 0, 0.4);
47 | left: -5px;
48 | top: -3px;
49 | border: 1px solid $mdb-checkbox-border-color;
50 | transition: left 0.3s ease, background 0.3s ease, box-shadow 0.1s ease;
51 | }
52 | input[type=checkbox] {
53 | // Handle disabled
54 | &[disabled] {
55 | & + .toggle:after,
56 | &:checked + .toggle:after {
57 | background-color: #BDBDBD;
58 | }
59 | }
60 |
61 | & + .toggle:active:after,
62 | &[disabled] + .toggle:active:after {
63 | box-shadow: 0 1px 3px 1px rgba(0, 0, 0, 0.4), 0 0 0 15px rgba(0, 0, 0, 0.1);
64 | }
65 |
66 | // Ripple off and disabled
67 | &:checked + .toggle:after {
68 | left: 15px;
69 | }
70 | }
71 |
72 | // set bg when checked
73 | input[type=checkbox]:checked {
74 | + .toggle {
75 | background-color: rgba($brand-primary, (70/100)); // Switch bg on
76 | }
77 |
78 | + .toggle:after {
79 | border-color: $brand-primary; // Handle on
80 | }
81 |
82 | + .toggle:active:after {
83 | box-shadow: 0 1px 3px 1px rgba(0, 0, 0, 0.4), 0 0 0 15px rgba($brand-primary, (10/100)); // Ripple on
84 | }
85 | }
86 | }
87 | }
88 |
--------------------------------------------------------------------------------
/src/assets/sass/md/_typography.scss:
--------------------------------------------------------------------------------
1 | h1, .h1 {
2 | font-size: $font-size-h1;
3 | line-height: 1.15em;
4 | }
5 | h2, .h2{
6 | font-size: $font-size-h2;
7 | }
8 | h3, .h3{
9 | font-size: $font-size-h3;
10 | line-height: 1.4em;
11 | margin: 20px 0 10px;
12 | }
13 | h4, .h4{
14 | font-size: $font-size-h4;
15 | line-height: 1.4em;
16 | }
17 | h5, .h5 {
18 | font-size: $font-size-h5;
19 | line-height: 1.4em;
20 | margin-bottom: 15px;
21 | }
22 | h6, .h6{
23 | font-size: $font-size-h6;
24 | text-transform: uppercase;
25 | font-weight: $font-weight-bold;
26 | }
27 |
28 | /*.title,
29 | .card-title,
30 | .info-title,
31 | .footer-brand,
32 | .footer-big h5,
33 | .footer-big h4,
34 | .media .media-heading{
35 | font-weight: $font-weight-extra-bold;
36 | font-family: $font-family-serif;
37 |
38 | &,
39 | a{
40 | color: $black-color;
41 | text-decoration: none;
42 | }
43 | }*/
44 |
45 | h2.title{
46 | margin-bottom: $margin-base * 2;
47 | }
48 |
49 | .description,
50 | .card-description,
51 | .footer-big p{
52 | color: $gray-light;
53 | }
54 |
55 | .text-warning {
56 | color: $brand-warning;
57 | }
58 | .text-primary {
59 | color: $brand-primary;
60 | }
61 | .text-danger {
62 | color: $brand-danger;
63 | }
64 | .text-success {
65 | color: $brand-success;
66 | }
67 | .text-info {
68 | color: $brand-info;
69 | }
70 | .text-rose{
71 | color: $brand-rose;
72 | }
73 | .text-gray{
74 | color: $gray-color;
75 | }
76 |
--------------------------------------------------------------------------------
/src/assets/sass/md/mixins/_chartist.scss:
--------------------------------------------------------------------------------
1 | // Scales for responsive SVG containers
2 | $ct-scales: ((1), (15/16), (8/9), (5/6), (4/5), (3/4), (2/3), (5/8), (1/1.618), (3/5), (9/16), (8/15), (1/2), (2/5), (3/8), (1/3), (1/4)) !default;
3 | $ct-scales-names: (ct-square, ct-minor-second, ct-major-second, ct-minor-third, ct-major-third, ct-perfect-fourth, ct-perfect-fifth, ct-minor-sixth, ct-golden-section, ct-major-sixth, ct-minor-seventh, ct-major-seventh, ct-octave, ct-major-tenth, ct-major-eleventh, ct-major-twelfth, ct-double-octave) !default;
4 |
5 | // Class names to be used when generating CSS
6 | $ct-class-chart: ct-chart !default;
7 | $ct-class-chart-line: ct-chart-line !default;
8 | $ct-class-chart-bar: ct-chart-bar !default;
9 | $ct-class-horizontal-bars: ct-horizontal-bars !default;
10 | $ct-class-chart-pie: ct-chart-pie !default;
11 | $ct-class-chart-donut: ct-chart-donut !default;
12 | $ct-class-label: ct-label !default;
13 | $ct-class-series: ct-series !default;
14 | $ct-class-line: ct-line !default;
15 | $ct-class-point: ct-point !default;
16 | $ct-class-area: ct-area !default;
17 | $ct-class-bar: ct-bar !default;
18 | $ct-class-slice-pie: ct-slice-pie !default;
19 | $ct-class-slice-donut: ct-slice-donut !default;
20 | $ct-class-grid: ct-grid !default;
21 | $ct-class-vertical: ct-vertical !default;
22 | $ct-class-horizontal: ct-horizontal !default;
23 | $ct-class-start: ct-start !default;
24 | $ct-class-end: ct-end !default;
25 |
26 | // Container ratio
27 | $ct-container-ratio: (1/1.618) !default;
28 |
29 | // Text styles for labels
30 | $ct-text-color: rgba(0, 0, 0, 0.4) !default;
31 | $ct-text-size: 1.3rem !default;
32 | $ct-text-align: flex-start !default;
33 | $ct-text-justify: flex-start !default;
34 | $ct-text-line-height: 1;
35 |
36 | .ct-big-chart-white{
37 | $ct-grid-color: rgba(250, 250, 250, 0.7) !default;
38 | }
39 | // Grid styles
40 | $ct-grid-color: rgba(0, 0, 0, 0.2) !default;
41 | $ct-grid-dasharray: 2px !default;
42 | $ct-grid-width: 1px !default;
43 |
44 | // Line chart properties
45 | $ct-line-width: 3px !default;
46 | $ct-line-dasharray: false !default;
47 | $ct-point-size: 8px !default;
48 | // Line chart point, can be either round or square
49 | $ct-point-shape: round !default;
50 | // Area fill transparency between 0 and 1
51 | $ct-area-opacity: 0.8 !default;
52 |
53 | // Bar chart bar width
54 | $ct-bar-width: 10px !default;
55 |
56 | // Donut width (If donut width is to big it can cause issues where the shape gets distorted)
57 | $ct-donut-width: 60px !default;
58 |
59 | // If set to true it will include the default classes and generate CSS output. If you're planning to use the mixins you
60 | // should set this property to false
61 | $ct-include-classes: true !default;
62 |
63 | // If this is set to true the CSS will contain colored series. You can extend or change the color with the
64 | // properties below
65 | $ct-include-colored-series: $ct-include-classes !default;
66 |
67 | // If set to true this will include all responsive container variations using the scales defined at the top of the script
68 | $ct-include-alternative-responsive-containers: $ct-include-classes !default;
69 |
70 | // Series names and colors. This can be extended or customized as desired. Just add more series and colors.
71 | $ct-series-names: (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o) !default;
72 | $ct-series-colors: (
73 |
74 | $brand-info,
75 | $brand-danger,
76 | $brand-warning,
77 | $brand-primary,
78 | $brand-success,
79 | $font-background-light-grey,
80 | $gray-color,
81 | $social-google,
82 | $social-tumblr,
83 | $social-youtube,
84 | $social-twitter,
85 | $social-pinterest,
86 | $social-behance,
87 | #6188e2,
88 | #a748ca
89 | ) !default;
90 |
--------------------------------------------------------------------------------
/src/assets/sass/md/mixins/_transparency.scss:
--------------------------------------------------------------------------------
1 | // Opacity
2 |
3 | @mixin opacity($opacity) {
4 | opacity: $opacity;
5 | // IE8 filter
6 | $opacity-ie: ($opacity * 100);
7 | filter: #{alpha(opacity=$opacity-ie)};
8 | }
9 |
10 | @mixin black-filter($opacity){
11 | top: 0;
12 | left: 0;
13 | height: 100%;
14 | width: 100%;
15 | position: absolute;
16 | background-color: rgba(17,17,17,$opacity);
17 | display: block;
18 | content: "";
19 | z-index: 1;
20 | }
--------------------------------------------------------------------------------
/src/assets/sass/md/mixins/_vendor-prefixes.scss:
--------------------------------------------------------------------------------
1 | // User select
2 | // For selecting text on the page
3 |
4 | @mixin user-select($select) {
5 | -webkit-user-select: $select;
6 | -moz-user-select: $select;
7 | -ms-user-select: $select; // IE10+
8 | user-select: $select;
9 | }
10 |
11 | @mixin box-shadow($shadow...) {
12 | -webkit-box-shadow: $shadow; // iOS <4.3 & Android <4.1
13 | box-shadow: $shadow;
14 | }
15 |
16 | // Box sizing
17 | @mixin box-sizing($boxmodel) {
18 | -webkit-box-sizing: $boxmodel;
19 | -moz-box-sizing: $boxmodel;
20 | box-sizing: $boxmodel;
21 | }
22 |
23 |
24 | @mixin transition($time, $type){
25 | -webkit-transition: all $time $type;
26 | -moz-transition: all $time $type;
27 | -o-transition: all $time $type;
28 | -ms-transition: all $time $type;
29 | transition: all $time $type;
30 | }
31 |
32 | @mixin transform-scale($value){
33 | -webkit-transform: scale($value);
34 | -moz-transform: scale($value);
35 | -o-transform: scale($value);
36 | -ms-transform: scale($value);
37 | transform: scale($value);
38 | }
39 |
40 | @mixin transform-translate-x($value){
41 | -webkit-transform: translate3d($value, 0, 0);
42 | -moz-transform: translate3d($value, 0, 0);
43 | -o-transform: translate3d($value, 0, 0);
44 | -ms-transform: translate3d($value, 0, 0);
45 | transform: translate3d($value, 0, 0);
46 | }
47 |
48 | @mixin transform-origin($coordinates){
49 | -webkit-transform-origin: $coordinates;
50 | -moz-transform-origin: $coordinates;
51 | -o-transform-origin: $coordinates;
52 | -ms-transform-origin: $coordinates;
53 | transform-origin: $coordinates;
54 | }
55 |
56 | @mixin set-background-color-button ($color){
57 | .nav{
58 | li.active a{
59 | background-color: $color;
60 | @include shadow-big-color($color);
61 | }
62 | }
63 | }
64 |
65 | @mixin radial-gradient($extern-color, $center-color){
66 | background: $extern-color;
67 | background: -moz-radial-gradient(center, ellipse cover, $center-color 0%, $extern-color 100%); /* FF3.6+ */
68 | background: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%,$center-color), color-stop(100%,$extern-color)); /* Chrome,Safari4+ */
69 | background: -webkit-radial-gradient(center, ellipse cover, $center-color 0%,$extern-color 100%); /* Chrome10+,Safari5.1+ */
70 | background: -o-radial-gradient(center, ellipse cover, $center-color 0%,$extern-color 100%); /* Opera 12+ */
71 | background: -ms-radial-gradient(center, ellipse cover, $center-color 0%,$extern-color 100%); /* IE10+ */
72 | background: radial-gradient(ellipse at center, $center-color 0%,$extern-color 100%); /* W3C */
73 | background-size: 550% 450%;
74 | }
75 |
76 | @mixin vertical-align {
77 | position: relative;
78 | top: 50%;
79 | -webkit-transform: translateY(-50%);
80 | -ms-transform: translateY(-50%);
81 | transform: translateY(-50%);
82 | }
83 |
84 | @mixin rotate-180(){
85 | filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=2);
86 | -webkit-transform: rotate(180deg);
87 | -ms-transform: rotate(180deg);
88 | transform: rotate(180deg);
89 | }
90 |
91 | @mixin bar-animation($type){
92 | -webkit-animation: $type 500ms linear 0s;
93 | -moz-animation: $type 500ms linear 0s;
94 | animation: $type 500ms 0s;
95 | -webkit-animation-fill-mode: forwards;
96 | -moz-animation-fill-mode: forwards;
97 | animation-fill-mode: forwards;
98 | }
99 |
100 | @mixin topbar-x-rotation(){
101 | @keyframes topbar-x {
102 | 0% {top: 0px; transform: rotate(0deg); }
103 | 45% {top: 6px; transform: rotate(145deg); }
104 | 75% {transform: rotate(130deg); }
105 | 100% {transform: rotate(135deg); }
106 | }
107 | @-webkit-keyframes topbar-x {
108 | 0% {top: 0px; -webkit-transform: rotate(0deg); }
109 | 45% {top: 6px; -webkit-transform: rotate(145deg); }
110 | 75% {-webkit-transform: rotate(130deg); }
111 | 100% { -webkit-transform: rotate(135deg); }
112 | }
113 | @-moz-keyframes topbar-x {
114 | 0% {top: 0px; -moz-transform: rotate(0deg); }
115 | 45% {top: 6px; -moz-transform: rotate(145deg); }
116 | 75% {-moz-transform: rotate(130deg); }
117 | 100% { -moz-transform: rotate(135deg); }
118 | }
119 | }
120 |
121 | @mixin topbar-back-rotation(){
122 | @keyframes topbar-back {
123 | 0% { top: 6px; transform: rotate(135deg); }
124 | 45% { transform: rotate(-10deg); }
125 | 75% { transform: rotate(5deg); }
126 | 100% { top: 0px; transform: rotate(0); }
127 | }
128 |
129 | @-webkit-keyframes topbar-back {
130 | 0% { top: 6px; -webkit-transform: rotate(135deg); }
131 | 45% { -webkit-transform: rotate(-10deg); }
132 | 75% { -webkit-transform: rotate(5deg); }
133 | 100% { top: 0px; -webkit-transform: rotate(0); }
134 | }
135 |
136 | @-moz-keyframes topbar-back {
137 | 0% { top: 6px; -moz-transform: rotate(135deg); }
138 | 45% { -moz-transform: rotate(-10deg); }
139 | 75% { -moz-transform: rotate(5deg); }
140 | 100% { top: 0px; -moz-transform: rotate(0); }
141 | }
142 | }
143 |
144 | @mixin bottombar-x-rotation(){
145 | @keyframes bottombar-x {
146 | 0% {bottom: 0px; transform: rotate(0deg);}
147 | 45% {bottom: 6px; transform: rotate(-145deg);}
148 | 75% {transform: rotate(-130deg);}
149 | 100% {transform: rotate(-135deg);}
150 | }
151 | @-webkit-keyframes bottombar-x {
152 | 0% {bottom: 0px; -webkit-transform: rotate(0deg);}
153 | 45% {bottom: 6px; -webkit-transform: rotate(-145deg);}
154 | 75% {-webkit-transform: rotate(-130deg);}
155 | 100% {-webkit-transform: rotate(-135deg);}
156 | }
157 | @-moz-keyframes bottombar-x {
158 | 0% {bottom: 0px; -moz-transform: rotate(0deg);}
159 | 45% {bottom: 6px; -moz-transform: rotate(-145deg);}
160 | 75% {-moz-transform: rotate(-130deg);}
161 | 100% {-moz-transform: rotate(-135deg);}
162 | }
163 | }
164 |
165 | @mixin bottombar-back-rotation{
166 | @keyframes bottombar-back {
167 | 0% { bottom: 6px;transform: rotate(-135deg);}
168 | 45% { transform: rotate(10deg);}
169 | 75% { transform: rotate(-5deg);}
170 | 100% { bottom: 0px;transform: rotate(0);}
171 | }
172 | @-webkit-keyframes bottombar-back {
173 | 0% {bottom: 6px;-webkit-transform: rotate(-135deg);}
174 | 45% {-webkit-transform: rotate(10deg);}
175 | 75% {-webkit-transform: rotate(-5deg);}
176 | 100% {bottom: 0px;-webkit-transform: rotate(0);}
177 | }
178 | @-moz-keyframes bottombar-back {
179 | 0% {bottom: 6px;-moz-transform: rotate(-135deg);}
180 | 45% {-moz-transform: rotate(10deg);}
181 | 75% {-moz-transform: rotate(-5deg);}
182 | 100% {bottom: 0px;-moz-transform: rotate(0);}
183 | }
184 |
185 | }
186 |
--------------------------------------------------------------------------------
/src/assets/sass/md/plugins/_animate.scss:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 | // This file was modified by Creative Tim to keep only the animation that we need for Bootstrap Notify
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 | @charset "UTF-8";
34 |
35 | /*!
36 | Animate.css - http://daneden.me/animate
37 | Licensed under the MIT license - http://opensource.org/licenses/MIT
38 |
39 | Copyright (c) 2015 Daniel Eden
40 | */
41 |
42 | .animated {
43 | -webkit-animation-duration: 1s;
44 | animation-duration: 1s;
45 | -webkit-animation-fill-mode: both;
46 | animation-fill-mode: both;
47 | }
48 |
49 | .animated.infinite {
50 | -webkit-animation-iteration-count: infinite;
51 | animation-iteration-count: infinite;
52 | }
53 |
54 | .animated.hinge {
55 | -webkit-animation-duration: 2s;
56 | animation-duration: 2s;
57 | }
58 |
59 | .animated.bounceIn,
60 | .animated.bounceOut {
61 | -webkit-animation-duration: .75s;
62 | animation-duration: .75s;
63 | }
64 |
65 | .animated.flipOutX,
66 | .animated.flipOutY {
67 | -webkit-animation-duration: .75s;
68 | animation-duration: .75s;
69 | }
70 |
71 | @-webkit-keyframes shake {
72 | from, to {
73 | -webkit-transform: translate3d(0, 0, 0);
74 | transform: translate3d(0, 0, 0);
75 | }
76 |
77 | 10%, 30%, 50%, 70%, 90% {
78 | -webkit-transform: translate3d(-10px, 0, 0);
79 | transform: translate3d(-10px, 0, 0);
80 | }
81 |
82 | 20%, 40%, 60%, 80% {
83 | -webkit-transform: translate3d(10px, 0, 0);
84 | transform: translate3d(10px, 0, 0);
85 | }
86 | }
87 |
88 | @keyframes shake {
89 | from, to {
90 | -webkit-transform: translate3d(0, 0, 0);
91 | transform: translate3d(0, 0, 0);
92 | }
93 |
94 | 10%, 30%, 50%, 70%, 90% {
95 | -webkit-transform: translate3d(-10px, 0, 0);
96 | transform: translate3d(-10px, 0, 0);
97 | }
98 |
99 | 20%, 40%, 60%, 80% {
100 | -webkit-transform: translate3d(10px, 0, 0);
101 | transform: translate3d(10px, 0, 0);
102 | }
103 | }
104 |
105 | .shake {
106 | -webkit-animation-name: shake;
107 | animation-name: shake;
108 | }
109 |
110 |
111 |
112 | @-webkit-keyframes fadeInDown {
113 | from {
114 | opacity: 0;
115 | -webkit-transform: translate3d(0, -100%, 0);
116 | transform: translate3d(0, -100%, 0);
117 | }
118 |
119 | to {
120 | opacity: 1;
121 | -webkit-transform: none;
122 | transform: none;
123 | }
124 | }
125 |
126 | @keyframes fadeInDown {
127 | from {
128 | opacity: 0;
129 | -webkit-transform: translate3d(0, -100%, 0);
130 | transform: translate3d(0, -100%, 0);
131 | }
132 |
133 | to {
134 | opacity: 1;
135 | -webkit-transform: none;
136 | transform: none;
137 | }
138 | }
139 |
140 | .fadeInDown {
141 | -webkit-animation-name: fadeInDown;
142 | animation-name: fadeInDown;
143 | }
144 |
145 |
146 | @-webkit-keyframes fadeOut {
147 | from {
148 | opacity: 1;
149 | }
150 |
151 | to {
152 | opacity: 0;
153 | }
154 | }
155 |
156 | @keyframes fadeOut {
157 | from {
158 | opacity: 1;
159 | }
160 |
161 | to {
162 | opacity: 0;
163 | }
164 | }
165 |
166 | .fadeOut {
167 | -webkit-animation-name: fadeOut;
168 | animation-name: fadeOut;
169 | }
170 |
171 | @-webkit-keyframes fadeOutDown {
172 | from {
173 | opacity: 1;
174 | }
175 |
176 | to {
177 | opacity: 0;
178 | -webkit-transform: translate3d(0, 100%, 0);
179 | transform: translate3d(0, 100%, 0);
180 | }
181 | }
182 |
183 | @keyframes fadeOutDown {
184 | from {
185 | opacity: 1;
186 | }
187 |
188 | to {
189 | opacity: 0;
190 | -webkit-transform: translate3d(0, 100%, 0);
191 | transform: translate3d(0, 100%, 0);
192 | }
193 | }
194 |
195 | .fadeOutDown {
196 | -webkit-animation-name: fadeOutDown;
197 | animation-name: fadeOutDown;
198 | }
199 |
200 | @-webkit-keyframes fadeOutUp {
201 | from {
202 | opacity: 1;
203 | }
204 |
205 | to {
206 | opacity: 0;
207 | -webkit-transform: translate3d(0, -100%, 0);
208 | transform: translate3d(0, -100%, 0);
209 | }
210 | }
211 |
212 | @keyframes fadeOutUp {
213 | from {
214 | opacity: 1;
215 | }
216 |
217 | to {
218 | opacity: 0;
219 | -webkit-transform: translate3d(0, -100%, 0);
220 | transform: translate3d(0, -100%, 0);
221 | }
222 | }
223 |
224 | .fadeOutUp {
225 | -webkit-animation-name: fadeOutUp;
226 | animation-name: fadeOutUp;
227 | }
228 |
--------------------------------------------------------------------------------
/src/assets/sass/md/plugins/_plugin-nouislider.scss:
--------------------------------------------------------------------------------
1 | // This file has been autogenerated by grunt task lessToSass. Any changes will be overwritten.
2 |
3 | .noUi-target,
4 | .noUi-target * {
5 | -webkit-touch-callout: none;
6 | -ms-touch-action: none;
7 | user-select: none;
8 | box-sizing: border-box;
9 | }
10 | .noUi-base {
11 | width: 100%;
12 | height: 100%;
13 | position: relative;
14 | }
15 | .noUi-origin {
16 | position: absolute;
17 | right: 0;
18 | top: 0;
19 | left: 0;
20 | bottom: 0;
21 | }
22 | .noUi-handle {
23 | position: relative;
24 | z-index: 1;
25 | box-sizing: border-box;
26 | }
27 | .noUi-stacking .noUi-handle {
28 | z-index: 10;
29 | }
30 | //.noUi-stacking + .noUi-origin {
31 | // *z-index: -1;
32 | //} WARNING: Property with star prefix found. Checks for the star property hack (targets IE6/7) (star-property-hack) Browsers: All
33 | .noUi-state-tap .noUi-origin {
34 | transition: left 0.3s, top 0.3s;
35 | }
36 | .noUi-state-drag * {
37 | cursor: inherit !important;
38 | }
39 | .noUi-horizontal {
40 | height: 10px;
41 | }
42 | .noUi-handle {
43 | box-sizing: border-box;
44 | width: 14px;
45 | height: 14px;
46 | left: -10px;
47 | top: -6px;
48 | cursor: pointer;
49 | border-radius: 100%;
50 | transition: all 0.2s ease-out;
51 | border: 1px solid;
52 | background: $white-color;
53 |
54 | @include shadow-2dp();
55 | }
56 | .noUi-vertical .noUi-handle {
57 | margin-left: 5px;
58 | cursor: ns-resize;
59 | }
60 | .noUi-horizontal.noUi-extended {
61 | padding: 0 15px;
62 | }
63 | .noUi-horizontal.noUi-extended .noUi-origin {
64 | right: -15px;
65 | }
66 | .noUi-background {
67 | height: 2px;
68 | margin: 20px 0;
69 | }
70 | .noUi-origin {
71 | margin: 0;
72 | border-radius: 0;
73 | height: 2px;
74 | background: #c8c8c8;
75 | &[style^="left: 0"] .noUi-handle {
76 | background-color: #fff;
77 | border: 2px solid #c8c8c8;
78 | &.noUi-active {
79 | border-width: 1px;
80 | }
81 | }
82 | }
83 | .noUi-target {
84 | border-radius: $border-radius-base;
85 | }
86 | .noUi-horizontal {
87 | height: 2px;
88 | margin: 15px 0;
89 | }
90 | .noUi-vertical {
91 | height: 100%;
92 | width: 2px;
93 | margin: 0 15px;
94 | display: inline-block;
95 | }
96 | .noUi-handle.noUi-active {
97 | transform: scale3d(2, 2, 1);
98 | }
99 | [disabled].noUi-slider{
100 | opacity: 0.5;
101 | }
102 | [disabled] .noUi-handle {
103 | cursor: not-allowed;
104 | }
105 |
106 | .slider {
107 | background: #c8c8c8;
108 | }
109 |
110 | .slider {
111 |
112 | &.noUi-connect{
113 | background-color: $brand-primary;
114 | }
115 |
116 | .noUi-handle{
117 | border-color: $brand-primary;
118 | }
119 |
120 | &.slider-info{
121 | & .noUi-connect,
122 | &.noUi-connect{
123 | background-color: $brand-info;
124 | }
125 |
126 | .noUi-handle{
127 | border-color: $brand-info;
128 | }
129 | }
130 | &.slider-success{
131 | & .noUi-connect,
132 | &.noUi-connect{
133 | background-color: $brand-success;
134 | }
135 |
136 | .noUi-handle{
137 | border-color: $brand-success;
138 | }
139 | }
140 | &.slider-warning{
141 | & .noUi-connect,
142 | &.noUi-connect{
143 | background-color: $brand-warning;
144 | }
145 |
146 | .noUi-handle{
147 | border-color: $brand-warning;
148 | }
149 | }
150 | &.slider-danger{
151 | & .noUi-connect,
152 | &.noUi-connect{
153 | background-color: $brand-danger;
154 | }
155 |
156 | .noUi-handle{
157 | border-color: $brand-danger;
158 | }
159 | }
160 |
161 | }
162 |
--------------------------------------------------------------------------------
/src/components/Footer/index.vue:
--------------------------------------------------------------------------------
1 |
2 | footer.footer
3 | .container-fluid
4 | nav.pull-left
5 | ul
6 | li
7 | a(href='#')
8 | | Home
9 | li
10 | a(href='#')
11 | | Company
12 | li
13 | a(href='#')
14 | | Portfolio
15 | li
16 | a(href='#')
17 | | Blog
18 | p.copyright.pull-right
19 | | ©
20 | | {{year}}
21 | | Crafted with
22 | i.fa.fa-heart.heart
23 | | by
24 | a(href='https://github.com/lucduong') Luc Duong.
25 | | Designed by
26 | a(href='http://www.creative-tim.com') Creative Tim
27 |
28 |
37 |
42 |
43 |
--------------------------------------------------------------------------------
/src/components/GeneralViews/NotFound.vue:
--------------------------------------------------------------------------------
1 |
2 |
59 |
60 |
61 |
65 |
--------------------------------------------------------------------------------
/src/components/Icons/index.vue:
--------------------------------------------------------------------------------
1 |
2 | .content
3 | .row
4 | .col-md-12
5 | .card.card-plain
6 | .card-header(data-background-color='purple')
7 | h4.title Material Design Icons
8 | p.category
9 | | Handcrafted by our friends from
10 | a(target='_blank', href='https://design.google.com/icons/') Google
11 | .card-content
12 | .iframe-container.hidden-sm.hidden-xs
13 | iframe(src='https://design.google.com/icons/')
14 | p Your browser does not support iframes.
15 | .col-md-6.hidden-lg.hidden-md.text-center
16 | h5
17 | | The icons are visible on Desktop mode inside an iframe. Since the iframe is not working on Mobile and Tablets please visit the icons on their original page on Google. Check the
18 | a(href='https://design.google.com/icons/', target='_blank') Material Icons
19 |
20 |
21 |
26 |
29 |
30 |
--------------------------------------------------------------------------------
/src/components/Maps/index.vue:
--------------------------------------------------------------------------------
1 |
2 | #mMap
3 |
4 |
5 |
27 |
35 |
--------------------------------------------------------------------------------
/src/components/Navigation/index.vue:
--------------------------------------------------------------------------------
1 |
2 | nav.navbar.navbar-transparent.navbar-absolute
3 | .container-fluid
4 | .navbar-header
5 | button.navbar-toggle(type='button', data-toggle='collapse', @click='toggleSideBar')
6 | span.sr-only Toggle navigation
7 | span.icon-bar
8 | span.icon-bar
9 | span.icon-bar
10 | a.navbar-brand(href='#') {{$route.name}}
11 | .collapse.navbar-collapse
12 | navbar-right
13 | navbar-search
14 |
15 |
31 |
--------------------------------------------------------------------------------
/src/components/Navigation/navbar-right.vue:
--------------------------------------------------------------------------------
1 |
2 | ul.nav(:class='navClasses')
3 | li
4 | router-link.dropdown-toggle(to='/', data-toggle='dropdown')
5 | i.material-icons dashboard
6 | p.hidden-lg.hidden-md Dashboard
7 | li.dropdown(:class='{ open : isDropdownOpened }', v-click-outside='closeDropdown')
8 | a.dropdown-toggle(href='#', data-toggle='dropdown', @click.prevent='openDropdown')
9 | i.material-icons notifications
10 | span.notification 5
11 | p.hidden-lg.hidden-md Notifications
12 | ul.dropdown-menu
13 | li
14 | a(href='#') Mike John responded to your email
15 | li
16 | a(href='#') You have 5 new tasks
17 | li
18 | a(href='#') You're now friend with Andrew
19 | li
20 | a(href='#') Another Notification
21 | li
22 | a(href='#') Another One
23 | li
24 | a.dropdown-toggle(href='#', data-toggle='dropdown')
25 | i.material-icons person
26 | p.hidden-lg.hidden-md Profile
27 |
28 |
56 |
57 |
--------------------------------------------------------------------------------
/src/components/Navigation/navbar-search.vue:
--------------------------------------------------------------------------------
1 |
2 | form.navbar-form.navbar-right(role='search')
3 | .form-group.is-empty
4 | input.form-control(type='text', placeholder='Search', v-model='searchText')
5 | span.material-input
6 | md-button.btn.btn-white.btn-round.btn-just-icon(type='button', @click='$emit("onSearchClick", searchText)')
7 | i.material-icons search
8 | .ripple-container
9 |
10 |
20 |
--------------------------------------------------------------------------------
/src/components/Notifications/index.vue:
--------------------------------------------------------------------------------
1 |
2 | .content
3 | .container-fluid
4 | .card
5 | .card-header(data-background-color='purple')
6 | h4.title Notifications
7 | p.category
8 | | Handcrafted by our friend
9 | a(target='_blank', href='https://github.com/mouse0270') Robert McIntosh
10 | | . Please checkout the
11 | a(href='http://bootstrap-notify.remabledesigns.com/', target='_blank') full documentation.
12 | .card-content
13 | .row
14 | .col-md-6
15 | h5 Notifications Style
16 | .alert.alert-info
17 | span This is a plain notification
18 | .alert.alert-info
19 | button.close(type='button', aria-hidden='true') ×
20 | span This is a notification with close button.
21 | .alert.alert-info.alert-with-icon(data-notify='container')
22 | button.close(type='button', aria-hidden='true') ×
23 | i.material-icons(data-notify='icon') add_alert
24 | span(data-notify='message') This is a notification with close button and icon.
25 | .alert.alert-info.alert-with-icon(data-notify='container')
26 | button.close(type='button', aria-hidden='true') ×
27 | i.material-icons(data-notify='icon') add_alert
28 | span(data-notify='message')
29 | | This is a notification with close button and icon and have many lines. You can see that the icon and the close button are always vertically aligned. This is a beautiful notification. So you don't have to worry about the style.
30 | .col-md-6
31 | h5 Notification states
32 | .alert.alert-info
33 | button.close(type='button', aria-hidden='true') ×
34 | span
35 | b Info -
36 | | This is a regular notification made with ".alert-info"
37 | .alert.alert-success
38 | button.close(type='button', aria-hidden='true') ×
39 | span
40 | b Success -
41 | | This is a regular notification made with ".alert-success"
42 | .alert.alert-warning
43 | button.close(type='button', aria-hidden='true') ×
44 | span
45 | b Warning -
46 | | This is a regular notification made with ".alert-warning"
47 | .alert.alert-danger
48 | button.close(type='button', aria-hidden='true') ×
49 | span
50 | b Danger -
51 | | This is a regular notification made with ".alert-danger"
52 | .alert.alert-primary
53 | button.close(type='button', aria-hidden='true') ×
54 | span
55 | b Primary -
56 | | This is a regular notification made with ".alert-primary"
57 | br
58 | br
59 | .places-buttons
60 | .row
61 | .col-md-6.col-md-offset-3.text-center
62 | h5
63 | | Notifications Places
64 | p.category Click to view notifications
65 | .row
66 | .col-md-8.col-md-offset-2
67 | .col-md-4
68 | md-button.btn.btn-primary.btn-block(@click="showNotification('top', 'left')") Top Left
69 | .col-md-4
70 | md-button.btn.btn-primary.btn-block(@click="showNotification('top', 'center')") Top Center
71 | .col-md-4
72 | md-button.btn.btn-primary.btn-block(@click="showNotification('top', 'right')") Top Right
73 | .row
74 | .col-md-8.col-md-offset-2
75 | .col-md-4
76 | md-button.btn.btn-primary.btn-block(@click="showNotification('bottom', 'left')") Bottom Left
77 | .col-md-4
78 | md-button.btn.btn-primary.btn-block(@click="showNotification('bottom', 'center')") Bottom Center
79 | .col-md-4
80 | md-button.btn.btn-primary.btn-block(@click="showNotification('bottom', 'right')") Bottom Right
81 |
82 |
83 |
110 |
113 |
114 |
--------------------------------------------------------------------------------
/src/components/Sidebar/index.vue:
--------------------------------------------------------------------------------
1 |
2 | .sidebar(data-color='blue')
3 | .logo
4 | a.simple-text(href='http://www.creative-tim.com')
5 | | Creative Tim
6 | .sidebar-wrapper
7 | navbar-search(v-if='open')
8 | navbar-right(v-if='open', :mobile='true')
9 | ul.nav
10 | item(title='Dashboard', icon='dashboard', href='/')
11 | item(title='User Profile', icon='person', href='person')
12 | item(title='Table List', icon='content_paste', href='table')
13 | item(title='Typography', icon='library_books', href='typography')
14 | item(title='Icons', icon='bubble_chart', href='icons')
15 | item(title='Maps', icon='location_on', href='maps')
16 | item(title='Notifications', icon='notifications', href='notifications')
17 | li(:class='{ "active-pro" : !open }')
18 | a(href='upgrade.html')
19 | i.material-icons unarchive
20 | p Upgrade to PRO
21 | .sidebar-background
22 |
23 |
39 |
40 |
45 |
46 |
--------------------------------------------------------------------------------
/src/components/Sidebar/item.vue:
--------------------------------------------------------------------------------
1 |
2 | router-link(tag="li", :to="href", active-class="active", exact)
3 | a(:href='href')
4 | i.material-icons.text-gray {{icon}}
5 | p {{title}}
6 |
7 |
8 |
17 |
--------------------------------------------------------------------------------
/src/components/TableList/index.vue:
--------------------------------------------------------------------------------
1 |
2 | .content
3 | .row
4 | .col-md-12
5 | md-card(title='Simple Table', category='Here is a subtitle for this table', backgroundColor='purple')
6 | md-table(:data='table1.data', :columns='table1.columns')
7 | .col-md-12
8 | md-card.card-plain(title='Table on Plain Background', category='Here is a subtitle for this table', backgroundColor='purple')
9 | md-table(type='hover', :data='table2.data', :columns='table2.columns')
10 |
11 |
12 |
36 |
39 |
--------------------------------------------------------------------------------
/src/components/Typography/index.vue:
--------------------------------------------------------------------------------
1 |
2 | .content
3 | .container-fluid
4 | .row
5 | .col-md-12
6 | .card
7 | .card-header(data-background-color='purple')
8 | h4.title Material Dashboard Heading
9 | p.category Created using Roboto Font Family
10 | .card-content
11 | #typography
12 | .title
13 | h2 Typography
14 | .row
15 | .tim-typo
16 | h1
17 | span.tim-note Header 1
18 | | The Life of Material Dashboard
19 | .tim-typo
20 | h2
21 | span.tim-note Header 2
22 | | The life of Material Dashboard
23 | .tim-typo
24 | h3
25 | span.tim-note Header 3
26 | | The life of Material Dashboard
27 | .tim-typo
28 | h4
29 | span.tim-note Header 4
30 | | The life of Material Dashboard
31 | .tim-typo
32 | h5
33 | span.tim-note Header 5
34 | | The life of Material Dashboard
35 | .tim-typo
36 | h6
37 | span.tim-note Header 6
38 | | The life of Material Dashboard
39 | .tim-typo
40 | p
41 | span.tim-note Paragraph
42 | | I will be the leader of a company that ends up being worth billions of dollars, because I got the answers. I understand culture. I am the nucleus. I think that’s a responsibility that I have, to push possibilities, to show people, this is the level that things could be at.
43 | .tim-typo
44 | span.tim-note Quote
45 | md-blockquote(author='Kanye West, Musician', content='I will be the leader of a company that ends up being worth billions of dollars, because I got the answers. I understand culture. I am the nucleus. I think that’s a responsibility that I have, to push possibilities, to show people, this is the level that things could be at.')
46 | .tim-typo
47 | span.tim-note Muted Text
48 | p.text-muted
49 | | I will be the leader of a company that ends up being worth billions of dollars, because I got the answers...
50 | .tim-typo
51 | span.tim-note Primary Text
52 | p.text-primary
53 | | I will be the leader of a company that ends up being worth billions of dollars, because I got the answers...
54 | .tim-typo
55 | span.tim-note Info Text
56 | p.text-info
57 | | I will be the leader of a company that ends up being worth billions of dollars, because I got the answers...
58 | .tim-typo
59 | span.tim-note Success Text
60 | p.text-success
61 | | I will be the leader of a company that ends up being worth billions of dollars, because I got the answers...
62 | .tim-typo
63 | span.tim-note Warning Text
64 | p.text-warning
65 | | I will be the leader of a company that ends up being worth billions of dollars, because I got the answers...
66 | .tim-typo
67 | span.tim-note Danger Text
68 | p.text-danger
69 | | I will be the leader of a company that ends up being worth billions of dollars, because I got the answers...
70 | .tim-typo
71 | h2
72 | span.tim-note Small Tag
73 | | Header with small subtitle
74 | br
75 | small Use "small" tag for the headers
76 |
77 |
78 |
83 |
86 |
87 |
--------------------------------------------------------------------------------
/src/components/UserProfile/index.vue:
--------------------------------------------------------------------------------
1 |
2 | .content
3 | .row
4 | .col-md-8
5 | .card
6 | .card-header(data-background-color='purple')
7 | h4.title Edit Profile
8 | p.category Complete your profile
9 | .card-content
10 | form
11 | .row
12 | .col-md-5
13 | md-fg-input(label='Company (disbaled)', :disabled='true', :labelFloating='true', v-model='user.company')
14 | .col-md-3
15 | md-fg-input(label='Username', :labelFloating='true', v-model='user.username')
16 | .col-md-4
17 | md-fg-input(type='email', label='Email address', :labelFloating='true', v-model='user.email')
18 | .row
19 | .col-md-6
20 | md-fg-input(label='First Name', :labelFloating='true', v-model='user.firstName')
21 | .col-md-6
22 | md-fg-input(label='Last Name', :labelFloating='true', v-model='user.lastName')
23 | .row
24 | .col-md-12
25 | md-fg-input(label='Adress', :labelFloating='true', v-model='user.address')
26 | .row
27 | .col-md-4
28 | md-fg-input(label='City', :labelFloating='true', v-model='user.city')
29 | .col-md-4
30 | md-fg-input(label='Country', :labelFloating='true', v-model='user.country')
31 | .col-md-4
32 | md-fg-input(label='Postal Code', :labelFloating='true', v-model='user.postalCode')
33 | .row
34 | .col-md-12
35 | md-fg-input(type='textarea', label='About Me', :labelFloating='true', :rows='5', v-model='user.aboutMe')
36 | md-button.btn.btn-primary.pull-right(@click.prevent='updateProfile') Update Profile
37 | .clearfix
38 | .col-md-4
39 | .card.card-profile
40 | .card-avatar
41 | a(href='#pablo')
42 | img.img(src='~images/faces/marc.jpg')
43 | .content
44 | h6.category.text-gray CEO / Co-Founder
45 | h4.card-title {{user.name}}
46 | p.card-content
47 | | {{user.aboutMe}}
48 | md-button.btn.btn-primary.btn-round(href='#/person') Follow
49 |
50 |
75 |
76 |
--------------------------------------------------------------------------------
/src/core/components/index.js:
--------------------------------------------------------------------------------
1 | import MdButon from './mdButton'
2 | import MdCard from './mdCard'
3 | import MdFormGroupInput from './mdFormGroupInput'
4 | import MdTab from './mdTab'
5 | import MdStatsWidget from './mdStatsWidget'
6 | import MdTable from './mdTable'
7 | import MdBlockquote from './mdBlockquote'
8 | import MdChartWidget from './mdChartWidget'
9 |
10 | export default {
11 | install(Vue) {
12 | Vue.component(MdButon.name, MdButon)
13 | Vue.component(MdCard.name, MdCard)
14 | Vue.component(MdFormGroupInput.name, MdFormGroupInput)
15 | Vue.component(MdTab.name, MdTab)
16 | Vue.component(MdStatsWidget.name, MdStatsWidget)
17 | Vue.component(MdTable.name, MdTable)
18 | Vue.component(MdBlockquote.name, MdBlockquote)
19 | Vue.component(MdChartWidget.name, MdChartWidget)
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/src/core/components/mdBlockquote/index.vue:
--------------------------------------------------------------------------------
1 |
2 | blockquote
3 | p {{content}}
4 | small(v-if="!!author") {{author}}
5 |
6 |
7 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/src/core/components/mdButton/index.vue:
--------------------------------------------------------------------------------
1 |
2 | a(v-bind='$props', v-if='!!href')
3 | slot
4 | button.md-button(v-bind='$props', @click="$emit('click', $event)", v-else)
5 | slot
6 |
7 |
8 |
21 |
22 |
23 |
--------------------------------------------------------------------------------
/src/core/components/mdCard/index.vue:
--------------------------------------------------------------------------------
1 |
2 | .card(:class="cardClass")
3 | .card-header(:data-background-color="backgroundColor")
4 | h4.title(v-if="!hasHeaderSlot") {{title}}
5 | p.category(v-if="!hasHeaderSlot") {{category}}
6 | slot(name='header')
7 | .card-content(:class="{ 'table-responsive' : hasTable }")
8 | slot
9 |
10 |
11 |
29 |
30 |
31 |
--------------------------------------------------------------------------------
/src/core/components/mdChartWidget/index.vue:
--------------------------------------------------------------------------------
1 |
2 | .card
3 | .card-header.card-chart(:data-background-color='backgroundColor')
4 | .ct-chart(:id='id')
5 | .card-content
6 | h4.title(v-if='!hasTitleSlot') {{title}}
7 | slot(name='title')
8 | p.category
9 | slot(name='subTitle')
10 | .card-footer
11 | .stats
12 | slot(name='footer')
13 |
14 |
15 |
142 |
143 |
144 |
--------------------------------------------------------------------------------
/src/core/components/mdFormGroupInput/index.vue:
--------------------------------------------------------------------------------
1 |
2 | .form-group(:class="{ 'label-floating' : labelFloating }")
3 | label.control-label(v-if='label')
4 | | {{label}}
5 | textarea.form-control(v-bind='$props', @input="$emit('input',$event.target.value)" , v-if="type === 'textarea'")
6 | input.form-control(v-bind='$props', :value='value', @input="$emit('input',$event.target.value)", v-else)
7 |
8 |
28 |
29 |
--------------------------------------------------------------------------------
/src/core/components/mdNotification/index.vue:
--------------------------------------------------------------------------------
1 |
2 | .md-notification.col-xs-11.col-sm-3.alert.open(data-notify='container', :class='[placement.from, placement.align, `alert-${type}`, withIcon]', role='alert', :style='customPosition', data-notify-position='top-center')
3 | button.close(v-if='allowDismiss', type='button', aria-hidden='true', data-notify='dismiss', @click='close') ×
4 | i.material-icons(data-notify='icon', v-if='!!icon') {{icon}}
5 | span(data-notify='title', v-if='!!title') {{title}}
6 | slot(name='message')
7 | span(data-notify='message', v-if='!!message', v-html='message')
8 | .progress(data-notify='progressbar', v-if='progressbar')
9 | .progress-bar(class='`progress-bar-${type}`', role='progressbar', aria-valuenow='0', aria-valuemin='0', aria-valuemax='100', style='width: 0%;')
10 | a(v-if='!!url', href='url', target='target', data-notify='url')
11 |
12 |
96 |
190 |
--------------------------------------------------------------------------------
/src/core/components/mdNotifications/index.vue:
--------------------------------------------------------------------------------
1 |
2 | .notifications
3 | transition-group(name='list')
4 | md-notification(v-for='(n,index) in notifications',
5 | :key='n',
6 | :message='n.message',
7 | :icon='n.icon',
8 | :type='n.type',
9 | :placement='n.placement',
10 | @onClose='removeNotification(index)')
11 |
12 |
33 |
50 |
--------------------------------------------------------------------------------
/src/core/components/mdNotifications/install.js:
--------------------------------------------------------------------------------
1 | import MdNotifications from './index'
2 |
3 | const NotificationStore = {
4 | state: [],
5 | removeNotification(index) {
6 | this.state.splice(index, 1)
7 | },
8 | notify(notification) {
9 | this.state.push(notification)
10 | }
11 | }
12 |
13 | export default {
14 | install(Vue) {
15 | Object.defineProperty(Vue.prototype, '$notifications', {
16 | get() {
17 | return NotificationStore
18 | }
19 | })
20 | Vue.component('MdNotifications', MdNotifications)
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/src/core/components/mdStatsWidget/index.vue:
--------------------------------------------------------------------------------
1 |
2 | .card.card-stats
3 | .card-header(:data-background-color='backgroundColor')
4 | i.material-icons(v-if='!!icon') {{icon}}
5 | i.fa(v-if="!!faIcon", :class='faIcon')
6 | .card-content
7 | p.category {{title}}
8 | h3.title
9 | slot(name='content')
10 | .card-footer
11 | .stats
12 | slot(name='footer')
13 |
14 |
25 |
26 |
--------------------------------------------------------------------------------
/src/core/components/mdTab/constants.js:
--------------------------------------------------------------------------------
1 |
2 | export const EVENT_ON_TAB_CLICK = 'onTabClick'
3 |
--------------------------------------------------------------------------------
/src/core/components/mdTab/index.vue:
--------------------------------------------------------------------------------
1 |
2 | .md-tab
3 | nav-tabs(v-if='!hasTabSlot', :tabs='tabs', @onTabClick='onTabClick')
4 | slot(name='tab')
5 | .tab-content
6 | slot(v-if='!hasTabContent')
7 | slot(name='content')
8 |
9 |
10 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/src/core/components/mdTab/nav-tab.vue:
--------------------------------------------------------------------------------
1 |
2 | li(role='presentation', :class='{ active : active }')
3 | a(href='#', @click.stop.prevent='onTabClick(id)', :aria-controls='id', role='tab', data-toogle='tab')
4 | i.material-icons(v-if='!!icon') {{icon}}
5 | | {{name}}
6 | .ripple-container
7 |
8 |
9 |
36 |
37 |
--------------------------------------------------------------------------------
/src/core/components/mdTab/nav-tabs.vue:
--------------------------------------------------------------------------------
1 |
2 | ul.md-nav-tabs.nav.nav-tabs(role='tablist')
3 | nav-tab(v-if='!hasDefaultSlot', v-for='t in tabs', :key='t.id', :id='t.id', :name='t.name', :active='t.active', :icon='t.icon', @onTabClick='onTabClick')
4 | slot
5 |
6 |
7 |
45 |
46 |
47 |
--------------------------------------------------------------------------------
/src/core/components/mdTab/tab-content.vue:
--------------------------------------------------------------------------------
1 |
2 | .md-tab-content.tab-pane(:class='{ active : tab.active}', :id='tab.id', :ref='tab.id')
3 | slot
4 |
5 |
6 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/src/core/components/mdTable/index.vue:
--------------------------------------------------------------------------------
1 |
2 | table.table(:class='tableClass')
3 | thead
4 | tr
5 | th(v-for='c in columns', :key='c') {{c}}
6 | tbody
7 | tr(v-for='item in data', :key='item')
8 | td(v-for='c in columns', :key='c', v-if='hasValue(item, c)') {{itemValue(item, c)}}
9 |
10 |
11 |
38 |
39 |
--------------------------------------------------------------------------------
/src/main.js:
--------------------------------------------------------------------------------
1 | // The Vue build version to load with the `import` command
2 | // (runtime-only or standalone) has been set in webpack.base.conf with an alias.
3 | import Vue from 'vue'
4 | import App from './App'
5 | import router from './router'
6 |
7 | // Libraries
8 | import 'bootstrap/dist/css/bootstrap.css'
9 | import './assets/sass/material-dashboard.scss'
10 | import 'es6-promise/auto'
11 | import Chartist from 'chartist'
12 | import CoreComponents from '@/core/components'
13 | import NotificationPlugin from '@/core/components/mdNotifications/install'
14 | import vClickOutside from 'v-click-outside'
15 |
16 | Vue.config.productionTip = false
17 |
18 | // global library setup
19 | Object.defineProperty(Vue.prototype, '$Chartist', {
20 | get() {
21 | return this.$root.Chartist
22 | }
23 | })
24 |
25 | // Use Core Components
26 | Vue.use(CoreComponents)
27 | Vue.use(NotificationPlugin)
28 | Vue.use(vClickOutside)
29 |
30 | /* eslint-disable no-new */
31 | new Vue({
32 | el: '#app',
33 | router,
34 | template: ' ',
35 | components: { App },
36 | data: {
37 | Chartist
38 | }
39 | })
40 |
--------------------------------------------------------------------------------
/src/router/index.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import Router from 'vue-router'
3 | import Dashboard from '@/components/Dashboard'
4 | import UserProfile from '@/components/UserProfile'
5 | import TableList from '@/components/TableList'
6 | import Typography from '@/components/Typography'
7 | import Icons from '@/components/Icons'
8 | import Maps from '@/components/Maps'
9 | import Notifications from '@/components/Notifications'
10 |
11 | // GeneralViews
12 | import NotFound from '@/components/GeneralViews/NotFound.vue'
13 |
14 | Vue.use(Router)
15 |
16 | export default new Router({
17 | routes: [
18 | {
19 | path: '/',
20 | name: 'Dashboard',
21 | component: Dashboard
22 | },
23 | {
24 | path: '/person',
25 | name: 'Person',
26 | component: UserProfile
27 | },
28 | {
29 | path: '/table',
30 | name: 'TableList',
31 | component: TableList
32 | },
33 | {
34 | path: '/typography',
35 | name: 'Typography',
36 | component: Typography
37 | },
38 | {
39 | path: '/icons',
40 | name: 'Icons',
41 | component: Icons
42 | },
43 | {
44 | path: '/maps',
45 | name: 'Maps',
46 | component: Maps
47 | },
48 | {
49 | path: '/notifications',
50 | name: 'Notifications',
51 | component: Notifications
52 | },
53 | { path: '*', component: NotFound }
54 | ],
55 | linkActiveClass: 'active'
56 | })
57 |
--------------------------------------------------------------------------------
/static/CNAME:
--------------------------------------------------------------------------------
1 | vue-material-dashboard.ltv.vn
2 |
--------------------------------------------------------------------------------
/static/js/material.min.js:
--------------------------------------------------------------------------------
1 | !function(t){function o(t){return"undefined"==typeof t.which?!0:"number"==typeof t.which&&t.which>0?!t.ctrlKey&&!t.metaKey&&!t.altKey&&8!=t.which&&9!=t.which&&13!=t.which&&16!=t.which&&17!=t.which&&20!=t.which&&27!=t.which:!1}function i(o){var i=t(o);i.prop("disabled")||i.closest(".form-group").addClass("is-focused")}function n(o){o.closest("label").hover(function(){var o=t(this).find("input");o.prop("disabled")||i(o)},function(){e(t(this).find("input"))})}function e(o){t(o).closest(".form-group").removeClass("is-focused")}t.expr[":"].notmdproc=function(o){return t(o).data("mdproc")?!1:!0},t.material={options:{validate:!0,input:!0,ripples:!0,checkbox:!0,togglebutton:!0,radio:!0,arrive:!0,autofill:!1,withRipples:[".btn:not(.btn-link)",".card-image",".navbar a:not(.withoutripple)",".footer a:not(.withoutripple)",".dropdown-menu a",".nav-tabs a:not(.withoutripple)",".withripple",".pagination li:not(.active):not(.disabled) a:not(.withoutripple)"].join(","),inputElements:"input.form-control, textarea.form-control, select.form-control",checkboxElements:".checkbox > label > input[type=checkbox]",togglebuttonElements:".togglebutton > label > input[type=checkbox]",radioElements:".radio > label > input[type=radio]"},checkbox:function(o){var i=t(o?o:this.options.checkboxElements).filter(":notmdproc").data("mdproc",!0).after(" ");n(i)},togglebutton:function(o){var i=t(o?o:this.options.togglebuttonElements).filter(":notmdproc").data("mdproc",!0).after(" ");n(i)},radio:function(o){var i=t(o?o:this.options.radioElements).filter(":notmdproc").data("mdproc",!0).after(" ");n(i)},input:function(o){t(o?o:this.options.inputElements).filter(":notmdproc").data("mdproc",!0).each(function(){var o=t(this),i=o.closest(".form-group");0===i.length&&(o.wrap("
"),i=o.closest(".form-group")),o.attr("data-hint")&&(o.after(""+o.attr("data-hint")+"
"),o.removeAttr("data-hint"));var n={"input-lg":"form-group-lg","input-sm":"form-group-sm"};if(t.each(n,function(t,n){o.hasClass(t)&&(o.removeClass(t),i.addClass(n))}),o.hasClass("floating-label")){var e=o.attr("placeholder");o.attr("placeholder",null).removeClass("floating-label");var a=o.attr("id"),r="";a&&(r="for='"+a+"'"),i.addClass("label-floating"),o.after(""+e+" ")}(null===o.val()||"undefined"==o.val()||""===o.val())&&i.addClass("is-empty"),i.append(" "),i.find("input[type=file]").length>0&&i.addClass("is-fileinput")})},attachInputEventHandlers:function(){var n=this.options.validate;t(document).on("change",".checkbox input[type=checkbox]",function(){t(this).blur()}).on("keydown paste",".form-control",function(i){o(i)&&t(this).closest(".form-group").removeClass("is-empty")}).on("keyup change",".form-control",function(){var o=t(this),i=o.closest(".form-group"),e="undefined"==typeof o[0].checkValidity||o[0].checkValidity();""===o.val()?i.addClass("is-empty"):i.removeClass("is-empty"),n&&(e?i.removeClass("has-error"):i.addClass("has-error"))}).on("focus",".form-control, .form-group.is-fileinput",function(){i(this)}).on("blur",".form-control, .form-group.is-fileinput",function(){e(this)}).on("change",".form-group input",function(){var o=t(this);if("file"!=o.attr("type")){var i=o.closest(".form-group"),n=o.val();n?i.removeClass("is-empty"):i.addClass("is-empty")}}).on("change",".form-group.is-fileinput input[type='file']",function(){var o=t(this),i=o.closest(".form-group"),n="";t.each(this.files,function(t,o){n+=o.name+", "}),n=n.substring(0,n.length-2),n?i.removeClass("is-empty"):i.addClass("is-empty"),i.find("input.form-control[readonly]").val(n)})},ripples:function(o){t(o?o:this.options.withRipples).ripples()},autofill:function(){var o=setInterval(function(){t("input[type!=checkbox]").each(function(){var o=t(this);o.val()&&o.val()!==o.attr("value")&&o.trigger("change")})},100);setTimeout(function(){clearInterval(o)},1e4)},attachAutofillEventHandlers:function(){var o;t(document).on("focus","input",function(){var i=t(this).parents("form").find("input").not("[type=file]");o=setInterval(function(){i.each(function(){var o=t(this);o.val()!==o.attr("value")&&o.trigger("change")})},100)}).on("blur",".form-group input",function(){clearInterval(o)})},init:function(o){this.options=t.extend({},this.options,o);var i=t(document);t.fn.ripples&&this.options.ripples&&this.ripples(),this.options.input&&(this.input(),this.attachInputEventHandlers()),this.options.checkbox&&this.checkbox(),this.options.togglebutton&&this.togglebutton(),this.options.radio&&this.radio(),this.options.autofill&&(this.autofill(),this.attachAutofillEventHandlers()),document.arrive&&this.options.arrive&&(t.fn.ripples&&this.options.ripples&&i.arrive(this.options.withRipples,function(){t.material.ripples(t(this))}),this.options.input&&i.arrive(this.options.inputElements,function(){t.material.input(t(this))}),this.options.checkbox&&i.arrive(this.options.checkboxElements,function(){t.material.checkbox(t(this))}),this.options.radio&&i.arrive(this.options.radioElements,function(){t.material.radio(t(this))}),this.options.togglebutton&&i.arrive(this.options.togglebuttonElements,function(){t.material.togglebutton(t(this))}))}}}(jQuery),function(t,o,i,n){"use strict";function e(o,i){r=this,this.element=t(o),this.options=t.extend({},s,i),this._defaults=s,this._name=a,this.init()}var a="ripples",r=null,s={};e.prototype.init=function(){var i=this.element;i.on("mousedown touchstart",function(n){if(!r.isTouch()||"mousedown"!==n.type){i.find(".ripple-container").length||i.append('
');var e=i.children(".ripple-container"),a=r.getRelY(e,n),s=r.getRelX(e,n);if(a||s){var l=r.getRipplesColor(i),p=t("
");p.addClass("ripple").css({left:s,top:a,"background-color":l}),e.append(p),function(){return o.getComputedStyle(p[0]).opacity}(),r.rippleOn(i,p),setTimeout(function(){r.rippleEnd(p)},500),i.on("mouseup mouseleave touchend",function(){p.data("mousedown","off"),"off"===p.data("animating")&&r.rippleOut(p)})}}})},e.prototype.getNewSize=function(t,o){return Math.max(t.outerWidth(),t.outerHeight())/o.outerWidth()*2.5},e.prototype.getRelX=function(t,o){var i=t.offset();return r.isTouch()?(o=o.originalEvent,1===o.touches.length?o.touches[0].pageX-i.left:!1):o.pageX-i.left},e.prototype.getRelY=function(t,o){var i=t.offset();return r.isTouch()?(o=o.originalEvent,1===o.touches.length?o.touches[0].pageY-i.top:!1):o.pageY-i.top},e.prototype.getRipplesColor=function(t){var i=t.data("ripple-color")?t.data("ripple-color"):o.getComputedStyle(t[0]).color;return i},e.prototype.hasTransitionSupport=function(){var t=i.body||i.documentElement,o=t.style,e=o.transition!==n||o.WebkitTransition!==n||o.MozTransition!==n||o.MsTransition!==n||o.OTransition!==n;return e},e.prototype.isTouch=function(){return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)},e.prototype.rippleEnd=function(t){t.data("animating","off"),"off"===t.data("mousedown")&&r.rippleOut(t)},e.prototype.rippleOut=function(t){t.off(),r.hasTransitionSupport()?t.addClass("ripple-out"):t.animate({opacity:0},100,function(){t.trigger("transitionend")}),t.on("transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd",function(){t.remove()})},e.prototype.rippleOn=function(t,o){var i=r.getNewSize(t,o);r.hasTransitionSupport()?o.css({"-ms-transform":"scale("+i+")","-moz-transform":"scale("+i+")","-webkit-transform":"scale("+i+")",transform:"scale("+i+")"}).addClass("ripple-on").data("animating","on").data("mousedown","on"):o.animate({width:2*Math.max(t.outerWidth(),t.outerHeight()),height:2*Math.max(t.outerWidth(),t.outerHeight()),"margin-left":-1*Math.max(t.outerWidth(),t.outerHeight()),"margin-top":-1*Math.max(t.outerWidth(),t.outerHeight()),opacity:.2},500,function(){o.trigger("transitionend")})},t.fn.ripples=function(o){return this.each(function(){t.data(this,"plugin_"+a)||t.data(this,"plugin_"+a,new e(this,o))})}}(jQuery,window,document);
2 |
--------------------------------------------------------------------------------
/static/vue-material-dashboard-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lucwj/vue-material-dashboard/c655b1ec14734a5f708b2099ed3e94ef991dfb78/static/vue-material-dashboard-1.png
--------------------------------------------------------------------------------
/test/e2e/custom-assertions/elementCount.js:
--------------------------------------------------------------------------------
1 | // A custom Nightwatch assertion.
2 | // the name of the method is the filename.
3 | // can be used in tests like this:
4 | //
5 | // browser.assert.elementCount(selector, count)
6 | //
7 | // for how to write custom assertions see
8 | // http://nightwatchjs.org/guide#writing-custom-assertions
9 | exports.assertion = function (selector, count) {
10 | this.message = 'Testing if element <' + selector + '> has count: ' + count
11 | this.expected = count
12 | this.pass = function (val) {
13 | return val === this.expected
14 | }
15 | this.value = function (res) {
16 | return res.value
17 | }
18 | this.command = function (cb) {
19 | var self = this
20 | return this.api.execute(function (selector) {
21 | return document.querySelectorAll(selector).length
22 | }, [selector], function (res) {
23 | cb.call(self, res)
24 | })
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/test/e2e/nightwatch.conf.js:
--------------------------------------------------------------------------------
1 | require('babel-register')
2 | var config = require('../../config')
3 |
4 | // http://nightwatchjs.org/gettingstarted#settings-file
5 | module.exports = {
6 | src_folders: ['test/e2e/specs'],
7 | output_folder: 'test/e2e/reports',
8 | custom_assertions_path: ['test/e2e/custom-assertions'],
9 |
10 | selenium: {
11 | start_process: true,
12 | server_path: require('selenium-server').path,
13 | host: '127.0.0.1',
14 | port: 4444,
15 | cli_args: {
16 | 'webdriver.chrome.driver': require('chromedriver').path
17 | }
18 | },
19 |
20 | test_settings: {
21 | default: {
22 | selenium_port: 4444,
23 | selenium_host: 'localhost',
24 | silent: true,
25 | globals: {
26 | devServerURL: 'http://localhost:' + (process.env.PORT || config.dev.port)
27 | }
28 | },
29 |
30 | chrome: {
31 | desiredCapabilities: {
32 | browserName: 'chrome',
33 | javascriptEnabled: true,
34 | acceptSslCerts: true
35 | }
36 | },
37 |
38 | firefox: {
39 | desiredCapabilities: {
40 | browserName: 'firefox',
41 | javascriptEnabled: true,
42 | acceptSslCerts: true
43 | }
44 | }
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/test/e2e/runner.js:
--------------------------------------------------------------------------------
1 | // 1. start the dev server using production config
2 | process.env.NODE_ENV = 'testing'
3 | var server = require('../../build/dev-server.js')
4 |
5 | server.ready.then(() => {
6 | // 2. run the nightwatch test suite against it
7 | // to run in additional browsers:
8 | // 1. add an entry in test/e2e/nightwatch.conf.json under "test_settings"
9 | // 2. add it to the --env flag below
10 | // or override the environment flag, for example: `npm run e2e -- --env chrome,firefox`
11 | // For more information on Nightwatch's config file, see
12 | // http://nightwatchjs.org/guide#settings-file
13 | var opts = process.argv.slice(2)
14 | if (opts.indexOf('--config') === -1) {
15 | opts = opts.concat(['--config', 'test/e2e/nightwatch.conf.js'])
16 | }
17 | if (opts.indexOf('--env') === -1) {
18 | opts = opts.concat(['--env', 'chrome'])
19 | }
20 |
21 | var spawn = require('cross-spawn')
22 | var runner = spawn('./node_modules/.bin/nightwatch', opts, { stdio: 'inherit' })
23 |
24 | runner.on('exit', function (code) {
25 | server.close()
26 | process.exit(code)
27 | })
28 |
29 | runner.on('error', function (err) {
30 | server.close()
31 | throw err
32 | })
33 | })
34 |
--------------------------------------------------------------------------------
/test/e2e/specs/test.js:
--------------------------------------------------------------------------------
1 | // For authoring Nightwatch tests, see
2 | // http://nightwatchjs.org/guide#usage
3 |
4 | module.exports = {
5 | 'default e2e tests': function (browser) {
6 | // automatically uses dev Server port from /config.index.js
7 | // default: http://localhost:8080
8 | // see nightwatch.conf.js
9 | const devServer = browser.globals.devServerURL
10 |
11 | browser
12 | .url(devServer)
13 | .waitForElementVisible('.wrapper', 5000)
14 | .assert.elementPresent('.logo')
15 | .assert.containsText('a', 'CREATIVE TIM')
16 | .end()
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/test/unit/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "env": {
3 | "mocha": true
4 | },
5 | "globals": {
6 | "expect": true,
7 | "sinon": true
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/test/unit/helpers/mount.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import router from '@/router'
3 |
4 | window.mount = (Component, propsData) => {
5 | const Ctor = Vue.extend(Component)
6 | const vm = new Ctor({ router, propsData: propsData }).$mount()
7 | return vm
8 | }
9 |
--------------------------------------------------------------------------------
/test/unit/index.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 |
3 | /* eslint-disable no-extend-native */
4 | Function.prototype.bind = require('function-bind')
5 | Vue.config.productionTip = false
6 |
7 | const helpersContext = require.context('./helpers', true, /\.js$/)
8 | helpersContext.keys().forEach(helpersContext)
9 |
10 | // require all test files (files that ends with .spec.js)
11 | const testsContext = require.context('./specs', true, /\.spec$/)
12 | testsContext.keys().forEach(testsContext)
13 |
14 | // require all src files except main.js for coverage.
15 | // you can also change this to match only the subset of files that
16 | // you want coverage for.
17 | // const srcContext = require.context('../../src', true, /^\.\/(?!main(\.js)?$)/)
18 | const srcContext = require.context('../../src', true, /^\.\/(?!main\.js$).+\.(js|vue)$/i)
19 | srcContext.keys().forEach(srcContext)
20 |
--------------------------------------------------------------------------------
/test/unit/karma.conf.js:
--------------------------------------------------------------------------------
1 | // This is a karma config file. For more details see
2 | // http://karma-runner.github.io/0.13/config/configuration-file.html
3 | // we are also using it with karma-webpack
4 | // https://github.com/webpack/karma-webpack
5 |
6 | var webpackConfig = require('../../build/webpack.test.conf')
7 |
8 | module.exports = function (config) {
9 | config.set({
10 | // to run in additional browsers:
11 | // 1. install corresponding karma launcher
12 | // http://karma-runner.github.io/0.13/config/browsers.html
13 | // 2. add it to the `browsers` array below.
14 | browsers: ['PhantomJS'],
15 | frameworks: ['mocha', 'sinon-chai', 'phantomjs-shim'],
16 | reporters: ['spec', 'coverage'],
17 | files: ['./index.js'],
18 | preprocessors: {
19 | './index.js': ['webpack', 'sourcemap']
20 | },
21 | webpack: webpackConfig,
22 | webpackMiddleware: {
23 | noInfo: true
24 | },
25 | coverageReporter: {
26 | dir: './coverage',
27 | reporters: [
28 | { type: 'lcov', subdir: '.' },
29 | { type: 'text-summary' }
30 | ]
31 | }
32 | })
33 | }
34 |
--------------------------------------------------------------------------------
/test/unit/specs/Dashboard.spec.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import Dashboard from '@/components/Dashboard'
3 | import Chartist from 'chartist'
4 | import CoreComponents from '@/core/components'
5 |
6 | Vue.use(CoreComponents)
7 |
8 | function getRenderedComponent(Component, propsData) {
9 | Vue.mixin({
10 | beforeCreate() {
11 | this._Chartist = Chartist
12 | }
13 | })
14 |
15 | Object.defineProperty(Vue.prototype, '$Chartist', {
16 | get() { return this.$root._Chartist }
17 | })
18 |
19 | return mount(Component, propsData) // eslint-disable-line
20 | }
21 |
22 | describe('Dashboard.vue', () => {
23 | it('should contains 4 stats cards and 3 chart cards', () => {
24 | const vm = getRenderedComponent(Dashboard)
25 | const statsCards = vm.$children.filter((child) => child.$options.name === 'md-stats-widget').length
26 | const chartCards = vm.$children.filter((child) => child.$options.name === 'md-chart-widget').length
27 | expect(statsCards).to.equal(4)
28 | expect(chartCards).to.equal(3)
29 | })
30 | })
31 |
--------------------------------------------------------------------------------