├── .gitignore ├── LICENSE ├── Procfile ├── README.md ├── customer ├── __init__.py ├── admin.py ├── apps.py ├── forms.py ├── migrations │ ├── 0001_initial.py │ ├── 0002_delete_billingaddress.py │ └── __init__.py ├── models.py ├── static │ └── customer │ │ ├── css │ │ ├── addons │ │ │ ├── datatables-select.css │ │ │ ├── datatables-select.min.css │ │ │ ├── datatables.css │ │ │ ├── datatables.min.css │ │ │ ├── directives.css │ │ │ ├── directives.min.css │ │ │ ├── flag.css │ │ │ ├── flag.min.css │ │ │ ├── rating.css │ │ │ ├── rating.min.css │ │ │ ├── zmd.hierarchical-display.css │ │ │ └── zmd.hierarchical-display.min.css │ │ ├── bootstrap.css │ │ ├── bootstrap.min.css │ │ ├── mdb.css │ │ ├── mdb.lite.css │ │ ├── mdb.lite.min.css │ │ ├── mdb.min.css │ │ ├── modules │ │ │ ├── animations-extended.css │ │ │ └── animations-extended.min.css │ │ ├── style.css │ │ └── style.min.css │ │ ├── font │ │ └── roboto │ │ │ ├── Roboto-Bold.eot │ │ │ ├── Roboto-Bold.ttf │ │ │ ├── Roboto-Bold.woff │ │ │ ├── Roboto-Bold.woff2 │ │ │ ├── Roboto-Light.eot │ │ │ ├── Roboto-Light.ttf │ │ │ ├── Roboto-Light.woff │ │ │ ├── Roboto-Light.woff2 │ │ │ ├── Roboto-Medium.eot │ │ │ ├── Roboto-Medium.ttf │ │ │ ├── Roboto-Medium.woff │ │ │ ├── Roboto-Medium.woff2 │ │ │ ├── Roboto-Regular.eot │ │ │ ├── Roboto-Regular.ttf │ │ │ ├── Roboto-Regular.woff │ │ │ ├── Roboto-Regular.woff2 │ │ │ ├── Roboto-Thin.eot │ │ │ ├── Roboto-Thin.ttf │ │ │ ├── Roboto-Thin.woff │ │ │ └── Roboto-Thin.woff2 │ │ ├── img │ │ ├── default_img.png │ │ ├── flags.png │ │ ├── lightbox │ │ │ ├── default-skin.png │ │ │ ├── default-skin.svg │ │ │ └── preloader.gif │ │ ├── overlays │ │ │ ├── 01.png │ │ │ ├── 02.png │ │ │ ├── 03.png │ │ │ ├── 04.png │ │ │ ├── 05.png │ │ │ ├── 06.png │ │ │ ├── 07.png │ │ │ ├── 08.png │ │ │ └── 09.png │ │ ├── sample.jpg │ │ └── svg │ │ │ ├── arrow_left.svg │ │ │ ├── arrow_right.svg │ │ │ └── flags.png │ │ ├── js │ │ ├── addons │ │ │ ├── datatables-select.js │ │ │ ├── datatables-select.min.js │ │ │ ├── datatables.js │ │ │ ├── datatables.min.js │ │ │ ├── imagesloaded.pkgd.min.js │ │ │ ├── jquery.zmd.hierarchical-display.js │ │ │ ├── jquery.zmd.hierarchical-display.min.js │ │ │ ├── masonry.pkgd.min.js │ │ │ ├── progressBar.js │ │ │ ├── progressBar.min.js │ │ │ ├── rating.js │ │ │ └── rating.min.js │ │ ├── bootstrap.js │ │ ├── bootstrap.min.js │ │ ├── cart.js │ │ ├── checkout.js │ │ ├── jquery-3.4.1.min.js │ │ ├── mdb.js │ │ ├── mdb.min.js │ │ ├── modules │ │ │ ├── bs-custom-file-input.js │ │ │ ├── chart.js │ │ │ ├── default-file-input.js │ │ │ ├── enhanced-modals.js │ │ │ ├── forms-free.js │ │ │ ├── jquery.easing.js │ │ │ ├── scrolling-navbar.js │ │ │ ├── treeview.js │ │ │ ├── velocity.js │ │ │ ├── velocity.min.js │ │ │ ├── waves.js │ │ │ └── wow.js │ │ └── popper.min.js │ │ └── scss │ │ ├── _custom-skin.scss │ │ ├── _custom-styles.scss │ │ ├── _custom-variables.scss │ │ ├── addons │ │ ├── _datatables-select.scss │ │ ├── _datatables.scss │ │ ├── _directives.scss │ │ ├── _flags.scss │ │ ├── _hierarchical-display.scss │ │ └── _rating.scss │ │ ├── core │ │ ├── _colors.scss │ │ ├── _global.scss │ │ ├── _helpers.scss │ │ ├── _masks.scss │ │ ├── _mixins.scss │ │ ├── _typography.scss │ │ ├── _variables.scss │ │ ├── _waves.scss │ │ └── bootstrap │ │ │ ├── _functions.scss │ │ │ ├── _rfs.scss │ │ │ └── _variables.scss │ │ ├── free │ │ ├── _animations-basic.scss │ │ ├── _badges.scss │ │ ├── _buttons.scss │ │ ├── _cards.scss │ │ ├── _carousels.scss │ │ ├── _depreciated.scss │ │ ├── _dropdowns.scss │ │ ├── _footers.scss │ │ ├── _forms.scss │ │ ├── _input-group.scss │ │ ├── _list-group.scss │ │ ├── _loader.scss │ │ ├── _modals.scss │ │ ├── _msc.scss │ │ ├── _navbars.scss │ │ ├── _pagination.scss │ │ ├── _steppers.scss │ │ ├── _switch.scss │ │ ├── _tables.scss │ │ ├── _treeview.scss │ │ └── modules │ │ │ └── animations-extended │ │ │ ├── _module.scss │ │ │ └── animations-extended.scss │ │ ├── mdb.lite.scss │ │ ├── mdb.scss │ │ └── style.scss ├── templates │ └── customer │ │ ├── base.html │ │ ├── cart.html │ │ ├── checkout.html │ │ ├── footer.html │ │ ├── home_page.html │ │ ├── navbar.html │ │ ├── pagination.html │ │ ├── product_detail.html │ │ ├── register.html │ │ ├── shirts_page.html │ │ └── sign_in.html ├── templatetags │ └── cart_template_tags.py ├── tests.py ├── urls.py └── views.py ├── ecommerce ├── __init__.py ├── asgi.py ├── settings.py ├── urls.py └── wsgi.py ├── manage.py ├── media └── default_img.png ├── requirements.txt └── runtime.txt /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.gitignore.io/api/django 3 | # Edit at https://www.gitignore.io/?templates=django 4 | 5 | ### Django ### 6 | *.log 7 | *.pot 8 | *.pyc 9 | __pycache__/ 10 | local_settings.py 11 | # db.sqlite3 12 | # db.sqlite3-journal 13 | 14 | # If your build process includes running collectstatic, then you probably don't need or want to include staticfiles/ 15 | # in your Git repository. Update and uncomment the following line accordingly. 16 | # /staticfiles/ 17 | 18 | ### Django.Python Stack ### 19 | # Byte-compiled / optimized / DLL files 20 | *.py[cod] 21 | *$py.class 22 | 23 | # C extensions 24 | *.so 25 | 26 | # Distribution / packaging 27 | .Python 28 | build/ 29 | develop-eggs/ 30 | dist/ 31 | downloads/ 32 | eggs/ 33 | .eggs/ 34 | lib/ 35 | lib64/ 36 | parts/ 37 | sdist/ 38 | var/ 39 | wheels/ 40 | pip-wheel-metadata/ 41 | share/python-wheels/ 42 | *.egg-info/ 43 | .installed.cfg 44 | *.egg 45 | MANIFEST 46 | 47 | # PyInstaller 48 | # Usually these files are written by a python script from a template 49 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 50 | *.manifest 51 | *.spec 52 | 53 | # Installer logs 54 | pip-log.txt 55 | pip-delete-this-directory.txt 56 | 57 | # Unit test / coverage reports 58 | htmlcov/ 59 | .tox/ 60 | .nox/ 61 | .coverage 62 | .coverage.* 63 | .cache 64 | nosetests.xml 65 | coverage.xml 66 | *.cover 67 | .hypothesis/ 68 | .pytest_cache/ 69 | 70 | # Translations 71 | *.mo 72 | 73 | # Scrapy stuff: 74 | .scrapy 75 | 76 | # Sphinx documentation 77 | docs/_build/ 78 | 79 | # PyBuilder 80 | target/ 81 | 82 | # pyenv 83 | .python-version 84 | 85 | # pipenv 86 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 87 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 88 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 89 | # install all needed dependencies. 90 | #Pipfile.lock 91 | 92 | # celery beat schedule file 93 | celerybeat-schedule 94 | 95 | # SageMath parsed files 96 | *.sage.py 97 | 98 | # Spyder project settings 99 | .spyderproject 100 | .spyproject 101 | 102 | # Rope project settings 103 | .ropeproject 104 | 105 | # Mr Developer 106 | .mr.developer.cfg 107 | .project 108 | .pydevproject 109 | 110 | # mkdocs documentation 111 | /site 112 | 113 | # mypy 114 | .mypy_cache/ 115 | .dmypy.json 116 | dmypy.json 117 | 118 | # Pyre type checker 119 | .pyre/ 120 | 121 | # End of https://www.gitignore.io/api/django -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 UsamaKashif 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Procfile: -------------------------------------------------------------------------------- 1 | web: gunicorn ecommerce.wsgi --log-file - -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |

Django E-Commerce

