├── .env ├── .gitignore ├── .node-version ├── CHANGELOG.md ├── Dockerfile ├── LICENSE.md ├── README.md ├── apps ├── __init__.py ├── authentication │ ├── __init__.py │ ├── forms.py │ ├── models.py │ ├── oauth.py │ ├── routes.py │ └── util.py ├── charts │ ├── __init__.py │ └── routes.py ├── config.py ├── db.sqlite3 ├── dyn_dt │ ├── __init__.py │ ├── routes.py │ └── utils.py ├── exceptions │ └── exception.py ├── helpers.py ├── home │ ├── __init__.py │ ├── api.py │ ├── forms.py │ ├── models.py │ ├── routes.py │ └── tasks.py └── models.py ├── build.sh ├── docker-compose.yml ├── gunicorn-cfg.py ├── nginx └── appseed-app.conf ├── package.json ├── postcss.config.js ├── render.yaml ├── requirements.txt ├── run.py ├── static ├── assets │ ├── charts.js │ ├── constants.js │ ├── dark-mode.js │ ├── index.js │ ├── sidebar.js │ └── style.css └── dist │ ├── css │ └── output.css │ ├── images │ ├── authentication │ │ ├── create-account.jpg │ │ ├── login.jpg │ │ └── reset-password.jpg │ ├── blog │ │ ├── image-1.jpg │ │ ├── image-2.jpg │ │ ├── image-3.jpg │ │ ├── image-4.jpg │ │ └── image-7.jpg │ ├── csv.png │ ├── export.png │ ├── feed │ │ ├── image-1.jpg │ │ └── image-2.jpg │ ├── flags │ │ ├── ad.svg │ │ ├── ae.svg │ │ ├── af.svg │ │ ├── ag.svg │ │ ├── ai.svg │ │ ├── al.svg │ │ ├── am.svg │ │ ├── an.svg │ │ ├── ao.svg │ │ ├── ar.svg │ │ ├── at.svg │ │ ├── au.svg │ │ ├── aw.svg │ │ ├── ax.svg │ │ ├── az.svg │ │ ├── ba.svg │ │ ├── bb.svg │ │ ├── bd.svg │ │ ├── be.svg │ │ ├── bf.svg │ │ ├── bg.svg │ │ ├── bh.svg │ │ ├── bi.svg │ │ ├── bj.svg │ │ ├── bm.svg │ │ ├── bn.svg │ │ ├── bo.svg │ │ ├── br.svg │ │ ├── bs.svg │ │ ├── bt.svg │ │ ├── bw.svg │ │ ├── by.svg │ │ ├── bz.svg │ │ ├── ca.svg │ │ ├── caf.svg │ │ ├── cas.svg │ │ ├── cd.svg │ │ ├── ceu.svg │ │ ├── cf.svg │ │ ├── cg.svg │ │ ├── ch.svg │ │ ├── ci.svg │ │ ├── cl.svg │ │ ├── cm.svg │ │ ├── cn.svg │ │ ├── cna.svg │ │ ├── co.svg │ │ ├── coc.svg │ │ ├── cr.svg │ │ ├── csa.svg │ │ ├── cu.svg │ │ ├── cv.svg │ │ ├── cy.svg │ │ ├── cz.svg │ │ ├── de.svg │ │ ├── dj.svg │ │ ├── dk.svg │ │ ├── dm.svg │ │ ├── do.svg │ │ ├── dz.svg │ │ ├── ec.svg │ │ ├── ee.svg │ │ ├── eg.svg │ │ ├── er.svg │ │ ├── es.svg │ │ ├── et.svg │ │ ├── eu.svg │ │ ├── fi.svg │ │ ├── fj.svg │ │ ├── fk.svg │ │ ├── fm.svg │ │ ├── fr.svg │ │ ├── ga.svg │ │ ├── gb.svg │ │ ├── gd.svg │ │ ├── ge.svg │ │ ├── gg.svg │ │ ├── gh.svg │ │ ├── gi.svg │ │ ├── gm.svg │ │ ├── gn.svg │ │ ├── gq.svg │ │ ├── gr.svg │ │ ├── gt.svg │ │ ├── gw.svg │ │ ├── gy.svg │ │ ├── hk.svg │ │ ├── hn.svg │ │ ├── hr.svg │ │ ├── ht.svg │ │ ├── hu.svg │ │ ├── id.svg │ │ ├── ie.svg │ │ ├── il.svg │ │ ├── im.svg │ │ ├── in.svg │ │ ├── iq.svg │ │ ├── ir.svg │ │ ├── is.svg │ │ ├── it.svg │ │ ├── je.svg │ │ ├── jm.svg │ │ ├── jo.svg │ │ ├── jp.svg │ │ ├── ke.svg │ │ ├── kg.svg │ │ ├── kh.svg │ │ ├── km.svg │ │ ├── kn.svg │ │ ├── kp.svg │ │ ├── kr.svg │ │ ├── kw.svg │ │ ├── ky.svg │ │ ├── kz.svg │ │ ├── la.svg │ │ ├── lb.svg │ │ ├── lc.svg │ │ ├── li.svg │ │ ├── lk.svg │ │ ├── lr.svg │ │ ├── ls.svg │ │ ├── lt.svg │ │ ├── lu.svg │ │ ├── lv.svg │ │ ├── ly.svg │ │ ├── ma.svg │ │ ├── mc.svg │ │ ├── md.svg │ │ ├── me.svg │ │ ├── mg.svg │ │ ├── mk.svg │ │ ├── ml.svg │ │ ├── mm.svg │ │ ├── mn.svg │ │ ├── mo.svg │ │ ├── mr.svg │ │ ├── ms.svg │ │ ├── mt.svg │ │ ├── mu.svg │ │ ├── mv.svg │ │ ├── mw.svg │ │ ├── mx.svg │ │ ├── my.svg │ │ ├── mz.svg │ │ ├── na.svg │ │ ├── ne.svg │ │ ├── ng.svg │ │ ├── ni.svg │ │ ├── nl.svg │ │ ├── no.svg │ │ ├── np.svg │ │ ├── nz.svg │ │ ├── om.svg │ │ ├── pa.svg │ │ ├── pe.svg │ │ ├── pf.svg │ │ ├── pg.svg │ │ ├── ph.svg │ │ ├── pk.svg │ │ ├── pl.svg │ │ ├── pr.svg │ │ ├── pt.svg │ │ ├── pw.svg │ │ ├── py.svg │ │ ├── qa.svg │ │ ├── ro.svg │ │ ├── rs.svg │ │ ├── ru.svg │ │ ├── rw.svg │ │ ├── sa.svg │ │ ├── sb.svg │ │ ├── sc.svg │ │ ├── sd.svg │ │ ├── se.svg │ │ ├── sg.svg │ │ ├── sh.svg │ │ ├── si.svg │ │ ├── sk.svg │ │ ├── sl.svg │ │ ├── sm.svg │ │ ├── sn.svg │ │ ├── so.svg │ │ ├── sr.svg │ │ ├── st.svg │ │ ├── sv.svg │ │ ├── sy.svg │ │ ├── sz.svg │ │ ├── tc.svg │ │ ├── td.svg │ │ ├── tg.svg │ │ ├── th.svg │ │ ├── tj.svg │ │ ├── tl.svg │ │ ├── tm.svg │ │ ├── tn.svg │ │ ├── to.svg │ │ ├── tr.svg │ │ ├── tt.svg │ │ ├── tw.svg │ │ ├── tz.svg │ │ ├── ua.svg │ │ ├── ug.svg │ │ ├── us.svg │ │ ├── uy.svg │ │ ├── uz.svg │ │ ├── vc.svg │ │ ├── ve.svg │ │ ├── vg.svg │ │ ├── vn.svg │ │ ├── vu.svg │ │ ├── ws.svg │ │ ├── ww.svg │ │ ├── ye.svg │ │ ├── za.svg │ │ ├── zm.svg │ │ └── zw.svg │ ├── illustrations │ │ ├── 404.svg │ │ ├── 500.svg │ │ ├── maintenance.svg │ │ └── sign-in.svg │ ├── kanban │ │ ├── task-1.jpg │ │ ├── task-2.jpg │ │ └── task-3.jpg │ ├── logo.svg │ ├── og-image.png │ ├── products │ │ ├── apple-imac-1.png │ │ ├── apple-imac-2.png │ │ ├── apple-imac-3.png │ │ ├── imac.png │ │ ├── ipad.png │ │ ├── iphone.png │ │ └── watch.png │ ├── themesberg.svg │ └── users │ │ ├── bonnie-green-2x.png │ │ ├── bonnie-green.png │ │ ├── helene-engels.png │ │ ├── jese-leos-2x.png │ │ ├── jese-leos.png │ │ ├── joseph-mcfall.png │ │ ├── lana-byrd.png │ │ ├── leslie-livingston.png │ │ ├── michael-gough.png │ │ ├── neil-sims.png │ │ ├── robert-brown.png │ │ ├── roberta-casas-2x.png │ │ ├── roberta-casas.png │ │ └── thomas-lean.png │ ├── img │ └── default-user.png │ ├── main.bundle.js │ ├── main.bundle.js.map │ ├── main.css │ └── main.css.map ├── tailwind.config.js ├── templates ├── accounts │ ├── login.html │ ├── profile.html │ └── register.html ├── charts │ └── index.html ├── dyn_dt │ ├── index.html │ └── model.html ├── includes │ ├── footer.html │ ├── head.html │ ├── items-table.html │ ├── navigation.html │ ├── scripts.html │ └── sidebar.html ├── layouts │ ├── base-auth.html │ └── base.html └── pages │ ├── datatables.html │ ├── index.html │ ├── starter.html │ └── tasks.html └── vite.config.js /.env: -------------------------------------------------------------------------------- 1 | # True for development, False for production 2 | DEBUG=True 3 | 4 | # Flask ENV 5 | FLASK_APP=run.py 6 | FLASK_DEBUG=1 7 | 8 | # If not provided, a random one is generated 9 | # SECRET_KEY= 10 | 11 | # If DEBUG=False (production mode) 12 | # DB_ENGINE=mysql 13 | # DB_NAME=appseed_db 14 | # DB_HOST=localhost 15 | # DB_PORT=3306 16 | # DB_USERNAME=appseed_db_usr 17 | # DB_PASS= 18 | 19 | # SOCIAL AUTH Github 20 | # GITHUB_ID=YOUR_GITHUB_ID 21 | # GITHUB_SECRET=YOUR_GITHUB_SECRET 22 | 23 | # SOCIAL AUTH Google 24 | # GOOGLE_ID=YOUR_GOOGLE_ID 25 | # GOOGLE_SECRET=YOUR_GOOGLE_SECRET 26 | -------------------------------------------------------------------------------- /.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 | apps/media/* 34 | 35 | 36 | migrations 37 | node_modules 38 | yarn.lock 39 | -------------------------------------------------------------------------------- /.node-version: -------------------------------------------------------------------------------- 1 | v18.20.0 -------------------------------------------------------------------------------- /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", "app:app"] 17 | -------------------------------------------------------------------------------- /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/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | Copyright (c) 2019 - present AppSeed.us 4 | """ 5 | 6 | import os 7 | from flask import Flask 8 | from flask_login import LoginManager 9 | from flask_sqlalchemy import SQLAlchemy 10 | from importlib import import_module 11 | 12 | db = SQLAlchemy() 13 | login_manager = LoginManager() 14 | 15 | def register_extensions(app): 16 | db.init_app(app) 17 | login_manager.init_app(app) 18 | 19 | def register_blueprints(app): 20 | for module_name in ('authentication', 'home', 'dyn_dt', 'charts', ): 21 | module = import_module('apps.{}.routes'.format(module_name)) 22 | app.register_blueprint(module.blueprint) 23 | 24 | from apps.authentication.oauth import github_blueprint, google_blueprint 25 | 26 | def create_app(config): 27 | 28 | # Contextual 29 | static_prefix = '/static' 30 | templates_dir = os.path.dirname(config.BASE_DIR) 31 | 32 | TEMPLATES_FOLDER = os.path.join(templates_dir,'templates') 33 | STATIC_FOLDER = os.path.join(templates_dir,'static') 34 | 35 | print(' > TEMPLATES_FOLDER: ' + TEMPLATES_FOLDER) 36 | print(' > STATIC_FOLDER: ' + STATIC_FOLDER) 37 | 38 | app = Flask(__name__, static_url_path=static_prefix, template_folder=TEMPLATES_FOLDER, static_folder=STATIC_FOLDER) 39 | 40 | app.config.from_object(config) 41 | register_extensions(app) 42 | register_blueprints(app) 43 | app.register_blueprint(github_blueprint, url_prefix="/login") 44 | app.register_blueprint(google_blueprint, url_prefix="/login") 45 | return app 46 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /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', id='username_login', validators=[DataRequired()]) 15 | password = PasswordField('Password', id='pwd_login', validators=[DataRequired()]) 16 | 17 | 18 | class CreateAccountForm(FlaskForm): 19 | username = StringField('Username', id='username_create', validators=[DataRequired()]) 20 | email = StringField('Email', id='email_create', validators=[DataRequired(), Email()]) 21 | password = PasswordField('Password', id='pwd_create', validators=[DataRequired()]) 22 | 23 | 24 | class ChangePasswordForm(FlaskForm): 25 | current_password = PasswordField('Current Password', id='current_pwd', validators=[DataRequired()]) 26 | new_password1 = PasswordField('New Password', id='new_pwd1', validators=[DataRequired()]) 27 | new_password2 = PasswordField('Re-Type New Password', id='new_pwd2', validators=[DataRequired()]) -------------------------------------------------------------------------------- /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/charts/__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 | 'charts_blueprint', 10 | __name__, 11 | url_prefix='' 12 | ) 13 | -------------------------------------------------------------------------------- /apps/charts/routes.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | Copyright (c) 2019 - present AppSeed.us 4 | """ 5 | 6 | from apps.charts import blueprint 7 | from flask import render_template 8 | from apps.models import Product 9 | 10 | @blueprint.route('/charts') 11 | def charts(): 12 | products = [{'name': product.name, 'price': product.price} for product in Product.get_list()] 13 | return render_template('charts/index.html', segment='charts', parent="apps", products=products) -------------------------------------------------------------------------------- /apps/db.sqlite3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/apps/db.sqlite3 -------------------------------------------------------------------------------- /apps/dyn_dt/__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 | 'table_blueprint', 10 | __name__, 11 | url_prefix='' 12 | ) 13 | -------------------------------------------------------------------------------- /apps/exceptions/exception.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | Copyright (c) 2019 - present AppSeed.us 4 | """ 5 | 6 | class InvalidUsage(Exception): 7 | status_code = 400 8 | 9 | def __init__(self, message, status_code=None, payload=None): 10 | Exception.__init__(self) 11 | self.message = message 12 | if status_code is not None: 13 | self.status_code = status_code 14 | self.payload = payload 15 | 16 | def to_dict(self): 17 | rv = dict(self.payload or ()) 18 | rv['message'] = self.message 19 | 20 | return rv -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /apps/home/api.py: -------------------------------------------------------------------------------- 1 | from run import api 2 | from flask_restful import Resource 3 | from apps.home.models import Product 4 | 5 | 6 | class ProductAPI(Resource): 7 | def get(self): 8 | products = Product.get_json_list() 9 | return products 10 | 11 | api.add_resource(ProductAPI, '/api/product/') -------------------------------------------------------------------------------- /apps/home/forms.py: -------------------------------------------------------------------------------- 1 | from flask_wtf import FlaskForm 2 | from wtforms import StringField, IntegerField 3 | 4 | 5 | class ProductForm(FlaskForm): 6 | name = StringField('Name', id='name') 7 | info = StringField('Info', id='info') 8 | price = IntegerField('Price', id='price') -------------------------------------------------------------------------------- /apps/home/models.py: -------------------------------------------------------------------------------- 1 | from apps import db 2 | from sqlalchemy import func 3 | import enum 4 | 5 | class Product(db.Model): 6 | 7 | __tablename__ = 'Product' 8 | 9 | id = db.Column(db.Integer, primary_key=True) 10 | name = db.Column(db.String(120)) 11 | info = db.Column(db.String(120), nullable=True) 12 | price = db.Column(db.Integer, nullable=True) 13 | 14 | @classmethod 15 | def find_by_id(cls, _id): 16 | return cls.query.filter_by(id=_id).first() 17 | 18 | @classmethod 19 | def get_list(cls): 20 | return cls.query.all() 21 | 22 | def to_dict(self): 23 | return { 24 | 'id': self.id, 25 | 'name': self.name, 26 | 'info': self.info, 27 | 'price': self.price 28 | } 29 | 30 | @classmethod 31 | def get_json_list(cls): 32 | products = cls.query.all() 33 | return [product.to_dict() for product in products] 34 | 35 | 36 | class StatusChoices(enum.Enum): 37 | PENDING = 'PENDING' 38 | SUCCESS = 'SUCCESS' 39 | FAILURE = 'FAILURE' 40 | RUNNING = 'RUNNING' 41 | 42 | def __str__(self): 43 | return str(self.value) 44 | 45 | 46 | class TaskResult(db.Model): 47 | __tablename__ = 'TaskResult' 48 | 49 | id = db.Column(db.Integer, primary_key=True) 50 | task_name = db.Column(db.String(255), nullable=True) 51 | periodic_task_name = db.Column(db.String(255), nullable=True) 52 | status = db.Column(db.Enum(StatusChoices), default=StatusChoices.PENDING) 53 | result = db.Column(db.Text, nullable=True) 54 | date_created = db.Column(db.DateTime, server_default=func.now()) 55 | date_done = db.Column(db.DateTime, nullable=True) -------------------------------------------------------------------------------- /apps/home/routes.py: -------------------------------------------------------------------------------- 1 | # -*- encoding: utf-8 -*- 2 | """ 3 | Copyright (c) 2019 - present AppSeed.us 4 | """ 5 | 6 | import os 7 | import time 8 | import json 9 | from apps.home import blueprint 10 | from flask import render_template, request, redirect, url_for, jsonify 11 | from flask_login import login_required 12 | from jinja2 import TemplateNotFound 13 | from apps.home.forms import ProductForm 14 | from apps.home.models import Product, TaskResult 15 | from celery.result import AsyncResult 16 | from apps import db 17 | from celery import current_app 18 | import datetime 19 | from apps.config import Config 20 | 21 | @blueprint.route("/") 22 | @blueprint.route("/index") 23 | def index(): 24 | context = {} 25 | context['segment'] = 'dashboard' 26 | return render_template("pages/index.html", **context) 27 | 28 | @blueprint.route("/starter") 29 | def starter(): 30 | return render_template("pages/starter.html") 31 | 32 | # Custom Filter 33 | @blueprint.app_template_filter('get_result_field') 34 | def get_result_field(result, field: str): 35 | result = json.loads(result.result) 36 | if result: 37 | return result.get(field) 38 | 39 | @blueprint.app_template_filter('date_format') 40 | def date_format(date): 41 | try: 42 | return date.strftime(r'%Y-%m-%d %H:%M:%S') 43 | except: 44 | return date 45 | 46 | 47 | @blueprint.app_template_filter('name_from_path') 48 | def name_from_path(path): 49 | try: 50 | name = path.split('/')[-1] 51 | return name 52 | except: 53 | return path -------------------------------------------------------------------------------- /build.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # exit on error 3 | set -o errexit 4 | 5 | python -m pip install --upgrade pip 6 | 7 | pip install -r requirements.txt 8 | 9 | # Install 10 | npm i 11 | npm run build 12 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3.8' 2 | services: 3 | rocket-flask: 4 | container_name: rocket_flask 5 | restart: always 6 | build: . 7 | networks: 8 | - db_network 9 | - web_network 10 | nginx: 11 | container_name: nginx 12 | restart: always 13 | image: "nginx:latest" 14 | ports: 15 | - "5085:5085" 16 | volumes: 17 | - ./nginx:/etc/nginx/conf.d 18 | networks: 19 | - web_network 20 | depends_on: 21 | - rocket-flask 22 | networks: 23 | db_network: 24 | driver: bridge 25 | web_network: 26 | driver: bridge 27 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /nginx/appseed-app.conf: -------------------------------------------------------------------------------- 1 | upstream webapp { 2 | server rocket_flask: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 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "rocket-flask", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "vite:dev": "vite build --watch --mode development", 8 | "vite:build": "vite build --mode production && npm run minify-css", 9 | "minify-css": "postcss static/assets/css/*.css --dir static/assets/css --no-map --ext .min.css", 10 | "tailwind:dev": "npx tailwindcss -i ./static/assets/style.css -o ./static/dist/main.css --watch", 11 | "tailwind:build": "npx tailwindcss -i ./static/assets/style.css -o ./static/dist/main.css", 12 | "dev": "npm-run-all --parallel tailwind:dev vite:dev", 13 | "build": "npm-run-all tailwind:build vite:build" 14 | }, 15 | "keywords": [], 16 | "author": "", 17 | "license": "ISC", 18 | "devDependencies": { 19 | "autoprefixer": "^10.4.20", 20 | "cssnano": "^7.0.6", 21 | "npm-run-all": "^4.1.5", 22 | "postcss": "^8.5.3", 23 | "postcss-cli": "^11.0.0", 24 | "sass": "^1.85.1", 25 | "vite": "^6.2.0", 26 | "tailwindcss": "^3.4.3" 27 | }, 28 | "dependencies": { 29 | "flowbite": "^2.3.0" 30 | } 31 | } -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: [ 3 | require('cssnano')({ 4 | preset: 'default', 5 | }), 6 | ], 7 | }; 8 | -------------------------------------------------------------------------------- /render.yaml: -------------------------------------------------------------------------------- 1 | services: 2 | - type: web 3 | name: rocket-flask-latest 4 | plan: free 5 | env: python 6 | region: frankfurt # region should be same as your database region. 7 | buildCommand: "./build.sh" 8 | startCommand: "gunicorn run:flask_app" 9 | envVars: 10 | - key: SECRET_KEY 11 | generateValue: true 12 | - key: WEB_CONCURRENCY 13 | value: 4 14 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | # core 2 | flask==3.1.0 3 | Werkzeug==3.1.3 4 | jinja2==3.1.6 5 | WTForms==3.2.1 6 | flask_wtf==1.2.2 7 | 8 | # DB 9 | flask_migrate==4.1.0 10 | flask_sqlalchemy==3.1.1 11 | sqlalchemy==2.0.38 12 | 13 | # tools 14 | flask_login==0.6.3 15 | flask-dance==7.1.0 16 | celery==5.4.0 17 | redis==5.2.1 18 | colorama==0.4.6 19 | PyJWT~=2.10.1 20 | WTForms-Alchemy==0.19.0 21 | 22 | # utils 23 | email_validator==2.2.0 24 | blinker==1.9.0 25 | 26 | # env 27 | python-dotenv==1.0.1 28 | 29 | # deployment 30 | gunicorn==23.0.0 31 | Flask-Minify==0.49 32 | Flask-CDN==1.5.3 33 | 34 | # flask_mysqldb 35 | # psycopg2-binary 36 | -------------------------------------------------------------------------------- /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 | 30 | # Create tables & Fallback to SQLite 31 | with app.app_context(): 32 | 33 | try: 34 | db.create_all() 35 | except Exception as e: 36 | 37 | print('> Error: DBMS Exception: ' + str(e) ) 38 | 39 | # fallback to SQLite 40 | basedir = os.path.abspath(os.path.dirname(__file__)) 41 | app.config['SQLALCHEMY_DATABASE_URI'] = SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'db.sqlite3') 42 | 43 | print('> Fallback to SQLite ') 44 | db.create_all() 45 | 46 | # Apply all changes 47 | Migrate(app, db) 48 | 49 | if not DEBUG: 50 | Minify(app=app, html=True, js=False, cssless=False) 51 | 52 | if DEBUG: 53 | app.logger.info('DEBUG = ' + str(DEBUG) ) 54 | app.logger.info('Page Compression = ' + 'FALSE' if DEBUG else 'TRUE' ) 55 | app.logger.info('DBMS = ' + app_config.SQLALCHEMY_DATABASE_URI) 56 | 57 | if __name__ == "__main__": 58 | app.run() 59 | -------------------------------------------------------------------------------- /static/assets/constants.js: -------------------------------------------------------------------------------- 1 | 2 | const DARK_CLASS_NAME = 'dark' 3 | const DARK_COLOR_THEME = 'dark' 4 | const LIGHT_CLASS_NAME = 'light' 5 | const LIGHT_COLOR_THEME = 'light' 6 | const HIDDEN_CLASS_NAME = 'hidden' 7 | 8 | module.exports = { 9 | DARK_CLASS_NAME, 10 | DARK_COLOR_THEME, 11 | LIGHT_CLASS_NAME, 12 | LIGHT_COLOR_THEME, 13 | HIDDEN_CLASS_NAME, 14 | } -------------------------------------------------------------------------------- /static/assets/dark-mode.js: -------------------------------------------------------------------------------- 1 | const themeToggleDarkIcon = document.getElementById('theme-toggle-dark-icon'); 2 | const themeToggleLightIcon = document.getElementById('theme-toggle-light-icon'); 3 | 4 | // Change the icons inside the button based on previous settings 5 | if (localStorage.getItem('color-theme') === 'dark' || (!('color-theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) { 6 | themeToggleLightIcon.classList.remove('hidden'); 7 | } else { 8 | themeToggleDarkIcon.classList.remove('hidden'); 9 | } 10 | 11 | const themeToggleBtn = document.getElementById('theme-toggle'); 12 | 13 | let event = new Event('dark-mode'); 14 | 15 | themeToggleBtn.addEventListener('click', function() { 16 | 17 | // toggle icons 18 | themeToggleDarkIcon.classList.toggle('hidden'); 19 | themeToggleLightIcon.classList.toggle('hidden'); 20 | 21 | // if set via local storage previously 22 | if (localStorage.getItem('color-theme')) { 23 | if (localStorage.getItem('color-theme') === 'light') { 24 | document.documentElement.classList.add('dark'); 25 | localStorage.setItem('color-theme', 'dark'); 26 | } else { 27 | document.documentElement.classList.remove('dark'); 28 | localStorage.setItem('color-theme', 'light'); 29 | } 30 | 31 | // if NOT set via local storage previously 32 | } else { 33 | if (document.documentElement.classList.contains('dark')) { 34 | document.documentElement.classList.remove('dark'); 35 | localStorage.setItem('color-theme', 'light'); 36 | } else { 37 | document.documentElement.classList.add('dark'); 38 | localStorage.setItem('color-theme', 'dark'); 39 | } 40 | } 41 | 42 | document.dispatchEvent(event); 43 | 44 | }); 45 | -------------------------------------------------------------------------------- /static/assets/index.js: -------------------------------------------------------------------------------- 1 | import './style.css'; 2 | import 'flowbite/dist/flowbite.js'; 3 | import './sidebar'; 4 | import './charts'; 5 | import './dark-mode'; 6 | 7 | // Have the courage to follow your heart and intuition. 8 | -------------------------------------------------------------------------------- /static/assets/sidebar.js: -------------------------------------------------------------------------------- 1 | const sidebar = document.getElementById('sidebar'); 2 | 3 | if (sidebar) { 4 | const toggleSidebarMobile = (sidebar, sidebarBackdrop, toggleSidebarMobileHamburger, toggleSidebarMobileClose) => { 5 | sidebar.classList.toggle('hidden'); 6 | sidebarBackdrop.classList.toggle('hidden'); 7 | toggleSidebarMobileHamburger.classList.toggle('hidden'); 8 | toggleSidebarMobileClose.classList.toggle('hidden'); 9 | } 10 | 11 | const toggleSidebarMobileEl = document.getElementById('toggleSidebarMobile'); 12 | const sidebarBackdrop = document.getElementById('sidebarBackdrop'); 13 | const toggleSidebarMobileHamburger = document.getElementById('toggleSidebarMobileHamburger'); 14 | const toggleSidebarMobileClose = document.getElementById('toggleSidebarMobileClose'); 15 | const toggleSidebarMobileSearch = document.getElementById('toggleSidebarMobileSearch'); 16 | 17 | toggleSidebarMobileSearch.addEventListener('click', () => { 18 | toggleSidebarMobile(sidebar, sidebarBackdrop, toggleSidebarMobileHamburger, toggleSidebarMobileClose); 19 | }); 20 | 21 | toggleSidebarMobileEl.addEventListener('click', () => { 22 | toggleSidebarMobile(sidebar, sidebarBackdrop, toggleSidebarMobileHamburger, toggleSidebarMobileClose); 23 | }); 24 | 25 | sidebarBackdrop.addEventListener('click', () => { 26 | toggleSidebarMobile(sidebar, sidebarBackdrop, toggleSidebarMobileHamburger, toggleSidebarMobileClose); 27 | }); 28 | } 29 | -------------------------------------------------------------------------------- /static/dist/images/authentication/create-account.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/authentication/create-account.jpg -------------------------------------------------------------------------------- /static/dist/images/authentication/login.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/authentication/login.jpg -------------------------------------------------------------------------------- /static/dist/images/authentication/reset-password.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/authentication/reset-password.jpg -------------------------------------------------------------------------------- /static/dist/images/blog/image-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/blog/image-1.jpg -------------------------------------------------------------------------------- /static/dist/images/blog/image-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/blog/image-2.jpg -------------------------------------------------------------------------------- /static/dist/images/blog/image-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/blog/image-3.jpg -------------------------------------------------------------------------------- /static/dist/images/blog/image-4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/blog/image-4.jpg -------------------------------------------------------------------------------- /static/dist/images/blog/image-7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/blog/image-7.jpg -------------------------------------------------------------------------------- /static/dist/images/csv.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/csv.png -------------------------------------------------------------------------------- /static/dist/images/export.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/export.png -------------------------------------------------------------------------------- /static/dist/images/feed/image-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/feed/image-1.jpg -------------------------------------------------------------------------------- /static/dist/images/feed/image-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/feed/image-2.jpg -------------------------------------------------------------------------------- /static/dist/images/flags/ad.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /static/dist/images/flags/ae.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/af.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /static/dist/images/flags/am.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/an.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /static/dist/images/flags/ar.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/at.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/aw.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | -------------------------------------------------------------------------------- /static/dist/images/flags/ax.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/az.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /static/dist/images/flags/bd.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/be.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/bf.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/bg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/bh.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /static/dist/images/flags/bi.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /static/dist/images/flags/bn.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/bo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/br.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /static/dist/images/flags/bs.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /static/dist/images/flags/bt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/bw.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/by.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /static/dist/images/flags/bz.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /static/dist/images/flags/ca.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/dist/images/flags/caf.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/cd.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/cf.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /static/dist/images/flags/cg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/ch.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/ci.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/cl.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/cm.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /static/dist/images/flags/cn.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/cr.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/csa.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/cu.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /static/dist/images/flags/cv.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /static/dist/images/flags/cz.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/dj.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/dk.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /static/dist/images/flags/do.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /static/dist/images/flags/dz.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/ec.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /static/dist/images/flags/ee.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/es.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /static/dist/images/flags/et.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /static/dist/images/flags/fi.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /static/dist/images/flags/fm.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/fr.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/ga.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/gb.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /static/dist/images/flags/ge.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /static/dist/images/flags/gg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /static/dist/images/flags/gh.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/gi.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /static/dist/images/flags/gm.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/gn.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/gq.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/gr.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /static/dist/images/flags/gt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/gw.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/gy.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/hn.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /static/dist/images/flags/hu.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/id.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /static/dist/images/flags/ie.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/il.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/in.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/is.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/it.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/jm.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/jo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/jp.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /static/dist/images/flags/kg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/kh.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/km.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /static/dist/images/flags/kn.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /static/dist/images/flags/kp.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /static/dist/images/flags/kw.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/la.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/lb.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/lc.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /static/dist/images/flags/li.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/lr.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/ls.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/lt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/lu.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/lv.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/ma.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/mc.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /static/dist/images/flags/md.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/mg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/mk.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/ml.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/mm.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/mn.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /static/dist/images/flags/mr.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/mu.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/mv.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/mw.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/mx.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/my.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/mz.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /static/dist/images/flags/na.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /static/dist/images/flags/ne.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/ng.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/ni.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/nl.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/no.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/om.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/pa.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/pe.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/pk.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/pl.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /static/dist/images/flags/pr.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /static/dist/images/flags/pt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /static/dist/images/flags/pw.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/py.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/qa.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /static/dist/images/flags/ro.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/ru.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/rw.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /static/dist/images/flags/sc.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /static/dist/images/flags/sd.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/se.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/si.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /static/dist/images/flags/sl.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/sm.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/sn.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/so.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/sr.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/st.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /static/dist/images/flags/sv.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /static/dist/images/flags/sy.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/td.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/tg.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/th.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/tj.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/tl.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/tn.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/to.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /static/dist/images/flags/tr.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/tt.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/tw.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/tz.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/ua.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/uy.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/vc.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/ve.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /static/dist/images/flags/vn.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/ws.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /static/dist/images/flags/ww.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/ye.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /static/dist/images/flags/za.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /static/dist/images/flags/zw.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /static/dist/images/kanban/task-1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/kanban/task-1.jpg -------------------------------------------------------------------------------- /static/dist/images/kanban/task-2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/kanban/task-2.jpg -------------------------------------------------------------------------------- /static/dist/images/kanban/task-3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/kanban/task-3.jpg -------------------------------------------------------------------------------- /static/dist/images/og-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/og-image.png -------------------------------------------------------------------------------- /static/dist/images/products/apple-imac-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/products/apple-imac-1.png -------------------------------------------------------------------------------- /static/dist/images/products/apple-imac-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/products/apple-imac-2.png -------------------------------------------------------------------------------- /static/dist/images/products/apple-imac-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/products/apple-imac-3.png -------------------------------------------------------------------------------- /static/dist/images/products/imac.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/products/imac.png -------------------------------------------------------------------------------- /static/dist/images/products/ipad.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/products/ipad.png -------------------------------------------------------------------------------- /static/dist/images/products/iphone.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/products/iphone.png -------------------------------------------------------------------------------- /static/dist/images/products/watch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/products/watch.png -------------------------------------------------------------------------------- /static/dist/images/users/bonnie-green-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/users/bonnie-green-2x.png -------------------------------------------------------------------------------- /static/dist/images/users/bonnie-green.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/users/bonnie-green.png -------------------------------------------------------------------------------- /static/dist/images/users/helene-engels.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/users/helene-engels.png -------------------------------------------------------------------------------- /static/dist/images/users/jese-leos-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/users/jese-leos-2x.png -------------------------------------------------------------------------------- /static/dist/images/users/jese-leos.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/users/jese-leos.png -------------------------------------------------------------------------------- /static/dist/images/users/joseph-mcfall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/users/joseph-mcfall.png -------------------------------------------------------------------------------- /static/dist/images/users/lana-byrd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/users/lana-byrd.png -------------------------------------------------------------------------------- /static/dist/images/users/leslie-livingston.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/users/leslie-livingston.png -------------------------------------------------------------------------------- /static/dist/images/users/michael-gough.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/users/michael-gough.png -------------------------------------------------------------------------------- /static/dist/images/users/neil-sims.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/users/neil-sims.png -------------------------------------------------------------------------------- /static/dist/images/users/robert-brown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/users/robert-brown.png -------------------------------------------------------------------------------- /static/dist/images/users/roberta-casas-2x.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/users/roberta-casas-2x.png -------------------------------------------------------------------------------- /static/dist/images/users/roberta-casas.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/users/roberta-casas.png -------------------------------------------------------------------------------- /static/dist/images/users/thomas-lean.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/images/users/thomas-lean.png -------------------------------------------------------------------------------- /static/dist/img/default-user.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/app-generator/rocket-flask/7dd92eb89d361b94b46a427282ef3c70f2eec286/static/dist/img/default-user.png -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | content: [ 3 | "./templates/**/*.html", 4 | "./static/assets/**/*.js", 5 | "./node_modules/flowbite/**/*.js" 6 | ], 7 | safelist: [ 8 | 'w-64', 9 | 'w-1/2', 10 | 'rounded-l-lg', 11 | 'rounded-r-lg', 12 | 'bg-gray-200', 13 | 'grid-cols-4', 14 | 'grid-cols-7', 15 | 'h-6', 16 | 'leading-6', 17 | 'h-9', 18 | 'leading-9', 19 | 'shadow-lg', 20 | 'bg-opacity-50', 21 | 'dark:bg-opacity-80' 22 | ], 23 | darkMode: "class", 24 | theme: { 25 | extend: { 26 | colors: { 27 | primary: { "50": "#eff6ff", "100": "#dbeafe", "200": "#bfdbfe", "300": "#93c5fd", "400": "#60a5fa", "500": "#3b82f6", "600": "#2563eb", "700": "#1d4ed8", "800": "#1e40af", "900": "#1e3a8a" } 28 | }, 29 | fontFamily: { 30 | 'sans': ['Inter', 'ui-sans-serif', 'system-ui', '-apple-system', 'system-ui', 'Segoe UI', 'Roboto', 'Helvetica Neue', 'Arial', 'Noto Sans', 'sans-serif', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'], 31 | 'body': ['Inter', 'ui-sans-serif', 'system-ui', '-apple-system', 'system-ui', 'Segoe UI', 'Roboto', 'Helvetica Neue', 'Arial', 'Noto Sans', 'sans-serif', 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji'], 32 | 'mono': ['ui-monospace', 'SFMono-Regular', 'Menlo', 'Monaco', 'Consolas', 'Liberation Mono', 'Courier New', 'monospace'] 33 | }, 34 | transitionProperty: { 35 | 'width': 'width' 36 | }, 37 | textDecoration: ['active'], 38 | minWidth: { 39 | 'kanban': '28rem' 40 | }, 41 | }, 42 | }, 43 | 44 | plugins: [ 45 | require('flowbite/plugin') 46 | ], 47 | } 48 | -------------------------------------------------------------------------------- /templates/includes/items-table.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | {% for field_name in db_field_names %} 5 | 10 | {% endfor %} 11 | 12 | 13 | 14 | 15 | {% for item in items %} 16 | 17 | {% for field_name in db_field_names %} 18 | 21 | {% endfor %} 22 | 23 | {% endfor %} 24 | 25 | 26 |
6 |
7 | {{ field_name }} 8 |
9 |
19 | {{ item|getattribute(field_name) }} 20 |
-------------------------------------------------------------------------------- /templates/includes/scripts.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /templates/layouts/base.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {% include "includes/head.html" %} 7 | {% block extrastyle %}{% endblock extrastyle %} 8 | 9 | 10 | 11 | 12 | 13 | {% block messages %}{% endblock messages %} 14 | 15 | {% block navigation %} 16 | {% include "includes/navigation.html" %} 17 | {% endblock navigation %} 18 | 19 |
20 | 21 | {% block sidebar %} 22 | {% include "includes/sidebar.html" %} 23 | {% endblock sidebar %} 24 | 25 | 26 | 27 |
28 | {% block content %}{% endblock content %} 29 | {% block footer %} 30 | {% include "includes/footer.html" %} 31 | {% endblock footer %} 32 |

33 | © Flowbite - Coded by AppSeed 34 |

35 | 36 |
37 |
38 | 39 | 40 | {% include "includes/scripts.html" %} 41 | {% block extra_js %}{% endblock extra_js %} 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import autoprefixer from "autoprefixer"; 3 | import cssnano from "cssnano"; 4 | import path from "path"; 5 | 6 | export default defineConfig(({ mode }) => { 7 | const isProduction = mode === "production"; 8 | 9 | return { 10 | css: { 11 | postcss: { 12 | plugins: [ 13 | autoprefixer(), 14 | isProduction && cssnano(), 15 | ].filter(Boolean), 16 | }, 17 | }, 18 | build: { 19 | outDir: "static", 20 | emptyOutDir: false, 21 | rollupOptions: { 22 | input: path.resolve(__dirname, "static/assets/scss/custom.scss"), 23 | output: { 24 | assetFileNames: (assetInfo) => { 25 | if (assetInfo.name === "custom.css") { 26 | return "assets/css/custom.css"; 27 | } 28 | return "assets/css/[name].[ext]"; 29 | }, 30 | }, 31 | }, 32 | }, 33 | }; 34 | }); --------------------------------------------------------------------------------