├── apps ├── templates │ ├── .gitkeep │ ├── includes │ │ ├── scripts.html │ │ ├── footer.html │ │ ├── footer-rtl.html │ │ ├── footer-fullscreen.html │ │ ├── navigation-sign-in.html │ │ ├── navigation-sign-up.html │ │ ├── fixed-plugin.html │ │ ├── navigation.html │ │ └── navigation-rtl.html │ ├── layouts │ │ ├── base-fullscreen.html │ │ └── base.html │ ├── home │ │ ├── page-500.html │ │ ├── page-403.html │ │ ├── page-404.html │ │ ├── sign-in.html │ │ └── sign-up.html │ └── accounts │ │ ├── login.html │ │ └── register.html ├── static │ └── assets │ │ ├── .gitkeep │ │ ├── img │ │ ├── marie.jpg │ │ ├── vr-bg.jpg │ │ ├── favicon.png │ │ ├── ivancik.jpg │ │ ├── logo-ct.png │ │ ├── team-1.jpg │ │ ├── team-2.jpg │ │ ├── team-3.jpg │ │ ├── team-4.jpg │ │ ├── apple-icon.png │ │ ├── bruce-mars.jpg │ │ ├── logos │ │ │ ├── visa.png │ │ │ └── mastercard.png │ │ ├── home-decor-1.jpg │ │ ├── home-decor-2.jpg │ │ ├── home-decor-3.jpg │ │ ├── ivana-square.jpg │ │ ├── constructions.jpg │ │ ├── kal-visuals-square.jpg │ │ ├── curved-images │ │ │ ├── curved0.jpg │ │ │ ├── curved1.jpg │ │ │ ├── curved14.jpg │ │ │ ├── curved6.jpg │ │ │ ├── curved8.jpg │ │ │ └── white-curved.jpeg │ │ ├── illustrations │ │ │ └── rocket-white.png │ │ ├── small-logos │ │ │ ├── icon-sun-cloud.png │ │ │ ├── logo-webdev.svg │ │ │ ├── logo-atlassian.svg │ │ │ ├── logo-spotify.svg │ │ │ ├── logo-jira.svg │ │ │ ├── logo-invision.svg │ │ │ ├── logo-xd.svg │ │ │ └── logo-slack.svg │ │ ├── down-arrow.svg │ │ └── down-arrow-dark.svg │ │ ├── fonts │ │ ├── nucleo.eot │ │ ├── nucleo.ttf │ │ ├── nucleo.woff │ │ ├── nucleo.woff2 │ │ ├── nucleo-icons.eot │ │ ├── nucleo-icons.ttf │ │ ├── nucleo-icons.woff │ │ └── nucleo-icons.woff2 │ │ ├── css │ │ ├── tooltips.min.css │ │ ├── tooltips.css │ │ ├── nucleo-svg.min.css │ │ ├── perfect-scrollbar.min.css │ │ ├── nucleo-svg.css │ │ ├── perfect-scrollbar.css │ │ ├── nucleo-icons.min.css │ │ └── nucleo-icons.css │ │ ├── js │ │ ├── navbar-sticky.js │ │ ├── perfect-scrollbar.js │ │ ├── dropdown.js │ │ ├── sidenav-burger.js │ │ ├── navbar-collapse.js │ │ ├── tooltips.js │ │ ├── chart-1.js │ │ ├── soft-ui-dashboard-tailwind.js │ │ ├── chart-2.js │ │ ├── plugins │ │ │ ├── Chart.extension.js │ │ │ └── perfect-scrollbar.min.js │ │ ├── nav-pills.js │ │ └── fixed-plugin.js │ │ └── scss │ │ └── styles.css ├── home │ ├── __init__.py │ └── routes.py ├── authentication │ ├── __init__.py │ ├── forms.py │ ├── util.py │ ├── models.py │ └── routes.py ├── __init__.py └── config.py ├── runtime.txt ├── Procfile ├── .dockerignore ├── CHANGELOG.md ├── postcss.config.js ├── .env ├── gunicorn-cfg.py ├── requirements.txt ├── env.sample ├── nginx └── appseed-app.conf ├── Dockerfile ├── .gitignore ├── docker-compose.yml ├── package.json ├── LICENSE.md ├── run.py └── README.md /apps/templates/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /apps/static/assets/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /runtime.txt: -------------------------------------------------------------------------------- 1 | python-3.8.10 2 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: gunicorn run:app --log-file=- 2 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | .git 2 | __pycache__ 3 | *.pyc 4 | *.pyo 5 | *.pyd -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | ## [1.0.0] 2022-06-24 4 | ### Initial Release 5 | 6 | - UI Kit: Soft Dashboard Tailwind v1.0.2 7 | 8 | -------------------------------------------------------------------------------- /apps/static/assets/img/marie.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/img/marie.jpg -------------------------------------------------------------------------------- /apps/static/assets/img/vr-bg.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/img/vr-bg.jpg -------------------------------------------------------------------------------- /apps/static/assets/img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/img/favicon.png -------------------------------------------------------------------------------- /apps/static/assets/img/ivancik.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/img/ivancik.jpg -------------------------------------------------------------------------------- /apps/static/assets/img/logo-ct.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/img/logo-ct.png -------------------------------------------------------------------------------- /apps/static/assets/img/team-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/img/team-1.jpg -------------------------------------------------------------------------------- /apps/static/assets/img/team-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/img/team-2.jpg -------------------------------------------------------------------------------- /apps/static/assets/img/team-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/img/team-3.jpg -------------------------------------------------------------------------------- /apps/static/assets/img/team-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/img/team-4.jpg -------------------------------------------------------------------------------- /apps/static/assets/fonts/nucleo.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/fonts/nucleo.eot -------------------------------------------------------------------------------- /apps/static/assets/fonts/nucleo.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/fonts/nucleo.ttf -------------------------------------------------------------------------------- /apps/static/assets/fonts/nucleo.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/fonts/nucleo.woff -------------------------------------------------------------------------------- /apps/static/assets/fonts/nucleo.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/fonts/nucleo.woff2 -------------------------------------------------------------------------------- /apps/static/assets/img/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/img/apple-icon.png -------------------------------------------------------------------------------- /apps/static/assets/img/bruce-mars.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/img/bruce-mars.jpg -------------------------------------------------------------------------------- /apps/static/assets/img/logos/visa.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/img/logos/visa.png -------------------------------------------------------------------------------- /apps/static/assets/img/home-decor-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/img/home-decor-1.jpg -------------------------------------------------------------------------------- /apps/static/assets/img/home-decor-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/img/home-decor-2.jpg -------------------------------------------------------------------------------- /apps/static/assets/img/home-decor-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/img/home-decor-3.jpg -------------------------------------------------------------------------------- /apps/static/assets/img/ivana-square.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/img/ivana-square.jpg -------------------------------------------------------------------------------- /apps/static/assets/fonts/nucleo-icons.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/fonts/nucleo-icons.eot -------------------------------------------------------------------------------- /apps/static/assets/fonts/nucleo-icons.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/fonts/nucleo-icons.ttf -------------------------------------------------------------------------------- /apps/static/assets/fonts/nucleo-icons.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/fonts/nucleo-icons.woff -------------------------------------------------------------------------------- /apps/static/assets/img/constructions.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/img/constructions.jpg -------------------------------------------------------------------------------- /apps/static/assets/fonts/nucleo-icons.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/fonts/nucleo-icons.woff2 -------------------------------------------------------------------------------- /apps/static/assets/img/logos/mastercard.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/img/logos/mastercard.png -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: { config: "./tailwindcss-config.js" }, 4 | autoprefixer: {}, 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /apps/static/assets/img/kal-visuals-square.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/img/kal-visuals-square.jpg -------------------------------------------------------------------------------- /apps/static/assets/img/curved-images/curved0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/img/curved-images/curved0.jpg -------------------------------------------------------------------------------- /apps/static/assets/img/curved-images/curved1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/img/curved-images/curved1.jpg -------------------------------------------------------------------------------- /apps/static/assets/img/curved-images/curved14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/img/curved-images/curved14.jpg -------------------------------------------------------------------------------- /apps/static/assets/img/curved-images/curved6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/img/curved-images/curved6.jpg -------------------------------------------------------------------------------- /apps/static/assets/img/curved-images/curved8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/img/curved-images/curved8.jpg -------------------------------------------------------------------------------- /apps/static/assets/img/curved-images/white-curved.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/img/curved-images/white-curved.jpeg -------------------------------------------------------------------------------- /apps/static/assets/img/illustrations/rocket-white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/img/illustrations/rocket-white.png -------------------------------------------------------------------------------- /apps/static/assets/img/small-logos/icon-sun-cloud.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/flask-soft-dashboard-tailwind/HEAD/apps/static/assets/img/small-logos/icon-sun-cloud.png -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | # True for development, False for production 2 | DEBUG=True 3 | 4 | # Flask ENV 5 | FLASK_APP=run.py 6 | FLASK_ENV=development 7 | 8 | # Used for CDN (in production) 9 | # No Slash at the end 10 | ASSETS_ROOT=/static/assets 11 | -------------------------------------------------------------------------------- /apps/home/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | Copyright (c) 2019 - present AppSeed.us 4 | """ 5 | 6 | from flask import Blueprint 7 | 8 | blueprint = Blueprint( 9 | 'home_blueprint', 10 | __name__, 11 | url_prefix='' 12 | ) 13 | -------------------------------------------------------------------------------- /gunicorn-cfg.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | Copyright (c) 2019 - present AppSeed.us 4 | """ 5 | 6 | bind = '0.0.0.0:5005' 7 | workers = 1 8 | accesslog = '-' 9 | loglevel = 'debug' 10 | capture_output = True 11 | enable_stdio_inheritance = True 12 | -------------------------------------------------------------------------------- /apps/authentication/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | Copyright (c) 2019 - present AppSeed.us 4 | """ 5 | 6 | from flask import Blueprint 7 | 8 | blueprint = Blueprint( 9 | 'authentication_blueprint', 10 | __name__, 11 | url_prefix='' 12 | ) 13 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | flask==2.0.2 2 | Werkzeug==2.0.3 3 | jinja2==3.0.2 4 | flask_login==0.5.0 5 | flask_migrate==3.1.0 6 | WTForms==3.0.0 7 | flask_wtf==1.0.0 8 | flask_sqlalchemy==2.5.1 9 | sqlalchemy==1.4.29 10 | email_validator==1.1.3 11 | gunicorn==20.1.0 12 | flask-restx==0.5.1 13 | python-dotenv==0.19.2 14 | Flask-Minify==0.37 15 | -------------------------------------------------------------------------------- /apps/static/assets/css/tooltips.min.css: -------------------------------------------------------------------------------- 1 | [data-target=tooltip][data-popper-placement^=top]>[data-popper-arrow]{bottom:-4px}[data-target=tooltip][data-popper-placement^=bottom]>[data-popper-arrow]{top:-4px}[data-target=tooltip][data-popper-placement^=left]>[data-popper-arrow]{right:0}[data-target=tooltip][data-popper-placement^=right]>[data-popper-arrow]{left:-4px} -------------------------------------------------------------------------------- /env.sample: -------------------------------------------------------------------------------- 1 | # True for development, False for production 2 | DEBUG=True 3 | 4 | # Flask ENV 5 | FLASK_APP=run.py 6 | FLASK_ENV=development 7 | SECRET_KEY=YOUR_SUPER_KEY 8 | 9 | # If DEBUG=False (production mode) 10 | DB_ENGINE=mysql 11 | DB_NAME=appseed_db 12 | DB_HOST=localhost 13 | DB_PORT=3306 14 | DB_USERNAME=appseed_db_usr 15 | DB_PASS= 16 | -------------------------------------------------------------------------------- /nginx/appseed-app.conf: -------------------------------------------------------------------------------- 1 | upstream webapp { 2 | server appseed_app:5005; 3 | } 4 | 5 | server { 6 | listen 5085; 7 | server_name localhost; 8 | 9 | location / { 10 | proxy_pass http://webapp; 11 | proxy_set_header Host $host:$server_port; 12 | proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.9 2 | 3 | # set environment variables 4 | ENV PYTHONDONTWRITEBYTECODE 1 5 | ENV PYTHONUNBUFFERED 1 6 | 7 | COPY requirements.txt . 8 | 9 | # install python dependencies 10 | RUN pip install --upgrade pip 11 | RUN pip install --no-cache-dir -r requirements.txt 12 | 13 | COPY . . 14 | 15 | # gunicorn 16 | CMD ["gunicorn", "--config", "gunicorn-cfg.py", "run:app"] 17 | -------------------------------------------------------------------------------- /apps/static/assets/css/tooltips.css: -------------------------------------------------------------------------------- 1 | [data-target="tooltip"][data-popper-placement^="top"] > [data-popper-arrow] { 2 | bottom: -4px; 3 | } 4 | 5 | [data-target="tooltip"][data-popper-placement^="bottom"] > [data-popper-arrow] { 6 | top: -4px; 7 | } 8 | 9 | [data-target="tooltip"][data-popper-placement^="left"] > [data-popper-arrow] { 10 | right: -0px; 11 | } 12 | 13 | [data-target="tooltip"][data-popper-placement^="right"] > [data-popper-arrow] { 14 | left: -4px; 15 | } 16 | -------------------------------------------------------------------------------- /.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 | *.sqlite3 12 | *.log 13 | 14 | # venv 15 | env 16 | venv 17 | 18 | # other 19 | .DS_Store 20 | 21 | # sphinx docs 22 | _build 23 | _static 24 | _templates 25 | 26 | # javascript 27 | package-lock.json 28 | .vscode/symbols.json 29 | 30 | apps/static/assets/node_modules 31 | apps/static/assets/yarn.lock 32 | apps/static/assets/.temp 33 | 34 | node_modules 35 | -------------------------------------------------------------------------------- /apps/templates/includes/scripts.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | services: 3 | appseed-app: 4 | container_name: appseed_app 5 | restart: always 6 | env_file: .env 7 | build: . 8 | networks: 9 | - db_network 10 | - web_network 11 | nginx: 12 | container_name: nginx 13 | restart: always 14 | image: "nginx:latest" 15 | ports: 16 | - "5085:5085" 17 | volumes: 18 | - ./nginx:/etc/nginx/conf.d 19 | networks: 20 | - web_network 21 | depends_on: 22 | - appseed-app 23 | networks: 24 | db_network: 25 | driver: bridge 26 | web_network: 27 | driver: bridge 28 | -------------------------------------------------------------------------------- /apps/static/assets/js/navbar-sticky.js: -------------------------------------------------------------------------------- 1 | // Navbar stick on scroll ++ styles 2 | 3 | var navbar = document.querySelector("[navbar-main]"); 4 | 5 | window.onscroll = function () { 6 | let blur = navbar.getAttribute("navbar-scroll"); 7 | if (blur == "true") stickyNav(); 8 | }; 9 | 10 | function stickyNav() { 11 | if (window.scrollY >= 5) { 12 | navbar.classList.add("sticky", "top-[1%]", "backdrop-saturate-[200%]", "backdrop-blur-[30px]", "bg-[hsla(0,0%,100%,0.8)]", "shadow-blur", "z-110"); 13 | } else { 14 | navbar.classList.remove("sticky", "top-[1%]", "backdrop-saturate-[200%]", "backdrop-blur-[30px]", "bg-[hsla(0,0%,100%,0.8)]", "shadow-blur", "z-110"); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /apps/static/assets/scss/styles.css: -------------------------------------------------------------------------------- 1 | /*! 2 | 3 | ========================================================= 4 | * Soft UI Dashboard Tailwind - v1.0.2 5 | ========================================================= 6 | 7 | * Product Page: https://www.creative-tim.com/product/soft-ui-dashboard-tailwind 8 | * Copyright 2022 Creative Tim (https://www.creative-tim.com) 9 | * Licensed under MIT (site.license) 10 | 11 | * Coded by www.creative-tim.com 12 | 13 | ========================================================= 14 | 15 | * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 16 | 17 | */ 18 | @tailwind base; 19 | @tailwind components; 20 | @tailwind utilities; 21 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "soft-ui-dashboard-tailwind", 3 | "version": "1.0.2", 4 | "description": "", 5 | "scripts": { 6 | "build": "npm run css && npm run min-css", 7 | "css": "tailwindcss build -i apps/static/assets/scss/styles.css -o apps/static/assets/css/styles.css", 8 | "min-css": "css-minify -d apps/static/assets/css -o apps/static/assets/css" 9 | }, 10 | "devDependencies": { 11 | "autoprefixer": "^10.4.2", 12 | "postcss": "^8.4.6", 13 | "postcss-cli": "^9.1.0", 14 | "tailwindcss": "^3.0.19" 15 | }, 16 | "dependencies": { 17 | "cli": "^1.0.1", 18 | "css-minify": "^2.0.0", 19 | "highlight.js": "^11.4.0", 20 | "tailwindcss-transforms": "^2.2.0" 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | # MIT License 2 | 3 | Copyright (c) 2019 - present [AppSeed](http://appseed.us/) 4 | 5 |
6 | 7 | ## Licensing Information 8 | 9 |
10 | 11 | | Item | - | 12 | | ---------------------------------- | --- | 13 | | License Type | MIT | 14 | | Use for print | **YES** | 15 | | Create single personal website/app | **YES** | 16 | | Create single website/app for client | **YES** | 17 | | Create multiple website/apps for clients | **YES** | 18 | | Create multiple SaaS applications | **YES** | 19 | | End-product paying users | **YES** | 20 | | Product sale | **YES** | 21 | | Remove footer credits | **YES** | 22 | | --- | --- | 23 | | Remove copyright mentions from source code | NO | 24 | | Production deployment assistance | NO | 25 | | Create HTML/CSS template for sale | NO | 26 | | Create Theme/Template for CMS for sale | NO | 27 | | Separate sale of our UI Elements | NO | 28 | 29 |
30 | 31 | --- 32 | For more information regarding licensing, please contact the AppSeed Service < *support@appseed.us* > 33 | -------------------------------------------------------------------------------- /apps/static/assets/css/nucleo-svg.min.css: -------------------------------------------------------------------------------- 1 | .icon{color:#111;display:inline-block;height:1em;width:1em}.icon use{fill:#7ea6f6}.icon.icon-outline use{stroke:#7ea6f6}.icon-xs{height:.5em;width:.5em}.icon-sm{height:.8em;width:.8em}.icon-lg{height:1.6em;width:1.6em}.icon-xl{height:2em;width:2em}.icon-text-aligner{align-items:center;display:flex}.icon-text-aligner .icon{color:inherit;margin-right:.4em}.icon-text-aligner .icon use{fill:currentColor;color:inherit}.icon-text-aligner .icon.icon-outline use{stroke:currentColor}.icon{fill:currentColor;stroke:none}.icon.icon-outline{fill:none;stroke:currentColor}.icon use{stroke:none}.icon.icon-outline use{fill:none}.icon-outline.icon-stroke-1{stroke-width:1px}.icon-outline.icon-stroke-2{stroke-width:2px}.icon-outline.icon-stroke-3{stroke-width:3px}.icon-outline.icon-stroke-4{stroke-width:4px}.icon-outline.icon-stroke-1 use,.icon-outline.icon-stroke-3 use{-webkit-transform:translateX(.5px) translateY(.5px);-moz-transform:translateX(.5px) translateY(.5px);-ms-transform:translateX(.5px) translateY(.5px);-o-transform:translateX(.5px) translateY(.5px);transform:translateX(.5px) translateY(.5px)} -------------------------------------------------------------------------------- /apps/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | Copyright (c) 2019 - present AppSeed.us 4 | """ 5 | 6 | from flask import Flask 7 | from flask_login import LoginManager 8 | from flask_sqlalchemy import SQLAlchemy 9 | from importlib import import_module 10 | 11 | 12 | db = SQLAlchemy() 13 | login_manager = LoginManager() 14 | 15 | 16 | def register_extensions(app): 17 | db.init_app(app) 18 | login_manager.init_app(app) 19 | 20 | 21 | def register_blueprints(app): 22 | for module_name in ('authentication', 'home'): 23 | module = import_module('apps.{}.routes'.format(module_name)) 24 | app.register_blueprint(module.blueprint) 25 | 26 | 27 | def configure_database(app): 28 | 29 | @app.before_first_request 30 | def initialize_database(): 31 | db.create_all() 32 | 33 | @app.teardown_request 34 | def shutdown_session(exception=None): 35 | db.session.remove() 36 | 37 | 38 | def create_app(config): 39 | app = Flask(__name__) 40 | app.config.from_object(config) 41 | register_extensions(app) 42 | register_blueprints(app) 43 | configure_database(app) 44 | return app 45 | -------------------------------------------------------------------------------- /apps/authentication/forms.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | Copyright (c) 2019 - present AppSeed.us 4 | """ 5 | 6 | from flask_wtf import FlaskForm 7 | from wtforms import StringField, PasswordField 8 | from wtforms.validators import Email, DataRequired 9 | 10 | # login and registration 11 | 12 | 13 | class LoginForm(FlaskForm): 14 | username = StringField('Username', 15 | id='username_login', 16 | validators=[DataRequired()]) 17 | password = PasswordField('Password', 18 | id='pwd_login', 19 | validators=[DataRequired()]) 20 | 21 | 22 | class CreateAccountForm(FlaskForm): 23 | username = StringField('Username', 24 | id='username_create', 25 | validators=[DataRequired()]) 26 | email = StringField('Email', 27 | id='email_create', 28 | validators=[DataRequired(), Email()]) 29 | password = PasswordField('Password', 30 | id='pwd_create', 31 | validators=[DataRequired()]) 32 | -------------------------------------------------------------------------------- /apps/static/assets/img/down-arrow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | down-arrow 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /apps/static/assets/img/down-arrow-dark.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | down-arrow 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /apps/authentication/util.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | Copyright (c) 2019 - present AppSeed.us 4 | """ 5 | 6 | import os 7 | import hashlib 8 | import binascii 9 | 10 | # Inspiration -> https://www.vitoshacademy.com/hashing-passwords-in-python/ 11 | 12 | 13 | def hash_pass(password): 14 | """Hash a password for storing.""" 15 | 16 | salt = hashlib.sha256(os.urandom(60)).hexdigest().encode('ascii') 17 | pwdhash = hashlib.pbkdf2_hmac('sha512', password.encode('utf-8'), 18 | salt, 100000) 19 | pwdhash = binascii.hexlify(pwdhash) 20 | return (salt + pwdhash) # return bytes 21 | 22 | 23 | def verify_pass(provided_password, stored_password): 24 | """Verify a stored password against one provided by user""" 25 | 26 | stored_password = stored_password.decode('ascii') 27 | salt = stored_password[:64] 28 | stored_password = stored_password[64:] 29 | pwdhash = hashlib.pbkdf2_hmac('sha512', 30 | provided_password.encode('utf-8'), 31 | salt.encode('ascii'), 32 | 100000) 33 | pwdhash = binascii.hexlify(pwdhash).decode('ascii') 34 | return pwdhash == stored_password 35 | -------------------------------------------------------------------------------- /apps/static/assets/js/perfect-scrollbar.js: -------------------------------------------------------------------------------- 1 | (function () { 2 | var isWindows = navigator.platform.indexOf("Win") > -1 ? true : false; 3 | 4 | if (isWindows) { 5 | // if we are on windows OS we activate the perfectScrollbar function 6 | if (document.querySelector("main")) { 7 | var mainpanel = document.querySelector("main"); 8 | var ps = new PerfectScrollbar(mainpanel); 9 | } 10 | 11 | if (document.querySelectorAll(".overflow-auto")[0]) { 12 | var sidebar = document.querySelectorAll(".overflow-auto"); 13 | var i = 0; 14 | var ps; 15 | sidebar.forEach((element) => { 16 | ps[i++] = new PerfectScrollbar(element); 17 | }); 18 | } 19 | if (document.querySelectorAll(".overflow-y-auto")[0]) { 20 | var sidebar = document.querySelectorAll(".overflow-y-auto"); 21 | var i = 0; 22 | var ps; 23 | sidebar.forEach((element) => { 24 | ps[i++] = new PerfectScrollbar(element); 25 | }); 26 | } 27 | if (document.querySelectorAll(".overflow-x-auto")[0]) { 28 | var sidebar = document.querySelectorAll(".overflow-x-auto"); 29 | var i = 0; 30 | var ps; 31 | sidebar.forEach((element) => { 32 | ps[i++] = new PerfectScrollbar(element); 33 | }); 34 | } 35 | } 36 | })(); 37 | -------------------------------------------------------------------------------- /apps/static/assets/js/dropdown.js: -------------------------------------------------------------------------------- 1 | // Navbar notifications dropdown 2 | 3 | var dropdown_triggers = document.querySelectorAll("[dropdown-trigger]"); 4 | dropdown_triggers.forEach((dropdown_trigger) => { 5 | let dropdown_menu = dropdown_trigger.parentElement.querySelector("[dropdown-menu]"); 6 | 7 | dropdown_trigger.addEventListener("click", function () { 8 | dropdown_menu.classList.toggle("opacity-0"); 9 | dropdown_menu.classList.toggle("pointer-events-none"); 10 | dropdown_menu.classList.toggle("before:-top-5"); 11 | if (dropdown_trigger.getAttribute("aria-expanded") == "false") { 12 | dropdown_trigger.setAttribute("aria-expanded", "true"); 13 | dropdown_menu.classList.remove("transform-dropdown"); 14 | dropdown_menu.classList.add("transform-dropdown-show"); 15 | } else { 16 | dropdown_trigger.setAttribute("aria-expanded", "false"); 17 | dropdown_menu.classList.remove("transform-dropdown-show"); 18 | dropdown_menu.classList.add("transform-dropdown"); 19 | } 20 | }); 21 | 22 | window.addEventListener("click", function (e) { 23 | if (!dropdown_menu.contains(e.target) && !dropdown_trigger.contains(e.target)) { 24 | if (dropdown_trigger.getAttribute("aria-expanded") == "true") { 25 | dropdown_trigger.click(); 26 | } 27 | } 28 | }); 29 | }); 30 | -------------------------------------------------------------------------------- /run.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | Copyright (c) 2019 - present AppSeed.us 4 | """ 5 | 6 | import os 7 | from flask_migrate import Migrate 8 | from flask_minify import Minify 9 | from sys import exit 10 | 11 | from apps.config import config_dict 12 | from apps import create_app, db 13 | 14 | # WARNING: Don't run with debug turned on in production! 15 | DEBUG = (os.getenv('DEBUG', 'False') == 'True') 16 | 17 | # The configuration 18 | get_config_mode = 'Debug' if DEBUG else 'Production' 19 | 20 | try: 21 | 22 | # Load the configuration using the default values 23 | app_config = config_dict[get_config_mode.capitalize()] 24 | 25 | except KeyError: 26 | exit('Error: Invalid . Expected values [Debug, Production] ') 27 | 28 | app = create_app(app_config) 29 | Migrate(app, db) 30 | 31 | if not DEBUG: 32 | Minify(app=app, html=True, js=False, cssless=False) 33 | 34 | if DEBUG: 35 | app.logger.info('DEBUG = ' + str(DEBUG) ) 36 | app.logger.info('FLASK_ENV = ' + os.getenv('FLASK_ENV') ) 37 | app.logger.info('Page Compression = ' + 'FALSE' if DEBUG else 'TRUE' ) 38 | app.logger.info('DBMS = ' + app_config.SQLALCHEMY_DATABASE_URI) 39 | app.logger.info('ASSETS_ROOT = ' + app_config.ASSETS_ROOT ) 40 | 41 | if __name__ == "__main__": 42 | app.run() 43 | -------------------------------------------------------------------------------- /apps/home/routes.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | Copyright (c) 2019 - present AppSeed.us 4 | """ 5 | 6 | from apps.home import blueprint 7 | from flask import render_template, request 8 | from flask_login import login_required 9 | from jinja2 import TemplateNotFound 10 | 11 | 12 | @blueprint.route('/index') 13 | @login_required 14 | def index(): 15 | 16 | return render_template('home/index.html', segment='index') 17 | 18 | 19 | @blueprint.route('/