├── .dockerignore ├── .env ├── .github └── FUNDING.yml ├── .gitignore ├── Dockerfile ├── LICENSE.md ├── Procfile ├── README.md ├── app ├── __init__.py ├── base │ ├── __init__.py │ ├── forms.py │ ├── models.py │ ├── routes.py │ ├── static │ │ └── assets │ │ │ ├── css │ │ │ ├── material-dashboard.css │ │ │ └── material-dashboard.min.css │ │ │ ├── demo │ │ │ ├── demo.css │ │ │ └── demo.js │ │ │ ├── img │ │ │ ├── apple-icon.png │ │ │ ├── cover.jpg │ │ │ ├── faces │ │ │ │ ├── avatar.jpg │ │ │ │ ├── card-profile1-square.jpg │ │ │ │ ├── card-profile2-square.jpg │ │ │ │ └── marc.jpg │ │ │ ├── favicon.png │ │ │ ├── mask.png │ │ │ ├── mdb.gif │ │ │ ├── new_logo.png │ │ │ ├── sidebar-1.jpg │ │ │ ├── sidebar-2.jpg │ │ │ ├── sidebar-3.jpg │ │ │ └── sidebar-4.jpg │ │ │ ├── js │ │ │ ├── core │ │ │ │ ├── bootstrap-material-design.min.js │ │ │ │ ├── jquery.min.js │ │ │ │ └── popper.min.js │ │ │ ├── material-dashboard.js │ │ │ ├── material-dashboard.js.map │ │ │ ├── material-dashboard.min.js │ │ │ └── plugins │ │ │ │ ├── bootstrap-notify.js │ │ │ │ ├── chartist.min.js │ │ │ │ └── perfect-scrollbar.jquery.min.js │ │ │ └── scss │ │ │ ├── material-dashboard.scss │ │ │ └── material-dashboard │ │ │ ├── _alerts.scss │ │ │ ├── _buttons.scss │ │ │ ├── _cards.scss │ │ │ ├── _checkboxes.scss │ │ │ ├── _core-bootstrap.scss │ │ │ ├── _dark-edition.scss │ │ │ ├── _dropdown.scss │ │ │ ├── _example-pages.scss │ │ │ ├── _fixed-plugin.scss │ │ │ ├── _footers.scss │ │ │ ├── _forms.scss │ │ │ ├── _headers.scss │ │ │ ├── _images.scss │ │ │ ├── _info-areas.scss │ │ │ ├── _input-group.scss │ │ │ ├── _misc.scss │ │ │ ├── _mixins.scss │ │ │ ├── _navbar.scss │ │ │ ├── _popover.scss │ │ │ ├── _popups.scss │ │ │ ├── _radios.scss │ │ │ ├── _responsive.scss │ │ │ ├── _ripples.scss │ │ │ ├── _sidebar-and-main-panel.scss │ │ │ ├── _social-buttons.scss │ │ │ ├── _tables.scss │ │ │ ├── _tabs.scss │ │ │ ├── _togglebutton.scss │ │ │ ├── _tooltip.scss │ │ │ ├── _type.scss │ │ │ ├── _variables.scss │ │ │ ├── bootstrap │ │ │ └── scss │ │ │ │ ├── _alert.scss │ │ │ │ ├── _badge.scss │ │ │ │ ├── _breadcrumb.scss │ │ │ │ ├── _button-group.scss │ │ │ │ ├── _buttons.scss │ │ │ │ ├── _card.scss │ │ │ │ ├── _carousel.scss │ │ │ │ ├── _close.scss │ │ │ │ ├── _code.scss │ │ │ │ ├── _custom-forms.scss │ │ │ │ ├── _dropdown.scss │ │ │ │ ├── _forms.scss │ │ │ │ ├── _functions.scss │ │ │ │ ├── _grid.scss │ │ │ │ ├── _images.scss │ │ │ │ ├── _input-group.scss │ │ │ │ ├── _jumbotron.scss │ │ │ │ ├── _list-group.scss │ │ │ │ ├── _media.scss │ │ │ │ ├── _mixins.scss │ │ │ │ ├── _modal.scss │ │ │ │ ├── _nav.scss │ │ │ │ ├── _navbar.scss │ │ │ │ ├── _pagination.scss │ │ │ │ ├── _popover.scss │ │ │ │ ├── _print.scss │ │ │ │ ├── _progress.scss │ │ │ │ ├── _reboot.scss │ │ │ │ ├── _root.scss │ │ │ │ ├── _tables.scss │ │ │ │ ├── _tooltip.scss │ │ │ │ ├── _transitions.scss │ │ │ │ ├── _type.scss │ │ │ │ ├── _utilities.scss │ │ │ │ ├── _variables.scss │ │ │ │ ├── bootstrap-grid.scss │ │ │ │ ├── bootstrap-reboot.scss │ │ │ │ ├── bootstrap.scss │ │ │ │ ├── mixins │ │ │ │ ├── _alert.scss │ │ │ │ ├── _background-variant.scss │ │ │ │ ├── _badge.scss │ │ │ │ ├── _border-radius.scss │ │ │ │ ├── _box-shadow.scss │ │ │ │ ├── _breakpoints.scss │ │ │ │ ├── _buttons.scss │ │ │ │ ├── _caret.scss │ │ │ │ ├── _clearfix.scss │ │ │ │ ├── _float.scss │ │ │ │ ├── _forms.scss │ │ │ │ ├── _gradients.scss │ │ │ │ ├── _grid-framework.scss │ │ │ │ ├── _grid.scss │ │ │ │ ├── _hover.scss │ │ │ │ ├── _image.scss │ │ │ │ ├── _list-group.scss │ │ │ │ ├── _lists.scss │ │ │ │ ├── _nav-divider.scss │ │ │ │ ├── _navbar-align.scss │ │ │ │ ├── _pagination.scss │ │ │ │ ├── _reset-text.scss │ │ │ │ ├── _resize.scss │ │ │ │ ├── _screen-reader.scss │ │ │ │ ├── _size.scss │ │ │ │ ├── _table-row.scss │ │ │ │ ├── _text-emphasis.scss │ │ │ │ ├── _text-hide.scss │ │ │ │ ├── _text-truncate.scss │ │ │ │ ├── _transition.scss │ │ │ │ └── _visibility.scss │ │ │ │ └── utilities │ │ │ │ ├── _align.scss │ │ │ │ ├── _background.scss │ │ │ │ ├── _borders.scss │ │ │ │ ├── _clearfix.scss │ │ │ │ ├── _display.scss │ │ │ │ ├── _embed.scss │ │ │ │ ├── _flex.scss │ │ │ │ ├── _float.scss │ │ │ │ ├── _position.scss │ │ │ │ ├── _screenreaders.scss │ │ │ │ ├── _sizing.scss │ │ │ │ ├── _spacing.scss │ │ │ │ ├── _text.scss │ │ │ │ └── _visibility.scss │ │ │ ├── cards │ │ │ ├── _card-plain.scss │ │ │ ├── _card-profile.scss │ │ │ └── _card-stats.scss │ │ │ ├── dark-edition │ │ │ ├── _dark-alert.scss │ │ │ ├── _dark-buttons.scss │ │ │ ├── _dark-card-chart.scss │ │ │ ├── _dark-card-plain.scss │ │ │ ├── _dark-card-stats.scss │ │ │ ├── _dark-card.scss │ │ │ ├── _dark-checkboxes.scss │ │ │ ├── _dark-colors.scss │ │ │ ├── _dark-dropdown.scss │ │ │ ├── _dark-fixed-plugin.scss │ │ │ ├── _dark-footer.scss │ │ │ ├── _dark-forms.scss │ │ │ ├── _dark-heartbeat-animation.scss │ │ │ ├── _dark-mixins.scss │ │ │ ├── _dark-navbar.scss │ │ │ ├── _dark-popover-tooltip.scss │ │ │ ├── _dark-radios.scss │ │ │ ├── _dark-sidebar.scss │ │ │ ├── _dark-tables.scss │ │ │ ├── _dark-tabs.scss │ │ │ └── _dark-variables.scss │ │ │ ├── mixins │ │ │ ├── _alert.scss │ │ │ ├── _animations.scss │ │ │ ├── _breakpoints.scss │ │ │ ├── _buttons.scss │ │ │ ├── _chartist.scss │ │ │ ├── _colored-shadows.scss │ │ │ ├── _drawer.scss │ │ │ ├── _forms.scss │ │ │ ├── _hover.scss │ │ │ ├── _layout.scss │ │ │ ├── _navbar-colors.scss │ │ │ ├── _navs.scss │ │ │ ├── _sidebar-color.scss │ │ │ ├── _transparency.scss │ │ │ ├── _type.scss │ │ │ ├── _utilities.scss │ │ │ ├── _variables.scss │ │ │ └── _vendor-prefixes.scss │ │ │ ├── plugins │ │ │ ├── _animate.scss │ │ │ ├── _chartist.scss │ │ │ └── _perfect-scrollbar.scss │ │ │ └── variables │ │ │ ├── _body.scss │ │ │ ├── _bootstrap-material-design-base.scss │ │ │ ├── _bootstrap-material-design.scss │ │ │ ├── _brand.scss │ │ │ ├── _buttons.scss │ │ │ ├── _card.scss │ │ │ ├── _code.scss │ │ │ ├── _colors-map.scss │ │ │ ├── _colors.scss │ │ │ ├── _custom-forms.scss │ │ │ ├── _drawer.scss │ │ │ ├── _dropdown.scss │ │ │ ├── _forms.scss │ │ │ ├── _layout.scss │ │ │ ├── _list-group.scss │ │ │ ├── _menu.scss │ │ │ ├── _modals.scss │ │ │ ├── _nav.scss │ │ │ ├── _pagination.scss │ │ │ ├── _shadow.scss │ │ │ ├── _snackbar.scss │ │ │ ├── _spacing.scss │ │ │ ├── _state.scss │ │ │ ├── _tables.scss │ │ │ ├── _tooltip.scss │ │ │ └── _type.scss │ ├── templates │ │ ├── base-site.html │ │ ├── errors │ │ │ ├── 403.html │ │ │ ├── 404.html │ │ │ └── 500.html │ │ ├── login │ │ │ ├── login.html │ │ │ └── register.html │ │ └── site_template │ │ │ ├── fixed-plugin.html │ │ │ ├── footer.html │ │ │ ├── navigation.html │ │ │ ├── scripts-sidebar.html │ │ │ ├── scripts.html │ │ │ └── sidebar.html │ └── util.py └── home │ ├── __init__.py │ ├── routes.py │ └── templates │ ├── index.html │ ├── page-404.html │ ├── page-500.html │ ├── page-map.html │ ├── page-user.html │ ├── ui-icons.html │ ├── ui-notifications.html │ ├── ui-tables.html │ └── ui-typography.html ├── config.py ├── docker-compose.yml ├── gunicorn-cfg.py ├── nginx └── appseed-app.conf ├── package.json ├── requirements-pgsql.txt ├── requirements.txt ├── requirements_dev.txt ├── run.py ├── runtime.txt └── setup.cfg /.dockerignore: -------------------------------------------------------------------------------- 1 | .git 2 | __pycache__ 3 | *.pyc 4 | *.pyo 5 | *.pyd -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | APPSEED_CONFIG_MODE=Debug 2 | POSTGRES_USER=appseed 3 | POSTGRES_PASSWORD=appseed 4 | POSTGRES_DB=appseed 5 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | custom: ["https://paypal.me/appseed"] 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | 5 | # tests and coverage 6 | *.pytest_cache 7 | .coverage 8 | 9 | # database & logs 10 | *.db 11 | *.log 12 | 13 | # venv 14 | env 15 | venv 16 | 17 | # other 18 | .DS_Store 19 | 20 | # sphinx docs 21 | _build 22 | _static 23 | _templates 24 | 25 | # javascript 26 | package-lock.json -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.6 2 | 3 | ENV FLASK_APP run.py 4 | 5 | COPY run.py gunicorn-cfg.py requirements.txt config.py .env ./ 6 | COPY app app 7 | 8 | RUN pip install -r requirements.txt 9 | 10 | EXPOSE 5005 11 | CMD ["gunicorn", "--config", "gunicorn-cfg.py", "run:app"] 12 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 [AppSeed App Generator](https://appseed.us) 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 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: gunicorn run:app --log-file=- 2 | -------------------------------------------------------------------------------- /app/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | License: MIT 4 | Copyright (c) 2019 - present AppSeed.us 5 | """ 6 | 7 | from flask import Flask, url_for 8 | from flask_login import LoginManager 9 | from flask_sqlalchemy import SQLAlchemy 10 | from importlib import import_module 11 | from logging import basicConfig, DEBUG, getLogger, StreamHandler 12 | from os import path 13 | 14 | db = SQLAlchemy() 15 | login_manager = LoginManager() 16 | 17 | def register_extensions(app): 18 | db.init_app(app) 19 | login_manager.init_app(app) 20 | 21 | def register_blueprints(app): 22 | for module_name in ('base', 'home'): 23 | module = import_module('app.{}.routes'.format(module_name)) 24 | app.register_blueprint(module.blueprint) 25 | 26 | def configure_database(app): 27 | 28 | @app.before_first_request 29 | def initialize_database(): 30 | db.create_all() 31 | 32 | @app.teardown_request 33 | def shutdown_session(exception=None): 34 | db.session.remove() 35 | 36 | def configure_logs(app): 37 | # soft logging 38 | try: 39 | basicConfig(filename='error.log', level=DEBUG) 40 | logger = getLogger() 41 | logger.addHandler(StreamHandler()) 42 | except: 43 | pass 44 | 45 | def apply_themes(app): 46 | """ 47 | Add support for themes. 48 | 49 | If DEFAULT_THEME is set then all calls to 50 | url_for('static', filename='') 51 | will modfify the url to include the theme name 52 | 53 | The theme parameter can be set directly in url_for as well: 54 | ex. url_for('static', filename='', theme='') 55 | 56 | If the file cannot be found in the /static// location then 57 | the url will not be modified and the file is expected to be 58 | in the default /static/ location 59 | """ 60 | @app.context_processor 61 | def override_url_for(): 62 | return dict(url_for=_generate_url_for_theme) 63 | 64 | def _generate_url_for_theme(endpoint, **values): 65 | if endpoint.endswith('static'): 66 | themename = values.get('theme', None) or \ 67 | app.config.get('DEFAULT_THEME', None) 68 | if themename: 69 | theme_file = "{}/{}".format(themename, values.get('filename', '')) 70 | if path.isfile(path.join(app.static_folder, theme_file)): 71 | values['filename'] = theme_file 72 | return url_for(endpoint, **values) 73 | 74 | def create_app(config, selenium=False): 75 | app = Flask(__name__, static_folder='base/static') 76 | app.config.from_object(config) 77 | if selenium: 78 | app.config['LOGIN_DISABLED'] = True 79 | register_extensions(app) 80 | register_blueprints(app) 81 | configure_database(app) 82 | configure_logs(app) 83 | apply_themes(app) 84 | return app 85 | -------------------------------------------------------------------------------- /app/base/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | License: MIT 4 | Copyright (c) 2019 - present AppSeed.us 5 | """ 6 | 7 | from flask import Blueprint 8 | 9 | blueprint = Blueprint( 10 | 'base_blueprint', 11 | __name__, 12 | url_prefix='', 13 | template_folder='templates', 14 | static_folder='static' 15 | ) 16 | -------------------------------------------------------------------------------- /app/base/forms.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | License: MIT 4 | Copyright (c) 2019 - present AppSeed.us 5 | """ 6 | 7 | from flask_wtf import FlaskForm 8 | from wtforms import TextField, PasswordField 9 | from wtforms.validators import InputRequired, Email, DataRequired 10 | 11 | ## login and registration 12 | 13 | class LoginForm(FlaskForm): 14 | username = TextField ('Username', id='username_login' , validators=[DataRequired()]) 15 | password = PasswordField('Password', id='pwd_login' , validators=[DataRequired()]) 16 | 17 | class CreateAccountForm(FlaskForm): 18 | username = TextField('Username' , id='username_create' , validators=[DataRequired()]) 19 | email = TextField('Email' , id='email_create' , validators=[DataRequired(), Email()]) 20 | password = PasswordField('Password' , id='pwd_create' , validators=[DataRequired()]) 21 | -------------------------------------------------------------------------------- /app/base/models.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | License: MIT 4 | Copyright (c) 2019 - present AppSeed.us 5 | """ 6 | 7 | from flask_login import UserMixin 8 | from sqlalchemy import Binary, Column, Integer, String 9 | 10 | from app import db, login_manager 11 | 12 | from app.base.util import hash_pass 13 | 14 | class User(db.Model, UserMixin): 15 | 16 | __tablename__ = 'User' 17 | 18 | id = Column(Integer, primary_key=True) 19 | username = Column(String, unique=True) 20 | email = Column(String, unique=True) 21 | password = Column(Binary) 22 | 23 | def __init__(self, **kwargs): 24 | for property, value in kwargs.items(): 25 | # depending on whether value is an iterable or not, we must 26 | # unpack it's value (when **kwargs is request.form, some values 27 | # will be a 1-element list) 28 | if hasattr(value, '__iter__') and not isinstance(value, str): 29 | # the ,= unpack of a singleton fails PEP8 (travis flake8 test) 30 | value = value[0] 31 | 32 | if property == 'password': 33 | value = hash_pass( value ) # we need bytes here (not plain str) 34 | 35 | setattr(self, property, value) 36 | 37 | def __repr__(self): 38 | return str(self.username) 39 | 40 | 41 | @login_manager.user_loader 42 | def user_loader(id): 43 | return User.query.filter_by(id=id).first() 44 | 45 | @login_manager.request_loader 46 | def request_loader(request): 47 | username = request.form.get('username') 48 | user = User.query.filter_by(username=username).first() 49 | return user if user else None 50 | -------------------------------------------------------------------------------- /app/base/static/assets/demo/demo.css: -------------------------------------------------------------------------------- 1 | .tim-typo { 2 | padding-left: 25%; 3 | margin-bottom: 40px; 4 | position: relative; 5 | width: 100%; 6 | } 7 | 8 | .tim-typo .tim-note { 9 | bottom: 5px; 10 | color: #c0c1c2; 11 | display: block; 12 | font-weight: 400; 13 | font-size: 13px; 14 | line-height: 15px; 15 | left: 0; 16 | margin-left: 20px; 17 | position: absolute; 18 | width: 260px; 19 | } 20 | 21 | /* offline-doc */ 22 | 23 | .offline-doc .navbar.navbar-transparent { 24 | padding-top: 25px; 25 | border-bottom: none; 26 | } 27 | 28 | .offline-doc .navbar.navbar-transparent .navbar-minimize { 29 | display: none; 30 | } 31 | 32 | .offline-doc .navbar.navbar-transparent .navbar-brand, 33 | .offline-doc .navbar.navbar-transparent .collapse .navbar-nav .nav-link { 34 | color: #FFF; 35 | } 36 | 37 | .offline-doc .footer { 38 | z-index: 3 !important; 39 | position: absolute; 40 | width: 100%; 41 | background: transparent; 42 | bottom: 0; 43 | color: #fff; 44 | } 45 | 46 | .offline-doc .page-header .content-center { 47 | z-index: 3; 48 | } 49 | 50 | .offline-doc .brand .title { 51 | color: #fff; 52 | } 53 | 54 | .offline-doc .footer { 55 | z-index: 3 !important; 56 | } 57 | 58 | .offline-doc .page-header .container { 59 | z-index: 3; 60 | } 61 | 62 | .offline-doc .page-header:after { 63 | background-color: rgba(0, 0, 0, 0.5); 64 | content: ""; 65 | display: block; 66 | height: 100%; 67 | left: 0; 68 | position: absolute; 69 | top: 0; 70 | width: 100%; 71 | z-index: 2; 72 | } 73 | 74 | @media all and (max-width: 991px) { 75 | .offline-doc .navbar .navbar-collapse.collapse, 76 | .offline-doc .navbar .navbar-collapse.collapse.in, 77 | .offline-doc .navbar .navbar-collapse.collapsing { 78 | display: block !important; 79 | } 80 | .nav-open .offline-doc .navbar-wrapper, 81 | .nav-open .offline-doc .navbar-toggler { 82 | -webkit-transform: translate3d(-260px, 0, 0); 83 | -moz-transform: translate3d(-260px, 0, 0); 84 | -o-transform: translate3d(-260px, 0, 0); 85 | -ms-transform: translate3d(-260px, 0, 0); 86 | transform: translate3d(-260px, 0, 0); 87 | } 88 | .offline-doc .navbar-wrapper, 89 | .offline-doc .navbar-toggler { 90 | -webkit-transition: all 0.33s cubic-bezier(0.685, 0.0473, 0.346, 1); 91 | -moz-transition: all 0.33s cubic-bezier(0.685, 0.0473, 0.346, 1); 92 | -o-transition: all 0.33s cubic-bezier(0.685, 0.0473, 0.346, 1); 93 | -ms-transition: all 0.33s cubic-bezier(0.685, 0.0473, 0.346, 1); 94 | transition: all 0.33s cubic-bezier(0.685, 0.0473, 0.346, 1); 95 | } 96 | .offline-doc .navbar .collapse .navbar-nav .nav-item .nav-link { 97 | margin-left: 15px; 98 | color: #8b92a9 !important; 99 | } 100 | } 101 | 102 | #map { 103 | z-index: 2; 104 | height: calc(100vh - 70px); 105 | margin-top: 70px; 106 | } 107 | 108 | .bd-docs.dark-edition .bd-example { 109 | background-color: #1a2035; 110 | border: 0; 111 | border-radius: 10px; 112 | border-bottom-left-radius: 0; 113 | border-bottom-right-radius: 0; 114 | } 115 | 116 | .bd-docs.dark-edition { 117 | background-color: #fff; 118 | } -------------------------------------------------------------------------------- /app/base/static/assets/img/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-dashboard-material-dark/a7087d14da01f8af18a3908e0de071b19c0db74a/app/base/static/assets/img/apple-icon.png -------------------------------------------------------------------------------- /app/base/static/assets/img/cover.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-dashboard-material-dark/a7087d14da01f8af18a3908e0de071b19c0db74a/app/base/static/assets/img/cover.jpg -------------------------------------------------------------------------------- /app/base/static/assets/img/faces/avatar.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-dashboard-material-dark/a7087d14da01f8af18a3908e0de071b19c0db74a/app/base/static/assets/img/faces/avatar.jpg -------------------------------------------------------------------------------- /app/base/static/assets/img/faces/card-profile1-square.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-dashboard-material-dark/a7087d14da01f8af18a3908e0de071b19c0db74a/app/base/static/assets/img/faces/card-profile1-square.jpg -------------------------------------------------------------------------------- /app/base/static/assets/img/faces/card-profile2-square.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-dashboard-material-dark/a7087d14da01f8af18a3908e0de071b19c0db74a/app/base/static/assets/img/faces/card-profile2-square.jpg -------------------------------------------------------------------------------- /app/base/static/assets/img/faces/marc.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-dashboard-material-dark/a7087d14da01f8af18a3908e0de071b19c0db74a/app/base/static/assets/img/faces/marc.jpg -------------------------------------------------------------------------------- /app/base/static/assets/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-dashboard-material-dark/a7087d14da01f8af18a3908e0de071b19c0db74a/app/base/static/assets/img/favicon.png -------------------------------------------------------------------------------- /app/base/static/assets/img/mask.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-dashboard-material-dark/a7087d14da01f8af18a3908e0de071b19c0db74a/app/base/static/assets/img/mask.png -------------------------------------------------------------------------------- /app/base/static/assets/img/mdb.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-dashboard-material-dark/a7087d14da01f8af18a3908e0de071b19c0db74a/app/base/static/assets/img/mdb.gif -------------------------------------------------------------------------------- /app/base/static/assets/img/new_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-dashboard-material-dark/a7087d14da01f8af18a3908e0de071b19c0db74a/app/base/static/assets/img/new_logo.png -------------------------------------------------------------------------------- /app/base/static/assets/img/sidebar-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-dashboard-material-dark/a7087d14da01f8af18a3908e0de071b19c0db74a/app/base/static/assets/img/sidebar-1.jpg -------------------------------------------------------------------------------- /app/base/static/assets/img/sidebar-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-dashboard-material-dark/a7087d14da01f8af18a3908e0de071b19c0db74a/app/base/static/assets/img/sidebar-2.jpg -------------------------------------------------------------------------------- /app/base/static/assets/img/sidebar-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-dashboard-material-dark/a7087d14da01f8af18a3908e0de071b19c0db74a/app/base/static/assets/img/sidebar-3.jpg -------------------------------------------------------------------------------- /app/base/static/assets/img/sidebar-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-dashboard-material-dark/a7087d14da01f8af18a3908e0de071b19c0db74a/app/base/static/assets/img/sidebar-4.jpg -------------------------------------------------------------------------------- /app/base/static/assets/scss/material-dashboard.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | 3 | ========================================================= 4 | * Material Dashboard Dark Edition - v2.1.0 5 | ========================================================= 6 | 7 | * Product Page: https://www.creative-tim.com/product/material-dashboard-dark 8 | * Copyright 2018 Creative Tim (http://www.creative-tim.com) 9 | 10 | ========================================================= 11 | 12 | * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 13 | 14 | */ 15 | 16 | @import "material-dashboard/variables"; 17 | @import "material-dashboard/mixins"; 18 | @import "material-dashboard/core-bootstrap"; 19 | 20 | // Core Components 21 | @import "material-dashboard/buttons"; 22 | @import "material-dashboard/checkboxes"; 23 | @import "material-dashboard/radios"; 24 | @import "material-dashboard/forms"; 25 | @import "material-dashboard/input-group"; 26 | @import "material-dashboard/images"; 27 | @import "material-dashboard/navbar"; 28 | @import "material-dashboard/alerts"; 29 | @import "material-dashboard/headers"; 30 | @import "material-dashboard/type"; 31 | @import "material-dashboard/tabs"; 32 | @import "material-dashboard/tooltip"; 33 | @import "material-dashboard/popover"; 34 | @import "material-dashboard/dropdown"; 35 | @import "material-dashboard/togglebutton"; 36 | @import "material-dashboard/ripples"; 37 | @import "material-dashboard/footers"; 38 | @import "material-dashboard/sidebar-and-main-panel"; 39 | @import "material-dashboard/fixed-plugin"; 40 | @import "material-dashboard/tables"; 41 | @import "material-dashboard/misc"; 42 | @import "material-dashboard/social-buttons"; 43 | 44 | @import "material-dashboard/cards"; 45 | @import "material-dashboard/cards/card-stats"; 46 | @import "material-dashboard/cards/card-profile"; 47 | @import "material-dashboard/cards/card-plain"; 48 | 49 | //plugin scss 50 | @import "material-dashboard/plugins/animate"; 51 | @import "material-dashboard/plugins/chartist"; 52 | @import "material-dashboard/plugins/perfect-scrollbar"; 53 | 54 | @import "material-dashboard/responsive"; 55 | 56 | // dark edition 57 | @import "material-dashboard/dark-edition"; 58 | -------------------------------------------------------------------------------- /app/base/static/assets/scss/material-dashboard/_alerts.scss: -------------------------------------------------------------------------------- 1 | .alert { 2 | border: 0; 3 | border-radius: 3px; 4 | position: relative; 5 | padding: 20px 15px; 6 | line-height: 20px; 7 | 8 | b{ 9 | font-weight: $font-weight-bold; 10 | text-transform: uppercase; 11 | font-size: $font-size-small; 12 | } 13 | // SASS conversion note: please mirror any content change in _mixins-shared.scss alert-variations-content 14 | @include alert-variations(unquote(".alert"), unquote(""), $mdb-text-color-light); 15 | 16 | &-info, &-danger, &-warning, &-success, &-rose { 17 | color: $mdb-text-color-light; 18 | } 19 | 20 | &-default { 21 | a, .alert-link { 22 | color: $mdb-text-color-primary; 23 | } 24 | } 25 | 26 | span{ 27 | display: block; 28 | max-width: 89%; 29 | } 30 | 31 | &.alert-danger{ 32 | @include shadow-alert-color($brand-danger); 33 | @include alert-icon-color($brand-danger); 34 | } 35 | &.alert-warning{ 36 | @include shadow-alert-color($brand-warning); 37 | @include alert-icon-color($brand-warning); 38 | } 39 | &.alert-success{ 40 | @include shadow-alert-color($brand-success); 41 | @include alert-icon-color($brand-success); 42 | } 43 | &.alert-info{ 44 | @include shadow-alert-color($brand-info); 45 | @include alert-icon-color($brand-info); 46 | } 47 | &.alert-primary{ 48 | @include shadow-alert-color($brand-primary); 49 | @include alert-icon-color($brand-primary); 50 | } 51 | &.alert-rose{ 52 | @include shadow-alert-color($brand-rose); 53 | @include alert-icon-color($brand-rose); 54 | } 55 | 56 | &.alert-with-icon{ 57 | padding-left: 66px; 58 | 59 | i[data-notify="icon"] { 60 | font-size: 30px; 61 | display: block; 62 | left: 15px; 63 | position: absolute; 64 | top: 50%; 65 | margin-top: -15px; 66 | color: #fff; 67 | } 68 | } 69 | 70 | .close{ 71 | line-height: .5; 72 | i{ 73 | color: $white-color; 74 | font-size: 11px; 75 | } 76 | } 77 | 78 | i[data-notify="icon"]{ 79 | display: none; 80 | } 81 | 82 | .alert-icon{ 83 | display: block; 84 | float: left; 85 | margin-right: $margin-base; 86 | 87 | i{ 88 | margin-top: -7px; 89 | top: 5px; 90 | position: relative; 91 | } 92 | } 93 | 94 | [data-notify="dismiss"]{ 95 | margin-right: 5px; 96 | } 97 | } 98 | 99 | .places-buttons .btn { 100 | margin-bottom: 30px; 101 | } 102 | -------------------------------------------------------------------------------- /app/base/static/assets/scss/material-dashboard/_core-bootstrap.scss: -------------------------------------------------------------------------------- 1 | // FIXME: only necessary because there isn't an underscored file - see https://github.com/twbs/bootstrap/issues/18350 2 | //@import "../bower_components/bootstrap/scss/ 3 | //@import "../../bootstrap/scss/ 4 | 5 | // Core variables and mixins 6 | @import "./bootstrap/scss/functions"; 7 | @import "./bootstrap/scss/variables"; 8 | @import "./bootstrap/scss/mixins"; 9 | 10 | // #853 start - https://github.com/twbs/bootstrap/pull/18976/files 11 | // hack 12 | @mixin pull-left { 13 | float: left !important; 14 | @if $enable-flex { 15 | margin-right: auto; 16 | } 17 | } 18 | @mixin pull-right { 19 | float: right !important; 20 | @if $enable-flex { 21 | margin-left: auto; 22 | } 23 | } 24 | // #853 end - https://github.com/twbs/bootstrap/pull/18976/files 25 | 26 | // Reset and dependencies 27 | @import "./bootstrap/scss/reboot"; 28 | @import "./bootstrap/scss/print"; 29 | 30 | // Core CSS 31 | @import "./bootstrap/scss/reboot"; 32 | @import "./bootstrap/scss/type"; 33 | @import "./bootstrap/scss/images"; 34 | @import "./bootstrap/scss/code"; 35 | @import "./bootstrap/scss/grid"; 36 | @import "./bootstrap/scss/tables"; 37 | @import "./bootstrap/scss/forms"; 38 | @import "./bootstrap/scss/buttons"; 39 | @import "./bootstrap/scss/transitions"; 40 | 41 | // Components 42 | @import "./bootstrap/scss/dropdown"; 43 | @import "./bootstrap/scss/button-group"; 44 | @import "./bootstrap/scss/input-group"; 45 | @import "./bootstrap/scss/custom-forms"; 46 | @import "./bootstrap/scss/nav"; 47 | @import "./bootstrap/scss/navbar"; 48 | @import "./bootstrap/scss/card"; 49 | @import "./bootstrap/scss/breadcrumb"; 50 | @import "./bootstrap/scss/pagination"; 51 | @import "./bootstrap/scss/jumbotron"; 52 | @import "./bootstrap/scss/alert"; 53 | @import "./bootstrap/scss/progress"; 54 | @import "./bootstrap/scss/media"; 55 | @import "./bootstrap/scss/list-group"; 56 | @import "./bootstrap/scss/close"; 57 | @import "./bootstrap/scss/badge"; 58 | 59 | // Components w/ JavaScript 60 | @import "./bootstrap/scss/modal"; 61 | @import "./bootstrap/scss/tooltip"; 62 | @import "./bootstrap/scss/popover"; 63 | @import "./bootstrap/scss/carousel"; 64 | 65 | // Utility classes 66 | @import "./bootstrap/scss/utilities"; 67 | -------------------------------------------------------------------------------- /app/base/static/assets/scss/material-dashboard/_dark-edition.scss: -------------------------------------------------------------------------------- 1 | .dark-edition { 2 | // Variables 3 | @import 'dark-edition/dark-variables'; 4 | 5 | background-color: $dark-background; 6 | 7 | // Mixins 8 | @import 'dark-edition/dark-mixins'; 9 | 10 | // Buttons 11 | @import 'dark-edition/dark-buttons'; 12 | 13 | // Sidebar 14 | @import 'dark-edition/dark-sidebar'; 15 | 16 | // Navbar 17 | @import 'dark-edition/dark-navbar'; 18 | 19 | // Footer 20 | @import 'dark-edition/dark-footer'; 21 | 22 | // Card 23 | @import 'dark-edition/dark-card'; 24 | 25 | // Tables 26 | @import 'dark-edition/dark-tables'; 27 | 28 | // Checkboxes 29 | @import 'dark-edition/dark-checkboxes'; 30 | 31 | // Radios 32 | @import 'dark-edition/dark-radios'; 33 | 34 | // Tabs 35 | @import 'dark-edition/dark-tabs'; 36 | 37 | // Tabs 38 | @import 'dark-edition/dark-popover-tooltip'; 39 | 40 | // Forms 41 | @import 'dark-edition/dark-forms'; 42 | 43 | // Fixed Plugin 44 | @import 'dark-edition/dark-fixed-plugin'; 45 | 46 | // Dropdown 47 | @import 'dark-edition/dark-dropdown'; 48 | 49 | // Colors 50 | @import 'dark-edition/dark-colors'; 51 | 52 | // Alerts 53 | @import 'dark-edition/dark-alert'; 54 | 55 | // Animation Keyframe 56 | @import 'dark-edition/dark-heartbeat-animation'; 57 | } 58 | -------------------------------------------------------------------------------- /app/base/static/assets/scss/material-dashboard/_example-pages.scss: -------------------------------------------------------------------------------- 1 | .card-signup { 2 | .card-header { 3 | .social-line { 4 | .btn { 5 | color: $white-color; 6 | } 7 | } 8 | } 9 | .text-divider { 10 | margin-top: 30px; 11 | margin-bottom: 0px; 12 | text-align: center; 13 | } 14 | } 15 | 16 | .signup-page { 17 | .page-header { 18 | min-height: 100vh; 19 | height: auto; 20 | display: inherit; 21 | 22 | .container{ 23 | padding-top: 20vh; 24 | } 25 | } 26 | 27 | .card-signup { 28 | border-radius: $border-radius-base * 2; 29 | @include shadow-16dp(); 30 | margin-bottom: 100px; 31 | padding: 40px 0px; 32 | 33 | } 34 | .info-horizontal { 35 | padding: 0px 0px 20px; 36 | } 37 | 38 | .social { 39 | .btn { 40 | margin: 5px; 41 | } 42 | h4 { 43 | margin-top: 20px; 44 | } 45 | } 46 | .footer { 47 | .container { 48 | padding: 0; 49 | } 50 | .copyright, 51 | a{ 52 | color: $white-color; 53 | } 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /app/base/static/assets/scss/material-dashboard/_footers.scss: -------------------------------------------------------------------------------- 1 | .footer{ 2 | padding: $padding-general-x 0; 3 | text-align: center; 4 | display: -webkit-flex; /* Safari */ /* Safari 6.1+ */ 5 | display: flex; 6 | 7 | ul{ 8 | margin-bottom: 0; 9 | padding: 0; 10 | list-style: none; 11 | 12 | li{ 13 | display: inline-block; 14 | 15 | a{ 16 | color: inherit; 17 | padding: $padding-general-x; 18 | font-weight: $font-weight-bold; 19 | font-size: $mdb-btn-font-size-base; 20 | text-transform: uppercase; 21 | border-radius: $border-radius-base; 22 | text-decoration: none; 23 | position: relative; 24 | display: block; 25 | 26 | &:hover{ 27 | text-decoration: none; 28 | } 29 | } 30 | 31 | .btn{ 32 | margin: 0; 33 | } 34 | } 35 | 36 | &.links-horizontal{ 37 | &:first-child a{ 38 | padding-left: 0; 39 | } 40 | 41 | &:last-child a{ 42 | padding-right: 0; 43 | } 44 | } 45 | 46 | &.links-vertical{ 47 | li{ 48 | display: block; 49 | margin-left: -5px; 50 | margin-right: -5px; 51 | 52 | a{ 53 | padding: 5px; 54 | } 55 | } 56 | } 57 | } 58 | 59 | .social-buttons{ 60 | a, 61 | .btn{ 62 | margin-top: 5px; 63 | margin-bottom: 5px; 64 | } 65 | } 66 | 67 | .footer-brand{ 68 | float: left; 69 | height: 50px; 70 | padding: 15px 15px; 71 | font-size: 18px; 72 | line-height: 20px; 73 | margin-left: -15px; 74 | 75 | &:hover, 76 | &:focus{ 77 | color: $black-color; 78 | } 79 | } 80 | .copyright{ 81 | padding: 15px 0; 82 | .material-icons{ 83 | font-size: 18px; 84 | position: relative; 85 | top: 3px; 86 | } 87 | 88 | } 89 | 90 | .pull-center{ 91 | display: inline-block; 92 | float: none; 93 | } 94 | } 95 | 96 | .off-canvas-sidebar { 97 | .footer { 98 | position: absolute; 99 | bottom: 0; 100 | width: 100%; 101 | } 102 | } 103 | 104 | @media screen and (min-width: 768px){ 105 | .footer{ 106 | .copyright { 107 | padding-right: 15px; 108 | } 109 | } 110 | 111 | } 112 | -------------------------------------------------------------------------------- /app/base/static/assets/scss/material-dashboard/_headers.scss: -------------------------------------------------------------------------------- 1 | .page-header{ 2 | min-height: 100vh; 3 | max-height: 1000px; 4 | display: flex !important; 5 | height: 100%; 6 | padding: 0; 7 | color: $white-color; 8 | position: relative; 9 | 10 | .page-header-image{ 11 | position: absolute; 12 | background-size: cover; 13 | background-position: center center; 14 | width: 100%; 15 | height: 100%; 16 | z-index: -1; 17 | } 18 | 19 | .content-center{ 20 | position: absolute; 21 | top: 50%; 22 | left: 50%; 23 | z-index: 2; 24 | -ms-transform: translate(-50%, -50%); 25 | -webkit-transform: translate(-50%, -50%); 26 | transform: translate(-50%, -50%); 27 | text-align: center; 28 | color: #FFFFFF; 29 | padding: 0 15px; 30 | width: 100%; 31 | max-width: 880px; 32 | 33 | } 34 | 35 | footer{ 36 | position: absolute; 37 | bottom: 0; 38 | width: 100%; 39 | } 40 | 41 | .container{ 42 | height: 100%; 43 | z-index: 1; 44 | } 45 | 46 | .category, 47 | .description{ 48 | color: $opacity-8; 49 | } 50 | 51 | &.page-header-small{ 52 | min-height: 60vh; 53 | max-height: 440px; 54 | } 55 | 56 | &.page-header-mini{ 57 | min-height: 40vh; 58 | max-height: 340px; 59 | } 60 | 61 | .title{ 62 | margin-bottom: 15px; 63 | } 64 | .title + h4{ 65 | margin-top: 10px; 66 | } 67 | 68 | &:after, 69 | &:before{ 70 | position: absolute; 71 | z-index: 0; 72 | width: 100%; 73 | height: 100%; 74 | display: block; 75 | left: 0; 76 | top: 0; 77 | content: ""; 78 | } 79 | 80 | &:before{ 81 | background-color: rgba(0,0,0,.3); 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /app/base/static/assets/scss/material-dashboard/_images.scss: -------------------------------------------------------------------------------- 1 | .img-thumbnail{ 2 | border-radius: 16px; 3 | } 4 | .img-raised{ 5 | @include shadow-big-image(); 6 | } 7 | 8 | .rounded{ 9 | border-radius: $border-radius-large !important; 10 | } 11 | -------------------------------------------------------------------------------- /app/base/static/assets/scss/material-dashboard/_info-areas.scss: -------------------------------------------------------------------------------- 1 | .info{ 2 | max-width: 360px; 3 | margin: 0 auto; 4 | padding: 70px 0 30px; 5 | 6 | .icon{ 7 | color: $gray-color; 8 | 9 | > i{ 10 | font-size: 3.85rem; 11 | } 12 | } 13 | .info-title{ 14 | color: $black-color; 15 | margin: 0.875rem * 2 0 0.875rem; 16 | } 17 | p{ 18 | color: $gray-color; 19 | } 20 | } 21 | 22 | .info-horizontal{ 23 | .icon{ 24 | float: left; 25 | margin-top: 24px; 26 | margin-right: 10px; 27 | 28 | >i{ 29 | font-size: $font-size-h2; 30 | } 31 | } 32 | .description{ 33 | overflow: hidden; 34 | } 35 | 36 | } 37 | 38 | .icon { 39 | &.icon-primary { 40 | color: $brand-primary; 41 | } 42 | &.icon-info { 43 | color: $brand-info; 44 | } 45 | &.icon-success { 46 | color: $brand-success; 47 | } 48 | &.icon-warning { 49 | color: $brand-warning; 50 | } 51 | &.icon-danger { 52 | color: $brand-danger; 53 | } 54 | &.icon-rose { 55 | color: $brand-rose; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /app/base/static/assets/scss/material-dashboard/_input-group.scss: -------------------------------------------------------------------------------- 1 | // ----------------------------------------- 2 | // input-group and input-group-addon styles 3 | // note: form-groups are not required 4 | // 5 | @mixin input-group-button-variation($vertical-padding) { 6 | .input-group-btn { 7 | .btn { 8 | //margin: 0 0 $vertical-padding 0; 9 | } 10 | } 11 | } 12 | 13 | // default margin - no form-group required 14 | @include input-group-button-variation(input-padding-y); 15 | 16 | .bmd-form-group-sm { 17 | @include input-group-button-variation($input-padding-y-sm); 18 | } 19 | 20 | .bmd-form-group-lg { 21 | @include input-group-button-variation($input-padding-y-lg); 22 | } 23 | 24 | .input-group { 25 | // may be in or outside of form-group 26 | 27 | .input-group-text { 28 | display: flex; 29 | justify-content: center; 30 | align-items: center; 31 | padding: 0 15px 0 15px; 32 | background-color: transparent; 33 | border-color: transparent; 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /app/base/static/assets/scss/material-dashboard/_misc.scss: -------------------------------------------------------------------------------- 1 | body{ 2 | background-color: #eee; 3 | color: $black-color; 4 | font-weight: 300; 5 | } 6 | 7 | legend { 8 | border-bottom: 0; 9 | } 10 | 11 | .serif-font{ 12 | font-family: $font-family-serif; 13 | } 14 | 15 | // Prevent highlight on mobile 16 | * { 17 | -webkit-tap-highlight-color: rgba(255, 255, 255, 0); 18 | -webkit-tap-highlight-color: transparent; 19 | &:focus { 20 | outline: 0; 21 | } 22 | } 23 | 24 | a{ 25 | color: $link-color; 26 | &:hover, 27 | &:focus{ 28 | color: darken($link-color, 5%); 29 | text-decoration: none; 30 | } 31 | 32 | &.text-info{ 33 | &:hover, &:focus{ 34 | color: darken($brand-info, 5%); 35 | } 36 | } 37 | 38 | & .material-icons { 39 | vertical-align: middle; 40 | } 41 | } 42 | 43 | .form-check, 44 | label{ 45 | font-size: 14px; 46 | line-height: 1.42857; 47 | color: $checkboxes-text-color; 48 | font-weight: 400; 49 | } 50 | 51 | /* Animations */ 52 | .animation-transition-general{ 53 | @include transition-all($general-transition-time, $transition-linear); 54 | } 55 | 56 | .animation-transition-slow{ 57 | @include transition-all($slow-transition-time, $transition-linear); 58 | } 59 | 60 | .animation-transition-fast{ 61 | @include transition-all($fast-transition-time, $transition-ease); 62 | } 63 | 64 | .caret, 65 | .sidebar a, 66 | .animation-transition-fast-in{ 67 | @include transition-all($fast-transition-time, $transition-ease-in); 68 | } 69 | -------------------------------------------------------------------------------- /app/base/static/assets/scss/material-dashboard/_mixins.scss: -------------------------------------------------------------------------------- 1 | @import "mixins/utilities"; 2 | @import "mixins/breakpoints"; 3 | @import "mixins/animations"; 4 | @import "mixins/type"; 5 | @import "mixins/layout"; 6 | @import "mixins/drawer"; 7 | @import "mixins/forms"; 8 | @import "mixins/buttons"; 9 | @import "mixins/hover"; 10 | @import "mixins/navs"; 11 | @import "mixins/colored-shadows"; 12 | @import "mixins/navbar-colors"; 13 | @import "mixins/alert"; 14 | @import "mixins/sidebar-color"; 15 | @import "mixins/variables"; 16 | @import "mixins/vendor-prefixes"; 17 | -------------------------------------------------------------------------------- /app/base/static/assets/scss/material-dashboard/_popover.scss: -------------------------------------------------------------------------------- 1 | .popover, .tooltip-inner { 2 | line-height: 1.5em; 3 | background: $white-color; 4 | border: none; 5 | border-radius: $border-radius-base; 6 | @include shadow-8dp(); 7 | color: $popover-color; 8 | } 9 | 10 | 11 | .popover{ 12 | padding: 0; 13 | @include shadow-16dp(); 14 | 15 | &.left, 16 | &.right, 17 | &.top, 18 | &.bottom{ 19 | > .arrow{ 20 | border: none; 21 | } 22 | } 23 | 24 | 25 | &.bs-popover-top, 26 | &.bs-popover-auto[x-placement^="top"], 27 | &.bs-popover-bottom, 28 | &.bs-popover-auto[x-placement^="bottom"], 29 | &.bs-popover-right, 30 | &.bs-popover-auto[x-placement^="right"], 31 | &.bs-popover-left, 32 | &.bs-popover-auto[x-placement^="left"]{ 33 | & .arrow::before{ 34 | border: 0; 35 | } 36 | } 37 | 38 | } 39 | 40 | .popover-header{ 41 | background-color: $white-color; 42 | border: none; 43 | padding: 15px 15px 5px; 44 | font-size: $font-size-h4; 45 | margin: 0; 46 | color: $popover-color; 47 | } 48 | 49 | .popover-body{ 50 | padding: 10px 15px 15px; 51 | line-height: 1.4; 52 | color: $popover-color; 53 | } 54 | -------------------------------------------------------------------------------- /app/base/static/assets/scss/material-dashboard/_popups.scss: -------------------------------------------------------------------------------- 1 | .popover{ 2 | font-size: $font-size-base; 3 | box-shadow: 0px 10px 50px 0px rgba(0, 0, 0, 0.2); 4 | border: none; 5 | line-height: 1.7; 6 | max-width: 240px; 7 | 8 | &.bs-popover-top .arrow:before, 9 | &.bs-popover-left .arrow:before, 10 | &.bs-popover-right .arrow:before, 11 | &.bs-popover-bottom .arrow:before,{ 12 | border-top-color: transparent; 13 | border-left-color: transparent; 14 | border-right-color: transparent; 15 | border-bottom-color: transparent; 16 | } 17 | 18 | .popover-header{ 19 | color: $default-color-opacity; 20 | font-size: $font-size-base; 21 | text-transform: capitalize; 22 | font-weight: $font-weight-semi; 23 | margin: 0; 24 | margin-top: 5px; 25 | border: none; 26 | background-color: transparent; 27 | } 28 | 29 | &:before{ 30 | display: none; 31 | } 32 | 33 | &.bs-tether-element-attached-top:after{ 34 | border-bottom-color:$white-color; 35 | top: -9px; 36 | } 37 | 38 | &.popover-primary{ 39 | @include popover-color($primary-color, $white-color); 40 | } 41 | 42 | &.popover-info{ 43 | @include popover-color($info-color, $white-color); 44 | } 45 | 46 | &.popover-warning{ 47 | @include popover-color($warning-color, $white-color); 48 | } 49 | 50 | &.popover-danger{ 51 | @include popover-color($danger-color, $white-color); 52 | } 53 | 54 | &.popover-success{ 55 | @include popover-color($success-color, $white-color); 56 | } 57 | } 58 | 59 | 60 | .tooltip{ 61 | &.bs-tooltip-right .arrow:before{ 62 | border-right-color:$white-color; 63 | } 64 | 65 | &.bs-tooltip-top .arrow:before{ 66 | border-top-color:$white-color; 67 | } 68 | 69 | &.bs-tooltip-bottom .arrow:before{ 70 | border-bottom-color:$white-color; 71 | } 72 | 73 | &.bs-tooltip-left .arrow:before{ 74 | border-left-color:$white-color; 75 | } 76 | } 77 | 78 | .tooltip-inner{ 79 | padding: $padding-base-vertical $padding-base-horizontal; 80 | min-width: 130px; 81 | background-color: $white-color; 82 | font-size: $font-size-base; 83 | color: inherit; 84 | box-shadow: 0px 5px 25px 0px rgba(0, 0, 0, 0.2); 85 | } 86 | -------------------------------------------------------------------------------- /app/base/static/assets/scss/material-dashboard/_ripples.scss: -------------------------------------------------------------------------------- 1 | // marker class (used as a selector for one-off elements to decorate) 2 | .ripple { 3 | position: relative; 4 | } 5 | 6 | .ripple-container { 7 | position: absolute; 8 | top: 0; 9 | left: 0; 10 | z-index: 1; 11 | width: 100%; 12 | height: 100%; 13 | overflow: hidden; 14 | pointer-events: none; 15 | border-radius: inherit; 16 | 17 | .ripple-decorator { 18 | position: absolute; 19 | width: 20px; 20 | height: 20px; 21 | margin-top: -10px; 22 | margin-left: -10px; 23 | pointer-events: none; 24 | background-color: rgba($black, 0.05); 25 | border-radius: 100%; 26 | opacity: 0; 27 | transform: scale(1); 28 | transform-origin: 50%; 29 | 30 | &.ripple-on { 31 | opacity: 0.1; 32 | transition: opacity 0.15s ease-in 0s, 33 | transform 0.5s cubic-bezier(0.4, 0, 0.2, 1) 0.1s; 34 | } 35 | 36 | &.ripple-out { 37 | opacity: 0; 38 | transition: opacity 0.1s linear 0s !important; 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /app/base/static/assets/scss/material-dashboard/_social-buttons.scss: -------------------------------------------------------------------------------- 1 | // style for the social buttons from fixed product_plugins (Twitter and Facebook) 2 | 3 | .btn{ 4 | // Social colors 5 | @include bmd-social-buttons(); 6 | } 7 | -------------------------------------------------------------------------------- /app/base/static/assets/scss/material-dashboard/_tabs.scss: -------------------------------------------------------------------------------- 1 | 2 | .nav-tabs { 3 | border: 0; 4 | border-radius: $border-radius-base; 5 | padding: 0 15px; 6 | 7 | .nav-item { 8 | .nav-link { 9 | color: $white-color; 10 | border: 0; 11 | margin: 0; 12 | border-radius: $border-radius-base; 13 | line-height: $mdb-btn-font-size-base * 2; 14 | text-transform: uppercase; 15 | font-size: $mdb-btn-font-size-base; 16 | padding: 10px 15px; 17 | background-color: transparent; 18 | transition: 0.3s background-color 0s; 19 | 20 | &:hover { 21 | border: 0; 22 | } 23 | } 24 | .nav-link, 25 | .nav-link:hover, 26 | .nav-link:focus { 27 | border: 0 !important; 28 | color: $white-color !important; 29 | font-weight: $font-weight-bold; 30 | } 31 | &.disabled .nav-link, 32 | &.disabled .nav-link:hover { 33 | color: rgba(255,255,255,0.5); 34 | } 35 | 36 | .material-icons{ 37 | margin: -1px 5px 0 0; 38 | } 39 | 40 | .nav-link.active{ 41 | background-color: rgba(255,255,255, .2); 42 | transition: 0.3s background-color 0.2s; 43 | } 44 | } 45 | } 46 | 47 | 48 | .nav-tabs { 49 | .nav-link { 50 | border-bottom: $bmd-nav-tabs-border-size solid transparent; 51 | } 52 | 53 | // colors 54 | @include bmd-tabs-color($bmd-nav-tabs-color, $bmd-nav-tabs-active-color, $bmd-nav-tabs-active-border-color, $bmd-nav-tabs-disabled-link-color, $bmd-nav-tabs-disabled-link-color-hover); 55 | 56 | &.header-primary { 57 | @include bmd-tabs-color($bmd-nav-tabs-primary-color, $bmd-nav-tabs-primary-active-color, $bmd-nav-tabs-primary-active-border-color, $bmd-nav-tabs-primary-disabled-link-color, $bmd-nav-tabs-primary-disabled-link-color-hover); 58 | } 59 | 60 | &.bg-inverse { 61 | @include bmd-tabs-color($bmd-nav-tabs-inverse-color, $bmd-nav-tabs-inverse-active-color, $bmd-nav-tabs-inverse-active-border-color, $bmd-nav-tabs-inverse-disabled-link-color, $bmd-nav-tabs-inverse-disabled-link-color-hover); 62 | } 63 | } 64 | 65 | 66 | 67 | .card-nav-tabs{ 68 | margin-top: 45px; 69 | 70 | .card-header{ 71 | margin-top: -30px !important; 72 | } 73 | } 74 | 75 | .tab-content .tab-pane .td-actions{ 76 | display: -webkit-box; 77 | display: -ms-flexbox; 78 | display: flex; 79 | } 80 | 81 | .card .tab-content .form-check{ 82 | margin-top: 6px; 83 | } 84 | -------------------------------------------------------------------------------- /app/base/static/assets/scss/material-dashboard/_togglebutton.scss: -------------------------------------------------------------------------------- 1 | .togglebutton { 2 | vertical-align: middle; 3 | &, label, input, .toggle { 4 | user-select: none; 5 | } 6 | label { 7 | cursor: pointer; 8 | color: $mdb-toggle-label-color; 9 | @include mdb-label-color-toggle-focus(); 10 | 11 | // Hide original checkbox 12 | input[type=checkbox] { 13 | opacity: 0; 14 | width: 0; 15 | height: 0; 16 | } 17 | 18 | .toggle { 19 | text-align: left; // Issue #737 horizontal form 20 | margin-left: 5px; 21 | } 22 | // Switch bg off and disabled 23 | .toggle, 24 | input[type=checkbox][disabled] + .toggle { 25 | content: ""; 26 | display: inline-block; 27 | width: 30px; 28 | height: 15px; 29 | background-color: rgba(80, 80, 80, 0.7); 30 | border-radius: 15px; 31 | margin-right: 15px; 32 | transition: background 0.3s ease; 33 | vertical-align: middle; 34 | } 35 | // Handle off 36 | .toggle:after { 37 | content: ""; 38 | display: inline-block; 39 | width: 20px; 40 | height: 20px; 41 | background-color: #FFFFFF; 42 | border-radius: 20px; 43 | position: relative; 44 | box-shadow: 0 1px 3px 1px rgba(0, 0, 0, 0.4); 45 | left: -5px; 46 | top: -2.5px; 47 | border: 1px solid $mdb-checkbox-border-color; 48 | transition: left 0.3s ease, background 0.3s ease, box-shadow 0.1s ease; 49 | } 50 | input[type=checkbox] { 51 | // Handle disabled 52 | &[disabled] { 53 | & + .toggle:after, 54 | &:checked + .toggle:after { 55 | background-color: #BDBDBD; 56 | } 57 | } 58 | 59 | & + .toggle:active:after, 60 | &[disabled] + .toggle:active:after { 61 | box-shadow: 0 1px 3px 1px rgba(0, 0, 0, 0.4), 0 0 0 15px rgba(0, 0, 0, 0.1); 62 | } 63 | 64 | // Ripple off and disabled 65 | &:checked + .toggle:after { 66 | left: 15px; 67 | } 68 | } 69 | 70 | // set bg when checked 71 | input[type=checkbox]:checked { 72 | + .toggle { 73 | background-color: rgba($brand-primary, (70/100)); // Switch bg on 74 | } 75 | 76 | + .toggle:after { 77 | border-color: $brand-primary; // Handle on 78 | } 79 | 80 | + .toggle:active:after { 81 | box-shadow: 0 1px 3px 1px rgba(0, 0, 0, 0.4), 0 0 0 15px rgba($brand-primary, (10/100)); // Ripple on 82 | } 83 | } 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /app/base/static/assets/scss/material-dashboard/_tooltip.scss: -------------------------------------------------------------------------------- 1 | // specs https://material.google.com/components/tooltips.html#tooltips-tooltips-desktop- 2 | 3 | .tooltip-arrow { 4 | display: none; 5 | } 6 | 7 | .tooltip.show{ 8 | opacity: 1; 9 | @include transform-translate-y(0px); 10 | 11 | 12 | } 13 | .tooltip{ 14 | opacity: 0; 15 | transition: opacity, transform .2s ease; 16 | @include transform-translate-y(5px); 17 | font-size: $tooltip-font-size; 18 | 19 | &.bs-tooltip-top, 20 | &.bs-tooltip-auto[x-placement^="top"]{ 21 | & .arrow::before{ 22 | border-top-color: $white-color; 23 | } 24 | } 25 | 26 | &.bs-tooltip-right, 27 | &.bs-tooltip-auto[x-placement^="right"]{ 28 | & .arrow::before{ 29 | border-right-color: $white-color; 30 | } 31 | } 32 | &.bs-tooltip-left, 33 | &.bs-tooltip-auto[x-placement^="left"]{ 34 | & .arrow::before{ 35 | border-left-color: $white-color; 36 | } 37 | } 38 | &.bs-tooltip-bottom, 39 | &.bs-tooltip-auto[x-placement^="bottom"]{ 40 | & .arrow::before{ 41 | border-bottom-color: $white-color; 42 | } 43 | } 44 | } 45 | 46 | .tooltip-inner{ 47 | padding: 10px 15px; 48 | min-width: 130px; 49 | } 50 | -------------------------------------------------------------------------------- /app/base/static/assets/scss/material-dashboard/_type.scss: -------------------------------------------------------------------------------- 1 | html * { 2 | -webkit-font-smoothing: antialiased; 3 | -moz-osx-font-smoothing: grayscale; 4 | } 5 | 6 | body, h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4 { 7 | font-family: $font-family-sans-serif; 8 | font-weight: 300; 9 | line-height: 1.5em; 10 | } 11 | 12 | 13 | h1, .h1 { 14 | font-size: $font-size-h1; 15 | line-height: 1.15em; 16 | } 17 | h2, .h2{ 18 | font-size: $font-size-h2; 19 | } 20 | h3, .h3{ 21 | font-size: $font-size-h3; 22 | line-height: 1.4em; 23 | margin: 20px 0 10px; 24 | } 25 | h4, .h4{ 26 | font-size: $font-size-h4; 27 | line-height: 1.4em; 28 | font-weight: 300; 29 | } 30 | h5, .h5 { 31 | font-size: $font-size-h5; 32 | line-height: 1.4em; 33 | margin-bottom: 15px; 34 | } 35 | h6, .h6{ 36 | font-size: $font-size-h6; 37 | text-transform: uppercase; 38 | font-weight: $font-weight-bold; 39 | } 40 | 41 | .title, 42 | .card-title, 43 | .info-title, 44 | .footer-brand, 45 | .footer-big h5, 46 | .footer-big h4, 47 | .media .media-heading{ 48 | //font-weight: $font-weight-extra-bold; 49 | // font-family: $font-family-serif; 50 | 51 | &, 52 | a{ 53 | color: $black-color; 54 | text-decoration: none; 55 | } 56 | } 57 | 58 | .card-blog .card-title{ 59 | font-weight: $font-weight-extra-bold; 60 | } 61 | 62 | h2.title{ 63 | margin-bottom: $margin-base * 2; 64 | } 65 | 66 | .description, 67 | .card-description, 68 | .footer-big p{ 69 | color: $gray-light; 70 | } 71 | 72 | .text-warning { 73 | color: $brand-warning !important; 74 | } 75 | .text-primary { 76 | color: $brand-primary !important; 77 | } 78 | .text-danger { 79 | color: $brand-danger !important; 80 | } 81 | .text-success { 82 | color: $brand-success !important; 83 | } 84 | .text-info { 85 | color: $brand-info !important; 86 | } 87 | .text-rose{ 88 | color: $brand-rose !important; 89 | } 90 | .text-gray{ 91 | color: $gray-color !important; 92 | } 93 | -------------------------------------------------------------------------------- /app/base/static/assets/scss/material-dashboard/_variables.scss: -------------------------------------------------------------------------------- 1 | @import "variables/colors"; 2 | @import "variables/shadow"; 3 | 4 | @import "variables/bootstrap-material-design-base"; 5 | 6 | // Customized BS variables 7 | @import "variables/custom-forms"; 8 | @import "variables/spacing"; 9 | @import "variables/body"; 10 | @import "variables/brand"; 11 | @import "variables/buttons"; 12 | @import "variables/card"; 13 | @import "variables/code"; 14 | @import "variables/dropdown"; 15 | @import "variables/forms"; 16 | @import "variables/list-group"; 17 | @import "variables/nav"; 18 | @import "variables/pagination"; 19 | @import "variables/state"; 20 | @import "variables/tables"; 21 | @import "variables/tooltip"; 22 | @import "variables/type"; 23 | @import "variables/modals"; 24 | 25 | // import their vars after customization for use below 26 | $enable-flex: true; // fully adopt flexbox layouts 27 | $enable-shadows: true; // enable shadows, set to false to turn off shadows 28 | 29 | // Core Bootstrap Variables 30 | @import "./bootstrap/scss/functions"; 31 | @import "./bootstrap/scss/variables"; 32 | 33 | @import "variables/layout"; 34 | @import "variables/menu"; 35 | @import "variables/drawer"; 36 | @import "variables/snackbar"; 37 | 38 | @import "variables/bootstrap-material-design"; 39 | -------------------------------------------------------------------------------- /app/base/static/assets/scss/material-dashboard/bootstrap/scss/_alert.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Base styles 3 | // 4 | 5 | .alert { 6 | position: relative; 7 | padding: $alert-padding-y $alert-padding-x; 8 | margin-bottom: $alert-margin-bottom; 9 | border: $alert-border-width solid transparent; 10 | @include border-radius($alert-border-radius); 11 | } 12 | 13 | // Headings for larger alerts 14 | .alert-heading { 15 | // Specified to prevent conflicts of changing $headings-color 16 | color: inherit; 17 | } 18 | 19 | // Provide class for links that match alerts 20 | .alert-link { 21 | font-weight: $alert-link-font-weight; 22 | } 23 | 24 | 25 | // Dismissible alerts 26 | // 27 | // Expand the right padding and account for the close button's positioning. 28 | 29 | .alert-dismissible { 30 | padding-right: ($close-font-size + $alert-padding-x * 2); 31 | 32 | // Adjust close link position 33 | .close { 34 | position: absolute; 35 | top: 0; 36 | right: 0; 37 | padding: $alert-padding-y $alert-padding-x; 38 | color: inherit; 39 | } 40 | } 41 | 42 | 43 | // Alternate styles 44 | // 45 | // Generate contextual modifier classes for colorizing the alert. 46 | 47 | @each $color, $value in $theme-colors { 48 | .alert-#{$color} { 49 | @include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), theme-color-level($color, $alert-color-level)); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /app/base/static/assets/scss/material-dashboard/bootstrap/scss/_badge.scss: -------------------------------------------------------------------------------- 1 | // Base class 2 | // 3 | // Requires one of the contextual, color modifier classes for `color` and 4 | // `background-color`. 5 | 6 | .badge { 7 | display: inline-block; 8 | padding: $badge-padding-y $badge-padding-x; 9 | font-size: $badge-font-size; 10 | font-weight: $badge-font-weight; 11 | line-height: 1; 12 | text-align: center; 13 | white-space: nowrap; 14 | vertical-align: baseline; 15 | @include border-radius($badge-border-radius); 16 | 17 | // Empty badges collapse automatically 18 | &:empty { 19 | display: none; 20 | } 21 | } 22 | 23 | // Quick fix for badges in buttons 24 | .btn .badge { 25 | position: relative; 26 | top: -1px; 27 | } 28 | 29 | // Pill badges 30 | // 31 | // Make them extra rounded with a modifier to replace v3's badges. 32 | 33 | .badge-pill { 34 | padding-right: $badge-pill-padding-x; 35 | padding-left: $badge-pill-padding-x; 36 | @include border-radius($badge-pill-border-radius); 37 | } 38 | 39 | // Colors 40 | // 41 | // Contextual variations (linked badges get darker on :hover). 42 | 43 | @each $color, $value in $theme-colors { 44 | .badge-#{$color} { 45 | @include badge-variant($value); 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/base/static/assets/scss/material-dashboard/bootstrap/scss/_breadcrumb.scss: -------------------------------------------------------------------------------- 1 | .breadcrumb { 2 | display: flex; 3 | flex-wrap: wrap; 4 | padding: $breadcrumb-padding-y $breadcrumb-padding-x; 5 | margin-bottom: $breadcrumb-margin-bottom; 6 | list-style: none; 7 | background-color: $breadcrumb-bg; 8 | @include border-radius($border-radius); 9 | } 10 | 11 | .breadcrumb-item { 12 | // The separator between breadcrumbs (by default, a forward-slash: "/") 13 | + .breadcrumb-item::before { 14 | display: inline-block; // Suppress underlining of the separator in modern browsers 15 | padding-right: $breadcrumb-item-padding; 16 | padding-left: $breadcrumb-item-padding; 17 | color: $breadcrumb-divider-color; 18 | content: "#{$breadcrumb-divider}"; 19 | } 20 | 21 | // IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built 22 | // without `