2 |
3 | first of all clone this repository
4 | create a virtual environmen (optional) and install the requirements.txt
5 | pip install -r requirements.txt 6 |
7 |
8 | create a file named db.sqlite3 at the root of your project directory 9 |
10 | Run the following commands 11 |
12 | python manage.py migrate 13 |
14 | python manage.py createsuperuser 15 |
16 | Finally start the server 17 |
18 | python manage.py runserver 19 |
20 |
21 | 22 | Register a Customer 23 |
24 | Now visit the admin page and create some products in the products section. 25 | -------------------------------------------------------------------------------- /customer/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/__init__.py -------------------------------------------------------------------------------- /customer/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from .models import * 3 | # Register your models here. 4 | 5 | 6 | admin.site.register(Customer) 7 | admin.site.register(Product) 8 | admin.site.register(Order) 9 | admin.site.register(OrderItem) 10 | admin.site.register(ShippingAddress) -------------------------------------------------------------------------------- /customer/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class CustomerConfig(AppConfig): 5 | name = 'customer' 6 | -------------------------------------------------------------------------------- /customer/forms.py: -------------------------------------------------------------------------------- 1 | from django.contrib.auth.models import User 2 | from django.forms import ModelForm 3 | from django.contrib.auth.forms import UserCreationForm 4 | from django.core.exceptions import ValidationError 5 | from django import forms 6 | 7 | 8 | class CustomerForm(UserCreationForm): 9 | name = forms.CharField(max_length=200, required=True) 10 | class Meta: 11 | model = User 12 | fields = ["username","name","email","password1","password2"] 13 | 14 | def clean_email(self): 15 | email = self.cleaned_data['email'] 16 | if User.objects.filter(email=email).exists(): 17 | raise ValidationError("Account with that email already exists") 18 | return email 19 | 20 | 21 | 22 | class CheckoutForm(forms.Form): 23 | PAYMENT_CHOICES = ( 24 | ("S","Stripe"), 25 | ("P","PayPal") 26 | ) 27 | street = forms.CharField(widget=forms.TextInput( 28 | attrs={ 29 | "placeholder":"234 Main St", 30 | "class":"form-control", 31 | "id":"address" 32 | } 33 | )) 34 | apartment = forms.CharField(widget=forms.TextInput( 35 | attrs={ 36 | "placeholder":"Apartment or suite", 37 | "class":"form-control", 38 | "id":"address-2" 39 | } 40 | )) 41 | city = forms.CharField() 42 | zip_code = forms.CharField() 43 | 44 | -------------------------------------------------------------------------------- /customer/migrations/0001_initial.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.0.6 on 2020-06-06 12:29 2 | 3 | from django.conf import settings 4 | from django.db import migrations, models 5 | import django.db.models.deletion 6 | 7 | 8 | class Migration(migrations.Migration): 9 | 10 | initial = True 11 | 12 | dependencies = [ 13 | migrations.swappable_dependency(settings.AUTH_USER_MODEL), 14 | ] 15 | 16 | operations = [ 17 | migrations.CreateModel( 18 | name='Customer', 19 | fields=[ 20 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 21 | ('name', models.CharField(max_length=200, null=True)), 22 | ('email', models.EmailField(max_length=300, null=True)), 23 | ('customer', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), 24 | ], 25 | ), 26 | migrations.CreateModel( 27 | name='Order', 28 | fields=[ 29 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 30 | ('date_ordered', models.DateTimeField(auto_now_add=True)), 31 | ('complete', models.BooleanField(default=False)), 32 | ('transaction_id', models.CharField(max_length=100, null=True)), 33 | ('customer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='customer.Customer')), 34 | ], 35 | ), 36 | migrations.CreateModel( 37 | name='Product', 38 | fields=[ 39 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 40 | ('name', models.CharField(max_length=200, null=True)), 41 | ('price', models.FloatField()), 42 | ('discount_price', models.FloatField(blank=True, null=True)), 43 | ('category', models.CharField(choices=[('s', 'Shirt'), ('SW', 'Sport Wear'), ('OW', 'Outwear')], max_length=2)), 44 | ('description', models.TextField(null=True)), 45 | ('image', models.ImageField(default='default_img.png', upload_to='product_images')), 46 | ], 47 | ), 48 | migrations.CreateModel( 49 | name='ShippingAddress', 50 | fields=[ 51 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 52 | ('street', models.CharField(max_length=200, null=True)), 53 | ('city', models.CharField(max_length=200, null=True)), 54 | ('apartment', models.CharField(max_length=100, null=True)), 55 | ('zipcode', models.CharField(max_length=200, null=True)), 56 | ('date_added', models.DateTimeField(auto_now_add=True)), 57 | ('customer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='customer.Customer')), 58 | ('order', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='customer.Order')), 59 | ], 60 | ), 61 | migrations.CreateModel( 62 | name='OrderItem', 63 | fields=[ 64 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 65 | ('quantity', models.IntegerField(blank=True, default=0, null=True)), 66 | ('date_added', models.DateTimeField(auto_now_add=True)), 67 | ('order', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='customer.Order')), 68 | ('product', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='customer.Product')), 69 | ], 70 | ), 71 | migrations.CreateModel( 72 | name='BillingAddress', 73 | fields=[ 74 | ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), 75 | ('street', models.CharField(max_length=100)), 76 | ('apartment_address', models.CharField(max_length=100)), 77 | ('country', models.CharField(max_length=100)), 78 | ('zip_code', models.CharField(max_length=100)), 79 | ('customer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='customer.Customer')), 80 | ], 81 | ), 82 | ] 83 | -------------------------------------------------------------------------------- /customer/migrations/0002_delete_billingaddress.py: -------------------------------------------------------------------------------- 1 | # Generated by Django 3.0.6 on 2020-06-06 15:39 2 | 3 | from django.db import migrations 4 | 5 | 6 | class Migration(migrations.Migration): 7 | 8 | dependencies = [ 9 | ('customer', '0001_initial'), 10 | ] 11 | 12 | operations = [ 13 | migrations.DeleteModel( 14 | name='BillingAddress', 15 | ), 16 | ] 17 | -------------------------------------------------------------------------------- /customer/migrations/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/migrations/__init__.py -------------------------------------------------------------------------------- /customer/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.contrib.auth.models import User 3 | 4 | from django.shortcuts import reverse 5 | 6 | from PIL import Image 7 | # Create your models here. 8 | 9 | class Customer(models.Model): 10 | customer = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True) 11 | name = models.CharField(max_length=200, null=True) 12 | email = models.EmailField(max_length=300, null=True) 13 | 14 | def __str__(self): 15 | return self.name 16 | 17 | CATEGORY_CHOICE = ( 18 | ("s","Shirt"), 19 | ("SW","Sport Wear"), 20 | ("OW","Outwear"), 21 | ) 22 | 23 | LABEL_CHOICE = ( 24 | ("P","primary"), 25 | ("S","secondary"), 26 | ("D","danger"), 27 | ) 28 | 29 | class Product(models.Model): 30 | name = models.CharField(max_length=200, null=True) 31 | price = models.FloatField() 32 | discount_price = models.FloatField(blank=True,null=True) 33 | category = models.CharField(choices=CATEGORY_CHOICE, max_length=2) 34 | description = models.TextField(null=True) 35 | image = models.ImageField(default="default_img.png",upload_to="product_images") 36 | 37 | def __str__(self): 38 | return self.name 39 | 40 | @property 41 | def get_brief_decription(self): 42 | d = int(len(self.description)/5) 43 | return self.description[:d] 44 | 45 | @property 46 | def get_image_url(self): 47 | try: 48 | return self.image.url 49 | except: 50 | return "" 51 | 52 | def save(self,*args, **kwargs): 53 | super().save(*args, **kwargs) 54 | 55 | img = Image.open(self.image.path) 56 | if img.height > 250 or img.width > 250: 57 | outputSize = (250, 250) 58 | 59 | img.thumbnail(outputSize) 60 | img.save(self.image.path) 61 | 62 | class Order(models.Model): 63 | customer = models.ForeignKey(Customer, on_delete=models.SET_NULL , null=True,blank=True) 64 | date_ordered = models.DateTimeField(auto_now_add=True) 65 | complete = models.BooleanField(default = False) 66 | transaction_id = models.CharField(max_length=100, null=True) 67 | 68 | def __str__(self): 69 | return str(self.id) 70 | 71 | def get_cart_total(self): 72 | orderitems = self.orderitem_set.all() 73 | total = 0 74 | for item in orderitems: 75 | if item.product.discount_price: 76 | total += item.get_total_discount_item_price() 77 | else: 78 | total += item.get_total_item_price() 79 | return total 80 | 81 | 82 | 83 | 84 | class OrderItem(models.Model): 85 | product = models.ForeignKey(Product, on_delete=models.SET_NULL , null=True,blank=True) 86 | order = models.ForeignKey(Order, on_delete=models.SET_NULL , null=True,blank=True) 87 | quantity = models.IntegerField(default=0, null=True, blank=True) 88 | date_added = models.DateTimeField(auto_now_add=True) 89 | 90 | def __str__(self): 91 | return self.product.name 92 | 93 | def get_total_item_price(self): 94 | return self.quantity * self.product.price 95 | 96 | def get_total_discount_item_price(self): 97 | return self.quantity * self.product.discount_price 98 | 99 | def get_amount_saved(self): 100 | return self.get_total_item_price() - self.get_total_discount_item_price() 101 | 102 | 103 | class ShippingAddress (models.Model): 104 | customer = models.ForeignKey(Customer, on_delete=models.SET_NULL , null=True,blank=True) 105 | order = models.ForeignKey(Order, on_delete=models.SET_NULL , null=True,blank=True) 106 | street = models.CharField(max_length=200, null=True) 107 | city = models.CharField(max_length=200, null=True) 108 | apartment = models.CharField(max_length=100, null=True) 109 | zipcode = models.CharField(max_length=200, null=True) 110 | date_added = models.DateTimeField(auto_now_add=True) 111 | 112 | def __str__(self): 113 | return self.street 114 | -------------------------------------------------------------------------------- /customer/static/customer/css/addons/datatables-select.css: -------------------------------------------------------------------------------- 1 | /* 2 | * MDBootstrap integration with Datatables 3 | * Learn more: https://mdbootstrap.com/docs/jquery/tables/datatables/ 4 | * About MDBootstrap: https://mdbootstrap.com/ 5 | * 6 | * This combined file was created taking that code from this webstie: 7 | * https://cdn.datatables.net/select/1.2.7/css/select.dataTables.min.css 8 | * 9 | * 10 | * To rebuild or modify this file with the latest versions of the included 11 | * software please visit: 12 | * https://datatables.net/download/#bs4/dt-1.10.18 13 | * 14 | * Included libraries: 15 | * DataTables 1.10.18 16 | */ 17 | table.dataTable tbody > tr.selected, 18 | table.dataTable tbody > tr > .selected { 19 | background-color: #B0BED9; } 20 | 21 | table.dataTable.stripe tbody > tr.odd.selected, 22 | table.dataTable.stripe tbody > tr.odd > .selected, table.dataTable.display tbody > tr.odd.selected, 23 | table.dataTable.display tbody > tr.odd > .selected { 24 | background-color: #acbad4; } 25 | 26 | table.dataTable.hover tbody > tr.selected:hover, 27 | table.dataTable.hover tbody > tr > .selected:hover, table.dataTable.display tbody > tr.selected:hover, 28 | table.dataTable.display tbody > tr > .selected:hover { 29 | background-color: #aab7d1; } 30 | 31 | table.dataTable.order-column tbody > tr.selected > .sorting_1, table.dataTable.order-column tbody > tr.selected > .sorting_2, table.dataTable.order-column tbody > tr.selected > .sorting_3, table.dataTable.display tbody > tr.selected > .sorting_1, table.dataTable.display tbody > tr.selected > .sorting_2, table.dataTable.display tbody > tr.selected > .sorting_3 { 32 | background-color: #acbad5; } 33 | 34 | table.dataTable.order-column tbody > tr > .selected, table.dataTable.display tbody > tr > .selected { 35 | background-color: #acbad5; } 36 | 37 | table.dataTable.display tbody > tr.odd.selected > .sorting_1, table.dataTable.order-column.stripe tbody > tr.odd.selected > .sorting_1 { 38 | background-color: #a6b4cd; } 39 | 40 | table.dataTable.display tbody > tr.odd.selected > .sorting_2, table.dataTable.order-column.stripe tbody > tr.odd.selected > .sorting_2 { 41 | background-color: #a8b5cf; } 42 | 43 | table.dataTable.display tbody > tr.odd.selected > .sorting_3, table.dataTable.order-column.stripe tbody > tr.odd.selected > .sorting_3 { 44 | background-color: #a9b7d1; } 45 | 46 | table.dataTable.display tbody > tr.even.selected > .sorting_1, table.dataTable.order-column.stripe tbody > tr.even.selected > .sorting_1 { 47 | background-color: #acbad5; } 48 | 49 | table.dataTable.display tbody > tr.even.selected > .sorting_2, table.dataTable.order-column.stripe tbody > tr.even.selected > .sorting_2 { 50 | background-color: #aebcd6; } 51 | 52 | table.dataTable.display tbody > tr.even.selected > .sorting_3, table.dataTable.order-column.stripe tbody > tr.even.selected > .sorting_3 { 53 | background-color: #afbdd8; } 54 | 55 | table.dataTable.display tbody > tr.odd > .selected, table.dataTable.order-column.stripe tbody > tr.odd > .selected { 56 | background-color: #a6b4cd; } 57 | 58 | table.dataTable.display tbody > tr.even > .selected, table.dataTable.order-column.stripe tbody > tr.even > .selected { 59 | background-color: #acbad5; } 60 | 61 | table.dataTable.display tbody > tr.selected:hover > .sorting_1, table.dataTable.order-column.hover tbody > tr.selected:hover > .sorting_1 { 62 | background-color: #a2aec7; } 63 | 64 | table.dataTable.display tbody > tr.selected:hover > .sorting_2, table.dataTable.order-column.hover tbody > tr.selected:hover > .sorting_2 { 65 | background-color: #a3b0c9; } 66 | 67 | table.dataTable.display tbody > tr.selected:hover > .sorting_3, table.dataTable.order-column.hover tbody > tr.selected:hover > .sorting_3 { 68 | background-color: #a5b2cb; } 69 | 70 | table.dataTable.display tbody > tr:hover > .selected, table.dataTable.display tbody > tr > .selected:hover, table.dataTable.order-column.hover tbody > tr:hover > .selected, table.dataTable.order-column.hover tbody > tr > .selected:hover { 71 | background-color: #a2aec7; } 72 | 73 | table.dataTable tbody td.select-checkbox, table.dataTable tbody th.select-checkbox { 74 | position: relative; } 75 | 76 | table.dataTable tbody td.select-checkbox:before, table.dataTable tbody td.select-checkbox:after, table.dataTable tbody th.select-checkbox:before, table.dataTable tbody th.select-checkbox:after { 77 | display: block; 78 | position: absolute; 79 | top: 1.2em; 80 | left: 50%; 81 | width: 12px; 82 | height: 12px; 83 | -webkit-box-sizing: border-box; 84 | box-sizing: border-box; } 85 | 86 | table.dataTable tbody td.select-checkbox:before, 87 | table.dataTable tbody th.select-checkbox:before { 88 | content: ' '; 89 | margin-top: 4px; 90 | margin-left: -6px; 91 | border: 1px solid black; 92 | -webkit-border-radius: 3px; 93 | border-radius: 3px; } 94 | 95 | table.dataTable tr.selected td.select-checkbox:after, 96 | table.dataTable tr.selected th.select-checkbox:after { 97 | content: '\2714'; 98 | margin-top: 0px; 99 | margin-left: -4px; 100 | text-align: center; 101 | text-shadow: 1px 1px #B0BED9, -1px -1px #B0BED9, 1px -1px #B0BED9, -1px 1px #B0BED9; } 102 | 103 | div.dataTables_wrapper span.select-info, div.dataTables_wrapper span.select-item { 104 | margin-left: 0.5em; } 105 | 106 | @media screen and (max-width: 640px) { 107 | div.dataTables_wrapper span.select-info, div.dataTables_wrapper span.select-item { 108 | margin-left: 0; 109 | display: block; } } 110 | -------------------------------------------------------------------------------- /customer/static/customer/css/addons/datatables-select.min.css: -------------------------------------------------------------------------------- 1 | table.dataTable tbody>tr.selected,table.dataTable tbody>tr>.selected{background-color:#B0BED9}table.dataTable.display tbody>tr.odd.selected,table.dataTable.display tbody>tr.odd>.selected,table.dataTable.stripe tbody>tr.odd.selected,table.dataTable.stripe tbody>tr.odd>.selected{background-color:#acbad4}table.dataTable.display tbody>tr.selected:hover,table.dataTable.display tbody>tr>.selected:hover,table.dataTable.hover tbody>tr.selected:hover,table.dataTable.hover tbody>tr>.selected:hover{background-color:#aab7d1}table.dataTable.display tbody>tr.selected>.sorting_1,table.dataTable.display tbody>tr.selected>.sorting_2,table.dataTable.display tbody>tr.selected>.sorting_3,table.dataTable.display tbody>tr>.selected,table.dataTable.order-column tbody>tr.selected>.sorting_1,table.dataTable.order-column tbody>tr.selected>.sorting_2,table.dataTable.order-column tbody>tr.selected>.sorting_3,table.dataTable.order-column tbody>tr>.selected{background-color:#acbad5}table.dataTable.display tbody>tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_1{background-color:#a6b4cd}table.dataTable.display tbody>tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_2{background-color:#a8b5cf}table.dataTable.display tbody>tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe tbody>tr.odd.selected>.sorting_3{background-color:#a9b7d1}table.dataTable.display tbody>tr.even.selected>.sorting_1,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_1{background-color:#acbad5}table.dataTable.display tbody>tr.even.selected>.sorting_2,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_2{background-color:#aebcd6}table.dataTable.display tbody>tr.even.selected>.sorting_3,table.dataTable.order-column.stripe tbody>tr.even.selected>.sorting_3{background-color:#afbdd8}table.dataTable.display tbody>tr.odd>.selected,table.dataTable.order-column.stripe tbody>tr.odd>.selected{background-color:#a6b4cd}table.dataTable.display tbody>tr.even>.selected,table.dataTable.order-column.stripe tbody>tr.even>.selected{background-color:#acbad5}table.dataTable.display tbody>tr.selected:hover>.sorting_1,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_1{background-color:#a2aec7}table.dataTable.display tbody>tr.selected:hover>.sorting_2,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_2{background-color:#a3b0c9}table.dataTable.display tbody>tr.selected:hover>.sorting_3,table.dataTable.order-column.hover tbody>tr.selected:hover>.sorting_3{background-color:#a5b2cb}table.dataTable.display tbody>tr:hover>.selected,table.dataTable.display tbody>tr>.selected:hover,table.dataTable.order-column.hover tbody>tr:hover>.selected,table.dataTable.order-column.hover tbody>tr>.selected:hover{background-color:#a2aec7}table.dataTable tbody td.select-checkbox,table.dataTable tbody th.select-checkbox{position:relative}table.dataTable tbody td.select-checkbox:after,table.dataTable tbody td.select-checkbox:before,table.dataTable tbody th.select-checkbox:after,table.dataTable tbody th.select-checkbox:before{display:block;position:absolute;top:1.2em;left:50%;width:12px;height:12px;-webkit-box-sizing:border-box;box-sizing:border-box}table.dataTable tbody td.select-checkbox:before,table.dataTable tbody th.select-checkbox:before{content:' ';margin-top:4px;margin-left:-6px;border:1px solid #000;-webkit-border-radius:3px;border-radius:3px}table.dataTable tr.selected td.select-checkbox:after,table.dataTable tr.selected th.select-checkbox:after{content:'\2714';margin-top:0;margin-left:-4px;text-align:center;text-shadow:1px 1px #B0BED9,-1px -1px #B0BED9,1px -1px #B0BED9,-1px 1px #B0BED9}div.dataTables_wrapper span.select-info,div.dataTables_wrapper span.select-item{margin-left:.5em}@media screen and (max-width:640px){div.dataTables_wrapper span.select-info,div.dataTables_wrapper span.select-item{margin-left:0;display:block}} -------------------------------------------------------------------------------- /customer/static/customer/css/addons/datatables.css: -------------------------------------------------------------------------------- 1 | /* 2 | * MDBootstrap integration with Datatables 3 | * Learn more: https://mdbootstrap.com/docs/jquery/tables/datatables/ 4 | * About MDBootstrap: https://mdbootstrap.com/ 5 | * 6 | * This combined file was created by the DataTables downloader builder: 7 | * https://datatables.net/download 8 | * 9 | * To rebuild or modify this file with the latest versions of the included 10 | * software please visit: 11 | * https://datatables.net/download/#bs4/dt-1.10.18 12 | * 13 | * Included libraries: 14 | * DataTables 1.10.18 15 | */ 16 | table.dataTable thead { 17 | cursor: pointer; } 18 | table.dataTable thead > tr > th:active, 19 | table.dataTable thead > tr > td:active { 20 | outline: none; } 21 | 22 | div.dataTables_wrapper div.dataTables_length.d-flex.flex-row label { 23 | margin-top: 1.2rem; 24 | margin-right: 1rem; } 25 | 26 | div.dataTables_wrapper div.dataTables_length.d-flex.flex-row .select-wrapper.mdb-select span, 27 | div.dataTables_wrapper div.dataTables_length.d-flex.flex-row .select-wrapper.mdb-select .select-dropdown { 28 | margin-top: 1rem; } 29 | 30 | div.dataTables_wrapper div.dataTables_length label, div.dataTables_wrapper div.dataTables_filter label { 31 | text-align: left; 32 | font-weight: normal; 33 | padding-top: .5rem; 34 | padding-bottom: .5rem; } 35 | 36 | div.dataTables_wrapper div.dataTables_length select, 37 | div.dataTables_wrapper div.dataTables_length input { 38 | width: auto; } 39 | 40 | div.dataTables_wrapper div.dataTables_filter { 41 | text-align: right; } 42 | div.dataTables_wrapper div.dataTables_filter select, 43 | div.dataTables_wrapper div.dataTables_filter input { 44 | width: auto; } 45 | div.dataTables_wrapper div.dataTables_filter input { 46 | margin-left: .5rem; 47 | display: inline-block; } 48 | 49 | div.dataTables_wrapper div.dataTables_info, div.dataTables_wrapper div.dataTables_paginate { 50 | font-weight: normal; 51 | padding-top: 1rem; 52 | padding-bottom: 1rem; } 53 | 54 | div.dataTables_wrapper div.dataTables_paginate { 55 | text-align: right; 56 | margin: 0; } 57 | div.dataTables_wrapper div.dataTables_paginate ul.pagination { 58 | -webkit-box-pack: end; 59 | -webkit-justify-content: flex-end; 60 | -ms-flex-pack: end; 61 | justify-content: flex-end; } 62 | div.dataTables_wrapper div.dataTables_paginate ul.pagination .page-item.active .page-link:focus { 63 | background-color: #4285f4; } 64 | div.dataTables_wrapper div.dataTables_paginate ul.pagination .page-item .page-link:focus { 65 | -webkit-box-shadow: none; 66 | box-shadow: none; } 67 | 68 | @media (max-width: 767px) { 69 | div.dataTables_wrapper div .dataTables_length, 70 | div.dataTables_wrapper div .dataTables_filter, 71 | div.dataTables_wrapper div .dataTables_info, 72 | div.dataTables_wrapper div .dataTables_paginate ul.pagination { 73 | text-align: center; 74 | -webkit-box-pack: center; 75 | -webkit-justify-content: center; 76 | -ms-flex-pack: center; 77 | justify-content: center; } } 78 | 79 | .bs-select select { 80 | display: inline-block !important; } 81 | 82 | table.dataTable thead > tr > th.sorting_asc, table.dataTable thead > tr > th.sorting_desc, table.dataTable thead > tr > th.sorting, 83 | table.dataTable thead > tr > td.sorting_asc, 84 | table.dataTable thead > tr > td.sorting_desc, 85 | table.dataTable thead > tr > td.sorting { 86 | padding-right: 30px; } 87 | 88 | table.dataTable thead > tr > th:active, 89 | table.dataTable thead > tr > td:active { 90 | outline: none; } 91 | 92 | table.dataTable thead .sorting, 93 | table.dataTable thead .sorting_asc, 94 | table.dataTable thead .sorting_desc, 95 | table.dataTable thead .sorting_asc_disabled, 96 | table.dataTable thead .sorting_desc_disabled { 97 | cursor: pointer; 98 | position: relative; } 99 | 100 | table.dataTable thead .sorting:before, table.dataTable thead .sorting:after, 101 | table.dataTable thead .sorting_asc:before, 102 | table.dataTable thead .sorting_asc:after, 103 | table.dataTable thead .sorting_desc:before, 104 | table.dataTable thead .sorting_desc:after, 105 | table.dataTable thead .sorting_asc_disabled:before, 106 | table.dataTable thead .sorting_asc_disabled:after, 107 | table.dataTable thead .sorting_desc_disabled:before, 108 | table.dataTable thead .sorting_desc_disabled:after { 109 | position: absolute; 110 | bottom: 0.9em; 111 | display: block; 112 | opacity: 0.3; } 113 | 114 | table.dataTable thead .sorting:before, 115 | table.dataTable thead .sorting_asc:before, 116 | table.dataTable thead .sorting_desc:before, 117 | table.dataTable thead .sorting_asc_disabled:before, 118 | table.dataTable thead .sorting_desc_disabled:before { 119 | right: 1em; 120 | content: "\f0de"; } 121 | 122 | table.dataTable thead .sorting:after, 123 | table.dataTable thead .sorting_asc:after, 124 | table.dataTable thead .sorting_desc:after, 125 | table.dataTable thead .sorting_asc_disabled:after, 126 | table.dataTable thead .sorting_desc_disabled:after { 127 | content: "\f0dd"; 128 | right: 16px; } 129 | 130 | table.dataTable thead .sorting:before, 131 | table.dataTable thead .sorting_asc:before, 132 | table.dataTable thead .sorting_desc:before, 133 | table.dataTable thead .sorting_asc_disabled:before, 134 | table.dataTable thead .sorting_desc_disabled:before, 135 | table.dataTable thead .sorting:after, 136 | table.dataTable thead .sorting_asc:after, 137 | table.dataTable thead .sorting_desc:after, 138 | table.dataTable thead .sorting_asc_disabled:after, 139 | table.dataTable thead .sorting_desc_disabled:after { 140 | font-family: 'Font Awesome\ 5 Free'; 141 | font-weight: 900; 142 | font-size: 1rem; } 143 | 144 | table.dataTable thead .sorting_asc:before, 145 | table.dataTable thead .sorting_desc:after { 146 | opacity: 1; } 147 | 148 | table.dataTable thead .sorting_asc_disabled:before, 149 | table.dataTable thead .sorting_desc_disabled:after { 150 | opacity: 0; } 151 | -------------------------------------------------------------------------------- /customer/static/customer/css/addons/datatables.min.css: -------------------------------------------------------------------------------- 1 | div.dataTables_wrapper div.dataTables_filter input,div.dataTables_wrapper div.dataTables_filter select,div.dataTables_wrapper div.dataTables_length input,div.dataTables_wrapper div.dataTables_length select{width:auto}table.dataTable thead{cursor:pointer}div.dataTables_wrapper div.dataTables_length.d-flex.flex-row label{margin-top:1.2rem;margin-right:1rem}div.dataTables_wrapper div.dataTables_length.d-flex.flex-row .select-wrapper.mdb-select .select-dropdown,div.dataTables_wrapper div.dataTables_length.d-flex.flex-row .select-wrapper.mdb-select span{margin-top:1rem}div.dataTables_wrapper div.dataTables_filter label,div.dataTables_wrapper div.dataTables_length label{text-align:left;font-weight:400;padding-top:.5rem;padding-bottom:.5rem}div.dataTables_wrapper div.dataTables_filter{text-align:right}div.dataTables_wrapper div.dataTables_filter input{margin-left:.5rem;display:inline-block}div.dataTables_wrapper div.dataTables_info,div.dataTables_wrapper div.dataTables_paginate{font-weight:400;padding-top:1rem;padding-bottom:1rem}div.dataTables_wrapper div.dataTables_paginate{text-align:right;margin:0}div.dataTables_wrapper div.dataTables_paginate ul.pagination{-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}div.dataTables_wrapper div.dataTables_paginate ul.pagination .page-item.active .page-link:focus{background-color:#4285f4}div.dataTables_wrapper div.dataTables_paginate ul.pagination .page-item .page-link:focus{-webkit-box-shadow:none;box-shadow:none}@media (max-width:767px){div.dataTables_wrapper div .dataTables_filter,div.dataTables_wrapper div .dataTables_info,div.dataTables_wrapper div .dataTables_length,div.dataTables_wrapper div .dataTables_paginate ul.pagination{text-align:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}}.bs-select select{display:inline-block!important}table.dataTable thead>tr>td.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc{padding-right:30px}table.dataTable thead>tr>td:active,table.dataTable thead>tr>th:active{outline:0}table.dataTable thead .sorting,table.dataTable thead .sorting_asc,table.dataTable thead .sorting_asc_disabled,table.dataTable thead .sorting_desc,table.dataTable thead .sorting_desc_disabled{cursor:pointer;position:relative}table.dataTable thead .sorting:after,table.dataTable thead .sorting:before,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_desc:before,table.dataTable thead .sorting_desc_disabled:after,table.dataTable thead .sorting_desc_disabled:before{position:absolute;bottom:.9em;display:block;opacity:.3;font-family:'Font Awesome\ 5 Free';font-weight:900;font-size:1rem}table.dataTable thead .sorting:before,table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_desc:before,table.dataTable thead .sorting_desc_disabled:before{right:1em;content:"\f0de"}table.dataTable thead .sorting:after,table.dataTable thead .sorting_asc:after,table.dataTable thead .sorting_asc_disabled:after,table.dataTable thead .sorting_desc:after,table.dataTable thead .sorting_desc_disabled:after{content:"\f0dd";right:16px}table.dataTable thead .sorting_asc:before,table.dataTable thead .sorting_desc:after{opacity:1}table.dataTable thead .sorting_asc_disabled:before,table.dataTable thead .sorting_desc_disabled:after{opacity:0} -------------------------------------------------------------------------------- /customer/static/customer/css/addons/directives.css: -------------------------------------------------------------------------------- 1 | .opacity-0 { 2 | opacity: 0; } 3 | 4 | .opacity-10 { 5 | opacity: 0.1; } 6 | 7 | .opacity-20 { 8 | opacity: 0.2; } 9 | 10 | .opacity-30 { 11 | opacity: 0.3; } 12 | 13 | .opacity-40 { 14 | opacity: 0.4; } 15 | 16 | .opacity-50 { 17 | opacity: 0.5; } 18 | 19 | .opacity-60 { 20 | opacity: 0.6; } 21 | 22 | .opacity-70 { 23 | opacity: 0.7; } 24 | 25 | .opacity-80 { 26 | opacity: 0.8; } 27 | 28 | .opacity-90 { 29 | opacity: 0.9; } 30 | 31 | .opacity-100 { 32 | opacity: 1; } -------------------------------------------------------------------------------- /customer/static/customer/css/addons/directives.min.css: -------------------------------------------------------------------------------- 1 | .opacity-0{opacity:0}.opacity-10{opacity:.1}.opacity-20{opacity:.2}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-80{opacity:.8}.opacity-90{opacity:.9}.opacity-100{opacity:1} -------------------------------------------------------------------------------- /customer/static/customer/css/addons/rating.css: -------------------------------------------------------------------------------- 1 | .mdb-rating .rate-popover { 2 | color: grey; } 3 | 4 | .mdb-rating .live { 5 | color: black; } 6 | 7 | .mdb-rating .oneStar { 8 | color: #44370f; } 9 | 10 | .mdb-rating .twoStars { 11 | color: #96781e; } 12 | 13 | .mdb-rating .threeStars { 14 | color: #e2b52e; } 15 | 16 | .mdb-rating .fourStars { 17 | color: #f1ba12; } 18 | 19 | .mdb-rating .fiveStars { 20 | color: #f3cb06; } 21 | 22 | .mdb-rating .amber-text { 23 | color: #ffc107 !important; } -------------------------------------------------------------------------------- /customer/static/customer/css/addons/rating.min.css: -------------------------------------------------------------------------------- 1 | .mdb-rating .rate-popover{color:grey}.mdb-rating .live{color:#000}.mdb-rating .oneStar{color:#44370f}.mdb-rating .twoStars{color:#96781e}.mdb-rating .threeStars{color:#e2b52e}.mdb-rating .fourStars{color:#f1ba12}.mdb-rating .fiveStars{color:#f3cb06}.mdb-rating .amber-text{color:#ffc107!important} -------------------------------------------------------------------------------- /customer/static/customer/css/addons/zmd.hierarchical-display.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Material Design Hierarchical Display by Sergey Kupletsky (@zavoloklom) - https://github.com/zavoloklom/material-design-hierarchical-display/ 3 | * License - https://github.com/zavoloklom/material-design-hierarchical-display/blob/master/LICENSE (MIT License) 4 | */ 5 | .zmd-hierarchical-display { 6 | visibility: hidden; } 7 | .zmd-hierarchical-display.in { 8 | visibility: visible; } 9 | 10 | .zmd-hierarchical-displaying { 11 | visibility: visible; } 12 | 13 | .animation { 14 | -webkit-animation-duration: 1s; 15 | animation-duration: 1s; 16 | -webkit-animation-fill-mode: both; 17 | animation-fill-mode: both; } 18 | 19 | .animation.zoomedIn, 20 | .animation.zoomedOut { 21 | -webkit-animation-timing-function: cubic-bezier(0.55, 0, 0.1, 1); 22 | animation-timing-function: cubic-bezier(0.55, 0, 0.1, 1); } 23 | 24 | @-webkit-keyframes zoomedIn { 25 | from { 26 | -webkit-transform: scale(0); 27 | transform: scale(0); } 28 | to { 29 | -webkit-transform: scale(1); 30 | transform: scale(1); } } 31 | 32 | @keyframes zoomedIn { 33 | from { 34 | -webkit-transform: scale(0); 35 | transform: scale(0); } 36 | to { 37 | -webkit-transform: scale(1); 38 | transform: scale(1); } } 39 | 40 | @-webkit-keyframes zoomedOut { 41 | from { 42 | -webkit-transform: scale(1); 43 | transform: scale(1); } 44 | to { 45 | -webkit-transform: scale(0); 46 | transform: scale(0); } } 47 | 48 | @keyframes zoomedOut { 49 | from { 50 | -webkit-transform: scale(1); 51 | transform: scale(1); } 52 | to { 53 | -webkit-transform: scale(0); 54 | transform: scale(0); } } 55 | 56 | .zoomedIn { 57 | -webkit-animation-name: zoomedIn; 58 | animation-name: zoomedIn; } 59 | 60 | .zoomedOut { 61 | -webkit-animation-name: zoomedOut; 62 | animation-name: zoomedOut; } 63 | -------------------------------------------------------------------------------- /customer/static/customer/css/addons/zmd.hierarchical-display.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Material Design Hierarchical Display by Sergey Kupletsky (@zavoloklom) - https://github.com/zavoloklom/material-design-hierarchical-display/ 3 | * License - https://github.com/zavoloklom/material-design-hierarchical-display/blob/master/LICENSE (MIT License) 4 | */.zmd-hierarchical-display{visibility:hidden}.zmd-hierarchical-display.in{visibility:visible}.zmd-hierarchical-displaying{visibility:visible}.animation{-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-fill-mode:both;animation-fill-mode:both}.animation.zoomedIn,.animation.zoomedOut{-webkit-animation-timing-function:cubic-bezier(.55,0,.1,1);animation-timing-function:cubic-bezier(.55,0,.1,1)}@-webkit-keyframes zoomedIn{from{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1)}}@keyframes zoomedIn{from{-webkit-transform:scale(0);transform:scale(0)}to{-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes zoomedOut{from{-webkit-transform:scale(1);transform:scale(1)}to{-webkit-transform:scale(0);transform:scale(0)}}@keyframes zoomedOut{from{-webkit-transform:scale(1);transform:scale(1)}to{-webkit-transform:scale(0);transform:scale(0)}}.zoomedIn{-webkit-animation-name:zoomedIn;animation-name:zoomedIn}.zoomedOut{-webkit-animation-name:zoomedOut;animation-name:zoomedOut} -------------------------------------------------------------------------------- /customer/static/customer/css/style.css: -------------------------------------------------------------------------------- 1 | /* Required height of parents of the Half Page Carousel for proper displaying carousel itself */ 2 | html, 3 | body, 4 | .view { 5 | height: 100%; } 6 | 7 | /* Half Page Carousel itself*/ 8 | .carousel { 9 | height: 50%; } 10 | .carousel .carousel-inner { 11 | height: 100%; } 12 | .carousel .carousel-inner .carousel-item, 13 | .carousel .carousel-inner .active { 14 | height: 100%; } 15 | 16 | /* Adjustment for mobile devices*/ 17 | @media (max-width: 776px) { 18 | .carousel { 19 | height: 100%; } } 20 | 21 | /* Footer color for sake of consistency with Navbar */ 22 | .page-footer { 23 | background-color: #929FBA; } 24 | -------------------------------------------------------------------------------- /customer/static/customer/css/style.min.css: -------------------------------------------------------------------------------- 1 | .view,body,html{height:100%}.carousel{height:50%}.carousel .carousel-inner,.carousel .carousel-inner .active,.carousel .carousel-inner .carousel-item{height:100%}@media (max-width:776px){.carousel{height:100%}}.page-footer{background-color:#929FBA} -------------------------------------------------------------------------------- /customer/static/customer/font/roboto/Roboto-Bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/font/roboto/Roboto-Bold.eot -------------------------------------------------------------------------------- /customer/static/customer/font/roboto/Roboto-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/font/roboto/Roboto-Bold.ttf -------------------------------------------------------------------------------- /customer/static/customer/font/roboto/Roboto-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/font/roboto/Roboto-Bold.woff -------------------------------------------------------------------------------- /customer/static/customer/font/roboto/Roboto-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/font/roboto/Roboto-Bold.woff2 -------------------------------------------------------------------------------- /customer/static/customer/font/roboto/Roboto-Light.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/font/roboto/Roboto-Light.eot -------------------------------------------------------------------------------- /customer/static/customer/font/roboto/Roboto-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/font/roboto/Roboto-Light.ttf -------------------------------------------------------------------------------- /customer/static/customer/font/roboto/Roboto-Light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/font/roboto/Roboto-Light.woff -------------------------------------------------------------------------------- /customer/static/customer/font/roboto/Roboto-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/font/roboto/Roboto-Light.woff2 -------------------------------------------------------------------------------- /customer/static/customer/font/roboto/Roboto-Medium.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/font/roboto/Roboto-Medium.eot -------------------------------------------------------------------------------- /customer/static/customer/font/roboto/Roboto-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/font/roboto/Roboto-Medium.ttf -------------------------------------------------------------------------------- /customer/static/customer/font/roboto/Roboto-Medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/font/roboto/Roboto-Medium.woff -------------------------------------------------------------------------------- /customer/static/customer/font/roboto/Roboto-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/font/roboto/Roboto-Medium.woff2 -------------------------------------------------------------------------------- /customer/static/customer/font/roboto/Roboto-Regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/font/roboto/Roboto-Regular.eot -------------------------------------------------------------------------------- /customer/static/customer/font/roboto/Roboto-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/font/roboto/Roboto-Regular.ttf -------------------------------------------------------------------------------- /customer/static/customer/font/roboto/Roboto-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/font/roboto/Roboto-Regular.woff -------------------------------------------------------------------------------- /customer/static/customer/font/roboto/Roboto-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/font/roboto/Roboto-Regular.woff2 -------------------------------------------------------------------------------- /customer/static/customer/font/roboto/Roboto-Thin.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/font/roboto/Roboto-Thin.eot -------------------------------------------------------------------------------- /customer/static/customer/font/roboto/Roboto-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/font/roboto/Roboto-Thin.ttf -------------------------------------------------------------------------------- /customer/static/customer/font/roboto/Roboto-Thin.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/font/roboto/Roboto-Thin.woff -------------------------------------------------------------------------------- /customer/static/customer/font/roboto/Roboto-Thin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/font/roboto/Roboto-Thin.woff2 -------------------------------------------------------------------------------- /customer/static/customer/img/default_img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/img/default_img.png -------------------------------------------------------------------------------- /customer/static/customer/img/flags.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/img/flags.png -------------------------------------------------------------------------------- /customer/static/customer/img/lightbox/default-skin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/img/lightbox/default-skin.png -------------------------------------------------------------------------------- /customer/static/customer/img/lightbox/default-skin.svg: -------------------------------------------------------------------------------- 1 | default-skin 2 -------------------------------------------------------------------------------- /customer/static/customer/img/lightbox/preloader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/img/lightbox/preloader.gif -------------------------------------------------------------------------------- /customer/static/customer/img/overlays/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/img/overlays/01.png -------------------------------------------------------------------------------- /customer/static/customer/img/overlays/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/img/overlays/02.png -------------------------------------------------------------------------------- /customer/static/customer/img/overlays/03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/img/overlays/03.png -------------------------------------------------------------------------------- /customer/static/customer/img/overlays/04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/img/overlays/04.png -------------------------------------------------------------------------------- /customer/static/customer/img/overlays/05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/img/overlays/05.png -------------------------------------------------------------------------------- /customer/static/customer/img/overlays/06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/img/overlays/06.png -------------------------------------------------------------------------------- /customer/static/customer/img/overlays/07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/img/overlays/07.png -------------------------------------------------------------------------------- /customer/static/customer/img/overlays/08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/img/overlays/08.png -------------------------------------------------------------------------------- /customer/static/customer/img/overlays/09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/img/overlays/09.png -------------------------------------------------------------------------------- /customer/static/customer/img/sample.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/img/sample.jpg -------------------------------------------------------------------------------- /customer/static/customer/img/svg/arrow_left.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /customer/static/customer/img/svg/arrow_right.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /customer/static/customer/img/svg/flags.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/img/svg/flags.png -------------------------------------------------------------------------------- /customer/static/customer/js/addons/imagesloaded.pkgd.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * imagesLoaded PACKAGED v4.1.4 3 | * JavaScript is all like "You images are done yet or what?" 4 | * MIT License 5 | */ 6 | 7 | !function(e,t){"function"==typeof define&&define.amd?define("ev-emitter/ev-emitter",t):"object"==typeof module&&module.exports?module.exports=t():e.EvEmitter=t()}("undefined"!=typeof window?window:this,function(){function e(){}var t=e.prototype;return t.on=function(e,t){if(e&&t){var i=this._events=this._events||{},n=i[e]=i[e]||[];return n.indexOf(t)==-1&&n.push(t),this}},t.once=function(e,t){if(e&&t){this.on(e,t);var i=this._onceEvents=this._onceEvents||{},n=i[e]=i[e]||{};return n[t]=!0,this}},t.off=function(e,t){var i=this._events&&this._events[e];if(i&&i.length){var n=i.indexOf(t);return n!=-1&&i.splice(n,1),this}},t.emitEvent=function(e,t){var i=this._events&&this._events[e];if(i&&i.length){i=i.slice(0),t=t||[];for(var n=this._onceEvents&&this._onceEvents[e],o=0;o'); 9 | $this.hasClass('md-progress') ? selector.children().children().addClass('md-progress-bar-text') : selector.children().children().addClass('progress-bar-text'); 10 | (progressValue !== 100) ? selector.children().children().text(`${progressValue}%`) : selector.children().children().html(''); 11 | } 12 | 13 | function set(selector, value) { 14 | selector.children().removeClass('success fail active'); 15 | selector.children().attr('aria-valuenow', value); 16 | init(selector); 17 | if (value > 100) { 18 | return false; 19 | } else if (value === 100) { 20 | selector.children().addClass('success'); 21 | } else if (value < 30) { 22 | selector.children().addClass('fail'); 23 | } else { 24 | selector.children().addClass('active'); 25 | } 26 | return true; 27 | } 28 | 29 | set($this, givenValue); 30 | }; 31 | }(jQuery)); 32 | -------------------------------------------------------------------------------- /customer/static/customer/js/addons/progressBar.min.js: -------------------------------------------------------------------------------- 1 | (function($){$.fn.progressBar=function(givenValue){const $this=$(this);function init(selector){const progressValue=selector.children().attr('aria-valuenow');selector.children().width(`${progressValue}%`);selector.children().html('');$this.hasClass('md-progress')?selector.children().children().addClass('md-progress-bar-text'):selector.children().children().addClass('progress-bar-text');(progressValue!==100)?selector.children().children().text(`${progressValue}%`):selector.children().children().html('')} 2 | function set(selector,value){selector.children().removeClass('success fail active');selector.children().attr('aria-valuenow',value);init(selector);if(value>100){return!1}else if(value===100){selector.children().addClass('success')}else if(value<30){selector.children().addClass('fail')}else{selector.children().addClass('active')} 3 | return!0} 4 | set($this,givenValue)}}(jQuery)) -------------------------------------------------------------------------------- /customer/static/customer/js/addons/rating.js: -------------------------------------------------------------------------------- 1 | (function ($) { 2 | $.fn.mdbRate = function () { 3 | var $stars; 4 | // Custom whitelist to allow for using HTML tags in popover content 5 | var myDefaultWhiteList = $.fn.tooltip.Constructor.Default.whiteList 6 | myDefaultWhiteList.textarea = []; 7 | myDefaultWhiteList.button = []; 8 | 9 | var $container = $(this); 10 | 11 | var titles = ['Very bad', 'Poor', 'OK', 'Good', 'Excellent']; 12 | 13 | for (var i = 0; i < 5; i++) { 14 | $container.append(``); 16 | } 17 | 18 | $stars = $container.children(); 19 | 20 | if ($container.hasClass('rating-faces')) { 21 | $stars.addClass('far fa-meh-blank'); 22 | } else if ($container.hasClass('empty-stars')) { 23 | $stars.addClass('far fa-star'); 24 | } else { 25 | $stars.addClass('fas fa-star'); 26 | } 27 | 28 | $stars.on('mouseover', function () { 29 | var index = $(this).attr('data-index'); 30 | markStarsAsActive(index); 31 | }); 32 | 33 | function markStarsAsActive(index) { 34 | unmarkActive(); 35 | 36 | for (var i = 0; i <= index; i++) { 37 | 38 | if ($container.hasClass('rating-faces')) { 39 | $($stars.get(i)).removeClass('fa-meh-blank'); 40 | $($stars.get(i)).addClass('live'); 41 | 42 | switch (index) { 43 | case '0': 44 | $($stars.get(i)).addClass('fa-angry'); 45 | break; 46 | case '1': 47 | $($stars.get(i)).addClass('fa-frown'); 48 | break; 49 | case '2': 50 | $($stars.get(i)).addClass('fa-meh'); 51 | break; 52 | case '3': 53 | $($stars.get(i)).addClass('fa-smile'); 54 | break; 55 | case '4': 56 | $($stars.get(i)).addClass('fa-laugh'); 57 | break; 58 | } 59 | 60 | } else if ($container.hasClass('empty-stars')) { 61 | $($stars.get(i)).addClass('fas'); 62 | switch (index) { 63 | case '0': 64 | $($stars.get(i)).addClass('oneStar'); 65 | break; 66 | case '1': 67 | $($stars.get(i)).addClass('twoStars'); 68 | break; 69 | case '2': 70 | $($stars.get(i)).addClass('threeStars'); 71 | break; 72 | case '3': 73 | $($stars.get(i)).addClass('fourStars'); 74 | break; 75 | case '4': 76 | $($stars.get(i)).addClass('fiveStars'); 77 | break; 78 | } 79 | } else { 80 | $($stars.get(i)).addClass('amber-text'); 81 | 82 | } 83 | } 84 | } 85 | 86 | function unmarkActive() { 87 | $stars.parent().hasClass('rating-faces') ? $stars.addClass('fa-meh-blank') : $stars; 88 | $container.hasClass('empty-stars') ? $stars.removeClass('fas') : $container; 89 | $stars.removeClass('fa-angry fa-frown fa-meh fa-smile fa-laugh live oneStar twoStars threeStars fourStars fiveStars amber-text'); 90 | } 91 | 92 | $stars.on('click', function () { 93 | $stars.popover('hide'); 94 | }); 95 | 96 | // Submit, you can add some extra custom code here 97 | // ex. to send the information to the server 98 | $container.on('click', '#voteSubmitButton', function () { 99 | $stars.popover('hide'); 100 | }); 101 | 102 | // Cancel, just close the popover 103 | $container.on('click', '#closePopoverButton', function () { 104 | $stars.popover('hide'); 105 | }); 106 | 107 | if ($container.hasClass('feedback')) { 108 | 109 | $(function () { 110 | $stars.popover({ 111 | // Append popover to #rateMe to allow handling form inside the popover 112 | container: $container, 113 | // Custom content for popover 114 | content: `
` 115 | }); 116 | }) 117 | } 118 | 119 | $stars.tooltip(); 120 | } 121 | })(jQuery); -------------------------------------------------------------------------------- /customer/static/customer/js/addons/rating.min.js: -------------------------------------------------------------------------------- 1 | (function($){$.fn.mdbRate=function(){var $stars;var myDefaultWhiteList=$.fn.tooltip.Constructor.Default.whiteList 2 | myDefaultWhiteList.textarea=[];myDefaultWhiteList.button=[];var $container=$(this);var titles=['Very bad','Poor','OK','Good','Excellent'];for(var i=0;i<5;i++){$container.append(``)} 4 | $stars=$container.children();if($container.hasClass('rating-faces')){$stars.addClass('far fa-meh-blank')}else if($container.hasClass('empty-stars')){$stars.addClass('far fa-star')}else{$stars.addClass('fas fa-star')} 5 | $stars.on('mouseover',function(){var index=$(this).attr('data-index');markStarsAsActive(index)});function markStarsAsActive(index){unmarkActive();for(var i=0;i<=index;i++){if($container.hasClass('rating-faces')){$($stars.get(i)).removeClass('fa-meh-blank');$($stars.get(i)).addClass('live');switch(index){case '0':$($stars.get(i)).addClass('fa-angry');break;case '1':$($stars.get(i)).addClass('fa-frown');break;case '2':$($stars.get(i)).addClass('fa-meh');break;case '3':$($stars.get(i)).addClass('fa-smile');break;case '4':$($stars.get(i)).addClass('fa-laugh');break}}else if($container.hasClass('empty-stars')){$($stars.get(i)).addClass('fas');switch(index){case '0':$($stars.get(i)).addClass('oneStar');break;case '1':$($stars.get(i)).addClass('twoStars');break;case '2':$($stars.get(i)).addClass('threeStars');break;case '3':$($stars.get(i)).addClass('fourStars');break;case '4':$($stars.get(i)).addClass('fiveStars');break}}else{$($stars.get(i)).addClass('amber-text')}}} 6 | function unmarkActive(){$stars.parent().hasClass('rating-faces')?$stars.addClass('fa-meh-blank'):$stars;$container.hasClass('empty-stars')?$stars.removeClass('fas'):$container;$stars.removeClass('fa-angry fa-frown fa-meh fa-smile fa-laugh live oneStar twoStars threeStars fourStars fiveStars amber-text')} 7 | $stars.on('click',function(){$stars.popover('hide')});$container.on('click','#voteSubmitButton',function(){$stars.popover('hide')});$container.on('click','#closePopoverButton',function(){$stars.popover('hide')});if($container.hasClass('feedback')){$(function(){$stars.popover({container:$container,content:`
`})})} 8 | $stars.tooltip()}})(jQuery) -------------------------------------------------------------------------------- /customer/static/customer/js/cart.js: -------------------------------------------------------------------------------- 1 | let updateBtns = document.getElementsByClassName('update-cart') 2 | 3 | for(i=0; i < updateBtns.length; i++){ 4 | updateBtns[i].addEventListener('click', function(){ 5 | let productId = this.dataset.product 6 | let action = this.dataset.action 7 | console.log("productID:",productId, 'Action:',action) 8 | 9 | // console.log(user) 10 | if(user === "AnonymousUser") { 11 | console.log('not logged in') 12 | }else{ 13 | update_user_order(productId,action) 14 | } 15 | }) 16 | } 17 | 18 | function update_user_order(productId,action){ 19 | console.log("User logged in, sending data...") 20 | 21 | let url = '/update_item/' 22 | fetch(url, { 23 | method : "POST", 24 | headers: { 25 | 'Content-Type':'application/json', 26 | 'X-CSRFToken': csrftoken 27 | }, 28 | body:JSON.stringify({ 29 | "productId":productId, 30 | "action":action 31 | }) 32 | }) 33 | 34 | .then((response) => { 35 | return response.json() 36 | }) 37 | 38 | .then ((data) => { 39 | console.log("data", data) 40 | location.reload() 41 | }) 42 | } -------------------------------------------------------------------------------- /customer/static/customer/js/checkout.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/static/customer/js/checkout.js -------------------------------------------------------------------------------- /customer/static/customer/js/modules/bs-custom-file-input.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * bsCustomFileInput v1.3.2 (https://github.com/Johann-S/bs-custom-file-input) 3 | * Copyright 2018 - 2019 Johann-S 4 | * Licensed under MIT (https://github.com/Johann-S/bs-custom-file-input/blob/master/LICENSE) 5 | */ 6 | (function (global, factory) { 7 | typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : 8 | typeof define === 'function' && define.amd ? define(factory) : 9 | (global = global || self, global.bsCustomFileInput = factory()); 10 | }(this, function () { 11 | 'use strict'; 12 | 13 | var Selector = { 14 | CUSTOMFILE: '.custom-file input[type="file"]', 15 | CUSTOMFILELABEL: '.custom-file-label', 16 | FORM: 'form', 17 | INPUT: 'input' 18 | }; 19 | 20 | var textNodeType = 3; 21 | 22 | var getDefaultText = function getDefaultText(input) { 23 | var defaultText = ''; 24 | var label = input.parentNode.querySelector(Selector.CUSTOMFILELABEL); 25 | 26 | if (label) { 27 | defaultText = label.innerHTML; 28 | } 29 | 30 | return defaultText; 31 | }; 32 | 33 | var findFirstChildNode = function findFirstChildNode(element) { 34 | if (element.childNodes.length > 0) { 35 | var childNodes = [].slice.call(element.childNodes); 36 | 37 | for (var i = 0; i < childNodes.length; i++) { 38 | var node = childNodes[i]; 39 | 40 | if (node.nodeType !== textNodeType) { 41 | return node; 42 | } 43 | } 44 | } 45 | 46 | return element; 47 | }; 48 | 49 | var restoreDefaultText = function restoreDefaultText(input) { 50 | var defaultText = input.bsCustomFileInput.defaultText; 51 | var label = input.parentNode.querySelector(Selector.CUSTOMFILELABEL); 52 | 53 | if (label) { 54 | var element = findFirstChildNode(label); 55 | element.innerHTML = defaultText; 56 | } 57 | }; 58 | 59 | var fileApi = !!window.File; 60 | var FAKE_PATH = 'fakepath'; 61 | var FAKE_PATH_SEPARATOR = '\\'; 62 | 63 | var getSelectedFiles = function getSelectedFiles(input) { 64 | if (input.hasAttribute('multiple') && fileApi) { 65 | return [].slice.call(input.files).map(function (file) { 66 | return file.name; 67 | }).join(', '); 68 | } 69 | 70 | if (input.value.indexOf(FAKE_PATH) !== -1) { 71 | var splittedValue = input.value.split(FAKE_PATH_SEPARATOR); 72 | return splittedValue[splittedValue.length - 1]; 73 | } 74 | 75 | return input.value; 76 | }; 77 | 78 | function handleInputChange() { 79 | var label = this.parentNode.querySelector(Selector.CUSTOMFILELABEL); 80 | 81 | if (label) { 82 | var element = findFirstChildNode(label); 83 | var inputValue = getSelectedFiles(this); 84 | 85 | if (inputValue.length) { 86 | element.innerHTML = inputValue; 87 | } else { 88 | restoreDefaultText(this); 89 | } 90 | } 91 | } 92 | 93 | function handleFormReset() { 94 | var customFileList = [].slice.call(this.querySelectorAll(Selector.INPUT)).filter(function (input) { 95 | return !!input.bsCustomFileInput; 96 | }); 97 | 98 | for (var i = 0, len = customFileList.length; i < len; i++) { 99 | restoreDefaultText(customFileList[i]); 100 | } 101 | } 102 | 103 | var customProperty = 'bsCustomFileInput'; 104 | var Event = { 105 | FORMRESET: 'reset', 106 | INPUTCHANGE: 'change' 107 | }; 108 | var bsCustomFileInput = { 109 | init: function init(inputSelector, formSelector) { 110 | if (inputSelector === void 0) { 111 | inputSelector = Selector.CUSTOMFILE; 112 | } 113 | 114 | if (formSelector === void 0) { 115 | formSelector = Selector.FORM; 116 | } 117 | 118 | var customFileInputList = [].slice.call(document.querySelectorAll(inputSelector)); 119 | var formList = [].slice.call(document.querySelectorAll(formSelector)); 120 | 121 | for (var i = 0, len = customFileInputList.length; i < len; i++) { 122 | var input = customFileInputList[i]; 123 | Object.defineProperty(input, customProperty, { 124 | value: { 125 | defaultText: getDefaultText(input) 126 | }, 127 | writable: true 128 | }); 129 | handleInputChange.call(input); 130 | input.addEventListener(Event.INPUTCHANGE, handleInputChange); 131 | } 132 | 133 | for (var _i = 0, _len = formList.length; _i < _len; _i++) { 134 | formList[_i].addEventListener(Event.FORMRESET, handleFormReset); 135 | 136 | Object.defineProperty(formList[_i], customProperty, { 137 | value: true, 138 | writable: true 139 | }); 140 | } 141 | }, 142 | destroy: function destroy() { 143 | var formList = [].slice.call(document.querySelectorAll(Selector.FORM)).filter(function (form) { 144 | return !!form.bsCustomFileInput; 145 | }); 146 | var customFileInputList = [].slice.call(document.querySelectorAll(Selector.INPUT)).filter(function (input) { 147 | return !!input.bsCustomFileInput; 148 | }); 149 | 150 | for (var i = 0, len = customFileInputList.length; i < len; i++) { 151 | var input = customFileInputList[i]; 152 | restoreDefaultText(input); 153 | input[customProperty] = undefined; 154 | input.removeEventListener(Event.INPUTCHANGE, handleInputChange); 155 | } 156 | 157 | for (var _i2 = 0, _len2 = formList.length; _i2 < _len2; _i2++) { 158 | formList[_i2].removeEventListener(Event.FORMRESET, handleFormReset); 159 | 160 | formList[_i2][customProperty] = undefined; 161 | } 162 | } 163 | }; 164 | 165 | return bsCustomFileInput; 166 | 167 | })); 168 | //# sourceMappingURL=bs-custom-file-input.js.map 169 | 170 | document.addEventListener("DOMContentLoaded", function () { 171 | 172 | bsCustomFileInput.init() 173 | }); 174 | -------------------------------------------------------------------------------- /customer/static/customer/js/modules/default-file-input.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | (function ($) { 4 | $('.input-default-wrapper').on('change', '.input-default-js', function (e) { 5 | 6 | var $this = $(e.target), 7 | $label = $this.next('label'), 8 | $files = $this[0].files; 9 | var fileName = ''; 10 | 11 | if ($files && $files.length > 1) { 12 | fileName = ($this.attr('data-multiple-target') || '').replace('{target}', $files.length); 13 | } else if (e.target.value) { 14 | fileName = e.target.value.split('\\').pop(); 15 | } 16 | fileName ? $label.find('.span-choose-file').html(fileName) : $label.html($label.html()); 17 | }); 18 | })(jQuery); -------------------------------------------------------------------------------- /customer/static/customer/js/modules/enhanced-modals.js: -------------------------------------------------------------------------------- 1 | /* 2 | Enhanced Bootstrap Modals 3 | https://mdbootstrap.com 4 | office@mdbootstrap.com 5 | */ 6 | 7 | (function($){ 8 | $('body').on('shown.bs.modal', '.modal', function() { 9 | if(!$('.modal-backdrop').length) { 10 | 11 | $modal_dialog = $(this).children('.modal-dialog') 12 | 13 | if($modal_dialog.hasClass('modal-side')) { 14 | $(this).addClass('modal-scrolling'); 15 | $('body').addClass('scrollable'); 16 | } 17 | 18 | if($modal_dialog.hasClass('modal-frame')) { 19 | $(this).addClass('modal-content-clickable'); 20 | $('body').addClass('scrollable'); 21 | } 22 | } 23 | }); 24 | $('body').on('hidden.bs.modal', '.modal', function() { 25 | $('body').removeClass('scrollable'); 26 | }); 27 | })(jQuery); 28 | -------------------------------------------------------------------------------- /customer/static/customer/js/modules/forms-free.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | var _this = void 0; 4 | 5 | (function ($) { 6 | var inputSelector = "".concat(['text', 'password', 'email', 'url', 'tel', 'number', 'search', 'search-md'].map(function (selector) { 7 | return "input[type=".concat(selector, "]"); 8 | }).join(', '), ", textarea"); 9 | var textAreaSelector = '.materialize-textarea'; 10 | 11 | var updateTextFields = function updateTextFields($input) { 12 | var $labelAndIcon = $input.siblings('label, i'); 13 | var hasValue = $input.val().length; 14 | var hasPlaceholder = $input.attr('placeholder'); 15 | var addOrRemove = "".concat(hasValue || hasPlaceholder ? 'add' : 'remove', "Class"); 16 | $labelAndIcon[addOrRemove]('active'); 17 | }; 18 | 19 | var validateField = function validateField($input) { 20 | if ($input.hasClass('validate')) { 21 | var value = $input.val(); 22 | var noValue = !value.length; 23 | var isValid = !$input[0].validity.badInput; 24 | 25 | if (noValue && isValid) { 26 | $input.removeClass('valid').removeClass('invalid'); 27 | } else { 28 | var valid = $input.is(':valid'); 29 | var length = Number($input.attr('length')) || 0; 30 | 31 | if (valid && (!length || length > value.length)) { 32 | $input.removeClass('invalid').addClass('valid'); 33 | } else { 34 | $input.removeClass('valid').addClass('invalid'); 35 | } 36 | } 37 | } 38 | }; 39 | 40 | var textAreaAutoResize = function textAreaAutoResize() { 41 | var $textarea = $(_this); 42 | 43 | if ($textarea.val().length) { 44 | var $hiddenDiv = $('.hiddendiv'); 45 | var fontFamily = $textarea.css('font-family'); 46 | var fontSize = $textarea.css('font-size'); 47 | 48 | if (fontSize) { 49 | $hiddenDiv.css('font-size', fontSize); 50 | } 51 | 52 | if (fontFamily) { 53 | $hiddenDiv.css('font-family', fontFamily); 54 | } 55 | 56 | if ($textarea.attr('wrap') === 'off') { 57 | $hiddenDiv.css('overflow-wrap', 'normal').css('white-space', 'pre'); 58 | } 59 | 60 | $hiddenDiv.text("".concat($textarea.val(), "\n")); 61 | var content = $hiddenDiv.html().replace(/\n/g, '
'); 62 | $hiddenDiv.html(content); // When textarea is hidden, width goes crazy. 63 | // Approximate with half of window size 64 | 65 | $hiddenDiv.css('width', $textarea.is(':visible') ? $textarea.width() : $(window).width() / 2); 66 | $textarea.css('height', $hiddenDiv.height()); 67 | } 68 | }; 69 | 70 | $(inputSelector).each(function (index, input) { 71 | var $this = $(input); 72 | var $labelAndIcon = $this.siblings('label, i'); 73 | updateTextFields($this); 74 | var isValid = input.validity.badInput; 75 | 76 | if (isValid) { 77 | $labelAndIcon.addClass('active'); 78 | } 79 | }); 80 | $(document).on('focus', inputSelector, function (e) { 81 | $(e.target).siblings('label, i').addClass('active'); 82 | }); 83 | $(document).on('blur', inputSelector, function (e) { 84 | var $this = $(e.target); 85 | var noValue = !$this.val(); 86 | var invalid = !e.target.validity.badInput; 87 | var noPlaceholder = $this.attr('placeholder') === undefined; 88 | 89 | if (noValue && invalid && noPlaceholder) { 90 | $this.siblings('label, i').removeClass('active'); 91 | } 92 | 93 | validateField($this); 94 | }); 95 | $(document).on('change', inputSelector, function (e) { 96 | var $this = $(e.target); 97 | updateTextFields($this); 98 | validateField($this); 99 | }); 100 | $('input[autofocus]').siblings('label, i').addClass('active'); 101 | $(document).on('reset', function (e) { 102 | var $formReset = $(e.target); 103 | 104 | if ($formReset.is('form')) { 105 | var $formInputs = $formReset.find(inputSelector); 106 | $formInputs.removeClass('valid').removeClass('invalid').each(function (index, input) { 107 | var $this = $(input); 108 | var noDefaultValue = !$this.val(); 109 | var noPlaceholder = !$this.attr('placeholder'); 110 | 111 | if (noDefaultValue && noPlaceholder) { 112 | $this.siblings('label, i').removeClass('active'); 113 | } 114 | }); 115 | $formReset.find('select.initialized').each(function (index, select) { 116 | var $select = $(select); 117 | var $visibleInput = $select.siblings('input.select-dropdown'); 118 | var defaultValue = $select.children('[selected]').val(); 119 | $select.val(defaultValue); 120 | $visibleInput.val(defaultValue); 121 | }); 122 | } 123 | }); 124 | 125 | function init() { 126 | var $text = $('.md-textarea-auto'); 127 | 128 | if ($text.length) { 129 | var observe; 130 | 131 | if (window.attachEvent) { 132 | observe = function observe(element, event, handler) { 133 | element.attachEvent("on".concat(event), handler); 134 | }; 135 | } else { 136 | observe = function observe(element, event, handler) { 137 | element.addEventListener(event, handler, false); 138 | }; 139 | } 140 | 141 | $text.each(function () { 142 | var self = this; 143 | 144 | function resize() { 145 | self.style.height = 'auto'; 146 | self.style.height = "".concat(self.scrollHeight, "px"); 147 | } 148 | 149 | function delayedResize() { 150 | window.setTimeout(resize, 0); 151 | } 152 | 153 | observe(self, 'change', resize); 154 | observe(self, 'cut', delayedResize); 155 | observe(self, 'paste', delayedResize); 156 | observe(self, 'drop', delayedResize); 157 | observe(self, 'keydown', delayedResize); 158 | resize(); 159 | }); 160 | } 161 | } 162 | 163 | init(); 164 | var $body = $('body'); 165 | 166 | if (!$('.hiddendiv').first().length) { 167 | var $hiddenDiv = $('
'); 168 | $body.append($hiddenDiv); 169 | } 170 | 171 | $(textAreaSelector).each(textAreaAutoResize); 172 | $body.on('keyup keydown', textAreaSelector, textAreaAutoResize); 173 | })(jQuery); -------------------------------------------------------------------------------- /customer/static/customer/js/modules/scrolling-navbar.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | (function ($) { 4 | var SCROLLING_NAVBAR_OFFSET_TOP = 50; 5 | $(window).on('scroll', function () { 6 | var $navbar = $('.navbar'); 7 | 8 | if ($navbar.length) { 9 | if ($navbar.offset().top > SCROLLING_NAVBAR_OFFSET_TOP) { 10 | $('.scrolling-navbar').addClass('top-nav-collapse'); 11 | } else { 12 | $('.scrolling-navbar').removeClass('top-nav-collapse'); 13 | } 14 | } 15 | }); 16 | })(jQuery); -------------------------------------------------------------------------------- /customer/static/customer/js/modules/treeview.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | (function ($) { 4 | $.fn.mdbTreeview = function () { 5 | var $this = $(this); 6 | 7 | if ($this.hasClass('treeview')) { 8 | var $toggler = $this.find('.rotate'); 9 | $.each($toggler, function (e) { 10 | $($toggler[e]).off('click'); 11 | $($toggler[e]).on('click', function () { 12 | var $this = $(this); 13 | $this.siblings('.nested').toggleClass('active'); 14 | $this.toggleClass('down'); 15 | }); 16 | }); 17 | } 18 | 19 | if ($this.hasClass('treeview-animated')) { 20 | var $elements = $this.find('.treeview-animated-element'); 21 | var $closed = $this.find('.closed'); 22 | $this.find('.nested').hide(); 23 | $closed.off('click'); 24 | $closed.on('click', function () { 25 | var $this = $(this); 26 | var $target = $this.siblings('.nested'); 27 | var $pointer = $this.children('.fa-angle-right'); 28 | $this.toggleClass('open'); 29 | $pointer.toggleClass('down'); 30 | !$target.hasClass('active') ? $target.addClass('active').slideDown() : $target.removeClass('active').slideUp(); 31 | return false; 32 | }); 33 | $elements.off('click'); 34 | $elements.on('click', function () { 35 | var $this = $(this); 36 | $this.hasClass('opened') ? $this.removeClass('opened') : ($elements.removeClass('opened'), $this.addClass('opened')); 37 | }); 38 | } 39 | 40 | if ($this.hasClass('treeview-colorful')) { 41 | var _$elements = $this.find('.treeview-colorful-element'); 42 | 43 | var $header = $this.find('.treeview-colorful-items-header'); 44 | $this.find('.nested').hide(); 45 | $header.off('click'); 46 | $header.on('click', function () { 47 | var $this = $(this); 48 | var $target = $this.siblings('.nested'); 49 | var $pointerPlus = $this.children('.fa-plus-circle'); 50 | var $pointerMinus = $this.children('.fa-minus-circle'); 51 | $this.toggleClass('open'); 52 | $pointerPlus.removeClass('fa-plus-circle'); 53 | $pointerPlus.addClass('fa-minus-circle'); 54 | $pointerMinus.removeClass('fa-minus-circle'); 55 | $pointerMinus.addClass('fa-plus-circle'); 56 | !$target.hasClass('active') ? $target.addClass('active').slideDown() : $target.removeClass('active').slideUp(); 57 | }); 58 | 59 | _$elements.off('click'); 60 | 61 | _$elements.on('click', function () { 62 | var $this = $(this); 63 | $this.hasClass('opened') ? _$elements.removeClass('opened') : (_$elements.removeClass('opened'), $this.addClass('opened')); 64 | }); 65 | } 66 | }; 67 | })(jQuery); -------------------------------------------------------------------------------- /customer/static/customer/js/modules/wow.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var WOW; 4 | 5 | (function ($) { 6 | 7 | WOW = function WOW() { 8 | 9 | return { 10 | 11 | init: function init() { 12 | 13 | var animationName = []; 14 | 15 | var once = 1; 16 | 17 | function mdbWow() { 18 | 19 | var windowHeight = window.innerHeight; 20 | var scroll = window.scrollY; 21 | 22 | $('.wow').each(function () { 23 | 24 | if ($(this).css('visibility') == 'visible') { 25 | return; 26 | } 27 | 28 | if (windowHeight + scroll - 100 > getOffset(this) && scroll < getOffset(this) || windowHeight + scroll - 100 > getOffset(this) + $(this).height() && scroll < getOffset(this) + $(this).height() || windowHeight + scroll == $(document).height() && getOffset(this) + 100 > $(document).height()) { 29 | 30 | var index = $(this).index('.wow'); 31 | 32 | var delay = $(this).attr('data-wow-delay'); 33 | 34 | if (delay) { 35 | 36 | delay = $(this).attr('data-wow-delay').slice(0, -1 37 | 38 | ); 39 | var self = this; 40 | 41 | var timeout = parseFloat(delay) * 1000; 42 | 43 | $(self).addClass('animated'); 44 | $(self).css({ 45 | 'visibility': 'visible' 46 | }); 47 | $(self).css({ 48 | 'animation-delay': delay 49 | }); 50 | $(self).css({ 51 | 'animation-name': animationName[index] 52 | }); 53 | 54 | var removeTime = $(this).css('animation-duration').slice(0, -1) * 1000; 55 | 56 | if ($(this).attr('data-wow-delay')) { 57 | 58 | removeTime += $(this).attr('data-wow-delay').slice(0, -1) * 1000; 59 | } 60 | 61 | var self = this; 62 | 63 | setTimeout(function () { 64 | 65 | $(self).removeClass('animated'); 66 | }, removeTime); 67 | } else { 68 | 69 | $(this).addClass('animated'); 70 | $(this).css({ 71 | 'visibility': 'visible' 72 | }); 73 | $(this).css({ 74 | 'animation-name': animationName[index] 75 | }); 76 | 77 | var removeTime = $(this).css('animation-duration').slice(0, -1) * 1000; 78 | 79 | var self = this; 80 | 81 | setTimeout(function () { 82 | 83 | $(self).removeClass('animated'); 84 | }, removeTime); 85 | } 86 | } 87 | }); 88 | } 89 | 90 | function appear() { 91 | 92 | $('.wow').each(function () { 93 | 94 | var index = $(this).index('.wow'); 95 | 96 | var delay = $(this).attr('data-wow-delay'); 97 | 98 | if (delay) { 99 | 100 | delay = $(this).attr('data-wow-delay').slice(0, -1); 101 | 102 | var timeout = parseFloat(delay) * 1000; 103 | 104 | $(this).addClass('animated'); 105 | $(this).css({ 106 | 'visibility': 'visible' 107 | }); 108 | $(this).css({ 109 | 'animation-delay': delay + 's' 110 | }); 111 | $(this).css({ 112 | 'animation-name': animationName[index] 113 | }); 114 | } else { 115 | 116 | $(this).addClass('animated'); 117 | $(this).css({ 118 | 'visibility': 'visible' 119 | }); 120 | $(this).css({ 121 | 'animation-name': animationName[index] 122 | }); 123 | } 124 | }); 125 | } 126 | 127 | function hide() { 128 | 129 | var windowHeight = window.innerHeight; 130 | var scroll = window.scrollY; 131 | 132 | $('.wow.animated').each(function () { 133 | 134 | if (windowHeight + scroll - 100 > getOffset(this) && scroll > getOffset(this) + 100 || windowHeight + scroll - 100 < getOffset(this) && scroll < getOffset(this) + 100 || getOffset(this) + $(this).height > $(document).height() - 100) { 135 | 136 | $(this).removeClass('animated'); 137 | $(this).css({ 138 | 'animation-name': 'none' 139 | }); 140 | $(this).css({ 141 | 'visibility': 'hidden' 142 | }); 143 | } else { 144 | 145 | var removeTime = $(this).css('animation-duration').slice(0, -1) * 1000; 146 | 147 | if ($(this).attr('data-wow-delay')) { 148 | 149 | removeTime += $(this).attr('data-wow-delay').slice(0, -1) * 1000; 150 | } 151 | 152 | var self = this; 153 | 154 | setTimeout(function () { 155 | 156 | $(self).removeClass('animated'); 157 | }, removeTime); 158 | } 159 | }); 160 | 161 | mdbWow(); 162 | 163 | once--; 164 | } 165 | 166 | function getOffset(elem) { 167 | 168 | var box = elem.getBoundingClientRect(); 169 | 170 | var body = document.body; 171 | var docEl = document.documentElement; 172 | 173 | var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop; 174 | 175 | var clientTop = docEl.clientTop || body.clientTop || 0; 176 | 177 | var top = box.top + scrollTop - clientTop; 178 | 179 | return Math.round(top); 180 | } 181 | 182 | $('.wow').each(function () { 183 | 184 | $(this).css({ 185 | 'visibility': 'hidden' 186 | }); 187 | animationName[$(this).index('.wow')] = $(this).css('animation-name'); 188 | $(this).css({ 189 | 'animation-name': 'none' 190 | }); 191 | }); 192 | 193 | $(window).scroll(function () { 194 | 195 | if (once) { 196 | 197 | hide(); 198 | } else { 199 | 200 | mdbWow(); 201 | } 202 | }); 203 | 204 | appear(); 205 | } 206 | }; 207 | }; 208 | })(jQuery); 209 | -------------------------------------------------------------------------------- /customer/static/customer/scss/_custom-skin.scss: -------------------------------------------------------------------------------- 1 | // Your custom skin 2 | // Skins 3 | $skins: () !default; 4 | $skins: map-merge(( 5 | "test": ( 6 | "skin-primary-color": #fff, 7 | "skin-navbar": #fff, 8 | "skin-footer-color": #fff, 9 | "skin-flat": #fff, 10 | "skin-accent": #fff, 11 | "skin-sidenav-item": #fff, 12 | "skin-sidenav-item-hover": #fff, 13 | "skin-gradient-start": #fff, 14 | "skin-gradient-end": #fff, 15 | "skin-mask-slight": #fff, 16 | "skin-mask-light": #fff, 17 | "skin-mask-strong": #fff, 18 | "skin-sn-child": #fff, 19 | "skin-btn-primary": #fff, 20 | "skin-btn-secondary": #fff, 21 | "skin-btn-default": #fff, 22 | "skin-text": #fff 23 | ) 24 | ), $skins); 25 | 26 | -------------------------------------------------------------------------------- /customer/static/customer/scss/_custom-styles.scss: -------------------------------------------------------------------------------- 1 | // Your custom styles 2 | -------------------------------------------------------------------------------- /customer/static/customer/scss/_custom-variables.scss: -------------------------------------------------------------------------------- 1 | // Your custom variables 2 | -------------------------------------------------------------------------------- /customer/static/customer/scss/addons/_datatables-select.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * MDBootstrap integration with Datatables 3 | * Learn more: https://mdbootstrap.com/docs/jquery/tables/datatables/ 4 | * About MDBootstrap: https://mdbootstrap.com/ 5 | * 6 | * This combined file was created taking that code from this webstie: 7 | * https://cdn.datatables.net/select/1.2.7/css/select.dataTables.min.css 8 | * 9 | * 10 | * To rebuild or modify this file with the latest versions of the included 11 | * software please visit: 12 | * https://datatables.net/download/#bs4/dt-1.10.18 13 | * 14 | * Included libraries: 15 | * DataTables 1.10.18 16 | */ 17 | 18 | table { 19 | &.dataTable { 20 | tbody > tr { 21 | &.selected, 22 | > .selected { 23 | background-color: #b0bed9; 24 | } 25 | } 26 | &.stripe, &.display { 27 | tbody > tr.odd { 28 | &.selected, 29 | > .selected { 30 | background-color: #acbad4; 31 | } 32 | } 33 | } 34 | &.hover, &.display { 35 | tbody > tr { 36 | &.selected:hover, 37 | > .selected:hover { 38 | background-color: #aab7d1; 39 | } 40 | } 41 | } 42 | &.order-column, &.display { 43 | tbody > tr { 44 | &.selected > { 45 | .sorting_1, .sorting_2, .sorting_3 { 46 | background-color: #acbad5; 47 | } 48 | } 49 | > .selected { 50 | background-color: #acbad5; 51 | } 52 | } 53 | } 54 | &.display, &.order-column.stripe { 55 | tbody > tr { 56 | &.odd.selected > .sorting_1 { 57 | background-color: #a6b4cd; 58 | } 59 | } 60 | } 61 | &.display tbody > tr.odd.selected > .sorting_2, &.order-column.stripe tbody > tr.odd.selected > .sorting_2 { 62 | background-color: #a8b5cf; 63 | } 64 | &.display tbody > tr.odd.selected > .sorting_3, &.order-column.stripe tbody > tr.odd.selected > .sorting_3 { 65 | background-color: #a9b7d1; 66 | } 67 | &.display tbody > tr.even.selected > .sorting_1, &.order-column.stripe tbody > tr.even.selected > .sorting_1 { 68 | background-color: #acbad5; 69 | } 70 | &.display tbody > tr.even.selected > .sorting_2, &.order-column.stripe tbody > tr.even.selected > .sorting_2 { 71 | background-color: #aebcd6; 72 | } 73 | &.display tbody > tr.even.selected > .sorting_3, &.order-column.stripe tbody > tr.even.selected > .sorting_3 { 74 | background-color: #afbdd8; 75 | } 76 | &.display tbody > tr.odd > .selected, &.order-column.stripe tbody > tr.odd > .selected { 77 | background-color: #a6b4cd; 78 | } 79 | &.display tbody > tr.even > .selected, &.order-column.stripe tbody > tr.even > .selected { 80 | background-color: #acbad5; 81 | } 82 | &.display tbody > tr.selected:hover > .sorting_1, &.order-column.hover tbody > tr.selected:hover > .sorting_1 { 83 | background-color: #a2aec7; 84 | } 85 | &.display tbody > tr.selected:hover > .sorting_2, &.order-column.hover tbody > tr.selected:hover > .sorting_2 { 86 | background-color: #a3b0c9; 87 | } 88 | &.display tbody > tr.selected:hover > .sorting_3, &.order-column.hover tbody > tr.selected:hover > .sorting_3 { 89 | background-color: #a5b2cb; 90 | } 91 | &.display, &.order-column.hover { 92 | tbody > tr { 93 | &:hover > .selected, > .selected:hover { 94 | background-color: #a2aec7; 95 | } 96 | } 97 | } 98 | tbody { 99 | td, th { 100 | &.select-checkbox { 101 | position: relative; 102 | &:before, 103 | &:after { 104 | position: absolute; 105 | top: 1.2em; 106 | left: 50%; 107 | box-sizing: border-box; 108 | display: block; 109 | width: 12px; 110 | height: 12px; 111 | } 112 | } 113 | } 114 | td.select-checkbox:before, 115 | th.select-checkbox:before { 116 | margin-top: 4px; 117 | margin-left: -6px; 118 | content: " "; 119 | border: 1px solid #000; 120 | border-radius: 3px; 121 | } 122 | } 123 | tr.selected { 124 | td.select-checkbox:after, 125 | th.select-checkbox:after { 126 | margin-top: 0; 127 | margin-left: -4px; 128 | text-align: center; 129 | text-shadow: 1px 1px #b0bed9, -1px -1px #b0bed9, 1px -1px #b0bed9, -1px 1px #b0bed9; 130 | content: "\2714"; 131 | } 132 | } 133 | } 134 | } 135 | 136 | div.dataTables_wrapper span { 137 | &.select-info, &.select-item { 138 | margin-left: .5em; 139 | } 140 | } 141 | 142 | @media screen and (max-width: 640px) { 143 | div.dataTables_wrapper span { 144 | &.select-info, &.select-item { 145 | display: block; 146 | margin-left: 0; 147 | } 148 | } 149 | } 150 | -------------------------------------------------------------------------------- /customer/static/customer/scss/addons/_datatables.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * MDBootstrap integration with Datatables 3 | * Learn more: https://mdbootstrap.com/docs/jquery/tables/datatables/ 4 | * About MDBootstrap: https://mdbootstrap.com/ 5 | * 6 | * This combined file was created by the DataTables downloader builder: 7 | * https://datatables.net/download 8 | * 9 | * To rebuild or modify this file with the latest versions of the included 10 | * software please visit: 11 | * https://datatables.net/download/#bs4/dt-1.10.18 12 | * 13 | * Included libraries: 14 | * DataTables 1.10.18 15 | */ 16 | 17 | div.dataTables_wrapper div { 18 | &.dataTables_length { 19 | select, input { 20 | width: auto; 21 | } 22 | &.d-flex.flex-row { 23 | label { 24 | margin-top: 1.2rem; 25 | margin-right: 1rem; 26 | } 27 | .select-wrapper.mdb-select { 28 | span, .select-dropdown { 29 | margin-top: 1rem; 30 | } 31 | } 32 | } 33 | } 34 | &.dataTables_length, 35 | &.dataTables_filter { 36 | label { 37 | padding-top: .5rem; 38 | padding-bottom: .5rem; 39 | font-weight: 400; 40 | text-align: left; 41 | } 42 | } 43 | &.dataTables_filter { 44 | select, 45 | input { 46 | width: auto; 47 | } 48 | input { 49 | display: inline-block; 50 | margin-left: .5rem; 51 | } 52 | text-align: right; 53 | } 54 | &.dataTables_info, 55 | &.dataTables_paginate { 56 | padding-top: 1rem; 57 | padding-bottom: 1rem; 58 | font-weight: 400; 59 | } 60 | &.dataTables_paginate { 61 | margin: 0; 62 | text-align: right; 63 | ul.pagination { 64 | -ms-flex-pack: end; 65 | -webkit-justify-content: flex-end; 66 | justify-content: flex-end; 67 | -webkit-box-pack: end; 68 | .page-item { 69 | &.active .page-link:focus { 70 | background-color: #4285f4; 71 | } 72 | .page-link:focus { 73 | -webkit-box-shadow: none; 74 | box-shadow: none; 75 | } 76 | } 77 | } 78 | } 79 | } 80 | 81 | @media (max-width: 767px) { 82 | div.dataTables_wrapper div { 83 | .dataTables_length, .dataTables_filter, .dataTables_info, .dataTables_paginate ul.pagination { 84 | -ms-flex-pack: center; 85 | -webkit-justify-content: center; 86 | justify-content: center; 87 | text-align: center; 88 | -webkit-box-pack: center; 89 | } 90 | } 91 | } 92 | 93 | .bs-select select { 94 | display: inline-block !important; 95 | } 96 | 97 | table.dataTable thead { 98 | cursor: pointer; 99 | > tr > { 100 | th, 101 | td { 102 | &.sorting_asc, &.sorting_desc, &.sorting { 103 | padding-right: 30px; 104 | } 105 | } 106 | th:active, td:active { 107 | outline: none; 108 | } 109 | } 110 | .sorting, 111 | .sorting_asc, 112 | .sorting_desc, 113 | .sorting_asc_disabled, 114 | .sorting_desc_disabled { 115 | position: relative; 116 | cursor: pointer; 117 | &:before, &:after { 118 | position: absolute; 119 | bottom: .9em; 120 | display: block; 121 | opacity: .3; 122 | } 123 | } 124 | .sorting:before, .sorting_asc:before, .sorting_desc:before, .sorting_asc_disabled:before, .sorting_desc_disabled:before { 125 | right: 1em; 126 | font-family: "Font Awesome\ 5 Free", sans-serif; 127 | font-size: 1rem; 128 | font-weight: 900; 129 | content: "\f0de"; 130 | } 131 | .sorting:after, .sorting_asc:after, .sorting_desc:after, .sorting_asc_disabled:after, .sorting_desc_disabled:after { 132 | right: 16px; 133 | font-family: "Font Awesome\ 5 Free", sans-serif; 134 | font-size: 1rem; 135 | font-weight: 900; 136 | content: "\f0dd"; 137 | } 138 | .sorting_asc:before, .sorting_desc:after { 139 | opacity: 1; 140 | } 141 | .sorting_asc_disabled:before, .sorting_desc_disabled:after { 142 | opacity: 0; 143 | } 144 | } 145 | -------------------------------------------------------------------------------- /customer/static/customer/scss/addons/_directives.scss: -------------------------------------------------------------------------------- 1 | // Optional directives 2 | @each $key in (0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100) { 3 | .opacity-#{$key} { 4 | opacity: $key * .01; 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /customer/static/customer/scss/addons/_hierarchical-display.scss: -------------------------------------------------------------------------------- 1 | .zmd-hierarchical-display { 2 | visibility: hidden; 3 | &.in { 4 | visibility: visible; 5 | } 6 | } 7 | .zmd-hierarchical-displaying { 8 | visibility: visible; 9 | } 10 | 11 | .animation { 12 | animation-duration: 1s; 13 | animation-fill-mode: both; 14 | } 15 | 16 | .animation.zoomedIn, 17 | .animation.zoomedOut { 18 | animation-timing-function: cubic-bezier(.55, 0, .1, 1); // "Swift Out" easing curve 19 | } 20 | 21 | @keyframes zoomedIn { 22 | from { 23 | transform: scale(0); 24 | } 25 | to { 26 | transform: scale(1); 27 | } 28 | } 29 | 30 | @keyframes zoomedOut { 31 | from { 32 | transform: scale(1); 33 | } 34 | to { 35 | transform: scale(0); 36 | } 37 | } 38 | 39 | .zoomedIn { 40 | animation-name: zoomedIn; 41 | } 42 | 43 | .zoomedOut { 44 | animation-name: zoomedOut; 45 | } 46 | 47 | -------------------------------------------------------------------------------- /customer/static/customer/scss/addons/_rating.scss: -------------------------------------------------------------------------------- 1 | .mdb-rating { 2 | 3 | .rate-popover { 4 | color: #808080; 5 | } 6 | 7 | .live { 8 | color: #000; 9 | } 10 | 11 | .oneStar { 12 | color: #44370f; 13 | } 14 | 15 | .twoStars { 16 | color: #96781e; 17 | } 18 | 19 | .threeStars { 20 | color: #e2b52e; 21 | } 22 | 23 | .fourStars { 24 | color: #f1ba12; 25 | } 26 | 27 | .fiveStars { 28 | color: #f3cb06; 29 | } 30 | 31 | .amber-text { 32 | color: #ffc107; 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /customer/static/customer/scss/core/_global.scss: -------------------------------------------------------------------------------- 1 | // Globals 2 | // Full palette of colors 3 | @each $color_name, $color in $mdb-colors-1 { 4 | @each $color_type, $color_value in $color { 5 | @if $color_type == "base" { 6 | .#{$color_name} { 7 | background-color: $color_value !important; 8 | } 9 | .#{$color_name}-text { 10 | color: $color-value !important; 11 | } 12 | .rgba-#{$color_name}-slight, 13 | .rgba-#{$color_name}-slight:after { 14 | background-color: rgba($color_value, .1); 15 | } 16 | .rgba-#{$color_name}-light, 17 | .rgba-#{$color_name}-light:after { 18 | background-color: rgba($color_value, .3); 19 | } 20 | .rgba-#{$color_name}-strong, 21 | .rgba-#{$color_name}-strong:after { 22 | background-color: rgba($color_value, .7); 23 | } 24 | } 25 | @else { 26 | @if $enable_full_palette { 27 | .#{$color_name}.#{$color_type} { 28 | background-color: $color_value !important; 29 | } 30 | } 31 | } 32 | } 33 | } 34 | 35 | // Stylish color 36 | @each $color_name, $color_value in $stylish-rgba { 37 | .#{$color_name} { 38 | background-color: $color_value; 39 | } 40 | } 41 | 42 | // Material colors palette 43 | @each $color_name, $color in $material-colors { 44 | .#{$color_name} { 45 | background-color: $color !important; 46 | } 47 | } 48 | 49 | // Basic gradients 50 | @each $name, $val in $gradients { 51 | @include make-gradient($name, $val); 52 | } 53 | @each $name, $val in $gradients-rgba { 54 | @include make-gradient-rgba($name, $val); 55 | } 56 | 57 | .dark-grey-text { 58 | color: #4f4f4f !important; 59 | &:hover, 60 | &:focus { 61 | color: #4f4f4f !important; 62 | } 63 | } 64 | 65 | // Shadow on hover 66 | .hoverable { 67 | box-shadow: none; 68 | transition: $transition-hoverable; 69 | &:hover { 70 | box-shadow: $z-depth-2; 71 | transition: $transition-hoverable; 72 | } 73 | } 74 | 75 | // Shadows 76 | .z-depth-0 { 77 | box-shadow: none !important; 78 | } 79 | .z-depth-1 { 80 | box-shadow: $z-depth-1 !important; 81 | } 82 | .z-depth-1-half { 83 | box-shadow: $z-depth-1-half !important; 84 | } 85 | .z-depth-2 { 86 | box-shadow: $z-depth-2 !important; 87 | } 88 | .z-depth-3 { 89 | box-shadow: $z-depth-3 !important; 90 | } 91 | .z-depth-4 { 92 | box-shadow: $z-depth-4 !important; 93 | } 94 | .z-depth-5 { 95 | box-shadow: $z-depth-5 !important; 96 | } 97 | 98 | // Disabled cursor 99 | .disabled, 100 | :disabled { 101 | pointer-events: none !important; 102 | } 103 | 104 | // Links 105 | a { 106 | color: $link-color; 107 | text-decoration: none; 108 | cursor: pointer; 109 | transition: $transition-basic; 110 | &:hover { 111 | color: $link-hover-color; 112 | text-decoration: none; 113 | transition: $transition-basic; 114 | } 115 | &.disabled, 116 | &:disabled { 117 | &:hover { 118 | color: $link-color; 119 | } 120 | } 121 | } 122 | 123 | a:not([href]):not([tabindex]), a:not([href]):not([tabindex]):focus, a:not([href]):not([tabindex]):hover { 124 | color: inherit; 125 | text-decoration: none; 126 | } 127 | 128 | // Divider 129 | .divider-new { 130 | display: flex; 131 | flex-direction: row; 132 | align-items: center; 133 | justify-content: center; 134 | margin-top: $divider-margin-y; 135 | margin-bottom: $divider-margin-y; 136 | > h1, h2, h3, h4, h5, h6 { 137 | margin-bottom: 0; 138 | } 139 | &:before, 140 | &:after { 141 | flex: 1; 142 | height: 1.5px; 143 | height: $divider-height; 144 | content: ""; 145 | background: #c6c6c6; 146 | } 147 | &:before { 148 | margin: 0 $divider-margin-x 0 0; 149 | } 150 | &:after { 151 | margin: 0 0 0 $divider-margin-x; 152 | } 153 | } 154 | -------------------------------------------------------------------------------- /customer/static/customer/scss/core/_helpers.scss: -------------------------------------------------------------------------------- 1 | // Helpers 2 | // MDB helpers 3 | .img-fluid, 4 | .video-fluid { 5 | max-width: 100%; 6 | height: auto; 7 | } 8 | 9 | .flex-center { 10 | display: flex; 11 | align-items: center; 12 | justify-content: center; 13 | height: 100%; 14 | 15 | p { 16 | margin: 0; 17 | } 18 | 19 | ul { 20 | text-align: center; 21 | 22 | li { 23 | margin-bottom: $flex-center-ul-mb; 24 | 25 | &:last-of-type { 26 | margin-bottom: 0; 27 | } 28 | } 29 | } 30 | } 31 | 32 | .hr-light { 33 | border-top: 1px solid $hr-light; 34 | } 35 | 36 | .hr-dark { 37 | border-top: 1px solid $hr-dark; 38 | } 39 | 40 | // Responsive width 41 | .w-responsive { 42 | width: 75%; 43 | 44 | @media (max-width: 740px) { 45 | width: 100%; 46 | } 47 | } 48 | 49 | // Collapsible body 50 | .collapsible-body { 51 | display: none; 52 | } 53 | 54 | .jumbotron { 55 | background-color: $white-base; 56 | border-radius: $border-radius-base; 57 | box-shadow: $z-depth-1; 58 | } 59 | 60 | @each $name, 61 | $color in $basic-mdb-colors { 62 | @include bg-variant(".bg-#{$name}", $color); 63 | 64 | .border-#{$name} { 65 | border-color: $color !important; 66 | } 67 | } 68 | 69 | .card-img-100 { 70 | width: 100px; 71 | height: 100px; 72 | } 73 | 74 | .card-img-64 { 75 | width: 64px; 76 | height: 64px; 77 | } 78 | 79 | .mml-1 { 80 | margin-left: - .25rem !important; 81 | } 82 | 83 | .flex-1 { 84 | flex: 1; 85 | } 86 | -------------------------------------------------------------------------------- /customer/static/customer/scss/core/_masks.scss: -------------------------------------------------------------------------------- 1 | // Masks 2 | // General properties 3 | .view { 4 | position: relative; 5 | overflow: hidden; 6 | cursor: default; 7 | .mask { 8 | position: absolute; 9 | top: 0; 10 | right: 0; 11 | bottom: 0; 12 | left: 0; 13 | width: 100%; 14 | height: 100%; 15 | overflow: hidden; 16 | background-attachment: fixed; 17 | } 18 | img, video { 19 | position: relative; 20 | display: block; 21 | } 22 | video { 23 | &.video-intro { 24 | top: 50%; 25 | left: 50%; 26 | z-index: -100; 27 | width: auto; 28 | min-width: 100%; 29 | height: auto; 30 | min-height: 100%; 31 | transition: $intro-video-transition opacity; 32 | transform: $intro-video-transform; 33 | } 34 | } 35 | } 36 | 37 | // Overlay 38 | .overlay { 39 | .mask { 40 | opacity: 0; 41 | transition: $mask-overlay-transition; 42 | &:hover { 43 | opacity: 1; 44 | } 45 | } 46 | } 47 | 48 | // Zoom 49 | .zoom { 50 | img, video { 51 | transition: $mask-zoom-transition; 52 | } 53 | &:hover { 54 | img, video { 55 | transform: $mask-zoom-transform; 56 | } 57 | } 58 | } 59 | 60 | // Patterns 61 | $patterns: ( 62 | 1: "01", 63 | 2: "02", 64 | 3: "03", 65 | 4: "04", 66 | 5: "05", 67 | 6: "06", 68 | 7: "07", 69 | 8: "08", 70 | 9: "09" 71 | ) !default; 72 | 73 | @each $no, $filename in $patterns { 74 | .pattern-#{$no} { 75 | background: url("#{$image-path}/overlays/#{$filename}.png"); 76 | background-attachment: fixed; 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /customer/static/customer/scss/core/_typography.scss: -------------------------------------------------------------------------------- 1 | // Typography 2 | 3 | // Roboto font 4 | @font-face { 5 | font-family: Roboto; 6 | font-weight: 200; 7 | src: local(Roboto Thin), url("#{$roboto-font-path}Roboto-Thin.eot"); 8 | src: url("#{$roboto-font-path}Roboto-Thin.eot?#iefix") format("embedded-opentype"), url("#{$roboto-font-path}Roboto-Thin.woff2") format("woff2"), url("#{$roboto-font-path}Roboto-Thin.woff") format("woff"), url("#{$roboto-font-path}Roboto-Thin.ttf") format("truetype"); 9 | } 10 | 11 | @font-face { 12 | font-family: Roboto; 13 | font-weight: 300; 14 | src: local(Roboto Light), url("#{$roboto-font-path}Roboto-Light.eot"); 15 | src: url("#{$roboto-font-path}Roboto-Light.eot?#iefix") format("embedded-opentype"), url("#{$roboto-font-path}Roboto-Light.woff2") format("woff2"), url("#{$roboto-font-path}Roboto-Light.woff") format("woff"), url("#{$roboto-font-path}Roboto-Light.ttf") format("truetype"); 16 | } 17 | 18 | @font-face { 19 | font-family: Roboto; 20 | font-weight: 400; 21 | src: local(Roboto Regular), url("#{$roboto-font-path}Roboto-Regular.eot"); 22 | src: url("#{$roboto-font-path}Roboto-Regular.eot?#iefix") format("embedded-opentype"), url("#{$roboto-font-path}Roboto-Regular.woff2") format("woff2"), url("#{$roboto-font-path}Roboto-Regular.woff") format("woff"), url("#{$roboto-font-path}Roboto-Regular.ttf") format("truetype"); 23 | } 24 | 25 | @font-face { 26 | font-family: Roboto; 27 | font-weight: 500; 28 | src: url("#{$roboto-font-path}Roboto-Medium.eot"); 29 | src: url("#{$roboto-font-path}Roboto-Medium.eot?#iefix") format("embedded-opentype"), url("#{$roboto-font-path}Roboto-Medium.woff2") format("woff2"), url("#{$roboto-font-path}Roboto-Medium.woff") format("woff"), url("#{$roboto-font-path}Roboto-Medium.ttf") format("truetype"); 30 | } 31 | 32 | @font-face { 33 | font-family: Roboto; 34 | font-weight: 700; 35 | src: url("#{$roboto-font-path}Roboto-Bold.eot"); 36 | src: url("#{$roboto-font-path}Roboto-Bold.eot?#iefix") format("embedded-opentype"), url("#{$roboto-font-path}Roboto-Bold.woff2") format("woff2"), url("#{$roboto-font-path}Roboto-Bold.woff") format("woff"), url("#{$roboto-font-path}Roboto-Bold.ttf") format("truetype"); 37 | } 38 | 39 | // General properties 40 | body { 41 | font-family: $mdb-font-family; 42 | font-weight: $font-weight-light; 43 | } 44 | 45 | h1, h2, h3, h4, h5, h6 { 46 | font-weight: $font-weight-light; 47 | } 48 | 49 | // Blockquote 50 | .blockquote { 51 | padding: $blockquote-padding-y $blockquote-padding-x; 52 | border-left: .25rem solid #eceeef; 53 | &.text-right { 54 | border-right: .25rem solid #eceeef; 55 | border-left: none; 56 | } 57 | .bq-title { 58 | margin-bottom: 0; 59 | font-size: $font-size-large; 60 | font-weight: 400; 61 | } 62 | p { 63 | padding: $blockquote-p-padding-y 0; 64 | font-size: $blockquote-p-font-size; 65 | } 66 | } 67 | 68 | @each $name, $color in $basic { 69 | .bq-#{$name} { 70 | border-left: 3px solid $color !important; 71 | .bq-title { 72 | color: $color !important; 73 | } 74 | } 75 | } 76 | 77 | // Responsive headings 78 | @each $key, $val in $grid-breakpoints { 79 | @include media-breakpoint-up($key) { 80 | $y: map-get($responsive-headings, $key); 81 | @each $name, $value in $y { 82 | .#{$name}-responsive { 83 | font-size: $value; 84 | } 85 | } 86 | } 87 | } 88 | 89 | @each $name, $color in $basic-mdb-colors { 90 | @include text-emphasis-variant(".text-#{$name}", $color); 91 | } 92 | 93 | .font-small { 94 | font-size: $font-size-small; 95 | } 96 | -------------------------------------------------------------------------------- /customer/static/customer/scss/core/_waves.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Waves v0.7.6 3 | * http://fian.my.id/Waves 4 | * 5 | * Copyright 2014-2018 Alfiana E. Sibuea and other contributors 6 | * Released under the MIT license 7 | * https://github.com/fians/Waves/blob/master/LICENSE */ 8 | 9 | @mixin waves-transition($transition){ 10 | -webkit-transition: $transition; 11 | -moz-transition: $transition; 12 | -o-transition: $transition; 13 | transition: $transition; 14 | } 15 | 16 | @mixin waves-transform($string){ 17 | -webkit-transform: $string; 18 | -moz-transform: $string; 19 | -ms-transform: $string; 20 | -o-transform: $string; 21 | transform: $string; 22 | } 23 | 24 | @mixin waves-box-shadow($shadow){ 25 | -webkit-box-shadow: $shadow; 26 | box-shadow: $shadow; 27 | } 28 | 29 | .waves-effect { 30 | position: relative; 31 | overflow: hidden; 32 | cursor: pointer; 33 | -webkit-user-select: none; 34 | -moz-user-select: none; 35 | -ms-user-select: none; 36 | user-select: none; 37 | -webkit-tap-highlight-color: transparent; 38 | 39 | .waves-ripple { 40 | $gradient: rgba(0, 0, 0, .2) 0,rgba(0, 0, 0, .3) 40%,rgba(0, 0, 0, .4) 50%,rgba(0, 0, 0, .5) 60%,rgba(255, 255, 255, 0) 70%; 41 | position: absolute; 42 | width: 100px; 43 | height: 100px; 44 | margin-top: -50px; 45 | margin-left: -50px; 46 | pointer-events: none; 47 | background: rgba(0, 0, 0, .2); 48 | background: radial-gradient($gradient); 49 | border-radius: 50%; 50 | opacity: 0; 51 | -webkit-transition-property: -webkit-transform, opacity; 52 | -moz-transition-property: -moz-transform, opacity; 53 | -o-transition-property: -o-transform, opacity; 54 | transition-property: transform, opacity; 55 | @include waves-transition(all .5s ease-out); 56 | @include waves-transform(scale(0) translate(0,0)); 57 | } 58 | 59 | &.waves-light .waves-ripple { 60 | $gradient: rgba(255, 255, 255, .2) 0,rgba(255, 255, 255, .3) 40%,rgba(255, 255, 255, .4) 50%,rgba(255, 255, 255, .5) 60%,rgba(255, 255, 255, 0) 70%; 61 | background: rgba(255, 255, 255, .4); 62 | background: radial-gradient($gradient); 63 | } 64 | 65 | &.waves-classic .waves-ripple { 66 | background: rgba(0, 0, 0, .2); 67 | } 68 | 69 | &.waves-classic.waves-light .waves-ripple { 70 | background: rgba(255, 255, 255, .4); 71 | } 72 | } 73 | 74 | .waves-notransition { 75 | @include waves-transition(none #{"!important"}); 76 | } 77 | 78 | .waves-button, 79 | .waves-circle { 80 | @include waves-transform(translateZ(0)); 81 | -webkit-mask-image: -webkit-radial-gradient(circle, #fff 100%, #000 100%); 82 | } 83 | 84 | .waves-button, 85 | .waves-button:hover, 86 | .waves-button:visited, 87 | .waves-button-input { 88 | z-index: 1; 89 | font-size: 1em; 90 | line-height: 1em; 91 | color: inherit; 92 | text-align: center; 93 | text-decoration: none; 94 | white-space: nowrap; 95 | vertical-align: middle; 96 | cursor: pointer; 97 | background-color: rgba(0, 0, 0, 0); 98 | border: none; 99 | outline: none; 100 | } 101 | 102 | .waves-button { 103 | padding: .85em 1.1em; 104 | border-radius: .2em; 105 | } 106 | 107 | .waves-button-input { 108 | padding: .85em 1.1em; 109 | margin: 0; 110 | } 111 | 112 | .waves-input-wrapper { 113 | position: relative; 114 | display: inline-block; 115 | vertical-align: middle; 116 | border-radius: .2em; 117 | 118 | &.waves-button { 119 | padding: 0; 120 | } 121 | 122 | .waves-button-input { 123 | position: relative; 124 | top: 0; 125 | left: 0; 126 | z-index: 1; 127 | } 128 | } 129 | 130 | .waves-circle { 131 | width: 2.5em; 132 | height: 2.5em; 133 | line-height: 2.5em; 134 | text-align: center; 135 | border-radius: 50%; 136 | } 137 | 138 | .waves-float { 139 | -webkit-mask-image: none; 140 | @include waves-box-shadow(0 1px 1.5px 1px rgba(0, 0, 0, .12)); 141 | @include waves-transition(all 300ms); 142 | 143 | &:active { 144 | @include waves-box-shadow(0 8px 20px 1px rgba(0, 0, 0, .3)); 145 | } 146 | } 147 | 148 | .waves-block { 149 | display: block; 150 | } 151 | 152 | a { 153 | &.waves-effect, 154 | &.waves-light { 155 | display: inline-block; 156 | } 157 | } 158 | -------------------------------------------------------------------------------- /customer/static/customer/scss/core/bootstrap/_functions.scss: -------------------------------------------------------------------------------- 1 | // Bootstrap functions 2 | // 3 | // Utility mixins and functions for evaluating source code across our variables, maps, and mixins. 4 | 5 | // Ascending 6 | // Used to evaluate Sass maps like our grid breakpoints. 7 | @mixin _assert-ascending($map, $map-name) { 8 | $prev-key: null; 9 | $prev-num: null; 10 | @each $key, $num in $map { 11 | @if $prev-num == null or unit($num) == "%" { 12 | // Do nothing 13 | } @else if not comparable($prev-num, $num) { 14 | @warn "Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !"; 15 | } @else if $prev-num >= $num { 16 | @warn "Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !"; 17 | } 18 | $prev-key: $key; 19 | $prev-num: $num; 20 | } 21 | } 22 | 23 | // Starts at zero 24 | // Used to ensure the min-width of the lowest breakpoint starts at 0. 25 | @mixin _assert-starts-at-zero($map, $map-name: "$grid-breakpoints") { 26 | $values: map-values($map); 27 | $first-value: nth($values, 1); 28 | @if $first-value != 0 { 29 | @warn "First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}."; 30 | } 31 | } 32 | 33 | // Replace `$search` with `$replace` in `$string` 34 | // Used on our SVG icon backgrounds for custom forms. 35 | // 36 | // @author Hugo Giraudel 37 | // @param {String} $string - Initial string 38 | // @param {String} $search - Substring to replace 39 | // @param {String} $replace ('') - New value 40 | // @return {String} - Updated string 41 | @function str-replace($string, $search, $replace: "") { 42 | $index: str-index($string, $search); 43 | 44 | @if $index { 45 | @return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace); 46 | } 47 | 48 | @return $string; 49 | } 50 | 51 | // Color contrast 52 | @function color-yiq($color, $dark: $yiq-text-dark, $light: $yiq-text-light) { 53 | $r: red($color); 54 | $g: green($color); 55 | $b: blue($color); 56 | 57 | $yiq: (($r * 299) + ($g * 587) + ($b * 114)) / 1000; 58 | 59 | @if ($yiq >= $yiq-contrasted-threshold) { 60 | @return $dark; 61 | } @else { 62 | @return $light; 63 | } 64 | } 65 | 66 | // Retrieve color Sass maps 67 | @function color($key: "blue") { 68 | @return map-get($colors, $key); 69 | } 70 | 71 | @function theme-color($key: "primary") { 72 | @return map-get($theme-colors, $key); 73 | } 74 | 75 | @function gray($key: "100") { 76 | @return map-get($grays, $key); 77 | } 78 | 79 | // Request a theme color level 80 | @function theme-color-level($color-name: "primary", $level: 0) { 81 | $color: theme-color($color-name); 82 | $color-base: if($level > 0, $black, $white); 83 | $level: abs($level); 84 | 85 | @return mix($color-base, $color, $level * $theme-color-interval); 86 | } 87 | -------------------------------------------------------------------------------- /customer/static/customer/scss/free/_animations-basic.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * animate.css -http://daneden.me/animate 3 | * Version - 3.7.0 4 | * Licensed under the MIT license - http://opensource.org/licenses/MIT 5 | * 6 | * Copyright (c) 2018 Daniel Eden 7 | */ 8 | .animated { 9 | animation-duration: 1s; 10 | animation-fill-mode: both; 11 | &.infinite { 12 | animation-iteration-count: infinite; 13 | } 14 | &.delay-1s { 15 | animation-delay: 1s; 16 | } 17 | &.delay-2s { 18 | animation-delay: 2s; 19 | } 20 | &.delay-3s { 21 | animation-delay: 3s; 22 | } 23 | &.delay-4s { 24 | animation-delay: 4s; 25 | } 26 | &.delay-5s { 27 | animation-delay: 5s; 28 | } 29 | &.fast { 30 | animation-duration: 800ms; 31 | } 32 | &.faster { 33 | animation-duration: 500ms; 34 | } 35 | &.slow { 36 | animation-duration: 2s; 37 | } 38 | &.slower { 39 | animation-duration: 3s; 40 | } 41 | } 42 | 43 | @media (prefers-reduced-motion) { 44 | .animated { 45 | transition: none !important; 46 | animation: unset !important; 47 | } 48 | } 49 | 50 | @keyframes fadeIn { 51 | from { 52 | opacity: 0; 53 | } 54 | 55 | to { 56 | opacity: 1; 57 | } 58 | } 59 | 60 | .fadeIn { 61 | animation-name: fadeIn; 62 | } 63 | 64 | @keyframes fadeInDown { 65 | from { 66 | opacity: 0; 67 | transform: translate3d(0, -100%, 0); 68 | } 69 | 70 | to { 71 | opacity: 1; 72 | transform: translate3d(0, 0, 0); 73 | } 74 | } 75 | 76 | .fadeInDown { 77 | animation-name: fadeInDown; 78 | } 79 | 80 | @keyframes fadeInLeft { 81 | from { 82 | opacity: 0; 83 | transform: translate3d(-100%, 0, 0); 84 | } 85 | 86 | to { 87 | opacity: 1; 88 | transform: translate3d(0, 0, 0); 89 | } 90 | } 91 | 92 | .fadeInLeft { 93 | animation-name: fadeInLeft; 94 | } 95 | 96 | 97 | @keyframes fadeInRight { 98 | from { 99 | opacity: 0; 100 | transform: translate3d(100%, 0, 0); 101 | } 102 | 103 | to { 104 | opacity: 1; 105 | transform: translate3d(0, 0, 0); 106 | } 107 | } 108 | 109 | .fadeInRight { 110 | animation-name: fadeInRight; 111 | } 112 | 113 | 114 | @keyframes fadeInUp { 115 | from { 116 | opacity: 0; 117 | transform: translate3d(0, 100%, 0); 118 | } 119 | 120 | to { 121 | opacity: 1; 122 | transform: translate3d(0, 0, 0); 123 | } 124 | } 125 | 126 | .fadeInUp { 127 | animation-name: fadeInUp; 128 | } 129 | 130 | 131 | @keyframes fadeOut { 132 | from { 133 | opacity: 1; 134 | } 135 | 136 | to { 137 | opacity: 0; 138 | } 139 | } 140 | 141 | .fadeOut { 142 | animation-name: fadeOut; 143 | } 144 | 145 | 146 | @keyframes fadeOutDown { 147 | from { 148 | opacity: 1; 149 | } 150 | 151 | to { 152 | opacity: 0; 153 | transform: translate3d(0, 100%, 0); 154 | } 155 | } 156 | 157 | .fadeOutDown { 158 | animation-name: fadeOutDown; 159 | } 160 | 161 | 162 | @keyframes fadeOutLeft { 163 | from { 164 | opacity: 1; 165 | } 166 | 167 | to { 168 | opacity: 0; 169 | transform: translate3d(-100%, 0, 0); 170 | } 171 | } 172 | 173 | .fadeOutLeft { 174 | animation-name: fadeOutLeft; 175 | } 176 | 177 | 178 | @keyframes fadeOutRight { 179 | from { 180 | opacity: 1; 181 | } 182 | 183 | to { 184 | opacity: 0; 185 | transform: translate3d(100%, 0, 0); 186 | } 187 | } 188 | 189 | .fadeOutRight { 190 | animation-name: fadeOutRight; 191 | } 192 | 193 | 194 | @keyframes fadeOutUp { 195 | from { 196 | opacity: 1; 197 | } 198 | 199 | to { 200 | opacity: 0; 201 | transform: translate3d(0, -100%, 0); 202 | } 203 | } 204 | 205 | .fadeOutUp { 206 | animation-name: fadeOutUp; 207 | } 208 | -------------------------------------------------------------------------------- /customer/static/customer/scss/free/_badges.scss: -------------------------------------------------------------------------------- 1 | // Badges 2 | .badge { 3 | color: $white !important; 4 | border-radius: $border-radius-base; 5 | box-shadow: $z-depth-1; 6 | } 7 | .badge-pill { 8 | padding-right: $badge-pill-padding-x; 9 | padding-left: $badge-pill-padding-x; 10 | border-radius: $badge-pill-border-radius; 11 | } 12 | @each $name, $color in $basic-mdb-colors { 13 | @include make-badge($name, $color); 14 | } 15 | 16 | -------------------------------------------------------------------------------- /customer/static/customer/scss/free/_buttons.scss: -------------------------------------------------------------------------------- 1 | // Buttons 2 | .btn { 3 | margin: $btn-margin-basic; 4 | color: inherit; 5 | text-transform: uppercase; 6 | word-wrap: break-word; 7 | white-space: normal; 8 | cursor: pointer; 9 | border: 0; 10 | border-radius: $border-radius-base; 11 | box-shadow: $z-depth-1; 12 | transition: $btn-transition; 13 | @include button-size($btn-padding-y-basic, $btn-padding-x-basic, $btn-font-size-basic); 14 | 15 | @include hover-focus-active { 16 | outline: 0; 17 | box-shadow: $z-depth-1-half; 18 | } 19 | 20 | &.btn-block { 21 | margin: inherit; 22 | } 23 | 24 | .fas, 25 | .fab, 26 | .far { 27 | &.right { 28 | margin-left: $btn-icon-margin; 29 | } 30 | &.left { 31 | margin-right: $btn-icon-margin; 32 | } 33 | } 34 | 35 | &.btn-lg { 36 | @include button-size($btn-padding-y-large, $btn-padding-x-large, $btn-font-size-large); 37 | } 38 | &.btn-md { 39 | @include button-size($btn-padding-y-medium, $btn-padding-x-medium, $btn-font-size-medium); 40 | } 41 | &.btn-sm { 42 | @include button-size($btn-padding-y-small, $btn-padding-x-small, $btn-font-size-small); 43 | } 44 | 45 | &.disabled, 46 | &:disabled { 47 | @include hover-focus-active { 48 | box-shadow: $z-depth-1; 49 | } 50 | } 51 | 52 | &[class*="btn-outline-"] { 53 | padding-top: $btn-outline-padding-y-basic; 54 | padding-bottom: $btn-outline-padding-y-basic; 55 | &.btn-lg { 56 | padding-top: $btn-outline-padding-y-large; 57 | padding-bottom: $btn-outline-padding-y-large; 58 | } 59 | &.btn-md { 60 | padding-top: $btn-outline-padding-y-medium; 61 | padding-bottom: $btn-outline-padding-y-medium; 62 | } 63 | &.btn-sm { 64 | padding-top: $btn-outline-padding-y-small; 65 | padding-bottom: $btn-outline-padding-y-small; 66 | } 67 | } 68 | } 69 | 70 | .btn-link { 71 | color: $black-base; 72 | background-color: transparent; 73 | box-shadow: none; 74 | @include hover-focus-active { 75 | color: $black-base; 76 | background-color: transparent; 77 | box-shadow: none; 78 | } 79 | } 80 | 81 | .btn-group { 82 | > .btn:not(:first-child), 83 | > .btn-group:not(:first-child) { 84 | margin-left: -$btn-group-margin; 85 | } 86 | } 87 | 88 | @each $btn_name, $color_value in $mdb-colors { 89 | @include make-button($btn_name, $color_value); 90 | @include make-outline-button($btn_name, $color_value); 91 | } 92 | 93 | @each $name, $val in $gradients { 94 | @include make-gradient-button($name, $val); 95 | } 96 | 97 | .btn-warning:not(:disabled):not(.disabled).active, 98 | .btn-warning:not(:disabled):not(.disabled):active, 99 | .show > .btn-warning.dropdown-toggle { 100 | color: $white-base; 101 | } 102 | 103 | -------------------------------------------------------------------------------- /customer/static/customer/scss/free/_cards.scss: -------------------------------------------------------------------------------- 1 | // Cards 2 | .card { 3 | font-weight: 400; 4 | border: 0; 5 | box-shadow: $z-depth-1; 6 | &[class*="border"] { 7 | border: 1px solid $grey-base; 8 | box-shadow: none; 9 | } 10 | .card-body { 11 | h1, h2, h3, h4, h5, h6 { 12 | font-weight: 400; 13 | } 14 | .card-title { 15 | a { 16 | transition: $md-card-link-transition; 17 | &:hover { 18 | transition: $md-card-link-transition; 19 | } 20 | } 21 | } 22 | .card-text { 23 | font-size: $md-card-font-size; 24 | font-weight: 400; 25 | color: $md-card-text-color; 26 | } 27 | } 28 | .md-form { 29 | label { 30 | font-weight: 300; 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /customer/static/customer/scss/free/_carousels.scss: -------------------------------------------------------------------------------- 1 | // Carousels 2 | .carousel { 3 | .carousel-control-prev-icon, 4 | .carousel-control-next-icon { 5 | width: $carousel-control-icon-width; 6 | height: $carousel-control-icon-height; 7 | } 8 | .carousel-control-prev-icon { 9 | background-image: $carousel-control-prev-icon; 10 | } 11 | .carousel-control-next-icon { 12 | background-image: $carousel-control-next-icon; 13 | } 14 | .carousel-indicators { 15 | li { 16 | width: $carousel-indicators-width; 17 | height: $carousel-indicators-height; 18 | cursor: pointer; 19 | border-radius: $carousel-indicators-border-radius; 20 | } 21 | } 22 | } 23 | .carousel-fade { 24 | .carousel-item { 25 | opacity: 0; 26 | transition-duration: $carousel-transition-duration; 27 | transition-property: opacity; 28 | } 29 | .carousel-item.active, 30 | .carousel-item-next.carousel-item-left, 31 | .carousel-item-prev.carousel-item-right { 32 | opacity: 1; 33 | } 34 | .carousel-item-left, 35 | .carousel-item-right { 36 | &.active { 37 | opacity: 0; 38 | } 39 | } 40 | .carousel-item-next, 41 | .carousel-item-prev, 42 | .carousel-item.active, 43 | .carousel-item-left.active, 44 | .carousel-item-prev.active { 45 | transform: $carousel-item-transform; 46 | @supports (transform-style: preserve-3d) { 47 | transform: $carousel-item-transform-2; 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /customer/static/customer/scss/free/_depreciated.scss: -------------------------------------------------------------------------------- 1 | // These settings will be only for one version 2 | // Scrolable navbar 3 | 4 | /* 5 | .navbar { 6 | &.fixed-top, 7 | &.sticky-top { 8 | .navbar-collapse { 9 | @media (min-width: 400px) and (max-width: 767px), 10 | (min-width: 800px) and (max-width: 850px) { 11 | max-height: 340px; 12 | overflow-x: hidden; 13 | overflow-y: auto; 14 | } 15 | } 16 | } 17 | } 18 | */ 19 | -------------------------------------------------------------------------------- /customer/static/customer/scss/free/_dropdowns.scss: -------------------------------------------------------------------------------- 1 | // Dropdowns 2 | .dropdown { 3 | .dropdown-menu { 4 | .dropdown-item { 5 | &:active { 6 | background-color: $grey-darken-1; 7 | } 8 | } 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /customer/static/customer/scss/free/_footers.scss: -------------------------------------------------------------------------------- 1 | // Footers 2 | footer { 3 | &.page-footer { 4 | bottom: 0; 5 | color: $white-base; 6 | .container-fluid { 7 | width: auto; 8 | } 9 | .footer-copyright { 10 | overflow: hidden; 11 | color: $footer-copyright-color; 12 | background-color: $footer-copyright-bg-color; 13 | } 14 | a { 15 | color: $white-base; 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /customer/static/customer/scss/free/_input-group.scss: -------------------------------------------------------------------------------- 1 | // Input group 2 | .md-form { 3 | &.input-group { 4 | label { 5 | top: 0; 6 | margin-bottom: 0; 7 | } 8 | .input-group-text { 9 | background-color: $input-group-text-bgc; 10 | &.md-addon { 11 | font-weight: 500; 12 | background-color: transparent; 13 | border: none; 14 | } 15 | } 16 | .form-control { 17 | padding: $input-group-form-control-py $input-group-form-control-px; 18 | margin: 0; 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /customer/static/customer/scss/free/_list-group.scss: -------------------------------------------------------------------------------- 1 | // List group 2 | .media { 3 | .media-left { 4 | padding: $list-group-padding; 5 | 6 | img { 7 | box-shadow: $z-depth-1; 8 | } 9 | } 10 | } 11 | 12 | .list-group { 13 | .list-group-item { 14 | &:first-child { 15 | border-top-left-radius: $border-radius-base; 16 | border-top-right-radius: $border-radius-base; 17 | } 18 | 19 | &:last-child { 20 | border-bottom-right-radius: $border-radius-base; 21 | border-bottom-left-radius: $border-radius-base; 22 | } 23 | } 24 | 25 | a, 26 | button { 27 | transition: $list-group-transition; 28 | 29 | &:hover { 30 | transition: $list-group-transition; 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /customer/static/customer/scss/free/_loader.scss: -------------------------------------------------------------------------------- 1 | // Loader / Spinner 2 | .fast { 3 | &.spinner-border { 4 | animation: $spinner-border-animation; 5 | } 6 | &.spinner-grow { 7 | animation: $spinner-grow-animation; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /customer/static/customer/scss/free/_msc.scss: -------------------------------------------------------------------------------- 1 | // Miscellaneous 2 | // Edge Headers 3 | .edge-header { 4 | display: block; 5 | height: $edge-header-height; 6 | background-color: $edge-header-background-color; 7 | } 8 | 9 | .free-bird { 10 | margin-top: $edge-header-margin-top; 11 | } 12 | 13 | // Additional gradients 14 | .juicy-peach-gradient { 15 | background-image: linear-gradient(to right, #ffecd2 0%, #fcb69f 100%); 16 | } 17 | 18 | .young-passion-gradient { 19 | background-image: linear-gradient(to right, #ff8177 0%, #ff867a 0%, #ff8c7f 21%, #f99185 52%, #cf556c 78%, #b12a5b 100%); 20 | } 21 | 22 | .lady-lips-gradient { 23 | background-image: linear-gradient(to top, #ff9a9e 0%, #fecfef 99%, #fecfef 100%); 24 | } 25 | 26 | .sunny-morning-gradient { 27 | background-image: linear-gradient(120deg, #f6d365 0%, #fda085 100%); 28 | } 29 | 30 | .rainy-ashville-gradient { 31 | background-image: linear-gradient(to top, #fbc2eb 0%, #a6c1ee 100%); 32 | } 33 | 34 | .frozen-dreams-gradient { 35 | background-image: linear-gradient(to top, #fdcbf1 0%, #fdcbf1 1%, #e6dee9 100%); 36 | } 37 | 38 | .warm-flame-gradient { 39 | background-image: linear-gradient(45deg, #ff9a9e 0%, #fad0c4 99%, #fad0c4 100%); 40 | } 41 | 42 | .night-fade-gradient { 43 | background-image: linear-gradient(to top, #a18cd1 0%, #fbc2eb 100%); 44 | } 45 | 46 | .spring-warmth-gradient { 47 | background-image: linear-gradient(to top, #fad0c4 0%, #ffd1ff 100%); 48 | } 49 | 50 | .winter-neva-gradient { 51 | background-image: linear-gradient(120deg, #a1c4fd 0%, #c2e9fb 100%); 52 | } 53 | 54 | .dusty-grass-gradient { 55 | background-image: linear-gradient(120deg, #d4fc79 0%, #96e6a1 100%); 56 | } 57 | 58 | .tempting-azure-gradient { 59 | background-image: linear-gradient(120deg, #84fab0 0%, #8fd3f4 100%); 60 | } 61 | 62 | .heavy-rain-gradient { 63 | background-image: linear-gradient(to top, #cfd9df 0%, #e2ebf0 100%); 64 | } 65 | 66 | .amy-crisp-gradient { 67 | background-image: linear-gradient(120deg, #a6c0fe 0%, #f68084 100%); 68 | } 69 | 70 | .mean-fruit-gradient { 71 | background-image: linear-gradient(120deg, #fccb90 0%, #d57eeb 100%); 72 | } 73 | 74 | .deep-blue-gradient { 75 | background-image: linear-gradient(120deg, #e0c3fc 0%, #8ec5fc 100%); 76 | } 77 | 78 | .ripe-malinka-gradient { 79 | background-image: linear-gradient(120deg, #f093fb 0%, #f5576c 100%); 80 | } 81 | 82 | .cloudy-knoxville-gradient { 83 | background-image: linear-gradient(120deg, #fdfbfb 0%, #ebedee 100%); 84 | } 85 | 86 | .morpheus-den-gradient { 87 | background-image: linear-gradient(to top, #30cfd0 0%, #330867 100%); 88 | } 89 | 90 | .rare-wind-gradient { 91 | background-image: linear-gradient(to top, #a8edea 0%, #fed6e3 100%); 92 | } 93 | 94 | .near-moon-gradient { 95 | background-image: linear-gradient(to top, #5ee7df 0%, #b490ca 100%); 96 | } 97 | 98 | .schedule-list { 99 | .hr-bold { 100 | border-top: 2px solid #212529; 101 | } 102 | 103 | .font-smaller { 104 | font-size: .8rem; 105 | } 106 | } 107 | 108 | .note { 109 | padding: 10px; 110 | border-left: 6px solid; 111 | border-radius: 5px; 112 | strong { 113 | font-weight: 600; 114 | } 115 | p { 116 | font-weight: 500; 117 | } 118 | } 119 | 120 | @each $name, $color in $note { 121 | .note-#{$name} { 122 | background-color: map-get($color, bgc); 123 | border-color: map-get($color, border-color); 124 | } 125 | } 126 | -------------------------------------------------------------------------------- /customer/static/customer/scss/free/_navbars.scss: -------------------------------------------------------------------------------- 1 | // Navbars 2 | .navbar { 3 | font-weight: $navbar-font-weight; 4 | box-shadow: $z-depth-1; 5 | form { 6 | .md-form { 7 | input { 8 | margin: 0 $navbar-form-input-mr $navbar-form-input-mb $navbar-form-input-ml; 9 | } 10 | } 11 | } 12 | .breadcrumb { 13 | padding: $navbar-breadcrumb-padding-top 0 0 $navbar-breadcrumb-padding-left; 14 | margin: 0; 15 | font-size: $navbar-double-font-size; 16 | font-weight: $navbar-font-weight; 17 | background-color: inherit; 18 | .breadcrumb-item { 19 | color: $white-base; 20 | &.active { 21 | color: $navbar-breadcrumb-color; 22 | } 23 | &:before { 24 | color: $navbar-breadcrumb-color; 25 | } 26 | } 27 | } 28 | .navbar-toggler { 29 | border-width: 0; 30 | outline: 0; 31 | } 32 | .nav-flex-icons { 33 | flex-direction: row; 34 | } 35 | .container { 36 | @media (max-width: $medium-screen) { 37 | width: 100%; 38 | .navbar-toggler-right { 39 | right: 0; 40 | } 41 | } 42 | } 43 | .nav-item { 44 | .nav-link { 45 | display: block; 46 | &.disabled { 47 | &:active { 48 | pointer-events: none; 49 | } 50 | } 51 | .fas, .fab, .far { 52 | padding-right: $navbar-flex-icons-padding-lg; 53 | padding-left: $navbar-flex-icons-padding-lg; 54 | } 55 | @media (max-width: $medium-screen) { 56 | padding-right: $navbar-flex-icons-padding-md; 57 | padding-left: $navbar-flex-icons-padding-md; 58 | } 59 | } 60 | } 61 | .dropdown-menu { 62 | position: absolute !important; 63 | margin-top: 0; 64 | a { 65 | padding: $navbar-dropdown-menu-padding; 66 | font-size: $navbar-dropdown-font-size; 67 | font-weight: $navbar-font-weight; 68 | color: $black; 69 | } 70 | form { 71 | @media (max-width: $small-screen) { 72 | width: 17rem; 73 | } 74 | @media (min-width: $small-screen) { 75 | width: 22rem; 76 | } 77 | } 78 | } 79 | &.navbar-light { 80 | @include make-navbar($navbar-light-disabled-color, $navbar-light-toggler-icon, $black, $navbar-light-hover-color, $navbar-light-bg-active-color); 81 | } 82 | &.navbar-dark { 83 | @include make-navbar($navbar-dark-disabled-color, $navbar-dark-toggler-icon, $white, $navbar-dark-hover-color, $navbar-dark-bg-active-color); 84 | } 85 | &.scrolling-navbar { 86 | @media (min-width: $small-screen) { 87 | padding-top: $navbar-scrolling-padding; 88 | padding-bottom: $navbar-scrolling-padding; 89 | transition: $navbar-scrolling-transition; 90 | .navbar-nav > li { 91 | transition-duration: $navbar-scrolling-transition-duration; 92 | } 93 | &.top-nav-collapse { 94 | padding-top: $navbar-top-collapse-padding; 95 | padding-bottom: $navbar-top-collapse-padding; 96 | } 97 | } 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /customer/static/customer/scss/free/_pagination.scss: -------------------------------------------------------------------------------- 1 | // Pagination 2 | .pagination { 3 | .page-item { 4 | &.active { 5 | .page-link { 6 | color: $white-base; 7 | background-color: $primary-color; 8 | border-radius: $border-radius-base; 9 | box-shadow: $z-depth-1; 10 | transition: $pagination-active-transition; 11 | &:hover { 12 | background-color: $primary-color; 13 | } 14 | } 15 | } 16 | &.disabled { 17 | .page-link { 18 | color: $pagination-page-item-disabled-color; 19 | } 20 | } 21 | .page-link { 22 | font-size: $pagination-page-link-font-size; 23 | color: $pagination-page-link-color; 24 | background-color: transparent; 25 | border: 0; 26 | outline: 0; 27 | transition: $pagination-page-link-transition; 28 | &:hover { 29 | background-color: $pagination-page-link-hover-bg-color; 30 | border-radius: $border-radius-base; 31 | transition: $pagination-page-link-transition; 32 | } 33 | &:focus { 34 | background-color: transparent; 35 | box-shadow: none; 36 | } 37 | } 38 | } 39 | &.pagination-lg { 40 | .page-item { 41 | .page-link { 42 | font-size: $pagination-page-link-font-size-lg; 43 | } 44 | } 45 | } 46 | &.pagination-sm { 47 | .page-item { 48 | .page-link { 49 | font-size: $pagination-page-link-font-size-sm; 50 | } 51 | } 52 | } 53 | &.pagination-circle { 54 | .page-item { 55 | .page-link { 56 | margin-right: $pagination-circle-margin-x; 57 | margin-left: $pagination-circle-margin-x; 58 | border-radius: $pagination-circle-border-radius; 59 | &:hover { 60 | border-radius: $pagination-circle-border-radius; 61 | } 62 | } 63 | &.active { 64 | .page-link { 65 | border-radius: $pagination-circle-border-radius; 66 | } 67 | } 68 | } 69 | } 70 | @each $name, $color in $pagination-colors { 71 | &.pg-#{$name} { 72 | .page-item { 73 | &.active { 74 | .page-link { 75 | background-color: $color; 76 | &:hover { 77 | background-color: $color; 78 | } 79 | } 80 | } 81 | } 82 | } 83 | } 84 | } 85 | -------------------------------------------------------------------------------- /customer/static/customer/scss/free/_steppers.scss: -------------------------------------------------------------------------------- 1 | // Steppers 2 | ul.stepper { 3 | padding: 0 1.5rem; 4 | padding: 1.5rem; 5 | margin: 1em -1.5rem; 6 | overflow-x: hidden; 7 | overflow-y: auto; 8 | counter-reset: section; 9 | 10 | li { 11 | a { 12 | padding: $stepper-li-a-padding; 13 | text-align: center; 14 | 15 | .circle { 16 | display: inline-block; 17 | width: 1.75rem; 18 | height: 1.75rem; 19 | margin-right: $stepper-li-a-circle-mr; 20 | line-height: 1.7rem; 21 | color: $stepper-li-a-circle-color; 22 | text-align: center; 23 | background: $stepper-li-a-circle-bg; 24 | border-radius: $stepper-li-a-circle-border-radius; 25 | } 26 | 27 | .label { 28 | display: inline-block; 29 | color: $stepper-li-a-circle-bg; 30 | } 31 | } 32 | 33 | &.active, 34 | &.completed { 35 | a { 36 | .circle { 37 | @extend .primary-color; 38 | } 39 | 40 | .label { 41 | font-weight: 600; 42 | color: $stepper-li-a-label-color; 43 | } 44 | } 45 | } 46 | 47 | &.warning { 48 | a { 49 | .circle { 50 | // background-color: #ff3547 !important; 51 | @extend .danger-color !optional; 52 | } 53 | } 54 | } 55 | } 56 | } 57 | 58 | // Horizontal 59 | .stepper-horizontal { 60 | position: relative; 61 | display: flex; 62 | justify-content: space-between; 63 | 64 | li { 65 | position: relative; 66 | display: flex; 67 | flex: 1; 68 | align-items: center; 69 | transition: $stepper-horizontal-li-transition; 70 | 71 | a { 72 | .label { 73 | margin-top: $stepper-horizontal-li-a-label-mt; 74 | } 75 | } 76 | 77 | &:not(:last-child):after { 78 | position: relative; 79 | flex: 1; 80 | height: $stepper-horizontal-li-after-height; 81 | margin: $stepper-horizontal-li-after-margin 0 0 0; 82 | content: ""; 83 | background-color: $stepper-horizontal-li-after-bgc; 84 | } 85 | 86 | &:not(:first-child):before { 87 | position: relative; 88 | flex: 1; 89 | height: $stepper-horizontal-li-after-height; 90 | margin: $stepper-horizontal-li-after-margin 0 0 0; 91 | content: ""; 92 | background-color: $stepper-horizontal-li-after-bgc; 93 | } 94 | 95 | &:hover { 96 | background-color: rgba(0, 0, 0, .06); 97 | } 98 | } 99 | 100 | @media (max-width: $stepper-horizontal-breakpoint) { 101 | flex-direction: column; 102 | 103 | li { 104 | flex-direction: column; 105 | align-items: flex-start; 106 | 107 | a { 108 | .label { 109 | flex-flow: column nowrap; 110 | order: 2; 111 | margin-top: $stepper-horizontal-small-li-a-label-mt; 112 | } 113 | } 114 | 115 | &:not(:last-child):after { 116 | position: absolute; 117 | top: $stepper-horizontal-small-li-after-top; 118 | left: $stepper-horizontal-small-li-after-left; 119 | width: $stepper-horizontal-small-li-after-width; 120 | height: $stepper-horizontal-small-li-after-height; 121 | content: ""; 122 | } 123 | } 124 | } 125 | 126 | > li:not(:last-of-type) { 127 | margin-bottom: 0 !important; 128 | } 129 | } 130 | 131 | // Vertical 132 | .stepper-vertical { 133 | position: relative; 134 | display: flex; 135 | flex-direction: column; 136 | justify-content: space-between; 137 | 138 | li { 139 | position: relative; 140 | display: flex; 141 | flex: 1; 142 | flex-direction: column; 143 | align-items: flex-start; 144 | 145 | a { 146 | position: relative; 147 | display: flex; 148 | align-self: flex-start; 149 | 150 | .circle { 151 | order: 1; 152 | } 153 | 154 | .label { 155 | flex-flow: column nowrap; 156 | order: 2; 157 | margin-top: $stepper-vertical-li-a-label-mt; 158 | } 159 | } 160 | 161 | &.completed { 162 | a { 163 | .label { 164 | font-weight: 500; 165 | } 166 | } 167 | } 168 | 169 | .step-content { 170 | display: block; 171 | padding: $stepper-vertical-li-step-content-padding; 172 | margin-top: 0; 173 | margin-left: $stepper-vertical-li-step-content-ml; 174 | 175 | p { 176 | font-size: $stepper-vertical-li-step-content-p-font-size; 177 | } 178 | } 179 | 180 | &:not(:last-child):after { 181 | position: absolute; 182 | top: $stepper-vertical-li-after-top; 183 | left: $stepper-vertical-li-after-left; 184 | width: $stepper-vertical-li-after-width; 185 | height: $stepper-vertical-li-after-height; 186 | content: ""; 187 | background-color: $stepper-vertical-li-after-bgc; 188 | } 189 | } 190 | } 191 | -------------------------------------------------------------------------------- /customer/static/customer/scss/free/_switch.scss: -------------------------------------------------------------------------------- 1 | // Switch free 2 | .bs-switch { 3 | position: relative; 4 | display: inline-block; 5 | width: 60px; 6 | height: 34px; 7 | input { 8 | display: none; 9 | &:checked { 10 | + .slider { 11 | background-color: #2196F3; 12 | &:before { 13 | transform: translateX(26px); 14 | } 15 | } 16 | } 17 | &:focus { 18 | + .slider { 19 | box-shadow: 0 0 1px #2196F3; 20 | } 21 | } 22 | } 23 | .slider { 24 | position: absolute; 25 | cursor: pointer; 26 | top: 0; 27 | left: 0; 28 | right: 0; 29 | bottom: 0; 30 | background-color: #ccc; 31 | -webkit-transition: .4s; 32 | transition: .4s; 33 | &:before { 34 | position: absolute; 35 | content: ""; 36 | height: 26px; 37 | width: 26px; 38 | left: 4px; 39 | bottom: 4px; 40 | background-color: white; 41 | -webkit-transition: .4s; 42 | transition: .4s; 43 | } 44 | &.round { 45 | border-radius: 34px; 46 | &:before { 47 | border-radius: 50%; 48 | } 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /customer/static/customer/scss/free/_tables.scss: -------------------------------------------------------------------------------- 1 | // Tables 2 | table { 3 | th { 4 | font-size: $table-th-font-size; 5 | font-weight: 400; 6 | } 7 | td { 8 | font-size: $table-td-font-size; 9 | font-weight: 300; 10 | } 11 | &.table { 12 | thead th { 13 | border-top: none; 14 | } 15 | th, 16 | td { 17 | padding-top: $table-th-padding-top; 18 | padding-bottom: $table-td-padding-bottom; 19 | } 20 | a { 21 | margin: 0; 22 | color: $table-a-color; 23 | // &.btn { 24 | // color: inherit; 25 | // } 26 | } 27 | .label-table { 28 | height: $table-label-line-height; 29 | padding: 0; 30 | margin: 0; 31 | line-height: $table-label-height; 32 | } 33 | &.btn-table { 34 | td { 35 | vertical-align: middle; 36 | } 37 | } 38 | } 39 | &.table-hover { 40 | tbody { 41 | tr { 42 | &:hover { 43 | background-color: $table-hover-background-color; 44 | transition: $table-hover-transition; 45 | } 46 | } 47 | } 48 | } 49 | .th-lg { 50 | min-width: $table-th-lg-min-width; 51 | } 52 | .th-sm { 53 | min-width: $table-th-sm-min-width; 54 | } 55 | &.table-sm { 56 | th, 57 | td { 58 | padding-top: $table-sm-padding-y; 59 | padding-bottom: $table-sm-padding-y; 60 | } 61 | } 62 | } 63 | .table-scroll-vertical { 64 | max-height: $table-scroll-vertical-max-height; 65 | overflow-y: auto; 66 | } 67 | .table-fixed { 68 | table-layout: fixed; 69 | } 70 | .table-responsive, 71 | .table-responsive-sm, 72 | .table-responsive-md, 73 | .table-responsive-lg, 74 | .table-responsive-xl { 75 | > .table-bordered { 76 | border-top: 1px solid #dee2e6; 77 | } 78 | } 79 | -------------------------------------------------------------------------------- /customer/static/customer/scss/free/_treeview.scss: -------------------------------------------------------------------------------- 1 | // Treeview 2 | .treeview { 3 | &.w-20 { 4 | width: 20rem; 5 | } 6 | .rotate { 7 | margin-top: .2rem; 8 | font-size: .8rem; 9 | vertical-align: text-top; 10 | cursor: pointer; 11 | user-select: none; 12 | transition: all .1s linear; 13 | &.down { 14 | transform: rotate(90deg); 15 | } 16 | } 17 | .nested { 18 | display: none; 19 | } 20 | .active { 21 | display: block; 22 | } 23 | ul { 24 | list-style-type: none; 25 | } 26 | .ic-w { 27 | width: 1.3rem; 28 | } 29 | } 30 | 31 | .treeview-animated { 32 | &.w-20 { 33 | width: 20rem; 34 | } 35 | ul { 36 | position: relative; 37 | padding-left: 1em; 38 | list-style: none; 39 | } 40 | 41 | .treeview-animated-list { 42 | li { 43 | padding: .2em 0 0 .2em; 44 | } 45 | 46 | .treeview-animated-items { 47 | 48 | .nested { 49 | &::before { 50 | position: absolute; 51 | left: 5px; 52 | display: block; 53 | width: 5px; 54 | height: 100%; 55 | content: ""; 56 | background-color: #808080; 57 | } 58 | } 59 | 60 | .closed { 61 | display: block; 62 | padding: .2em .2em .2em .4em; 63 | margin-right: 0; 64 | border-top-left-radius: .3em; 65 | border-bottom-left-radius: .3em; 66 | 67 | &:hover { 68 | background-color: rgb(140, 185, 255); 69 | } 70 | 71 | .fa-angle-right { 72 | font-size: .8rem; 73 | transition: all .1s linear; 74 | 75 | &.down { 76 | position: relative; 77 | color: #f8f9fa; 78 | transform: rotate(90deg); 79 | } 80 | } 81 | } 82 | 83 | .open { 84 | background-color: rgb(50, 160, 255); 85 | transition: all .1s linear; 86 | 87 | &:hover { 88 | color: #f8f9fa; 89 | background-color: rgb(50, 160, 255); 90 | } 91 | 92 | span { 93 | color: #f8f9fa; 94 | } 95 | } 96 | } 97 | 98 | .treeview-animated-element { 99 | padding: .2em .2em .2em .6em; 100 | cursor: pointer; 101 | border-top-left-radius: 4px; 102 | border-bottom-left-radius: 4px; 103 | transition: all .1s linear; 104 | 105 | &:hover { 106 | background-color: rgb(140, 185, 255); 107 | } 108 | 109 | &.opened { 110 | color: #f8f9fa; 111 | background-color: rgb(50, 160, 255); 112 | 113 | &:hover { 114 | color: #f8f9fa; 115 | background-color: rgb(50, 160, 255); 116 | } 117 | } 118 | } 119 | } 120 | } 121 | 122 | .treeview-colorful { 123 | font-size: 16px; 124 | font-weight: 400; 125 | background: rgba(224, 127, 178, .2); 126 | 127 | &.w-20 { 128 | width: 20rem; 129 | } 130 | 131 | hr { 132 | border-color: #a2127a; 133 | } 134 | 135 | h6 { 136 | font-size: 1.4em; 137 | font-weight: 500; 138 | color: #a2127a; 139 | } 140 | 141 | ul { 142 | position: relative; 143 | padding-left: 0; 144 | list-style: none; 145 | } 146 | 147 | .treeview-colorful-list { 148 | 149 | ul { 150 | padding-left: 1em; 151 | margin-top: .1em; 152 | background: rgba(224, 127, 178, .2); 153 | } 154 | } 155 | 156 | .treeview-colorful-element { 157 | padding: .2em .2em .2em 1em; 158 | cursor: pointer; 159 | border: 2px solid transparent; 160 | border-right: 0 solid transparent; 161 | transition: all .1s linear; 162 | 163 | &:hover { 164 | background-color: #e07fb2; 165 | } 166 | 167 | &.opened { 168 | color: #ffac47; 169 | background-color: #a2127a; 170 | border: 2px solid #ffac47; 171 | border-right: 0 solid transparent; 172 | 173 | &:hover { 174 | color: #ffac47; 175 | background-color: #a2127a; 176 | } 177 | } 178 | 179 | } 180 | .treeview-colorful-items-header { 181 | display: block; 182 | padding: .4em; 183 | margin-right: 0; 184 | border-bottom: 2px solid transparent; 185 | transition: all .1s linear; 186 | 187 | &:hover { 188 | background-color: #e07fb2; 189 | } 190 | 191 | &.open { 192 | background-color: #a2127a; 193 | border-bottom: 2px solid #ffac47; 194 | transition: all .1s linear; 195 | 196 | span { 197 | color: #ffac47; 198 | } 199 | 200 | &:hover { 201 | color: #ffac47; 202 | background-color: #a2127a; 203 | } 204 | 205 | div:hover { 206 | background-color: #a2127a; 207 | } 208 | } 209 | 210 | .fa-angle-right { 211 | font-size: .8rem; 212 | transition: all .2s linear; 213 | } 214 | 215 | .fas { 216 | position: relative; 217 | color: #ffac47; 218 | transition: all .2s linear; 219 | transform: rotate(90deg); 220 | } 221 | 222 | .fa-minus-circle { 223 | position: relative; 224 | color: #ffac47; 225 | transition: all .2s linear; 226 | transform: rotate(180deg); 227 | } 228 | } 229 | } 230 | -------------------------------------------------------------------------------- /customer/static/customer/scss/free/modules/animations-extended/animations-extended.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * MDBootstrap Animations Extended 3 | * Learn more: https://mdbootstrap.com/docs/jquery/css/animations/ 4 | * About MDBootstrap: https://mdbootstrap.com/ 5 | */ 6 | 7 | @import "module"; 8 | -------------------------------------------------------------------------------- /customer/static/customer/scss/mdb.lite.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Material Design for Bootstrap 4 3 | * Version: MDB Lite 4.8.11 4 | * 5 | * 6 | * Copyright: Material Design for Bootstrap 7 | * https://mdbootstrap.com/ 8 | * 9 | * Read the license: https://mdbootstrap.com/general/license/ 10 | * 11 | * 12 | * Documentation: https://mdbootstrap.com/ 13 | * 14 | * Getting started: https://mdbootstrap.com/docs/jquery/getting-started/download/ 15 | * 16 | * Tutorials: https://mdbootstrap.com/education/bootstrap/ 17 | * 18 | * Templates: https://mdbootstrap.com/templates/ 19 | * 20 | * Support: https://mdbootstrap.com/support/ 21 | * 22 | * Contact: office@mdbootstrap.com 23 | * 24 | * Attribution: Animate CSS, Twitter Bootstrap, Materialize CSS, Normalize CSS, Waves JS, WOW JS, Toastr, Chart.js 25 | * 26 | */ 27 | 28 | @charset "UTF-8"; 29 | 30 | // Bootstrap 31 | @import "core/bootstrap/functions"; 32 | @import "core/bootstrap/variables"; 33 | 34 | // CORE 35 | @import "core/mixins"; 36 | // Your custom variables 37 | @import "custom-variables"; 38 | @import "core/colors"; 39 | @import "core/variables"; 40 | @import "core/global"; 41 | @import "core/helpers"; 42 | @import "core/typography"; 43 | @import "core/masks"; 44 | @import "core/waves"; 45 | 46 | // FREE 47 | @import "free/animations-basic"; 48 | @import "free/buttons"; 49 | @import "free/cards"; 50 | @import "free/dropdowns"; 51 | @import "free/input-group"; 52 | @import "free/navbars"; 53 | @import "free/pagination"; 54 | @import "free/badges"; 55 | @import "free/modals"; 56 | @import "free/carousels"; 57 | @import "free/forms"; 58 | @import "free/msc"; 59 | @import "free/footers"; 60 | @import "free/list-group"; 61 | @import "free/tables"; 62 | @import "free/depreciated"; 63 | @import "free/steppers"; 64 | @import "free/loader"; 65 | @import "free/treeview"; 66 | 67 | // Your custom styles 68 | @import "custom-styles"; 69 | -------------------------------------------------------------------------------- /customer/static/customer/scss/mdb.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Material Design for Bootstrap 4 3 | * Version: MDB FREE 4.8.11 4 | * 5 | * 6 | * Copyright: Material Design for Bootstrap 7 | * https://mdbootstrap.com/ 8 | * 9 | * Read the license: https://mdbootstrap.com/general/license/ 10 | * 11 | * 12 | * Documentation: https://mdbootstrap.com/ 13 | * 14 | * Getting started: https://mdbootstrap.com/docs/jquery/getting-started/download/ 15 | * 16 | * Tutorials: https://mdbootstrap.com/education/bootstrap/ 17 | * 18 | * Templates: https://mdbootstrap.com/templates/ 19 | * 20 | * Support: https://mdbootstrap.com/support/ 21 | * 22 | * Contact: office@mdbootstrap.com 23 | * 24 | * Attribution: Animate CSS, Twitter Bootstrap, Materialize CSS, Normalize CSS, Waves JS, WOW JS, Toastr, Chart.js 25 | * 26 | */ 27 | 28 | @charset "UTF-8"; 29 | 30 | // Bootstrap 31 | @import "core/bootstrap/functions"; 32 | @import "core/bootstrap/variables"; 33 | @import "core/bootstrap/rfs"; 34 | 35 | // CORE 36 | @import "core/mixins"; 37 | // Your custom variables 38 | @import "custom-variables"; 39 | @import "core/colors"; 40 | @import "core/variables"; 41 | @import "core/global"; 42 | @import "core/helpers"; 43 | @import "core/typography"; 44 | @import "core/masks"; 45 | @import "core/waves"; 46 | 47 | // FREE 48 | @import "free/animations-basic"; 49 | @import "free/modules/animations-extended/module"; 50 | @import "free/buttons"; 51 | @import "free/cards"; 52 | @import "free/dropdowns"; 53 | @import "free/input-group"; 54 | @import "free/navbars"; 55 | @import "free/pagination"; 56 | @import "free/badges"; 57 | @import "free/modals"; 58 | @import "free/carousels"; 59 | @import "free/forms"; 60 | @import "free/msc"; 61 | @import "free/footers"; 62 | @import "free/list-group"; 63 | @import "free/tables"; 64 | @import "free/depreciated"; 65 | @import "free/steppers"; 66 | @import "free/loader"; 67 | @import "free/treeview"; 68 | // Free addons 69 | // @import "addons/datatables"; 70 | // @import "addons/datatables-select"; 71 | // @import "addons/directives"; 72 | // @import "addons/hierarchical-display"; 73 | // @import "addons/flags"; 74 | // @import "addons/rating"; 75 | 76 | // Your custom styles 77 | @import "custom-styles"; 78 | -------------------------------------------------------------------------------- /customer/static/customer/scss/style.scss: -------------------------------------------------------------------------------- 1 | // Your custom styles 2 | 3 | /* Required height of parents of the Half Page Carousel for proper displaying carousel itself */ 4 | html, 5 | body, 6 | .view { 7 | height: 100%; } 8 | 9 | /* Half Page Carousel itself*/ 10 | .carousel { 11 | height: 50%; } 12 | .carousel .carousel-inner { 13 | height: 100%; } 14 | .carousel .carousel-inner .carousel-item, 15 | .carousel .carousel-inner .active { 16 | height: 100%; } 17 | 18 | /* Adjustment for mobile devices*/ 19 | @media (max-width: 776px) { 20 | .carousel { 21 | height: 100%; } } 22 | 23 | /* Footer color for sake of consistency with Navbar */ 24 | .page-footer { 25 | background-color: #929FBA; } 26 | -------------------------------------------------------------------------------- /customer/templates/customer/base.html: -------------------------------------------------------------------------------- 1 | 2 | {% load static %} 3 | 4 | 5 | 6 | 7 | 8 | 9 | E-Commerce 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 47 | 66 | 67 | 68 | 69 | {% include 'customer/navbar.html' %} 70 | {% block content %} 71 | 72 | {% endblock %} 73 | {% include 'customer/footer.html' %} 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 89 | 90 | 91 | -------------------------------------------------------------------------------- /customer/templates/customer/cart.html: -------------------------------------------------------------------------------- 1 | {% extends 'customer/base.html' %} 2 | 3 | 4 | {% block content %} 5 | 6 |
7 |
Order Summary
8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | {% for item in items %} 22 | 23 | 24 | 25 | 29 | {% else %} 30 | {{item.product.price}} 31 | {% endif %} 32 | 33 | 38 | 46 | 47 | {% empty %} 48 | 49 | 50 | 51 | 52 | 55 | 56 | {% endfor %} 57 | {% if order.get_cart_total %} 58 | 59 | 60 | 61 | 62 | 63 | 67 | 68 | {% endif %} 69 | 70 |
#Product NamePriceQuantityTotal Product Price
{{ forloop.counter }}{{item.product.name}} 26 | {% if item.product.discount_price %} 27 | {{item.product.discount_price}} 28 | 34 | 35 | {{item.quantity}} 36 | 37 | 39 | {% if item.product.discount_price %} 40 | {{item.get_total_discount_item_price}} 41 | Saved PKR {{item.get_amount_saved}} 42 | {% else %} 43 | {{item.get_total_item_price}} 44 | {% endif %} 45 |
Your cart is empty
53 | Continue Shopping 54 |
Order Total{{order.get_cart_total}}
64 | Proceed to checkout 65 | Continue Shopping 66 |
71 | 72 |
73 |
74 | 75 | {% endblock content %} -------------------------------------------------------------------------------- /customer/templates/customer/checkout.html: -------------------------------------------------------------------------------- 1 | {% extends 'customer/base.html' %} 2 | 3 | 4 | {% block content %} 5 | 6 |
7 | {% if messages %} 8 |
    9 | {% for message in messages %} 10 | 13 | {% endfor %} 14 |
15 | {% endif %} 16 |
17 | 18 | 19 |

Checkout form

20 | 21 | 22 |
23 | 24 | 25 |
26 | 27 | 28 |
29 | 30 |
31 | {% csrf_token %} 32 | 33 |
34 | 35 | {{form.street}} 36 | 37 |
38 | 39 | 40 |
41 | 42 | {{form.apartment}} 43 | 44 |
45 | 46 | 47 |
48 | 49 | 50 |
51 | 52 | 53 | 54 | {{form.city}} 55 |
56 | City required. 57 |
58 | 59 |
60 | 61 | 62 | 63 |
64 | 65 | 66 | 67 | {{form.zip_code}} 68 |
69 | Zip code required. 70 |
71 | 72 |
73 | 74 | 75 |
76 | 77 | 78 | 79 |
80 | 81 | 89 |
90 | 91 | 92 |
93 | 94 |
95 | 96 | 97 |
98 | 99 | 100 | 101 |
102 | 103 | 104 |

105 | Your cart 106 | {{item_count}} 107 |

108 | 109 | 110 |
    111 | 112 | {% for item in items %} 113 |
  • 114 |
    115 |
    {{item.product.name}} {{item.quantity}}
    116 | {{item.product.get_brief_decription}} 117 |
    118 | 119 | {% if item.product.discount_price %} 120 | {{item.get_total_discount_item_price}} 121 | {% else %} 122 | {{item.get_total_item_price}} 123 | {% endif %} 124 | 125 |
  • 126 | {% endfor %} 127 | 128 |
  • 129 | Total (PKR) 130 | PKR {{order.get_cart_total}} 131 |
  • 132 |
133 | 134 |
135 | 136 | 137 |
138 | 139 | 140 |
141 |
142 | 143 | {% endblock %} -------------------------------------------------------------------------------- /customer/templates/customer/footer.html: -------------------------------------------------------------------------------- 1 | 2 |
3 | 4 | 5 | 15 | 16 | 17 | 18 | 19 | 20 | 53 | 54 | 55 | 56 | 60 | 61 | 62 |
63 | -------------------------------------------------------------------------------- /customer/templates/customer/home_page.html: -------------------------------------------------------------------------------- 1 | {% extends 'customer/base.html' %} 2 | {% load static %} 3 | 4 | {% block content %} 5 |
6 |
7 |
8 | 9 |
10 | {% if messages %} 11 |
    12 | {% for message in messages %} 13 | 16 | {% endfor %} 17 |
18 | {% endif %} 19 |
20 | 21 | 22 | 62 | 63 | {% if page == "shirts" %} 64 |

SHIRTS

65 | {% elif page == "sports-wear" %} 66 |

SPORTS WEAR

67 | {% elif page == "outwear" %} 68 |

OUTWEAR

69 | {% endif %} 70 | 71 |
72 | 73 | 74 |
75 | {% for i in items %} 76 | 77 |
78 | 79 |
80 | 81 | 82 |
83 | 85 | 86 |
87 |
88 |
89 | 90 | 91 | 92 |
93 | 94 | 95 |
{{i.get_category_display}}
96 |
97 |
98 | 99 | {{i.name}} 100 | 101 | 102 |
103 | 104 |

105 | 106 | 107 | {% if i.discount_price %} 108 | PKR {{i.discount_price}} 109 | {% else %} 110 | PKR {{i.price}} 111 | {% endif %} 112 | 113 | 114 |

115 | 116 |
117 | 118 | 119 |
120 | 121 | 122 |
123 | 124 | {% endfor %} 125 |
126 | 127 | 128 |
129 | 130 | 131 | {% include 'customer/pagination.html' %} 132 | 133 | {% endblock %} -------------------------------------------------------------------------------- /customer/templates/customer/navbar.html: -------------------------------------------------------------------------------- 1 | {% load cart_template_tags %} 2 | 3 | 78 | -------------------------------------------------------------------------------- /customer/templates/customer/pagination.html: -------------------------------------------------------------------------------- 1 | {% if items_page.has_other_pages %} 2 |
3 | 42 |
43 | {% else %} 44 | {% endif %} -------------------------------------------------------------------------------- /customer/templates/customer/product_detail.html: -------------------------------------------------------------------------------- 1 | {% extends 'customer/base.html' %} 2 | {% load static %} 3 | 4 | {% block content %} 5 | 6 | 39 | 40 |
41 |
42 | 43 | 44 |
45 | 46 | 47 |
48 | 49 | 50 | 51 |
52 | 53 | 54 | 55 |
56 | 57 | 58 |
59 | 60 | 65 | 66 |

67 | 68 | {% if item.discount_price %} 69 | 70 | PKR {{item.price}} 71 | 72 | PKR {{item.discount_price}} 73 | {% else %} 74 | PKR {{item.price}} 75 | {% endif %} 76 |

77 | 78 |

Description

79 | 80 |

{{item.description}}

81 | 82 |
83 | 84 | {% if user.is_authenticated %} 85 | 88 | {% else %} 89 |
90 |
91 | 94 | Register 95 | Sign In 96 |
97 |
98 | {% endif %} 99 | 100 |
101 | 102 |
103 | 104 | 105 |
106 | 107 | 108 |
109 | 110 | 111 |
112 | 113 | 114 |
115 |
116 | 117 | {% endblock %} -------------------------------------------------------------------------------- /customer/templates/customer/register.html: -------------------------------------------------------------------------------- 1 | {% extends 'customer/base.html' %} 2 | {% load static %} 3 | 4 | {% block content %} 5 | 6 |
7 |
8 | 9 |
10 |
11 |
12 | 52 |
53 |
54 |
55 | 56 |
57 |
58 | 59 | 70 | {% endblock %} -------------------------------------------------------------------------------- /customer/templates/customer/shirts_page.html: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/customer/templates/customer/shirts_page.html -------------------------------------------------------------------------------- /customer/templates/customer/sign_in.html: -------------------------------------------------------------------------------- 1 | {% extends 'customer/base.html' %} 2 | 3 | 4 | {% block content %} 5 | 6 |
7 |
8 | {% if messages %} 9 |
    10 | {% for message in messages %} 11 | 14 | {% endfor %} 15 |
16 | {% endif %} 17 |
18 |

Sign In

19 |
20 | 21 |
22 | {% csrf_token %} 23 | 24 |
25 | 26 |
27 | 28 |
29 | 30 |
31 |
32 | 33 | 34 | 35 |
36 | 37 |
38 | 39 |
40 |
41 | 42 |
43 | 44 | 45 |
46 | 47 |
48 | 49 |
50 |
51 | 52 | {% endblock %} -------------------------------------------------------------------------------- /customer/templatetags/cart_template_tags.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | from customer.models import Order 3 | 4 | register = template.Library() 5 | 6 | 7 | @register.filter 8 | def cart_item_count(user): 9 | if user.is_authenticated: 10 | try: 11 | order = Order.objects.get(customer=user.customer, complete=False) 12 | items = order.orderitem_set.all() 13 | except: 14 | items = [] 15 | if items: 16 | if items.exists(): 17 | return items.count() 18 | return 0 -------------------------------------------------------------------------------- /customer/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /customer/urls.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.urls import path, include 3 | 4 | from . import views 5 | 6 | urlpatterns = [ 7 | path("",views.home_page,name="home_page"), 8 | path("shirts",views.shirts_page,name="Shirt"), 9 | path("sports-wear",views.sports_wear_page,name="Sport Wear"), 10 | path("outwear",views.outwear_page,name="Outwear"), 11 | 12 | path("checkout/",views.checkout,name="checkout"), 13 | path("product-detail//",views.product_detail,name="product_detail"), 14 | path("cart/",views.cart,name="cart"), 15 | path("update_item/",views.update_item,name="update_item"), 16 | path("sign-in/",views.sign_in,name="sign_in"), 17 | path("sign-out/",views.signOut,name="sign_out"), 18 | path("register/",views.register,name="register"), 19 | ] 20 | -------------------------------------------------------------------------------- /ecommerce/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/ecommerce/__init__.py -------------------------------------------------------------------------------- /ecommerce/asgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | ASGI config for ecommerce project. 3 | 4 | It exposes the ASGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/3.0/howto/deployment/asgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.asgi import get_asgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ecommerce.settings') 15 | 16 | application = get_asgi_application() 17 | -------------------------------------------------------------------------------- /ecommerce/settings.py: -------------------------------------------------------------------------------- 1 | """ 2 | Django settings for ecommerce project. 3 | 4 | Generated by 'django-admin startproject' using Django 3.0.6. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/3.0/topics/settings/ 8 | 9 | For the full list of settings and their values, see 10 | https://docs.djangoproject.com/en/3.0/ref/settings/ 11 | """ 12 | 13 | import os 14 | 15 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...) 16 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 17 | 18 | # Quick-start development settings - unsuitable for production 19 | # See https://docs.djangoproject.com/en/3.0/howto/deployment/checklist/ 20 | 21 | # SECURITY WARNING: keep the secret key used in production secret! 22 | SECRET_KEY = '27q7#1_f&#i3&f0vfs5_*v*w7vh36zyq1szirb1e5vmrg#2hv7' 23 | 24 | # SECURITY WARNING: don't run with debug turned on in production! 25 | DEBUG = False 26 | 27 | ALLOWED_HOSTS = ['ecommerce-with-dj.herokuapp.com','127.0.0.1'] 28 | 29 | 30 | # Application definition 31 | 32 | INSTALLED_APPS = [ 33 | 'django.contrib.admin', 34 | 'django.contrib.auth', 35 | 'django.contrib.contenttypes', 36 | 'django.contrib.sessions', 37 | 'django.contrib.messages', 38 | 'django.contrib.staticfiles', 39 | 'customer.apps.CustomerConfig', 40 | ] 41 | 42 | MIDDLEWARE = [ 43 | 'django.middleware.security.SecurityMiddleware', 44 | 'whitenoise.middleware.WhiteNoiseMiddleware', 45 | 'django.contrib.sessions.middleware.SessionMiddleware', 46 | 'django.middleware.common.CommonMiddleware', 47 | 'django.middleware.csrf.CsrfViewMiddleware', 48 | 'django.contrib.auth.middleware.AuthenticationMiddleware', 49 | 'django.contrib.messages.middleware.MessageMiddleware', 50 | 'django.middleware.clickjacking.XFrameOptionsMiddleware', 51 | ] 52 | 53 | ROOT_URLCONF = 'ecommerce.urls' 54 | 55 | TEMPLATES = [ 56 | { 57 | 'BACKEND': 'django.template.backends.django.DjangoTemplates', 58 | 'DIRS': [], 59 | 'APP_DIRS': True, 60 | 'OPTIONS': { 61 | 'context_processors': [ 62 | 'django.template.context_processors.debug', 63 | 'django.template.context_processors.request', 64 | 'django.contrib.auth.context_processors.auth', 65 | 'django.contrib.messages.context_processors.messages', 66 | ], 67 | }, 68 | }, 69 | ] 70 | 71 | WSGI_APPLICATION = 'ecommerce.wsgi.application' 72 | 73 | 74 | # Database 75 | # https://docs.djangoproject.com/en/3.0/ref/settings/#databases 76 | 77 | DATABASES = { 78 | 'default': { 79 | 'ENGINE': 'django.db.backends.sqlite3', 80 | 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 81 | } 82 | } 83 | 84 | 85 | # Password validation 86 | # https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators 87 | 88 | AUTH_PASSWORD_VALIDATORS = [ 89 | { 90 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', 91 | }, 92 | { 93 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 94 | }, 95 | { 96 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', 97 | }, 98 | { 99 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', 100 | }, 101 | ] 102 | 103 | 104 | # Internationalization 105 | # https://docs.djangoproject.com/en/3.0/topics/i18n/ 106 | 107 | LANGUAGE_CODE = 'en-us' 108 | 109 | TIME_ZONE = 'UTC' 110 | 111 | USE_I18N = True 112 | 113 | USE_L10N = True 114 | 115 | USE_TZ = True 116 | 117 | 118 | # Static files (CSS, JavaScript, Images) 119 | # https://docs.djangoproject.com/en/3.0/howto/static-files/ 120 | 121 | STATIC_URL = '/static/' 122 | STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') 123 | MEDIA_URL = '/media/' 124 | MEDIA_ROOT = os.path.join(BASE_DIR, 'media') 125 | -------------------------------------------------------------------------------- /ecommerce/urls.py: -------------------------------------------------------------------------------- 1 | """ecommerce URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/3.0/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: path('', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Import the include() function: from django.urls import include, path 14 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 15 | """ 16 | from django.contrib import admin 17 | from django.urls import path, include 18 | 19 | from django.conf import settings 20 | from django.conf.urls.static import static 21 | 22 | urlpatterns = [ 23 | path('admin/', admin.site.urls), 24 | path("",include('customer.urls')) 25 | ] 26 | 27 | if settings.DEBUG: 28 | urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) -------------------------------------------------------------------------------- /ecommerce/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for ecommerce project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/3.0/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ecommerce.settings') 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | """Django's command-line utility for administrative tasks.""" 3 | import os 4 | import sys 5 | 6 | 7 | def main(): 8 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'ecommerce.settings') 9 | try: 10 | from django.core.management import execute_from_command_line 11 | except ImportError as exc: 12 | raise ImportError( 13 | "Couldn't import Django. Are you sure it's installed and " 14 | "available on your PYTHONPATH environment variable? Did you " 15 | "forget to activate a virtual environment?" 16 | ) from exc 17 | execute_from_command_line(sys.argv) 18 | 19 | 20 | if __name__ == '__main__': 21 | main() 22 | -------------------------------------------------------------------------------- /media/default_img.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/UsamaKashif/e-commerce-with-django/5f7b36562118a4b0403bc7004015ba3ee11e3887/media/default_img.png -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | asgiref==3.2.7 2 | astroid==2.4.1 3 | Babel==2.8.0 4 | colorama==0.4.3 5 | Django==3.0.6 6 | django-phonenumber-field==4.0.0 7 | gunicorn==20.0.4 8 | isort==4.3.21 9 | lazy-object-proxy==1.4.3 10 | mccabe==0.6.1 11 | phonenumbers==8.12.4 12 | Pillow==7.1.2 13 | pylint==2.5.2 14 | pytz==2020.1 15 | six==1.15.0 16 | sqlparse==0.3.1 17 | toml==0.10.1 18 | typed-ast==1.4.1 19 | whitenoise==5.1.0 20 | wrapt==1.12.1 21 | -------------------------------------------------------------------------------- /runtime.txt: -------------------------------------------------------------------------------- 1 | python-3.7.3 --------------------------------------------------------------------------------